mirror of
https://github.com/irmen/prog8.git
synced 2025-10-25 05:18:38 +00:00
cx16: sys.enable_irq_handlers() and associated functions are now romable
This commit is contained in:
@@ -1184,7 +1184,6 @@ asmsub enable_irq_handlers(bool disable_all_irq_sources @Pc) clobbers(A,Y) {
|
||||
; to the registered handler for each type. (Only Vera IRQs supported for now).
|
||||
; The handlers don't need to clear its ISR bit, but have to return 0 or 1 in A,
|
||||
; where 1 means: continue with the system IRQ handler, 0 means: don't call that.
|
||||
; TODO: Romable
|
||||
%asm {{
|
||||
php
|
||||
sei
|
||||
@@ -1195,9 +1194,30 @@ asmsub enable_irq_handlers(bool disable_all_irq_sources @Pc) clobbers(A,Y) {
|
||||
ldy #>_irq_dispatcher
|
||||
sta cbm.CINV
|
||||
sty cbm.CINV+1
|
||||
|
||||
lda #<_default_1_handler
|
||||
ldy #>_default_1_handler
|
||||
sta _vsync_vec
|
||||
sty _vsync_vec+1
|
||||
lda #<_default_0_handler
|
||||
ldy #>_default_0_handler
|
||||
sta _line_vec
|
||||
sty _line_vec+1
|
||||
sta _aflow_vec
|
||||
sty _aflow_vec+1
|
||||
sta _sprcol_vec
|
||||
sty _sprcol_vec+1
|
||||
|
||||
plp
|
||||
rts
|
||||
|
||||
.section BSS
|
||||
_vsync_vec .word ?
|
||||
_line_vec .word ?
|
||||
_aflow_vec .word ?
|
||||
_sprcol_vec .word ?
|
||||
.send BSS
|
||||
|
||||
_irq_dispatcher
|
||||
; order of handling: LINE, SPRCOL, AFLOW, VSYNC.
|
||||
jsr sys.save_prog8_internals
|
||||
@@ -1207,31 +1227,27 @@ _irq_dispatcher
|
||||
|
||||
bit #2
|
||||
beq +
|
||||
_mod_line_jump
|
||||
jsr _default_line_handler ; modified
|
||||
jsr _line_handler
|
||||
ldy #2
|
||||
sty cx16.VERA_ISR
|
||||
bra _dispatch_end
|
||||
+
|
||||
bit #4
|
||||
beq +
|
||||
_mod_sprcol_jump
|
||||
jsr _default_sprcol_handler ; modified
|
||||
jsr _sprcol_handler
|
||||
ldy #4
|
||||
sty cx16.VERA_ISR
|
||||
bra _dispatch_end
|
||||
+
|
||||
bit #8
|
||||
beq +
|
||||
_mod_aflow_jump
|
||||
jsr _default_aflow_handler ; modified
|
||||
jsr _aflow_handler
|
||||
; note: AFLOW can only be cleared by filling the audio FIFO for at least 1/4. Not via the ISR bit.
|
||||
bra _dispatch_end
|
||||
+
|
||||
bit #1
|
||||
beq +
|
||||
_mod_vsync_jump
|
||||
jsr _default_vsync_handler ; modified
|
||||
jsr _vsync_handler
|
||||
cmp #0
|
||||
bne _dispatch_end
|
||||
ldy #1
|
||||
@@ -1251,29 +1267,31 @@ _return_irq
|
||||
pla
|
||||
rti
|
||||
|
||||
_default_vsync_handler
|
||||
_default_0_handler
|
||||
lda #0
|
||||
rts
|
||||
_default_1_handler
|
||||
lda #1
|
||||
rts
|
||||
_default_line_handler
|
||||
lda #0
|
||||
rts
|
||||
_default_sprcol_handler
|
||||
lda #0
|
||||
rts
|
||||
_default_aflow_handler
|
||||
lda #0
|
||||
rts
|
||||
|
||||
_vsync_handler
|
||||
jmp (_vsync_vec)
|
||||
_line_handler
|
||||
jmp (_line_vec)
|
||||
_sprcol_handler
|
||||
jmp (_sprcol_vec)
|
||||
_aflow_handler
|
||||
jmp (_aflow_vec)
|
||||
}}
|
||||
}
|
||||
|
||||
asmsub set_vsync_irq_handler(uword address @AY) clobbers(A) {
|
||||
; Sets the VSYNC irq handler to use with enable_irq_handlers(). Also enables VSYNC irqs.
|
||||
; TODO: Romable
|
||||
%asm {{
|
||||
php
|
||||
sei
|
||||
sta enable_irq_handlers._mod_vsync_jump+1
|
||||
sty enable_irq_handlers._mod_vsync_jump+2
|
||||
sta enable_irq_handlers._vsync_vec
|
||||
sty enable_irq_handlers._vsync_vec+1
|
||||
lda #1
|
||||
tsb cx16.VERA_IEN
|
||||
plp
|
||||
@@ -1284,12 +1302,11 @@ asmsub set_vsync_irq_handler(uword address @AY) clobbers(A) {
|
||||
asmsub set_line_irq_handler(uword rasterline @R0, uword address @AY) clobbers(A,Y) {
|
||||
; Sets the LINE irq handler to use with enable_irq_handlers(), for the given rasterline. Also enables LINE irqs.
|
||||
; You can use sys.set_rasterline() later to adjust the rasterline on which to trigger.
|
||||
; TODO: Romable
|
||||
%asm {{
|
||||
php
|
||||
sei
|
||||
sta enable_irq_handlers._mod_line_jump+1
|
||||
sty enable_irq_handlers._mod_line_jump+2
|
||||
sta enable_irq_handlers._line_vec
|
||||
sty enable_irq_handlers._line_vec+1
|
||||
lda cx16.r0
|
||||
ldy cx16.r0+1
|
||||
jsr sys.set_rasterline
|
||||
@@ -1302,12 +1319,11 @@ asmsub set_line_irq_handler(uword rasterline @R0, uword address @AY) clobbers(A,
|
||||
|
||||
asmsub set_sprcol_irq_handler(uword address @AY) clobbers(A) {
|
||||
; Sets the SPRCOL irq handler to use with enable_irq_handlers(). Also enables SPRCOL irqs.
|
||||
; TODO: Romable
|
||||
%asm {{
|
||||
php
|
||||
sei
|
||||
sta enable_irq_handlers._mod_sprcol_jump+1
|
||||
sty enable_irq_handlers._mod_sprcol_jump+2
|
||||
sta enable_irq_handlers._sprcol_vec
|
||||
sty enable_irq_handlers._sprcol_vec+1
|
||||
lda #4
|
||||
tsb cx16.VERA_IEN
|
||||
plp
|
||||
@@ -1318,12 +1334,11 @@ asmsub set_sprcol_irq_handler(uword address @AY) clobbers(A) {
|
||||
asmsub set_aflow_irq_handler(uword address @AY) clobbers(A) {
|
||||
; Sets the AFLOW irq handler to use with enable_irq_handlers(). Also enables AFLOW irqs.
|
||||
; NOTE: the handler itself must fill the audio fifo buffer to at least 25% full again (1 KB) or the aflow irq will keep triggering!
|
||||
; TODO: Romable
|
||||
%asm {{
|
||||
php
|
||||
sei
|
||||
sta enable_irq_handlers._mod_aflow_jump+1
|
||||
sty enable_irq_handlers._mod_aflow_jump+2
|
||||
sta enable_irq_handlers._aflow_vec
|
||||
sty enable_irq_handlers._aflow_vec+1
|
||||
lda #8
|
||||
tsb cx16.VERA_IEN
|
||||
plp
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
TODO
|
||||
====
|
||||
|
||||
romable: fix as many of the "TODO: Romable" issues as possible to improve romability of library code
|
||||
document romable option and that strings+initialized arrays become read-only
|
||||
|
||||
also support 'heavy' version of the unicode box characters like https://www.compart.com/en/unicode/U+250F as characters in strings
|
||||
|
||||
document romable option and that strings+initialized arrays become read-only
|
||||
|
||||
|
||||
...
|
||||
|
||||
|
||||
Reference in New Issue
Block a user