****************************** * LordDragon's Keyboard routine v0.1 * This is totally a work i progress and I take no responsibility if it makes your coco tear * a hole in space-time that swallows up the Earth :P * Feel free to email me: todd@tektodd.com * I'm usually on FB group and Discord @lorddragon * (hopefully someday i will add key repeat) * Entry: call POLDRAGON * Exit: A will be 0 for no keypress, ASCII code otherwise. All other registers are preserved. ****************************** pragma cescapes ********************************** * MY ROUTINE DEPENDS ON IRQ_POLL_KEYBOARD ROUTINE BEING IN A 60HZ INTERRUPT TO SAMPLE THE KEYBOARD * IT WONT WORK WITHOUT IT. I LEAVE IT UP TO YOU HOW YOU WANT TO IMPLEMENT THAT :) * YOU WILL ALSO NEED TO SETUP THE PIA CORRECTLY (SAME WAY BASIC DOES IT). HERE IS AN EXAMPLE * * clra * sta $FF01 ; kill HSYNC and set $FF00 for data direction * sta $FF00 ; set $FF00 as input * ora #%00000100 * sta $FF01 ; set $FF00 back into normal mode so we can use it * lda #%00110001 ; enable VSYNC interrupt and set $FF02 for data direciton * sta $FF03 * ldb #$FF * stb $FF02 ; set $FF02 as output * ora #%00000100 * sta $FF03 ; set $FF02 back into normal mode so we can use it ********************************* IRQ_POLL_KEYBOARD ldx #keyboardBuffer ldb #%01111111 stb $FF02 lda $FF00 sta ,X+ ldb #%10111111 stb $FF02 lda $FF00 sta ,X+ ldb #%11011111 stb $FF02 lda $FF00 sta ,X+ ldb #%11101111 stb $FF02 lda $FF00 sta ,X+ ldb #%11110111 stb $FF02 lda $FF00 sta ,X+ ldb #%11111011 stb $FF02 lda $FF00 sta ,X+ ldb #%11111101 stb $FF02 lda $FF00 sta ,X+ ldb #%11111110 stb $FF02 lda $FF00 sta ,X lda $FF02 ; ACK IRQ rti *********************************************** POLDRAGON pshs B,X,Y,U clr keyResult ldx #asciiKeyTable ldy #keyboardBuffer ldu #rolloverTable lda #8 sta columnCounter POLDRAGON_NEXT_COLUMN pshs X ldb ,Y+ orb #%10000000 ; mask out joystick bit lda keyboardBuffer bita #%01000000 beq POLDRAGON_SHIFT_PRESSED ; if we are here, shift is NOT pressed. leax 6,X POLDRAGON_SHIFT_PRESSED lda keyboardBuffer+7 coma ; invert the bits so we can properly test anda #%01000000 beq POLDRAGON_SKIP_ENTER_CHECK bita rolloverTable+7 bne POL_DRAGON_ENTER_KEY POLDRAGON_SKIP_ENTER_CHECK ; check for clear key lda #%01000000 bita keyboardBuffer+6 bne POLDRAGON_SKIP_CLEAR_CHECK bita rolloverTable+6 bne POLDRAGON_CLEAR_KEY POLDRAGON_SKIP_CLEAR_CHECK jsr SCAN_FOR_ASCII beq POLDRAGON_SAVE_STATE sta keyResult POLDRAGON_SAVE_STATE stb ,U+ puls X dec columnCounter beq POLDRAGON_DONE_ALL_COLUMNS leax 12,X bra POLDRAGON_NEXT_COLUMN POL_DRAGON_ENTER_KEY lda #$0D sta keyResult bra POLDRAGON_SAVE_STATE POLDRAGON_CLEAR_KEY lda #$0C sta keyResult bra POLDRAGON_SAVE_STATE POLDRAGON_DONE_ALL_COLUMNS lda keyResult puls U,Y,X,B,PC ; ------------------------------ ; Entry: B = current row value from PIA ; U = pointing to rollover table for appropriate column ; X = pointing to ascii table for column/row character ; ----------------------------- SCAN_FOR_ASCII pshs B lda #6 sta rowCounter lda ,U SCAN_FOR_ASCII_NEXT_ROW lsrb bcc SCAN_FOR_ASCII_CHECK_ROLLOVER dec rowCounter beq SCAN_FOR_ASCII_ZERO lsra bra SCAN_FOR_ASCII_NEXT_ROW SCAN_FOR_ASCII_CHECK_ROLLOVER lsra bcs SCAN_FOR_ASCII_NOT_ALREADY_PRESSED dec rowCounter beq SCAN_FOR_ASCII_ZERO bra SCAN_FOR_ASCII_NEXT_ROW SCAN_FOR_ASCII_NOT_ALREADY_PRESSED ldb #6 subb rowCounter lda B,X bra SCAN_FOR_ASCII_EXIT SCAN_FOR_ASCII_ZERO clra SCAN_FOR_ASCII_EXIT puls B,PC *************************************** asciiKeyTable FCC "GOW '?" FCC "gow 7/" FCC "FNV\t&>" FCC "fnv\t6." FCC "EMU\b%=" FCC "emu\b5-" FCC "DLT\n$<" FCC "dlt\n4," FCC "CKS\v#+" FCC "cks\v3;" FCC "BJRZ\x22*" FCC "bjrz2:" FCC "AIQY!)" FCC "aiqy19" FCC "@HPX0(" FCC "@hpx08" keyboardBuffer FILL $FF,8 rowCounter FCB $00 rolloverTable FILL $FF,8 columnCounter FCB 8 keyResult FCB $00