;IDE_NKH.ASM 12/09/00
;Based on IDE38.ASM by Bob Woolley
;
 *=$C95B  POINT SIO TO IDE
 JSR $D600
;
 *=$FC98  COLDSTART
 JMP $E477
;
 *=$FC34  SELECT IDE SEG ^F1
 JSR SELNXTHD
 JMP $FC6D
;
 *=$FCB5  TOGGLE D2 ^F2
 JSR PROCD2
 .BYTE $EA,$EA,$EA,$EA
 .BYTE $EA,$EA,$EA,$EA
 LDA #$00
;
 *=$C31D  KILL ROM CHKSUM
 NOP
 NOP
;
 *=$C400  INIT IDE
 JSR INITCODE
;
 *=$D600  IDE CODE
 LDA $D01F CHK FOR SELECT KEY
 AND #$02
 BEQ JMPTOSIO IF DOWN, DO SIO
 LDA $0300
 CMP #$31
 BNE JMPTOSIO
 LDX #$3C
;
SRCH
 LDA HDTABL+3,X
 AND #$0F
 CMP $0301
 BEQ IDECODE
 DEX
 DEX
 DEX
 DEX
 BPL SRCH
;
JMPTOSIO
 JMP $E971
;
IDECODE
LPBZY LDA $D157
 AND #$80
 BNE LPBZY
;
 LDA $0302
 CMP #$53
 BEQ STATUSCMD
 CMP #$21
 BEQ FORMATCMD
 CMP #$22
 BEQ FORMATCMD
 CMP #$52
 BEQ READCMD
 CMP #$57
 BEQ WRTCMD
 CMP #$50
 BEQ WRTCMD
 CMP #$4E
 BNE CMDREJ
 JMP GETCFGCMD
;
CMDREJ
 LDA #$01
 STA $02EA
 LDA #$8B
;
RETURN
 STA $0303
 TAY
 SEC
 RTS
;
STATUSCMD
 LDA HDTABL+3,X
 AND #$F0
 STA $02EA
 STA $0308
 STA $0309
;
CLRSTATUS
 LDA #$01
 BNE RETURN
;
FORMATCMD
 LDA $0304
 STA $0032
 LDA $0305
 STA $0033
 LDA #$FF
 LDY #$00
 STA ($32),Y
 INY
 STA ($32),Y
 BNE STATUSCMD
;
READCMD
 JSR SETREGS
 BCS CMDREJ
 LDA #$20
 STA $D157
 LDY #$00
LP1 LDA $D157
 AND #$80
 BNE LP1
RDLP LDA $D157
 AND #$08
 BEQ RDLP
 LDA $D150
 STA ($32),Y
 INY
 CPY $308
 BNE RDLP
ENDRD LDA $D150
 LDA $D157
 AND #$08
 BNE ENDRD
 BEQ CLRSTATUS
;
WRTCMD
 JSR SETREGS
 BCS CMDREJ
 LDA #$30
 STA $D157
 LDY #$00
LP2 LDA $D157
 AND #$80
 BNE LP2
WRTLP LDA $D157
 AND #$08
 BEQ WRTLP
 LDA ($32),Y
 STA $D150
 INY
 BNE WRTLP
 BEQ CLRSTATUS
;
GETCFGCMD
 JSR SETREGS
 BCC GCOK
 JMP CMDREJ
GCOK LDA #$A0
 STA $D180
 LDA HDTABL+2,X
 STA DRVCFG+2
 LDY #$00
GCLP LDA DRVCFG,Y
 STA ($32),Y
 INY
 CPY #$0C
 BNE GCLP
 LDA #$80
 STA $D180
 JMP CLRSTATUS
;
SETREGS
 LDA $0304
 STA $0032
 LDA $0305
 STA $0033
 LDA $030A
 AND #$0F
 CLC
 ADC #$01
 STA $D153
 LDA $030A
 AND #$F0
 LSR A
 LSR A
 LSR A
 LSR A
 ORA #$A0
 STA $D156
 LDA $030B
 CMP HDTABL+2,X
 BCS SECTERR
 ADC HDTABL+1,X
 STA $D154
 LDA HDTABL,X
 ADC #$00
 STA $D155
 LDA #$01
 STA $D152
 CLC
SECTERR RTS
;
INITCODE
WAITHD LDA #$50
 CMP $D157
 BNE WAITHD
;
 LDA #$10
 STA $D152
 LDA #$AF
 STA $D156
 LDA #$91
 STA $D157
 LDX #$40
WLP DEY
 BNE WLP
 DEX
 BNE WLP
 JSR FINDX
 NOP ;
 NOP ; give indication of D1: pointer (SIO or IDE partition)
 NOP ;
 JMP $C66E ;OS @ $C400
;
SELNXTHD
 JSR FINDX
 JSR INCRX
 NOP ;
 NOP ; give indication of D1: pointer (SIO or IDE partition)
 NOP ;
 TAY
 RTS
;
FINDX
 LDX #$0C
NXTPARM LDA HDT1+3,X
 AND #$0F
 BNE FOUNDX
 DEX
 DEX
 DEX
 DEX
 BNE NXTPARM
FOUNDX RTS
;
INCRX
 LDA #$A0
 STA $D180
 LDA HDT1+3,X
 AND #$F0
 STA HDT1+3,X
 TXA
 CLC
 ADC #$04
 AND #$0C
 TAX
 LDA HDT1+3,X
 ORA #$01
 STA HDT1+3,X
 LDA #$80
 STA $D180
 RTS
;
PROCD2
 LDA #$A0
 STA $D180
 LDA HDP4+3
 EOR #$02
 STA HDP4+3
 LDA #$80
 STA $D180
 LDY $D301
 RTS
;
 *=$CBB0  Drive Configuration Table (located in unused region of XL/XE OS ROM)
DRVCFG
 .BYTE $01         ;Tracks per side
 .BYTE $01         ;Step rate
 .WORD $0000       ;Sectors per track
 .BYTE $00         ;Side code - 0: single, 1: double
 .BYTE $04         ;Type code - b0=1: 8" disks, b2=1: DD
 .BYTE $01         ;Sector size (high byte)
 .BYTE $00         ;Sector size (low byte)
 .BYTE $43         ;Translation control
  ; b7=1: 40 track disk I/O on an 80 track drive
  ; b6=1: drive present (always 1)
  ; b1=1: handle sectors 1,2,3 as full size
  ; b0=1: sector #'s start with 0, not 1
 .BYTE $00,$00,$00 ;Spare
HDT1
 *=$CBBC Relocated to unused region in XL/XE Rev2 OS ROM
 .BYTE $00,$00,$00,$00
;
; Partition table
;
HDTABL
 .BYTE $00,$00,$00,$60 ; 1
 .BYTE $00,$00,$00,$60 ; 2
 .BYTE $00,$00,$00,$60 ; 3
HDP4 
 .BYTE $00,$00,$00,$60 ; 4
 .BYTE $00,$00,$00,$60 ; 5
 .BYTE $00,$00,$00,$60 ; 6
 .BYTE $00,$00,$00,$60 ; 7
 .BYTE $00,$00,$00,$60 ; 8
 .BYTE $00,$00,$00,$60 ; 9
 .BYTE $00,$00,$00,$60 ; 10
 .BYTE $00,$00,$00,$60 ; 11
 .BYTE $00,$00,$00,$60 ; 12
 .BYTE $00,$00,$00,$60 ; 13
 .BYTE $00,$00,$00,$60 ; 14
 .BYTE $00,$00,$00,$60 ; 15
 .BYTE $00,$00,$00,$60 ; 16
END
