1
0
mirror of https://github.com/livingcomputermuseum/Darkstar.git synced 2026-02-28 09:37:43 +00:00
Files
livingcomputermuseum.Darkstar/D/CP/Source/MoonCPMemTest.mc,v
2023-09-27 16:17:41 -07:00

39 lines
15 KiB
Plaintext

head 1.1;
branch 1.1.1;
access ;
symbols start:1.1.1.1 Xerox:1.1.1;
locks ; strict;
comment @# @;
1.1
date 2001.08.12.22.22.07; author freier; state Exp;
branches 1.1.1.1;
next ;
1.1.1.1
date 2001.08.12.22.22.07; author freier; state Exp;
branches ;
next ;
desc
@@
1.1
log
@Initial revision
@
text
@{ Copyright (C) 1980, 1984 by Xerox Corporation. All rights reserved. }
{Purcell 6-Feb-84 12:54:25 Added AdjustQ for 8mb real mem}
MacroDef[ThenElse, BRANCH[#2, #1]];
Set[PicLenShifted, 0CA]; {PicLength = 328'x = 808'd. PicLenShifted = RShift2 PicLength}
{Format of Display Control Block}
Set[IOPageHigh, 0];
Set[IOPage, 0];
Set[DCBLoc, 08];
Set[WakeupLoc, 0];
Set[DBitsLoc, 1];
Set[BorderLoc, 2];
Set[cursorXLoc, 3];
Set[cursorYLoc, 4];
Set[cursorMapLoc, 5];
RegDef[acR, R, 0]; {Contains picture pattern -- used by Emulator task}
RegDef[rA, R, 0]; {Test Use -- used by Emulator task}
RegDef[rB, R, 1]; {Test Use -- used by Emulator task}
{RegDef[TT, R, 2], RegDef[rhTT, RH, 2]; {Test Use -- used by Emulator task}}
RegDef[rC, R, 3]; {Test Use -- used by Emulator task}
RegDef[rD, R, 4]; {Used by Emulator}
RegDef[Random, R, 5]; {Used by Emulator}
RegDef[patternMode, U, 0]; {0=> checkerboard, otherwise chevron}
RegDef[cursorMode, U, 1]; {0=> slash in cursor, non-zero=> flower in cursor}
RegDef[moveMode, U, 2]; {0=> no movement, non-zero=> random Walk}
{Emulator task. Initialize Display Control Register, cursor, and paint pattern}
SetTask[0]; StartAddress[Start];
TERROR0: ClrIntErr,CANCELBR[TERROR1,0F], c*, at[0];
TERROR1: RCTEMP¬TEST, c2 ;
RCTEMP¬RCTEMP xor 4,ZeroBr, c3 ;
BRANCH[TERROR,$], c1;
{restore ADDRESSU from RIADD}
ADDRESSU ¬ RIADD LRot0, GOTO[RUNLIST4Y], c2;
TERROR: GOTO[TERROR], c* ;
Start: rC ¬ LShift1 0FF, SE¬1, CANCELBR[$, 0F] ,c1;
rC ¬ LShift1 rC, SE¬1 ,c2;
rC ¬ LShift1 rC, SE¬1 ,c3;
u7FF ¬ rC ,c1;
rC ¬ LShift1 rC, SE¬1 ,c2;
rC ¬ LShift1 rC, SE¬1 ,c3;
u1FFF ¬ rC ,c1;
rC ¬ LShift1 rC, SE¬1 ,c2;
u3FFF ¬ rC ,c3;
rD¬ 3, c1; {808 visible lines}
rD¬ rD LRot8, c2;
rD¬ rD or 28, c3;
walk: DCtl ¬ 1 ,c1;
ChkBound: rA ¬ uInitPicLength ,c2;
[] ¬ rD - rA, NegBr {Y>=328?} ,c3;
BRANCH[$, YBotOK] ,c1;
rD ¬ 0, GOTO[ChkYTop] ,c2;
YBotOK: Noop ,c2;
ChkYTop: [] ¬ rD, NegBr {Y<0?} ,c3;
rB ¬ u3FF, BRANCH[YTopOK, $] ,c1;
rD ¬ rA - 1 {rD¬327}, GOTO[ChkDone] ,c2;
YTopOK: Noop ,c2;
ChkDone: rC ¬ rC and rB{cursorX and 3FF}, GOTO[StartM] ,c3;
StartM: RCTEMP¬STYPE, c1;
TYPE¬RCTEMP, c2;
RCTEMP¬USEED, c3;
RCTEMP¬USEED, c1;
RCTEMP¬RCTEMP LRot8, c2;
R0¬ LSEED, c3;
RCTEMP¬RCTEMP or R0, c1;
SEED¬RCTEMP , c2;
R1 ¬43, c3;
DCtl ¬ R1 LRot0 ,GOTO[RUNLIST], c1;
RUNLIST: pCall4, c2;
RUNLISTX: CALL[SETUP], c3, at[0,10];
RCTEMP¬TEST, GOTO[RUNL], c1, at[0, 10, RunRet];
RUNL: RCTEMP¬RCTEMP LRot0,XDisp , c2;
DISP4[RunTest], c3;
RunTest: GOTO[RUNLIST1], c1, at[0, 10, RunTest];
GOTO[RUNLIST2], c1, at[1, 10, RunTest];
GOTO[RUNLIST1], c1, at[2, 10, RunTest];
RCTEMP¬MCTLDATA, GOTO[TRAPTEST], c1, at[4, 10, RunTest];
RUNLIST1: pCall4, c2;
CALL[SETUP], c3, at[1,10];
Noop, c1, at[1,10,RunRet];
pCall4, c2;
CALL[SSTORE], c3, at[2,10];
R0¬DELAYV,GOTO[Delay], c1, at[2,10,RunRet];
Delay: R1¬ R0 LRot4, c2;
Delay1:[]¬R0 , ZeroBr, c3;
R0¬R0 - 1,BRANCH[$,Delay2], c1;
GOTO[Delay1], c2;
Delay2: RCTEMP¬TEST, c2;
[]¬R1 , ZeroBr, c3;
R1¬R1 - 1,BRANCH[$,RUNL1], c1;
GOTO[Delay1], c2;
RUNL1: RCTEMP¬RCTEMP LRot0,XDisp , c2;
DISP4[RunTest1], c3;
RunTest1: GOTO[RUNLIST4], c1, at[0, 10, RunTest1];
GOTO[RUNLIST2], c1, at[1, 10, RunTest1];
GOTO[RUNLIST2], c1, at[2, 10, RunTest1];
GOTO[RUNLIST2], c1, at[3, 10, RunTest1];
RUNLIST2: pCall4, c2;
Noop, CALL[SETUP], c3, at[3,10];
Noop, c1, at[3,10,RunRet];
pCall4, c2;
CALL[CHECK], c3, at[4,10];
R4 ¬ SEED, c1, at[4,10,RunRet];
[] ¬ R6 xor 1,ZeroBr, c2;
BRANCH[RUNLIST4X,$], c3;
ADDRESSL¬ 0, c1;
ADDRESSU ¬ ADDRESSL LRot0, c2;
R3¬0FF, c3;
R3¬ R3 LRot8, c1;
R1¬ 3F,pCall4, c2;
CALL[MAP], c3, at[6,10];
RUNLIST4: Noop, c2;
RUNLIST4Y: R4 ¬ SEED, c3;
RUNLIST4X: RF ¬ R6+1, c1, at[6,10,RunRet];
RF ¬RF xor 5, c2;
RF ¬ RF ,ZeroBr, c3;
R6 ¬ R6+1, BRANCH[TYPE0,TYPE1], c1;
TYPE0: GOTO[TYPE3], c2;
TYPE1: R6 ¬ 0, c2;
TYPE3: TYPE ¬ R6 , c3;
DATAINC: R0 ¬ R4 LRot8, c1;
R0 ¬ R0+1, c2;
R0 ¬ R0 and 0FF , c3;
UWSEED ¬ R0 , c1;
R4 ¬ R4 +1, c2;
R4 ¬R4 and 0FF, c3;
LWSEED ¬ R4 , c1;
R0 ¬R0 LRot8, c2;
R4 ¬R4 or R0, c3;
SEED ¬ R4 , c1;
RCTEMP ¬ PASSCOUNT, c2;
CHECKPASS: RCTEMP ¬ RCTEMP-1,ZeroBr, c3;
PASSCOUNT ¬ RCTEMP,BRANCH[RUNLIST,PASSDONE1], c1;
PASSDONE1: RCTEMP ¬ TEST, c2;
RCTEMP ¬ RCTEMP xor 4,ZeroBr, c3;
BANKE¬0,BRANCH[REENTER,PASSDONE], c1;
REENTER: WORDE¬0, c2;
R0 ¬ 1, c3;
REFCONTROL ¬ R0, c1;
MAP ¬ R0, c2;
R0 ¬ 4, c3;
TEST ¬ R0, c1;
R0 ¬ 0C0 , c2;
MCTLDATA ¬ R0, c3;
R0 ¬ 0FF, c1;
PASSCOUNT ¬ R0 , c2;
PAGEE¬0,GOTO[Start], c3;
PASSDONE: GOTO[NOERROR], c*;
NOERROR: GOTO[NOERROR], c*, at[0FFF];
RUNLISTRET: Noop, c1;
pRet4, c2;
RET[RunRet], c3;
TRAPTEST: R0 ¬ PARITYMEM, c2;
[]¬R0,ZeroBr, c3;
BRANCH[PartyTRAPTEST,$], c1;
RCTEMP ¬ LShift1 RCTEMP, c2;
R0 ¬ RCTEMP LRot8, c3;
R0 ¬ R0 and 1, c1;
R0 ¬ LShift1 R0, c2;
R0 ¬ LShift1 R0, c3;
RCTEMP ¬ RCTEMP or R0, c1;
PartyTRAPTEST: RCTEMP ¬ RCTEMP and 0FF, c2;
MCTLDATA ¬ RCTEMP, c3;
{enable large real mem: MCtl ¬ 8002h or xx}
RF¬CONF, c1;
RCTEMP¬ RRot1 (RCTEMP + RCTEMP +1), c2;
MCtl ¬ 2 or RCTEMP, c3;
Q ¬ ADDRESSU, L3 ¬ 9, c1;
RIADD{ADDRESSU} ¬ Q, CALL[AdjustQ], c2;
ADDRESSU ¬ Q LRot0, c3, at[9, 10, AdjustRet];
MAR ¬ [ADDRESSU, ADDRESSL+0], c1;
MDR¬R4, c2;
RIADD¬BANKS, c3;
MAR ¬ [ADDRESSU, ADDRESSL+0], c1;
EXPECTED¬R4, c2;
OBSERVED¬MD , c3;
Noop, c1;
Noop, c2;
Noop , c3;
[]¬RF xor RIADD,ZeroBr, c1;
R0 ¬ RIADD+1 ,BRANCH[TRAPTEST1,TRAPERR], c2;
TRAPTEST1: BANKS ¬ R0, c3;
BANKE ¬ R0,GOTO[REENTER] , c1;
TRAPERR: GOTO[TRAPERR], c*;
{SUBROUTINES*************************************}
{enable large real mem: MCtl ¬ 8002h or xx}
SETUP: R1¬MCTLDATA, c1;
R1¬ RRot1(R1 + R1 +1) , c2;
MCtl ¬ 2 or R1, c3;
RCTEMP¬TEST, c1;
RCTEMP¬RCTEMP and 7, c2;
TEST¬RCTEMP, c3;
FAULTTYPE¬0, c1;
R1¬BANKE, c2;
ADDRESSU¬BANKS, c3;
ADDRESSL¬PAGES, c1;
ADDRESSL¬ADDRESSL LRot8 , c2;
R3¬WORDS, c3;
ADDRESSL¬ADDRESSL or R3, c1;
IADDRESSU¬BANKE, c2;
IADDRESSL¬PAGEE, c3;
IADDRESSL¬IADDRESSL LRot8 , c1;
R3¬WORDE, c2;
IADDRESSL¬IADDRESSL or R3, c3;
R3¬PAGEE , c1;
R3¬R3 LRot8, c2;
R4¬WORDE c3;
R3¬R3 or R4 , c1;
R4¬SEED, c2;
R6¬TYPE,GOTO[RUNLISTRET], c3;
{SUBROUTINES*************************************}
{R1=BANKE}
{ADDRESSL=PAGES,WORDS ADDRESSU=BANKS}
{IADDRESSL=PAGEE,WORDE IADDRESSU=BANKE}
{R3=PAGEE,WORDE }
{R4=SEED}
{R5=MODIFIER}
{R6=TYPE}
{RIADD formerly SEED}
{RCTEMP holds ADDRESSH}
{RIADD holds IADDRESSH}
{Q, L3 smashed by AdjustQ}
{rearrange highest real address bits in ADDRESSU: 4xx53210}
SSTORE: Q ¬ ADDRESSU, L3 ¬ 5, c1;
RCTEMP{ADDRESSU} ¬ Q, CALL[AdjustQ], c2;
ADDRESSU ¬ Q LRot0, c3, at[5, 10, AdjustRet];
Q ¬ IADDRESSU, L3 ¬ 6, c1;
RIADD{IADDRESSU} ¬ Q, CALL[AdjustQ], c2;
IADDRESSU ¬ Q LRot0, c3, at[6, 10, AdjustRet];
[] ¬ R6, YDisp, c1;
DISP4[STYPE, 08], c2;
STYPE: R5¬0, GOTO[SSTORE3], c3, at[08,10,STYPE];
R4¬ADDRESSL, GOTO[SSTORE2], c3, at[09,10,STYPE];
R5¬R4, GOTO[SSTORE3], c3, at[0A,10,STYPE];
R5¬0, GOTO[SSTORE3], c3, at[0B,10,STYPE];
R5¬0, GOTO[SSTORE1], c3, at[0C,10,STYPE];
SSTORE1: [] ¬ R6, YDisp, c1;
DISP4[STYPE1, 08], c2;
STYPE1: Noop, GOTO[SSTORE3], c3, at[08,10,STYPE1];
R4¬ ADDRESSL, GOTO[SSTORE2], c3, at[09,10,STYPE1];
R4¬ R4 + R5, GOTO[SSTORE3], c3, at[0A,10,STYPE1];
R4¬ R4 xor ~R5, GOTO[SSTORE3], c3, at[0B,10,STYPE1];
R4 ¬ RCTEMP xor 0FF, c3, at[0C,10,STYPE1];
R4¬ R4 LRot8 , c1;
R4¬ R4 or RCTEMP , c2;
GOTO[SSTORE3], c3;
SSTORE2: {RIADD ¬ IADDRESSL, c1;
Noop, c2;
Noop, c3;}
MAR ¬ [IADDRESSU, IADDRESSL+0], c1;
MDR¬IADDRESSL{RIADD}, c2;
Noop, c3;
SSTORE3: MAR ¬ [ADDRESSU, ADDRESSL+0], c1;
MDR¬R4, c2;
[] ¬ ADDRESSL xor R3, ZeroBr, c3;
ADDRESSL ¬ ADDRESSL +1, BRANCH[SDOAGAIN,SLMATCH], c1;
SDOAGAIN: IADDRESSL ¬ IADDRESSL -1, c2;
GOTO[SSTORE1], c3;
SLMATCH: RIADD{IADDRESSU} ¬ RIADD -1, L3 ¬ 7, c2;
Q ¬ RIADD, CALL[AdjustQ], c3;
IADDRESSU ¬ Q LRot0, c1, at[7, 10, AdjustRet];
Noop, c2;
R5 ¬ R5 + RCTEMP{ADDRESSU} +1, c3;
[] ¬ RCTEMP{ADDRESSU} xor R1, ZeroBr, L3 ¬ 8, c1;
RCTEMP ¬ RCTEMP+1 , BRANCH[SDOAGAIN1,SUMATCH], c2;
SDOAGAIN1: Q ¬ RCTEMP{ADDRESSU}, CALL[AdjustQ], c3;
ADDRESSU ¬ Q LRot0, GOTO[SDOAGAIN], c1, at[8, 10, AdjustRet];
SUMATCH: ADDRESSU ¬ RCTEMP LRot0, GOTO[RUNLISTRET], c3;
{SUBROUTINES*************************************}
{R1=BANKE}
{ADDRESSL=PAGES,WORDS ADDRESSU=BANKS}
{R3=PAGEE,WORDE }
{R4=SEED}
{R5=MODIFIER}
{R6=TYPE}
{OBSERVED=OBSERVED}
{EXPECTED=EXPECTED}
{RCTEMP ¬ ADDRESSU}
{smashes Q}
{rearrange highest real address bits in ADDRESSU: 4xx53210}
CHECK: Q ¬ ADDRESSU, L3 ¬ 1, c1;
RCTEMP{ADDRESSU} ¬ Q, CALL[AdjustQ], c2;
ADDRESSU ¬ Q LRot0, c3, at[1, 10, AdjustRet];
[] ¬ R6, YDisp, c1;
INMAP¬0,DISP4[CTYPE, 08], c2;
CTYPE: R5¬0, GOTO[CHECK2], c3, at[08,10,CTYPE];
R4¬ADDRESSL, GOTO[CHECK2], c3, at[09,10,CTYPE];
R5¬R4,GOTO[CHECK2], c3, at[0A,10,CTYPE];
R5¬0, GOTO[CHECK2], c3, at[0B,10,CTYPE];
R5¬0, GOTO[CHECK1], c3, at[0C,10,CTYPE];
CHECK1: [] ¬ R6, YDisp, c1;
DISP4[CTYPE1, 08], c2;
CTYPE1: Noop, GOTO[CHECK2], c3, at[08,10,CTYPE1];
R4¬ ADDRESSL, GOTO[CHECK2], c3, at[09,10,CTYPE1];
R4¬ R4 + R5, GOTO[CHECK2], c3, at[0A,10,CTYPE1];
R4¬ R4 xor ~R5, GOTO[CHECK2], c3, at[0B,10,CTYPE1];
R4¬ RCTEMP xor 0FF, c3, at[0C,10,CTYPE1];
R4¬ R4 LRot8, c1;
R4¬ R4 or RCTEMP , c2;
GOTO[CHECK2], c3;
CHECK2: MAR ¬ [ADDRESSU, ADDRESSL+0], c1;
EXPECTED¬~R4, c2;
OBSERVED¬MD , c3;
CHECKENTRY: [] ¬ OBSERVED xor R4, NZeroBr, c1;
EXPECTED¬ R4, BRANCH[$,DATAERR{restore ADDRESSU}], c2;
[] ¬ ADDRESSL xor R3, ZeroBr, c3;
ADDRESSL ¬ ADDRESSL +1 ,BRANCH[CDOAGAIN,CLMATCH], c1;
CDOAGAIN: Noop, c2;
GOTO[CHECK1], c3;
CLMATCH: Noop, c2;
R5 ¬ R5 + RCTEMP{ADDRESSU}+1, c3;
[] ¬ RCTEMP{ADDRESSU} xor R1, ZeroBr, L3 ¬ 2, c1;
RCTEMP ¬ RCTEMP+1, BRANCH[CDOAGAIN1,CUMATCH], c2;
CDOAGAIN1: Q ¬ RCTEMP{ADDRESSU}, CALL[AdjustQ], c3;
ADDRESSU ¬ Q LRot0, GOTO[CDOAGAIN], c1, at[2, 10, AdjustRet];
CUMATCH: GOTO[RUNLISTRET], c3;
DATAERR: ADDRESSU ¬ RCTEMP{ADDRESSU} LRot0, {Purcell 6-Feb-84 8:00:04 Added AdjustQ for 8mb real mem}
GOTO[DATAERR], c*;
{SUBROUTINES*************************************}
{Q=BANK on entry}
{Q=Adjusted Bank on exit}
{uses 3 cycles = 1 click}
{Link3 return thru AdjustRet}
AdjustQ: Xbus ¬ Q{BANK} LRot12, XDisp, c*;
DISP4[AdjTab, 0C], pRet3, c*;
Q ¬ Q xor 0{0=>0}, RET[AdjustRet], c*, at[0C, 10, AdjTab];
Q ¬ Q xor 90{1=>8}, RET[AdjustRet], c*, at[0D, 10, AdjTab];
Q ¬ Q xor 30{2=>1}, RET[AdjustRet], c*, at[0E, 10, AdjTab];
Q ¬ Q xor 0A0{3=>9}, RET[AdjustRet], c*, at[0F, 10, AdjTab];
{SUBROUTINES*************************************}
{R1=BANKE}
{ADDRESSL=PAGES,WORDS ADDRESSU=BANKS}
{R3=PAGEE,WORDE }
{R4=SEED}
{R5=MODIFIER}
{R6=TYPE}
{OBSERVED=OBSERVED}
{EXPECTED=EXPECTED}
MAP: RCTEMP ¬ MAP, c1;
[] ¬ RCTEMP,ZeroBr, c2;
RCTEMP ¬ 1, BRANCH[MAPOFF,MAPON] , c3;
MAPOFF: INMAP¬0, c1;
GOTO[MUMATCH], c2;
MAPON: INMAP¬RCTEMP,GOTO[MDOAGAIN], c1;
MAP2: Map ¬ [ADDRESSU, ADDRESSL+0], c1;
OBSERVED¬~EXPECTED, c2;
OBSERVED¬MD , c3;
MAPENTRY: [] ¬ OBSERVED xor EXPECTED, NZeroBr, c1;
BRANCH[$,MDATAERR], c2;
[] ¬ ADDRESSL xor R3, ZeroBr, c3;
ADDRESSL ¬ ADDRESSL +0FF+1 ,BRANCH[MDOAGAIN,MLMATCH], c1;
MDOAGAIN: EXPECTED ¬ ADDRESSL LRot8, c2;
EXPECTED ¬ EXPECTED and 0FF, c3;
RCTEMP ¬ ADDRESSL, c1;
ADDRESSL ¬ ADDRESSU , c2;
ADDRESSL ¬ ADDRESSL LRot8 , c3;
EXPECTED ¬ EXPECTED or ADDRESSL, c1;
ADDRESSL ¬ RCTEMP , c2;
GOTO[MAP2], c3;
MLMATCH: RCTEMP ¬ ADDRESSL, c2;
ADDRESSL ¬ ADDRESSU, c3;
[] ¬ ADDRESSL xor R1, ZeroBr, c1;
ADDRESSL ¬ ADDRESSL +1, BRANCH[MDOAGAIN1,MUMATCH], c2;
MDOAGAIN1: ADDRESSU ¬ ADDRESSL LRot0, c3;
ADDRESSL ¬ RCTEMP , GOTO[MDOAGAIN], c1;
MUMATCH: GOTO[RUNLISTRET], c3;
MDATAERR: GOTO[MDATAERR], c*;
SetTask[5];
StartAddress[Task5];
Task5: CANCELBR[Task5,0F], c*;
SetTask[3];
StartAddress[Task3];
Task3: CANCELBR[Task3,0F], c*;
SetTask[2];
StartAddress[Task2];
Task2: CANCELBR[Task2,0F], c*;
SetTask[4];
StartAddress[Task4];
Task4: CANCELBR[Task4,0F], c*;
@
1.1.1.1
log
@first add
@
text
@@