Commit Diff


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}