* 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 A4L EQU $42 A4H EQU $43 * 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 KBDSTRB EQU $C010 RDVBL EQU $C019 RD80VID EQU $C01F TBCOLOR EQU $C022 ; GS-specific, used but commented out SPKR EQU $C030 CLOCKCTL EQU $C034 ; GS-specific, Clock control 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 * LDX STRTL ; No longer needed * STX STRTBCKL ; $03E0-$03FF reserved for memory * LDX STRTH ; switching * 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 ; No longer needed * STX STRTL ; $03e0-$03FF reserved for memory * LDX STRTBCKH ; switching * 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 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 * LDX STRTBCKL ; No longer needed * 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 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 STA WRMAINRAM ; Write to main memory EOM * Go back to writing to aux (for code running in aux) WRTAUX MAC STA WRCARDRAM ; Write to aux memory PLP ; Normal service resumed EOM * Manually enable AltZP (for code running in main) ALTZP MAC PHP SEI ; Disable IRQ when AltZP on LDA LCBANK1 ; R/W LC bank 1 LDA LCBANK1 STA SETALTZP ; Alt ZP and LC EOM * Manually disable AltZP (for code running in main) MAINZP MAC STA 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.VDU PUT AUXMEM.GFX 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.GFX PUT MAINMEM.PATH PUT MAINMEM.WILD PUT MAINMEM.LISTS PUT MAINMEM.MISC PUT MAINMEM.AUDIO PUT MAINMEM.FREQ * Automatically save the object file: SAV APLCORN.SYSTEM