 ttl FIO Demo 2 (Gimix)
 pag
 abs

*
* This is a copy of the FIODEMO2 program provided by Gimix.
*

* 6551 Addresses
PORT1 equ $A004
PORT2 equ $A008
PORT3 equ $A010

* Switch Banks
SWTCH1 equ $4000
SWTCH2 equ $6000

* Status LEDs
DISP1 equ SWTCH1
DISP2 equ SWTCH2

* FIO Interface Addresses
FIODAT equ $8000
FIOCTL equ $8001

* Offsets for indirect addressing of FIO registers
CTLRG0 equ 0
CTLRG1 equ 1
ISTAT0 equ 2
ISTAT1 equ 3
ISTAT2 equ 4
ISTAT3 equ 5
IRQVEC equ 6
BYTCNT equ 7
BYTCMP equ 8
CTLRG2 equ 9
CTLRG3 equ 10
MSGOUT equ 11
MSGIN equ 12
PATMAT equ 13
PATMSK equ 14
DATBFR equ 15

 org $E000
start lds #$27FF

 ldb #$FF
 lbsr LEDout

 ldb #$55
 lbsr LEDout

* Initialize 6551s - get baud rate from switches
 ldx #PORT1
 lda SWTCH1
 lbsr serint
 ldx #PORT2
 lda SWTCH1
 lsra
 lsra
 lsra
 lsra
 lbsr serint
 ldx #PORT3
 lda SWTCH2
 lbsr serint

 ldx #initmsg
 bsr send

 ldb #120
 pshs b
wait0 ldy #59500
wait lda FIOCTL
 cmpa #$01
 beq test
 leay -1,y
 bne wait
 dec 0,s
 bne wait0
 puls b
 bra nogood

* Check to see if the FIO is really there
test lda FIOCTL
 clra
 sta FIOCTL
 lda #1
 sta FIOCTL
 clra
 sta FIOCTL

 lda #CTLRG0
 ldb #$12
 bsr stuff

 lda #PATMAT
 ldb #$55
 bsr stuff
 bsr grab
 cmpa #$55
 bne wait

 lda #PATMAT
 ldb #$AA
 bsr stuff
 bsr grab
 cmpa #$AA
 bne wait

 ldx #cpu_up
 bsr send
 ldy #DISP2
 bra LEDon

nogood ldx #cpu_down
 bsr send
 ldy #DISP1

LEDon ldu 0,y
 ldu 0,y
 ldu 0,y
 ldu 0,y
 ldu 0,y
 ldu 0,y
 bra LEDon

* Output a string ending in Null

send0 bsr serout
send lda ,x+
 bne send0
 rts

* Output a character in A
serout ldb PORT3+1
 lbsr LEDout
 andb #$70
 cmpb #$10
 bne serout
 sta PORT3+0
 rts

* Initialize a 6551, A = Baud Rate, X = Address
serint sta 1,x
 ldb #$0B
 stb 2,x
 anda #$0F
 ora #$90
 sta 3,x
 rts

* Write to selected FIO register

stuff sta FIOCTL
 stb FIOCTL
 rts

* Read a selected FIO register

grab sta FIOCTL
 lda FIOCTL
 rts

* Display a value (in B) in the LEDs (crude!!)
DELAY equ 16
LEDout pshs d,x
 lda SWTCH2
 bita #$80
 beq 99f
 lda #8
 pshs a
* Turn on LED 1 to indicate "start of new value"
 ldx #$4000
 bsr LED1on
* Pulse both if bit set, otherwise only LED1
10 ldx #$1000
 bsr LEDwait
 bitb #$80
 beq 20f
 bsr LED12on
 bra 30f
20 bsr LED1on
30 rolb
 dec 0,s
 bne 10b
 leas 1,s
* Long pause at end for synchro.
 ldx #$4000
 bsr LEDwait
99 puls d,x,pc return
*
LED1on pshs d,x
00 lda #DELAY
10 tst DISP1
 deca
 bne 10b
 leax -1,x
 bne 00b
 puls d,x,pc
*
LEDwait pshs d,x
00 lda #DELAY
10 tst LEDwait
 deca
 bne 10b
 leax -1,x
 bne 00b
 puls d,x,pc
*
LED12on pshs d,x
00 lda #DELAY
10 tst DISP1
 tst DISP2
 deca
 bne 10b
 leax -1,x
 bne 00b
 puls d,x,pc

* Messages

cpu_up fcc $D,$A,'System CPU operational',0
cpu_down fcc $D,$A,'System CPU Down!',0
initmsg fcc $D,$A,'Initialization complete.',0

* Vectors
 org $FFFE
 fdb start
