230400 Baud anyone ???

What have you built or do you want to design to go with your replica 1

230400 Baud anyone ???

Postby fsafstrom » Apr Tue 29, 2008 9:45 pm

Yes, you heard me, 230.4 KBaud on a Replica 1... ;-)

My expansion board is way to big for a Robot base so I'm building a Replica Robot Control Board.
However in stead of using a 6551 for Serial communication I decided to go with a Max3110 in stead since it's considerable smaller and eliminates the MAX232 chip.
This baby can send/receive up to 230.4 KBaud but I'm not sure the Replica can keep up the incoming stream at this speed since the buffer is only 8 chars...
I'm planning of using a more modest 57.6 KBaud in stead... 8)

Anyhow, maybe a new speed record for the Replica ?

Code: Select all
; **********************************************************************************
;
; Max3110_02.asm
;
; Interfacing the Max3110 for easy serial communication...
;
; PA0 - DIN,  PIN 15 on Max 3110, Data in to Max 3110
; PA1 - DOUT, PIN 16 on Max 3110, Data out from Max 3110
; PA2 - SCLK, PIN 17 on Max 3110, Clock pulse
; PA3 - _CS_, PIN 18 on Max 3110, Chip select inverted.
;
; The SPI is bi-directonal so we are sending data at the same time we are receiving
; data when toggling the clock. So unfortunately the Shift Register cannot be used.
;
;
; **********************************************************************************




; START @ $1000
                    * = $1000

ACIA                = $C000
                                        ; Serial Port Controler
ACIA_CTRL           = ACIA+3
ACIA_CMD            = ACIA+2
ACIA_SR             = ACIA+1
ACIA_DAT            = ACIA

VIA                 = $C040
                                        ; I/O Controller
VIA_IOB             = VIA               ; Input/Output register B
VIA_IOA             = VIA+1             ; Input/Output register A
VIA_DDRB            = VIA+2             ; Data Direction Port B
VIA_DDRA            = VIA+3             ; Data Direction Port A
VIA_T1CL            = VIA+4             ; T1 Low Order Counter
VIA_T1CH            = VIA+5             ; T1 High Order Counter
VIA_T1LL            = VIA+6             ; T1 Low Order Latches
VIA_T1LH            = VIA+7             ; T1 High Order Latches
VIA_T2CL            = VIA+8             ; T2 Low Order Counter
VIA_T2CH            = VIA+9             ; T2 High Order Counter
VIA_SR              = VIA+10            ; Shift Register
VIA_ACR             = VIA+11            ; Auxiliary Control Register
VIA_PCR             = VIA+12            ; Pheriperal Control Register
VIA_IFR             = VIA+13            ; Interrupt Flag Register
VIA_IER             = VIA+14            ; Interrupt Enable Register
VIA_IOA2            = VIA+15            ; Input/Output register A, No handshake

MSGL                = $20               ; Message pointer
MSGH                = $21

TEMP                = $22               ; Temp variable

MAXDINL             = $23               ; Low byte, data in (to Max3110)
MAXDINH             = $24               ; High byte, data in
MAXDOUTL            = $25               ; Low byte, data out (from Max3110)
MAXDOUTH            = $26               ; High byte, data out

; *****************
; * Start here... *
; *****************



MAIN                CLD                 ;Clear decimal arithmetic mode.
                    CLI
                    JSR INIT_ACIA       ; Init ACIA 
                    LDA #$0D
                    JSR ECHO            ; New line.
                    LDA #<MSG1
                    STA MSGL
                    LDA #>MSG1
                    STA MSGH
                    JSR SHWMSG          ; Show Welcome.
                    LDA #$0D
                    JSR ECHO            ; New line.
                    JSR INIT_VIA        ; Init VIA.

                    LDA #$C4            ; High Init byte
                    STA MAXDINH         ; Load High byte
                    LDA #$00            ; Low Init byte, 230.4Kbaud, 8 bits, no parity, 1 stop bit.
                    STA MAXDINL         ; Load Low byte
                    JSR MAX3110_COMM    ; Initilize Max3110



                    LDA #$80            ; Send command
                    STA MAXDINH         ; Store in high byte
                    LDA #$61            ; Start with lower a.
                    STA MAXDINL         ; Stor in low byte
                    LDY #25             ; Print 25 chars, the alphabeth.
ABC_LOOP            JSR MAX3110_COMM    ; Send char
                    INC MAXDINL         ; Next char
                    DEY                 ; All 25 chars done ?
                    BNE ABC_LOOP        ; Print more...

MAIN_LOOP           RTS



; *******************************************
; * Send and receive data from the MAX3110. *
; * Put the data in the MAXDIN(L/H) and the *
; * data in will be found in MAXDOUT(L/H).  *
; *******************************************


MAX3110_COMM        LDA VIA_IOA
                    ORA #%00001000      ; Disable MAX3110 by setting CS high.
                    AND #%11111011      ; Set clock low.
                    STA VIA_IOA         ; This will make sure we can enable MAX 3110 in a know state.

                    AND #%11110111      ; Set CS low.
                    STA VIA_IOA         ; Now the MAX 3110 is ready for the data...

                    LDX #16             ; Send 16 bits.
MAX3110_LOOP        LDA VIA_IOA         ; Get current data. The Replica is so "slow" that we should not need a delay...
                    ROR                 ; Discard bit 0.
                    ROR                 ; Shift out data bit.
                    ROL MAXDOUTL        ; Shift in databit
                    ROL MAXDOUTH        ; Don't forget the high byte.

                    LDA MAXDINH         ; Load High byte of MAXDIN.
                    ROL                 ; Shift out the carry bit so we can preserve the MAXDIN value.

                    ROL MAXDINL         ; Shift low data in
                    ROL MAXDINH         ; Carry is now set pending on the bit from MAXDIN
                    LDA VIA_IOA         ; Load Port A
                    BCC MAX3110_S0      ; If it is clear, send "0"
                    ORA #1              ; Set bit 0 in port A
                    BRA MAX3110_SEND    ; Send it
MAX3110_S0          AND #$FE            ; Clear bit 0 in port A
MAX3110_SEND        STA VIA_IOA         ; Bit is now on port A
                    ORA #%00000100      ; Set Clock high.
                    STA VIA_IOA         ; We can now get the next bit from MAX3110.


                    AND #%11111011      ; Set clock low.
                    STA VIA_IOA         ; We have sent and read one bit, repeat 16 times...
                    DEX                 ; All 16 bits ?
                    BNE MAX3110_LOOP    ; Nope, continue...
                    ORA #%00001000      ; Set CS high.
                    STA VIA_IOA         ; The MAX3110 have now recieved the data.

                    RTS                 ; Or we are done.



; ***************
; * Small delay *
; ***************

delay               LDY #$80            ; Loop 256*128 times...
                    LDX #$00
.dloop1             DEX
                    BNE .dloop1         ; Are we there yet ???
                    DEY
                    BNE .dloop1         ; Are we there yet ???
                    RTS

; *************
; * Init ACIA *
; *************


INIT_ACIA           LDA #$1F            ; Init ACIA to 19200 Baud.
                    STA ACIA_CTRL
                    LDA #$0B            ; No Parity.
                    STA ACIA_CMD
                    RTS

; ************
; * Init VIA *
; ************

INIT_VIA            LDA #%00001101      ; Set direction for Port A, PA0, PA2 and PA3 to output, rest is input.
                    STA VIA_DDRA
                    LDA #$08            ; Disable MAX3110.
                    STA VIA_IOA
                    RTS

; ******************************
; * Print a byte (Hexadecimal) *
; ******************************

PRBYTE              PHA                 ;Save A for LSD.
                    LSR
                    LSR
                    LSR                 ;MSD to LSD position.
                    LSR
                    JSR PRHEX           ; Output hex digit.
                    PLA                 ; Restore A.
PRHEX               AND #$0F            ; Mask LSD for hex print.
                    ORA #$B0            ; Add "0".
                    CMP #$BA            ; Digit?
                    BCC ECHO            ; Yes, output it.
                    ADC #$06            ; Add offset for letter.
ECHO                PHA                 ; Save A
                    AND #$7F            ; Change to "standard!BYTE"
                    STA ACIA_DAT        ; Send it.
.WAIT               LDA ACIA_SR         ; Load status register for ACIA
                    AND #$10            ; Mask bit 4.
                    BEQ .WAIT           ; ACIA not done yet, wait.
                    PLA                 ; Restore A
                    RTS                 ; Done, over and out...

; **************************
; * Print an ASCII message *
; **************************

SHWMSG              LDY #$0             ; Start with first letter
.PRINT              LDA (MSGL),Y        ; Get letter
                    BEQ .DONE           ; If zero, end of string.
                    JSR ECHO            ; Print it.
                    INY                 ; Next...
                    BNE .PRINT          ; Or terminate if we reach 255 chars.
.DONE               RTS


; *****************************************************
; * Wait for a character and then then return it in A *
; *****************************************************


GETCHAR             LDA ACIA_SR         ;See if we got an incoming char
                    AND #$08            ;Test bit 3
                    BEQ GETCHAR         ;Wait for character
                    LDA ACIA_DAT        ;Load char
                    RTS

MSG1                !byte "Testing MAX3110.",0


; How to hook the MAX3110 for 230.4Kbaud.
;
;
; Pin 1  to DB9 Pin 7
; Pin 2  to Pin 11
; Pin 3  to Pin 12
; Pin 4  to Pin 14
; Pin 5  to Pin 13
; Pin 6  to DB9 Pin 3
; Pin 7  to DB9 Pin 2
; Pin 8  to Vcc (+5V)
; Pin 9  to Xtal 3.6864 Mhz
; Pin 10 to Xtal 3.6864 Mhz
; Pin 15 to VIA 6522 PA0, Pin 2
; Pin 16 to VIA 6522 PA1, Pin 3
; Pin 17 to VIA 6522 PA2, Pin 4
; Pin 18 to VIA 6522 PA3, Pin 5
; Pin 20 to Vcc (+5V)
; Pin 27 to GND
; Pin 28 to DB9 Pin 8

; For the 3.6864Mhz Crystal (Xtal) I used 33pf ceramic caps, works for me...
User avatar
fsafstrom
 
Posts: 154
Joined: Dec Tue 26, 2006 3:57 pm
Location: San Antonio, Texas

Return to Creation Room

Who is online

Users browsing this forum: No registered users and 2 guests

cron