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_addr1_decrement(bool state);
|
||||||
|
|
||||||
|
extern void vera_set_addr0_incr1(uint32_t addr);
|
||||||
|
|
||||||
uint8_t vera_read_byte(uint32_t addr);
|
uint8_t vera_read_byte(uint32_t addr);
|
||||||
|
|
||||||
uint16_t vera_read_word(uint32_t addr);
|
uint16_t vera_read_word(uint32_t addr);
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
.public vera_poke_data0
|
.public vera_poke_data0
|
||||||
.public vera_poke_data1
|
.public vera_poke_data1
|
||||||
.public vera_set_addr0_auto_increment
|
.public vera_set_addr0_auto_increment
|
||||||
|
.public vera_set_addr0_incr1
|
||||||
.public vera_set_addr1_auto_increment
|
.public vera_set_addr1_auto_increment
|
||||||
.public vera_set_addr0_decrement
|
.public vera_set_addr0_decrement
|
||||||
.public vera_set_addr1_decrement
|
.public vera_set_addr1_decrement
|
||||||
|
@ -309,3 +310,56 @@ vera_set_addr1_decrement_done:
|
||||||
long_a
|
long_a
|
||||||
plb
|
plb
|
||||||
rts
|
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
|
uint16_t
|
||||||
vera_read_word(uint32_t addr)
|
vera_read_word(uint32_t addr)
|
||||||
{
|
{
|
||||||
vera_set_data0_address(addr);
|
vera_set_addr0_incr1(addr);
|
||||||
vera_set_addr0_auto_increment(ADDR_INCREMENT_1);
|
|
||||||
vera_set_addr0_decrement(false);
|
|
||||||
uint8_t data_low = vera_peek_data0();
|
uint8_t data_low = vera_peek_data0();
|
||||||
uint8_t data_high = vera_peek_data0();
|
uint8_t data_high = vera_peek_data0();
|
||||||
return (uint16_t)((data_high << 8) & data_low);
|
return (uint16_t)((data_high << 8) & data_low);
|
||||||
|
@ -43,9 +41,7 @@ vera_write_byte(uint32_t addr, uint8_t value)
|
||||||
void
|
void
|
||||||
vera_write_word(uint32_t addr, uint16_t value)
|
vera_write_word(uint32_t addr, uint16_t value)
|
||||||
{
|
{
|
||||||
vera_set_data0_address(addr);
|
vera_set_addr0_incr1(addr);
|
||||||
vera_set_addr0_auto_increment(ADDR_INCREMENT_1);
|
|
||||||
vera_set_addr0_decrement(false);
|
|
||||||
vera_poke_data0((uint8_t)(value & 0x00FF));
|
vera_poke_data0((uint8_t)(value & 0x00FF));
|
||||||
vera_poke_data0((uint8_t)(value & 0xFF00) >> 8);
|
vera_poke_data0((uint8_t)(value & 0xFF00) >> 8);
|
||||||
}
|
}
|
||||||
|
@ -54,10 +50,7 @@ void
|
||||||
vera_read(void *dest, uint32_t src, size_t length)
|
vera_read(void *dest, uint32_t src, size_t length)
|
||||||
{
|
{
|
||||||
uint8_t *dst = dest;
|
uint8_t *dst = dest;
|
||||||
|
vera_set_addr0_incr1(src);
|
||||||
vera_set_data0_address(src);
|
|
||||||
vera_set_addr0_auto_increment(ADDR_INCREMENT_1);
|
|
||||||
vera_set_addr0_decrement(false);
|
|
||||||
|
|
||||||
for (size_t i = 0; i < length; i += 1) {
|
for (size_t i = 0; i < length; i += 1) {
|
||||||
dst[i] = vera_peek_data0();
|
dst[i] = vera_peek_data0();
|
||||||
|
@ -68,10 +61,7 @@ void
|
||||||
vera_write(uint32_t dest, void *src, size_t length)
|
vera_write(uint32_t dest, void *src, size_t length)
|
||||||
{
|
{
|
||||||
uint8_t *source = src;
|
uint8_t *source = src;
|
||||||
|
vera_set_addr0_incr1(dest);
|
||||||
vera_set_data0_address(dest);
|
|
||||||
vera_set_addr0_auto_increment(ADDR_INCREMENT_1);
|
|
||||||
vera_set_addr0_decrement(false);
|
|
||||||
|
|
||||||
for (size_t i = 0; i < length; i += 1) {
|
for (size_t i = 0; i < length; i += 1) {
|
||||||
vera_poke_data0(source[i]);
|
vera_poke_data0(source[i]);
|
||||||
|
@ -81,9 +71,7 @@ vera_write(uint32_t dest, void *src, size_t length)
|
||||||
void
|
void
|
||||||
vera_memset(uint32_t addr, uint8_t value, size_t length)
|
vera_memset(uint32_t addr, uint8_t value, size_t length)
|
||||||
{
|
{
|
||||||
vera_set_data0_address(addr);
|
vera_set_addr0_incr1(addr);
|
||||||
vera_set_addr0_auto_increment(ADDR_INCREMENT_1);
|
|
||||||
vera_set_addr0_decrement(false);
|
|
||||||
|
|
||||||
for (size_t i = 0; i < length; i += 1) {
|
for (size_t i = 0; i < length; i += 1) {
|
||||||
vera_poke_data0(value);
|
vera_poke_data0(value);
|
||||||
|
|
Loading…
Reference in New Issue