; TM_PATCH.a 27-January-2004 ; Patches to TM.a to store CCD_TEMP, LVPS Temp1 and Temp2 in science headers org 3085h ; where TM loads in FSW rev 7.8 ; ==== ISUAL Flight Software -- Univ of California, Berkeley, SSL ==== ; tm.a -- TM Task ; read DCM queue of MMCBs with compressed data ; and build science telemetry packets ; Packets are packed into PVCFs and stored ; into the spacecraft buffers (see sc.a) ; ; Revision History: ; 18-Dec-2002 - SPG - ISUAL Flight Software rev 7.3 ; First Official Release ; 12-Jan-2003 ; added automatic flush if in Dayside mode ; 18-Jan-2003 (rev 7.7) ; test for end of camera exposure list in event queue ; 25-Feb-2003 ; fix el't length error in building SPR exposure time list ; 5-Mar-2003 ; Made auto flush check for TM idle first ; 11-Mar2003 ; Get N pretrig from SOH+141 ; 19-Mar-2003 ; set link to null when re-cycling an MMCB ; 19-May-2003 ; implement GBL_FLUSH_REQUEST ; 29-May-2003 ; change calls to CCSDS_SEND to ; either CCSDS_HSKP or CCSDS_SCIHDR ; 6-Aug-2003 ; no automatic flush of SC buffer ; Test GBL_FLUSH_REQUEST, check conditions ; interlock PVCF processing while SC buffer being flushed ; 16-Oct-2003 ; If a flush request fails, do a PVCF_FLUSH anyway ; and cancel the request. ; 17-Oct-2003 ; display "can't" code on a flush request ; 20-Oct-2003 - allow auto-flush in science mode ; 30-Oct-2003 - set compression/wrap codes ; include tm.i include mmcb.i include mm.i include task.i include ccsds.i include util.i include gbl.i include clock.i include soh.i include debug.i include ioports.i ; public PRI_MMCB public PRI_FLAG ; from DCM task ; tm_init: lxi h,0 ; zero the source-sequence-count for each kind of packet shld sq0C shld sq0D shld sq0E shld sq10 shld sq11 shld sq12 shld sq13 shld sq14 shld sq15 ; ; TM task is idle - nothing on the TM queue mvi a,1 sta GBL_TM_IDLE ; ; Start the task which generates telemetry ; from the TM queue lxi d,tm_task lxi h,GBL_TM_STACK+stack_size call task_new ; ret ; ; tm_task: out WATCHDOG_PET_O ; restart watchdog timer ; call task ; ; Suspend operations while SC task is sending data to Spacecraft ; SC sets SC_SENDING to 1, then waits ; for TM to set it to 2, indicating idle lda GBL_SC_SENDING cpi 2 jz tm_task ; suspended cpi 1 jnz tmok mvi a,2 ; TM task now suspended sta GBL_SC_SENDING jmp tm_task tmok: ; ; MMCBs should have been formatted lda GBL_MMCB_Status cpi 1 jnz tm_task ; MMCBs not formatted ; ; Is telemetry active? lda GBL_TM_Status cpi 1 ; TM being generated? jz test_flush ; yes mvi a,1 ; no, make TM task idle sta GBL_TM_IDLE ; test_flush: lda GBL_FLUSH_REQUEST cpi 1 jnz dont_flush ; Do a FLUSH, if the following conditions are met: ; 1. Some data is in the SC buffers ; 2. All instrument readouts disabled (e.g. from I_STOP) ; 3. No readouts still to be processed by DCM task ; 4. This TM Task is idle (no more MMCB's in TM queue) ; ; Look at SC buffers mvi c,0 lhld GBL_SOH+71 mov a,h ora l lhld GBL_SOH+73 ora h ora l jz cant_flush ; both buffers empty - cancel request ; ; are any Instruments active? mvi c,0AAh lda GBL_SOH+11 cpi 0 jnz cant_flush ; some instruments not disabled mok: ; Readouts still to be processed by Supply task (MMCB.a)? mvi c,0E0h lda GBL_RO_IDLE cpi 1 jnz cant_flush ; Supply task not idle; no flush yet ; Is DCM task idle (no MMCBs in DCM queue) ? mvi c,0E1h lda GBL_DCM_IDLE cpi 1 jnz cant_flush ; Is this TM task Idle? lda GBL_TM_IDLE mvi c,0E2h cpi 1 jnz cant_flush jmp do_flush ; ; Can't flush for one of the reasons. ; Flush the last PVCF anyway. cant_flush: mov a,c cpi 0 jz code0 call debug_asc asc "*CF$" call debug_showa code0: public PVCF_FLUSH call PVCF_FLUSH ; and reset the flush request jmp rfrq ; Note that the PVCF_FLUSH may eventually result in an ; "end of PVCFs" marker in the PVCF stream, ; but Java program PVTM has been modified to ; look for more PVCFs even so. ; do_flush: ; OK, do a flush. ; First, write out the current PVCF, if there's anything in it call PVCF_FLUSH ; send signal to SC Task to send the spacecraft buffers to the spacecraft public SC_FLUSH call SC_FLUSH ; Wait for flush to complete (both buffers empty) wait: call task lhld GBL_SOH+71 mov a,h ora l lhld GBL_SOH+73 ora h ora l jnz wait ; Reset flush request rfrq: mvi a,0 sta GBL_FLUSH_REQUEST jmp tm_task ; dont_flush: ; does DCM task have a Priority MMCB request lda PRI_FLAG cpi 1 jnz nopri ; Yes, copy the priority MMCB for processing lhld PRI_MMCB lxi d,mmcb_status mvi c,mmcb_length call COPY_BYTES ; set flag to "in progress" ; (so we don't get confused by the flag going to 1 ; during processing a normal MMCB) mvi a,2 sta PRI_FLAG jmp proc_uc nopri: ; Read next element from TM queue. lda GBL_TM_QHEAD cpi 0FFh ; null pointer? jnz go ; no - there is data on the queue ; TM queue does not have data which is ready. mvi a,1 sta GBL_TM_IDLE ; TM task is idle jmp tm_task ; ; TM task not idle now go: mvi a,0 sta GBL_TM_IDLE ; ; fetch the MMCB lxi d,GBL_TM_QHEAD lxi h,mmcb_status call mmcb_fetch ; ; Is it compressed data, ready for TM? lda mmcb_status cpi status_compressed ; ***patch*** ;*** jz proc_c ; ***replaced *** jz proc_c_patch ; ***by cpi status_UC jz proc_uc ; bad MMCB, recycle call recycle_MMCB jmp tm_task data_was_compressed ds 1 ; ; process as uncompressed proc_uc: lda GBL_SOH+140 ; look at DCM s/w rev mvi c,1 ; 1 = uncompressed, needs unwrap cpi 01h ; DCM01 jz setcc cpi 02h ; DCM02 jz setcc ; not DCM02 - Wang's compression s/w mvi c,2 ; 2 = uncompressed, no unwrap jmp setcc ; ; process as compressed (can only be Wang code) proc_c: mvi c,0 ; 0 = compressed, no unwrap ; setcc: mov a,c sta data_was_compressed ; process: mvi a,0 sta GBL_TM_IDLE ; task is not idle ; Ready to be sent to Telemetry. ; Determine which packets to generate. lda mmcb_dtype cpi dtype_camera ; Camera jz do_cam cpi dtype_SPF ; fast rate SP jz do_SPF cpi dtype_SPS ; slow rate SP jz do_SPS cpi dtype_APH ; array photometer jz do_APH pgbx1: jmp pgbx1 ; ; Header generation re-uses work-area in upper memory G equ GBL_SCI_HDR ; 256 bytes ; ; Aurora Header data aur_Timim equ G+10 ; ds 10 Buffer-Switch Time of first exposure aur_exdur equ G+20 ; ds 2 exposure duration (85.33 usec units) aur_int equ G+22 ; ds 2 interval between exposures (83.33 " ) aur_Nexp equ G+24 ; ds 1 N exposures in readout aur_MCPHV equ G+25 ; ds 1 MCP HV setting aur_PHOSHV equ G+26 ; ds 1 Phosphor HV setting aur_Filter equ G+27 ; ds 1 Filter code aur_Tlens equ G+28 ; ds 1 Lens Temperature aur_TFW equ G+29 ; ds 1 Filter Wheel temperature aur_IHVPST equ G+30 ; ds 1 Intensifier HVPS temp aur_PhosT equ G+31 ; ds 1 Phosphor HVPS temp aur_compressed equ G+32 ; ds 1 1=data is compressed aur_Nout equ G+33 ; ds 4 total data WORDS output aur_TPA1 equ G+37 ; ds 42 TPA block 1 aur_TPA2 equ G+79 ; ds 42 TPA block 2 aur_dcw equ G+121 ; ds 4 data checksum word aur_ds equ G+125 ; ds 1 day sensor status ; ; Sprite Header data spr_mode equ G+10 ; ds 1 3=Burst, 2=Cont spr_gatenoff equ G+11 ; ds 1 1=Gate normally off spr_gatedelay equ G+12 ; ds 2 GateDelay (ms) spr_evtime equ G+14 ; ds 10 time of trigger event spr_fo equ G+24 ; ds 1 1=readout is "follow-on", 0=triggered ; ds 9 (spares) spr_n equ G+34 ; ds 1 N exposures in this readout spr_npre equ G+35 ; ds 1 N pre-trigger exposures spr_npost equ G+36 ; ds 1 N post-trigger exposures spr_exp equ G+37 ; ds 2 exposure duration (ms) spr_int1 equ G+39 ; ds 2 initial interval between exposures (ms) spr_int2 equ G+41 ; ds 2 interval after storage starts (ms) ; ; ds 8 (spares) spr_ds equ G+51 ; ds 1 day sensor status spr_LensT equ G+52 ; ds 1 Lens temperature spr_FWT equ G+53 ; ds 1 Filter Wheel Temperature spr_IHVPST equ G+54 ; ds 1 Intensifier HVPS temp spr_IPhosT equ G+55 ; ds 1 Phosphor HVPS temp spr_Trig equ G+56 ; ds 1 triggering photometer (1..6) spr_TrigLv equ G+57 ; ds 2 trigger level spr_MCPHV equ G+59 ; ds 1 MCP HV spr_PhosHV equ G+60 ; ds 1 Phosphor HV spr_Filter equ G+61 ; ds 1 Filter code spr_TPA1 equ G+62 ; ds 42 TPA block 1 spr_TPA2 equ G+104 ; ds 42 TPA block 2 spr_compressed equ G+146 ; ds 1 1=data is compressed spr_NExpt equ G+147 ; ds 1 N exposure times spr_Expt equ G+148 ; ds 80 up to 8 Exposure Times spr_Nout equ G+228 ; ds 4 total data WORDS output spr_dcw equ G+232 ; ds 4 data checksum word spr_bsw_time equ G+236 ; ds 10 Buffer Switch Time ; G+246 checksum ; ; Spectrophotometer Header data spf_etime equ G+10 ; ds 10 event time spf_ns equ G+20 ; ds 2 N samples in readout spf_npost equ G+22 ; ds 2 N post-trigger samples spf_mode equ G+24 ; ds 1 1=Aurora, 3=Burst, 2=Cont spf_trig equ G+25 ; ds 1 triggering photometer spf_tlev equ G+26 ; ds 2 trigger level spf_ds equ G+28 ; ds 1 day sensor status spf_PM1HV equ G+29 ; ds 1 HV 1 setting spf_PM2HV equ G+30 ; ds 1 HV 2 setting spf_PM3HV equ G+31 ; ds 1 HV 3 setting spf_PM4HV equ G+32 ; ds 1 HV 4 setting spf_PM5HV equ G+33 ; ds 1 HV 5 setting spf_PM6HV equ G+34 ; ds 1 HV 6 setting spf_F1temp equ G+35 ; ds 1 Filter 1 temperature spf_F2temp equ G+36 ; ds 1 Filter 2 temperature spf_F3temp equ G+37 ; ds 1 Filter 3 temperature spf_F4temp equ G+38 ; ds 1 Filter 4 temperature spf_F5temp equ G+39 ; ds 1 Filter 5 temperature spf_F6temp equ G+40 ; ds 1 Filter 6 temperature spf_HV1temp equ G+41 ; ds 1 HVPS1 temperature spf_HV2temp equ G+42 ; ds 1 HVPS2 temperature spf_BodyLtemp equ G+43 ; ds 1 Body Left temperature spf_BodyRtemp equ G+44 ; ds 1 Body Right temperature spf_compressed equ G+45 ; ds 1 1=data is compressed spf_Nout equ G+46 ; ds 4 total data WORDS output spf_TPA1 equ G+50 ; ds 42 TPA block 1 spf_TPA2 equ G+92 ; ds 42 TPA block 2 spf_dcw equ G+134 ; ds 4 data checksum word spf_fo equ G+138 ; ds 1 1=readout is "follow-on", 0=triggered spf_bsw_time equ G+139 ; ds 10 Buffer Switch Time ; G+149 ; ds 1 (filler) ; equ G+150 ; ds 1 packet checksum ; ; slow-rate Spectrophotometer Header data sps_bsw_time equ G+10 ; ds 10 Buffer swicth time sps_ns equ G+20 ; ds 2 N samples in readout sps_mode equ G+22 ; ds 1 1=Aurora, 3=Burst, 2=Cont sps_ds equ G+23 ; ds 1 day sensor status sps_PM1HV equ G+24 ; ds 1 HV 1 setting sps_PM2HV equ G+25 ; ds 1 HV 2 setting sps_PM3HV equ G+26 ; ds 1 HV 3 setting sps_PM4HV equ G+27 ; ds 1 HV 4 setting sps_PM5HV equ G+28 ; ds 1 HV 5 setting sps_PM6HV equ G+29 ; ds 1 HV 6 setting sps_F1temp equ G+30 ; ds 1 Filter 1 temperature sps_F2temp equ G+31 ; ds 1 Filter 2 temperature sps_F3temp equ G+32 ; ds 1 Filter 3 temperature sps_F4temp equ G+33 ; ds 1 Filter 4 temperature sps_F5temp equ G+34 ; ds 1 Filter 5 temperature sps_F6temp equ G+35 ; ds 1 Filter 6 temperature sps_HV1temp equ G+36 ; ds 1 HVPS1 temperature sps_HV2temp equ G+37 ; ds 1 HVPS2 temperature sps_BodyLtemp equ G+38 ; ds 1 Body Left temperature sps_BodyRtemp equ G+39 ; ds 1 Body Right temperature sps_TPA1 equ G+40 ; ds 42 TPA block 1 sps_TPA2 equ G+82 ; ds 42 TPA block 2 sps_compressed equ G+124 ; ds 1 1=data is compressed sps_Nout equ G+125 ; ds 4 total data WORDS output sps_dcw equ G+129 ; ds 4 data checksum word ; equ G+133 ; ds 3 filler ; equ G+136 ; packet checksum ; ; Array Photometer Header data aph_etime equ G+10 ; ds 10 time of event / 1st sample aph_mode equ G+20 ; ds 1 1=Aurora, 3=Burst, 2=Cont aph_ns equ G+21 ; ds 2 N samples in readout aph_npost equ G+23 ; ds 2 N post-trigger samples aph_rate equ G+25 ; ds 1 sampling rate code aph_ds equ G+26 ; ds 1 day sensor status aph_HVA equ G+27 ; ds 1 HVA setting aph_HVB equ G+28 ; ds 1 HVB setting ; equ G+29 ; ds 24 spares for [TBD] temperatures aph_TPA1 equ G+53 ; ds 42 TPA block 1 aph_TPA2 equ G+95 ; ds 42 TPA block 2 aph_compressed equ G+137 ;ds 1 1=data is compressed aph_Nout equ G+138 ;ds 4 total data WORDS output aph_dcw equ G+142 ; ds 4 data checksum word aph_bsw_time equ G+146 ; ds 10 buffer switch time ; equ G+156 ; packet checksum ; G2 equ GBL_TM_MISC ; (30 bytes) sq0C equ G2+2 ; ds 2 ; source sequence for ApID 70C sq0D equ G2+4 ; ds 2 ; source sequence for ApID 70D sq0E equ G2+6 ; ds 2 ; source sequence for ApID 70E sq0F equ G2+8 ; ds 2 ; source sequence for ApID 70F sq10 equ G2+10 ; ds 2 ; source sequence for ApID 710 sq11 equ G2+12 ; ds 2 ; source sequence for ApID 711 sq12 equ G2+14 ; ds 2 ; source sequence for ApID 712 sq13 equ G2+16 ; ds 2 ; source sequence for ApID 713 sq14 equ G2+18 ; ds 2 ; source sequence for ApID 714 sq15 equ G2+20 ; ds 2 ; source sequence for ApID 715 ; n equ G2+22 ; ds 4 ; running bytes-yet-to-output counter MM_pointer equ G2+26 ; ds 4 c_1018 db 0,0,03h,0FAh ; 1018 as a 4-byte number ; ; "other stuff" in Science Data Packet dpseq ds 2 ; data packet sequence number nvw ds 2 ; number of valid words in data packet ; ; ==Camera Data== do_cam: ; which science mode? lda mmcb_mode cpi mode_aurora jz do_aurora cpi mode_burst jz do_sprite cpi mode_continuous jz do_sprite scix: jmp scix ; (force reset if bad sci mode) ; ; == Aurora Camera Data == do_aurora: ; ; fill out header with data from MMCB lxi h,mmcb_t2 ; Buffer-switch Time lxi d,aur_Timim call CLOCK_6_TO_10 ; convert to 10-byte time ; Copy the Housekeeping stuff from the SOH and MON arrays lhld GBL_SOH+94 ; IDH_C_EXP shld AUR_EXDUR ; big endian to big endian lhld GBL_SOH+240 ; IDH_CAM_I_INT shld aur_int ; big endian to big endian lda GBL_N_EXP sta aur_Nexp ; total number of exposures/readout lda GBL_MON+55 ; IAM_MCP_HVV sta aur_MCPHV lda GBL_MON+57 ; IAM_PHOS_HVV sta aur_PHOSHV lda GBL_SOH+101 ; IDH_FILTER sta aur_Filter lda GBL_MON+61 ; ****patch *** GBL_MON+101 ; IAM_LENS_T sta aur_Tlens lda GBL_MON+63 ; IAM_FW_T sta aur_TFW lda GBL_MON+65 ; IAM_II_HVT sta aur_IHVPST lda GBL_MON+66 ; IAM_PHOS_HVT sta aur_PhosT ; Get bracketting TPA pair lxi h,GBL_TPA1 lxi d,aur_TPA1 mvi c,TPA_LENGTH*2 ; get 2 TPAs call COPY_BYTES ; Compressed? lda data_was_compressed sta aur_compressed ; number of words in data lxi h,mmcb_owords lxi d,aur_Nout mvi c,4 call copy_bytes ; Data Checksum word lxi h,mmcb_ockw lxi d,aur_dcw mvi c,4 call copy_bytes ; ; Day sensor status lda GBL_MON+167 ; IAM_DAY_STATUS call AUR_PATCH ; *** sta aur_ds ; ; Output Aurora Header packet mvi a,0Ch ; ApID 70C lxi b,134 ; total packet length is 134 lhld sq0C ; this ApID's source sequence number xchg lxi h,aur_Timim ; Aurora header data call CCSDS_SCIHDR ; send it out ; increment the source sequence count lhld sq0C inx h shld sq0C ; Output the data packets mvi a,0Dh ; ApID=70D lhld sq0d ; source sequence counter call output_data shld sq0d ; ; Recycle the MMCB recycle: ; don't recycle if this is "priority" MMCB lda PRI_FLAG cpi 2 jnz npr ; priority processing complete; reset flag mvi a,0 sta PRI_FLAG jmp tm_task npr: call recycle_MMCB jmp tm_task ; eqptr ds 2 ; ; == Sprite Camera Data == do_sprite: ; fill out header with data from MMCB lda mmcb_fo ; "follow-on" code sta spr_fo lda mmcb_mode ; Burst or Continuous mode sta spr_mode ; Copy the housekeeping stuff from the SOH and MON arrays lda GBL_SOH+222 ; IDH_GATE_NOFF sta spr_gatenoff lhld GBL_SOH+220 ; IDH_GATEDELAY shld spr_gatedelay lxi h,mmcb_te ; Event Time lxi d,spr_evtime call CLOCK_6_TO_10 ; convert to 10-byte time lxi h,mmcb_t2 ; Buffer Switch Time lxi d,spr_bsw_time call CLOCK_6_TO_10 ; convert to 10-byte time ; copy up to 8 exposure times from Event queue mvi a,0 ; count=0 sta spr_NExpt lhld mmcb_eq ; get fetch-pointer shld eqptr ; init pointer for storing time in packet array lxi d,spr_Expt rd8: lhld eqptr call SOH_FROMEVQ cpi 1 jnz eoq ; end of queue shld eqptr ; store advanced queue-pointer mov a,c ; Camera buffer-switch (30) marks end of exposure times cpi 30 jz eoq cpi 2 ; an exposure time? jnz rd8 ; no, keep reading Queue ; convert exposure time to 10-byte mov h,d ; in-place (HL=DE) mov l,e call CLOCK_6_TO_10 ; (rev 7.7) lxi d,10 ; step to next slot in packet dad d xchg ; DE points to (next) slot ; count up one more exposure time lda spr_NExpt inr a ; up to 8 allowed in packet sta spr_NExpt cpi 8 jnz rd8 ; go for more ; got all the exposure times ; store the other ancillary data eoq: lda GBL_N_EXP sta spr_n ; total number of exposures per readout lda GBL_SOH+141 ; *** 11-mar-2003 - was 104 ; IDH_CPRE sta spr_npre lda GBL_SOH+93 ; IDH_CAM_NPOST sta spr_npost lhld GBL_SOH+94 ; IDH_C_EXP (exposure length) shld spr_exp lhld GBL_SOH+240 ; IDH_CAM_I_INT shld spr_int1 lhld GBL_SOH+242 ; IDH_CAM_S_INT shld spr_int2 lda GBL_MON+167 ; IAM_DAY_STATUS sta spr_ds lda GBL_MON+61 ; IAM_LENS_T sta spr_LensT lda GBL_MON+63 ; IAM_FW_T sta spr_FWT lda GBL_MON+65 ; IAM_II_HVT sta spr_IHVPST lda GBL_MON+66 ; IAM_PHOS_HVT sta spr_IPhosT lda GBL_SOH+14 ; IDH_TPHOT sta spr_Trig lhld GBL_SOH+15 ; IDH_TLEV shld spr_TrigLv lda GBL_MON+55 ; IAM_MCP_HVV sta spr_MCPHV lda GBL_MON+57 ; IAM_PHOS_HVV sta spr_PhosHV lda GBL_SOH+101 ; IDH_FILTER sta spr_Filter ; Get bracketting TPA pair lxi h,GBL_TPA1 lxi d,spr_TPA1 mvi c,TPA_LENGTH*2 ; get 2 TPAs call COPY_BYTES ; lda PRI_FLAG ; are we doing "priority" MMCB? cpi 2 jz mu2 ; yes, make uncompressed ; mvi a,1 lda data_was_compressed ; ***patch*** sta spr_compressed ; usually data is compressed jmp store ; ***patch*** lda GBL_DCM_STATUS ; or is it? cpi 0FBh ; raw data? jnz sprc ; no mu2: mvi a,0 store: ; ****** sta spr_compressed ; Not Compressed sprc: ; number of words in data lxi h,mmcb_owords lxi d,spr_Nout mvi c,4 call copy_bytes ; Data Checksum word lxi h,mmcb_ockw lxi d,spr_dcw mvi c,4 call copy_bytes ; Output Sprite Header packet mvi a,0Eh ; ApID 70E call SPR_PATCH ; *** lxi b,254 ; total packet length is 254 bytes lhld sq0E ; this ApID's source sequence number xchg lxi h,spr_Mode ; Sprite header data call CCSDS_SCIHDR ; send it out ; increment the source sequence count lhld sq0E inx h shld sq0E ; ; Output the data packets mvi a,0Fh ; ApID=70F lhld sq0F ; source sequence counter call output_data shld sq0F ; recycle the MMCB jmp recycle ; ; ; ==Spectrophotometer Data== ; (fast rate) do_spf: ; == SPF data == ; fill out header with data from MMCB ; Event time lxi h,mmcb_te ; 6-byte time in MMCB lxi d,spf_etime ; 10-byte time in packet call CLOCK_6_TO_10 ; convert and copy ; Buffer-switch time lxi h,mmcb_t2 lxi d,spf_bsw_time call CLOCK_6_to_10 lda mmcb_fo ; "follow-on" code sta spf_fo lhld GBL_N_SPF shld spf_ns lhld GBL_SOH+153 ; IDH_SPF_NPOST shld spf_npost lda GBL_SOH+10 ; IDH_MODE sta spf_mode lda GBL_SOH+14 ; IDH_TPHOT sta spf_trig lhld GBL_SOH+15 ; IDH_TLEV shld spf_tlev lda GBL_MON+167 ; IAM_DAY_STATUS sta spf_ds lda GBL_MON+43 ; IAM_SP1_HVV sta spf_PM1HV lda GBL_MON+45 ; IAM_SP2_HVV sta spf_PM2HV lda GBL_MON+47 ; IAM_SP3_HVV sta spf_PM3HV lda GBL_MON+49 ; IAM_SP4_HVV sta spf_PM4HV lda GBL_MON+51 ; IAM_SP5_HVV sta spf_PM5HV lda GBL_MON+53 ; IAM_SP6_HVV sta spf_PM6HV lda GBL_MON+70 ; IAM_SP_F1T sta spf_F1temp lda GBL_MON+71 ; IAM_SP_F2T sta spf_F2temp lda GBL_MON+72 ; IAM_SP_F3T sta spf_F3temp lda GBL_MON+73 ; IAM_SP_F4T sta spf_F4temp lda GBL_MON+74 ; IAM_SP_F5T sta spf_F5temp lda GBL_MON+75 ; IAM_SP_F6T sta spf_F6temp lda GBL_MON+68 ; IAM_SP_HV1T sta spf_hv1temp lda GBL_MON+69 ; IAM_SP_HV2T sta spf_hv2temp lda GBL_MON+77 ; IAM_SP_BLT sta spf_BodyLtemp lda GBL_MON+76 ; IAM_SP_BRT sta spf_BodyRtemp ; Get bracketting TPA pair lxi h,GBL_TPA1 lxi d,spf_TPA1 mvi c,TPA_LENGTH*2 ; get 2 TPAs call COPY_BYTES ; Compressed lda PRI_FLAG ; are we doing "priority" MMCB? cpi 2 jz mu3 ; yes, make uncompressed mvi a,1 lda data_was_compressed ; ***patch*** sta spf_compressed ; usually data is compressed jmp sto2 ; ***patch*** lda GBL_DCM_STATUS ; or is it? cpi 0FBh ; raw data? jnz spfc ; no mu3: mvi a,0 sto2: ; ****** sta spf_compressed ; Not Compressed spfc: ; number of words in data lxi h,mmcb_owords lxi d,spf_Nout mvi c,4 call copy_bytes ; Data Checksum word lxi h,mmcb_ockw lxi d,spf_dcw mvi c,4 call copy_bytes ; Output Header packet mvi a,10h ; ApID 710 lxi b,158 ; total packet length is 158 lhld sq10 ; this ApID's source sequence number xchg lxi h,spf_etime ; SPF header data call CCSDS_SCIHDR ; send it out ; increment the source sequence count lhld sq10 inx h shld sq10 ; Output the data packets mvi a,11h ; data ApID=711 lhld sq11 ; source seq. call output_data shld sq11 ; Recycle the MMCB jmp recycle ; == SPS data - Slow-rate SP == do_sps: ; fill out header with data from MMCB lxi h,mmcb_t2 ; buffer_switch time lxi d,sps_bsw_time call CLOCK_6_TO_10 lhld GBL_N_SPS shld sps_ns lda GBL_SOH+10 ; IDH_MODE sta sps_mode lda GBL_MON+167 ; IAM_DAY_STATUS sta sps_ds lda GBL_MON+43 ; IAM_SP1_HVV sta sps_PM1HV lda GBL_MON+45 ; IAM_SP2_HVV sta sps_PM2HV lda GBL_MON+47 ; IAM_SP3_HVV sta sps_PM3HV lda GBL_MON+49 ; IAM_SP4_HVV sta sps_PM4HV lda GBL_MON+51 ; IAM_SP5_HVV sta sps_PM5HV lda GBL_MON+53 ; IAM_SP6_HVV sta sps_PM6HV lda GBL_MON+70 ; IAM_SP_F1T sta sps_F1temp lda GBL_MON+71 ; IAM_SP_F2T sta sps_F2temp lda GBL_MON+72 ; IAM_SP_F3T sta sps_F3temp lda GBL_MON+73 ; IAM_SP_F4T sta sps_F4temp lda GBL_MON+74 ; IAM_SP_F5T sta sps_F5temp lda GBL_MON+75 ; IAM_SP_F6T sta sps_F6temp lda GBL_MON+68 ; IAM_SP_HV1T sta sps_hv1temp lda GBL_MON+69 ; IAM_SP_HV2T sta sps_hv2temp lda GBL_MON+77 ; IAM_SP_BLT sta sps_BodyLtemp lda GBL_MON+76 ; IAM_SP_BRT sta sps_BodyRtemp ; Get bracketting TPA pair lxi h,GBL_TPA1 lxi d,sps_TPA1 mvi c,TPA_LENGTH*2 ; get 2 TPAs call COPY_BYTES ; Compressed lda PRI_FLAG ; are we doing "priority" MMCB? cpi 2 jz mu4 ; yes, make uncompressed mvi a,1 lda data_was_compressed ; ***patch*** sta sps_compressed ; usually data is compressed jmp sto3 ; ***patch*** lda GBL_DCM_STATUS ; or is it? cpi 0FBh ; raw data? jnz spsc ; no mu4: mvi a,0 sto3: ; ****** sta sps_compressed ; Not Compressed spsc: ; number of words in data lxi h,mmcb_owords lxi d,sps_Nout mvi c,4 call copy_bytes ; Data Checksum word lxi h,mmcb_ockw lxi d,sps_dcw mvi c,4 call copy_bytes ; Output Header packet mvi a,12h ; ApID 712 lxi b,144 ; total packet length is 144 lhld sq12 ; this ApID's source sequence number xchg lxi h,sps_bsw_time ; SPS Header data call CCSDS_SCIHDR ; send it out ; increment the source sequence count lhld sq12 inx h shld sq12 ; Output the data packets mvi a,13h ; data ApID=713 lhld sq13 ; source seq. call output_data shld sq13 ; Recycle the MMCB jmp recycle ; Array Photometer Data do_aph: ; ==Array Photometer Data == ; fill out header with data from MMCB lxi h,mmcb_te ; event time lxi d,aph_etime call CLOCK_6_TO_10 lxi h,mmcb_t2 ; buffer switch time lxi d,aph_bsw_time call CLOCK_6_TO_10 lda mmcb_mode sta aph_mode lhld GBL_N_APH shld aph_ns lhld GBL_SOH+159 ; IDH_AP_NPOST shld aph_npost lda GBL_SOH+96 ; IDH_AP_RATE sta aph_rate lda GBL_MON+167 ; IAM_DAY_STATUS sta aph_ds lda GBL_MON+131 ; IAM_AP_HVA_V sta aph_HVA lda GBL_MON+130 ; IAM_AP_HVB_V sta aph_HVB ; Get bracketting TPA pair lxi h,GBL_TPA1 lxi d,aph_TPA1 mvi c,TPA_LENGTH*2 ; get 2 TPAs call COPY_BYTES ; Compressed? lda data_was_compressed sta aph_compressed ; ***patch*** aur_compressed ; number of words in data lxi h,mmcb_owords lxi d,aph_Nout mvi c,4 call copy_bytes ; Data Checksum word lxi h,mmcb_ockw lxi d,aph_dcw mvi c,4 call copy_bytes ; Output Header packet mvi a,14h ; ApID 714 call AP_PATCH ; *** lxi b,164 ; total packet length is 164 lhld sq14 ; this ApID's source sequence number xchg lxi h,aph_etime ; AP header data call CCSDS_SCIHDR ; send it out ; increment the source sequence count lhld sq14 inx h shld sq14 ; Output the data packets mvi a,15h ; data ApID=715 lhld sq15 ; source seq call output_data shld sq15 ; Recycle the MMCB jmp recycle Data_ApID ds 1 sseq ds 2 tmp ds 4 ; do a 4-byte subtract: tmp -= [HL] sub4: ; HL - points to low byte of subtrahend lda tmp+3 sub M sta tmp+3 dcx h lda tmp+2 sbb M ; subtract with borrow sta tmp+2 dcx h lda tmp+1 sbb M ; subtract with borrow sta tmp+1 dcx h lda tmp sbb M ; subtract with borrow sta tmp ; test for negative lda tmp ani 80h ret ; 4-byte zero test (of [HL]) ztest: push h mov a,M inx h ora M inx h ora M inx h ora M pop h ret ; ============= ; Output as many data packets as are required ; A - ApID minus 700 ; 4-byte word-count is in the MMCB (mmcb_owords) ; HL - source sequence counter for this ApID ; (HL is returned, updated) output_data: sta Data_ApID ; ApID-700 shld sseq ; source sequence counter lxi h,mmcb_owords lxi d,n ; n = word-counter mvi c,4 call copy_bytes ; zero the data packet sequence number lxi h,0 shld dpseq ; initialize the Mass-memory data pointer lxi h,mmcb_OI ; pointer to data lxi d,MM_pointer mvi c,4 call copy_bytes data_loop: ; generate Data packets call task ; generate a data packet with 1018 words or less ; if n>1018, set data bytes = 1018, else n lxi h,n lxi d,tmp ; tmp=n mvi c,4 call copy_bytes lxi h,c_1018+3 call sub4 ; subtract 1018 from tmp jnz usen ; negative? Use n lxi b,1018 ; else use 1018 jmp use usen: lxi h,n ; use n call ztest ; if n=0, all done jz data_done lxi h,n+2 mov b,M inx h mov c,M ; BC=low 16 bits of n ; count used is 1018 or less -- so it fits in 2 bytes use: lxi h,nvw ; number of valid words mov M,b inx h mov M,c ; send science data packet lda Data_Apid ; ApID-700h lhld sseq ; this ApID's source sequence number mov b,h mov c,l ; in BC lxi h,dpseq ; packet seq, nvw lxi d,MM_pointer ; point to MM address call CCSDS_SCIDATA ; increment the source sequence counter lhld sseq inx h shld sseq ; if n-1018 was negative, that was the last block lda tmp ; hi byte of n-1018 ani 80h jnz data_done ; not the last, store n=n-1018 lxi h,tmp lxi d,n mvi c,4 call copy_bytes ; add 1018 to MM_pointer ; do a 4-byte add lxi h,c_1018+3 ; 1018 as 4-byte number lda MM_pointer+3 add M sta MM_pointer+3 dcx h lda MM_pointer+2 adc M ; add with carry sta MM_pointer+2 dcx h lda MM_pointer+1 adc M ; add with carry sta MM_pointer+1 dcx h lda MM_pointer+0 adc M ; add with carry sta MM_pointer+0 ; increment data packet sequence number lxi h,dpseq call incbig jmp data_loop data_done: ; all data from MMCB has been sent out as packets ; return updated source sequence counter lhld sseq ret mmcbadr ds 3 mmctr dw 0 recycle_MMCB: ; Release the MMCB at the top of the TM Queue. ; This MMCB has just been processed into telemetry. ; It needs to be re-cycled into one of the supply queues ; read head of TM queue lxi h,GBL_TM_QHEAD lxi d,mmcbadr ; remember this MM address mvi c,3 call COPY_BYTES lxi d,GBL_TM_QHEAD lxi h,mmcb_status call mmcb_fetch ; set MMCB to "empty" mvi a,status_idle sta mmcb_status ; detach from TM queue lxi h,mmcb_link ; follow link ; GBL_TM_QHEAD = mmcb_link lxi d,GBL_TM_QHEAD mvi c,3 call COPY_BYTES ; set link to null (this MMCB will become the tail of a supply queue) ; *** 19-Mar-2003 mvi a,0FFh sta mmcb_link ; then store MMCB back into banked memory lxi d,mmcbadr lxi h,mmcb_status call mmcb_store ; Select the appropriate supply queue. ; What type of data is in this MMCB? lda mmcb_dtype lxi d,GBL_CAM_SUPPLY_QTAIL cpi dtype_Camera jz attach ; Camera data lxi d,GBL_SPF_SUPPLY_QTAIL cpi dtype_SPF jz attach ; Spectrophotometer data lxi d,GBL_SPS_SUPPLY_QTAIL cpi dtype_SPS jz attach ; slow-rate Spectrophotometer data lxi d,GBL_APH_SUPPLY_QTAIL cpi dtype_APH jz attach ; Array Photometer data aaa2: jmp aaa2 lxi d,GBL_SPS_SUPPLY_QTAIL ; Attach MMCB to supply queue ; DE points to supply tail attach: push d ; remember addr of tail pointer ldax d cpi 0FFh ; tail null? jz newtail ; yes, make a new one ; tail not null. ; set tail.link pointing to recycled MMCB ; Fetch tail lxi h,mmcb_status call mmcb_fetch ; set link = mmcbadr lxi h,mmcbadr lxi d,mmcb_link mvi c,3 call COPY_BYTES ; Store MMCB (the old tail) back into banked memory pop d ; (addr of old tail pointer) push d ; (will need it one more time) lxi h,mmcb_status call mmcb_store newtail: ; set new QTAIL = mmcbadr lxi h,mmcbadr pop d ; (recall addr of old tail pointer) mvi c,3 call COPY_BYTES ret ; patch area at end of Global memory org 0B197h ; GBL_END AUR_PATCH: sta aur_ds ; replace patched-over instruction lda GBL_MON+59 ; CCD Temperature sta G+46 ; AUR science header ret ; **** this had to be expanded to push/pop A ; **** it was moved down ; SPR_PATCH lxi b,254 ; replace patched-over instruction lda GBL_MON+59 ; CCD Temperature sta G+71 ; SPR science header ret AP_PATCH: push psw ; save A lxi b,164 ; replace patched-over instruction lda GBL_MON+134 ; AP PM1 Room Temp sta G+62 ; AP science header lda GBL_MON+133 ; AP PM2 Room Temp sta G+104 ; AP science header pop psw ; restore A ret ; MMCB_STATUS=2 (compressed) ; If DCM04, set CC=0 - compressed, no unwrap required ; else set CC=1 - uncompressed, unwrap required proc_c_patch: mvi c,1 ; 1 = uncompressed, needs unwrap lda GBL_SOH+140 ; look at DCM s/w rev cpi 01h ; DCM01 jz setcc cpi 02h ; DCM02 jz setcc ; not DCM02 - must be Wang's compression s/w mvi c,0 ; 0 = compressed, no unwrap jmp setcc SPR_PATCH: push psw lxi b,254 ; replace patched-over instruction lda GBL_MON+59 ; CCD Temperature sta G+71 ; SPR science header pop psw ret