Applecorn/applecorn.s

307 lines
8.4 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
A3H EQU $41
2021-07-16 02:16:22 +00:00
A4L EQU $42
A4H EQU $43
* Other ZP locations
ISRL EQU $02 ; Used for ISR only
ISRH EQU $03 ; Used for ISR only
2023-01-05 00:28:21 +00:00
SHRZP EQU $56 ; 25 bytes, persistent, SHR code only
TMPZP EQU $56+25 ; Temp scratch space for routines
2021-07-16 02:16:22 +00:00
* 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, text colour reg
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
2023-01-16 23:42:04 +00:00
PUT AUXMEM.VERS
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
2022-12-30 00:17:05 +00:00
PUT MAINMEM.SHR
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