IRQ handler for UP9600

This commit is contained in:
FeralChild64 committed 2019-11-22 17:35:17 +01:00
1 parent df1285e5f3
commit 6f010b8c56
9 files changed
+138 -14

No files matched your search

+1 -1
View File
@@ -114,7 +114,7 @@
.label INBIT = $A7 // -- NOT IMPLEMENTED --
#if !CONFIG_LEGACY_SCNKEY
.label BITCI = $A8 // -- NOT IMPLEMENTED --
.label RINONE = $A9 // -- NOT IMPLEMENTED --
.label RINONE = $A9 // -- WIP -- (UP9600 only) RS-232 check for start bit flag
.label RIDDATA = $AA // -- NOT IMPLEMENTED --
.label RIPRTY = $AB // -- NOT IMPLEMENTED --
#endif
@@ -1,10 +1,22 @@
default_irq_handler:
#if CONFIG_RS232_UP9600
jsr rs232_count_channels
cpx #$00
beq !+
jsr up9600_irq
!:
#endif // CONFIG_RS232_UP9600
jsr cursor_blink
jsr JSCNKEY
jsr JUDTIM // update jiffy clock
#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO
// Turn tape motor on/off depending on the button state
@@ -25,7 +37,8 @@ default_irq_handler:
default_irq_handler_end_tape:
#endif
#endif // CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO
// Acknowledge CIA interrupt and return
jmp clear_cia1_interrupt_flag_and_return_from_interrupt
@@ -17,9 +17,10 @@ default_nmi_handler:
bne !+
jmp (ICART_WARM_START)
!:
// According to C64 Wiki, if STOP key is pressed, the routine assumes warm start request
// XXX is it right? how to check that IRQ was caused by RESTORE?
jsr JSTOP
bcs !+
jmp return_from_interrupt // no STOP pressed
+1
View File
@@ -18,6 +18,7 @@ close_rs232:
// If more than one, skip deallocation (other channels still uses the buffer).
jsr rs232_count_channels
cpx #$02 // set Carry if more than one is open
bcs close_rs232_end
// Deallocate buffer
+9
View File
@@ -18,6 +18,7 @@ open_rs232:
// If more than one, skip allocation (already allocated).
jsr rs232_count_channels
cpx #$02 // set Carry if more than one is open
bcs open_rs232_end
// Allocate buffers - first RIBUF, afterwards ROBUF
@@ -43,6 +44,14 @@ open_rs232:
sta RODBS
sta RODBE
#if CONFIG_RS232_UP9600
jmp up9600_enable
#endif // CONFIG_RS232_UP9600
open_rs232_end:
jmp open_done_success
+1 -3
View File
@@ -1,7 +1,7 @@
//
// Sets .X to number of open RS-232 channels
// Sets Carry if more than one is open
//
#if HAS_RS232
@@ -20,8 +20,6 @@ rs232_count_channels:
inx
bpl !- // branch always
cpx #$02
rts
+68 -1
View File
@@ -1,6 +1,6 @@
//
// Enable UP9600 interface
// Enable UP9600 interface support
//
// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations
@@ -11,6 +11,63 @@
up9600_enable: // XXX adapt
sei
lda IRQVECT
cmp #<ORIGIRQ
bne INSTERR; IRQ-VECTOR ALREADY CHANGED
lda IRQVECT+1
cmp #>ORIGIRQ
bne INSTERR; IRQ-VECTOR ALREADY CHANGED
lda NMIVECT
cmp #<ORIGNMI
bne INSTERR; NMI-VECTOR ALREADY CHANGED
lda NMIVECT+1
cmp #>ORIGNMI
bne INSTERR; NMI-VECTOR ALREADY CHANGED
ldy #0
sty RODBE
sty RODBS
sty RIDBE
sty RIDBS
; PROBE FOR RS232 INTERFACE
cli
lda #$7F
sta CIA2_ICR // $DD0D ; DISABLE ALL NMIS
lda #$80
sta CIA2_DDRB // $DD03 ; PB7 USED AS OUTPUT
sta $DD0E; STOP TIMERA
sta CIA2_CRB // $DD0F ; STOP TIMERB
bit CIA2_ICR // $DD0D ; CLEAR PENDING INTERRUPTS
ldx #8
INSTALL2
stx CIA2_PRB // $DD01; TOGGLE TXD
sta CIA2_PRB // $DD01; AND LOOK IF IT TRIGGERS AN
dex; SHIFT-REGISTER INTERRUPT
bne INSTALL2
lda CIA2_ICR // $DD0D ; CHECK FOR BIT3 (SDR-FLAG)
and #8
beq INSTERR; NO INTERFACE DETECTED
; GENERATE LOOKUP TABLE
ldx #0
INSTALL3
stx OUTSTAT; OUTSTAT USED AS TEMPORARY VARIABLE
ldy #8
INSTALL4
asl OUTSTAT
ror
dey
bne INSTALL4
sta REVTAB,X
inx
bpl INSTALL3
sei
// XXX set NEWIRQ as IRQ vector
// XXX set NMIDOBIT as NMI vector
@@ -63,4 +120,14 @@ ENABLE2
rts
INSTERR
cli
sec
rts
#endif // CONFIG_RS232_UP9600
+40
View File
@@ -0,0 +1,40 @@
//
// RS-232 IRQ handler part
//
// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations
#if CONFIG_RS232_UP9600
up9600_irq:
lda CIA1_ICR // $DC0D
lsr
lsr // move bit 1 (timer B flag) into Carry
and #$02 // test SDR (shift register) status
beq up9600_irq_continue
ldx RINONE
beq !+ // skip if not waiting for empty SDR
dex
stx RINONE
!:
bcc up9600_irq_end
up9600_irq_continue:
rts
up9600_irq_end:
pla
pla
jmp return_from_interrupt
#endif // CONFIG_RS232_UP9600
+2 -7
View File
@@ -6,19 +6,14 @@
// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations
// XXX integrate with NMI handler
#if CONFIG_RS232_UP9600
up9600_nmi:
// XXX integrate this
// XXX integrate with NMI handler
NMIDOBIT
pha
bit CIA2_ICR // $DD0D; CHECK BIT 7 (STARTBIT PRINT)
bit CIA2_ICR // $DD0D; check if CIA caused the interrupt
bpl NMIDOBI2; NO STARTBIT RECEIVED, THEN SKIP
lda #$13
sta CIA2_CRB // $DD0F; START TIMER B (FORCED RELOAD, SIGNAL AT PB7)