diff --git a/c64/kernal/rs232/ckout_rs232.s b/c64/kernal/rs232/ckout_rs232_up2400.s similarity index 72% rename from c64/kernal/rs232/ckout_rs232.s rename to c64/kernal/rs232/ckout_rs232_up2400.s index 66d4b3e7..7cec81d6 100644 --- a/c64/kernal/rs232/ckout_rs232.s +++ b/c64/kernal/rs232/ckout_rs232_up2400.s @@ -4,11 +4,11 @@ // -#if HAS_RS232 +#if CONFIG_RS232_UP2400 ckout_rs232: STUB_IMPLEMENTATION() // XXX provide implementation for both UP2400 and UP9600 -#endif // HAS_RS232 +#endif // CONFIG_RS232_UP2400 diff --git a/c64/kernal/rs232/ckout_rs232_up9600.s b/c64/kernal/rs232/ckout_rs232_up9600.s new file mode 100644 index 00000000..e2877512 --- /dev/null +++ b/c64/kernal/rs232/ckout_rs232_up9600.s @@ -0,0 +1,23 @@ + +// +// RS-232 part of the CKOUT routine +// + +// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations + + +#if CONFIG_RS232_UP9600 + + +ckout_rs232: + + // XXX adapt this + + lda #$02 + sta DFLTO + jsr ENABLE + clc + rts + + +#endif // CONFIG_RS232_UP9600 diff --git a/c64/kernal/rs232/open_rs232.s b/c64/kernal/rs232/open_rs232.s index a052d9a5..b4f8fd1e 100644 --- a/c64/kernal/rs232/open_rs232.s +++ b/c64/kernal/rs232/open_rs232.s @@ -20,7 +20,8 @@ open_rs232: jsr rs232_count_channels bcs open_rs232_end - // Allocate buffer + // Allocate buffers - first RIBUF, afterwards ROBUF + // (checked addresses on original ROMs) lda MEMSIZK+0 sta ROBUF+0 @@ -28,11 +29,13 @@ open_rs232: dec MEMSIZK+1 lda MEMSIZK+1 - sta ROBUF+1 // XXX RIBUF or ROBUF? + sta RIBUF+1 dec MEMSIZK+1 lda MEMSIZK+1 - sta RIBUF+1 // XXX RIBUF or ROBUF? + sta ROBUF+1 + + // Initialize buffer indexes lda #$00 sta RIDBE diff --git a/c64/kernal/rs232/up9600_disable.s b/c64/kernal/rs232/up9600_disable.s new file mode 100644 index 00000000..80ec3cc4 --- /dev/null +++ b/c64/kernal/rs232/up9600_disable.s @@ -0,0 +1,44 @@ + +// +// Disable UP9600 interface +// + +// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations + + +#if CONFIG_RS232_UP9600 + + +up9600_disable: // XXX adapt + + // XXX restore interrupt vectors and IRQ timer + + sei + lda CIA2_PRB // $DD01; DISABLE RTS + and #$FD + sta CIA2_PRB // $DD01 + lda #$7F + sta CIA2_ICR // $DD0D ; DISABLE ALL CIA INTERRUPTS + sta CIA1_ICR // $DC0D + lda #$41; QUICK (AND DIRTY) HACK TO SWITCH BACK + sta CIA1_TIMAHI // $DC05 ; TO THE DEFAULT CIA1 CONFIGURATION + lda #$81 + sta CIA1_ICR // $DC0D ; ENABLE TIMER1 (THIS IS DEFAULT) + lda #ORIGIRQ + sta IRQVECT+1 + lda #ORIGNMI + sta NMIVECT+1 + cli + pla + tay + pla + tax + pla + + + +#endif // CONFIG_RS232_UP9600 diff --git a/c64/kernal/rs232/up9600_enable.s b/c64/kernal/rs232/up9600_enable.s new file mode 100644 index 00000000..ff532cc9 --- /dev/null +++ b/c64/kernal/rs232/up9600_enable.s @@ -0,0 +1,66 @@ + +// +// Enable UP9600 interface +// + +// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations + + +#if CONFIG_RS232_UP9600 + + +up9600_enable: // XXX adapt + + sei + // XXX set NEWIRQ as IRQ vector + // XXX set NMIDOBIT as NMI vector + + ldx TVSFLG; PAL OR NTSC VERSION PRINT + lda ILOTAB,X; (KEYSCAN INTERRUPT ONCE EVERY 1/64 SECOND) + sta CIA1_TIMBLO // $DC06 ; (SORRY THIS WILL BREAK CODE, THAT USES + lda IHITAB,X; THE TI$ - VARIABLE) + sta CIA1_TIMBHI // $DC07 ; START VALUE FOR TIMER B (OF CIA1) + txa + asl + eor #$33; ** TIME CONSTANT FOR SENDER ** + ldx #0; 51 OR 55 DEPENDING ON PAL/NTSC VERSION + sta CIA1_TIMALO // $DC04 ; START VALUE FOR TIMERA (OF CIA1) + stx CIA1_TIMAHI // $DC05 ; (TIME IS AROUND 1/(2*BAUDRATE) ) + asl; ** TIME CONSTANT FOR RECEIVER ** + ora #1; 103 OR 111 DEPENDING ON PAL/NTSC VERSION + sta CIA2_TIMBLO // $DD06 ; START VALUE FOR TIMERB (OF CIA2) + stx CIA2_TIMBHI // $DD07 ; (TIME IS AROUND 1/BAUDRATE ) + lda #$41; START TIMERA OF CIA1, SP1 USED AS OUTPUT + sta CIA1_CRA // $DC0E ; GENERATES THE SENDER'S BIT CLOCK + lda #1 + sta OUTSTAT + sta CIA1_ICR // $DC0D ; DISABLE TIMERA (CIA1) INTERRUPT + sta CIA1_CRB // $DC0F ; START TIMERB OF CIA1 (GENERATES KEYSCAN IRQ) + lda #$92; STOP TIMERB OF CIA2 (ENABLE SIGNAL AT PB7) + sta CIA2_CRB // $DD0F + lda #$98 + bit CIA2_ICR // $DD0D ; CLEAR PENDING NMIS + sta CIA2_ICR // $DD0D ; ENABLE NMI (SDR AND FLAG) (CIA2) + lda #$8A + sta CIA1_ICR // $DC0D ; ENABLE IRQ (TIMERB AND SDR) (CIA1) + lda #$FF + sta CIA2_PRB // $DD01; PB0-7 DEFAULT TO 1 + sta CIA1_SDR // $DC0C ; SP1 DEFAULTS TO 1 + sec + lda RIDBE + sbc RIDBS + cmp #200 + bcc ENABLE2;; DON'T ENABLE RTS IF REC-BUFFER IS FULL + lda #2;; ENABLE RTS + sta CIA2_DDRB // $DD03 ;; (THE RTS LINE IS THE ONLY OUTPUT) +ENABLE2 + cli + pla + tay + pla + tax + pla + rts + + +#endif // CONFIG_RS232_UP9600 diff --git a/c64/kernal/rs232/up9600_ihitab.s b/c64/kernal/rs232/up9600_ihitab.s new file mode 100644 index 00000000..05310e40 --- /dev/null +++ b/c64/kernal/rs232/up9600_ihitab.s @@ -0,0 +1,18 @@ + +// +// Timer values for PAL/NTSC - high bytes +// + +// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations + + +#if CONFIG_RS232_UP9600 + + +up9600_ihitab: + + .byte $42 + .byte $40 + + +#endif // CONFIG_RS232_UP9600 diff --git a/c64/kernal/rs232/up9600_ilotab.s b/c64/kernal/rs232/up9600_ilotab.s new file mode 100644 index 00000000..bede02ea --- /dev/null +++ b/c64/kernal/rs232/up9600_ilotab.s @@ -0,0 +1,18 @@ + +// +// Timer values for PAL/NTSC - low bytes +// + +// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations + + +#if CONFIG_RS232_UP9600 + + +up9600_ilotab: + + .byte $95 + .byte $25 + + +#endif // CONFIG_RS232_UP9600