All my Applesqueezer code...
This commit is contained in:
Antoine Vignau 2023-06-19 15:45:09 +02:00
parent 99610b5710
commit 8701131e17
8 changed files with 2153 additions and 0 deletions

BIN
.DS_Store vendored

Binary file not shown.

484
applesqueezer/cda/ascda.s Normal file
View File

@ -0,0 +1,484 @@
*
* AppleSqueezer in 16-bit assembly
*
* (c) 2022, Niek van Suchtelen
* (a) 2022, Brutal Deluxe Software
*
mx %00
rel
typ $B9 ; CDA
dsk ascda.l
lst off
*----------------------------
* EQUATES
*----------------------------
verMAX = "1"
verMIN = "0"
*----------
* FIRMWARE
*----------
KBD = $c000 ; read a key
CLR80VID = $c00c ; switch to 40-col mode
SET80VID = $c00d ; switch to 80-col mode
CLRALTCHAR = $c00e ; alt char off
SETALTCHAR = $c00f ; alt char on
KBDSTROBE = $c010 ; reset the keyboard
RD80COL = $c018 ; bit 7=1 if 80-col mode
BTN0 = $c061 ; bit 7=1 if button 0 pressed
*----------
* TEXT
*----------
ptrSCREEN = $000400
fgNORMAL = $FFFF ; normal character display
fgINVERSE = $3F3F ; inverse character display
mask3F = %00111111 ; $3F
mask7F = %01111111 ; $7f
mask80 = %10000000 ; $80
chrLARROW = $88 ; all
chrDARROW = $8a ; codes
chrUARROW = $8b ; of
chrRETURN = $8d ; the
chrRARROW = $95 ; authorized
chrESCAPE = $9b ; keys
chrSPACE = " " ; space
chrCHECK = 'D' ; the check mark
*----------------------------
*
* CODE - CDA HEADER
*
*----------------------------
entryCDA str 'AppleSqueezer GS'
adrl ptrOPEN ; call the open routine
adrl ptrCLOSE ; call (do nothing) on the close routine
*----------------------------
ptrOPEN phb ; save the bank
phk ; our bank please
plb
jsr doCODE ; do the code
plb ; restore the bank
ptrCLOSE rtl ; and return
*----------------------------
*
* CODE - THE CDA CODE
*
*----------------------------
doCODE php
sei
sep #$20 ; switch to native 8-bit mode
stal CLR80VID ; we want 40-col, please
stal SETALTCHAR ; w/alternate character set
rep #$20
jsr drawFRAME ; show the frame window
ldal BTN0-1 ; we enter the CDA
bmi doCODE1 ; if open-apple is pressed
* jsr isAppleSqueezer ; is AS present?
* beq doCODE1 ; yes, we have one
jmp doNOCARD ; we don't have one, go purchase one!
doCODE1 bit loadValues ; we get the parms on entry
debug lda #%00000000_00000011
sta data
jsr getVALUES ; transform from data
jsr doMAIN ; go to the main menu
jsr setVALUES ; move back to data
bit storeValues ; we set the parms on exit
doQUIT plp
rts ; and return
*----------------------------
* CODE - TEXT SUB-ROUTINES
*----------------------------
doMAIN lda #fgNORMAL
sta INVFLG
jsr showALLSTR ; print all menus
jsr showALLED ; print all enabled/disabled states
jmp readKEY
*-----------
* Enable / Disable a value
*
* Input:
* A: menu index to change state
changeSTATE asl ; menu
tax
lda valACCEL,x
eor #1 ; on/off
sta valACCEL,x
jsr (ptrSHOW,x)
rts
ptrSHOW da showACCEL,showBIRAM,showEXRAM
*-----------
* Transform data into 0/1 values
getVALUES lda data
tax
and #%00000000_00000001
sta valACCEL
txa
and #%00000000_00000010
lsr
sta valBIRAM
txa
and #%00000000_00000100
lsr
lsr
sta valEXRAM
rts
*-----------
* Pack values into data
setVALUES lda valACCEL
sta data
lda valBIRAM
asl
ora data
sta data
lda valEXRAM
asl
asl
ora data
sta data
rts
*-----------
* Show all Strings
showSACCEL lda #strACCEL ; show acceleration string
ldx #4
ldy #5
jmp printSTR
showSBIRAM lda #strBIRAM ; show built-in ram string
ldx #4
ldy #6
jmp printSTR
showALLSTR jsr showSACCEL ; shows the three entries
jsr showSBIRAM ; goes below
showSEXRAM lda #strEXRAM ; show extra ram state
ldx #4
ldy #7
jmp printSTR
*-----------
* Show all Enabled/Disabled values
showACCEL lda valACCEL ; show acceleration state
ldx #18
ldy #5
jmp printED
showBIRAM lda valBIRAM ; show built-in ram state
ldx #18
ldy #6
jmp printED
showALLED jsr showACCEL ; show the three entries
jsr showBIRAM ; goes below
showEXRAM lda valEXRAM ; show extra ram state
ldx #18
ldy #7 ; goes below
*-----------
* print Enabled/Disabled
*
* Input:
* A: bit to test
* X: x-coord to print
* Y: y-coord to print
printED jsr TABV
lsr ; move bit 0 in carry
bcc printDIS
lda #strENABLED ; it is 1
jmp printCSTR
printDIS lda #strDISABLED ; it is 0
jmp printCSTR
*----------
* TABV
*
* Input:
* A: not used
* X: x-coord
* Y: y-coord
* Output:
* A: preserved
* X/Y: scrambled
* dpTO: ptr to screen
*
TABV pha
stx CH
sty CV
tya
asl
tay
lda ptrTEXT,y
clc
adc CH
sta patchSTR1+1
sta patchSTR2+1
pla
rts
*-----------
* print String with Tabulation
*
* Input:
* A: string pointer
* X: x-coord to print
* Y: y-coord to print
printSTR jsr TABV ; goes below
*----------
* printCSTR
*
* Input:
* A/X/Y: not used
* INVFLG: normal or inverse
* Output:
* A/X/Y: scrambled
*
printCSTR tay ; pointer to source text
bit INVFLG ; shall we output
bpl printCINV ; in inverse mode?
ldx #0 ; no, standard
sep #$20
]lp lda |$0000,y ; upper/lower chars
beq printCSTR1
patchSTR1 stal ptrSCREEN,x
inx
iny
bne ]lp
printCSTR1 rep #$20
rts
printCINV ldx #0 ; yes, print in inverse
sep #$20
]lp lda |$0000,y
beq printCINV4
cmp #"a"
bcc printCINV2
and #mask7F ; mask %01111111
hex 2c
printCINV2 and #mask3F ; mask %00111111
patchSTR2 stal ptrSCREEN,x ; for uppercase
inx
iny
bne ]lp
printCINV4 rep #$20
rts
*----------
* drawFRAME
*
* Input:
* A/X/Y: not used
* Output:
* A/X/Y: scrambled
*
drawFRAME ldx #40-2 ; show strings
]lp lda strHEADER,x
stal $400,x
lda strHEADER+40,x
stal $480,x
lda strHEADER+80,x
stal $500,x
lda strLINE,x
stal $580,x
stal $600,x
stal $680,x
stal $700,x
stal $780,x
stal $428,x
stal $4a8,x
stal $528,x
stal $5a8,x
stal $628,x
stal $6a8,x
stal $728,x
stal $7a8,x
stal $450,x
stal $4d0,x
stal $550,x
stal $5d0,x
stal $650,x
stal $6d0,x
lda strFOOTER,x
stal $750,x
lda strFOOTER+40,x
stal $7d0,x
dex
dex
bpl ]lp
rts
*----------
* readKEY
* checkUPDOWN
*
* Input:
* A/X/Y: not used
* Output:
* A: key pressed
* X/Y: unchanged
*
readKEY sep #$20
]lp ldal KBD ; wait for a key
bpl ]lp
stal KBDSTROBE
cmp #chrLARROW
beq readKEYOK
cmp #chrDARROW
beq readKEYOK
cmp #chrUARROW
beq readKEYOK
cmp #chrRETURN
beq readKEYOK
cmp #chrRARROW
beq readKEYOK
cmp #chrESCAPE
bne ]lp
readKEYOK rep #$20
rts
*----------------------------
* No card page
*----------------------------
doNOCARD ldx #40-2
]lp lda strNOAS,x ; no card detected!!!!
stal $5a8,x
dex
dex
bpl ]lp
jsr readKEY ; Wait for a key
jmp doQUIT ; exit!!!
*----------------------------
* DATA - ALL THE DATA
*----------------------------
*----------
* STRINGS
*----------
* asc "0 1 2 3 "
* asc "0123456789012345678901234567890123456789"
strHEADER asc " ______________________________________ " ; line 0
asc 'Z' ; line 1
asc " AppleSqueezer "
asc ' _'
asc 'ZLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL_' ; line 2
strLINE asc 'Z' ; all other lines
asc " "
asc '_'
strFOOTER asc 'Z' ; line 22
asc " Select: "
asc 'H'
asc " "
asc 'U'
asc " "
asc 'J'
asc " "
asc 'K'
asc " Cancel:Esc Open: "
asc 'M'
asc " "
asc '_'
asc " " ; line 23
asc 'LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL'
asc " "
strNOAS asc 'Z'
asc " No AppleSqueezer detected! "
asc '_'
*--- Strings
strACCEL asc "Acceleration:"00
strBIRAM asc "Built-in RAM:"00
strEXRAM asc "Extra RAM :"00
strENABLED asc "Enabled"00
strDISABLED asc "Disabled"00
valACCEL ds 2
valBIRAM ds 2
valEXRAM ds 2
theMENU ds 2 ; default entry is 0
*--- Coordinates
*
*strCOORDX dfb 8,8,8
*strCOORDY dfb 5,6,7
*
*optCOORDX dfb 23,23,23
*optCOORDY dfb 5,6,7
*
*----------
ptrTEXT dw $400,$480,$500,$580,$600,$680,$700,$780
dw $428,$4a8,$528,$5a8,$628,$6a8,$728,$7a8
dw $450,$4d0,$550,$5d0,$650,$6d0,$750,$7d0
CH ds 2 ; $00 - 2 - cursor horizontal position
CV ds 2 ; $01 - 2 - cursor vertical position
INVFLG dw $ffff ; $02 - 2 - 7F: inverse, FF: normal
*---------- The low-level routines
put as.s

216
applesqueezer/misc/AS.S Normal file
View File

@ -0,0 +1,216 @@
*
* AppleSqueezer in 16-bit assembly
*
* (c) 2022, Niek van Suchtelen
* (a) 2022, Brutal Deluxe Software
*
mx %00
lst off
*-----------------------------------
* SPI FLASH OPERATIONS
*-----------------------------------
*-----------
isAppleSqueezer
ldal FL_IDLE
and #$ff
cmp #TRUE ; if AS is present
rts
*-----------
coreVersion
ldal FL_VERSION
and #$ff
rts
*-----------
chipSelect
sep #$20 ; 8-bit A
stal FL_CS
rep #$20 ; 16-bit A
rts
*-----------
waitIdle
ldal FL_IDLE
and #$ff
beq waitIdle
rts
*-----------
waitReadReady
ldal FL_READY
and #$ff
beq waitReadReady
rts
*-----------
flashWrite
sep #$20 ; 8-bit A
stal FL_WRITE
rep #$20 ; 16-bit A
jmp waitIdle
*-----------
flashRead
jsr waitIdle
sep #$20
lda #0
stal FL_READ_REQUEST
rep #$20
jsr waitIdle
jsr waitReadReady
ldal FL_READ
and #$ff
rts
*-----------
writeEnable
lda #0
jsr chipSelect
lda #CMD_WRITE_ENABLE
jsr flashWrite
lda #1
jmp chipSelect
*-----------
* before sectorErase, call writeEnable
sectorErase
lda #0
jsr chipSelect
lda #CMD_SECTOR_ERASE
jsr flashWrite
lda #$0f ; sector 15: 000F 0000 - 000F EFFF
jsr flashWrite
lda #0
jsr flashWrite
lda #0
jsr flashWrite
lda #1
jmp chipSelect
*-----------
* before bulkErase, call writeEnable
bulkErase
lda #0
jsr chipSelect
lda #CMD_BULK_ERASE
jsr flashWrite
lda #1
jmp chipSelect
*-----------
* before pageProgramSingle, call writeEnable
pageProgramSingle
pha ; save data
lda #0
jsr chipSelect
lda #CMD_PAGE_PROGRAM
jsr flashWrite
* address
lda #$0f ; sector 15: 000F 0000 - 000F EFFF
jsr flashWrite
lda #0
jsr flashWrite
lda #0
jsr flashWrite
* data
pla ; restore data
jsr flashWrite
lda #1
jmp chipSelect
*----------- TO DO - Use the stack I think
* before pageProgram, call writeEnable
pageProgram
rts
*-----------
readStateRegister
lda #0
jsr chipSelect
lda #CMD_READ_STATUS_REGISTER
jsr flashWrite
jsr flashRead
pha
lda #1
jsr chipSelect
pla
rts
*-----------
writeInProgress
jsr readStateRegister ; WIP - write in progress bit
and #%00000000_00000001 ; if 1, write is in progress
cmp #TRUE
rts ; return TRUE if write is in progress
*-----------
writeEnabled
jsr readStateRegister ; WEL - write enable latch bit
and #%00000000_00000010 ; if 1, write is enabled
lsr ; move bit 1 in bit 0 for comparison
cmp #TRUE
rts ; return TRUE is write is enabled
*-----------
readDataBytes
pha ; save address
lda #0
jsr chipSelect
lda #CMD_READ_DATA_BYTES
jsr flashWrite
* address
lda #$0f ; sector 15: 000F 0000 - 000F EFFF
jsr flashWrite
lda #0
jsr flashWrite
pla ; restore address
jsr flashWrite
* read data
jsr flashRead
pha
lda #1
jsr chipSelect
pla
rts
*-----------
loadValues
lda #0 ; read byte at address $0F/0000
jsr readDataBytes
sta data
rts
*-----------
storeValues
jsr writeEnable
]lp jsr writeEnabled ; FALSE if not possible to write
bne ]lp
jsr sectorErase
]lp jsr writeInProgress ; TRUE if write in progress
beq ]lp
jsr writeEnable
]lp jsr writeEnabled ; FALSE if not possible to write
bne ]lp
lda data
jsr pageProgramSingle ; CDA/NDA harmonization
]lp jsr writeInProgress ; TRUE if write in progress
beq ]lp
rts
*----------- DATA
data ds 2

View File

@ -0,0 +1,546 @@
*
* 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

View File

@ -0,0 +1,102 @@
*
* MountIt: equates
*
* (c) 2009, Brutal Deluxe Software
*
*-----------------------------------
* APPLESQUEEZER EQUATES
*-----------------------------------
* data
* bit 0: 1 if Acceralation is enabled
* bit 1: 1 if Built-RAM is enabled
* bit 2: 1 if Extra RAM is enabled
* bit 3-7: values unknown
FL_WRITE = $e20000
FL_READ_REQUEST = $e20002
FL_READ = $e20004
FL_CS = $e20006
FL_READY = $e20008
FL_IDLE = $e2000a
FL_VERSION = $e2000c
CMD_WRITE_ENABLE = $06
CMD_WRITE_DISABLE = $04
CMD_PAGE_PROGRAM = $02
CMD_SECTOR_ERASE = $d8
CMD_BULK_ERASE = $c7
CMD_READ_DATA_BYTES = $03
CMD_READ_STATUS_REGISTER = $05
exdram_address_set_main_bank = $e30000 ; 00..0E
exdram_address_set_addr_low = $e30002 ; 00/00xx
exdram_address_set_addr_high = $e30004 ; 00/xx00
exdram_address_set_addr_bank = $e30006 ; xx/0000
exdram_address_access = $e30008 ; R/W auto-increment to end of main bank
TRUE = 1
FALSE = 0
minVERSION = 7 ; minimum core version to handle the driver
*-----------------------------------
* GS/OS EQUATES
*-----------------------------------
GSOS2 = $E100B0
MOVE_INFO = $01FC70
SET_DISKSW = $01FC90
uncertainBlockCountBit = $8000
diskSwitchedBit = $0001
diskInDriveBit = $0010
diskModifyBit = $0100
dftRAMDISK = $000e ; device ID for RAM/ROM disks
dchar = $08
dblockcount = $0a
ddeviceid = $34
ddevnumber = $3e
*-----------------------------------
* AS DRIVER EQUATES
*-----------------------------------
maxIMAGES = 1 ; no more than N images
blockSIZE = 512 ; ProDOS 8 block size
maxBLOCKP = 65536 ; 65536 blocks for ProDOS 8
maxBLOCKH = 491520 ; 491520 blocks for HFS
* 8 1000 => 8 1000 RAM or ROM disk
* B 1011 => B 1011 restartable + not speed dependent
* E 1110 => E 1110 block device | write allowed | read allowed
* 8 1000 => 8 1000 format allowed
dftCHAR = $8BE8 ; default characteristics 8FE8
dftVERSION = $1000 ; v1
*-----------------------------------
* GS/OS DIRECT PAGE
*-----------------------------------
deviceNum = $00
callNum = $02
bufferPtr = $04
statusListPtr = $04
controlListPtr = $04
requestCount = $08
transferCount = $0C
blockNum = $10
blockSize = $14
FSTNum = $16 ; *
statusCode = $16 ; *
controlCode = $16 ; *
volumeID = $18
cachePriority = $1A
cachePointer = $1C
dibPointer = $20

View File

@ -0,0 +1,119 @@
*
* AppleSqueezer - Equates
*
* (c) 2023, Niek Van Suchtelen
* (c) 2023, Brutal Deluxe Software
*
*-----------------------------------
* APPLESQUEEZER EQUATES
*-----------------------------------
* data
* bit 0: 1 if Acceralation is enabled
* bit 1: 1 if Built-RAM is enabled
* bit 2: 1 if Extra RAM is enabled
* bit 3-7: values unknown
FL_WRITE = $e20000
FL_READ_REQUEST = $e20002
FL_READ = $e20004
FL_CS = $e20006
FL_READY = $e20008
FL_IDLE = $e2000a
FL_VERSION = $e2000c
CMD_WRITE_ENABLE = $06
CMD_WRITE_DISABLE = $04
CMD_PAGE_PROGRAM = $02
CMD_SECTOR_ERASE = $d8
CMD_BULK_ERASE = $c7
CMD_READ_DATA_BYTES = $03
CMD_READ_STATUS_REGISTER = $05
exdram_address_set_main_bank = $e30000 ; 00..0E
exdram_address_set_addr_low = $e30002 ; 00/00xx
exdram_address_set_addr_high = $e30004 ; 00/xx00
exdram_address_set_addr_bank = $e30006 ; xx/0000
exdram_address_access = $e30008 ; R/W auto-increment to end of main bank
SD_ADDRESS_SET_MSB = $e40000
SD_ADDRESS_SET_MSB_1 = $e40002
SD_ADDRESS_SET_MSB_2 = $e40004
SD_ADDRESS_SET_MSB_3 = $e40006
SD_START_READ = $e40008 ; starts reading the sector (if it was idle)
SD_ACCESS = $e4000a
SD_START_WRITE = $e4000c ; starts writing the sector (if it was idle)
STA_NOINIT = 1 ; Drive not initialized
STA_NODISK = 2 ; No medium in the drive
TRUE = 1
FALSE = 0
minVERSION = 7 ; minimum core version to handle the driver
*--- Speed settings
* From 233 (3 MHz) to 255 (full speed)
* Setting is not preserved
AS_SPEED = $e50000 ; just write a speed byte
*-----------------------------------
* GS/OS EQUATES
*-----------------------------------
GSOS2 = $E100B0
MOVE_INFO = $01FC70
SET_DISKSW = $01FC90
uncertainBlockCountBit = $8000
diskSwitchedBit = $0001
diskInDriveBit = $0010
diskModifyBit = $0100
dftHDD = $0013 ; device ID for HDD (generic)
dchar = $08
dblockcount = $0a
ddeviceid = $34
ddevnumber = $3e
*-----------------------------------
* AS DRIVER EQUATES
*-----------------------------------
maxIMAGES = 1 ; no more than N images
blockSIZE = 512 ; ProDOS 8 block size
maxBLOCKS = $ffffffff ; that is a huge number of blocks
* 0 0000 => 0 0000
* B 1011 => B 1011 restartable + not speed dependent
* A 1010 => E 1110 block device | write allowed | read allowed
* 0 0000 => 8 1000 format allowed
dftCHAR = $0BA8 ; default characteristics 0BA8
dftVERSION = $1000 ; v1
*-----------------------------------
* GS/OS DIRECT PAGE
*-----------------------------------
deviceNum = $00
callNum = $02
bufferPtr = $04
statusListPtr = $04
controlListPtr = $04
requestCount = $08
transferCount = $0C
blockNum = $10
blockSize = $14
FSTNum = $16 ; *
statusCode = $16 ; *
controlCode = $16 ; *
volumeID = $18
cachePriority = $1A
cachePointer = $1C
dibPointer = $20

View File

@ -0,0 +1,398 @@
*
* AppleSqueezer - SD Driver
*
* (c) 2023, Niek Van Suchtelen
* (c) 2023, Brutal Deluxe Software
*
* v1.0 (202304) - AV
* Reads a sector
* Type must be $BB
* Auxtype must be $0101
*
* v1.1 (202306) - AV
* Writes a sector too!
*
mx %00
rel
typ $bb
dsk ASSDDriver
use AS.EQUATES.S
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
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 blockNum+3
stal SD_ADDRESS_SET_MSB
lda blockNum+2
stal SD_ADDRESS_SET_MSB_1
lda blockNum+1
stal SD_ADDRESS_SET_MSB_2
lda blockNum
stal SD_ADDRESS_SET_MSB_3
lda #1
stal SD_START_READ
ldx nbPAGES ; number of 512-byte pages to copy
dr2 ldy #0 ; read one block
sep #$20
]lp ldal SD_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 blockNum+3
stal SD_ADDRESS_SET_MSB
lda blockNum+2
stal SD_ADDRESS_SET_MSB_1
lda blockNum+1
stal SD_ADDRESS_SET_MSB_2
lda blockNum
stal SD_ADDRESS_SET_MSB_3
lda #1
stal SD_START_WRITE
ldx nbPAGES ; number of 512-byte pages to copy
dw2 ldy #0 ; read one block
sep #$20
]lp lda [bufferPtr],y
stal SD_ACCESS
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 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 SGet ; 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 #maxBLOCKS
sta [statusListPtr],y
iny
iny
lda #^maxBLOCKS
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
*
* 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 CNada ; 1 FormatDevice
da CNada ; 2 EjectMedium
da CSet ; 3 SetConfigParameters
da CSet ; 4 SetWaitStatus
da CSet ; 5 SetFormatOptions
da CNada ; 6 AssignPartitionOwner
da CNada ; 7 ArmSignal
da CNada ; 8 DisarmSignal
da CNada ; 9 SetPartitionMap
CNada 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
* $0102_0400 =
*--- requestcount : $0200 => 1
*--- From a Block to a RAM address
ds4 lda requestCount+3 ; number of pages
and #$00ff ; to calculate
lsr
lda requestCount+1 ; $01020400 => $010204 => $8102
ror
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
*----------------------------
fgSTARTED ds 2 ; 0: not started, 1: started
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
ds 4 ; +0A block count
str 'ASSDDevice' ; +0E device name
ds 21 ; 32 - 12 = 20
dw $0000 ; +2E slot number
dw $0000 ; +30 unit number
dw dftVERSION ; +32 version
dw dftHDD ; +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

View File

@ -0,0 +1,288 @@
*
* Devices
* Show all connected devices
*
* (c) 2023, Brutal Deluxe Software
* Visit brutaldeluxe.fr
*
xc
xc
mx %00
rel
dsk devices.l
lst off
*----------
use 4/Int.Macs
use 4/Locator.Macs
use 4/Mem.Macs
use 4/Misc.Macs
use 4/Text.Macs
use 4/Util.Macs
Debut = $00
GSOS = $e100a8
*----------
dcREMOVE = $0004
dcONLINE = $0010
dcBLOCKDEVICE = $0080
maxDEVICES = 128
dcINQUIRY = $8012
doMODESELECT = $8015
dcMODESENSE6 = $801a
dcSTARTSTOP = $801b ; also eject/insert
dcREADCAPACITY = $8025
dcSUBCHANNEL = $8042
dcREADTOC = $8043
dcPATI = $8048
dcPAUSERESUME = $804b
dcMODESENSE10 = $805a
*----------
phk
plb
tdc
sta myDP
_TLStartUp
pha
_MMStartUp
pla
sta appID
ora #$0100
sta myID
_MTStartUp
_TextStartUp
_IMStartUp
pha
pha
PushLong #$010000
PushWord myID
PushWord #%11000000_00011100
PushLong #0
_NewHandle
phd
tsc
tcd
lda [3]
sta ptrBUFFER
ldy #2
lda [3],y
sta ptrBUFFER+2
pld
ply
sty haBUFFER
plx
stx haBUFFER+2
*----------
PushWord #$00FF
PushWord #$0080
_SetInGlobals
PushWord #$00FF
PushWord #$0080
_SetOutGlobals
PushWord #$00FF
PushWord #$0080
_SetErrGlobals
PushWord #0
PushLong #3
_SetInputDevice
PushWord #0
PushLong #3
_SetOutputDevice
PushWord #0
PushLong #3
_SetErrorDevice
PushWord #0
_InitTextDev
PushWord #1
_InitTextDev
PushWord #2
_InitTextDev
PushWord #$0c ; home
_WriteChar
*----------------------------
* MAIN MENU
*----------------------------
mainMENU = *
PushLong #strMAINMENU
_WriteCString
jsr pollDEVICES ; show CD-ROM devices
jsr waitFORKEY ; is it 0-9
jmp doQUIT
*--- Data
strMAINMENU asc 0d'Show devices'0d
asc '(c) 2023, Brutal Deluxe Software'0d00
*----------------------------
* QUIT PROGRAM
*----------------------------
doQUIT _IMShutDown
_TextShutDown
_MTShutDown
PushWord myID
_DisposeAll
PushWord appID
_MMShutDown
_TLShutDown
jsl GSOS
dw $2029
adrl proQUIT
brk $bd
*----------------------------
* POLL DEVICES
*----------------------------
pollDEVICES lda #1 ; start with device 1
sta proDINFO+2
]lp jsl GSOS ; do a DInfo
dw $202c
adrl proDINFO
bcc found
cmp #$0011 ; no more devices
bne loop
rts
loop inc proDINFO+2
bra ]lp
*---------- Show device
found lda proDINFO+8 ; not removable
and #dcBLOCKDEVICE
beq loop
jsr showDEVICEINFO
bra loop
*--- Sub routines
*
* x - $xxxx - .NAMEOFDEVICE
showDEVICEINFO
lda proDINFO+2
pha ; from a word to a string
pha
pha
_HexIt
PullLong strDEVID
PushLong #strDEV ; show the string
_WriteCString
*--- characteristics
lda proDINFO+8
pha ; from a word to a string
pha
pha
_HexIt
PullLong strDEVID
PushLong #strDEV ; show the string
_WriteCString
*--- name
lda devINFO1 ; from a STRL to a STR
xba
sta devINFO1
PushLong #devINFO2
_WriteString
PushWord #$0d
_WriteChar
rts
*---------- Data
strDEV asc '$'
strDEVID asc '0000 - '00
*----------------------------
* TEXT ROUTINES
*----------------------------
*---------- Wait for a key
waitFORKEY PushWord #0 ; wait for key
PushWord #1 ; echo char
_ReadChar
waitKEY1 lda 1,s ; check CR
and #$ff ; of typed
sta 1,s ; in char
cmp #$8d
beq waitKEY9
waitKEY8 PushWord #$0d ; return
_WriteChar
waitKEY9 pla ; restore entered char
rts
*----------------------------
* DATA
*----------------------------
proQUIT dw 2 ; pcount
ds 4 ; pathname
ds 2 ; flags
proDINFO dw 8 ; Parms for DInfo
ds 2 ; 02 device num
adrl devINFO ; 04 device name
ds 2 ; 08 characteristics
ds 4 ; 0A total blocks
ds 2 ; 0E slot number
ds 2 ; 10 unit number
ds 2 ; 12 version
ds 2 ; 14 device id
devINFO dw $0032 ; buffer size
devINFO1 db $00 ; length
devINFO2 db $00
devINFO3 ds $30 ; data
*----------
appID ds 2
myID ds 2
myDP ds 2
ptrBUFFER ds 4
haBUFFER ds 4