START = $8000 ; ; Code equates ; CASINI = $02 BUFR = $32 BUFR2 = $34 SCDEV = $36 SCCMD = $37 DATALL = $38 DATALH = $39 DATADIR = $3A COLCRS = $55 ERRFRE = $81 ERRDIR = $82 ERRMSG = $83 ERRBUSFR = $84 ERRMODAT = $85 ; MORE DATA THAN EXPECTED ERRTIMO = $8A ERRRST = $8E ERRNOCMD = $92 RUNAD = $02E0 DDEVIC = $0300 DUNIT = $0301 DCOMND = $0302 DSTATS = $0303 DBUFLO = $0304 DBUFHI = $0305 DTIM = $0306 DBYTLO = $0308 DBYTHI = $0309 DAUX1 = $030A DAUX2 = $030B ICCOM = $0342 ICBAL = $0344 ICBAH = $0345 ICBLL = $0348 ICBLH = $0349 SCCTRL = $D170 SCDATA = $D171 SCDDRC = $D172 SCDDRD = $D173 SCPCR = $D17C SCSTAT = $D1C0 CIOV = $E456 BMAN = ASPIBUF+8 BPROD = ASPIBUF+16 BREV = ASPIBUF+32 VARIAB = $0600 NILBLO = VARIAB NILBHI = NILBLO+1 BCOLCRS = NILBHI+1 ; 2 BYTES ; ; Start of code ; *= START ; PRGST JMP ASPIINIT ; GOASPI JMP ASPI ; TCOPY .BYTE $9B .BYTE "BB ATASPI ma" .BYTE "n V0.40 (c)" .BYTE " 2000 by msc" .BYTE $9B ; TSCAN .BYTE "scanning Id#" ; TSPACE .BYTE " " .BYTE " " ; TID .BYTE "Id" ; TCLASS .BYTE " C" ; TANSI .BYTE " S" ; TNAME .BYTE $9B .BYTE "Name:" ; TREV .BYTE " Rev:" ; TINI .BYTE $9B .BYTE "BB ATASPI ma" .BYTE "n initialize" .BYTE "d at $" ; BSZ00 .WORD 512 ; 00 ; BSZ05 .WORD 2048 ; 05 ; DEVTBL .BYTE $FF ; TYPE .BYTE $00 ; UNUSED .WORD 0 ; BLOCKSIZE ; .BYTE $FF .BYTE $00 .WORD 0 ; .BYTE $FF .BYTE $00 .WORD 0 ; .BYTE $FF .BYTE $00 .WORD 0 ; .BYTE $FF .BYTE $00 .WORD 0 ; .BYTE $FF .BYTE $00 .WORD 0 ; .BYTE $FF .BYTE $00 .WORD 0 ; ASPIINIT LDX # TCOPY LDA #38 JSR 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 APINI00 LDX # TSCAN LDA #12 JSR OUTPUT LDA SCDEV JSR BCDOUT LDA BCOLCRS STA COLCRS LDA BCOLCRS+1 STA COLCRS+1 ;ASPINIO4 ; LDY #36 ; LDA #$AA ;ASPINI08 ; STA ASPIBUF,Y ; INY ; BPL ASPINI08 LDA SCDEV JSR BFRSELA BMI ASPINI1 LDX # CMDINQ JSR CMDOXY BMI ASPINI1 LDA # ASPIBUF STA BUFR+1 LDA #36 STA DATALL LDA #0 STA DATALH LDA #$40 STA DATADIR JSR DATAEXC BPL ASPINI12 ASPINI1 CPY #ERRTIMO ; TIMEOUT? BEQ NEXT TYA JSR HEXOUT JSR NEWLINE BPL NEXT ASPINI12 JSR DEVOUT NEXT INC SCDEV LDA SCDEV CMP #7 BCC APINI00 LDX # TSPACE LDA #14 JSR OUTPUT LDA BCOLCRS STA COLCRS LDA BCOLCRS+1 STA COLCRS+1 LDX # TINI LDA #31 JSR OUTPUT LDA # >GOASPI STA CASINI+1 JSR HEXOUT LDA # TID LDA #2 JSR OUTPUT LDA SCDEV JSR BCDOUT LDA #$20 JSR AKOUT LDX # BMAN LDA #24 JSR OUTPUT LDX # TCLASS LDA #2 JSR OUTPUT LDA ASPIBUF AND #$1F ; 00011111 JSR HEXOUT LDA ASPIBUF+1 BPL LP05 LDA #'r .BYTE $2C LP05 LDA #$20 JSR AKOUT LDX # TANSI LDA #2 JSR OUTPUT LDA ASPIBUF+2 AND #$07 ; 00000111 PHA BNE LP06 LDA #$01 ; SCSI1 HAS A 0 HERE LP06 JSR BCDOUT PLA CMP #1 ; SCSI1 WITH CSS BNE LP07 LDA #'c JSR AKOUT LP07 JMP NEWLINE ; RTS ; NEWLINE LDA #$9B BNE AKOUT HEXOUT PHA LSR A LSR A LSR A LSR A JSR BCD001 PLA BCDOUT AND #$0F ; 00001111 BCD001 CMP #$0A ; 00001010 BCC BCD004 ADC #$06 ; 00000110 BCD004 ADC #$30 ; 00110000 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 JSR BFRSELA BMI EXCMDEND INC BUFR2 BNE EXCMD00 INC BUFR2+1 EXCMD00 JSR CMDOUT BMI EXCMDEND JSR SETDPAR JSR DATAEXC LDA DATALL STA DBYTLO LDA DATALH STA DBYTHI EXCMDEND RTS ; DEXC00 JSR SCRESET BMI DEXC99 LDY #ERRDIR DEXC99 RTS ; DEXC80 BIT DATADIR BPL DEXC00 JSR SDDROUT JSR WRHNDSH PTDS00 LDY #$00 LDA DATALH ; STILL WHOLE PAGE BEQ PTDS02 ; NO PTDS01 JSR 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 #$FF ; 11111111 TAY INY JSR PUTBLKS BCS PTDS20 PTDS16 JSR CALCBY PTDS17 BIT SCCTRL BVS PTDS24 ; not busy anymore BMI PTDS17 ; no request LDA SCCTRL AND #$C2 ; 11000010 only status? BEQ PTDS23 ; yes JSR SCRESET ; oh no, more Data, but we can't handle BMI PTDS30 ; was Reset OK? LDY #ERRMODAT ; yeah, then set our errmsg RTS ; PTDS20 TYA CLC ADC BUFR STA BUFR BCC PTDS22 INC BUFR+1 PTDS22 JSR CALCBY PTDS23 JMP STATUS ; PTDS24 LDY #1 PTDS30 RTS ; DATAEXC JSR BSYREQ LDA SCCTRL LSR A AND #$01 ; 00000001 CD? BNE DEXC02 JMP STATUS ; DEXC02 BCS DEXC80 ; WRITE BIT DATADIR BVC DEXC00 JSR SDDRIN JSR RDHNDSH ; JSR SETBUFR ; LDA DAUX1 ; LOOK IF ; STA BUFR2 ; CMD IS READ ; LDA DAUX2 ; STA BUFR2+1 ; LDY #2 ; LDA (BUFR2),Y ; AND #$5F ; 01011111 ; CMP #08 ; 00001000 ; BEQ GTDB00 GTDS00 LDY #0 LDA DATALH ; STILL WHOLE PAGE BEQ GTDS02 ; NO GTDS01 JSR 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 #$FF ; 11111111 TAY INY JSR GETBLKS BCS GTDS20 ; LESS BYTES ? GTDS16 JSR CALCBY GTDS17 BIT SCCTRL BVS GTDS24 BMI GTDS17 LDA SCCTRL AND #$C2 ; 11000010 BEQ GTDS23 JSR SCRESET ; MEHR DATEN BMI GTDS30 LDY #ERRMODAT RTS ; GTDS20 TYA CLC ADC BUFR STA BUFR BCC GTDS22 INC BUFR+1 GTDS22 JSR CALCBY GTDS23 JMP STATUS ; WENIGER BYTES ALS ERWARTET ; GTDS24 LDY #1 GTDS30 RTS ; GTDB00 JSR SETBY LDY #0 LDA DATALH BEQ GTDB02 GTDB01 JSR GETBLK DEC DATALH BNE GTDB01 GTDB02 LDA NILBLO BEQ GTDB08 TAY LDA BUFR SEC SBC NILBLO STA BUFR BCS GTDB04 DEC BUFR+1 GTDB04 JSR GETBLK GTDB08 LDY DATALL BEQ GTDB12 JSR GETNIL GTDB12 LDA NILBHI BEQ GTDB16 GTDB14 JSR GETNIL DEC NILBHI BNE GTDB14 GTDB16 LDA BUFR SEC SBC DBUFLO STA DATALL LDA BUFR+1 SBC DBUFHI STA DATALH RTS ; STATUS JSR RDHNDSH LDY #1 LDA SCSTAT AND #$10 ; 00010000 BNE MSG10 ; MESSAGE LDA SCDATA BEQ MSG00 ; STATUS COMMAND COMPLETE ORA #$C0 ; 11000000 TAY MSG00 BIT SCCTRL BVS MSG04 ; BUS FREE BMI MSG00 ; WAIT FOR REQ LDA SCSTAT AND #$10 ; 00010000 BEQ MSG00 MSG10 LDA SCDATA BEQ MSG04 ; MESSAGE CMD COMPL JSR 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 #$82 ; 10000010 BEQ GTBKS10 ; STATUS INY BNE GETBLKS CLC INC BUFR+1 RTS ; GTBKS05 LDA #0 TAX GTBKS07 BIT SCCTRL 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 #$82 ; 10000010 BEQ PTBKS10 ; STATUS INY BNE PUTBLKS CLC INC BUFR+1 RTS ; PTBKS05 LDA #0 TAX PTBKS07 BIT SCCTRL 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 #$EB ; 11101011 PULSE RDHNDSH STA SCPCR RTS ; WRHNDSH LDA #$E9 ; 11101001 STA SCPCR RTS ; REQACK LDA #$ED ; 11101101 STA SCPCR REQ01 BIT SCCTRL BPL REQ01 ORA #$02 ; 00000010 STA SCPCR RTS ; BSYREQ LDX #0 LDY #$E6 ; 11100110 BSY01 BIT SCCTRL BVC BSY20 BSY04 INX BNE BSY01 BSY09 PLA PLA JMP TIMEOUT ; BSY20 LDA #0 TAX LDY #$E6 ; 230 BSY22 BIT SCCTRL BPL BSY30 CLC ADC #1 BNE BSY22 INX BNE BSY22 INY BNE BSY22 ; NOP ; BRK? *** PLA PLA JMP TIMEOUT ; BSY30 RTS ; CMDOXY STX BUFR2 STY BUFR2+1 CMDOUT LDX #0 LDY #$E0 ; 224 CMDO00 LDA SCCTRL AND #$C2 ; 11000010 BEQ CMDO04 INX BNE CMDO00 INY BNE CMDO00 CMDO04 JSR WRHNDSH LDY #0 LDA (BUFR2),Y TAX SEC ADC BUFR2 STA BUFR2 BCS CMDO05 DEC BUFR2+1 CMDO05 TXA EOR #$FF ; 11111111 TAY INY CMDO08 LDA (BUFR2),Y STA SCDATA ; ;;;;; ; OLD CODE WHEN HANDSH WILL NOT WORK ; LDA #$ED ; 11101101 ; STA SCPCR ; ACK ; ; LDA #0 ;CMDO12 ; INX ;** ; BEQ CMDO20 ; BIT SCCTRL ; BPL CMDO12 ; ; ORA #$02 ; 00000010 ; STA SCPCR INY BEQ CMDEND CMDO16 BIT SCCTRL BVS CMDO30 BMI CMDO16 LDA SCCTRL AND #$02 ; 00000010 BEQ CMDO08 CMDEND LDY #$01 RTS ; ;CMDO20 ; FOR BUG FIXING ONLY ; LDA #1 ;*** ; BRK ;CMDO24 ; LDA #2 ;*** ; BRK ; CMDO30 LDA #0 STA DATALL STA DATALH LDY #ERRBUSFR ; $84 UNEXP BUSFREE STY DSTATS RTS ; BFRSELA LDA #$EF ; 11101111 STA SCPCR LDA #$0C ; 00001100 STA SCDDRC BIT SCCTRL BVS SEL00 JSR SCRESET BPL SEL00 RTS ; SEL00 JSR SDDROUT LDA SCDEV TAX LDA BITMASK,X STA SCDATA LDX #$FB ;11111011 SEL STX SCCTRL LDY #$E0 ; 224 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 #$EF ; 111011111 STA SCPCR JSR SDDRIN LDX #$0D ; 00001101 STX SCDDRC DEX STX SCCTRL LDA #0 STA DATALL STA DATALH LDY #ERRTIMO ; $8A 138 STY DSTATS RTS ; SEL08 LDA #$FF ; 11111111 STA SCCTRL STA SCDATA LDY #1 RTS ; SCRESET LDY #0 LDX #$F7 ; 11110111 STX SCCTRL SCR01 DEX BNE SCR01 DEX STX SCCTRL SCR04 JSR SCR20 DEY BNE SCR04 DEX BNE SCR04 BIT SCCTRL BVS SCR08 LDY #ERRRST ; $8E 142 RTS ; SCR08 LDY #1 SCR20 RTS ; SDDRIN LDA #0 .BYTE $2C SDDROUT LDA #$FF STA SCDDRD RTS ; BITMASK .BYTE $81 ; 10000001 .BYTE $82 ; 10000010 .BYTE $84 ; 10000100 .BYTE $88 ; 10001000 .BYTE $90 ; 10010000 .BYTE $A0 ; 10100000 .BYTE $C0 ; 11000000 .BYTE $80 ; 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 A ASL A 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 .BYTE 6 .BYTE 18,0,0,0 .BYTE 36 .BYTE 0 ; HAINQ RTS ; GDEVTP RTS ; XSCCMD JSR EXECCMD TYA JMP STATRET ; ASCCMD RTS ; RSTSC JSR SCRESET LDA #0 STA DBYTLO STA DBYTHI BEQ OKRET SHAPAR RTS ; GDRVIN RTS ; BACKCLC CLC RTS ; NOATCMD LDY #ERRNOCMD ; $92 146 BNE STATRET OKRET LDY #$01 STATRET STY DSTATS SEC RTS ; ASPI LDA DDEVIC CMP #$70 ; 01110000 BNE BACKCLC LDA DUNIT CMP #1 BNE BACKCLC LDA DCOMND LDY #$FD ; 253 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 .BYTE $00 .WORD HAINQ-1 .BYTE $01 .WORD GDEVTP-1 .BYTE $02 .WORD XSCCMD-1 .BYTE $03 .WORD ASCCMD-1 .BYTE $04 .WORD RSTSC-1 .BYTE $05 .WORD SHAPAR-1 .BYTE $06 .WORD GDRVIN-1 ; ASPICEND = * ASPIBUF = START+$0700 ; ; .BYTE "TENTION !" *** ; .BYTE $9B *** ; .BYTE "THIS WILL ER" *** ; .BYTE "ASE THE WHOL" *** ; .BYTE "E CHIP" *** ; .BYTE $9B *** ; .BYTE "WHEN YOU ARE" *** ; .BYTE " " *** ; *= RUNAD ; .WORD START