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

* 14-Oct-2021 XF2MAIN, ENTAUX no longer save/restore STRTL/STRTH.


            XC                ; 65c02
            ORG   $2000       ; 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
IDROUTINE   EQU   $FE1F
HOME        EQU   $FC58
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
A4L         EQU   $42
A4H         EQU   $43

* Other ZP locations
ISRL        EQU   $02         ; Used for ISR only
ISRH        EQU   $03         ; Used for ISR only
SHRZP       EQU   $56         ; 25 bytes, persistent, SHR code only
TMPZP       EQU   $56+25      ; Temp scratch space for routines

* Used by XFER
STRTL       EQU   $3ED
STRTH       EQU   $3EE

* Apple II BREAK vector
BREAKV      EQU   $3F0

* Reset vector (2 bytes + 1 byte checksum)
RSTV        EQU   $3F2
PWRDUP      EQU   $3F4

* IRQ vector
A2IRQV      EQU   $3FE

* ProDOS Global Page equates
* 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

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

* 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

* Location of FDraw library in main memory
FONTADDR    EQU   $A900

* Address in aux memory where ROM will be loaded
ROMAUXADDR  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
            SEI               ; Disable IRQ before XFER
            LDX   LCBANK1     ; R/W LC RAM, bank 1
            LDX   LCBANK1
            LDX   #<]1
            STX   STRTL
            LDX   #>]1
            STX   STRTH
            SEC               ; Use aux memory
            BIT   RTSINSTR    ; 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
            SEI               ; Disable IRQ before XFER
            LDX   #<]1
            STX   STRTL
            LDX   #>]1
            STX   STRTH
            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
            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   ROMIN       ; Bank in ROM
            LDX   ROMIN
            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
            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
            STZ   WRMAINRAM   ; Write to main memory
            EOM

* Go back to writing to aux (for code running in aux)
WRTAUX      MAC
            STZ   WRCARDRAM   ; Write to aux memory
            PLP               ; Normal service resumed
            EOM

* 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

* 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
            STZ   SETALTZP    ; Alt ZP and LC
            EOM

* Manually disable AltZP + Aux LC (for code running in main)
* Banks ROM in
MAINZP      MAC
            STZ   SETSTDZP    ; Main ZP and LC
            LDA   ROMIN       ; Bank ROM back in
            LDA   ROMIN
            PLP               ; Turn IRQ back on
            EOM

* Code is all included from PUT files below ...
* ... order matters!
            PUT   MAINMEM.LDR
            PUT   AUXMEM.MOSEQU
            PUT   AUXMEM.INIT
            PUT   AUXMEM.VERS
            PUT   AUXMEM.VDU
            PUT   AUXMEM.HGR
            PUT   AUXMEM.SHR
            PUT   AUXMEM.HOSTFS
            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.SHR
            PUT   MAINMEM.PATH
            PUT   MAINMEM.WILD
            PUT   MAINMEM.LISTS
            PUT   MAINMEM.MISC
            PUT   MAINMEM.AUDIO
            PUT   MAINMEM.ENSQ
            PUT   MAINMEM.ENSQFREQ
            PUT   MAINMEM.MOCK
            PUT   MAINMEM.MOCKFREQ
            PUT   MAINMEM.FONT8

* Automatically save the object file:
            SAV   APLCORN.SYSTEM


