;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