diff --git a/c64/aliases/,aliases_ram_lowmem.s b/c64/aliases/,aliases_ram_lowmem.s index 71ba917c..e5e8e393 100644 --- a/c64/aliases/,aliases_ram_lowmem.s +++ b/c64/aliases/,aliases_ram_lowmem.s @@ -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 diff --git a/c64/kernal/interrupts/ea31.default_irq_handler.s b/c64/kernal/interrupts/ea31.default_irq_handler.s index 472256b4..be964c9f 100644 --- a/c64/kernal/interrupts/ea31.default_irq_handler.s +++ b/c64/kernal/interrupts/ea31.default_irq_handler.s @@ -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 diff --git a/c64/kernal/interrupts/fe47.default_nmi_handler.s b/c64/kernal/interrupts/fe47.default_nmi_handler.s index 1fa8acc1..9f877bb5 100644 --- a/c64/kernal/interrupts/fe47.default_nmi_handler.s +++ b/c64/kernal/interrupts/fe47.default_nmi_handler.s @@ -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 diff --git a/c64/kernal/rs232/close_rs232.s b/c64/kernal/rs232/close_rs232.s index 3362daaa..52d4bf84 100644 --- a/c64/kernal/rs232/close_rs232.s +++ b/c64/kernal/rs232/close_rs232.s @@ -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 diff --git a/c64/kernal/rs232/open_rs232.s b/c64/kernal/rs232/open_rs232.s index b4f8fd1e..f4b1c0a0 100644 --- a/c64/kernal/rs232/open_rs232.s +++ b/c64/kernal/rs232/open_rs232.s @@ -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 diff --git a/c64/kernal/rs232/rs232_count_channels.s b/c64/kernal/rs232/rs232_count_channels.s index e0169451..7e032781 100644 --- a/c64/kernal/rs232/rs232_count_channels.s +++ b/c64/kernal/rs232/rs232_count_channels.s @@ -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 diff --git a/c64/kernal/rs232/up9600_enable.s b/c64/kernal/rs232/up9600_enable.s index ff532cc9..f282588c 100644 --- a/c64/kernal/rs232/up9600_enable.s +++ b/c64/kernal/rs232/up9600_enable.s @@ -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 NMIVECT + 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 diff --git a/c64/kernal/rs232/up9600_irq.s b/c64/kernal/rs232/up9600_irq.s new file mode 100644 index 00000000..a5a99e0e --- /dev/null +++ b/c64/kernal/rs232/up9600_irq.s @@ -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 diff --git a/c64/kernal/rs232/up9600_nmi.s b/c64/kernal/rs232/up9600_nmi.s index 853ff100..fea3652d 100644 --- a/c64/kernal/rs232/up9600_nmi.s +++ b/c64/kernal/rs232/up9600_nmi.s @@ -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)