mirror of
https://github.com/antoinevignau/source.git
synced 2024-06-11 19:29:31 +00:00
AS WIP
All my Applesqueezer code...
This commit is contained in:
parent
99610b5710
commit
8701131e17
484
applesqueezer/cda/ascda.s
Normal file
484
applesqueezer/cda/ascda.s
Normal 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
216
applesqueezer/misc/AS.S
Normal 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
|
546
applesqueezer/ramdisk/AS.DRIVER.S
Normal file
546
applesqueezer/ramdisk/AS.DRIVER.S
Normal 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
|
102
applesqueezer/ramdisk/AS.EQUATES.S
Normal file
102
applesqueezer/ramdisk/AS.EQUATES.S
Normal 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
|
||||||
|
|
119
applesqueezer/sdcard/AS.EQUATES.S
Normal file
119
applesqueezer/sdcard/AS.EQUATES.S
Normal 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
|
||||||
|
|
398
applesqueezer/sdcard/ASSD.DRIVER.S
Normal file
398
applesqueezer/sdcard/ASSD.DRIVER.S
Normal 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
|
288
applesqueezer/sdcard/devices.s
Normal file
288
applesqueezer/sdcard/devices.s
Normal 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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user