10 0000 ;VERSION OF OHIO SCIENTIFIC 6500 ASSEMBLER/EDITOR 20 0000 ;WITH MODIFICATION TO REDUCE MEMORY USAGE, BUT 30 0000 ;WITH P-CODE INTERPRETER WRITTEN IN 6502 CODE. 40 0000 ; 50 0000 ;UK101 MONITOR SUBROUTINES USED BY ASSEMBLER: 60 0000 CIN = $FFEB ;GET CHARACTER FROM KEYBOARD 70 0000 COUT = $FFEE ;PRINT CHARACTER 80 0000 LOAD = $FFF4 ;SET LOAD FLAG 90 0000 SAVE = $FFF7 ;SET SAVE FLAG 100 0000 ; 110 0000 ;VARIABLES IN ZERO PAGE ;16 BITS 120 0000 ;UNLESS STATE OTHERWISE 130 0000 ;"*" INDICATES THAT LABEL UPDATED IN PROG BODY 140 0000 LABTBL = $0A ;START OF LABEL TABLE 150 0000 TXTPOS = $10 ;CURRENT POSITION IN TEXT 160 0000 LINLEN = $12 ;LENGTH OF CURRENT SOURCE LINE 170 0000 LINENO = $14 ;LINE NUMBER DURING ASSEMBLY 180 0000 STTEXT = $16 ;START OF TEXT MEMORY 190 0000 ENDMEM = $18 ;END OF AVAILABLE MEMORY 200 0000 ENDTXT = $1A ;END OF SOURCE TEXT 210 0000 ;DRTYPE USED FOR OTHER FUNCTIONS THAN DIRECTIVES 220 0000 DRTYPE = $1E ;(8 BITS) 0=.END, 1=.BYT, 2=.WOR, 3= 230 0000 IP = $24 ;INTERPRETIVE POINTER FOR P-CODE 240 0000 INSLEN = $2A ;PCODE INSTR LEN (8-BIT) 250 0000 CONST0 = $2C ;PERMANENTLY SET TO ZERO 260 0000 CNST14 = $38 ;PREMANENTLY SET TO $0014 270 0000 CNST10 = $3C ;PERMANENTLY SET TO 10 280 0000 ASMBRK = $3E ;SET TO 1 IF ASM ADDR CHANGES 290 0000 PASS = $40 ;ASSEMBLY PASS (1 OR 2) 300 0000 CONST1 = $42 ;PERMANENTLY SET TO 1 310 0000 ASMADR = $44 ;ASSEMBLY ADDRESS 320 0000 ASMOPT = $48 ;ASSEMBLY OPTION (0, 1, 2 OR 3) 330 0000 CONST3 = $4A ;PERMANENTLY SET TO 3 340 0000 INSTLN = $4C ;NUMBER OF BYTES IN CURRENT INSTRUCT 350 0000 NOPBYT = $4E ;PERMANENTLY SET TO $EAEA 360 0000 INSTRN = $50 ;CURRENT INSTRUCTION (3 BYTES) 370 0000 CNST80 = $58 ;PERMANENTLY SET TO $80 380 0000 BUFADR = $68 ;START ADDR OF CODE IN A2 BUFFER 390 0000 NUMVAL = $6A ;NUMERIC VALUE FROM EXPRESSION 400 0000 LABL40 = $6C ;LABEL IN BASE-40 (4 BYTES) 410 0000 ASMOFS = $70 ;OFFSET FOR ASSEMBLY TO MEMORY 420 0000 CNST50 = $72 ;PERMANENTLY SET TO $0050 430 0000 CONST2 = $74 ;PERMANENTLY SET TO 2 440 0000 CNST12 = $76 ;PERMANENTLY SET TO 12 450 0000 CNST7E = $78 ;PERMANENTLY SET TO $007E 460 0000 CNST6C = $7A ;PERMANENTLY SET TO $006C 470 0000 LABVAL = $7E ;VALUE OF LABEL 480 0000 A2BUFF = $B8 ;18 BYTES BUFFER FOR A2 (TO $CF) 490 0000 A2BLEN = $D1 ;LENGTH OF BUFFER FOR A2 500 0000 CHKSUM = $D2 ;CHECKSUM FOR A2 OPTION 510 0000 CNST44 = $D4 ;PERMANENTLY SET TO $0044 520 0000 NUMERR = $E2 ;NUMBER OF CURRENT ERRORS 530 0000 TMPLOC = $E6 ;TEMPORARY STORAGE 540 0000 CONST4 = $EA ;PERMANENTLY SET TO 4 550 0000 PRFLAG = $F0 ;IF 1, SOURCE LINE WAS PRINTED 560 0000 CONST5 = $F2 ;PERMANENTLY SET TO 5 570 0000 CONST6 = $F4 ;PERMANENTLY SET TO 6 580 0000 ERRMSG = $F6 ;CURRENT ERRORS (4 BYTES) 590 0000 CALADR = $FA ;ADDRESS OF CALLING INSTR 600 0000 ; 610 0000 ;DEFINITIONS OF P-CODE MNEMONICS 620 0000 NXLN = $00 ;USED BY LINE EDITOR 630 0000 BMOV = $01 ;XX=LEN, YY=SRC, ZZ=DST 640 0000 LIN1 = $02 ;USED BY LINE EDITOR 650 0000 CLAS = $03 ;CLASSIFY CHARACTER 660 0000 LRAN = $04 ;DECODE LINE NUMBER RANGE 670 0000 SKIP = $05 ;SKIP SPACES 680 0000 LVAL = $06 ;LOOK UP LABEL AS LVALUE 690 0000 LEXP = $07 ;LOOK UP LABEL IN EXPRESSION 700 0000 OUTP = $08 ;OUTPUT ASSEMBLER INSTRUCTION 710 0000 EXPR = $09 ;EVALUATE EXPRESSION 720 0000 RLBL = $0A ;READ LABEL 730 0000 BRGR = $2B ;BRANCH IF XX>YY 740 0000 BEQU = $4B ;BRANCH IF XX=YY 750 0000 BGEQ = $6B ;BRANCH IF XX>=YY 760 0000 BLES = $8B ;BRANCH IF XXYY 780 0000 BLEQ = $CB ;BRANCH IF XX<=YY 790 0000 COMP = $0C ;COMPRESS SOURCE CODE 800 0000 KBLN = $0D ;READ LINE FROM KEYBOARD 810 0000 RET4 = $0E ;RETURN USING OFFSET IN 4TH BYTE 820 0000 SET0 = $0F ;SET XX TO 0 830 0000 DCIN = $10 ;INPUT DECIMAL NUMBER 840 0000 RETN = $11 ;RETURN FROM P-CODE SUBROUTINE 850 0000 RET2 = $12 ;RETURN USING OFFSET IN 2ND BYTE 860 0000 INCR = $13 ;INCREMENT XX 870 0000 DECR = $14 ;DECREMENT XX 880 0000 EX65 = $15 ;EXECUTE 6502 CODE 890 0000 COPY = $16 ;COPY XX TO YY 900 0000 PHEX = $17 ;PRINT XX AS HEX NUMBER 910 0000 RERR = $18 ;RECORD ERROR XX 920 0000 PDEC = $19 ;PRINT DECIMAL NUMBER IN XX 930 0000 PLIN = $1B ;PRINT LINE POINTED TO BY XX 940 0000 GERR = $1C ;GET ERROR CODE AND PUT IT IN XX 950 0000 PERR = $1D ;PRINT PTR TO ERROR PLUS MESSAGE 960 0000 MSLN = $1E ;PRINT NEW LINE PLUS MESSAGE 970 0000 PER6 = $1F ;AS FOR PERR BUT INCR $06 FIRST 980 0000 SUBZ = $20 ;SUBTRACT: ZZ = XX - YY 990 0000 ADDZ = $21 ;ADD: ZZ = XX + YY 1000 0000 MOVB = $22 ;MOVE BYTE IN (00) TO (XX) 1010 0000 DCMP = $23 ;DECOMP LINE AT (10); STORE IN (02) 1020 0000 MESG = $24 ;PRINT MESSAGE WITHOUT NEW LINE 1030 0000 RET3 = $25 ;RETURN USING OFFTSET IN 3RD BYTE 1040 0000 CHK0 = $65 ;CHECK CHAR WITH PTR AT 00/01 1050 0000 CHK6 = $10 ;CHECK CHAR WITH PTR AT 06/07 1060 0000 INC0 = $28 ;INCREMENT 00/01 1070 0000 SET1 = $29 ;SET XX TO 1 1080 0000 ; 1090 0000 ;CODES FOR USE WITH CHK0 OPCODE: 1100 0000 CAP = $80 1110 0000 DCM = $81 1120 0000 SPC = $82 1130 0000 ; 1140 0000 HIMEM = $1FFF ;TOP OF AVAILABLE MEMORY 1150 0000 ;MAIN ENTRY POINT FOR ASSEMBLER 1160 0240 *=$0240 ;START AT $0240 FOR UK101 1170 0240 ;INITIALISE STACK POINTER 1180 0240 A2FF LDX #$FF 1190 0242 9A TXS 1200 0243 ; 1210 0243 ;SET ALL OF ZERO PAGE TO 00 1220 0243 E8 INX ;X = 0 1230 0244 8A TXA ;A = 0 1240 0245 9500 INITZP STA $00,X 1250 0247 E8 INX 1260 0248 D0FB BNE INITZP 1270 024A ; 1280 024A ;INITIALISE LOCATIONS IN ZERO PAGE, USING 1290 024A ;ADDRESSES STARTING AT ZPADDR AND CONTENTS 1300 024A ;STARTING AT ZPCONT 1310 024A BC8D0F L1168 LDY ZPADDR,X 1320 024D BDB50F LDA ZPCONT,X 1330 0250 990000 STA $0000,Y 1340 0253 E8 INX 1350 0254 E028 CPX #ZPCONT-ZPADDR ;LENGTH OF TABLE 1360 0256 D0F2 BNE L1168 1370 0258 ; 1380 0258 ;MAIN P-CODE INSTRUCTION EXECUTION LOOP 1390 0258 A51A L1179 LDA ENDTXT ;UPDATE RECORD OF END OF TEXT 1400 025A 8DDB0F STA ENDIMG 1410 025D A51B LDA ENDTXT+1 1420 025F 8DDC0F STA ENDIMG+1 1430 0262 ;GET OPCODE - X IS OPCODE ACTUALLY EXECUTED 1440 0262 A000 LDY #$00 1450 0264 B124 LDA (IP),Y 1460 0266 A21A LDX #$1A 1470 0268 C9E8 CMP #$E8 1480 026A B016 BCS LDADDR 1490 026C A20B LDX #$0B 1500 026E 291F AND #$1F 1510 0270 C90B CMP #$0B 1520 0272 F00E BEQ LDADDR 1530 0274 B124 LDA (IP),Y 1540 0276 A226 LDX #$26 1550 0278 C972 CMP #$72 1560 027A B006 BCS LDADDR 1570 027C E8 INX 1580 027D C93A CMP #$3A 1590 027F B001 BCS LDADDR 1600 0281 AA TAX 1610 0282 ; 1620 0282 ;X NOW CONTAINS OPCODE TO EXECUTE, SO 1630 0282 ;SET TMPLOC/TMPLOC+1 TO OPCODE ROUTINE 1640 0282 BD6D07 LDADDR LDA ADDRLO,X 1650 0285 85E6 STA TMPLOC 1660 0287 BD9707 LDA ADDRHI,X 1670 028A 48 PHA 1680 028B 290F AND #%00001111 1690 028D 18 CLC 1700 028E 6902 ADC #OF6502/256 1710 0290 85E7 STA TMPLOC+1 1720 0292 ; 1730 0292 ;PUT LENGTH OF INSTRUCTION INTO INSLEN 1740 0292 68 PLA 1750 0293 4A LSR A 1760 0294 4A LSR A 1770 0295 4A LSR A 1780 0296 4A LSR A 1790 0297 852A STA INSLEN 1800 0299 ; 1810 0299 ;GO TO L11B7 IF OPCODE IS ITSELF WRITTEN IN 1820 0299 ;P-CODE (OPCODES 00,...,0A) 1830 0299 E00B CPX #$0B 1840 029B 9008 BCC L11B7 1850 029D C8 INY ;Y = 1 1860 029E B124 LDA (IP),Y ;A = 2ND BYTE OF INSTRUCTION 1870 02A0 A200 LDX #0 ;X = 0 1880 02A2 ;EXECUTE OPCODE ;A = 2ND BYTE OF INSTRUCTION 1890 02A2 ;X=0, Y=1, C=1, AND Z=1 1900 02A2 6CE600 JMP (TMPLOC) 1910 02A5 ; 1920 02A5 ;OPCODE IS LESS THAN $0B, SO THE ROUTINE IS 1930 02A5 ;NOT IN 6502 MACHINE CODE, BUT IN P-CODE. 1940 02A5 A52A L11B7 LDA INSLEN 1950 02A7 48 PHA ;PUSH LENGTH OF INSTRUCTION 1960 02A8 A525 LDA IP+1 ;AND PUSH RETURN ADDRESS 1970 02AA ;STORE CALL ADDRESS 1980 02AA 85FB STA CALADR+1 1990 02AC 48 PHA 2000 02AD A524 LDA IP 2010 02AF 85FA STA CALADR 2020 02B1 48 PHA 2030 02B2 A6E6 LDX TMPLOC 2040 02B4 A5E7 LDA TMPLOC+1 2050 02B6 8624 L11CA STX IP 2060 02B8 8525 STA IP+1 2070 02BA D09C BNE L1179 ;ALWAYS BRANCHES - GO BACK TO EXE 2080 02BC ; 2090 02BC OF6502=*/256*256 2100 02BC ;OPCODE $14 XX 2110 02BC ;DECREMENT 16-BIT VALUE IN XX/XX+1 2120 02BC A0FF L02DC LDY #$FF 2130 02BE 18 CLC 2140 02BF 2C .BYTE $2C 2150 02C0 ; 2160 02C0 ;OPCODE $13 XX 2170 02C0 ;INCREMENT 16-BIT VALUE IN XX/XX+1 2180 02C0 AA L02D0 TAX 2190 02C1 ; 2200 02C1 ;OPCODE $28 2210 02C1 ;INCREMENT 16-BIT VALUE IN 00/01 2220 02C1 88 L11CE DEY 2230 02C2 98 TYA 2240 02C3 7500 ADC $00,X 2250 02C5 48 PHA 2260 02C6 98 TYA 2270 02C7 7501 ADC $01,X 2280 02C9 9501 PULLZP STA $01,X 2290 02CB 68 PLA 2300 02CC 9500 STA $00,X 2310 02CE ;ADD INSTRUCTION LENGTH ONTO INTERPRETIVE POINTER 2320 02CE ;THEN EXECUTE NEXT INSTRUCTION 2330 02CE A52A L11CF LDA INSLEN 2340 02D0 D076 BNE L02AA ;ALWAYS BRANCHES 2350 02D2 ;EXECUTE P-CODE - PULL ADDRESS OFF STACK 2360 02D2 68 L11DC PLA 2370 02D3 8524 STA IP 2380 02D5 68 PLA 2390 02D6 8525 STA IP+1 2400 02D8 A901 LDA #$01 2410 02DA D06C BNE L02AA 2420 02DC 98 DELCHR TYA 2430 02DD F010 BEQ L020C 2440 02DF A908 LDA #$08 2450 02E1 20EEFF JSR COUT 2460 02E4 A920 LDA #$20 2470 02E6 20EEFF JSR COUT 2480 02E9 A908 LDA #$08 2490 02EB 20EEFF JSR COUT 2500 02EE ; 2510 02EE ;OPCODE $0D 2520 02EE ;INPUT LINE OF TEXT FROM THE KEYBOARD. 2530 02EE ;START ADDRESS OF LINE IS HELD IN $02/$03, 2540 02EE ;AND MAXIMUM LENGTH OF LINE IS 56 CHARACTERS 2550 02EE 88 L0205 DEY 2560 02EF ;GET A CHARACTER FROM THE KEYBOARD 2570 02EF 20EBFF L020C JSR CIN 2580 02F2 C91C CMP #$1C 2590 02F4 F0E6 BEQ DELCHR 2600 02F6 9102 STA ($02),Y 2610 02F8 C90D CMP #$0D 2620 02FA F00E BEQ L0235 2630 02FC C037 CPY #$37 2640 02FE F0EF BEQ L020C 2650 0300 C920 CMP #$20 2660 0302 30EB BMI L020C 2670 0304 20EEFF JSR COUT 2680 0307 C8 L0229 INY 2690 0308 D0E5 BNE L020C 2700 030A 20EEFF L0235 JSR COUT 2710 030D A502 LDA $02 2720 030F 8500 STA $00 2730 0311 D06B BNE JL11CF ;ALWAYS BRANCHES 2740 0313 ; 2750 0313 ;OPCODE $27 YY 2760 0313 ;CHECKS NEXT CHARACTER IN TEXT, 2770 0313 ;USING POINTER AT $06/$07 2780 0313 ;THE OPCODE $27 DOES NOT APPEAR IN THE CODE 2790 0313 ;XX IS THE OPCODE MINUS $10 FOR OPCODE $27, 2800 0313 ;AND THE OPCODE MINUS $65 FOR OPCODE $26 2810 0313 ;IF XX < $80 IT CHECKS FOR CHARACTER XX 2820 0313 ;IF XX = $80 (CAP), CHECKS FOR A CAPITAL LETTER 2830 0313 ;IF XX = $81 (DEC), CHECKS FOR A DECIMAL DIGIT 2840 0313 ;IF XX = $82 (SPC), CHECKS FOR CONTROL CHAR OR SP 2850 0313 ;THE SECOND BYTE, YY, IS THE BRANCH OFFSET 2860 0313 A206 L0244 LDX #$06 ;X IDENTIFIES TEXT POINTER 2870 0315 ;$EF IS THE COMPLEMENT OF $10, BUT MINUS 2880 0315 ;1 BECAUSE THE CARRY FLAG IS ALWAYS SET 2890 0315 A9EF LDA #$EF 2900 0317 2C .BYTE $2C 2910 0318 ; 2920 0318 ;OPCODE $26 - INSTRUCTION LENGTH = 2 2930 0318 ;SAME AS OPCODE $27 BUT USES POINTER AT $00/$01 2940 0318 ;X HAS BEEN SET TO ZERO ANYWAY 2950 0318 ;SECOND BYTE IS RELATIVE BRANCH OFFSET 2960 0318 ;THE OPCODE $26 DOES NOT APPEAR IN THE CODE 2970 0318 ;$9A IS THE COMPLEMENT OF $65, BUT MINUS 2980 0318 ;1 BECAUSE THE CARRY FLAG IS ALWAYS SET 2990 0318 A99A L0240 LDA #$9A 3000 031A 88 DEY 3010 031B 7124 ADC (IP),Y 3020 031D 3035 BMI L0256 3030 031F 4100 EOR ($00,X) 3040 0321 D05B BNE JL11CF ;GO ON TO NEXT INSTRUCTION 3050 0323 ;BRANCH USING SECOND BYTE OF INSTRUCTION 3060 0323 A001 L0251 LDY #$01 3070 0325 D00D BNE L0284 ;ALWAYS BRANCHES 3080 0327 ; 3090 0327 ;OPCODES $0E, $25 AND $12 - INSTR LEN = 1 3100 0327 C8 OP1203 INY ;4TH BYTE OF CALL IS BRANCH OFFSET 3110 0328 C8 OP1202 INY ;3RD BYTE OF CALL IS BRANCH OFFSET 3120 0329 E8 OP1201 INX ;2ND BYTE OF CALL IS BRANCH OFFSET 3130 032A ; 3140 032A ;OPCODE $11 - INSTRUCTION LENGTH = 1 3150 032A ;RETURN FROM P-CODE SUBROUTINE 3160 032A 68 L02BC PLA 3170 032B 8524 STA IP 3180 032D 68 PLA 3190 032E 8525 STA IP+1 3200 0330 68 PLA 3210 0331 CA DEX 3220 0332 3014 BMI L02AA ;NEXT INSTRUCTION IF NO BRANCH 3230 0334 ;RELATIVE BRANCH, WHERE Y INDEXES THE SIGNED 3240 0334 ;8-BIT OFFSET 3250 0334 B124 L0284 LDA (IP),Y 3260 0336 AA TAX 3270 0337 18 CLC 3280 0338 6524 ADC IP 3290 033A 8524 STA IP 3300 033C 8A TXA 3310 033D 2980 AND #$80 3320 033F F002 BEQ L0295 3330 0341 A9FF LDA #$FF 3340 0343 6525 L0295 ADC IP+1 3350 0345 8525 STA IP+1 3360 0347 ;ADD Y REGISTER ONTO INTERPRETIVE POINTER 3370 0347 ;THEN CONTINUE WITH P-CODE EXECUTION 3380 0347 98 L02A9 TYA 3390 0348 18 L02AA CLC 3400 0349 6524 ADC IP 3410 034B 8524 STA IP 3420 034D 9002 BCC L1220 3430 034F E625 INC IP+1 3440 0351 4C5802 L1220 JMP L1179 ;GO TO EXECUTE NEXT INSTRUCTION 3450 0354 ;SEE IF THE NEXT CHARACTER FORM THE SOURCE CODE I 3460 0354 ;A=$80 = CAPITAL LETTER 3470 0354 ;A=$81 = DECIMAL DIGIT 3480 0354 ;A=$82 = CONTROL CHARACTER (LESS THAN $20) OR SPA 3490 0354 A8 L0256 TAY 3500 0355 A100 LDA ($00,X) 3510 0357 D9E302 CMP L0267-$80,Y 3520 035A 3022 BMI JL11CF 3530 035C D9E602 CMP L026B-$80,Y 3540 035F 30C2 BMI L0251 3550 0361 101B BPL JL11CF 3560 0363 41 L0267 .BYTE $41,$30,$00 3560 0364 30 3560 0365 00 3570 0366 5B L026B .BYTE $5B,$3A,$21 3570 0367 3A 3570 0368 21 3580 0369 ; 3590 0369 ;OPCODE $16 XX YY 3600 0369 ;COPY 16-BIT NUMBER FROM XX/XX+1 TO YY/YY+1 3610 0369 ;IF MSB OF XX IS SET, IT INDEXES CALLING P-CODE 3620 0369 20DA04 L0270 JSR L04A0 ;GET NEXT ARGUMENT IN LIST 3630 036C B006 BCS COPY16 ;ALWAYS BRANCHES 3640 036E ; 3650 036E ;OPCODES $0F YY AND $29 FF 3660 036E ;LOCATIONS CONST0 AND CONST01 ARE PERMANENTLY 3670 036E ;TO 0 AND 1 RESPECTIVELY 3680 036E A22C CODE0F LDX #CONST0 3690 0370 2C .BYTE $2C 3700 0371 A242 CODE29 LDX #CONST1 3710 0373 A8 TAY ;2ND BYTE OF INSTR TO Y 3720 0374 B500 COPY16 LDA $00,X 3730 0376 990000 STA $0000,Y 3740 0379 B501 LDA $01,X 3750 037B 990100 STA $0001,Y 3760 037E 4CCE02 JL11CF JMP L11CF ;EXECUTE NEXT INSTRUCTION 3770 0381 ; 3780 0381 ;OPCODE $1A 3790 0381 ;P-CODE JUMP INSTRUCTION ;REPRESENTED IN THE CODE 3800 0381 ;ITSELF AS JUMP ADDRESS MINUS START OF ASSEMBLER 3810 0381 ;$E800, IN THE FORMAT OF HIGH BYTE FOLLOWED BY LO 3820 0381 AA L029C TAX 3830 0382 88 DEY 3840 0383 B124 LDA (IP),Y 3850 0385 C9FA CMP #$FA 3860 0387 9007 BCC LITAD 3870 0389 A8 TAY 3880 038A BE9B02 LDX ADRLO-$FA,Y 3890 038D B9A102 LDA ADRHI-$FA,Y 3900 0390 SCONST = OFFSET/256-1 3910 0390 E9E3 LITAD SBC #SCONST 3920 0392 4CB602 LSTAD JMP L11CA 3930 0395 8D ADRLO .BYTE L08B7,L0CDC,L0D11 3930 0396 04 3930 0397 37 3940 0398 2F .BYTE L0620,L08E6,LINOUT 3940 0399 B7 3940 039A 32 3950 039B EB ADRHI .BYTE L08B7/256+SCONST 3960 039C EF .BYTE L0CDC/256+SCONST 3970 039D EF .BYTE L0D11/256+SCONST 3980 039E E9 .BYTE L0620/256+SCONST 3990 039F EB .BYTE L08E6/256+SCONST 4000 03A0 F2 .BYTE LINOUT/256+SCONST 4010 03A1 ; 4020 03A1 ;OPCODE $15 - INSTRUCTION LENGTH = 1 4030 03A1 ;RETURN TO EXECUTING 6502 MACHINE CODE 4040 03A1 ;X=0, Y=1 AND C=1 4050 03A1 E624 EX6502 INC IP 4060 03A3 D002 BNE L02EA 4070 03A5 E625 INC IP+1 4080 03A7 6C2400 L02EA JMP (IP) 4090 03AA ; 4100 03AA ;OPCODE $22 XX 4110 03AA ;MOVE SINGLE BYTE POINTED TO BY 00/01 4120 03AA ;TO LOCATION POINTED TO BY XX/XX+1 4130 03AA AA L04AF TAX 4140 03AB 88 DEY 4150 03AC B100 LDA ($00),Y 4160 03AE 8100 STA ($00,X) 4170 03B0 ;ALWAYS BRANCHES - ADVANCE 4180 03B0 ;INTERPRETIVE POINTER AND CONTINUE 4190 03B0 B0CC BCS JL11CF 4200 03B2 ; 4210 03B2 ;OPCODE $10 XX BB 4220 03B2 ;INPUT A 16-BIT DECIMAL NUMBER INTO XX/XX+1 4230 03B2 ;WITH BB BEING A BRANCH OFFSET IN CASE OF OVERFLO 4240 03B2 ;(I.E. RESULT > 65535). THE TEXT FOR THE NUMBER 4250 03B2 ;ITSELF STARTS AT LOCATION POINTED TO BY $06-$07, 4260 03B2 ;AND $08 CONTAINS THE NUMBER OF DIGITS. ALL THE 4270 03B2 ;DIGITS HAVE BEEN CONFIRMED TO BE DECIMAL DIGITS 4280 03B2 ;ALREADY. THE ASSEMBLER ITSELF DOES NOT USE THIS 4290 03B2 ;OPCODE ;IT IS ONLY USED BY THE LINE EDITOR. 4300 03B2 8626 L0300 STX $26 4310 03B4 86EC STX $EC 4320 03B6 AA TAX 4330 03B7 A900 LDA #$00 4340 03B9 9500 STA $00,X 4350 03BB 9501 STA $01,X 4360 03BD A426 L030D LDY $26 4370 03BF B106 LDA ($06),Y 4380 03C1 290F AND #$0F 4390 03C3 85E7 STA TMPLOC+1 4400 03C5 8A TXA 4410 03C6 A8 TAY 4420 03C7 A93C LDA #CNST10 4430 03C9 20950A JSR L0A84 4440 03CC D01C BNE L0327 ;BRANCH IF OVERFLOW 4450 03CE E626 INC $26 4460 03D0 C608 DEC $08 4470 03D2 D0E9 BNE L030D 4480 03D4 F0A8 L3980 BEQ JL11CF ;ADVANCE IP AND EXECUTE 4490 03D6 ; 4500 03D6 ;OPCODE $1C XX BB 4510 03D6 ;REMOVE ERROR NUMBER AND TEXT POINTER FROM STACK 4520 03D6 ;BRANCH BB IS TAKEN IF STACK IS EMPTY 4530 03D6 A8 L0BC5 TAY 4540 03D7 9601 STX $01,Y 4550 03D9 A6E2 LDX NUMERR 4560 03DB F00D BEQ L0327 4570 03DD B5F7 LDA ERRMSG+1,X 4580 03DF 8506 STA $06 4590 03E1 B5F5 LDA ERRMSG-1,X 4600 03E3 990000 STA $0000,Y 4610 03E6 C6E2 DEC NUMERR 4620 03E8 1094 BPL JL11CF ;ALWAYS BRANCHES 4630 03EA ;BRANCH, USING 3RD BYTE OF INSTR 4640 03EA A002 L0327 LDY #$02 4650 03EC 4C3403 JMP L0284 4660 03EF ;PRINT NEW LINE 4670 03EF A90D NEWLIN LDA #$0D 4680 03F1 20EEFF L033E JSR COUT ;PRINT CHARACTER IN ACC 4690 03F4 A90A L0341 LDA #$0A 4700 03F6 ;PRINT CHARACTER IN ACCUMULATOR 4710 03F6 4CEEFF CHROUT JMP COUT 4720 03F9 ;OPCODE $1F - INSTRUCTION LENGTH VARIABLE 4730 03F9 E606 L03EC INC $06 4740 03FB 20F403 JSR L0341 4750 03FE ; 4760 03FE ;OPCODE $1D - INSTRUCTION LENGTH VARIABLE 4770 03FE ;PRINT POINTER TO ERROR IN LINE OF TEXT, PLUS 4780 03FE ;ERROR MESSAGE. START BY PRINTING LINE OF DASHES 4790 03FE ;UP TO CURRENT POINT IN TEXT. 4800 03FE L0363 ;CARRY SET BY DEFAULT 4810 03FE A506 LDA $06 4820 0400 E502 SBC $02 4830 0402 F009 BEQ L0373 4840 0404 AA TAX 4850 0405 A92D LDA #$2D 4860 0407 20EEFF L036D JSR COUT ;PRINT CHARACTER IN ACC 4870 040A CA DEX 4880 040B D0FA BNE L036D 4890 040D ;PRINT UP-ARROW 4900 040D A95E L0373 LDA #$5E 4910 040F 20EEFF JSR COUT ;PRINT CHARACTER IN ACC 4920 0412 ;PRINT CARRIAGE RETURN 4930 0412 A90D LDA #$0D 4940 0414 20EEFF JSR COUT ;PRINT CHARACTER IN ACC 4950 0417 ;OPCODE $1E - INSTRUCTION LENGTH VARIABLE 4960 0417 ;PRINT MESSAGE, TERMINATED WITH $00, BUT PRINT 4970 0417 ;LINE FEED FIRST. 4980 0417 20F403 L037D JSR L0341 4990 041A ; 5000 041A ;OPCODE $24 - INSTRUCTION LENGTH VARIABLE 5010 041A ;PRINT MESSAGE, TERMINATED WITH #$00 OR #$0D (CR) 5020 041A B124 L0380 LDA (IP),Y 5030 041C C8 INY 5040 041D AA TAX ;CHECK FOR END OF MESSAGE 5050 041E F00A BEQ L0391 5060 0420 20EEFF JSR COUT ;PRINT CHARACTER IN ACC 5070 0423 C90D CMP #$0D 5080 0425 D0F3 BNE L0380 5090 0427 20F403 JSR L0341 5100 042A 4C4703 L0391 JMP L02A9 5110 042D ; 5120 042D ;OPCODE $0B - 0B XX YY BB 5130 042D ;THIS WORKS FOR OPCODES 0B, 2B, 4B, 6B, 8B, AB, 5140 042D ;CB AND EB, ALTHOUGH 0B AND EB NEVER OCCUR. 5150 042D ;COMPARES 16-BIT QUANTITIES IN ZERO PAGE AT 5160 042D ;LOCATIONS XX/XX+1 AND .BYTE SET1,/.BYTE SET1,+1, 5170 042D ;ON BB IF APPROPRIATE 5180 042D ;2B: BRANCHES IF XX > YY 5190 042D ;4B: BRANCHES IF XX = YY 5200 042D ;6B: BRANCHES IF XX >= YY 5210 042D ;8B: BRANCHES IF XX < YY 5220 042D ;AB: BRANCHES IF XX <> YY 5230 042D ;CB: BRANCHES IF XX <= YY 5240 042D 20DA04 L03A0 JSR L04A0 5250 0430 ;CARRY SET IMPLICITLY 5260 0430 B500 LDA $00,X 5270 0432 F90000 SBC $0000,Y 5280 0435 85E5 STA $E5 5290 0437 B501 LDA $01,X 5300 0439 F90100 SBC $0001,Y 5310 043C 05E5 ORA $E5 5320 043E F005 BEQ L03C4 5330 0440 A960 LDA #%01100000 5340 0442 B001 BCS L03C4 5350 0444 0A ASL A ;A = $C0 5360 0445 4940 L03C4 EOR #%01000000 5370 0447 A000 LDY #$00 5380 0449 3124 AND (IP),Y 5390 044B F087 L4820 BEQ L3980 ;EXECUTE NEXT INSTRUCTION 5400 044D A003 L03CE LDY #$03 5410 044F 4C3403 JMP L0284 ;EXECUTE RELATIVE BRANCH 5420 0452 ; 5430 0452 ;OPCODE $20 - 20 XX YY ZZ 5440 0452 ;SUBTRACT 16-BIT QUANTITY IN YY FROM XX 5450 0452 ;AND PUT RESULT IN ZZ 5460 0452 CA L0419 DEX ;FLAG = $FF TO SUBTRACT 5470 0453 24 .BYTE $24 ;KEEP CARRY SET 5480 0454 ; 5490 0454 ;OPCODE $21 - 21 XX YY ZZ 5500 0454 ;ADD TOGETHER 16-BIT QUANTITIES AT XX AND .BYTE S 5510 0454 ;PUT RESULT IN ZZ 5520 0454 18 L0400 CLC 5530 0455 86E4 STX $E4 5540 0457 20DA04 JSR L04A0 5550 045A B90000 LDA $0000,Y 5560 045D 45E4 EOR $E4 5570 045F 7500 ADC $00,X 5580 0461 48 PHA 5590 0462 B90100 LDA $0001,Y 5600 0465 45E4 EOR $E4 5610 0467 7501 ADC $01,X 5620 0469 48 PHA 5630 046A A003 LDY #$03 5640 046C B124 LDA (IP),Y 5650 046E AA TAX 5660 046F 68 PLA 5670 0470 4CC902 JMP PULLZP 5680 0473 ; 5690 0473 ;OPCODE $0C - INSTRUCTION LENGTH = 1 5700 0473 ;COMPRESS LINE OF ASSEMBLER SOURCE CODE 5710 0473 8628 L0440 STX $28 5720 0475 860E STX $0E 5730 0477 8627 STX $27 5740 0479 8626 L0446 STX $26 5750 047B A428 L0448 LDY $28 5760 047D B100 LDA ($00),Y 5770 047F C527 CMP $27 5780 0481 D006 BNE L0456 5790 0483 C626 DEC $26 5800 0485 E628 INC $28 5810 0487 D0F2 BNE L0448 5820 0489 AA L0456 TAX 5830 048A A40E LDY $0E 5840 048C A526 LDA $26 5850 048E F003 BEQ L0460 5860 0490 9100 STA ($00),Y 5870 0492 C8 INY 5880 0493 8A L0460 TXA 5890 0494 9100 STA ($00),Y 5900 0496 8527 STA $27 5910 0498 E628 INC $28 5920 049A C8 INY 5930 049B 840E STY $0E 5940 049D A200 LDX #$00 5950 049F C90D CMP #$0D 5960 04A1 D0D6 BNE L0446 5970 04A3 860F STX $0F 5980 04A5 F0A4 BEQ L4820 ;ALWAYS BRANCHES 5990 04A7 ; 6000 04A7 ;CALLED BY BLOCK MOVE SUBROUTINE 6010 04A7 ;RETURN WITH Z FLAG SET IF TRANSFERRED 6020 04A7 ;LAST BYTE OF BLOCK 6030 04A7 B126 L03F2 LDA ($26),Y 6040 04A9 9128 STA ($28),Y 6050 04AB E6FE INC $FE 6060 04AD D002 BNE L03F6 6070 04AF E6FF INC $FF 6080 04B1 60 L03F6 RTS 6090 04B2 ; 6100 04B2 ;************************************** 6110 04B2 ;THE FOLLOWING DECLARATIONS PRECEDE THE 6120 04B2 ;FIRST PIECE OF PSEUDOCODE 6130 04B2 ;************************************** 6140 04B2 OFS=*/256*256 6150 04B2 OFFSET = $E800-OFS 6160 04B2 ; 6170 04B2 ;OPCODE $00 - INSTRUCTION LENGTH = 2 6180 04B2 ;STEP ON TO NEXT LINE OF SOURCE FILE - 6190 04B2 ;PUT LOCATION IN TXTPOS, AND 6200 04B2 ;PUT LENGTH IN LINLEN 6210 04B2 ;PUT LINE NUMBER IN $38 6220 04B2 ;TAKE RELATIVE BRANCH IN 2ND BYTE IF END 6230 04B2 21 L047C .BYTE ADDZ,TXTPOS,LINLEN,TXTPOS 6230 04B3 10 6230 04B4 12 6230 04B5 10 6240 04B6 21 .BYTE ADDZ,LINENO,CONST1,LINENO 6240 04B7 14 6240 04B8 42 6240 04B9 14 6250 04BA 0F .BYTE SET0,LINLEN 6250 04BB 12 6260 04BC AB .BYTE BNEQ,TXTPOS,ENDTXT,L048E-* 6260 04BD 10 6260 04BE 1A 6260 04BF 09 6270 04C0 12 .BYTE RET2 ;RETURN - 2ND BYTE OF CALL IS BR 6280 04C1 ; 6290 04C1 ;OPCODE $02 - INSTRUCTION LENGTH = 1 6300 04C1 ;FETCH FIRST LINE OF SOURCE FILE - 6310 04C1 ;PUT LOCATION IN TXTPOS, AND 6320 04C1 ;PUT LENGTH IN LINLEN 6330 04C1 ;PUT LINE NUMBER IN $38 6340 04C1 16 L03D4 .BYTE COPY,STTEXT,TXTPOS 6340 04C2 16 6340 04C3 10 6350 04C4 4B .BYTE BEQU,TXTPOS,ENDTXT,L04E6-* ;RET 6350 04C5 10 6350 04C6 1A 6350 04C7 4B 6360 04C8 01 L048E .BYTE BMOV,CONST2,TXTPOS,$38 6360 04C9 74 6360 04CA 10 6360 04CB 38 6370 04CC ;AND PUT LENGTH OF LINE IN LINLEN 6380 04CC 15 .BYTE EX65 6390 04CD ;SKIP OVER 2 BYTES LINE NUMBER 6400 04CD C8 L0493 INY 6410 04CE B110 LDA (TXTPOS),Y 6420 04D0 C90D CMP #$0D 6430 04D2 D0F9 BNE L0493 6440 04D4 C8 INY 6450 04D5 8412 STY LINLEN 6460 04D7 4C2A03 JMP L02BC ;RETURN FROM P-CODE SUBROUTINE 6470 04DA ;GET NEXT ARGUMENT IN LIST. 6480 04DA ;LOOK AT NEXT ARGUMENT FOR P-CODE INSTRUCTION. 6490 04DA ;IF THAT ARGUMENT IS NEGATIVE, USE IT TO INDEX 6500 04DA ;CALLING INSTRUCTION. 6510 04DA B124 L04A0 LDA (IP),Y 6520 04DC 1005 BPL L04AD 6530 04DE 297F AND #$7F 6540 04E0 A8 TAY 6550 04E1 B1FA LDA (CALADR),Y 6560 04E3 AA L04AD TAX 6570 04E4 A002 LDY #$02 6580 04E6 B124 LDA (IP),Y 6590 04E8 A8 TAY 6600 04E9 60 RTS 6610 04EA ; 6620 04EA ;OPCODE $01 XX YY, ZZ - MEMORY BLOCK MOVE 6630 04EA ;XX IS LENGTH OF BLOCK (IN $46/$47) 6640 04EA ;YY IS START OF SOURCE (IN $26/$27) 6650 04EA ;ZZ IS START OF DESTINATION (IN $28/$29) 6660 04EA 16 L04C0 .BYTE COPY,$81,$46 ;STORE LENGTH 6660 04EB 81 6660 04EC 46 6670 04ED ;EXIT IF LENGTH IS ZERO 6680 04ED 4B .BYTE BEQU,$46,CONST0,L04E6-* 6680 04EE 46 6680 04EF 2C 6680 04F0 22 6690 04F1 20 .BYTE SUBZ,CONST0,$46,$FE 6690 04F2 2C 6690 04F3 46 6690 04F4 FE 6700 04F5 16 .BYTE COPY,$82,$26 ;STORE SOURCE 6700 04F6 82 6700 04F7 26 6710 04F8 16 .BYTE COPY,$83,$28 ;STORE DESTINATION 6710 04F9 83 6710 04FA 28 6720 04FB ;BRANCH IF DESTINATION HIGHER THAN SOURCE 6730 04FB 8B .BYTE BLES,$26,$28,L04E7-* 6730 04FC 26 6730 04FD 28 6730 04FE 15 6740 04FF ;SOURCE ADDRESS HIGHER THAN DEST ADDRESS 6750 04FF ;START BLOCK MOVE FROM LOWEST ADDRESS 6760 04FF 15 .BYTE EX65 6770 0500 88 DEY 6780 0501 F007 BEQ L04DE ;ALWAYS BRANCHES 6790 0503 C8 L04D7 INY 6800 0504 D004 BNE L04DE 6810 0506 E627 INC $27 6820 0508 E629 INC $29 6830 050A 20A704 L04DE JSR L03F2 6840 050D D0F4 BNE L04D7 6850 050F 20D202 L04E3 JSR L11DC ;EXECUTE P-CODE 6860 0512 11 L04E6 .BYTE RETN 6870 0513 ;DEST ADDRESS HIGHER THAN SOURCE ADDRESS 6880 0513 ;START BLOCK MOVE FROM HIGHEST ADDRESS 6890 0513 15 L04E7 .BYTE EX65 6900 0514 18 CLC 6910 0515 A547 LDA $47 6920 0517 6527 ADC $27 6930 0519 8527 STA $27 6940 051B A547 LDA $47 6950 051D 6529 ADC $29 6960 051F 8529 STA $29 6970 0521 A446 LDY $46 6980 0523 98 L04F1 TYA 6990 0524 D004 BNE L04F8 7000 0526 C627 DEC $27 7010 0528 C629 DEC $29 7020 052A 88 L04F8 DEY 7030 052B 20A704 JSR L03F2 7040 052E D0F3 BNE L04F1 7050 0530 F0DD BEQ L04E3 7060 0532 ; 7070 0532 ;OPCODE $1B - INSTRUCTION LENGTH = 2 7080 0532 ;PRINT LINE POINTED TO BY LOCATION XX/XX+1 7090 0532 ;CARRIES OUT DECOMPRESSION OF TEXT 7100 0532 AA L0500 TAX 7110 0533 B500 LDA $00,X 7120 0535 8526 STA $26 7130 0537 B501 LDA $01,X 7140 0539 8527 STA $27 7150 053B 88 DEY 7160 053C A2FF L050C LDX #$FF 7170 053E B126 LDA ($26),Y 7180 0540 1003 BPL L0515 7190 0542 AA TAX 7200 0543 A528 LDA $28 7210 0545 20EEFF L0515 JSR COUT ;PRINT CHARACTER IN ACC 7220 0548 E8 INX 7230 0549 30FA BMI L0515 7240 054B 8528 STA $28 7250 054D C8 INY 7260 054E C90D CMP #$0D 7270 0550 D0EA BNE L050C 7280 0552 A900 LDA #$00 7290 0554 20F103 JSR L033E 7300 0557 4CCE02 L6610 JMP L11CF ;ADVANCE INTERPRETIVE POINTER AND 7310 055A ;OPCODE 19 XX 7320 055A ;PRINT DIGIT DECIMAL NUMBER IN LOCATIONS XX 7330 055A ;AND XX+1, RIGHT-JUSTIFIED IN A FIELD OF 5 7340 055A ;CHARACTERS 7350 055A AA L0590 TAX 7360 055B B500 LDA $00,X 7370 055D 8526 STA $26 7380 055F B501 LDA $01,X 7390 0561 8527 STA $27 7400 0563 A905 LDA #$05 7410 0565 8546 STA $46 7420 0567 A226 LDX #$26 7430 0569 A03C LDY #CNST10 7440 056B A928 LDA #$28 7450 056D 209A05 L05A5 JSR L052A 7460 0570 8547 STA $47 7470 0572 B500 LDA $00,X 7480 0574 48 PHA 7490 0575 8A TXA 7500 0576 A647 LDX $47 7510 0578 C646 DEC $46 7520 057A D0F1 BNE L05A5 7530 057C A280 LDX #$80 7540 057E 68 L05B6 PLA 7550 057F F005 BEQ L05BE 7560 0581 AA TAX 7570 0582 0930 ORA #$30 7580 0584 D007 BNE L05C5 7590 0586 0930 L05BE ORA #$30 7600 0588 E8 INX 7610 0589 1002 BPL L05C5 7620 058B A920 LDA #$20 7630 058D 20EEFF L05C5 JSR COUT ;PRINT CHARACTER IN ACC 7640 0590 E646 INC $46 7650 0592 A546 LDA $46 7660 0594 C905 CMP #$05 7670 0596 D0E6 BNE L05B6 7680 0598 F0BD BEQ L6610 ;ADVANCE INTERPRETIVE POINTER AND 7690 059A ;DIVISION SUBROUTINE: 7700 059A ;(A) = (X) / (Y) 7710 059A 85E4 L052A STA $E4 7720 059C 86E5 STX $E5 7730 059E 84E6 STY TMPLOC 7740 05A0 A6E6 LDX TMPLOC 7750 05A2 A001 LDY #$01 7760 05A4 A501 LDA $01 7770 05A6 300B BMI L0543 7780 05A8 C8 L0538 INY 7790 05A9 1600 ASL $00,X 7800 05AB 3601 ROL $01,X 7810 05AD 3004 BMI L0543 7820 05AF C011 CPY #$11 7830 05B1 D0F5 BNE L0538 7840 05B3 84E7 L0543 STY TMPLOC+1 7850 05B5 A4E4 LDY $E4 7860 05B7 A200 LDX #$00 7870 05B9 9600 STX $00,Y 7880 05BB 9601 STX $01,Y 7890 05BD A4E6 LDY TMPLOC 7900 05BF A6E5 L054F LDX $E5 7910 05C1 38 SEC 7920 05C2 B500 LDA $00,X 7930 05C4 F90000 SBC $0000,Y 7940 05C7 85EC STA $EC 7950 05C9 B501 LDA $01,X 7960 05CB F90100 SBC $0001,Y 7970 05CE 9006 BCC L0566 7980 05D0 9501 STA $01,X 7990 05D2 A5EC LDA $EC 8000 05D4 9500 STA $00,X 8010 05D6 A6E4 L0566 LDX $E4 8020 05D8 3600 ROL $00,X 8030 05DA 3601 ROL $01,X 8040 05DC C6E7 DEC TMPLOC+1 8050 05DE F009 BEQ L0583 8060 05E0 A6E6 LDX TMPLOC 8070 05E2 5601 LSR $01,X 8080 05E4 7600 ROR $00,X 8090 05E6 38 SEC 8100 05E7 B0D6 BCS L054F 8110 05E9 A5E4 L0583 LDA $E4 8120 05EB A6E5 LDX $E5 8130 05ED 60 RTS 8140 05EE ;'R' COMMAND 8150 05EE 16 L066C .BYTE COPY,CNST10,$36 8150 05EF 3C 8150 05F0 36 8160 05F1 02 .BYTE LIN1 8170 05F2 4B L0831 .BYTE BEQU,TXTPOS,ENDTXT,L0842-* 8170 05F3 10 8170 05F4 1A 8170 05F5 0D 8180 05F6 01 .BYTE BMOV,CONST2,$3A,TXTPOS 8180 05F7 74 8180 05F8 3A 8180 05F9 10 8190 05FA 21 .BYTE ADDZ,CNST10,$36,$36 8190 05FB 3C 8190 05FC 36 8190 05FD 36 8200 05FE 00 .BYTE NXLN,L0842-* 8200 05FF 03 8210 0600 E9F2 .DBYTE L0831+OFFSET 8220 0602 1E L0842 .BYTE MSLN,$00 8220 0603 00 8230 0604 02 .BYTE LIN1 8240 0605 19 .BYTE PDEC,$36 8240 0606 36 8250 0607 EA12 .DBYTE PSTART+OFFSET 8260 0609 ;LINE NUMBER FOUND 8270 0609 EA94 L0663 .DBYTE L0690+OFFSET 8280 060B ;'P' COMMAND 8290 060B EB48 L0666 .DBYTE L0750+OFFSET 8300 060D ;'D' COMMAND 8310 060D EBC3 L0669 .DBYTE L07D0+OFFSET 8320 060F ;*********************************** 8330 060F ;ENTRY POINT FOR P-CODE UPON STARTUP 8340 060F 16 PINIT .BYTE COPY,STTEXT,TXTPOS 8340 0610 16 8340 0611 10 8350 0612 24 PSTART .BYTE MESG,$0D ;PRINT NEW LINE 8350 0613 0D 8360 0614 ;************************************ 8370 0614 03 L0601 .BYTE CLAS,L0663-*,L0605-*,L0620-* 8370 0615 F4 8370 0616 02 8370 0617 18 8380 0618 51 L0605 .BYTE CHK6+'A,L0660-* ;TEST FOR 'A' COMMAN 8380 0619 2B 8390 061A 60 .BYTE CHK6+'P,L0666-* ;TEST FOR 'P' COMMAN 8390 061B F0 8400 061C 59 .BYTE CHK6+'I,LICMD-* ;TEST FOR 'I' COMMAN 8400 061D 63 8410 061E 54 .BYTE CHK6+'D,L0669-* ;TEST FOR 'D' COMMAN 8410 061F EE 8420 0620 62 .BYTE CHK6+'R,L066C-* ;TEST FOR 'R' COMMAN 8420 0621 CD 8430 0622 63 L0614 .BYTE CHK6+'S,L130C-* ;'S' COMMAND 8430 0623 12 8440 0624 5C .BYTE CHK6+'L,L1316-* ;'L' COMMAND 8440 0625 17 8450 0626 1F CMDERR .BYTE PER6,'CMD ERR',$0D 8450 0627 43 8450 0628 4D 8450 0629 44 8450 062A 20 8450 062B 45 8450 062C 52 8450 062D 52 8450 062E 0D 8460 062F 1E L0620 .BYTE MSLN,'.',$00 ;PRINT FULL STOP 8460 0630 2E 8460 0631 00 8470 0632 0D .BYTE KBLN ;GET LINE OF KEYBOARD INPUT 8480 0633 EA14 .DBYTE L0601+OFFSET 8490 0635 ; 8500 0635 ;'S' AND 'L' COMMANDS FOR UK101 VERSION 8510 0635 ;'S' COMMAND 8520 0635 15 L130C .BYTE EX65 ;EXECUTE 6502 MACHINE CODE 8530 0636 20F7FF JSR SAVE ;TURN ON SAVE FLAG 8540 0639 4C4006 JMP L1310 8550 063C ;'L' COMMAND 8560 063C 15 L1316 .BYTE EX65 ;EXECUTE 6502 MACHINE CODE 8570 063D 20F4FF JSR LOAD 8580 0640 20D202 L1310 JSR L11DC ;RETURN TO P-CODE 8590 0643 FD .BYTE $FD ;JMP TO L0620 8600 0644 ;'A' COMMAND 8610 0644 1E L0660 .BYTE MSLN,$0D 8610 0645 0D 8620 0646 4B .BYTE BEQU,STTEXT,ENDTXT,L0620-* 8620 0647 16 8620 0648 1A 8620 0649 E6 8630 064A 29 .BYTE SET1,ASMBRK 8630 064B 3E 8640 064C 0F .BYTE SET0,ASMOPT 8640 064D 48 8650 064E 0F .BYTE SET0,A2BLEN-1 ;SET NO. BYTES FOR A2 T 8650 064F D0 8660 0650 03 .BYTE CLAS,L112A-*,CMDERR-*,L112D-* 8660 0651 05 8660 0652 D4 8660 0653 06 8670 0654 EA26 .DBYTE CMDERR+OFFSET 8680 0656 10 L112A .BYTE DCIN,ASMOPT,CMDERR-* 8680 0657 48 8680 0658 CE 8690 0659 EC3F L112D .DBYTE L0850+OFFSET 8700 065B ; 8710 065B ;OPCODE $03 XX YY ZZ 8720 065B ;XX IS RELATIVE BRANCH FOR DECIMAL NUMBER 8730 065B ;YY IS RELATIVE BRANCH FOR NOT DECIMAL 8740 065B ;NUMBER, NOT CAPITAL LETTER, AND NOT 8750 065B ;END OF LINE 8760 065B ;ZZ IS RELATIVE BRANCH FOR END OF LINE 8770 065B ;NO BRANCH TAKEN IF CAPITAL LETTER 8780 065B 16 L0626 .BYTE COPY,$00,$04 ;COPY POINTER 8780 065C 00 8780 065D 04 8790 065E 14 .BYTE DECR,$00 ;DECREMENT POINTER AT $00/$0 8790 065F 00 8800 0660 28 L062B .BYTE INC0 ;INC POINTER AT $00/$01 8810 0661 85 .BYTE CHK0+$20,L062B-* ;SKIP SPACES 8810 0662 FE 8820 0663 0F .BYTE SET0,$08 ;SET CHAR CHOUNT TO ZERO 8820 0664 08 8830 0665 16 .BYTE COPY,$00,$06 ;COPY POINTER TO $06/$07 8830 0666 00 8830 0667 06 8840 0668 E5 .BYTE CHK0+CAP,L0649-* ;BRANCH IF CAPITAL 8840 0669 0A 8850 066A E6 .BYTE CHK0+DCM,L0651-* ;BRANCH IF DECIMAL 8850 066B 0E 8860 066C 72 .BYTE CHK0+$0D,L065A-* ;BRANCH IF END OF L 8860 066D 12 8870 066E 16 .BYTE COPY,$00,$06 ;COPY POINTER TO $06/$07 8870 066F 00 8870 0670 06 8880 0671 ;THE FOLLOWING LINE IS ALMOST CERTAINLY ANOMOLOUS 8890 0671 ;SO IT HAS BEEN COMMENTED OUT. 8900 0671 ;.BYTE COPY,PRFLAG,$08 ;COPY FROM $F0/$F1 TO $08/$ 8910 0671 28 .BYTE INC0 ;INCREMENT POINTER AT $00/$01 8920 0672 25 .BYTE RET3 ;RETURN - 3RD BYTE OF CALL IS OF 8930 0673 ;CAPITAL LETTER FOUND 8940 0673 28 L0649 .BYTE INC0 8950 0674 13 .BYTE INCR,$08 8950 0675 08 8960 0676 E5 .BYTE CHK0+CAP,L0649-* 8960 0677 FC 8970 0678 11 .BYTE RETN 8980 0679 ;DECIMAL DIGIT FOUND 8990 0679 28 L0651 .BYTE INC0 9000 067A 13 .BYTE INCR,$08 9000 067B 08 9010 067C E6 .BYTE CHK0+DCM,L0651-* 9010 067D FC 9020 067E 12 .BYTE RET2 ;2ND BYTE OF CALL IS OFFSET 9030 067F ;END OF LINE FOUND 9040 067F 0E L065A .BYTE RET4 ;4TH BYTE OF CALL IS OFFSET 9050 0680 ;'I' COMMAND 9060 0680 1E LICMD .BYTE MSLN,'INIZ?',$00 9060 0681 49 9060 0682 4E 9060 0683 49 9060 0684 5A 9060 0685 3F 9060 0686 00 9070 0687 0D .BYTE KBLN ;GET LINE OF KEYBOARD INPUT 9080 0688 16 .BYTE COPY,STTEXT,$10 9080 0689 16 9080 068A 10 9090 068B 0F .BYTE SET0,LINLEN 9090 068C 12 9100 068D BE .BYTE CHK0+'Y,L068A-* 9100 068E 02 9110 068F FD .BYTE $FD ;JMP TO L0620 9120 0690 16 L068A .BYTE COPY,STTEXT,ENDTXT 9120 0691 16 9120 0692 1A 9130 0693 FD .BYTE $FD ;JMP TO L0620 9140 0694 ;**************************** 9150 0694 ;LINE NUMBER FOUND ON COMMAND LINE. 9160 0694 ;INPUT DECIMAL NUMBER TO $36/$37. 9170 0694 ;GO TO L06F3 IF TOO BIG. 9180 0694 10 L0690 .BYTE DCIN,$36,L06F3-* 9180 0695 36 9180 0696 5D 9190 0697 0C .BYTE COMP ;COMPRESS REST OF LINE 9200 0698 21 .BYTE ADDZ,$0E,CONST2,$0E 9200 0699 0E 9200 069A 74 9200 069B 0E 9210 069C 4B .BYTE BEQU,$36,CONST0,L06B1-* 9210 069D 36 9210 069E 2C 9210 069F 12 9220 06A0 6B .BYTE BGEQ,$36,LINENO,L06A3-* 9220 06A1 36 9220 06A2 14 9220 06A3 02 9230 06A4 02 .BYTE LIN1 9240 06A5 6B L06A3 .BYTE BGEQ,LINENO,$36,L06AC-* 9240 06A6 14 9240 06A7 36 9240 06A8 05 9250 06A9 00 .BYTE NXLN,L06B1-* 9250 06AA 07 9260 06AB EAA5 .DBYTE L06A3+OFFSET 9270 06AD 4B L06AC .BYTE BEQU,LINENO,$36,L06B4-* 9270 06AE 14 9270 06AF 36 9270 06B0 03 9280 06B1 0F L06B1 .BYTE SET0,LINLEN 9280 06B2 12 9290 06B3 21 L06B4 .BYTE ADDZ,TXTPOS,$0E,$1C 9290 06B4 10 9290 06B5 0E 9290 06B6 1C 9300 06B7 21 .BYTE ADDZ,TXTPOS,LINLEN,DRTYPE 9300 06B8 10 9300 06B9 12 9300 06BA 1E 9310 06BB 20 .BYTE SUBZ,ENDTXT,DRTYPE,$20 9310 06BC 1A 9310 06BD 1E 9310 06BE 20 9320 06BF 21 .BYTE ADDZ,$1C,$20,$22 9320 06C0 1C 9320 06C1 20 9320 06C2 22 9330 06C3 2B .BYTE BRGR,$22,ENDMEM,L06EA-* 9330 06C4 22 9330 06C5 18 9330 06C6 25 9340 06C7 01 .BYTE BMOV,$20,DRTYPE,$1C 9340 06C8 20 9340 06C9 1E 9340 06CA 1C 9350 06CB 20 .BYTE SUBZ,$0E,CONST2,$1C 9350 06CC 0E 9350 06CD 74 9350 06CE 1C 9360 06CF 21 .BYTE ADDZ,TXTPOS,CONST2,DRTYPE 9360 06D0 10 9360 06D1 74 9360 06D2 1E 9370 06D3 01 .BYTE BMOV,$1C,$00,DRTYPE 9370 06D4 1C 9370 06D5 00 9370 06D6 1E 9380 06D7 4B .BYTE BEQU,$36,CONST0,L05DB-* 9380 06D8 36 9380 06D9 2C 9380 06DA 04 9390 06DB 16 .BYTE COPY,$36,LINENO 9390 06DC 36 9390 06DD 14 9400 06DE 01 L05DB .BYTE BMOV,CONST2,$3A,TXTPOS 9400 06DF 74 9400 06E0 3A 9400 06E1 10 9410 06E2 16 .BYTE COPY,$0E,LINLEN 9410 06E3 0E 9410 06E4 12 9420 06E5 16 .BYTE COPY,$22,ENDTXT 9420 06E6 22 9420 06E7 1A 9430 06E8 00 .BYTE NXLN,L06E8-* 9430 06E9 01 9440 06EA FD L06E8 .BYTE $FD ;JMP TO L0620 9450 06EB 1E L06EA .BYTE MSLN,'*FULL',$0D 9450 06EC 2A 9450 06ED 46 9450 06EE 55 9450 06EF 4C 9450 06F0 4C 9450 06F1 0D 9460 06F2 FD .BYTE $FD ;JMP TO L0620 9470 06F3 1F L06F3 .BYTE PER6,'#TOO BIG',$0D 9470 06F4 23 9470 06F5 54 9470 06F6 4F 9470 06F7 4F 9470 06F8 20 9470 06F9 42 9470 06FA 49 9470 06FB 47 9470 06FC 0D 9480 06FD FD .BYTE $FD ;JMP TO L0620 9490 06FE ; 9500 06FE ;OPCODE $04 - INSTRUCTION LENGTH = 2 9510 06FE ;SECOND BYTE IS AN OFFSET 9520 06FE 0F L0700 .BYTE SET0,$1C 9520 06FF 1C 9530 0700 16 .BYTE COPY,$2E,DRTYPE 9530 0701 2E 9530 0702 1E 9540 0703 03 .BYTE CLAS,L070C-*,L071C-*,L074E-* 9540 0704 07 9540 0705 18 9540 0706 41 9550 0707 16 .BYTE COPY,$04,$00 9550 0708 04 9550 0709 00 9560 070A 12 .BYTE RET2 ;2ND BYTE OF CALL IS BRANCH 9570 070B 10 L070C .BYTE DCIN,$1C,L0741-* 9570 070C 1C 9570 070D 30 9580 070E 03 .BYTE CLAS,L073B-*,L0721-*,L0718-* 9580 070F 29 9580 0710 11 9580 0711 08 9590 0712 16 .BYTE COPY,$1C,DRTYPE ;COPY $1C/$1D INTO D 9590 0713 1C 9590 0714 1E 9600 0715 16 L0716 .BYTE COPY,$04,$00 9600 0716 04 9600 0717 00 9610 0718 11 L0717 .BYTE RETN 9620 0719 16 L0718 .BYTE COPY,$1C,DRTYPE 9620 071A 1C 9620 071B 1E 9630 071C 11 .BYTE RETN 9640 071D 3D L071C .BYTE CHK6+'-,L0729-* 9640 071E 09 9650 071F EB38 .DBYTE L073B+OFFSET 9660 0721 3D L0721 .BYTE CHK6+'-,L0729-* ;GO TO L0729 IF DAS 9660 0722 05 9670 0723 3C .BYTE CHK6+',,L0718-* ;GO TO L0718 IF COM 9670 0724 F5 9680 0725 EB38 .DBYTE L073B+OFFSET 9690 0727 03 L0729 .BYTE CLAS,L072F-*,L0738-*,L0717-* 9690 0728 05 9690 0729 0D 9690 072A EE 9700 072B EB15 .DBYTE L0716+OFFSET 9710 072D 10 L072F .BYTE DCIN,DRTYPE,L0741-* ;READ DECIMAL N 9710 072E 1E 9710 072F 0E 9720 0730 03 .BYTE CLAS,L073B-*,L0738-*,L0717-* 9720 0731 07 9720 0732 04 9720 0733 E5 9730 0734 EB15 .DBYTE L0716+OFFSET 9740 0736 3C L0738 .BYTE CHK6+',,L0717-* 9740 0737 E1 9750 0738 1F L073B .BYTE PER6,'??',$0D 9750 0739 3F 9750 073A 3F 9750 073B 0D 9760 073C 12 .BYTE RET2 9770 073D 1F L0741 .BYTE PER6,'#TOO BIG',$0D 9770 073E 23 9770 073F 54 9770 0740 4F 9770 0741 4F 9770 0742 20 9770 0743 42 9770 0744 49 9770 0745 47 9770 0746 0D 9780 0747 12 L074E .BYTE RET2 ;2ND BYTE OF CALL IS BRANCH 9790 0748 ;'P' COMMAND 9800 0748 04 L0750 .BYTE LRAN,L0752-* 9800 0749 01 9810 074A 1E L0752 .BYTE MSLN,$0D 9810 074B 0D 9820 074C 02 L0754 .BYTE LIN1 9830 074D 4B .BYTE BEQU,TXTPOS,ENDTXT,L0778-* 9830 074E 10 9830 074F 1A 9830 0750 71 9840 0751 6B L075A .BYTE BGEQ,LINENO,$1C,L0763-* 9840 0752 14 9840 0753 1C 9840 0754 05 9850 0755 00 .BYTE NXLN,L0768-* 9850 0756 07 9860 0757 EB51 .DBYTE L075A+OFFSET 9870 0759 CB L0763 .BYTE BLEQ,LINENO,DRTYPE,L076C-* 9870 075A 14 9870 075B 1E 9870 075C 05 9880 075D 04 L0768 .BYTE LRAN,L0778-* 9880 075E 63 9890 075F EB4C .DBYTE L0754+OFFSET 9900 0761 19 L076C .BYTE PDEC,LINENO 9900 0762 14 9910 0763 21 .BYTE ADDZ,TXTPOS,CONST2,$20 9910 0764 10 9910 0765 74 9910 0766 20 9920 0767 1B .BYTE PLIN,$20 9920 0768 20 9930 0769 00 .BYTE NXLN,L0768-* 9930 076A F3 9940 076B EB59 .DBYTE L0763+OFFSET 9950 076D LEN1=$1000-OF6502 9960 076D LEN2=$2000-OF6502 9970 076D LEN3=$3000-OF6502 9980 076D LEN4=$4000-OF6502 9990 076D LENF=$F000-OF6502 10000 076D OP00=L047C+LEN2 10010 076D OP01=L04C0+LEN4 10020 076D OP02=L03D4+LEN1 10030 076D OP03=L0626+LEN4 10040 076D OP04=L0700+LEN2 10050 076D OP05=L0961+LEN1 10060 076D OP06=L0989+LEN4 10070 076D OP07=L0985+LEN4 10080 076D OP08=L10B3+LEN1 10090 076D OP09=L0C30+LEN2 10100 076D OP0A=L0AF0+LEN2 10110 076D OP0B=L03A0+LEN4 10120 076D OP0C=L0440+LEN1 10130 076D OP0D=L0205+LEN1 10140 076D OP0E=OP1203+LEN1 10150 076D OP0F=CODE0F+LEN2 10160 076D OP10=L0300+LEN3 10170 076D OP11=L02BC+LEN1 10180 076D OP12=OP1201+LEN1 10190 076D OP13=L02D0+LEN2 10200 076D OP14=L02DC+LEN2 10210 076D OP15=EX6502+LEN1 10220 076D OP16=L0270+LEN3 10230 076D OP17=L0BE5+LEN2 10240 076D OP18=L0965+LEN2 10250 076D OP19=L0590+LEN2 10260 076D OP1A=L029C+LEN3 10270 076D OP1B=L0500+LEN2 10280 076D OP1C=L0BC5+LEN3 10290 076D OP1D=L0363+LENF 10300 076D OP1E=L037D+LENF 10310 076D OP1F=L03EC+LENF 10320 076D OP20=L0419+LEN4 10330 076D OP21=L0400+LEN4 10340 076D OP22=L04AF+LEN2 10350 076D OP23=L0A60+LEN1 10360 076D OP24=L0380+LENF 10370 076D OP25=OP1202+LEN1 10380 076D OP26=L0240+LEN2 10390 076D OP27=L0244+LEN2 10400 076D OP28=L11CE+LEN1 10410 076D OP29=CODE29+LEN2 10420 076D ;ADDRESSES FOR OPCODE ROUTINES 10430 076D ;OPCODES ALLOWED ARE 00 TO 27 INCLUSIVE 10440 076D ;MSB MAY BE SET, INDICATING P-CODE SUBROUTINE 10450 076D B2 ADDRLO .BYTE OP00,OP01,OP02,OP03 10450 076E EA 10450 076F C1 10450 0770 5B 10460 0771 FE .BYTE OP04,OP05,OP06,OP07 10460 0772 0E 10460 0773 58 10460 0774 55 10470 0775 C8 .BYTE OP08,OP09,OP0A,OP0B 10470 0776 72 10470 0777 D3 10470 0778 2D 10480 0779 73 .BYTE OP0C,OP0D,OP0E,OP0F 10480 077A EE 10480 077B 27 10480 077C 6E 10490 077D B2 .BYTE OP10,OP11,OP12,OP13 10490 077E 2A 10490 077F 29 10490 0780 C0 10500 0781 BC .BYTE OP14,OP15,OP16,OP17 10500 0782 A1 10500 0783 69 10500 0784 69 10510 0785 11 .BYTE OP18,OP19,OP1A,OP1B 10510 0786 5A 10510 0787 81 10510 0788 32 10520 0789 D6 .BYTE OP1C,OP1D,OP1E,OP1F 10520 078A FE 10520 078B 17 10520 078C F9 10530 078D 52 .BYTE OP20,OP21,OP22,OP23 10530 078E 54 10530 078F AA 10530 0790 71 10540 0791 1A .BYTE OP24,OP25,OP26,OP27 10540 0792 28 10540 0793 18 10540 0794 13 10550 0795 C1 .BYTE OP28,OP29 10550 0796 71 10560 0797 22 ADDRHI .BYTE OP00/256,OP01/256 10560 0798 42 10570 0799 12 .BYTE OP02/256,OP03/256 10570 079A 44 10580 079B 24 .BYTE OP04/256,OP05/256 10580 079C 17 10590 079D 47 .BYTE OP06/256,OP07/256 10590 079E 47 10600 079F 1B .BYTE OP08/256,OP09/256 10600 07A0 29 10610 07A1 28 .BYTE OP0A/256,OP0B/256 10610 07A2 42 10620 07A3 12 .BYTE OP0C/256,OP0D/256 10620 07A4 10 10630 07A5 11 .BYTE OP0E/256,OP0F/256 10630 07A6 21 10640 07A7 31 .BYTE OP10/256,OP11/256 10640 07A8 11 10650 07A9 11 .BYTE OP12/256,OP13/256 10650 07AA 20 10660 07AB 20 .BYTE OP14/256,OP15/256 10660 07AC 11 10670 07AD 31 .BYTE OP16/256,OP17/256 10670 07AE 29 10680 07AF 27 .BYTE OP18/256,OP19/256 10680 07B0 23 10690 07B1 31 .BYTE OP1A/256,OP1B/256 10690 07B2 23 10700 07B3 31 .BYTE OP1C/256,OP1D/256 10700 07B4 F1 10710 07B5 F2 .BYTE OP1E/256,OP1F/256 10710 07B6 F1 10720 07B7 42 .BYTE OP20/256,OP21/256 10720 07B8 42 10730 07B9 21 .BYTE OP22/256,OP23/256 10730 07BA 18 10740 07BB F2 .BYTE OP24/256,OP25/256 10740 07BC 11 10750 07BD 21 .BYTE OP26/256,OP27/256 10750 07BE 21 10760 07BF 10 .BYTE OP28/256,OP29/256 10760 07C0 21 10770 07C1 EA14 L0778 .DBYTE L0601+OFFSET 10780 07C3 04 L07D0 .BYTE LRAN,L0807-* 10780 07C4 32 10790 07C5 0F L07D2 .BYTE SET0,$22 10790 07C6 22 10800 07C7 02 .BYTE LIN1 10810 07C8 6B L07DB .BYTE BGEQ,LINENO,$1C,L07E4-* 10810 07C9 14 10810 07CA 1C 10810 07CB 05 10820 07CC 00 .BYTE NXLN,L0811-* 10820 07CD 33 10830 07CE EBC8 .DBYTE L07DB+OFFSET 10840 07D0 16 L07E4 .BYTE COPY,TXTPOS,$1C 10840 07D1 10 10840 07D2 1C 10850 07D3 2B L07E7 .BYTE BRGR,LINENO,DRTYPE,L07F0-* 10850 07D4 14 10850 07D5 1E 10850 07D6 0B 10860 07D7 13 .BYTE INCR,$22 10860 07D8 22 10870 07D9 21 .BYTE ADDZ,TXTPOS,LINLEN,$20 10870 07DA 10 10870 07DB 12 10870 07DC 20 10880 07DD 00 .BYTE NXLN,L07F0-* 10880 07DE 03 10890 07DF EBD3 .DBYTE L07E7+OFFSET 10900 07E1 20 L07F0 .BYTE SUBZ,ENDTXT,$20,DRTYPE 10900 07E2 1A 10900 07E3 20 10900 07E4 1E 10910 07E5 4B .BYTE BEQU,$22,CONST0,L0811-* 10910 07E6 22 10910 07E7 2C 10910 07E8 18 10920 07E9 01 .BYTE BMOV,DRTYPE,$20,$1C 10920 07EA 1E 10920 07EB 20 10920 07EC 1C 10930 07ED 21 .BYTE ADDZ,$1C,DRTYPE,ENDTXT 10930 07EE 1C 10930 07EF 1E 10930 07F0 1A 10940 07F1 02 .BYTE LIN1 10950 07F2 04 .BYTE LRAN,L0778-* 10950 07F3 CE 10960 07F4 EBC5 .DBYTE L07D2+OFFSET 10970 07F6 1F L0807 .BYTE PER6,'LINES?',$0D 10970 07F7 4C 10970 07F8 49 10970 07F9 4E 10970 07FA 45 10970 07FB 53 10970 07FC 3F 10970 07FD 0D 10980 07FE EC11 .DBYTE L0822+OFFSET 10990 0800 1F L0811 .BYTE PER6,'NO SUCH LINE(S)',$0D 10990 0801 4E 10990 0802 4F 10990 0803 20 10990 0804 53 10990 0805 55 10990 0806 43 10990 0807 48 10990 0808 20 10990 0809 4C 10990 080A 49 10990 080B 4E 10990 080C 45 10990 080D 28 10990 080E 53 10990 080F 29 10990 0810 0D 11000 0811 FD L0822 .BYTE $FD ;JMP TO L0620 11010 0812 28 L084A .BYTE INC0 11020 0813 0A .BYTE RLBL,L1153-* 11020 0814 05 11030 0815 ;ERROR 26 - ILLEGAL DIRECTIVE 11040 0815 18 L114F .BYTE RERR,$1A 11040 0816 1A 11050 0817 F330 .DBYTE L10A7+OFFSET 11060 0819 F318 L1153 .DBYTE L104E+OFFSET 11070 081B 0F L084D .BYTE SET0,INSTLN 11070 081C 4C 11080 081D 28 .BYTE INC0 11090 081E 05 .BYTE SKIP ;SKIP SPACES 11100 081F A2 .BYTE CHK0+'=,L100C-* 11100 0820 02 11110 0821 FA .BYTE $FA ;JMP TO L08B7 11120 0822 28 L100C .BYTE INC0 11130 0823 05 .BYTE SKIP ;SKIP SPACES 11140 0824 09 .BYTE EXPR,L1023-* 11140 0825 10 11150 0826 E7 .BYTE CHK0+SPC,L1017-* 11150 0827 02 11160 0828 FE .BYTE $FE ;JMP TO L08E6 11170 0829 15 L1017 .BYTE EX65 11180 082A A93F LDA #$3F 11190 082C 24ED BIT $ED 11200 082E F006 BEQ L1025 11210 0830 20D202 JSR L11DC ;EXECUTE P-CODE 11220 0833 ;ERROR 4 - FWD REF IN EQUATE DIRECTIVE 11230 0833 18 .BYTE RERR,$84 11230 0834 84 11240 0835 FF L1023 .BYTE $FF ;JMP TO LINOUT 11250 0836 20D202 L1025 JSR L11DC ;EXECUTE P-CODE 11260 0839 29 .BYTE SET1,ASMBRK 11260 083A 3E 11270 083B 16 .BYTE COPY,NUMVAL,ASMADR 11270 083C 6A 11270 083D 44 11280 083E FF .BYTE $FF ;JMP TO LINOUT 11290 083F ; 11300 083F ;'A' COMMAND - ASMOPT HAS ALREADY BEEN 11310 083F ;SET UP. 11320 083F 0F L0850 .BYTE SET0,$7C 11320 0840 7C 11330 0841 16 .BYTE COPY,ENDMEM,LABTBL ;CLEAR LABEL TABL 11330 0842 18 11330 0843 0A 11340 0844 29 .BYTE SET1,PASS 11340 0845 40 11350 0846 ;START NEXT PASS OF ASSEMBLY 11360 0846 0F NXTPAS .BYTE SET0,ASMADR 11360 0847 44 11370 0848 02 .BYTE LIN1 ;GET FIRST LINE OF SOURCE CODE 11380 0849 0F L085D .BYTE SET0,PRFLAG ;LINE NOT YET PRINTED 11380 084A F0 11390 084B 0F .BYTE SET0,NUMERR ;NO ERRORS SO FAR 11390 084C E2 11400 084D 23 .BYTE DCMP ;DECOMPRESS TEXT AT TXTPOS/TXTP 11410 084E 16 .BYTE COPY,$02,$00 ;MOVE POINTER FOR LINE 11410 084F 02 11410 0850 00 11420 0851 ;SET DEFAULT INSTRUCTION TO 3 NOP BYTES 11430 0851 16 .BYTE COPY,CONST3,INSTLN 11430 0852 4A 11430 0853 4C 11440 0854 16 .BYTE COPY,NOPBYT,INSTRN 11440 0855 4E 11440 0856 50 11450 0857 16 .BYTE COPY,NOPBYT,INSTRN+2 11450 0858 4E 11450 0859 52 11460 085A 0F .BYTE SET0,$54 11460 085B 54 11470 085C 05 .BYTE SKIP ;SKIP SPACES 11480 085D 72 .BYTE CHK0+$0D,L08C6-* 11480 085E 40 11490 085F A0 .BYTE CHK0+';,L08AD-* 11490 0860 26 11500 0861 8F .BYTE CHK0+'*,L084D-* 11500 0862 B9 11510 0863 93 .BYTE CHK0+'.,L084A-* ;PROCESS DIRECTIVE 11510 0864 AE 11520 0865 0A .BYTE RLBL,L0887-* 11520 0866 04 11530 0867 ;ERROR 9 - LABEL DOESN'T BEGIN WITH LETTER 11540 0867 18 .BYTE RERR,$09 11540 0868 09 11550 0869 FF .BYTE $FF ;JMP TO LINOUT 11560 086A 06 L0887 .BYTE LVAL,L08AB-*,L08BB-*,L088C-* 11560 086B 19 11560 086C 24 11560 086D 01 11570 086E 29 L088C .BYTE SET1,$54 11570 086F 54 11580 0870 85 .BYTE CHK0+$20,L0894-* 11580 0871 03 11590 0872 EC79 .DBYTE L089A+OFFSET 11600 0874 05 L0894 .BYTE SKIP ;SKIP SPACES 11610 0875 0A .BYTE RLBL,L08B2-* 11610 0876 13 11620 0877 93 .BYTE CHK0+'.,L084A-* 11620 0878 9A 11630 0879 8F L089A .BYTE CHK0+'*,L084D-* 11630 087A A1 11640 087B A2 .BYTE CHK0+'=,L08A8-* 11640 087C 06 11650 087D A0 .BYTE CHK0+';,L08AD-* 11650 087E 08 11660 087F 72 .BYTE CHK0+$0D,L08AD-* 11660 0880 06 11670 0881 FA .BYTE $FA ;JMP TO L08B7 11680 0882 F2FA L08A8 .DBYTE L1028+OFFSET 11690 0884 ;ERROR 1 - 'A' IS A RESERVED NAME 11700 0884 18 L08AB .BYTE RERR,$01 11700 0885 01 11710 0886 0F L08AD .BYTE SET0,INSTLN 11710 0887 4C 11720 0888 FF .BYTE $FF ;JMP TO LINOUT 11730 0889 07 L08B2 .BYTE LEXP,L08B7-*,L08BB-*,L08B7-* 11730 088A 03 11730 088B 05 11730 088C 01 11740 088D ;ERROR 6 - ILLEGAL OR MISSING OPCODE 11750 088D 18 L08B7 .BYTE RERR,$06 11750 088E 06 11760 088F FF .BYTE $FF ;JMP TO LINOUT 11770 0890 E7 L08BB .BYTE CHK0+SPC,L08C0-* 11770 0891 08 11780 0892 FA .BYTE $FA ;JMP TO L08B7 11790 0893 29 L0EBC .BYTE SET1,INSTLN 11790 0894 4C 11800 0895 16 .BYTE COPY,$20,INSTRN 11800 0896 20 11800 0897 50 11810 0898 FF .BYTE $FF ;JMP TO LINOUT 11820 0899 4B L08C0 .BYTE BEQU,DRTYPE,CONST0,L0EBC-* 11820 089A 1E 11820 089B 2C 11820 089C F7 11830 089D 05 .BYTE SKIP ;SKIP SPACES 11840 089E 72 L08C6 .BYTE CHK0+$0D,L090C-* 11840 089F 36 11850 08A0 88 .BYTE CHK0+'#,IMMADR-* 11850 08A1 11 11860 08A2 8D .BYTE CHK0+'(,INDADR-* 11860 08A3 1F 11870 08A4 16 .BYTE COPY,CNST80,$56 11870 08A5 58 11870 08A6 56 11880 08A7 A6 .BYTE CHK0+'A,L0950-* 11880 08A8 5E 11890 08A9 09 L08D5 .BYTE EXPR,L08F4-* 11890 08AA 17 11900 08AB 91 .BYTE CHK0+',,L0934-* 11900 08AC 46 11910 08AD 16 .BYTE COPY,$5A,$56 11910 08AE 5A 11910 08AF 56 11920 08B0 ED01 .DBYTE L0948+OFFSET 11930 08B2 ; 11940 08B2 ;PROCESS IMMEDIATE ADDRESSING 11950 08B2 28 IMMADR .BYTE INC0 11960 08B3 09 .BYTE EXPR,L08F4-* ;GET EXPRESSION 11960 08B4 0D 11970 08B5 E7 .BYTE CHK0+SPC,L08EA-* 11970 08B6 04 11980 08B7 ;ERROR 7 - INVALID EXPRESSION 11990 08B7 18 L08E6 .BYTE RERR,$07 11990 08B8 07 12000 08B9 FF .BYTE $FF ;JMP TO LINOUT 12010 08BA 16 L08EA .BYTE COPY,$5C,$56 12010 08BB 5C 12010 08BC 56 12020 08BD 14 .BYTE DECR,INSTLN ;INSTR LEN = 2 12020 08BE 4C 12030 08BF F053 .DBYTE L0D3D+OFFSET 12040 08C1 FF L08F4 .BYTE $FF ;JMP TO LINOUT 12050 08C2 28 INDADR .BYTE INC0 12060 08C3 09 .BYTE EXPR,L08F4-* 12060 08C4 FD 12070 08C5 91 .BYTE CHK0+',,L0902-* 12070 08C6 04 12080 08C7 8E .BYTE CHK0+'),L0920-* 12080 08C8 1B 12090 08C9 FE .BYTE $FE ;JMP TO L08E6 12100 08CA 28 L0902 .BYTE INC0 12110 08CB BD .BYTE CHK0+'X,L0909-* 12110 08CC 02 12120 08CD FE .BYTE $FE ;JMP TO L08E6 12130 08CE 16 L0909 .BYTE COPY,$5E,$56 12130 08CF 5E 12130 08D0 56 12140 08D1 28 .BYTE INC0 12150 08D2 8E .BYTE CHK0+'),L0910-* 12150 08D3 05 12160 08D4 FE .BYTE $FE ;JMP TO L08E6 12170 08D5 ;ERROR 15 - RAN OFF END OF LINE 12180 08D5 18 L090C .BYTE RERR,$0F 12180 08D6 0F 12190 08D7 FF .BYTE $FF ;JMP TO LINOUT 12200 08D8 28 L0910 .BYTE INC0 12210 08D9 E7 .BYTE CHK0+SPC,L0917-* 12210 08DA 02 12220 08DB FE .BYTE $FE ;JMP TO L08E6 12230 08DC 8B L0917 .BYTE BLES,NUMVAL,CONST1-1,L094D-* 12230 08DD 6A 12230 08DE 41 12230 08DF 25 12240 08E0 ;ERROR 13 - OUT OF BOUND INDIRECT ADDR 12250 08E0 18 .BYTE RERR,$0D 12250 08E1 0D 12260 08E2 FF .BYTE $FF ;JMP TO LINOUT 12270 08E3 28 L0920 .BYTE INC0 12280 08E4 91 .BYTE CHK0+',,L092A-* 12280 08E5 06 12290 08E6 16 .BYTE COPY,$62,$56 12290 08E7 62 12290 08E8 56 12300 08E9 ED01 .DBYTE L0948+OFFSET 12310 08EB 28 L092A .BYTE INC0 12320 08EC 16 .BYTE COPY,$60,$56 12320 08ED 60 12320 08EE 56 12330 08EF BE .BYTE CHK0+'Y,L0910-* 12330 08F0 E8 12340 08F1 FE .BYTE $FE ;JMP TO L08E6 12350 08F2 28 L0934 .BYTE INC0 12360 08F3 16 .BYTE COPY,$64,$56 12360 08F4 64 12360 08F5 56 12370 08F6 BD .BYTE CHK0+'X,L0946-* 12370 08F7 09 12380 08F8 16 .BYTE COPY,$66,$56 12380 08F9 66 12380 08FA 56 12390 08FB BE .BYTE CHK0+'Y,L0946-* 12390 08FC 04 12400 08FD ;ERROR 8 - INVALID INDEX - NOT X OR Y 12410 08FD 18 .BYTE RERR,$08 12410 08FE 08 12420 08FF FF .BYTE $FF ;JMP TO LINOUT 12430 0900 28 L0946 .BYTE INC0 12440 0901 E7 L0948 .BYTE CHK0+SPC,L094D-* 12440 0902 02 12450 0903 FE .BYTE $FE ;JMP TO L08E6 12460 0904 F053 L094D .DBYTE L0D3D+OFFSET 12470 0906 28 L0950 .BYTE INC0 12480 0907 E7 .BYTE CHK0+SPC,L094D-* 12480 0908 FC 12490 0909 14 .BYTE DECR,$00 12490 090A 00 12500 090B ECA9 .DBYTE L08D5+OFFSET 12510 090D ; 12520 090D ;OPCODE $05 - INSTRUCTION LENGTH = 1 12530 090D ;SKIP SPACES IN INPUT STREAM 12540 090D ;ENTRY POINT IS AT L0961 12550 090D 28 L095F .BYTE INC0 ;INCREMENT CHARACTER POINTER 12560 090E 85 L0961 .BYTE CHK0+$20,L095F-* 12560 090F FE 12570 0910 11 .BYTE RETN 12580 0911 ; 12590 0911 ;OPCODE $18 XX 12600 0911 ;TAKE RECORD OF ERROR NO XX PLUS TEXT POINTER ; 12610 0911 ;A MAXIMUM OF TWO SUCH RECORDS CAN BE KEPT 12620 0911 A6E2 L0965 LDX NUMERR 12630 0913 E002 CPX #2 12640 0915 F011 BEQ L0982 12650 0917 0A ASL A 12660 0918 A440 LDY PASS 12670 091A 88 DEY 12680 091B D002 BNE L0975 12690 091D 9009 BCC L0982 12700 091F 4A L0975 LSR A 12710 0920 95F6 STA ERRMSG,X 12720 0922 A500 LDA $00 12730 0924 95F8 STA ERRMSG+2,X 12740 0926 E6E2 INC NUMERR 12750 0928 4CCE02 L0982 JMP L11CF ;ADVANCE INTERPRETIVE POINTER AN 12760 092B ; 12770 092B ;ENTRY FOUND IN TABLE 12780 092B 8A L0A20 TXA 12790 092C 4A LSR A 12800 092D A8 TAY 12810 092E B9DD0E LDA INSTYP,Y 12820 0931 B004 BCS NOLSR 12830 0933 4A LSR A 12840 0934 4A LSR A 12850 0935 4A LSR A 12860 0936 4A LSR A 12870 0937 290F NOLSR AND #$0F 12880 0939 A8 TAY 12890 093A C00F CPY #$0F 12900 093C D004 BNE L0A2D ;BRANCH IF OPCODE MNEMONIC 12910 093E 20D202 JSR L11DC ;EXECUTE P-CODE 12920 0941 12 .BYTE RET2 ;2ND BYTE OF CALL IS BRANCH 12930 0942 ;OPCODE MNEMONIC FOUND 12940 0942 ;LOAD DRTYPE ACCORDING TO INSTR TYPE 12950 0942 B9E10C L0A2D LDA L0DD5,Y 12960 0945 851E STA DRTYPE 12970 0947 B9EF0C LDA L0DE3,Y 12980 094A 851F STA DRTYPE+1 12990 094C BDA30E LDA INSBAS-2,X ;GET OPCODE BASE 13000 094F 8520 STA $20 13010 0951 20D202 JSR L11DC ;EXECUTE P-CODE 13020 0954 25 .BYTE RET3 ;3RD BYTE OF CALL IS BRANCH 13030 0955 ; 13040 0955 ;OPCODE $07 - INSTRUCTION LENGTH = 5 13050 0955 ;SEARCH FOR LABEL, AS PART OF EXPRESSION 13060 0955 ;BYTES 2, 3, AND 4 ARE RELATIVE BRANCH OFFSETS 13070 0955 ;NO BRANCH: LABEL FOUND ;VALUE IN LABVAL 13080 0955 ;BYTE 2: A, X, Y, S, OR P HAS BEEN FOUND 13090 0955 ;BYTE 3: OPCODE MNEMONIC FOUND 13100 0955 ;BYTE 4: UNDEFINED LABEL 13110 0955 15 L0985 .BYTE EX65 13120 0956 88 DEY 13130 0957 24 .BYTE $24 13140 0958 ; 13150 0958 ;OPCODE $06 - INSTRUCTION LENGTH = 5 13160 0958 ;SEARCH FOR LABEL, AS L-VALUE 13170 0958 ;BYTES 2, 3, AND 4 ARE RELATIVE BRANCH OFFSETS 13180 0958 ;NO BRANCH: LABEL FOUND ;VALUE IN LABVAL 13190 0958 ;BYTE 2: A, X, Y, S, OR P HAS BEEN FOUND 13200 0958 ;BYTE 3: OPCODE MNEMONIC FOUND 13210 0958 ;BYTE 4: UNDEFINED LABEL 13220 0958 15 L0989 .BYTE EX65 13230 0959 8430 STY $30 ;1 FOR INSTRUCTION $06 AND 0 FOR $ 13240 095B 8632 STX $32 ;ASSUME LABEL DEFINED BY DEFAULT 13250 095D ;LABEL IS STORED IN 4 BYTES STARTING AT LABL40 13260 095D A56E LDA LABL40+2 13270 095F 056F ORA LABL40+3 13280 0961 D022 BNE L09B9 ;BRANCH IF LABEL 4 CHARS OR LONG 13290 0963 ;USE BINARY SEARCH TO FIND OPCODE 13300 0963 ;RECORDS ARE 4 BYTES EACH 13310 0963 ;TABLE HAS 63 RECORDS, ALTHOUGH NOT ALL ARE 13320 0963 ;PRESENT IN MNEMLO, INSBAS AND INSTYP. 13330 0963 ;$E4 CONTAINS CURRENT CHOP SIZE 13340 0963 A920 LDA #$20 13350 0965 85E4 STA $E4 13360 0967 ;ACC IS THE CURRENT INDEX INTO TABLE 13370 0967 ;$00 CANNOT OCCUR 13380 0967 46E4 L0997 LSR $E4 13390 0969 AA TAX 13400 096A BC680E LDY MNEMHI-1,X 13410 096D C46D CPY LABL40+1 13420 096F 900E BCC L09AE 13430 0971 D009 BNE L09AA 13440 0973 BC2F0E LDY MNEMLO-1,X 13450 0976 C46C CPY LABL40 13460 0978 9005 BCC L09AE 13470 097A F0AF BEQ L0A20 ;ENTRY FOUND IN TABLE 13480 097C E5E4 L09AA SBC $E4 13490 097E 2C .BYTE $2C 13500 097F 65E4 L09AE ADC $E4 13510 0981 A6E4 LDX $E4 13520 0983 D0E2 BNE L0997 13530 0985 ;LABEL IDENTIFIED - NOT OPCODE MNEMONIC 13540 0985 20D202 L09B9 JSR L11DC ;EXECUTE P-CODE 13550 0988 ;SUBTRACT CONSTANT OF 5 IN CONST5 13560 0988 ;FROM END OF AVAILABLE MEMORY IN ENDMEM 13570 0988 ;TO PRODUCE POINTER TO NEXT LABEL IN $0C/$0D 13580 0988 20 .BYTE SUBZ,ENDMEM,CONST5,$0C 13580 0989 18 13580 098A F2 13580 098B 0C 13590 098C 15 .BYTE EX65 13600 098D A50C L09C1 LDA $0C 13610 098F C50A CMP LABTBL 13620 0991 A50D LDA $0D 13630 0993 E50B SBC LABTBL+1 13640 0995 9056 BCC L0A41 ;BRANCH IF OFF END OF LABEL TABL 13650 0997 A56D LDA LABL40+1 13660 0999 D10C CMP ($0C),Y 13670 099B D021 BNE L09F3 ;GO TO NEXT ENTRY IF NO MATCH 13680 099D A56C LDA LABL40 13690 099F C10C CMP ($0C,X) 13700 09A1 D01B BNE L09F3 ;GO TO NEXT ENTRY IF NO MATCH 13710 09A3 A003 LDY #$03 13720 09A5 B10C LDA ($0C),Y 13730 09A7 C9FE CMP #$FE 13740 09A9 9008 BCC L09E8 13750 09AB ;LABEL NOT COMPLETELY DEFINED 13760 09AB 8532 STA $32 13770 09AD A005 LDY #$05 13780 09AF B10C LDA ($0C),Y 13790 09B1 A003 LDY #$03 13800 09B3 C56F L09E8 CMP LABL40+3 13810 09B5 D007 BNE L09F3 ;GO TO NEXT ENTRY IF NO MATCH 13820 09B7 88 DEY 13830 09B8 A56E LDA LABL40+2 13840 09BA D10C CMP ($0C),Y 13850 09BC F00C BEQ L0A02 13860 09BE ;GO TO PREVIOUS ENTRY IN LABEL TABLE 13870 09BE ;CONST6/$F5 CONTAINS CONSTANT OF 6 13880 09BE 20D202 L09F3 JSR L11DC ;EXECUTE P-CODE 13890 09C1 20 .BYTE SUBZ,$0C,CONST6,$0C 13890 09C2 0C 13890 09C3 F4 13890 09C4 0C 13900 09C5 15 .BYTE EX65 13910 09C6 8632 STX $32 ;ASSUME LABEL DEFINED BY DEFAULT 13920 09C8 D0C3 BNE L09C1 ;ALWAYS BRANCHES 13930 09CA ; 13940 09CA A532 L0A02 LDA $32 13950 09CC D05F BNE L0A47 ;BRANCH IF LABEL UNDEFINED 13960 09CE ;BRANCH IF LABEL IS PART OF R-VALUE 13970 09CE A530 LDA $30 13980 09D0 F04F BEQ L0A44 13990 09D2 ; 14000 09D2 ;LABEL FOUND AND IT'S AN L-VALUE 14010 09D2 ;IF IT'S NOT FOLLOWED BY AN '=' SIGN, 14020 09D2 ;CHECK ITS VALUE AGAINST PRESENT LOCATION 14030 09D2 20D202 JSR L11DC ;EXECUTE P-CODE 14040 09D5 21 .BYTE ADDZ,$0C,CONST4,$0C ;$0C/$0D POINTS 14040 09D6 0C 14040 09D7 EA 14040 09D8 0C 14050 09D9 03 L113C .BYTE CLAS,L1140-*,L1140-*,L1140-* 14050 09DA 03 14050 09DB 02 14050 09DC 01 14060 09DD 16 L1140 .BYTE COPY,$04,$00 14060 09DE 04 14060 09DF 00 14070 09E0 4D .BYTE CHK6+'=,L0A1F-* 14070 09E1 0B 14080 09E2 01 .BYTE BMOV,CONST2,$0C,CNST7E ;MOVE ADDR FI 14080 09E3 74 14080 09E4 0C 14080 09E5 78 14090 09E6 4B L0A18 .BYTE BEQU,ASMADR,LABVAL,L0A1F-* 14090 09E7 44 14090 09E8 7E 14090 09E9 03 14100 09EA ;ERROR IF ADDRESS FIELD NOT EQUAL TO ASMADR/ASMAD 14110 09EA ;"LABEL PREVIOUSLY DEFINED" 14120 09EA ;ERROR 12 - LABEL PREVIOUSLY DEFINED 14130 09EA 18 .BYTE RERR,$0C 14130 09EB 0C 14140 09EC 11 L0A1F .BYTE RETN 14150 09ED ; 14160 09ED ;CREATE NEW SYMBOL TABLE ENTRY OR 14170 09ED ;RECORD SYMBOL TABLE OVERFLOW 14180 09ED A57C L0A41 LDA $7C 14190 09EF D02C BNE L05F5 ;BRANCH IF TABLE ALREADY OVERFLO 14200 09F1 20D202 JSR L11DC ;EXECUTE P-CODE 14210 09F4 6B .BYTE BGEQ,$0C,ENDTXT,L0C22-* ;CHECK FOR 14210 09F5 0C 14210 09F6 1A 14210 09F7 06 14220 09F8 ;ERROR 25 - SYMBOL TABLE OVERFLOW 14230 09F8 18 .BYTE RERR,$99 14230 09F9 99 14240 09FA 29 .BYTE SET1,$7C ;SET SYM TABLE OVERFLOW FLA 14240 09FB 7C 14250 09FC 0E .BYTE RET4 ;RETURN - 4TH BYTE OF CALL IS O 14260 09FD 16 L0C22 .BYTE COPY,$0C,LABTBL ;UPDATE START OF TAB 14260 09FE 0C 14260 09FF 0A 14270 0A00 01 .BYTE BMOV,CONST4,CNST6C,$0C ;COPY UP BASE 14270 0A01 EA 14270 0A02 7A 14270 0A03 0C 14280 0A04 21 .BYTE ADDZ,$0C,CONST4,$32 14280 0A05 0C 14280 0A06 EA 14280 0A07 32 14290 0A08 01 .BYTE BMOV,CONST2,CNST44,$32 ;COPY UP VALU 14290 0A09 74 14290 0A0A D4 14290 0A0B 32 14300 0A0C 15 .BYTE EX65 14310 0A0D A530 LDA $30 14320 0A0F D00C BNE L05F5 ;RETURN IF L-VALUE ; 14330 0A11 ;LABEL IS PART OF R-VALUE SO MARK IT AS 14340 0A11 ;BEING UNDEFINED 14350 0A11 A56F LDA LABL40+3 14360 0A13 A005 LDY #$05 14370 0A15 910C STA ($0C),Y 14380 0A17 A9FF LDA #$FF 14390 0A19 A003 LDY #$03 14400 0A1B 910C STA ($0C),Y 14410 0A1D 20D202 L05F5 JSR L11DC ;EXECUTE P-CODE 14420 0A20 0E .BYTE RET4 ;RETURN - 4TH BYTE OF CALL IS O 14430 0A21 ;LABEL DEFINED, AND IS PART OF R-VALUE 14440 0A21 ;MOVE ADDRESS FIELD TO LABVAL 14450 0A21 20D202 L0A44 JSR L11DC ;EXECUTE P-CODE 14460 0A24 21 .BYTE ADDZ,$0C,CONST4,$0C 14460 0A25 0C 14460 0A26 EA 14460 0A27 0C 14470 0A28 01 .BYTE BMOV,CONST2,$0C,CNST7E 14470 0A29 74 14470 0A2A 0C 14470 0A2B 78 14480 0A2C 11 .BYTE RETN 14490 0A2D ;UNDEFINED LABEL FOUND IN LABEL TABLE 14500 0A2D A004 L0A47 LDY #$04 14510 0A2F A630 LDX $30 14520 0A31 F02B BEQ L0A50 ;BRANCH IF PART OF R-VALUE 14530 0A33 ;LABEL IS BEING CONSIDERED AS L-VALUE 14540 0A33 49FE EOR #$FE 14550 0A35 ;BRANCH IF UNDEFINED AND IT WAS PREVIOUSLY ONLY R 14560 0A35 D00B BNE L1210 14570 0A37 ;OTHERWISE IT'S IN ZERO PAGE 14580 0A37 857F STA $7F 14590 0A39 B10C LDA ($0C),Y 14600 0A3B 857E STA LABVAL 14610 0A3D 20D202 JSR L11DC ;EXECUTE P-CODE 14620 0A40 EDE6 .DBYTE L0A18+OFFSET ;CHECK IT'S NOT BEEN R 14630 0A42 A545 L1210 LDA ASMADR+1 14640 0A44 F010 BEQ L1224 ;BRANCH TO MARK IT AS ZERO PAGE 14650 0A46 C8 INY 14660 0A47 910C STA ($0C),Y 14670 0A49 88 DEY 14680 0A4A A544 LDA ASMADR 14690 0A4C 910C STA ($0C),Y 14700 0A4E A56F LDA LABL40+3 14710 0A50 88 L121E DEY 14720 0A51 910C STA ($0C),Y 14730 0A53 4C550B JMP L0B7B 14740 0A56 A544 L1224 LDA ASMADR 14750 0A58 910C STA ($0C),Y 14760 0A5A A9FE LDA #$FE 14770 0A5C D0F2 BNE L121E 14780 0A5E ;UNDEFINED LABEL IS R-VALUE 14790 0A5E 49FE L0A50 EOR #$FE 14800 0A60 D0BB BNE L05F5 ;EXIT IF IT'S NEVER BEEN R-VALUE 14810 0A62 857F STA $7F ;PUT ITS PAGE ZERO ADDRESS INTO $7 14820 0A64 B10C LDA ($0C),Y 14830 0A66 857E STA LABVAL 14840 0A68 A5ED LDA $ED ;SET FLAG TO INDICATE THAT THIS HA 14850 0A6A 0940 ORA #%01000000 14860 0A6C 85ED STA $ED 14870 0A6E 4C2A03 JMP L02BC ;RETURN FROM P-CODE SUBROUTINE 14880 0A71 ; 14890 0A71 ;OPCODE $23 - INSTRUCTION LENGTH = 1 14900 0A71 ;DECOMPRESS TEXT POINTED TO BY TXTPOS/TXTPOS+1, 14910 0A71 ;AND STORE IT STARTING FROM $02/$03 14920 0A71 86E4 L0A60 STX $E4 14930 0A73 C8 INY 14940 0A74 A2FF L0A63 LDX #$FF 14950 0A76 B110 LDA (TXTPOS),Y 14960 0A78 1003 BPL L0A6C 14970 0A7A AA TAX 14980 0A7B A528 LDA $28 14990 0A7D 84E5 L0A6C STY $E5 15000 0A7F A4E4 LDY $E4 15010 0A81 9102 L0A70 STA ($02),Y 15020 0A83 C8 INY 15030 0A84 E8 INX 15040 0A85 30FA BMI L0A70 15050 0A87 8528 STA $28 15060 0A89 84E4 STY $E4 15070 0A8B A4E5 LDY $E5 15080 0A8D C8 INY 15090 0A8E C90D CMP #$0D 15100 0A90 D0E2 BNE L0A63 15110 0A92 4CCE02 JMP L11CF ;GO TO NEXT INSTRUCTION 15120 0A95 ;*********************************** 15130 0A95 ;MULTIPLY SUBROUTINE 15140 0A95 ;16-BIT QUANTITIES IN ZERO PAGE POINTED TO 15150 0A95 ;BY A AND Y ARE MULTIPLIED TOGETHER, AND 15160 0A95 ;THE 16-BIT RESULT IS PUT INTO THE TWO 15170 0A95 ;LOCATIONS POINTED TO BY X. ALSO, THE 15180 0A95 ;16-BIT QUANTITY SPECIFIED BY TMPLOC+1(LO) AND 15190 0A95 ;$EC(HI) IS ADDED ON. Z FLAG CLEARED IF RESULT 15200 0A95 ;IS GREATER THAN $FFFF. 15210 0A95 86E5 L0A84 STX $E5 15220 0A97 AA TAX 15230 0A98 B500 LDA $00,X 15240 0A9A 85E8 STA $E8 15250 0A9C B501 LDA $01,X 15260 0A9E 4A LSR A 15270 0A9F 85E9 STA $E9 15280 0AA1 A910 LDA #$10 15290 0AA3 85E6 STA TMPLOC 15300 0AA5 46E8 LSR $E8 15310 0AA7 900F L0AA0 BCC L0AB1 15320 0AA9 18 CLC 15330 0AAA A5E7 LDA TMPLOC+1 15340 0AAC 790000 ADC $0000,Y 15350 0AAF 85E7 STA TMPLOC+1 15360 0AB1 A5EC LDA $EC 15370 0AB3 790100 ADC $0001,Y 15380 0AB6 85EC STA $EC 15390 0AB8 66EC L0AB1 ROR $EC 15400 0ABA 66E7 ROR TMPLOC+1 15410 0ABC 66E9 ROR $E9 15420 0ABE 66E8 ROR $E8 15430 0AC0 C6E6 DEC TMPLOC 15440 0AC2 D0E3 BNE L0AA0 15450 0AC4 A6E5 LDX $E5 15460 0AC6 A5E8 LDA $E8 15470 0AC8 9500 STA $00,X 15480 0ACA A5E9 LDA $E9 15490 0ACC 9501 STA $01,X 15500 0ACE ;CLEAR Z FLAG IF OVERFLOW 15510 0ACE A5E7 LDA TMPLOC+1 15520 0AD0 05EC ORA $EC 15530 0AD2 60 RTS 15540 0AD3 ; 15550 0AD3 ;OPCODE $0A - 2ND BYTE IS BRANCH OFFSET 15560 0AD3 15 L0AF0 .BYTE EX65 15570 0AD4 8A TXA 15580 0AD5 A204 LDX #$04 15590 0AD7 956B L0AF4 STA $6B,X 15600 0AD9 CA DEX 15610 0ADA D0FB BNE L0AF4 15620 0ADC 8527 STA $27 15630 0ADE 8529 STA $29 15640 0AE0 C8 INY 15650 0AE1 8446 STY $46 15660 0AE3 A96C LDA #LABL40 15670 0AE5 8547 STA $47 15680 0AE7 A000 L0B08 LDY #$00 15690 0AE9 B100 LDA ($00),Y 15700 0AEB DD590B L0B0C CMP L0B80,X 15710 0AEE 305E BMI L0B14 15720 0AF0 DD5D0B CMP L0B85,X 15730 0AF3 1059 BPL L0B14 15740 0AF5 A427 LDY $27 15750 0AF7 C006 CPY #$06 15760 0AF9 B039 BCS L0B61 15770 0AFB FD610B SBC L0B8A,X 15780 0AFE 8528 STA $28 15790 0B00 A647 LDX $47 15800 0B02 A446 LDY $46 15810 0B04 D013 BNE L0B48 15820 0B06 18 CLC 15830 0B07 7500 ADC $00,X 15840 0B09 9500 STA $00,X 15850 0B0B 9002 BCC L1264 15860 0B0D F601 INC $01,X 15870 0B0F E647 L1264 INC $47 15880 0B11 E647 INC $47 15890 0B13 A902 LDA #$02 15900 0B15 8546 STA $46 15910 0B17 D01B BNE L0B61 15920 0B19 B500 L0B48 LDA $00,X ;SET UP EXISTING TOTAL 15930 0B1B 85E7 STA TMPLOC+1 15940 0B1D B501 LDA $01,X 15950 0B1F 85EC STA $EC 15960 0B21 B9640B LDA L0B8F-1,Y ;SET UP MULTIPLIER (Y=1 OR 2 15970 0B24 85E8 STA $E8 15980 0B26 B9660B LDA L0B91-1,Y 15990 0B29 85E9 STA $E9 16000 0B2B A9E8 LDA #$E8 ;POINTER TO MULTIPLIER 16010 0B2D A028 LDY #$28 ;POINTER TO ENCODED CHARACTER 16020 0B2F 20950A JSR L0A84 ;MULTIPLY 16030 0B32 C646 DEC $46 16040 0B34 E600 L0B61 INC $00 16050 0B36 D002 BNE L0B67 16060 0B38 E601 INC $01 16070 0B3A E627 L0B67 INC $27 16080 0B3C A203 LDX #$03 16090 0B3E D0A7 BNE L0B08 ;ALWAYS BRANCHES 16100 0B40 C907 L0B6B CMP #$07 16110 0B42 1004 BPL L0B74 16120 0B44 20D202 JSR L11DC ;EXECUTE P-CODE 16130 0B47 12 .BYTE RET2 ;RETURN - 2ND BYTE OF CALL IS O 16140 0B48 20D202 L0B74 JSR L11DC 16150 0B4B ;ERROR 10 - LABEL LONGER THAN 6 CHARS 16160 0B4B 18 .BYTE RERR,$0A 16160 0B4C 0A 16170 0B4D 12 .BYTE RET2 ;RETURN - 2ND BYTE OF CALL IS O 16180 0B4E CA L0B14 DEX 16190 0B4F 109A BPL L0B0C 16200 0B51 A527 LDA $27 16210 0B53 D0EB BNE L0B6B 16220 0B55 20D202 L0B7B JSR L11DC 16230 0B58 11 .BYTE RETN 16240 0B59 41 L0B80 .BYTE $41,$30,$2E,$24 16240 0B5A 30 16240 0B5B 2E 16240 0B5C 24 16250 0B5D 5B L0B85 .BYTE $5B,$3B,$2F,$25 16250 0B5E 3B 16250 0B5F 2F 16250 0B60 25 16260 0B61 3F L0B8A .BYTE $3F,$14,$07,$FC 16260 0B62 14 16260 0B63 07 16260 0B64 FC 16270 0B65 28 L0B8F .BYTE $28,$40 16270 0B66 40 16280 0B67 00 L0B91 .BYTE $00,$06 16280 0B68 06 16290 0B69 ; 16300 0B69 ;OPCODE $17 XX - PRINT CONTENTS OF LOCATION 16310 0B69 ;XX AS 2-DIGIT HEX NUMBER 16320 0B69 AA L0BE5 TAX 16330 0B6A B500 LDA $00,X 16340 0B6C 20340D JSR HEXOUT 16350 0B6F ;ADVANCE IP AND MOVE TO NEXT INSTR 16360 0B6F 4CCE02 JMP L11CF 16370 0B72 ; 16380 0B72 ;OPCODE $09 - INSTRUCTION LENGTH = 2 16390 0B72 ;EVALUATE EXPRESSION - RESULT IN LABVAL 16400 0B72 ;BRANCH ON SECOND BYTE IF ERROR 16410 0B72 0F L0C30 .BYTE SET0,$EC ;SET TO ZERO 16410 0B73 EC 16420 0B74 0F .BYTE SET0,$36 16420 0B75 36 16430 0B76 0F .BYTE SET0,NUMVAL ;SET TO ZERO 16430 0B77 6A 16440 0B78 E7 L0C39 .BYTE CHK0+SPC,L0CB4-* ;ERROR IF CR OR SP 16440 0B79 76 16450 0B7A 0A .BYTE RLBL,L0C5D-* ;BRANCH IF LABEL FOUND 16450 0B7B 20 16460 0B7C 21 .BYTE ADDZ,CNST10,CONST6,$34 ;$34/$35 IS B 16460 0B7D 3C 16460 0B7E F4 16460 0B7F 34 16470 0B80 89 .BYTE CHK0+'$,L0C64-* ;BRANCH IF HEX NUMB 16470 0B81 1F 16480 0B82 21 .BYTE ADDZ,CONST3,CONST5,$34 ;BASE = 8 16480 0B83 4A 16480 0B84 F2 16480 0B85 34 16490 0B86 A5 .BYTE CHK0+'@,L0C64-* ;BRANCH IF OCTAL NU 16490 0B87 19 16500 0B88 16 .BYTE COPY,CONST2,$34 ;BASE = 2 16500 0B89 74 16500 0B8A 34 16510 0B8B 8A .BYTE CHK0+'%,L0C64-* ;BRANCH IF BINARY N 16510 0B8C 14 16520 0B8D 8C .BYTE CHK0+$27,L0CBD-* ;BRANCH IF QUOTE 16520 0B8E 68 16530 0B8F 8F .BYTE CHK0+'*,L0EFD-* ;BRANCH IF CURRENT 16530 0B90 06 16540 0B91 16 .BYTE COPY,CNST10,$34 ;OTHERWISE ASSUME BA 16540 0B92 3C 16540 0B93 34 16550 0B94 EFA1 .DBYTE L0C66+OFFSET 16560 0B96 ;HANDLE '*' - LOCATION COUNTER 16570 0B96 16 L0EFD .BYTE COPY,ASMADR,LABVAL 16570 0B97 44 16570 0B98 7E 16580 0B99 EFFB .DBYTE L0EDE+OFFSET 16590 0B9B ;LOOK UP VALUE OF LABEL - BRANCH IF ERROR 16600 0B9B 07 L0C5D .BYTE LEXP,L0CD6-*,L0CD6-*,L0CD6-* 16600 0B9C 61 16600 0B9D 60 16600 0B9E 5F 16610 0B9F FB .BYTE $FB ;JMP TO L0CDC 16620 0BA0 ;PROCESS NUMERIC LITERAL 16630 0BA0 28 L0C64 .BYTE INC0 ;GO TO NEXT CHAR IF NOT DECI 16640 0BA1 0F L0C66 .BYTE SET0,LABVAL ;SET RESULT TO ZERO 16640 0BA2 7E 16650 0BA3 0F .BYTE SET0,LABL40 ;LABL40 AND LABL40+1 USE 16650 0BA4 6C 16660 0BA5 15 .BYTE EX65 16670 0BA6 A000 L0C6D LDY #$00 16680 0BA8 B100 LDA ($00),Y ;GET NEXT CHARACTER 16690 0BAA 38 SEC 16700 0BAB A634 LDX $34 16710 0BAD E930 SBC #$30 16720 0BAF 302D BMI L0CA2 ;BRANCH IF NOT VALID 16730 0BB1 C534 CMP $34 16740 0BB3 101D BPL L0C95 ;BRANCH IF OUT OF RANGE 16750 0BB5 E66C L0C78 INC LABL40 ;CHAR COUNT 16760 0BB7 85E7 STA TMPLOC+1 16770 0BB9 A900 LDA #$00 16780 0BBB 85EC STA $EC 16790 0BBD A27E LDX #LABVAL 16800 0BBF A07E LDY #LABVAL 16810 0BC1 A934 LDA #$34 16820 0BC3 ;MULTIPLY RESULT IN LABVAL BY 10 AND 16830 0BC3 ;ADD ON NEW DIGIT 16840 0BC3 20950A JSR L0A84 16850 0BC6 F002 BEQ L0C8D ;BRANCH IF NO OVERFLOW 16860 0BC8 E66D INC LABL40+1 ;OVERFLOW COUNT 16870 0BCA E600 L0C8D INC $00 ;INCREMENT POINTER 16880 0BCC D0D8 BNE L0C6D 16890 0BCE E601 INC $01 16900 0BD0 D0D4 BNE L0C6D ;THEN DO NEXT DIGIT 16910 0BD2 ;DIGIT SEEMS TO BE OUT OF RANGE, BUT 16920 0BD2 ;CHECK FIRST TO SEE IF IT IS VALID HEX 16930 0BD2 E010 L0C95 CPX #$10 16940 0BD4 D008 BNE L0CA2 16950 0BD6 ;CARRY IS SET ANYWAY AFTER CPX 16960 0BD6 E907 SBC #$07 16970 0BD8 3004 BMI L0CA2 16980 0BDA C910 CMP #$10 16990 0BDC 30D7 BMI L0C78 17000 0BDE ;DIGIT DEFINITELY OUT OF RANGE 17010 0BDE A56C L0CA2 LDA LABL40 ;CHECK IF IT'S FIRST CHARACTER 17020 0BE0 F00A BEQ L0CB1 ;IF SO, "INVALID EXPRESSION" 17030 0BE2 A56D LDA LABL40+1 ;CHECK IF OVERFLOW HAS OCCURR 17040 0BE4 F00C BEQ L0CB8 ;IF NOT, VALID TERMINATION OF NU 17050 0BE6 20D202 JSR L11DC ;EXECUTE P-CODE 17060 0BE9 ;ERROR 3 - ADDRESS NOT VALUD 17070 0BE9 18 .BYTE RERR,$03 17070 0BEA 03 17080 0BEB FB .BYTE $FB ;JMP TO L0CDC 17090 0BEC 20D202 L0CB1 JSR L11DC ;EXECUTE P-CODE 17100 0BEF ;ERROR 7 - INVALID EXPRESSION 17110 0BEF 18 L0CB4 .BYTE RERR,$07 17110 0BF0 07 17120 0BF1 12 .BYTE RET2 ;RETURN - 2ND BYTE OF CALL IS O 17130 0BF2 20D202 L0CB8 JSR L11DC ;EXECUTE P-CODE 17140 0BF5 FB .BYTE $FB ;JMP TO L0CDC 17150 0BF6 ;PROCESS SINGLE QUOTE CHARACTER 17160 0BF6 28 L0CBD .BYTE INC0 17170 0BF7 0F .BYTE SET0,LABVAL ;SET LABVAL TO ZERO 17170 0BF8 7E 17180 0BF9 22 .BYTE MOVB,CNST7E ;AND PUT BYTE INTO LABVA 17180 0BFA 78 17190 0BFB 28 L0EDE .BYTE INC0 ;MOVE ON TO NEXT CHAR 17200 0BFC FB .BYTE $FB ;JMP TO L0CDC 17210 0BFD ;PROCESS UNDEFINED LABEL 17220 0BFD 21 L0CD6 .BYTE ADDZ,CONST1,$ED,$ED 17220 0BFE 42 17220 0BFF ED 17220 0C00 ED 17230 0C01 ;ERROR 18 - UNDEFINED LABEL 17240 0C01 18 .BYTE RERR,$12 17240 0C02 12 17250 0C03 FC .BYTE $FC ;JMP TO L0D11 17260 0C04 ;LOOK TO SEE IF THERE'S AN OPERATOR 17270 0C04 ;SET UP $06/$07 TO POINT TO PREVIOUS OPERATOR 17280 0C04 16 L0CDC .BYTE COPY,$3A,$06 17280 0C05 3A 17280 0C06 06 17290 0C07 3F .BYTE CHK6+'/,L0D07-* ;DIVIDE 17290 0C08 1F 17300 0C09 3A .BYTE CHK6+'*,L0CF4-* ;MULTIPLY 17300 0C0A 0D 17310 0C0B 3D .BYTE CHK6+'-,L0CEE-* ;SUBTRACT 17310 0C0C 06 17320 0C0D ;MUST BE '+' - ADD LABVAL TO NUMVAL 17330 0C0D 21 .BYTE ADDZ,NUMVAL,LABVAL,NUMVAL 17330 0C0E 6A 17330 0C0F 7E 17330 0C10 6A 17340 0C11 FC .BYTE $FC ;JMP TO L0D11 17350 0C12 ;SUBTRACT - SUBTRACT LABVAL FROM NUMVAL 17360 0C12 20 L0CEE .BYTE SUBZ,NUMVAL,LABVAL,NUMVAL 17360 0C13 6A 17360 0C14 7E 17360 0C15 6A 17370 0C16 FC .BYTE $FC ;JMP TO L0D11 17380 0C17 ;MULTIPLY NUMVAL BY LABVAL 17390 0C17 15 L0CF4 .BYTE EX65 17400 0C18 A96A LDA #NUMVAL 17410 0C1A A07E LDY #LABVAL 17420 0C1C 86E7 STX TMPLOC+1 17430 0C1E 86EC STX $EC 17440 0C20 AA TAX 17450 0C21 20950A JSR L0A84 ;MULTIPLY 17460 0C24 4C340C JMP L0D02 17470 0C27 ;DIVIDE NUMVAL BY LABVAL 17480 0C27 16 L0D07 .BYTE COPY,NUMVAL,$26 17480 0C28 6A 17480 0C29 26 17490 0C2A 15 .BYTE EX65 17500 0C2B A226 LDX #$26 17510 0C2D A07E LDY #LABVAL 17520 0C2F A96A LDA #NUMVAL 17530 0C31 209A05 JSR L052A 17540 0C34 20D202 L0D02 JSR L11DC ;EXECUTE P-CODE 17550 0C37 ;LOOK FOR NEXT OPERATOR - 17560 0C37 ;GO TO L0D1F IF FOUND 17570 0C37 90 L0D11 .BYTE CHK0+'+,L0D1F-* 17570 0C38 10 17580 0C39 92 .BYTE CHK0+'-,L0D1F-* 17580 0C3A 0E 17590 0C3B 8F .BYTE CHK0+'*,L0D1F-* 17590 0C3C 0C 17600 0C3D 94 .BYTE CHK0+'/,L0D1F-* 17600 0C3E 0A 17610 0C3F ;OTHERWISE, EXIT 17620 0C3F ;SET TOP BIT OF $ED TO 1 17630 0C3F ;IF RESULT $0100 OR GREATER. 17640 0C3F 8B .BYTE BLES,NUMVAL,CONST1-1,L0D30-* 17640 0C40 6A 17640 0C41 41 17640 0C42 05 17650 0C43 21 .BYTE ADDZ,CNST80,$ED,$ED 17650 0C44 58 17650 0C45 ED 17650 0C46 ED 17660 0C47 11 L0D30 .BYTE RETN 17670 0C48 ;OPERATOR FOUND - SO MOVE IT INTO 17680 0C48 ;LOCATION POINTED TO BY $3A/$3B 17690 0C48 22 L0D1F .BYTE MOVB,$3A 17690 0C49 3A 17700 0C4A 28 .BYTE INC0 17710 0C4B EF78 .DBYTE L0C39+OFFSET ;MOVE ON TO NEXT CHARA 17720 0C4D 20D202 L0D34 JSR L11DC ;EXECUTE P-CODE 17730 0C50 ;ERROR 5 - ILLEGAL OPERAND TYPE FOR THIS INSTR 17740 0C50 18 .BYTE RERR,$05 17740 0C51 05 17750 0C52 FF .BYTE $FF ;JMP TO LINOUT 17760 0C53 15 L0D3D .BYTE EX65 17770 0C54 A0FF LDY #$FF 17780 0C56 A51F LDA DRTYPE+1 17790 0C58 2557 AND $57 17800 0C5A D008 BNE L0D4F 17810 0C5C A007 LDY #$07 17820 0C5E A51E LDA DRTYPE 17830 0C60 2556 AND $56 17840 0C62 F0E9 BEQ L0D34 17850 0C64 2A L0D4F ROL A 17860 0C65 C8 INY 17870 0C66 90FC BCC L0D4F 17880 0C68 C008 CPY #$08 17890 0C6A 104E BPL L0DB1 17900 0C6C B9090D LDA L0DFD,Y 17910 0C6F 292A AND #$2A 17920 0C71 D025 BNE L0D90 17930 0C73 98 TYA 17940 0C74 D044 BNE L0DB1 17950 0C76 A93F LDA #$3F 17960 0C78 24ED BIT $ED 17970 0C7A D03E BNE L0DB1 17980 0C7C 20D202 JSR L11DC ;EXECUTE P-CODE 17990 0C7F 20 .BYTE SUBZ,NUMVAL,ASMADR,NUMVAL 17990 0C80 6A 17990 0C81 44 17990 0C82 6A 18000 0C83 20 .BYTE SUBZ,NUMVAL,CONST2,NUMVAL 18000 0C84 6A 18000 0C85 74 18000 0C86 6A 18010 0C87 8B .BYTE BLES,NUMVAL,CNST80,L0D8C-* 18010 0C88 6A 18010 0C89 58 18010 0C8A 2E 18020 0C8B 21 .BYTE ADDZ,NUMVAL,CNST80,$1C 18020 0C8C 6A 18020 0C8D 58 18020 0C8E 1C 18030 0C8F 8B .BYTE BLES,$1C,CNST80,L0D8C-* 18030 0C90 1C 18030 0C91 58 18030 0C92 26 18040 0C93 ;ERROR 16 - RELATIVE BRANCH OUT OF RANGE 18050 0C93 18 .BYTE RERR,$10 18050 0C94 10 18060 0C95 14 .BYTE DECR,INSTLN 18060 0C96 4C 18070 0C97 FF .BYTE $FF ;JMP TO LINOUT 18080 0C98 A5ED L0D90 LDA $ED 18090 0C9A 0A ASL A 18100 0C9B D010 BNE L0DA6 18110 0C9D 901B BCC L0DB1 18120 0C9F C8 INY 18130 0CA0 B9090D LDA L0DFD,Y 18140 0CA3 251F AND DRTYPE+1 18150 0CA5 D013 BNE L0DB1 18160 0CA7 20D202 JSR L11DC ;EXECUTE P-CODE 18170 0CAA ;ERROR 3 - ADDRESS NOT VALID 18180 0CAA 18 .BYTE RERR,$03 18180 0CAB 03 18190 0CAC FF .BYTE $FF ;JMP TO LINOUT 18200 0CAD C8 L0DA6 INY 18210 0CAE B9090D LDA L0DFD,Y 18220 0CB1 841E STY DRTYPE 18230 0CB3 251F AND DRTYPE+1 18240 0CB5 D01F BNE L0DCE 18250 0CB7 24 .BYTE $24 18260 0CB8 15 L0D8C .BYTE EX65 18270 0CB9 88 DEY 18280 0CBA A520 L0DB1 LDA $20 18290 0CBC 4A LSR A 18300 0CBD B9110D LDA L0E0D,Y 18310 0CC0 B003 BCS L0DBC 18320 0CC2 B91D0D LDA L0E19,Y 18330 0CC5 18 L0DBC CLC 18340 0CC6 6520 ADC $20 18350 0CC8 8550 STA INSTRN 18360 0CCA B9FD0C LDA L0DF1,Y 18370 0CCD 854C STA INSTLN 18380 0CCF 20D202 JSR L11DC ;EXECUTE P-CODE 18390 0CD2 16 .BYTE COPY,NUMVAL,INSTRN+1 18390 0CD3 6A 18390 0CD4 51 18400 0CD5 FF .BYTE $FF ;JMP TO LINOUT 18410 0CD6 20D202 L0DCE JSR L11DC ;EXECUTE P-CODE 18420 0CD9 ;ERROR 19 - FWD REF TO PAGE ZERO MEMORY 18430 0CD9 18 .BYTE RERR,$13 18430 0CDA 13 18440 0CDB 15 .BYTE EX65 18450 0CDC A41E LDY DRTYPE 18460 0CDE 4CBA0C JMP L0DB1 18470 0CE1 60 L0DD5 .BYTE $60,$60,$00,$80,$00,$00,$00 18470 0CE2 60 18470 0CE3 00 18470 0CE4 80 18470 0CE5 00 18470 0CE6 00 18470 0CE7 00 18480 0CE8 00 .BYTE $00,$00,$00,$10,$00,$00,$00 18480 0CE9 00 18480 0CEA 00 18480 0CEB 10 18480 0CEC 00 18480 0CED 00 18480 0CEE 00 18490 0CEF 7D L0DE3 .BYTE $7D,$3D,$3C,$3C,$73,$32,$7C 18490 0CF0 3D 18490 0CF1 3C 18490 0CF2 3C 18490 0CF3 73 18490 0CF4 32 18490 0CF5 7C 18500 0CF6 38 .BYTE $38,$70,$30,$10,$10,$00,$80 18500 0CF7 70 18500 0CF8 30 18500 0CF9 10 18500 0CFA 10 18500 0CFB 00 18500 0CFC 80 18510 0CFD 02 L0DF1 .BYTE $02,$02,$02,$03,$02 18510 0CFE 02 18510 0CFF 02 18510 0D00 03 18510 0D01 02 18520 0D02 03 .BYTE $03,$02,$03,$01,$02,$02,$03 18520 0D03 02 18520 0D04 03 18520 0D05 01 18520 0D06 02 18520 0D07 02 18520 0D08 03 18530 0D09 80 L0DFD .BYTE $80,$40,$20,$10 18530 0D0A 40 18530 0D0B 20 18530 0D0C 10 18540 0D0D 08 .BYTE $08,$04,$02,$01 18540 0D0E 04 18540 0D0F 02 18540 0D10 01 18550 0D11 00 L0E0D .BYTE $00,$08,$04,$0C,$14,$1C 18550 0D12 08 18550 0D13 04 18550 0D14 0C 18550 0D15 14 18550 0D16 1C 18560 0D17 00 .BYTE $00,$18,$00,$10,$00,$00 18560 0D18 18 18560 0D19 00 18560 0D1A 10 18560 0D1B 00 18560 0D1C 00 18570 0D1D 00 L0E19 .BYTE $00,$00,$04,$0C,$14,$1C 18570 0D1E 00 18570 0D1F 04 18570 0D20 0C 18570 0D21 14 18570 0D22 1C 18580 0D23 14 .BYTE $14,$1C,$08,$00,$00,$2C 18580 0D24 1C 18580 0D25 08 18580 0D26 00 18580 0D27 00 18580 0D28 2C 18590 0D29 ; 18600 0D29 ;OUTPUT ACCUMLATOR AS HEX NUMBER, BUT 18610 0D29 ;ADD ONTO CHKSUM FIRST 18620 0D29 48 HEXCHK PHA 18630 0D2A 18 CLC 18640 0D2B 65D2 ADC CHKSUM 18650 0D2D 85D2 STA CHKSUM 18660 0D2F 9002 BCC L1942 18670 0D31 E6D3 INC CHKSUM+1 18680 0D33 68 L1942 PLA 18690 0D34 ;OUTPUT ACCUMLATOR AS HEX NUMBER 18700 0D34 48 HEXOUT PHA 18710 0D35 4A LSR A 18720 0D36 4A LSR A 18730 0D37 4A LSR A 18740 0D38 4A LSR A 18750 0D39 203F0D JSR HEXDIG ;PRINT SINGLE HEX DIGIT IN ACCU 18760 0D3C 68 PLA 18770 0D3D 290F AND #$0F 18780 0D3F ;PRINT SINGLE HEX DIGIT IN ACCUMULATOR 18790 0D3F 0930 HEXDIG ORA #'0 18800 0D41 C93A CMP #'9+1 18810 0D43 9002 BCC L132E 18820 0D45 6906 ADC #6 18830 0D47 4CEEFF L132E JMP COUT 18840 0D4A ;A2 - ASSEMBLE TO HEX FILE 18850 0D4A 15 A2OUT .BYTE EX65 18860 0D4B 88 DEY ;Y = 0 18870 0D4C 463E LSR ASMBRK 18880 0D4E A54C LDA INSTLN 18890 0D50 85E4 STA $E4 18900 0D52 B013 BCS FLUSHB 18910 0D54 C6E4 L10DA DEC $E4 18920 0D56 305A BMI ADDLNP 18930 0D58 A6D1 LDX A2BLEN 18940 0D5A B95000 LDA INSTRN,Y 18950 0D5D 95B8 STA A2BUFF,X 18960 0D5F C8 INY 18970 0D60 E8 INX 18980 0D61 86D1 STX A2BLEN 18990 0D63 E018 CPX #24 ;BUFFER IS MAX 24 CHARS 19000 0D65 D0ED BNE L10DA 19010 0D67 ;FLUSH THE BUFFER FOR A2 OPTION 19020 0D67 A6D1 FLUSHB LDX A2BLEN 19030 0D69 F034 BEQ L126A 19040 0D6B A93B LDA #'; 19050 0D6D 20EEFF JSR COUT ;PRINT CHARACTER IN ACC 19060 0D70 ;PRINT NUMBER OF BYTES AND START ADDR 19070 0D70 8A TXA 19080 0D71 20290D JSR HEXCHK 19090 0D74 A202 LDX #2 19100 0D76 B567 L10FF LDA BUFADR-1,X 19110 0D78 20290D JSR HEXCHK 19120 0D7B CA DEX 19130 0D7C D0F8 BNE L10FF 19140 0D7E ;PRINT DATA BYTES 19150 0D7E B5B8 L1107 LDA A2BUFF,X 19160 0D80 20290D JSR HEXCHK 19170 0D83 E8 INX 19180 0D84 C6D1 DEC A2BLEN 19190 0D86 D0F6 BNE L1107 19200 0D88 ;PRINT CHECKSUM 19210 0D88 A5D3 LDA CHKSUM+1 19220 0D8A 20340D JSR HEXOUT 19230 0D8D A5D2 LDA CHKSUM 19240 0D8F 20340D JSR HEXOUT 19250 0D92 20EF03 JSR NEWLIN 19260 0D95 ;PRINT SIX NULL CHARACTERS 19270 0D95 A206 LDX #$06 19280 0D97 A900 L1262 LDA #$00 19290 0D99 20EEFF JSR COUT ;PRINT CHARACTER IN ACC 19300 0D9C CA DEX 19310 0D9D D0F8 BNE L1262 19320 0D9F 86D2 L126A STX CHKSUM 19330 0DA1 86D3 STX CHKSUM+1 19340 0DA3 ;SET START ADDRESS OF NEXT BLOCK 19350 0DA3 18 CLC 19360 0DA4 98 TYA 19370 0DA5 6544 ADC ASMADR 19380 0DA7 8568 STA BUFADR 19390 0DA9 A900 LDA #$00 19400 0DAB 6545 ADC ASMADR+1 19410 0DAD 8569 STA BUFADR+1 19420 0DAF 4C540D JMP L10DA 19430 0DB2 ; 19440 0DB2 20D202 ADDLNP JSR L11DC ;EXECUTE P-CODE 19450 0DB5 ;ADD INSTRUCTION LENGTH ONTO CURRENT 19460 0DB5 ;LOCATION THEN EXIT 19470 0DB5 21 ADDLEN .BYTE ADDZ,ASMADR,INSTLN,ASMADR 19470 0DB6 44 19470 0DB7 4C 19470 0DB8 44 19480 0DB9 11 .BYTE RETN 19490 0DBA ; 19500 0DBA ;A2 OR A3 OPTIONS 19510 0DBA 4B A2ORA3 .BYTE BEQU,ASMOPT,CONST2,A2OUT-* 19510 0DBB 48 19510 0DBC 74 19510 0DBD 8D 19520 0DBE ; 19530 0DBE ;A3 - ASSEMBLE TO MEMORY 19540 0DBE 21 .BYTE ADDZ,ASMADR,ASMOFS,$1C ;ADD OFFSET 19540 0DBF 44 19540 0DC0 70 19540 0DC1 1C 19550 0DC2 01 .BYTE BMOV,INSTLN,CNST50,$1C ;COPY INSTR T 19550 0DC3 4C 19550 0DC4 72 19550 0DC5 1C 19560 0DC6 F1D8 .DBYTE L0E34+OFFSET ;CHECK FOR ASM ERRORS 19570 0DC8 ; 19580 0DC8 ;OPCODE $08 - INSTRUCTION LENGTH = 1 19590 0DC8 ;OUTPUT CURRENT ASSEMBLER INSTRUCTION 19600 0DC8 ;RELEVANT LOCATIONS: 19610 0DC8 ;NUMERR = ZERO IF NO ERRORS ON THIS LINE 19620 0DC8 ; 19630 0DC8 ;GO TO A2ORA3 IF A2/A3 OPTION, AND PASS 2 19640 0DC8 AB L10B3 .BYTE BNEQ,PASS,CONST2,L10BD-* 19640 0DC9 40 19640 0DCA 74 19640 0DCB 05 19650 0DCC 6B .BYTE BGEQ,ASMOPT,CONST2,A2ORA3-* 19650 0DCD 48 19650 0DCE 74 19650 0DCF EB 19660 0DD0 ; 19670 0DD0 ;GO TO ADDLEN IF ERROR, OR IF IT'S BOTH PASS 2 AN 19680 0DD0 ;A LISTING IS REQUIRED. 19690 0DD0 4B L10BD .BYTE BEQU,PASS,CONST1,L0E34-* ;BR IF PAS 19690 0DD1 40 19690 0DD2 42 19690 0DD3 05 19700 0DD4 4B .BYTE BEQU,ASMOPT,CONST0,L0E39-* ;BR IF L 19700 0DD5 48 19700 0DD6 2C 19700 0DD7 05 19710 0DD8 ;GO TO ADDLEN IF NO ERRORS 19720 0DD8 4B L0E34 .BYTE BEQU,CONST0,NUMERR,ADDLEN-* 19720 0DD9 2C 19720 0DDA E2 19720 0DDB DA 19730 0DDC ; 19740 0DDC ;OUTPUT LINE OF ASSEMBLY LISTING 19750 0DDC 19 L0E39 .BYTE PDEC,LINENO ;PRINT LINE NO 19750 0DDD 14 19760 0DDE 4B .BYTE BEQU,PASS,CONST1,L0E6A-* ;BRANCH IF 19760 0DDF 40 19760 0DE0 42 19760 0DE1 1B 19770 0DE2 24 .BYTE MESG,' ',$00 ;PRINT SPACE 19770 0DE3 20 19770 0DE4 00 19780 0DE5 17 .BYTE PHEX,ASMADR+1 ;PRINT CURRENT ADDRESS 19780 0DE6 45 19790 0DE7 17 .BYTE PHEX,ASMADR 19790 0DE8 44 19800 0DE9 24 .BYTE MESG,' ',$00 ;PRINT SPACE 19800 0DEA 20 19800 0DEB 00 19810 0DEC ; 19820 0DEC ;PRINT 0, 1, 2 OR 3 BYTES OF OBJECT CODE, 19830 0DEC ;PLUS SPACES TO PAD IT OUT 19840 0DEC AB .BYTE BNEQ,INSTLN,CONST0,PRINST-* 19840 0DED 4C 19840 0DEE 2C 19840 0DEF 31 19850 0DF0 24 .BYTE MESG,' ',$00 19850 0DF1 20 19850 0DF2 20 19850 0DF3 00 19860 0DF4 24 TWOSPC .BYTE MESG,' ',$00 19860 0DF5 20 19860 0DF6 20 19860 0DF7 00 19870 0DF8 24 ONESPC .BYTE MESG,' ',$00 19870 0DF9 20 19870 0DFA 20 19870 0DFB 00 19880 0DFC ; 19890 0DFC ;IF PRFLAG IS SET THEN THE LINE HAS ALREADY 19900 0DFC ;BEEN PRINTED - APPLIES FOR DIRECTIVES, WHICH 19910 0DFC ;MAY PRODUCE MORE THAN ONE LINE OF OUTPUT. 19920 0DFC 4B L0E6A .BYTE BEQU,CONST1,PRFLAG,L0EC5-* 19920 0DFD 42 19920 0DFE F0 19920 0DFF 1D 19930 0E00 24 .BYTE MESG,' ',$00 19930 0E01 20 19930 0E02 00 19940 0E03 1B .BYTE PLIN,$02 ;PRINT OUT LINE OF TEXT 19940 0E04 02 19950 0E05 29 .BYTE SET1,PRFLAG ;SET PRFLAG 19950 0E06 F0 19960 0E07 ; 19970 0E07 ;PROCESS ASSEMBLY ERRORS 19980 0E07 1C L0E77 .BYTE GERR,$20,ADDLEN-* ;BR IF NO ERRORS 19980 0E08 20 19980 0E09 AC 19990 0E0A 21 .BYTE ADDZ,$06,CONST6,$06 ;ADD 6 TO $06/$0 19990 0E0B 06 19990 0E0C F4 19990 0E0D 06 20000 0E0E 4B .BYTE BEQU,PASS,CONST1,L0E9E-* ;BRANCH IF 20000 0E0F 40 20000 0E10 42 20000 0E11 05 20010 0E12 21 .BYTE ADDZ,$06,CNST12,$06 ;ADD 12 TO $06/$ 20010 0E13 06 20010 0E14 76 20010 0E15 06 20020 0E16 1D L0E9E .BYTE PERR,'E#',$00 20020 0E17 45 20020 0E18 23 20020 0E19 00 20030 0E1A 19 .BYTE PDEC,$20 ;PRINT ERROR NUMBER 20030 0E1B 20 20040 0E1C 24 L0EC5 .BYTE MESG,$0D ;END OF LINE 20040 0E1D 0D 20050 0E1E F207 .DBYTE L0E77+OFFSET ;LOOK FOR NEXT ERROR 20060 0E20 ; 20070 0E20 17 PRINST .BYTE PHEX,INSTRN 20070 0E21 50 20080 0E22 4B .BYTE BEQU,INSTLN,CONST1,TWOSPC-* 20080 0E23 4C 20080 0E24 42 20080 0E25 CF 20090 0E26 17 .BYTE PHEX,INSTRN+1 20090 0E27 51 20100 0E28 4B .BYTE BEQU,INSTLN,CONST2,ONESPC-* 20100 0E29 4C 20100 0E2A 74 20100 0E2B CD 20110 0E2C 17 .BYTE PHEX,INSTRN+2 20110 0E2D 52 20120 0E2E F1FC .DBYTE L0E6A+OFFSET 20130 0E30 ; 20140 0E30 ;TABLE OF OPCODE MNEMONICS 20150 0E30 ;LOW BYTE OF MNEMONIC IN BASE-40 20160 0E30 40 MNEMLO .BYTE $40 ;A 20170 0E31 E3 .BYTE $E3 ;ADC 20180 0E32 74 .BYTE $74 ;AND 20190 0E33 44 .BYTE $44 ;ASL 20200 0E34 FB .BYTE $FB ;BCC 20210 0E35 0B .BYTE $0B ;BCS 20220 0E36 59 .BYTE $59 ;BEQ 20230 0E37 FC .BYTE $FC ;BIT 20240 0E38 91 .BYTE $91 ;BMI 20250 0E39 B5 .BYTE $B5 ;BNE 20260 0E3A 0C .BYTE $0C ;BPL 20270 0E3B 5B .BYTE $5B ;BRK 20280 0E3C F3 .BYTE $F3 ;BVC 20290 0E3D 03 .BYTE $03 ;BVS 20300 0E3E A3 .BYTE $A3 ;CLC 20310 0E3F A4 .BYTE $A4 ;CLD 20320 0E40 A9 .BYTE $A9 ;CLI 20330 0E41 B6 .BYTE $B6 ;CLV 20340 0E42 D8 .BYTE $D8 ;CMP 20350 0E43 58 .BYTE $58 ;CPX 20360 0E44 59 .BYTE $59 ;CPY 20370 0E45 CB .BYTE $CB ;DEC 20380 0E46 E0 .BYTE $E0 ;DEX 20390 0E47 E1 .BYTE $E1 ;DEY 20400 0E48 AA .BYTE $AA ;EOR 20410 0E49 73 .BYTE $73 ;INC 20420 0E4A 88 .BYTE $88 ;INX 20430 0E4B 89 .BYTE $89 ;INY 20440 0E4C 98 .BYTE $98 ;JMP 20450 0E4D 8A .BYTE $8A ;JSR 20460 0E4E A1 .BYTE $A1 ;LDA 20470 0E4F B8 .BYTE $B8 ;LDX 20480 0E50 B9 .BYTE $B9 ;LDY 20490 0E51 0A .BYTE $0A ;LSR 20500 0E52 E8 .BYTE $E8 ;NOP 20510 0E53 91 .BYTE $91 ;ORA 20520 0E54 41 .BYTE $41 ;PHA 20530 0E55 50 .BYTE $50 ;PHP 20540 0E56 E1 .BYTE $E1 ;PLA 20550 0E57 F0 .BYTE $F0 ;PLP 20560 0E58 E4 .BYTE $E4 ;ROL 20570 0E59 EA .BYTE $EA ;ROR 20580 0E5A A9 .BYTE $A9 ;RTI 20590 0E5B B3 .BYTE $B3 ;RTS 20600 0E5C 13 .BYTE $13 ;SBC 20610 0E5D 8B .BYTE $8B ;SEC 20620 0E5E 8C .BYTE $8C ;SED 20630 0E5F 91 .BYTE $91 ;SEI 20640 0E60 E1 .BYTE $E1 ;STA 20650 0E61 F8 .BYTE $F8 ;STX 20660 0E62 F9 .BYTE $F9 ;STY 20670 0E63 40 .BYTE $40 ;TAX 20680 0E64 41 .BYTE $41 ;TAY 20690 0E65 10 .BYTE $10 ;TSX 20700 0E66 C1 .BYTE $C1 ;TXA 20710 0E67 D3 .BYTE $D3 ;TXS 20720 0E68 E9 .BYTE $E9 ;TYA 20730 0E69 ;THESE LAST SIX BYTES ARE NOT NEEDED 20740 0E69 ;BECAUSE NO BASE-40 ENCODING CAN 20750 0E69 ;EXCEED $FF00. 20760 0E69 ;.BYTE $FF ;NULL 20770 0E69 ;.BYTE $FF ;NULL 20780 0E69 ;.BYTE $FF ;NULL 20790 0E69 ;.BYTE $FF ;NULL 20800 0E69 ;.BYTE $FF ;NULL 20810 0E69 ;.BYTE $FF ;NULL 20820 0E69 ; 20830 0E69 ;TABLE OF OPCODE MNEMONICS 20840 0E69 ;HIGH BYTE OF MNEMONIC IN BASE-40 20850 0E69 06 MNEMHI .BYTE $06 ;A 20860 0E6A 06 .BYTE $06 ;ADC 20870 0E6B 08 .BYTE $08 ;AND 20880 0E6C 09 .BYTE $09 ;ASL 20890 0E6D 0C .BYTE $0C ;BCC 20900 0E6E 0D .BYTE $0D ;BCS 20910 0E6F 0D .BYTE $0D ;BEQ 20920 0E70 0D .BYTE $0D ;BIT 20930 0E71 0E .BYTE $0E ;BMI 20940 0E72 0E .BYTE $0E ;BNE 20950 0E73 0F .BYTE $0F ;BPL 20960 0E74 0F .BYTE $0F ;BRK 20970 0E75 0F .BYTE $0F ;BVC 20980 0E76 10 .BYTE $10 ;BVS 20990 0E77 14 .BYTE $14 ;CLC 21000 0E78 14 .BYTE $14 ;CLD 21010 0E79 14 .BYTE $14 ;CLI 21020 0E7A 14 .BYTE $14 ;CLV 21030 0E7B 14 .BYTE $14 ;CMP 21040 0E7C 15 .BYTE $15 ;CPX 21050 0E7D 15 .BYTE $15 ;CPY 21060 0E7E 19 .BYTE $19 ;DEC 21070 0E7F 19 .BYTE $19 ;DEX 21080 0E80 19 .BYTE $19 ;DEY 21090 0E81 21 .BYTE $21 ;EOR 21100 0E82 3A .BYTE $3A ;INC 21110 0E83 3A .BYTE $3A ;INX 21120 0E84 3A .BYTE $3A ;INY 21130 0E85 40 .BYTE $40 ;JMP 21140 0E86 41 .BYTE $41 ;JSR 21150 0E87 4B .BYTE $4B ;LDA 21160 0E88 4B .BYTE $4B ;LDX 21170 0E89 4B .BYTE $4B ;LDY 21180 0E8A 4E .BYTE $4E ;LSR 21190 0E8B 59 .BYTE $59 ;NOP 21200 0E8C 60 .BYTE $60 ;ORA 21210 0E8D 65 .BYTE $65 ;PHA 21220 0E8E 65 .BYTE $65 ;PHP 21230 0E8F 65 .BYTE $65 ;PLA 21240 0E90 65 .BYTE $65 ;PLP 21250 0E91 72 .BYTE $72 ;ROL 21260 0E92 72 .BYTE $72 ;ROR 21270 0E93 73 .BYTE $73 ;RTI 21280 0E94 73 .BYTE $73 ;RTS 21290 0E95 77 .BYTE $77 ;SBC 21300 0E96 77 .BYTE $77 ;SEC 21310 0E97 77 .BYTE $77 ;SED 21320 0E98 77 .BYTE $77 ;SEI 21330 0E99 79 .BYTE $79 ;STA 21340 0E9A 79 .BYTE $79 ;STX 21350 0E9B 79 .BYTE $79 ;STY 21360 0E9C 7D .BYTE $7D ;TAX 21370 0E9D 7D .BYTE $7D ;TAY 21380 0E9E 80 .BYTE $80 ;TSX 21390 0E9F 80 .BYTE $80 ;TXA 21400 0EA0 80 .BYTE $80 ;TXS 21410 0EA1 80 .BYTE $80 ;TYA 21420 0EA2 FF .BYTE $FF ;NULL 21430 0EA3 FF .BYTE $FF ;NULL 21440 0EA4 FF .BYTE $FF ;NULL 21450 0EA5 ;LAST THREE ENTRIES CAN BE REMOVED 21460 0EA5 ;BECAUSE THEY WILL NEVER BE REACHED BY 21470 0EA5 ;THE BINARY SEARCH ALGORITHM 21480 0EA5 ;.BYTE $FF ;NULL 21490 0EA5 ;.BYTE $FF ;NULL 21500 0EA5 ;.BYTE $FF ;NULL 21510 0EA5 ; 21520 0EA5 ;TABLE OF OPCODE MNEMONICS 21530 0EA5 ;INSTRUCTION BASE: 21540 0EA5 61 INSBAS .BYTE $61 ;ADC 21550 0EA6 21 .BYTE $21 ;AND 21560 0EA7 02 .BYTE $02 ;ASL 21570 0EA8 90 .BYTE $90 ;BCC 21580 0EA9 B0 .BYTE $B0 ;BCS 21590 0EAA F0 .BYTE $F0 ;BEQ 21600 0EAB 20 .BYTE $20 ;BIT 21610 0EAC 30 .BYTE $30 ;BMI 21620 0EAD D0 .BYTE $D0 ;BNE 21630 0EAE 10 .BYTE $10 ;BPL 21640 0EAF 00 .BYTE $00 ;BRK 21650 0EB0 50 .BYTE $50 ;BVC 21660 0EB1 70 .BYTE $70 ;BVS 21670 0EB2 18 .BYTE $18 ;CLC 21680 0EB3 D8 .BYTE $D8 ;CLD 21690 0EB4 58 .BYTE $58 ;CLI 21700 0EB5 B8 .BYTE $B8 ;CLV 21710 0EB6 C1 .BYTE $C1 ;CMP 21720 0EB7 E0 .BYTE $E0 ;CPX 21730 0EB8 C0 .BYTE $C0 ;CPY 21740 0EB9 C2 .BYTE $C2 ;DEC 21750 0EBA CA .BYTE $CA ;DEX 21760 0EBB 88 .BYTE $88 ;DEY 21770 0EBC 41 .BYTE $41 ;EOR 21780 0EBD E2 .BYTE $E2 ;INC 21790 0EBE E8 .BYTE $E8 ;INX 21800 0EBF C8 .BYTE $C8 ;INY 21810 0EC0 40 .BYTE $40 ;JMP 21820 0EC1 14 .BYTE $14 ;JSR 21830 0EC2 A1 .BYTE $A1 ;LDA 21840 0EC3 A2 .BYTE $A2 ;LDX 21850 0EC4 A0 .BYTE $A0 ;LDY 21860 0EC5 42 .BYTE $42 ;LSR 21870 0EC6 EA .BYTE $EA ;NOP 21880 0EC7 01 .BYTE $01 ;ORA 21890 0EC8 48 .BYTE $48 ;PHA 21900 0EC9 08 .BYTE $08 ;PHP 21910 0ECA 68 .BYTE $68 ;PLA 21920 0ECB 28 .BYTE $28 ;PLP 21930 0ECC 22 .BYTE $22 ;ROL 21940 0ECD 62 .BYTE $62 ;ROR 21950 0ECE 40 .BYTE $40 ;RTI 21960 0ECF 60 .BYTE $60 ;RTS 21970 0ED0 E1 .BYTE $E1 ;SBC 21980 0ED1 38 .BYTE $38 ;SEC 21990 0ED2 F8 .BYTE $F8 ;SED 22000 0ED3 78 .BYTE $78 ;SEI 22010 0ED4 81 .BYTE $81 ;STA 22020 0ED5 82 .BYTE $82 ;STX 22030 0ED6 80 .BYTE $80 ;STY 22040 0ED7 AA .BYTE $AA ;TAX 22050 0ED8 A8 .BYTE $A8 ;TAY 22060 0ED9 BA .BYTE $BA ;TSX 22070 0EDA 8A .BYTE $8A ;TXA 22080 0EDB 9A .BYTE $9A ;TXS 22090 0EDC 98 .BYTE $98 ;TYA 22100 0EDD ; 22110 0EDD ;TABLE OF OPCODE MNEMONICS 22120 0EDD ;INSTRUCTION TYPE: 22130 0EDD 0F INSTYP .BYTE $0F ;A 22140 0EDE 00 .BYTE $00 ;ADC, AND 22150 0EDF 3D .BYTE $3D ;ASL, BCC 22160 0EE0 DD .BYTE $DD ;BCS, BEQ 22170 0EE1 9D .BYTE $9D ;BIT, BMI 22180 0EE2 DD .BYTE $DD ;BNE, BPL 22190 0EE3 CD .BYTE $CD ;BRK, BVC 22200 0EE4 DC .BYTE $DC ;BVS, CLC 22210 0EE5 CC .BYTE $CC ;CLD, CLI 22220 0EE6 C0 .BYTE $C0 ;CLV, CMP 22230 0EE7 88 .BYTE $88 ;CPX, CPY 22240 0EE8 2C .BYTE $2C ;DEC, DEX 22250 0EE9 C0 .BYTE $C0 ;DEY, EOR 22260 0EEA 2C .BYTE $2C ;INC, INX 22270 0EEB CA .BYTE $CA ;INY, JMP 22280 0EEC B0 .BYTE $B0 ;JSR, LDA 22290 0EED 46 .BYTE $46 ;LDX, LDY 22300 0EEE 3C .BYTE $3C ;LSR, NOP 22310 0EEF 0C .BYTE $0C ;ORA, PHA 22320 0EF0 CC .BYTE $CC ;PHP, PLA 22330 0EF1 C3 .BYTE $C3 ;PLP, ROL 22340 0EF2 3C .BYTE $3C ;ROR, RTI 22350 0EF3 C0 .BYTE $C0 ;RTS, SBC 22360 0EF4 CC .BYTE $CC ;SEC, SED 22370 0EF5 C1 .BYTE $C1 ;SEI, STA 22380 0EF6 57 .BYTE $57 ;STX, STY 22390 0EF7 CC .BYTE $CC ;TAX, TAY 22400 0EF8 CC .BYTE $CC ;TSX, TXA 22410 0EF9 CC .BYTE $CC ;TXS, TYA 22420 0EFA ; 22430 0EFA 0F L1028 .BYTE SET0,INSTLN 22430 0EFB 4C 22440 0EFC 28 .BYTE INC0 22450 0EFD 05 .BYTE SKIP ;SKIP SPACES 22460 0EFE 09 .BYTE EXPR,LINOUT-* 22460 0EFF 33 22470 0F00 E7 .BYTE CHK0+SPC,L1036-* 22470 0F01 02 22480 0F02 FE .BYTE $FE ;JMP TO L08E6 22490 0F03 16 L1036 .BYTE COPY,$02,$00 22490 0F04 02 22490 0F05 00 22500 0F06 05 .BYTE SKIP ;SKIP SPACES 22510 0F07 0A .BYTE RLBL,L103D-* 22510 0F08 01 22520 0F09 06 L103D .BYTE LVAL,L104C-*,L104C-*,L104C-* 22520 0F0A 0D 22520 0F0B 0C 22520 0F0C 0B 22530 0F0D 16 .BYTE COPY,NUMVAL,LABVAL 22530 0F0E 6A 22530 0F0F 7E 22540 0F10 01 .BYTE BMOV,CONST2,CNST7E,$0C 22540 0F11 74 22540 0F12 78 22540 0F13 0C 22550 0F14 1C .BYTE GERR,DRTYPE,L104C-* 22550 0F15 1E 22550 0F16 01 22560 0F17 FF L104C .BYTE $FF ;JMP TO LINOUT 22570 0F18 15 L104E .BYTE EX65 22580 0F19 861F STX DRTYPE+1 22590 0F1B A203 LDX #$03 22600 0F1D A56D L1051 LDA LABL40+1 22610 0F1F DD2C0F CMP DIRHI,X 22620 0F22 F013 BEQ L1062 22630 0F24 CA L105D DEX 22640 0F25 10F6 BPL L1051 22650 0F27 20D202 JSR L11DC ;EXECUTE P-CODE 22660 0F2A EC15 .DBYTE L114F+OFFSET 22670 0F2C 21 DIRHI .BYTE ADDZ,TXTPOS,$92,$19 22670 0F2D 10 22670 0F2E 92 22670 0F2F 19 22680 0F30 0F L10A7 .BYTE SET0,INSTLN 22680 0F31 4C 22690 0F32 ;OUTPUT LINE OF ASSEMBLED CODE THEN 22700 0F32 ;MOVE ON TO NEXT LINE 22710 0F32 08 LINOUT .BYTE OUTP ;OUTPUT ASSEMBLED LINE 22720 0F33 ;GET NEXT LINE AND GO TO L10B0 IF END 22730 0F33 00 L10AB .BYTE NXLN,L10B0-* 22730 0F34 15 22740 0F35 EC49 .DBYTE L085D+OFFSET ;PROCESS NEXT LINE 22750 0F37 861E L1062 STX DRTYPE 22760 0F39 E003 CPX #3 22770 0F3B D001 BNE STDRLN 22780 0F3D CA DEX 22790 0F3E 864C STDRLN STX INSTLN 22800 0F40 20D202 JSR L11DC ;EXECUTE P-CODE 22810 0F43 05 .BYTE SKIP ;SKIP SPACES 22820 0F44 ;IF .BYT, .WOR, OR .DBY, GO TO L1230 22830 0F44 AB .BYTE BNEQ,DRTYPE,CONST0,L1230-* 22830 0F45 1E 22830 0F46 2C 22830 0F47 27 22840 0F48 08 .BYTE OUTP 22850 0F49 ;END OF SOURCE FILE REACHED 22860 0F49 AB L10B0 .BYTE BNEQ,ASMOPT,CONST2,L0E8A-* 22860 0F4A 48 22860 0F4B 74 22860 0F4C 04 22870 0F4D ;IF DOING 'A2', FLUSH BUFFER 22880 0F4D 29 .BYTE SET1,ASMBRK 22880 0F4E 3E 22890 0F4F 08 .BYTE OUTP 22900 0F50 13 L0E8A .BYTE INCR,PASS ;NEXT PASS 22900 0F51 40 22910 0F52 ;GO BACK TO NXTPAS TO START NEXT PASS 22920 0F52 2B .BYTE BRGR,PASS,CONST2,L0E94-* 22920 0F53 40 22920 0F54 74 22920 0F55 03 22930 0F56 EC46 .DBYTE NXTPAS+OFFSET 22940 0F58 FD L0E94 .BYTE $FD ;JMP TO L0620 22950 0F59 4B L123B .BYTE BEQU,DRTYPE,CONST1,L1244-* 22950 0F5A 1E 22950 0F5B 42 22950 0F5C 07 22960 0F5D FE L1241 .BYTE $FE ;JMP TO L08E6 22970 0F5E 72 L1246 .BYTE CHK0+$0D,L1098-* 22970 0F5F 0C 22980 0F60 22 .BYTE MOVB,$72 22980 0F61 72 22990 0F62 08 .BYTE OUTP 23000 0F63 28 L1244 .BYTE INC0 23010 0F64 8C .BYTE CHK0+$27,L1251-* ;SINGLE QUOTE CHAR 23010 0F65 03 23020 0F66 F35E .DBYTE L1246+OFFSET 23030 0F68 28 L1251 .BYTE INC0 23040 0F69 8C .BYTE CHK0+$27,L1246-* ;SINGLE QUOTE CHAR 23040 0F6A F4 23050 0F6B F386 L1098 .DBYTE L108E+OFFSET 23060 0F6D 28 L109A .BYTE INC0 23070 0F6E ;PROCESS .BYTE, .WORD OR .DBYTE 23080 0F6E 8C L1230 .BYTE CHK0+$27,L123B-* ;SINGLE QUOTE 23080 0F6F EA 23090 0F70 09 .BYTE EXPR,L1241-* 23090 0F71 EC 23100 0F72 16 .BYTE COPY,NUMVAL,INSTRN 23100 0F73 6A 23100 0F74 50 23110 0F75 AB .BYTE BNEQ,DRTYPE,CONST3,L108A-* 23110 0F76 1E 23110 0F77 4A 23110 0F78 0D 23120 0F79 15 .BYTE EX65 23130 0F7A A550 LDA INSTRN 23140 0F7C A451 LDY INSTRN+1 23150 0F7E 8551 STA INSTRN+1 23160 0F80 8450 STY INSTRN 23170 0F82 20D202 JSR L11DC ;EXECUTE P-CODE 23180 0F85 08 L108A .BYTE OUTP 23190 0F86 91 L108E .BYTE CHK0+',,L109A-* 23190 0F87 E6 23200 0F88 E7 .BYTE CHK0+SPC,L10AB-* 23200 0F89 AA 23210 0F8A ;ERROR 7 - INVALID EXPRESSION 23220 0F8A 18 .BYTE RERR,$07 23220 0F8B 07 23230 0F8C FF .BYTE $FF ;JMP TO LINOUT 23240 0F8D ; 23250 0F8D ;ZERO PAGE LOCATIONS TO BE UPDATED UPON STARTUP 23260 0F8D 02 ZPADDR .BYTE $02,IP,IP+1,$2E 23260 0F8E 24 23260 0F8F 25 23260 0F90 2E 23270 0F91 2F .BYTE $2F,CNST14,$3A,CNST10 23270 0F92 38 23270 0F93 3A 23270 0F94 3C 23280 0F95 42 .BYTE CONST1,CONST3,NOPBYT,NOPBYT+1 23280 0F96 4A 23280 0F97 4E 23280 0F98 4F 23290 0F99 58 .BYTE CNST80,$5B,$5D,$5E 23290 0F9A 5B 23290 0F9B 5D 23290 0F9C 5E 23300 0F9D 60 .BYTE $60,$62,$65,$67 23300 0F9E 62 23300 0F9F 65 23300 0FA0 67 23310 0FA1 72 .BYTE CNST50,CONST2,CNST12,CNST7E 23310 0FA2 74 23310 0FA3 76 23310 0FA4 78 23320 0FA5 7A .BYTE CNST6C,CNST44,CONST4,$EE 23320 0FA6 D4 23320 0FA7 EA 23320 0FA8 EE 23330 0FA9 F2 .BYTE CONST5,CONST6,$00,$80 23330 0FAA F4 23330 0FAB 00 23330 0FAC 80 23340 0FAD 70 .BYTE ASMOFS,ASMOFS+1,STTEXT,STTEXT+1 23340 0FAE 71 23340 0FAF 16 23340 0FB0 17 23350 0FB1 18 .BYTE ENDMEM,ENDMEM+1,ENDTXT,ENDTXT+1 23350 0FB2 19 23350 0FB3 1A 23350 0FB4 1B 23360 0FB5 ; 23370 0FB5 ;VALUES TO BE PUT IN THESE MEMORY LOCATIONS 23380 0FB5 80 ZPCONT .BYTE $80 23390 0FB6 0F06 .WORD PINIT 23400 0FB8 FF .BYTE $FF 23410 0FB9 FF .BYTE $FF,LINENO,$36,10 23410 0FBA 14 23410 0FBB 36 23410 0FBC 0A 23420 0FBD 01 .BYTE 1,3,$EA,$EA ;$EA IS A NOP INSTRUCTIO 23420 0FBE 03 23420 0FBF EA 23420 0FC0 EA 23430 0FC1 80 .BYTE $80,$B0,$40,$20 23430 0FC2 B0 23430 0FC3 40 23430 0FC4 20 23440 0FC5 40 .BYTE $40,$10,$0C,$03 23440 0FC6 10 23440 0FC7 0C 23440 0FC8 03 23450 0FC9 50 .BYTE INSTRN,2,12,LABVAL 23450 0FCA 02 23450 0FCB 0C 23450 0FCC 7E 23460 0FCD 6C .BYTE LABL40,ASMADR,4,$37 23460 0FCE 44 23460 0FCF 04 23460 0FD0 37 23470 0FD1 05 .BYTE 5,6,$80,$0D 23470 0FD2 06 23470 0FD3 80 23470 0FD4 0D 23480 0FD5 ;LAST 8 BYTES OF ASSEMBLER CODE: 23490 0FD5 ;2 BYTES OFFSET FOR A3 ASSEMBLE TO MEMORY 23500 0FD5 ;2 BYTES START OF AVAILABLE MEMORY 23510 0FD5 ;2 BYTES END OF AVAILABLE MEMORY 23520 0FD5 ;2 BYTES END OF ASSEMBLER SOURCE TEXT 23530 0FD5 0000 .WORD 0,LOMEM,HIMEM 23530 0FD7 DD0F 23530 0FD9 FF1F 23540 0FDB DD0F ENDIMG .WORD LOMEM 23550 0FDD LOMEM ;BOTTOM OF AVAILABLE MEMORY