antoine-source/applesqueezer/cda/ascda.s
Antoine Vignau 8701131e17 AS WIP
All my Applesqueezer code...
2023-06-19 15:45:09 +02:00

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