 sttl Bad Interrupt Handlers
 pag
*
* Bad interrupt handlers
*

* Report unhandled interrupts

nmi bsr panic
 fcc 'NMI  ',0
unhand bsr panic
 fcc 'IRQ  ',0
 bsr panic
 fcc 'SWI  ',0
swi2 bsr panic
 fcc 'SWI2 ',0
 bsr panic
 fcc 'SWI3 ',0
 bsr panic
 fcc 'FAULT',0
firq bsr panic
 fcc 'FIRQ ',0
 bsr panic
 fcc 'CHPR ',0

* Panic processing

panic seti mask ints
 ldx #panicy point to string
 bsr pdata print it
 puls x get message
 bsr pdata print it
 lds #romstk set rom stack
 jmp montor goto mon loop

 sttl Terminal I/O
 pag

* String display routine

newlin bsr outch output cr
 lda #$a setup line feed
putch bsr outch output it
pdata lda 0,x+ get string character
 beq pdata2 end of string?
 cmpa #$d is it cr?
 beq newlin
 bra putch go output char
pdata2 rts return

* Output a space

outsp pshs a save a
 lda #$20 setup space
 bsr outch output it
 puls a,pc return

* Output a hex byte

hexbyt pshs a save byte
 lsra shift right 4 bits
 lsra
 lsra
 lsra
 bsr hexdig output it
 puls a restore digit

* Output a digit in hex

hexdig anda #$0f mask low bits
 adda #'0 make ascii digit
 cmpa #'9 is it digit?
 bls outch
 adda #7 add letter bias
 bra outch

* Test for an input character

inchck pshs a save a
 lbsr ttyget get terminal state
 lda ttybuf+tt_spd check for character present
 lsla carry = character present
 puls a,pc return

* Input a character with echo

inch pshs b save register
 ldb #O_RQRD request read data
 lbsr fio_msg -- character comes back in A
 puls b restore register
 anda #$7f mask parity
 beq inch ignore nulls
 cmpa #'a is it lower case?
 blo outch
 cmpa #'z
 bhi outch
 suba #$20 make upper case

* Output character routine

outch pshs d save registers
 ldb #O_WRC Set write one character
 lbsr fio_msg send message & wait for response
 puls d,pc return

* Initialize the terminal

tinit ldb #O_OPEN open terminal
 lbra fio_msg

raw_mode lbsr ttyget get terminal state
 lda ttybuf+tt_flg set RAW mode
 ora #RAW
 sta ttybuf+tt_flg
 lbra ttyset set new terminal mode

* Initialize the IOP

iop_init sta FIOint -- Master reset sequence
 lbsr fio_delay
 lda FIOctl
 clra
 sta FIOctl
 lda #1 Master reset on
 sta FIOctl
 clra Master reset off
 sta FIOctl
 lda #ctl_reg0
 ldb #$96
 bsr fio_put
 lda #ist_reg0 enable message interrupts
 ldb #FIO_EMI
 bsr fio_put
 lda #ctl_reg3
 ldb #$40
 bsr fio_put
 lda #ctl_reg2
 ldb #1 enable port 2
 bsr fio_put
 bsr fio_rcv wait for initialization response
 bsr fio_rcv & IOP ROM Version #
 stb rom_version
 rts


* messages

hello fcb $d
 lib romversion
prompt fcb $d
 fcc '%',0
sorry fcc '??',0
panicy fcb $d
 fcc 'Panic -> ',0
 sttl Z8038 FIO Handler
 pag

*
* fio_put - Set a FIO register
*   A - FIO register #
*   B - Value to store
*
fio_put sta FIOctl address register
 stb FIOctl set value
 rts

*
* fio_get - Fetch the value of a FIO register
*   A - FIO register #
*   B - Returned value
*
fio_get sta FIOctl select register
 ldb FIOctl fetch value
 rts

*
* 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
10 lda #ctl_reg1 wait till value consumed
 bsr fio_get
 bitb #$20 "mailbox full" flag
 bne 10b
 puls b,x,pc

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

*
* fio_delay - Delay an appropriate time for FIO reset
*
fio_delay bsr 00f -- Ask GIMIX about this!
00 rts


*
* fio_msg - Send a value via the FIO Mailbox & wait for response
*   D - Value to send (B = Command, A = Specific data)
*   jsr fio_msg
*   D - Value returned (B = Error response, A = Specific data)
*
fio_msg pshs a,x,y,u save registers
 bsr fio_send
 ldb #$FF Sequence # = $FFFF
 bsr fio_send
 puls b restore specific data
 bsr fio_send
 leas -3,s response area
 leau 0,s
 bsr fio_rcv get response
 stb ,u+
 bsr fio_rcv
 stb ,u+
 bsr fio_rcv
 stb ,u+
 puls b response code
 leas 1,s sequence # ignored
 puls a transaction specific data
50 puls x,y,u,pc return


*
* fifo_out - Select outgoing FIFO mode
*   U - FIO address
*
fifo_out pshs d,x,y,u save registers
 lda #ctl_reg3 FIFO direction bit in reg 3
 bsr fio_get
 andb #!FIO_IN set direction = OUT
 bsr fio_put
99 puls d,x,y,u,pc return

*
* fifo_in - Select incoming FIFO mode
*   U - FIO address
*
fifo_in pshs d,x,y,u save registers
 lda #ctl_reg3 FIFO direction bit in reg 3
 bsr fio_get
 orb #FIO_IN set direction = IN
 bsr fio_put
99 puls d,x,y,u,pc return

*
* ttyget - Get terminal state into "ttybuf"
* ttyset - Set terminal state from "ttybuf"
*
ttyget pshs d,x save registers
 bsr fifo_in allow IOP to write to FIFO
 ldb #O_TTYG ttyget command
 bsr fio_msg
 ldx #ttybuf result buffer pointer
 ldb #6 size of data
10 lda FIOdata get data
 sta ,x+ put in buffer
 decb done?
 bne 10b
 bsr fifo_out reset FIFO
 puls d,x,pc return

ttyset pshs d,x save registers
 ldx #ttybuf source buffer
 ldb #6
10 lda ,x+ move data to FIFO
 sta FIOdata
 decb
 bne 10b
 ldb #O_TTYS ttyset command
 bsr fio_msg
 puls d,x,pc return
