** CVT ESP Board ** * Ver 2 with Start and other fixes *** 1 REM DECLARATIONS ******************************** *** DEFINE CONSTANTS *** ******************************** ADDR EQU $60 ; 3 REM ADDRESS OF THE SOFTCARD CARD P0ARD EQU $62 ; 4 REM PORT0 ADDRESS TO SEND DATA P1ARD EQU $64 ; 5 REM PORT1 ADDRESS TO RECEIVE DATA VAPPLE EQU 84 ; 6 REM APPLE VIDEO ON VESP32 EQU 85 ; 7 REM APPLE VIDEO OFF KB EQU 'K' ; 10 REM KEYBOARD BYTE JX EQU 'X' ; 11 REM JOYSTICK X BYTE JY EQU 'Y' ; 12 REM JOYSTICK Y BYTE B1 EQU '1' ; 13 REM JOYSTICK BUTTON 1 BYTE B2 EQU '2' ; 14 REM JOYSTICK BUTTON 2 BYTE RDY EQU 6 ; 24 REM INITIALIZED AND READY BYTE PREAD EQU $FB1E ; Monitor paddle read routine HOME EQU $FC58 ; Monitor home routine PRHEX EQU $FDE3 ; Monitor print hex char routine COUT EQU $FDF0 ; Monitor print char routine ptr EQU $66 ; 16-bit pointer in page 0 ******************************** *** DEFINE VARIABLES *** ******************************** ORG $2FE0 ; Variables start here jmp Start SLOT DB $FF ; 2 REM SLOT OF THE ESP32 SOFTCARD VID DB 0 ; 8 REM CURRENT VIDEO MODE CANEXIT DB 0 ; 9 REM IF TRUE, THE PROGRAM CAN EXIT XLAST DB 0 ; 15 REM PREVIOUS X POSITION OF JOYSTICK YLAST DB 0 ; 16 REM PREVIOUS Y POSITION OF JOYSTICK XCURRENT DB 0 ; 17 REM CURRENT X POSITION OF JOYSTICK YCURRENT DB 0 ; 18 REM CURRENT Y POSITION OF JOYSTICK L1 DB 0 ; 19 REM PREVIOUS BUTTON 1 STATE L2 DB 0 ; 20 REM PREVIOUS BUTTON 2 STATE C1 DB 0 ; 21 REM CURRENT BUTTON 1 STATE C2 DB 0 ; 22 REM CURRENT BUTTON 2 STATE KEY DB 0 ; 23 REM KEYBOARD CODE s DB 0 ; loop variable for printing DS $3000-* ; ORG $2000 ; Code starts here *** 260 REM FIRST DETERMINE THE SLOT OF THE ESP32 SOFTCARD *** 270 PRINT CHR$(13) + "CHECKING SLOT: "; Start jsr print ;Print string below until 0 hex 8D ASC "CHECKING SLOT: ",00 *** 280 FOR S = 0 TO 7 *** 290 ADDR = (3080 + S) * 16 *** 300 PRINT STR$(S) + " "; *** 310 VID = PEEK(ADDR + 1) *** 320 IF VID = VAPPLE OR VID = VESP32 *** THEN SLOT = S : P0ARD = ADDR *** 330 NEXT S lda #$C0 ;Set up ADDR to $C0xx sta ADDR+1 sta P0ARD+1 ;as well as P0ARD sta P1ARD+1 ;and P1ARD ldx #0 ;Init loop srch_lp stx s ;and save in s txa pha ;save raw slot# jsr PRHEX ;print slot number jsr print asc " :",00 pla ;recover raw number asl ;multiply by 8 asl asl ora #$80 ;add $80 sta ADDR ldy #1 lda (ADDR),y ; sta VID ;and save in VID cmp #VAPPLE beq srchDone cmp #VESP32 beq srchDone inx ;try next slot cpx #8 bne srch_lp srchDone stx SLOT lda ADDR sta P0ARD sta P1ARD *** 343 PRINT CHR$(13) *** 350 IF P0ARD = 0 THEN PRINT "ESP32 CARD NOT FOUND" : END lda #$8D ;print CR jsr COUT cpx #8 ;did we find board? bne boardOK jsr print asc "ESP32 CARD NOT FOUND",8D00 rts *** 360 P1ARD = P0ADR + 1 : REM PORT1 ADDRESS *** 370 PRINT "ESP32 SOFTCARD FOUND IN SLOT " + STR$(SLOT) *** 380 PRINT "PLEASE PLUG THE MONITOR THROUGH THE CARD" boardOK inc P1ARD jsr print asc "ESP32 SOFTCARD FOUND IN SLOT ",00 lda s jsr PRHEX ;print slot number jsr print hex 8D asc "PLEASE PLUG THE MONITOR THROUGH THE CARD",8D00 *** 390 FOR S = 0 TO 1000 : NEXT S *** 400 POKE P0ARD, RDY : REM SEND READY TO THE CARD lda #RDY ldy #0 sta (P0ARD),Y *** 420 ; REM MAIN LOOP *** 430 VID = PEEK(P1ARD) *** 440 IF VID = VAPPLE AND CANEXIT = 1 ; THEN HOME : END MainLp lda (P1ARD),Y cmp #VAPPLE bne cont lda CANEXIT beq cont jsr HOME rts *** 450 KEY = PEEK(49152) *** 460 IF KEY > 127 THEN GET DUMMY$ : POKE P0ARD, KB : *** POKE P0ARD, KEY : CANEXIT = 1 cont lda $C000 ;check for keypress bpl noKey pha bit $C010 ;clear strobe lda #KB ldy #0 sta (P0ARD),y pla sta (P0ARD),y lda #1 sta CANEXIT *** 470 XCURRENT = PDL(0) *** 480 IF XCURRENT <> XLAST THEN POKE P0ARD, JX : *** POKE P0ARD, XCURRENT : XLAST = XCURRENT noKey ldx #0 jsr PREAD sty XCURRENT cpy XLAST beq :1 lda #JX ldy #0 sta (P0ARD),y lda XCURRENT sta (P0ARD),y sta XLAST *** 490 C1 = PEEK(49249) *** 500 IF C1 <> L1 THEN POKE P0ARD, B1 : *** POKE P0ARD, C1 : L1 = C1 :1 lda $C061 ;get pb(0) cmp L1 ;compare with prev state beq :2 ;no change lda #B1 ldy #0 sta (P0ARD),y lda C1 sta (P0ARD),y sta L1 *** 510 C2 = PEEK(49250) *** 520 IF C2 <> L2 THEN POKE P0ARD, B2 : *** POKE P0ARD, C2 : L2 = C2 :2 lda $C062 ;get pb(1) cmp L2 ;compare with prev state beq :3 ;no change lda #B2 ldy #0 sta (P0ARD),y lda C2 sta (P0ARD),y sta L2 *** 530 YCURRENT = PDL(1) *** 540 IF YCURRENT <> YLAST THEN POKE P0ARD, JY : *** POKE P0ARD, YCURRENT : YLAST = YCURRENT :3 ldx #1 jsr PREAD sty YCURRENT cpy YLAST beq :4 lda #JY ldy #0 sta (P0ARD),y lda YCURRENT sta (P0ARD),y sta YLAST *** 550 GOTO 430 :4 jmp cont ******************************** *** PRINT ROUTINE *** *** *** *** prints chars after jsr *** *** until 00 encountered *** ******************************** print pla ;get pointer to string from stack sta ptr pla sta ptr+1 bne incPtr ;which is one byte after jsr prtChar jsr COUT ;print the character incPtr inc ptr ;get next character bne :1 inc ptr+1 :1 ldy #0 lda (ptr),y bne prtChar ;if not 00, keep printing lda ptr+1 ;otherwise, restore stack pha lda ptr pha rts ;and return