Work on VERA API and interrupts

This commit is contained in:
Kyle Cardoza 2024-03-28 23:23:04 -04:00
parent fc7419530b
commit a90d8f476d
3 changed files with 61 additions and 17 deletions

View File

@ -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);

View File

@ -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

View File

@ -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);