mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2025-01-13 21:36:16 +00:00
refactored astrocade; added paddles, still need to simulate bus contention, bios platform
This commit is contained in:
parent
f32009ca0b
commit
33a0e9ed57
@ -1038,7 +1038,7 @@ export function lookupSymbol(platform:Platform, addr:number, extra:boolean) {
|
||||
/// new Machine platform adapters
|
||||
|
||||
import { Bus, Resettable, FrameBased, VideoSource, SampledAudioSource, AcceptsROM, AcceptsKeyInput, SavesState, SavesInputState, HasCPU } from "./devices";
|
||||
import { Probeable, RasterFrameBased } from "./devices";
|
||||
import { Probeable, RasterFrameBased, AcceptsPaddleInput } from "./devices";
|
||||
import { SampledAudio } from "./audio";
|
||||
import { ProbeRecorder } from "./recorder";
|
||||
|
||||
@ -1054,6 +1054,9 @@ function hasAudio(arg:any): arg is SampledAudioSource {
|
||||
function hasKeyInput(arg:any): arg is AcceptsKeyInput {
|
||||
return typeof arg.setKeyInput === 'function';
|
||||
}
|
||||
function hasPaddleInput(arg:any): arg is AcceptsPaddleInput {
|
||||
return typeof arg.setPaddleInput === 'function';
|
||||
}
|
||||
function isRaster(arg:any): arg is RasterFrameBased {
|
||||
return typeof arg.getRasterY === 'function';
|
||||
}
|
||||
@ -1111,6 +1114,9 @@ export abstract class BaseMachinePlatform<T extends Machine> extends BaseDebugPl
|
||||
this.video.setKeyboardEvents(m.setKeyInput.bind(m));
|
||||
this.poller = new ControllerPoller(m.setKeyInput.bind(m));
|
||||
}
|
||||
if (hasPaddleInput(m)) {
|
||||
this.video.setupMouseEvents();
|
||||
}
|
||||
if (hasProbe(m)) {
|
||||
this.probeRecorder = new ProbeRecorder(m);
|
||||
this.startProbing = () => {
|
||||
@ -1128,7 +1134,13 @@ export abstract class BaseMachinePlatform<T extends Machine> extends BaseDebugPl
|
||||
this.reset();
|
||||
}
|
||||
|
||||
pollControls() { this.poller && this.poller.poll(); }
|
||||
pollControls() {
|
||||
this.poller && this.poller.poll();
|
||||
if (hasPaddleInput(this.machine)) {
|
||||
this.machine.setPaddleInput(0, this.video.paddle_x);
|
||||
this.machine.setPaddleInput(1, this.video.paddle_y);
|
||||
}
|
||||
}
|
||||
|
||||
advance(novideo:boolean) {
|
||||
this.machine.advanceFrame(999999, this.getDebugCallback());
|
||||
|
@ -253,7 +253,7 @@ let run_instruction = function()
|
||||
/// @param non_maskable - true if this is a non-maskable interrupt
|
||||
/// @param data - the value to be placed on the data bus, if needed
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
let interrupt = function(non_maskable, data)
|
||||
let interrupt = function(non_maskable:boolean, data:number) : boolean
|
||||
{
|
||||
//console.log(non_maskable, data, iff1, iff2, do_delayed_ei, do_delayed_di);
|
||||
if (non_maskable)
|
||||
@ -270,6 +270,7 @@ let interrupt = function(non_maskable, data)
|
||||
push_word(pc);
|
||||
pc = 0x66;
|
||||
cycle_counter += 11;
|
||||
return true;
|
||||
}
|
||||
else if (iff1)
|
||||
{
|
||||
@ -312,6 +313,7 @@ let interrupt = function(non_maskable, data)
|
||||
cycle_counter += 19;
|
||||
}
|
||||
//console.log(imode,data,pc);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
@ -3345,6 +3347,7 @@ let cycle_counts_dd = [
|
||||
this.interrupt = interrupt;
|
||||
this.getPC = ():number => { return pc; }
|
||||
this.getSP = ():number => { return sp; }
|
||||
this.getHalted = ():boolean => { return halted; }
|
||||
}
|
||||
|
||||
export interface Z80State {
|
||||
@ -3361,6 +3364,8 @@ export class Z80 implements CPU, InstructionBased, IOBusConnected, SavesState<Z8
|
||||
interruptType;
|
||||
memBus : Bus;
|
||||
ioBus : Bus;
|
||||
retryInterrupts : boolean = false;
|
||||
retryData : number = -1;
|
||||
|
||||
private buildCPU() {
|
||||
if (this.memBus && this.ioBus) {
|
||||
@ -3381,13 +3386,18 @@ export class Z80 implements CPU, InstructionBased, IOBusConnected, SavesState<Z8
|
||||
this.buildCPU();
|
||||
}
|
||||
advanceInsn() {
|
||||
if (this.retryInterrupts && this.retryData >= 0 && this.cpu.interrupt(false, this.retryData)) {
|
||||
this.retryData = -1;
|
||||
}
|
||||
return this.cpu.advanceInsn();
|
||||
}
|
||||
reset() {
|
||||
this.cpu.reset();
|
||||
}
|
||||
interrupt(data:number) {
|
||||
this.cpu.interrupt(false, data);
|
||||
if (!this.cpu.interrupt(false, data) && this.retryInterrupts) {
|
||||
this.retryData = data;
|
||||
}
|
||||
}
|
||||
NMI() {
|
||||
this.cpu.interrupt(true, 0);
|
||||
|
@ -93,11 +93,15 @@ export interface SavesInputState<CS> {
|
||||
saveControlsState() : CS;
|
||||
}
|
||||
|
||||
// TODO
|
||||
// TODO: joystick
|
||||
export interface AcceptsKeyInput {
|
||||
setKeyInput(key:number, code:number, flags:number) : void;
|
||||
}
|
||||
|
||||
export interface AcceptsPaddleInput {
|
||||
setPaddleInput(controller:number, value:number) : void;
|
||||
}
|
||||
|
||||
export interface Probeable {
|
||||
connectProbe(probe: ProbeAll) : void;
|
||||
}
|
||||
|
632
src/machine/astrocade.ts
Normal file
632
src/machine/astrocade.ts
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,4 +1,3 @@
|
||||
"use strict";
|
||||
|
||||
import { VicDual } from "../machine/vicdual";
|
||||
import { BaseZ80MachinePlatform } from "../baseplatform";
|
||||
|
Loading…
x
Reference in New Issue
Block a user