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 + -
显示快捷键?