rs232silversurfer.s
来自「伟大的Contiki工程, 短小精悍 的操作系统, 学习编程不可不看」· S 代码 · 共 330 行
S
330 行
;; 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 = $de08fifo_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 ;9fifo_fcr = rs16550base+$02 ;a (w)fifo_iir = rs16550base+$02 ;a (r)fifo_lcr = rs16550base+$03 ;bfifo_mcr = rs16550base+$04 ;cfifo_lsr = rs16550base+$05 ;dfifo_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 fileErrNotInitialized = $01ErrBaudTooFast = $02ErrBaudNotAvail = $03ErrNoData = $04ErrOverflow = $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 noness_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_mcrsk32: ; 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 rtssk33: ; 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
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?