ALWAYS 25AUG1 WRITE ;25AUG1 .MCALL DIR$,PUT$,CLOSE$ ;**-1 .MCALL OPEN$W ; ; MODULE: WRITE ; ; FUNCTION: WRITE A HEX OUTPUT FILE ; ; INPUT PARAMETERS: ; ; R0 POINTS TO COMMAND LINE IN PROCESS ; ; OUTPUT PARAMETERS: ; ; DESTROYS ALL REGISTERS ; ; AUTHOR: KEVIN ANGLEY ; ; DATE: 27-AUG-80 ; ; ; ;17FEB1 ;*** EDIT HISTORY: ;17FEB1 ; ;17FEB1 ; 16FEB1 KEVIN ANGLEY SHOW WRITE STATISTICS ON SCREEN LIKE READ ;17FEB1 ; ;17FEB1 ; 21AUG1 KEVIN ANGLEY ADDED KEYWORDS "PLUS/MINUS" TO ALLOW OFFSETTING ;21AUG1 ; ADDRESSES UPON OUTPUT. KEYWORD "PARTIAL" ;21AUG1 ; WRITES A FILE WITH NO TRAILER RECORD. ;21AUG1 ; KEYWORD "WIDTH" ALLOWS HEX FILE WIDTH TO BE A ;21AUG1 ; HEX NUMBER FROM 01-20. ;24AUG1 ; ;24AUG1 ; 25AUG1 KEVIN ANGLEY FIXED BUG IN WIDTH KEYWORD NOT WORKING IN ;25AUG1 ; CONJUNCTION WITH THE PARTIAL KEYWORD. ;**-1 ; ;24AUG1 .PAGE ;21AUG1 WRITE:: ;21AUG1 CLR ADDVAL ; ASSUME NO OFFSETTING UPON WRITING ADDRESSES ;21AUG1 CLRB PART ; ASSUME FULL FILE WITH TRAILER ;21AUG1 MOVB #DEFWID,WIDTH ; SET DEFAULT WIDTH ;21AUG1 CALL FROMTH ; COLLECT FROM/THRU ;24AUG1 BCC 5$ ; CC: GOT THEM JMP ERREXIT ; TAKE ERROR EXIT 5$: GETKEY PLUS ; TRY FOR "PLUS" KEYWORD ;21AUG1 BNE 151$ ; NE: NO GOTS ;21AUG1 CALL GETHX4 ; GET 4-DIGIT HEX NUMBER ;21AUG1 BCC 154$ ; CC: GOT IT ;21AUG1 JMP ERREXIT ; TAKE ERROR EXIT ;21AUG1 151$: ;21AUG1 GETKEY MINUS ; TRY FOR "MINUS" KEYWORD ;21AUG1 BNE 158$ ; NE: NO GOTS ;21AUG1 CALL GETHX4 ; GET 4-DIGIT HEX NUMBER ;21AUG1 BCC 153$ ; CC: GOT IT ;21AUG1 JMP ERREXIT ; TAKE ERROR EXIT ;21AUG1 153$: ;21AUG1 NEG R1 ; FOR MINUS, MAKE NEGATIVE ;21AUG1 154$: ;21AUG1 MOV R1,ADDVAL ; SAVE ADD VALUE ;21AUG1 158$: ;21AUG1 GETKEY WIDTH ; TRY FOR "WIDTH" KEYWORD ;21AUG1 BNE 175$ ; NE: NO GOTS ;21AUG1 CALL GETHX2 ; GET 2-DIGIT HEX NUMBER ;21AUG1 BCC 160$ ; CC: GOT IT ;21AUG1 JMP ERREXIT ; TAKE ERROR EXIT ;21AUG1 160$: ;21AUG1 TSTB R1 ; ZERO IS ILLEGAL ;21AUG1 BEQ 161$ ; EQ: NOT ALLOWED ;21AUG1 CMPB #MAXWID,R1 ; CANNOT EXCEED MAXIMUM WIDTH ;21AUG1 BHIS 170$ ; LOS: DOES NOT ;21AUG1 161$: ;21AUG1 OUTPUT BDW ; BAD WIDTH ;21AUG1 JMP ERREXIT ; TAKE ERROR EXIT ;21AUG1 170$: ;21AUG1 MOVB R1,WIDTH ; SAVE THE WIDTH ;25AUG1 175$: ;**-1 GETKEY PARTIAL ; TRY FOR PARTIAL KEYWORD ;21AUG1 BNE 180$ ; NE: NO GOTS ;21AUG1 INCB PART ; SET PARTIAL FLAG ;21AUG1 180$: ;21AUG1 .PAGE ;21AUG1 ;21AUG1 GETKEY FILE ; GET FILE KEYWORD BEQ 7$ ; EQ: GOT IT OUTPUT MSK ; MISSING KEYWORD JMP ERREXIT ; TAKE ERROR EXIT 7$: ; ; CALL PARSE ; PARSE THE FILE DESCRIPTOR ;17FEB1 BCS 9$ ; CS: PARSE FAILURE - TAKE ERROR EXIT ;17FEB1 OPEN$W #FDB ; OPEN THE FILE FOR WRITE ;17FEB1 BCC 10$ ; CC: OPENED O.K. ;17FEB1 OUTPUT FOE ; FILE OPEN ERROR ;17FEB1 9$: ;17FEB1 JMP 250$ ; TAKE ERROR EXIT ;17FEB1 10$: ;17FEB1 MOV TO,R3 ; RESTORE TO ADDR ;17FEB1 MOV FROM,R2 ; RESTORE FROM ADDR ;17FEB1 MOVB #':,RECORD ; SET UP SKELETAL RECORD MOVB #'0,RECORD+7. ; DEFAULT RECORD TYPE MOVB #'0,RECORD+8. ; ; ; ; OUTPUT SECTION ; ; REGISTER USAGE: ; ; R0 POINTS TO CURRENT LOCATION IN RECORD ; R1 CONTAINS VALUE TO BE CONVERTED (LOW BYTE) ; R2 CONTAINS CURRENT ADDRESS TO BE OUTPUT ; R3 CONTAINS LAST ADDRESS TO BE OUTPUT ; R4 CONTAINS DATA COUNT (LOW BYTE) ; R5 CONTAINS CHECKSUM (LOW BYTE) ; 20$: ; INITIALIZE A RECORD MOV #RECORD+3,R0 ; BEGIN AT ADDRESS ADD OFFST,R2 ; TEMPORARILY ADD OFFSET ADD ADDVAL,R2 ; INCLUDE USER SUPPLIED OFFSET ;21AUG1 MOV R2,R5 ; INIT CHECKSUM WITH SWAB R5 ; HIGH BYTE OF ADDRESS ADD R2,R5 ; ADD LOW BYTE TO CS MOV R2,R1 ; PREPARE TO OUTPUT CALL PUTHX4 ; OUTPUT, MOVE PTR SUB ADDVAL,R2 ; REMOVE USER SUPPLIED OFFSET ;21AUG1 SUB OFFST,R2 ; REMOVE OFFSET ADD #2,R0 ; SKIP TWO BYTE RECORD TYPE CLRB R4 ; CLEAR DATA COUNT 30$: ; INSERT A DATA BYTE MOVB MEMORY(R2),R1 ; LOAD DATA BYTE INC R2 ; INCREMENT "FROM" COUNT INC R4 ; INCREMENT DATA COUNT ADD R1,R5 ; ADD DATA BYTE TO CS CALL PUTHX2 ; OUTPUT, MOVE PTR PUSH R0 ; SAVE R0,R1 ;21AUG1 PUSH R1 ;21AUG1 CLR R0 ; SET UP FOR DIVIDE TO SEE IF ;21AUG1 MOV R2,R1 ; IT IS TIME TO OUTPUT THE ;21AUG1 DIV WIDTH,R0 ; RECORD ;21AUG1 TST R1 ; IS THERE A REMAINDER? ;21AUG1 BNE 40$ ; NE: OUTPUT NO REC BEFORE ITS TIME ;21AUG1 POP R1 ; RESTORE R1,R0 ;21AUG1 POP R0 ;21AUG1 BR 50$ ; OUTPUT THE RECORD NOW ;21AUG1 40$: ;21AUG1 POP R1 ; RESTORE R1,R0 ;21AUG1 POP R0 ;21AUG1 CMP R2,R3 ; DONE IF PAST HIGH UNIT ;24AUG1 BLOS 30$ ; LOS: NO - KEEP GOING 50$: ; OUTPUT A RECORD PUSH R0 ; SAVE POINTER TO CHECKSUM MOVB R4,R1 ; LOAD DATA COUNT MOV #RECORD+1,R0 ; PUT IN DATA COUNT CALL PUTHX2 POP R0 ; RESTORE POINTER TO CHECKSUM ADD R5,R1 ; ADD CHECKSUM TO DATA COUNT ALREADY IN R1 COMB R1 ; THE CHECKSUM IS THE COMPLEMENT OF THIS INCB R1 ; PLUS ONE CALL PUTHX2 ; PUT OUT THE CHECKSUM, ADVANCE POINTER MOV R0,R1 ; MUST GIVE COUNT IN R1 SUB #RECORD,R1 PUT$ #FDB,,R1 BCS 65$ ; CS: FAILED CMP R2,R3 ; ARE WE DONE BLOS 20$ ; LOS: NO, OUTPUT ANOTHER TSTB PART ; PARTIAL OUTPUT ONLY (I.E. NO TRAILER)? ;21AUG1 BNE 61$ ; NE: TRUE ;21AUG1 MOV #RECORD+1,R0 ; OUTPUT TRAILER CLR R1 ; ZERO DATA COUNT CALL PUTHX2 MOV TRNSFR,R1 ; LOAD TRANSFER ADDRESS MOV R1,R5 ; ACCUMULATE CHECKSUM SWAB R5 ; INITIALIZE WITH HIGH BYTE OF TRANSFER ADDR ADD R1,R5 ; THEN ADD THE LOW BYTE CALL PUTHX4 ; PUT THE TRANSFER ADDRESS MOVB #1,R1 ; RECORD TYPE ALWAYS 1 (IF THIS CHANGES, CALL PUTHX2 ; CHANGE CHECKSUM ACCUMULATION ALSO) COMB R5 ; CHECKSUM IS SIMPLY THE COMPLEMENT OF R5 MOVB R5,R1 ; (SEE NOTE ABOVE) CALL PUTHX2 PUT$ #FDB,,#11. ; OUTPUT TRAILER BCS 65$ ; CS: I/O ERROR ;17FEB1 61$: ;21AUG1 MOV TRNSFR,R1 ; FORMAT STATISTICS MESSAGE ;17FEB1 MOV #RDT+RDTLEN-4,R0 ;17FEB1 CALL PUTHX4 ;17FEB1 MOV FROM,R1 ;17FEB1 ADD OFFST,R1 ; ADD OFFSET ;17FEB1 MOV #RDL+RDLLEN-5,R0 ;17FEB1 CALL PUTHX4 ;17FEB1 MOV TO,R1 ;17FEB1 ADD OFFST,R1 ;17FEB1 MOV #RDH+RDHLEN-5,R0 ;17FEB1 CALL PUTHX4 ;17FEB1 MOV TO,R1 ; COMPUTE COUNT ;17FEB1 SUB FROM,R1 ;17FEB1 INC R1 ;17FEB1 PUSH R1 ; SAVE COUNT ;17FEB1 MOV #RDC+RDCLEN-5,R0 ;17FEB1 CALL PUTHX4 ;17FEB1 MOV FROM,R2 ; COMPUTE CHECKSUM ;17FEB1 POP R1 ; RESTORE COUNT ;17FEB1 CLR R3 ; CLEAR CHECKSUM COUNTER ;17FEB1 62$: ;17FEB1 MOVB MEMORY(R2),R0 ; GET BYTE TO ADD ;17FEB1 BIC #177400,R0 ; CLEAR HIGH BYTE ;17FEB1 ADD R0,R3 ; ACCUMULATE CHECKSUM ;17FEB1 INC R2 ; MOVE POINTER ;17FEB1 SOB R1,62$ ; REPEAT FOR COUNT ;17FEB1 MOV R3,R1 ; PUT CHECKSUM IN MESSAGE ;17FEB1 MOV #RDS+RDSLEN-5,R0 ;17FEB1 CALL PUTHX4 ;17FEB1 MOV #RDL,OUTDIR+Q.IOPL ; SET UP OUTPUT STATISTICS ;17FEB1 MOV #RDLLEN+RDHLEN+RDCLEN+RDSLEN+RDTLEN,OUTDIR+Q.IOPL+2 ; LENGTH ;17FEB1 DIR$ #OUTDIR ;17FEB1 BR 67$ ;17FEB1 65$: OUTPUT IOE ; I/O ERROR 67$: CLOSE$ #FDB BR 255$ ; SUCCESS EXIT 250$: 255$: ERREXIT: RETURN .PAGE ;21AUG1 .SBTTL WRITE SPECIFIC DATA AREAS ;21AUG1 ;21AUG1 ADDVAL: .BLKW ; USER SUPPLIED OFFSET TO ADDED TO ADDRESS UPON OUTPUT ;21AUG1 ;21AUG1 WIDTH: .BLKW ; MAXIMUM NUMBER OF DATA BYTES TO OUTPUT ;24AUG1 PART: .BLKB ; 0 --> FULL FILE, 1 --> NO TRAILER RECORD ;21AUG1 ;21AUG1 ;21AUG1 .END