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