START	EQU $A800
MEMORY	EQU $A800

BUFR	EPZ $32
BUFR2	EPZ $34
SCDEV	EPZ $36
SCCMD	EPZ $37
DATALL	EPZ $38
DATALH	EPZ $39
DATADIR	EPZ $3A

COLCRS	EPZ $55

ICCOM	EQU $342
ICBAL	EQU $344
ICBAH	EQU $345
ICBLL	EQU $348
ICBLH	EQU $349

RUNAD	EQU $02E0

DDEVIC	EQU $0300
DUNIT	EQU $0301
DCOMND	EQU $0302
DSTATS	EQU $0303
DBUFLO	EQU $0304
DBUFHI	EQU $0305
DTIM	EQU $0306
DBYTLO	EQU $0308
DBYTHI	EQU $0309
DAUX1	EQU $030A
DAUX2	EQU $030B


CIOV	EQU $E456

SCCTRL	EQU $D170
SCDATA	EQU $D171
SCDDRC	EQU $D172
SCDDRD	EQU $D173
SCPCR	EQU $D17C
SCSTAT	EQU $D1C0



ERRFRE	EQU $81
ERRDIR	EQU $82
ERRMSG	EQU $83
ERRBUSFR	EQU $84
ERRMODAT	EQU $85	; MORE DATA THEN EXPECTED
ERRTIMO	EQU $8A
ERRRST	EQU $8E
ERRNOCMD	EQU $92


BMAN	EQU ASPIBUF+8
BPROD	EQU ASPIBUF+16
BREV	EQU ASPIBUF+32


VARIAB	EQU $0600
NILBLO	EQU VARIAB
NILBHI	EQU NILBLO+1
BCOLCRS	EQU NILBHI+1	;2 BYTES


	ORG RUNAD
	DFW PRGST

	ORG START,MEMORY

GOASPI	JMP ASPI
PRGST	JMP ASPIINIT



TCOPY	DFB $9B
	ASC "BB ATASPI man  V0.40 (c) 2000 by msc"
	DFB $9B

TSCAN	ASC "scanning Id#"
TSPACE	ASC "                    "


TID	ASC "Id"

TCLASS	ASC " C"
TANSI	ASC " S"

TNAME	DFB $9B
	ASC "Name:"
TREV	ASC " Rev:"


TINI	DFB $9B
	ASC "BB ATASPI man initialized at $"


BSZ00	DFW 512	;00
BSZ05	DFW 2048	;05



DEVTBL	DFB $FF	;TYPE
	DFB 0	;UNUSED
	DFW 0	;BLOCKSIZE
	DFW $FF,0
	DFW $FF,0
	DFW $FF,0
	DFW $FF,0
	DFW $FF,0
	DFW $FF,0


ASPIINIT	LDX #TCOPY:L
	LDY #TCOPY:H
	LDA #38
	OUTPUT
	LDA COLCRS
	STA BCOLCRS
	LDA COLCRS+1
	STA BCOLCRS+1

	LDA #$FF
	STA DEVTBL
	STA DEVTBL+4
	STA DEVTBL+8
	STA DEVTBL+12
	STA DEVTBL+16
	STA DEVTBL+20
	STA DEVTBL+24

	LDA #0
	STA SCDEV
ASPINI00 LDX #TSCAN:L
	LDY #TSCAN:H
	LDA #12
	OUTPUT

	LDA SCDEV
	BCDOUT

	LDA BCOLCRS
	STA COLCRS
	LDA BCOLCRS+1
	STA COLCRS+1

*ASPINI04	LDY #36
*	LDA #$AA
*ASPINI08	STA ASPIBUF,Y
*	INY
*	BPL ASPINI08

	LDA SCDEV
	BFRSEL
	BMI ASPINI10

	LDX #CMDINQ:L
	LDY #CMDINQ:H

	CMDOXY
	BMI ASPINI10

	LDA #ASPIBUF:L
	STA BUFR
	LDA #ASPIBUF:H
	STA BUFR+1

	LDA #36
	STA DATALL
	LDA #0
	STA DATALH
	LDA #$40
	STA DATADIR
	DATAEXC

	BPL ASPINI12

ASPINI10	CPY #ERRTIMO		;TIMEOUT ?
	BEQ NEXT

	TYA
	HEXOUT
	NEWLINE
	BPL NEXT


ASPINI12	DEVOUT
NEXT	INC SCDEV
	LDA SCDEV
	CMP #7
	BCC ASPINI00

	LDX #TSPACE:L
	LDY #TSPACE:H
	LDA #14
	OUTPUT

	LDA BCOLCRS
	STA COLCRS
	LDA BCOLCRS+1
	STA COLCRS+1

	LDX #TINI:L
	LDY #TINI:H
	LDA #31
	OUTPUT
	LDA #GOASPI:H
	STA $3
	HEXOUT
	LDA #GOASPI:L
	STA $2
	HEXOUT
	NEWLINE
	RTS


DEVOUT	LDX #TID:L
	LDY #TID:H
	LDA #2
	OUTPUT
	LDA SCDEV
	BCDOUT

	LDA #' '
	AKOUT

	LDX #BMAN:L
	LDY #BMAN:H
	LDA #24
	OUTPUT


	LDX #TCLASS:L
	LDY #TCLASS:H
	LDA #2
	OUTPUT

	LDA ASPIBUF
	AND #%00011111
	HEXOUT

	LDA ASPIBUF+1
	BPL LP05
	LDA #'r'
	DFB $2C
LP05	LDA #$20
	AKOUT


	LDX #TANSI:L
	LDY #TANSI:H
	LDA #2
	OUTPUT

	LDA ASPIBUF+2
	AND #%00000111
	PHA
	BNE LP06
	LDA #1		;SCSI 1 HAS A 0 HERE
LP06	BCDOUT

	PLA
	CMP #1		;SCSI1 WITH CSS
	BNE LP07
	LDA #'c
	AKOUT

LP07	JMP NEWLINE

*	RTS


NEWLINE	LDA #$9B
	BNE AKOUT

HEXOUT	PHA
	LSR
	LSR
	LSR
	LSR
	BCDO01
	PLA
BCDOUT	AND #%00001111
BCDO01	CMP #$A
	BCC BCDO04
	ADC #6
BCDO04	ADC #'0'

AKOUT	PHA
	LDX #0
	TXA
	STA ICBLL,X
	STA ICBLH,X
	LDA #11
	STA ICCOM,X
	PLA
	JMP CIOV



OUTPUT	PHA
	TXA
	LDX #0
	STA ICBAL,X
	TYA
	STA ICBAH,X
	PLA
	STA ICBLL,X
	LDA #0
	STA ICBLH,X
	LDA #11
	STA ICCOM,X
	JMP CIOV


EXECCMD	LDA DAUX1
	STA BUFR2
	LDA DAUX2
	STA BUFR2+1
	LDY #0

	LDA (BUFR2),Y
	STA SCDEV

	BFRSEL
	BMI EXCMDEND

	INC BUFR2
	BNE EXCMD00
	INC BUFR2+1
EXCMD00	CMDOUT
	BMI EXCMDEND

	SETDPAR

	DATAEXC

	LDA DATALL
	STA DBYTLO
	LDA DATALH
	STA DBYTHI

EXCMDEND	RTS


DEXC00	SCRESET
	BMI DEXC99
	LDY #ERRDIR
DEXC99	RTS


DEXC80	BIT DATADIR
	BPL DEXC00


	SDDROUT
	WRHNDSH


*	SETBUFR


PTDS00	LDY #0
	LDA DATALH	; STILL WHOLE PAGE
	BEQ PTDS02	; NO
PTDS01	PUTBLKS
		BCS PTDS20	; LESS BYTES THAN EXPECTED

	DEC DATALH
	BNE PTDS01

PTDS02	LDA DATALL	; ANY BYTES LEFT
	BEQ PTDS16	; NO
	TAY
	CLC
	ADC BUFR
	STA BUFR

	BCS PTDS04
	DEC BUFR+1

PTDS04	TYA
	EOR #%11111111
	TAY
	INY
	PUTBLKS
	BCS PTDS20


PTDS16	CALCBY
PTDS17	BIT SCCTRL
	BVS PTDS24	;not busy anymore
	BMI PTDS17	;no request
	LDA SCCTRL
	AND #%11000010	;only status ?
	BEQ PTDS23		;yes
	JSR SCRESET	; oh no, more Data, but we cant handle
	BMI PTDS30	; was Reset o.k. ?
	LDY #ERRMODAT	;yeah, then set our errmsg
	RTS

PTDS20	TYA
	CLC
	ADC BUFR
	STA BUFR
	BCC PTDS22
	INC BUFR+1

PTDS22	CALCBY
PTDS23	JMP STATUS	;less bytes then expected
PTDS24	LDY #1
PTDS30	RTS


DATAEXC	BSYREQ
	LDA SCCTRL
	LSR
	AND #%00000001	;CD ?
	BNE DEXC02
	JMP STATUS

DEXC02	BCS DEXC80	;WRITE
	BIT DATADIR
	BVC DEXC00


	SDDRIN
	RDHNDSH


*	SETBUFR

*	LDA DAUX1	; LOOK IF
*	STA BUFR2	; CMD IS READ
*	LDA DAUX2
*	STA BUFR2+1
*	LDY #2
*	LDA (BUFR2),Y
*	AND #%01011111	
*	CMP #$08
*	BEQ GTDB00	; THEN BURSTMMODE

GTDS00	LDY #0
	LDA DATALH	; STILL WHOLE PAGE
	BEQ GTDS02	; NO
GTDS01	GETBLKS

	BCS GTDS20	; LESS BYTES THAN EXPECTED

	DEC DATALH
	BNE GTDS01

GTDS02	LDA DATALL	; ANY BYTES LEFT
	BEQ GTDS16	; NO
	TAY
	CLC
	ADC BUFR
	STA BUFR

	BCS GTDS04
	DEC BUFR+1

GTDS04	TYA
	EOR #%11111111
	TAY
	INY
	GETBLKS
	BCS GTDS20	; LESS BYTES ?


GTDS16	CALCBY
GTDS17	BIT SCCTRL
	BVS GTDS24
	BMI GTDS17
	LDA SCCTRL
	AND #%11000010
	BEQ GTDS23
	SCRESET	; MEHR DATEN
	BMI GTDS30
	LDY #ERRMODAT
	RTS


GTDS20	TYA
	CLC
	ADC BUFR
	STA BUFR
	BCC GTDS22
	INC BUFR+1

GTDS22	CALCBY
GTDS23	JMP STATUS	;WENIGER BYTES ALS ERWARTET

GTDS24	LDY #1
GTDS30	RTS

GTDB00	SETBY
	LDY #0
	LDA DATALH
	BEQ GTDB02
GTDB01	GETBLK
	DEC DATALH
	BNE GTDB01

GTDB02	LDA NILBLO
	BEQ GTDB08
	TAY
	LDA BUFR
	SEC
	SBC NILBLO
	STA BUFR
	BCS GTDB04
	DEC BUFR+1
GTDB04	GETBLK

GTDB08	LDY DATALL
	BEQ GTDB12
	GETNIL

GTDB12	LDA NILBHI
	BEQ GTDB16
GTDB14	GETNIL
	DEC NILBHI
	BNE GTDB14	

GTDB16	LDA BUFR
	SEC
	SBC DBUFLO
	STA DATALL
	LDA BUFR+1
	SBC DBUFHI
	STA DATALH

	RTS



STATUS	RDHNDSH
	LDY #1
	LDA SCSTAT
	AND #%00010000
	BNE MSG10	;MESSAGE

	LDA SCDATA
	BEQ MSG00	;STATUS COMMAND COMPLETE
	ORA #%11000000
	TAY

MSG00	BIT SCCTRL
	BVS MSG04	;BUS FREE
	BMI MSG00	; WAIT FOR REQ

MSG08	LDA SCSTAT
	AND #%00010000
	BEQ MSG00

MSG10	LDA SCDATA
	BEQ MSG04	; MESSAGE CMD COMPL

	SCRESET
	BMI MSG20
	LDY #ERRMSG
MSG04	TYA		; TO RESET STATUS
MSG20	RTS


GETBLKS	LDA SCDATA
	STA (BUFR),Y

GTBKS04	LDA SCCTRL
	BMI GTBKS05	; NO REQUEST
	AND #%10000010
	BEQ GTBKS10	; STATUS
	INY
	BNE GETBLKS
	CLC
	INC BUFR+1
	RTS

GTBKS05	LDA #0
	TAX
GTBKS07	BIT SCCTRL
*	BVS UNEXPECTED BUSFREE
	BPL GTBKS04
	INX
	BNE GTBKS07
	CLC
	ADC #1
	BNE GTBKS07
	LDA SCCTRL
	SEC
	RTS

GTBKS10	INY
	BNE GTBKS12
	INC BUFR+1
GTBKS12	SEC
	RTS


PUTBLKS	LDA (BUFR),Y
	STA SCDATA

PTBKS04	LDA SCCTRL
	BMI PTBKS05	; NO REQUEST
	AND #%10000010
	BEQ PTBKS10	; STATUS
	INY
	BNE PUTBLKS
	CLC
	INC BUFR+1
	RTS

PTBKS05	LDA #0
	TAX
PTBKS07	BIT SCCTRL
*	BVS UNEXPECTED BUSFREE
	BPL PTBKS04
	INX
	BNE PTBKS07
	CLC
	ADC #1
	BNE PTBKS07
	LDA SCCTRL
	SEC
	RTS

PTBKS10	INY
	BNE PTBKS12
	INC BUFR+1
PTBKS12	SEC
	RTS


RDHNDSH	LDA #%11101011	;PULSE RDHNDSH
	STA SCPCR
	RTS

WRHNDSH	LDA #%11101001
	STA SCPCR
	RTS



REQACK	LDA #%11101101
	STA SCPCR

REQ01	BIT SCCTRL
	BPL REQ01

	ORA #%00000010
	STA SCPCR
	RTS



BSYREQ	LDX #0
	LDY #$E6
BSY01	BIT SCCTRL
	BVC BSY20
BSY04	INX
	BNE BSY01

BSY09	PLA
	PLA
	JMP TIMEOUT	


BSY20	LDA #0
	TAX
	LDY #$E6

BSY22	BIT SCCTRL
	BPL BSY30

	CLC
	ADC #1
	BNE BSY22

	INX
	BNE BSY22

	INY
	BNE BSY22


	BRK
	PLA
	PLA
	JMP TIMEOUT

BSY30	RTS




CMDOXY	STX BUFR2
	STY BUFR2+1

CMDOUT	LDX #0
	LDY #$E0

CMDO00	LDA SCCTRL
	AND #%11000010
	BEQ CMDO04
	INX
	BNE CMDO00
	INY
	BNE CMDO00


CMDO04	WRHNDSH
	LDY #0
	LDA (BUFR2),Y
	TAX
	SEC
	ADC BUFR2
	STA BUFR2
	BCS CMDO05
	DEC BUFR2+1

CMDO05	TXA
	EOR #%11111111
	TAY
	INY

CMDO08	LDA (BUFR2),Y
	STA SCDATA

******
*OLD CODE WHEN HANDSH WILL NOT WORK

*	LDA #%11101101
*	STA SCPCR	;ACK
*
*	LDX #0
*CMDO12	INX
*	BEQ CMDO20
*	BIT SCCTRL	;WARTE, DAS REQ
*	BPL CMDO12
*
*	ORA #%00000010
*	STA SCPCR

	INY
	BEQ CMDEND

CMDO16	BIT SCCTRL
	BVS CMDO30
	BMI CMDO16
	LDA SCCTRL
	AND #%00000010
	BEQ CMDO08


CMDEND	LDY #1
	RTS

*CMDO20	LDA #1	;FOR BUG FIXING ONLY
*	BRK

*CMDO24	LDA #2
*	BRK

CMDO30	LDA #0
	STA DATALL
	STA DATALH
	LDY #ERRBUSFR		:UNEXP. BUSFRE
	STY DSTATS
	RTS





BFRSEL	LDA #%11101111
	STA SCPCR
	LDA #%00001100
	STA SCDDRC

	BIT SCCTRL
	BVS SEL00

	SCRESET
	BPL SEL00
	RTS

SEL00	SDDROUT
	LDA SCDEV
	TAX
	LDA BITMASK,X
	STA SCDATA
	LDX #%11111011	; SEL
	STX SCCTRL


	LDY #$E0
	LDX #0
SEL04	BIT SCCTRL	; 3
	BVC SEL08	; 2
	INX		; 2
	BNE SEL04	; 3(2)=2559
	INY		; 2
	BNE SEL04	; 3 CA.46 MS 


TIMEOUT	LDA #%11101111
	STA SCPCR
TIM01	SDDRIN
	LDX #%00001101
	STX SCDDRC
	DEX
	STX SCCTRL

	LDA #0
	STA DATALL
	STA DATALH
	LDY #ERRTIMO
	STY DSTATS
	RTS		

SEL08	LDA #%11111111	;
	STA SCCTRL
	STA SCDATA
	LDY #1
	RTS


SCRESET	LDY #0
	LDX #%11110111
	STX SCCTRL
SCR01	DEX
	BNE SCR01
	DEX
	STX SCCTRL
SCR04	SCR20	
	DEY
	BNE SCR04
	DEX
	BNE SCR04
	BIT SCCTRL
	BVS SCR08
	LDY #ERRRST
	RTS

SCR08	LDY #1
SCR20	RTS


SDDRIN	LDA #0
	DFB $2C
SDDROUT	LDA #$FF
	STA SCDDRD
	RTS


BITMASK	DFB %10000001
	DFB %10000010
	DFB %10000100
	DFB %10001000
	DFB %10010000
	DFB %10100000
	DFB %11000000
	DFB %10000000



SETDPAR	LDA DBUFLO
	STA BUFR
	STA BUFR2
	LDA DBUFHI
	STA BUFR+1
	STA BUFR2+1
	LDA DBYTLO
	STA DATALL
	LDA DBYTHI
	STA DATALH
	LDA DSTATS
	STA DATADIR
	RTS

GETBLK	LDA SCDATA,Y
	STA (BUFR),Y
	INY
	BNE GETBLK
	INC BUFR+1
	RTS


GETNIL	LDA SCDATA,Y
	INY
	BNE GETNIL
	RTS




SETBY	LDA SCDEV
	ASL
	ASL
	TAY
	LDA DEVTBL+2,Y
	SEC
	SBC DATALL
	TAX
	LDA DEVTBL+3,Y
	SBC DATALH
	BCS TOLOW
	LDA DEVTBL+2,Y
	STA DATALL
	LDA DEVTBL+3,Y
	STA DATALH
	LDA #0
	TAX
TOLOW	STA NILBHI
	STX NILBLO
	RTS

CALCBY	LDA BUFR
	SEC
	SBC BUFR2
	STA DATALL
	LDA BUFR+1
	SBC BUFR2+1
	STA DATALH
	RTS

CMDINQ	DFB 6
	DFB $12,0,0,0
	DFB 36
	DFB 0

HAINQ	RTS

GDEVTP	RTS

XSCCMD	EXECCMD
	TYA
	JMP STATRET

ASCCMD	RTS

RSTSC	SCRESET
	LDA #0
	STA DBYTLO
	STA DBYTHI
	BEQ OKRET

SHAPAR	RTS

GDRVIN	RTS


BACKCLC	CLC
	RTS


NOATCMD	LDY #ERRNOCMD
	BNE STATRET
OKRET	LDY #1
STATRET	STY DSTATS
	SEC
	RTS

ASPI	LDA DDEVIC
	CMP #$70
	BNE BACKCLC
	LDA DUNIT
	CMP #1
	BNE BACKCLC
	LDA DCOMND

	LDY #$FD
ASPI04	INY
	INY
	INY
	CPY #(ASPICEND-ASPICMD)
	BEQ NOATCMD
	CMP ASPICMD,Y
	BNE ASPI04

ASPI08	LDA ASPICMD+2,Y
	PHA
	LDA ASPICMD+1,Y
	PHA
	RTS


ASPICMD	DFB $00
	DFW HAINQ-1

	DFB $01
	DFW GDEVTP-1

	DFB $02
	DFW XSCCMD-1

	DFB $03
	DFW ASCCMD-1

	DFB $04
	DFW RSTSC-1	

	DFB $05
	DFW SHAPAR-1

	DFB $06
	DFW GDRVIN-1

ASPICEND	EQU *

ASPIBUF	EQU START+$0700

