mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-16 10:20:30 +00:00
aic7xxx.c:
Print out the length of the compiled sequencer program. aic7xxx.seq: More optimizations. Replace generic bcopy routine with bcopy_3 and bcopy_4 (ie unroll the loops) since these are the only two cases used. Initialize SIMODE1 and SXFRCTL1 from the kernel in ahc_init instead of at each selection/reselection since this is expensive and only needs to be done once. Condense function returns into previous instruction if possible. Reorder some sections to kill superflous jumps. These optimizations kill the ~150k/s penalty adding support for Twin/Wide cards was costing since the last place in the commaon path of execution where we had to do ugly, convoluted testing for the type of card in the sequencer has gone away. Next stop tagged queuing and target mode.
This commit is contained in:
parent
1253de3840
commit
c135d93bbf
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=5775
@ -21,7 +21,7 @@
|
||||
# FreeBSD, Twin, Wide, 2 command per target support, and other optimizations
|
||||
# provided by Justin T. Gibbs (gibbs@FreeBSD.org)
|
||||
#
|
||||
# $Id$
|
||||
# $Id: aic7xxx.seq,v 1.5 1995/01/16 16:31:21 gibbs Exp $
|
||||
|
||||
VERSION AIC7XXX_SEQ_VERSION 1.5
|
||||
|
||||
@ -202,6 +202,7 @@ ACTIVE_B = 0x59
|
||||
#
|
||||
start:
|
||||
test FLAGS,SENSE jnz start_sense
|
||||
start_nosense:
|
||||
test FLAGS,TWIN_BUS jz start2 # Are we a twin channel device?
|
||||
# For fairness, we check the other bus first, since we just finished a
|
||||
# transaction on the current channel.
|
||||
@ -210,7 +211,7 @@ start:
|
||||
xor SBLKCTL,0x08 # Toggle to the original bus
|
||||
start2:
|
||||
test SCSISIGI,0x4 jnz reselect # BSYI
|
||||
test QINCNT,SCBMASK jz start
|
||||
test QINCNT,SCBMASK jz start_nosense
|
||||
|
||||
# We have at least one queued SCB now. Set the SCB pointer
|
||||
# from the FIFO so we see the right bank of SCB registers,
|
||||
@ -227,9 +228,8 @@ test SCBARRAY+0,NEEDDMA jz test_busy
|
||||
clr HCNT+1
|
||||
mvi HCNT+0,SCB_SIZEOF
|
||||
|
||||
mvi A,4
|
||||
mvi DINDEX,HADDR
|
||||
mvi SCBARRAY+26 call bcopy
|
||||
mvi SCBARRAY+26 call bcopy_4
|
||||
|
||||
mvi DFCNTRL,0xd # HDMAEN|DIRECTION|FIFORESET
|
||||
|
||||
@ -264,7 +264,6 @@ scb_load2:
|
||||
mov SCBARRAY+16, DFDAT
|
||||
mov SCBARRAY+17, DFDAT
|
||||
mov SCBARRAY+18, DFDAT
|
||||
and SCBARRAY+0, 0xf7
|
||||
|
||||
# See if there is not already an active SCB for this target. This code
|
||||
# locks out on a per target basis instead of target/lun. Although this
|
||||
@ -292,7 +291,7 @@ start_sense:
|
||||
# Place the currently active back on the queue for later processing
|
||||
requeue:
|
||||
mov QINFIFO, SCBPTR
|
||||
jmp start
|
||||
jmp start_nosense
|
||||
|
||||
test_a:
|
||||
test ACTIVE_A,A jnz requeue
|
||||
@ -416,17 +415,14 @@ p_dataout:
|
||||
call assert
|
||||
call sg_load
|
||||
|
||||
mvi A,3
|
||||
mvi DINDEX,HCNT
|
||||
mvi SCBARRAY+23 call bcopy
|
||||
|
||||
mvi A,3
|
||||
mvi DINDEX,STCNT
|
||||
mvi SCBARRAY+23 call bcopy
|
||||
|
||||
mvi A,4
|
||||
mvi DINDEX,HADDR
|
||||
mvi SCBARRAY+19 call bcopy
|
||||
mvi SCBARRAY+19 call bcopy_4
|
||||
|
||||
# mvi DINDEX,HCNT # implicit since HCNT is next to HADDR
|
||||
mvi SCBARRAY+23 call bcopy_3
|
||||
|
||||
mvi DINDEX,STCNT
|
||||
mvi SCBARRAY+23 call bcopy_3
|
||||
|
||||
mvi 0x3d call dma # SCSIEN|SDMAEN|HDMAEN|
|
||||
# DIRECTION|FIFORESET
|
||||
@ -437,13 +433,11 @@ p_dataout:
|
||||
# it's a reflection of how many bytes were transferred on the SCSI
|
||||
# (as opposed to the host) bus.
|
||||
#
|
||||
mvi A,3
|
||||
mvi DINDEX,SCBARRAY+23
|
||||
mvi STCNT call bcopy
|
||||
mvi STCNT call bcopy_3
|
||||
|
||||
mvi A,4
|
||||
mvi DINDEX,SCBARRAY+19
|
||||
mvi SHADDR call bcopy
|
||||
mvi SHADDR call bcopy_4
|
||||
|
||||
call sg_advance
|
||||
mov SCBARRAY+18,SG_COUNT # residual S/G count
|
||||
@ -455,27 +449,22 @@ p_datain:
|
||||
call assert
|
||||
call sg_load
|
||||
|
||||
mvi A,3
|
||||
mvi DINDEX,HCNT
|
||||
mvi SCBARRAY+23 call bcopy
|
||||
|
||||
mvi A,3
|
||||
mvi DINDEX,STCNT
|
||||
mvi SCBARRAY+23 call bcopy
|
||||
|
||||
mvi A,4
|
||||
mvi DINDEX,HADDR
|
||||
mvi SCBARRAY+19 call bcopy
|
||||
mvi SCBARRAY+19 call bcopy_4
|
||||
|
||||
# mvi DINDEX,HCNT # implicit since HCNT is next to HADDR
|
||||
mvi SCBARRAY+23 call bcopy_3
|
||||
|
||||
mvi DINDEX,STCNT
|
||||
mvi SCBARRAY+23 call bcopy_3
|
||||
|
||||
mvi 0x39 call dma # SCSIEN|SDMAEN|HDMAEN|
|
||||
# !DIRECTION|FIFORESET
|
||||
mvi A,3
|
||||
mvi DINDEX,SCBARRAY+23
|
||||
mvi STCNT call bcopy
|
||||
mvi STCNT call bcopy_3
|
||||
|
||||
mvi A,4
|
||||
mvi DINDEX,SCBARRAY+19
|
||||
mvi SHADDR call bcopy
|
||||
mvi SHADDR call bcopy_4
|
||||
|
||||
call sg_advance
|
||||
mov SCBARRAY+18,SG_COUNT # residual S/G count
|
||||
@ -490,17 +479,14 @@ p_command:
|
||||
mvi 0x80 call scsisig # CDO|!IOO|!MSGO
|
||||
call assert
|
||||
|
||||
mvi A,3
|
||||
mvi DINDEX,HCNT
|
||||
mvi SCBARRAY+11 call bcopy
|
||||
|
||||
mvi A,3
|
||||
mvi DINDEX,STCNT
|
||||
mvi SCBARRAY+11 call bcopy
|
||||
|
||||
mvi A,4
|
||||
mvi DINDEX,HADDR
|
||||
mvi SCBARRAY+7 call bcopy
|
||||
mvi SCBARRAY+7 call bcopy_4
|
||||
|
||||
# mvi DINDEX,HCNT # implicit since HCNT is next to HADDR
|
||||
mvi SCBARRAY+11 call bcopy_3
|
||||
|
||||
mvi DINDEX,STCNT
|
||||
mvi SCBARRAY+11 call bcopy_3
|
||||
|
||||
mvi 0x3d call dma # SCSIEN|SDMAEN|HDMAEN|
|
||||
# DIRECTION|FIFORESET
|
||||
@ -778,15 +764,24 @@ p_busfree:
|
||||
clr SIGSTATE
|
||||
jmp start
|
||||
|
||||
# Bcopy: number of bytes to transfer should be in A, DINDEX should
|
||||
# contain the destination address, and SINDEX should contain the
|
||||
# source address. All input parameters are trashed on return.
|
||||
#
|
||||
bcopy:
|
||||
# Instead of a generic bcopy routine that requires an argument, we unroll
|
||||
# the two cases that are actually used, and call them explicitly. This
|
||||
# not only reduces the overhead of doing a bcopy by 2/3rds, but ends up
|
||||
# saving space in the program since you don't have to put the argument
|
||||
# into the accumulator before the call. Both functions expect DINDEX to
|
||||
# contain the destination address and SINDEX to contain the source
|
||||
# address.
|
||||
bcopy_3:
|
||||
mov DINDIR,SINDIR
|
||||
dec A
|
||||
cmp ALLZEROS,A jne bcopy
|
||||
ret
|
||||
mov DINDIR,SINDIR
|
||||
mov DINDIR,SINDIR ret
|
||||
|
||||
bcopy_4:
|
||||
mov DINDIR,SINDIR
|
||||
mov DINDIR,SINDIR
|
||||
mov DINDIR,SINDIR
|
||||
mov DINDIR,SINDIR ret
|
||||
|
||||
|
||||
# Locking the driver out, build a one-byte message passed in SINDEX
|
||||
# if there is no active message already. SINDEX is returned intact.
|
||||
@ -800,8 +795,7 @@ mk_mesg:
|
||||
mov MSG_START+0,SINDEX # 1-byte message
|
||||
|
||||
mk_mesg1:
|
||||
mvi SEQCTL,0x10 # !PAUSEDIS|FASTMODE
|
||||
ret
|
||||
mvi SEQCTL,0x10 ret # !PAUSEDIS|FASTMODE
|
||||
|
||||
# Input byte in Automatic PIO mode. The address to store the byte
|
||||
# in should be in SINDEX. DINDEX will be used by this routine.
|
||||
@ -913,9 +907,8 @@ dma5:
|
||||
dma6:
|
||||
test DFCNTRL,0x38 jnz dma6 # SCSIENACK|SDMAENACK|HDMAENACK
|
||||
|
||||
mvi A,3
|
||||
mvi DINDEX,SCBARRAY+15
|
||||
mvi STCNT call bcopy
|
||||
mvi STCNT call bcopy_3
|
||||
|
||||
ret
|
||||
|
||||
@ -924,47 +917,24 @@ dma6:
|
||||
# contents are stomped on return.
|
||||
#
|
||||
initialize:
|
||||
and SCSIID,0xf0,SINDEX # target ID
|
||||
test SBLKCTL,0x08 jnz initialize_b
|
||||
mvi SINDEX,SCSICONF_A
|
||||
test FLAGS,WIDE_BUS jnz initialize_wide
|
||||
and A,0x7,SCSICONF_A # SCSI_ID_A[210]
|
||||
jmp initialize_2
|
||||
initialize_b:
|
||||
and A,0x7,SCSICONF_B # SCSI_ID_B[210]
|
||||
mvi SCSICONF_B jmp initialize_2
|
||||
|
||||
initialize_wide:
|
||||
and A,0x0f,SCSICONF_B # SCSI_ID_B[210]
|
||||
|
||||
initialize_2:
|
||||
or SCSIID,A
|
||||
and SINDEX,0xf0 # Get target ID
|
||||
and A,0x0f,SCSIID
|
||||
or SINDEX,A
|
||||
mov SCSIID,SINDEX
|
||||
|
||||
# Esundry initialization.
|
||||
#
|
||||
clr DROPATN
|
||||
clr SIGSTATE
|
||||
|
||||
# Turn on Automatic PIO mode now, before we expect to see an REQ
|
||||
# Turn on Automatic PIO mode now, before we expect to see a REQ
|
||||
# from the target. It shouldn't hurt anything to leave it on. Set
|
||||
# CLRCHN here before the target has entered a data transfer mode -
|
||||
# with synchronous SCSI, if you do it later, you blow away some
|
||||
# data in the SCSI FIFO that the target has already sent to you.
|
||||
#
|
||||
# DFON is a 7870 bit enabling digital filtering of REQ and ACK signals.
|
||||
#
|
||||
mvi SXFRCTL0,0x8a # DFON|SPIOEN|CLRCHN
|
||||
|
||||
# Set SCSI bus parity checking and the selection timeout value,
|
||||
# and enable the hardware selection timer. Set the SELTO interrupt
|
||||
# to signal the driver.
|
||||
#
|
||||
# STPWEN is 7870-specific, enabling an external termination power source.
|
||||
#
|
||||
and A,0x38,SINDIR # PARITY_ENB|SEL_TIM[10]
|
||||
or SXFRCTL1,0x7,A # ENSTIMER|ACTBEGEB|STPWEN
|
||||
mvi SIMODE1,0x84 # ENSELTIMO|ENSCSIPERR
|
||||
|
||||
# Initialize scatter-gather pointers by setting up the working copy
|
||||
# in scratch RAM.
|
||||
#
|
||||
@ -973,8 +943,7 @@ initialize_2:
|
||||
# Initialize SCSIRATE with the appropriate value for this target.
|
||||
#
|
||||
call ndx_dtr
|
||||
mov SCSIRATE,SINDIR
|
||||
ret
|
||||
mov SCSIRATE,SINDIR ret
|
||||
|
||||
# Assert that if we've been reselected, then we've seen an IDENTIFY
|
||||
# message.
|
||||
@ -1050,9 +1019,8 @@ findSCB2:
|
||||
sg_scb2ram:
|
||||
mov SG_COUNT,SCBARRAY+2
|
||||
|
||||
mvi A,4
|
||||
mvi DINDEX,SG_NEXT
|
||||
mvi SCBARRAY+3 call bcopy
|
||||
mvi SCBARRAY+3 call bcopy_4
|
||||
|
||||
mvi SG_NOLOAD,0x80
|
||||
test SCBARRAY+0,0x10 jnz sg_scb2ram1 # don't reload s/g?
|
||||
@ -1066,9 +1034,8 @@ sg_scb2ram1:
|
||||
sg_ram2scb:
|
||||
mov SCBARRAY+2,SG_COUNT
|
||||
|
||||
mvi A,4
|
||||
mvi DINDEX,SCBARRAY+3
|
||||
mvi SG_NEXT call bcopy
|
||||
mvi SG_NEXT call bcopy_4
|
||||
|
||||
and SCBARRAY+0,0xef,SCBARRAY+0
|
||||
test SG_NOLOAD,0x80 jz sg_ram2scb1 # reload s/g?
|
||||
@ -1091,9 +1058,8 @@ sg_load:
|
||||
clr HCNT+1
|
||||
mvi HCNT+0,SG_SIZEOF
|
||||
|
||||
mvi A,4
|
||||
mvi DINDEX,HADDR
|
||||
mvi SG_NEXT call bcopy
|
||||
mvi SG_NEXT call bcopy_4
|
||||
|
||||
mvi DFCNTRL,0xd # HDMAEN|DIRECTION|FIFORESET
|
||||
|
||||
@ -1166,9 +1132,7 @@ sg_advance:
|
||||
add SG_NEXT+0,SG_SIZEOF,SG_NEXT+0
|
||||
adc SG_NEXT+1,A,SG_NEXT+1
|
||||
adc SG_NEXT+2,A,SG_NEXT+2
|
||||
adc SG_NEXT+3,A,SG_NEXT+3
|
||||
|
||||
ret
|
||||
adc SG_NEXT+3,A,SG_NEXT+3 ret
|
||||
|
||||
sg_advance1:
|
||||
mvi SG_NOLOAD,0x80 # don't reload s/g next time
|
||||
@ -1209,8 +1173,7 @@ mk_wdtr:
|
||||
mvi DINDIR,3 # WDTR code
|
||||
mov DINDIR,ARG_1 # bus width
|
||||
|
||||
add MSG_LEN,-MSG_START+0,DINDEX # update message length
|
||||
ret
|
||||
add MSG_LEN,-MSG_START+0,DINDEX ret # update message length
|
||||
|
||||
mk_sdtr:
|
||||
mvi DINDIR,1 # extended message
|
||||
@ -1220,8 +1183,7 @@ mk_sdtr:
|
||||
mov DINDIR,RETURN_1 # REQ/ACK transfer period
|
||||
and DINDIR,0xf,SINDIR # Sync Offset
|
||||
|
||||
add MSG_LEN,-MSG_START+0,DINDEX # update message length
|
||||
ret
|
||||
add MSG_LEN,-MSG_START+0,DINDEX ret # update message length
|
||||
|
||||
# Tag Message if Tag enabled in SCB control block. Use SCBPTR as the tag
|
||||
# value
|
||||
|
@ -26,7 +26,7 @@
|
||||
* A <label> is an <undef-sym> ending in a colon. Spaces, tabs, and commas
|
||||
* are token separators.
|
||||
*
|
||||
* $Id$
|
||||
* $Id: aic7xxx.c,v 1.4 1995/01/16 16:31:20 gibbs Exp $
|
||||
*/
|
||||
|
||||
/* #define _POSIX_SOURCE 1 */
|
||||
@ -193,6 +193,7 @@ void output(FILE *fp)
|
||||
M[i][2],
|
||||
M[i][1],
|
||||
M[i][0]);
|
||||
printf("%d out of %d instructions used.\n", LC, MEMORY);
|
||||
}
|
||||
|
||||
char **getl(int *n)
|
||||
|
@ -26,7 +26,7 @@
|
||||
* A <label> is an <undef-sym> ending in a colon. Spaces, tabs, and commas
|
||||
* are token separators.
|
||||
*
|
||||
* $Id$
|
||||
* $Id: aic7xxx.c,v 1.4 1995/01/16 16:31:20 gibbs Exp $
|
||||
*/
|
||||
|
||||
/* #define _POSIX_SOURCE 1 */
|
||||
@ -193,6 +193,7 @@ void output(FILE *fp)
|
||||
M[i][2],
|
||||
M[i][1],
|
||||
M[i][0]);
|
||||
printf("%d out of %d instructions used.\n", LC, MEMORY);
|
||||
}
|
||||
|
||||
char **getl(int *n)
|
||||
|
@ -26,7 +26,7 @@
|
||||
* A <label> is an <undef-sym> ending in a colon. Spaces, tabs, and commas
|
||||
* are token separators.
|
||||
*
|
||||
* $Id$
|
||||
* $Id: aic7xxx.c,v 1.4 1995/01/16 16:31:20 gibbs Exp $
|
||||
*/
|
||||
|
||||
/* #define _POSIX_SOURCE 1 */
|
||||
@ -193,6 +193,7 @@ void output(FILE *fp)
|
||||
M[i][2],
|
||||
M[i][1],
|
||||
M[i][0]);
|
||||
printf("%d out of %d instructions used.\n", LC, MEMORY);
|
||||
}
|
||||
|
||||
char **getl(int *n)
|
||||
|
@ -26,7 +26,7 @@
|
||||
* A <label> is an <undef-sym> ending in a colon. Spaces, tabs, and commas
|
||||
* are token separators.
|
||||
*
|
||||
* $Id$
|
||||
* $Id: aic7xxx.c,v 1.4 1995/01/16 16:31:20 gibbs Exp $
|
||||
*/
|
||||
|
||||
/* #define _POSIX_SOURCE 1 */
|
||||
@ -193,6 +193,7 @@ void output(FILE *fp)
|
||||
M[i][2],
|
||||
M[i][1],
|
||||
M[i][0]);
|
||||
printf("%d out of %d instructions used.\n", LC, MEMORY);
|
||||
}
|
||||
|
||||
char **getl(int *n)
|
||||
|
@ -21,7 +21,7 @@
|
||||
# FreeBSD, Twin, Wide, 2 command per target support, and other optimizations
|
||||
# provided by Justin T. Gibbs (gibbs@FreeBSD.org)
|
||||
#
|
||||
# $Id$
|
||||
# $Id: aic7xxx.seq,v 1.5 1995/01/16 16:31:21 gibbs Exp $
|
||||
|
||||
VERSION AIC7XXX_SEQ_VERSION 1.5
|
||||
|
||||
@ -202,6 +202,7 @@ ACTIVE_B = 0x59
|
||||
#
|
||||
start:
|
||||
test FLAGS,SENSE jnz start_sense
|
||||
start_nosense:
|
||||
test FLAGS,TWIN_BUS jz start2 # Are we a twin channel device?
|
||||
# For fairness, we check the other bus first, since we just finished a
|
||||
# transaction on the current channel.
|
||||
@ -210,7 +211,7 @@ start:
|
||||
xor SBLKCTL,0x08 # Toggle to the original bus
|
||||
start2:
|
||||
test SCSISIGI,0x4 jnz reselect # BSYI
|
||||
test QINCNT,SCBMASK jz start
|
||||
test QINCNT,SCBMASK jz start_nosense
|
||||
|
||||
# We have at least one queued SCB now. Set the SCB pointer
|
||||
# from the FIFO so we see the right bank of SCB registers,
|
||||
@ -227,9 +228,8 @@ test SCBARRAY+0,NEEDDMA jz test_busy
|
||||
clr HCNT+1
|
||||
mvi HCNT+0,SCB_SIZEOF
|
||||
|
||||
mvi A,4
|
||||
mvi DINDEX,HADDR
|
||||
mvi SCBARRAY+26 call bcopy
|
||||
mvi SCBARRAY+26 call bcopy_4
|
||||
|
||||
mvi DFCNTRL,0xd # HDMAEN|DIRECTION|FIFORESET
|
||||
|
||||
@ -264,7 +264,6 @@ scb_load2:
|
||||
mov SCBARRAY+16, DFDAT
|
||||
mov SCBARRAY+17, DFDAT
|
||||
mov SCBARRAY+18, DFDAT
|
||||
and SCBARRAY+0, 0xf7
|
||||
|
||||
# See if there is not already an active SCB for this target. This code
|
||||
# locks out on a per target basis instead of target/lun. Although this
|
||||
@ -292,7 +291,7 @@ start_sense:
|
||||
# Place the currently active back on the queue for later processing
|
||||
requeue:
|
||||
mov QINFIFO, SCBPTR
|
||||
jmp start
|
||||
jmp start_nosense
|
||||
|
||||
test_a:
|
||||
test ACTIVE_A,A jnz requeue
|
||||
@ -416,17 +415,14 @@ p_dataout:
|
||||
call assert
|
||||
call sg_load
|
||||
|
||||
mvi A,3
|
||||
mvi DINDEX,HCNT
|
||||
mvi SCBARRAY+23 call bcopy
|
||||
|
||||
mvi A,3
|
||||
mvi DINDEX,STCNT
|
||||
mvi SCBARRAY+23 call bcopy
|
||||
|
||||
mvi A,4
|
||||
mvi DINDEX,HADDR
|
||||
mvi SCBARRAY+19 call bcopy
|
||||
mvi SCBARRAY+19 call bcopy_4
|
||||
|
||||
# mvi DINDEX,HCNT # implicit since HCNT is next to HADDR
|
||||
mvi SCBARRAY+23 call bcopy_3
|
||||
|
||||
mvi DINDEX,STCNT
|
||||
mvi SCBARRAY+23 call bcopy_3
|
||||
|
||||
mvi 0x3d call dma # SCSIEN|SDMAEN|HDMAEN|
|
||||
# DIRECTION|FIFORESET
|
||||
@ -437,13 +433,11 @@ p_dataout:
|
||||
# it's a reflection of how many bytes were transferred on the SCSI
|
||||
# (as opposed to the host) bus.
|
||||
#
|
||||
mvi A,3
|
||||
mvi DINDEX,SCBARRAY+23
|
||||
mvi STCNT call bcopy
|
||||
mvi STCNT call bcopy_3
|
||||
|
||||
mvi A,4
|
||||
mvi DINDEX,SCBARRAY+19
|
||||
mvi SHADDR call bcopy
|
||||
mvi SHADDR call bcopy_4
|
||||
|
||||
call sg_advance
|
||||
mov SCBARRAY+18,SG_COUNT # residual S/G count
|
||||
@ -455,27 +449,22 @@ p_datain:
|
||||
call assert
|
||||
call sg_load
|
||||
|
||||
mvi A,3
|
||||
mvi DINDEX,HCNT
|
||||
mvi SCBARRAY+23 call bcopy
|
||||
|
||||
mvi A,3
|
||||
mvi DINDEX,STCNT
|
||||
mvi SCBARRAY+23 call bcopy
|
||||
|
||||
mvi A,4
|
||||
mvi DINDEX,HADDR
|
||||
mvi SCBARRAY+19 call bcopy
|
||||
mvi SCBARRAY+19 call bcopy_4
|
||||
|
||||
# mvi DINDEX,HCNT # implicit since HCNT is next to HADDR
|
||||
mvi SCBARRAY+23 call bcopy_3
|
||||
|
||||
mvi DINDEX,STCNT
|
||||
mvi SCBARRAY+23 call bcopy_3
|
||||
|
||||
mvi 0x39 call dma # SCSIEN|SDMAEN|HDMAEN|
|
||||
# !DIRECTION|FIFORESET
|
||||
mvi A,3
|
||||
mvi DINDEX,SCBARRAY+23
|
||||
mvi STCNT call bcopy
|
||||
mvi STCNT call bcopy_3
|
||||
|
||||
mvi A,4
|
||||
mvi DINDEX,SCBARRAY+19
|
||||
mvi SHADDR call bcopy
|
||||
mvi SHADDR call bcopy_4
|
||||
|
||||
call sg_advance
|
||||
mov SCBARRAY+18,SG_COUNT # residual S/G count
|
||||
@ -490,17 +479,14 @@ p_command:
|
||||
mvi 0x80 call scsisig # CDO|!IOO|!MSGO
|
||||
call assert
|
||||
|
||||
mvi A,3
|
||||
mvi DINDEX,HCNT
|
||||
mvi SCBARRAY+11 call bcopy
|
||||
|
||||
mvi A,3
|
||||
mvi DINDEX,STCNT
|
||||
mvi SCBARRAY+11 call bcopy
|
||||
|
||||
mvi A,4
|
||||
mvi DINDEX,HADDR
|
||||
mvi SCBARRAY+7 call bcopy
|
||||
mvi SCBARRAY+7 call bcopy_4
|
||||
|
||||
# mvi DINDEX,HCNT # implicit since HCNT is next to HADDR
|
||||
mvi SCBARRAY+11 call bcopy_3
|
||||
|
||||
mvi DINDEX,STCNT
|
||||
mvi SCBARRAY+11 call bcopy_3
|
||||
|
||||
mvi 0x3d call dma # SCSIEN|SDMAEN|HDMAEN|
|
||||
# DIRECTION|FIFORESET
|
||||
@ -778,15 +764,24 @@ p_busfree:
|
||||
clr SIGSTATE
|
||||
jmp start
|
||||
|
||||
# Bcopy: number of bytes to transfer should be in A, DINDEX should
|
||||
# contain the destination address, and SINDEX should contain the
|
||||
# source address. All input parameters are trashed on return.
|
||||
#
|
||||
bcopy:
|
||||
# Instead of a generic bcopy routine that requires an argument, we unroll
|
||||
# the two cases that are actually used, and call them explicitly. This
|
||||
# not only reduces the overhead of doing a bcopy by 2/3rds, but ends up
|
||||
# saving space in the program since you don't have to put the argument
|
||||
# into the accumulator before the call. Both functions expect DINDEX to
|
||||
# contain the destination address and SINDEX to contain the source
|
||||
# address.
|
||||
bcopy_3:
|
||||
mov DINDIR,SINDIR
|
||||
dec A
|
||||
cmp ALLZEROS,A jne bcopy
|
||||
ret
|
||||
mov DINDIR,SINDIR
|
||||
mov DINDIR,SINDIR ret
|
||||
|
||||
bcopy_4:
|
||||
mov DINDIR,SINDIR
|
||||
mov DINDIR,SINDIR
|
||||
mov DINDIR,SINDIR
|
||||
mov DINDIR,SINDIR ret
|
||||
|
||||
|
||||
# Locking the driver out, build a one-byte message passed in SINDEX
|
||||
# if there is no active message already. SINDEX is returned intact.
|
||||
@ -800,8 +795,7 @@ mk_mesg:
|
||||
mov MSG_START+0,SINDEX # 1-byte message
|
||||
|
||||
mk_mesg1:
|
||||
mvi SEQCTL,0x10 # !PAUSEDIS|FASTMODE
|
||||
ret
|
||||
mvi SEQCTL,0x10 ret # !PAUSEDIS|FASTMODE
|
||||
|
||||
# Input byte in Automatic PIO mode. The address to store the byte
|
||||
# in should be in SINDEX. DINDEX will be used by this routine.
|
||||
@ -913,9 +907,8 @@ dma5:
|
||||
dma6:
|
||||
test DFCNTRL,0x38 jnz dma6 # SCSIENACK|SDMAENACK|HDMAENACK
|
||||
|
||||
mvi A,3
|
||||
mvi DINDEX,SCBARRAY+15
|
||||
mvi STCNT call bcopy
|
||||
mvi STCNT call bcopy_3
|
||||
|
||||
ret
|
||||
|
||||
@ -924,47 +917,24 @@ dma6:
|
||||
# contents are stomped on return.
|
||||
#
|
||||
initialize:
|
||||
and SCSIID,0xf0,SINDEX # target ID
|
||||
test SBLKCTL,0x08 jnz initialize_b
|
||||
mvi SINDEX,SCSICONF_A
|
||||
test FLAGS,WIDE_BUS jnz initialize_wide
|
||||
and A,0x7,SCSICONF_A # SCSI_ID_A[210]
|
||||
jmp initialize_2
|
||||
initialize_b:
|
||||
and A,0x7,SCSICONF_B # SCSI_ID_B[210]
|
||||
mvi SCSICONF_B jmp initialize_2
|
||||
|
||||
initialize_wide:
|
||||
and A,0x0f,SCSICONF_B # SCSI_ID_B[210]
|
||||
|
||||
initialize_2:
|
||||
or SCSIID,A
|
||||
and SINDEX,0xf0 # Get target ID
|
||||
and A,0x0f,SCSIID
|
||||
or SINDEX,A
|
||||
mov SCSIID,SINDEX
|
||||
|
||||
# Esundry initialization.
|
||||
#
|
||||
clr DROPATN
|
||||
clr SIGSTATE
|
||||
|
||||
# Turn on Automatic PIO mode now, before we expect to see an REQ
|
||||
# Turn on Automatic PIO mode now, before we expect to see a REQ
|
||||
# from the target. It shouldn't hurt anything to leave it on. Set
|
||||
# CLRCHN here before the target has entered a data transfer mode -
|
||||
# with synchronous SCSI, if you do it later, you blow away some
|
||||
# data in the SCSI FIFO that the target has already sent to you.
|
||||
#
|
||||
# DFON is a 7870 bit enabling digital filtering of REQ and ACK signals.
|
||||
#
|
||||
mvi SXFRCTL0,0x8a # DFON|SPIOEN|CLRCHN
|
||||
|
||||
# Set SCSI bus parity checking and the selection timeout value,
|
||||
# and enable the hardware selection timer. Set the SELTO interrupt
|
||||
# to signal the driver.
|
||||
#
|
||||
# STPWEN is 7870-specific, enabling an external termination power source.
|
||||
#
|
||||
and A,0x38,SINDIR # PARITY_ENB|SEL_TIM[10]
|
||||
or SXFRCTL1,0x7,A # ENSTIMER|ACTBEGEB|STPWEN
|
||||
mvi SIMODE1,0x84 # ENSELTIMO|ENSCSIPERR
|
||||
|
||||
# Initialize scatter-gather pointers by setting up the working copy
|
||||
# in scratch RAM.
|
||||
#
|
||||
@ -973,8 +943,7 @@ initialize_2:
|
||||
# Initialize SCSIRATE with the appropriate value for this target.
|
||||
#
|
||||
call ndx_dtr
|
||||
mov SCSIRATE,SINDIR
|
||||
ret
|
||||
mov SCSIRATE,SINDIR ret
|
||||
|
||||
# Assert that if we've been reselected, then we've seen an IDENTIFY
|
||||
# message.
|
||||
@ -1050,9 +1019,8 @@ findSCB2:
|
||||
sg_scb2ram:
|
||||
mov SG_COUNT,SCBARRAY+2
|
||||
|
||||
mvi A,4
|
||||
mvi DINDEX,SG_NEXT
|
||||
mvi SCBARRAY+3 call bcopy
|
||||
mvi SCBARRAY+3 call bcopy_4
|
||||
|
||||
mvi SG_NOLOAD,0x80
|
||||
test SCBARRAY+0,0x10 jnz sg_scb2ram1 # don't reload s/g?
|
||||
@ -1066,9 +1034,8 @@ sg_scb2ram1:
|
||||
sg_ram2scb:
|
||||
mov SCBARRAY+2,SG_COUNT
|
||||
|
||||
mvi A,4
|
||||
mvi DINDEX,SCBARRAY+3
|
||||
mvi SG_NEXT call bcopy
|
||||
mvi SG_NEXT call bcopy_4
|
||||
|
||||
and SCBARRAY+0,0xef,SCBARRAY+0
|
||||
test SG_NOLOAD,0x80 jz sg_ram2scb1 # reload s/g?
|
||||
@ -1091,9 +1058,8 @@ sg_load:
|
||||
clr HCNT+1
|
||||
mvi HCNT+0,SG_SIZEOF
|
||||
|
||||
mvi A,4
|
||||
mvi DINDEX,HADDR
|
||||
mvi SG_NEXT call bcopy
|
||||
mvi SG_NEXT call bcopy_4
|
||||
|
||||
mvi DFCNTRL,0xd # HDMAEN|DIRECTION|FIFORESET
|
||||
|
||||
@ -1166,9 +1132,7 @@ sg_advance:
|
||||
add SG_NEXT+0,SG_SIZEOF,SG_NEXT+0
|
||||
adc SG_NEXT+1,A,SG_NEXT+1
|
||||
adc SG_NEXT+2,A,SG_NEXT+2
|
||||
adc SG_NEXT+3,A,SG_NEXT+3
|
||||
|
||||
ret
|
||||
adc SG_NEXT+3,A,SG_NEXT+3 ret
|
||||
|
||||
sg_advance1:
|
||||
mvi SG_NOLOAD,0x80 # don't reload s/g next time
|
||||
@ -1209,8 +1173,7 @@ mk_wdtr:
|
||||
mvi DINDIR,3 # WDTR code
|
||||
mov DINDIR,ARG_1 # bus width
|
||||
|
||||
add MSG_LEN,-MSG_START+0,DINDEX # update message length
|
||||
ret
|
||||
add MSG_LEN,-MSG_START+0,DINDEX ret # update message length
|
||||
|
||||
mk_sdtr:
|
||||
mvi DINDIR,1 # extended message
|
||||
@ -1220,8 +1183,7 @@ mk_sdtr:
|
||||
mov DINDIR,RETURN_1 # REQ/ACK transfer period
|
||||
and DINDIR,0xf,SINDIR # Sync Offset
|
||||
|
||||
add MSG_LEN,-MSG_START+0,DINDEX # update message length
|
||||
ret
|
||||
add MSG_LEN,-MSG_START+0,DINDEX ret # update message length
|
||||
|
||||
# Tag Message if Tag enabled in SCB control block. Use SCBPTR as the tag
|
||||
# value
|
||||
|
Loading…
Reference in New Issue
Block a user