******************************** * * * ASSEMBLY LISTING MINIFIER * * * * A PROGRAM THAT REMOVES * * COMMENTS FROM ASSEMBLY CODE. * * * ******************************** * ** ASSEMBLER DIRECTIVES * CYC AVE EXP OFF DSK MINIFY TR ON OBJ $BFE0 ORG $7000 * ******************************** * * * HEADER, HOOKS AND MACROS * * * ******************************** * PUT MIN.VARS.REQUIRED USE MIN.MAC.REQUIRED PUT MIN.HOOKS.REQUIRED USE MIN.MAC.STDIO PUT MIN.HOOKS.STDIO USE MIN.MAC.FILEIO PUT MIN.HOOKS.FILEIO USE MIN.MAC.STRINGS PUT MIN.HOOKS.STRINGS * ******************************** * * * MAIN PROGRAM LOOP * * * ******************************** * BEGIN * JSR INIT JSR GETNAMES JSR DELMIN JMP FCOPY * JMP REENTRY * ******************************** * * * INIT * * * ******************************** * INIT * ** RESET ERROR HANDLING * AMODE LDA #$00 STA $D8 * LDA #21 ; SEND ^U TO COUT TO JSR COUT ; ENSURE 40COL MODE LDA #00 STA ADDT STA WRITEOFF RTS * ******************************** * * * GETNAMES * * * ******************************** * GETNAMES * JSR HOME PRN "ASSEMBLY CODE MINIFIER",8D PRN "======================",8D8D PRN "THIS PROGRAM STRIPS A",8D PRN "PROGRAM OF ITS COMMENTS",8D PRN "AND STORES THE RESULTING",8D PRN "FILE WIN A MIN. PREFIX.",8D8D * :QUERY PRN "FILE TO MINIFY ",8D PRN "(RETURN FOR CATALOG): " INP LDA RETLEN CMP #0 ; IF NOT JUST CR, THEN BNE :NAMES ; GO TO NAMES CMD "CATALOG" ; OTHERWISE, CAT PRN " ",8D JMP :QUERY :NAMES GRET #SNAME GRET #DNAME * ** NEED TO CHECK IF STARTING WITH T.; IF SO, INSERT ** MIN. AFTER T. OTHERWISE, JUST PREFIX. * SPOS #SNAME;"T." LDA RETURN CMP #1 ; IF STRING BEGINS WITH "T." BNE :CONTN ; DELETE T. FROM STRING SDEL #DNAME;#1;#2 LDA #$FF STA ADDT :CONTN SCAT "MIN.";#DNAME;#30 LDA RETLEN GRET DNAME ; SCAT PUTS LENGTH BYTE ; IN RETURN AS WELL AS RETLEN * ** NOW ADD BACK "T." PREFIX IF NEEDED * LDA ADDT CMP #$FF BNE SKIPT SCAT "T.";DNAME;#30 GRET #DNAME SKIPT RTS * ******************************** * * * DELMIN * * * ******************************** * DELMIN * ** HIJACK ERROR HANDLING * LDA #$FF STA $D8 * ** SET ERROR CONTROL TO CONTINUE ** FILE TO DELETE DOESN'T EXIST * LDA #<:DELCONT STA $9D5A LDA #>:DELCONT STA $9D5B * SCAT "DELETE ";#DNAME;#50 ; DELETE PREVIOUS IF EXISTS CMD #RETURN * :DELCONT RTS * ******************************** * * * MAIN FILE COPY LOOP * * * ******************************** * FCOPY * PRN "MINIFYING...",8D8D * JSR SETFILEERR JSR OPENFILES * ** THE FOLLOWING LOOP ENDS WHEN ** THE END OF THE SOURCE FILE ** IS REACHED, PROMPTING AN ERROR ** THAT GETS HANDLED BY FCLOSE * :COPYLOOP JSR READSRC JSR CHKCOMMENT JSR WRITEDEST :LOOPEND JMP :COPYLOOP * ******************************** * * * SETFILEERR * * * ******************************** * SETFILEERR * ** SET ERROR CONTROL TO FILE CLOSING ROUTINE * LDA #FCLOSE STA $9D5B RTS * ******************************** * * * OPENFILES * * * ******************************** * OPENFILES * ** OPEN SOURCE AND DESTINATION FILES * SCAT "OPEN ";#SNAME;#80 CMD #RETURN SCAT "OPEN ";#DNAME;#80 CMD #RETURN RTS * ******************************** * * * READSRC * * * ******************************** * READSRC * ** CLEAR BUFFER POINTER, SET TO READ SOURCE * LDA #1 STA CCNT SCAT "READ ";#SNAME;#80 CMD #RETURN :LP GKEY ; ASCII CHAR STORED IN .A LDY CCNT STA LINE,Y CMP #$8D ; IS THIS A CARRIAGE RETURN? BEQ :XLP ; YES, EXIT LOOP INC CCNT ; INCREASE BUFFER POINTER JMP :LP ; KEEP ON READING :XLP LDA CCNT STA LINE RTS * ******************************** * * * CHKCOMMENT * * * ******************************** * CHKCOMMENT * ** NOW CHECK IF LINE BEGINS WITH * * LDA LINE+1 CMP #170 ; * CHARACTER BNE :SEMITEST LDA #$FF STA WRITEOFF * :SEMITEST * ** NOW TEST FOR SUBSTRING " ; " * LDA LINE ; START AT END OF STRING STA CCNT DEC CCNT * :SEMILP LDY CCNT LDA LINE,Y CMP #$BB ; ";" CHARACTER BEQ :SEMIF CPY #0 BEQ :XSEMILP DEC CCNT JMP :SEMILP * :SEMIF LDY CCNT INY LDA LINE,Y CMP #$20 ; IS NEXT CHAR A SPACE? BNE :XSEMILP LDA #$8D LDY CCNT STA LINE,Y :XSEMILP RTS * ******************************** * * * WRITEDEST * * * ******************************** * WRITEDEST * LDA WRITEOFF CMP #$FF BEQ :XWLP * ** CLEAR COUNTER, SET TO WRITE DEST * LDA #1 STA CCNT SCAT "WRITE ";#DNAME;#80 CMD #RETURN * :WLP ; WRITE LOOP LDY CCNT LDA LINE,Y CMP #$8D ; WAS IT A CR? BEQ :XWLP ; YEP, EXIT LOOP JSR FCOUT ; PRINT TO FILE INC CCNT JMP :WLP :XWLP LDA #00 STA WRITEOFF RTS * ******************************** * * * FCLOSE * * * ******************************** * FCLOSE * ** NOW CLOSE SOURCE AND DESTINATION FILES ** AFTER END OF FILE ERROR * SCAT "CLOSE ";#SNAME;#80 CMD #RETURN * SCAT "CLOSE ";#DNAME;#80 CMD #RETURN * PRN "DONE!",8D8D PRN "WOULD YOU LIKE TO MINIFY ANOTHER? " INP LDA RETURN+1 CMP #217 ; 'Y' LETTER BNE FIN PLA PLA PLA JMP BEGIN FIN * PLA PLA JMP REENTRY * ******************************** * * * VARIABLES * * * ******************************** * SNAME DS 40 ; SOURCE FILE NAME DNAME DS 40 ; DEST FILE NAME CCNT DS 2 ; SECOND COUNTER TEMP DS 2 WRITEOFF DS 2 ADDT HEX 00 LINE DS 200 * ******************************** * * * LOW-LEVEL ROUTINES * * * ******************************** * PUT MIN.LIB.REQUIRED * ** INDIVIDUAL SUBROUTINES * *** STRINGS * PUT MIN.SUB.STRCAT PUT MIN.SUB.SUBPOS PUT MIN.SUB.PRNSTR PUT MIN.SUB.SUBDEL * *** STDIO * PUT MIN.SUB.DPRINT PUT MIN.SUB.XPRINT PUT MIN.SUB.SINPUT * *** FILEIO * PUT MIN.SUB.DOSCMD PUT MIN.SUB.FINPUT PUT MIN.SUB.FPRINT PUT MIN.SUB.FPSTR *