;IDE_NKH.ASM 12/19/00
;Based on IDE38.ASM by Bob Woolley
;
;What started out as just an update for the IDE code has become a general OS
;patch/overlay.  I've added the code to initialize the various extra hardware that
;I have added over the years.  I will probably add my RAM disk code before I am
;through.
;
;NOTE: This patch/overlay assumes you have no use for the International character
;set, located at $CC00-$CFFF.
;
;Load the XL/XE Rev2 ROM (-may- work with other versions, but I can't say for sure)
;at $4000, then load this overlay on top of it.  Burn onto ROM, or load it on the
;SRAM on SmartOS/SmartIDE.
;
; SmartOS/SmartIDE/LCD
;
HIDATA     = $D100
IDE_DATA   = $D150
IDE_ERROR  = $D151
IDE_WRCOMP = $D151
IDE_SCNT   = $D152
IDE_SNUM   = $D153
IDE_CYLL   = $D154
IDE_CYLH   = $D155
IDE_SDH    = $D156
IDE_STATUS = $D157
IDE_CMD    = $D157
IDE_RESET  = $D166
SMARTLATCH = $D180
LCD_CTLPRT = $D1C0
LCD_DATPRT = $D1C1
; POKEY2 aka GUMBY
;
AUDF5    = $D210
AUDC5    = $D211
AUDF6    = $D212
AUDC6    = $D213
AUDF7    = $D214
AUDC7    = $D215
AUDF8    = $D216
AUDC8    = $D217
AUDCTL2  = $D218
STIMER2  = $D219
SKREST2  = $D21A
POTGO2   = $D21B
SEROUT2  = $D21D
IRQEN2   = $D21E
SKCTL2   = $D21F
;
; PIA2
;
PORTA2   = $D310
PORTB2   = $D311
PACTL2   = $D312
PBCTL2   = $D313
;
; VIA
;
VIA_IORB = $D320
VIA_IORA = $D321
VIA_DDRB = $D322
VIA_DDRA = $D323
VIA_T1CL = $D324
VIA_T1CH = $D325
VIA_T1LL = $D326
VIA_T1LH = $D327
VIA_T2CL = $D328
VIA_T2CH = $D329
VIA_SR   = $D32A
VIA_ACR  = $D32B
VIA_PCR  = $D32C
VIA_IFR  = $D32D
VIA_IER  = $D32E
VIA_RANH = $D32F
;
; CPU vectors
;
NMIV     = $FFFA
RESETV   = $FFFC
IRQV     = $FFFE
;
 *=$40E6  ;Nullify attract mode
 NOP
 NOP
;
 *=$431D  ;KILL ROM CHKSUM
 NOP
 NOP
;
 *=$436D  ;Set left margin to 0, instead of 2
 .BYTE $00
;
 *=$4400  ;INIT IDE
 JSR INITCODE+$8000
;
 *=$495B  ;POINT SIO TO IDE
 JSR CHECK_IDE+$8000
;
 *=$4B65  ;IDE CODE
READCMD
 JSR SETREGS+$8000
 BCC READ2
 JMP CMDREJ+$8000
READ2
 LDA #$21
 STA IDE_CMD
 LDY #$00
LP1 LDA IDE_STATUS
 AND #$80
 BNE LP1
RDLP LDA IDE_STATUS
 AND #$08
 BEQ RDLP
 LDA IDE_DATA
 STA ($32),Y
 INY
 CPY $308
 BNE RDLP
ENDRD LDA IDE_DATA
 LDA IDE_STATUS
 AND #$08
 BNE ENDRD
 JMP CLRSTATUS+$8000
;
PUTCMD
 JSR SETREGS+$8000
 BCC PUT2
 JMP CMDREJ+$8000
PUT2
 LDA #$31
 BNE WRITE3
WRTCMD
 JSR SETREGS+$8000
 BCC WRITE2
 JMP CMDREJ+$8000
WRITE2
 LDA #$30
WRITE3
 STA IDE_CMD
 LDY #$00
LP2 LDA IDE_STATUS
 AND #$80
 BNE LP2
WRTLP LDA IDE_STATUS
 AND #$08
 BEQ WRTLP
 LDA ($32),Y
 STA IDE_DATA
 INY
 BNE WRTLP
 JMP CLRSTATUS+$8000
;
CHECK_IDE
 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+$8003,X
 AND #$0F
 CMP $0301
 BEQ IDECODE
 DEX
 DEX
 DEX
 DEX
 BPL SRCH
;
JMPTOSIO
 JMP $E971
;
IDECODE
LPBZY LDA IDE_STATUS
 AND #$80
 BNE LPBZY
;
 LDA $0302
 CMP #'R
 BNE CHK_W
 JMP READCMD+$8000
CHK_W
 CMP #'W
 BEQ WRTCMD
CHK_P
 CMP #'P
 BEQ PUTCMD
CHK_FMT
 CMP #$20
 BEQ FORMATCMD
CHK_FMT1
 CMP #$21
 BEQ FORMATCMD
CHK_FMT2
 CMP #$22
 BEQ FORMATCMD
CHK_STATUS
 CMP #'S
 BEQ STATUSCMD
CHK_GETCFG
 CMP #'N
 BEQ GETCFGCMD
CHK_READ_ID
 CMP #$EC
 BNE CHK_SMALLW
 JMP READID+$8000
CHK_SMALLW ;Lowercase for 512 byte operation
 CMP #'w
 BNE CHK_SMALLP
 JMP WRITELARGE+$8000
CHK_SMALLP ;Lowercase for 512 byte operation
 CMP #'p
 BNE CHK_SMALLR
 JMP PUTLARGE+$8000
CHK_SMALLR ;Lowercase for 512 byte operation
 CMP #'r
 BNE CMDREJ
 JMP READLARGE+$8000
;
CMDREJ
 LDA #$01
 STA $02EA
 LDA #$8B
;
RETURN
 STA $0303
 TAY
 SEC
 RTS
;
FORMATCMD
 LDA $0304
 STA $0032
 LDA $0305
 STA $0033
 LDA #$FF
 LDY #$00
 STA ($32),Y
 INY
 STA ($32),Y
;
STATUSCMD
 LDY #$00
; LDA HDTABL+$8003,X
; AND #$E0
 LDA #$01
 STA $02EA
 STA ($32),Y
 INY
 LDA IDE_ERROR
 EOR #$FF
 STA ($32),Y
 INY
; LDA #$E0
 LDA HDTABL+$8002,X
 STA ($32),Y
 INY
; LDA #$03
 LDA #$00
 STA ($32),Y
 INY
 LDA #$00
 STA $0308
 STA $0309
;
CLRSTATUS
 LDA #$01
 BNE RETURN
;
GETCFGCMD
 JSR SETREGS+$8000
 BCS CMDREJ
 TXA
 PHA
 JSR WRENABLE+$8000
 PLA
 TAX
 LDA HDTABL+$8002,X
 STA DRVCFG+$8002
 JSR RDONLY+$8000
 LDY #$00
GCLP
 LDA DRVCFG+$8000,Y
 STA ($32),Y
 INY
 CPY #$0C
 BNE GCLP
 BEQ CLRSTATUS
;
READID
 JSR SETREGS+$8000
 BCC RDID2
 JMP CMDREJ+$8000
RDID2
 LDA #$EC
 STA IDE_CMD
 LDY #$00
LPID1
 LDA IDE_STATUS
 AND #$80
 BNE LPID1
RDLPID
 LDA IDE_STATUS
 AND #$08
 BEQ RDLPID
 LDA IDE_DATA
 STA ($32),Y
 INY
 LDA HIDATA
 STA ($32),Y
 INY
 CPY #$00
 BNE RDLPID
 INC $33
LPID2
 LDA IDE_STATUS
 AND #$80
 BNE LPID2
RDLPID2
 LDA IDE_STATUS
 AND #$08
 BEQ RDLPID2
 LDA IDE_DATA
 STA ($32),Y
 INY
 LDA HIDATA
 STA ($32),Y
 INY
 CPY #$00
 BNE RDLPID2
ENDRDID
 LDA IDE_DATA
 LDA IDE_STATUS
 AND #$08
 BNE ENDRDID
 DEC $33
 JMP CLRSTATUS+$8000
;
READLARGE
 JSR SETREGS+$8000
 BCC GET2
 JMP CMDREJ+$8000
GET2
 LDA #$21
 STA IDE_CMD
 LDY #$00
GETLP1 LDA IDE_STATUS
 AND #$80
 BNE GETLP1
GETLP LDA IDE_STATUS
 AND #$08
 BEQ GETLP
 LDA IDE_DATA
 STA ($32),Y
 INY
 LDA HIDATA
 STA ($32),Y
 INY
 CPY #$00
 BNE GETLP
 INC $33
GETLP2 LDA IDE_STATUS
 AND #$80
 BNE GETLP2
GETLP3 LDA IDE_STATUS
 AND #$08
 BEQ GETLP3
 LDA IDE_DATA
 STA ($32),Y
 INY
 LDA HIDATA
 STA ($32),Y
 INY
 CPY #$00
 BNE GETLP3
ENDGET LDA IDE_DATA
 LDA IDE_STATUS
 AND #$08
 BNE ENDGET
 JMP CLRSTATUS+$8000
;
PUTLARGE
 JSR SETREGS+$8000
 BCC PUTL2
 JMP CMDREJ+$8000
PUTL2
 LDA #$31
 BNE WL3
WRITELARGE
 JSR SETREGS+$8000
 BCC WL2
 JMP CMDREJ+$8000
WL2
 LDA #$30
WL3
 STA IDE_CMD
 LDY #$00
WLP2 LDA IDE_STATUS
 AND #$80
 BNE WLP2
WRTLP2 LDA IDE_STATUS
 AND #$08
 BEQ WRTLP2
 LDA ($32),Y
 TAX
 INY
 LDA ($32),Y
 INY
 STA HIDATA
 STX IDE_DATA
 CPY #$00
 BNE WRTLP2
 INC $33
WRTLP3 LDA IDE_STATUS
 AND #$08
 BEQ WRTLP3
 LDA ($32),Y
 TAX
 INY
 LDA ($32),Y
 INY
 STA HIDATA
 STX IDE_DATA
 CPY #$00
 BNE WRTLP3
 DEC $33
 JMP CLRSTATUS+$8000
;
SETREGS
 LDA $0304
 STA $0032
 LDA $0305
 STA $0033
 LDA $030A
 AND #$0F
 CLC
 ADC #$01
 STA IDE_SNUM
 LDA $030A
 AND #$F0
 LSR A
 LSR A
 LSR A
 LSR A
 ORA #$A0
 STA IDE_SDH
 LDA $030B
 CMP HDTABL+$8002,X
 BCS SECTERR
 ADC HDTABL+$8001,X
 STA IDE_CYLL
 LDA HDTABL+$8000,X
 ADC #$00
 STA IDE_CYLH
 LDA #$01
 STA IDE_SCNT
 CLC
SECTERR RTS
;
INITCODE
WAITHD LDA #$50
 CMP IDE_STATUS
 BNE WAITHD
;
 LDA #$10
 STA IDE_SCNT
 LDA #$AF
 STA IDE_SDH
 LDA #$91
 STA IDE_CMD
 LDX #$40
WLP DEY
 BNE WLP
 DEX
 BNE WLP
;Initialize 2nd POKEY, 2nd PIA, and VIA
 LDA #$02
 STA SKCTL2
 LDA #$A0
 STA AUDF5
 STA AUDF6
 STA AUDF7
 STA AUDF8
 LDA #$28
 STA AUDCTL2
 LDA #$38
 STA PACTL2
 STA PBCTL2
 LDA #$FF
 STA PORTA2
 STA PORTB2
 STA VIA_DDRA
 STA VIA_DDRB
 STA SEROUT2
 LDA #$3C
 STA PACTL2
 STA PBCTL2
 LDA #$DD
 STA VIA_PCR
 LDA #$00
 STA VIA_ACR
 STA VIA_IER
 STA IRQEN2
;Initialize LCD and display base data on coldstart
 JSR LCD_INIT+$8000
 JSR LCD_BANNER+$8000
 JSR LCD_SHOW_PART_D1+$8000
 JSR LCD_SHOW_PART_D2+$8000
 LDY $D301
 JMP $C66E ;OS @ $C400
;
WRENABLE
 LDA #$A0
 STA SMARTLATCH
 RTS
;
RDONLY
 LDA #$80
 STA SMARTLATCH
 RTS
;
SELNXTHD
 JSR FINDX+$8000
 JSR INCRX+$8000
 JSR LCD_SHOW_PART_D1+$8000
 LDY $D301
 RTS
;
FINDX
 LDX #$0C
NXTPARM LDA HDT1+$8003,X
 AND #$0F
 BNE FOUNDX
 DEX
 DEX
 DEX
 DEX
 BNE NXTPARM
FOUNDX RTS
;
INCRX
 JSR WRENABLE+$8000
 LDA HDT1+$8003,X
 AND #$F0
 STA HDT1+$8003,X
 TXA
 CLC
 ADC #$04
 AND #$0C
 TAX
 LDA HDT1+$8003,X
 ORA #$01
 STA HDT1+$8003,X
 JSR RDONLY+$8000
 RTS
;
PROCD2
 JSR WRENABLE+$8000
 LDA HDP4+$8003
 EOR #$02
 STA HDP4+$8003
 JSR RDONLY+$8000
 JSR LCD_SHOW_PART_D2+$8000
 LDY $D301
 RTS
;
LCD_DELAY
 TXA
 PHA
 LDX #$80
DLAY NOP
 NOP
 NOP
 NOP
 NOP
 DEX
 BNE DLAY
 PLA
 TAX
 RTS
;
LCD_WR_CTRL
 STA LCD_CTLPRT
 JMP LCD_DELAY+$8000
;
LCD_WR_DATA
 STA LCD_DATPRT
 JMP LCD_DELAY+$8000
;
LCD_PRINT_STRING
 STX $1E
 STY $1F
 LDY #$00
LPS1 INC $1E
 BNE LPS2
 INC $1F
LPS2 LDA ($1E),Y
 CMP #$FF
 BEQ LCD_PRINT_DONE
 JSR LCD_WR_DATA+$8000
 JMP LPS1+$8000
LCD_PRINT_DONE 
 RTS
;
LCD_PRINT_INLINE_STRING
 PLA
 TAX
 PLA
 TAY
 JSR LCD_PRINT_STRING+$8000
 LDA $1F
 PHA
 LDA $1E
 PHA
 RTS
;
LCD_INIT
 LDA #$38 ; Set data length, line count, and font
 JSR LCD_WR_CTRL+$8000
 JSR LCD_WR_CTRL+$8000
 JSR LCD_WR_CTRL+$8000
 JSR LCD_WR_CTRL+$8000
 LDA #$06 ; Set cursor mode
 JSR LCD_WR_CTRL+$8000
 LDA #$0C ; Enable display, disable cursor and cursor blink
 JSR LCD_WR_CTRL+$8000
 LDA #$01 ; Clear display
 JSR LCD_WR_CTRL+$8000
 LDA #$80 ; Set cursor position to home position
 JMP LCD_WR_CTRL+$8000
;
LCD_BANNER
 JSR LCD_PRINT_INLINE_STRING+$8000
 .BYTE "  Atari MegaXE  "
 .BYTE $FF
 RTS
;
LCD_SHOW_PART_D1
 LDA #$C0
 JSR LCD_WR_CTRL+$8000
 JSR LCD_PRINT_INLINE_STRING+$8000
 .BYTE "D1:"
 .BYTE $FF
 JSR FINDX+$8000
 TXA
 LSR A
 LSR A
 TAX
 BEQ USE_SIO_D1
 JSR WRENABLE+$8000
 TXA
 ORA #'0
 STA D1_PART+$8000
 JSR LCD_PRINT_INLINE_STRING+$8000
 .BYTE "IDE"
D1_PART
 .BYTE $30
 .BYTE $FF
 JSR RDONLY+$8000
 BNE D1_SHOW_END
USE_SIO_D1
 JSR LCD_PRINT_INLINE_STRING+$8000
 .BYTE "SIO "
 .BYTE $FF
D1_SHOW_END
 LDA #$94
 JSR LCD_WR_CTRL+$8000
 RTS
;
LCD_SHOW_PART_D2
 LDA #$C8
 JSR LCD_WR_CTRL+$8000
 JSR LCD_PRINT_INLINE_STRING+$8000
 .BYTE "D2:"
 .BYTE $FF
 LDA HDP4+3+$8000
 AND #$02
 BEQ USE_SIO_D2
 JSR LCD_PRINT_INLINE_STRING+$8000
 .BYTE "IDE4"
 .BYTE $FF
 JMP D2_SHOW_END+$8000
USE_SIO_D2
 JSR LCD_PRINT_INLINE_STRING+$8000
 .BYTE "SIO "
 .BYTE $FF
D2_SHOW_END
 LDA #$94
 JSR LCD_WR_CTRL+$8000
 RTS
;
; .DC $4FB0-* 0
 *=$4FB0  ;Drive Configuration Table
DRVCFG
 .BYTE $01         ;Tracks per side
 .BYTE $27         ;Code revision
 .BYTE $00         ;Sectors per track M
 .BYTE $00         ;Sectors per track L
 .BYTE $00         ;Sectors per track H
 .BYTE $06         ;Type code - b0=1: 8" disks, b2=1: DD, b3=1: IDE
 .BYTE $01         ;Sector size (high byte)
 .BYTE $00         ;Sector size (low byte)
 .BYTE $FF         ;Unused?
 .BYTE $49,$44,$45 ;"IDE"
HDT1
; *=$4FBC
 .BYTE $00,$00,$00,$00
HDTABL
 .BYTE $00,$00,$FF,$61 ; 1
 .BYTE $01,$00,$FF,$60 ; 2
 .BYTE $02,$00,$FF,$60 ; 3
HDP4 
 .BYTE $03,$00,$FF,$62 ; 4
 .BYTE $04,$00,$FF,$63 ; 5
 .BYTE $05,$00,$FF,$64 ; 6
 .BYTE $06,$00,$FF,$65 ; 7
 .BYTE $07,$00,$FF,$66 ; 8
 .BYTE $08,$00,$FF,$67 ; 9
 .BYTE $09,$00,$FF,$60 ; 10
 .BYTE $0A,$00,$FF,$69 ; 11
 .BYTE $0B,$00,$FF,$6A ; 12
 .BYTE $0C,$00,$FF,$6B ; 13
 .BYTE $0D,$00,$FF,$6C ; 14
 .BYTE $0E,$00,$FF,$6D ; 15
 .BYTE $0F,$00,$FF,$6E ; 16
;
 *=$6C63  ;Lower SIO volume level
 .BYTE $A2
;
 *=$7B0A  ;Set default background color to black
 .BYTE $00
;
 *=$7C34  ;SELECT IDE SEG ^F1
 JSR SELNXTHD+$8000
 JMP $FC6D
;
 *=$7C98  ;COLDSTART
 JMP $E477
;
 *=$7CB5  ;TOGGLE D2 ^F2
 JSR PROCD2+$8000
 .BYTE $EA,$EA,$EA,$EA
 .BYTE $EA,$EA,$EA,$EA
 LDA #$00
;
END