1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-12-25 18:30:21 +00:00

Merge pull request #1004 from TomHarte/FastRAM

Adds fast RAM to the Amiga, along with size selection for both fast & chip.
This commit is contained in:
Thomas Harte 2021-12-23 11:43:42 -05:00 committed by GitHub
commit 7ce335d9da
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 415 additions and 106 deletions

View File

@ -17,7 +17,28 @@ namespace Static {
namespace Amiga {
struct Target: public Analyser::Static::Target, public Reflection::StructImpl<Target> {
Target() : Analyser::Static::Target(Machine::Amiga) {}
ReflectableEnum(ChipRAM,
FiveHundredAndTwelveKilobytes,
OneMegabyte,
TwoMegabytes);
ReflectableEnum(FastRAM,
None,
OneMegabyte,
TwoMegabytes,
FourMegabytes,
EightMegabytes);
ChipRAM chip_ram = ChipRAM::FiveHundredAndTwelveKilobytes;
FastRAM fast_ram = FastRAM::EightMegabytes;
Target() : Analyser::Static::Target(Machine::Amiga) {
if(needs_declare()) {
DeclareField(fast_ram);
DeclareField(chip_ram);
AnnounceEnum(FastRAM);
AnnounceEnum(ChipRAM);
}
}
};
}

View File

@ -53,6 +53,7 @@ class ConcreteMachine:
public:
ConcreteMachine(const Analyser::Static::Amiga::Target &target, const ROMMachine::ROMFetcher &rom_fetcher) :
mc68000_(*this),
memory_(target.chip_ram, target.fast_ram),
chipset_(memory_, PALClockRate)
{
// Temporary: use a hard-coded Kickstart selection.
@ -146,6 +147,13 @@ class ConcreteMachine:
// LOG("CIA " << (((address >> 12) & 3)^3) << " " << (cycle.operation & Microcycle::Read ? "read " : "write ") << std::dec << (reg & 0xf) << " of " << PADHEX(4) << +cycle.value16());
} else if(address >= 0xdf'f000 && address <= 0xdf'f1be) {
chipset_.perform(cycle);
} else if(address >= 0xe8'0000 && address < 0xe9'0000) {
// This is the Autoconf space; right now the only
// Autoconf device this emulator implements is fast RAM,
// which if present is provided as part of the memory map.
//
// Relevant quote: "The Zorro II configuration space is the 64K memory block $00E8xxxx"
memory_.perform(cycle);
} else {
// This'll do for open bus, for now.
if(cycle.operation & Microcycle::Read) {

View File

@ -9,6 +9,12 @@
#ifndef MemoryMap_hpp
#define MemoryMap_hpp
#include "../../Analyser/Static/Amiga/Target.hpp"
#include <array>
#include <cassert>
#include <vector>
namespace Amiga {
class MemoryMap {
@ -18,16 +24,17 @@ class MemoryMap {
static constexpr auto PermitReadWrite = PermitRead | PermitWrite;
public:
// TODO: decide what of the below I want to be dynamic.
std::array<uint8_t, 1024*1024> chip_ram{};
std::array<uint8_t, 512*1024> kickstart{0xff};
std::vector<uint8_t> chip_ram{};
struct MemoryRegion {
uint8_t *contents = nullptr;
unsigned int read_write_mask = 0;
} regions[64]; // i.e. top six bits are used as an index.
MemoryMap() {
using FastRAM = Analyser::Static::Amiga::Target::FastRAM;
using ChipRAM = Analyser::Static::Amiga::Target::ChipRAM;
MemoryMap(ChipRAM chip_ram_size, FastRAM fast_ram_size) {
// Address spaces that matter:
//
// 00'0000 08'0000: chip RAM. [or overlayed KickStart]
@ -45,6 +52,42 @@ class MemoryMap {
// f8'0000 — : 256kb Kickstart if 2.04 or higher.
// fc'0000 : 256kb Kickstart otherwise.
set_region(0xfc'0000, 0x1'00'0000, kickstart.data(), PermitRead);
switch(chip_ram_size) {
default:
case ChipRAM::FiveHundredAndTwelveKilobytes:
chip_ram.resize(512 * 1024);
break;
case ChipRAM::OneMegabyte:
chip_ram.resize(1 * 1024 * 1024);
break;
case ChipRAM::TwoMegabytes:
chip_ram.resize(2 * 1024 * 1024);
break;
}
switch(fast_ram_size) {
default:
fast_autoconf_visible_ = false;
break;
case FastRAM::OneMegabyte:
fast_ram_.resize(1 * 1024 * 1024);
fast_ram_size_ = 5;
break;
case FastRAM::TwoMegabytes:
fast_ram_.resize(2 * 1024 * 1024);
fast_ram_size_ = 6;
break;
case FastRAM::FourMegabytes:
fast_ram_.resize(4 * 1024 * 1024);
fast_ram_size_ = 7;
break;
case FastRAM::EightMegabytes:
fast_ram_.resize(8 * 1024 * 1024);
fast_ram_size_ = 0;
break;
}
reset();
}
@ -64,7 +107,75 @@ class MemoryMap {
}
}
/// Performs the provided microcycle, which the caller guarantees to be a memory access,
/// and in the Zorro register range.
bool perform(const CPU::MC68000::Microcycle &cycle) {
if(!fast_autoconf_visible_) return false;
const uint32_t register_address = *cycle.address & 0xfe;
using Microcycle = CPU::MC68000::Microcycle;
if(cycle.operation & Microcycle::Read) {
// Re: Autoconf:
//
// "All read registers physically return only the top 4 bits of data, on D31-D28";
// (this is from Zorro III documentation; I'm assuming it to be D15D11 for the
// 68000's 16-bit bus);
//
// "Every AUTOCONFIG register is logically considered to be 8 bits wide; the
// 8 bits actually being nybbles from two paired addresses."
uint8_t value = 0xf;
switch(register_address) {
default: break;
case 0x00: // er_Type (high)
value =
0xc | // Zoro II-style PIC.
0x2; // Memory will be linked into the free pool
break;
case 0x02: // er_Type (low)
value = fast_ram_size_;
break;
// er_Manufacturer
//
// On the manufacturer number: this is supposed to be assigned
// by Commodore. TODO: find and crib a real fast RAM number, if it matters.
//
// (0xffff seems to be invalid, so _something_ needs to be supplied)
case 0x10: case 0x12:
value = 0xa; // Manufacturer's number, high byte.
break;
case 0x14: case 0x16:
value = 0xb; // Manufacturer's number, low byte.
break;
}
// Shove the value into the top of the data bus.
cycle.set_value16(uint16_t(0x0fff | (value << 12)));
} else {
fast_autoconf_visible_ &= !(register_address >= 0x4c && register_address < 0x50);
switch(register_address) {
default: break;
case 0x48: { // ec_BaseAddress (A23A16)
const auto address = uint32_t(cycle.value8_high()) << 16;
set_region(address, uint32_t(address + fast_ram_.size()), fast_ram_.data(), PermitRead | PermitWrite);
fast_autoconf_visible_ = false;
} break;
}
}
return true;
}
private:
std::vector<uint8_t> fast_ram_{};
uint8_t fast_ram_size_ = 0;
bool fast_autoconf_visible_ = true;
bool overlay_ = false;
void set_region(uint32_t start, uint32_t end, uint8_t *base, unsigned int read_write_mask) {

View File

@ -124,7 +124,7 @@ typedef int Kilobytes;
- (nullable instancetype)initWithFileAtURL:(NSURL *)url;
- (instancetype)initWithAmigaModel:(CSMachineAmigaModel)model;
- (instancetype)initWithAmigaModel:(CSMachineAmigaModel)model chipMemorySize:(Kilobytes)chipMemorySize fastMemorySize:(Kilobytes)fastMemorySize;
- (instancetype)initWithAmstradCPCModel:(CSMachineCPCModel)model;
- (instancetype)initWithAppleIIModel:(CSMachineAppleIIModel)model diskController:(CSMachineAppleIIDiskController)diskController;
- (instancetype)initWithAppleIIgsModel:(CSMachineAppleIIgsModel)model memorySize:(Kilobytes)memorySize;

View File

@ -50,11 +50,28 @@
// MARK: - Machine-based Initialisers
- (instancetype)initWithAmigaModel:(CSMachineAmigaModel)model {
- (instancetype)initWithAmigaModel:(CSMachineAmigaModel)model chipMemorySize:(Kilobytes)chipMemorySize fastMemorySize:(Kilobytes)fastMemorySize {
self = [super init];
if(self) {
using Target = Analyser::Static::Amiga::Target;
auto target = std::make_unique<Target>();
switch(chipMemorySize) {
default: return nil;
case 512: target->chip_ram = Target::ChipRAM::FiveHundredAndTwelveKilobytes; break;
case 1024: target->chip_ram = Target::ChipRAM::OneMegabyte; break;
case 2048: target->chip_ram = Target::ChipRAM::TwoMegabytes; break;
}
switch(fastMemorySize) {
default: return nil;
case 0: target->fast_ram = Target::FastRAM::None; break;
case 1024: target->fast_ram = Target::FastRAM::OneMegabyte; break;
case 2048: target->fast_ram = Target::FastRAM::TwoMegabytes; break;
case 4096: target->fast_ram = Target::FastRAM::FourMegabytes; break;
case 8192: target->fast_ram = Target::FastRAM::EightMegabytes; break;
}
_targets.push_back(std::move(target));
}
return self;

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="19455" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="19529" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="19455"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="19529"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
@ -67,29 +67,75 @@ Gw
<rect key="frame" x="10" y="7" width="400" height="222"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="g7g-ZA-Uge">
<rect key="frame" x="18" y="186" width="364" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="At present only a 1mb Amiga 500 is supported." id="Isk-qc-yKa">
<font key="font" usesAppearanceFont="YES"/>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="qfH-1l-GXp">
<rect key="frame" x="110" y="178" width="80" height="25"/>
<popUpButtonCell key="cell" type="push" title="512 kb" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" tag="512" imageScaling="axesIndependently" inset="2" selectedItem="Zev-ku-jDG" id="vdO-VR-mUx">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="Zvi-ox-ip4">
<items>
<menuItem title="512 kb" state="on" tag="512" id="Zev-ku-jDG"/>
<menuItem title="1 mb" tag="1024" id="7Zs-HM-qwH"/>
<menuItem title="2 mb" tag="2048" id="GJT-os-38F"/>
</items>
</menu>
</popUpButtonCell>
</popUpButton>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="P6K-dt-stj">
<rect key="frame" x="18" y="184" width="89" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Chip Memory:" id="FIO-ZR-rsA">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="YD0-OJ-2bY">
<rect key="frame" x="18" y="154" width="87" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Fast Memory:" id="Rpz-39-jyt">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="af8-pF-qc9">
<rect key="frame" x="108" y="148" width="72" height="25"/>
<popUpButtonCell key="cell" type="push" title="None" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="axesIndependently" inset="2" selectedItem="zV7-V8-c7s" id="39D-ms-pf9">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="yIx-1y-Ab0">
<items>
<menuItem title="None" state="on" id="zV7-V8-c7s"/>
<menuItem title="1 mb" tag="1024" id="84E-wf-572"/>
<menuItem title="2 mb" tag="2048" id="UpJ-qr-ymv"/>
<menuItem title="4 mb" tag="4096" id="wpd-BF-y2L"/>
<menuItem title="8 mb" tag="8192" id="0Zf-ll-t4F"/>
</items>
</menu>
</popUpButtonCell>
</popUpButton>
</subviews>
<constraints>
<constraint firstAttribute="trailing" secondItem="g7g-ZA-Uge" secondAttribute="trailing" constant="20" symbolic="YES" id="aGA-6p-c9w"/>
<constraint firstItem="g7g-ZA-Uge" firstAttribute="top" secondItem="5zS-Nj-Ynx" secondAttribute="top" constant="20" symbolic="YES" id="xzI-rP-iIw"/>
<constraint firstItem="g7g-ZA-Uge" firstAttribute="leading" secondItem="5zS-Nj-Ynx" secondAttribute="leading" constant="20" symbolic="YES" id="ya2-No-rfZ"/>
<constraint firstItem="P6K-dt-stj" firstAttribute="centerY" secondItem="qfH-1l-GXp" secondAttribute="centerY" id="2MX-S7-si1"/>
<constraint firstItem="qfH-1l-GXp" firstAttribute="leading" secondItem="P6K-dt-stj" secondAttribute="trailing" constant="8" symbolic="YES" id="3W0-21-5um"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="af8-pF-qc9" secondAttribute="trailing" constant="20" symbolic="YES" id="6jL-bp-K7H"/>
<constraint firstAttribute="bottom" relation="greaterThanOrEqual" secondItem="af8-pF-qc9" secondAttribute="bottom" constant="20" symbolic="YES" id="801-yv-nJo"/>
<constraint firstItem="YD0-OJ-2bY" firstAttribute="leading" secondItem="5zS-Nj-Ynx" secondAttribute="leading" constant="20" symbolic="YES" id="8PF-Vw-1NA"/>
<constraint firstItem="qfH-1l-GXp" firstAttribute="top" secondItem="5zS-Nj-Ynx" secondAttribute="top" constant="20" symbolic="YES" id="Vda-cc-L3w"/>
<constraint firstItem="af8-pF-qc9" firstAttribute="top" secondItem="qfH-1l-GXp" secondAttribute="bottom" constant="10" symbolic="YES" id="WV4-Em-q7l"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="qfH-1l-GXp" secondAttribute="trailing" constant="20" symbolic="YES" id="aWw-pp-jL6"/>
<constraint firstItem="af8-pF-qc9" firstAttribute="centerY" secondItem="YD0-OJ-2bY" secondAttribute="centerY" id="vES-ku-YOg"/>
<constraint firstItem="af8-pF-qc9" firstAttribute="leading" secondItem="YD0-OJ-2bY" secondAttribute="trailing" constant="8" symbolic="YES" id="vfw-Go-uNs"/>
<constraint firstItem="P6K-dt-stj" firstAttribute="leading" secondItem="5zS-Nj-Ynx" secondAttribute="leading" constant="20" symbolic="YES" id="yJF-1t-gtt"/>
</constraints>
</view>
</tabViewItem>
<tabViewItem label="Amstrad CPC" identifier="cpc" id="ZGX-Fz-lFd">
<view key="view" id="afR-Xr-omP">
<rect key="frame" x="10" y="7" width="400" height="223"/>
<rect key="frame" x="10" y="7" width="400" height="222"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2zv-Zo-rmO">
<rect key="frame" x="67" y="179" width="96" height="25"/>
<rect key="frame" x="67" y="178" width="96" height="25"/>
<popUpButtonCell key="cell" type="push" title="CPC6128" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" tag="6128" imageScaling="axesIndependently" inset="2" selectedItem="LgZ-9j-YQl" id="yH2-Vm-hiD">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
@ -103,7 +149,7 @@ Gw
</popUpButtonCell>
</popUpButton>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="c3g-96-b3x">
<rect key="frame" x="18" y="185" width="46" height="16"/>
<rect key="frame" x="18" y="184" width="46" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Model:" id="53v-92-jmf">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -627,11 +673,11 @@ Gw
</tabViewItem>
<tabViewItem label="Vic-20" identifier="vic20" id="cyO-PU-hSU">
<view key="view" id="fLI-XB-QCr">
<rect key="frame" x="10" y="7" width="400" height="223"/>
<rect key="frame" x="10" y="7" width="400" height="222"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ueK-gq-gaF">
<rect key="frame" x="71" y="179" width="146" height="25"/>
<rect key="frame" x="71" y="178" width="146" height="25"/>
<popUpButtonCell key="cell" type="push" title="European (PAL)" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="axesIndependently" inset="2" selectedItem="45i-0n-gau" id="yi7-eo-I0q">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
@ -647,7 +693,7 @@ Gw
</popUpButtonCell>
</popUpButton>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2eV-Us-eEv">
<rect key="frame" x="108" y="149" width="116" height="25"/>
<rect key="frame" x="108" y="148" width="116" height="25"/>
<popUpButtonCell key="cell" type="push" title="Unexpanded" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="axesIndependently" inset="2" selectedItem="fOl-8Q-fsA" id="rH0-7T-pJE">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
@ -661,7 +707,7 @@ Gw
</popUpButtonCell>
</popUpButton>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="MTh-9p-FqC">
<rect key="frame" x="18" y="185" width="50" height="16"/>
<rect key="frame" x="18" y="184" width="50" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Region:" id="F3g-Ya-ypU">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -669,7 +715,7 @@ Gw
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gRS-DK-rIy">
<rect key="frame" x="18" y="155" width="87" height="16"/>
<rect key="frame" x="18" y="154" width="87" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Memory Size:" id="a4I-vG-yCp">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -677,7 +723,7 @@ Gw
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Lrf-gL-6EI">
<rect key="frame" x="18" y="128" width="177" height="18"/>
<rect key="frame" x="18" y="127" width="177" height="18"/>
<buttonCell key="cell" type="check" title="Attach C-1540 disk drive" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="tsq-YD-xw8">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
@ -903,10 +949,12 @@ Gw
<constraint firstAttribute="bottom" secondItem="hKn-1l-OSN" secondAttribute="bottom" constant="20" symbolic="YES" id="rG2-Ea-klR"/>
</constraints>
</view>
<point key="canvasLocation" x="-1" y="106.5"/>
<point key="canvasLocation" x="-320" y="103"/>
</window>
<customObject id="192-Eb-Rpg" customClass="MachinePicker" customModule="Clock_Signal" customModuleProvider="target">
<connections>
<outlet property="amigaChipRAMButton" destination="qfH-1l-GXp" id="3PG-QC-tyI"/>
<outlet property="amigaFastRAMButton" destination="af8-pF-qc9" id="laa-1H-JfD"/>
<outlet property="appleIIDiskControllerButton" destination="LSB-WP-FMi" id="Ssa-jd-t63"/>
<outlet property="appleIIModelButton" destination="jli-ac-Sij" id="Jm3-f7-C17"/>
<outlet property="appleIIgsMemorySizeButton" destination="nQa-YS-utT" id="pTV-XL-zX3"/>

View File

@ -19,6 +19,10 @@ class MachinePicker: NSObject, NSTableViewDataSource, NSTableViewDelegate {
@IBOutlet var machineSelector: NSTabView!
@IBOutlet var machineNameTable: NSTableView!
// MARK: - Amiga properties
@IBOutlet var amigaChipRAMButton: NSPopUpButton!
@IBOutlet var amigaFastRAMButton: NSPopUpButton!
// MARK: - Apple II properties
@IBOutlet var appleIIModelButton: NSPopUpButton!
@IBOutlet var appleIIDiskControllerButton: NSPopUpButton!
@ -92,6 +96,10 @@ class MachinePicker: NSObject, NSTableViewDataSource, NSTableViewDelegate {
}
}
// Amiga settings
amigaChipRAMButton.selectItem(withTag: standardUserDefaults.integer(forKey: "new.amigaChipRAM"))
amigaFastRAMButton.selectItem(withTag: standardUserDefaults.integer(forKey: "new.amigaFastRAM"))
// Apple II settings
appleIIModelButton.selectItem(withTag: standardUserDefaults.integer(forKey: "new.appleIIModel"))
appleIIDiskControllerButton.selectItem(withTag: standardUserDefaults.integer(forKey: "new.appleIIDiskController"))
@ -149,6 +157,10 @@ class MachinePicker: NSObject, NSTableViewDataSource, NSTableViewDelegate {
// Machine type
standardUserDefaults.set(machineSelector.selectedTabViewItem!.identifier as! String, forKey: "new.machine")
// Amiga settings
standardUserDefaults.set(amigaChipRAMButton.selectedTag(), forKey: "new.amigaChipRAM")
standardUserDefaults.set(amigaFastRAMButton.selectedTag(), forKey: "new.amigaFastRAM")
// Apple II settings
standardUserDefaults.set(appleIIModelButton.selectedTag(), forKey: "new.appleIIModel")
standardUserDefaults.set(appleIIDiskControllerButton.selectedTag(), forKey: "new.appleIIDiskController")
@ -228,7 +240,7 @@ class MachinePicker: NSObject, NSTableViewDataSource, NSTableViewDelegate {
switch machineSelector.selectedTabViewItem!.identifier as! String {
case "amiga":
return CSStaticAnalyser(amigaModel: .A500)
return CSStaticAnalyser(amigaModel: .A500, chipMemorySize: Kilobytes(amigaChipRAMButton.selectedTag()), fastMemorySize: Kilobytes(amigaFastRAMButton.selectedTag()))
case "appleii":
var model: CSMachineAppleIIModel = .appleII

View File

@ -1016,7 +1016,19 @@ void MainWindow::start_amiga() {
using Target = Analyser::Static::Amiga::Target;
auto target = std::make_unique<Target>();
/* There are no options yet for an Amiga. */
switch(ui->amigaChipRAMComboBox->currentIndex()) {
default: target->chip_ram = Target::ChipRAM::FiveHundredAndTwelveKilobytes; break;
case 1: target->chip_ram = Target::ChipRAM::OneMegabyte; break;
case 2: target->chip_ram = Target::ChipRAM::TwoMegabytes; break;
}
switch(ui->amigaFastRAMComboBox->currentIndex()) {
default: target->fast_ram = Target::FastRAM::None; break;
case 1: target->fast_ram = Target::FastRAM::OneMegabyte; break;
case 2: target->fast_ram = Target::FastRAM::TwoMegabytes; break;
case 3: target->fast_ram = Target::FastRAM::FourMegabytes; break;
case 4: target->fast_ram = Target::FastRAM::EightMegabytes; break;
}
launchTarget(std::move(target));
}
@ -1247,6 +1259,10 @@ void MainWindow::launchTarget(std::unique_ptr<Analyser::Static::Target> &&target
/* Machine selection. */ \
Tabs(machineSelectionTabs, "machineSelection"); \
\
/* Amiga. */ \
ComboBox(amigaChipRAMComboBox, "amiga.chipRAM"); \
ComboBox(amigaFastRAMComboBox, "amiga.fastRAM"); \
\
/* Apple II. */ \
ComboBox(appleIIModelComboBox, "appleII.model"); \
ComboBox(appleIIDiskControllerComboBox, "appleII.diskController"); \

View File

@ -33,27 +33,103 @@
<attribute name="title">
<string>Amiga</string>
</attribute>
<layout class="QVBoxLayout" name="amigaLayout">
<item alignment="Qt::AlignTop">
<widget class="QLabel" name="amigaLabel">
<layout class="QVBoxLayout">
<item>
<layout class="QHBoxLayout">
<item>
<layout class="QFormLayout">
<item row="0" column="0">
<widget class="QLabel">
<property name="text">
<string>At present only a 1mb Amiga 500 is supported.</string>
<string>Chip RAM:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="amigaChipRAMComboBox">
<item>
<property name="text">
<string>512 kb</string>
</property>
</item>
<item>
<property name="text">
<string>1 mb</string>
</property>
</item>
<item>
<property name="text">
<string>2 mb</string>
</property>
</item>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel">
<property name="text">
<string>Fast RAM:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="amigaFastRAMComboBox">
<item>
<property name="text">
<string>None</string>
</property>
</item>
<item>
<property name="text">
<string>1 mb</string>
</property>
</item>
<item>
<property name="text">
<string>2 mb</string>
</property>
</item>
<item>
<property name="text">
<string>4 mb</string>
</property>
</item>
<item>
<property name="text">
<string>8 mb</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
<item>
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="appleIITab">
<attribute name="title">
<string>Apple II</string>
</attribute>
<layout class="QVBoxLayout" name="appleIILayout">
<layout class="QVBoxLayout">
<item>
<layout class="QHBoxLayout" name="appleIIHorizontalLayout">
<layout class="QHBoxLayout">
<item>
<layout class="QFormLayout" name="appleIIFormLayout">
<layout class="QFormLayout">
<item row="0" column="0">
<widget class="QLabel" name="appleIIModelLabel">
<widget class="QLabel">
<property name="text">
<string>Model:</string>
</property>
@ -84,7 +160,7 @@
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="appleIIDiskControllerLabel">
<widget class="QLabel">
<property name="text">
<string>Disk Controller:</string>
</property>
@ -112,7 +188,7 @@
</layout>
</item>
<item>
<spacer name="appleIIHSpacer">
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@ -132,13 +208,13 @@
<attribute name="title">
<string>Apple IIgs</string>
</attribute>
<layout class="QVBoxLayout" name="appleIIgsLayout">
<layout class="QVBoxLayout">
<item>
<layout class="QHBoxLayout" name="appleIIgsHorizontalLayout">
<layout class="QHBoxLayout">
<item>
<layout class="QFormLayout" name="appleIIgsFormLayout">
<layout class="QFormLayout">
<item row="0" column="0">
<widget class="QLabel" name="appleIIgsModelLabel">
<widget class="QLabel">
<property name="text">
<string>Model:</string>
</property>
@ -164,7 +240,7 @@
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="appleIIgsMemorySizeLabel">
<widget class="QLabel">
<property name="text">
<string>Memory Size:</string>
</property>
@ -192,7 +268,7 @@
</layout>
</item>
<item>
<spacer name="appleIIgsHSpacer">
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@ -212,13 +288,13 @@
<attribute name="title">
<string>Amstrad CPC</string>
</attribute>
<layout class="QVBoxLayout" name="amstradCPCLayout">
<layout class="QVBoxLayout">
<item>
<layout class="QHBoxLayout" name="amstradCPCHorizontalLayout">
<layout class="QHBoxLayout">
<item>
<layout class="QFormLayout" name="amstradCPCFormLayout">
<layout class="QFormLayout">
<item row="0" column="0">
<widget class="QLabel" name="amstradCPCModelLabel">
<widget class="QLabel">
<property name="text">
<string>Model:</string>
</property>
@ -246,7 +322,7 @@
</layout>
</item>
<item>
<spacer name="amstradCPCHSpacer">
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@ -266,9 +342,9 @@
<attribute name="title">
<string>Atari ST</string>
</attribute>
<layout class="QVBoxLayout" name="atariSTLayout">
<layout class="QVBoxLayout">
<item alignment="Qt::AlignTop">
<widget class="QLabel" name="atariSTLabel">
<widget class="QLabel">
<property name="text">
<string>At present only a 512k Atari ST is supported.</string>
</property>
@ -280,7 +356,7 @@
<attribute name="title">
<string>Electron</string>
</attribute>
<layout class="QVBoxLayout" name="electronLayout">
<layout class="QVBoxLayout">
<item>
<widget class="QCheckBox" name="electronDFSCheckBox">
<property name="text">
@ -310,7 +386,7 @@
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<spacer>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
@ -328,13 +404,13 @@
<attribute name="title">
<string>Enterprise</string>
</attribute>
<layout class="QVBoxLayout" name="enterpriseLayout">
<layout class="QVBoxLayout">
<item>
<layout class="QHBoxLayout" name="enterpriseHorizontalLayout">
<layout class="QHBoxLayout">
<item>
<layout class="QFormLayout" name="enterpriseFormLayout">
<layout class="QFormLayout">
<item row="0" column="0">
<widget class="QLabel" name="enterpriseModelLabel">
<widget class="QLabel">
<property name="text">
<string>Model:</string>
</property>
@ -360,7 +436,7 @@
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="enterpriseSpeedLabel">
<widget class="QLabel">
<property name="text">
<string>Speed:</string>
</property>
@ -381,7 +457,7 @@
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="enterpriseEXOSLabel">
<widget class="QLabel">
<property name="text">
<string>EXOS:</string>
</property>
@ -407,7 +483,7 @@
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="enterpriseBASICLabel">
<widget class="QLabel">
<property name="text">
<string>BASIC:</string>
</property>
@ -438,7 +514,7 @@
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="enterpriseDOSLabel">
<widget class="QLabel">
<property name="text">
<string>DOS:</string>
</property>
@ -461,7 +537,7 @@
</layout>
</item>
<item>
<spacer name="enterpriseHSpacer">
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@ -481,13 +557,13 @@
<attribute name="title">
<string>Macintosh</string>
</attribute>
<layout class="QVBoxLayout" name="macintoshLayout">
<layout class="QVBoxLayout">
<item>
<layout class="QHBoxLayout" name="macintoshHorizontalLayout">
<layout class="QHBoxLayout">
<item>
<layout class="QFormLayout" name="macintoshFormLayout">
<layout class="QFormLayout">
<item row="0" column="0">
<widget class="QLabel" name="macintoshModelLabel">
<widget class="QLabel">
<property name="text">
<string>Model:</string>
</property>
@ -520,7 +596,7 @@
</layout>
</item>
<item>
<spacer name="macintoshSpacer">
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@ -540,13 +616,13 @@
<attribute name="title">
<string>MSX</string>
</attribute>
<layout class="QVBoxLayout" name="msxLayout">
<layout class="QVBoxLayout">
<item>
<layout class="QHBoxLayout" name="msxHorizontalLayout">
<layout class="QHBoxLayout">
<item>
<layout class="QFormLayout" name="msxFormLayout">
<layout class="QFormLayout">
<item row="0" column="0">
<widget class="QLabel" name="msxRegionLabel">
<widget class="QLabel">
<property name="text">
<string>Region</string>
</property>
@ -574,7 +650,7 @@
</layout>
</item>
<item>
<spacer name="msxSpacer">
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@ -596,7 +672,7 @@
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<spacer>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
@ -614,13 +690,13 @@
<attribute name="title">
<string>Oric</string>
</attribute>
<layout class="QVBoxLayout" name="oricLayout">
<layout class="QVBoxLayout">
<item>
<layout class="QHBoxLayout" name="oricHorizontalLayout">
<layout class="QHBoxLayout">
<item>
<layout class="QFormLayout" name="oricFormLayout">
<layout class="QFormLayout">
<item row="0" column="0">
<widget class="QLabel" name="oricModelLabel">
<widget class="QLabel">
<property name="text">
<string>Model:</string>
</property>
@ -646,7 +722,7 @@
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="oricDiskInterfaceLabel">
<widget class="QLabel">
<property name="text">
<string>Disk Interface:</string>
</property>
@ -684,7 +760,7 @@
</layout>
</item>
<item>
<spacer name="oricHSpacer">
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@ -704,13 +780,13 @@
<attribute name="title">
<string>Vic-20</string>
</attribute>
<layout class="QVBoxLayout" name="vic20Layout">
<layout class="QVBoxLayout">
<item>
<layout class="QHBoxLayout" name="vic20HorizontalLayout">
<layout class="QHBoxLayout">
<item>
<layout class="QFormLayout" name="vic20FormLayout">
<layout class="QFormLayout">
<item row="0" column="0">
<widget class="QLabel" name="vic20RegionLabel">
<widget class="QLabel">
<property name="text">
<string>Region:</string>
</property>
@ -746,7 +822,7 @@
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="vic20MemorySizeLabel">
<widget class="QLabel">
<property name="text">
<string>Memory Size:</string>
</property>
@ -774,7 +850,7 @@
</layout>
</item>
<item>
<spacer name="vic20HSpacer">
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@ -796,7 +872,7 @@
</widget>
</item>
<item>
<spacer name="vic20VSpacer">
<spacer>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
@ -814,13 +890,13 @@
<attribute name="title">
<string>ZX80</string>
</attribute>
<layout class="QVBoxLayout" name="zx80Layout">
<layout class="QVBoxLayout">
<item>
<layout class="QHBoxLayout" name="zx80HorizontalLayout">
<layout class="QHBoxLayout">
<item>
<layout class="QFormLayout" name="zx80FormLayout">
<layout class="QFormLayout">
<item row="0" column="0">
<widget class="QLabel" name="zx80MemorySizeLabel">
<widget class="QLabel">
<property name="text">
<string>Memory Size:</string>
</property>
@ -843,7 +919,7 @@
</layout>
</item>
<item>
<spacer name="zx80HSpacer">
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@ -865,7 +941,7 @@
</widget>
</item>
<item>
<spacer name="zx81VSpacer">
<spacer>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
@ -883,13 +959,13 @@
<attribute name="title">
<string>ZX81</string>
</attribute>
<layout class="QVBoxLayout" name="zx81Layout">
<layout class="QVBoxLayout">
<item>
<layout class="QHBoxLayout" name="zx81HorizontalLayout">
<layout class="QHBoxLayout">
<item>
<layout class="QFormLayout" name="zx81FormLayout">
<layout class="QFormLayout">
<item row="0" column="0">
<widget class="QLabel" name="zx81MemorySizeLabel">
<widget class="QLabel">
<property name="text">
<string>Memory Size:</string>
</property>
@ -912,7 +988,7 @@
</layout>
</item>
<item>
<spacer name="zx81Spacer">
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@ -932,13 +1008,13 @@
<attribute name="title">
<string>ZX Spectrum</string>
</attribute>
<layout class="QVBoxLayout" name="spectrumLayout">
<layout class="QVBoxLayout">
<item>
<layout class="QHBoxLayout" name="spectrumHorizontalLayout">
<layout class="QHBoxLayout">
<item>
<layout class="QFormLayout" name="spectrumFormLayout">
<layout class="QFormLayout">
<item row="0" column="0">
<widget class="QLabel" name="spectrumModelLabel">
<widget class="QLabel">
<property name="text">
<string>Model:</string>
</property>
@ -981,7 +1057,7 @@
</layout>
</item>
<item>
<spacer name="spectrumHSpacer">
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>