From fc7419530bd4d7fb5651a5095fc62db0a10e411a Mon Sep 17 00:00:00 2001 From: Kyle Cardoza Date: Thu, 28 Mar 2024 22:31:35 -0400 Subject: [PATCH] Work on VERA API and interrupts --- config/memory.scm | 2 +- include/drivers/vera.h | 7 +++ include/interrupts.h | 2 + src/drivers/vera2.c | 40 +++++++++++++ src/interrupts.c | 104 ---------------------------------- src/interrupts2.s | 125 +++++++++++++++++++++++++++++++++++++++++ src/main.c | 2 + 7 files changed, 177 insertions(+), 105 deletions(-) create mode 100644 src/interrupts2.s diff --git a/config/memory.scm b/config/memory.scm index 0a2e563..0d18c95 100644 --- a/config/memory.scm +++ b/config/memory.scm @@ -25,7 +25,7 @@ ) (memory MidRAM - (address (#x00F000 . #x00FFFF)) + (address (#x00F000 . #x00FDFF)) (section code) (section cnear) (section reset) diff --git a/include/drivers/vera.h b/include/drivers/vera.h index 3150e57..fadfc2c 100644 --- a/include/drivers/vera.h +++ b/include/drivers/vera.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include typedef enum { @@ -57,3 +58,9 @@ uint16_t vera_read_word(uint32_t addr); void vera_write_byte(uint32_t addr, uint8_t value); void vera_write_word(uint32_t addr, uint16_t value); + +void vera_read(void *dest, uint32_t src, size_t length); + +void vera_write(uint32_t dest, void *src, size_t length); + +void vera_memset(uint32_t addr, uint8_t value, size_t length); diff --git a/include/interrupts.h b/include/interrupts.h index a3632ab..640a21b 100644 --- a/include/interrupts.h +++ b/include/interrupts.h @@ -8,6 +8,8 @@ #include "config.h" +extern void interrupts_init(void); + void set_user_nmi_handler(void (*f)(void)); void set_user_brk_handler(void (*f)(void)); diff --git a/src/drivers/vera2.c b/src/drivers/vera2.c index 44487a7..6ab3822 100644 --- a/src/drivers/vera2.c +++ b/src/drivers/vera2.c @@ -49,3 +49,43 @@ vera_write_word(uint32_t addr, uint16_t value) vera_poke_data0((uint8_t)(value & 0x00FF)); vera_poke_data0((uint8_t)(value & 0xFF00) >> 8); } + +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); + + for (size_t i = 0; i < length; i += 1) { + dst[i] = vera_peek_data0(); + } +} + +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); + + for (size_t i = 0; i < length; i += 1) { + vera_poke_data0(source[i]); + } +} + +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); + + for (size_t i = 0; i < length; i += 1) { + vera_poke_data0(value); + } +} diff --git a/src/interrupts.c b/src/interrupts.c index 5f8781e..12dc81a 100644 --- a/src/interrupts.c +++ b/src/interrupts.c @@ -111,107 +111,3 @@ set_user_t0_handler(void (*f)(void)) { user_t0_handler = f; } - -interrupt_handler(0x00FFBA) void -nmi_handler(void) -{ - if (user_nmi_handler != NULL) { - user_nmi_handler(); - } -} - -interrupt_handler(0x00FFB6) void -brk_handler(void) -{ - if (user_brk_handler != NULL) { - user_brk_handler(); - } -} - -interrupt_handler(0x00FFB4) void -cop_handler(void) -{ - if (user_cop_handler != NULL) { - user_cop_handler(); - } -} - -interrupt_handler(0x00FF9E) void -irq_handler(void) -{ - if (user_irq_handler != NULL) { - user_irq_handler(); - } -} - -interrupt_handler(0x00FF98) void -int_vera_irq_handler(void) -{ - if (user_vera_irq_handler != NULL) { - user_vera_irq_handler(); - } -} - -interrupt_handler(0x00FF8E) void -int_t7_handler(void) -{ - if (user_t7_handler != NULL) { - user_t7_handler(); - } -} - -interrupt_handler(0x00FF8C) void -int_t6_handler(void) -{ - if (user_t6_handler != NULL) { - user_t6_handler(); - } -} - -interrupt_handler(0x00FF8A) void -int_t5_handler(void) -{ - if (user_t5_handler != NULL) { - user_t5_handler(); - } -} - -interrupt_handler(0x00FF88) void -int_t4_handler(void) -{ - if (user_t4_handler != NULL) { - user_t4_handler(); - } -} - -interrupt_handler(0x00FF86) void -int_t3_handler(void) -{ - if (user_t3_handler != NULL) { - user_t3_handler(); - } -} - -interrupt_handler(0x00FF84) void -int_t2_handler(void) -{ - if (user_t2_handler != NULL) { - user_t2_handler(); - } -} - -interrupt_handler(0x00FF82) void -int_t1_handler(void) -{ - if (user_t1_handler != NULL) { - user_t1_handler(); - } -} - -interrupt_handler(0x00FF80) void -int_t0_handler(void) -{ - if (user_t0_handler != NULL) { - user_t0_handler(); - } -} diff --git a/src/interrupts2.s b/src/interrupts2.s new file mode 100644 index 0000000..402a36a --- /dev/null +++ b/src/interrupts2.s @@ -0,0 +1,125 @@ +;;***************************************************************************** +;; Sentinel 65X Kernel +;; +;; src/interrupts2.s +;;***************************************************************************** + +#include "macros.h" + + .section code + + .public interrupts_init + + .extern _Dp + .extern __program_start + +;------------------------------------------------------------------------------ + +interrupts_init: + sei + + ; 16 bit a/x + rep #0b00110000 + + ; Set the vector for the IRQ handler. + lda #.near(irq_handler) + sta 0x00FF9E + + ; Set the vector for the NMI handler. + lda #.near(nmi_handler) + sta 0x00FF9E + + ; Set the vector for the COP handler. + lda #.near(cop_handler) + sta 0x00FFB4 + + ; Set the vector for the VERA IRQ handler. + lda #.near(vera_irq_handler) + sta 0x00FF98 + + rts + +;------------------------------------------------------------------------------ + +common_irq_return: + ; 16 bit a/x + rep #0b00110000 + ply + plx + pla + pld + plb + rti + +;------------------------------------------------------------------------------ + +irq_handler: + phb + phd + ; 16 bit a/x + rep #0b00110000 + pha + phx + phy + + bra common_irq_return + +;------------------------------------------------------------------------------ + +vera_irq_handler: + phb + phd + ; 16 bit a/x + rep #0b00110000 + pha + phx + phy + + bra common_irq_return + +;------------------------------------------------------------------------------ + +nmi_handler: + phb + phd + ; 16 bit a/x + rep #0b00110000 + pha + phx + phy + + bra common_irq_return + +;------------------------------------------------------------------------------ + +cop_handler: + phb + phd + ; 16 bit a/x + rep #0b00110000 + pha + phx + phy + + ; COP dispatch here + ; Function number comes in X, gets multiplied by 2, then + ; used as an index to the jump table. + pha + txa + asl a + tax + pla + jmp (cop_dispatch_table,x) + +cop_dispatch_table: + .word .near(cop_reset) + +;------------------------------------------------------------------------------ + +cop_reset: + sei + + ; 16 bit a/x + rep #0b00110000 + + jmp long:__program_start diff --git a/src/main.c b/src/main.c index 03941f4..b524cf0 100644 --- a/src/main.c +++ b/src/main.c @@ -6,11 +6,13 @@ #include "config.h" +#include "interrupts.h" #include "drivers/vera.h" void main(void) { + interrupts_init(); vera_init(); for (;;) {}