Work on VERA API and interrupts
This commit is contained in:
parent
5032212b94
commit
fc7419530b
|
@ -25,7 +25,7 @@
|
||||||
)
|
)
|
||||||
|
|
||||||
(memory MidRAM
|
(memory MidRAM
|
||||||
(address (#x00F000 . #x00FFFF))
|
(address (#x00F000 . #x00FDFF))
|
||||||
(section code)
|
(section code)
|
||||||
(section cnear)
|
(section cnear)
|
||||||
(section reset)
|
(section reset)
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
typedef enum {
|
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_byte(uint32_t addr, uint8_t value);
|
||||||
|
|
||||||
void vera_write_word(uint32_t addr, uint16_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);
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
extern void interrupts_init(void);
|
||||||
|
|
||||||
void set_user_nmi_handler(void (*f)(void));
|
void set_user_nmi_handler(void (*f)(void));
|
||||||
|
|
||||||
void set_user_brk_handler(void (*f)(void));
|
void set_user_brk_handler(void (*f)(void));
|
||||||
|
|
|
@ -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 & 0x00FF));
|
||||||
vera_poke_data0((uint8_t)(value & 0xFF00) >> 8);
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
104
src/interrupts.c
104
src/interrupts.c
|
@ -111,107 +111,3 @@ set_user_t0_handler(void (*f)(void))
|
||||||
{
|
{
|
||||||
user_t0_handler = f;
|
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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -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
|
|
@ -6,11 +6,13 @@
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
#include "interrupts.h"
|
||||||
#include "drivers/vera.h"
|
#include "drivers/vera.h"
|
||||||
|
|
||||||
void
|
void
|
||||||
main(void)
|
main(void)
|
||||||
{
|
{
|
||||||
|
interrupts_init();
|
||||||
vera_init();
|
vera_init();
|
||||||
|
|
||||||
for (;;) {}
|
for (;;) {}
|
||||||
|
|
Loading…
Reference in New Issue