10 REM The Interactive 6502 20 REM By Jason H. Moore, Ph.D. 30 REM The goal of this demo is to allow 40 REM users to interact directly with the 50 REM 6502 processor using point & click 60 REM assembly language. 70 REM For use with Atari BASIC XL 80 REM Atari 8-bit Version 1.0 90 REM March 14, 2020 100 REM *********************** 101 REM *** INITIALIZATIONS *** 102 REM *********************** 110 FAST:REM BASIC XL command to index line numbers for speed 120 GOSUB 2000:REM Memory & graphics initialization 130 GOSUB 3000:REM Draw title screen 140 GOSUB 4000:REM Move & redefine character set 150 GOSUB 5000:REM Read in machine language routines 160 GOSUB 6000:REM Draw main screen 200 REM ***************** 201 REM *** MAIN LOOP *** 202 REM ***************** 210 CX=1:CY=3:RAM=0:X=0:Y=0:A=0:REM Initialize variables 220 POKE 203,RAM:POKE 204,X:REM Initialize RAM & 6502 registers 230 POKE 205,Y:POKE 206,A:REM using page 0 of memory 240 POSITION CX,CY:PRINT #6; ">":REM Draw cursor 250 POSITION 3,15:PRINT #6; RAM 260 POSITION 11,15:PRINT #6; X 270 POSITION 13,15:PRINT #6; Y 280 POSITION 15,15:PRINT #6; A 290 JOY=STICK(0):REM Read joystick value 300 IF JOY=15 THEN GOTO 410:REM No joystick movement? 310 POSITION CX,CY:PRINT #6; " ":REM Clear old cursor 320 IF JOY=11 THEN CX=CX-6:REM Left? Decrease X 330 IF CX<1 THEN CX=13:REM Wrap around 340 IF JOY=7 THEN CX=CX+6:REM Right? Increase X 350 IF CX>13 THEN CX=1:REM Wrap around 360 IF JOY=14 THEN CY=CY-1:REM Up? Decrease Y 370 IF CY<3 THEN CY=8:REM Wrap around 380 IF JOY=13 THEN CY=CY+1:REM Down? Increase Y 390 IF CY>8 THEN CY=3:REM Wrap around 400 FOR I=1 TO 100:NEXT I:REM Delay for smooth moves 410 IF PEEK(53279)=6 THEN GOTO 160:REM Reset when start pressed 420 IF STRIG(0)=1 THEN GOTO 240:REM Read joystick fire button 450 IF CX<>1 THEN GOTO 520:REM Check X position 460 IF CY<>3 THEN GOTO 520:REM Check Y position 470 ADC=USR(ADR(ADC$)):A=PEEK(206):REM Execute ADC op code 480 IF A=255 THEN A=0:POKE 206,A:REM Min value 0 490 IF A>9 THEN A=9:POKE 206,A:REM Max value 9 500 POSITION 15,15:PRINT #6; A:REM Print new A 510 FOR I=1 TO 500:NEXT I:GOTO 240 520 IF CX<>1 THEN GOTO 590 530 IF CY<>4 THEN GOTO 590 540 DEC=USR(ADR(DEC$)):RAM=PEEK(203):REM Execute DEC op code 550 IF RAM=255 THEN RAM=0:POKE 203,RAM 560 IF RAM>9 THEN RAM=9:POKE 203,RAM 570 POSITION 3,15:PRINT #6; RAM 580 GOTO 240 590 IF CX<>1 THEN GOTO 660 600 IF CY<>5 THEN GOTO 660 610 DEX=USR(ADR(DEX$)):X=PEEK(204):REM Execute DEX op code 620 IF X=255 THEN X=0:POKE 204,X 630 IF X>9 THEN X=9:POKE 204,X 640 POSITION 11,15:PRINT #6; X 650 FOR I=1 TO 500:NEXT I:GOTO 240 660 IF CX<>1 THEN GOTO 730 670 IF CY<>6 THEN GOTO 730 680 DEY=USR(ADR(DEY$)):Y=PEEK(205):REM Execute DEY op code 690 IF Y=255 THEN Y=0:POKE 205,Y 700 IF Y>9 THEN Y=9:POKE 205,Y 710 POSITION 13,15:PRINT #6; Y 720 FOR I=1 TO 500:NEXT I:GOTO 240 730 IF CX<>1 THEN GOTO 800 740 IF CY<>7 THEN GOTO 800 750 INC=USR(ADR(INC$)):RAM=PEEK(203):REM Execute INC op code 760 IF RAM=255 THEN RAM=0:POKE 203,RAM 770 IF RAM>9 THEN RAM=9:POKE 203,RAM 780 POSITION 3,15:PRINT #6; RAM 790 FOR I=1 TO 500:NEXT I:GOTO 240 800 IF CX<>1 THEN GOTO 870 810 IF CY<>8 THEN GOTO 870 820 INX=USR(ADR(INX$)):X=PEEK(204):REM Execute INX op code 830 IF X=255 THEN X=0:POKE 204,X 840 IF X>9 THEN X=9:POKE 204,X 850 POSITION 11,15:PRINT #6; X 860 FOR I=1 TO 500:NEXT I:GOTO 240 870 IF CX<>7 THEN GOTO 940 880 IF CY<>3 THEN GOTO 940 890 INY=USR(ADR(INY$)):Y=PEEK(205):REM Execute INY op code 900 IF Y=255 THEN Y=0:POKE 205,Y 910 IF Y>9 THEN Y=9:POKE 205,Y 920 POSITION 13,15:PRINT #6; Y 930 FOR I=1 TO 500:NEXT I:GOTO 240 940 IF CX<>7 THEN GOTO 990 950 IF CY<>4 THEN GOTO 990 960 LDA=USR(ADR(LDA$)):A=PEEK(206):REM Execute LDA op code 970 POSITION 15,15:PRINT #6; A 980 FOR I=1 TO 500:NEXT I:GOTO 240 990 IF CX<>7 THEN GOTO 1040 1000 IF CY<>5 THEN GOTO 1040 1010 LDX=USR(ADR(LDX$)):X=PEEK(204):REM Execute LDX op code 1020 POSITION 11,15:PRINT #6; X 1030 FOR I=1 TO 500:NEXT I:GOTO 240 1040 IF CX<>7 THEN GOTO 1090 1050 IF CY<>6 THEN GOTO 1090 1060 LDY=USR(ADR(LDY$)):Y=PEEK(205):REM Execute LDY op code 1070 POSITION 13,15:PRINT #6; Y 1080 FOR I=1 TO 500:NEXT I:GOTO 240 1090 IF CX<>7 THEN GOTO 1170 1100 IF CY<>7 THEN GOTO 1170 1110 IF RAM>A THEN GOTO 1170 1120 SBC=USR(ADR(SBC$)):A=PEEK(206):REM Execute SBC op code 1130 IF A=255 THEN A=0:POKE 206,A 1140 IF A>9 THEN A=9:POKE 206,A 1150 POSITION 15,15:PRINT #6; A 1160 FOR I=1 TO 500:NEXT I:GOTO 240 1170 IF CX<>7 THEN GOTO 1220 1180 IF CY<>8 THEN GOTO 1220 1190 STA=USR(ADR(STA$)):RAM=PEEK(203):REM Execute STA op code 1200 POSITION 3,15:PRINT #6; RAM 1210 FOR I=1 TO 500:NEXT I:GOTO 240 1220 IF CX<>13 THEN GOTO 1270 1230 IF CY<>3 THEN GOTO 1270 1240 STX=USR(ADR(STX$)):RAM=PEEK(203):REM Execute STX op code 1250 POSITION 3,15:PRINT #6; RAM 1260 FOR I=1 TO 500:NEXT I:GOTO 240 1270 IF CX<>13 THEN GOTO 1320 1280 IF CY<>4 THEN GOTO 1320 1290 STY=USR(ADR(STY$)):RAM=PEEK(203):REM Execute STY op code 1300 POSITION 3,15:PRINT #6; RAM 1310 FOR I=1 TO 500:NEXT I:GOTO 240 1320 IF CX<>13 THEN GOTO 1370 1330 IF CY<>5 THEN GOTO 1370 1340 TAX=USR(ADR(TAX$)):X=PEEK(204):REM Execute TAX op code 1350 POSITION 11,15:PRINT #6; X 1360 FOR I=1 TO 500:NEXT I:GOTO 240 1370 IF CX<>13 THEN GOTO 1420 1380 IF CY<>6 THEN GOTO 1420 1390 TAY=USR(ADR(TAY$)):Y=PEEK(205):REM Execute TAY op code 1400 POSITION 13,15:PRINT #6; Y 1410 FOR I=1 TO 500:NEXT I:GOTO 240 1420 IF CX<>13 THEN GOTO 1470 1430 IF CY<>7 THEN GOTO 1470 1440 TXA=USR(ADR(TXA$)):A=PEEK(206):REM Execute TXA op code 1450 POSITION 15,15:PRINT #6; A 1460 FOR I=1 TO 500:NEXT I:GOTO 240 1470 IF CX<>13 THEN GOTO 1600 1480 IF CY<>8 THEN GOTO 1600 1490 TYA=USR(ADR(TYA$)):A=PEEK(206):REM Execute TYA op code 1500 POSITION 15,15:PRINT #6; A 1510 FOR I=1 TO 500:NEXT I:GOTO 240 1600 GOTO 240 2000 REM ****************************************** 2001 REM *** MEMORY AND GRAPHICS INITIALIZATION *** 2002 REM ****************************************** 2010 MEMTOP=PEEK(106):REM Find top of RAM 2020 GRTOP=MEMTOP-4:REM Make room for character set 2030 POKE 106,GRTOP:REM New top of RAM 2040 CHRAM=GRTOP*256:REM Address for character set 2050 DIM CSET$(50):REM Initialize strings 2060 DIM ADC$(10):DIM DEC$(6):DIM DEX$(9) 2070 DIM DEY$(9):DIM INC$(6):DIM INX$(9) 2080 DIM INY$(9):DIM LDA$(8):DIM LDX$(8) 2090 DIM LDY$(8):DIM SBC$(11):DIM STA$(8) 2100 DIM STX$(8):DIM STY$(8):DIM TAX$(9) 2110 DIM TAY$(9):DIM TXA$(9):DIM TYA$(9) 2120 GRAPHICS 1+16:POKE 752,1:REM Set GR1 & clear the cursor 2300 RETURN 3000 REM ************************* 3001 REM *** DRAW TITLE SCREEN *** 3002 REM ************************* 3010 SETCOLOR 0,12,10:REM Green text, upper case 3020 SETCOLOR 1,9,8:REM Blue text, lower case 3030 SETCOLOR 4,0,0:REM Black background 3040 PRINT #6;CHR$(125):REM Clear the screen 3050 POSITION 0,0:PRINT #6; "THE INTERACTIVE 6502" 3060 POSITION 0,1:PRINT #6; "____________________" 3070 POSITION 2,3:PRINT #6; "ADC INY STX" 3080 POSITION 2,4:PRINT #6; "DEC LDA STY" 3090 POSITION 2,5:PRINT #6; "DEX LDX TAX" 3100 POSITION 2,6:PRINT #6; "DEY LDY TAY" 3110 POSITION 2,7:PRINT #6; "INC SBC TXA" 3120 POSITION 2,8:PRINT #6; "INX STA TYA" 3130 POSITION 0,9:PRINT #6; "____________________" 3140 POSITION 0,12:PRINT #6; " by" 3150 POSITION 0,14:PRINT #6; " jason h moore " 3160 POSITION 0,18:PRINT #6; "____________________" 3170 POSITION 0,20:PRINT #6; " please wait " 3200 RETURN 4000 REM *************************************** 4001 REM *** MOVE AND REDEFINE CHARACTER SET *** 4002 REM *************************************** 4010 FOR I=1 TO 50:REM Read in machine language commands 4020 READ DAT:CSET$(I)=CHR$(DAT):REM Store code in string 4030 NEXT I:REM Loop 4040 GO=USR(ADR(CSET$),GRTOP,1,4):REM Execute machine code 4100 POUND=CHRAM+24:REM Address for # symbol to change 4110 FOR ADDR=POUND TO POUND+7:REM Change # to filled square 4120 READ DAT:POKE ADDR,DAT:REM Read new char data & put in memory 4130 NEXT ADDR:REM Loop 4140 POKE 756,GRTOP:REM Tell ANTIC Location of character set 4200 RETURN 5000 REM *************************************************** 5001 REM *** READ IN MACHINE LANGUAGE ROUTINES (OPCODES) *** 5002 REM *************************************************** 5010 FOR I=1 TO 10:REM ADC 5020 READ DAT:ADC$(I)=CHR$(DAT) 5030 NEXT I:REM 5040 FOR I=1 TO 6:REM DEC 5050 READ DAT:DEC$(I)=CHR$(DAT) 5060 NEXT I 5070 FOR I=1 TO 9:REM DEX 5080 READ DAT:DEX$(I)=CHR$(DAT) 5090 NEXT I 5100 FOR I=1 TO 9:REM DEY 5110 READ DAT:DEY$(I)=CHR$(DAT) 5120 NEXT I 5130 FOR I=1 TO 6:REM INC 5140 READ DAT:INC$(I)=CHR$(DAT) 5150 NEXT I 5160 FOR I=1 TO 9:REM INX 5170 READ DAT:INX$(I)=CHR$(DAT) 5180 NEXT I 5190 FOR I=1 TO 9:REM INY 5200 READ DAT:INY$(I)=CHR$(DAT) 5210 NEXT I 5220 FOR I=1 TO 8:REM LDA 5230 READ DAT:LDA$(I)=CHR$(DAT) 5240 NEXT I 5250 FOR I=1 TO 8:REM LDX 5260 READ DAT:LDX$(I)=CHR$(DAT) 5270 NEXT I 5280 FOR I=1 TO 8:REM LDY 5290 READ DAT:LDY$(I)=CHR$(DAT) 5300 NEXT I 5310 FOR I=1 TO 11:REM SBC 5320 READ DAT:SBC$(I)=CHR$(DAT) 5330 NEXT I 5340 FOR I=1 TO 8:REM STA 5350 READ DAT:STA$(I)=CHR$(DAT) 5360 NEXT I 5370 FOR I=1 TO 8:REM STX 5380 READ DAT:STX$(I)=CHR$(DAT) 5390 NEXT I 5400 FOR I=1 TO 8:REM STY 5410 READ DAT:STY$(I)=CHR$(DAT) 5420 NEXT I 5430 FOR I=1 TO 9:REM TAX 5440 READ DAT:TAX$(I)=CHR$(DAT) 5450 NEXT I 5460 FOR I=1 TO 9:REM TAY 5470 READ DAT:TAY$(I)=CHR$(DAT) 5480 NEXT I 5490 FOR I=1 TO 9:REM TXA 5500 READ DAT:TXA$(I)=CHR$(DAT) 5510 NEXT I 5520 FOR I=1 TO 9:REM TYA 5530 READ DAT:TYA$(I)=CHR$(DAT) 5540 NEXT I 5900 RETURN 6000 REM *********************** 6001 REM *** DRAW THE SCREEN *** 6002 REM *********************** 6020 SETCOLOR 0,12,10:REM Green text, black background 6030 PRINT #6;CHR$(125):REM Clear the screen 6040 POSITION 0,0:PRINT #6; "THE INTERACTIVE 6502" 6050 POSITION 0,1:PRINT #6; "____________________" 6060 POSITION 2,3:PRINT #6; "ADC INY STX" 6070 POSITION 2,4:PRINT #6; "DEC LDA STY" 6080 POSITION 2,5:PRINT #6; "DEX LDX TAX" 6090 POSITION 2,6:PRINT #6; "DEY LDY TAY" 6100 POSITION 2,7:PRINT #6; "INC SBC TXA" 6110 POSITION 2,8:PRINT #6; "INX STA TYA" 6120 POSITION 0,9:PRINT #6; "____________________" 6130 POSITION 2,11:PRINT #6; "RAM 6502 CPU" 6140 POSITION 2,13:PRINT #6; "203 X Y A" 6150 POSITION 2,14:PRINT #6; "### #######" 6160 POSITION 2,15:PRINT #6; "#0#######0#0#0#" 6170 POSITION 2,16:PRINT #6; "### #######" 6180 POSITION 6,16:PRINT #6; "BUS" 6190 POSITION 0,18:PRINT #6; "____________________" 6200 POSITION 0,20:PRINT #6; "PRESS START TO RESET" 6300 RETURN 9000 REM ****************************************** 9001 REM *** MACHINE LANGUAGE ROUTINES AND DATA *** 9002 REM ****************************************** 9010 REM MOVE CHARACTER SET 9010 DATA 104,169,224,133,206,104,104,133,204,104,104,201,1 9020 DATA 240,4,230,206,230,204,104,104,141,176,6,169,0,133 9030 DATA 205,133,203,168,177,205,145,203,200,208,249,230 9040 DATA 206,230,204,206,176,6,208,240,96,0,0 9100 REM DATA FOR CUSTOM CHARACTER, # -> FILLED SQUARE 9110 DATA 255,255,255,255,255,255,255,255 9200 REM ASSEMBLY ROUTINE FOR ADC 9210 REM PLA,CLC,CLD,LDA page 0,206,ADC,203,STA page 0,206,RTS 9220 DATA 104,216,24,165,206,101,203,133,206,96 9230 REM ASSEMBLY ROUTINE FOR DEC 9240 REM PLA,CLC,CLD,DEC,203,RTS 9250 DATA 104,216,24,198,203,96 9260 REM ASSEMBLY ROUTINE FOR DEX 9270 REM PLA,CLC,CLD,LDX page 0,204,DEX,STX page 0,204,RTS 9280 DATA 104,216,24,166,204,202,134,204,96 9290 REM ASSEMBLY ROUTINE FOR DEY 9300 REM PLA,CLC,CLD,LDY page 0,205,DEY,STY page 0,205,RTS 9310 DATA 104,216,24,164,205,136,132,205,96 9320 REM ASSEMBLY ROUTINE FOR INC 9330 REM PLA,CLC,CLD,INC,203,RTS 9340 DATA 104,216,24,230,203,96 9350 REM ASSEMBLY ROUTINE FOR INX 9360 REM PLA,CLC,CLD,LDX page 0,204,INX,STX page 0,204,RTS 9370 DATA 104,216,24,166,204,232,134,204,96 9380 REM ASSEMBLY ROUTINE FOR INY 9390 REM PLA,CLC,CLD,LDY page 0,205,INY,STY page 0,205,RTS 9400 DATA 104,216,24,164,205,200,132,205,96 9410 REM ASSEMBLY ROUTINE FOR LDA 9420 REM PLA,CLC,CLD,LDA page 0,203,STA page 0,206,RTS 9430 DATA 104,216,24,165,203,133,206,96 9440 REM ASSEMBLY ROUTINE FOR LDX 9450 REM PLA,CLC,CLD,LDX page 0,203,STX page 0,204,RTS 9460 DATA 104,216,24,166,203,134,204,96 9470 REM ASSEMBLY ROUTINE FOR LDY 9480 REM PLA,CLC,CLD,LDY page 0,203,STY page 0,205,RTS 9490 DATA 104,216,24,164,203,132,205,96 9500 REM ASSEMBLY ROUTINE FOR SBC 9510 REM PLA,CLC,CLD,SEC,LDA page 0,206,SBC,203, 9520 REM STA page 0,206,RTS 9530 DATA 104,216,24,56,165,206,229,203,133,206,96 9540 REM ASSEMBLY ROUTINE FOR STA 9550 REM PLA,CLC,CLD,LDA page 0,206,STA page 0,203,RTS 9560 DATA 104,216,24,165,206,133,203,96 9570 REM ASSEMBLY ROUTINE FOR STX 9580 REM PLA,CLC,CLD,LDX page 0,204,STX page 0,203,RTS 9590 DATA 104,216,24,166,204,134,203,96 9600 REM ASSEMBLY ROUTINE FOR STY 9610 REM PLA,CLC,CLD,LDY page 0,205,STY page 0,203,RTS 9620 DATA 104,216,24,164,205,132,203,96 9630 REM ASSEMBLY ROUTINE FOR TAX 9640 REM PLA,CLC,CLD,LDA page 0,206,TAX,STX page 0,204,RTS 9650 DATA 104,216,24,165,206,170,134,204,96 9660 REM ASSEMBLY ROUTINE FOR TAY 9670 REM PLA,CLC,CLD,LDA page 0,206,TAY,STY page 0,205,RTS 9680 DATA 104,216,24,165,206,168,132,205,96 9690 REM ASSEMBLY ROUTINE FOR TXA 9700 REM PLA,CLC,CLD,LDX page 0,204,TXA,STA page 0,206,RTS 9710 DATA 104,216,24,166,204,138,133,206,96 9720 REM ASSEMBLY ROUTINE FOR TYA 9730 REM PLA,CLC,CLD,LDY page 0,205,TYA,STA page 0,206,RTS 9740 DATA 104,216,24,164,205,152,133,206,96