From a90d8f476d542a5c2b76f015f4eea93d04acf6b0 Mon Sep 17 00:00:00 2001 From: Kyle Cardoza Date: Thu, 28 Mar 2024 23:23:04 -0400 Subject: [PATCH] Work on VERA API and interrupts --- include/drivers/vera.h | 2 ++ src/drivers/vera.s | 54 ++++++++++++++++++++++++++++++++++++++++++ src/drivers/vera2.c | 22 ++++------------- 3 files changed, 61 insertions(+), 17 deletions(-) diff --git a/include/drivers/vera.h b/include/drivers/vera.h index fadfc2c..7d61753 100644 --- a/include/drivers/vera.h +++ b/include/drivers/vera.h @@ -51,6 +51,8 @@ extern void vera_set_addr0_decrement(bool state); extern void vera_set_addr1_decrement(bool state); +extern void vera_set_addr0_incr1(uint32_t addr); + uint8_t vera_read_byte(uint32_t addr); uint16_t vera_read_word(uint32_t addr); diff --git a/src/drivers/vera.s b/src/drivers/vera.s index b5ee4e0..d2d8d6f 100644 --- a/src/drivers/vera.s +++ b/src/drivers/vera.s @@ -16,6 +16,7 @@ .public vera_poke_data0 .public vera_poke_data1 .public vera_set_addr0_auto_increment + .public vera_set_addr0_incr1 .public vera_set_addr1_auto_increment .public vera_set_addr0_decrement .public vera_set_addr1_decrement @@ -309,3 +310,56 @@ vera_set_addr1_decrement_done: long_a plb rts + +; Optimization: Combine the most common setting for +; addr0: Set an address, and set INCR0 to 1, +; and DECR0 to 0. +vera_set_addr0_incr1: + phb + short_a + pha + + ; Set the data bank to 0 + lda #0 + pha + plb + + ; Set ADDRSEL to 0. + lda #0b00000001 + trb 0xDF05 + + ; Set DECR0 to 0 and INCR0 to 0 + lda #0b11111000 + trb 0xDF02 + lda #0b00010000 + tsb 0xDF02 + + ; Set the low byte of the address + lda _Dp+0 + sta 0xDF00 + + ; Set the mid byte of the address + lda _Dp+1 + sta 0xDF01 + + ; Set the high bit of the address + lda _Dp+2 + and #0b00000001 + + ; If the high bit in A is set, then branch + bne addr0_incr1_high_bit_set + ; Else clear the lowest bit of ADDR0_H + lda #0b00000001 + trb 0xDF03 + ; And exit + bra addr0_incr1_done + +addr0_incr1_high_bit_set: + ; Set the lowest bit of ADDR0_H + lda #0b00000001 + tsb 0xDF03 + +addr0_incr1_done: + plb + long_a + rts diff --git a/src/drivers/vera2.c b/src/drivers/vera2.c index 6ab3822..cbdd8bf 100644 --- a/src/drivers/vera2.c +++ b/src/drivers/vera2.c @@ -23,9 +23,7 @@ vera_read_byte(uint32_t addr) uint16_t vera_read_word(uint32_t addr) { - vera_set_data0_address(addr); - vera_set_addr0_auto_increment(ADDR_INCREMENT_1); - vera_set_addr0_decrement(false); + vera_set_addr0_incr1(addr); uint8_t data_low = vera_peek_data0(); uint8_t data_high = vera_peek_data0(); return (uint16_t)((data_high << 8) & data_low); @@ -43,9 +41,7 @@ vera_write_byte(uint32_t addr, uint8_t value) void vera_write_word(uint32_t addr, uint16_t value) { - vera_set_data0_address(addr); - vera_set_addr0_auto_increment(ADDR_INCREMENT_1); - vera_set_addr0_decrement(false); + vera_set_addr0_incr1(addr); vera_poke_data0((uint8_t)(value & 0x00FF)); vera_poke_data0((uint8_t)(value & 0xFF00) >> 8); } @@ -54,10 +50,7 @@ void vera_read(void *dest, uint32_t src, size_t length) { uint8_t *dst = dest; - - vera_set_data0_address(src); - vera_set_addr0_auto_increment(ADDR_INCREMENT_1); - vera_set_addr0_decrement(false); + vera_set_addr0_incr1(src); for (size_t i = 0; i < length; i += 1) { dst[i] = vera_peek_data0(); @@ -68,10 +61,7 @@ void vera_write(uint32_t dest, void *src, size_t length) { uint8_t *source = src; - - vera_set_data0_address(dest); - vera_set_addr0_auto_increment(ADDR_INCREMENT_1); - vera_set_addr0_decrement(false); + vera_set_addr0_incr1(dest); for (size_t i = 0; i < length; i += 1) { vera_poke_data0(source[i]); @@ -81,9 +71,7 @@ vera_write(uint32_t dest, void *src, size_t length) void vera_memset(uint32_t addr, uint8_t value, size_t length) { - vera_set_data0_address(addr); - vera_set_addr0_auto_increment(ADDR_INCREMENT_1); - vera_set_addr0_decrement(false); + vera_set_addr0_incr1(addr); for (size_t i = 0; i < length; i += 1) { vera_poke_data0(value);