ALWAYS 25AUG1 READ ;25AUG1 ; ;**-1 ; MODULE: READ ; ; FUNCTION: INPUT AN INTEL HEX FORMATTED FILE ; ; AUTHOR: KEVIN ANGLEY ; ; DATE: 29-AUG-80 ; ; INPUT PARAMETERS: ; ; R0 POINTS TO COMMAND LINE IN PROCESS ; ; OUTPUT PARAMETERS: ; ; NONE ; ; DESTROYS: ALL REGISTERS ; ; ; ;17FEB1 ; EDITTED 13-FEB-81 BY KEVIN ANGLEY TO SHOW 16-BIT BYTEWISE SUM ;17FEB1 ; OF DATA READ. ;17FEB1 ; ;17FEB1 ; ;19JUN1 ; EDITTED 19-JUN-81 BY KEVIN ANGLEY TO CLEAR STATISTICS IN THE CASE ;19JUN1 ; THAT NO DATA WAS ACTUALLY LOADED. ;19JUN1 ; ;19JUN1 ; 25AUG1 KEVIN ANGLEY ADDED KEYWORDS "PLUS"/"MINUS" TO ;25AUG1 ; ALLOW USER TO ADD OR SUBTRACT TO ;25AUG1 ; THE FILE ADDRESSES AS THEY ARE ;25AUG1 ; BEING LOADED. ALSO, "PARTIAL" KEYWORD ;25AUG1 ; SUPPRESSES ERROR ON READING FILE ;25AUG1 ; WITH NO TRAILER RECORD. ;25AUG1 ; ;25AUG1 .MCALL DIR$,GET$,OPEN$R,CLOSE$ ; READ:: ; ENTRY POINT FOR READ MOVB #1,CMPFLG ; MAKE COMPARE FLAG FALSE BR READCMP ; PROCEED AT COMMON ENTRY COMPARE:: ; ENTRY POINT FOR COMPARE CLRB CMPFLG ; MAKE COMPARE FLAG TRUE READCMP: ; COMMON ENTRY CLR ADDVAL ; ASSUME NO OFFSETTING UPON READING ADDRESSES ;25AUG1 CLRB PART ; ASSUME FULL FILE WITH TRAILER ;25AUG1 MOV #177777,LOADDR ; LOWEST ADDRESS ENCOUNTERED SO FAR IS FFFF CLR HIADDR ; CLEAR HIGHEST ADDRESS ENCOUNTERED SO FAR CLR COUNT ; CLEAR COUNT OF BYTES LOADED THIS READ CLR LOBOUND ; DEFAULT LOW BOUND FOR READ IS 0000 MOV #177777,HIBOUND ; DEFAULT HIGH BOUND FOR READ IS FFFF GETKEY FROM ; IS FROM/TO OPTION THERE? BNE 14$ ; NE: NOT THERE, TAKE NO ACTION CALL GETHX4 ; GET FROM ADDRESS BCC 2$ ; CC: GOT IT JMP ERREXIT ; TAKE ERROR EXIT 2$: CALL VALID ; VALIDATE UNDER CURRENT OFFSET BCC 3$ ; CC: VALID JMP ERREXIT ; TAKE ERROR EXIT 3$: ADD OFFST,R1 ; UN-OFFSET (WANT TO USE REAL ADDRESS) MOV R1,LOBOUND ; FROM ADDRESS IS LO BOUND GETKEY THRU ; GRT THRU KEYWORD BEQ 4$ ; EQ: GOT IT OUTPUT MSK ; MISSING KEYWORD JMP ERREXIT ; TAKE ERROR EXIT 4$: CALL GETHX4 ; GET THRU ADDRESS BCC 6$ ; CC: GOT IT JMP ERREXIT ; TAKE ERROR EXIT 6$: CALL VALID ; TO ADDRESS MUST BE VALID BCC 7$ ; CC: VALID JMP ERREXIT ; TAKE ERROR EXIT 7$: ADD OFFST,R1 ; UN-OFFSET (WANT TO USE REAL ADDRESS) CMP R1,LOBOUND ; MUST BE >= FROM ADDRESS BHIS 8$ ; HIS: O.K. OUTPUT AOR ; ADDRESS OUT OF RANGE JMP ERREXIT ; TAKE ERROR EXIT 8$: MOV R1,HIBOUND ; SET HIGH BOUND 14$: GETKEY PLUS ; TRY FOR "PLUS" KEYWORD ;25AUG1 BNE 141$ ; NE: NO GOTS ;25AUG1 CALL GETHX4 ; GET 4-DIGIT HEX NUMBER ;25AUG1 BCC 144$ ; CC:GOT IT ;25AUG1 JMP ERREXIT ; TAKE ERROR EXIT ;25AUG1 141$: ;25AUG1 GETKEY MINUS ; TRY FOR "MINUS" KEYWORD ;25AUG1 BNE 148$ ; NE: NO GOTS ;25AUG1 CALL GETHX4 ; GET 4-DIGIT HEX NUMBER ;25AUG1 BCC 143$ ; CC: GOT IT ;25AUG1 JMP ERREXIT ; TAKE ERROR EXIT ;25AUG1 143$: ;25AUG1 NEG R1 ; FOR MINUS, MAKE NEGATIVE ;25AUG1 144$: ;25AUG1 MOV R1,ADDVAL ; SAVE ADD VALUE ;25AUG1 148$: ;25AUG1 GETKEY PARTIAL ; TRY FOR "PARTIAL" KEYWORD ;25AUG1 BNE 153$ ; NE: NO GOTS ;25AUG1 INCB PART ; SET PARTIAL FLAG ;25AUG1 153$: ;25AUG1 GETKEY FILE ; GET THE KEYWORD "FILE" ;25AUG1 BEQ 16$ ; EQ: GOT IT ;25AUG1 OUTPUT MSK ; MISSING KEYWORD ;**-2 JMP ERREXIT ; TAKE ERROR EXIT 16$: CALL PARSE ; PARSE THE FILENAME BCC 18$ ; CC: SUCCESS JMP ERREXIT ; TAKE ERROR EXIT 18$: OPEN$R #FDB ; OPEN THE FILE FOR READ BCC 20$ ; CC: SUCCESS OUTPUT FOE ; FILE OPEN ERROR JMP ERREXIT ; TAKE ERROR EXIT ; ; INPUT SECTION ; ; REGISTER USAGE: ; ; R0 POINTS TO CURRENT LOCATION IN RECORD ; R1 CONTAINS VALUE BEING PROCESSED ; R2 CONTAINS CURRENT ADDRESS BEING FILLED ; R3 TEMPORARILY HOLD BYTE LOADED ; R4 CONTAINS DATA COUNT (LOW BYTE) ; R5 CONTAINS CHECKSUM (LOW BYTE) ; 20$: GET$ #FDB ; PROCESS A RECORD BCC 26$ ; CC: SUCESS CMPB #IE.EOF,F.ERR(R0) ; JUST EOF? BNE 24$ ; NE: NO, REAL ERROR TSTB PART ; IF PARTIAL, NO ERROR MESSAGE ;25AUG1 BNE 23$ ; NE: OK ;25AUG1 OUTPUT TRL ; NO TRAILER RECORD ;25AUG1 BR 25$ ; EXIT WITH CLOSE ;25AUG1 23$: ;25AUG1 MOV TRNSFR,R2 ; ACT AS IF SAME TRANSFER ADDRESS ;25AUG1 JMP 227$ ;25AUG1 24$: ;**-2 OUTPUT IOE ; I/O ERROR 25$: JMP CLOSE ; EXIT WITH CLOSE 26$: MOV F.NRBD(R0),R1 ; KEEP RECORD LENGTH MOV R1,SAVLEN ; SAVE LENGTH CLRB RECORD(R1) ; MAKE ASCIZ MOV #RECORD,R0 ; R0 POINTS TO INPUT REC 30$: TSTB (R0) ; END OF RECORD? BEQ 20$ ; EQ: YES - GET ANOTHER CMPB #':,(R0)+ ; COLON FOUND? BNE 30$ ; NE: NO, KEEP LOOKING CALL GETHX2 ; GET DATA COUNT BCS 32$ ; CS: HEX CONVERSION ERROR MOVB R1,R4 ; INITIALIZE DATA COUNT CALL GETHX4 ; GET ADDRESS BCC 34$ ; CC: O.K. 32$: JMP HCERROR ; HEX CONVERSION ERROR 34$: MOV R1,R2 ; CURRENT ADDRESS GOES IN R2 MOV R1,R5 ; INITIALIZE CHECKSUM SWAB R5 ; WITH HIGH BYTE OF ADDR ADD R1,R5 ; ADD LOW BYTE OF ADDR ADD ADDVAL,R2 ; ADD/SUBTRACT USER SUPPLIED OFFSET ;25AUG1 ADD R4,R5 ; ADD DATA COUNT TO CHECKSUM CALL GETHX2 ; GET RECORD TYPE BCS 32$ ; CS: HEX CONVERSION ERROR ;17FEB1 ADD R1,R5 ; ADD RECORD TYPE TO CHECKSUM TSTB R4 ; ZERO COUNT - MUST BE TRAILER RECORD BEQ 200$ ; EQ: PROCESS TRAILER RECORD 40$: ; PROCESS A DATA BYTE CALL GETHX2 ; GET THE DATA BYTE BCS 32$ ; CS: HEX CONVERSION ERROR ;17FEB1 ADD R1,R5 ; ADD TO CHECKSUM CMP LOBOUND,R2 ; WITHIN RANGE? BHI 60$ ; HI: < LOW BOUND, SO IGNORE CMP HIBOUND,R2 ; WITHIN RANGE? BLO 60$ ; LO: > HIGH BOUND, SO IGNORE CMP LOADDR,R2 ; IS THIS A NEW LOW? BLOS 42$ ; LOS: NO MOV R2,LOADDR ; YES - UPDATE LOWEST ADDRESS SO FAR 42$: CMP HIADDR,R2 ; IS THIS A NEW HIGH? BHIS 44$ ; HIS: NO MOV R2,HIADDR ; YES - UPDATE HIGHEST ADDRESS SO FAR 44$: INC COUNT ; UPDATE TOTAL LOAD COUNT MOVB R1,R3 ; R3 TEMPORARILY HOLDS BYTE TO BE LOADED MOV R2,R1 ; SET UP TO VALIDATE CALL VALID ; VALIDATE & OFFSET BCS 32$ ; CS: BAD - OUTPUT BAD RECORD ;19JUN1 TSTB CMPFLG ; IS THIS A COMPARE? BNE 50$ ; NE: NO - READ CMPB R3,MEMORY(R1) ; DOES IT MATCH? BEQ 60$ ; YES - CONTINUE LIKE A READ CALL MISMATCH ; PROCESS THE MISMATCH BR 60$ ; CONTINUE 50$: MOVB R3,MEMORY(R1) ; PUT INTO VIRTUAL MEMORY 60$: INC R2 ; UPDATE LOCATION COUNTER SOB R4,40$ ; CONTINUE FOR DATA COUNT CALL GETHX2 ; GET CHECKSUM BCC 61$ ; CC: OK ;25AUG1 JMP HCERROR ; HEX CONVERSION ERROR ;25AUG1 61$: ;25AUG1 ADD R1,R5 ; ACCUMULATE CHECKSUM ;**-1 TSTB R5 ; CHECKSUM CORRECT? BEQ 20$ ; EQ: YES - PROCESS ANOTHER RECORD BR 210$ ; CHECKSUM ERROR 200$: ; PROCESS TRAILER RECORD SUB ADDVAL,R2 ; DON'T INCLUDE USER OFFSET IN TRANSFER ;25AUG1 CALL GETHX2 ; GET THE CHECKSUM ;25AUG1 BCC 202$ ; CC: OK ;25AUG1 JMP HCERROR ; HEX CONVERSION ERROR ;25AUG1 202$: ;25AUG1 ADD R1,R5 ; ACCUMULATE CHECKSUM ;**-2 TSTB R5 ; CHECKSUM IS CORRECT IFF ZERO BEQ 220$ ; EQ: O.K. 210$: ; HANDLE BAD CHECKSUM OUTPUT CSE ; CHECKSUM ERROR BR HCERROR ; PUT OUT OFFENDING RECORD 220$: TSTB PART ; PARTIAL FILE EXPECTED? ;25AUG1 BEQ 221$ ; EQ: NO - OK THAT WE GOT TRAILER ;25AUG1 OUTPUT TRI ; "TRAILER RECORD IGNORED" ;25AUG1 MOV TRNSFR,R2 ; FAKE OUT BY USING OLD TRANSFER ADDRESS ;25AUG1 221$: ;25AUG1 TSTB CMPFLG ; IS THIS A COMPARE? BNE 225$ ; NE: NO - READ MOV TRNSFR,R1 ; WHAT IS THE CURRENT VALUE? CMP R1,R2 ; ARE THEY THE SAME? BEQ 227$ ; EQ: YES - CONTINUE MOV #RDT+RDTLEN-4,R0 ; FORMAT MESSAGE CALL PUTHX4 MOV R2,R1 ; PUT FILE VALUE INTO MESSAGE MOV #FLT+FLTLEN-4,R0 CALL PUTHX4 OUTPUT RDT,#RDTLEN+FLTLEN ; OUTPUT THE MESSAGE BR 227$ ; AND CONTINUE 225$: MOV R2,TRNSFR ; UPDATE TRANSFER VALUE 227$: MOV TRNSFR,R1 ; PUT TRANSFER ADDRESS IN MESSAGE ;25AUG1 MOV #RDT+RDTLEN-4,R0 ;**-1 CALL PUTHX4 MOV LOADDR,R1 ; PUT LOWEST ADDR ENCOUNTERED IN MESSAGE MOV #RDL+RDLLEN-5,R0 CALL PUTHX4 TST COUNT ; WAS THERE ANY DATA REALLY LOADED? ;19JUN1 BNE 228$ ; NE: ABSOLUTELY ;19JUN1 CLR LOADDR ; EQ: NOT ANY, MUST CLEAR STATISTICS ;19JUN1 228$: ;19JUN1 MOV HIADDR,R1 ; PUT HIGHEST ADDR ENCOUNTERED IN MESSAGE MOV #RDH+RDHLEN-5,R0 CALL PUTHX4 MOV COUNT,R1 ; PUT BYTE COUNT INTO MESSAGE MOV #RDC+RDCLEN-5,R0 CALL PUTHX4 ; COMPUTE 16-BIT BYTE-WISE CHECKSUM OVER ;17FEB1 ; ENTIRE RANGE OF LOW - HIGH ;17FEB1 MOV LOADDR,R1 ;17FEB1 CALL VALID ; SUBTRACT OFFSET ;17FEB1 MOV R1,R2 ; FROM ADDRESS IN R2 ;17FEB1 MOV HIADDR,R1 ; TO ADDRESS IN R1 ;17FEB1 CALL VALID ; SUBTRACT OFFSET ;17FEB1 SUB R2,R1 ; PUT COUNT IN R1 ;17FEB1 INC R1 ;17FEB1 MOV R1,R4 ; KEEP RUNNING COUNT IN R4 ;25AUG1 MOV R2,R1 ; KEEP CURRENT ADDRESS IN R1 ;25AUG1 CLR R3 ; CLEAR TOTAL CHECKSUM ;25AUG1 240$: ;25AUG1 ADD OFFST,R1 ; TEMPORARILY UNOFFSET SO WE CAN VALIDATE ;25AUG1 CALL VALID ; MUST KEEP A VALID POINTER THROUGHOUT ;25AUG1 BCS 245$ ; CS: WENT INVALID - CANNOT COMPUTE CHECKSUM ;25AUG1 MOVB MEMORY(R1),R0 ; GET BYTE TO ADD ;25AUG1 BIC #177400,R0 ; CLEAR HIGH BYTE ;25AUG1 ADD R0,R3 ; ADD THE NEW BYTE TO THE CHECKSUM ;25AUG1 INC R1 ; INCREMENT VIRTUAL MEMORY POINTER ;25AUG1 SOB R4,240$ ; REPEAT FOR COUNT ;25AUG1 MOV R3,R1 ; PUT SUM INTO R1 ;**-7 TST COUNT ; WAS THERE ANY DATA REALLY LOADED? ;19JUN1 BNE 241$ ; NE: ABSOLUTELY ;19JUN1 CLR R1 ; EQ: NO - JUST SHOW SUM OF 0000 ;19JUN1 241$: ;19JUN1 MOV #RDS+RDSLEN-5,R0 ;17FEB1 CALL PUTHX4 ; PUT OUT SUM DATA ;17FEB1 243$: ;25AUG1 MOV #RDL,OUTDIR+Q.IOPL ; SET UP TO OUTPUT STATISTICS ;17FEB1 MOV #RDLLEN+RDHLEN+RDCLEN+RDSLEN+RDTLEN,OUTDIR+Q.IOPL+2 ; LENGTH;17FEB1 BR OUT ; DO THE OUTPUT DIRECTIVE 245$: ;25AUG1 MOV #RDS+RDSLEN-5,R0 ; SHOW "????" FOR CHECKSUM ;25AUG1 MOV #4,R1 ; PUT 4 "?" ;25AUG1 247$: ;25AUG1 MOVB #'?,(R0)+ ;25AUG1 SOB R1,247$ ;25AUG1 BR 243$ ;25AUG1 ;25AUG1 ;25AUG1 HCERROR: MOV #RECORD,OUTDIR+Q.IOPL ; SET UP FOR OUTPUT MOV SAVLEN,OUTDIR+Q.IOPL+2 ; USE SAVED LENGTH OUT: DIR$ #OUTDIR ; OUTPUT CLOSE: CLOSE$ #FDB ; EXIT WITH CLOSE ERREXIT: RETURN .PAGE .SBTTL MISMATCH - PROCESS MISMATCH FOUND IN COMPARE OPERATION ; ; ; INPUT PARAMETERS: ; ; R1 CONTAINS THE OFFSETTED ADDRESS ; R2 CONTAINS THE UN-OFFSETTED ADDRESS ; R3 CONTAINS THE VALUE OBTAINED FROM THE FILE ; ; OUTPUT PARAMETERS: ; ; NONE ; ; DESTROYS: NOTHING ; MISMATCH: PUSH R0 ; SAVE READ POINTER PUSH R1 ; SAVE OFFSETTED VALUE MOVB MEMORY(R1),R1 ; GET VIRTUAL MEMORY VALUE MOV #AMF+24.,R0 ; PUT INTO MESSAGE CALL PUTHX2 MOV R2,R1 ; GET UN-OFFSETTED ADDRESS MOV #AMF+10.,R0 ; PUT INTO MESSAGE CALL PUTHX4 MOVB R3,R1 ; GET FILE VALUE MOV #AMF+34.,R0 ; PUT INTO MESSAGE CALL PUTHX2 OUTPUT AMF ; PUT THE MESSAGE OUT POP R1 ; RESTORE THE OFFSETTED VALUE POP R0 ; RESTORE READ POINTER RETURN .PAGE .SBTTL READ DATA AREAS .PSECT DATA SAVLEN: .BLKW 1 ; SAVED LENGTH OF INPUT RECORD IN CASE OF ERROR LOBOUND: .BLKW ; LOW LIMIT ON READ HIBOUND: .BLKW ; HIGH LIMIT ON READ LOADDR: .BLKW ; LOWEST ADDRESS ENCOUNTERED SO FAR HIADDR: .BLKW ; HIGHEST ADDRESS ENCOUNTERED SO FAR COUNT: .BLKW ; NUMBER OF BYTES LOADED THIS READ CMPFLG: .BLKB ; COMPARE/READ FLAG 0->COMPARE, 1-> READ PART: .BLKB ; 0 ---> FULL FILE, 1 ---> NO TRAILER RECORD ;25AUG1 ADDVAL: .BLKW ; USER SUPPLIED OFFSET TO BE ADDED ;25AUG1 ; TO ADDRESS UPON READ ;25AUG1 ;25AUG1 .EVEN ;25AUG1 ;25AUG1 ;25AUG1 .PSECT .END