;******************************* ; ; Apple][Sd Firmware ; Version 1.2.3 ; Main source ; ; (c) Florian Reitz, 2017 - 2021 ; ; X register usually contains SLOT16 ; Y register is used for counting or SLOT ; ;******************************* .export INIT .import PRODOS .import SMARTPORT .import GETR1 .import GETR3 .import SDCMD .import CARDDET .import INITED .import READ .include "AppleIISd.inc" ;******************************* ; ; Signature bytes ; ; 65535 blocks ; Removable media ; Non-interruptable ; 2 drives ; Read, write and status allowed ; ;******************************* .segment "SLOTID" .byt $0 ; not extended, no SCSI, no RAM .word $0000 ; use status call .byt $97 ; Status bits .byt CMD0 STA CMDHI JSR SDCMD JSR GETR1 ; get response CMP #$01 BNE @ERROR1 ; error! LDA #CMD8 STA CMDHI JSR SDCMD JSR GETR3 ; R7 is also 1+4 bytes CMP #$01 BNE @SDV1 ; may be SD Ver. 1 LDY SLOT ; check for $aa in R33 LDA R33,Y CMP #$AA BNE @ERROR1 ; error! @SDV2: LDA #CMD55 STA CMDHI JSR SDCMD JSR GETR1 LDA #ACMD4140 STA CMDHI JSR SDCMD JSR GETR1 CMP #$01 BEQ @SDV2 ; wait for ready CMP #0 BNE @ERROR1 ; error! ; SD Ver. 2 initialized! 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 ORA #SDHC STA SS,X JMP @END @ERROR1: JMP @IOERROR ; needed for far jump @SDV1: LDA #CMD55 STA CMDHI JSR SDCMD ; ignore response 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 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 CMDHI JSR SDCMD JSR GETR1 CMP #0 BNE @IOERROR ; error! @END: LDA SS,X ORA #CARD_INIT ; initialized STA SS,X LDA CTRL,X ORA #ECE ; enable 7MHz STA CTRL,X CLC ; all ok LDY #NO_ERR BCC @END1 @IOERROR: SEC LDY #ERR_IOERR ; init error @END1: LDA SS,X ; set CS high ORA #SS0 STA SS,X TYA ; retval in A KNOWNRTS: RTS TEXT: .asciiz " Apple][Sd v1.2.2 (c)2021 Florian Reitz" .assert(*-TEXT)=40, error, "TEXT must be 40 bytes long" 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 .byt $00, $00, $FF CMD58: .byt $7A, $00, $00 .byt $00, $00, $FF ACMD4140: .byt $69, $40, $00 .byt $00, $00, $77 ACMD410: .byt $69, $00, $00 .byt $00, $00, $FF