mirror of
https://github.com/mauiaaron/apple2.git
synced 2024-10-19 22:23:45 +00:00
206 lines
8.2 KiB
C
206 lines
8.2 KiB
C
/*
|
|
* Apple // emulator for *ix
|
|
*
|
|
* This software package is subject to the GNU General Public License
|
|
* version 3 or later (your choice) as published by the Free Software
|
|
* Foundation.
|
|
*
|
|
* Copyright 2013-2015 Aaron Culliney
|
|
*
|
|
*/
|
|
|
|
#ifndef _VM_H_
|
|
#define _VM_H_
|
|
|
|
/* ----------------------------------------------------------------------------
|
|
Apple //e 64K VM
|
|
|
|
(Two byte addresses are represented with least significant
|
|
byte first, e.g. address FA59 is represented as 59 FA)
|
|
|
|
This is not meant to be definitive.
|
|
Verify against _Understanding the Apple IIe_ by Jim Sather
|
|
|
|
Address Description
|
|
----------- -----------
|
|
0000 - 00FF Zero page RAM
|
|
0100 - 01FF Stack
|
|
0200 - 03EF RAM
|
|
03F0 - 03F1 Address for BRK instruction (normally 59 FA = FA59)
|
|
03F2 - 03F3 Soft entry vector (normally BF 9D = 9DBF)
|
|
03F4 Power-up byte
|
|
03F5 - 03F7 Jump instruction to the subroutine which handles
|
|
Applesoft II &-commands (normally 4C 58 FF = JMP FF58)
|
|
03F8 - 03FA Jump instruction to the subroutine which handles User
|
|
CTRL-Y commands (normally 4C 65 FF = JMP FF65)
|
|
03FB - 03FD Jump instruction to the subroutine which handles
|
|
Non-Maskable Interrupts (NMI) (normally 4C 65 FF = JMP FF65)
|
|
03FE - 03FF Address of the subroutine which handles Interrupt
|
|
ReQuests (IRQ) (normally 65 FF = FF65)
|
|
0400 - 07FF Basically primary video text page
|
|
0478 - 047F I/O Scratchpad RAM Addresses for Slot 0 - 7
|
|
04F8 - 04FF - " " -
|
|
0578 - 057F - " " -
|
|
05F8 - 05FF - " " -
|
|
0678 - 067F - " " -
|
|
06F8 - 06FF - " " -
|
|
0778 - 077F - " " -
|
|
07F8 - 07FF - " " -
|
|
05F8 Holds the slot number of the disk controller card from
|
|
which DOS was booted. ??? VERIFY...
|
|
07F8 Holds the slot number (CX, X = Slot #) of the slot that
|
|
is currently active. ??? VERIFY...
|
|
0800 - 0BFF Secondary video text page
|
|
0C00 - 1FFF Plain RAM
|
|
2000 - 3FFF Primary video hires page (RAM)
|
|
4000 - 5FFF Secondary video hires page (RAM)
|
|
6000 - BFFF Plain RAM (Normally the OS is loaded into ~9C00 - BFFF)
|
|
C000 - C00F Keyboard data (C00X contains the character ASCII code of
|
|
the pressed key. The value is available at any C00X address)
|
|
C010 - C01F Clear Keyboard strobe
|
|
C020 - C02F Cassette output toggle
|
|
C030 - C03F Speaker toggle
|
|
C040 - C04F Utility strobe
|
|
C050 Set graphics mode
|
|
C051 Set text mode
|
|
C052 Set all text or graphics
|
|
C053 Mix text and graphics
|
|
C054 Display primary page
|
|
C055 Display secondary page
|
|
C056 Display low-res graphics
|
|
C057 Display hi-res graphics
|
|
C058 - C05F Annunciator outputs
|
|
C060 Cassette input
|
|
C061 - C063 Pushbutton inputs (button 1, 2 and 3)
|
|
C064 - C067 Game controller inputs
|
|
C068 - C06F Same as C060 - C067
|
|
C070 - C07F Game controller strobe
|
|
C080 - C08F Slot 0 I/O space (usually a language card)
|
|
C080 Reset language card
|
|
* Read enabled
|
|
* Write disabled
|
|
* Read from language card
|
|
C081 --- First access
|
|
* Read mode disabled
|
|
* Read from ROM
|
|
--- On second+ access
|
|
* Write mode enabled
|
|
* Write to language card
|
|
C082 --- (Disable language card)
|
|
* Read mode disabled
|
|
* Write mode disabled
|
|
* Read from ROM
|
|
C083 --- First access
|
|
* Read mode enabled
|
|
* Read from language card
|
|
--- On second+ access
|
|
* Write mode enabled
|
|
* Write to language card
|
|
C088 - C08B Same as C080 - C083, but switch to second bank, i.e.
|
|
map addresses D000-DFFF to other 4K area.
|
|
C100 - C1FF Slot 1 PROM
|
|
C200 - C2FF Slot 2 PROM
|
|
C300 - C3FF Slot 3 PROM
|
|
C400 - C4FF Slot 4 PROM
|
|
C500 - C5FF Slot 5 PROM
|
|
C600 - C6FF Slot 6 PROM
|
|
C700 - C7FF Slot 7 PROM
|
|
C800 - CFFF Expansion ROM (for peripheral cards)
|
|
CFFF Disable access to expansion ROM for
|
|
ALL peripheral cards.
|
|
D000 - DFFF ROM or 4K RAM if language card is enabled. However,
|
|
there are TWO 4K banks that can be mapped onto addresses
|
|
D000 - DFFF. See C088 - C08B.
|
|
E000 - FFFF ROM or 8K RAM if language card is enabled.
|
|
---------------------------------------------------------------------------- */
|
|
|
|
#if !defined(__ASSEMBLER__)
|
|
|
|
// 128k bank-switched main memory
|
|
extern uint8_t apple_ii_64k[2][65536];
|
|
|
|
// language card memory and settings
|
|
extern uint8_t language_card[2][8192];
|
|
extern uint8_t language_banks[2][8192];
|
|
|
|
void vm_initialize(void);
|
|
|
|
extern bool vm_saveState(StateHelper_s *helper);
|
|
extern bool vm_loadState(StateHelper_s *helper);
|
|
|
|
#if VM_TRACING
|
|
void vm_trace_begin(const char *vm_file);
|
|
void vm_trace_end(void);
|
|
void vm_trace_toggle(const char *vm_file);
|
|
bool vm_trace_is_ignored(uint16_t ea);
|
|
#endif
|
|
|
|
void vm_printSoftwitches(FILE *fp, bool output_mem, bool output_pseudo);
|
|
#endif // !defined(__ASSEMBLER__)
|
|
|
|
// softswitch flag bits
|
|
// SHIFT macros are for generating 0x80 or 0x00 bytes
|
|
|
|
#define SS_TEXT 0x00000001
|
|
#define SS_TEXT_SHIFT <<7
|
|
|
|
#define SS_MIXED 0x00000002
|
|
#define SS_MIXED_SHIFT <<6
|
|
|
|
#define SS_HIRES 0x00000004
|
|
#define SS_HIRES_SHIFT <<5
|
|
|
|
#define SS_PAGE2 0x00000008
|
|
#define SS_PAGE2_SHIFT <<4
|
|
|
|
#define SS_BANK2 0x00000010
|
|
#define SS_BANK2_SHIFT <<3
|
|
|
|
#define SS_LCRAM 0x00000020
|
|
#define SS_LCRAM_SHIFT <<2
|
|
|
|
#define SS_LCSEC 0x00000040 // Pseudo-softswitch : enabled if 2+ reads have occurred
|
|
#define SS_LCWRT 0x00000080 // Pseudo-softswitch : LC write enable
|
|
|
|
#define SS_80STORE 0x00000100
|
|
#define SS_80STORE_SHFT >>1
|
|
|
|
#define SS_80COL 0x00000200
|
|
#define SS_80COL_SHIFT >>2
|
|
|
|
#define SS_RAMRD 0x00000400
|
|
#define SS_RAMRD_SHIFT >>3
|
|
|
|
#define SS_RAMWRT 0x00000800
|
|
#define SS_RAMWRT_SHIFT >>4
|
|
|
|
#define SS_ALTZP 0x00001000
|
|
#define SS_ALTZP_SHIFT >>5
|
|
|
|
#define SS_DHIRES 0x00002000
|
|
#define SS_DHIRES_SHIFT >>6
|
|
|
|
#define SS_IOUDIS 0x00004000
|
|
#define SS_IOUDIS_SHIFT >>7
|
|
|
|
#define SS_CXROM 0x00008000
|
|
#define SS_CXROM_SHIFT >>8
|
|
|
|
#define SS_C3ROM 0x00010000
|
|
|
|
#define SS_ALTCHAR 0x00020000
|
|
#define SS_ALTCHAR_SHFT >>10
|
|
|
|
// Pseudo soft switches. These are actually functions of other SSes, but are tiresome to calculate as needed.
|
|
#define SS_SCREEN 0x00040000 /* PAGE2 && !80STORE */
|
|
#define SS_TEXTRD 0x00080000 /* (PAGE2 && 80STORE) ||
|
|
(RAMRD && !80STORE) */
|
|
#define SS_TEXTWRT 0x00100000 /* (PAGE2 && 80STORE) ||
|
|
(RAMWRT && !80STORE) */
|
|
#define SS_HGRRD 0x00200000 /* (PAGE2 && 80STORE && HIRES) ||
|
|
(RAMRD && !(80STORE && HIRES) */
|
|
#define SS_HGRWRT 0x00400000 /* (PAGE2 && 80STORE && HIRES) ||
|
|
(RAMWRT && !(80STORE && HIRES)) */
|
|
|
|
#endif // whole file
|