Applecorn/applecorn.s

214 lines
5.5 KiB
ArmAsm

* APPLECORN.S
* (c) Bobbi 2021 GPLv3
*
* Load an Acorn BBC Micro ROM in aux memory and
* Provide an environment where it can run
*
* Assembled with the Merlin 8 v2.58 assembler on Apple II.
XC ; 65c02
ORG $4000 ; Load addr of loader in main memory
; Clear of first HGR frame buffer
* Monitor routines
BELL EQU $FBDD
PRBYTE EQU $FDDA
COUT1 EQU $FDED
CROUT EQU $FD8E
HOME EQU $FC58
AUXMOVE EQU $C311
XFER EQU $C314
* Monitor ZP locations
A1L EQU $3C
A1H EQU $3D
A2L EQU $3E
A2H EQU $3F
A4L EQU $42
A4H EQU $43
* Used by XFER
STRTL EQU $3ED
STRTH EQU $3EE
* Reset vector (2 bytes + 1 byte checksum)
RSTV EQU $3F2
* IRQ vector
A2IRQV EQU $3FE
* MLI entry point
MLI EQU $BF00
* IO Buffer for reading file (1024 bytes)
IOBUF0 EQU $0C00 ; For loading/saving, OSFILE, *.
IOBUF1 EQU $1000 ; Four open files for langs
IOBUF2 EQU $1400
IOBUF3 EQU $1800
IOBUF4 EQU $1C00
* 512 byte buffer sufficient for one disk block
BLKBUF EQU $9000 ; Can't use $400 as ProDOS uses
BLKBUFEND EQU $9200 ; 'hidden' bytes within screen
* 512 byte buffer for file copy (*COPY)
COPYBUF EQU $9200 ; File copy needs separate buffer
*COPYBUFEND EQU $9400
* Location of FDraw library in main memory
FDRAWADDR EQU $9400
* Address in aux memory where ROM will be loaded
AUXADDR EQU $8000
* Address in aux memory where the MOS shim is located
AUXMOS1 EQU $2000 ; Temp staging area in Aux
EAUXMOS1 EQU $5000 ; End of staging area
AUXMOS EQU $D000 ; Final location in aux LC
* Called by code running in main mem to invoke a
* routine in aux memory
XF2AUX MAC
LDX $C08B ; R/W LC RAM, bank 1
LDX $C08B
LDX #<]1
STX STRTL
LDX #>]1
STX STRTH
SEI ; Disable IRQ before XFER
SEC ; Use aux memory
BIT $FF58 ; Set V: use alt ZP and LC
JMP XFER
EOM
* Called by code running in aux mem to invoke a
* routine in main memory
XF2MAIN MAC
LDX STRTL
STX STRTBCKL
LDX STRTH
STX STRTBCKH
LDX #<]1
STX STRTL
LDX #>]1
STX STRTH
SEI ; Disable IRQ before XFER
TSX
STX $0101 ; Save alt SP
LDX $0100 ; Load main SP into X
CLC ; Use main mem
CLV ; Use main ZP and LC
JMP XFER
EOM
* Macro called on re-entry to aux memory
* Careful: This enables IRQ - not for use in ISR
ENTAUX MAC
LDX $0101 ; Recover alt SP
TXS
CLI ; Re-enable IRQ after XFER
LDX STRTBCKL
STX STRTL
LDX STRTBCKH
STX STRTH
EOM
* Macro called on re-entry to main memory
* Careful: This enables IRQ - not for use in ISR
ENTMAIN MAC
TXS ; Main SP already in X
LDX $C081 ; Bank in ROM
LDX $C081
CLI ; Re-enable IRQ after XFER
EOM
* Macro called on re-entry to aux memory
* For use in interrupt handlers (no CLI!)
IENTAUX MAC
LDX $0101 ; Recover alt SP
TXS
LDX STRTBCKL
STX STRTL
LDX STRTBCKH
STX STRTH
EOM
* Macro called on re-entry to main memory
* For use in interrupt handlers (no CLI!)
IENTMAIN MAC
TXS ; Main SP already in X
LDX $C081 ; Bank in ROM
LDX $C081
EOM
* Enable writing to main memory (for code running in aux)
WRTMAIN MAC
SEI ; Keeps IRQ handler easy
STA $C004 ; Write to main memory
EOM
* Go back to writing to aux (for code running in aux)
WRTAUX MAC
STA $C005 ; Write to aux memory
CLI ; Normal service resumed
EOM
* Manually enable AltZP (for code running in main)
ALTZP MAC
SEI ; Disable IRQ when AltZP on
LDA $C08B ; R/W LC bank 1
LDA $C08B
STA $C009 ; Alt ZP and LC
EOM
* Manually disable AltZP (for code running in main)
MAINZP MAC
STA $C008 ; Main ZP and LC
LDA $C081 ; Bank ROM back in
LDA $C081
CLI ; Turn IRQ back on
EOM
* Code is all included from PUT files below ...
* ... order matters!
PUT MAINMEM.LDR
PUT MAINMEM.MENU
PUT MAINMEM.FSEQU
PUT MAINMEM.INIT
PUT MAINMEM.SVC
PUT MAINMEM.PATH
PUT MAINMEM.WILD
PUT MAINMEM.LISTS
PUT MAINMEM.MISC
PUT AUXMEM.MOSEQU
PUT AUXMEM.INIT
PUT AUXMEM.VDU
PUT AUXMEM.GFX
PUT AUXMEM.HOSTFS
PUT AUXMEM.OSCLI
PUT AUXMEM.BYTWRD
PUT AUXMEM.CHARIO
PUT AUXMEM.MISC
* Automatically save the object file:
SAV APPLECORN