First test version of integrating groepaz' silversurfer driver with Contiki
diff --git a/contiki-c64/uip/rs232silversurfer.S b/contiki-c64/uip/rs232silversurfer.S
new file mode 100644
index 0000000..89bbf9d
--- /dev/null
+++ b/contiki-c64/uip/rs232silversurfer.S
@@ -0,0 +1,329 @@
+ ;; The following code is written and is copyrighted by
+ ;; Groepaz/Hitmen
+
+ ;; Small changes by Adam Dunkels (renamed ss232 -> rs232)
+
+;----------------------------------------------------------------------------------------------
+; silver surfer polling mode driver for cc65
+; - work from here to create a full featured driver with interupts.
+; gpz fixed 20020828: fatal bug fixed in _rs232_params
+;----------------------------------------------------------------------------------------------
+
+rs16550base = $de08
+
+fifo_rxd = rs16550base+$00 ;8 (r)
+fifo_txd = rs16550base+$00 ;8 (w)
+
+fifo_dll = rs16550base+$00 ;8 (r/w)
+fifo_dlm = rs16550base+$01 ;9 (r/w)
+
+fifo_ier = rs16550base+$01 ;9
+
+fifo_fcr = rs16550base+$02 ;a (w)
+fifo_iir = rs16550base+$02 ;a (r)
+fifo_lcr = rs16550base+$03 ;b
+fifo_mcr = rs16550base+$04 ;c
+fifo_lsr = rs16550base+$05 ;d
+fifo_msr = rs16550base+$06 ;e (r)
+fifo_scratch = rs16550base+$07 ;f (r/w)
+
+
+
+ .export _rs232_init
+ .export _rs232_done
+ .export _rs232_params
+ .export _rs232_put
+ .export _rs232_get
+
+ .importzp ptr1, ptr2
+ .import popa, popax
+
+;----------------------------------------------------------------------------------------------
+; Error codes. Beware: The codes must match the codes in the C header file
+
+ErrNotInitialized = $01
+ErrBaudTooFast = $02
+ErrBaudNotAvail = $03
+ErrNoData = $04
+ErrOverflow = $05
+
+;----------------------------------------------------------------------------------------------
+;unsigned char __fastcall__ rs232_init (char hacked);
+;/* Initialize the serial port, install the interrupt handler. The parameter
+; * has no effect for now and should be set to 0.
+; */
+;----------------------------------------------------------------------------------------------
+
+ .code
+
+_rs232_init:
+ ; enable ssurfer-port
+ lda $de01
+ ora #$01
+ sta $de01
+
+ ; disable nmi's from ssurfer
+ lda #%00000000
+ sta fifo_ier
+
+ ; activate dtr
+ lda #%00000001
+ sta fifo_mcr
+
+ lda #$00 ; ok
+ tax
+ rts
+
+;----------------------------------------------------------------------------------------------
+;unsigned char __fastcall__ rs232_done (void);
+;/* Close the port, deinstall the interrupt hander. You MUST call this function
+; * before terminating the program, otherwise the machine may crash later. If
+; * in doubt, install an exit handler using atexit(). The function will do
+; * nothing, if it was already called.
+; */
+;----------------------------------------------------------------------------------------------
+
+_rs232_done:
+ ; disable nmi's from ssurfer
+ lda #%00000000
+ sta fifo_ier
+
+ ; deactivate dtr
+ sta fifo_mcr
+
+ ; disable ssurfer-port
+ lda $de01
+ and #$fe
+ sta $de01
+
+ lda #$00 ; ok
+ tax
+ rts
+
+;----------------------------------------------------------------------------------------------
+;unsigned char __fastcall__ rs232_params (unsigned char params, unsigned char parity);
+;/* Set the port parameters. Use a combination of the #defined values above. */
+;----------------------------------------------------------------------------------------------
+
+ .data
+
+_rs232_baudrates:
+
+ .word (7372800 / ( 50 * 16))
+ .word (7372800 / ( 110 * 16))
+ .word (7372800 / ( 269 * 8))
+ .word (7372800 / ( 300 * 16))
+ .word (7372800 / ( 600 * 16))
+ .word (7372800 / ( 1200 * 16))
+ .word (7372800 / ( 2400 * 16))
+ .word (7372800 / ( 4800 * 16))
+ .word (7372800 / ( 9600 * 16))
+ .word (7372800 / ( 19200 * 16))
+ .word (7372800 / ( 38400 * 16))
+ .word (7372800 / ( 57600 * 16))
+ .word (7372800 / ( 115200 * 16))
+ .word (7372800 / ( 230400 * 16))
+
+ .bss
+
+_rs232_tmp1:
+ .res 1
+
+ .code
+
+_rs232_params:
+
+ sta _rs232_tmp1 ; save parity
+
+ ; reset fifo
+ lda #%10000111
+ sta fifo_fcr
+
+ ; that delay thing really needed ?!
+ ; (original datasheet mentions a delay here)
+ ; ldy #$00
+ ; dey
+ ; bny *-1
+
+ ; set dlab
+ lda #%10000011 ; we assmume 8n1
+ sta fifo_lcr
+
+ jsr popa
+ tay ; save param
+
+ ; set baudrate
+ clc
+ lsr a
+ lsr a
+ lsr a
+ lsr a
+ asl a
+ tax
+ lda _rs232_baudrates,x
+ sta fifo_dll
+ lda _rs232_baudrates+1,x
+ sta fifo_dlm
+
+ tya ; param
+ and #$0f
+ ora _rs232_tmp1 ; parity
+
+ ; reset dlab
+ sta fifo_lcr
+
+ lda #$00 ; ok
+ tax
+ rts
+
+;----------------------------------------------------------------------------------------------
+; check if byte available, returns AKKU=0 if none
+
+ss_getlsr:
+ lda fifo_lsr
+ and #$01
+ rts
+
+;----------------------------------------------------------------------------------------------
+;unsigned char __fastcall__ rs232_get (char* b);
+;/* Get a character from the serial port. If no characters are available, the
+; * function will return RS_ERR_NO_DATA, so this is not a fatal error.
+; */
+;----------------------------------------------------------------------------------------------
+; get byte (non blocking, returns byte in A or CARRY=1 - error)
+
+_rs232_get:
+ sta ptr1
+ stx ptr1+1
+
+ jsr ss_getlsr ; check if byte available
+; bne sk32 ; yes
+ bne sk33 ; yes
+
+ ; activate rts
+ lda #%00000011
+ sta fifo_mcr
+sk32:
+
+ ; deactivate rts
+; lda #%00000001
+; sta fifo_mcr
+
+ jsr ss_getlsr ; check if byte available
+ bne sk33 ; yes
+
+ ; deactivate rts
+ lda #%00000001
+ sta fifo_mcr
+
+ lda #ErrNoData ; no data
+ ldx #0
+ rts
+sk33:
+ ; deactivate rts
+ lda #%00000001
+ sta fifo_mcr
+
+ ; get byte
+ ldy #$00
+ lda fifo_rxd
+ sta (ptr1),y
+
+ lda #0 ; ok
+ tax
+ rts
+
+;----------------------------------------------------------------------------------------------
+;unsigned char __fastcall__ rs232_put (char b);
+;/* Send a character via the serial port. There is a transmit buffer, but
+; * transmitting is not done via interrupt. The function returns
+; * RS_ERR_OVERFLOW if there is no space left in the transmit buffer.
+; */
+;----------------------------------------------------------------------------------------------
+
+_rs232_put:
+ tax
+ ; transmit buf ready?
+ lda fifo_lsr
+ and #%00100000
+ bne @sk1
+@sk2:
+ lda #ErrOverflow ; overflow
+ ldx #$00
+ rts
+@sk1:
+ ; reciever ready?
+ lda fifo_msr
+ and #%00010000
+ beq @sk2
+
+ stx fifo_txd
+
+ lda #$00 ; ok
+ tax
+ rts
+
+;----------------------------------------------------------------------------------------------
+;unsigned char __fastcall__ rs232_pause (void);
+;/* Assert flow control and disable interrupts. */
+;----------------------------------------------------------------------------------------------
+
+_rs232_pause:
+ ; activate rts
+ lda #%00000011
+ sta fifo_mcr
+
+ lda #$00 ; ok
+ tax
+ rts
+
+;----------------------------------------------------------------------------------------------
+;unsigned char __fastcall__ rs232_unpause (void);
+;/* Re-enable interrupts and release flow control */
+;----------------------------------------------------------------------------------------------
+
+_rs232_unpause:
+ ; deactivate rts
+ lda #%00000001
+ sta fifo_mcr
+
+ lda #$00 ; ok
+ tax
+ rts
+
+;----------------------------------------------------------------------------------------------
+;unsigned char __fastcall__ rs232_status (unsigned char* status,
+; unsigned char* errors);
+;/* Return the serial port status. */
+;----------------------------------------------------------------------------------------------
+
+_rs232_status:
+ sta ptr2
+ stx ptr2+1
+ jsr popax
+ sta ptr1
+ stx ptr1+1
+
+ ldy #$00
+
+ ; Get status
+ lda fifo_iir
+ and #%00000001
+ sta _rs232_tmp1
+ lda fifo_msr
+ lsr a
+ and #%01010000
+ ora _rs232_tmp1
+ sta _rs232_tmp1
+ lda fifo_lsr
+ and #%00101110
+ ora _rs232_tmp1
+ sta (ptr1),y
+
+ ; Get errors
+ lda #$00 ; ok
+ sta (ptr2),y
+
+ lda #$00 ; ok
+ tax
+ rts