commit - 0982cd66f13b9cc48ee39a7a9b9d85ba2f89fff3
commit + 9ce371ae8369fd306269715db1e1f3ec4be173a1
blob - 0582af1299d200394ba97d8124090255815ff757
blob + 59860f67c0fa822ee22f2e558c3b8cfbd41e7fa5
--- Makefile
+++ Makefile
-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
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 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 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