mirror of
https://github.com/antoinevignau/source.git
synced 2025-01-01 15:30:02 +00:00
8701131e17
All my Applesqueezer code...
547 lines
9.4 KiB
ArmAsm
547 lines
9.4 KiB
ArmAsm
*
|
|
* AppleSqueezer RAMDISK
|
|
*
|
|
*
|
|
* (c) 2022, Brutal Deluxe Software
|
|
*
|
|
|
|
* v1.0 (20230104) - AV
|
|
* Works on a single 32MB partition only
|
|
* v1.1 (20230105) - AV
|
|
* Adds support for formatting options (Hello HFS)
|
|
|
|
mx %00
|
|
rel
|
|
typ $bb
|
|
dsk ASRamdisk
|
|
|
|
use AS.EQUATES.S
|
|
|
|
use 4/Sch.Macs
|
|
use 4/Util.Macs
|
|
|
|
*
|
|
* Entry point
|
|
*
|
|
|
|
RAMDisk da MyDIB-RAMDisk ; offset to 1st DIB
|
|
dw maxIMAGES ; number of devices
|
|
dw $0000 ; no configuration list
|
|
|
|
*
|
|
* Dispatch routine
|
|
*
|
|
|
|
entryPOINT phk ; Dispatch
|
|
plb
|
|
cmp #$0009
|
|
bcc L0012
|
|
lda #$0020
|
|
bra L001D
|
|
L0012 asl
|
|
tax
|
|
stz errCODE
|
|
jsr (tblDISPATCH,x)
|
|
lda errCODE
|
|
L001D cmp #$0001
|
|
rtl
|
|
|
|
tblDISPATCH da DStartup ; Driver_Startup
|
|
da DOpen ; Driver_Open
|
|
da DRead ; Driver_Read
|
|
da DWrite ; Driver_Write
|
|
da DClose ; Driver_Close
|
|
da DStatus ; Driver_Status
|
|
da DControl ; Driver_Control
|
|
da DFlush ; Driver_Flush
|
|
da DShutdown ; Driver_Shutdown
|
|
|
|
*
|
|
* Driver_Startup
|
|
*
|
|
|
|
DStartup
|
|
ldal FL_IDLE
|
|
and #$ff
|
|
cmp #$01
|
|
bne DShutdown ; no AS found
|
|
|
|
ldal FL_VERSION
|
|
and #$ff
|
|
cmp #minVERSION
|
|
bcc DShutdown ; no minimum version
|
|
|
|
lda #1 ; we're on
|
|
sta fgSTARTED
|
|
|
|
sep #$30
|
|
ldx #0
|
|
]lp lda proDEVNAME+3,x
|
|
sta MyDevName+1,x
|
|
inx
|
|
cpx #9
|
|
bcc ]lp
|
|
stx MyDevName
|
|
rep #$30
|
|
|
|
PushWord #0
|
|
PushLong #myTASK
|
|
_SchAddTask
|
|
pla
|
|
rts
|
|
|
|
*
|
|
* Driver_Shutdown
|
|
*
|
|
|
|
DShutdown stz fgSTARTED
|
|
|
|
*
|
|
* Driver_Open
|
|
* Driver_Close
|
|
* Driver_Flush
|
|
*
|
|
|
|
DOpen ; Driver_Open
|
|
DClose ; Driver_Close
|
|
DFlush ; Driver_Flush
|
|
rts
|
|
|
|
*
|
|
* Driver_Read
|
|
*
|
|
|
|
DRead jsr doSETUP
|
|
bcc dr1
|
|
rts
|
|
|
|
*--- The AS magic is here
|
|
|
|
dr1 pei bufferPtr+1 ; save pointer
|
|
|
|
sep #$20
|
|
lda thePAGE+2
|
|
stal exdram_address_set_main_bank
|
|
lda #0
|
|
stal exdram_address_set_addr_low
|
|
lda thePAGE
|
|
stal exdram_address_set_addr_high
|
|
lda thePAGE+1
|
|
stal exdram_address_set_addr_bank
|
|
|
|
ldx nbPAGES ; number of 512-byte pages to copy
|
|
dr2 ldy #0 ; read one block
|
|
sep #$20
|
|
]lp ldal exdram_address_access
|
|
sta [bufferPtr],y
|
|
iny
|
|
cpy #blockSIZE
|
|
bcc ]lp
|
|
|
|
rep #$20 ; move destination pointer
|
|
lda bufferPtr+1
|
|
clc
|
|
adc #>blockSIZE ; rwBlockSize+1
|
|
sta bufferPtr+1
|
|
|
|
dex ; next block
|
|
bne dr2
|
|
|
|
pla ; restore pointer
|
|
sta bufferPtr+1
|
|
rts
|
|
|
|
*--- The AS magic ends here
|
|
|
|
*
|
|
* Driver_Write
|
|
*
|
|
|
|
DWrite jsr doSETUP
|
|
bcc dw1
|
|
rts
|
|
|
|
*--- The AS magic is here
|
|
|
|
dw1 pei bufferPtr+1 ; save pointer
|
|
|
|
sep #$20
|
|
lda thePAGE+2
|
|
stal exdram_address_set_main_bank
|
|
lda #0
|
|
stal exdram_address_set_addr_low
|
|
lda thePAGE
|
|
stal exdram_address_set_addr_high
|
|
lda thePAGE+1
|
|
stal exdram_address_set_addr_bank
|
|
|
|
ldx nbPAGES ; number of 512 bytes pages to copy
|
|
dw2 ldy #0 ; write one block
|
|
sep #$20
|
|
]lp lda [bufferPtr],y
|
|
stal exdram_address_access
|
|
iny
|
|
cpy #blockSIZE
|
|
bcc ]lp
|
|
|
|
rep #$20 ; move destination pointer
|
|
lda bufferPtr+1
|
|
clc
|
|
adc #>blockSIZE ; rwBlockSize+1
|
|
sta bufferPtr+1
|
|
|
|
dex ; next page
|
|
bne dw2
|
|
|
|
pla ; restore pointer
|
|
sta bufferPtr+1
|
|
rts
|
|
|
|
*--- The AS magic ends here
|
|
|
|
*
|
|
* Driver_Status
|
|
*
|
|
|
|
DStatus lda statusCode
|
|
cmp #4+1
|
|
bcc DStatus1
|
|
lda #$0021 ; drvrBadCode
|
|
sta errCODE
|
|
rts
|
|
|
|
DStatus1 asl
|
|
tax
|
|
stz transferCount
|
|
stz transferCount+2
|
|
jsr (tblSTATUS,x)
|
|
rts
|
|
|
|
tblSTATUS da SGetStatus ; GetDeviceStatus
|
|
da SGet ; GetConfigParameters
|
|
da SGet ; GetWaitStatus
|
|
da SGetFormatOptions ; GetFormatOptions
|
|
da SNada ; GetPartitionMap
|
|
|
|
SNada rts
|
|
|
|
*----------- GetDeviceStatus
|
|
|
|
SGetStatus lda #2 ; GetDeviceStatus
|
|
sta transferCount
|
|
|
|
lda requestCount ; check length of buffer
|
|
cmp #6
|
|
bcc SGS1
|
|
lda #6
|
|
sta transferCount
|
|
|
|
ldy #2 ; we can send the number of blocks
|
|
lda #maxBLOCKH
|
|
sta [statusListPtr],y
|
|
iny
|
|
iny
|
|
lda #^maxBLOCKH
|
|
sta [statusListPtr],y
|
|
|
|
SGS1 ldx #diskInDriveBit
|
|
lda fgSTARTED ; send the status of the driver
|
|
bne SGS2
|
|
inx
|
|
SGS2 txa
|
|
ora #uncertainBlockCountBit ; we are uncertain of the block count
|
|
sta [statusListPtr]
|
|
rts
|
|
|
|
*----------- GetConfigParameters / GetWaitStatus
|
|
|
|
SGet lda #0 ; GetConfigParameters
|
|
sta [statusListPtr] ; GetWaitStatus
|
|
lda #2
|
|
sta transferCount
|
|
rts
|
|
|
|
*----------- GetFormatOptions
|
|
|
|
SGetFormatOptions
|
|
lda requestCount ; check size of buffer
|
|
cmp #formatOptionsTableEnd-formatOptionsTable
|
|
bcc SGetFormat1
|
|
|
|
ldy #0 ; and move data
|
|
]lp lda formatOptionsTable,y
|
|
sta [statusListPtr],y
|
|
iny
|
|
iny
|
|
cpy #formatOptionsTableEnd-formatOptionsTable
|
|
bcc ]lp
|
|
sty transferCount ; save size
|
|
|
|
SGetFormat1 rts
|
|
|
|
*
|
|
* Driver_Control
|
|
*
|
|
|
|
DControl jsr checkSWITCHED
|
|
bcc DControl1
|
|
rts
|
|
|
|
DControl1 lda controlCode
|
|
cmp #9+1
|
|
bcc DControl2
|
|
|
|
lda #$0021
|
|
sta errCODE
|
|
rts
|
|
|
|
DControl2 asl
|
|
tax
|
|
stz transferCount
|
|
stz transferCount+2
|
|
jsr (tblCONTROL,x)
|
|
rts
|
|
|
|
tblCONTROL da CNada ; 0 ResetDevice
|
|
da CFormatDevice ; 1 FormatDevice
|
|
da CNada ; 2 EjectMedium
|
|
da CSet ; 3 SetConfigParameters
|
|
da CSet ; 4 SetWaitStatus
|
|
da CSetFormatOptions ; 5 SetFormatOptions
|
|
da CNada ; 6 AssignPartitionOwner
|
|
da CNada ; 7 ArmSignal
|
|
da CNada ; 8 DisarmSignal
|
|
da CNada ; 9 SetPartitionMap
|
|
|
|
CNada rts
|
|
|
|
*----------- FormatDevice
|
|
|
|
CFormatDevice
|
|
lda fgFORMAT ; if 1, the Format call
|
|
bne CFormat1 ; was already called
|
|
rts
|
|
|
|
CFormat1 lda #0
|
|
sep #$20
|
|
stal exdram_address_set_main_bank
|
|
stal exdram_address_set_addr_low
|
|
stal exdram_address_set_addr_high
|
|
stal exdram_address_set_addr_bank
|
|
|
|
ldx fBlockCount+2
|
|
ldy fBlockCount
|
|
CFormat2 phx
|
|
CFormat3 ldx #blockSIZE ; 512-byte blocks
|
|
]lp stal exdram_address_access
|
|
dex
|
|
bne ]lp
|
|
dey ; loop fBlockCount
|
|
bne CFormat3
|
|
plx ; loop fBlockCount+2
|
|
dex
|
|
bne CFormat2
|
|
rep #$20
|
|
rts
|
|
|
|
*----------- SetFormatOptions
|
|
|
|
CSetFormatOptions
|
|
lda [controlListPtr]
|
|
beq CSFO9 ; empty option is not ours
|
|
cmp #3 ; 1-2 only
|
|
bcs CSFO9
|
|
|
|
cmp #1
|
|
bne CSFOHFS
|
|
|
|
ldx #^maxBLOCKH ; it is 1, default values for HFS
|
|
ldy #maxBLOCKH
|
|
bra CSFOAll
|
|
|
|
CSFOHFS ldx #^maxBLOCKP ; it is 2, default values for ProDOS
|
|
ldy #maxBLOCKP
|
|
|
|
CSFOAll sty fBlockCount
|
|
stx fBlockCount+2
|
|
|
|
CSFO9 rts
|
|
|
|
*----------- SetConfigParameters / SetWaitStatus
|
|
|
|
CSet lda [controlListPtr] ; SetConfigParameters
|
|
bne CSetERR ; SetWaitStatus
|
|
rts
|
|
CSetERR lda #$0022
|
|
sta errCODE
|
|
rts
|
|
|
|
*----------------------------
|
|
|
|
* Status flag of the current device
|
|
* $0001: image has been switched (disk switched)
|
|
* $0010: image is active (disk in drive)
|
|
* $0100: image has been modified
|
|
|
|
*
|
|
* Checks everything is OK
|
|
*
|
|
|
|
doSETUP jsr checkSWITCHED
|
|
bcc ds2
|
|
rts
|
|
|
|
ds2 lda requestCount ; nb of bytes to read
|
|
ora requestCount+2
|
|
bne ds4
|
|
|
|
lda #$002C ; invalidByteCount
|
|
sta errCODE
|
|
sec
|
|
rts
|
|
|
|
*--- From a Block to a RAM address
|
|
|
|
ds4 lda blockNum ; get block number
|
|
asl
|
|
sta thePAGE ; to calculate
|
|
lda blockNum+2 ; RAM address
|
|
rol
|
|
sta thePAGE+2
|
|
|
|
lda requestCount+1 ; number of pages
|
|
lsr
|
|
sta nbPAGES ; to calculate
|
|
|
|
lda requestCount ; multiple of $0200
|
|
and #blockSIZE-1
|
|
beq ds6
|
|
|
|
lda #$002D ; bad block count
|
|
sta errCODE
|
|
sec
|
|
rts
|
|
|
|
*--- Generic transfer now
|
|
|
|
ds6 lda requestCount ; assume transfer=request
|
|
sta transferCount
|
|
lda requestCount+2
|
|
sta transferCount+2
|
|
|
|
clc
|
|
rts
|
|
|
|
*----------------------------
|
|
|
|
checkSWITCHED
|
|
lda fgSTARTED
|
|
bne cs1
|
|
|
|
jsl SET_DISKSW
|
|
|
|
lda #1
|
|
sta fgSTARTED
|
|
lda #$002e
|
|
sta errCODE
|
|
sec
|
|
rts
|
|
|
|
cs1 clc
|
|
rts
|
|
|
|
*---------------------------- Check RAMDISK was init'ed
|
|
|
|
myTASK PushLong #proVOLUME
|
|
PushWord #$2008
|
|
jsl GSOS2
|
|
bcc myTASK1
|
|
|
|
PushLong #proFORMAT
|
|
PushWord #$2024
|
|
jsl GSOS2
|
|
|
|
lda #1 ; tell the driver we've been there
|
|
stal fgFORMAT ; a format will now be a real format
|
|
|
|
lda #$4000 ; no more silent formatting
|
|
stal proFORMAT+14
|
|
|
|
myTASK1 rtl
|
|
|
|
*---------------------------- GS/OS
|
|
|
|
proVOLUME dw 2
|
|
adrl proDEVNAME
|
|
adrl outVOLNAME
|
|
|
|
proFORMAT dw 5 ; +00
|
|
adrl proDEVNAME ; +02
|
|
adrl proVOLNAME ; +06
|
|
dw 6 ; +10
|
|
dw 6 ; +12 - Default is ProDOS
|
|
dw $2000 ; +14 - Cant rename, can change selection, silent formatting
|
|
|
|
proDEVNAME strl '.ASRAMDISK'
|
|
proVOLNAME strl ':AppleSqueezer'
|
|
|
|
outVOLNAME dw 36 ; (word) output buffer
|
|
ds 34 ; (word) strl + (array) string
|
|
|
|
*----------------------------
|
|
|
|
|
|
formatOptionsTable
|
|
|
|
* 8 bytes
|
|
dw 2 ; numOptions
|
|
dw 2 ; numDisplayed
|
|
dw 1 ; recommendedOption
|
|
dw 1 ; currentOption
|
|
|
|
* 16 bytes
|
|
dw 1 ; formatOptionNum
|
|
dw 2 ; linkRefNum
|
|
dw 9 ; flags 1001 - MB size - Apple format
|
|
adrl maxBLOCKH ; blockCount is 491520 for HFS
|
|
dw blockSIZE ; blockSize is 512 bytes
|
|
dw 0 ; interleaveFactor
|
|
dw 240 ; mediaSize 1000 - MB size
|
|
|
|
* 16 bytes
|
|
dw 2 ; formatOptionNum
|
|
dw 0 ; linkRefNum
|
|
dw 9 ; flags 1001 - MB size - Apple format
|
|
adrl maxBLOCKP ; blockCount is 65536 for ProDOS 8
|
|
dw blockSIZE ; blockSize is 512 bytes for ProDOS 8
|
|
dw 0 ; interleaveFactor
|
|
dw 32 ; mediaSize 1000 - MB size
|
|
|
|
formatOptionsTableEnd
|
|
|
|
*--- Default formatting options
|
|
|
|
fBlockCount adrl maxBLOCKH ; 65536
|
|
|
|
*----------------------------
|
|
|
|
fgSTARTED ds 2 ; 0: not started, 1: started
|
|
fgFORMAT ds 2 ; 0: GS/OS Format never called, 1 instead
|
|
errCODE ds 2
|
|
thePAGE ds 4 ; page to read/write: $hh/ll00
|
|
nbPAGES ds 2 ; number of blockSIZEP pages to copy
|
|
|
|
MyDIB ds 4 ; +00 pointer to the next DIB
|
|
adrl entryPOINT ; +04 driver entry point
|
|
dw dftCHAR ; +08 characteristics
|
|
adrl maxBLOCKH ; +0A block count
|
|
MyDevName ds 32 ; +0E device name
|
|
dw $8000 ; +2E slot number
|
|
dw $0001 ; +30 unit number
|
|
dw dftVERSION ; +32 version
|
|
dw dftRAMDISK ; +34 device ID
|
|
dw $0000 ; +36 first linked device
|
|
dw $0000 ; +38 next linked device
|
|
adrl $00000000 ; +3A extended DIB ptr
|
|
dw $0000 ; +3E device number
|