mirror of
https://github.com/jeremysrand/a2bejwld.git
synced 2024-09-27 03:54:47 +00:00
97 lines
1.7 KiB
C
97 lines
1.7 KiB
C
//
|
|
// machine.c
|
|
// a2bejwld
|
|
//
|
|
// Created by Jeremy Rand on 2016-08-23.
|
|
// Copyright © 2016 Jeremy Rand. All rights reserved.
|
|
//
|
|
|
|
|
|
#include <apple2.h>
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
#include "dbllores.h"
|
|
#include "machine.h"
|
|
#include "vbl.h"
|
|
|
|
|
|
// Typedefs
|
|
typedef enum {
|
|
GS_SPEED_SLOW,
|
|
GS_SPEED_FAST
|
|
} tMachineGSSpeed;
|
|
|
|
|
|
// Globals
|
|
|
|
tVblWaitFunction gVblWait = vblWait;
|
|
|
|
static tMachineGSSpeed gOldSpeed = GS_SPEED_SLOW;
|
|
|
|
|
|
// Implementation
|
|
|
|
|
|
static bool machineIs2GS(uint8_t machineType)
|
|
{
|
|
switch (machineType) {
|
|
case APPLE_IIGS:
|
|
case APPLE_IIGS1:
|
|
case APPLE_IIGS3:
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
static tMachineGSSpeed setGSSpeed(tMachineGSSpeed newSpeed)
|
|
{
|
|
uint8_t *speedRegister = (uint8_t *)0xc036;
|
|
uint8_t value = *speedRegister;
|
|
tMachineGSSpeed oldSpeed;
|
|
|
|
if ((value & 0x80) != 0)
|
|
oldSpeed = GS_SPEED_FAST;
|
|
else
|
|
oldSpeed = GS_SPEED_SLOW;
|
|
|
|
if (oldSpeed != newSpeed) {
|
|
if (newSpeed == GS_SPEED_FAST) {
|
|
value |= 0x80;
|
|
} else {
|
|
value &= 0x7f;
|
|
}
|
|
*speedRegister = value;
|
|
}
|
|
|
|
return oldSpeed;
|
|
}
|
|
|
|
|
|
void initMachine(void)
|
|
{
|
|
uint8_t machineType = get_ostype();
|
|
|
|
if ((machineType == APPLE_IIC) ||
|
|
(machineType == APPLE_IIC35) ||
|
|
(machineType == APPLE_IICEXP) ||
|
|
(machineType == APPLE_IICREV) ||
|
|
(machineType == APPLE_IICPLUS)) {
|
|
gVblWait = vblWait2c;
|
|
} else if (machineIs2GS(machineType)) {
|
|
vblInit2gs();
|
|
gOldSpeed = setGSSpeed(GS_SPEED_SLOW);
|
|
} else
|
|
setBuggyDblLoRes();
|
|
}
|
|
|
|
|
|
void uninitMachine(void)
|
|
{
|
|
if (machineIs2GS(get_ostype())) {
|
|
setGSSpeed(gOldSpeed);
|
|
}
|
|
}
|