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

View File

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