; ==== ISUAL Flight Software -- Univ of California, Berkeley, SSL ====
; CCSDS - generate CCSDS source packets
; (calls functions in EEPROM.a)
;
; Revision History:
;  18-Dec-2002 - SPG - ISUAL Flight Software rev 7.3
;    First Official Release
;  28-May-2003
;    improve interlock 
;    separate interlocks for HSKP and SCI
        include ccsds.i
        include eeprom.i
        include ioports.i
        include task.i
        include clock.i
        include soh.i
        include pvcf.i
        include pwr.i
        include gbl.i
        include util.i
        include debug.i

; table of JMPs to be copied into EEPROM
eeprom: jmp clock_read          ; 1
        jmp clock_6_to_10       ; 2
        jmp soh_out             ; 3
        jmp pvcf_dpu            ; 4
        jmp task_new            ; 5
        jmp pwr_set_on          ; 6
        jmp pwr_set_off         ; 7
        jmp pvcf_mm             ; 8
        jmp task                ; 9

CCSDS_INIT:
        mvi a,0
        sta ilks
        sta ilkh
; set up jump tables for functions called in EEPROM
        lxi h,eeprom
        lxi d,GBL_CCSDS+45
        mvi c,9*3
        call copy_bytes
        ret

; send housekeeping packet
CCSDS_HSKP:
;   A  - ApID minus 0x700
;   BC - total packet length
;   DE - source sequence count for this ApID
;   HL - address of data, starting AFTER 2ndary header 
        push b
        push d
        push h
        push psw       
; interlock multiple callers
wilkh:  lda ilkh
        cpi 0
        jz silkh
        call task
        jmp wilkh
silkh:  mvi a,1
        sta ilkh
; interlock set -- OK to use local storage
        pop psw
        sta ApIDh
        shld data_pointer
; preserve bank register
        in BANK_SELECT_I   
        push psw
; set EEPROM bank
        mvi a,EE_BANK
        out BANK_SELECT_O       ; select EEPROM bank
        lda ApIDh
; call EEPROM function to determine 
; whether packet goes out SOH or SCI channel
        call EE_get_sohsci 
        mov a,M         ; HL returned pointing to channel code
        lhld data_pointer
        cpi 0
; 0 = SOH only
        jz xsoh
        cpi 1
; 1 = TM only
        jz xtm
        cpi 2
; 2 = both SOH and TLM
        jz xboth
; else don't send packet at all
exith:  pop psw
        out BANK_SELECT_O
        pop h
        pop d
        pop b
        mvi a,0
        sta ilkh        ; release interlock
        lda ApIDh
        ret

ilkh    ds 1
ApIDh   ds 1
data_pointer ds 2


xsoh:   lda ApIDh
        call EE_CCSDS_HSKP
        jmp exith
xtm:    lda ApIDh
        call CCSDS_SCIHDR  
        jmp exith
xboth:  lda ApIDh
        push b
        push d
        push h
        call EE_CCSDS_HSKP
        lda ApIDh
        pop h
        pop d
        pop b
        call CCSDS_SCIHDR
        jmp exith

; send science header packet
CCSDS_SCIHDR:
;   A  - ApID minus 0x700
;   BC - total packet length
;   DE - source sequence count for this ApID
;   HL - address of data, starting AFTER 2ndary header 
        push b
        push d
        push h
        push psw       
; interlock multiple callers
wilks:  lda ilks
        cpi 0
        jz silks
        call task
        jmp wilks
silks:  mvi a,1
        sta ilks
        pop psw
        sta ApIDs
        in BANK_SELECT_I   
        push psw
        mvi a,EE_BANK
        out BANK_SELECT_O       ; select EEPROM bank
        lda ApIDs
        call EE_CCSDS_SCIHDR    ; call EEPROM code
rilk:   pop psw                 
        out BANK_SELECT_O
; release interlock
        mvi a,0
        sta ilks
        lda ApIDs
        pop h
        pop d
        pop b
        ret
ilks     ds 1
ApIDs    ds 1


; generate a science data packet
;  A - ApID minus 0x700
;  BC - ApID's source sequence number
;  DE - points to MM address of data
;  HL - points to "other stuff" in packet before data
;          2 bytes of data packet sequence number
;          2 bytes of number-of-valid-words
CCSDS_SCIDATA:
        push b
        push d
        push h
        push psw       
; interlock multiple callers
wilk2:  lda ilks
        cpi 0
        jz silk2
        call task
        jmp wilk2
silk2:  mvi a,1
        sta ilks
        pop psw
        sta ApIDs
        in BANK_SELECT_I   
        push psw
        mvi a,EE_BANK
        out BANK_SELECT_O       ; select EEPROM bank
        lda ApIDs
        call EE_CCSDS_SCIDATA   ; call EEPROM code
        jmp rilk

