 ttl GIMIX Intelligent I/O Processor
 sttl Hardware Definitions
 abs
 pag

 lib constants
 lib macdefs
 lib iop_mem
 lib fio
 lib acia_6551
 lib clist
 lib outputq
 lib task
 lib tty
 lib vars

 sttl CPU Vectors
 pag

 org CPUtraps
 fdb 0 Unused
 fdb rom_swi3 SWI3
 fdb rom_swi2 SWI2
 fdb rom_firq FIRQ
 fdb IRQ_han IRQ
 fdb rom_swi SWI
 fdb rom_nmi NMI
 fdb rom_init Reset

 sttl System RESET Code
 pag

 org ROMorg

 if DEBUG&DBG_SYS
DBmsg00 fcc $d,'IOP ROM',0
DBmsg01 fcc $d,'System Initialization Complete',0
DBmsg02 fcc $d,'CPU RESET Complete',0
 endif
CPU_down fcc $d,$d,'System CPU not functioning',0

*
* System RESET code
*
rom_init lds #ROMstack initialize stack pointer
 ldx #sys_vars clear all of RAM
 ldd #0
10 std ,x++
 cmpx #end_vars
 blo 10b
 if DEBUG&DBG_SYS
 ldx #DBmsg00
 jsr DB_pdata
 endif
 lbsr rs_ports go reset 6551 ports
 lbsr stbinit go initialize system memory
 if DEBUG&DBG_SYS
 ldx #DBmsg01
 jsr DB_pdata
 endif
 lds #tsktab+TSKSIZ Task 0 Stack

*
* Wait for FIO to be reset by the main CPU
*
 ldu #256 -- Reset Time-Out value
fio_wait ldb #255 Spin counter
00 ldy #SWITCH1 light indicator
 ldx 0,y
 ldx 0,y
 lda FIOctl wait until port 2 is enabled
 cmpa #1 returns 1 when ready
 beq fio_test
 decb
 bne 00b jump back if not ready
 leau -1,u
 cmpu #0
 bne fio_wait
 ldx #CPU_down
 lbsr DB_pdata
 bra *
fio_test lda FIOctl soft reset for FIO
 clra
 sta FIOctl
 lda #1
 sta FIOctl
 clra
 sta FIOctl
 lda #ctl_reg0 set up FIO control
 ldb #$12
 lbsr fio_put

 lda #pat_mat initialize pattern register
 ldb #$55
 lbsr fio_put
 lbsr fio_get
 cmpb #$55 validity check
 bne fio_wait wait some more if failure
 lda #pat_mat
 ldb #$AA
 lbsr fio_put
 lbsr fio_get
 cmpb #$AA
 bne fio_wait

*
* Initialization complete - Start executing commands
*
 lda #ctl_reg0 set up FIO control
 ldb #$92
 lbsr fio_put
 lda #ist_reg0 enable message interrupts
 ldb #FIO_EMI
 lbsr fio_put
 ldb #R_RESET send "system reset & running" message
 lbsr fio_send
 ldb #ROM_VERSION
 lbsr fio_send
 if DEBUG&DBG_SYS
 ldx #DBmsg02
 jsr DB_pdata
 endif
 jmp rsched

 sttl FIO Handling Routines
 pag

*
*  Caution -- The low level routines 'fio_put'
*  and 'fio_get' must be called with the interrupts off!
*  Otherwise, there could be interaction with the
*  FIFO and you don't know what you're getting!
*

*
* fio_put - Set a FIO register
*   A - FIO register #
*   B - Value to store
*
fio_put pshs cc mask interrupts
 seti
 sta FIOctl address register
 stb FIOctl set value
 tst SWITCH1 Light LED 1 while accessing 8038
 tst SWITCH1
 tst SWITCH1
 tst SWITCH1
 puls cc,pc

*
* fio_get - Fetch the value of a FIO register
*   A - FIO register #
*   B - Returned value
*
fio_get pshs cc mask interrupts
 seti
 sta FIOctl select register
 ldb FIOctl fetch value
 tst SWITCH1 Light LED 1 while accessing 8038
 tst SWITCH1
 tst SWITCH1
 tst SWITCH1
 puls cc,pc

*
* fio_send - Send a value via the FIO Mailbox
*   B - Value to send (one byte)
*
fio_send pshs b,x save register
 lda #msg_out select outgoing mailbox
 bsr fio_put
05 ldx #$FFFF time-out counter
10 lda #ctl_reg1 wait till value consumed
 bsr fio_get
 bitb #$20 "mailbox full" flag
 beq 20f jump if consumed
 leax -1,x time-out yet?
 bne 10b
 ldx #00f
 jsr DB_pdata
 lda 0,s
 jsr DB_phex
 ldx #01f
 jsr DB_pdata
 lda #ctl_reg1
 bsr fio_get
 tfr b,a
 jsr DB_phex
 ldx #02f
 jsr DB_pdata
 lda #ist_reg0
 bsr fio_get
 tfr b,a
 jsr DB_phex
 jsr DB_main
 bra 05b try again
20 puls b,x,pc
00 fcc $d,'FIO Time-out, Value = $',0
01 fcc ', CTL1 = $',0
02 fcc ', ISR0 = $',0

*
* fio_rcv - Receive a value via the FIO Mailbox
*   B - Value received
*
fio_rcv lda #ist_reg0 check for mail ready
10 lbsr fio_get check status
 bitb #$20 "mailbox full"?
 beq 10b
 lda #msg_in pick up the mail
 jsr fio_get
 rts

*
* fio_response - Return a response code/sequence #
*    B - Response code
*    A - Transaction specific value
*
fio_response pshs d,x
 bsr FIO_get access FIO
 jsr fio_send
 ldx utask
 ldb tsseq,x
 jsr fio_send
 ldb 0,s get transaction specific value
 jsr fio_send
 bsr FIO_rel release FIO
 puls d,x,pc return

*
* FIO_get - Get access to FIO device
* -- Sleep till available
*
FIO_get pshs d,x,y,u save registers
10 ldy #FIO_lock is the device locked
 tst 0,y
 beq 20f no - go get it
 ldb #FIOPRI waiting for the FIO
 jsr sleep
 bra 10b try again
20 inc 0,y mark in use
 puls d,x,y,u,pc return

*
* FIO_rel - Release access to FIO
*
FIO_rel pshs d,x,y,u
 ldy #FIO_lock
 clr 0,y
 jsr wakeup
 puls d,x,y,u,pc return

 sttl ROM Interrupt Fielders
 pag

rom_nmi bsr rom_int
 fcc 'NMI',0
rom_firq bsr rom_int
 fcc 'FIRQ',0
rom_swi bsr rom_int
 fcc 'SWI',0
rom_swi2 bsr rom_int
 fcc 'SWI2',0
rom_swi3 bsr rom_int
 fcc 'SWI3',0

rom_int ldx #ROM_ERR
 jsr DB_pdata
 puls x
 jsr DB_pdata
rom_bad bra *
*
ROM_ERR fcc $d,'ROM Error: ',0
