Work on VERA API and interrupts
This commit is contained in:
parent
fc7419530b
commit
a90d8f476d
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue