;D1 = work reg, char reg
;A5 --> work memory
LOOP: CTRLC DONE ; allow user to exit
CALL GETC
CMPB D1,#': ; this will bypass cr/lf's
BNE LOOP ; skip to start of header
TYPE <.> ; let him know we are alive
CLRW CHKSUM(A5)
CALL GETBYT ; first byte is record size
MOVW D1,RECSIZ(A5)
CALL GETWRD ; get address
MOVW D1,LODADR(A5)
DEFINE ERROR MSG
CRLF
BELL
TYPECR <MSG>
ENDM
CALL GETBYT ; record type
TSTB D1
BEQ 10$
; ERROR <Record Type Non-zero>
; BR ABORT
BR DONE
10$:
MOVW RECSIZ(A5),D0 ; loop counter
BEQ 25$ ; this is the last record
20$: CALL GETBYT ; get data bytes
PUTCHR OUTDDB(A5)
SOB D0,20$
25$: CALL GETBYT ; get checksum
MOVW CHKSUM(A5),D0
AND #377,D0
BEQ 30$
ERROR <Loader Check-sum Error>
BR ABORT
30$: TSTB RECSIZ(A5)
JNE LOOP
DONE:
CRLF
TYPECR <DONE>
ABORT:
CRLF
JOBIDX A6
MOVW SAVJCB(A5),JOBTYP(A6)
CLOSE OUTDDB(A5)
CLOSE HEXDDB(A5)
EXIT: EXIT
GETWRD:
CALL GETBYT ; get high byte of address
SWAB D1 ; swap the bytes
PUSH D1
CALL GETBYT ; get low byte of address
OR (SP)+,D1 ; and put together
RTN
GETBYT:
CALL GETHEX
SWAD D1
PUSH D1
CALL GETHEX
OR (SP)+,D1
AND #377,D1
ADDW D1,CHKSUM(A5)
RTN
GETHEX:
CALL GETC ; get Ascii char
BEQ DONE ; is eof
SUB #'0,D1 ; offset for 0-9
CMP D1,#10. ; is char a 0-9 digit
BLT 1$ ; yes, exit
SUB #7,D1 ; must be A-F, correct
1$: RTN