Applecorn/applecorn.s

299 lines
8.1 KiB
ArmAsm
Raw Normal View History

* APPLECORN.S
* (c) Bobbi 2021 GPLv3
*
* Load an Acorn BBC Micro ROM in aux memory and
2021-07-16 02:16:22 +00:00
* Provide an environment where it can run
*
* Assembled with the Merlin 8 v2.58 assembler on Apple II.
2021-07-16 02:16:22 +00:00
* 14-Oct-2021 XF2MAIN, ENTAUX no longer save/restore STRTL/STRTH.
XC ; 65c02
ORG $2000 ; Load addr of loader in main memory
2021-09-18 01:06:24 +00:00
; Clear of first HGR frame buffer
2021-07-16 02:16:22 +00:00
* Monitor routines
BELL EQU $FBDD
PRBYTE EQU $FDDA
COUT1 EQU $FDED
CROUT EQU $FD8E
2022-10-14 04:47:42 +00:00
IDROUTINE EQU $FE1F
HOME EQU $FC58
2021-07-16 02:16:22 +00:00
AUXMOVE EQU $C311
XFER EQU $C314
* Monitor ZP locations
A1L EQU $3C
A1H EQU $3D
A2L EQU $3E
A2H EQU $3F
A3L EQU $40 ; Used for ISR only
A3H EQU $41 ; Used for ISR only
2021-07-16 02:16:22 +00:00
A4L EQU $42
A4H EQU $43
* Used by XFER
STRTL EQU $3ED
STRTH EQU $3EE
* Apple II BREAK vector
BREAKV EQU $3F0
2021-07-16 02:16:22 +00:00
* Reset vector (2 bytes + 1 byte checksum)
RSTV EQU $3F2
PWRDUP EQU $3F4
2021-07-16 02:16:22 +00:00
* IRQ vector
A2IRQV EQU $3FE
* ProDOS Global Page equates
2021-07-16 02:16:22 +00:00
* MLI entry point
MLI EQU $BF00
* Device Addresses
DEVADR01 EQU $BF10
DEVADR32 EQU $BF26
* Device List
DEVNUM EQU $BF30
DEVCNT EQU $BF31
DEVLST EQU $BF32
* Date & time
PRODOSDATE EQU $BF90
PRODOSTIME EQU $BF92
* Machine ID byte
MACHID EQU $BF98
* Versioning bytes
IBAKVER EQU $BFFC
IVERSION EQU $BFFD
* System BitMap locations
P8BMAP0007 EQU $BF58
P8BMAP080F EQU $BF59
P8BMAP2027 EQU $BF5C
P8BMAP282F EQU $BF5D
P8BMAP3037 EQU $BF5E
P8BMAP383F EQU $BF5F
2021-07-16 02:16:22 +00:00
*Hardware I/O locations
KEYBOARD EQU $C000
80STOREOFF EQU $C000
80STOREON EQU $C001 ; Currently not used
RDMAINRAM EQU $C002
RDCARDRAM EQU $C003
WRMAINRAM EQU $C004
WRCARDRAM EQU $C005
SETSTDZP EQU $C008
SETALTZP EQU $C009
CLR80VID EQU $C00C
SET80VID EQU $C00D
CLRALTCHAR EQU $C00E
SETALTCHAR EQU $C00F
RDRAMRD EQU $C013
RDRAMWR EQU $C014
KBDSTRB EQU $C010
RDVBL EQU $C019
RD80VID EQU $C01F
TBCOLOR EQU $C022 ; GS-specific, used but commented out
NEWVIDEO EQU $C029 ; GS-specific, new video register
SPKR EQU $C030
CLOCKCTL EQU $C034 ; GS-specific, Clock control register
2022-12-25 04:18:03 +00:00
SHADOW EQU $C035 ; GS-specific, Shadow Register
CYAREG EQU $C036 ; GS-specific, CYA Register
GRON EQU $C050
TEXTON EQU $C051
FULLGR EQU $C052
MIXGRTXT EQU $C053 ; Currently not used
PAGE1 EQU $C054
PAGE2 EQU $C055
LORES EQU $C056 ; Currently not used
HIRES EQU $C057
AN0OFF EQU $C058
AN0ON EQU $C059
AN1OFF EQU $C05A
AN1ON EQU $C05B
AN2OFF EQU $C05C
AN2ON EQU $C05D
AN3OFF EQU $C05E
AN3ON EQU $C05F
BUTTON0 EQU $C061
BUTTON1 EQU $C062
ROMIN EQU $C081
LCBANK1 EQU $C08B
* 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
2021-07-16 02:16:22 +00:00
2021-07-29 00:47:26 +00:00
* 512 byte buffer sufficient for one disk block
2021-09-18 01:06:24 +00:00
BLKBUF EQU $9000 ; Can't use $400 as ProDOS uses
BLKBUFEND EQU $9200 ; 'hidden' bytes within screen
2021-07-16 02:16:22 +00:00
* 512 byte buffer for file copy (*COPY)
2021-09-18 01:06:24 +00:00
COPYBUF EQU $9200 ; File copy needs separate buffer
*COPYBUFEND EQU $9400
2021-09-22 02:05:42 +00:00
* Location of FDraw library in main memory
FDRAWADDR EQU $9400
* Location of FDraw library in main memory
FONTADDR EQU $A900
2021-07-16 02:16:22 +00:00
* Address in aux memory where ROM will be loaded
ROMAUXADDR EQU $8000
2021-07-16 02:16:22 +00:00
* 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
2021-07-16 02:16:22 +00:00
2021-08-01 00:37:18 +00:00
* Called by code running in main mem to invoke a
* routine in aux memory
XF2AUX MAC
SEI ; Disable IRQ before XFER
LDX LCBANK1 ; R/W LC RAM, bank 1
LDX LCBANK1
2021-08-14 05:18:35 +00:00
LDX #<]1
STX STRTL
LDX #>]1
STX STRTH
2021-08-01 00:37:18 +00:00
SEC ; Use aux memory
BIT RTSINSTR ; Set V: use alt ZP and LC
2021-08-01 00:37:18 +00:00
JMP XFER
2021-07-30 20:49:34 +00:00
EOM
2021-08-01 01:39:05 +00:00
* Called by code running in aux mem to invoke a
* routine in main memory
XF2MAIN MAC
SEI ; Disable IRQ before XFER
2021-08-14 05:18:35 +00:00
LDX #<]1
STX STRTL
LDX #>]1
STX STRTH
2021-08-01 00:19:15 +00:00
TSX
STX $0101 ; Save alt SP
LDX $0100 ; Load main SP into X
2021-08-01 01:39:05 +00:00
CLC ; Use main mem
CLV ; Use main ZP and LC
JMP XFER
2021-07-30 21:33:50 +00:00
EOM
2021-07-31 22:58:59 +00:00
* Macro called on re-entry to aux memory
* Careful: This enables IRQ - not for use in ISR
2021-07-31 22:58:59 +00:00
ENTAUX MAC
LDX $0101 ; Recover alt SP
TXS
CLI ; Re-enable IRQ after XFER
2021-07-30 21:33:50 +00:00
EOM
2021-07-31 22:58:59 +00:00
* Macro called on re-entry to main memory
* Careful: This enables IRQ - not for use in ISR
2021-07-31 21:33:08 +00:00
ENTMAIN MAC
TXS ; Main SP already in X
LDX ROMIN ; Bank in ROM
LDX ROMIN
CLI ; Re-enable IRQ after XFER
2021-07-31 21:33:08 +00:00
EOM
* Macro called on re-entry to aux memory
* For use in interrupt handlers (no CLI!)
IENTAUX MAC
LDX $0101 ; Recover alt SP
TXS
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 ROMIN ; Bank in ROM
LDX ROMIN
EOM
* Enable writing to main memory (for code running in aux)
WRTMAIN MAC
PHP
SEI ; Keeps IRQ handler easy
2022-12-18 23:42:54 +00:00
STZ WRMAINRAM ; Write to main memory
EOM
* Go back to writing to aux (for code running in aux)
WRTAUX MAC
2022-12-18 23:42:54 +00:00
STZ WRCARDRAM ; Write to aux memory
PLP ; Normal service resumed
EOM
2022-12-19 00:04:38 +00:00
* Enable reading from main memory (for code running in aux LC)
RDMAIN MAC
PHP
SEI ; Keeps IRQ handler easy
STZ RDMAINRAM ; Read from main memory
EOM
* Go back to reading from aux (for code running in aux LC)
RDAUX MAC
STZ RDCARDRAM ; Read from aux memory
PLP ; Normal service resumed
EOM
2022-12-12 01:55:23 +00:00
* Manually enable AltZP + Aux LC (for code running in main)
* Banks ROM out
ALTZP MAC
PHP
SEI ; Disable IRQ when AltZP on
LDA LCBANK1 ; R/W LC bank 1
LDA LCBANK1
2022-12-18 23:42:54 +00:00
STZ SETALTZP ; Alt ZP and LC
EOM
2022-12-12 01:55:23 +00:00
* Manually disable AltZP + Aux LC (for code running in main)
* Banks ROM in
MAINZP MAC
2022-12-18 23:42:54 +00:00
STZ SETSTDZP ; Main ZP and LC
LDA ROMIN ; Bank ROM back in
LDA ROMIN
PLP ; Turn IRQ back on
EOM
2021-07-30 20:49:34 +00:00
* Code is all included from PUT files below ...
* ... order matters!
2021-09-07 01:39:36 +00:00
PUT MAINMEM.LDR
PUT AUXMEM.MOSEQU
PUT AUXMEM.INIT
PUT AUXMEM.VDU
PUT AUXMEM.HGR
2022-12-22 17:19:20 +00:00
PUT AUXMEM.SHR
PUT AUXMEM.HOSTFS
2021-08-15 03:42:06 +00:00
PUT AUXMEM.OSCLI
PUT AUXMEM.BYTWRD
PUT AUXMEM.CHARIO
PUT AUXMEM.AUDIO
PUT AUXMEM.MISC
PUT MAINMEM.MENU
PUT MAINMEM.FSEQU
PUT MAINMEM.INIT
PUT MAINMEM.SVC
PUT MAINMEM.HGR
PUT MAINMEM.PATH
PUT MAINMEM.WILD
PUT MAINMEM.LISTS
PUT MAINMEM.MISC
PUT MAINMEM.AUDIO
2022-11-18 00:31:29 +00:00
PUT MAINMEM.ENSQ
2022-11-18 00:38:21 +00:00
PUT MAINMEM.ENSQFREQ
PUT MAINMEM.MOCK
2022-11-19 03:43:24 +00:00
PUT MAINMEM.MOCKFREQ
2022-12-21 04:21:37 +00:00
PUT MAINMEM.FONT8
* Automatically save the object file:
SAV APLCORN.SYSTEM
2021-09-07 03:43:42 +00:00