Use vectors for irq and nmi

This commit is contained in:
Byron Lathi
2023-11-21 18:53:17 -08:00
parent 1714a1e6da
commit 102c4dfe8a
6 changed files with 254 additions and 325 deletions

View File

@@ -9,6 +9,8 @@
.export _disable_irq
.export _send_eoi
.import irq_int, nmi_int
IRQ_CMD_ADDR = $effc
IRQ_DAT_ADDR = $effd
@@ -19,11 +21,24 @@ IRQ_CMD_ENABLE = $20
IRQ_CMD_TYPE = $40
IRQ_CMD_EOI = $ff
IRQ_VECTOR = $220
NMI_VECTOR = $222
.code
; void init_irq();
; mask all IRQs, set all type to edge.
.proc _init_interrupt_controller
lda #<irq_int
sta IRQ_VECTOR
lda #>irq_int
sta IRQ_VECTOR+1
lda #<nmi_int
sta NMI_VECTOR
lda #>nmi_int
sta NMI_VECTOR+1
ldx #$20 ; enable
ldy #00
jsr cmd_all

View File

@@ -6,9 +6,6 @@
#define BUTTON (1 << 0)
#define UART (1 << 1)
void irq_int();
void nmi_int();
void register_irq(void* addr, uint8_t irqn);
uint8_t irq_get_status();

View File

@@ -4,7 +4,7 @@
.import _enable_irq
.export _irq_int, _nmi_int
.export irq_int, nmi_int
.export _register_irq
IRQ_CMD_ADDR = $effc
@@ -12,13 +12,14 @@ IRQ_DAT_ADDR = $effd
IRQ_CMD_READIRQ = $00
.proc _nmi_int
.proc nmi_int
rti
.endproc
; _irq_int
.proc _irq_int
; irq_int
.proc irq_int
; Load IRQ number
lda #IRQ_CMD_READIRQ
sta IRQ_CMD_ADDR