//Configuration.bcpl - XM support for RunMesa - R. Levin
//last modified by Johnsson: September 22, 1980 3:07 PM
get "AltoDefs.d"
get "AltoFileSys.d"
get "SysDefs.d"
get "RunMesa.d"
static [
ROMCompatibility
]
manifest [ EmulatorBR = #177740 ]
structure BankRegister: [
unused bit 12
primary bit 2
alternate bit 2
]
let DetermineConfiguration() be
[DetermineConfiguration
let vers=table [
#61014 //VERS
#1401 //JMP 1 3
]
let engineeringNumber = vers() rshift 12
Zero(HardwareConfiguration,lHardwareInfo)
test engineeringNumber eq UnknownMachine
ifso HardwareConfiguration>>HardwareInfo.AltoType = AltoI
ifnot HardwareConfiguration>>HardwareInfo.AltoType = engineeringNumber
ROMCompatibility = 0;
switchon HardwareConfiguration>>HardwareInfo.AltoType into
[
case AltoII: case AltoIIXM: endcase
case Dolphin: case Dorado:
[
HardwareConfiguration>>HardwareInfo.XMmicrocode = true
HardwareConfiguration>>HardwareInfo.banks = memoryBanks
]
default: return
]
ControlStoreType()
if HardwareConfiguration>>HardwareInfo.AltoType eq 2 then
[ HardwareConfiguration>>HardwareInfo.banks = bank0only; return ]
HardwareConfiguration>>HardwareInfo.banks = memoryBanks & banks0123
memoryBanks = FindMemoryBanks(banks0123)
HardwareConfiguration>>HardwareInfo.useXM =
(HardwareConfiguration>>HardwareInfo.banks ne bank0only) &
HardwareConfiguration>>HardwareInfo.XMmicrocode
]DetermineConfiguration
and let ControlStoreType() be
[ControlStoreType
manifest [
RAM0loc = #1000; RAM0val = #111111
RAM1loc = #11000; RAM1val = #52525
PossibleRAMloc = #777-1
]
manifest highword = #2000
// versionTable is the mapping from version numbers available at
// run time to actual version numbers.
// Add new entries at release time
// Version 34 => Mesa 4.1
// Version 39 => Mesa 5.0 -- no distinction for BNDCHK fix patch
// Version 41 => Mesa 6.0
manifest tableLength = 3
let versionTable = table [ 34; 39; 41 ]
let compatibilityTable = table [ 34; 41; 41 ]
let saveRealRAM = vec 3
let savePossibleRAM = vec 3
let testRAM0 = nil
let WriteOne=table [ // (high,address,low)
#55001 //STA 3 1 2
#35003 //LDA 3 3 2
#61012 //WRTRAM
#35001 //LDA 3 1 2
#1401 //JMP 1 3
]
let ReadOne=table [ // (pointer,address)
#55001 //STA 3 1 2
#115000 //MOV 0 3
#61011 //RDRAM
#41400 //STA 0 0 3
#35001 //LDA 3 1 2
#1401 //JMP 1 3
]
let JmpRAM=table [
#61010 //JMPRAM
#1401 //JMP 1 3
]
let initCP = table [
#100; #171001; // L←ALLONES, SWMODE, :x1;
#60110; #102020; // x1: cp←L, :START;
]
let getVersionCode = table [
#60110; #102020; // x2: cp←L,:START;
#60; #170776; // L←-2, SWMODE,:x2;
]
let readCP = table [
#60060; #101001; // L←cp, SWMODE, :x3;
#14030; #102020; // x3: AC0←L, :START;
]
// Test for 3K RAM machine first
ReadOne(saveRealRAM,highword+RAM0loc); ReadOne(saveRealRAM+1,RAM0loc);
ReadOne(saveRealRAM+2,highword+RAM1loc); ReadOne(saveRealRAM+3,RAM1loc);
WriteOne(RAM0val,RAM0loc,RAM0val); WriteOne(RAM1val,RAM1loc,RAM1val);
ReadOne(lv testRAM0,RAM0loc);
WriteOne(saveRealRAM!0,RAM0loc,saveRealRAM!1);
WriteOne(saveRealRAM!2,RAM1loc,saveRealRAM!3);
test testRAM0 eq RAM0val
ifso // 3K RAM
[
HardwareConfiguration>>HardwareInfo.ControlStore = RAM3K
HardwareConfiguration>>HardwareInfo.XMmicrocode = true
return
]
ifnot if testRAM0 ne RAM1val then AbortMsg("Your RAM doesn't work!");
// Test for 2K ROM
ReadOne(saveRealRAM,highword+RAM0loc); ReadOne(saveRealRAM+1,RAM0loc);
ReadOne(saveRealRAM+2,highword+RAM0loc+1); ReadOne(saveRealRAM+3,RAM0loc+1);
WriteOne(initCP!0,RAM0loc,initCP!1);
WriteOne(initCP!2,RAM0loc+1,initCP!3);
JmpRAM(0,RAM0loc); // cp ← -1
ReadOne(savePossibleRAM,highword+PossibleRAMloc); ReadOne(savePossibleRAM+1,PossibleRAMloc);
ReadOne(savePossibleRAM+2,highword+PossibleRAMloc+1);
ReadOne(savePossibleRAM+3,PossibleRAMloc+1);
WriteOne(getVersionCode!0,PossibleRAMloc,getVersionCode!1);
WriteOne(getVersionCode!2,PossibleRAMloc+1,getVersionCode!3);
JmpRAM(0,PossibleRAMloc+1);
WriteOne(savePossibleRAM!0,PossibleRAMloc,savePossibleRAM!1);
WriteOne(savePossibleRAM!2,PossibleRAMloc+1,savePossibleRAM!3);
WriteOne(readCP!0,RAM0loc,readCP!1);
WriteOne(readCP!2,RAM0loc+1,readCP!3);
let valCP = JmpRAM(0,RAM0loc);
WriteOne(saveRealRAM!0,RAM0loc,saveRealRAM!1);
WriteOne(saveRealRAM!2,RAM0loc+1,saveRealRAM!3);
switchon valCP into
[VersionCases
case -2: // no ROM on machine
[
endcase
]
case -1: // ancient ROM on machine
[
HardwareConfiguration>>HardwareInfo.mesaMicrocodeVersion = versionTable!0
HardwareConfiguration>>HardwareInfo.ControlStore = RAMandROM
endcase
]
default: // some other ROM on machine
[
HardwareConfiguration>>HardwareInfo.ControlStore = RAMandROM
valCP = valCP & #77777 // ignore obsolete XM microcode version
if valCP ge tableLength then endcase
HardwareConfiguration>>HardwareInfo.XMmicrocode = true
HardwareConfiguration>>HardwareInfo.mesaMicrocodeVersion = versionTable!valCP
ROMCompatibility = compatibilityTable!valCP
endcase
]
]VersionCases
]ControlStoreType
and let FindMemoryBanks(useable) = valof
[FindMemoryBanks
manifest testlocation = 0
let bankBit = #40000 // start with bank 1
let savedactiveInterrupts = @activeInterrupts
let GetAlternateBank=table [
#61025 //XMLDA
#1401 //JMP 1 3
]
let SetAlternateBank=table [
#61026 //XMSTA
#1401 //JMP 1 3
]
@activeInterrupts = 0
EmulatorBR>>BankRegister.alternate = 0
until bankBit eq #4000 do
[
EmulatorBR>>BankRegister.alternate = EmulatorBR>>BankRegister.alternate+1
if (useable & bankBit) ne 0 then
[
let oldval = GetAlternateBank(0,testlocation)
SetAlternateBank(oldval+1,testlocation)
if GetAlternateBank(testlocation) ne oldval+1 then
useable = useable & not bankBit
SetAlternateBank(oldval,testlocation)
]
bankBit = bankBit rshift 1
]
@wakeupsWaiting = 0
@activeInterrupts = savedactiveInterrupts
resultis useable
]FindMemoryBanks