7MHz clock used, read/write improved

reverted to Merlin-8
This commit is contained in:
Florian Reitz 2017-08-27 00:37:54 +02:00
parent 6e37a8c482
commit f3751b90fb
6 changed files with 904 additions and 815 deletions

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
******************************** ********************************
* *
* Apple][Sd Firmware * Apple][Sd Firmware
* Version 0.5 * Version 0.6
* *
* (c) Florian Reitz, 2017 * (c) Florian Reitz, 2017
* *
@ -44,14 +44,10 @@ INITED = $0678
SSNONE = $0F SSNONE = $0F
SS0 = $0E SS0 = $0E
DUMMY = $FF DUMMY = $FF
FRXEN = $17
FRXDIS = $07
********************************
*
* Install SD card driver
*
********************************
* signature bytes * signature bytes
LDX #$20 LDX #$20
@ -72,9 +68,10 @@ DUMMY = $FF
JSR $FF58 JSR $FF58
TSX TSX
LDA $0100,X LDA $0100,X
STA CURSLOT ; $Cs
AND #$0F AND #$0F
STA SLOT ; $0s STA SLOT ; $0s
ORA #$C0
STA CURSLOT ; $Cs
ASL A ASL A
ASL A ASL A
ASL A ASL A
@ -86,34 +83,41 @@ DUMMY = $FF
BIT $CFFF BIT $CFFF
JSR INIT JSR INIT
DO DEBUG
* *
* TODO: check for init error * TODO: check for init error
* *
********************************
*
* Install SD card driver
*
********************************
DO DEBUG
* see if slot has a driver already * see if slot has a driver already
LDX $BF31 ; get devcnt LDX $BF31 ; get devcnt
INSLP LDA $BF32,X ; get a devnum INSTALL LDA $BF32,X ; get a devnum
AND #$70 ; isolate slot AND #$70 ; isolate slot
CMP SLOT16 ; slot? CMP SLOT16 ; slot?
BEQ INSOUT ; yes, skip it BEQ :INSOUT ; yes, skip it
DEX DEX
BPL INSLP ; keep up the search BPL INSTALL ; keep up the search
* restore the devnum to the list * restore the devnum to the list
LDX $BF31 ; get devcnt again LDX $BF31 ; get devcnt again
CPX #$0D ; device table full? CPX #$0D ; device table full?
BNE INSLP2 BNE :INST2
JSR $FF3A ; bell JSR $FF3A ; bell
JMP INSOUT ; do something! JMP :INSOUT ; do something!
INSLP2 LDA $BF32-1,X ; move all entries down :INST2 LDA $BF32-1,X ; move all entries down
STA $BF32,X ; to make room at front STA $BF32,X ; to make room at front
DEX ; for a new entry DEX ; for a new entry
BNE INSLP2 BNE :INST2
LDA #$04 ; ProFile type device LDA #$04 ; ProFile type device
ORA SLOT16 ORA SLOT16
STA $BF32 ; slot, drive 1 at top of list STA $BF32 ; slot, drive 1 at top of list
@ -128,9 +132,16 @@ INSLP2 LDA $BF32-1,X ; move all entries down
STA $BF10,X ; write to driver table STA $BF10,X ; write to driver table
LDA #>DRIVER LDA #>DRIVER
STA $BF11,X STA $BF11,X
:INSOUT RTS
INSOUT RTS
FIN ********************************
*
* Boot from SD card
*
********************************
ELSE
BOOT LDA #$01 BOOT LDA #$01
STA $42 ; load command STA $42 ; load command
@ -146,6 +157,8 @@ BOOT LDA #$01
JSR READ ; call driver JSR READ ; call driver
JMP $801 ; goto bootloader JMP $801 ; goto bootloader
FIN
******************************** ********************************
* *
@ -165,9 +178,10 @@ DRIVER CLD
JSR $FF58 ; find slot nr JSR $FF58 ; find slot nr
TSX TSX
LDA $0100,X LDA $0100,X
STA CURSLOT ; $Cs
AND #$0F AND #$0F
STA SLOT ; $0s STA SLOT ; $0s
ORA #$C0
STA CURSLOT ; $Cs
ASL A ASL A
ASL A ASL A
ASL A ASL A
@ -201,10 +215,11 @@ DRIVER CLD
:INIT JSR INIT :INIT JSR INIT
BRA :CMD BRA :CMD
* Signature bytes * Signature bytes
DS \ ; fill with zeroes DS \ ; fill with zeroes
ORG *-4 ; locate to $C8FC DS -4 ; locate to $xxFC
DW $FFFF ; 65535 blocks DW $FFFF ; 65535 blocks
DB $47 ; Status bits DB $47 ; Status bits
DB #<DRIVER ; LSB of driver DB #<DRIVER ; LSB of driver
@ -320,10 +335,10 @@ INIT CLD
CMP #$00 CMP #$00
BNE :IOERROR ; error! BNE :IOERROR ; error!
:END LDY SLOT ; all ok :END LDY SLOT
LDA #$01 LDA #$01
STA INITED,Y ; initialized STA INITED,Y ; initialized
CLC CLC ; all ok
LDY #0 LDY #0
BCC :END1 BCC :END1
:CDERROR SEC :CDERROR SEC
@ -333,6 +348,8 @@ INIT CLD
LDY #$27 ; init error LDY #$27 ; init error
:END1 LDA #SSNONE ; deselect card :END1 LDA #SSNONE ; deselect card
STA SS,X STA SS,X
LDA #7 ; enable 7MHz
STA CTRL,X
LDA #0 ; set div to 2 LDA #0 ; set div to 2
STA DIV,X STA DIV,X
TYA ; retval in A TYA ; retval in A
@ -457,28 +474,16 @@ BLOCK PHX ; save X
COMMAND PHY ; save Y COMMAND PHY ; save Y
LDY SLOT LDY SLOT
STA DATA,X ; send command STA DATA,X ; send command
:WAIT BIT CTRL,X LDA R30,Y ; get arg from R30 on
BPL :WAIT
:ARG LDA R30,Y ; get arg from R30 on
STA DATA,X STA DATA,X
:WAIT1 BIT CTRL,X
BPL :WAIT1
LDA R31,Y LDA R31,Y
STA DATA,X STA DATA,X
:WAIT11 BIT CTRL,X
BPL :WAIT11
LDA R32,Y LDA R32,Y
STA DATA,X STA DATA,X
:WAIT12 BIT CTRL,X
BPL :WAIT12
LDA R33,Y LDA R33,Y
STA DATA,X STA DATA,X
:WAIT13 BIT CTRL,X
BPL :WAIT13
LDA #DUMMY LDA #DUMMY
STA DATA,X ; dummy crc STA DATA,X ; dummy crc
:WAIT2 BIT CTRL,X
BPL :WAIT2
JSR GETR1 JSR GETR1
PLY ; restore Y PLY ; restore Y
RTS RTS
@ -535,24 +540,22 @@ READ JSR BLOCK ; calc block address
LDA #$51 ; send CMD17 LDA #$51 ; send CMD17
JSR COMMAND ; send command JSR COMMAND ; send command
CMP #0 ; check for error
BNE :ERROR
:GETTOK LDA #DUMMY ; get data token :GETTOK LDA #DUMMY ; get data token
STA DATA,X STA DATA,X
:WAIT BIT CTRL,X
BPL :WAIT
LDA DATA,X ; get response LDA DATA,X ; get response
*
* TODO: check for error!
*
CMP #$FE CMP #$FE
BNE :GETTOK ; wait for $FE BNE :GETTOK ; wait for $FE
LDY #2 ; read data from card LDY #2 ; read data from card
:LOOPY STZ WORK LDA #FRXEN ; enable FRX
:LOOPW LDA #DUMMY STA CTRL,X
LDA #DUMMY
STA DATA,X STA DATA,X
:WAIT1 BIT CTRL,X :LOOPY STZ WORK
BPL :WAIT1 :LOOPW LDA DATA,X
LDA DATA,X
STA ($44) STA ($44)
INC $44 INC $44
BNE :INW BNE :INW
@ -562,13 +565,11 @@ READ JSR BLOCK ; calc block address
DEY DEY
BNE :LOOPY BNE :LOOPY
LDY #2 LDA #FRXDIS ; disable FRX
:CRC LDA #DUMMY ; read 2 bytes crc STA CTRL,X
STA DATA,X ; and ignore
:WAIT2 BIT CTRL,X :CRC LDA #DUMMY ; first crc byte has
BPL :WAIT2 STA DATA,X ; already been read
DEY
BNE :CRC
LDA #SSNONE LDA #SSNONE
STA SS,X ; disable /CS STA SS,X ; disable /CS
@ -576,6 +577,12 @@ READ JSR BLOCK ; calc block address
LDA #$00 LDA #$00
RTS RTS
:ERROR LDA #SSNONE
STA SS,X ; disable /CS
SEC ; an error occured
LDA #$27
RTS
******************************** ********************************
* *
@ -602,21 +609,18 @@ WRITE JSR BLOCK ; calc block address
LDA #$58 ; send CMD24 LDA #$58 ; send CMD24
JSR COMMAND ; send command JSR COMMAND ; send command
CMP #0 ; check for error
BNE :ERROR
LDA #DUMMY LDA #DUMMY
STA DATA,X ; send dummy STA DATA,X ; send dummy
:WAIT1 BIT CTRL,X
BPL :WAIT1
LDA #$FE LDA #$FE
STA DATA,X ; send data token STA DATA,X ; send data token
:WAIT2 BIT CTRL,X
BPL :WAIT2
LDY #2 ; send data to card LDY #2 ; send data to card
:LOOPY STZ WORK :LOOPY STZ WORK
:LOOPW LDA ($44) :LOOPW LDA ($44)
STA DATA,X STA DATA,X
:WAIT3 BIT CTRL,X
BPL :WAIT3
INC $44 INC $44
BNE :INW BNE :INW
INC $45 ; inc msb on page boundary INC $45 ; inc msb on page boundary
@ -625,27 +629,18 @@ WRITE JSR BLOCK ; calc block address
DEY DEY
BNE :LOOPY BNE :LOOPY
LDY #2 ; send 2 dummy crc bytes :CRC STA DATA,X ; send 2 dummy crc bytes
:CRC STA DATA,X
:WAIT4 BIT CTRL,X
BPL :WAIT4
DEY
BNE :CRC
LDA #DUMMY ; get data response
STA DATA,X STA DATA,X
:WAIT5 BIT CTRL,X
BPL :WAIT5 STA DATA,X ; get data response
LDA DATA,X LDA DATA,X
AND #$1F AND #$1F
CMP #$05 CMP #$05
BNE :ERROR ; check for write error BNE :ERROR ; check for write error
:WAIT6 LDA #DUMMY ; wait for write cycle :WAIT6 LDA #DUMMY
STA DATA,X ; to complete STA DATA,X ; wait for write cycle
:WAIT61 BIT CTRL,X LDA DATA,X ; to complete
BPL :WAIT61
LDA DATA,X
CMP #$00 CMP #$00
BEQ :WAIT6 BEQ :WAIT6
@ -655,14 +650,12 @@ WRITE JSR BLOCK ; calc block address
LDA #0 LDA #0
RTS RTS
:ERROR :ERROR LDA #DUMMY
:WAIT7 LDA #DUMMY ; wait for write cycle STA DATA,X ; wait for write cycle
STA DATA,X ; to complete LDA DATA,X ; to complete
:WAIT71 BIT CTRL,X
BPL :WAIT71
LDA DATA,X
CMP #$00 CMP #$00
BEQ :WAIT7 BEQ :ERROR
LDA #SSNONE LDA #SSNONE
STA SS,X ; disable /CS STA SS,X ; disable /CS
SEC ; an error occured SEC ; an error occured
@ -696,3 +689,4 @@ ACMD4140 HEX 694000
HEX 000077 HEX 000077
ACMD410 HEX 690000 ACMD410 HEX 690000
HEX 0000FF HEX 0000FF

View File

@ -1,63 +1,60 @@
S00600004844521B S00600004844521B
S1130000A220A000A203863C2058FFBABD00018DA7 S1130000A220A000A203863C2058FFBABD0001290B
S1130010F807290F853D0A0A0A0A852BAA2CFFCF67 S11300100F853D09C08DF8070A0A0A0A852BAA2C08
S11300202000C9A9018542A52BAA85436444A908D7 S1130020FFCF2000C9A9018542A52BAA85436444BA
S11300308545644664472CFFCF20B7CA4C0108D8D5 S1130030A9088545644664472CFFCF209ECA4C011D
S11300402058FFBABD00018DF807290F853D0A0A23 S113004008D82058FFBABD0001290F853D09C08D8D
S11300500A0A852BAA2CFFCFA43DB97806C90190C2 S1130050F8070A0A0A0A852BAA2CFFCFA43DB9780F
S113006022A542C900F010C901F00FC902F00EC95F S113006006C9019022A542C900F010C901F00FC9C8
S113007003F00D38A901604CAFCA4CB7CA4C0DCB84 S113007002F00EC903F00D38A901604C96CA4C9EDB
S11300804C9DCB2000C980D9000000000000000076 S1130080CA4CF7CA4C64CB2000C980D900000000D8
S1130090000000000000000000000000000000005C S1130090000000000000000000000000000000005C
S11300A0000000000000000000000000000000004C S11300A0000000000000000000000000000000004C
S11300B0000000000000000000000000000000003C S11300B0000000000000000000000000000000003C
S11300C0000000000000000000000000000000002C S11300C0000000000000000000000000000000002C
S11300D0000000000000000000000000000000001C S11300D0000000000000000000000000000000001C
S11300E0000000000000000000000000000000000C S11300E0000000000000000000000000000000000C
S11300F0000000000000000000000000FFFF473F78 S11300F0000000000000000000000000FFFF474176
S1130100D8A9039D81C0A90F9D83C0A9079D82C062 S1130100D8A9039D81C0A90F9D83C0A9079D82C062
S1130110A00AA9FF9D80C03C81C010FB88D0F5A92E S1130110A00AA9FF9D80C03C81C010FB88D0F5A92E
S11301200E9D83C0A9A18540A9CB854120DEC920AD S11301200E9D83C0A9688540A9CB854120E3C920E1
S1130130F2C9C901D039A9AD8540A9CB854120DEDA S1130130F7C9C901D039A9748540A9CB854120E309
S1130140C9200DCAC901D02AA9B98540A9CB8541C6 S1130140C92012CAC901D02AA9808540A9CB8541FA
S113015020DEC920F2C9A9BF8540A9CB854120DE94 S113015020E3C920F7C9A9868540A9CB854120E3BE
S1130160C920F2C9C901F0E0C900D0034CACC94CA4 S1130160C920F7C9C901F0E0C900D0034CACC94C9F
S1130170CFC9A9B98540A9CB854120DEC9A9C585C8 S1130170CFC9A9808540A9CB854120E3C9A98C8535
S113018040A9CB854120DEC920F2C9C901F0E3C9E9 S113018040A9CB854120E3C920F7C9C901F0E3C9DF
S113019000D0034CACC9A9A78540A9CB854120DE7A S113019000D0034CACC9A96E8540A9CB854120E3AE
S11301A0C920F2C9C901F0F6C900D023A9B385401A S11301A0C920F7C9C901F0F6C900D023A97A85404E
S11301B0A9CB854120DEC920F2C9C900D011A43DD4 S11301B0A9CB854120E3C920F7C9C900D011A43DCA
S11301C0A90199780618A000900838A028B003382F S11301C0A90199780618A000900838A028B003382F
S11301D0A027A90F9D83C0A9009D82C098605AA042 S11301D0A027A90F9D83C0A9079D81C0A9009D8266
S11301E000B1409D80C03C81C010FBC8C00690F1A6 S11301E0C098605AA000B1409D80C03C81C010FB03
S11301F07A60A9FF9D80C03C81C010FBBD80C08592 S11301F0C8C00690F17A60A9FF9D80C03C81C01000
S11302003C2980D0EDA9FF9D80C0A53C6020F2C9A7 S1130200FBBD80C0853C2980D0EDA9FF9D80C0A5A1
S1130210485AA004A9FF9D80C03C81C010FBBD804A S11302103C6020F7C9485AA004A9FF9D80C03C81D6
S1130220C04888D0EFA43D6899F8056899780568B6 S1130220C010FBBD80C04888D0EFA43D6899F80594
S113023099F804689978047AA9FF9D80C06860DA07 S1130230689978056899F804689978047AA9FF9D03
S11302405AA63DA5469DF805A5479D7805A9009D9C S113024080C06860DA5AA63DA5469DF805A5479D7D
S1130250F8049D7804A0091EF8053E78053EF804CC S11302507805A9009DF8049D7804A0091EF8053EC0
S11302603E780488D0F17AFA605AA43D9D80C03C5F S113026078053EF8043E780488D0F17AFA605AA4FE
S113027081C010FBB978049D80C03C81C010FBB9DB S11302703D9D80C0B978049D80C0B9F8049D80C0BC
S1130280F8049D80C03C81C010FBB978059D80C0F6 S1130280B978059D80C0B9F8059D80C0A9FF9D80FF
S11302903C81C010FBB9F8059D80C03C81C010FBB7 S1130290C020F7C97A6018A900A2FFA0FF6020441B
S11302A0A9FF9D80C03C81C010FB20F2C97A601870 S11302A0CAA90E9D83C0A951206ECAC900D03FA916
S11302B0A900A2FFA0FF60203FCAA90E9D83C0A988 S11302B0FF9D80C0BD80C0C9FED0F4A002A9179DD7
S11302C0512069CAA9FF9D80C03C81C010FBBD803C S11302C081C0A9FF9D80C0643CBD80C09244E644C7
S11302D0C0C9FED0EFA002643CA9FF9D80C03C8150 S11302D0D002E645E63CD0F188D0ECA9079D81C068
S11302E0C010FBBD80C09244E644D002E645E63C23 S11302E0A9FF9D80C0A90F9D83C018A90060A90F14
S11302F0D0E788D0E2A002A9FF9D80C03C81C01055 S11302F09D83C038A927602044CAA90E9D83C0A944
S1130300FB88D0F3A90F9D83C018A90060203FCAC1 S113030058206ECAC900D047A9FF9D80C0A9FE9D90
S1130310A90E9D83C0A9582069CAA9FF9D80C03C2D S113031080C0A002643CB2449D80C0E644D002E6A2
S113032081C010FBA9FE9D80C03C81C010FBA002CF S113032045E63CD0F188D0EC9D80C09D80C09D8086
S1130330643CB2449D80C03C81C010FBE644D002C2 S1130330C0BD80C0291FC905D015A9FF9D80C0BDBF
S1130340E645E63CD0EC88D0E7A0029D80C03C8125 S113034080C0C900F0F4A90F9D83C018A90060A95A
S1130350C010FB88D0F5A9FF9D80C03C81C010FB74 S1130350FF9D80C0BD80C0C900F0F4A90F9D83C07B
S1130360BD80C0291FC905D01AA9FF9D80C03C814A S113036038A9276038A901604000000000954100C9
S1130370C010FBBD80C0C900F0EFA90F9D83C01859 S1130370000000F948000001AA875000000200FFB5
S1130380A90060A9FF9D80C03C81C010FBBD80C056 S11303807700000000656940000000776900000004
S1130390C900F0EFA90F9D83C038A9276038A901CF S105039000FF68
S11303A0604000000000954100000000F948000092
S11303B001AA875000000200FF7700000000656971
S10E03C040000000776900000000FF0F
S9030000FC S9030000FC

View File

@ -5,7 +5,7 @@ The **Apple][Sd** is a SD card based replaced for the ProFile harddrive. In cont
A Xilinx CPLD is used as a SPI controller and translates, together with the ROM driver, SD card data to/from the Apple IIe. The VHDL source is based on [SPI65/B](http://www.6502.org/users/andre/spi65b) by André Fachat. A Xilinx CPLD is used as a SPI controller and translates, together with the ROM driver, SD card data to/from the Apple IIe. The VHDL source is based on [SPI65/B](http://www.6502.org/users/andre/spi65b) by André Fachat.
The assembler sources were originally written in Merlin-8, but have been updated to Merlin-32. The [schematics](AppleIISd.pdf) are available as PDF. The assembler sources were written in Merlin-8. The [schematics](AppleIISd.pdf) are available as PDF.
## Features ## Features
* up to 128MB storage space (4x 65535 blocks), currently 32MB * up to 128MB storage space (4x 65535 blocks), currently 32MB

View File

@ -1,5 +0,0 @@

merlin32 -V "C:\Program Files (x86)\Merlin32\Library" AppleIISd.s
move AppleIISd AppleIISd.bin
move AppleIISd_Output.txt AppleIISd.lst
del /AH _FileInformation.txt