commit 54a0914502c40d3bceee09d939958dda0ba5cf31 from: Sven M. Hallberg date: Sun May 31 18:14:03 2026 UTC LINEUTIL.B.1 commit - a021f2c2508f6df2ef80b803104eed01f67323e1 commit + 54a0914502c40d3bceee09d939958dda0ba5cf31 blob - /dev/null blob + 5785d55b4029f25b4f3a92b2a08bf0ead1d83fae (mode 644) Binary files /dev/null and LINEUTIL.B,PRG differ blob - /dev/null blob + 1bc881c1b8aa419b202e34a272db8041e44fe2c8 (mode 644) --- /dev/null +++ LINEUTIL.B.lst @@ -0,0 +1,688 @@ +0 REM BASASM - A SIMPLISTIC ASSEMBLER +1 REM MADE IN BASIC. PESCO 2026 +2 REM +3 REM 10 VARIABLES 400 .DIRECTIVES +4 REM 100 LOAD OPCODES 700 *SAVE TO PRG +5 REM 130 SUBROUTINES 720 *PRINT SEQ F +6 REM 200 MAIN LOOP 800 *HEXDUMP MEM +7 REM 300 FORWARD REFS 900 OPCODE TABLE +8 REM 1000 ASSEMBLY PGM +9 REM +10 O = 49152 :REM STARTING POSITION +11 P = O :REM CURRENT POSITION +13 UN = 0 :REM UNDEF SYMBOL COUNT +20 MN% = 150 :REM MNEMONIC MAX +21 DIM MN$(MN%) :REM INST MNEMONICS +22 DIM OP%(MN%) :REM INST OPCODES +23 DIM LN%(MN%) :REM OPERAND LENGTHS +24 DIM MI%(26) :REM ALPH. MNEM. INDEX +25 SY% = 0 :REM SYMBOL COUNT +26 SM% = 511 :REM SYMBOL MAX +27 DIM SY$(SM%) :REM SYMBOL NAMES +28 DIM SY(SM%) :REM SYMBOL VALUES +30 PA% = 0 :REM PATCH COUNT +31 PM% = 99 :REM PATCH MAX +32 DIM PA(PM%) :REM PATCH POSITION +33 DIM PA%(PM%) :REM PATCH LENGTH +34 DIM PA$(PM%) :REM PATCH MODE (INST) +35 DIM PS(PM%) :REM PATCH SYMBOL (IDX) +99 REM +100 REM - READ OPCODE TABLE FROM DATA - +105 PRINT "LOAD OPCODES..."; +107 I = 0: A = 0 +110 READ O%: IF O% = -1 THEN 125 +112 OP%(I) = O% +115 READ MN$(I), X%: LN%(I) = X% - 1 +117 B = ASC(MN$(I)) - 64 +118 IF B = A THEN 120 +119 A = A + 1: MI%(A) = I: GOTO 118 +120 I = I + 1: GOTO 110 +125 PRINT: IF I = MN% + 1 THEN 200 +127 PRINT "INVALID OPCODE DATA": END +128 REM +129 REM SUB: PARSE NUMBER, DEC OR HEX +130 A = VAL(A$) +132 IF LEFT$(A$,1) <> "$" THEN RETURN +138 A$ = MID$(A$,2) +139 IF A$ = "" THEN RETURN +140 A = A * 16 + ASC(A$) - 48 +145 IF ASC(A$) > 64 THEN A = A - 7 +146 GOTO 138 +148 REM +149 REM SUB: PARSE OPERAND, SYM OR NUM +150 IF ASC(A$) > 64 THEN 152 :REM "A" +151 A% = 0: GOTO 130 :REM PARSE NUM +152 PRINT "["; A$; "] "; +155 GOSUB 170: IF SY(A) <> -1 THEN 160 +157 A% = 1: RETURN :REM FAIL; A = IDX +160 A = SY(A) :REM GET SYM. VALUE +165 A% = 0: RETURN :REM SUCCESS +168 REM +169 REM SUB: LOOK UP SYMBOL +170 A = 0 +171 IF A = SY% THEN 174 :REM NOT FND +172 IF SY$(A) = A$ THEN RETURN +173 A = A + 1: GOTO 171 +174 IF SY% < SM% + 1 THEN 176 +175 PRINT "TOO MANY SYMBOLS": END +176 SY% = SY% + 1: UN = UN + 1 +177 SY$(A) = A$: SY(A) = -1: RETURN +178 REM +179 REM SUB: DEFINE SYMBOL +180 GOSUB 170 +181 IF SY(A) = -1 THEN UN = UN - 1 +182 SY(A) = P: RETURN +188 REM +189 REM SUB: WRITE OPERAND +190 IF M$ = "R" THEN A = A - P - 1 +191 IF L% < 1 THEN RETURN +192 FOR J = 0 TO L% - 1 +193 R=A: A=INT(A/256): R=R-A*256 :REM/Q +194 POKE P + J, R +195 PRINT MID$(STR$(R), 2); "CLOSE"; +196 NEXT: RETURN +199 REM +200 REM - ASSEMBLE REST OF DATA - +201 P=O: UN=0: SY%=0: PA%=0 +205 PRINT "ASSEMBLE..." +210 READ M$ +211 IF ASC(M$) = 46 THEN 410 :REM "." +215 IF ASC(M$) = 39 THEN 223 :REM "'" +216 IF ASC(M$) = 36 THEN 219 :REM "$" +217 IF ASC(M$) < 48 THEN 240 :REM "0" +218 IF ASC(M$) > 57 THEN 240 :REM "9" +219 A$ = M$: GOSUB 130 :REM NUM +220 C = A: L% = 0: GOTO 270 +223 A$ = MID$(M$,2): GOSUB 180 +225 PRINT P; TAB(12); M$ :REM SYMDEF +227 GOTO 210 +230 REM SEARCH FOR MNEMONIC +240 A = ASC(M$) - 64 +242 FOR I = MI%(A) TO MN% +245 IF MN$(I) = M$ THEN 260 +250 NEXT +255 PRINT P; " UNKNOWN", M$: END +260 C = OP%(I): L% = LN%(I) +265 REM OUTPUT CODE +270 PRINT P; C; TAB(13); M$; " "; +275 POKE P, C: P = P + 1 +276 M$ = MID$(M$, 4) :REM ADDRESS MODE +277 IF L% > 0 THEN GOSUB 290 +279 PRINT: GOTO 210 +288 REM +289 REM SUB: OUTPUT OPERAND +290 READ A$: GOSUB 150 :REM PARSE -> A +291 IF A% = 0 THEN 295 +292 GOSUB 390 :REM RECORD PATCH +293 A = 0 :REM DUMMY VALUE +294 IF M$ = "R" THEN A = P :REM -> 0 +295 GOSUB 190 :REM WRITE OPERAND +296 P = P + L% +297 RETURN +298 REM +299 REM - AFTER END OF INPUT - +300 PRINT "PATCH FWD REFS..." +305 GOSUB 370 :REM PATCH FWD REFS +310 IF UN = 0 THEN 340 +320 PRINT "UNDEFINED SYMBOLS:" +325 FOR I = 0 TO SY% +330 IF SY(I) = -1 THEN PRINT SY$(I),; +335 NEXT: PRINT +340 END +368 REM +369 REM SUB: PATCH FWD SYMBOL REFS +370 IF PA% = 0 THEN RETURN +371 FOR I = 0 TO PA% - 1 +372 P = PA(I): L% = PA%(I) +373 A = PS(I): M$ = PA$(I) +374 IF SY(A) = -1 THEN NEXT +375 PRINT P + 1; TAB(13); +376 PRINT "["; SY$(A); "] "; +377 A = SY(A): GOSUB 190: PRINT +378 NEXT +380 FOR I = PA% - 1 TO 0 STEP -1 +382 IF SY(PS(I)) <> -1 THEN RETURN +384 NEXT: RETURN +388 REM +389 REM SUB: RECORD SYM REF TO PATCH +390 IF PA% <= PM% THEN 392 +391 PRINT "TOO MANY FWD REFS": END +392 PA(PA%) = P: PA%(PA%) = L% +393 PA(PA%) = P: PA%(PA%) = L% +394 PS(PA%) = A: PA$(PA%) = M$ +395 PA% = PA% + 1: RETURN +400 REM +401 REM - ASSEMBLER DIRECTIVES - +408 REM +409 REM DISPATCH +410 PRINT P; TAB(12); M$; +420 IF M$ = ".DW" THEN 550 +430 IF M$ = ".DB" THEN 530 +440 IF M$ = ".DS" THEN 570 +441 IF M$ = ".DSZ" THEN 570 +445 IF M$ = ".DZ" THEN 580 +450 IF M$ = ".=" THEN 520 +490 IF M$ = ".END" THEN 510 +495 PRINT " UNRECOGNIZED" +496 END +499 GOTO 210 :REM HDLRS RET HERE +500 REM +509 REM .END - TERMINATE INPUT +510 PRINT: GOTO 300 +518 REM +519 REM .= - CHANGE CURRENT POSITION +520 READ A$: GOSUB 150: PRINT A +521 P = A +522 GOTO 499 +528 REM +529 REM .DB - OUTPUT RAW DATA BYTE +530 M$ = "": L% = 1: GOSUB 290 +531 PRINT: GOTO 499 +548 REM +549 REM .DW - OUTPUT 2-BYTE WORD +550 M$ = "": L% = 2: GOSUB 290 +551 PRINT: GOTO 499 +567 REM +568 REM .DS - OUTPUT PETSCII STRING +569 REM .DSZ - OUTPUT ZERO-TERMINATED +570 READ A$ +571 IF A$ = "" THEN 575 +572 X = ASC(A$): PRINT STR$(X); +573 POKE P,X: P=P+1: A$ = MID$(A$,2) +574 GOTO 571 +575 IF M$ = ".DS" THEN 577 +576 PRINT " 0";: POKE P,0: P=P+1 +577 PRINT: GOTO 499 +578 REM +579 REM .DZ - OUTPUT N ZERO BYTES +580 READ A$: GOSUB 150: N=A +582 IF A <= 0 THEN PRINT N: GOTO 499 +584 POKE P,0: P=P+1 +586 A=A-1: GOTO 582 +699 REM +700 REM *RUN 700* WRITE MEM TO PRG FILE +701 REM +702 FA = PEEK(186) :REM CURRENT DEVICE +703 PRINT "DRIVE ["; FA; "]"; +704 D=0: INPUT D: IF D=0 THEN D=FA +705 INPUT "FILE"; F$ +706 INPUT "START"; A$: GOSUB 130: P=A +707 INPUT "STOP"; A$: GOSUB 830: Q=A +708 PRINT "LOAD ["; P; "]"; +709 A$="": INPUT A$: GOSUB 130: L=A +710 IF L=0 THEN L=P +713 OPEN 1,D,2,"@:" + F$ + ",PRG,W" +714 H = INT(L / 256): L = L - H*256 +715 PRINT# 1, CHR$(L); CHR$(H); +716 IF P >= Q THEN CLOSE 1: END +717 PRINT# 1, CHR$(PEEK(P)); +718 P=P+1: GOTO 716 +719 REM +720 REM *RUN 720* PRINT SEQ FILE +721 REM +722 INPUT "DRIVE"; D +723 IF D=0 THEN D = PEEK(186) +724 INPUT "FILE"; F$ +728 OPEN 1,D,2,F$ + ",SEQ,R" +729 IF ST THEN CLOSE 1: END +732 GET# 1, A$: PRINT A$;: GOTO 729 +800 REM *RUN 800* HEXDUMP MEMORY +801 REM +802 INPUT "START"; A$: GOSUB 130: P=A +803 INPUT "STOP "; A$: GOSUB 830: Q=A +804 IF P >= Q THEN PRINT: END +805 X=P: IF X > 32767 THEN X=X-65536 +806 IF X AND 7 THEN 809 +807 PRINT " "; S$: S$ = "" +808 PRINT MID$(STR$(P),2); TAB(5) +809 X = PEEK(P): C$ = CHR$(X) +810 IF X < 32 OR X > 93 THEN C$ = " " +811 S$ = S$ + C$ +812 H = INT(X/16): L = X AND 15 +813 IF H=0 THEN H=32: GOTO 815 +814 H = 48+H: IF H > 57 THEN H = H+7 +815 L = 48+L: IF L > 57 THEN L = L+7 +816 PRINT " "; CHR$(H); CHR$(L); +817 P=P+1: GOTO 804 +828 REM +829 REM SUB: PARSE NUM OR OFFSET (+N) +830 IF LEFT$(A$,1) <> "+" THEN 130 +831 A = A + VAL(MID$(A$,2)) +832 RETURN +899 REM +901 REM - OPCODE TABLE - +902 REM +910 DATA 6, ASLZ, 2, 10, ASLA, 1 +911 DATA 14, ASL, 3, 22, ASLZX,2 +912 DATA 30, ASLX, 3, 33, AND(X,2 +913 DATA 37, ANDZ, 2, 41, AND#, 2 +914 DATA 45, AND, 3, 49, AND(Y,2 +915 DATA 53, ANDZX,2, 61, ANDX, 3 +916 DATA 97, ADC(X,2, 101,ADCZ, 2 +917 DATA 105,ADC#, 2, 109,ADC, 3 +918 DATA 113,ADC(Y,2, 117,ADCZX,2 +919 DATA 121,ADCY, 3, 125,ADCX, 3 +920 DATA 57, ANDY, 3 +921 DATA 0, BRK, 1, 16, BPLR, 2 +922 DATA 36, BITZ, 2, 44, BIT, 3 +923 DATA 48, BMIR, 2, 80, BVCR, 2 +924 DATA 112,BVSR, 2, 144,BCCR, 2 +925 DATA 176,BCSR, 2, 208,BNER, 2 +926 DATA 240,BEQR, 2 +927 DATA 24, CLC, 1, 88, CLI, 1 +928 DATA 184,CLV, 1, 192,CPY#, 2 +929 DATA 193,CMP(X,2, 196,CPYZ, 2 +930 DATA 197,CMPZ, 2, 201,CMP#, 2 +931 DATA 204,CPY, 3, 205,CMP, 3 +932 DATA 209,CMP(Y,2, 213,CMPZX,2 +933 DATA 216,CLD, 1, 217,CMPY, 3 +934 DATA 221,CMPX, 3, 224,CPX#, 2 +935 DATA 228,CPXZ, 2, 236,CPX, 3 +936 DATA 136,DEY, 1, 198,DECZ, 2 +937 DATA 202,DEX, 1, 206,DEC, 3 +938 DATA 214,DECZX,2, 222,DECX, 3 +939 DATA 65, EOR(X,2, 69, EORZ, 2 +940 DATA 73, EOR#, 2, 77, EOR, 3 +941 DATA 81, EOR(Y,2, 85, EORZX,2 +942 DATA 89, EORY, 3, 93, EORX, 3 +943 DATA 200,INY, 1, 230,INCZ, 2 +944 DATA 232,INX, 1, 238,INC, 3 +945 DATA 246,INCZX,2, 254,INCX, 3 +946 DATA 32, JSR, 3, 76, JMP, 3 +947 DATA 108,JMP(, 3 +948 DATA 70, LSRZ, 2, 74, LSRA, 1 +949 DATA 78, LSR, 3, 86, LSRZX,2 +950 DATA 94, LSRX, 3, 160,LDY#, 2 +951 DATA 161,LDA(X,2, 162,LDX#, 2 +952 DATA 164,LDYZ, 2, 165,LDAZ, 2 +953 DATA 166,LDXZ, 2, 169,LDA#, 2 +954 DATA 172,LDY, 3, 173,LDA, 3 +955 DATA 174,LDX, 3, 177,LDA(Y,2 +956 DATA 180,LDYZX,2, 181,LDAZX,2 +957 DATA 182,LDXZY,2, 185,LDAY, 3 +958 DATA 188,LDYX, 3, 189,LDAX, 3 +959 DATA 190,LDXY, 3 +960 DATA 234,NOP, 1 +961 DATA 1, ORA(X,2, 5, ORAZ, 2 +962 DATA 9, ORA#, 2, 13, ORA, 3 +963 DATA 17, ORA(Y,2, 21, ORAZX,2 +964 DATA 25, ORAY, 3, 29, ORAX, 3 +965 DATA 8, PHP, 1, 40, PLP, 1 +966 DATA 72, PHA, 1, 104,PLA, 1 +967 DATA 38, ROLZ, 2, 42, ROLA, 1 +968 DATA 46, ROL, 3, 62, ROLX, 3 +969 DATA 64, RTI, 1, 96, RTS, 1 +970 DATA 102,RORZ, 2, 106,ROLA, 1 +971 DATA 110,ROR, 3, 118,RORZX,2 +972 DATA 126,RORX, 3, 54, ROLZX,2 +973 DATA 120,SEI, 1, 133,STAZ, 2 +974 DATA 134,STXZ, 2, 140,STY, 3 +975 DATA 141,STA, 3, 142,STX, 3 +976 DATA 145,STA(Y,2, 148,STYZX,2 +977 DATA 149,STAZX,2, 150,STXZY,2 +978 DATA 153,STAY, 3, 157,STAX, 3 +979 DATA 225,SBC(X,2, 229,SBCZ, 2 +980 DATA 233,SBC#, 2, 237,SBC, 3 +981 DATA 241,SBC(Y,2, 245,SBCZX,2 +982 DATA 248,SED, 1, 249,SBCY, 3 +983 DATA 253,SBCX, 3, 56, SEC, 1 +984 DATA 129,STA(X,2, 132,STYZ, 2 +985 DATA 138,TXA, 1, 152,TYA, 1 +986 DATA 154,TXS, 1, 168,TAY, 1 +987 DATA 170,TAX, 1, 186,TSX, 1 +990 DATA -1 +991 REM +992 REM = APPEND PROGRAM CODE BELOW = +999 REM +1000 REM +1001 REM LINECNT +1002 REM COUNT THE NUMBER OF LINES IN A +1003 REM BASIC PRG FILE. +1004 REM PESCO 2026 +1005 REM +1010 REM 1000 TOP OF FILE COMMENT +1020 REM 1500 SYMBOL DEFINITIONS +1030 REM 2000 LINECNT +1040 REM 3000 SUBROUTINES +1050 REM 5000 LINECUT +1090 REM 9000 VARIABLES & STATIC DATA +1099 REM +1500 REM +1501 REM - SYMBOL DEFINITIONS - +1502 REM +2000 DATA 'LINECNT +2001 DATA LDXZ, 43: REM TXTTAB +2002 DATA LDYZ, 44 +2003 DATA STXZ, 251 +2004 DATA STYZ, 252 +2005 DATA LDA#, 0 +2006 DATA STA, CNT +2007 DATA STA, $C401: REM XXX CNT+ +2008 DATA STA, CNT.REM +2009 DATA STA, $C403: REM XXX + +2010 DATA STA, CNT.DATA +2011 DATA STA, $C405: REM XXX + +2012 DATA STA, CNT.JUNK +2013 DATA STA, $C407: REM XXX + +2014 DATA STA, CNT.SPC +2015 DATA STA, $C409: REM XXX + +2020 DATA 'LOOP +2021 DATA LDA#, 1 +2022 DATA TAY +2023 DATA LDA(Y, 251 +2024 DATA BNER, NOTDONE +2025 REM COUNT THE TERMINATING NULL PTR +2026 DATA CLC +2027 DATA LDA, CNT.JUNK +2028 DATA ADC#, 2 +2029 DATA STA, CNT.JUNK +2030 DATA LDA, $C407: REM XXX + +2031 DATA ADC#, 0 +2032 DATA STA, $C407 +2034 DATA JMP, DONE: REM FAR BRANCH +2035 DATA 'NOTDONE +2040 DATA INC, CNT +2050 DATA BNER, LC0 +2060 DATA INC, $C401: REM XXX CNT+ +2070 DATA 'LC0 +2080 REM COUNT DIFFERENT TYPES OF LINE +2090 REM 1. SKIP SPACES (UNNECESSARY!?) +2100 DATA LDA#, 3: REM FIRST CHR-1 +2101 DATA TAY +2105 DATA 'LC1 +2107 DATA INY: REM NEXT CHAR +2110 DATA LDA(Y, 251: REM LOAD CHAR +2120 DATA BEQR, NEXT: REM END OF LINE +2130 DATA CMP#, $20: REM SPACE +2140 DATA BNER, LC1.1:REM EXIT LOOP +2141 DATA INC, CNT.SPC +2142 DATA BNER, LC1: REM NO OVERFLOW +2143 DATA INC, $C409: REM XXX + +2148 DATA JMP, LC1: REM REPEAT +2149 DATA 'LC1.1 +2150 REM 2. CHECK TOKEN +2160 DATA CMP#, $8F: REM REM-TOKEN +2170 DATA BNER, LC2 +2180 DATA INC, CNT.REM +2181 DATA BNER, LC3 +2182 DATA INC, $C403: REM XXX + +2183 DATA JMP, LC3 +2190 DATA 'LC2 +2200 DATA CMP#, $83: REM DATA-TOKEN +2210 DATA BNER, LC3 +2220 DATA INC, CNT.DATA +2221 DATA BNER, LC3 +2222 DATA INC, $C405: REM XXX + +2223 DATA JMP, LC3 +2229 REM 3. SCAN REST OF LINE +2230 DATA 'LC3 +2231 DATA INY: REM NEXT CHAR +2232 DATA LDA(Y, 251: REM LOAD CHAR +2233 DATA BEQR, NEXT: REM END OF LINE +2235 DATA CMP#, $20: REM SPACE +2240 DATA BNER, LC3.1 +2241 DATA INC, CNT.SPC +2242 DATA BNER, LC3 +2243 DATA INC, $C409: REM XXX + +2248 DATA JMP, LC3 +2250 DATA 'LC3.1 +2251 DATA CMP#, $22: REM QUOTE (") +2252 DATA BNER, LC3 +2260 DATA 'LC3.2: REM SKIP STRING +2261 DATA INY +2262 DATA LDA(Y, 251: REM LOAD NXT CHR +2263 DATA BEQR, NEXT: REM END OF LINE +2265 DATA CMP#, $22 +2266 DATA BEQR, LC3: REM QUOTE CLOSED +2267 DATA JMP, LC3.2 +2400 DATA 'NEXT +2401 REM ACCUM. LINE LEN IN JUNK CTR +2410 DATA INY: REM COUNT ZERO +2411 DATA TYA +2412 DATA CLC +2413 DATA ADC, CNT.JUNK +2414 DATA STA, CNT.JUNK +2415 DATA LDA#, 0 +2416 DATA ADC, $C407: REM XXX + +2417 DATA STA, $C407 +2420 REM ADVANCE (DEREF) LINE PTR +2421 DATA LDA#, 0 +2422 DATA TAY +2423 DATA LDA(Y, 251 +2425 DATA TAX +2426 DATA INY +2427 DATA LDA(Y, 251 +2428 DATA TAY +2430 DATA STXZ, 251 +2431 DATA STYZ, 252 +2490 DATA JMP, LOOP +2500 DATA 'DONE +2501 REM PUSH 251 PAST THE END +2502 DATA CLC +2503 DATA LDAZ, 251 +2504 DATA ADC#, 2 +2505 DATA STAZ, 251 +2506 DATA BCCR, DONE.1 +2507 DATA INCZ, 252 +2508 DATA 'DONE.1 +2509 REM CALCULATE TOTAL BYTES +2510 DATA SEC +2511 DATA LDAZ, 251 +2512 DATA SBCZ, 43 +2513 DATA STA, CNT.BS +2514 DATA LDAZ, 252 +2515 DATA SBCZ, 44 +2516 DATA STA, $C40B: REM XXX + +2520 REM CALCULATE JUNK = BS - "JUNK" +2525 SEC +2527 DATA LDA, CNT.BS +2530 DATA SBC, CNT.JUNK +2535 DATA STA, CNT.JUNK +2540 DATA LDA, $C40B: REM XXX BS+ +2550 DATA SBC, $C407: REM XXX JUNK+ +2560 DATA STA, $C407 +2600 REM PRINT COUNTERS AND EXIT +2620 DATA LDX, CNT +2630 DATA LDY, $C401: REM XXX CNT+ +2640 DATA JSR, PRINTNAT +2650 DATA LDX#, S.LINES +2651 DATA LDY#, $C5: REM XXX HI +2652 DATA JSR, PUTSTR +2660 DATA LDX, CNT.REM +2661 DATA LDY, $C403: REM XXX + +2662 DATA JSR, PRINTNAT +2670 DATA LDX#, S.REM +2671 DATA LDY#, $C5: REM XXX HI +2672 DATA JSR, PUTSTR +2680 DATA LDX, CNT.DATA +2681 DATA LDY, $C405: REM XXX + +2682 DATA JSR, PRINTNAT +2690 DATA LDX#, S.DATA +2691 DATA LDY#, $C5: REM XXX HI +2692 DATA JSR, PUTSTR +2695 DATA LDA#, 13: REM CR +2696 DATA JSR, $FFD2: REM CHROUT +2700 DATA LDX, CNT.BS +2701 DATA LDY, $C40B: REM XXX + +2702 DATA JSR, PRINTNAT +2710 DATA LDX#, S.BYTES +2711 DATA LDY#, $C5: REM XXX HI +2712 DATA JSR, PUTSTR +2720 DATA LDX, CNT.SPC +2721 DATA LDY, $C409: REM XXX + +2722 DATA JSR, PRINTNAT +2725 DATA LDX#, S.SPC +2726 DATA LDY#, $C5: REM XXX HI +2727 DATA JSR, PUTSTR +2730 DATA LDX, CNT.JUNK +2731 DATA LDY, $C407: REM XXX + +2732 DATA JSR, PRINTNAT +2735 DATA LDX#, S.JUNK +2736 DATA LDY#, $C5: REM XXX HI +2737 DATA JSR, PUTSTR +2990 DATA LDA#, 13: REM CR +2991 DATA JMP, $FFD2: REM XXX CHROUT +3000 REM +3001 REM - SUBROUTINES - +3002 REM +3010 REM 3100 PUTSTR +3020 REM 3200 QUOTREM +3030 REM 3400 PRINTNAT +3040 REM 3600 GETSTR +3099 REM +3100 DATA 'PUTSTR +3105 DATA STXZ, 251: REM USER Z/P AREA +3106 DATA STYZ, 252 +3110 DATA LDY#, 0 +3120 DATA 'PS1 +3130 DATA LDA(Y, 251 +3135 DATA BEQR, PS2 +3140 DATA JSR, $FFD2: REM CHROUT +3150 DATA INY +3160 DATA JMP, PS1 +3170 DATA 'PS2 +3180 DATA RTS +3199 REM +3200 DATA 'QUOTREM +3201 REM +3202 REM X.Y DIVIDEND (X LO, Y HI) +3203 REM 251.252 DIVISOR +3204 REM A RESULT: QUOTIENT +3205 REM X.Y RESULT: REMAINDER +3206 REM +3207 REM CLOBBERS 253 AND C +3208 REM +3209 REM +3210 DATA LDA#, 0 +3211 DATA STAZ, 253 +3220 DATA 'QR1 +3225 DATA SEC +3230 DATA TXA +3240 DATA SBCZ, 251 +3245 DATA TAX +3250 DATA TYA +3260 DATA SBCZ, 252 +3265 DATA TAY +3270 DATA BCCR, QR2 +3280 DATA INCZ, 253 +3290 DATA JMP, QR1 +3300 DATA 'QR2 +3310 DATA TXA +3312 DATA ADCZ, 251 +3314 DATA TAX +3316 DATA TYA +3318 DATA ADCZ, 252 +3320 DATA TAY +3322 DATA LDAZ, 253 +3323 DATA CLC +3324 DATA RTS +3390 REM +3400 DATA 'PRINTNAT +3410 DATA LDA#, 16: REM 10000... +3411 DATA STAZ, 251 +3412 DATA LDA#, 39 +3413 DATA STAZ, 252 +3420 DATA JSR, QUOTREM +3430 DATA ADC#, $30: REM "0" +3440 DATA JSR, $FFD2: REM CHROUT +3450 DATA LDA#, 232: REM 1000... +3451 DATA STAZ, 251 +3452 DATA LDA#, 3 +3453 DATA STAZ, 252 +3460 DATA JSR, QUOTREM +3470 DATA ADC#, $30 +3480 DATA JSR, $FFD2 +3490 DATA LDA#, 100: REM 100... +3491 DATA STAZ, 251 +3492 DATA LDA#, 0 +3493 DATA STAZ, 252 +3500 DATA JSR, QUOTREM +3510 DATA ADC#, $30 +3520 DATA JSR, $FFD2 +3530 DATA LDA#, 10: REM 10... +3531 DATA STAZ, 251 +3532 DATA LDA#, 0 +3533 DATA STAZ, 252 +3540 DATA JSR, QUOTREM +3550 DATA ADC#, $30 +3551 DATA JSR, $FFD2 +3560 DATA TXA: REM 1... +3570 DATA ADC#, $30 +3571 DATA JSR, $FFD2 +3580 DATA RTS +3599 REM +3600 DATA 'GETSTR +3610 DATA STXZ, 251 +3611 DATA STYZ, 252 +3620 DATA LDY#, 0 +3625 DATA STYZ, 204: REM CURSOR ON +3630 DATA 'GS1 +3635 DATA STYZ, 215: REM SAVE Y +3640 DATA JSR, $FFE4: REM GETIN +3641 DATA BEQR, GS1 +3645 DATA LDYZ, 215: REM RESTORE Y +3650 DATA CMP#, 13: REM CR +3651 DATA BEQR, GS3 +3660 DATA CMP#, 20: REM DEL +3661 DATA BNER, GS2 +3670 DATA TYA +3671 DATA BEQR, GS1 +3672 DATA DEY +3673 DATA LDA#, 20 +3674 DATA JSR, $FFD2: REM CHROUT +3675 DATA JMP, GS1 +3680 DATA 'GS2 +3681 DATA CMP#, 32: REM SPC +3682 DATA BMIR, GS1 +3683 DATA CMP#, 126: REM "{pi}" +3684 DATA BPLR, GS1 +3690 DATA STA(Y, 251 +3691 DATA INY +3695 DATA JSR, $FFD2 +3696 DATA JMP, GS1 +3700 DATA 'GS3 +3710 DATA LDA#, 0 +3720 DATA STA(Y, 251 +3725 DATA LDA#, 1 +3726 DATA STAZ, 204: REM CURSOR OFF +3727 DATA LDA#, 13 +3728 DATA JSR, $FFD2 +3730 DATA RTS +4999 REM +5000 DATA 'LINECUT +5001 DATA LDX#, BUF +5002 DATA LDY#, $C7: REM XXX HI +5010 DATA JSR, GETSTR +5020 DATA LDA#, 13 +5030 DATA JSR, $FFD2 +5035 DATA LDX#, BUF +5036 DATA LDY#, $C7: REM XXX HI +5040 DATA JSR, PUTSTR +5050 DATA RTS +8000 REM +8001 REM - ENTRY POINTS - +8002 REM +8010 DATA .=, 50000: REM $C350 +8011 DATA JMP, LINECNT +8020 DATA .=, 50010 +8021 DATA JMP, LINECUT +9000 REM +9001 REM - STATIC DATA - +9002 REM +9009 DATA .=, $C400 +9010 DATA 'CNT, .DW,0 +9020 DATA 'CNT.REM, .DW,0 +9030 DATA 'CNT.DATA, .DW,0 +9040 DATA 'CNT.JUNK, .DW,0 +9050 DATA 'CNT.SPC, .DW,0 +9060 DATA 'CNT.BS, .DW,0 +9099 DATA .=, $C500 +9100 DATA 'S.REM, .DSZ," REM " +9110 DATA 'S.DATA, .DSZ," DATA " +9120 DATA 'S.LINES, .DSZ," LINES " +9130 DATA 'S.BYTES, .DSZ," BYTES " +9140 DATA 'S.JUNK, .DSZ," JUNK " +9150 DATA 'S.SPC, .DSZ," SPC " +9200 DATA .=, $C700 +9210 DATA 'BUF, .DZ,256 +9999 DATA .END blob - 904998502b3354c9b673cdac2b183b8dfd25bd47 blob + 6da086616df28a68bfcbb7c19dd1eecc25c1b9e2 --- Makefile +++ Makefile @@ -1,4 +1,5 @@ -PRGS = BASASM HDFILE HEXDUMP SAVEMEM PRINTNAT.B LINECNT.B MANUAL OPCODES +PRGS = BASASM HDFILE HEXDUMP SAVEMEM PRINTNAT.B LINECNT.B MANUAL OPCODES \ + LINEUTIL.B .PHONY: all all: und64 listprg ${PRGS:=.lst}