diff --git a/code/6502/kernel/kernel.o b/code/6502/kernel/kernel.o index 21d0cc3..260ffbf 100644 Binary files a/code/6502/kernel/kernel.o and b/code/6502/kernel/kernel.o differ diff --git a/code/6502/kernel/kernel.o.lmap b/code/6502/kernel/kernel.o.lmap index 98a551b..21cb360 100644 --- a/code/6502/kernel/kernel.o.lmap +++ b/code/6502/kernel/kernel.o.lmap @@ -1,129 +1,170 @@ - HBC56_RST_VECTOR = $ed9b ; ? + HBC56_RST_VECTOR = $f124 ; ? AY_ENV_SHAPE_SAW1 = $8 ; unused tmsConsoleBackspace = $ea2a ; ? NES_RAM_SIZE = $1 UART_ZP_START = $28 TMS_LT_RED = $9 ; unused - HBC56_TMP = $7ba2 + UART_STATUS_RCVR_OVERRUN = $20 ; unused + HBC56_TMP = $7ca2 + KB_SCANCODE_ESC = $76 ; unused AY_ENV_SHAPE_SAW2 = $c ; unused TMS_GFX_TILE_WIDTH = $8 LCD_RAM_END = $7b58 TMS_SPRITE_SIZE = $8 + KB_SCANCODE_ARROW_RIGHT = $f4 ; unused + KB_CAPS_LOCK = $8 + KB_EXT_KEY = $e0 VIA_RAM_SIZE = $1 - HBC56_VSYNC_CALLBACK = $7bb9 + HBC56_VSYNC_CALLBACK = $7cb9 isLower = $e000 TMS_R1_SPRITE_MAG2 = $1 ; unused + KB_BUFFER_MASK = $f + KB_SCANCODE_SLASH_FORWARD = $4a ; unused AY_PORTB = $f ; unused TMS_R1_RAM_16K = $80 AY_PORTA = $e ; unused TMS_R1_SPRITE_MAG1 = $0 ; unused TMS_FPS = $3c - VIA_TMP = $7b58 ; unused + kbInit = $eb02 + VIA_TMP = $7c58 ; unused tmsSetAddressNextRow = $e583 ; unused - UART_IRQ_BIT = $4 ; unused + UART_IRQ_BIT = $4 tmsModeText = $e691 ; unused VIA_REG_IFR = $d _tmsSendKb = $e6ee ; ? + UART_STATUS_RX_REG_FULL = $1 tmsReg1SetFields = $e5d0 BITMAP_ZP_START = $1e JMP_OPCODE = $4c - hbc56IntHandler = $ed17 + hbc56IntHandler = $f09a TILEMAP_RAM_START = $7a00 - KB_RAM_END = $7b9c + KB_SCANCODE_SCROLL_LOCK = $7e ; unused + KB_RAM_END = $7c9c AY_ENV_SHAPE_HOLD = $1 TMS_R0_MODE_GRAPHICS_II = $2 + KB_SHIFT_LEFT_MAP_BYTE = $2 VIA_IO_ADDR_IFR = $7ffd ; unused VIA_IO_ADDR_T1C_H = $7ff5 ; unused - MEMORY_ZP_END = $2e + MEMORY_ZP_END = $32 TMS_R1_SPRITE_8 = $0 ; unused VIA_REG_T1L_H = $7 + KB_SCANCODE_PRTSCR = $92 ; unused + KB_SCANCODE_SLASH_BACK = $5d ; unused VIA_IO_ADDR_T1C_L = $7ff4 ; unused AY_WRITE = $1 + UART_STATUS_CARRIER_DETECT = $4 ; unused VIA_REG_T1L_L = $6 + KB_PRESSED_MAP = $7c76 TMS9918_ZP_START = $24 tmsDecPosConsole = $e90b + UART_CTL_WORD_8BIT_1SB = $14 ; unused HBC56_CONSOLE_FLAG_LCD = $20 ; unused TMS_CYAN = $7 - HBC56_TITLE = $ea60 + HBC56_TITLE = $ede3 memcpyMultiPage = $e0bf ; unused + KB_SCANCODE_NUM_LOCK = $77 ; unused TILEMAP_RAM_END = $7b16 VIA_DIR_OUTPUT = $ff ; unused + KB_BUFFER_TAIL = $7c65 tmsSetRegister = $e5ad - hbc56Tms9918Int = $ed4b ; ? + hbc56Tms9918Int = $f0d4 ; ? + KB_SCANCODE_NUMPAD_ENTER = $da ; unused + UART_STATUS_TX_REG_EMPTY = $2 + UART_RX_BUFFER_XOFF_SIZE = $c0 + KB_FLAGS = $7c5c TMS_VRAM_SPRITE_ATTR_ADDRESS2 = $3b80 ; unused TMS_VRAM_SPRITE_ATTR_ADDRESS3 = $3f00 ; unused HBC56_NMI_VECTOR = $7e04 + KB_SCANCODE_SQUARE_LEFT = $54 ; unused BITMAP_ZP_END = $24 + UART_CTL_CLOCK_DIV_64 = $2 toUpper = $e06b ; unused VIA_IO_ADDR = $7ff0 tableBitsFromLeft = $e150 ; unused TMS_VRAM_SPRITE_ATTR_ADDRESS4 = $3f80 ; unused - NES_TMP = $7b9c ; unused - HBC56_META_TITLE_END = $7bb7 - SFXMAN_RAM_START = $7b59 + NES_TMP = $7c9c ; unused + HBC56_META_TITLE_END = $7cb7 + uartFlowCtrlXoff = $ea8b ; ? + SFXMAN_RAM_START = $7c59 + uartInWait = $ea94 + uartOutString = $ead8 ; unused RTI_OPCODE = $40 + KB_SCANCODE_PAGE_UP = $fd ; unused AY_ENV_SHAPE_FADE_OUT = $9 ; unused tmsModeBitmap = $e60e ; unused TMS_VRAM_SPRITE_ATTR_ADDRESS = $3b00 NOTE_FREQ_AS8 = 7458.619999999999890860635787248611 ; unused - HBC56_TMP_Y = $7ba5 + HBC56_TMP_Y = $7ca5 + KB_SCANCODE_TILDE = $e ; unused HBC56_TITLE_LEN = $1a - UART_IO_PORT = $20 ; unused + UART_IO_PORT = $20 TMS9918_RAM_END = $7b58 AY_S0_ADDR = $7f40 ; unused TMS9918_ZP_SIZE = $2 - HBC56_TMP_X = $7ba4 + HBC56_TMP_X = $7ca4 NOTE_FREQ_AS5 = 932.330000000000040927261579781771 ; unused TMS_MED_GREEN = $2 ; unused TMS_WHITE = $f - HBC56_KERNEL_ZP_END = $32 + KB_SCANCODE_WINDOWS_RIGHT = $a7 ; unused + HBC56_KERNEL_ZP_END = $36 AY_S1_WRITE = $7f45 ; unused NOTE_FREQ_AS4 = 466.160000000000025011104298755527 ; unused VIA_REG_DDR_B = $2 NOTE_FREQ_AS7 = 3729.309999999999945430317893624306 ; unused TMS_TMP_ADDRESS = $24 + KB_SCANCODE_PERIOD = $49 ; unused VIA_REG_DDR_A = $3 - HBC56_DISABLE_KEYBOARD = $1 - tableBitFromLeft = $e130 ; unused + tableBitFromLeft = $e130 NOTE_FREQ_AS6 = 1864.660000000000081854523159563541 ; unused AY_NOISE_GEN = $6 ; unused NOTE_FREQ_AS1 = 58.270000000000003126388037344441 ; unused AY_S0_WRITE = $7f41 ; unused NOTE_FREQ_AS0 = 29.140000000000000568434188608080 ; unused tmsSetAddressRead = $e59f - VIA_RAM_START = $7b58 + VIA_RAM_START = $7c58 NOTE_FREQ_AS3 = 233.080000000000012505552149377763 ; unused + UART_RX_BUFFER_TAIL = $29 tmsSetPatternRead = $e9a6 ; unused AY_S1_ADDR = $7f44 ; unused NOTE_FREQ_AS2 = 116.540000000000006252776074688882 ; unused + UART_RX_BUFFER = $7b58 TMS_R1_SPRITE_16 = $2 ; unused TMS_GFX_PIXELS_Y = $c0 ; unused TMS_GFX_PIXELS_X = $100 ; unused + KB_SCANCODE_NUMPAD_MULTIPLY = $7c ; unused HBC56_DISABLE_SFXMAN = $1 tmsSetAddressWrite = $e58f TMS_MAGENTA = $d ; unused LCD_IO_PORT = $2 ; unused tmsConsoleScrollLine = $e876 + KB_SCANCODE_CTRL_RIGHT = $94 ; unused _tmsSendEmptyPage = $e72d - HBC56_TITLE_TEXT = $ea60 + KB_BUFFER_SIZE = $10 + KB_SCANCODE_COMMA = $41 ; unused + HBC56_TITLE_TEXT = $ede3 AY_R10 = $8 AY_IO_PORT = $40 AY_R11 = $9 NES_LEFT = $2 ; unused AY_R12 = $a TMS_R1_DISP_BLANK = $0 ; unused - hbc56LogoPatt = $eadd - kernelMain = $ed9b ; ? + KB_NUM_LOCK = $10 ; unused + hbc56LogoPatt = $ee60 + kernelMain = $f124 ; ? AY_R13 = $b - hbc56LogoPattEnd = $ec55 ; unused + hbc56LogoPattEnd = $efd8 ; unused ASCII_CR = $d ; unused AY_R14 = $c + KB_SCANCODE_PAGE_DOWN = $fa ; unused + kbIntHandler = $eb3d IO_PORT_BASE_ADDRESS = $7f00 AY_R15 = $d isDigit = $e01e AY_R16 = $e HAVE_TMS9918 = $1 + UART_CTL_MASTER_RESET = $3 AY_R17 = $f + KB_SCANCODE_TAB = $d ; unused HBC56_KERNEL_ZP_START = $18 TMS9918_IRQ_BIT = $1 HBC56_BORDER = $4 @@ -133,35 +174,58 @@ AY_ENV_SHAPE_TRIANGLE2 = $a ; unused TMS_VRAM_SPRITE_PATT_ADDRESS = $1800 HBC56_CONSOLE_FLAG_NOWAIT = $10 + KB_SCANCODE_ENTER = $5a ; unused KB_IO_PORT = $80 AY_ENV_SHAPE_ATTACK = $4 + UART_STATUS_IRQ = $80 ; unused VIA_REG_PFR = $c ; unused NES_DOWN = $4 ; unused tmsReg1ClearFields = $e5da NES_SELECT = $20 ; unused - hbc56Stop = $eee6 + hbc56Stop = $f2a3 + UART_RX_BUFFER_SIZE = $100 + KB_BUFFER = $7c66 DEFAULT_HBC56_NMI_VECTOR = $ffe0 ; unused NES1_IO_ADDR = $7f82 + UART_CTL_WORD_7BIT_OPB_1SB = $c ; unused + KB_SCANCODE_NUMPAD_PLUS = $79 ; unused NES2_IO_ADDR = $7f83 BITMAP_RAM_END = $7b26 + KB_SCANCODE_F2 = $6 ; unused HBC56_TITLE_TEXT_LEN = $1a NES_UP = $8 ; unused + KB_SCANCODE_F3 = $4 ; unused VIA_DIR_INPUT = $0 ; unused - DELAY_L = $30 + DELAY_L = $34 TMS_TXT_TILES_X = $28 ASCII_BACKSPACE = $8 ; unused TMS_TXT_TILES_Y = $18 + KB_SCANCODE_F1 = $5 ; unused + KB_SCANCODE_SEMICOLON = $4c ; unused + KB_SCANCODE_F6 = $b ; unused TMS_R1_DISP_ACTIVE = $40 tmsInitColorTable = $e7a9 - DELAY_H = $31 + KB_SCANCODE_F7 = $83 ; unused + KB_SCANCODE_HOME = $ec ; unused + DELAY_H = $35 + KB_SCANCODE_F4 = $c ; unused tmsSetPosTmpAddress = $e834 - hbc56Reset = $eee3 ; unused - hbc56CustomDelayMs = $eee9 ; unused + uartInNoWait = $ea9e ; unused + hbc56Reset = $f2a0 ; unused + KB_SCANCODE_F5 = $3 ; unused + hbc56CustomDelayMs = $f2a6 ; unused + uartOut = $eac1 ; ? + KB_TMP_X = $7c5d + KB_SCANCODE_F8 = $a ; unused HBC56_KERNEL_RAM_START = $7a00 + KB_TMP_Y = $7c5e ; unused + KB_SCANCODE_F9 = $1 ; unused tmsConsolePrint = $e9f3 ; unused tmsConsoleCls = $e928 ; unused + uartIrq = $ea5c TMS_BLACK = $1 - HBC56_META_TITLE = $7ba6 + HBC56_META_TITLE = $7ca6 + KB_SCANCODE_SQUARE_RIGHT = $5b ; unused tmsConsoleNewline = $ea03 ; ? AY_S1 = $7f44 NOTE_FREQ_C8 = 4186.010000000000218278728425502777 ; unused @@ -169,8 +233,8 @@ tmsModeGraphicsII = $e670 ; unused AY_S0 = $7f40 NOTE_FREQ_A8 = $1b80 ; unused - HBC56_TICKS = $7b9f - HBC56_SECONDS_H = $7ba1 + HBC56_TICKS = $7c9f + HBC56_SECONDS_H = $7ca1 memcpySinglePage = $e0a3 ; unused tmsModeGraphicsI = $e5fb NOTE_FREQ_G8 = 6271.930000000000291038304567337036 ; unused @@ -182,27 +246,32 @@ tmsInitEntireColorTable = $e7a7 ; ? TMS_GREY = $e NES_B = $40 ; unused - HBC56_SECONDS_L = $7ba0 + HBC56_SECONDS_L = $7ca0 AY_PSG1 = $4 + UART_CTL_WORD_7BIT_EPB_1SB = $8 ; unused NES_A = $80 ; unused TMS9918_IO_PORT = $10 - UART_RAM_END = $7b58 + UART_RAM_END = $7c58 AY_PSG0 = $0 + UART_FLOWCTRL_XON = $11 DEFAULT_HBC56_RST_VECTOR = $8000 NOTE_FREQ_C0 = 16.350000000000001421085471520200 ; unused NOTE_FREQ_A1 = $37 ; unused NOTE_FREQ_G2 = $62 ; unused NOTE_FREQ_E3 = 164.810000000000002273736754432321 NOTE_FREQ_DS4 = 311.129999999999995452526491135359 ; unused + KB_SCANCODE_CTRL_LEFT = $14 ; unused NOTE_FREQ_A0 = 27.500000000000000000000000000000 ; unused NOTE_FREQ_E2 = 82.409999999999996589394868351519 ; unused NOTE_FREQ_DS5 = 622.250000000000000000000000000000 ; unused tmsReg0ClearFields = $e5c8 + UART_STATUS_CLEAR_TO_SEND = $8 ; unused NOTE_FREQ_G3 = $c4 ; unused NOTE_FREQ_C1 = 32.700000000000002842170943040401 ; unused NOTE_FREQ_G0 = 24.500000000000000000000000000000 ; unused NOTE_FREQ_E1 = 41.200000000000002842170943040401 ; unused NOTE_FREQ_DS6 = 1244.509999999999990905052982270718 ; unused + UART_DATA = $7f21 VIA_IO_ADDR_T2C_H = $7ff9 ; unused NOTE_FREQ_C2 = 65.409999999999996589394868351519 ; unused NOTE_FREQ_A3 = $dc ; unused @@ -212,16 +281,17 @@ NOTE_FREQ_G1 = $31 ; unused NOTE_FREQ_A2 = $6e ; unused NOTE_FREQ_C3 = 130.810000000000002273736754432321 ; unused - UART_ZP_END = $28 + UART_ZP_END = $2c NOTE_FREQ_DS0 = 19.449999999999999289457264239900 ; unused NOTE_FREQ_C4 = 261.629999999999995452526491135359 ; unused NOTE_FREQ_A5 = $370 ; unused NOTE_FREQ_G6 = 1567.980000000000018189894035458565 ; unused NOTE_FREQ_E7 = 2637.019999999999981810105964541435 ; unused NOTE_FREQ_DS1 = 38.890000000000000568434188608080 ; unused + HAVE_KEYBOARD = $1 NOTE_FREQ_A4 = $1b8 ; unused NOTE_FREQ_E6 = 1318.509999999999990905052982270718 ; unused - hbc56HighBell = $ee64 ; ? + hbc56HighBell = $f20f ; ? NOTE_FREQ_G7 = 3135.960000000000036379788070917130 ; unused NOTE_FREQ_C5 = 523.250000000000000000000000000000 ; unused tmsConsoleHome = $e92b ; unused @@ -231,7 +301,7 @@ VIA_IO_ADDR_T2C_L = $7ff8 ; unused NOTE_FREQ_C6 = 1046.500000000000000000000000000000 ; unused NOTE_FREQ_A7 = $dc0 ; unused - BCD_RAM_START = $7b59 + BCD_RAM_START = $7c59 HBC56_META_TITLE_MAX_LEN = $10 isDigitX = $e030 ; unused NOTE_FREQ_DS3 = 155.560000000000002273736754432321 ; unused @@ -239,113 +309,177 @@ NOTE_FREQ_G5 = 783.990000000000009094947017729282 ; unused NOTE_FREQ_A6 = $6e0 ; unused NOTE_FREQ_C7 = $82d ; unused - VIA_RAM_END = $7b59 + VIA_RAM_END = $7c59 AY_INACTIVE = $3 ; unused TMS_SPRITE_SIZE2X = $10 ; unused tmsSetPosWriteText = $e944 ; ? + KB_SCANCODE_F11 = $78 ; unused AY_S0_READ = $7f42 ; unused tmsInitTextTable = $e789 ; ? + KB_SCANCODE_F10 = $9 ; unused VIA_REG_PORT_A = $1 + KB_SCANCODE_NUMPAD_PERIOD = $71 ; unused VIA_REG_PORT_B = $0 - BCD_RAM_END = $7b5c + KB_SCANCODE_F12 = $7 ; unused + kbNextScancode = $ec5f + KB_SCANCODE_WINDOWS_LEFT = $9f ; unused + BCD_RAM_END = $7c5c ASCII_RETURN = $a ; unused TMS_R1_INT_ENABLE = $20 + UART_CTL_WORD_8BIT_OPAR_1SB = $1c ; unused isSpace = $e049 ; unused - hbc56BootScreen = $ec55 + hbc56BootScreen = $efd8 AY_S1_READ = $7f46 ; unused + KB_SCANCODE_END = $e9 ; unused TMS_GFX_TILE_HEIGHT = $8 + KB_SCANCODE_SHIFT_RIGHT = $59 TMS_LT_BLUE = $5 ; unused TMS_R0_EXT_VDP_ENABLE = $1 ; unused + uartOutNoBsCheck = $eac7 ; ? + KB_SCANCODE_ALT_LEFT = $11 ; unused HBC56_INT_VECTOR = $7e00 VIA_REG_IER = $e tmsIncPosConsole = $e8ea INT_IO_PORT = $df + KB_PRESSED_MAP_BYTES = $20 VIA_REG_ACR = $b - STR_ADDR_H = $2f - NES_RAM_END = $7b9f + STR_ADDR_H = $33 + NES_RAM_END = $7c9f memsetSinglePage = $e101 TMS_FONT_DATA = $e271 tmsSetPatternTmpAddressII = $e954 ; unused + kbWaitForScancode = $ec46 tmsReg0SetFields = $e5be tmsPrint = $e9ac - STR_ADDR_L = $2e + KB_SCANCODE_APOS = $52 ; unused + STR_ADDR_L = $32 tmsSetPosConsole = $e931 + KB_SHIFT_RIGHT_MAP_BYTE = $b AY_CLOCK_FREQ = $1e8480 tmsSetBackground = $e5ba tmsSendBytesReverse = $e740 ; unused TMS_R1_MODE_GRAPHICS_II = $0 + UART_RX_BUFFER_XON_SIZE = $4 VIA_IO_ADDR_ACR = $7ffb ; unused + uartFlowCtrlXon = $ea80 ; ? VIA_IO_ADDR_IER = $7ffe ASCII_BELL = $7 ; unused - BCD_TMP3 = $7b5b + BCD_TMP3 = $7c5b TMS_MED_RED = $8 ; unused - BCD_TMP2 = $7b5a + UART_CTL_WORD_8BIT_EPAR_1SB = $18 ; unused + BCD_TMP2 = $7c5a LCD_ZP_END = $28 toLower = $e073 ; unused - BCD_TMP1 = $7b59 - MEM_SRC = $2a + BCD_TMP1 = $7c59 + MEM_SRC = $2e AY_ENABLES = $7 + UART_CTL_WORD_7BIT_OPB_2SB = $4 ; unused LCD_RAM_START = $7b58 TMS_LT_GREEN = $3 ; unused _tmsWaitData = $e579 tmsSetColorTmpAddressII = $e950 ; unused VIA_REG_SR = $a ; unused HAVE_MATH_INC = $1 - hbc56Bell = $ee96 ; unused + KB_SCANCODE_B = $32 ; unused + hbc56Bell = $f241 ; unused + KB_SCANCODE_C = $21 ; unused TMS_TXT_PIXELS_X = $f0 ; unused - HBC56_KERNEL_RAM_SIZE = $1bd ; unused + HBC56_KERNEL_RAM_SIZE = $2bd ; unused TMS_TXT_PIXELS_Y = $c0 ; unused + KB_SCANCODE_A = $1c ; unused TMS_GFX_TILES_Y = $18 + KB_PRESSED_MAP_SIZE = $fe ; unused + KB_SCANCODE_F = $2b ; unused + kbIsPressed = $ec29 ; unused TMS_R0_MODE_TEXT = $0 TMS_GFX_TILES_X = $20 + KB_SCANCODE_G = $34 ; unused HBC56_DISABLE_LCD = $1 TMS_R0_MODE_GRAPHICS_I = $0 tmsSetSpriteTmpAddress = $e82b ; unused + KB_CB_RELEASED = $7c61 + KB_SCANCODE_D = $23 ; unused TMS_R1_MODE_GRAPHICS_I = $0 + KB_SCANCODE_E = $24 ; unused TILEMAP_ZP_START = $18 - HBC56_CONSOLE_FLAGS = $7ba3 + KB_SHIFT_DOWN = $1 ; unused + KB_SCANCODE_J = $3b ; unused + KB_CB_PRESSED = $7c5f + KB_SCANCODE_K = $42 ; unused + KB_SHIFT_RIGHT_MAP_BIT = $40 + HBC56_CONSOLE_FLAGS = $7ca3 AY_ENV_SHAPE = $d - viaIntHandler = $ea5d + KB_SCANCODE_H = $33 ; unused + kbReadAscii = $eccf ; unused + KB_BUFFER_HEAD = $7c64 + KB_SCANCODE_I = $43 ; unused + viaIntHandler = $ede0 + KB_SCANCODE_N = $31 ; unused tmsTileXyAtPixelXy = $e7f1 ; unused - nesWaitForPress = $ea40 - hbc56LogoInd = $ea9b + UART_CTL_CLOCK_DIV_16 = $1 ; unused + nesWaitForPress = $eae5 + hbc56LogoInd = $ee1e + KB_SCANCODE_O = $44 ; unused memcpyMultiPagePort = $e0e1 ; unused - HBC56_DISABLE_UART = $1 + KB_SCANCODE_L = $4b ; unused bin2bcd8 = $e07b ; unused + KB_SCANCODE_M = $3a ; unused + KB_SCANCODE_ARROW_UP = $f5 ; unused + UART_RX_BUFFER_HEAD = $28 + KB_SCANCODE_R = $2d ; unused _tmsSendPage = $e6f7 ; ? tmsSetPosWrite = $e937 ; unused + KB_SCANCODE_S = $1b ; unused + KB_SCANCODE_P = $4d ; unused TMS_DK_RED = $6 ; unused + KB_SCANCODE_Q = $15 ; unused NOTE_FREQ_GS8 = 6644.880000000000109139364212751389 ; unused + KB_CURRENT_STATE = $7c63 + KB_SCANCODE_V = $2a ; unused NOTE_FREQ_CS8 = 4434.920000000000072759576141834259 ; unused + KB_SCANCODE_W = $1d ; unused HBC56_CONSOLE_FLAG_NES = $40 + UART_CTL_WORD_7BIT_EPB_2SB = $0 ; unused + kbScancodeToAscii = $ec74 + KB_SCANCODE_T = $2c ; unused + KB_SHIFT_LEFT_MAP_BIT = $20 TMS_TRANSPARENT = $0 - SFXMAN_RAM_END = $7b59 + KB_SCANCODE_U = $3c ; unused + SFXMAN_RAM_END = $7c59 NOTE_FREQ_GS4 = 415.300000000000011368683772161603 ; unused tmsSendBytes = $e731 NOTE_FREQ_CS5 = 554.370000000000004547473508864641 ; unused VIA_REG_T2C_H = $9 VIA_REG_PORT_Ax = $f ; unused + KB_SCANCODE_Z = $1a ; unused LCD_ZP_START = $28 NOTE_FREQ_CS4 = 277.180000000000006821210263296962 ; unused NOTE_FREQ_GS5 = 830.610000000000013642420526593924 ; unused + KB_SCANCODE_MINUS = $4e ; unused isUpper = $e00c TMS_VRAM_NAME_ADDRESS = $3800 UART_IRQ = $3 - NES_RAM_START = $7b9c + NES_RAM_START = $7c9c NOTE_FREQ_GS6 = 1661.220000000000027284841053187847 ; unused NOTE_FREQ_CS7 = 2217.460000000000036379788070917130 ; unused + KB_SCANCODE_X = $22 ; unused + KB_SCANCODE_PAUSE = $e1 + KB_IO_ADDR = $7f80 memcpySinglePagePort = $e0b1 ; unused NOTE_FREQ_CS6 = 1108.730000000000018189894035458565 ; unused NOTE_FREQ_GS7 = 3322.440000000000054569682106375694 ; unused TMS_REGISTER_DATA = $e571 TMS_MODEL = $26be + KB_SCANCODE_Y = $35 ; unused NOTE_FREQ_GS0 = 25.960000000000000852651282912120 ; unused NOTE_FREQ_CS1 = 34.649999999999998578914528479800 ; unused VIA_REG_T2C_L = $8 ROM_BANK_REG = $8 ; unused - HBC56_USER_ZP_START = $32 ; unused + HBC56_USER_ZP_START = $36 ; unused NOTE_FREQ_CS0 = 17.320000000000000284217094304040 ; unused NOTE_FREQ_GS1 = 51.909999999999996589394868351519 ; unused + UART_CTL_RX_INT_ENABLE = $80 + KB_SCANCODE_CAPS_LOCK = $58 tableInvBitFromRight = $e148 ; unused tmsInitPattTable = $e74f ; ? TMS9918_IRQ = $1 @@ -358,84 +492,129 @@ NOTE_FREQ_GS3 = 207.650000000000005684341886080801 ; unused KB_IRQ = $2 VIA_IO_PORT = $f0 - HBC56_VIA_CALLBACK = $7bbb + HBC56_VIA_CALLBACK = $7cbb _tmsSendX8 = $e6f9 + KB_SCANCODE_NUMPAD_5 = $73 ; unused AY_CHA = $0 + KB_SCANCODE_ALT_RIGHT_ = $91 ; unused + KB_SCANCODE_NUMPAD_4 = $6b ; unused AY_CHB = $1 + KB_RAM_SIZE = $3a tmsSetPatternWrite = $e9a0 ; unused + KB_SCANCODE_NUMPAD_7 = $6c ; unused UART_RAM_START = $7b58 AY_CHC = $2 + KB_SCANCODE_NUMPAD_6 = $74 ; unused MEMORY_ZP_SIZE = $6 + KB_SCANCODE_NUMPAD_1 = $69 ; unused + KEY_MAP_SHIFTED = $ed60 ; ? AY_READ = $2 + KB_SCANCODE_NUMPAD_0 = $70 ; unused + KB_SCANCODE_NUMPAD_3 = $7a ; unused HBC56_LOGO = $4 VIA_IRQ = $5 tableBitFromRight = $e140 ; unused + KB_SCANCODE_NUMPAD_2 = $72 ; unused TMS9918_CONSOLE_LINE_LEN = $7b2b + KB_SCANCODE_NUMPAD_MINUS = $7b ; unused BITMAP_RAM_START = $7b16 + uartInit = $ea40 ; unused hbc56CustomDelay = $ffe3 + UART_STATUS_FRAMING_ERROR = $10 ; unused HBC56_BACKGROUND = $f AY_ENV_SHAPE_FADE_IN_STOP = $4 ; unused - MEM_DST = $28 + HAVE_UART = $1 + MEM_DST = $2c TMS_DK_YELLOW = $a ; unused + UART_STATUS_PARITY_ERROR = $40 ; unused + KB_SCANCODE_NUMPAD_9 = $7d ; unused + KB_SCANCODE_NUMPAD_8 = $75 ; unused AY_CHN = $3 ; unused AY_ENV_SHAPE_TRIANGLE = $e ; unused hbc56Delay = $ffe1 - tableInvBitFromLeft = $e138 ; unused + tableInvBitFromLeft = $e138 + KB_SCANCODE_2 = $1e ; unused AY_CHB_TONE_H = $3 ; unused + KB_SCANCODE_3 = $26 ; unused + kbResetCallbacks = $eb2c ; unused NES_IO_PORT = $82 TMS9918_RAM_SIZE = $32 + KB_SCANCODE_0 = $45 ; unused TMS9918_RAM_START = $7b26 AY_CHA_TONE_L = $0 AY_CHC_TONE_H = $5 ; unused AY_ENV_SHAPE_CONTINUE = $8 + KB_SCANCODE_1 = $16 ; unused HBC56_TEXT = $4 HBC56_META_VECTOR = $dffc cputype = $65c02 ; unused - HBC56_KERNEL_RAM_END = $7bbd + KB_SCANCODE_6 = $36 ; unused + HBC56_KERNEL_RAM_END = $7cbd AY_CHB_TONE_L = $2 ; unused + KB_SCANCODE_7 = $3d ; unused AY_ENV_SHAPE_FADE_IN = $d ; unused tmsModeReset = $e5e2 + KB_SCANCODE_DELETE = $f1 ; unused + KB_SCANCODE_4 = $25 ; unused + KB_SCANCODE_MENU = $af ; unused + KB_SCANCODE_SPACEBAR = $29 ; unused AY_CHA_TONE_H = $1 AY_CHC_TONE_L = $4 ; unused - MEMORY_ZP_START = $28 + KB_SCANCODE_5 = $2e ; unused + MEMORY_ZP_START = $2c tmsSetPosRead = $e94a ; unused - nes1Pressed = $ea4d ; unused + nes1Pressed = $eaf2 ; unused VIA_REG_T1C_H = $5 INT_CTRL_ADDRESS = $7fdf - STR_ADDR = $2e + STR_ADDR = $32 AY_ENV_PERIOD_H = $c tmsHex8 = $e7fe ; unused VIA_IO_ADDR_T1L_H = $7ff7 ; unused TILEMAP_ZP_END = $1e - KB_RAM_START = $7b5c + KEY_MAP = $ece0 ; ? + KB_SCANCODE_8 = $3e ; unused + KB_RAM_START = $7c5c + KB_SCANCODE_9 = $46 ; unused VIA_REG_T1C_L = $4 AY_ENV_PERIOD_L = $b + KB_CTRL_DOWN = $2 ; unused + KB_PAUSE_KEY = $e1 VIA_IO_ADDR_T1L_L = $7ff6 ; unused NES_RIGHT = $1 ; unused - nes2Pressed = $ea55 ; unused - MEM_LEN = $2c + nes2Pressed = $eafa ; unused + MEM_LEN = $30 VIA_IO_ADDR_PORT_A = $7ff1 ; unused + UART_CTL_WORD_8BIT_2SB = $10 NES_START = $10 ; unused - HBC56_META_TITLE_LEN = $7bb8 + HBC56_META_TITLE_LEN = $7cb8 memsetMultiPage = $e10d ; unused + UART_REG = $7f20 LCD_MODEL = $3240 ; unused + KB_SCANCODE_SHIFT_LEFT = $12 VIA_IO_ADDR_PORT_B = $7ff0 ; unused isAlNum = $e02a ; unused AY_CHA_AMPL = $8 - LAST_MODULE_RAM_END = $7b9f + LAST_MODULE_RAM_END = $7c9f TMS_R1_MODE_TEXT = $10 tmsConsoleOut = $e9bc TMS9918_REG = $7f11 + KB_SCANCODE_NUMPAD_DIVIDE = $ca ; unused DEFAULT_HBC56_INT_VECTOR = $ffe0 VIA_IRQ_BIT = $10 TMS_VRAM_PATT_ADDRESS+2 = $0 + KB_SCANCODE_EQUAL = $55 ; unused + KB_RELEASE = $f0 tmsInitSpriteTable = $e7c2 ; ? + KB_SCANCODE_ARROW_DOWN = $f2 ; unused + UART_RX_BUFFER_BYTES = $2a isAlpha = $e018 ayInit = $e158 TMS_VRAM_NAME_ADDRESS2 = $3c00 ; unused TMS9918_RAM = $7f10 + UART_RX_FLAGS = $2b AY_R1 = $1 NOTE_FREQ_B8 = 7902.130000000000109139364212751389 ; unused + KB_STATUS_ADDR = $7f81 AY_R0 = $0 AY_R3 = $3 NOTE_FREQ_F8 = 5587.649999999999636202119290828705 ; unused @@ -447,6 +626,7 @@ NOTE_FREQ_FS8 = 5919.909999999999854480847716331482 ; unused AY_R4 = $4 AY_R7 = $7 + KB_ALT_DOWN = $4 ; unused AY_R6 = $6 TMS_TXT_TILE_HEIGHT = $8 NOTE_FREQ_B0 = 30.870000000000000994759830064140 ; unused @@ -459,6 +639,7 @@ NOTE_FREQ_B1 = 61.740000000000001989519660128281 ; unused NOTE_FREQ_D2 = 73.420000000000001705302565824240 ; unused NOTE_FREQ_FS5 = 739.990000000000009094947017729282 ; unused + UART_FLOWCTRL_XOFF = $13 TMS_R0_EXT_VDP_DISABLE = $0 tmsSetPatternTmpAddressBank0 = $e96d ; unused NOTE_FREQ_F3 = 174.610000000000013642420526593924 ; unused @@ -467,6 +648,7 @@ NOTE_FREQ_FS6 = 1479.980000000000018189894035458565 ; unused TMS9918_CONSOLE_Y = $7b29 TMS_LT_YELLOW = $b ; unused + KB_SCANCODE_ARROW_LEFT = $eb ; unused NOTE_FREQ_B2 = 123.469999999999998863131622783840 ; unused NOTE_FREQ_D0 = 18.350000000000001421085471520200 ; unused NOTE_FREQ_FS7 = 2959.960000000000036379788070917130 ; unused @@ -497,8 +679,10 @@ LOGO_BUFFER = $3000 ; unused NOTE_FREQ_B6 = 1975.529999999999972715158946812153 ; unused TMS9918_CONSOLE_SIZE_X = $7b2a + KB_SCANCODE_BACKSPACE = $66 ; unused NOTE_FREQ_FS3 = $b9 ; unused NOTE_FREQ_D4 = 293.660000000000025011104298755527 ; unused tmsInit = $e6b2 NOTE_FREQ_F5 = 698.460000000000036379788070917130 NOTE_FREQ_B7 = 3951.070000000000163709046319127083 ; unused + KB_SCANCODE_INSERT = $f0 ; unused diff --git a/code/6502/lib/inp/keyboard.asm b/code/6502/lib/inp/keyboard.asm index 8fd3b1e..5c83b40 100644 --- a/code/6502/lib/inp/keyboard.asm +++ b/code/6502/lib/inp/keyboard.asm @@ -1,587 +1,595 @@ -; 6502 KB Controller - HBC-56 -; -; Copyright (c) 2021 Troy Schrapel -; -; This code is licensed under the MIT license -; -; https://github@com/visrealm/hbc-56 -; - -!ifndef HAVE_MATH_INC { !src "ut/math.inc" } - -HAVE_KEYBOARD = 1 - -; ------------------------- -; Constants -; ------------------------- -!ifndef KB_IO_PORT { KB_IO_PORT = $80 - !warn "KB_IO_PORT not provided@ Defaulting to ", KB_IO_PORT -} - -!ifndef KB_RAM_START { KB_RAM_START = $7ea1 - !warn "KB_RAM_START not provided@ Defaulting to ", KB_RAM_START -} - -; ------------------------- -; High RAM -; ------------------------- -KB_FLAGS = KB_RAM_START -KB_TMP_X = KB_RAM_START + 1 -KB_TMP_Y = KB_RAM_START + 2 -KB_CB_PRESSED = KB_RAM_START + 3 -KB_CB_RELEASED = KB_RAM_START + 5 -KB_CURRENT_STATE = KB_RAM_START + 7 -KB_BUFFER_HEAD = KB_RAM_START + 8 ; head of circular buffer -KB_BUFFER_TAIL = KB_RAM_START + 9 ; tail of circular buffer -KB_BUFFER = KB_RAM_START + 10 -KB_BUFFER_SIZE = (1 << 4) -KB_BUFFER_MASK = KB_BUFFER_SIZE - 1 -KB_PRESSED_MAP = KB_BUFFER + KB_BUFFER_SIZE - -KB_PRESSED_MAP_SIZE = $fd + 1 -KB_PRESSED_MAP_BYTES = 32 - -KB_RAM_SIZE = (KB_PRESSED_MAP + KB_PRESSED_MAP_BYTES) - KB_RAM_START - - -!if KB_RAM_END < (KB_RAM_START + KB_RAM_SIZE) { - !error "KB_RAM requires ",KB_RAM_SIZE," bytes@ Allocated ",KB_RAM_END - KB_RAM_START -} - -; ------------------------- -; Contants -; ------------------------- -KB_SHIFT_DOWN = %00000001 -KB_CTRL_DOWN = %00000010 -KB_ALT_DOWN = %00000100 -KB_CAPS_LOCK = %00001000 -KB_NUM_LOCK = %00010000 - -KB_RELEASE = $f0 -KB_EXT_KEY = $e0 -KB_PAUSE_KEY = $e1 - -KB_SCANCODE_0 = $45 -KB_SCANCODE_1 = $16 -KB_SCANCODE_2 = $1E -KB_SCANCODE_3 = $26 -KB_SCANCODE_4 = $25 -KB_SCANCODE_5 = $2E -KB_SCANCODE_6 = $36 -KB_SCANCODE_7 = $3D -KB_SCANCODE_8 = $3E -KB_SCANCODE_9 = $46 -KB_SCANCODE_A = $1C -KB_SCANCODE_B = $32 -KB_SCANCODE_C = $21 -KB_SCANCODE_D = $23 -KB_SCANCODE_E = $24 -KB_SCANCODE_F = $2B -KB_SCANCODE_G = $34 -KB_SCANCODE_H = $33 -KB_SCANCODE_I = $43 -KB_SCANCODE_J = $3B -KB_SCANCODE_K = $42 -KB_SCANCODE_L = $4B -KB_SCANCODE_M = $3A -KB_SCANCODE_N = $31 -KB_SCANCODE_O = $44 -KB_SCANCODE_P = $4D -KB_SCANCODE_Q = $15 -KB_SCANCODE_R = $2D -KB_SCANCODE_S = $1B -KB_SCANCODE_T = $2C -KB_SCANCODE_U = $3C -KB_SCANCODE_V = $2A -KB_SCANCODE_W = $1D -KB_SCANCODE_X = $22 -KB_SCANCODE_Y = $35 -KB_SCANCODE_Z = $1A -KB_SCANCODE_F1 = $05 -KB_SCANCODE_F2 = $06 -KB_SCANCODE_F3 = $04 -KB_SCANCODE_F4 = $0C -KB_SCANCODE_F5 = $03 -KB_SCANCODE_F6 = $0B -KB_SCANCODE_F7 = $83 -KB_SCANCODE_F8 = $0A -KB_SCANCODE_F9 = $01 -KB_SCANCODE_F10 = $09 -KB_SCANCODE_F11 = $78 -KB_SCANCODE_F12 = $07 -KB_SCANCODE_NUMPAD_0 = $70 -KB_SCANCODE_NUMPAD_1 = $69 -KB_SCANCODE_NUMPAD_2 = $72 -KB_SCANCODE_NUMPAD_3 = $7A -KB_SCANCODE_NUMPAD_4 = $6B -KB_SCANCODE_NUMPAD_5 = $73 -KB_SCANCODE_NUMPAD_6 = $74 -KB_SCANCODE_NUMPAD_7 = $6C -KB_SCANCODE_NUMPAD_8 = $75 -KB_SCANCODE_NUMPAD_9 = $7D -KB_SCANCODE_NUMPAD_DIVIDE = $CA -KB_SCANCODE_NUMPAD_ENTER = $DA -KB_SCANCODE_NUMPAD_MINUS = $7B -KB_SCANCODE_NUMPAD_MULTIPLY = $7C -KB_SCANCODE_NUMPAD_PERIOD = $71 -KB_SCANCODE_NUMPAD_PLUS = $79 -KB_SCANCODE_NUM_LOCK = $77 -KB_SCANCODE_ALT_LEFT = $11 -KB_SCANCODE_ALT_RIGHT_ = $91 -KB_SCANCODE_APOS = $52 -KB_SCANCODE_ARROW_DOWN = $F2 -KB_SCANCODE_ARROW_LEFT = $EB -KB_SCANCODE_ARROW_RIGHT = $F4 -KB_SCANCODE_ARROW_UP = $F5 -KB_SCANCODE_BACKSPACE = $66 -KB_SCANCODE_CAPS_LOCK = $58 -KB_SCANCODE_COMMA = $41 -KB_SCANCODE_CTRL_LEFT = $14 -KB_SCANCODE_CTRL_RIGHT = $94 -KB_SCANCODE_DELETE = $F1 -KB_SCANCODE_END = $E9 -KB_SCANCODE_ENTER = $5A -KB_SCANCODE_EQUAL = $55 -KB_SCANCODE_ESC = $76 -KB_SCANCODE_HOME = $EC -KB_SCANCODE_INSERT = $F0 -KB_SCANCODE_MENU = $AF -KB_SCANCODE_MINUS = $4E -KB_SCANCODE_PAGE_DOWN = $FA -KB_SCANCODE_PAGE_UP = $FD -KB_SCANCODE_PAUSE = $E1 -KB_SCANCODE_PERIOD = $49 -KB_SCANCODE_PRTSCR = $92 -KB_SCANCODE_SCROLL_LOCK = $7E -KB_SCANCODE_SEMICOLON = $4C -KB_SCANCODE_SHIFT_LEFT = $12 -KB_SCANCODE_SHIFT_RIGHT = $59 -KB_SCANCODE_SLASH_BACK = $5D -KB_SCANCODE_SLASH_FORWARD = $4A -KB_SCANCODE_SPACEBAR = $29 -KB_SCANCODE_SQUARE_LEFT = $54 -KB_SCANCODE_SQUARE_RIGHT = $5B -KB_SCANCODE_TAB = $0D -KB_SCANCODE_TILDE = $0E -KB_SCANCODE_WINDOWS_LEFT = $9F -KB_SCANCODE_WINDOWS_RIGHT = $A7 - - -KB_SHIFT_LEFT_MAP_BYTE = KB_SCANCODE_SHIFT_LEFT >> 3 -KB_SHIFT_LEFT_MAP_BIT = $80 >> (KB_SCANCODE_SHIFT_LEFT & $07) - -KB_SHIFT_RIGHT_MAP_BYTE = KB_SCANCODE_SHIFT_RIGHT >> 3 -KB_SHIFT_RIGHT_MAP_BIT = $80 >> (KB_SCANCODE_SHIFT_RIGHT & $07) - - -; IO Ports -KB_IO_ADDR = IO_PORT_BASE_ADDRESS | KB_IO_PORT -KB_STATUS_ADDR = IO_PORT_BASE_ADDRESS | KB_IO_PORT | $01 - -; ----------------------------------------------------------------------------- -; kbInit: Initialise the keyboard -; ----------------------------------------------------------------------------- -kbInit: - lda #$00 - sta KB_FLAGS - - ldx #16 ;buffer size - - ; ensure the hardware keyboard buffer is clear -- - stx KB_TMP_X - jsr .kbReadByte - ldx KB_TMP_X - dex - bne - - - +memset KB_PRESSED_MAP, 0, KB_PRESSED_MAP_BYTES - - stz KB_BUFFER_HEAD - stz KB_BUFFER_TAIL - - lda #.KB_STATE_DEFAULT - sta KB_CURRENT_STATE - - ; flow through - -kbResetCallbacks: - lda #<.kbDummyCb - sta KB_CB_PRESSED - sta KB_CB_RELEASED - - lda #>.kbDummyCb - sta KB_CB_PRESSED + 1 - sta KB_CB_RELEASED + 1 - - ; flow through - -.kbDummyCb: - rts - -; ----------------------------------------------------------------------------- -; kbIntHandler: Standard keyboard interrupt handler -; ----------------------------------------------------------------------------- -kbIntHandler: - jsr .kbReadByte - cpx #0 - beq .kbDummyCb - - txa ; acc now holds scancode - - ldx KB_CURRENT_STATE - - jmp (.kbStateHandlers, x) - -.KB_STATE_DEFAULT = 0 -.KB_STATE_RELEASE = 2 -.KB_STATE_EXTENDED = 4 -.KB_STATE_EXTENDED_RELEASE = 6 -.KB_STATE_PAUSE_SEQ = 8 - -.kbStateHandlers: -!word .stdKeyHandler, .relKeyHandler, .extKeyHandler, .extRelKeyHandler, .pauseKeyHandler - -; default scancode handler -.stdKeyHandler - cmp #KB_RELEASE - bne + - lda #.KB_STATE_RELEASE - sta KB_CURRENT_STATE - rts -+ - cmp #KB_EXT_KEY - bne + - lda #.KB_STATE_EXTENDED - sta KB_CURRENT_STATE - rts -+ - cmp #KB_PAUSE_KEY - bne + - lda #.KB_STATE_PAUSE_SEQ - sta KB_CURRENT_STATE - rts -+ - ; a regular key was pressed - ; TODO: bit field rather than a byte per key? - jsr .kbSetKey - - jmp (KB_CB_PRESSED) - ; subroutine returns above - -; extended release scancode handler -.extRelKeyHandler: - ora #$80 - ; flow through - -; release scancode handler -.relKeyHandler: - tax - jsr .kbClearKey - - lda #.KB_STATE_DEFAULT - sta KB_CURRENT_STATE - txa - - jmp (KB_CB_RELEASED) - -; extended scancode handler -.extKeyHandler: - cmp #KB_RELEASE - bne + - lda #.KB_STATE_EXTENDED_RELEASE - sta KB_CURRENT_STATE - rts -+ - ora #$80 - - jsr .kbSetKey - - lda #.KB_STATE_DEFAULT - sta KB_CURRENT_STATE - txa - - jmp (KB_CB_PRESSED) - -; pause/break sequence scancode handler -.pauseKeyHandler: - cmp #$77 - bne @notLastByte - tax - lda KB_PRESSED_MAP + KB_SCANCODE_PAUSE - bne + - stx KB_PRESSED_MAP + KB_SCANCODE_PAUSE - jmp (KB_CB_PRESSED) -+ - stz KB_PRESSED_MAP + KB_SCANCODE_PAUSE - - lda #.KB_STATE_DEFAULT - sta KB_CURRENT_STATE - txa - - jmp (KB_CB_RELEASED) - -@notLastByte - rts - -; ----------------------------------------------------------------------------- -; Outputs: -; A: Value of the KB Status (0 if no key) -; X: PS/2 Scancode byte -; ----------------------------------------------------------------------------- -.kbReadByte: - ldx #0 - lda #$04 - bit KB_STATUS_ADDR - beq @end - - ldy #32 ; TODO: this could probably be smaller -- - dey - bne - - - ldx KB_IO_ADDR -@end - rts - - -; ----------------------------------------------------------------------------- -; .kbSetKey: Set a key is pressed in KB_PRESSED_MAP -; Inputs: -; A - scancode -; ----------------------------------------------------------------------------- -.kbSetKey: - ldx KB_BUFFER_HEAD ; store at head of buffer - sta KB_BUFFER, x - - sta KB_TMP_X ; find byte in map - +lsr3 - tax - lda KB_TMP_X - and #$07 - tay - lda KB_PRESSED_MAP, x - ora tableBitFromLeft, y ; set bit in map byte - sta KB_PRESSED_MAP, x ; update map - - ; check for toggle keys - ldx KB_TMP_X - cpx #KB_SCANCODE_CAPS_LOCK - bne + - lda #KB_CAPS_LOCK - eor KB_FLAGS - sta KB_FLAGS -+ - - lda KB_BUFFER_HEAD ; increment (and mask) buffer head - inc - and #KB_BUFFER_MASK - sta KB_BUFFER_HEAD - rts - -; ----------------------------------------------------------------------------- -; .kbClearKey: Clear a key is pressed in KB_PRESSED_MAP -; Inputs: -; A - scancode -; ----------------------------------------------------------------------------- -.kbClearKey: - sta KB_TMP_X - +lsr3 - tax - lda KB_TMP_X - and #$07 - tay - lda KB_PRESSED_MAP, x - and tableInvBitFromLeft, y - sta KB_PRESSED_MAP, x - rts - - -; ----------------------------------------------------------------------------- -; .kbPopTail: Pop a scancode from the tail of the buffer -; Inputs: -; A - scancode -; ----------------------------------------------------------------------------- -.kbPopTail: - lda KB_BUFFER_TAIL - tax - inc - and #KB_BUFFER_MASK - sta KB_BUFFER_TAIL - lda KB_BUFFER, x - rts - -; ----------------------------------------------------------------------------- -; kbIsPressed: Is a key pressed right now? -; Inputs: -; X - scancode -; Returns: -; Z - clear if pressed, set if not pressed -; ----------------------------------------------------------------------------- -kbIsPressed: - php - sei - stx KB_TMP_X - txa - +lsr3 - tax - lda KB_TMP_X - and #$07 - tay - lda tableBitFromLeft, y - and KB_PRESSED_MAP, x - ldx KB_TMP_X - plp - cmp #0 - rts - - -; ----------------------------------------------------------------------------- -; kbWaitForScancode: Wait for a key press -; Returns: -; A - scancode -; ----------------------------------------------------------------------------- -kbWaitForScancode: - php - sei - sec - lda KB_BUFFER_HEAD - sbc KB_BUFFER_TAIL - plp - cmp #0 - beq kbWaitForScancode - php - sei - jsr .kbPopTail - plp - rts - -; ----------------------------------------------------------------------------- -; kbNextScancode: Return the next scancode in the buffer or zero if empty -; Returns: -; A - scancode (or zero) -; ----------------------------------------------------------------------------- -kbNextScancode: - php - sei - lda KB_BUFFER_HEAD - cmp KB_BUFFER_TAIL - beq @noScancode - jsr .kbPopTail - plp - cmp #0 - rts - -@noScancode - plp - lda #0 - rts - -; ----------------------------------------------------------------------------- -; kbScancodeToAscii: Convert a scancode to ascii. shift/caps lock is honoured -; Inputs: -; A - scancode (or zero) -; Returns: -; A - ascii character -; C - set if valid character in A -; ----------------------------------------------------------------------------- -kbScancodeToAscii: - phx - sta KB_TMP_X - clc - bpl + - plx - rts -+ - php - sei - ldx #KB_SHIFT_LEFT_MAP_BYTE - lda #KB_SHIFT_LEFT_MAP_BIT - bit KB_PRESSED_MAP, x - beq + - sec - bra @doneShiftCheck -+ - - ldx #KB_SHIFT_RIGHT_MAP_BYTE - lda #KB_SHIFT_RIGHT_MAP_BIT - bit KB_PRESSED_MAP, x - beq + - sec -+ - -@doneShiftCheck: - bcs @shiftedKeys: - ldx KB_TMP_X - lda KEY_MAP, x - bra @end - -@shiftedKeys: - ldx KB_TMP_X - lda KEY_MAP_SHIFTED, x - -@end - jsr isAlpha - bcc @afterAlphaCheck - sta KB_TMP_X - lda #KB_CAPS_LOCK - and KB_FLAGS - beq + - lda KB_TMP_X - eor #$20 - bra @afterAlphaCheck -+ - lda KB_TMP_X -@afterAlphaCheck - plp - plx - cmp #$ff - sec - bne + - clc -+ - rts - -; ----------------------------------------------------------------------------- -; kbReadAscii: Read an ASCII caharacter from the keyboard queue -; Returns: -; A - ascii character -; C - set if valid character in A -; ----------------------------------------------------------------------------- -kbReadAscii: - php - sei - phx - jsr kbNextScancode - beq @noKey - plx - plp - jmp kbScancodeToAscii -@noKey - plx - plp - clc - rts - - -KEY_MAP: -; 0 1 2 3 4 5 6 7 8 9 a b c d e f -!byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$09,$60,$ff; 0 -!byte $ff,$ff,$ff,$ff,$ff,$71,$31,$ff,$ff,$ff,$7a,$73,$61,$77,$32,$ff; 1 -!byte $ff,$63,$78,$64,$65,$34,$33,$ff,$ff,$20,$76,$66,$74,$72,$35,$ff; 2 -!byte $ff,$6e,$62,$68,$67,$79,$36,$ff,$ff,$ff,$6d,$6a,$75,$37,$38,$ff; 3 -!byte $ff,$2c,$6b,$69,$6f,$30,$39,$ff,$ff,$2e,$2f,$6c,$3b,$70,$2d,$ff; 4 -!byte $ff,$ff,$27,$ff,$5b,$3d,$ff,$ff,$ff,$ff,$0d,$5d,$ff,$5c,$ff,$ff; 5 -!byte $ff,$ff,$ff,$ff,$ff,$ff,$08,$ff,$ff,$31,$ff,$34,$37,$ff,$ff,$ff; 6 -!byte $30,$ff,$32,$35,$36,$38,$1b,$ff,$ff,$ff,$33,$2d,$ff,$39,$ff,$ff; 7 - -KEY_MAP_SHIFTED: -; 0 1 2 3 4 5 6 7 8 9 a b c d e f -!byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$09,$7e,$ff; 0 -!byte $ff,$ff,$ff,$ff,$ff,$51,$21,$ff,$ff,$ff,$5a,$53,$41,$57,$40,$ff; 1 -!byte $ff,$43,$58,$44,$45,$24,$23,$ff,$ff,$20,$56,$46,$54,$52,$25,$ff; 2 -!byte $ff,$4e,$42,$48,$47,$59,$5e,$ff,$ff,$ff,$4d,$4a,$55,$26,$2a,$ff; 3 -!byte $ff,$3c,$4b,$49,$4f,$29,$28,$ff,$ff,$3e,$3f,$4c,$3a,$50,$5f,$ff; 4 -!byte $ff,$ff,$22,$ff,$7b,$2b,$ff,$ff,$ff,$ff,$0d,$7d,$ff,$7c,$ff,$ff; 5 -!byte $ff,$ff,$ff,$ff,$ff,$ff,$08,$ff,$ff,$31,$ff,$34,$37,$ff,$ff,$ff; 6 -!byte $30,$ff,$32,$35,$36,$38,$1b,$ff,$ff,$ff,$33,$2d,$ff,$39,$ff,$ff; 7 +; 6502 KB Controller - HBC-56 +; +; Copyright (c) 2021 Troy Schrapel +; +; This code is licensed under the MIT license +; +; https://github@com/visrealm/hbc-56 +; + +!ifndef HAVE_MATH_INC { !src "ut/math.inc" } + +HAVE_KEYBOARD = 1 + +; ------------------------- +; Constants +; ------------------------- +!ifndef KB_IO_PORT { KB_IO_PORT = $80 + !warn "KB_IO_PORT not provided@ Defaulting to ", KB_IO_PORT +} + +!ifndef KB_RAM_START { KB_RAM_START = $7ea1 + !warn "KB_RAM_START not provided@ Defaulting to ", KB_RAM_START +} + +; ------------------------- +; High RAM +; ------------------------- +KB_FLAGS = KB_RAM_START +KB_TMP_X = KB_RAM_START + 1 +KB_TMP_Y = KB_RAM_START + 2 +KB_CB_PRESSED = KB_RAM_START + 3 +KB_CB_RELEASED = KB_RAM_START + 5 +KB_CURRENT_STATE = KB_RAM_START + 7 +KB_BUFFER_HEAD = KB_RAM_START + 8 ; head of circular buffer +KB_BUFFER_TAIL = KB_RAM_START + 9 ; tail of circular buffer +KB_BUFFER = KB_RAM_START + 10 +KB_BUFFER_SIZE = (1 << 4) +KB_BUFFER_MASK = KB_BUFFER_SIZE - 1 +KB_PRESSED_MAP = KB_BUFFER + KB_BUFFER_SIZE + +KB_PRESSED_MAP_SIZE = $fd + 1 +KB_PRESSED_MAP_BYTES = 32 + +KB_RAM_SIZE = (KB_PRESSED_MAP + KB_PRESSED_MAP_BYTES) - KB_RAM_START + + +!if KB_RAM_END < (KB_RAM_START + KB_RAM_SIZE) { + !error "KB_RAM requires ",KB_RAM_SIZE," bytes@ Allocated ",KB_RAM_END - KB_RAM_START +} + +; ------------------------- +; Contants +; ------------------------- +KB_SHIFT_DOWN = %00000001 +KB_CTRL_DOWN = %00000010 +KB_ALT_DOWN = %00000100 +KB_CAPS_LOCK = %00001000 +KB_NUM_LOCK = %00010000 + +KB_RELEASE = $f0 +KB_EXT_KEY = $e0 +KB_PAUSE_KEY = $e1 + +KB_SCANCODE_0 = $45 +KB_SCANCODE_1 = $16 +KB_SCANCODE_2 = $1E +KB_SCANCODE_3 = $26 +KB_SCANCODE_4 = $25 +KB_SCANCODE_5 = $2E +KB_SCANCODE_6 = $36 +KB_SCANCODE_7 = $3D +KB_SCANCODE_8 = $3E +KB_SCANCODE_9 = $46 +KB_SCANCODE_A = $1C +KB_SCANCODE_B = $32 +KB_SCANCODE_C = $21 +KB_SCANCODE_D = $23 +KB_SCANCODE_E = $24 +KB_SCANCODE_F = $2B +KB_SCANCODE_G = $34 +KB_SCANCODE_H = $33 +KB_SCANCODE_I = $43 +KB_SCANCODE_J = $3B +KB_SCANCODE_K = $42 +KB_SCANCODE_L = $4B +KB_SCANCODE_M = $3A +KB_SCANCODE_N = $31 +KB_SCANCODE_O = $44 +KB_SCANCODE_P = $4D +KB_SCANCODE_Q = $15 +KB_SCANCODE_R = $2D +KB_SCANCODE_S = $1B +KB_SCANCODE_T = $2C +KB_SCANCODE_U = $3C +KB_SCANCODE_V = $2A +KB_SCANCODE_W = $1D +KB_SCANCODE_X = $22 +KB_SCANCODE_Y = $35 +KB_SCANCODE_Z = $1A +KB_SCANCODE_F1 = $05 +KB_SCANCODE_F2 = $06 +KB_SCANCODE_F3 = $04 +KB_SCANCODE_F4 = $0C +KB_SCANCODE_F5 = $03 +KB_SCANCODE_F6 = $0B +KB_SCANCODE_F7 = $83 +KB_SCANCODE_F8 = $0A +KB_SCANCODE_F9 = $01 +KB_SCANCODE_F10 = $09 +KB_SCANCODE_F11 = $78 +KB_SCANCODE_F12 = $07 +KB_SCANCODE_NUMPAD_0 = $70 +KB_SCANCODE_NUMPAD_1 = $69 +KB_SCANCODE_NUMPAD_2 = $72 +KB_SCANCODE_NUMPAD_3 = $7A +KB_SCANCODE_NUMPAD_4 = $6B +KB_SCANCODE_NUMPAD_5 = $73 +KB_SCANCODE_NUMPAD_6 = $74 +KB_SCANCODE_NUMPAD_7 = $6C +KB_SCANCODE_NUMPAD_8 = $75 +KB_SCANCODE_NUMPAD_9 = $7D +KB_SCANCODE_NUMPAD_DIVIDE = $CA +KB_SCANCODE_NUMPAD_ENTER = $DA +KB_SCANCODE_NUMPAD_MINUS = $7B +KB_SCANCODE_NUMPAD_MULTIPLY = $7C +KB_SCANCODE_NUMPAD_PERIOD = $71 +KB_SCANCODE_NUMPAD_PLUS = $79 +KB_SCANCODE_NUM_LOCK = $77 +KB_SCANCODE_ALT_LEFT = $11 +KB_SCANCODE_ALT_RIGHT_ = $91 +KB_SCANCODE_APOS = $52 +KB_SCANCODE_ARROW_DOWN = $F2 +KB_SCANCODE_ARROW_LEFT = $EB +KB_SCANCODE_ARROW_RIGHT = $F4 +KB_SCANCODE_ARROW_UP = $F5 +KB_SCANCODE_BACKSPACE = $66 +KB_SCANCODE_CAPS_LOCK = $58 +KB_SCANCODE_COMMA = $41 +KB_SCANCODE_CTRL_LEFT = $14 +KB_SCANCODE_CTRL_RIGHT = $94 +KB_SCANCODE_DELETE = $F1 +KB_SCANCODE_END = $E9 +KB_SCANCODE_ENTER = $5A +KB_SCANCODE_EQUAL = $55 +KB_SCANCODE_ESC = $76 +KB_SCANCODE_HOME = $EC +KB_SCANCODE_INSERT = $F0 +KB_SCANCODE_MENU = $AF +KB_SCANCODE_MINUS = $4E +KB_SCANCODE_PAGE_DOWN = $FA +KB_SCANCODE_PAGE_UP = $FD +KB_SCANCODE_PAUSE = $E1 +KB_SCANCODE_PERIOD = $49 +KB_SCANCODE_PRTSCR = $92 +KB_SCANCODE_SCROLL_LOCK = $7E +KB_SCANCODE_SEMICOLON = $4C +KB_SCANCODE_SHIFT_LEFT = $12 +KB_SCANCODE_SHIFT_RIGHT = $59 +KB_SCANCODE_SLASH_BACK = $5D +KB_SCANCODE_SLASH_FORWARD = $4A +KB_SCANCODE_SPACEBAR = $29 +KB_SCANCODE_SQUARE_LEFT = $54 +KB_SCANCODE_SQUARE_RIGHT = $5B +KB_SCANCODE_TAB = $0D +KB_SCANCODE_TILDE = $0E +KB_SCANCODE_WINDOWS_LEFT = $9F +KB_SCANCODE_WINDOWS_RIGHT = $A7 + + +KB_SHIFT_LEFT_MAP_BYTE = KB_SCANCODE_SHIFT_LEFT >> 3 +KB_SHIFT_LEFT_MAP_BIT = $80 >> (KB_SCANCODE_SHIFT_LEFT & $07) + +KB_SHIFT_RIGHT_MAP_BYTE = KB_SCANCODE_SHIFT_RIGHT >> 3 +KB_SHIFT_RIGHT_MAP_BIT = $80 >> (KB_SCANCODE_SHIFT_RIGHT & $07) + + +; IO Ports +KB_IO_ADDR = IO_PORT_BASE_ADDRESS | KB_IO_PORT +KB_STATUS_ADDR = IO_PORT_BASE_ADDRESS | KB_IO_PORT | $01 + +; ----------------------------------------------------------------------------- +; kbInit: Initialise the keyboard +; ----------------------------------------------------------------------------- +kbInit: + lda #$00 + sta KB_FLAGS + + ldx #16 ;buffer size + + ; ensure the hardware keyboard buffer is clear +- + stx KB_TMP_X + jsr .kbReadByte + ldx KB_TMP_X + dex + bne - + + +memset KB_PRESSED_MAP, 0, KB_PRESSED_MAP_BYTES + + stz KB_BUFFER_HEAD + stz KB_BUFFER_TAIL + + lda #.KB_STATE_DEFAULT + sta KB_CURRENT_STATE + + ; flow through + +kbResetCallbacks: + lda #<.kbDummyCb + sta KB_CB_PRESSED + sta KB_CB_RELEASED + + lda #>.kbDummyCb + sta KB_CB_PRESSED + 1 + sta KB_CB_RELEASED + 1 + + ; flow through + +.kbDummyCb: + rts + +; ----------------------------------------------------------------------------- +; kbIntHandler: Standard keyboard interrupt handler +; ----------------------------------------------------------------------------- +kbIntHandler: + jsr .kbReadByte + cpx #0 + beq .kbDummyCb + + txa ; acc now holds scancode + + ldx KB_CURRENT_STATE + + jmp (.kbStateHandlers, x) + +.KB_STATE_DEFAULT = 0 +.KB_STATE_RELEASE = 2 +.KB_STATE_EXTENDED = 4 +.KB_STATE_EXTENDED_RELEASE = 6 +.KB_STATE_PAUSE_SEQ = 8 + +.kbStateHandlers: +!word .stdKeyHandler, .relKeyHandler, .extKeyHandler, .extRelKeyHandler, .pauseKeyHandler + +; default scancode handler +.stdKeyHandler + cmp #KB_RELEASE + bne + + lda #.KB_STATE_RELEASE + sta KB_CURRENT_STATE + rts ++ + cmp #KB_EXT_KEY + bne + + lda #.KB_STATE_EXTENDED + sta KB_CURRENT_STATE + rts ++ + cmp #KB_PAUSE_KEY + bne + + lda #.KB_STATE_PAUSE_SEQ + sta KB_CURRENT_STATE + rts ++ + ; a regular key was pressed + ; TODO: bit field rather than a byte per key? + jsr .kbSetKey + + jmp (KB_CB_PRESSED) + ; subroutine returns above + +; extended release scancode handler +.extRelKeyHandler: + ora #$80 + ; flow through + +; release scancode handler +.relKeyHandler: + tax + jsr .kbClearKey + + lda #.KB_STATE_DEFAULT + sta KB_CURRENT_STATE + txa + + jmp (KB_CB_RELEASED) + +; extended scancode handler +.extKeyHandler: + cmp #KB_RELEASE + bne + + lda #.KB_STATE_EXTENDED_RELEASE + sta KB_CURRENT_STATE + rts ++ + ora #$80 + + jsr .kbSetKey + + lda #.KB_STATE_DEFAULT + sta KB_CURRENT_STATE + txa + + jmp (KB_CB_PRESSED) + +; pause/break sequence scancode handler +.pauseKeyHandler: + cmp #$77 + bne @notLastByte + tax + lda KB_PRESSED_MAP + KB_SCANCODE_PAUSE + bne + + stx KB_PRESSED_MAP + KB_SCANCODE_PAUSE + jmp (KB_CB_PRESSED) ++ + stz KB_PRESSED_MAP + KB_SCANCODE_PAUSE + + lda #.KB_STATE_DEFAULT + sta KB_CURRENT_STATE + txa + + jmp (KB_CB_RELEASED) + +@notLastByte + rts + +; ----------------------------------------------------------------------------- +; Outputs: +; A: Value of the KB Status (0 if no key) +; X: PS/2 Scancode byte +; ----------------------------------------------------------------------------- +.kbReadByte: + ldx #0 + lda #$04 + bit KB_STATUS_ADDR + beq @end + + ldy #32 ; TODO: this could probably be smaller +- + dey + bne - + + ldx KB_IO_ADDR +@end + rts + + +; ----------------------------------------------------------------------------- +; .kbSetKey: Set a key is pressed in KB_PRESSED_MAP +; Inputs: +; A - scancode +; ----------------------------------------------------------------------------- +.kbSetKey: + ldx KB_BUFFER_HEAD ; store at head of buffer + sta KB_BUFFER, x + + sta KB_TMP_X ; find byte in map + +lsr3 + tax + lda KB_TMP_X + and #$07 + tay + lda KB_PRESSED_MAP, x + ora tableBitFromLeft, y ; set bit in map byte + sta KB_PRESSED_MAP, x ; update map + + ; check for toggle keys + ldx KB_TMP_X + cpx #KB_SCANCODE_CAPS_LOCK + bne + + lda #KB_CAPS_LOCK + eor KB_FLAGS + sta KB_FLAGS ++ + + lda KB_BUFFER_HEAD ; increment (and mask) buffer head + inc + and #KB_BUFFER_MASK + sta KB_BUFFER_HEAD + rts + +; ----------------------------------------------------------------------------- +; .kbClearKey: Clear a key is pressed in KB_PRESSED_MAP +; Inputs: +; A - scancode +; ----------------------------------------------------------------------------- +.kbClearKey: + sta KB_TMP_X + +lsr3 + tax + lda KB_TMP_X + and #$07 + tay + lda KB_PRESSED_MAP, x + and tableInvBitFromLeft, y + sta KB_PRESSED_MAP, x + rts + + +; ----------------------------------------------------------------------------- +; .kbPopTail: Pop a scancode from the tail of the buffer +; Inputs: +; A - scancode +; ----------------------------------------------------------------------------- +.kbPopTail: + lda KB_BUFFER_TAIL + tax + inc + and #KB_BUFFER_MASK + sta KB_BUFFER_TAIL + lda KB_BUFFER, x + rts + +; ----------------------------------------------------------------------------- +; kbIsPressed: Is a key pressed right now? +; Inputs: +; X - scancode +; Returns: +; Z - clear if pressed, set if not pressed +; ----------------------------------------------------------------------------- +kbIsPressed: + php + sei + stx KB_TMP_X + txa + +lsr3 + tax + lda KB_TMP_X + and #$07 + tay + lda tableBitFromLeft, y + and KB_PRESSED_MAP, x + ldx KB_TMP_X + plp + cmp #0 + rts + + +; ----------------------------------------------------------------------------- +; kbWaitForScancode: Wait for a key press +; Returns: +; A - scancode +; ----------------------------------------------------------------------------- +kbWaitForScancode: + php + sei + sec + lda KB_BUFFER_HEAD + sbc KB_BUFFER_TAIL + plp + cmp #0 + beq kbWaitForScancode + php + sei + jsr .kbPopTail + plp + and #$ff + bmi kbWaitForScancode + rts + +; ----------------------------------------------------------------------------- +; kbNextScancode: Return the next scancode in the buffer or zero if empty +; Returns: +; A - scancode (or zero) +; ----------------------------------------------------------------------------- +kbNextScancode: + php + sei + lda KB_BUFFER_HEAD + cmp KB_BUFFER_TAIL + beq @noScancode + jsr .kbPopTail + plp + cmp #0 + rts + +@noScancode + plp + lda #0 + rts + +; ----------------------------------------------------------------------------- +; kbScancodeToAscii: Convert a scancode to ascii. shift/caps lock is honoured +; Inputs: +; A - scancode (or zero) +; Returns: +; A - ascii character +; C - set if valid character in A +; ----------------------------------------------------------------------------- +kbScancodeToAscii: + phx + sta KB_TMP_X + clc + bpl + + plx + rts ++ + php + sei + ldx #KB_SHIFT_LEFT_MAP_BYTE + lda #KB_SHIFT_LEFT_MAP_BIT + bit KB_PRESSED_MAP, x + beq + + sec + bra @doneShiftCheck ++ + + ldx #KB_SHIFT_RIGHT_MAP_BYTE + lda #KB_SHIFT_RIGHT_MAP_BIT + bit KB_PRESSED_MAP, x + beq + + sec ++ + +@doneShiftCheck: + bcs @shiftedKeys: + ldx KB_TMP_X + bpl + ; if greater than 127, is a return value from sent message + ldx #0 ++ + lda KEY_MAP, x + bra @end + +@shiftedKeys: + ldx KB_TMP_X + bpl + ; if greater than 127, is a return value from sent message + ldx #0 ++ + lda KEY_MAP_SHIFTED, x + +@end + jsr isAlpha + bcc @afterAlphaCheck + sta KB_TMP_X + lda #KB_CAPS_LOCK + and KB_FLAGS + beq + + lda KB_TMP_X + eor #$20 + bra @afterAlphaCheck ++ + lda KB_TMP_X +@afterAlphaCheck + plp + plx + cmp #$ff + sec + bne + + clc ++ + rts + +; ----------------------------------------------------------------------------- +; kbReadAscii: Read an ASCII caharacter from the keyboard queue +; Returns: +; A - ascii character +; C - set if valid character in A +; ----------------------------------------------------------------------------- +kbReadAscii: + php + sei + phx + jsr kbNextScancode + beq @noKey + plx + plp + jmp kbScancodeToAscii +@noKey + plx + plp + clc + rts + + +KEY_MAP: +; 0 1 2 3 4 5 6 7 8 9 a b c d e f +!byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$09,$60,$ff; 0 +!byte $ff,$ff,$ff,$ff,$ff,$71,$31,$ff,$ff,$ff,$7a,$73,$61,$77,$32,$ff; 1 +!byte $ff,$63,$78,$64,$65,$34,$33,$ff,$ff,$20,$76,$66,$74,$72,$35,$ff; 2 +!byte $ff,$6e,$62,$68,$67,$79,$36,$ff,$ff,$ff,$6d,$6a,$75,$37,$38,$ff; 3 +!byte $ff,$2c,$6b,$69,$6f,$30,$39,$ff,$ff,$2e,$2f,$6c,$3b,$70,$2d,$ff; 4 +!byte $ff,$ff,$27,$ff,$5b,$3d,$ff,$ff,$ff,$ff,$0d,$5d,$ff,$5c,$ff,$ff; 5 +!byte $ff,$ff,$ff,$ff,$ff,$ff,$08,$ff,$ff,$31,$ff,$34,$37,$ff,$ff,$ff; 6 +!byte $30,$ff,$32,$35,$36,$38,$1b,$ff,$ff,$ff,$33,$2d,$ff,$39,$ff,$ff; 7 + +KEY_MAP_SHIFTED: +; 0 1 2 3 4 5 6 7 8 9 a b c d e f +!byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$09,$7e,$ff; 0 +!byte $ff,$ff,$ff,$ff,$ff,$51,$21,$ff,$ff,$ff,$5a,$53,$41,$57,$40,$ff; 1 +!byte $ff,$43,$58,$44,$45,$24,$23,$ff,$ff,$20,$56,$46,$54,$52,$25,$ff; 2 +!byte $ff,$4e,$42,$48,$47,$59,$5e,$ff,$ff,$ff,$4d,$4a,$55,$26,$2a,$ff; 3 +!byte $ff,$3c,$4b,$49,$4f,$29,$28,$ff,$ff,$3e,$3f,$4c,$3a,$50,$5f,$ff; 4 +!byte $ff,$ff,$22,$ff,$7b,$2b,$ff,$ff,$ff,$ff,$0d,$7d,$ff,$7c,$ff,$ff; 5 +!byte $ff,$ff,$ff,$ff,$ff,$ff,$08,$ff,$ff,$31,$ff,$34,$37,$ff,$ff,$ff; 6 +!byte $30,$ff,$32,$35,$36,$38,$1b,$ff,$ff,$ff,$33,$2d,$ff,$39,$ff,$ff; 7 diff --git a/code/6502/lib/sfx/ay3891x.inc b/code/6502/lib/sfx/ay3891x.inc index 002d8e2..45ba804 100644 --- a/code/6502/lib/sfx/ay3891x.inc +++ b/code/6502/lib/sfx/ay3891x.inc @@ -113,4 +113,5 @@ !macro ayStop .dev, .chan { +ayPlayNote .dev, .chan, 0 + +ayToneDisable .dev, .chan }