commit 9ce371ae8369fd306269715db1e1f3ec4be173a1 from: Sven M. Hallberg date: Sun May 31 17:23:50 2026 UTC PRINTNAT, LINECNT commit - 0982cd66f13b9cc48ee39a7a9b9d85ba2f89fff3 commit + 9ce371ae8369fd306269715db1e1f3ec4be173a1 blob - 0582af1299d200394ba97d8124090255815ff757 blob + 59860f67c0fa822ee22f2e558c3b8cfbd41e7fa5 --- Makefile +++ Makefile @@ -1,4 +1,4 @@ -PRGS = BASASM HDFILE HEXDUMP SAVEMEM +PRGS = BASASM HDFILE HEXDUMP SAVEMEM PRINTNAT.B LINECNT.B all: und64 listprg ${PRGS:=.lst} blob - /dev/null blob + 12217175df0bfb559e649195a131fbf74416ca07 (mode 644) Binary files /dev/null and LINECNT.B,PRG differ blob - ad5892caf9f0f33c8ee5bf02b10e9a953edc2993 blob + 77fe098fef382c0feb258ac3db516ff963c4ab7f --- README +++ README @@ -51,23 +51,23 @@ reading. Note that several characters in the Commodore character set appear different from ASCII. Notable examples: - ASCII Commodore "PETSCII" - ----- ------------------- - ^ up arrow - _ left arrow - ~ pi - \ pound (currency) sign + ASCII Commodore "PETSCII" + ----- ------------------- + ^ up arrow + _ left arrow + ~ pi + \ pound (currency) sign Finally, included here are a few programs that were produced "along the way" during development: - HEXDUMP dump memory (stand-alone version) - HDFILE hexdump raw contents of a file - SAVEMEM save memory to PRG file (stand-alone version) - TEST.BA nonsense program, test input for BASASM - PRINTNAT first assembly program: print a number - LINECNT first line utility: count BASIC program lines - TV text viewer, used in MANUAL - MKALLTOK write a PRG file that contains every possible BASIC - token (used for listprg) + HEXDUMP dump memory (stand-alone version) + HDFILE hexdump raw contents of a file + SAVEMEM save memory to PRG file (stand-alone version) + TEST.B nonsense program, test input for BASASM + PRINTNAT.B first assembly program: print a number + LINECNT.B first line utility: count BASIC program lines + TV text viewer, used in MANUAL + MKALLTOK write a PRG file that contains every possible BASIC + token (used for listprg) blob - /dev/null blob + 3ad331729337833f6f2edba89ac62f102c4efcc7 (mode 644) --- /dev/null +++ LINECNT.B.lst @@ -0,0 +1,633 @@ +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 MAIN ENTRY POINT +1040 REM 3000 SUBROUTINES +1090 REM 9000 VARIABLES & STATIC DATA +1099 REM +1500 REM +1501 REM - SYMBOL DEFINITIONS - +1502 REM +2000 DATA 'START +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 +3099 REM +3100 DATA 'PUTSTR +3105 DATA STXZ, 251: REM USER Z/P AREA +3106 DATA STYZ, 252 +3110 DATA LDY#, 0 +3120 DATA 'L1 +3130 DATA LDA(Y, 251 +3135 DATA BEQR, L2 +3140 DATA JSR, $FFD2: REM CHROUT +3150 DATA INY +3160 DATA JMP, L1 +3170 DATA 'L2 +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 +8000 OPEN 1,9,15 +8010 INPUT# 1,A$,B$,C$,D$ +8020 PRINT A; B$; C; D +8030 CLOSE 1 +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 " +9999 DATA .END blob - /dev/null blob + 41b589b7d8c49839d7101ab93e6f1eae2ef12b32 (mode 644) Binary files /dev/null and PRINTNAT.B,PRG differ blob - /dev/null blob + 98641926f601130338acae40b7f42881ccafc162 (mode 644) --- /dev/null +++ PRINTNAT.B.lst @@ -0,0 +1,429 @@ +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 A$ = "R" THEN A = A - P - 2 +191 FOR J = 1 TO L% +192 R=A: A=INT(A/256): R=R-A*256 :REM/Q +193 POKE P + J, R +194 PRINT MID$(STR$(R), 2); "CLOSE"; +195 NEXT +196 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 POKE P, C +275 PRINT P; C; TAB(13); M$; " "; +276 IF L% < 1 THEN 295 +278 REM OUTPUT OPERAND +279 READ A$: GOSUB 150 :REM PARSE -> A +280 A$ = MID$(M$, 4) :REM ADDRESS MODE +282 IF A% = 0 THEN 290 +284 GOSUB 390 :REM RECORD PATCH +285 A = 0 :REM DUMMY VALUE +286 IF A$ = "R" THEN A = P :REM -> 0 +290 GOSUB 190 :REM WRITE OPERAND +295 P = P + 1 + L% +296 PRINT: GOTO 210 +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): A$ = 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%) = A$ +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 READ A$: GOSUB 150 +532 IF A < 0 THEN A = A + 256 +534 PRINT A +535 IF A < 0 OR A > 255 THEN 545 +540 POKE P, A: P = P + 1 +541 GOTO 499 +545 PRINT "OPERAND OUT OF RANGE": END +548 REM +549 REM .DW - OUTPUT 2-BYTE WORD +550 READ A$: GOSUB 150 +552 IF A < 0 THEN A = A + 65536 +555 IF A < 0 OR A > 65536 THEN 545 +560 HI = INT(A/256): LO = A - HI*256 +562 PRINT STR$(LO); HI +565 POKE P,LO: POKE P+1,HI: P = P + 2 +566 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 DATA 'START +1001 DATA JSR, HALLO +1002 DATA LDY#, $C0, LDX#, 23 +1004 DATA JSR, PRINTNAT +1006 DATA RTS +1009 DATA 'HALLO +1010 DATA LDY#, $C0: REM HIG BYTE XXX +1020 DATA LDX#, STR: REM LOW BYTE +1030 DATA JSR, PRINTSTR +1040 DATA RTS +1499 REM +1500 DATA 'PRINTSTR +1505 DATA STXZ, 251: REM USER Z/P AREA +1506 DATA STYZ, 252 +1510 DATA LDY#, 0 +1520 DATA 'L1 +1530 DATA LDA(Y, 251 +1535 DATA BEQR, L2 +1540 DATA JSR, $FFD2: REM CHROUT +1550 DATA INY +1560 DATA JMP, L1 +1570 DATA 'L2 +1580 DATA RTS +1599 REM +1600 DATA 'QUOTREM +1610 DATA LDA#, 0 +1611 DATA STAZ, 253 +1620 DATA 'QR1 +1625 DATA SEC +1630 DATA TXA +1640 DATA SBCZ, 251 +1645 DATA TAX +1650 DATA TYA +1660 DATA SBCZ, 252 +1665 DATA TAY +1670 DATA BCCR, QR2 +1680 DATA INCZ, 253 +1690 DATA JMP, QR1 +1700 DATA 'QR2 +1710 DATA TXA +1712 DATA ADCZ, 251 +1714 DATA TAX +1716 DATA TYA +1718 DATA ADCZ, 252 +1720 DATA TAY +1722 DATA LDAZ, 253 +1723 DATA CLC +1724 DATA RTS +1799 REM +1800 DATA 'PRINTNAT +1810 DATA LDA#, 16: REM 10000... +1811 DATA STAZ, 251 +1812 DATA LDA#, 39 +1813 DATA STAZ, 252 +1820 DATA JSR, QUOTREM +1830 DATA ADC#, $30: REM "0" +1840 DATA JSR, $FFD2: REM CHROUT +1850 DATA LDA#, 232: REM 1000... +1851 DATA STAZ, 251 +1852 DATA LDA#, 3 +1853 DATA STAZ, 252 +1860 DATA JSR, QUOTREM +1870 DATA ADC#, $30 +1880 DATA JSR, $FFD2 +1890 DATA LDA#, 100: REM 100... +1891 DATA STAZ, 251 +1892 DATA LDA#, 0 +1893 DATA STAZ, 252 +1900 DATA JSR, QUOTREM +1910 DATA ADC#, $30 +1920 DATA JSR, $FFD2 +1930 DATA LDA#, 10: REM 10... +1931 DATA STAZ, 251 +1932 DATA LDA#, 0 +1933 DATA STAZ, 252 +1940 DATA JSR, QUOTREM +1950 DATA ADC#, $30 +1951 DATA JSR, $FFD2 +1960 DATA TXA: REM 1... +1970 DATA ADC#, $30 +1971 DATA JSR, $FFD2 +1980 DATA RTS +1999 REM +2000 DATA 'STR, .DSZ, HALLO WELT! +9999 DATA .END