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

216 lines
3.2 KiB
ArmAsm

*
* 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