%begin {SCSI target program}

%externalroutinespec phex(%integer x)
%externalroutinespec phex2(%integer x)

%include "moose:mouse.inc"
%include "oldscsi.inc"

%constinteger id=3,other=2
%recordformat f(%record(semaphorefm)wait,sync,%string(255)iwait,twait)
%record(f)%name sync
%integer x

%routine ph(%integer x)
  phex2(x>>8)
%end

%routine wait
  signalsemaphore(sync_sync)
  semaphorewait(sync_wait)
%end

! Set up

x = find entry("scsi_sync",poa_logdict)
sync == record(integer(x))
chip == chip1
for == sync_twait

! Selection phase

chip_icr = 0; chip_tcr = 0; chip_mode = 0
chip_ser = 1<<(id+8); for = "sel irq"
%cycle
  wait %until ne(chip_bsr&bsrirq)
%repeatuntil chip_cbs&\cbsdbp&16_ff00=cbssel
chip_icr = icrbsy
chip_mode = modetgt
x = chip_rpi
for = "sel -"; wait %until eq(chip_cbs&cbssel)

! Command phase

chip_tcr = tcpcmd
x = getbyte; x = getbyte+x<<8
printstring("Target received commands "); printsymbol(x>>8)
printsymbol(x&255); newline

! Output phase

chip_tcr = tcpout; chip_icr = icrbsy
x = getbyte; x = getbyte+x<<8
printstring("Target received data "); printsymbol(x>>8)
printsymbol(x&255); newline

! Status phase

chip_tcr = tcpsta; putbyte('5')
chip_tcr = 0; chip_mode = 0; chip_icr = 0

! Bus free phase

for = "bus free"; wait %until eq(chip_cbs&(cbsbsy!cbssel))

! Reselection phase

reselect(other,id)
printstring("Target has reselected initiator"); newline

! Input phase (DMA)

chip_icr = icrbsy!icrdata; chip_tcr = tcpin
chip_mode = modetgt!modedma; chip_sds = 255
dmaput(x) %for x = '1',1,'9'
dmaput(-1)
chip_mode = modetgt
for = "dma ack -"; wait %until eq(chip_bsr&bsrack)

! Status phase

chip_tcr = tcpsta; putbyte('5')
printstring("Target finished"); newline
chip_icr = 0; chip_mode = 0; chip_tcr = 0

for = ""
wait %until 1=0

%end
