mirror of
https://github.com/antoinevignau/source.git
synced 2024-11-19 22:31:52 +00:00
8701131e17
All my Applesqueezer code...
485 lines
7.9 KiB
ArmAsm
485 lines
7.9 KiB
ArmAsm
*
|
|
* 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
|