diff bootman/llio_6551.a @ 2163:2db06bc0742a

Start of BootMan
author boisy
date Tue, 20 May 2008 14:43:00 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bootman/llio_6551.a	Tue May 20 14:43:00 2008 +0000
@@ -0,0 +1,136 @@
+         NAM    llio_coco3
+         TTL    CoCo 3 low-level I/O handler
+
+         PSECT  llio_coco3,0,0,0,0,llio
+
+         VSECT
+         ENDSECT
+
+llio:
+         lbsr   llinit
+         lbsr   llread
+         lbsr   llwrite
+         lbsr   llterm
+
+********** I/O ROUTINES ********** 
+
+* 6551 Parameters
+ADDR           EQU       $FF68
+
+A_RXD          EQU       ADDR+$00
+A_TXD          EQU       ADDR+$00
+A_STATUS       EQU       ADDR+$01
+A_RESET        EQU       ADDR+$01
+A_CMD          EQU       ADDR+$02
+A_CTRL         EQU       ADDR+$03
+
+* Baud rates
+_B2400         EQU       $1A                 2400 bps, 8-N-1
+_B4800         EQU       $1C                 4800 bps, 8-N-1
+_B9600         EQU       $1E                 9600 bps, 8-N-1
+_B19200        EQU       $1F                 19200 bps, 8-N-1
+
+BAUD           EQU       _B9600
+
+* ll_init - Initialize the low-level I/O
+* Exit: Carry = 0: Init success; Carry = 1; Init failed
+llinit                   
+               sta       A_RESET             soft reset (value not important)
+* Set specific modes and functions:
+* - no parity, no echo, no Tx interrupt
+* - no Rx interrupt, enable Tx/Rx
+               lda       #$0B
+               sta       A_CMD               save to command register
+               lda       #BAUD
+               sta       A_CTRL              select proper baud rate
+* Read any junk rx byte that may be in the register
+               lda       A_RXD
+               rts       
+
+
+* llread - Read one character from 6551
+*
+* Entry: None
+* Exit:  A = character that was read
+*
+* Note, this routine currently doesn't timeout
+llread                   
+r              lda       A_STATUS            get status byte
+               anda      #$08                mask rx buffer status flag
+               beq       r                   loop if rx buffer empty
+               lda       A_RXD               get byte from ACIA data port
+               rts       
+
+* llwrite - Write one character to 6551
+*
+* Entry: A = character to write
+* Exit:  None
+llwrite                  
+               pshs      a                   save byte to write
+w              lda       A_STATUS            get status byte
+               anda      #$10                mask tx buffer status flag
+               beq       w                   loop if tx buffer full
+               puls      a                   get byte
+               sta       A_TXD               save to ACIA data port
+               rts       
+
+
+llterm
+               rts
+
+               IFNE      0
+* llwout - Write an entire string
+* llwerr - Write an entire string
+llwerr                   
+llwout                   
+               pshs      a
+l@             lda       ,x+
+               cmpa      #C$CR
+               beq       e@
+               leay      -1,y
+               beq       f@
+               bsr       Write
+               bra       l@
+e@             bsr       Write
+               lda       #C$LF
+               bsr       Write
+f@             ldx       <buffptr
+               clrb      
+               puls      a,pc
+
+* ReadLine - Read an entire string, up to CR
+* Entry: X = address to place string being read (CR terminated)
+*        Y = maximum number of bytes to read (including nul byte)
+ReadLine                 
+               ldx       <buffptr
+               pshs      y,x,a
+               ldy       #80
+l@             bsr       Read                read 1 character
+               cmpa      #C$CR               carriage return?
+               beq       e@                  branch if so...
+               cmpa      #$08                backspace?
+               beq       bs@
+               cmpy      #$0000              anymore room?
+               beq       l@
+               leay      -1,y                back up one char
+               sta       ,x+                 and save in input buffer
+m@             bsr       Write               echo back out
+               bra       l@
+e@             sta       ,x
+               bsr       Write
+               lda       #C$LF
+               bsr       Write
+               clrb      
+               puls      a,x,y,pc
+bs@            cmpx      1,s                 are we at start
+               beq       l@                  if so, do nothing
+               clr       ,-x                 else erase last byte
+               lbsr      Write               write backspace
+               lda       #C$SPAC             a space...
+               lbsr      Write               write it
+               leay      1,y                 count back up free char
+               lda       #$08                another backspace
+               bra       m@
+               ENDC
+
+         endsect