2017-11-30 12:00:06 +00:00
|
|
|
;*******************************
|
|
|
|
;
|
|
|
|
; Apple][Sd Firmware
|
2020-08-12 09:49:53 +00:00
|
|
|
; Version 1.2.2
|
2017-12-17 19:21:30 +00:00
|
|
|
; Main source
|
2017-11-30 12:00:06 +00:00
|
|
|
;
|
2021-02-20 12:59:37 +00:00
|
|
|
; (c) Florian Reitz, 2017 - 2021
|
2017-11-30 12:00:06 +00:00
|
|
|
;
|
|
|
|
; X register usually contains SLOT16
|
|
|
|
; Y register is used for counting or SLOT
|
|
|
|
;
|
|
|
|
;*******************************
|
|
|
|
|
2020-06-04 16:06:07 +00:00
|
|
|
.export INIT
|
|
|
|
|
2018-05-22 19:53:11 +00:00
|
|
|
.import PRODOS
|
2018-05-09 19:39:02 +00:00
|
|
|
.import SMARTPORT
|
2017-12-03 21:18:37 +00:00
|
|
|
.import GETR1
|
|
|
|
.import GETR3
|
2017-12-17 19:39:59 +00:00
|
|
|
.import SDCMD
|
|
|
|
.import CARDDET
|
2020-06-04 16:06:07 +00:00
|
|
|
.import INITED
|
2018-05-22 19:53:11 +00:00
|
|
|
.import READ
|
2017-12-03 21:18:37 +00:00
|
|
|
|
|
|
|
.include "AppleIISd.inc"
|
2017-11-30 12:00:06 +00:00
|
|
|
|
|
|
|
|
2017-12-17 19:39:59 +00:00
|
|
|
;*******************************
|
|
|
|
;
|
|
|
|
; Signature bytes
|
|
|
|
;
|
|
|
|
; 65535 blocks
|
|
|
|
; Removable media
|
|
|
|
; Non-interruptable
|
2018-05-13 15:58:41 +00:00
|
|
|
; 2 drives
|
2017-12-17 19:39:59 +00:00
|
|
|
; Read, write and status allowed
|
|
|
|
;
|
|
|
|
;*******************************
|
|
|
|
|
|
|
|
.segment "SLOTID"
|
2018-05-13 15:58:41 +00:00
|
|
|
.byt $0 ; not extended, no SCSI, no RAM
|
2018-05-23 18:51:44 +00:00
|
|
|
.word $0000 ; use status call
|
2018-05-13 15:58:41 +00:00
|
|
|
.byt $97 ; Status bits
|
2017-12-17 19:39:59 +00:00
|
|
|
.byt <DRIVER ; LSB of driver
|
|
|
|
|
|
|
|
|
|
|
|
;*******************************
|
|
|
|
;
|
|
|
|
; Bootcode
|
|
|
|
;
|
|
|
|
; Is executed on boot or PR#
|
|
|
|
;
|
|
|
|
;*******************************
|
2017-11-30 12:00:06 +00:00
|
|
|
|
|
|
|
.segment "SLOTROM"
|
|
|
|
LDX #$20
|
|
|
|
LDX #$00
|
|
|
|
LDX #$03
|
2018-05-23 18:51:44 +00:00
|
|
|
LDX #$00 ; is Smartport controller
|
2021-02-05 16:40:05 +00:00
|
|
|
;LDX #$3C ; is a disk controller
|
2017-11-30 12:00:06 +00:00
|
|
|
|
2018-05-22 19:53:11 +00:00
|
|
|
SEI ; find slot
|
2020-06-04 14:48:30 +00:00
|
|
|
BIT $CFFF
|
|
|
|
JSR KNOWNRTS
|
2018-05-22 19:53:11 +00:00
|
|
|
TSX
|
|
|
|
LDA $0100,X
|
|
|
|
CLI
|
|
|
|
STA CURSLOT ; $Cs
|
|
|
|
AND #$0F
|
|
|
|
STA SLOT ; $0s
|
|
|
|
ASL A
|
|
|
|
ASL A
|
|
|
|
ASL A
|
|
|
|
ASL A
|
|
|
|
STA SLOT16 ; $s0
|
|
|
|
TAX ; X holds now SLOT16
|
|
|
|
|
2018-05-28 22:36:39 +00:00
|
|
|
LDY #0 ; display copyright message
|
|
|
|
@DRAW: LDA TEXT,Y
|
|
|
|
BEQ @OAPPLE ; check for NULL
|
|
|
|
ORA #$80 ; set MSB
|
|
|
|
STA $0750,Y ; put second to last line
|
|
|
|
INY
|
|
|
|
BPL @DRAW
|
2018-05-22 19:53:11 +00:00
|
|
|
|
2018-05-28 22:36:39 +00:00
|
|
|
LDA #197
|
|
|
|
JSR $FCA8 ; wait for 100 ms
|
2018-05-23 18:51:44 +00:00
|
|
|
|
2017-11-30 15:25:11 +00:00
|
|
|
@OAPPLE: BIT OAPPLE ; check for OA key
|
2018-05-22 19:53:11 +00:00
|
|
|
BPL @INIT ; and skip boot if pressed
|
2017-11-30 15:25:11 +00:00
|
|
|
|
|
|
|
@NEXTSLOT: LDA CURSLOT ; skip boot when no card
|
|
|
|
DEC A
|
2018-05-13 20:46:17 +00:00
|
|
|
STA CMDHI ; use CMDHI/LO as pointer
|
2017-11-30 15:25:11 +00:00
|
|
|
STZ CMDLO
|
|
|
|
JMP (CMDLO)
|
2017-11-30 12:00:06 +00:00
|
|
|
|
2018-05-22 19:53:11 +00:00
|
|
|
@INIT: JSR INIT
|
|
|
|
BNE @NEXTSLOT ; init not successful
|
2017-11-30 12:00:06 +00:00
|
|
|
|
|
|
|
;*******************************
|
|
|
|
;
|
|
|
|
; Boot from SD card
|
|
|
|
;
|
|
|
|
;*******************************
|
|
|
|
|
2018-05-22 19:53:11 +00:00
|
|
|
; load disk blocks 0 and 1 to $800 and $A00
|
|
|
|
@BOOT: LDA #$08 ; load to $800
|
2017-11-30 12:00:06 +00:00
|
|
|
STA BUFFER+1 ; buffer hi
|
|
|
|
STZ BUFFER ; buffer lo
|
2018-05-13 15:58:41 +00:00
|
|
|
STZ BLOCKNUM+1 ; block hi
|
|
|
|
STZ BLOCKNUM ; block lo
|
2021-08-24 18:45:03 +00:00
|
|
|
LDA SLOT16
|
|
|
|
STA DSNUMBER ; set to current slot
|
2018-05-22 19:53:11 +00:00
|
|
|
JSR READ
|
|
|
|
BCS @NEXTSLOT ; load not successful
|
2017-11-30 12:00:06 +00:00
|
|
|
|
|
|
|
LDA #$0A
|
|
|
|
STA BUFFER+1 ; buffer hi
|
|
|
|
STZ BUFFER ; buffer lo
|
2018-05-13 15:58:41 +00:00
|
|
|
STZ BLOCKNUM+1 ; block hi
|
2017-11-30 12:00:06 +00:00
|
|
|
LDA #$01
|
2018-05-13 15:58:41 +00:00
|
|
|
STA BLOCKNUM ; block lo
|
2018-05-22 19:53:11 +00:00
|
|
|
JSR READ
|
|
|
|
BCS @NEXTSLOT ; load not successful
|
2017-11-30 12:00:06 +00:00
|
|
|
JMP $801 ; goto bootloader
|
|
|
|
|
|
|
|
|
|
|
|
;*******************************
|
|
|
|
;
|
|
|
|
; Jump table
|
|
|
|
;
|
|
|
|
;*******************************
|
|
|
|
|
2018-05-13 20:46:17 +00:00
|
|
|
DRIVER: CLC ; ProDOS entry
|
|
|
|
BCC @PRODOS
|
|
|
|
SEC ; Smartport entry
|
2017-11-30 12:00:06 +00:00
|
|
|
|
2018-05-22 19:53:11 +00:00
|
|
|
@PRODOS: PHP ; transfer P to X
|
|
|
|
PLX
|
|
|
|
LDY #PDZPSIZE-1 ; save zeropage area for ProDOS
|
2018-05-13 20:46:17 +00:00
|
|
|
@SAVEZP: LDA PDZPAREA,Y
|
2017-11-30 12:00:06 +00:00
|
|
|
PHA
|
2018-05-13 20:46:17 +00:00
|
|
|
DEY
|
|
|
|
BPL @SAVEZP
|
2018-05-22 19:53:11 +00:00
|
|
|
STX PSAVE ; save X (P)
|
2018-05-13 20:46:17 +00:00
|
|
|
|
2018-05-22 19:53:11 +00:00
|
|
|
; Has this to be done every time this gets called or only on boot???
|
2017-11-30 12:00:06 +00:00
|
|
|
SEI
|
2020-06-04 14:48:30 +00:00
|
|
|
BIT $CFFF
|
|
|
|
JSR KNOWNRTS
|
2017-11-30 12:00:06 +00:00
|
|
|
TSX
|
|
|
|
LDA $0100,X
|
2018-05-22 19:53:11 +00:00
|
|
|
CLI
|
2017-11-30 12:00:06 +00:00
|
|
|
STA CURSLOT ; $Cs
|
|
|
|
AND #$0F
|
|
|
|
STA SLOT ; $0s
|
2018-05-13 15:58:41 +00:00
|
|
|
TAY ; Y holds now SLOT
|
2017-11-30 12:00:06 +00:00
|
|
|
ASL A
|
|
|
|
ASL A
|
|
|
|
ASL A
|
|
|
|
ASL A
|
|
|
|
STA SLOT16 ; $s0
|
|
|
|
TAX ; X holds now SLOT16
|
|
|
|
|
2020-06-04 16:06:07 +00:00
|
|
|
JSR INITED ; check for init
|
|
|
|
BCC @DISP
|
2018-05-13 15:58:41 +00:00
|
|
|
JSR INIT
|
2018-05-13 20:46:17 +00:00
|
|
|
BCS @END ; Init failed
|
2017-11-30 12:00:06 +00:00
|
|
|
|
2018-05-22 19:53:11 +00:00
|
|
|
@DISP: LDA PSAVE ; get saved P value
|
|
|
|
PHA ; and transfer to P
|
|
|
|
PLP
|
2018-05-13 20:46:17 +00:00
|
|
|
BCS @SMARTPORT ; Smartport dispatcher
|
|
|
|
JSR PRODOS ; ProDOS dispatcher
|
2017-11-30 12:00:06 +00:00
|
|
|
|
2018-05-13 20:46:17 +00:00
|
|
|
@END: PHX
|
|
|
|
LDX SLOT ; X holds $0s
|
|
|
|
STA R30,X ; save A
|
2017-11-30 12:00:06 +00:00
|
|
|
PLA
|
2018-05-13 20:46:17 +00:00
|
|
|
STA R31,X ; save X
|
|
|
|
TYA
|
|
|
|
STA R32,X ; save Y
|
|
|
|
PHP
|
2017-11-30 12:00:06 +00:00
|
|
|
PLA
|
2018-05-13 20:46:17 +00:00
|
|
|
STA R33,X ; save P
|
|
|
|
|
|
|
|
LDY #0
|
|
|
|
@RESTZP: PLA ; restore zeropage area
|
|
|
|
STA PDZPAREA,Y
|
|
|
|
INY
|
2018-05-22 19:53:11 +00:00
|
|
|
CPY #PDZPSIZE
|
2018-05-13 20:46:17 +00:00
|
|
|
BCC @RESTZP
|
|
|
|
|
|
|
|
LDA R33,X ; get retval
|
|
|
|
PHA
|
|
|
|
LDA R32,X
|
|
|
|
PHA
|
|
|
|
LDA R31,X
|
|
|
|
PHA
|
|
|
|
LDA R30,X ; restore A
|
|
|
|
PLX ; restore X
|
|
|
|
PLY ; restore Y
|
|
|
|
PLP ; restore P
|
2017-11-30 12:00:06 +00:00
|
|
|
RTS
|
|
|
|
|
2018-05-13 20:46:17 +00:00
|
|
|
@SMARTPORT: CLC
|
|
|
|
JSR SMARTPORT
|
|
|
|
BRA @END
|
2018-05-09 19:39:02 +00:00
|
|
|
|
2017-11-30 12:00:06 +00:00
|
|
|
|
|
|
|
;*******************************
|
|
|
|
;
|
|
|
|
; Initialize SD card
|
|
|
|
;
|
|
|
|
; C Clear - No error
|
|
|
|
; Set - Error
|
|
|
|
; A $00 - No error
|
|
|
|
; $27 - I/O error - Init failed
|
|
|
|
; $2F - No card inserted
|
|
|
|
;
|
|
|
|
;*******************************
|
|
|
|
|
|
|
|
.segment "EXTROM"
|
2020-08-12 09:49:53 +00:00
|
|
|
INIT: STZ CTRL,X ; reset SPI controller
|
|
|
|
LDA #SS0 ; set CS high
|
2017-11-30 12:00:06 +00:00
|
|
|
STA SS,X
|
|
|
|
LDY #10
|
|
|
|
|
2021-08-24 17:44:49 +00:00
|
|
|
@LOOP: LDA #DUMMY
|
|
|
|
STA DATA,X
|
|
|
|
@WAIT: LDA CTRL,X ; wait for TC (bit 7) to get high
|
2017-11-30 12:00:06 +00:00
|
|
|
BPL @WAIT
|
|
|
|
DEY
|
|
|
|
BNE @LOOP ; do 10 times
|
|
|
|
LDA SS,X
|
|
|
|
AND #<~SS0 ; set CS low
|
|
|
|
STA SS,X
|
|
|
|
|
|
|
|
LDA #<CMD0 ; send CMD0
|
|
|
|
STA CMDLO
|
|
|
|
LDA #>CMD0
|
|
|
|
STA CMDHI
|
|
|
|
JSR SDCMD
|
|
|
|
JSR GETR1 ; get response
|
|
|
|
CMP #$01
|
|
|
|
BNE @ERROR1 ; error!
|
|
|
|
|
|
|
|
LDA #<CMD8 ; send CMD8
|
|
|
|
STA CMDLO
|
|
|
|
LDA #>CMD8
|
|
|
|
STA CMDHI
|
|
|
|
JSR SDCMD
|
2017-12-17 19:21:30 +00:00
|
|
|
JSR GETR3 ; R7 is also 1+4 bytes
|
2017-11-30 12:00:06 +00:00
|
|
|
CMP #$01
|
|
|
|
BNE @SDV1 ; may be SD Ver. 1
|
|
|
|
|
2017-12-17 19:21:30 +00:00
|
|
|
LDY SLOT ; check for $aa in R33
|
|
|
|
LDA R33,Y
|
|
|
|
CMP #$AA
|
|
|
|
BNE @ERROR1 ; error!
|
|
|
|
|
2017-11-30 12:00:06 +00:00
|
|
|
@SDV2: LDA #<CMD55
|
|
|
|
STA CMDLO
|
|
|
|
LDA #>CMD55
|
|
|
|
STA CMDHI
|
|
|
|
JSR SDCMD
|
|
|
|
JSR GETR1
|
2017-12-17 19:21:30 +00:00
|
|
|
LDA #<ACMD4140 ; enable SDHC support
|
2017-11-30 12:00:06 +00:00
|
|
|
STA CMDLO
|
|
|
|
LDA #>ACMD4140
|
|
|
|
STA CMDHI
|
|
|
|
JSR SDCMD
|
|
|
|
JSR GETR1
|
|
|
|
CMP #$01
|
|
|
|
BEQ @SDV2 ; wait for ready
|
|
|
|
CMP #0
|
|
|
|
BNE @ERROR1 ; error!
|
2017-12-17 19:21:30 +00:00
|
|
|
|
2017-11-30 12:00:06 +00:00
|
|
|
; SD Ver. 2 initialized!
|
2017-12-17 19:21:30 +00:00
|
|
|
LDA #<CMD58 ; check for SDHC
|
|
|
|
STA CMDLO
|
|
|
|
LDA #>CMD58
|
|
|
|
STA CMDHI
|
|
|
|
JSR SDCMD
|
|
|
|
JSR GETR3
|
|
|
|
CMP #0
|
|
|
|
BNE @ERROR1 ; error!
|
|
|
|
LDY SLOT
|
|
|
|
LDA R30,Y
|
|
|
|
AND #$40 ; check CCS
|
|
|
|
BEQ @BLOCKSZ
|
|
|
|
|
|
|
|
LDA SS,X ; card is SDHC
|
2017-11-30 12:00:06 +00:00
|
|
|
ORA #SDHC
|
|
|
|
STA SS,X
|
2017-12-17 19:21:30 +00:00
|
|
|
JMP @END
|
2017-11-30 12:00:06 +00:00
|
|
|
|
|
|
|
@ERROR1: JMP @IOERROR ; needed for far jump
|
|
|
|
|
|
|
|
@SDV1: LDA #<CMD55
|
|
|
|
STA CMDLO
|
|
|
|
LDA #>CMD55
|
|
|
|
STA CMDHI
|
|
|
|
JSR SDCMD ; ignore response
|
|
|
|
LDA #<ACMD410
|
|
|
|
STA CMDLO
|
|
|
|
LDA #>ACMD410
|
|
|
|
STA CMDHI
|
|
|
|
JSR SDCMD
|
|
|
|
JSR GETR1
|
|
|
|
CMP #$01
|
|
|
|
BEQ @SDV1 ; wait for ready
|
|
|
|
CMP #0
|
|
|
|
BNE @MMC ; may be MMC card
|
|
|
|
; SD Ver. 1 initialized!
|
|
|
|
JMP @BLOCKSZ
|
|
|
|
|
|
|
|
@MMC: LDA #<CMD1
|
|
|
|
STA CMDLO
|
|
|
|
LDA #>CMD1
|
|
|
|
STA CMDHI
|
|
|
|
@LOOP1: JSR SDCMD
|
|
|
|
JSR GETR1
|
|
|
|
CMP #$01
|
|
|
|
BEQ @LOOP1 ; wait for ready
|
|
|
|
CMP #0
|
|
|
|
BNE @IOERROR ; error!
|
|
|
|
; MMC Ver. 3 initialized!
|
|
|
|
|
|
|
|
@BLOCKSZ: LDA #<CMD16
|
|
|
|
STA CMDLO
|
|
|
|
LDA #>CMD16
|
|
|
|
STA CMDHI
|
|
|
|
JSR SDCMD
|
|
|
|
JSR GETR1
|
|
|
|
CMP #0
|
|
|
|
BNE @IOERROR ; error!
|
|
|
|
|
|
|
|
@END: LDA SS,X
|
2020-06-04 16:06:07 +00:00
|
|
|
ORA #CARD_INIT ; initialized
|
2017-11-30 12:00:06 +00:00
|
|
|
STA SS,X
|
|
|
|
LDA CTRL,X
|
|
|
|
ORA #ECE ; enable 7MHz
|
|
|
|
STA CTRL,X
|
|
|
|
CLC ; all ok
|
2018-05-22 19:53:11 +00:00
|
|
|
LDY #NO_ERR
|
2017-11-30 12:00:06 +00:00
|
|
|
BCC @END1
|
|
|
|
|
|
|
|
@IOERROR: SEC
|
2018-05-22 19:53:11 +00:00
|
|
|
LDY #ERR_IOERR ; init error
|
2017-11-30 12:00:06 +00:00
|
|
|
@END1: LDA SS,X ; set CS high
|
|
|
|
ORA #SS0
|
|
|
|
STA SS,X
|
|
|
|
TYA ; retval in A
|
2020-06-04 14:48:30 +00:00
|
|
|
KNOWNRTS: RTS
|
2017-11-30 12:00:06 +00:00
|
|
|
|
|
|
|
|
2021-02-20 12:59:37 +00:00
|
|
|
TEXT: .asciiz " Apple][Sd v1.2.2 (c)2021 Florian Reitz"
|
2020-08-12 09:49:53 +00:00
|
|
|
.assert(*-TEXT)=40, error, "TEXT must be 40 bytes long"
|
|
|
|
|
2017-11-30 12:00:06 +00:00
|
|
|
|
|
|
|
CMD0: .byt $40, $00, $00
|
|
|
|
.byt $00, $00, $95
|
|
|
|
CMD1: .byt $41, $00, $00
|
|
|
|
.byt $00, $00, $F9
|
|
|
|
CMD8: .byt $48, $00, $00
|
|
|
|
.byt $01, $AA, $87
|
|
|
|
CMD16: .byt $50, $00, $00
|
|
|
|
.byt $02, $00, $FF
|
|
|
|
CMD55: .byt $77, $00, $00
|
2017-12-17 19:21:30 +00:00
|
|
|
.byt $00, $00, $FF
|
|
|
|
CMD58: .byt $7A, $00, $00
|
|
|
|
.byt $00, $00, $FF
|
2017-11-30 12:00:06 +00:00
|
|
|
ACMD4140: .byt $69, $40, $00
|
|
|
|
.byt $00, $00, $77
|
|
|
|
ACMD410: .byt $69, $00, $00
|
|
|
|
.byt $00, $00, $FF
|