; CLNRES10.ASM ; ; Cleans a file freshly created by RESOURCE or MSOURCE. ; ; Removes comments from the end of a line which is only a hex address ; and when a label line is encountered, and the line contains only a ; comment with no opcode it appends the next line in the file one tab ; after the label. ; ; LABEL: ;1234H ; LXI H,L0234 ;0234H ; Becomes ; ; LABEL: LXI H,L0234 ; ; Lines with comments only are not affected. Any lines which have been ; edited and appear as: ; ; LABEL: OPCODE OPERAND ;COMMENT ; ; will only have the comment removed. ; ; To use the program type: ; ; CLNRES filename (newname) ; ; CLNRES looks for an .ASM file and creates a .$$$ file. ; ; Please advise on any problems: J.A. Prest ; 18704 Glastonbury Rd ; Detroit, MI. 48219 ; 313-538-1204 ; 2,26,80 J.A.P ; CPM EQU 0 BDOS EQU 5 FCB EQU 5CH FCB2 EQU 6CH TBUFF EQU 80H PRNSTR EQU 9 OPEN EQU 0FH CLOSE EQU 10H DELETE EQU 13H READ EQU 14H WRITE EQU 15H CREATE EQU 16H SETBFR EQU 1AH CR EQU 0DH LF EQU 0AH EOF EQU 1AH BFRLEN EQU 2000H ; ORG 100H START: LXI SP,STACK+20 MVI C,PRNSTR LXI D,SIGNON CALL BDOS LXI H,FCB LXI D,REAFCB MVI C,9 CALL MOVE ; ; Initialize ; XRA A STA READEX STA READRC LXI H,BFRLEN SHLD RBFLEN SHLD REAPTR MVI C,OPEN LXI D,REAFCB CALL BDOS INR A JNZ COMP02 MVI C,PRNSTR LXI D,NOSMSG CALL BDOS JMP CPM COMP02: LDA FCB2+1 LXI H,FCB CPI ' ' JZ COMP04 LXI H,FCB2 COMP04: LXI D,WRIFCB MVI C,9 CALL MOVE XRA A STA WRITEX STA WRITRC LXI H,BFRLEN SHLD WBFLEN LXI H,0 SHLD WRIPTR MVI C,DELETE LXI D,WRIFCB CALL BDOS MVI C,CREATE LXI D,WRIFCB CALL BDOS INR A JNZ WORKLP MVI C,PRNSTR LXI D,NOSPMS CALL BDOS JMP CPM ; ; Main work loop. Brings each line into intermediate buffer and tests ; it for the proper cleanup feature. ; WORKLP: LXI H,INTBFR-1 CALL LODI02 XRA A STA COMSW LXI H,INTBFR-1 WORK02: INX H MOV A,M CPI ';' JNZ WORK03 STA COMSW JMP SNDIBF WORK03: CPI ' '+1 JNC WORK02 DCX H SHLD IBFPTR INX H WORK04: MOV A,M INX H CPI LF JZ WORK06 CPI ' '+1 JC WORK04 CPI ';' WORK06: CZ LODIBF SNDIBF: LXI H,SW MVI M,0FFH SHLD IBFPTR SIBF02: LXI H,SW MOV A,M CMA MOV M,A SIBF04: LHLD IBFPTR INX H SHLD IBFPTR MOV A,M SIBF06: CALL PUT CPI LF JZ WORKLP CPI 27H JZ SIBF02 CPI ';' JNZ SIBF04 LDA SW ORA A JNZ SIBF04 LDA COMSW ORA A JNZ SIBF04 MVI A,CR CALL PUT MVI A,LF JMP SIBF06 ; LODI02: SHLD IBFPTR LODIBF: CALL GET LHLD IBFPTR INX H SHLD IBFPTR MOV M,A CPI LF JNZ LODIBF RET ; ; Done with the reads so send the rest of the line to the write buffer ; and fill the sector out with EOF's. Then close the file. ; DONE: LHLD WRIPTR MOV A,L ANI 7FH JNZ DONE2 SHLD WBFLEN DONE2: MVI A,EOF PUSH PSW CALL PUT POP PSW JNZ DONE MVI C,CLOSE LXI D,WRIFCB CALL BDOS INR A JNZ DONE4 MVI C,PRNSTR LXI D,BADCMS CALL BDOS JMP CPM DONE4: LXI D,DONEMS MVI C,PRNSTR CALL BDOS JMP CPM ; ; Get a byte of data from the input file. ; GET: CALL SEQREA CPI EOF RNZ JMP DONE ; ; Move memory (HL) to (DE) for length (C). ; MOVE: MOV A,M STAX D INX H INX D DCR C JNZ MOVE RET ; ; Sequential READ routine ; ; Calling this routine returns the next character in the file or a EOF ; at the end of the file. ; SEQREA: LHLD RBFLEN XCHG LHLD REAPTR MOV A,L SUB E MOV A,H SBB D JC READ08 LXI H,0 SHLD REAPTR READ02: XCHG LHLD RBFLEN MOV A,E SUB L MOV A,D SBB H JNC READ06 LHLD RBFLOC DAD D XCHG MVI C,SETBFR CALL BDOS LXI D,REAFCB MVI C,READ CALL BDOS ORA A JNZ READ04 LXI D,80H LHLD REAPTR DAD D SHLD REAPTR JMP READ02 ; READ04: LHLD REAPTR SHLD RBFLEN READ06: LXI D,TBUFF MVI C,SETBFR CALL BDOS LXI H,0 SHLD REAPTR READ08: XCHG LHLD RBFLOC DAD D XCHG LHLD RBFLEN MOV A,L ORA H MVI A,EOF RZ LDAX D LHLD REAPTR INX H SHLD REAPTR RET ; ; Sequential WRITE routing ; ; Calling this routine with a character in the A register will load it ; into the write file. All disk operations except CLOSE is automatic. ; When WRIPTR=WBFLEN, the buffer is sent to the disk. ; PUT: PUSH PSW LHLD WBFLEN XCHG LHLD WRIPTR MOV A,L SUB E MOV A,H SBB D JC PUT08 LXI H,0 SHLD WRIPTR PUT02: XCHG LHLD WBFLEN MOV A,E SUB L MOV A,D SBB H JNC PUT06 LHLD WBFLOC DAD D XCHG MVI C,SETBFR CALL BDOS LXI D,WRIFCB MVI C,WRITE CALL BDOS ORA A JNZ PUT04 LXI D,80H LHLD WRIPTR DAD D SHLD WRIPTR JMP PUT02 ; PUT04: MVI C,PRNSTR LXI D,FULMSG CALL BDOS POP PSW JMP CPM ; PUT06: LXI D,TBUFF MVI C,SETBFR CALL BDOS LXI H,0 SHLD WRIPTR PUT08: XCHG LHLD WBFLOC DAD D XCHG POP PSW STAX D LHLD WRIPTR INX H SHLD WRIPTR RET ; SIGNON: DB CR,LF,'CLNRES Utility, Version 1.0' DB CR,LF,'Cleans Resource File' DB CR,LF,'$' NOSMSG: DB CR,LF,'No Source File$' FULMSG: DB CR,LF,'Disk Full$' NOSPMS: DB CR,LF,'No Directory Space$' BADCMS: DB CR,LF,'Cannot Close File$' DONEMS: DB 'CLNRES Complete$' ; ; Read buffer file control block and variables ; REAFCB: DB 0,' ASM' READEX: DW 0,0,0,0,0,0,0,0,0,0 READRC: DB 0 RBFLOC: DW READBF RBFLEN: DW BFRLEN REAPTR: DW 0 ; ; Write buffer File Control Block and variables ; WRIFCB: DB 0,' $$$' WRITEX: DW 0,0,0,0,0,0,0,0,0,0 WRITRC: DB 0 WBFLOC: DW WRITBF WBFLEN: DW BFRLEN WRIPTR: DW 0 IBFPTR: DS 2 COMSW: DS 1 SW: DS 1 INTBFR: DS 100H STACK: DS 20 READBF: DS BFRLEN WRITBF: DS BFRLEN END