mirror of https://github.com/trudnai/Steve2.git
606 lines
23 KiB
C
606 lines
23 KiB
C
//
|
|
// main.c
|
|
// 6502
|
|
//
|
|
// Created by Tamas Rudnai on 7/14/19.
|
|
// Copyright © 2019, 2020 Tamas Rudnai. All rights reserved.
|
|
//
|
|
// This file is part of Steve ][ -- The Apple ][ Emulator.
|
|
//
|
|
// Steve ][ is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// Steve ][ is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Steve ][. If not, see <https://www.gnu.org/licenses/>.
|
|
//
|
|
|
|
#ifndef __APPLE2_MMIO_H__
|
|
#define __APPLE2_MMIO_H__
|
|
|
|
|
|
#include <string.h>
|
|
|
|
#include "common.h"
|
|
#include "6502.h"
|
|
#include "disk.h"
|
|
#include "woz.h"
|
|
#include "speaker.h"
|
|
#include "paddle.h"
|
|
#include "6502_dis_utils.h"
|
|
|
|
|
|
typedef union address16_u {
|
|
uint16_t addr;
|
|
struct {
|
|
uint8_t offs;
|
|
uint8_t page;
|
|
};
|
|
} address16_t;
|
|
|
|
|
|
extern videoMode_t videoMode; // 40 col text, page 1
|
|
|
|
|
|
extern uint8_t Apple2_Dummy_Page[ 1 * PG ]; // Dummy Page to discard data
|
|
extern uint8_t Apple2_Dummy_RAM[ 64 * KB ]; // Dummy RAM to discard data
|
|
|
|
extern uint8_t INT_64K_ROM[ 64 * KB ]; // ROM C0, C8, D0, D8, E0, E8, F0, F8
|
|
extern uint8_t EXP_64K_ROM[ 64 * KB ]; // ROM C0, C8, D0, D8, E0, E8, F0, F8
|
|
|
|
extern uint8_t Apple2_64K_AUX[ 64 * KB ]; // 64K Expansion Memory
|
|
extern uint8_t Apple2_64K_RAM[ 64 * KB ]; // Main Memory
|
|
extern uint8_t Apple2_64K_MEM[ 64 * KB ]; // Shadow Copy of Memory (or current memory content)
|
|
|
|
//uint8_t * AUX_VID_RAM = Apple2_VID_AUX; // Pointer to Auxiliary Video Memory
|
|
extern uint8_t * const AUX; // Pointer to the Auxiliary Memory so we can use this from Swift
|
|
extern uint8_t * const RAM; // Pointer to the Main Memory so we can use this from Swift
|
|
extern uint8_t * const MEM; // Pointer to the Shadow Memory Map so we can use this from Swift
|
|
|
|
extern uint8_t * const RDLOMEM; // for Read $0000 - $BFFF (shadow memory)
|
|
extern uint8_t * WRZEROPG; // for Write $0000 - $0200 (shadow memory)
|
|
extern uint8_t * WRLOMEM; // for Write $0200 - $BFFF (shadow memory)
|
|
extern uint8_t * const RDHIMEM; // for Read / Write $0000 - $BFFF (shadow memory)
|
|
extern uint8_t * WRD0MEM; // for writing $D000 - $DFFF
|
|
extern uint8_t * WRHIMEM; // for writing $E000 - $FFFF
|
|
|
|
|
|
extern uint8_t writeState; // 1 if $C08D was written
|
|
|
|
|
|
#define INIT_MEMCFG { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
|
|
|
|
extern const MEMcfg_t initMEMcfg;
|
|
|
|
extern MEMcfg_t MEMcfg;
|
|
extern MEMcfg_t newMEMcfg;
|
|
|
|
extern void kbdInput ( uint8_t code );
|
|
extern void kbdPaste ( uint8_t code );
|
|
extern void kbdUp (void);
|
|
extern uint8_t getIO ( uint16_t ioaddr );
|
|
extern void setIO ( uint16_t ioaddr, uint8_t val );
|
|
|
|
extern void save_RAM(void);
|
|
|
|
#ifndef DISASSEMBLER
|
|
extern uint8_t getMEM ( uint16_t ioaddr );
|
|
extern uint16_t getMEM16 ( uint16_t ioaddr );
|
|
extern uint32_t getMEM32 ( uint16_t ioaddr );
|
|
|
|
extern void setMEM ( uint16_t ioaddr, uint8_t val );
|
|
extern void setMEM16 ( uint16_t ioaddr, uint16_t val );
|
|
extern void setMEM32 ( uint16_t ioaddr, uint32_t val );
|
|
extern void setMEMarray ( uint16_t addr, uint8_t * arr, int len );
|
|
|
|
extern void CALL( uint16_t addr );
|
|
extern void JUMP( uint16_t addr );
|
|
#endif
|
|
|
|
|
|
#define DEF_RAM_PAGE(mem,pg) \
|
|
(mem) + ((pg) << 8)
|
|
|
|
#define DEF_RAM_PAGE16(mem,pg) \
|
|
DEF_RAM_PAGE(mem, (pg) + 0x00), \
|
|
DEF_RAM_PAGE(mem, (pg) + 0x01), \
|
|
DEF_RAM_PAGE(mem, (pg) + 0x02), \
|
|
DEF_RAM_PAGE(mem, (pg) + 0x03), \
|
|
DEF_RAM_PAGE(mem, (pg) + 0x04), \
|
|
DEF_RAM_PAGE(mem, (pg) + 0x05), \
|
|
DEF_RAM_PAGE(mem, (pg) + 0x06), \
|
|
DEF_RAM_PAGE(mem, (pg) + 0x07), \
|
|
DEF_RAM_PAGE(mem, (pg) + 0x08), \
|
|
DEF_RAM_PAGE(mem, (pg) + 0x09), \
|
|
DEF_RAM_PAGE(mem, (pg) + 0x0A), \
|
|
DEF_RAM_PAGE(mem, (pg) + 0x0B), \
|
|
DEF_RAM_PAGE(mem, (pg) + 0x0C), \
|
|
DEF_RAM_PAGE(mem, (pg) + 0x0D), \
|
|
DEF_RAM_PAGE(mem, (pg) + 0x0E), \
|
|
DEF_RAM_PAGE(mem, (pg) + 0x0F)
|
|
|
|
|
|
#define SWITCH_VIDEO_RAM( tbl,tpg, mem,mpg ) \
|
|
(tbl)[ (tpg) + 0x00 ] = DEF_RAM_PAGE(mem, (mpg) + 0x00); \
|
|
(tbl)[ (tpg) + 0x01 ] = DEF_RAM_PAGE(mem, (mpg) + 0x01); \
|
|
(tbl)[ (tpg) + 0x02 ] = DEF_RAM_PAGE(mem, (mpg) + 0x02); \
|
|
(tbl)[ (tpg) + 0x03 ] = DEF_RAM_PAGE(mem, (mpg) + 0x03);
|
|
|
|
|
|
#define SWITCH_ROM_PAGE( tbl,tpg, mem,mpg ) \
|
|
(tbl)[ (tpg) ] = DEF_RAM_PAGE( mem, (mpg) );
|
|
|
|
|
|
#define SWITCH_STACK_ZP( tbl, mem ) \
|
|
(tbl)[ 0x00 ] = DEF_RAM_PAGE(mem, 0x00); \
|
|
(tbl)[ 0x01 ] = DEF_RAM_PAGE(mem, 0x01);
|
|
|
|
|
|
#define SWITCH_CX_ROM( tbl,tpg, mem,mpg ) \
|
|
/* (tbl)[ (tpg) + 0x00 ] = DEF_RAM_PAGE(mem, (mpg) + 0x00); */ \
|
|
(tbl)[ (tpg) + 0x01 ] = DEF_RAM_PAGE(mem, (mpg) + 0x01); \
|
|
(tbl)[ (tpg) + 0x02 ] = DEF_RAM_PAGE(mem, (mpg) + 0x02); \
|
|
(tbl)[ (tpg) + 0x03 ] = DEF_RAM_PAGE(mem, (mpg) + 0x03); \
|
|
(tbl)[ (tpg) + 0x04 ] = DEF_RAM_PAGE(mem, (mpg) + 0x04); \
|
|
(tbl)[ (tpg) + 0x05 ] = DEF_RAM_PAGE(mem, (mpg) + 0x05); \
|
|
(tbl)[ (tpg) + 0x06 ] = DEF_RAM_PAGE(mem, (mpg) + 0x06); \
|
|
(tbl)[ (tpg) + 0x07 ] = DEF_RAM_PAGE(mem, (mpg) + 0x07); \
|
|
(tbl)[ (tpg) + 0x08 ] = DEF_RAM_PAGE(mem, (mpg) + 0x08); \
|
|
(tbl)[ (tpg) + 0x09 ] = DEF_RAM_PAGE(mem, (mpg) + 0x09); \
|
|
(tbl)[ (tpg) + 0x0A ] = DEF_RAM_PAGE(mem, (mpg) + 0x0A); \
|
|
(tbl)[ (tpg) + 0x0B ] = DEF_RAM_PAGE(mem, (mpg) + 0x0B); \
|
|
(tbl)[ (tpg) + 0x0C ] = DEF_RAM_PAGE(mem, (mpg) + 0x0C); \
|
|
(tbl)[ (tpg) + 0x0D ] = DEF_RAM_PAGE(mem, (mpg) + 0x0D); \
|
|
(tbl)[ (tpg) + 0x0E ] = DEF_RAM_PAGE(mem, (mpg) + 0x0E); \
|
|
(tbl)[ (tpg) + 0x0F ] = DEF_RAM_PAGE(mem, (mpg) + 0x0F);
|
|
|
|
|
|
#define SWITCH_RAM_PAGE16( tbl,tpg, mem,mpg ) \
|
|
(tbl)[ (tpg) + 0x00 ] = DEF_RAM_PAGE(mem, (mpg) + 0x00); \
|
|
(tbl)[ (tpg) + 0x01 ] = DEF_RAM_PAGE(mem, (mpg) + 0x01); \
|
|
(tbl)[ (tpg) + 0x02 ] = DEF_RAM_PAGE(mem, (mpg) + 0x02); \
|
|
(tbl)[ (tpg) + 0x03 ] = DEF_RAM_PAGE(mem, (mpg) + 0x03); \
|
|
(tbl)[ (tpg) + 0x04 ] = DEF_RAM_PAGE(mem, (mpg) + 0x04); \
|
|
(tbl)[ (tpg) + 0x05 ] = DEF_RAM_PAGE(mem, (mpg) + 0x05); \
|
|
(tbl)[ (tpg) + 0x06 ] = DEF_RAM_PAGE(mem, (mpg) + 0x06); \
|
|
(tbl)[ (tpg) + 0x07 ] = DEF_RAM_PAGE(mem, (mpg) + 0x07); \
|
|
(tbl)[ (tpg) + 0x08 ] = DEF_RAM_PAGE(mem, (mpg) + 0x08); \
|
|
(tbl)[ (tpg) + 0x09 ] = DEF_RAM_PAGE(mem, (mpg) + 0x09); \
|
|
(tbl)[ (tpg) + 0x0A ] = DEF_RAM_PAGE(mem, (mpg) + 0x0A); \
|
|
(tbl)[ (tpg) + 0x0B ] = DEF_RAM_PAGE(mem, (mpg) + 0x0B); \
|
|
(tbl)[ (tpg) + 0x0C ] = DEF_RAM_PAGE(mem, (mpg) + 0x0C); \
|
|
(tbl)[ (tpg) + 0x0D ] = DEF_RAM_PAGE(mem, (mpg) + 0x0D); \
|
|
(tbl)[ (tpg) + 0x0E ] = DEF_RAM_PAGE(mem, (mpg) + 0x0E); \
|
|
(tbl)[ (tpg) + 0x0F ] = DEF_RAM_PAGE(mem, (mpg) + 0x0F);
|
|
|
|
|
|
#define SWITCH_AUX_MEM( tbl, mem ) \
|
|
(tbl)[ 0x02 ] = DEF_RAM_PAGE(mem, 0x02); \
|
|
(tbl)[ 0x03 ] = DEF_RAM_PAGE(mem, 0x03); \
|
|
(tbl)[ 0x04 ] = DEF_RAM_PAGE(mem, 0x04); \
|
|
(tbl)[ 0x05 ] = DEF_RAM_PAGE(mem, 0x05); \
|
|
(tbl)[ 0x06 ] = DEF_RAM_PAGE(mem, 0x06); \
|
|
(tbl)[ 0x07 ] = DEF_RAM_PAGE(mem, 0x07); \
|
|
(tbl)[ 0x08 ] = DEF_RAM_PAGE(mem, 0x08); \
|
|
(tbl)[ 0x09 ] = DEF_RAM_PAGE(mem, 0x09); \
|
|
(tbl)[ 0x0A ] = DEF_RAM_PAGE(mem, 0x0A); \
|
|
(tbl)[ 0x0B ] = DEF_RAM_PAGE(mem, 0x0B); \
|
|
(tbl)[ 0x0B ] = DEF_RAM_PAGE(mem, 0x0C); \
|
|
(tbl)[ 0x0B ] = DEF_RAM_PAGE(mem, 0x0D); \
|
|
(tbl)[ 0x0B ] = DEF_RAM_PAGE(mem, 0x0E); \
|
|
(tbl)[ 0x0B ] = DEF_RAM_PAGE(mem, 0x0F); \
|
|
SWITCH_RAM_PAGE16( tbl, 0x10, mem, 0x10 ); \
|
|
SWITCH_RAM_PAGE16( tbl, 0x20, mem, 0x20 ); \
|
|
SWITCH_RAM_PAGE16( tbl, 0x30, mem, 0x30 ); \
|
|
SWITCH_RAM_PAGE16( tbl, 0x40, mem, 0x40 ); \
|
|
SWITCH_RAM_PAGE16( tbl, 0x50, mem, 0x50 ); \
|
|
SWITCH_RAM_PAGE16( tbl, 0x60, mem, 0x60 ); \
|
|
SWITCH_RAM_PAGE16( tbl, 0x70, mem, 0x70 ); \
|
|
SWITCH_RAM_PAGE16( tbl, 0x80, mem, 0x80 ); \
|
|
SWITCH_RAM_PAGE16( tbl, 0x90, mem, 0x90 ); \
|
|
SWITCH_RAM_PAGE16( tbl, 0xA0, mem, 0xA0 ); \
|
|
SWITCH_RAM_PAGE16( tbl, 0xB0, mem, 0xB0 );
|
|
|
|
|
|
#define DEF_RAM_DUMMY16 \
|
|
Apple2_Dummy_Page, \
|
|
Apple2_Dummy_Page, \
|
|
Apple2_Dummy_Page, \
|
|
Apple2_Dummy_Page, \
|
|
Apple2_Dummy_Page, \
|
|
Apple2_Dummy_Page, \
|
|
Apple2_Dummy_Page, \
|
|
Apple2_Dummy_Page, \
|
|
Apple2_Dummy_Page, \
|
|
Apple2_Dummy_Page, \
|
|
Apple2_Dummy_Page, \
|
|
Apple2_Dummy_Page, \
|
|
Apple2_Dummy_Page, \
|
|
Apple2_Dummy_Page, \
|
|
Apple2_Dummy_Page, \
|
|
Apple2_Dummy_Page
|
|
|
|
#define DEF_RAM_NULL16 \
|
|
NULL, \
|
|
NULL, \
|
|
NULL, \
|
|
NULL, \
|
|
NULL, \
|
|
NULL, \
|
|
NULL, \
|
|
NULL, \
|
|
NULL, \
|
|
NULL, \
|
|
NULL, \
|
|
NULL, \
|
|
NULL, \
|
|
NULL, \
|
|
NULL, \
|
|
NULL
|
|
|
|
|
|
enum slot {
|
|
SLOT0 = 0x00,
|
|
SLOT1 = 0x10,
|
|
SLOT2 = 0x20,
|
|
SLOT3 = 0x30,
|
|
SLOT4 = 0x40,
|
|
SLOT5 = 0x50,
|
|
SLOT6 = 0x60,
|
|
SLOT7 = 0x70,
|
|
};
|
|
|
|
|
|
// https://www.kreativekorp.com/miscpages/a2info/iomemory.shtml
|
|
// Comp: O = Apple II+ E = Apple IIe C = Apple IIc G = Apple IIgs
|
|
// Act: R = Read W = Write 7 = Bit 7 V = Value
|
|
|
|
enum mmio {
|
|
// Keyboard
|
|
io_KBD = 0xC000, // OECG R Last Key Pressed + 128
|
|
io_KBDSTRB = 0xC010, // OECG WR Keyboard Strobe
|
|
|
|
// Audio
|
|
io_TAPEOUT = 0xC020, // OE R Toggle Cassette Tape Output (not on IIe PDS Card)
|
|
io_SPKR = 0xC030, // OECG R Toggle Speaker
|
|
|
|
// Video
|
|
io_80STOREOFF = 0xC000, // ECG W Use $C002-$C005 for Aux Memory
|
|
io_80STOREON = 0xC001, // ECG W Use PAGE2 for Aux Memory
|
|
|
|
io_RD80STORE = 0xC018, // ECG R7 Status of $C002-$C005/PAGE2 for Aux Mem
|
|
io_VID_CLR80VID = 0xC00C, // ECG W 40 Columns
|
|
io_VID_SET80VID = 0xC00D, // ECG W 80 Columns
|
|
io_VID_CLRALTCHAR = 0xC00E, // ECG W Primary Character Set
|
|
io_VID_SETALTCHAR = 0xC00F, // ECG W Alternate Character Set
|
|
io_VID_RDVBL = 0xC019, // E G R7 Vertical Blanking (E:1=drawing G:0=drawing) VSYNC
|
|
// RSTVBL C R Reset Vertical Blanking Interrupt
|
|
io_VID_RDTEXT = 0xC01A, // ECG R7 Status of Text/Graphics
|
|
io_VID_RDMIXED = 0xC01B, // ECG R7 Status of Full Screen/Mixed Graphics
|
|
io_VID_RDPAGE2 = 0xC01C, // ECG R7 Status of Page 1/Page 2
|
|
io_VID_RDHIRES = 0xC01D, // ECG R7 Status of LoRes/HiRes
|
|
io_VID_ALTCHAR = 0xC01E, // ECG R7 Status of Primary/Alternate Character Set
|
|
io_VID_RD80VID = 0xC01F, // ECG R7 Status of 40/80 Columns
|
|
io_VID_Text_OFF = 0xC050, // TODO: floating I/O --> actual character / byte displayed by video?
|
|
io_VID_Text_ON = 0xC051, // TODO: floating I/O --> actual character / byte displayed by video?
|
|
io_VID_Mixed_OFF = 0xC052, // TODO: floating I/O --> actual character / byte displayed by video?
|
|
io_VID_Mixed_ON = 0xC053, // TODO: floating I/O --> actual character / byte displayed by video?
|
|
io_VID_TXTPAGE1 = 0xC054, // OECG WR Display Page 1
|
|
io_VID_TXTPAGE2 = 0xC055, // OECG WR If 80STORE Off: Display Page 2
|
|
// ECG WR If 80STORE On: Read/Write Aux Display Mem
|
|
io_VID_Hires_OFF = 0xC056,
|
|
io_VID_Hires_ON = 0xC057,
|
|
|
|
io_TAPEIN = 0xC060, // OE R7 Read Cassette Input
|
|
// C R7 Status of 80/40 Column Switch
|
|
|
|
// Game Controller
|
|
io_STROBE = 0xC040,
|
|
io_CLRAN0 = 0xC058,
|
|
io_SETAN0 = 0xC059,
|
|
io_CLRAN1 = 0xC05A,
|
|
io_SETAN1 = 0xC05B,
|
|
io_CLRAN2 = 0xC05C,
|
|
io_SETAN2 = 0xC05D,
|
|
io_CLRAN3 = 0xC05E,
|
|
io_SETAN3 = 0xC05F,
|
|
|
|
io_PDL0 = 0xC064,
|
|
io_PDL1 = 0xC065,
|
|
io_PDL2 = 0xC066,
|
|
io_PDL3 = 0xC067,
|
|
io_PDL_STROBE = 0xC070,
|
|
|
|
// Disk ][
|
|
io_DISK_PHASE0_OFF = 0xC080,
|
|
io_DISK_PHASE0_ON = 0xC081,
|
|
io_DISK_PHASE1_OFF = 0xC082,
|
|
io_DISK_PHASE1_ON = 0xC083,
|
|
io_DISK_PHASE2_OFF = 0xC084,
|
|
io_DISK_PHASE2_ON = 0xC085,
|
|
io_DISK_PHASE3_OFF = 0xC086,
|
|
io_DISK_PHASE3_ON = 0xC087,
|
|
io_DISK_POWER_OFF = 0xC088,
|
|
io_DISK_POWER_ON = 0xC089,
|
|
io_DISK_SELECT_1 = 0xC08A,
|
|
io_DISK_SELECT_2 = 0xC08B,
|
|
io_DISK_READ = 0xC08C,
|
|
io_DISK_WRITE = 0xC08D,
|
|
io_DISK_CLEAR = 0xC08E,
|
|
io_DISK_SHIFT = 0xC08F,
|
|
|
|
// Memory
|
|
io_RDMAINRAM = 0xC002, // ECG W If 80STORE Off: Read Main Mem $0200-$BFFF
|
|
io_RDCARDRAM = 0xC003, // ECG W If 80STORE Off: Read Aux Mem $0200-$BFFF
|
|
io_WRMAINRAM = 0xC004, // ECG W If 80STORE Off: Write Main Mem $0200-$BFFF
|
|
io_WRCARDRAM = 0xC005, // ECG W If 80STORE Off: Write Aux Mem $0200-$BFFF
|
|
io_SETSLOTCXROM = 0xC006, // E G W Disable Internal ROM / Enable Peripheral ROM ($C100-$CFFF)
|
|
io_SETINTCXROM = 0xC007, // E G W Enable Internal ROM ($C100-$CFFF)
|
|
io_SETSTDZP = 0xC008, // ECG W Main Stack and Zero Page
|
|
io_SETALTZP = 0xC009, // ECG W Aux Stack and Zero Page
|
|
io_SETINTC3ROM = 0xC00A, // E G W ROM in Slot 3
|
|
io_SETSLOTC3ROM = 0xC00B, // E G W ROM in Aux Slot
|
|
|
|
io_RDLCBNK2 = 0xC011, // ECG R7 Status of Selected $Dx Bank
|
|
io_RDLCRAM = 0xC012, // ECG R7 Status of $Dx ROM / $Dx RAM (LC RAM)
|
|
io_RDRAMRD = 0xC013, // ECG R7 Status of Main/Aux RAM Reading (auxilliary 48K)
|
|
io_RDRAMWR = 0xC014, // ECG R7 Status of Main/Aux RAM Writing (auxilliary 48K)
|
|
|
|
io_RDCXROM = 0xC015, // E G R7 Read state of $C100-$CFFF soft switch -- Status of Periph/ROM Access
|
|
io_RSTXINT = 0xC015, // C R Reset Mouse X0 Interrupt
|
|
io_RDALTZP = 0xC016, // ECG R7 Status of Main/Aux Stack and Zero Page
|
|
io_RDC3ROM = 0xC017, // E G R7 Status of Slot 3/Aux Slot ROM
|
|
io_RSTYINT = 0xC017, // C R Reset Mouse Y0 Interrupt
|
|
|
|
io_MEM_RDRAM_NOWR_2 = 0xC080, // OECG WR Read RAM bank 2; no write
|
|
io_MEM_RDROM_WRAM_2 = 0xC081, // OECG RR Read ROM; write RAM bank 2
|
|
io_MEM_RDROM_NOWR_2 = 0xC082, // OECG WR Read ROM; no write
|
|
io_MEM_RDRAM_WRAM_2 = 0xC083, // OECG RR Read/write RAM bank 2
|
|
|
|
io_MEM_RDRAM_NOWR_2_ = 0xC084, // OECG WR Read RAM bank 2; no write
|
|
io_MEM_RDROM_WRAM_2_ = 0xC085, // OECG RR Read ROM; write RAM bank 2
|
|
io_MEM_RDROM_NOWR_2_ = 0xC086, // OECG WR Read ROM; no write
|
|
io_MEM_RDRAM_WRAM_2_ = 0xC087, // OECG RR Read/write RAM bank 2
|
|
|
|
io_MEM_RDRAM_NOWR_1 = 0xC088, // OECG WR Read RAM bank 1; no write
|
|
io_MEM_RDROM_WRAM_1 = 0xC089, // OECG RR Read ROM; write RAM bank 1
|
|
io_MEM_RDROM_NOWR_1 = 0xC08A, // OECG WR Read ROM; no write
|
|
io_MEM_RDRAM_WRAM_1 = 0xC08B, // OECG RR Read/write RAM bank 1
|
|
|
|
io_MEM_RDRAM_NOWR_1_ = 0xC08C, // OECG WR Read RAM bank 1; no write
|
|
io_MEM_RDROM_WRAM_1_ = 0xC08D, // OECG RR Read ROM; write RAM bank 1
|
|
io_MEM_RDROM_NOWR_1_ = 0xC08E, // OECG WR Read ROM; no write
|
|
io_MEM_RDRAM_WRAM_1_ = 0xC08F, // OECG RR Read/write RAM bank 1
|
|
};
|
|
|
|
|
|
#define PAGESIZE 256
|
|
#define PAGES 16
|
|
|
|
extern const uint8_t * const shadowLowMEM;
|
|
extern const uint8_t * currentLowRDMEM;
|
|
extern uint8_t * currentLowWRMEM;
|
|
|
|
extern uint8_t activeTextAuxPage;
|
|
extern uint8_t * activeTextPage;
|
|
extern uint8_t * shadowTextPage;
|
|
extern uint8_t * current_RAM_bank;
|
|
|
|
extern void auxMemorySelect( MEMcfg_t newMEMcfg );
|
|
//extern void (*auxMemorySelect)( MEMcfg_t newMEMcfg );
|
|
|
|
extern void C3MemorySelect( MEMcfg_t newMEMcfg );
|
|
extern void CxMemorySelect( MEMcfg_t newMEMcfg );
|
|
extern void resetMemory(void);
|
|
extern void initMemory(void);
|
|
extern inline uint8_t *extracted(void);
|
|
extern void textPageSelect(void);
|
|
|
|
INLINE void io_RAM_EXP( uint16_t addr );
|
|
INLINE uint8_t ioRead( uint16_t addr );
|
|
INLINE void ioWrite( uint16_t addr, uint8_t val );
|
|
INLINE uint8_t memread8_low( uint16_t addr );
|
|
INLINE uint8_t memread8_high( uint16_t addr );
|
|
INLINE uint8_t memread8( uint16_t addr );
|
|
INLINE uint16_t memread16_high( uint16_t addr );
|
|
INLINE uint16_t memread16_low( uint16_t addr );
|
|
INLINE uint16_t memread16( uint16_t addr );
|
|
INLINE uint8_t _memread( uint16_t addr );
|
|
INLINE uint8_t _memread_dbg( uint16_t addr );
|
|
INLINE uint8_t _memread_dis( uint16_t addr );
|
|
INLINE void _memwrite8_zp( uint16_t addr, uint8_t data );
|
|
INLINE void _memwrite8_low( uint16_t addr, uint8_t data );
|
|
INLINE void _memwrite8_bank( uint16_t addr, uint8_t data );
|
|
INLINE void _memwrite8_high( uint16_t addr, uint8_t data );
|
|
INLINE void _memwrite( uint16_t addr, uint8_t data );
|
|
INLINE uint8_t _fetch(void);
|
|
INLINE uint8_t _fetch_dis(void);
|
|
INLINE uint16_t _fetch16(void);
|
|
INLINE uint16_t _fetch16_dis(void);
|
|
INLINE uint16_t _addr_abs(void);
|
|
INLINE uint16_t _addr_abs_dbg(void);
|
|
INLINE uint16_t _addr_abs_dis(void);
|
|
INLINE uint8_t _src_abs(void);
|
|
INLINE uint8_t _src_abs_dbg(void);
|
|
INLINE uint8_t _src_abs_dis(void);
|
|
INLINE int8_t _rel_addr(void);
|
|
INLINE int8_t _rel_addr_dis(void);
|
|
INLINE uint16_t _abs_addr(void);
|
|
INLINE uint16_t _abs_addr_dis(void);
|
|
INLINE uint16_t _ind_addr(void);
|
|
INLINE uint16_t _ind_addr_dbg(void);
|
|
INLINE uint16_t _ind_addr_dis(void);
|
|
INLINE uint16_t _addr_abs_X(void);
|
|
INLINE uint16_t _addr_abs_X_dbg(void);
|
|
INLINE uint16_t _addr_abs_X_dis(void);
|
|
INLINE uint16_t _abs_addr_X(void);
|
|
INLINE uint16_t _abs_addr_X_dis(void);
|
|
INLINE uint8_t _src_abs_X(void);
|
|
INLINE uint8_t _src_abs_X_dbg(void);
|
|
INLINE uint8_t _src_abs_X_dis(void);
|
|
INLINE uint16_t _addr_abs_Y(void);
|
|
INLINE uint16_t _addr_abs_Y_dbg(void);
|
|
INLINE uint16_t _addr_abs_Y_dis(void);
|
|
INLINE uint8_t _src_abs_Y(void);
|
|
INLINE uint8_t _src_abs_Y_dbg(void);
|
|
INLINE uint8_t _src_abs_Y_dis(void);
|
|
INLINE uint8_t _imm(void);
|
|
INLINE uint8_t _imm_dis(void);
|
|
INLINE uint8_t _addr_zp(void);
|
|
INLINE uint8_t _addr_zp_dbg(void);
|
|
INLINE uint8_t _addr_zp_dis(void);
|
|
INLINE uint8_t _src_zp(void);
|
|
INLINE uint8_t _src_zp_dbg(void);
|
|
INLINE uint8_t _src_zp_dis(void);
|
|
INLINE uint16_t _addr_ind(void);
|
|
INLINE uint16_t _addr_ind_dbg(void);
|
|
INLINE uint16_t _addr_ind_dis(void);
|
|
INLINE uint8_t _src_ind(void);
|
|
INLINE uint8_t _src_ind_dbg(void);
|
|
INLINE uint8_t _src_ind_dis(void);
|
|
INLINE uint16_t _addr_ind_X(void);
|
|
INLINE uint16_t _addr_ind_X_dbg(void);
|
|
INLINE uint16_t _addr_ind_X_dis(void);
|
|
INLINE uint16_t _addr_ind_ind_X(void);
|
|
INLINE uint16_t _addr_ind_ind_X_dbg(void);
|
|
INLINE uint16_t _addr_ind_ind_X_dis(void);
|
|
INLINE uint8_t _src_X_ind(void);
|
|
INLINE uint8_t _src_X_ind_dbg(void);
|
|
INLINE uint8_t _src_X_ind_dis(void);
|
|
INLINE uint16_t _addr_ind_Y(void);
|
|
INLINE uint16_t _addr_ind_Y_dbg(void);
|
|
INLINE uint16_t _addr_ind_Y_dis(void);
|
|
INLINE uint8_t _src_ind_Y(void);
|
|
INLINE uint8_t _src_ind_Y_dbg(void);
|
|
INLINE uint8_t _src_ind_Y_dis(void);
|
|
INLINE uint8_t _addr_zp_X(void);
|
|
INLINE uint8_t _addr_zp_X_dbg(void);
|
|
INLINE uint8_t _addr_zp_X_dis(void);
|
|
INLINE uint8_t _src_zp_X(void);
|
|
INLINE uint8_t _src_zp_X_dbg(void);
|
|
INLINE uint8_t _src_zp_X_dis(void);
|
|
INLINE uint8_t _addr_zp_Y(void);
|
|
INLINE uint8_t _addr_zp_Y_dbg(void);
|
|
INLINE uint8_t _addr_zp_Y_dis(void);
|
|
INLINE uint8_t _src_zp_Y(void);
|
|
INLINE uint8_t _src_zp_Y_dbg(void);
|
|
INLINE uint8_t _src_zp_Y_dis(void);
|
|
|
|
|
|
#ifdef DISASSEMBLER
|
|
|
|
#define fetch() _fetch_dis()
|
|
#define fetch16() _fetch16_dis()
|
|
#define memread(addr) _memread_dis(addr)
|
|
#define memwrite8_zp(addr,data) // do not write anything into the memory while disassembling
|
|
#define memwrite8_low(addr,data) // do not write anything into the memory while disassembling
|
|
#define memwrite8_bank(addr,data) // do not write anything into the memory while disassembling
|
|
#define memwrite8_high(addr,data) // do not write anything into the memory while disassembling
|
|
#define memwrite(addr,data) // do not write anything into the memory while disassembling
|
|
#define addr_abs() _addr_abs_dis()
|
|
#define src_abs() _src_abs_dis()
|
|
#define rel_addr() _rel_addr_dis()
|
|
#define abs_addr() _abs_addr_dis()
|
|
#define ind_addr() _ind_addr_dis()
|
|
#define addr_abs_X() _addr_abs_X_dis()
|
|
#define abs_addr_X() _abs_addr_X_dis()
|
|
#define src_abs_X() _src_abs_X_dis()
|
|
#define addr_abs_Y() _addr_abs_Y_dis()
|
|
#define src_abs_Y() _src_abs_Y_dis()
|
|
#define imm() _imm_dis()
|
|
#define addr_zp() _addr_zp_dis()
|
|
#define src_zp() _src_zp_dis()
|
|
#define addr_ind() _addr_ind_dis()
|
|
#define src_ind() _src_ind_dis()
|
|
#define addr_ind_X() _addr_ind_X_dis()
|
|
#define addr_ind_ind_X() _addr_ind_ind_X_dis()
|
|
#define src_X_ind() _src_X_ind_dis()
|
|
#define addr_ind_Y() _addr_ind_Y_dis()
|
|
#define src_ind_Y() _src_ind_Y_dis()
|
|
#define addr_zp_X() _addr_zp_X_dis()
|
|
#define src_zp_X() _src_zp_X_dis()
|
|
#define addr_zp_Y() _addr_zp_Y_dis()
|
|
#define src_zp_Y() _src_zp_Y_dis()
|
|
|
|
#elif defined(DEBUGGER) // DISASSEMBLER
|
|
|
|
#define fetch() _fetch()
|
|
#define fetch16() _fetch16()
|
|
#define memread(addr) _memread_dbg(addr)
|
|
#define memwrite8_zp(addr,data) _memwrite8_zp(addr,data)
|
|
#define memwrite8_low(addr,data) _memwrite8_low(addr,data)
|
|
#define memwrite8_bank(addr,data) _memwrite8_bank(addr,data)
|
|
#define memwrite8_high(addr,data) _memwrite8_high(addr,data)
|
|
#define memwrite(addr,data) _memwrite(addr,data);
|
|
#define addr_abs() _addr_abs_dbg()
|
|
#define src_abs() _src_abs_dbg()
|
|
#define rel_addr() _rel_addr()
|
|
#define abs_addr() _abs_addr()
|
|
#define ind_addr() _ind_addr_dbg()
|
|
#define addr_abs_X() _addr_abs_X_dbg()
|
|
#define abs_addr_X() _abs_addr_X()
|
|
#define src_abs_X() _src_abs_X_dbg()
|
|
#define addr_abs_Y() _addr_abs_Y_dbg()
|
|
#define src_abs_Y() _src_abs_Y_dbg()
|
|
#define imm() _imm()
|
|
#define addr_zp() _addr_zp_dbg()
|
|
#define src_zp() _src_zp_dbg()
|
|
#define addr_ind() _addr_ind_dbg()
|
|
#define src_ind() _src_ind_dbg()
|
|
#define addr_ind_X() _addr_ind_X_dbg()
|
|
#define addr_ind_ind_X() _addr_ind_ind_X_dbg()
|
|
#define src_X_ind() _src_X_ind_dbg()
|
|
#define addr_ind_Y() _addr_ind_Y_dbg()
|
|
#define src_ind_Y() _src_ind_Y_dbg()
|
|
#define addr_zp_X() _addr_zp_X_dbg()
|
|
#define src_zp_X() _src_zp_X_dbg()
|
|
#define addr_zp_Y() _addr_zp_Y_dbg()
|
|
#define src_zp_Y() _src_zp_Y_dbg()
|
|
|
|
#else // DEBUGGER
|
|
|
|
#define fetch() _fetch()
|
|
#define fetch16() _fetch16()
|
|
#define memread(addr) _memread(addr)
|
|
#define memwrite8_zp(addr,data) _memwrite8_zp(addr,data)
|
|
#define memwrite8_low(addr,data) _memwrite8_low(addr,data)
|
|
#define memwrite8_bank(addr,data) _memwrite8_bank(addr,data)
|
|
#define memwrite8_high(addr,data) _memwrite8_high(addr,data)
|
|
#define memwrite(addr,data) _memwrite(addr,data)
|
|
#define addr_abs() _addr_abs()
|
|
#define src_abs() _src_abs()
|
|
#define rel_addr() _rel_addr()
|
|
#define abs_addr() _abs_addr()
|
|
#define ind_addr() _ind_addr()
|
|
#define addr_abs_X() _addr_abs_X()
|
|
#define abs_addr_X() _abs_addr_X()
|
|
#define src_abs_X() _src_abs_X()
|
|
#define addr_abs_Y() _addr_abs_Y()
|
|
#define src_abs_Y() _src_abs_Y()
|
|
#define imm() _imm()
|
|
#define addr_zp() _addr_zp()
|
|
#define src_zp() _src_zp()
|
|
#define addr_ind() _addr_ind()
|
|
#define src_ind() _src_ind()
|
|
#define addr_ind_X() _addr_ind_X()
|
|
#define addr_ind_ind_X() _addr_ind_ind_X()
|
|
#define src_X_ind() _src_X_ind()
|
|
#define addr_ind_Y() _addr_ind_Y()
|
|
#define src_ind_Y() _src_ind_Y()
|
|
#define addr_zp_X() _addr_zp_X()
|
|
#define src_zp_X() _src_zp_X()
|
|
#define addr_zp_Y() _addr_zp_Y()
|
|
#define src_zp_Y() _src_zp_Y()
|
|
|
|
#endif // DISASSEMBLER & DEBUGGER
|
|
|
|
|
|
#endif // __APPLE2_MMIO_H__
|
|
|