ALWAYS 16FEB1 WRITE ;17FEB1 .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 .PAGE ;17FEB1 WRITE:: CALL FROMTH ; COLLECT FROM/THRU BCC 5$ ; CC: GOT THEM JMP ERREXIT ; TAKE ERROR EXIT 5$: GETKEY FILE ; GET FILE KEYWORD ;**-2 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 ;**-11 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 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 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 BITB #037,R2 ; ON A 20H BOUNDARY? BEQ 50$ ; EQ: YES - OUTPUT CMP R2,R3 ; DONE IF PAST HIGH UNIT 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 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 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$: ;**-1 OUTPUT IOE ; I/O ERROR 67$: CLOSE$ #FDB BR 255$ ; SUCCESS EXIT 250$: ;**-3 255$: ERREXIT: RETURN .END