Save and restore ZP locations

Shorter read write loops
This commit is contained in:
Florian Reitz 2017-11-01 16:22:35 +01:00
parent cf98c54e77
commit e9bd383d2e
4 changed files with 1023 additions and 1010 deletions

Binary file not shown.

View File

@ -1,71 +1,68 @@
:10000000A220A000A203A0FF2058FFBABD00018DCE
:10001000F807290F853D0A0A0A0A852BAA2CFFCF6B
:1000200020A9C99003A92F002000C8C900F0010031
:10003000A9018542A62B85436444A90885456446E9
:1000400064472CFFCF20CFC94C0108D82058FFBAF5
:10005000BD00018DF807290F853D0A0A0A0A852B84
:10006000AA2CFFCF20A9C99004A92F801FA9803CEA
:1000700083C0F029A542C900F014C901F013C902D8
:10008000F012C903F011C9FFF010A90138604CC18A
:10009000C94CCFC94C38CA4CA9CA4CADCA2000C8FB
:1000A000B0EA80D000000000000000000000000066
:1000B0000000000000000000000000000000000040
:1000C0000000000000000000000000000000000030
:1000200020A7C99003A92F002000C8F00100A90152
:100030008542A62B8543A9088545644464476446E8
:100040002CFFCF20CDC94C0108D848A52B48A53D91
:1000500048A54048A541482058FFBABD00018DF889
:1000600007290F853D0A0A0A0A852BAA2CFFCF20F3
:10007000A7C99005A92F388040A9803C83C0F034DF
:10008000A542C900F015C901F016C902F017C9034D
:10009000F018C9FFF019A90138801E20BFC98019C6
:1000A00020CDC980142034CA800F20A3CA800A2022
:1000B000A7CA80052000C890C7BA9D050168854180
:1000C00068854068853D68852B68600000000000F9
:1000D0000000000000000000000000000000000020
:1000E0000000000000000000000000000000000010
:1000F000000000000000000000000000FFFF174BA0
:1000F000000000000000000000000000FFFF1749A2
:10010000D8A9039D81C0BD83C009019D83C0A907F3
:100110009D82C0A00AA9FF9D80C03C81C010FB88C1
:10012000D0F5BD83C029FE9D83C0A9318540A9CBF0
:10013000854120EBC820FFC8C901D039A93D8540C1
:10014000A9CB854120EBC8201AC9C901D02AA949E9
:100150008540A9CB854120EBC820FFC8A94F854029
:10012000D0F5BD83C029FE9D83C0A9FF8540A9CA23
:10013000854120EBC820FFC8C901D039A90B8540F3
:10014000A9CB854120EBC82018C9C901D02AA9171D
:100150008540A9CB854120EBC820FFC8A91D85405B
:10016000A9CB854120EBC820FFC8C901F0E0C90038
:10017000D0034CB2C84CD9C8A9498540A9CB854108
:1001800020EBC8A9558540A9CB854120EBC820FFAD
:10019000C8C901F0E3C900D0034CB2C8A9378540F3
:10017000D0034CB2C84CD9C8A9178540A9CB85413A
:1001800020EBC8A9238540A9CB854120EBC820FFDF
:10019000C8C901F0E3C900D0034CB2C8A905854025
:1001A000A9CB854120EBC820FFC8C901F0F6C900E2
:1001B000D027A9438540A9CB854120EBC820FFC8A3
:1001B000D027A9118540A9CB854120EBC820FFC8D5
:1001C000C900D015BD83C009809D83C0BD81C00911
:1001D000049D81C018A000900338A027BD83C009EA
:1001E000019D83C0A9009D82C098605AA000B140C3
:1001F0009D80C03C81C010FBC8C00690F17A60A908
:10020000FF9D80C03C81C010FBBD80C0853C298023
:10021000D0EDA9FF9D80C0A53C6020FFC8485AA032
:1002200004A9FF9D80C03C81C010FBBD80C04888F0
:10023000D0EFA43D6899F805689978056899F804A5
:10024000689978047AA9FF9D80C06860DA5AA63D53
:10025000A5469DF805A5479D7805A9009DF8049D34
:100260007804A9802443F005A9019DF804A0091E83
:10027000F8053E78053EF8043E780488D0F17AFA15
:10028000605AA43D9D80C0B978049D80C0B9F8042F
:100290009D80C0B978059D80C0B9F8059D80C0A932
:1002A000FF9D80C020FFC87A6048A9403C83C018E9
:1002B000F00138686048A9203C83C018F001386814
:1002C00060A900A2FFA0FF20B5C99002A92B602061
:1002D0004CC9BD83C029FE9D83C0A9512081C9C9D5
:1002E00000D050A9FF9D80C0BD80C0C9FED0F4A041
:1002F00002BD81C009109D81C0A9FF9D80C0643CE2
:10030000BD80C09244E644D002E645E63CD0F18888
:10031000D0ECBD80C0BD80C0BD80C0BD81C029EF14
:100320009D81C018A9000848BD83C009019D83C0F4
:1003300068286038A92780EE20B5C9B067204CC96D
:10034000BD83C029FE9D83C0A9582081C9C900D0A2
:100350004EA9FF9D80C0A9FE9D80C0A002643CB252
:10036000449D80C0E644D002E645E63CD0F188D00A
:10037000EC9D80C09D80C09D80C0BD80C0291FC9EC
:1003800005D01C18A9000848A9FF9D80C0BD80C0E9
:10039000C900F0F4BD83C009019D83C0682860389E
:1003A000A92780E238A92B80DD38A90160A43DA9E6
:1003B0000220F5BEB07999F8068545A9009978061E
:1003C0008544A000989144C8D0FAE645989144C865
:1003D000D0FAA902A43D8542AD78068544B9F80655
:1003E000854564466447A62B204BC7B042A901A4AB
:1003F0003D8542B978068544B9F80685456446646A
:1004000047A62B204BC7B027A43DB978068544B931
:10041000F8068545A00098D144D015C8D0F8E64527
:1004200098D144D00BC8D0F820F8BE18A9006000BD
:10043000004000000000954100000000F948000065
:1004400001AA875000000200FF77000000006569E4
:0B04500040000000776900000000FF82
:10020000FF9D80C03C81C010FBBD80C08980D0EFC5
:1002100048A9FF9D80C0686020FFC8485AA004A973
:10022000FF9D80C03C81C010FBBD80C04888D0EFDE
:10023000A43D6899F805689978056899F804689963
:1002400078047AA9FF9D80C06860DA5AA63DA54669
:100250009DF805A5479D7805A9009DF8049D7804A3
:10026000A9802443F005A9019DF804A0091EF80502
:100270003E78053EF8043E780488D0F17AFA605A58
:10028000A43D9D80C0B978049D80C0B9F8049D80CC
:10029000C0B978059D80C0B9F8059D80C0A9FF9DB3
:1002A00080C020FFC87A6048A9403C83C018F00194
:1002B00038686048A9203C83C018F001386860A9FC
:1002C00000A2FFA0FF20B3C99002A92B60204AC959
:1002D000BD83C029FE9D83C0A951207FC9D050A9EC
:1002E000FF9D80C0BD80C0C9FED0F4BD81C0091093
:1002F0009D81C0A9FF9D80C0A000BD80C09144C861
:10030000D0F8E645BD80C09144C8D0F8C645BD8050
:10031000C0BD80C0BD80C0BD81C029EF9D81C01817
:10032000A9000848BD83C009019D83C068286038C2
:10033000A92780EE20B3C9B065204AC9BD83C02972
:10034000FE9D83C0A958207FC9D04EA9FF9D80C0C3
:10035000A9FE9D80C0A000B1449D80C0C8D0F8E631
:1003600045B1449D80C0C8D0F8C645A9FF9D80C056
:100370009D80C09D80C0BD80C0291FC905D01A18AE
:10038000A9000848A9FF9D80C0BD80C0F0F6BD83CC
:10039000C009019D83C068286038A92780E438A976
:1003A0002B80DF38A90160A52B48A53D48A9022074
:1003B000F5BEB0498545644468853D68852BA0003D
:1003C000989144C8D0FAE645989144C8D0FAC645F9
:1003D00064466447A62B2034CAB02220CDC9B01D84
:1003E000A00098D144D017C8D0F8E64598D144D0A1
:1003F0000DC8D0F8C64520F8BE18A900600000401E
:1004000000000000954100000000F948000001AA2A
:10041000875000000200FF7700000000656940007F
:090420000000776900000000FFF4
:00000001FF

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
********************************
*
* Apple][Sd Firmware
* Version 0.7
* Version 0.8
*
* (c) Florian Reitz, 2017
*
@ -23,7 +23,6 @@ DEBUG = 0
* Memory defines
SLOT16 = $2B ; $s0 -> slot * 16
WORK = $3C
SLOT = $3D ; $0s
CMDLO = $40
CMDHI = $41
@ -41,8 +40,6 @@ R30 = $0478
R31 = $04F8
R32 = $0578
R33 = $05F8
RAM0 = $0678
RAM1 = $06F8
* Constants
@ -151,19 +148,18 @@ INSTALL LDA $BF32,X ; get a devnum
ELSE
BOOT CMP #0 ; check for error
BEQ :BOOT1
BOOT BEQ :BOOT1 ; check for error
BRK
:BOOT1 LDA #$01
STA DCMD ; load command
LDX SLOT16
STA $43 ; slot number
STZ BUFFER ; buffer lo
LDA #$08
STA BUFFER+1 ; buffer hi
STZ BLOCK ; block lo
STZ BUFFER ; buffer lo
STZ BLOCK+1 ; block hi
STZ BLOCK ; block lo
BIT $CFFF
JSR READ ; call driver
JMP $801 ; goto bootloader
@ -179,6 +175,16 @@ BOOT CMP #0 ; check for error
DRIVER CLD
:SAVEZP PHA ; make room for retval
LDA SLOT16 ; save all ZP locations
PHA
LDA SLOT
PHA
LDA CMDLO
PHA
LDA CMDHI
PHA
DO DEBUG
LDA #$04
STA SLOT
@ -205,7 +211,8 @@ DRIVER CLD
JSR CARDDET
BCC :INITED
LDA #$2F ; no card inserted
BRA :DONE
SEC
BRA :RESTZP
:INITED LDA #INITED ; check for init
BIT SS,X
@ -223,18 +230,34 @@ DRIVER CLD
CMP #$FF
BEQ :TEST
LDA #1 ; unknown command
SEC
BRA :RESTZP
:DONE SEC
RTS
:STATUS JMP STATUS
:READ JMP READ
:WRITE JMP WRITE
:FORMAT JMP FORMAT
:TEST JMP TEST ; do device test
:STATUS JSR STATUS
BRA :RESTZP
:READ JSR READ
BRA :RESTZP
:WRITE JSR WRITE
BRA :RESTZP
:FORMAT JSR FORMAT
BRA :RESTZP
:TEST JSR TEST ; do device test
BRA :RESTZP
:INIT JSR INIT
BCS :DONE ; init failure
BRA :CMD
BCC :CMD ; init ok
:RESTZP TSX
STA $105,X ; save retval on stack
PLA ; restore all ZP locations
STA CMDHI
PLA
STA CMDLO
PLA
STA SLOT
PLA
STA SLOT16
PLA ; get retval
RTS
* Signature bytes
@ -281,7 +304,7 @@ INIT CLD
STA CMDLO
LDA #>CMD0
STA CMDHI
JSR CMD
JSR SDCMD
JSR GETR1 ; get response
CMP #$01
BNE :ERROR1 ; error!
@ -290,7 +313,7 @@ INIT CLD
STA CMDLO
LDA #>CMD8
STA CMDHI
JSR CMD
JSR SDCMD
JSR GETR3
CMP #$01
BNE :SDV1 ; may be SD Ver. 1
@ -300,17 +323,17 @@ INIT CLD
STA CMDLO
LDA #>CMD55
STA CMDHI
JSR CMD
JSR SDCMD
JSR GETR1
LDA #<ACMD4140
STA CMDLO
LDA #>ACMD4140
STA CMDHI
JSR CMD
JSR SDCMD
JSR GETR1
CMP #$01
BEQ :SDV2 ; wait for ready
CMP #$00
CMP #0
BNE :ERROR1 ; error!
* send CMD58
* SD Ver. 2 initialized!
@ -322,16 +345,16 @@ INIT CLD
STA CMDLO
LDA #>CMD55
STA CMDHI
JSR CMD ; ignore response
JSR SDCMD ; ignore response
LDA #<ACMD410
STA CMDLO
LDA #>ACMD410
STA CMDHI
JSR CMD
JSR SDCMD
JSR GETR1
CMP #$01
BEQ :SDV1 ; wait for ready
CMP #$00
CMP #0
BNE :MMC ; may be MMC card
* SD Ver. 1 initialized!
JMP :BLOCKSZ
@ -340,11 +363,11 @@ INIT CLD
STA CMDLO
LDA #>CMD1
STA CMDHI
:LOOP1 JSR CMD
:LOOP1 JSR SDCMD
JSR GETR1
CMP #$01
BEQ :LOOP1 ; wait for ready
CMP #$00
CMP #0
BNE :IOERROR ; error!
* MMC Ver. 3 initialized!
@ -352,9 +375,9 @@ INIT CLD
STA CMDLO
LDA #>CMD16
STA CMDHI
JSR CMD
JSR SDCMD
JSR GETR1
CMP #$00
CMP #0
BNE :IOERROR ; error!
:END LDA SS,X
@ -384,7 +407,7 @@ INIT CLD
*
********************************
CMD PHY
SDCMD PHY
LDY #0
:LOOP LDA (CMDLO),Y
STA DATA,X
@ -409,15 +432,14 @@ GETR1 LDA #DUMMY
:WAIT BIT CTRL,X
BPL :WAIT
LDA DATA,X ; get response
STA WORK ; save R1
AND #$80
BIT #$80
BNE GETR1 ; wait for MSB=0
PHA
LDA #DUMMY
STA DATA,X ; send another dummy
LDA WORK ; restore R1
PLA ; restore R1
RTS
********************************
*
* Get R3
@ -604,9 +626,7 @@ READ JSR GETBLOCK ; calc block address
STA SS,X
LDA #$51 ; send CMD17
JSR COMMAND ; send command
CMP #0 ; check for error
BNE :ERROR
BNE :ERROR ; check for error
:GETTOK LDA #DUMMY ; get data token
STA DATA,X
@ -614,22 +634,23 @@ READ JSR GETBLOCK ; calc block address
CMP #$FE
BNE :GETTOK ; wait for $FE
LDY #2 ; read data from card
LDA CTRL,X ; enable FRX
ORA #FRX
STA CTRL,X
LDA #DUMMY
STA DATA,X
:LOOPY STZ WORK
:LOOPW LDA DATA,X
STA (BUFFER)
INC BUFFER
BNE :INW
LDY #0
:LOOP1 LDA DATA,X ; read data from card
STA (BUFFER),Y
INY
BNE :LOOP1
INC BUFFER+1 ; inc msb on page boundary
:INW INC WORK
BNE :LOOPW
DEY
BNE :LOOPY
:LOOP2 LDA DATA,X
STA (BUFFER),Y
INY
BNE :LOOP2
DEC BUFFER+1
:CRC LDA DATA,X ; read two bytes crc
LDA DATA,X ; and ignore
@ -680,28 +701,27 @@ WRITE JSR WRPROT
STA SS,X
LDA #$58 ; send CMD24
JSR COMMAND ; send command
CMP #0 ; check for error
BNE :IOERROR
BNE :IOERROR ; check for error
LDA #DUMMY
STA DATA,X ; send dummy
LDA #$FE
STA DATA,X ; send data token
LDY #2 ; send data to card
:LOOPY STZ WORK
:LOOPW LDA (BUFFER)
LDY #0
:LOOP1 LDA (BUFFER),Y
STA DATA,X :
INY
BNE :LOOP1
INC BUFFER+1 :
:LOOP2 LDA (BUFFER),Y
STA DATA,X
INC BUFFER
BNE :INW
INC BUFFER+1 ; inc msb on page boundary
:INW INC WORK
BNE :LOOPW
DEY
BNE :LOOPY
INY
BNE :LOOP2
DEC BUFFER+1
:CRC STA DATA,X ; send 2 dummy crc bytes
:CRC LDA #DUMMY
STA DATA,X ; send 2 dummy crc bytes
STA DATA,X
STA DATA,X ; get data response
@ -717,7 +737,6 @@ WRITE JSR WRPROT
:WAIT LDA #DUMMY
STA DATA,X ; wait for write cycle
LDA DATA,X ; to complete
CMP #$00
BEQ :WAIT
LDA SS,X ; disable /CS
@ -755,18 +774,21 @@ FORMAT SEC
*
********************************
TEST
TEST LDA SLOT16
PHA
LDA SLOT
PHA
* get buffer
LDY SLOT
LDA #2 ; get 512 byte buffer
JSR $BEF5 ; call GETBUFR
BCS :ERROR
STA RAM1,Y
STA BUFFER+1
LDA #0
STA RAM0,Y
STA BUFFER
STZ BUFFER
PLA
STA SLOT
PLA
STA SLOT16
* fill buffer
LDY #0
@ -779,41 +801,21 @@ TEST
STA (BUFFER),Y
INY
BNE :LOOP1
DEC BUFFER+1
* write to card
LDA #2 ; write cmd
LDY SLOT
STA DCMD
LDA RAM0 ; buffer address
STA BUFFER
LDA RAM1,Y
STA BUFFER+1
STZ BLOCK ; block number
STZ BLOCK+1
LDX SLOT16
JSR DRIVER
* write to card
JSR WRITE
BCS :ERROR
* read from card
LDA #1 ; read cmd
LDY SLOT
STA DCMD
LDA RAM0,Y ; buffer address
STA BUFFER
LDA RAM1,Y
STA BUFFER+1
STZ BLOCK ; block number
STZ BLOCK+1
LDX SLOT16
JSR DRIVER
JSR READ
BCS :ERROR
* check for errors
LDY SLOT
LDA RAM0,Y ; buffer address
STA BUFFER
LDA RAM1,Y
STA BUFFER+1
LDY #0
:LOOP2 TYA
CMP (BUFFER),Y
@ -826,6 +828,7 @@ TEST
BNE :ERRCMP
INY
BNE :LOOP3
DEC BUFFER+1
* free buffer
JSR $BEF8 ; call FREEBUFR