label = __DESTRUCTOR_TABLE__,
count = __DESTRUCTOR_COUNT__,
segment = RODATA;
-# FIXME: interruptor support is missing
-# CONDES: type = interruptor,
-# label = __INTERRUPTOR_TABLE__,
-# count = __INTERRUPTOR_COUNT__,
-# segment = RODATA,
-# import = __CALLIRQ__;
+ CONDES: type = interruptor,
+ label = __INTERRUPTOR_TABLE__,
+ count = __INTERRUPTOR_COUNT__,
+ segment = RODATA,
+ import = __CALLIRQ__;
}
.include "pce.inc"
.include "extzp.inc"
+ .forceimport ticktock
.export _clock
.importzp sreg
.import initlib, donelib
.import push0, _main, zerobss
.import initheap
- .import tmp1,tmp2,tmp3
+ .import IRQStub
; Linker generated
.import __RAM_START__, __RAM_SIZE__
.importzp sp
.importzp ptr1,ptr2
+ .importzp tmp1,tmp2,tmp3
; ------------------------------------------------------------------------
; Place the startup code in a special segment.
; reset the PCEngine (start over)
jmp start
-; ------------------------------------------------------------------------
-; System V-Blank Interupt
-; FIXME: hooks should be provided so the user can abuse the IRQ
-; ------------------------------------------------------------------------
-
-_irq1:
- pha
- phx
- phy
-
- ; increment the system tick counter
- inc tickcount
- bne @s1
- inc tickcount + 1
- bne @s1
- inc tickcount + 2
- bne @s1
- inc tickcount + 3
-@s1:
- ; Acknowlege interrupt
- lda a:VDC_CTRL
-
- ply
- plx
- pla
- rti
-_irq2:
- rti
_nmi:
rti
-_timer:
- stz IRQ_STATUS
- rti
.export initmainargs
initmainargs:
; ------------------------------------------------------------------------
.segment "VECTORS"
- .word _irq2 ; $fff6 IRQ2 (External IRQ, BRK)
- .word _irq1 ; $fff8 IRQ1 (VDC)
- .word _timer ; $fffa Timer
+ .word IRQStub ; $fff6 IRQ2 (External IRQ, BRK)
+ .word IRQStub ; $fff8 IRQ1 (VDC)
+ .word IRQStub ; $fffa Timer
.word _nmi ; $fffc NMI
.word start ; $fffe reset
.global RVS: zp
.global BGCOLOR: zp
.global tickcount: zp
+ .global vdc_flags: zp
RVS: .res 1
BGCOLOR: .res 1
tickcount: .res 4
+vdc_flags: .res 1
--- /dev/null
+;
+; IRQ handling (PCE version)
+;
+
+ .export initirq, doneirq, IRQStub
+
+ .import __INTERRUPTOR_COUNT__, callirq_y
+
+ .include "pce.inc"
+ .include "extzp.inc"
+
+; ------------------------------------------------------------------------
+.segment "INIT"
+
+; a constructor
+;
+initirq:
+ rts
+
+; ------------------------------------------------------------------------
+.code
+
+; a destructor
+;
+doneirq:
+ rts
+
+; ------------------------------------------------------------------------
+
+IRQStub:
+ phy
+
+; Save the display-source flags (and, release the interrupt).
+;
+ ldy a:VDC_CTRL
+ sty vdc_flags
+
+ ldy #<(__INTERRUPTOR_COUNT__ * 2)
+ beq @L1
+ phx
+ pha
+
+ jsr callirq_y
+
+ pla
+ plx
+@L1: ply
+ rti
--- /dev/null
+ .interruptor ticktock, 24
+
+ .include "pce.inc"
+ .include "extzp.inc"
+
+ticktock:
+ bbr5 vdc_flags,@s1 ; not vertical-blank interrupt
+
+ ; Increment the system tick counter.
+ inc tickcount
+ bne @s1
+ inc tickcount+1
+ bne @s1
+ inc tickcount+2
+ bne @s1
+ inc tickcount+3
+
+@s1: rts
.include "pce.inc"
.include "extzp.inc"
+ .forceimport ticktock
.export _waitvblank
.proc _waitvblank