From 49591085128d04e45cde9ec3a4049e9c38c34dee Mon Sep 17 00:00:00 2001 From: Jeff Date: Tue, 14 Mar 2017 17:18:02 -0700 Subject: [PATCH] Multiple MACRO-10 source files can now be requested and assembled together; also, restored DAKAD.MAC to its original version and put my modified version in TEST.MAC --- apps/pdp10/tapes/diags/klad/SMFILE.MAC | 7398 +++++++++++++++++ apps/pdp10/tapes/diags/klad/dakad/DAKAD.MAC | 23 +- apps/pdp10/tapes/diags/klad/dakad/TEST.MAC | 2055 +++++ .../machine/ka10/test/debugger/machine.xml | 2 +- modules/pdp10/lib/debugger.js | 14 +- modules/pdp10/lib/macro10.js | 116 +- versions/pdpjs/1.34.2/pdp10-dbg.js | 276 +- 7 files changed, 9687 insertions(+), 197 deletions(-) create mode 100644 apps/pdp10/tapes/diags/klad/SMFILE.MAC create mode 100644 apps/pdp10/tapes/diags/klad/dakad/TEST.MAC diff --git a/apps/pdp10/tapes/diags/klad/SMFILE.MAC b/apps/pdp10/tapes/diags/klad/SMFILE.MAC new file mode 100644 index 000000000..65c3ff41d --- /dev/null +++ b/apps/pdp10/tapes/diags/klad/SMFILE.MAC @@ -0,0 +1,7398 @@ +;[toed.xkl.com]DXX:SMFILE.MAC.2, 18-Apr-96 17:04:39, Edit by GORIN +;fixed test for KL10 in $CPUTP. It used an indeterminate form of BLT + +;MAINDEC-10-SMFILE + +MCNVER=0 +DECVER=3 + + XLIST +DEFINE NAME (MCNVER,DECVER),< + +TITLE SMFILE DECSYSTEM 2020 DIAGNOSTICS FE-FILE PROGRAM, VER MCNVER,DECVER> + LIST + LALL + +NAME \MCNVER,\DECVER + + LOC 137 +MCNVER,,DECVER + RELOC + +;*COPYRIGHT 1978,1979 +;*DIGITAL EQUIPMENT CORPORATION +;*MARLBORO, MASS. 01752 + +;*JOHN R. KIRCHOFF + + NOSYM + SEARCH MONSYM,MACSYM + .REQUI SYS:MACREL + .REQUI SYS:MONSYM ;FOR DDT + +INTERN $CCLIN +EXTERN K%INIT,S%INIT,S%CMND,S%ERR + +EXTERN SMPREB ;START ADDRESS OF DIAGNOSTIC PRE-BOOT +EXTERN SMPEND ;END ADDRESS OF DIAGNOSTIC PRE-BOOT + +IF2, +SUBTTL PARAMETERS + +DEFINE S,<;*********************************************************************> + +S +;*DATA SWITCHES +S + +NOPNT== 040000 ;INHIBIT ALL PRINT/TYPE OUT (EXCEPT FORCED) +PNTLPT==020000 ;PRINT ALL DATA ON LPT (DSK IN USER MODE) + +;*AC USE + +T1=1 ;TEMPS +T2=2 +T3=3 +T4=4 +T5=5 +T6=6 +T7=7 +AC10=10 +AC11=11 +AC12=12 +AC13=13 +STPNTR=14 ;STBUF STORE POINTER +FP=15 ;STACK FRAME POINTER +CX=16 ;CALL/RETURN TEMP +T16=16 +P=17 + +A= 1 +B= 2 +C= 3 +D= 4 + +AC0= 0 +AC1= 1 +AC2= 2 +AC3= 3 +AC4= 4 +AC= 5 +CHR= 6 +CHR1= 7 +LP= 10 ;LINE CHAR POINTER +CNT= 15 +INDX= 16 +BYTE= 1 +P1= 13 +P2= 14 +;*FE-FILE DIRECTORY DEFINTIONS + +FEDIR=400000 ;FE-DIR PAGE + +FSP= 0 ;FREE SPACE POINTER +FSL= 1 ;FREE SPACE PAGE #,,LENGTH + +MCP= 2 ;MICROCODE POINTER +MCL= 3 ;MICROCODE PAGE #,,LENGTH + +MPBP= 4 ;MONITOR PRE-BOOT POINTER +MPBL= 5 ;MONITOR PRE-BOOT PAGE #,,LENGTH + +DPBP= 6 ;DIAGNOSTIC PRE-BOOT POINTER +DPBL= 7 ;DIAGNOSTIC PRE-BOOT PAGE #,,LENGTH + +BC1P= 10 ;BOOTCHECK 1 POINTER +BC1L= 11 ;BOOTCHECK 1 PAGE #,,LENGTH + +BCKP= 12 ;BOOTCHECK 2 PRE-BOOT POINTER +BCKL= 13 ;BOOTCHECK 2 PRE-BOOT PAGE #,,LENGTH + +MBOOTP= 14 ;MONITOR BOOT POINTER +MBOOTL= 15 ;MONITOR BOOT PAGE #,,LENGTH + +DBP= 16 ;DIAGNOSTIC BOOT POINTER +DBOOTL= 17 ;DIAGNOSTIC BOOT PAGE #,,LENGTH + +BCHKP= 20 ;BOOTCHECK 2 POINTER +BCHKL= 21 ;BOOTCHECK 2 PAGE #,,LENGTH + +IFP0= 22 ;INDIRECT FILE 0 POINTER +IFL0= 23 ;INDIRECT FILE 0 PAGE #,,LENGTH + +CRAM= 401000 ;CRAM STORAGE, 12 PAGES WORTH + +MPREBP= 415000 ;MONITOR PRE-BOOT PAGE +DPREBP= 416000 ;DIAGNOSTIC PRE-BOOT PAGE + +CRMBC1= 417000 ;BOOTCHECK 1 STORAGE, 12 PAGES WORTH + +BCPREBP=433000 ;BOOTCHECK 2 PRE-BOOT PAGE + +WINDOW= 434000 ;WINDOW PAGE + +GENPAG= 435000 ; + +HOMPAG= 436000 ;HOME BLOCKS READ INTO HERE +S +;*OPERATOR DEFINITIONS (NON-UUO'S) +S + +OPDEF GO [PUSHJ P,] ;SUBROUTINE CALL +OPDEF RTN [POPJ P,] ;SUBROUTINE RETURN +OPDEF PUT [PUSH P,] ;PUT DATA ON PUSH LIST +OPDEF GETIT [POP P,] ;GET DATA FROM PUSH LIST +OPDEF PJRST [JRST ] ;JRST TO ROUTINE THAT RTN'S + +S +;*SUBROUTINE INITIALIZATION CALL +S + +OPDEF PGMINT [JSP 0,SBINIT] ;SUBROUTINE INITIALIZATION + +S +;*HALTING UUO'S (A MORE GRACEFUL HALT THAN SIMPLY USING THE HALT INSTRUCTION). +S + +OPDEF FATAL [37B8!15B12!4] ;FATAL PROGRAMMING HALT +OPDEF ERRHLT [37B8!14B12!4] ;PROGRAM ERROR HALT + +S +;*TERMINAL INPUT UUO'S +S + +OPDEF TTICHR [37B8!0B12!3] ;TTY, INPUT ANY CHARACTER +OPDEF TTIYES [37B8!1B12!3] ;TTY, NORMAL RETURN Y +OPDEF TTINO [37B8!2B12!3] ;TTY, NORMAL RETURN N +OPDEF TTIOCT [37B8!3B12!3] ;TTY, INPUT OCTAL WORD +OPDEF TTIDEC [37B8!4B12!3] ;TTY, INPUT DECIMAL WORD +OPDEF TTICNV [37B8!5B12!3] ;TTY, INPUT CONVERTABLE WORD +OPDEF TTLOOK [37B8!6B12!3] ;TTY, KEYBOARD CHECK +OPDEF TTALTM [37B8!7B12!3] ;TTY, ALT-MODE CHECK +OPDEF TTSIXB [37B8!10B12!3] ;TTY, INPUT SIXBIT WORD +OPDEF TTYINP [37B8!11B12!3] ;TTY, IMAGE MODE INPUT +OPDEF TTICLR [37B8!12B12!3] ;TTY, CLEAR INPUT +S +;*TERMINAL OUTPUT UUO'S. +S + +OPDEF PNTA [37B8!0B12!0] ;PRINT ASCII WORD +OPDEF PNTAF [37B8!0B12!1] ;PRINT ASCII WORD FORCED +OPDEF PNTAL [37B8!17B12!0] ;PRINT ASCIZ LINE +OPDEF PNTALF [37B8!17B12!1] ;PRINT ASCIZ LINE FORCED +OPDEF PSIXL [37B8!14B12!3] ;PRINT SIXBIT'Z LINE +OPDEF PSIXLF [37B8!15B12!3] ;PRINT SIXBIT'Z LINE FORCED +OPDEF PNTMSG [37B8!0B12!0] ;PRINT MESSAGE IMMEDIATE +OPDEF PNTMSF [37B8!1B12!0] ;PRINT MESSAGE IMMEDIATE FORCED +OPDEF PSIXM [37B8!2B12!0] ;PRINT SIXBIT'Z MSG IMMEDIATE +OPDEF PSIXMF [37B8!4B12!0] ;PRINT SIXBIT'Z MSG IMM FORCED +OPDEF PNTCI [37B8!0B12!0] ;PRINT CHARACTER IMMEDIATE +OPDEF PNTCIF [37B8!1B12!0] ;PRINT CHARACTER IMMEDIATE FORCED +OPDEF PNTCHR [37B8!12B12!0] ;PRINT CHARACTER +OPDEF PNTCHF [37B8!12B12!1] ;PRINT CHARACTER FORCED +OPDEF PNT1 [37B8!1B12!0] ;PRINT ONE OCTAL DIGIT +OPDEF PNT1F [37B8!1B12!1] ;PRINT 1 OCTAL DIGIT FORCED +OPDEF PNT2 [37B8!2B12!0] ;PRINT TWO OCTAL DIGITS +OPDEF PNT2F [37B8!2B12!1] ;PRINT 2 OCTAL DIGITS FORCED +OPDEF PNT3 [37B8!3B12!0] ;PRINT THREE OCTAL DIGITS +OPDEF PNT3F [37B8!3B12!1] ;PRINT THREE OCTAL DIGITS FORCED +OPDEF PNT4 [37B8!4B12!0] ;PRINT FOUR OCTAL DIGITS +OPDEF PNT4F [37B8!4B12!1] ;PRINT FOUR OCTAL DIGITS FORCED +OPDEF PNT5 [37B8!5B12!0] ;PRINT FIVE OCTAL DIGITS +OPDEF PNT5F [37B8!5B12!1] ;PRINT FIVE OCTAL DIGITS FORCED +OPDEF PNT6 [37B8!6B12!0] ;PRINT SIX OCTAL DIGITS +OPDEF PNT6F [37B8!6B12!1] ;PRINT SIX OCTAL DIGITS FORCED +OPDEF PNT7 [37B8!7B12!0] ;PRINT 7 OCTAL DIGITS +OPDEF PNT7F [37B8!7B12!1] ;PRINT 7 OCTAL DIGITS FORCED +OPDEF PNT8 [37B8!10B12!0] ;PRINT 8 OCTAL DIGITS +OPDEF PNT8F [37B8!10B12!1] ;PRINT 8 OCTAL DIGITS FORCED +OPDEF PNT11 [37B8!11B12!0] ;PRINT 11 OCTAL DIGITS +OPDEF PNT11F [37B8!11B12!1] ;PRINT 11 OCTAL DIGITS FORCED. +OPDEF PNTADR [37B8!10B12!0] ;PRINT PHYSICAL ADDRESS +OPDEF PNTADF [37B8!10B12!1] ;PRINT PHYSICAL ADDRESS FORCED +OPDEF PNTOCT [37B8!14B12!0] ;PRINT FULL WORD OCTAL +OPDEF PNTOTF [37B8!14B12!1] ;PRINT FULL WORD OCTAL FORCED +OPDEF PNTHW [37B8!13B12!0] ;PRINT OCTAL HALF WORDS, 6 SP 6 +OPDEF PNTHWF [37B8!13B12!1] ;PRINT OCTAL HALF WORDS, 6 SP 6 FORCED +OPDEF PNTOCS [37B8!16B12!3] ;PRINT OCTAL, SUPPRESS LEADING 0'S +OPDEF PNTOCF [37B8!17B12!3] ;PRINT OCTAL, SUPPRESS LEADING 0'S FORCED +OPDEF PNTDEC [37B8!15B12!0] ;PRINT DECIMAL, SUPRESS LEADING 0'S +OPDEF PNTDCF [37B8!15B12!1] ;PRINT DECIMAL, SUPRESS LEADING 0'S FORCED +OPDEF PNTDS [37B8!16B12!0] ;PRINT DECIMAL, SPACES FOR LD 0'S +OPDEF PNTDSF [37B8!16B12!1] ;PRINT DECIMAL, SPACES FOR LD 0'S FORCED +OPDEF PNTNM [37B8!4B12!2] ;PRINT PROGRAM NAME +OPDEF PNTSIX [37B8!0B12!2] ;PRINT SIXBIT WORD +OPDEF PNTSXF [37B8!1B12!2] ;PRINT SIXBIT WORD FORCED +OPDEF DROPDV [37B8!5B12!2] ;CLOSE LOGICAL FILE, USER MODE +OPDEF PCRL [37B8!0B12!CRLF] ;PRINT CARRIAGE RETURN/LINE FEED +OPDEF PCRLF [37B8!1B12!CRLF] ;PRINT CARRIAGE RETURN/LINE FEED FORCED +OPDEF PSP [37B8!0B12!40] ;PRINT SPACE +OPDEF PSPF [37B8!1B12!40] ;PRINT SPACE FORCED +OPDEF PSPACE [37B8!1B12!40] ;PRINT SPACE FORCED +OPDEF PTAB [37B8!1B12!11] ;PRINT TAB FORCED +OPDEF PCRL2 [37B8!0B12!CRLF2] ;PRINT CARRIAGE RETURN/LINE FEED (TWICE) +OPDEF PCRL2F [37B8!1B12!CRLF2] ;PRINT CARRIAGE RETURN/LINE FEED (TWICE) FORCED +OPDEF PBELL [37B8!1B12!7] ;PRINT TTY BELL + +OPDEF PFORCE [37B8!1B12!26] ;PRINT FORCE, CONTROL O OVERRIDE + +DEFINE PMSG (ARG),< + PSIXM [SIXBIT\ARG'_\]> + +DEFINE PMSGF (ARG),< + PSIXMF [SIXBIT\ARG'_\]> + +;*SIXBTZ -- MACRO TO GENERATE SIXBIT DATA FOR PRINTING +;* CONSERVES CORE OVER ASCIZ + +DEFINE SIXBTZ (ARG),< [SIXBIT\ARG'_\]> + +S +;*END OF PASS/PROGRAM UUOS +S + +OPDEF ENDUUO [37B8!12B12!4] ;UUO TO DISPLAY LIGHTS +OPDEF EOPUUO [37B8!16B12!4] ;END OF PROGRAM UUO +SUBTTL STANDARD PROGRAM ASSIGNMENTS + +S +;*PDP-10 STANDARD PC CONTROL FLAGS (SAVED ON PUSHJ, JSR, ETC..) +S + +AROV== 400000 ;ARITHMETIC OVERFLOW +CRY0== 200000 ;CARRY 0 +CRY1== 100000 ;CARRY 1 +FOV== 40000 ;FLOATING POINT OVERFLOW +BIS== 20000 ;BYTE INTERRUPT +USERF== 10000 ;USER MODE +EXIOT== 4000 ;USER PRIV I/O +FXU== 100 ;FLOATING POINT UNDERFLOW +DCK== 40 ;DIVIDE CHECK + +S +;*PDP-10 STANDARD ADDRESS ASSIGNMENTS +S + +LUUO== 40 ;UUO STORAGE, UUO 1-37 +LUUOI== 41 ;UUO SERVICE INSTRUCTION + +S +;*JOB DATA AREA EXTERNALS (OLD DEFINITIONS) +S + +JOBUUO==40 +JOB41== 41 +JOBREL==44 +JOBDDT==74 +JOBSYM==116 +JOBUSY==117 +JOBSA== 120 +JOBFF== 121 +JOBREN==124 +JOBAPR==125 +JOBCNI==126 +JOBTPC==127 +JOBOPC==130 +JOBVER==137 +S +;*JOB DATA AREA EXTERNALS (NEW DEFINITIONS) +S + +.JBUUO==40 +.JB41== 41 +.JBREL==44 +.JBDDT==74 +.JBSYM==116 +.JBUSY==117 +.JBSA== 120 +.JBFF== 121 +.JBREN==124 +.JBAPR==125 +.JBCNI==126 +.JBTPC==127 +.JBOPC==130 +.JBVER==137 + +S +;*USER MODE APR ASSIGNMENTS (FOR "APRENB" CALL) +S + +PDLOVU==200000 ;PUSHDOWN LIST OVERFLOW +MPVU== 20000 ;MEMORY PROTECTION VIOLATION +NXMU== 10000 ;NON-X-MEMORY +PARU== 4000 ;PARITY ERROR +CLKU== 1000 ;CLOCK +FOVU== 100 ;FLOATING OVERFLOW +AROVU== 10 ;ARITHMETIC OVERFLOW + +S +;*USER MODE PRINT OUTPUT CHANNEL ASSIGNMENTS (FOR SUBROUTINE PACKAGE) +;*THE USER SHOULD BE CAUTIONED NOT TO USE THESE CHANNELS WHEN +;*USING THE SUBROUTINE PACKAGE AND CODING USER MODE PROGRAMS. +S + +$DEVCH==17 ;LOGICAL DEVICE CHANNEL + +SUBTTL MACROS + +DEFINE SCMTAB(NAME),< +NAME: XWD L.'NAME,L.'NAME + +DEFINE ECMTAB,< + L.'NAME==.-NAME-1 +> +> + +DEFINE CMTAB(CMD,ADR),< + [ASCIZ "CMD"],,ADR +> + +DEFINE CMABR(ABBR,REST,ADDR),< + [ASCIZ "ABBR"],,[ TLNN T1,(CM%ESC) + JRST ADDR + HRROI T1,[ASCIZ "REST "] + SKIPN MONTYP + JRST [HRRZ 1,1 + OUTSTR @1 + JRST ADDR] + PSOUT + JRST ADDR] +> + +DEFINE CMD(FUNC,ERR,%A),< +%A:! XLIST +IFNB ,< + MOVEI T1,[ASCIZ "ERR"] + MOVEM T1,CMDMSG +> +IFB ,< + SETZM CMDMSG +> + MOVEI T1,CSB + MOVEI T2,FUNC + SKIPN MONTYP + JRST [GO S%CMND + JRST .+3] + COMND + ERJMP [PUSH P,[%A] + JRST CMJERR] + TLNE T1,(CM%NOP) + GO CMDERR + LIST +> +DEFINE NOISE(TEXT),< + CMD [FLDDB.(.CMNOI,,<-1,,[ASCIZ "TEXT"]>)], +> +DEFINE CMDNOP(FUNC,ERR,%A),< +%A:! XLIST +IFNB ,< + MOVEI T1,[ASCIZ "ERR"] + MOVEM T1,CMDMSG +> +IFB ,< + SETZM CMDMSG +> + MOVEI T1,CSB + MOVEI T2,FUNC + SKIPN MONTYP + JRST [GO S%CMND + JRST .+3] + COMND + ERJMP [PUSH P,[%A] + JRST CMJERR] + TLNE T1,(CM%NOP) + LIST +> + +DEFINE ERR(TEXT),< + GO [HRROI T1,[ASCIZ "TEXT"] + JRST ERR%] +> + +DEFINE WARN(TEXT),< + MOVEI [ASCIZ " +% TEXT +"] + PNTALF +> +DEFINE MOVSLJ(AC,E),< + EXTEND AC,[EXP <016B8+>] +> + +DEFINE MOVST(AC,E),< + EXTEND AC,[EXP <015B8+>] +> + +OPDEF CONFIRM [GO CFMCMD] + +DEFINE OP$$AC(OP,ACLST),< + XLIST +IRP ACLST,< + OP P,ACLST +> + LIST +> + +DEFINE SAVEAC,< + OP$$AC PUSH, +> + +DEFINE RESTAC,< + OP$$AC POP, +> +SUBTTL PROGRAM PARAMETERS + +S +;*PROGRAM VARIABLE PARAMETER AREA +S + +USER: 0 ; 0 = EXEC, -1 = USER MODE FLAG +KAIFLG: 0 ;PROCESSOR TYPE, 0 = KA10, -1 = KI10 +KLFLG: 0 ;PROCESSOR TYPE, 0 = KA/KI, -1 = KL10 +MONFLG: -1 ;DIAG MONITOR SPECIAL USER FLAG +MONCTL: 0 ;DIAG MON/SYS EXR FLAG +MONTEN: 0 ;-1= LOADED BY 10 +CONSW: 0 ;CONSOLE SWITCH SETTINGS +PASCNT: 0 ;PROGRAM PASS COUNT +ITRCNT: 0 ;PROGRAM ITERATION COUNT +RUNFLG: 0 ;PROGRAM RUN FLAG +TESTPC: 0 ;SUBTEST PC +ERRPC: 0 ;ERROR PC +ERRTLS: 0 ;ERROR TOTALS +$ONETM: 0 ;SUBROUTINE INITIALIZATION FLAG + +S +;*SPECIAL PROGRAM DISPATCH ADDRESSES +S + +CPOPJ1: ;SKIP RETURN +UUOSKP: AOS (P) ;SKIP RETURN FROM UUO +CPOPJ: ;NON-SKIP REGULAR RETURN +UUOEXT: RTN ;UUO RETURN +$UUOER: JFCL ;INITED AS (JRST $UOERX) + +S +;*PROCESSOR CONTROL STORAGE +S + +$ACC0: 0 ;INTERRUPT SAVED AC0 + +$SVUUO: 0 ;CURRENT USERS UUO +$SVUPC: 0 ;PC OF CURRENT USERS UUO +S +;*UUO DISPATCH TABLE +S + XLIST +IFNDEF LUUO1, +IFNDEF LUUO2, +IFNDEF LUUO3, +IFNDEF LUUO4, +IFNDEF LUUO5, +IFNDEF LUUO6, +IFNDEF LUUO7, +IFNDEF LUUO10, +IFNDEF LUUO11, +IFNDEF LUUO12, +IFNDEF LUUO13, +IFNDEF LUUO14, +IFNDEF LUUO15, +IFNDEF LUUO16, +IFNDEF LUUO17, +IFNDEF LUUO20, +IFNDEF LUUO21, +IFNDEF LUUO22, +IFNDEF LUUO23, +IFNDEF LUUO24, +IFNDEF LUUO25, +IFNDEF LUUO26, +IFNDEF LUUO27, +IFNDEF LUUO30, +IFNDEF LUUO31, +IFNDEF LUUO32, +IFNDEF LUUO33, + LIST +UUODIS: LUUO1,,$UUOER + LUUO3,,LUUO2 + LUUO5,,LUUO4 + LUUO7,,LUUO6 + LUUO11,,LUUO10 + LUUO13,,LUUO12 + LUUO15,,LUUO14 + LUUO17,,LUUO16 + LUUO21,,LUUO20 + LUUO23,,LUUO22 + LUUO25,,LUUO24 + LUUO27,,LUUO26 + LUUO31,,LUUO30 + LUUO33,,LUUO32 + +S +;*PRINT CONTROL STORAGE +S + +PNTFLG: 0 ;PRINT FLAG, -1 WHILE IN PRINT ROUTINE +PNTENB: 0 ;PRINT ENABLE +PDISF: 0 ;PRINT DISABLED FLAG +PNTINH: 0 ;INHIBIT PRINT INPUT CHECKS +PNTSPC: 0 ;PRINT SPACE CONTROL +OPTIME: 0 ;TYPE-IN WAIT TIME +$TWCNT: 0 ;TIME WAITED +$DVOFF: 0 ;LOGICAL DEVICE INITED FLAG +$TTCHR: 0 ;ACTUAL TYPED IN CHAR +$CHRIN: 0 ;UPPER CASED & PARITY STRIPPED CHAR +$TYPNB: 0 ;TYPED IN NUMBER +$CRLF: 0 ;FREE CR/LF FLAG +$TABF: 0 ;TAB CONVERSION FLAG +$FFF: 0 ;FORM FEED CONVERSION FLAG +$VTF: 0 ;VERTICAL TAB CONVERSION FLAG +USRLFF: 0 ;USER LF FILLERS +USRCRF: 0 ;USER CR FILLERS + +CRLF: ASCII/ +/ +CRLF2: ASCII/ + +/ +RADIX: ^D10 ;DECIMAL PRINT RADIX +RADLSP: 40 ;DECIMAL PRINT LEADING CHAR +RADLSC: ^D10 ;DECIMAL PRINT LEADING CHAR COUNT + +S +;*USER MODE OUTPUT FILE INFORMATION +S + +$OBUF: BLOCK 3 ;LOGICAL FILE OUTPUT BUFFER HEADER +$OUTNM: SIXBIT /PRINT/ ;FILE NAME +$OUTEX: SIXBIT /PNT/ ;FILE NAME EXTENSION + BLOCK 2 + +S +;*PUSHDOWN LIST CONTROL INFORMATION +S + +PLIST: PLIST-PLISTE,,PLIST +PLISTS: BLOCK 200 +PLISTE: 0 ;END OF PUSHDOWN LIST + +S +;*NUMBER INPUT DIGIT FLAG +S + +TTNBRF: 0 ;-1 IF ANY DIGIT TYPED + +S +;*USER MODE MONITOR TYPE FLAG +S + +MONTYP: 0 ;0 = TOPS10, -1 = TOPS20 + +S +;*SPECIAL USERS USER MODE OUTPUT ERROR INTERCEPT INSTUCTION +S + +$$OUTER:0 ;IF NON-ZERO, XCT'D AT END OF USER MODE ERROR + +S +;*"SWITCH" CALL USAGE CONTROL +S + +$$TOGGLE:0 ;IF NON-ZERO, USE C(CONSW) FOR SWITCHES + +S +;*SM10 (KS-10) PROCESSOR TYPE FLAG +S + +SM10: 0 ;IF -1 THIS IS A KS-10 + +SALL +SUBTTL FIXED DATABASE + +EV: JRST START + JRST REEN + MCNVER,,DECVER + +PROMPT: ASCIZ "SMFILE>" + +CMDFNC: FLDDB. (.CMKEY,,MAINCM) + SCMTAB MAINCM + + CMABR D,EPOSIT,DEP + CMABR DE,OSIT,DEP + CMTAB DEBUG,SETDEB + CMTAB DEPOSIT,DEP + + CMABR E,XAMINE,EXAM + CMTAB ECHO,ECHO + CMABR EX,IT,.EXIT + CMTAB EXAMINE,EXAM + CMTAB EXIT,.EXIT + + CMTAB HELP,HELP + + CMTAB INFORMATION,INFORM + + CMTAB OUTPUT,OUTX + + CMTAB PUSH,PUSHCM + + CMTAB RDBC1,RDBC1 + CMTAB READ,READ + + CMTAB SERIAL,SERIAL + + CMTAB TAKE,TAKE + CMTAB TYPE,.TYPE + + CMTAB WRITE,WRITE + + ECMTAB + +INIT: FLDDB. .CMINI +CFM: FLDDB. .CMCFM +SUBTTL INIT PROGRAM + +START: PGMINT + + SETZM PNTSPC ;NO SPACES AFTER NUMBERS + MOVEI 16,1 ;CLEAR AC'S + SETZB 0,FIRZER ;AND LOW CORE + BLT 16,16 + MOVE T1,[FIRZER,,FIRZER+1] + BLT T1,ENDZER ;ZAP! + + MOVE T1,[.PRIIN,,.PRIOU] + MOVEM T1,CSB+.CMIOJ + + SKIPE MONTYP + JRST START1 + + OUTSTR [ASCIZ/[FOR HELP TYPE "HELP"] +/] + GO CONCIN ;INIT ^C INTERRUPT + GO S%INIT ;INIT SCANNING MODULE + GO K%INIT ;INIT KEYBOARD MODULE + GO T$INT ;INIT SPECIAL SUBRTN INPUT + GO INTCOR ;INIT CORE FOR CRAM STORE + JRST NEXT +START1: TMSG <[FOR HELP TYPE "HELP"] +> + MOVEI T1,.FHSLF + RPCAP ;GET CURRENT CAPABILITIES + ERMSG + TLO T3,(SC%CTC+SC%GTB) + EPCAP + ERMSG + + MOVEI T1,.FHSLF ;THIS FORK + MOVE T2,[LEVTAB,,CHNTAB] + SIR + ERMSG + + MOVE T1,[.TICCX,,^D30] + ATI + ERMSG + + MOVE T1,[.TICCC,,^D31] + ATI + ERMSG + + MOVE T1,[.TICCZ,,^D32] + ATI + ERMSG + + MOVE T1,[.TICCT,,^D33] + ATI + ERMSG + + MOVE T1,[.TICCo,,^D34] + ATI + ERMSG + + MOVEI T1,.FHSLF + MOVEI T2,1B19+1B30+1B31+1B32+1B33+1b34 + AIC + ERMSG + + EIR + ERMSG + + JRST NEXT ;JOIN MAIN LOOP +SUBTTL MAIN LOOP + +CMDERR: SKIPN MONTYP + JRST CMDE10 + PUSH P,T2 + MOVEI T1,.FHSLF + GETER + ERMSG + TLZ T2,-1 + CAIN T2,IFIXX3 + JRST [POP P,T2 + RET] + + SKIPN CMDMSG + JRST .+6 + + HRROI T1,[ASCIZ " +?COMMAND ERROR: "] + PSOUT + HRRO T1,CMDMSG + PSOUT + JRST REEN + + HRROI T1,[ASCIZ " +?JSYS ERROR: "] + PSOUT + MOVEI T1,.PRIOU + HRLOI T2,.FHSLF + MOVEI T3,0 + ERSTR + ERJMP . + ERJMP . + JRST REEN + +CMDE10: SKIPN CMDMSG + JRST .+5 + OUTSTR [ASCIZ/?COMMAND ERROR: /] + OUTSTR @CMDMSG + OUTSTR [ASCIZ/ +/] + JRST REEN + GO S%ERR ;REPORT SCANNER ERROR + JRST REEN + +ERR%: SKIPN MONTYP + JRST ERR%10 + ESOUT + TMSG < - ERROR AT PC > + HRRZ (P) + SOS + PNTOCF + TMSG < +> + JRST REEN +ERR%10: TTCALL 13,0 + JFCL + HRRZ 1,1 + OUTSTR [ASCIZ/?/] + OUTSTR @1 + OUTSTR [ASCIZ/ - ERROR AT PC /] + HRRZ (P) + SOS + PNTOCF + OUTSTR [ASCIZ/ +/] + CLRBFI + SETZM CCBLK+2 + JRST REEN + +T$INT: MOVE [GO $$TT0] + MOVEM $$$TT0 + MOVE [GO $$TT1] + MOVEM $$$TT1 + RTN + +$$TT0: INCHRW $TTCHR + MOVE $TTCHR + CAIE "Z"-100 + PNTCHR + RTN + +$$TT1: INCHRW + PNTCHR + RTN +REEN: MOVE T1,[.PRIIN,,.PRIOU] + MOVEM T1,CSB+.CMIOJ + +NEXT: SETZM CTADR + HRROI T1,CMDBUF + MOVEM T1,CSB+.CMBFP + MOVEM T1,CSB+.CMPTR + MOVEI T1,^D250 + MOVEM T1,CSB+.CMCNT + MOVEM T1,CSB+.CMABC + HRROI T1,ATOM + MOVEM T1,CSB+.CMABP + + CMD INIT + +PARSE: MOVE P,PLIST + MOVEI T1,PARSET + MOVEM T1,CTADR + + CMD CMDFNC, + + SETZM CTADR + HRRZ T4,(T2) ;GET DISPATCH ADDRESS + GO (T4) ;PROCESS COMMAND + + JRST NEXT +;*HERE ON AN ERROR FROM COMMAND JSYS + +CMJERR: MOVEI T1,.FHSLF + GETER + ERMSG + TLZ T2,-1 + CAIE T2,IOX4 + CALL JSHLT0 + +EOCF: MOVEI [ASCIZ " + [END OF COMMAND FILE] +SMFILE>"] + PNTALF + HLRZ T1,CSB+.CMIOJ + CLOSF + ERR + MOVE T1,[.PRIIN,,.PRIOU] + MOVEM T1,CSB+.CMIOJ + SETZM INTAKE + RTN + +;*COMMAND PARSER SUBROUTINES + +CFMCMD: CMD CFM, + HLRZ T1,CSB+.CMIOJ + CAIN T1,.PRIIN + JRST CFMCM1 + MOVEI CMDBUF + SKIPGE ECOFLG + PNTALF + RET +CFMCM1: MOVEI CMDBUF + SKIPE $DVOFF ;LOGGING ? + PNTAL + RTN + +SIXOUT: MOVE AC12,[POINT 6,AC11] + MOVEI AC13,6 + ILDB AC12 + ADDI 40 + PNTCHF + SOJG AC13,.-3 + RTN +SUBTTL COMMANDS -- INFORMATION + + SCMTAB INFO + CMTAB DISK,IDISK + CMTAB FEFILE,IFEFILE + CMTAB FREE,IFREE + CMTAB INDIRECT,FETELL + ECMTAB + +INFORM: CMD [FLDDB.(.CMKEY,,INFO)], + HRRZ T1,(T2) + PUT T1 + CONFIRM + GETIT T1 + JRST (T1) + +IFREE: SKIPN MONTYP + JRST IFREE10 + SKIPN FESETF + ERR + + PMSG <^FRONT-END FREE PAGES = > + + HRRZ FEDIR+FSL + PNTDCF + + PCRLF + PCRLF + RTN + +IFREE10:PMSGF + RTN + +IFEFILE:SKIPN FESETF + ERR + + SKIPN MONTYP + JRST IFEF10 + + PMSGF <^DISK ADDRESS IN HOME BLOCK = > + MOVE HOMPAG+200+101 + PNTHWF + + PMSGF <^LENGTH IN HOME BLOCK = > + MOVE HOMPAG+200+102 + PNTHWF + + PMSGF <^8080 POINTER IN HOME BLOCK = > + MOVE HOMPAG+200+103 + PNTHWF + + PCRLF + PCRLF + RTN + +IFEF10: PMSGF <^DISK ADDRESS IN HOME BLOCK = > + MOVE HOMBUF+101 + PNTHWF + + PMSGF <^LENGTH IN HOME BLOCK = > + MOVE HOMBUF+102 + PNTHWF + + PMSGF <^8080 POINTER IN HOME BLOCK = > + MOVE HOMBUF+103 + PNTHWF + + PCRLF + PCRLF + RTN + +IDISK: SKIPN FESETF + ERR + + SKIPN MONTYP + JRST IDSK10 ;TOPS-10 + + HRROI T1,STBUF + HRRZ T2,FEJFN + MOVSI T3,(1B2) + JFNS + ERMSG + + PMSGF <^USING > + MOVEI STBUF + PNTALF ;PRINT STRUCTURE + + PTAB + + MOVE T1,DSKTYP + CAIN T1,.MSRP4 + PMSGF + CAIN T1,.MSRP5 + PMSGF + CAIN T1,.MSRP6 + PMSGF + CAIN T1,11 + PMSGF + + PCRLF + PCRLF + RTN + +IDSK10: PMSGF <^USING > + MOVE DIRDEV + PNTSXF ;PRINT STRUCTURE + + PTAB + + MOVE T1,DSKTYP + CAIN T1,.DCUR4 + PMSGF + CAIN T1,.DCUR6 + PMSGF + CAIN T1,.DCUR3 + PMSGF + + PCRLF + PCRLF + RTN +SUBTTL COMMANDS -- PUSH + +PUSHCM: NOISE + CONFIRM + SKIPN MONTYP + JRST PUSH10 + + MOVSI T1,(GJ%SHT) + HRROI T2,[ASCIZ "PS:EXEC.EXE.0"] + GTJFN + ERMSG + + HRRZM T1,EXJFN# + MOVSI T2,(CR%CAP) + CFORK + ERMSG + + HRRZM T1,EXFORK# + HRLZ T1,T1 + HRR T1,EXJFN + GET + ERMSG + + HRRZ T1,EXFORK + MOVEI T2,0 + SFRKV + ERMSG + + WFORK +pushpc: ERMSG + + KFORK + ERMSG + + RTN + +PUSH10: PMSGF + RTN +SUBTTL COMMANDS -- DEBUG + + SCMTAB SETCLR + CMTAB CLEAR,[0] + CMTAB SET,[-1] + ECMTAB + + SCMTAB DBFLGS + CMTAB DEBUG,DEBUGF + ECMTAB + + +SETDEB: CMD [FLDDB.(.CMKEY,,SETCLR)], + HRRZ T1,(T2) ;GET POINTER + MOVE T6,(T1) ;GET FLAG + CMD [FLDDB.(.CMKEY,,DBFLGS)], + HRRZ T5,(T2) ;PLACE TO STORE ANSWER + NOISE + CONFIRM + MOVEM T6,(T5) ;SET/CLEAR FLAG + RTN + +SUBTTL COMMANDS -- ECHO + + SCMTAB YESNO + CMTAB NO,0 + CMTAB YES,777777 + ECMTAB + +ECHO: NOISE + CMD [FLDDB.(.CMKEY,,YESNO,,)] + HRRE T1,(T2) + PUT T1 + CONFIRM + GETIT ECOFLG + RTN +SUBTTL COMMANDS -- DEPOSIT + + SCMTAB DEPCMD + CMTAB BC1,DPBC1 + CMTAB CRAM,DPCRAM + ECMTAB + +DEP: CMD [FLDDB.(.CMKEY,,DEPCMD)], + HRRZ T1,(T2) + JRST (T1) + +;*HERE TO STORE INTO CRAM + +DPBC1: SETOM BC1FLG# + JRST DPCRAM+1 +DPCRAM: SETZM BC1FLG + NOISE + CMD [FLDDB.(.CMNUM,,^D8)], + SKIPL T2 + CAIL T2,4000 + ERR
+ MOVEM T2,EXMADR + CONFIRM + MOVE T6,EXMADR + SETOM DEPFLG + GO DPYFLD + RTN +SUBTTL COMMANDS -- SERIAL + +SERIAL: NOISE + CMD [FLDDB.(.CMNUM,,^D10)], + MOVEM T2,SNBR# + CONFIRM + + MOVE T2,SNBR + SKIPL T2 + CAIGE T2,^D4097 + ERR + CAILE T2,^D32767 + ERR + + SKIPN RDFLAG + ERR + + MOVEI T6,1700 ;SERIAL # AT APRID: (1700) OF MICROCODE + IMULI T6,3 + ADDI T6,CRAM + + DPB T2,[POINT 12,1(T6),23] + LSH T2,-^D12 + DPB T2,[POINT 6,1(T6),35] + + JRST ENDDPY+2 ;RECOMPUTE CRAM PARITY +SUBTTL COMMANDS -- EXAMINE + + SCMTAB EXCMDS + CMTAB BC1,EXBC1 + CMTAB CRAM,EXCRAM + ECMTAB + +EMDFNC: FLDDB. (.CMKEY,,EXCMDS) + +EXAM: CMD EMDFNC, + HRRZ T1,(T2) + JRST (T1) + +;*EXAMINE CRAM + +EXBC1: SETOM BC1FLG + JRST EXCRAM+1 +EXCRAM: SETZM BC1FLG + NOISE + CMD [FLDDB.(.CMNUM,,^D8)], + PUSH P,T2 + CONFIRM + POP P,T2 + SKIPL T2 + CAIL T2,4000 + ERR ADDRESS MUST BE 0 TO 3777 + MOVEM T2,EXMADR +EXCRM: PNTMSF [ASCIZ/SHOULD BE: /] + MOVE EXMADR + PNT6F + PNTCIF "/" + MOVE T6,EXMADR + IMULI T6,3 + SKIPN BC1FLG + ADDI T6,CRAM + SKIPE BC1FLG + ADDI T6,CRMBC1 + MOVE 2(T6) + PNT8F + MOVE 1(T6) + PNTOTF + MOVE (T6) + PNTOTF + + GO CRMFLD + PCRLF + RET +SUBTTL COMMANDS -- EXIT + +.EXIT: NOISE + CONFIRM + SKIPN MONTYP + EXIT + HALTF + JRST START + +SUBTTL COMMANDS -- HELP + +HELP: CONFIRM + SKIPN MONTYP + JRST HELP10 + MOVSI T1,(GJ%OLD!GJ%PHY!GJ%SHT) + HRROI T2,HLPFIL + GTJFN + JRST NOHELP + MOVE T2,[7B5!OF%RD!OF%NWT] + OPENF + JRST NOHELP + MOVEI T6,.PRIOU +HELPLP: BIN + ERJMP HELPEX + EXCH T1,T6 + BOUT + EXCH T1,T6 + JRST HELPLP + +HELPEX: CLOSF + ERR + RTN + +NOHELP: PMSGF + MOVEI HLPFIL + PNTALF + PCRLF + RTN + +HLPFIL: ASCIZ "SMFILE.HLP" +;*TOPS-10 HELP + +HELP10: MOVE [SIXBIT/DSK/] + MOVEM GTJDEV + SETZM GTJDIR + MOVE [SIXBIT/SMFILE/] + MOVEM GTJFIL + MOVE [SIXBIT/HLP/] + MOVEM GTJEXT + + GO OPNTEN ;FIND FILE + ERR + +HLP10A: GO GET10 + SKIPGE EOFSW + JRST R10EOF + + MOVEM T3,HLP10X# + MOVEI HLP10X + PNTA + JRST HLP10A +SUBTTL COMMANDS -- WRITE + + SCMTAB WRTCMD + CMTAB BC1,WRTBC1 + CMTAB BC2,WRTBC2 + CMTAB BOOT,WRTBOOT + CMTAB CRAM,WRTCRM + CMTAB DIAGBT,WRTDB + CMTAB DONE,WRTDONE + CMTAB INDIRECT,WRTFEF + CMTAB RESET,WRTRSET + CMTAB SETUP,WRTSET + ECMTAB + +WRITE: CMD [FLDDB.(.CMKEY,,WRTCMD)], + HRRZ T1,(T2) + JRST (T1) +;*WRTSET - READ FE-FILE DIRECTORY BLOCK INTO MEMORY + +WRTSET: HRROI T1,[ASCIZ "BOOTSTRAP"] + SKIPE DEBUGF + HRROI T1,[ASCIZ "BOOTST"] + SKIPN MONTYP + HRROI T1,[ASCIZ "KS10FE"] + MOVEM T1,GTJFIL + + HRROI T1,[ASCIZ "BIN"] + MOVEM T1,GTJEXT + + HRROI T1,[ASCIZ "ROOT-DIRECTORY"] + SKIPE DEBUGF + HRROI T1,[ASCIZ "KIRCHOFF"] + SKIPN MONTYP + HRROI T1,[ASCIZ "[6,2020]"] + MOVEM T1,GTJDIR + + HRROI T1,[ASCIZ "XXX:"] + MOVEM T1,GTJDEV + + MOVSI T1,(GJ%OLD) + MOVEM T1,GTJFLG + + CMD [FLDDB.(.CMFIL)] + HRRZM T2,FEJFN + + CONFIRM + + SKIPN MONTYP + JRST DEVSTR ;TOPS-10 + + HRROI T1,STBUF + HRRZ T2,FEJFN + MOVSI T3,(1B2) + JFNS + ERMSG + + SKIPN DEBUGF + GO FIND ;FIND PHYSICAL DISK + + HRROI T1,STBUF + STDEV + ERR + MOVEM T2,STRDES# + + HRRZ T1,FEJFN + MOVE T2,[1,,.FBCTL] + MOVEI T3,T3 + GTFDB + ERMSG + TLNE T3,(FB%NXF) ;DOES FILE EXIST + ERR + + MOVE T2,[1,,.FBBYV] + MOVEI T3,T3 + GTFDB + ERMSG + TLZ T3,FB%PGC ;JUST PAGE COUNT + CAIGE T3,^D48 + ERR + + MOVE T1,FEJFN + MOVEI T2,OF%RD!OF%WR + OPENF ;OPEN THE FILE + JRST [JSERR ;CAN'T OPEN THE FRONT-END FILE SYSTEM? + JRST START] + + HRLZ T1,FEJFN + MOVE T2,[.FHSLF,,] + MOVE T3,[PM%RD+PM%WR+PM%PLD] + PMAP ;READ FE DIRECTORY BLOCK + ERJMP [JSERR + JRST START] + + SKIPE DEBUGF + JRST WRTSEX + + MOVEI T1,0 + GO REDHOM ;READ HOME BLOCK + RTN + + SKIPN HOMPAG+200+101 + ERR + + SKIPN HOMPAG+200+102 + ERR + +WRTSEX: SETOM FESETF# + SETZM FERSETF# + RTN +;*WRTRSET - RESET FE-DIRECTORY + +WRTRSET:CONFIRM + SKIPN FESETF ;FE-DIR IN CODE ? + ERR + + SETZM FEDIR ;CLEAR FE-DIR PAGE + MOVE [FEDIR,,FEDIR+1] + BLT FEDIR+777 + + SKIPE MONTYP + MOVE T1,HOMPAG+200+102 ;GET LENGTH IN SECTORS + SKIPN MONTYP + MOVE T1,HOMBUF+102 + SKIPE DEBUGF + MOVEI T1,^D64*4 + + IDIVI T1,^D4 ;CONVERT TO PAGES + SUBI T1,^D28 ;SUB FIXED FILES + HRLI T1,^D28 ;FIRST FREE PAGE STARTS AT PAGE 28 + MOVEM T1,FEDIR+FSL ;SET RESET PAGE #,,LENGTH + + MOVE T1,[^D1,,^D12] + MOVEM T1,FEDIR+MCL ;SETUP MCODE PAGE #,,LENGTH + + MOVE T1,[^D13,,^D1] + MOVEM T1,FEDIR+MPBL ;SETUP M-PRE-BOOT PAGE #,,LENGTH + + MOVE T1,[^D14,,^D1] + MOVEM T1,FEDIR+DPBL ;SETUP D-PRE-BOOT PAGE #,,LENGTH + + MOVE T1,[^D15,,^D12] + MOVEM T1,FEDIR+BC1L ;SETUP BOOTCHECK 1 PAGE #,,LENGTH + + MOVE T1,[^D27,,^D1] + MOVEM T1,FEDIR+BCKL ;SETUP BC2-PRE-BOOT PAGE #,,LENGTH + + SETOM FERSETF ;INDICATE RESET + + RTN +;*FIND - FIND THE PHYSICAL DISK WITH THE GIVEN NAME + +FIND: MOVEI T6,ARGBLK ;SET ARG BLOCK INDEX + SETOM .MSRCH(T6) ;-1 TO CHAN ENTRY OF BLOCK + SETOM .MSRCT(T6) ;-1 TO CONTROLLER ENTRY OF BLOCK + SETOM .MSRUN(T6) ;-1 TO UNIT ENTRY OF BLOCK + +FINDN: SETZM .MSRST(T6) ;CLEAR STATUS ENTRY OF BLOCK + MOVE T1,[ARGBLK+.MSRST,,ARGBLK+.MSRST+1] + BLT T1,ARGBLK+ARGLN-1 ;CLEAR REST OF BLOCK + + HRROI T1,BUFFER + MOVEM T1,.MSRSN(T6) ;USE BUFFER TO SAVE PACK NAME + + MOVE T1,[.MSRLN,,.MSRNU] + MOVEI T2,ARGBLK +MS: MSTR ;GET STATUS OF NEXT DISK UNIT + ERCAL FINDER ; ERROR + + CAIN T2,MSTX27 ;ERROR, IS THE UNIT A DISK ? + JRST FINDN ;NO, NOT A DISK, TRY FOR ANOTHER + + MOVE T1,.MSRST(T6) ;GET UNIT STATUS + TLNN T1,(MS%MNT) ;MOUNTED ? + JRST FINDN ;NO, TRY ANOTHER + TLNE T1,(MS%OFL) ;IS THE UNIT OFF-LINE ? + JRST FINDN ;YES, TRY ANOTHER + + MOVE T2,[POINT 7,STBUF] + MOVE T3,[POINT 7,BUFFER] + GO STRCMP ;COMPARE REQUESTED/DISK NAME + JRST FINDN ;NO MATCH + + MOVE T1,.MSRST(T6) ;GET MONITORS DRIVE TYPE + LDB T1,[POINT 9,T1,17] + MOVEM T1,DSKTYP# ;SAVE + + SETZM RM03F# + CAIN T1,.MSRP4 ;RP04 ? + JRST FINDX ;YES + CAIN T1,.MSRP5 ;RP05 ? + JRST FINDX ;YES + CAIN T1,.MSRP6 ;RP06 ? + JRST FINDX ;YES + CAIE T1,11 ;.MSRM3 RM03 ? + ERR + SETOM RM03F ;YES + +FINDX: RTN + + ARGLN=.MSRLN +ARGBLK: BLOCK ARGLN + +;ERROR HANDLER FOR THE GET NEXT UNIT JSYS + +FINDER: MOVEI T1,400000 ;SET PROCESS HANDLE + GETER ;GET ERROR CODE + HRRZ T2,T2 ;ERROR CODE ONLY + CAIN T2,MSTX27 ;IS THE UNIT A DISK ? + RTN ;NO, GO BACK AND LOOK FURTHER + CAIE T2,MSTX18 ;NO MORE UNITS FOUND ? + JRST [JSERR + JRST START] + GETIT T6 + JRST FALIAS ;CAN'T FIND PHYSICAL, TRY ALIAS + +;*STRCMP - STRING COMPARE ROUTINE + +STRCMP: ILDB 0,T2 + ILDB T1,T3 + CAME 0,T1 ;EQUAL ? + RTN ;NO, LOSE + + JUMPN 0,STRCMP ;YES, END OF STRING ? + JRST CPOPJ1 ;YES, SKIP RETURN +;*FALIAS - FIND THE PHYSICAL DISK WITH THE GIVEN ALIAS + +FALIAS: MOVEI T6,ARGBLK ;SET ARG BLOCK INDEX + SETOM .MSRCH(T6) ;-1 TO CHAN ENTRY OF BLOCK + SETOM .MSRCT(T6) ;-1 TO CONTROLLER ENTRY OF BLOCK + SETOM .MSRUN(T6) ;-1 TO UNIT ENTRY OF BLOCK + +FADN: SETZM .MSRST(T6) ;CLEAR STATUS ENTRY OF BLOCK + MOVE T1,[ARGBLK+.MSRST,,ARGBLK+.MSRST+1] + BLT T1,ARGBLK+ARGLN-1 ;CLEAR REST OF BLOCK + + HRROI T1,BUFFER + MOVEM T1,.MSRSA(T6) ;USE BUFFER TO SAVE PACK ALIAS + + MOVE T1,[.MSRLN,,.MSRNU] + MOVEI T2,ARGBLK +FAMS: MSTR ;GET STATUS OF NEXT DISK UNIT + ERCAL FADER ; ERROR + + CAIN T2,MSTX27 ;ERROR, IS THE UNIT A DISK ? + JRST FADN ;NO, NOT A DISK, TRY FOR ANOTHER + + MOVE T1,.MSRST(T6) ;GET UNIT STATUS + TLNN T1,(MS%MNT) ;MOUNTED ? + JRST FADN ;NO, TRY ANOTHER + TLNE T1,(MS%OFL) ;IS THE UNIT OFF-LINE ? + JRST FADN ;YES, TRY ANOTHER + + MOVE T2,[POINT 7,STBUF] + MOVE T3,[POINT 7,BUFFER] + GO STRCMP ;COMPARE REQUESTED/DISK NAME + JRST FADN ;NO MATCH + MOVE T1,.MSRST(T6) ;GET MONITORS DRIVE TYPE + LDB T1,[POINT 9,T1,17] + MOVEM T1,DSKTYP# ;SAVE + + SETZM RM03F# + CAIN T1,.MSRP4 ;RP04 ? + JRST FINDAX ;YES + CAIN T1,.MSRP5 ;RP05 ? + JRST FINDAX ;YES + CAIN T1,.MSRP6 ;RP06 ? + JRST FINDAX ;YES + CAIE T1,11 ;.MSRM3 RM03 ? + ERR + SETOM RM03F ;YES + +FINDAX: RTN + +;ERROR HANDLER FOR THE GET NEXT UNIT JSYS + +FADER: MOVEI T1,400000 ;SET PROCESS HANDLE + GETER ;GET ERROR CODE + HRRZ T2,T2 ;ERROR CODE ONLY + CAIN T2,MSTX27 ;IS THE UNIT A DISK ? + RTN ;NO, GO BACK AND LOOK FURTHER + CAIN T2,MSTX18 ;NO MORE UNITS FOUND ? + ERR + JRST [JSERR + JRST START] + +;*COMPUTE DIAGNOSTIC PRE-BOOT PAGE POINTER + +CPBPNTR:MOVEI SMPREB ;GET START ADR OF PRE-BOOT + ADDI 5 ;ADD OFFSET TO POINTER + MOVE 0,@0 ;GET POINTER TO POINTER BLOCK + HLRZ 1,0 ;GET LH CODE WORD + CAIE 1,123456 ;IS IT CORRECT ? + ERR + SUBI 0,1000 ;REMOVE OFFSET + ADDI 0,SMPREB ;ADD ACTUAL LOCATION + HRRZM 0,SMPBPG# ;SAVE + HRL 0,0 ;FORM BLT POINTER + ADDI 0,1 + MOVEM 0,SMPBBLT# ;SAVE + RTN + +;DEFINITIONS FOR SM10 + +BOORG=1000 ;START OF HARDWARE BOOT +FEADR=101 ;ADDRESS OF BOOTSTRAP +FEMAX=102 ;ADDRESS OF LENGTH POINTER + +OPDEF WRUBR [701B8+3B12] ;WRITE USER BASE REGISTER +OPDEF RDIO [712B8] ;READ I/O +OPDEF TION [711B8] ;TEST I/O +OPDEF WRIO [713B8] ;WRITE I/O + +UBAP0= 763000 ;ADDRESS OF UNIBUS MAP +UBSTAT= 763100 ;ADDRESS OF UNIBUS STATUS + +KPALIVE=31 ;KEEP-ALIVE & STATUS WORD +MSRH= 36 ;RH-11 BASE ADDRESS +MSDRIVE=37 ;DRIVE NUMBER +MSSLAVE=40 ;SLAVE & FORMAT + +RIPST=21 ;READ IN PRESET +RDATA=71 ;READ DATA +RDY=200 ;READY +MCPE=20000 ;MASS I/O CONTROL BUS PARITY ERROR +TRE=40000 ;TRANSFER ERROR +SC=100000 ;SPECIAL CONDITION +FMT22=10000 ;FORMAT 22 (FORMAT BIT) + +RHCLR= 40 ;CONTROLLER CLEAR + +MT.RF= 71 ;READ FORWARD +MT.SF= 31 ;SPACE FILE FORWARD +MT.SR= 33 ;SPACE REVERSE +MTTM= 4 ;TAPE MARK +MTPIP= 20000 ;POSITIONING IN PROGRESS +MTDRY= 200 ;DRIVE READY +MTFCE= 1000 ;FRAME COUNT ERROR + +;REGISTER DEFINITIONS + +RPCS1= 00 ;CONTROL AND STATUS 1 +RPWC= 02 ;WORD COUNT REGISTER +RPBA= 04 ;UNIBUS ADDRESS REGISTER +RPDA= 06 ;DESIRED SECTOR/TRACK ADDRESS REGISTER +RPCS2= 10 ;CONTROL AND STATUS 2 +RPDS= 12 ;DRIVE STATUS +RPER1= 14 ;ERROR 1 +RPER2= 40 ;ERROR 2 +RPER3= 42 ;ERROR 3 +RPOF= 32 ;OFFSET REGISTER +RPDC= 34 ;DESIRED CYLINDER REGISTER +RPFC= 6 ;MAGTAPE FRAME COUNTER +RPTC= 32 ;MAGTAPE TAPE CONTROL + +UNV36X=100000 ;UNIBUS 36 BIT TRANSFER BIT +UBVBIT==40000 ;UNIBUS VALID BIT + +BUFFER: BLOCK +BTJFN: BLOCK 1 ;BOOT JFN +FEJFN: BLOCK 1 ;JFN FOR THE FRONT-END FILE SYSTEM +BOOTEV: BLOCK 1 ;ENTRY VECTOR FOR BOOT +FORKN: BLOCK 1 +;*WRTBOOT - WRITE MONITOR PRE-BOOT AND BOOT ON DISK + +WRTBOOT:HRROI T1,[ASCIZ "SMBOOT"] + MOVEM T1,GTJFIL + + HRROI T1,[ASCIZ "EXE"] + MOVEM T1,GTJEXT + + SETZM GTJDEV + SETZM GTJDIR + + MOVSI T1,(GJ%OLD) + MOVEM T1,GTJFLG + + CMD [FLDDB.(.CMFIL)] + MOVEM T2,BTJFN ;SAVE THE JFN OF THE BOOT FILE + + CONFIRM + + SKIPN FESETF ;FE-DIR IN CORE ? + ERR + SKIPN FERSETF + ERR + + SETZM RPPAGD + MOVE [RPPAGD,,RPPAGD+1] + BLT RPPAGX ;CLEAR PRE-BOOT POINTER STORAGE + + SKIPN MONTYP + JRST WB10 ;TOPS-10 + + SETZB T1,T2 ;CREATE A BLANK FORK + CFORK + ERJMP [JSERR ;ERROR ON CFORK + HALTF] + MOVEM T1,FORKN ;SAVE FORK + + HRRZ T1,BTJFN ;GET THE JFN OF THE BOOT + HRL T1,FORKN ;GET PROCESS HANDLE + SETZ T2,0 + GET + ERJMP [JSERR ;ERROR ON GET + JRST START] + + MOVE T1,FORKN + GEVEC ;GET THE VECTOR OF BOOT + MOVEM T2,BOOTEV ;SAVE BOOT ENTRY VECTOR ADDRESS + + SETZ T3, ;CLEAR PAGE COUNTER + MOVE T4,[-1000,,0] ;ALLOW FOR 1000 PAGES + HRLZ T1,FORKN ;GET PROCESS HANDLE + HRR T1,T4 ;GET PAGE NUMBER + + RPACS ;READ PAGE ACCESS + TDNE T2,[PA%RD!PA%PEX] + AOS T3 ;IT'S THERE, COUNT IT + AOBJN T4,.-5 + + HRRZ T1,FEDIR+FSL ;GET PRESENT FREE SPACE LENGTH + CAMGE T1,T3 ;ENOUGH ROOM ? + ERR + + SETZM WINDOW + MOVE [WINDOW,,WINDOW+1] + BLT WINDOW+777 ;CLEAR MONITOR PRE-BOOT PAGE + + MOVE T4,[-1000,,0] ;ALLOW FOR 1000 PAGES + HRLZ P1,FEJFN ;GET JFN OF FRONT-END-FILE SYSTEM + HLR P1,FEDIR+FSL ;GET FREE SPACE PAGE # + HRLZM P1,FEDIR+MBOOTL ;SET MBOOT START PAGE + + MOVEI P2,RPPAGD + SETZM PBCNT# + HLRZ T7,FEDIR+MBOOTL + +PAGELP: HRLZ T1,FORKN ;GET PROCESS HANDLE + HRR T1,T4 ;GET PAGE NUMBER + RPACS ;READ PAGE ACCESS + TDNE T2,[PA%RD!PA%PEX] + GO COPPAG ;COPY PAGE + + AOBJN T4,PAGELP ;TRY ANOTHER PAGE + + ANDI P1,-1 + HRLM P1,FEDIR+FSL ;RESET FREE SPACE START PAGE + HRRZ 0,FEDIR+FSL ;FREE SPACE NOW SMALLER BY BOOT + SUB 0,PBCNT + HRRM 0,FEDIR+FSL + + MOVE P1,PBCNT + HRRM P1,FEDIR+MBOOTL ;SET MBOOT LENGTH + + SETOM (P2) ;INDICATE END OF SPACE + + MOVE T1,BOOTEV ;FIND ENTRY VECTOR + HRRZM T1,1(P2) ;SET ENTRY VECTOR + + HRLZ T1,FEJFN + HRRI T1,^D13 + MOVE T2,[.FHSLF,,] + MOVE T3,[PM%WR!PM%RD] + PMAP ;GET MONITOR PRE-BOOT IN FE-FILE + ERJMP [JSERR + JRST START] + + MOVE [BTSTR1,,WINDOW] + BLT WINDOW+ + + SETO T1, + SETZ T3, + PMAP ;PUT MONITOR PRE-BOOT IN FE-FILE + ERJMP [JSERR + JRST START] + + MOVE T1,FORKN + KFORK ;KILL "GET" FORK + ERJMP [JSERR + JRST START] + + RTN +;*WRTDB - WRITE DIAGNOSTIC PRE-BOOT AND "SMMON" ON DISK + +WRTDB: HRROI T1,[ASCIZ "SMMON"] + MOVEM T1,GTJFIL + + HRROI T1,[ASCIZ "EXE"] + MOVEM T1,GTJEXT + + SETZM GTJDEV + SETZM GTJDIR + + MOVSI T1,(GJ%OLD) + MOVEM T1,GTJFLG + + CMD [FLDDB.(.CMFIL)] + MOVEM T2,BTJFN ;SAVE THE JFN OF THE BOOT FILE + + CONFIRM + + SKIPN FESETF ;FE-DIR IN CODE ? + ERR + SKIPN FERSETF + ERR + + GO CPBPNTR ;COMPUTE DIAGNOSTIC PRE-BOOT POINTER + + SETZM @SMPBPG + MOVE SMPBBLT + BLT SMPEND ;CLEAR PRE-BOOT POINTER STORAGE + + SKIPN MONTYP + JRST WDB10 ;TOPS-10 + + SETZB T1,T2 ;CREATE A BLANK FORK + CFORK + ERJMP [JSERR ;ERROR ON CFORK + HALTF] + MOVEM T1,FORKN ;SAVE FORK + + HRRZ T1,BTJFN ;GET THE JFN OF THE BOOT + HRL T1,FORKN ;GET PROCESS HANDLE + SETZ T2,0 + GET + ERJMP [JSERR ;ERROR ON GET + JRST START] + + MOVE T1,FORKN + GEVEC ;GET THE VECTOR OF BOOT + MOVEM T2,BOOTEV ;SAVE BOOT ENTRY VECTOR ADDRESS + + SETZ T3, ;CLEAR PAGE COUNTER + MOVE T4,[-1000,,0] ;ALLOW FOR 1000 PAGES + HRLZ T1,FORKN ;GET PROCESS HANDLE + HRR T1,T4 ;GET PAGE NUMBER + + RPACS ;READ PAGE ACCESS + TDNE T2,[PA%RD!PA%PEX] + AOS T3 ;IT'S THERE, COUNT IT + AOBJN T4,.-5 + + HRRZ T1,FEDIR+FSL ;GET PRESENT FREE SPACE LENGTH + CAMGE T1,T3 ;ENOUGH ROOM ? + ERR + + SETZM WINDOW + MOVE [WINDOW,,WINDOW+1] + BLT WINDOW+777 ;CLEAR DIAG PRE-BOOT PAGE + + MOVE T4,[-1000,,0] ;ALLOW FOR 1000 PAGES + HRLZ P1,FEJFN ;GET JFN OF FRONT-END-FILE SYSTEM + HLR P1,FEDIR+FSL ;GET FREE SPACE PAGE # + HRLZM P1,FEDIR+DBOOTL ;SET DBOOT START PAGE + + MOVE P2,SMPBPG + SETZM PBCNT + HLRZ T7,FEDIR+DBOOTL + +WRTDBLP:HRLZ T1,FORKN ;GET PROCESS HANDLE + HRR T1,T4 ;GET PAGE NUMBER + RPACS ;READ PAGE ACCESS + TDNE T2,[PA%RD!PA%PEX] + GO COPPAG ;COPY PAGE + + AOBJN T4,WRTDBLP ;TRY ANOTHER PAGE + + ANDI P1,-1 + HRLM P1,FEDIR+FSL ;RESET FREE SPACE START PAGE + HRRZ 0,FEDIR+FSL ;FREE SPACE NOW SMALLER BY BOOT + SUB 0,PBCNT + HRRM 0,FEDIR+FSL + + MOVE P1,PBCNT + HRRM P1,FEDIR+DBOOTL ;SET DBOOT LENGTH + + SETOM (P2) ;INDICATE END OF SPACE + + MOVE T1,BOOTEV ;FIND ENTRY VECTOR + HRRZM T1,1(P2) ;SET ENTRY VECTOR + + HRLZ T1,FEJFN + HRRI T1,^D14 + MOVE T2,[.FHSLF,,] + MOVE T3,[PM%WR!PM%RD] + PMAP ;GET DIAG PRE-BOOT IN FE-FILE + ERJMP [JSERR + JRST START] + + MOVE [SMPREB,,WINDOW] + BLT WINDOW+777 + + SETO T1, + SETZ T3, + PMAP ;PUT DIAG PRE-BOOT IN FE-FILE + ERJMP [JSERR + JRST START] + + MOVE T1,FORKN + KFORK ;KILL "GET" FORK + ERJMP [JSERR + JRST START] + + RTN +;*WRTBC2 - WRITE BOOTCHECK 2 PRE-BOOT AND "SMBC2" ON DISK + +WRTBC2:HRROI T1,[ASCIZ "SMBC2"] + MOVEM T1,GTJFIL + + HRROI T1,[ASCIZ "EXE"] + MOVEM T1,GTJEXT + + SETZM GTJDEV + SETZM GTJDIR + + MOVSI T1,(GJ%OLD) + MOVEM T1,GTJFLG + + CMD [FLDDB.(.CMFIL)] + MOVEM T2,BTJFN ;SAVE THE JFN OF THE BC2 FILE + + CONFIRM + + SKIPN FESETF ;FE-DIR IN CODE ? + ERR + SKIPN FERSETF + ERR + + GO CPBPNTR ;COMPUTE DIAGNOSTIC PRE-BOOT POINTER + + SETZM @SMPBPG + MOVE SMPBBLT + BLT SMPEND ;CLEAR PRE-BOOT POINTER STORAGE + + SKIPN MONTYP + JRST BC210 ;TOPS-10 + + SETZB T1,T2 ;CREATE A BLANK FORK + CFORK + ERJMP [JSERR ;ERROR ON CFORK + HALTF] + MOVEM T1,FORKN ;SAVE FORK + + HRRZ T1,BTJFN ;GET THE JFN OF THE BOOT + HRL T1,FORKN ;GET PROCESS HANDLE + SETZ T2,0 + GET + ERJMP [JSERR ;ERROR ON GET + JRST START] + + MOVE T1,FORKN + GEVEC ;GET THE VECTOR OF BOOT + MOVEM T2,BOOTEV ;SAVE BOOT ENTRY VECTOR ADDRESS + + SETZ T3, ;CLEAR PAGE COUNTER + MOVE T4,[-1000,,0] ;ALLOW FOR 1000 PAGES + HRLZ T1,FORKN ;GET PROCESS HANDLE + HRR T1,T4 ;GET PAGE NUMBER + + RPACS ;READ PAGE ACCESS + TDNE T2,[PA%RD!PA%PEX] + AOS T3 ;IT'S THERE, COUNT IT + AOBJN T4,.-5 + + HRRZ T1,FEDIR+FSL ;GET PRESENT FREE SPACE LENGTH + CAMGE T1,T3 ;ENOUGH ROOM ? + ERR + + SETZM WINDOW + MOVE [WINDOW,,WINDOW+1] + BLT WINDOW+777 ;CLEAR BC2 PRE-BOOT PAGE + + MOVE T4,[-1000,,0] ;ALLOW FOR 1000 PAGES + HRLZ P1,FEJFN ;GET JFN OF FRONT-END-FILE SYSTEM + HLR P1,FEDIR+FSL ;GET FREE SPACE PAGE # + HRLZM P1,FEDIR+BCHKL ;SET BC2 START PAGE + + MOVE P2,SMPBPG + SETZM PBCNT + HLRZ T7,FEDIR+BCHKL + +BC2LP: HRLZ T1,FORKN ;GET PROCESS HANDLE + HRR T1,T4 ;GET PAGE NUMBER + RPACS ;READ PAGE ACCESS + TDNE T2,[PA%RD!PA%PEX] + GO COPPAG ;COPY PAGE + + AOBJN T4,BC2LP ;TRY ANOTHER PAGE + + ANDI P1,-1 + HRLM P1,FEDIR+FSL ;RESET FREE SPACE START PAGE + HRRZ 0,FEDIR+FSL ;FREE SPACE NOW SMALLER BY BC2 + SUB 0,PBCNT + HRRM 0,FEDIR+FSL + + MOVE P1,PBCNT + HRRM P1,FEDIR+BCHKL ;SET BC2 LENGTH + + SETOM (P2) ;INDICATE END OF SPACE + + MOVE T1,BOOTEV ;FIND ENTRY VECTOR + HRRZM T1,1(P2) ;SET ENTRY VECTOR + + HRLZ T1,FEJFN + HRRI T1,^D27 + MOVE T2,[.FHSLF,,] + MOVE T3,[PM%WR!PM%RD] + PMAP ;GET BC2 PRE-BOOT IN FE-FILE + ERJMP [JSERR + JRST START] + + MOVE [SMPREB,,WINDOW] + BLT WINDOW+777 + + SETO T1, + SETZ T3, + PMAP ;PUT BC2 PRE-BOOT IN FE-FILE + ERJMP [JSERR + JRST START] + + MOVE T1,FORKN + KFORK ;KILL "GET" FORK + ERJMP [JSERR + JRST START] + + RTN + +COPPAG: PUT T1 + PUT T3 + + SETZM PAG0FLG# + HRRZ T3,T1 + CAIN T3,1 ;IS THIS PAGE 1 ? + ERR + + CAIN T3,0 ;IS THIS PAGE 0 ? + SETOM PAG0FLG ;IF PAGE 0 OF FILE, SET FLAG + GETIT T3 + GETIT T1 + + SKIPE PAG0FLG ;IF PAGE 0, IGNORE IT + RTN + + PUT T1 + MOVE T6,P2 + GO SBOOTP ;SET 8080 POINTER + AOS P2 + + GETIT T1 + HRRZM T1,0(P2) ;SET A POINTER TO PAGE NUMBER + AOS P2 ;POINT TO NEXT + + PUT T1 + HRRZ T3,T1 ;FIND THE PAGE + + HRL T1,FORKN ;GET FORK NUMBER + HRR T1,T3 ;GET PAGE NUMBER + MOVE T2,[.FHSLF,,] + MOVE T3,[PM%RD] + PMAP ;GET PAGE IN SELF + ERJMP [JSERR + JRST START] + + MOVE T1,P1 ;SET UP PMAP ARGUMENTS + MOVE T2,[.FHSLF,,] + MOVSI T3,(PM%WR!PM%RD) + PMAP + ERJMP [JSERR + JRST START] ;JSYS ERROR + + MOVE T3,[GENPAG,,IPAG] + BLT T3,IPAG+777 + + SETO T1, + SETZ T3, + PMAP + ERJMP [JSERR + JRST START] ;JSYS ERROR + + GETIT T3 ;REMOVE PAGE NUMBER + AOS P1 ;UPDATE P1 ARGUMENTS + AOS PBCNT ;COUNT PAGES + ADDI T7,1 ;UPDATE DISK ADDRESS + RTN ;RETURN +;HERE TO READ MONITOR BOOT EXE FILE + +WB10: GO OPNTEN ;OPEN INPUT FILE + ERR + + MOVE T1,LOOK10+.RBNAM + MOVEM T1,O.NAM1 ;SAME NAME AS INPUT + + MOVSI T1,(SIXBIT/RIM/) + MOVEM T1,O.EXT ;OUTPUT EXT IS ".RIM" + + MOVE T1,LOOK10+.RBVER + MOVEM T1,O.VER ;USE INPUT VERSION AS OUTPUT VERSION + + LDB T1,[POINT 11,LOOK10+.RBPRV,23] + MOVEM T1,O.TIME ;USE INPUT TIME AND DATE AS OUTPUT + + LDB T1,[POINT 3,LOOK10+.RBEXT,20] + DPB T1,[POINT 3,O.DATE,23] + LDB T1,[POINT 12,LOOK10+.RBPRV,35] + DPB T1,[POINT 12,O.DATE,35] + + MOVE T1,DIRDIR ;USE WRTSET'S PPN + MOVEM T1,O.PPN + + MOVE T1,DIRDEV ;USE WRTSET'S DEVICE + MOVEM T1,O.DEV + + MOVEI T1,577 ;SET PROTECTION TO 577 + MOVEM T1,O.PRT + + MOVE T1,LOOK10+.RBSIZ ;GET FILE SIZE IN WORDS + TRNE T1,777 + ERR + SOS T1 ;MINUS EXE DIR PAGE + IDIVI T1,^D512 ;CONVERT TO PAGES + MOVEM T1,FEDIR+MBOOTL ;SET MONITOR BOOT LENGTH + IMULI T1,4 ;CONVERT TO BLOCKS + MOVEM T1,S.ALO ;SET FOR ALLOCATION + + GO ETER10 ;ENTER OUTPUT FILE + ERR + +;*NOW READ EXE FILE + + SETZM SELPAG# + GO REDDIR ;READ THE DIRECTORY PAGE + + HLRZ A,DBUF ;DIRECTORY DESCRIPTOR + HRRZ T6,DBUF ;LENGTH OF THE DIRECTORY + CAIN A,SV.DIR ;IS THIS A DIRECTORY? + CAIL T6,^D128 ; WHICH IS LESS THAN OR EQUAL TO 128 WORDS LONG? + ERR + + MOVNI T6,-1(T6) ;MAKE AN AOBJN POINTER TO THE DIRECTORY + HRLI T6,DBUF+1 ; .. + MOVSS T6 ; .. + + MOVEI P2,RPPAGD + ADDI P2,1 + +WB10A: MOVE M,(T6) ;BITS,,FILE PAGE NUMBER + JUMPL M,WB10C ;JUMP IF HI SEG PAGE, READ IT IMMEDIATELY + ; ABOVE THE LOW SEGMENT + + HRRZ T5,1(T6) ;CORE PAGE NUMBER + LSH T5,P2WLSH ;CORE ADDRESS + SKIPN T5 ;PAGE 0? + HRROI T5,0 ;YES, READ IT AND REMEMBER ITS PAGE 0 + +WB10C: LDB T7,[POINT 9,1(T6),8] + +WB10D: TRNN M,-1 ;AN ALLOCATED BUT ZERO PAGE? + SOJA M,WB10H ;YES, COUNT DOWN REPEAT COUNT AND UPDATE CORE ADDRESS + HRRZ T4,M ;FILE PAGE NUMBER + LSH T4,P2BLSH ;CONVERT TO BLOCK WITHIN THE FILE + CAMGE T4,SELPAG ;FILE PAGE NUMBERS MUST BE MONOTONICALLY INCREASING + ERR + +WB10E: CAMN T4,SELPAG ;AT THE RIGHT BLOCK WITHIN THE FILE? + JRST WB10G ;YES + +WB10F: GO SELBLK ;BYPASS FILE PAGE + JRST WB10E ;SEE IF THERE YET + +WB10G: CAIN T5,1000 + ERR + + GO REDPAG ;READ EXE DATA PAGE + + JUMPL T5,WB10X ;PAGE 0 ? + + PUT T5 + ANDI T5,-1 + LSH T5,W2PLSH + HRRZM T5,(P2) ;SET A POINTER TO PAGE NUMBER + GETIT T5 + ADDI P2,2 ;POINT TO NEXT + + OUT WC,[IOWD ^D512,IPAG + 0] + SKIPA + ERR + + JUMPGE T5,WB10H ;PAGE 0 JUST READ? + +WB10X: MOVE IPAG+.JBSA + MOVEM BOOTEV ;SAVE STARTING ADDRESS + + MOVEI T5,0 ;READ NEXT PAGE INTO PAGE 1 + +WB10H: ADDI T5,PAGSIZ ;NEXT PAGE +WB10I: SOSL T7 ;READ ALL THE PAGES DESCRIBED BY THIS ENTRY? + AOJA M,WB10D ;NO, READ THE NEXT PAGE + + AOBJN T6,.+1 ;BUMP PAST THIS DIRECTORY ENTRY, AND + AOBJN T6,WB10A ; GO GET THE NEXT DIRECTORY ENTRY + + SETOM -1(P2) ;INDICATE END OF SPACE + + MOVE T1,BOOTEV + HRRZM T1,(P2) ;SET ENTRY VECTOR +;*FIND 1ST PAGE OF FILE & PUT IN PRE-BOOT + + CLOSE WC,CL.DLL ;CLOSE FILE + RELEAS WC, + + GO GETBK2 ;GET DISK ADDRESS + MOVEM T1,FEDIR+MBOOTP + MOVEM T1,T5 + +;*COMPUTE 8080 ADDRESSES - PUT IN PRE-BOOT + + MOVEI T6,RPPAGD + +WB10J: MOVE (T6) ;GET ADDRESS POINTER + CAMN [-1] ;TERMINATOR ? + JRST WB10K ;YES + + MOVE T1,T5 + GO TBOOTP ;SET DISK ADDRESS + ADDI T5,4 + ADDI T6,2 + JRST WB10J + +WB10K: SETZM MPREBP + MOVE [MPREBP,,MPREBP+1] + BLT MPREBP+777 + + MOVE [BTSTR1,,MPREBP] ;PUT MONITOR PRE-BOOT IN PLACE + BLT MPREBP+ + + RTN ;DONE +;HERE TO READ DIAGNOSTIC BOOT EXE FILE + +WDB10: GO OPNTEN ;OPEN INPUT FILE + ERR + + MOVE T1,LOOK10+.RBNAM + MOVEM T1,O.NAM1 ;SAME NAME AS INPUT + + MOVSI T1,(SIXBIT/RIM/) + MOVEM T1,O.EXT ;OUTPUT EXT IS ".RIM" + + MOVE T1,LOOK10+.RBVER + MOVEM T1,O.VER ;USE INPUT VERSION AS OUTPUT VERSION + + LDB T1,[POINT 11,LOOK10+.RBPRV,23] + MOVEM T1,O.TIME ;USE INPUT TIME AND DATE AS OUTPUT + + LDB T1,[POINT 3,LOOK10+.RBEXT,20] + DPB T1,[POINT 3,O.DATE,23] + LDB T1,[POINT 12,LOOK10+.RBPRV,35] + DPB T1,[POINT 12,O.DATE,35] + + MOVE T1,DIRDIR ;USE WRTSET'S PPN + MOVEM T1,O.PPN + + MOVE T1,DIRDEV ;USE WRTSET'S DEVICE + MOVEM T1,O.DEV + + MOVEI T1,577 ;SET PROTECTION TO 577 + MOVEM T1,O.PRT + + MOVE T1,LOOK10+.RBSIZ ;GET FILE SIZE IN WORDS + TRNE T1,777 + ERR + SOS T1 ;MINUS EXE DIR PAGE + IDIVI T1,^D512 ;CONVERT TO PAGES + MOVEM T1,FEDIR+DBOOTL ;SET MONITOR BOOT LENGTH + IMULI T1,4 ;CONVERT TO BLOCKS + MOVEM T1,S.ALO ;SET FOR ALLOCATION + + GO ETER10 ;ENTER OUTPUT FILE + ERR + +;*NOW READ EXE FILE + + SETZM SELPAG# + GO REDDIR ;READ THE DIRECTORY PAGE + + HLRZ A,DBUF ;DIRECTORY DESCRIPTOR + HRRZ T6,DBUF ;LENGTH OF THE DIRECTORY + CAIN A,SV.DIR ;IS THIS A DIRECTORY? + CAIL T6,^D128 ; WHICH IS LESS THAN OR EQUAL TO 128 WORDS LONG? + ERR + + MOVNI T6,-1(T6) ;MAKE AN AOBJN POINTER TO THE DIRECTORY + HRLI T6,DBUF+1 ; .. + MOVSS T6 ; .. + + MOVE P2,SMPBPG + ADDI P2,1 + +WDB10A: MOVE M,(T6) ;BITS,,FILE PAGE NUMBER + JUMPL M,WDB10C ;JUMP IF HI SEG PAGE, READ IT IMMEDIATELY + ; ABOVE THE LOW SEGMENT + + HRRZ T5,1(T6) ;CORE PAGE NUMBER + LSH T5,P2WLSH ;CORE ADDRESS + SKIPN T5 ;PAGE 0? + HRROI T5,0 ;YES, READ IT AND REMEMBER ITS PAGE 0 + +WDB10C: LDB T7,[POINT 9,1(T6),8] + +WDB10D: TRNN M,-1 ;AN ALLOCATED BUT ZERO PAGE? + SOJA M,WDB10H ;YES, COUNT DOWN REPEAT COUNT AND UPDATE CORE ADDRESS + HRRZ T4,M ;FILE PAGE NUMBER + LSH T4,P2BLSH ;CONVERT TO BLOCK WITHIN THE FILE + CAMGE T4,SELPAG ;FILE PAGE NUMBERS MUST BE MONOTONICALLY INCREASING + ERR + +WDB10E: CAMN T4,SELPAG ;AT THE RIGHT BLOCK WITHIN THE FILE? + JRST WDB10G ;YES + +WDB10F: GO SELBLK ;BYPASS FILE PAGE + JRST WDB10E ;SEE IF THERE YET + +WDB10G: CAIN T5,1000 + ERR + + GO REDPAG ;READ EXE DATA PAGE + + JUMPL T5,WDB10X ;PAGE 0 ? + + PUT T5 + ANDI T5,-1 + LSH T5,W2PLSH + HRRZM T5,(P2) ;SET A POINTER TO PAGE NUMBER + GETIT T5 + ADDI P2,2 ;POINT TO NEXT + + OUT WC,[IOWD ^D512,IPAG + 0] + SKIPA + ERR + + JUMPGE T5,WDB10H ;PAGE 0 JUST READ? + +WDB10X: MOVE IPAG+.JBSA + MOVEM BOOTEV ;SAVE STARTING ADDRESS + + MOVEI T5,0 ;READ NEXT PAGE INTO PAGE 1 + +WDB10H: ADDI T5,PAGSIZ ;NEXT PAGE +WDB10I: SOSL T7 ;READ ALL THE PAGES DESCRIBED BY THIS ENTRY? + AOJA M,WDB10D ;NO, READ THE NEXT PAGE + + AOBJN T6,.+1 ;BUMP PAST THIS DIRECTORY ENTRY, AND + AOBJN T6,WDB10A ; GO GET THE NEXT DIRECTORY ENTRY + + SETOM -1(P2) ;INDICATE END OF SPACE + + MOVE T1,BOOTEV + HRRZM T1,(P2) ;SET ENTRY VECTOR +;*FIND 1ST PAGE OF FILE & PUT IN PRE-BOOT + + CLOSE WC,CL.DLL ;CLOSE FILE + RELEAS WC, + + GO GETBK2 ;GET DISK ADDRESS + MOVEM T1,FEDIR+DBP + MOVEM T1,T5 + +;*COMPUTE 8080 ADDRESSES - PUT IN PRE-BOOT + + MOVE T6,SMPBPG + +WDB10J: MOVE (T6) ;GET ADDRESS POINTER + CAMN [-1] ;TERMINATOR ? + JRST WDB10K ;YES + + MOVE T1,T5 + GO TBOOTP ;SET DISK ADDRESS + ADDI T5,4 + ADDI T6,2 + JRST WDB10J + +WDB10K: SETZM DPREBP + MOVE [DPREBP,,DPREBP+1] + BLT DPREBP+777 + + MOVE [SMPREB,,DPREBP] ;PUT DIAGNOSTIC PRE-BOOT IN PLACE + BLT DPREBP+777 + + RTN ;DONE +;HERE TO READ DIAGNOSTIC BC2 EXE FILE + +BC210: GO OPNTEN ;OPEN INPUT FILE + ERR + + MOVE T1,LOOK10+.RBNAM + MOVEM T1,O.NAM1 ;SAME NAME AS INPUT + + MOVSI T1,(SIXBIT/RIM/) + MOVEM T1,O.EXT ;OUTPUT EXT IS ".RIM" + + MOVE T1,LOOK10+.RBVER + MOVEM T1,O.VER ;USE INPUT VERSION AS OUTPUT VERSION + + LDB T1,[POINT 11,LOOK10+.RBPRV,23] + MOVEM T1,O.TIME ;USE INPUT TIME AND DATE AS OUTPUT + + LDB T1,[POINT 3,LOOK10+.RBEXT,20] + DPB T1,[POINT 3,O.DATE,23] + LDB T1,[POINT 12,LOOK10+.RBPRV,35] + DPB T1,[POINT 12,O.DATE,35] + + MOVE T1,DIRDIR ;USE WRTSET'S PPN + MOVEM T1,O.PPN + + MOVE T1,DIRDEV ;USE WRTSET'S DEVICE + MOVEM T1,O.DEV + + MOVEI T1,577 ;SET PROTECTION TO 577 + MOVEM T1,O.PRT + + MOVE T1,LOOK10+.RBSIZ ;GET FILE SIZE IN WORDS + TRNE T1,777 + ERR + SOS T1 ;MINUS EXE DIR PAGE + IDIVI T1,^D512 ;CONVERT TO PAGES + MOVEM T1,FEDIR+BCHKL ;SET BC2 LENGTH + IMULI T1,4 ;CONVERT TO BLOCKS + MOVEM T1,S.ALO ;SET FOR ALLOCATION + + GO ETER10 ;ENTER OUTPUT FILE + ERR +;*NOW READ EXE FILE + + SETZM SELPAG# + GO REDDIR ;READ THE DIRECTORY PAGE + + HLRZ A,DBUF ;DIRECTORY DESCRIPTOR + HRRZ T6,DBUF ;LENGTH OF THE DIRECTORY + CAIN A,SV.DIR ;IS THIS A DIRECTORY? + CAIL T6,^D128 ; WHICH IS LESS THAN OR EQUAL TO 128 WORDS LONG? + ERR + + MOVNI T6,-1(T6) ;MAKE AN AOBJN POINTER TO THE DIRECTORY + HRLI T6,DBUF+1 ; .. + MOVSS T6 ; .. + + MOVE P2,SMPBPG + ADDI P2,1 + +BC210A: MOVE M,(T6) ;BITS,,FILE PAGE NUMBER + JUMPL M,BC210C ;JUMP IF HI SEG PAGE, READ IT IMMEDIATELY + ; ABOVE THE LOW SEGMENT + + HRRZ T5,1(T6) ;CORE PAGE NUMBER + LSH T5,P2WLSH ;CORE ADDRESS + SKIPN T5 ;PAGE 0? + HRROI T5,0 ;YES, READ IT AND REMEMBER ITS PAGE 0 + +BC210C: LDB T7,[POINT 9,1(T6),8] + +BC210D: TRNN M,-1 ;AN ALLOCATED BUT ZERO PAGE? + SOJA M,BC210H ;YES, COUNT DOWN REPEAT COUNT AND UPDATE CORE ADDRESS + HRRZ T4,M ;FILE PAGE NUMBER + LSH T4,P2BLSH ;CONVERT TO BLOCK WITHIN THE FILE + CAMGE T4,SELPAG ;FILE PAGE NUMBERS MUST BE MONOTONICALLY INCREASING + ERR + +BC210E: CAMN T4,SELPAG ;AT THE RIGHT BLOCK WITHIN THE FILE? + JRST BC210G ;YES + +BC210F: GO SELBLK ;BYPASS FILE PAGE + JRST BC210E ;SEE IF THERE YET + +BC210G: CAIN T5,1000 + ERR + + GO REDPAG ;READ EXE DATA PAGE + + JUMPGE T5,.+6 ;PAGE 0 ? + + PUT T1 + SETZM IPAG+KPALIVE ;YES, ZERO 8080 COMM AREA + MOVE T1,[IPAG+KPALIVE,,IPAG+KPALIVE+1] + BLT T1,IPAG+MSSLAVE + GETIT T1 + + PUT T5 + ANDI T5,-1 + LSH T5,W2PLSH + HRRZM T5,(P2) ;SET A POINTER TO PAGE NUMBER + GETIT T5 + ADDI P2,2 ;POINT TO NEXT + + OUT WC,[IOWD ^D512,IPAG + 0] + SKIPA + ERR + + JUMPGE T5,BC210H ;PAGE 0 JUST READ? + + MOVE IPAG+.JBSA + MOVEM BOOTEV ;SAVE STARTING ADDRESS + + MOVEI T5,0 ;READ NEXT PAGE INTO PAGE 1 + +BC210H: ADDI T5,PAGSIZ ;NEXT PAGE +BC210I: SOSL T7 ;READ ALL THE PAGES DESCRIBED BY THIS ENTRY? + AOJA M,BC210D ;NO, READ THE NEXT PAGE + + AOBJN T6,.+1 ;BUMP PAST THIS DIRECTORY ENTRY, AND + AOBJN T6,BC210A ; GO GET THE NEXT DIRECTORY ENTRY + + SETOM -1(P2) ;INDICATE END OF SPACE + + MOVE T1,BOOTEV + HRRZM T1,(P2) ;SET ENTRY VECTOR +;*FIND 1ST PAGE OF FILE & PUT IN PRE-BOOT + + CLOSE WC,CL.DLL ;CLOSE FILE + RELEAS WC, + + GO GETBK2 ;GET DISK ADDRESS + MOVEM T1,FEDIR+BCHKP + MOVEM T1,T5 + +;*COMPUTE 8080 ADDRESSES - PUT IN PRE-BOOT + + MOVE T6,SMPBPG + +BC210J: MOVE (T6) ;GET ADDRESS POINTER + CAMN [-1] ;TERMINATOR ? + JRST BC210K ;YES + + MOVE T1,T5 + GO TBOOTP ;SET DISK ADDRESS + ADDI T5,4 + ADDI T6,2 + JRST BC210J + +BC210K: SETZM BCPREBP + MOVE [BCPREBP,,BCPREBP+1] + BLT BCPREBP+777 + + MOVE [SMPREB,,BCPREBP] ;PUT DIAGNOSTIC PRE-BOOT IN PLACE + BLT BCPREBP+777 + + RTN ;DONE +;*MONITOR BOOT STRAP PROGRAM TO BE WRITTEN ON THE DISK + +BTSTR1: + PHASE BOORG + +BTSTRT:!JRST BTSTAR + +BTHLT0:!HALT . ;TRIED TO OVERLOAD PRE-BOOT +BTHLT1:!HALT . ;DISK RETRY FAILURE +BTHLT2:!HALT . ;NO RH-11 BASE ADDRESS +BTHLT3:!HALT . ;RESERVED + +BTSTAR:!MOVSI 17,-17 + SETZM (17) ;ZERO AC'S + AOBJN 17,.-1 + SETZM 17 + + MOVE P1,MSRH ;GET DISK ADDRESS + MOVEM P1,MSRHSV + SKIPN P1 + JRST BTHLT2 ;NO RH-11 BASE ADDRESS ? + HLLM P1,BTUBP0 ;SETUP UBA MAP POINTER + HLLM P1,BTUBST ;SETUP UBA STATUS POINTER + + MOVE T1,KPALIVE + MOVEM T1,MSKPAL ;SAVE KEEP-ALIVE WORD + + MOVEI T1,RHCLR + WRIO T1,RPCS2(P1) ;CLEAR CONTROLLER + + MOVE T1,MSDRIVE + MOVEM T1,MSDRSV + WRIO T1,RPCS2(P1) ;SELECT DRIVE + + MOVEI T1,RIPST ;DO READIN PRESET + WRIO T1,RPCS1(P1) ;WRITE REGISTER + MOVEI T2,RDY ;WAIT FOR READY + TION T2,RPDS(P1) ;CHECK READY? + JRST .-1 ;NO -- CONTINUE WAIT + + MOVEI T3,RPPAG ;FIND THE OFFSET STUFF + MOVEI T5,^D10 ;SET RETRY COUNT + +RDABLK:!MOVE T4,0(T3) ;FIND THE DISK ADDRESS + JUMPL T4,RDADON ;QUIT IF ALL DONE WITH PAGES + + AOS T3 ;POINT TO BLOCK ENTRIES + WRIO T4,RPDA(P1) ;SET DISK ADDRESS + MOVSS T4 ;FIND CYL ADDRESS + WRIO T4,RPDC(P1) ;SET CYL ADDRESS + + MOVNI T4,2000 ;READ A PAGE (WORD COUNT) + WRIO T4,RPWC(P1) ;SET WORD COUNT + + SETZ T4, ;CLEAR CURRENT ADDRESS REGISTER + WRIO T4,RPBA(P1) ;SET UNIBUS ADDRESS TO 0 + + MOVE T4,0(T3) ;FIND THE CORE ADDRESS + AOS T3 ;POINT TO NEXT ENTRY + CAIN T4,1 ;CAN'T OVERLOAD PRE-BOOT + JRST RDBADR ;PAGE 1 REQUESTED TO BE LOADED ? + + IORI T4,UBVBIT!UNV36X + WRIO T4,@BTUBP0 ;SET UP UNIBUS ADAPTOR PAGE 0 + + MOVEI T4,RDATA ;SET GO + WRIO T4,RPCS1(P1) ;WAIT FOR GO + RDIO T4,RPCS1(P1) + TRNN T4,RDY + JRST .-2 ;HO HUM WAIT + + TRNN T4,TRE!MCPE ;CHECK ERROR CONDITION SUMMARY + JRST RDABLK ;DO NEXT PAGE + + SUBI T3,2 ;BACKUP TO SAME ENTRY + SOJLE T5,RDFAIL ;TRY AGAIN TILL RETRY RUNS OUT + +RDRTRY:!MOVEI T1,RHCLR ;ERROR, CLEAR & TRY AGAIN + WRIO T1,RPCS2(P1) ;CLEAR CONTROLLER + + MOVE T1,MSDRIVE + WRIO T1,RPCS2(P1) ;SELECT DRIVE + + JRST RDABLK ;TRY AGAIN + +RDBADR:!MOVEI 17,BTHLT0 ;SET HALT ADDRESS + SUBI T3,2 ;POINT TO FAILING ENTRY + JRST .+2 + +RDFAIL:!MOVEI 17,BTHLT1 ;SET HALT ADDRESS + MOVE (T3) + MOVEM 100 ;SAVE 8080 DISK ADDRESS + MOVE 1(T3) + MOVEM 101 ;SAVE MEMORY PAGE ADDRESS + + MOVEM T3,102 ;SAVE SELECTION PICKUP POINTER + + RDIO RPCS1(P1) + MOVEM 103 ;SAVE CONTROL AND STATUS 1 + RDIO RPCS2(P1) + MOVEM 104 ;SAVE CONTROL AND STATUS 2 + RDIO RPDS(P1) + MOVEM 105 ;SAVE DRIVE STATUS + RDIO RPER1(P1) + MOVEM 106 ;SAVE ERROR 1 + RDIO RPER2(P1) + MOVEM 107 ;SAVE ERROR 2 + RDIO RPER3(P1) + MOVEM 110 ;SAVE ERROR 3 + + RDIO @BTUBP0 + MOVEM 111 ;SAVE UBA PAGING RAM LOC 0 + RDIO @BTUBST + MOVEM 112 ;SAVE UBA STATUS REG + + MOVE BTVER + MOVEM 113 ;SAVE PRE-BOOT VERSION + + MOVE MSRHSV + MOVEM MSRH ;REINSTALL RH-11 BASE ADDRESS + MOVE MSDRSV + MOVEM MSDRIVE ;REINSTALL DRIVE NUMBER + MOVE MSKPAL + MOVEM KPALIVE ;REINSTALL KEEP-ALIVE + + JRST @17 ;HALT AT APPROPRIATE HALT + +RDADON:!MOVE 1(T3) ;GET START ADDRESS + MOVEM 20 ;SAVE + + WRUBR ACBLK7 + MOVSI 17,-17 + SETZM (17) ;ZERO AC'S + AOBJN 17,.-1 + SETZM 17 + + WRUBR ACBLK6 + MOVSI 17,-17 + SETZM (17) ;ZERO AC'S + AOBJN 17,.-1 + SETZM 17 + + WRUBR ACBLK5 + MOVSI 17,-17 + SETZM (17) ;ZERO AC'S + AOBJN 17,.-1 + SETZM 17 + + WRUBR ACBLK4 + MOVSI 17,-17 + SETZM (17) ;ZERO AC'S + AOBJN 17,.-1 + SETZM 17 + + WRUBR ACBLK3 + MOVSI 17,-17 + SETZM (17) ;ZERO AC'S + AOBJN 17,.-1 + SETZM 17 + + WRUBR ACBLK2 + MOVSI 17,-17 + SETZM (17) ;ZERO AC'S + AOBJN 17,.-1 + SETZM 17 + + WRUBR ACBLK1 + MOVSI 17,-17 + SETZM (17) ;ZERO AC'S + AOBJN 17,.-1 + SETZM 17 + + WRUBR ACBLK0 + MOVSI 17,-17 + SETZM (17) ;ZERO AC'S + AOBJN 17,.-1 + SETZM 17 + + MOVE MSRHSV + MOVEM MSRH ;REINSTALL RH-11 BASE ADDRESS + MOVE MSDRSV + MOVEM MSDRIVE ;REINSTALL DRIVE NUMBER + MOVE MSKPAL + MOVEM KPALIVE ;REINSTALL KEEP-ALIVE + + SETZ + JRST @20 ;NOW START BOOT + +ACBLK7:! 1B0!7B8 ;WRUBR ARGUMENTS +ACBLK6:! 1B0!6B8 +ACBLK5:! 1B0!5B8 +ACBLK4:! 1B0!4B8 +ACBLK3:! 1B0!3B8 +ACBLK2:! 1B0!2B8 +ACBLK1:! 1B0!1B8 +ACBLK0:! 1B0!0B8 + +MSKPAL:! 0 ;KEEP-ALIVE & STATUS WORD +MSRHSV:! 0 ;RH-11 BASE ADDRESS +MSDRSV:! 0 ;DRIVE NUMBER + +BTVER:! MCNVER,,DECVER ;PRE-BOOT VERSION + +BTUBP0:! 1,,763000 ;ADDRESS OF FIRST WINDOW +BTUBST:! 1,,763100 ;ADDRESS OF UBA STATUS + +RPPAG:! ;NEXT TWO INSTRUCTIONS MUST FOLLOW!!DO NOT MOVE + DEPHASE + +RPPAGD: BLOCK 100 +RPPAGX: 0 +;*WRITE MICRO-CODE ONTO DISK + +WRTBC1: SETOM BC1FLG + JRST WRTCRM+1 +WRTCRM: SETZM BC1FLG + NOISE + CONFIRM + + SKIPN FESETF ;FE-DIR IN CODE ? + ERR + SKIPN RDFLAG + ERR + + SKIPN MONTYP + JRST WRTC10 ;TOPS-10 + + HLRZ T3,FEDIR+MCL ;GET MICROCODE START PAGE + SKIPE BC1FLG + HLRZ T3,FEDIR+BC1L + LSH T3,^D9 ;MAKE WORD POINTER INTO FILE + MOVEM T3,WTPTR# ;SAVE + + MOVE T1,FEJFN + MOVE T2,WTPTR + SFPTR + ERMSG + + MOVEI T6,CRAM + SKIPE BC1FLG + MOVEI T6,CRMBC1 + MOVEI T5,4000 +WTLOOP: MOVE T2,(T6) + BOUT + MOVE T2,1(T6) + BOUT + MOVE T2,2(T6) + BOUT + ADDI T6,3 + SOJG T5,WTLOOP + + MOVE T1,FEJFN + MOVEI T2,0 ;SET FILE POINTER TO 0 + SFPTR + ERMSG + +WRTC10: MOVEI T6,FEDIR+MCP + HLRZ T7,FEDIR+MCL + SKIPN BC1FLG + JRST .+3 + MOVEI T6,FEDIR+BC1P + HLRZ T7,FEDIR+BC1L + GO S8080P ;SETUP 8080 POINTER + + RTN +;*WRTFEF, WRITE FRONT-END INDIRECT FILES +;* COMMAND - [INDIRECT "0-366(8)" "FILE.EXT" +;* CREATES - "FEF000.FI" TO "FEF366.FI" (TOPS-10) + +WRTFEF: CMD [FLDDB.(.CMNUM,,^D8)], + + SKIPL T2 + CAILE T2,366 + ERR + MOVEM T2,FEFNBR# + + SETZM GTJFIL ;NO DEFAULTS ALLOWED + SETZM GTJEXT + SETZM GTJDEV + SETZM GTJDIR + + MOVSI T1,(GJ%OLD) + MOVEM T1,GTJFLG + + CMD [FLDDB.(.CMFIL)] + HRLZM T2,FEFJFN# ;SAVE THE JFN OF THE FILE + + CONFIRM + + SKIPN FESETF + ERR + + SKIPN MONTYP + JRST FEF10 ;TOPS-10 + + HRRZ T1,FEDIR+FSL ;GET FREE SPACE LENGTH + CAIGE T1,1 ;THIS NEEDS ONE PAGE + ERR + + HLRZ T1,FEFJFN + MOVEI T2,OF%RD + OPENF ;OPEN FILE + ERR + + HLRZ T1,FEFJFN + MOVE T2,[1,,.FBBYV] + MOVEI T3,T4 + GTFDB ;GET FILE PAGE COUNT + ANDI T4,-1 + CAIE T4,^D1 ;CAN ONLY BE ONE PAGE + JRST FEFERR ;WRONG LENGTH + + MOVE T1,FEFJFN + MOVE T2,[.FHSLF,,] + MOVE T3,[PM%RD+PM%PLD+PM%CPY] + PMAP ;GET FILE + ERJMP [JSERR + JRST START] + + SETMM GENPAG ;MAKE PRIVATE + + HLRZ T1,FEFJFN + CLOSF ;CLOSE FILE + ERR + + GO FEIFMT ;FORMAT INDIRECT FILE + + MOVE T1,[.FHSLF,,] + HRLZ T2,FEJFN + HLR T2,FEDIR+FSL ;GET FREE-SPACE PAGE + MOVE T3,[PM%WR] + PMAP ;PUT INDIRECT INTO FE-FILE + ERJMP [JSERR + JRST START] + + MOVE T1,FEDIR+FSL ;GET FREE-SPACE PAGE #,,LENGTH + MOVE T2,T1 + SUBI T1,1 ;MINUS ONE IN LENGTH + ADD T1,[1,,0] ;PLUS ONE TO PAGE # + MOVEM T1,FEDIR+FSL ;RESAVE + + MOVE T1,FEFNBR ;GET INDIRECT NUMBER + IMULI T1,2 ;DOUBLE IT + ADDI T1,FEDIR+IFL0 ;ADD FEDIR START POSITION + + HRRI T2,^D1 ;MAKE POINTER PAGE #,,1 + MOVEM T2,(T1) ;SETUP FE-DIR POINTER + + RTN + +FEFERR: HLRZ T1,FEFJFN + CLOSF ;CLOSE OUT BAD INDIRECT + ERR + ERR +;*FEF10, TOPS-10 WRITE FRONT-END INDIRECT FILES + +FEF10: GO OPNTEN ;OPEN INPUT FILE + ERR + + MOVE T1,LOOK10+.RBSIZ ;GET FILE SIZE IN WORDS + CAILE T1,^D512 ;MUST BE ONE PAGE OR LESS + ERR + + SETZM GENPAG + MOVE T1,[GENPAG,,GENPAG+1] + BLT T1,GENPAG+777 + + MOVEI T7,GENPAG ;READ IN INDIRECT + GO GET10 + SKIPGE EOFSW + JRST .+3 + MOVEM T3,(T7) + AOJA T7,.-4 + + GO R10EOF ;CLOSE INPUT FILE + + GO FEIFMT ;FORMAT INDIRECT FILE + + SETZ T1, ;COOK UP OUTPUT FILE NAME + LDB [POINT 3,FEFNBR,29] + DPB [POINT 3,T1,23] + LDB [POINT 3,FEFNBR,32] + DPB [POINT 3,T1,29] + LDB [POINT 3,FEFNBR,35] + DPB [POINT 3,T1,35] + ADD T1,[SIXBIT/FEF000/] + MOVEM T1,O.NAM1 + + MOVSI T1,(SIXBIT/FI/) + MOVEM T1,O.EXT + + MOVE T1,DIRDIR ;USE WRTSET'S PPN + MOVEM T1,O.PPN + + MOVE T1,DIRDEV ;USE WRTSET'S DEVICE + MOVEM T1,O.DEV + + MOVEI T1,577 ;SET PROTECTION 577 + MOVEM T1,O.PRT + + SETZM O.VER + SETZM O.TIME + SETZM O.DATE + + MOVEI T1,4 ;MAKE FILE ONE PAGE + MOVEM T1,S.ALO + + GO ETER10 ;CREATE FILE + ERR + + OUT WC,[IOWD ^D512,IPAG + 0] + SKIPA + ERR + + CLOSE WC,CL.DLL ;CLOSE FILE + RELEAS WC, + + GO GETBK2 ;GET DISK ADDRESS + MOVEM T1,T7 + MOVE T6,FEFNBR ;POINT TO FEDIR POSITION + IMULI T6,2 + ADDI T6,FEDIR+IFP0 + + MOVEI T2,1 + MOVEM T2,1(T6) ;MARK IN USE + + GO T8080P ;COMPUTE 8080 POINTER + + RTN +;*FEIFMT, FORMAT FRONT-END INDIRECT FILES + +FEIFMT: SETZM IPAG ;CLEAR STORAGE + MOVE T1,[IPAG,,IPAG+1] + BLT T1,IPAG+777 + + MOVE T6,[POINT 7,GENPAG] + MOVEI T5,IPAG + MOVEI T4,<^D512*^D4>-1 + +FEILP: SETZ T2, + GO FEICHR ;FIRST CHAR + JRST FEILP2 ;EOF + DPB T3,[POINT 8,T2,35] + + GO FEICHR ;SECOND CHAR + JRST FEILP1 ;EOF + DPB T3,[POINT 8,T2,27] + + GO FEICHR ;FIRST CHAR + JRST FEILP1 ;EOF + DPB T3,[POINT 8,T2,19] + + GO FEICHR ;FIRST CHAR + JRST FEILP1 ;EOF + DPB T3,[POINT 8,T2,11] + + MOVEM T2,(T5) ;STORE WORD + AOJA T5,FEILP ;LOOP TILL EOF + +FEILP1: MOVEM T2,(T5) ;SAVE FINAL WORD +FEILP2: RTN ;DONE + +FEICHR: CAMN T6,[POINT 7,GENPAG+777,34] + JRST FEIBIG ;INPUT FILE TOO BIG + + ILDB T3,T6 ;GET INPUT CHAR + JUMPN T3,.+2 + RTN ;NULL, END-OF-FILE + SOJLE T4,FEIBIG ;COUNT CHAR, JUMP IF TOO MANY + JRST CPOPJ1 ;SKIP RETURN WITH CHAR + +FEIBIG: ERR +;*TYPE, TYPE CONTENTS OF INDIRECT FILE + + SCMTAB ..TYPE + CMTAB INDIRECT,TYPEFI + ECMTAB + +.TYPE: CMD [FLDDB.(.CMKEY,,..TYPE)], + HRRZ T1,(T2) + JRST (T1) + +TYPEFI: CMD [FLDDB.(.CMNUM,,^D8)], + SKIPL T2 + CAILE T2,366 + ERR + MOVEM T2,FEFNBR + + CONFIRM + + SKIPN FESETF + ERR + + MOVE T1,FEFNBR ;GET INDIRECT FILE NUMBER + IMULI T1,2 ;DOUBLE IT + ADDI T1,FEDIR+IFL0 ;ADD FEDIR START POSITION + + SKIPN MONTYP + JRST TYPF10 ;TOPS-10 + + HLRZ T1,(T1) ;GET FE-DIR POINTER + + SKIPN T1 + ERR + + HRL T1,FEJFN + MOVE T2,[.FHSLF,,] + MOVE T3,[PM%RD] + PMAP ;GET INDIRECT FILE + ERJMP [JSERR + JRST START] + + PCRLF + MOVEI T6,IPAG + MOVE T3,(T6) + GO FEITYP ;PRINT IT + AOJA T6,.-2 + PCRLF + + RTN + +FEITYP: LDB 0,[POINT 8,T3,35] + JUMPE 0,CPOPJ1 + GO FEIPNT + + LDB 0,[POINT 8,T3,27] + JUMPE 0,CPOPJ1 + GO FEIPNT + + LDB 0,[POINT 8,T3,19] + JUMPE 0,CPOPJ1 + GO FEIPNT + + LDB 0,[POINT 8,T3,11] + JUMPE 0,CPOPJ1 + GO FEIPNT + + RTN + +FEIPNT: CAIE 0,15 ;CR ? + JRST .+3 ;NO + PNTCHF ;YES, PRINT CR/LF + MOVEI 0,12 + PNTCHF + RTN +;*TYPF10, TOPS-10 TYPE CONTENTS OF INDIRECT FILE + +TYPF10: SKIPN (T1) + ERR + + SETZ T1, ;COOK UP INPUT FILE NAME + LDB [POINT 3,FEFNBR,29] + DPB [POINT 3,T1,23] + LDB [POINT 3,FEFNBR,32] + DPB [POINT 3,T1,29] + LDB [POINT 3,FEFNBR,35] + DPB [POINT 3,T1,35] + ADD T1,[SIXBIT/FEF000/] + MOVEM T1,GTJFIL + + MOVSI T1,(SIXBIT/FI/) + MOVEM T1,GTJEXT + + MOVE T1,DIRDIR + MOVEM T1,GTJDIR + + MOVE T1,DIRDEV + MOVEM T1,GTJDEV + + GO OPNTEN ;FIND INPUT FILE + ERR + + PCRLF +TF10LP: GO GET10 ;GET INPUT WORD + SKIPGE EOFSW + JRST .+3 ;END-OF-FILE + + GO FEITYP ;PRINT IT + JRST TF10LP + + PCRLF + JRST R10EOF +;*FETELL, REPORT INDIRECT FILES IN USE & FREE SPACE + +FETELL: PMSGF <^THE FOLLOWING FRONT-END INDIRECT FILES EXIST:^> + + MOVEI T6,FEDIR+IFL0 ;GET START ADDRESS + SETZ T7, ;ZERO FORMAT COUNTER + +FETEL0: MOVE (T6) ;GET ENTRY + JUMPE FETEL1 ;NOT USED + + MOVE T6 + SUBI FEDIR+IFL0 + IDIVI 2 + PNTOCF ;PRINT IT + + AOS T7 + TRNE T7,3 + JRST .+3 + PCRLF + JRST .+2 + PTAB + +FETEL1: ADDI T6,2 ;STEP TO NEXT ENTRY + CAIE T6,FEDIR+1001 ;DONE ? + JRST FETEL0 ;NOT YET + + SKIPN MONTYP + JRST FETEL2 + + PMSGF <^FRONT-END FREE PAGES = > + HRRZ FEDIR+FSL + PNTDCF + +FETEL2: PCRLF + PCRLF + RTN + +;ADDR DIVIDED BY SECTOR/CYL = CYL +;REM DIVIDED BY SECTOR/TRACK = TRACK +;REM = SECTOR + +S8080P: MOVE T1,T7 + IMULI T1,4 ;CHANGE PAGES TO SECTORS + SKIPE MONTYP + ADD T1,HOMPAG+200+101 + SKIPN MONTYP + ADD T1,HOMBUF+101 +T8080P: AND T1,[37,,-1] ;MASK ADDRESS BITS ONLY + SKIPE RM03F + GO TRM03P ;RM03 DISK + IDIVI T1,<^D20*^D19> ;FIND CYL + + PUT T1 + MOVE T1,T2 + SKIPN RM03F + IDIVI T1,^D20 ;FIND SECTOR + SKIPE RM03F + IDIVI T1,^D30 + LSH T1,8 + IOR T1,T2 + GETIT T2 + + LSH T2,6 + HRL T1,T2 + MOVEM T1,(T6) ;STORE 8080 POINTER + RTN + +SBOOTP: MOVE T1,T7 + IMULI T1,4 ;CHANGE PAGES TO SECTORS + ADD T1,HOMPAG+200+101 +TBOOTP: AND T1,[37,,-1] ;MASK ADDRESS BITS ONLY + SKIPE RM03F + GO TRM03P ;RM03 DISK + IDIVI T1,<^D20*^D19> ;FIND CYL + + PUT T1 + MOVE T1,T2 + SKIPN RM03F + IDIVI T1,^D20 ;FIND SECTOR + SKIPE RM03F + IDIVI T1,^D30 + LSH T1,8 + IOR T1,T2 + GETIT T2 + + HRL T1,T2 + MOVEM T1,(T6) ;STORE 8080 POINTER + RTN +;*WRTDONE - WRITE FE-DIR FILE BLOCK + +WRTDONE:CONFIRM + SKIPN FESETF ;FE-DIR IN CODE ? + ERR + + MOVEI T5,^D512/2 + SKIPN MONTYP + MOVEI T5,^D18/2 + MOVEI T4,FEDIR + + MOVE T6,T4 ;POSITION TO T6 + HLRZ T7,1(T4) ;PAGE # TO T7 + JUMPE T7,.+2 ;POSITION NOT USED + GO S8080P ;SET 8080 DISK POINTER + ADDI T4,2 + SOJG T5,.-5 + + SKIPN MONTYP + JRST WRTD10 ;TOPS-10 + + SETO T1, + MOVE T2,[.FHSLF,,] + SETZ T3, + PMAP ;UNMAP FE-DIR PAGE + ERJMP [JSERR + JRST START] + + MOVE T1,FEJFN + CLOSF + ERR + + MOVEI T1,0 ;UPDATE HOME BLOCKS + GO REDHOM + RET + + GO SHOMEP ;COMPUTE 8080 POINTER + + MOVE T1,BTADDR# ;SAME AS ON DISK ? + CAMN T1,HOMPAG+200+103 + RTN ;YES, LEAVE HOME BLOCKS ALONE THEN + + MOVE T1,BTADDR + MOVEM T1,HOMPAG+200+103 + MOVEI T1,0 + GO WRTHOM ;NO, UPDATE HOME BLOCKS + RET + + MOVEI T1,10 + GO REDHOM + RET + + MOVE T1,BTADDR + MOVEM T1,HOMPAG+400+103 + MOVEI T1,10 + GO WRTHOM + RET + +HOMSET: PNTMSF [ASCIZ/ +[HOME BLOCKS SET] +/] + RET + +SHOMEP: MOVEI T6,BTADDR + SETZ T7, + GO S8080P + RTN + +WRTD10: ENTER DAT,ODAT10 ;SET FOR OUTPUT + ERR + + USETO DAT,1 + + MOVEI T2,^D28 + MOVE T3,[FEDIR,,IPAG] +WRTD11: MOVE T1,T3 + BLT T1,IPAG+777 + MOVSI T1,^D512 + ADD T3,T1 + + OUT DAT,[IOWD ^D512,IPAG + 0] + SKIPA + ERR + SOJG T2,WRTD11 + + CLOSE DAT, + RELEAS DAT, + RTN +;*SUBROUTINE TO READ AND WRITE HOME BLOCKS +;*CALL WITH: +;* T1/ DISK ADDRESS +;* STRDES/ DEVICE DESIGNATOR OF STRUCTURE +;* GO REDHOM/WRTHOM +;* ERROR +;* OK + +WRTHOM: SKIPA T2,[DOP%WR+1000] +REDHOM: MOVEI T2,1000 + + SKIPE DEBUGF + JRST CPOPJ1 ;DON'T DO HOME IF DEBUG + + MOVEI T3,HOMPAG + MOVE T4,STRDES +;* TXO T1,<.DOPSR>B1!DOP%SN ;MONSYM IS BAD + TLO T1,577600 + DSKOP + ERJMP BADHOM + JUMPE T1,RSKP + ERR ERROR UPDATING HOME BLOCKS + +BADHOM: MOVEI T1,.FHSLF + GETER + ERMSG + TLZ T2,-1 + CAIE T2,WHELX1 + ERR ERROR UPDATING HOME BLOCKS + PNTMSF [ASCIZ/ +%HOME BLOCKS NOT UPDATED -- MUST BE WHEEL OR OPERATOR +/] + RET + +TRM03P: SKIPE MONTYP ;TOPS-20 + IDIVI T1,<^D30*^D5>-2 + SKIPN MONTYP ;TOPS-10 + IDIVI T1,<^D30*^D5> + JRST CPOPJ1 +SUBTTL COMMANDS -- READ + +RDBC1: SETOM BC1FLG + JRST READ+1 +READ: SETZM BC1FLG + NOISE + HRROI T1,[ASCIZ "KS10"] + SKIPE BC1FLG + HRROI T1,[ASCIZ "KSBC1"] + MOVEM T1,GTJFIL + HRROI T1,[ASCIZ "ULD"] ;MAKE THIS "RAM" FOR PRODUCTION + MOVEM T1,GTJEXT + SETZM GTJDEV + SETZM GTJDIR + MOVSI T1,(GJ%OLD) + MOVEM T1,GTJFLG + CMD [FLDDB.(.CMFIL)] + HRLZM T2,UCFILE + CONFIRM + SKIPN MONTYP + JRST READ10 + + HLRZ T1,UCFILE + MOVEI T2,OF%RD + OPENF + ERR + + SETZM STBUF + HRROI T1,STBUF + HLRZ T2,UCFILE + MOVSI T3,200 + JFNS ;GET FILE ".EXT" STRING + MOVE STBUF + CAME [ASCIZ/RAM/] + JRST RDULD ;OLD STYLE ".ULD" MICROCODE + + HLRZ T1,UCFILE + MOVE T2,[1,,.FBBYV] + MOVEI T3,T4 + + GTFDB ;GET FILE PAGE COUNT + + ANDI T4,-1 + CAIE T4,^D12 + JRST READF ;WRONG LENGTH + + MOVE T1,UCFILE + SKIPN BC1FLG + MOVE T2,[.FHSLF,,] + SKIPE BC1FLG + MOVE T2,[.FHSLF,,] + MOVE T3,[PM%CNT+PM%RD+PM%WR+PM%PLD+PM%CPY+^D12] + + PMAP ;READ CRAM INTO MEMORY + ERJMP [JSERR + JRST START] + + SKIPN BC1FLG + MOVEI T1,CRAM + SKIPE BC1FLG + MOVEI T1,CRMBC1 + MOVEI T2,^D12 + SETMM (T1) ;TOUCH EACH CRAM PAGE + ADDI T1,1000 ; TO MAKE IT PRIVATE + SOJG T2,.-2 + + HLRZ T1,UCFILE + CLOSF ;CLOSE OUT CRAM FILE + ERR + + SETOM RDFLAG + RTN + +READF: HLRZ T1,UCFILE + CLOSF ;CLOSE OUT BAD FILE + ERR + ERR + RTN +;*TOPS-10 MICROCODE READ PROCESS + +READ10: GO OPNTEN ;OPEN INPUT FILE + ERR + + MOVE T1,LOOK10+.RBVER ;USE INPUT VERSION AS OUTPUT VERSION + MOVEM T1,MC.VER + + LDB T1,[POINT 11,LOOK10+.RBPRV,23] + MOVEM T1,MC.TIME ;USE INPUT TIME AND DATE AS OUTPUT + + LDB T1,[POINT 3,LOOK10+.RBEXT,20] + DPB T1,[POINT 3,MC.DATE,23] + LDB T1,[POINT 12,LOOK10+.RBPRV,35] + DPB T1,[POINT 12,MC.DATE,35] + + MOVE T1,LOOK10+.RBSIZ ;GET FILE SIZE IN WORDS + + MOVE 0,GTJEXT + CAME 0,[SIXBIT/RAM/] + JRST RDULD + + CAIE T1,^D12*^D512 + ERR + + SKIPN BC1FLG + MOVEI T7,CRAM ;SETUP CRAM STORAGE POINTER + SKIPE BC1FLG + MOVEI T7,CRMBC1 + +LOOP1: GO GET10 ;GET WORD FROM FILE + SKIPGE EOFSW + JRST LOOP2 + MOVEM T3,(T7) ;STORE IT + AOJA T7,LOOP1 + +LOOP2: SETOM RDFLAG + JRST R10EOF ;DONE +SUBTTL TOPS-10 DISK ROUTINE DEFINITIONS + +;*I/O CHANNELS + +DAT=1 ;GENERAL DATA CHANNEL +RC=2 ;READ CHANNEL +WC=3 ;WRITE CHANNEL +DIR=4 ;DIRECTORY CHANNEL +HOM=5 ;HOME BLOCK CHANNEL +$CHN=6 ;COMMAND FILE CHANNEL + +;*SYMBOL DEFINITIONS + +BLKSIZ==20 ;SIZE OF LOOKUP/ENTER BLOCKS + +RADIX 10 +HMBK01==1+20*0+380*0 ;HOME BLOCK #1 + ;1=SECTOR NUMBER + ;0=TRACK NUMBER + ;0=CYLINDER NUMBER +HMBK10==10+20*0+380*0 ;HOME BLOCK #10 + +RADIX 8 +.BFPTR=1 +.BFCTR=2 +.DCUPN=15 +TO10IC==HEAD10+.BFCTR ;-10 INPUT RING BUF BYTE COUNT +TO10IP==HEAD10+.BFPTR ;-10 INPUT RING BUF BYTE PTR +TO10OC==HEDBLK+.BFCTR ;-10 OUTPUT RING BUF BYTE COUNT +TO10OP==HEDBLK+.BFPTR ;-10 OUTPUT RING BUF BYTE PTR +PHYDEV==DATDEV+.DCUPN ;PHY UNIT FOR DATA FILE(0-399) +DSKUPN==DIRDEV+.DCUPN ;PHY UNIT FOR FILE IN 406-409 +E10ALC==ENTBLK+.RBALC ;# OF BLOCKS TO ALLOCATE +E10STS==ENTBLK+.RBSTS ;FILE STATUS WORD +E20ALC==LOOK10+.RBALC ;# OF BLOCKS TO ALLOCATE +E20STS==LOOK10+.RBSTS ;FILE STATUS WORD + +SU.SOT=200000 ;SUSET. OUTPUT BIT +CTYPF=10000 ;SET IF ANY CHARS TYPED FOR A COMMAND +.IOBIN=14 +.IODMP=17 +RP.NFS=1B21 +RP.ABC=1B22 +CL.DLL=4 +.DCUR4=0 ;RP04 +.DCUR6=1 ;RP06 +.DCUR3=2 ;RM03 + +;EXTENDED ENTER BLOCK + +.RBCNT=0 ;0,,COUNT OF ENTRIES +.RBPPN=1 ;PROJ,PROG # +.RBNAM=2 ;SIXBIT FILE NAME +.RBEXT=3 ;SIXBIT EXT,,18-20 HI DATE,21-35 ACCESS DATE +.RBPRV=4 ;0-8 PROT,9-12 DATA MODE,13-23 CREATE TIME,24-35 CREATE DATE +.RBSIZ=5 +.RBVER=6 +.RBSPL=7 +.RBEST=10 ;0 - EST BLOCKS +.RBALC=11 ;# OF CONTIGUOUS BLOCKS +.RBPOS=12 +.RBTF1=13 +.RBNCA=14 +.RBMTA=15 +.RBDEV=16 +.RBSTS=17 ;FILE STATUS, UFD,,FILE - BIT 22 RP.ABC + +HOLD==^D64 ;DEFAULT PAGE COUNT FOR KS-10 AREA +PRIME==0 ;RELATIVE BLOCK OF PRIME RIB FOR USETI +HOMCLP== HOMBUF+20 ;ADDRESS POINTER FOR RETRIEVAL PTRS +HOMBPC== HOMBUF+21 ;BLOCKS PER CLUSTER + +HOMLST: IOWD ^D128,HOMBUF ;COMMAND LIST FOR HOME BLOCK + 0 +DIRLST: IOWD ^D128,DIRBUF ;COMMAND LIST FOR DIRECTORY BLOCK + 0 +DATLST: IOWD ^D128,DATBUF ;COMMAND LIST FOR DATA BLOCK + 0 +H10LST: IOWD ^D128,HOMB10 ;COMMAND LIST FOR HOME BLK #10 + 0 + +;*ERROR INTERCEPT CONTROL BLOCK + +CCBLK: 4,,CCINT + 0,,2 + BLOCK 2 + +DIRDEV: BLOCK 16 ;DEVICE INFORMATION FOR DIR FILE + +DATDEV: BLOCK 16 ;DEVICE INFORMATION FOR DATA FILE + +HOMBUF: BLOCK 200 ;BUFFER CONTAINS HOME BLOCK # 1 + +HOMB10: BLOCK 200 ;BUFFER CONTAINS HOME BLOCK # 10 + +CMDCNT: BLOCK 1 ;COMMAND LINE COUNT + +O.STR: ;START OF OUTPUT SPEC STORAGE +O.DEV: BLOCK 1 ;DEVICE +O.NAM1: BLOCK 1 ;NAME +O.EXT: BLOCK 1 ;EXT +O.PRT: BLOCK 1 ;PROTECTION +O.PPN: BLOCK 1 ;PROJ,PROG # +O.DATE: BLOCK 1 ;CREATION DATE +O.TIME: BLOCK 1 ;CREATION TIME +O.VER: BLOCK 1 ;VERSION NUMBER + +I.STR: ;START OF INPUT SPEC STORAGE +I.DEV: BLOCK 1 ;DEVICE +I.NAM1: BLOCK 1 ;NAME +I.EXT: BLOCK 1 ;EXT +I.PPN: BLOCK 1 ;PROJ,PROG # + +GETBUF: BLOCK ^D128 ;A DEDICATED BUFFER + +DATBUF: BLOCK ^D128 ;BUFFER CONTAINING REGULAR DATA BLOCK +DATEND=.-1 + +DIRBUF: BLOCK ^D128 ;BUFFER CONTAINING DIRECTORY BLOCK +ENDBLK=.-1 + +OPEN10: BLOCK 3 ;-10 OPEN BLOCK +LOOK10: BLOCK BLKSIZ ;-10 LOOKUP BLOCK +HEAD10: BLOCK 3 ;-10 BUFFER HEADER +OPNBLK: BLOCK 3 ;-10 OUTPUT OPEN BLOCK +ENTBLK: BLOCK BLKSIZ ;-10 ENTER BLOCK +HEDBLK: BLOCK 3 ;-10 OUTPUT BUFFER HEADER +OPND10: BLOCK 3 ;-10 DAT OPEN BLOCK +ODAT10: BLOCK BLKSIZ ;-10 DAT LOOKUP BLOCK + +MC.VER: BLOCK 1 ;MICROCODE VERSION +MC.TIME:BLOCK 1 ;MICROCODE TIME +MC.DATE:BLOCK 1 ;MICROCODE DATE +MT.VER: BLOCK 1 ;MAGTAPE VERSION +MT.TIME:BLOCK 1 ;MAGTAPE TIME +MT.DATE:BLOCK 1 ;MAGTAPE DATE +MT.SADR:BLOCK 1 ;MAGTAPE START ADDRESS +SUBTTL TOPS-10 DISK FILE PROCESS + +;*GET A CHARACTER FROM -10 FILE + +GET10: SKIPE EOFSW ;HAVE WE HIT EOF YET ? + JRST GET10Z ;YES, CLEAR CHARACTER + +CHKCNT: SOSGE TO10IC ;BYTE COUNT=0? + JRST IN10 ;YES + + ILDB T3,TO10IP ;GET BUFFER PTR + RTN ;RETURN, BUFFER FULL + +GET10Z: SETZ T3, + RTN + +IN10: IN RC, + JRST GET10 + +;*END OF INPUT FILE + +COMEND: GETSTS RC,C ;GET ERROR STATUS + TRNE C,74B23 ;SEE IF ANY ERRORS + ERR + + TRNN C,1B22 ;SEE IF END OF FILE + ERR + + SETOM EOFSW ;INDICATE EOF IS DETECTED + SETZM T3 ;ZERO THE CHARACTER + RTN ;RETURN +;*PUT A CHARACTER TO -10 FILE + +PUT10: SOSG TO10OC ;DECREMENT BYTE COUNT + JRST PUTBUF + +PUTNXT: IDPB T3,TO10OP ;PUT WORD IN BUFFER + RTN + +PUTBUF: OUT WC, ;EMPTY BUFFER + JRST PUTNXT + ERR + +;*COMPLETE OUTPUT FILE + +R10EOF: CLOSE RC, ;CLOSE READ CHANNEL + RELEAS RC, + MOVE T1,JBFFRC + MOVEM T1,.JBFF ;RECLAIM BUF SPACE + + RTN + +W10EOF: CLOSE WC, ;CLOSE WRITE CHANNEL + RELEAS WC, + + RTN +;*OPEN DEVICE/LOOKUP ON FILE + + SETOM OPNTDMP + SKIPA +OPNTEN: SETZM OPNTDMP# + SETZM HEAD10 + SETZM HEAD10+1 + SETZM HEAD10+2 + MOVEI T1,HEAD10 ;SETUP BUFFER HEADER + MOVEM T1,OPEN10+2 + SETZM EOFSW# + + MOVE T1,GTJDEV ;SETUP DEVICE + MOVEM T1,OPEN10+1 + + MOVEI T1,.IOBIN ;SET BINARY MODE + SKIPE OPNTDMP + MOVEI T1,.IODMP ;SET DUMP MODE + MOVEM T1,OPEN10 + + OPEN RC,OPEN10 ;OPEN READ CHANNEL + ERR + + MOVE T1,.JBFF ;SAVE RING BUFFER ADDRESS + MOVEM T1,JBFFRC# + + SKIPN OPNTDMP + INBUF RC,2 ;TWO BUFFERS + + MOVE T1,GTJFIL ;SETUP FILE NAME + MOVEM T1,LOOK10+.RBNAM + + MOVE T1,GTJEXT ;SETUP FILE EXT + MOVEM T1,LOOK10+.RBEXT + + MOVE T1,GTJDIR ;SETUP PPN + MOVEM T1,LOOK10+.RBPPN + + MOVEI T1,17 + MOVEM T1,LOOK10 + + LOOKUP RC,LOOK10 ;FIND FILE + RTN ;NOT FOUND + + JRST CPOPJ1 ;FOUND +;*OPEN DEVICE/LOOKUP ON DATA FILE + +OPNDAT: SETZM OPND10 + SETZM OPND10+1 + SETZM OPND10+2 + MOVEI T1,OPND10 ;SETUP BUFFER HEADER + MOVEM T1,OPND10+2 + + MOVE T1,GTJDEV ;SETUP DEVICE + MOVEM T1,OPND10+1 + + MOVEI T1,.IODMP ;SET DUMP MODE + MOVEM T1,OPND10 + + OPEN DAT,OPND10 ;OPEN READ CHANNEL + ERR + + MOVE T1,GTJFIL ;SETUP FILE NAME + MOVEM T1,ODAT10+.RBNAM + + MOVE T1,GTJEXT ;SETUP FILE EXT + MOVEM T1,ODAT10+.RBEXT + + MOVE T1,GTJDIR ;SETUP PPN + MOVEM T1,ODAT10+.RBPPN + + MOVEI T1,17 + MOVEM T1,ODAT10 + + LOOKUP DAT,ODAT10 ;FIND FILE + RTN ;NOT FOUND + + JRST CPOPJ1 ;FOUND +;*OPEN DEVICE/ENTER ON FILE + +OPNWRT: SETZM HEDBLK + SETZM HEDBLK+1 + SETZM HEDBLK+2 + MOVSI T1,HEDBLK ;SETUP BUFFER HEADER + MOVEM T1,OPNBLK+2 + + MOVE T1,O.DEV ;SETUP DEVICE + SKIPN T1 + MOVSI T1,(SIXBIT/DSK/) + MOVEM T1,OPNBLK+1 + MOVEI T1,.IODMP ;SET DUMP MODE + MOVEM T1,OPNBLK + OPEN WC,OPNBLK ;OPEN WRITE CHANNEL + ERR + + SETZM ENTBLK + MOVE T1,[ENTBLK,,ENTBLK+1] + BLT T1,ENTBLK+17 + + MOVE T1,O.NAM1 ;SETUP FILE NAME + MOVEM T1,ENTBLK+.RBNAM + + MOVE T1,O.EXT ;SETUP FILE EXT + MOVEM T1,ENTBLK+.RBEXT + + MOVE T1,O.PPN ;SETUP PPN + MOVEM T1,ENTBLK+.RBPPN + + MOVE T1,O.PRT ;SETUP PROTECTION + DPB T1,[POINT 9,ENTBLK+.RBPRV,8] + + LDB T1,[POINT 3,O.DATE,23] ;SETUP TIME AND DATE + DPB T1,[POINT 3,ENTBLK+.RBEXT,20] + LDB T1,[POINT 12,O.DATE,35] + DPB T1,[POINT 12,ENTBLK+.RBPRV,35] + MOVE T1,O.TIME + DPB T1,[POINT 11,ENTBLK+.RBPRV,23] + + MOVE T1,O.VER ;SETUP VERSION + MOVEM T1,ENTBLK+.RBVER + + MOVEI T1,17 + MOVEM T1,ENTBLK + ENTER WC,ENTBLK ;ENTER FILE + RTN + JRST CPOPJ1 +;*ENTER FILE ON CHANNEL WC + +ETER10: SETZM HEDBLK + SETZM HEDBLK+1 + SETZM HEDBLK+2 + MOVSI T1,HEDBLK ;SETUP BUFFER HEADER + MOVEM T1,OPNBLK+2 + MOVE T1,O.DEV ;SETUP DEVICE + SKIPN T1 + MOVSI T1,(SIXBIT/DSK/) + MOVEM T1,OPNBLK+1 + MOVEI T1,.IODMP ;DUMP MODE + MOVEM T1,OPNBLK + + OPEN WC,OPNBLK ;OPEN WRITE CHANNEL + ERR + + SETZM ENTBLK + MOVE T1,[ENTBLK,,ENTBLK+1] + BLT T1,ENTBLK+17 + + MOVE T1,O.NAM1 ;SETUP FILE NAME + MOVEM T1,ENTBLK+.RBNAM + MOVE T1,O.EXT ;SETUP FILE EXT + MOVEM T1,ENTBLK+.RBEXT + MOVE T1,O.PPN ;SETUP PROJ,PROG # + SKIPN T1 + MOVE T1,[6,,2020] ;DEFAULT PPN IS 6,20 + MOVEM T1,ENTBLK+.RBPPN + MOVE T1,O.PRT ;SETUP PROTECTION + DPB T1,[POINT 9,ENTBLK+.RBPRV,8] + LDB T1,[POINT 3,O.DATE,23] ;SETUP TIME AND DATE + DPB T1,[POINT 3,ENTBLK+.RBEXT,20] + LDB T1,[POINT 12,O.DATE,35] + DPB T1,[POINT 12,ENTBLK+.RBPRV,35] + MOVE T1,O.TIME + DPB T1,[POINT 11,ENTBLK+.RBPRV,23] + MOVE T1,O.VER ;SETUP VERSION + MOVEM T1,ENTBLK+.RBVER + + MOVEI T1,17 ;SET # OF WORDS IN EXTENDED ENTER + MOVEM T1,ENTBLK + MOVEI T1,RP.NFS!RP.ABC ;BIT 22 FOR BAD CHECKSUM + MOVEM T1,E10STS ;TELL MON NOT TO CHECK IT + MOVE T1,S.ALO ;SET BLOCKS ALLOCATED + MOVEM T1,E10ALC + + ENTER WC,ENTBLK + RTN ;ERROR RETURN + JRST CPOPJ1 ;GIVE SKIP (GOOD) RETURN +SUBTTL TOPS-10 INDIRECT COMMAND FILE PROCESS + +$CCL: SKIPE $CCLF ;ALREADY DOING INDIRECT ? + ERR + + SETOM $CCLF ;SET COMMAND FILE PROCESS FLAG + + MOVE T1,GTJDEV + SKIPN T1 ;ANY DEVICE SPECIFIED ? + MOVSI T1,'DSK' ;NO, ASSUME "DSK" + MOVEM T1,CCLBLK+1 + + MOVE T1,GTJFIL + MOVEM T1,CCLDIR ;SETUP FILE NAME + + MOVE T1,GTJEXT + SKIPN T1 ;ANY EXTENSION SPECIFIED ? + MOVSI T1,'CMD' ;NO, ASSUME "CMD" + MOVEM T1,CCLDIR+1 + + MOVE T1,GTJDIR + MOVEM T1,CCLDIR+3 ;SETUP PPN + + MOVEI $IBF + MOVEM CCLBLK+2 + + OPEN $CHN,CCLBLK ;OPEN COMMAND CHANNEL + ERR + + INBUF $CHN,1 ;ONE BUFFER + + LOOKUP $CHN,CCLDIR ;FIND COMMAND FILE + ERR + + MOVE .JBFF ;SAVE FIRST FREE FOR RECLAIM + MOVEM $SJBFF# + + MOVE T1,[.NULIO,,.PRIOU] + MOVEM T1,CSB+.CMIOJ + SKIPL ECOFLG + SETOM INTAKE + RTN +$CCLIN: SOSLE $IBF+2 ;ANY CHARS AVAILABLE ? + JRST $CCLI1 ;YES + + IN $CHN, ;NO, INPUT A BUFFER + JRST $CCLI1 ;OK + + STATZ $CHN,740000 ;NO, CHECK STATUS + ERR + + MOVEI [ASCIZ/ + [END OF COMMAND FILE] +/] + PNTALF + JRST REEN + +$CCLI1: ILDB T2,$IBF+1 ;GET CHAR + +; CAIN T2,12 ;LF, CLEAR COMMENT FLAG +; SETZM $CMNTF +; CAIN T2,14 ;F/F, CLEAR COMMENT FLAG +; SETZM $CMNTF +; +; CAIN T2,";" ;SEMICOLON, SET COMMENT FLAG +; SETOM $CMNTF +; +; SKIPE $CMNTF ;PROCESSING COMMENT ? +; JRST $CCLIN ;YES + + RTN ;RETURN TO CHAR PROCESS + +CCLBLK: BLOCK 3 +$IBF: BLOCK 3 +CCLDIR: BLOCK 4 +SUBTTL SPECIFY DEVICE FILE STRUCTURE FOR DIRECTORY +; =============================================== + +DEVSTR: MOVE T2,GTJDIR + MOVEM T2,DIRDIR# ;SAVE STRUCTURE PPN + MOVE T2,GTJDEV ;GET STRUCTURE NAME + MOVEM T2,DIRDEV + MOVEM T2,DATDEV ;SAVE IT + MOVE T1,[0,,DIRDEV] ;STATUS AT LOC+0 + + DSKCHR T1, + ERR + + LDB T2,[POINT 6,T1,26];GET BITS 21-26 + SUBI T2,5 ;5=RH10/RH20 CTR + JUMPE T2,.+2 ;IT'S RH10/RH20 CTR + ERR + + SETZM RM03F + LDB T2,[POINT 3,T1,32] + MOVEM T2,DSKTYP + CAIN T2,.DCUR4 + JRST CTLROK + CAIN T2,.DCUR6 + JRST CTLROK + CAIN T2,.DCUR3 + JRST [SETOM RM03F + JRST CTLROK] + ERR + +CTLROK: MOVE T1,[16,,DIRDEV] ;PHYNAME AT LOC+15 + + DSKCHR T1, ;GET PHY DEVICE NAME + ERR + + MOVE T1,[16,,DATDEV] + + DSKCHR T1, + ERR + +USRHPQ: MOVEI 1 + HPQ ;SET HI-PRI RUN Q + JFCL + +USRHDQ: MOVEI HDQ ;SET HI-PRI DISK Q + DISK. + JFCL + JRST .+2 +HDQ: 3,,-1 + GO OPNHOM ;OPEN WITH HOM CHANNEL + ERR + + MOVEI T3,HMBK01 ;GET HOME BLK #1 + GO RADHOM + ERR + + MOVE T1,HOMBUF+103 + MOVEM T1,BTADDR ;SAVE ORIGINAL 8080 POINTER + + MOVE B,HOMBUF+101 ;GET DISK ADDRESS + MOVEM B,BTLADR# + + MOVE C,HOMBUF+102 ;GET LENGTH IN SECTORS + MOVEM C,BTLPAG# + + JUMPE B,CRESTR ;NO CURRENT KS10FE.BIN + +CREST1: GO OPNDAT + JRST CRESTR ;REALLY NOT THERE + + MOVE T1,ODAT10+.RBALC + CAIGE T1,<^D28*^D4>+1 + ERR + + USETI DAT,PRIME ;GET LOGICAL BLK # OF 1ST BLK + + IN DAT,[IOWD 200,GETBUF + 0] + SKIPA + ERR + GO GOARND+4 + + CAME T1,BTLADR ;HOME BLOCK & FILE AGREE ? + ERR + + USETI DAT,1 ;SELECT 1ST PAGE + + MOVEI T5,^D28 + MOVE T4,[IPAG,,FEDIR] + MOVEI T3,FEDIR+777 + +CREST2: IN DAT,[IOWD ^D512,IPAG + 0] + JRST CREST3 + + GETSTS DAT,T1 + TRNE T1,74B23 ;ANY ERRORS + ERR + TRNN T1,1B22 ;END OF FILE ? + ERR + JRST WRTSEX + +CREST3: MOVE T1,T4 + MOVE T2,T3 + BLT T1,(T2) ;TRANSFER TO HI-CORE + + ADDI T4,^D512 + ADDI T3,^D512 + SOJG T5,CREST2 + + JRST WRTSEX +;*OPNHOM - ROUTINE TO OPEN THE DISK ON CHANNEL 'HOM' + +OPNHOM: MOVEI T5,.IODMP ;OPEN IN DUMP MODE + MOVE T6,DSKUPN ;GET DEVICE NAME + MOVEI T7,0 + + OPEN HOM,T5 + RTN ;ERROR RETURN + + JRST CPOPJ1 ;GOOD RETURN + +;*RADHOM - ROUTINE TO READ A BLOCK ON CHANNEL 'HOM' + +RADHOM: SETZ T1, + MOVEI T2,HOM + DPB T2,[POINT 4,T1,12] ;PUT CHANNEL IN ARG REG. + DPB T3,[POINT 23,T1,35] ;PUT BLK NO IN ARG REG + + SUSET. T1, ;INSERT BLOCK NUMBER + ERR + + IN HOM,HOMLST ;BRING IN THE DIRECTORY BLOCK + JRST CPOPJ1 ;GOOD RETURN + + RTN ;BAD RETURN + +;*WHOM10 - ROUTINE TO WRITE A BLOCK ON CHANNEL 'HOM' + +WHOM10: MOVSI T1,SU.SOT ;OUTPUT BIT + MOVEI T2,HOM + DPB T2,[POINT 4,T1,12] ;PUT CHANNEL IN ARG REG. + DPB T3,[POINT 23,T1,35] ;PUT BLK NO IN ARG REG + + SUSET. T1, + ERR + + OUT HOM,HOMLST ;OUTPUT HOME BLOCK + JRST CPOPJ1 ;GOOD RETURN + + RTN ;ERROR RETURN +;*OPWCDP - ROUTINE TO OPEN IN DUMP MODE TO WRITE + +OPWCDP: MOVEI T1,.IODMP ;DUMP MODE + MOVE T2,DSKUPN ;DEVICE NAME + SETZM T3 + + OPEN WC,T1 ;OPEN FOR OUTPUT + RTN ;ERROR RETURN + + JRST CPOPJ1 ;GOOD RETURN + +;*OPRCDP - ROUTINE TO OPEN IN DUMP MODE TO READ + +OPRCDP: MOVEI T1,.IODMP ;USE DUMP MODE INPUT + MOVE T2,DSKUPN ;GET DEVICE NAME + SETZM T3 ;NO BUFFER + + OPEN RC,T1 + RTN ;ERROR RETURN + + JRST CPOPJ1 ;GOOD RETURN +;*GETBLK - ROUTINE TO GET THE LOGICAL BLOCK NUMBER OF THE +;* FIRST BLOCK OF A FILE IN THE TOPS-10 FILE SYSTEM. +;* +;*CALL: GO GETBK1 +;* OR +;* GO GETBK2 +;* RETURN WITH BLOCK # IN T1 + +GETBK1: GO OPRCDP ;USE DUMP MODE INPUT + ERR + + MOVEI T1,17 ;GET # OF ARGUMENTS + MOVEM T1,LOOK10 ;SAVE # OF ARGS IN LOOKUP BLK + + LOOKUP RC,LOOK10 ;LOOKUP THE FILE + ERR + + JRST GOARND ;GO AROUND + +GETBK2: GO OPRCDP ;USE DUMP MODE INPUT + ERR + + MOVEI T1,17 ;GET # OF ARGUMENTS + MOVEM T1,ENTBLK ;SAVE IT + + LOOKUP RC,ENTBLK ;LOOKUP THE OUTPUT FILE + ERR + +GOARND: USETI RC,PRIME ;SET UP TO READ PRIME RIB + + IN RC,[IOWD 200,GETBUF + 0 ] ;READ THE PRIME RIB + SKIPA + ERR + + HRRZ T1,GETBUF ;GET ADDRESS OF 1ST POINTER + MOVEI T1,GETBUF+1(T1) ;GET SECOND POINTER + HLL T1,HOMCLP ;FORM BYTE POINTER + LDB T1,T1 ;GET ADDRESS POINTER + IMUL T1,HOMBPC ;COMPUTE RIB LOGICAL BLOCK # + ADDI T1,1 ;COMPUTE # OF DATA BLOCK 1 + RTN ;RETURN +SUBTTL ROUTINE TO CREATE KS10FE.BIN FILE +; =========================================== + +CRESTR: MOVE T1,GTJDEV + MOVEM T1,O.DEV + + MOVE T1,GTJFIL + MOVEM T1,O.NAM1 + + MOVE T1,GTJEXT + MOVEM T1,O.EXT + + MOVE T1,GTJDIR + MOVEM T1,O.PPN + + MOVEI T1,577 ;SET PROTECTION 577 + MOVEM T1,O.PRT + + SETZM O.DATE + SETZM O.TIME + SETZM O.VER + + MOVEI T1,^D28*^D4 + MOVEM T1,S.ALO# + + GO ETER10 ;ENTER FILE + ERR + + CLOSE WC,CL.DLL ;CLOSE WRITE CHANNEL + RELEAS WC, + +;*GET DISK DIRECTORY ADDRESS, PUT IN HOME BLOCK + + GO GETBK2 ;GET 1ST BLOCK FROM -10 + MOVEM T1,BTLADR + + MOVE T7,BTLADR + MOVEI T6,BTADDR + GO T8080P ;COMPUTE 8080 POINTER + + MOVE BTLADR ;SET LOGICAL ADDRESS + MOVEM HOMBUF+101 + MOVEI ^D28*^D4 ;SET LENGTH IN SECTORS + MOVEM BTLPAG + MOVEM HOMBUF+102 + MOVE BTADDR ;SET 8080 ADDRESS + MOVEM HOMBUF+103 +;*WRITE OUT HOME BLOCK #1 + + MOVEI T3,HMBK01 ;HOME BLOCK # 1 + GO WHOM10 ;WRITE IT + ERR + +;*HERE TO UPDATE AND WRITE OUT HOME BLOCK # 10 + + MOVEI T3,HMBK10 ;GET BLOCK # FOR HOBK10 + SETZ T1, + MOVEI T2,HOM + DPB T2,[POINT 4,T1,12] ;PUT CHANNEL IN ARG REG. + DPB T3,[POINT 23,T1,35] ;PUT BLK NO IN ARG REG + + SUSET. T1, + ERR + + IN HOM,H10LST ;BRING IN HOME BLK #10 + JRST .+2 ;READ OK + + ERR + + MOVE BTLADR ;SET LOGICAL ADDRESS + MOVEM HOMB10+101 + MOVE BTLPAG ;SET LENGTH IN PAGES + MOVEM HOMB10+102 + MOVE BTADDR ;SET 8080 ADDRESS + MOVEM HOMB10+103 + + MOVSI T1,SU.SOT ;SET OUTPUT BIT + MOVEI T2,HOM + DPB T2,[POINT 4,T1,12] ;PUT CHANNEL IN ARG REG. + DPB T3,[POINT 23,T1,35] ;PUT BLK NO IN ARG REG + + SUSET. T1, + ERR + + OUT HOM,H10LST ;OUTPUT HMBK10 + SKIPA + + ERR + + CLOSE DIR, ;CLOSE DIR CHANNEL + CLOSE HOM, ;CLOSE HOM CHANNEL + JRST CREST1 +SUBTTL PROCESS ".ULD" MICROCODE + +RDULD: MOVEI T1,RDULDT + MOVEM T1,CTADR + SKIPE BC1FLG + JRST .+5 + SETZM CRAM + MOVE [CRAM,,CRAM+1] + BLT CRAM+13777 ;CLEAR MICROCODE STORE + JRST .+4 + SETZM CRMBC1 + MOVE [CRMBC1,,CRMBC1+1] + BLT CRMBC1+13777 + + SETZM IBF+1 + SKIPN MONTYP + JRST READ.1 + + HLRZ T1,UCFILE + MOVE T2,[1,,.FBBYV] + MOVEI T3,INCNT# + GTFDB ;GET FILE PAGE COUNT + HRRZS INCNT + +READ.1: GO RDEOL + GO RDBYTE + CAIN T1,"E" + JRST READ.5 + CAIE T1,"[" + JRST READ.1 + MOVEI T6,0 + +READ.2: GO RDBYTE + CAIN T1,"]" + JRST READ.3 + SUBI T1,"0" + LSH T6,3 + ADD T6,T1 + JRST READ.2 + +READ.3: GO RDBYTE + CAIE T1,"=" + ERR + MOVEM T6,RDULT6# + IMULI T6,3 + SKIPN BC1FLG + ADDI T6,CRAM + SKIPE BC1FLG + ADDI T6,CRMBC1 + MOVEM T6,CRAMT6# + +RDULIN: MOVE T4,[POINT 3,ULDSTR] + MOVEI T5,^D36 + + GO RDBYTE + IDPB T1,T4 + + SOJG T5,RDULIN+2 + +KSSHF3: SETZ AC10, + SETZB AC11,AC12 + + MOVE T7,[-^D108,,KSCRMP] + + MOVE STPNTR,[POINT 1,ULDSTR] + MOVE 0,[ILDB T6,STPNTR] + MOVE T1,[DPB T6,(T7)] + MOVE T2,[AOBJN T7,0] + MOVE T3,[JRST KSSHF4] + JRST 0 + +KSSHF4: GO KSXX ;COMPUTE PARITY + + JRST READ.1 +;*KSXX, CRAM PARITY COMPUTE SUBROUTINE + +KSXX: MOVE STPNTR,[POINT 1,AC10] + MOVEI 0,^D36 + SETZ T1, + MOVE T2,[ILDB T6,STPNTR] + MOVE T3,[ADD T1,T6] + MOVE T4,[SOJG 0,T2] + MOVE T5,[JRST KSXX1] + JRST T2 ;COMPUTE CRAM PARITY "CRA" + +KSXX1: TDC T1,PARFLG + DPB T1,PB.CRA + + MOVEI 0,^D60 + SETZ T1, + MOVE T5,[JRST KSXX2] + JRST T2 ;COMPUTE CRAM PARITY "CRM" + +KSXX2: TDC T1,PARFLG + DPB T1,PB.CRM + + MOVE T6,CRAMT6 + MOVE T1,AC11 + MOVE T2,AC12 + LSHC T1,-^D12 + MOVEM T2,(T6) ;STORE BITS 60-95 + + MOVE T1,AC10 + MOVE T2,AC11 + LSHC T1,-^D12 + MOVEM T2,1(T6) ;STORE BITS 24-59 + + MOVE T2,AC10 + LSH T2,-^D12 + MOVEM T2,2(T6) ;STORE BITS 0-23 + + RTN + +READ.5: GO RDBYTE + CAIE T1,"N" + JRST READ.1 + GO RDBYTE + CAIE T1,"D" + JRST READ.1 + + SETOM RDFLAG + + SKIPN MONTYP + JRST R10EOF + + SETO T1, + MOVE T2,[.FHSLF,,] + SETZ T3, + + PMAP ;RELEASE LAST INPUT PAGE + ERJMP [JSERR + JRST START] + + HLRZ T1,UCFILE + CLOSF + ERR + + RTN +DEFINE CRMBIT(BIT),< + IFL BIT-^D36,< + POINT 1,AC10,BIT + > + IFGE BIT-^D36,< + IFL BIT-^D72,< + POINT 1,AC11,BIT-^D36 + > + IFGE BIT-^D72,< + POINT 1,AC12,BIT-^D72 + > + > +> + +DEFINE CRMRNG(FROM,TO),< + ZZ..==FROM + REPEAT TO-FROM+1,< + CRMBIT \ZZ.. + ZZ..==ZZ..+1 + > +> + + RADIX 10 +KSCRMP: CRMRNG 0,11 ;J + CRMRNG 60,68 ;ALU LSRC RSRC + CRMRNG 87,89 ;DEST + CRMBIT 107 + CRMBIT 107 + CRMRNG 74,77 ;A + CRMBIT 107 + CRMBIT 107 + CRMRNG 80,83 ;B + CRMRNG 84,86 ;RAMADR + CRMBIT 107 + CRMRNG 72,73 ;DBUS + CRMRNG 69,71 ;DBM + CRMBIT 78 ;DP CLOCK L + CRMBIT 50 ;PAR EN L + CRMBIT 92 ;PAR CK L + CRMBIT 79 ;DP CLOCK R + CRMBIT 51 ;PAR EN R + CRMBIT 93 ;PAR CK R + CRMRNG 18,20 ;SPEC + CRMRNG 30,32 + CRMRNG 21,23 ;DISP + CRMRNG 27,29 + CRMRNG 15,17 ;SKIP + CRMRNG 33,35 + CRMBIT 107 + CRMRNG 12,13 ;T + CRMBIT 25 ;CRY 38 + CRMRNG 90,91 ;SC & FE + CRMBIT 48 ;FM WRITE + CRMBIT 26 ;MEM + CRMRNG 52,53 ;DIVIDE AND MULTI PREC + CRMBIT 49 ;MULTI SHIFT + CRMBIT 14 ;CALL + CRMBIT 107 + CRMBIT 107 + CRMBIT 107 + CRMBIT 107 + CRMBIT 107 + CRMBIT 107 + CRMBIT 107 + CRMBIT 107 + CRMBIT 107 + CRMRNG 54,59 ; # + CRMRNG 36,47 + +PB.CRA: CRMBIT 24 +PB.CRM: CRMBIT 94 + RADIX 8 +;*SUBROUTINE TO FILE END OF LINE +;*CALL WITH: +;* GO RDEOL +;* RETURN HERE + +RDEOL: GO RDBYTE + CAIN T1,12 + RTN + JRST RDEOL + +RDBYTE: SOSLE IBF+1 + JRST .+3 + GO RDUINP ;GET NEXT FILE PAGE + ERR + + ILDB T1,IBF ;GET FILE BYTE + JUMPE T1,RDBYTE ;IGNORE NULLS + + RTN + +RDUINP: SKIPN MONTYP + JRST RDUI10 + SOSGE INCNT ;COUNT DOWN PAGE COUNT + RTN ;NONE LEFT, EOF + + MOVE T1,UCFILE + MOVE T2,[.FHSLF,,] + SETZ T3, + + PMAP ;GET NEXT FILE PAGE + ERJMP [JSERR + JRST START] + + MOVEI 1000*5 + MOVEM IBF+1 ;SET BYTE COUNT + + MOVE [POINT 7,IPAG] + MOVEM IBF ;SET BYTE POINTER + + AOS UCFILE ;INCREMENT FILE PAGE NUMBER + AOS (P) + RTN + +RDUI10: GO GET10 + MOVEM T3,RDUIBF# + SKIPGE EOFSW + RTN + MOVEI 5 + MOVEM IBF+1 + MOVE [POINT 7,RDUIBF] + MOVEM IBF + AOS (P) + RTN +SUBTTL COMMANDS -- OUTPUT + + SCMTAB OUTCMD + CMTAB BC1,OUTBC1 + CMTAB CRAM,OUTRAM + CMTAB MTBOOT,OUTMT + CMTAB RAM,OUTRAM + ECMTAB + +OUTX: CMD [FLDDB.(.CMKEY,,OUTCMD)], + HRRZ T1,(T2) + JRST (T1) +;*OUTRAM, OUTPUT MICROCODE ".RAM" FILE + +OUTBC1: SETOM BC1FLG + JRST OUTRAM+1 +OUTRAM: SETZM BC1FLG + NOISE + HRROI T1,[ASCIZ "KS10"] + MOVEM T1,GTJFIL + HRROI T1,[ASCIZ "RAM"] + MOVEM T1,GTJEXT + SETZM GTJDEV + SETZM GTJDIR + MOVSI T1,(GJ%FOU) + MOVEM T1,GTJFLG + + CMD [FLDDB.(.CMFIL)] + MOVEM T2,OUTJFN# + + CONFIRM + + SKIPN MONTYP + JRST ORAM10 ;TOPS-10 + + MOVE T1,OUTJFN + MOVEI T2,OF%WR + OPENF + ERR + + SKIPN BC1FLG + MOVEI T6,CRAM + SKIPE BC1FLG + MOVEI T6,CRMBC1 + MOVEI T5,4000 +OUTLP: MOVE T2,(T6) + BOUT + MOVE T2,1(T6) + BOUT + MOVE T2,2(T6) + BOUT + + ADDI T6,3 + SOJG T5,OUTLP + + MOVE T1,OUTJFN + CLOSF + ERR + + RTN +;*TOPS-10 OUTPUT MICRO-CODE ".RAM" FILE + +ORAM10: MOVE T1,MC.VER + MOVEM T1,O.VER + MOVE T1,MC.TIME + MOVEM T1,O.TIME + MOVE T1,MC.DATE + MOVEM T1,O.DATE + SETZM O.PRT + + MOVE T1,GTJDEV + MOVEM T1,O.DEV + MOVE T1,GTJFIL + MOVEM T1,O.NAM1 + MOVE T1,GTJEXT + MOVEM T1,O.EXT + MOVE T1,GTJDIR + MOVEM T1,O.PPN + + GO OPNWRT ;OPEN OUTPUT + ERR + + MOVEI T2,^D12 + SKIPN BC1FLG + MOVE T3,[CRAM,,IPAG] + SKIPE BC1FLG + MOVE T3,[CRMBC1,,IPAG] + +ORAM11: MOVE T1,T3 + BLT T1,IPAG+777 + MOVSI T1,^D512 + ADD T3,T1 + + OUT WC,[IOWD ^D512,IPAG + 0] + SKIPA + ERR + + SOJG T2,ORAM11 + + GO W10EOF + + RTN +;*OUTMT, OUTPUT MAGTAPE ".RDI" FILE + +OUTMT:HRROI T1,[ASCIZ "MTBOOT"] + MOVEM T1,GTJFIL + + HRROI T1,[ASCIZ "EXE"] + MOVEM T1,GTJEXT + + SETZM GTJDEV + SETZM GTJDIR + + MOVSI T1,(GJ%OLD) + MOVEM T1,GTJFLG + + CMD [FLDDB.(.CMFIL)] + MOVEM T2,BTJFN ;SAVE THE JFN OF THE BOOT FILE + + SKIPN MONTYP + GO OMT10 ;TOPS-10 + + NOISE + HRROI T1,[ASCIZ "MTBOOT"] + MOVEM T1,GTJFIL + HRROI T1,[ASCIZ "RDI"] + MOVEM T1,GTJEXT + SETZM GTJDEV + SETZM GTJDIR + MOVSI T1,(GJ%FOU) + MOVEM T1,GTJFLG + + CMD [FLDDB.(.CMFIL)] + MOVEM T2,MTJFN# + + CONFIRM + + SKIPN MONTYP + JRST OMT10A ;TOPS-10 + + MOVE T1,MTJFN + MOVEI T2,OF%WR + OPENF + ERR + SETZB T1,T2 ;CREATE A BLANK FORK + CFORK + ERJMP [JSERR ;ERROR ON CFORK + HALTF] + MOVEM T1,FORKN ;SAVE FORK + + HRRZ T1,BTJFN ;GET THE JFN OF THE BOOT + HRL T1,FORKN ;GET PROCESS HANDLE + SETZ T2,0 + GET + ERJMP [JSERR ;ERROR ON GET + JRST START] + + MOVE T1,FORKN + GEVEC ;GET THE VECTOR OF BOOT + MOVEM T2,BOOTEV ;SAVE BOOT ENTRY VECTOR ADDRESS + + SETZM WINDOW + MOVE [WINDOW,,WINDOW+1] + BLT WINDOW+777 ;CLEAR DIAG PRE-BOOT PAGE + + SETZM MTPAGD + MOVE [MTPAGD,,MTPAGD+1] + BLT MTPAGX ;CLEAR PRE-BOOT POINTER STORAGE + + MOVE T4,[-1000,,0] ;ALLOW FOR 1000 PAGES + + HRLZ P1,MTJFN ;GET JFN OF .RDI FILE + HRRI P1,1 ;GET MTBOOT START PAGE + + MOVEI P2,MTPAGD+1 +MTPGLP: HRLZ T1,FORKN ;GET PROCESS HANDLE + HRR T1,T4 ;GET PAGE NUMBER + RPACS ;READ PAGE ACCESS + TDNE T2,[PA%RD!PA%PEX] + GO MTCOPPG ;COPY PAGE + + AOBJN T4,MTPGLP ;TRY ANOTHER PAGE + + SETOM (P2) ;INDICATE END OF SPACE + + MOVE T1,BOOTEV ;FIND ENTRY VECTOR + HRRZM T1,1(P2) ;SET ENTRY VECTOR + + MOVE [MTSTR1,,WINDOW] + BLT WINDOW+ + + MOVE T1,[.FHSLF,,] + HRLZ T2,MTJFN + HRRI T2,0 + MOVE T3,[PM%WR] + PMAP ;PUT MAGTAPE PRE-BOOT IN .RDI FILE + ERJMP [JSERR + JRST START] + + MOVE T1,FORKN + KFORK ;KILL "GET" FORK + ERJMP [JSERR + JRST START] + + MOVE T1,MTJFN + TLO T1,(CO%NRJ) + CLOSF ;CLOSE FILE, KEEP JFN + ERR + MOVE T1,MTJFN + TLO T1,(CF%NUD!<.FBBYV>B17) + MOVE T2,[FB%BSZ] + MOVSI T3,(^D36B11) + CHFDB ;UPDATE BYTE SIZE IN FDB + + MOVE T1,MTJFN + TLO T1,(<.FBSIZ>B17) + MOVE T2,[-1] + HRRZ T3,P1 + IMULI T3,^D512 + CHFDB ;UPDATE EOF POINTER IN FDB + + MOVE T1,MTJFN + RLJFN + ERR + + RTN +MTCOPPG:HRRZM T1,0(P2) ;SET A POINTER TO PAGE NUMBER + AOS P2 ;POINT TO NEXT + PUT T1 + HRRZ T3,T1 ;FIND THE PAGE + + SETZM PAG0FLG# + CAIN T3,1 ;IS THIS PAGE 1 ? + ERR + CAIN T3,0 ;IS THIS PAGE 0 ? + SETOM PAG0FLG ;IF PAGE 0 OF FILE, SET FLAG + + HRL T1,FORKN ;GET FORK NUMBER + HRR T1,T3 ;GET PAGE NUMBER + MOVE T2,[.FHSLF,,] + MOVE T3,[PM%RD] + PMAP ;GET PAGE IN SELF + ERJMP [JSERR + JRST START] + + MOVE T3,[GENPAG,,IPAG] + BLT T3,IPAG+777 + + SKIPN PAG0FLG ;IS THIS PAGE 0 ? + JRST .+4 ;NO + SETZM IPAG+KPALIVE ;YES, ZERO 8080 COMM AREA + MOVE T1,[IPAG+KPALIVE,,IPAG+KPALIVE+1] + BLT T1,IPAG+MSSLAVE + + MOVE T1,[.FHSLF,,] + MOVE T2,P1 ;SET UP PMAP ARGUMENTS + MOVSI T3,(PM%WR) + PMAP + ERJMP [JSERR + JRST START] ;JSYS ERROR + + GETIT T3 ;REMOVE PAGE NUMBER + AOS P1 ;UPDATE P1 ARGUMENTS + RTN ;RETURN +;*TOPS-10 OUTPUT MAGTAPE ".RDI" FILE + +OMT10: GO OPNTEN ;OPEN INPUT FILE + ERR + + MOVE T1,LOOK10+.RBVER ;USE INPUT VERSION AS OUTPUT VERSION + MOVEM T1,MT.VER + + LDB T1,[POINT 11,LOOK10+.RBPRV,23] + MOVEM T1,MT.TIME ;USE INPUT TIME AND DATE AS OUTPUT + + LDB T1,[POINT 3,LOOK10+.RBEXT,20] + DPB T1,[POINT 3,MT.DATE,23] + LDB T1,[POINT 12,LOOK10+.RBPRV,35] + DPB T1,[POINT 12,MT.DATE,35] + + RTN + +OMT10A: MOVE T1,MT.VER + MOVEM T1,O.VER + MOVE T1,MT.TIME + MOVEM T1,O.TIME + MOVE T1,MT.DATE + MOVEM T1,O.DATE + SETZM O.PRT + + MOVE T1,GTJDEV + MOVEM T1,O.DEV + MOVE T1,GTJFIL + MOVEM T1,O.NAM1 + MOVE T1,GTJEXT + MOVEM T1,O.EXT + MOVE T1,GTJDIR + MOVEM T1,O.PPN + + GO OPNWRT ;OPEN OUTPUT + ERR + + JRST REDEXE +SUBTTL PROCESS TOPS-10 MAGTAPE BOOT EXE FILE + +;MISCELLANEOUS EQUATES + +PM.ACC==400000 ;ALLOW ACCESS TO A PAGE +PM.WRT==100000 ;ALLOW A PAGE TO BE WRITTEN +PG.LEB==400000 ;LOAD THE EXEC BASE REGISTER +PG.EAT==20000 ;TURN ON THE PAGING HARDWARE (ENABLE TRAPS) +PAGSIZ==^D512 ;NUMBER OF WORDS IN A PAGE +BLKSIZ==^D128 ;NUMBER OF WORDS IN A BLOCK +P2BLSH==2 ;SHIFT AMOUNT TO CONVERT PAGES TO BLOCKS +B2PLSH==-2 ;SHIFT AMOUNT TO CONVERT BLOCKS TO PAGES +P2WLSH==^D9 ;SHIFT AMOUNT TO CONVERT PAGES TO WORDS +W2PLSH==-^D9 ;SHIFT AMOUNT TO CONVERT WORDS TO PAGES +SV.DIR==1776 ;DIRECTORY BLOCK CODE +SV.END==1777 ;END DIRECTORY BLOCK CODE + +DBUF=WINDOW ;EXE DIRECTORY PAGE + +Q=10 +N=12 +M=13 +K=14 +;HERE TO READ AN EXE FILE + +REDEXE: SETZM SELPAG# + GO REDDIR ;READ THE DIRECTORY PAGE + + HLRZ A,DBUF ;DIRECTORY DESCRIPTOR + HRRZ T6,DBUF ;LENGTH OF THE DIRECTORY + CAIN A,SV.DIR ;IS THIS A DIRECTORY? + CAIL T6,^D128 ; WHICH IS LESS THAN OR EQUAL TO 128 WORDS LONG? + ERR + + MOVNI T6,-1(T6) ;MAKE AN AOBJN POINTER TO THE DIRECTORY + HRLI T6,DBUF+1 ; .. + MOVSS T6 ; .. + + OUT WC,[IOWD ^D512,IPAG + 0] ;MAKE DUMMY FIRST PAGE FOR NOW + SKIPA + ERR + + MOVEI P2,MTPAGD+1 + +REDEX2: MOVE M,(T6) ;BITS,,FILE PAGE NUMBER + JUMPL M,REDEX3 ;JUMP IF HI SEG PAGE, READ IT IMMEDIATELY + ; ABOVE THE LOW SEGMENT + + HRRZ T5,1(T6) ;CORE PAGE NUMBER + LSH T5,P2WLSH ;CORE ADDRESS + SKIPN T5 ;PAGE 0? + HRROI T5,0 ;YES, READ IT AND REMEMBER ITS PAGE 0 + +REDEX3: LDB T7,[POINT 9,1(T6),8] + +REDEX4: TRNN M,-1 ;AN ALLOCATED BUT ZERO PAGE? + SOJA M,REDEX8 ;YES, COUNT DOWN REPEAT COUNT AND UPDATE CORE ADDRESS + HRRZ T4,M ;FILE PAGE NUMBER + LSH T4,P2BLSH ;CONVERT TO BLOCK WITHIN THE FILE + CAMGE T4,SELPAG ;FILE PAGE NUMBERS MUST BE MONOTONICALLY INCREASING + ERR + +REDEX5: CAMN T4,SELPAG ;AT THE RIGHT BLOCK WITHIN THE FILE? + JRST REDEX7 ;YES + +REDEX6: GO SELBLK ;BYPASS FILE PAGE + JRST REDEX5 ;SEE IF THERE YET + +REDEX7: CAIN T5,1000 + ERR + + GO REDPAG ;READ EXE DATA PAGE + + CAIE T5,0 ;PAGE 0 ? + JRST .+6 ;NO + PUT T1 + SETZM IPAG+KPALIVE ;YES, ZERO 8080 COMM AREA + MOVE T1,[IPAG+KPALIVE,,IPAG+KPALIVE+1] + BLT T1,IPAG+MSSLAVE + GETIT T1 + + PUT T5 + ANDI T5,-1 + LSH T5,W2PLSH + HRRZM T5,(P2) ;SET A POINTER TO PAGE NUMBER + GETIT T5 + AOS P2 ;POINT TO NEXT + + OUT WC,[IOWD ^D512,IPAG + 0] + SKIPA + ERR + + JUMPGE T5,REDEX8 ;PAGE 0 JUST READ? + + MOVE IPAG+.JBSA + MOVEM MT.SADR ;SAVE STARTING ADDRESS + + MOVEI T5,0 ;READ NEXT PAGE INTO PAGE 1 + +REDEX8: ADDI T5,PAGSIZ ;NEXT PAGE +REDEX9: SOSL T7 ;READ ALL THE PAGES DESCRIBED BY THIS ENTRY? + AOJA M,REDEX4 ;NO, READ THE NEXT PAGE + + AOBJN T6,.+1 ;BUMP PAST THIS DIRECTORY ENTRY, AND + AOBJN T6,REDEX2 ; GO GET THE NEXT DIRECTORY ENTRY + + SETOM (P2) ;INDICATE END OF SPACE + + MOVE T1,MT.SADR + HRRZM T1,1(P2) ;SET ENTRY VECTOR + + SETZM IPAG + MOVE [IPAG,,IPAG+1] + BLT IPAG+777 + + MOVE [MTSTR1,,IPAG] + BLT IPAG+ + + GO RDEX10 ;PUT MAGTAPE PRE-BOOT IN ".RDI" FILE + + GO W10EOF ;CLOSE OUTPUT + GO R10EOF ;CLOSE INPUT + + RTN ;DONE + +;*SELECT NEXT EXE DATA PAGE + +SELBLK: + +;*READ EXE DATA PAGE + +REDPAG: SKIPA AC10,[-^D512,,IPAG] + +;*READ EXE DIRECTORY PAGE + +REDDIR: MOVE AC10,[-^D512,,WINDOW] + + GO GET10 + MOVEM T3,(AC10) + AOBJN AC10,.-2 + + MOVEI 4 + ADDM SELPAG ;INDICATE NEXT SELECTED PAGE + + RTN + +RDEX10: USETO WC,1 ;SELECT 1ST PAGE + + OUT WC,[IOWD ^D512,IPAG + 0] + SKIPA + ERR + RTN +;*MONITOR BOOT STRAP PROGRAM TO BE WRITTEN ON THE MAGTAPE + +MTSTR1: + PHASE BOORG + +MTSTRT:!JRST MTSTAR +MTHLT0:!HALT . ;TRIED TO OVERLOAD PRE-BOOT PAGE +MTHLT1:!HALT . ;MAGTAPE READ ERROR +MTHLT2:!HALT . ;NO RH-11 BASE ADDRESS +MTHLT3:!HALT . ;MAGTAPE SKIP EOF ERROR + +MTSTAR:!MOVSI 17,-17 + SETZM (17) ;ZERO AC'S + AOBJN 17,.-1 + SETZM 17 + + MOVE MSRH ;GET MAGTAPE ADDRESS + MOVEM MTRHSV + SKIPN + JRST MTHLT2 ;NO RH-11 BASE ADDRESS ? + + MOVE MSDRIVE + MOVEM MTDRSV ;SAVE DRIVE + MOVE MSSLAVE + MOVEM MTSLSV ;SAVE SLAVE & FORMAT + MOVE KPALIVE + MOVEM MTKPAL ;SAVE KEEP-ALIVE WORD + + MOVE MTRHSV ;SETUP RH-11 TABLE + MOVE T1,MTPNTR + MOVEM (T1) + ADDI 2 + AOBJN T1,.-2 + MOVEI UBAP0 ;SETUP UBA MAP POINTER + HRRM MTUBP0 + MOVEI UBSTAT ;SETUP UBA STATUS POINTER + HRRM MTUBST + + MOVEI P1,^D100 ;RETRY 100 TIMES + MOVEI T3,MTPAG+1 ;FIND THE OFFSET STUFF + +RDMT:! JSP P,MTSRH ;SETUP RH-11 + + MOVE T4,(T3) ;FIND THE CORE ADDRESS + CAIN T4,1 ;CAN'T OVERLOAD PRE-BOOT + JRST MTBADR ;PAGE 1 REQUESTED TO BE LOADED ? + + JUMPL T4,RDMTDN ;QUIT IF ALL DONE WITH PAGES + + IORI T4,UBVBIT + WRIO T4,@MTUBP0 ;SET UP UNIBUS ADAPTOR PAGE 0 + + SETZ T1, ;CLEAR CURRENT ADDRESS REGISTER + WRIO T1,@MTBA ;SET UNIBUS ADDRESS TO 0 + + MOVNI T1,2000 ;READ A PAGE (WORD COUNT) + WRIO T1,@MTWC ;SET WORD COUNT + + MOVEI T1,MT.RF + WRIO T1,@MTCS1 ;READ FORWARD + + JSP P,MTRDY ;WAIT FOR READY + TRNE T1,MTTM + JRST MTFAIL ;READ ERROR, EOF DETECTED + + RDIO T1,@MTER + TRNE T1,177777-MTFCE + JRST MTRTRX ;ERROR OTHER THAN LENGTH ERROR + + AOS T3 ;POINT TO NEXT ENTRY + JRST RDMT ;DO NEXT PAGE + +MTRDY: RDIO T1,@MTDS ;READ DRIVE STATUS + TRNN T1,MTPIP ;IS DRIVE STOPPED ? + TRNN T1,MTDRY ;DRIVE READY ? + JRST MTRDY ;NO, WAIT + JRST @P ;YES, RETURN + +MTSRH:! MOVEI T1,RHCLR + WRIO T1,@MTCS2 ;CLEAR MAGTAPE + + MOVE T1,MTDRSV + WRIO T1,@MTCS2 ;SELECT DRIVE + + MOVE T1,MTSLSV + WRIO T1,@MTTC ;LOAD TAPE CONTROL REGISTER + + SETZ T1, + WRIO T1,@MTFC ;CLEAR FRAME COUNTER + + JRST @P ;RETURN + +MTRTRX:! SOJL P1,MTFAIL ;DONE ALL RETRIES ? + + JSP P,MTSRH ;NO, SETUP RH-11 + + MOVNI T1,1 + WRIO T1,@MTFC ;SET FRAME COUNT TO -1 + + MOVEI T1,MT.SR + WRIO T1,@MTCS1 ;BACKSPACE THE TAPE + + JSP P,MTRDY ;WAIT FOR TAPE TO STOP + + JRST RDMT ;NOW TRY AGAIN + +MTSERR:!MOVEI 17,MTHLT3 ;SET HALT ADDRESS + JRST .+5 + +MTBADR:!MOVEI 17,MTHLT0 ;SET HALT ADDRESS + JRST .+2 + +MTFAIL:!MOVEI 17,MTHLT1 ;SET HALT ADDRESS + SOS T3 ;POINT TO FAILING ENTRY + + SETZM 100 + MOVE (T3) + MOVEM 101 ;SAVE MEMORY PAGE ADDRESS + + MOVEM T3,102 ;SAVE SELECTION PICKUP POINTER + + RDIO @MTCS1 + MOVEM 103 ;SAVE CONTROL AND STATUS 1 + RDIO @MTCS2 + MOVEM 104 ;SAVE CONTROL AND STATUS 2 + RDIO @MTDS + MOVEM 105 ;SAVE DRIVE STATUS + RDIO @MTER + MOVEM 106 ;SAVE ERROR 1 + SETZ + MOVEM 107 ;NO ERROR 2 + SETZ + MOVEM 110 ;NO ERROR 3 + + RDIO @MTUBP0 + MOVEM 111 ;SAVE UBA PAGING RAM LOC 0 + RDIO @MTUBST + MOVEM 112 ;SAVE UBA STATUS REG + + MOVE MTVER + MOVEM 113 ;SAVE PRE-BOOT VERSION + + MOVE MTRHSV + MOVEM MSRH ;REINSTALL RH-11 BASE ADDRESS + MOVE MTDRSV + MOVEM MSDRIVE ;REINSTALL DRIVE NUMBER + MOVE MTSLSV + MOVEM MSSLAVE ;REINSTALL SLAVE NUMBER + MOVE MTKPAL + MOVEM KPALIVE ;REINSTALL KEEP-ALIVE + + JRST @17 ;HALT AT APPROPRIATE HALT + +RDMTDN:! AOS T3 + MOVE (T3) ;SETUP START ADDRESS + MOVEM 20 + + JSP P,MTSRH ;SETUP RH-11 + + MOVEI T1,MT.SF ;SPACE FORWARD OVER EOF MARKER + WRIO T1,@MTCS1 + + JSP P,MTRDY ;WAIT FOR TAPE TO STOP + TRNN T1,MTTM ;TAPE MARK DETECTED ? + JRST MTSERR ;NO, SPACE FORWARD ERROR + + MOVE MTRHSV + MOVEM MSRH ;REINSTALL RH-11 ADDRESS + MOVE MTDRSV + MOVEM MSDRIVE ;REINSTALL DRIVE NUMBER + MOVE MTSLSV + MOVEM MSSLAVE ;REINSTALL SLAVE NUMBER + MOVE MTKPAL + MOVEM KPALIVE ;REINSTALL KEEP-ALIVE + + WRUBR MTBLK7 + MOVSI 17,-17 + SETZM (17) ;ZERO AC'S + AOBJN 17,.-1 + SETZM 17 + + WRUBR MTBLK6 + MOVSI 17,-17 + SETZM (17) ;ZERO AC'S + AOBJN 17,.-1 + SETZM 17 + + WRUBR MTBLK5 + MOVSI 17,-17 + SETZM (17) ;ZERO AC'S + AOBJN 17,.-1 + SETZM 17 + + WRUBR MTBLK4 + MOVSI 17,-17 + SETZM (17) ;ZERO AC'S + AOBJN 17,.-1 + SETZM 17 + + WRUBR MTBLK3 + MOVSI 17,-17 + SETZM (17) ;ZERO AC'S + AOBJN 17,.-1 + SETZM 17 + + WRUBR MTBLK2 + MOVSI 17,-17 + SETZM (17) ;ZERO AC'S + AOBJN 17,.-1 + SETZM 17 + + WRUBR MTBLK1 + MOVSI 17,-17 + SETZM (17) ;ZERO AC'S + AOBJN 17,.-1 + SETZM 17 + + WRUBR MTBLK0 + MOVSI 17,-17 + SETZM (17) ;ZERO AC'S + AOBJN 17,.-1 + SETZM 17 + + JRST @20 ;START BOOT + + +MTBLK7:! 1B0!7B8 ;WRUBR ARGUMENTS +MTBLK6:! 1B0!6B8 +MTBLK5:! 1B0!5B8 +MTBLK4:! 1B0!4B8 +MTBLK3:! 1B0!3B8 +MTBLK2:! 1B0!2B8 +MTBLK1:! 1B0!1B8 +MTBLK0:! 1B0!0B8 + +MTKPAL:! 0 ;KEEP-ALIVE & STATUS WORD +MTRHSV:! 0 ;RH-11 BASE ADDRESS +MTDRSV:! 0 ;DRIVE NUMBER +MTSLSV:! 0 ;SLAVE NUMBER + +MTVER:! MCNVER,,DECVER ;PRE-BOOT VERSION + +MTPNTR:! -^D16,,MTCS1 +MTCS1:! 0 +MTWC:! 0 +MTBA:! 0 +MTFC:! 0 +MTCS2:! 0 +MTDS:! 0 +MTER:! 0 +MTAS:! 0 +MTCC:! 0 +MTDB:! 0 +MTMR:! 0 +MTDT:! 0 +MTSN:! 0 +MTTC:! 0 +MTUBP0:! 0 ;ADDRESS OF FIRST WINDOW +MTUBST:! 0 ;ADDRESS OF UBA STATUS REGISTER + +MTPAG:! ;NEXT TWO INSTRUCTIONS MUST FOLLOW!!DO NOT MOVE + DEPHASE + +MTPAGD: BLOCK 100 +MTPAGX: 0 +SUBTTL COMMANDS -- TAKE + +TAKE: NOISE + HRROI T1,[ASCIZ "SMFILE"] + MOVEM T1,GTJFIL + HRROI T1,[ASCIZ "CMD"] + MOVEM T1,GTJEXT + SETZM GTJDEV + SETZM GTJDIR + MOVSI T1,(GJ%OLD) + MOVEM T1,GTJFLG + CMD [FLDDB.(.CMFIL)] + HRRZM T2,CMFILE + CONFIRM + + SKIPN MONTYP + JRST $CCL ;TOPS-10 + + HLRZ T1,CSB+.CMIOJ + CAIn T1,.PRIIN + jrst .+3 + CLOSF + ERR + HRRZ T1,CMFILE + MOVE T2,[7B5+OF%RD] + OPENF + ERR + HRLZ T1,T1 + HRRI T1,.NULIO + MOVEM T1,CSB+.CMIOJ + SKIPL ECOFLG + SETOM INTAKE + RTN +SUBTTL COMMAND SUBROUTINES -- DPYFLD + +OPDEF DPYNOF [GO $DPYNOF] + +$DPYNOF:PNTMSF [ASCIZ/%VALUE DID NOT FIT IN FIELD +/] + RET + +DPYFLD: MOVEI T1,ENDDPY + MOVEM T1,CZADR + MOVEM P,CZSP + PCRL2F + + MOVE T6,EXMADR + IMULI T6,3 + SKIPN BC1FLG + ADDI T6,CRAM + SKIPE BC1FLG + ADDI T6,CRMBC1 + +DPYCALL:PMSGF < CALL/> + LDB T2,[POINT 1,2(T6),26] + GO UPDFLD + JRST DPYCALL + DPB T2,[POINT 1,2(T6),26] + LSH T2,-1 + JUMPE T2,.+2 + DPYNOF + +DPYJ: PMSGF < J/> + LDB T2,[POINT 12,2(T6),23] + GO UPDFLD + JRST DPYCALL + DPB T2,[POINT 12,2(T6),23] + LSH T2,-^D12 + JUMPE T2,.+2 + DPYNOF + +DPYNBR: PMSGF < #/> + LDB T2,[POINT 6,1(T6),35] + LSH T2,^D12 + LDB T1,[POINT 12,1(T6),23] + OR T2,T1 + GO UPDFLD + JRST DPYJ + DPB T2,[POINT 12,1(T6),23] + LSH T2,-^D12 + DPB T2,[POINT 6,1(T6),35] + LSH T2,-6 + JUMPE T2,.+2 + DPYNOF + +DPYALU: PMSGF < ALU/> + LDB T2,[POINT 3,(T6),2] + GO UPDFLD + JRST DPYNBR + DPB T2,[POINT 3,(T6),2] + LSH T2,-3 + JUMPE T2,.+2 + DPYNOF + + PMSGF +DPYLSRC:PMSGF < LSRC/> + LDB T2,[POINT 3,(T6),5] + GO UPDFLD + JRST DPYALU + DPB T2,[POINT 3,(T6),5] + LSH T2,-3 + JUMPE T2,.+2 + DPYNOF + +DPYRSRC:PMSGF < RSRC/> + LDB T2,[POINT 3,(T6),8] + GO UPDFLD + JRST DPYLSRC + DPB T2,[POINT 3,(T6),8] + LSH T2,-3 + JUMPE T2,.+2 + DPYNOF + +DPYDEST:PMSGF < DEST/> + LDB T2,[POINT 3,(T6),29] + GO UPDFLD + JRST DPYRSRC + DPB T2,[POINT 3,(T6),29] + LSH T2,-3 + JUMPE T2,.+2 + DPYNOF + + PMSGF +DPYA: PMSGF < A/> + LDB T2,[POINT 4,(T6),17] + GO UPDFLD + JRST DPYDEST + DPB T2,[POINT 4,(T6),17] + LSH T2,-4 + JUMPE T2,.+2 + DPYNOF + +DPYB: PMSGF < B/> + LDB T2,[POINT 4,(T6),23] + GO UPDFLD + JRST DPYA + DPB T2,[POINT 4,(T6),23] + LSH T2,-4 + JUMPE T2,.+2 + DPYNOF + + PMSGF +DPYRAM: PMSGF < RAMADR/> + LDB T2,[POINT 3,(T6),26] + GO UPDFLD + JRST DPYB + DPB T2,[POINT 3,(T6),26] + LSH T2,-3 + JUMPE T2,.+2 + DPYNOF + +DPYDBUS:PMSGF < DBUS/> + LDB T2,[POINT 2,(T6),13] + GO UPDFLD + JRST DPYRAM + DPB T2,[POINT 2,(T6),13] + LSH T2,-2 + JUMPE T2,.+2 + DPYNOF +DPYDBM: PMSGF < DBM/> + LDB T2,[POINT 3,(T6),11] + GO UPDFLD + JRST DPYDBUS + DPB T2,[POINT 3,(T6),11] + LSH T2,-3 + JUMPE T2,.+2 + DPYNOF + +DPYSPEC:PMSGF < SPEC/> + LDB T2,[POINT 3,2(T6),32] + LSH T2,3 + LDB T1,[POINT 3,1(T6),8] + OR T2,T1 + GO UPDFLD + JRST DPYDBM + DPB T2,[POINT 3,1(T6),8] + LSH T2,-3 + DPB T2,[POINT 3,2(T6),32] + LSH T2,-3 + JUMPE T2,.+2 + DPYNOF + +DPYDISP:PMSGF < DISP/> + LDB T2,[POINT 3,2(T6),35] + LSH T2,3 + LDB T1,[POINT 3,1(T6),5] + OR T2,T1 + GO UPDFLD + JRST DPYSPEC + DPB T2,[POINT 3,1(T6),5] + LSH T2,-3 + DPB T2,[POINT 3,2(T6),35] + LSH T2,-3 + JUMPE T2,.+2 + DPYNOF + +DPYSKIP:PMSGF < SKIP/> + LDB T2,[POINT 4,2(T6),29] + LSH T2,3 + LDB T1,[POINT 3,1(T6),11] + OR T2,T1 + GO UPDFLD + JRST DPYDISP + DPB T2,[POINT 3,1(T6),11] + LSH T2,-3 + DPB T2,[POINT 4,2(T6),29] + LSH T2,-4 + JUMPE T2,.+2 + DPYNOF +DPYT: PMSGF < T/> + LDB T2,[POINT 2,2(T6),25] + GO UPDFLD + JRST DPYSKIP + DPB T2,[POINT 2,2(T6),25] + LSH T2,-2 + JUMPE T2,.+2 + DPYNOF + +DPYCRY: PMSGF < CARRY IN/> + LDB T2,[POINT 1,1(T6),1] + GO UPDFLD + JRST DPYT + DPB T2,[POINT 1,1(T6),1] + LSH T2,-1 + JUMPE T2,.+2 + DPYNOF + +DPYLSC: PMSGF < LOAD SC/> + LDB T2,[POINT 1,(T6),30] + GO UPDFLD + JRST DPYCRY + DPB T2,[POINT 1,(T6),30] + LSH T2,-1 + JUMPE T2,.+2 + DPYNOF + +DPYLFE: PMSGF < LOAD FE/> + LDB T2,[POINT 1,(T6),31] + GO UPDFLD + JRST DPYLSC + DPB T2,[POINT 1,(T6),31] + LSH T2,-1 + JUMPE T2,.+2 + DPYNOF +DPYFMW: PMSGF < FM WRITE/> + LDB T2,[POINT 1,1(T6),24] + GO UPDFLD + JRST DPYLFE + DPB T2,[POINT 1,1(T6),24] + LSH T2,-1 + JUMPE T2,.+2 + DPYNOF + +DPYMEM: PMSGF < MEM CYCLE/> + LDB T2,[POINT 1,1(T6),2] + GO UPDFLD + JRST DPYFMW + DPB T2,[POINT 1,1(T6),2] + LSH T2,-1 + JUMPE T2,.+2 + DPYNOF + +DPYDIV: PMSGF < DIVIDE/> + LDB T2,[POINT 1,1(T6),28] + GO UPDFLD + JRST DPYMEM + DPB T2,[POINT 1,1(T6),28] + LSH T2,-1 + JUMPE T2,.+2 + DPYNOF + +DPYMP: PMSGF < MULTI PREC/> + LDB T2,[POINT 1,1(T6),29] + GO UPDFLD + JRST DPYDIV + DPB T2,[POINT 1,1(T6),29] + LSH T2,-1 + JUMPE T2,.+2 + DPYNOF + +DPYMS: PMSGF < MULTI SHIFT/> + LDB T2,[POINT 1,1(T6),25] + GO UPDFLD + JRST DPYMP + DPB T2,[POINT 1,1(T6),25] + LSH T2,-1 + JUMPE T2,.+2 + DPYNOF + PMSGF +DPYCLL: PMSGF < DP CLOCK L/> + LDB T2,[POINT 1,(T6),18] + GO UPDFLD + JRST DPYMP + DPB T2,[POINT 1,(T6),18] + LSH T2,-1 + JUMPE T2,.+2 + DPYNOF + +DPYGEL: PMSGF < PAR EN L/> + LDB T2,[POINT 1,1(T6),26] + GO UPDFLD + JRST DPYCLL + DPB T2,[POINT 1,1(T6),26] + LSH T2,-1 + JUMPE T2,.+2 + DPYNOF + +DPYCHL: PMSGF < CHKL/> + LDB T2,[POINT 1,(T6),32] + GO UPDFLD + JRST DPYGEL + DPB T2,[POINT 1,(T6),32] + LSH T2,-1 + JUMPE T2,.+2 + DPYNOF + +DPYCLR: PMSGF < DP CLOCK R/> + LDB T2,[POINT 1,(T6),19] + GO UPDFLD + JRST DPYCHL + DPB T2,[POINT 1,(T6),19] + LSH T2,-1 + JUMPE T2,.+2 + DPYNOF +DPYGER: PMSGF < PAR EN R/> + LDB T2,[POINT 1,1(T6),27] + GO UPDFLD + JRST DPYCLR + DPB T2,[POINT 1,1(T6),27] + LSH T2,-1 + JUMPE T2,.+2 + DPYNOF + +DPYCHR: PMSGF < CHKR/> + LDB T2,[POINT 1,(T6),33] + GO UPDFLD + JRST DPYGER + DPB T2,[POINT 1,(T6),33] + LSH T2,-1 + JUMPE T2,.+2 + DPYNOF + +DPYMK: PMSGF < MARK/> + LDB T2,[POINT 1,(T6),35] + GO UPDFLD + JRST DPYCHR + DPB T2,[POINT 1,(T6),35] + LSH T2,-1 + JUMPE T2,.+2 + DPYNOF + +ENDDPY: SETZM CZADR + MOVE P,CZSP + MOVEM T6,CRAMT6 + + MOVE T1,2(T6) ;RECREATE SHUFFLE FORMAT + MOVE T2,1(T6) ;MICROCODE WORD + ROTC T1,^D12 + MOVEM T1,AC10 + + MOVE T1,(T6) + MOVE T2,1(T6) + ROTC T1,^D12 + MOVEM T2,AC11 + + MOVE AC12,(T6) + LSH AC12,^D12 + + SETZ T1, + DPB T1,PB.CRA ;CLEAR PRESENT PARITY BITS + DPB T1,PB.CRM + + GO KSXX ;COMPUTE PARITY & RESTORE + + RTN +SUBTTL COMMAND SUBROUTINES -- UPDFLD + +;*SUBROUTINE TO GET NEW VALUE FOR FIELD +;*CALL WITH: +;* T2/ OLD VALUE +;* GO UPDFLD +;* HERE IF "^" (UPARROW), BACKUP ONE FIELD +;* HERE WITH NEW VALUE IN T2 + +UPDFLD: MOVE T2 + PNTOCf + SKIPN DEPFLG + RETSKP + MOVEM T2,VALUE# + PTAB + SKIPN MONTYP + JRST UPDFL1 + HLRZ T1,CSB+.CMIOJ + BIN + CAIN T2,15 + JRST GTFLD1 + CAIN T2,"^" + JRST CRPOPJ ;UPARROW + BKJFN ;BACKUP INPUT POINTER 1 BYTE + ERR +UPFLD2: HLRZ T1,CSB+.CMIOJ + MOVEI T3,10 + NIN + JRST [PNTMSF [ASCIZ/ +TRY AGAIN: /] + JRST UPFLD2] + AOS (P) + RTN + +GTFLD1: BIN + CAIE T2,12 + ERR + MOVE T2,VALUE + AOS (P) + RTN + +CRPOPJ: PCRLF + RTN + +UPDFL1: TTIOCT + JRST UPDFL3 + SKIPN TTNBRF + JRST UPDFL2 + MOVE T2,0 + MOVE 0,$CHRIN + CAIE 0,15 + JRST [PNTMSF [ASCIZ/ +TRY AGAIN: /] + JRST UPDFL1] + AOS (P) + RTN + +UPDFL2: MOVE 0,$CHRIN + CAIE 0,15 + JRST UPDFL4 + MOVE T2,VALUE + AOS (P) + RTN + +UPDFL3: CAIN 0,"^" + JRST CRPOPJ + CAIN 0,"Z"-100 + JRST UPDFL5 + +UPDFL4: PNTMSF [ASCIZ/ +TRY AGAIN: /] + JRST UPDFL1 + +UPDFL5: PCRLF + JRST ENDDPY +SUBTTL DISPLAY CRAM BY FIELD BREAKDOWN -- CRMFLD + +CRMFLD: PNTMSF [ASCIZ % + +C J # ALU S/D A/B RBM SPEC DISP SKIP T C SC FE FM MC DV MP C/LR M +%] + LDB [POINT 1,2(T6),26] + MOVEM CFCALL + PNT1F ;PRINT "CALL" + PSPACE + + LDB [POINT 12,2(T6),23] + MOVEM CFJ + PNT4F ;PRINT "J" + PSPACE + + LDB [POINT 6,1(T6),35] + LSH ^D12 + LDB T1,[POINT 12,1(T6),23] + OR T1 + MOVEM CFNBR + PNT6F ;PRINT "#" + PSPACE + + LDB [POINT 3,(T6),2] + MOVEM CFALU + PNT1F ;PRINT "ALU" + PSPACE + + LDB [POINT 3,(T6),5] + LSH 3 ;"LSRC" + LDB T1,[POINT 3,(T6),8] + OR T1 + LSH 3 ;"RSRC" + LDB T1,[POINT 3,(T6),29] + OR T1 ;"DEST" + MOVEM CFSD + PNT3F ;PRINT "S/D" + PSPACE + LDB [POINT 4,(T6),17] + LSH 6 ;"A" + LDB T1,[POINT 4,(T6),23] + OR T1 ;"B" + MOVEM CFAB + PNT4F ;PRINT "A/B" + PSPACE + + LDB [POINT 3,(T6),26] + LSH 3 ;PRINT "R" + LDB T1,[POINT 2,(T6),13] + OR T1 ;PRINT "B" + LSH 3 + LDB T1,[POINT 3,(T6),11] + OR T1 ;PRINT "M" + MOVEM CFRBM + PNT3F ;PRINT "RBM" + PSPACE + PSPACE + PSPACE + + LDB [POINT 3,2(T6),32] + LSH 3 + LDB T1,[POINT 3,1(T6),8] + OR T1 + MOVEM CFSPEC + PNT2F ;PRINT "SPEC" + PSPACE + PSPACE + PSPACE + + LDB [POINT 3,2(T6),35] + LSH 3 + LDB T1,[POINT 3,1(T6),5] + OR T1 + MOVEM CFDISP + PNT2F ;PRINT "DISP" + PSPACE + PSPACE + PSPACE + LDB [POINT 3,2(T6),29] + LSH 3 + LDB T1,[POINT 3,1(T6),11] + OR T1 + MOVEM CFSKIP + PNT2F ;PRINT "SKIP" + PSPACE + + LDB [POINT 2,2(T6),25] + MOVEM CFT + PNT1F ;PRINT "T" + PSPACE + + LDB [POINT 1,1(T6),1] + MOVEM CFC + PNT1F ;PRINT "C" + PSPACE + PSPACE + + LDB [POINT 1,(T6),30] + MOVEM CFSC + PNT1F ;PRINT "SC" + PSPACE + PSPACE + LDB [POINT 1,(T6),31] + MOVEM CFFE + PNT1F ;PRINT "FE" + PSPACE + PSPACE + + LDB [POINT 1,1(T6),24] + MOVEM CFFM + PNT1F ;PRINT "FM" + PSPACE + PSPACE + + LDB [POINT 1,1(T6),2] + MOVEM CFMC + PNT1F ;PRINT "MC" + PSPACE + PSPACE + + LDB [POINT 1,1(T6),28] + MOVEM CFDV + PNT1F ;PRINT "DV" + PSPACE + PSPACE + + LDB [POINT 1,1(T6),29] + LSH 1 + LDB T1,[POINT 1,1(T6),25] + OR T1 + MOVEM CFMP + PNT1F ;PRINT "MP" + PSPACE + PSPACE + + LDB [POINT 1,(T6),18] + LSH 1 ;"CLKL" + LDB T1,[POINT 1,1(T6),26] + OR T1 ;"GENL" + LSH 1 + LDB T1,[POINT 1,(T6),32] + OR T1 ;"CHKL" + MOVEM CFCL + PNT1F ;PRINT "CL" + PSPACE + + LDB [POINT 1,(T6),19] + LSH 1 ;"CLKR" + LDB T1,[POINT 1,1(T6),27] + OR T1 ;"GENR" + LSH 1 + LDB T1,[POINT 1,(T6),33] + OR T1 ;"CHKR" + MOVEM CFCR + PNT1F ;PRINT "CR" + PSPACE + + LDB [POINT 1,(T6),35] + MOVEM CFMARK + PNT1F ;PRINT "M" + + PCRLF + RET +SUBTTL MISCELLANEOUS ROUTINES + +INTCOR: SKIPE IC1TIM# + JRST INTCR1 + + MOVSI T1,400000+<^D31*^D512>-1 + CORE T1, + ERR + + SETZM ;MAKE IT WRITABLE + SETUWP + ERR + + SETZM 400000 + MOVE T1,[400000,,400001] + BLT T1,400000+<^D31*^D512>-1 + SETOM IC1TIM + RTN + +INTCR1: SETZM ;MAKE IT WRITABLE + SETUWP + ERR + RTN + +CONCIN: MOVEI CCBLK ;SETUP ^C INTERRUPT BLOCK + MOVEM 134 + SETZM CCBLK+2 + RTN + +CCINT: SETSTS 16,0 ;RESET TTY + HLRZ CCBLK+3 ;GET INTERRUPT REASON + CAIE 2 ;^C ? + HALT . + EXIT + +RTTY= SETSTS 16,0 ;RESET TTY +STTY= SETSTS 16,700 ;SET TTY, IO.LEM+IO.SUP+IO.TEC,+.IOASC +SUBTTL PSI LOGIC -- LEVTAB & CHNTAB + +LEVTAB: LEV1PC + LEV2PC + LEV3PC + +LFLVTB: LF1PC + LF2PC + LF3PC + +CHNTAB: 0 ;00 UNUSED + 0 ;01 UNUSED + 0 ;02 UNUSED + 0 ;03 UNUSED + 0 ;04 UNUSED + 0 ;05 UNUSED + 0 ;06 ARITHMETIC OVERFLOW + 0 ;07 FLOATING POINT OVERFLOW + 0 ;08 RESERVED + 0 ;09 PDL OV + 0 ;10 END OF FILE + 0 ;11 DATA ERROR + 0 ;12 RESERVED + 0 ;13 RESERVED + 0 ;14 RESERVED + 0 ;15 ILLEGAL INSTRUCTION + 0 ;16 ILLEGAL MEMORY READ + 0 ;17 ILLEGAL MEMORY WRITE + 0 ;18 RESERVED + 2,,FRKERR ;19 INFERIOR PROCESS TERMINATION + 0 ;20 SYSTEM RESOURCES EXHAUSTED + 0 ;21 RESERVED + 0 ;22 NON-X-PAGE + 0 ;23 UNUSED + 0 ;24 UNUSED + 0 ;25 UNUSED + 0 ;26 UNUSED + 0 ;27 UNUSED + 0 ;28 UNUSED + 0 ;29 UNUSED + 1,,CTLX ;30 CONTROL-X + 1,,CTLC ;31 CONTROL-C + 1,,CTLZ ;32 CONTROL-Z + 1,,CTLT ;33 CONTROL-T + 1,,ctlo ;34 control-o + 0 ;35 UNUSED +SUBTTL PSI LOGIC -- CONTROL-C AND CONTROL-X + +;*HERE ON A CONTROL-C INTERRUPT + +CTLC: MOVE [1B5+.+3] + MOVEM LEV1PC + DEBRK + HALTF ;EXIT TO MONITOR + JRST START + +;*HERE ON CONTROL-X INTERRUPT + +CTLX: TMSG < +ABORTED +> + MOVE T1,[1B5+REEN] ;WHERE TO GO + MOVEM T1,LEV1PC ;STORE IT + DEBRK ;GO REENTER + JRST REEN ;INTERNAL CONFUSION + +;*HERE ON CONTROL-Z INTERRUPT + +CTLZ: SKIPN CZADR + DEBRK + PUSH P,T1 + MOVE T1,CZADR + TLO T1,(1B5) + MOVEM T1,LEV1PC + POP P,T1 + DEBRK + +;*HERE ON A CONTROL-T INTERRUPT + +CTLT: SKIPN CTADR + DEBRK + SAVEAC + GO @CTADR + RESTAC + DEBRK +;*here on control-o interrupt + +ctlo: SETCMM NOTYPE# + debrk + +;**PSI LOGIC -- FORK TERMINATION + +;*HERE WHEN A FORK TERMINATES +FRKERR: put t1 + hrrz t1,lev2pc + cain t1,pushpc + jrst [getit t1 + debrk] + MOVEI T1,.PRIOU + DOBE + CFIBF + TMSG < +?UNEXPECTED INFERIOR PROCESS TERMINATION +PROGRAM RESTARTING... +> + JRST START + +SUBTTL PSI LOGIC -- CONTROL T + +RDULDT: TMSG < +READING CRAM ADDRESS - > + MOVE T2,RDULT6 + MOVEI T1,.PRIOU + MOVEI T3,^D8 + NOUT + ERR + TMSG < +> + RTN + + +PARSET: HRROI T1,[ASCIZ " +WAITING FOR A COMMAND +SMFILE>"] + PSOUT + RTN +SUBTTL STORAGE -- PRESERVED + + XLIST ;LITERAL POOL +L: LIT +ENDLIT: + LIST ;LITERAL POOL + +;*COMMAND STATUS BLOCK FOR COMND JSYS +CSB: PARSE + .PRIIN,,.PRIOU + -1,,PROMPT + -1,,CMDBUF + -1,,CMDBUF + ^D250 + 0 + -1,,ATOM + ^D250 + GTJFNB + +GTJFNB: +GTJFLG: EXP GJ%OLD + .PRIIN,,.PRIOU +GTJDEV: 0 +GTJDIR: -1,,[ASCIZ "SMFILE"] +GTJFIL: -1,,[ASCIZ "DECSYSTEM-2020"] +GTJEXT: -1,,[ASCIZ "RAM"] + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + +CMDBUF: BLOCK ^D50 +ATOM: BLOCK ^D50 +DEBUGF: 0 ;0 = PRODUCTION, -1 = DEBUG +PARFLG: 0 ;EVEN/ODD CRAM PARITY SWITCH +LOGFLG: 0 ;-1 = LOG, 0 = NO LOG +RDFLAG: BLOCK 1 ;INDICATES MICROCODE READ IN +ECOFLG: -1 ;-1=ECHO, 0=DON'T ECHO TAKE FILES + +LOGNAM: SIXBIT/SMFILE/ ;LOG FILE NAME & EXT +LOGEXT: SIXBIT/LOG/ +SUBTTL COMMAND PROCESSOR + + LALL + +$PNAME: PGMNAM +$PVER: MCNVER,,DECVER + +PGMNAM: ASCIZ % +DECSYSTEM 2020 DIAGNOSTICS FE-FILE PROGRAM +% + +REENTR: DROPDV ;CLOSE LOG FILE + SKIPE MONTYP + JRST REEN20 + CALLI 0 + CALLI 12 + +REEN20: RESET + HALTF + JRST START +SUBTTL MAIN SUBROUTINE PACKAGE CONTROL + +S +;*INITIALIZE THE SUBROUTINE PACKAGE +S + +SUBRTN: SIXBIT/SUBRTN/ ;"SUBRTN" IDENTIFICATION WORD +SUBVER: MCNVER,,DECVER ;"SUBRTN" VERSION INFORMATION +PNTNAM: SIXBIT/SMFILE/ +PNTEXT: SIXBIT/LOG/ + +S +;*CONTRL* SUBROUTINE PACKAGE INITIALIZATION +S + +SBINIT: +$PGMIN: MOVEM 0,$$PAC0 + SETOM USER + JSP 0,.+1 ;LOAD FLAGS INTO AC0 + TLNN 0,USERF ;USER MODE ? + HALT . ;EXEC MODE + SETZM MONTYP + MOVE [112,,11] + GETTAB ;GET MONITOR TYPE ID + CAM + CAIN 40000 ;TOPS20 ? + SETOM MONTYP ;YES +S +;*INITIALIZE PROCESSOR FLAGS AND PUSH LIST +S + +$PGMN1: HLRZ JOBSA ;RESET JOB FIRST FREE TO + MOVEM JOBFF ;END OF LOW SEGMENT + SKIPN MONTYP + CALLI 0 ;TOPS10 RESET + SKIPE MONTYP + RESET ;CLEAR USER I/O + JRST 2,@.+1 ;CLEAR PC FLAGS + 0,,.+1 + MOVE CONSW + MOVEM $SVCSW# ;SAVE PREVIOUS SWITCHES + SETZM CONSW# ;CLEAR SWITCH REGISTER + SETZM $SWFLG# ;DISALLOW SWITCHES TILL INITED + MOVE P,PLIST ;INIT PUSH POINTER + +S +;*INITIALIZE SUBROUTINES +S + +PGINGO: GO $CPUTP ;DETERMINE CPU TYPE (KL/KI/KA) + GO $UUOIN ;INIT UUO TRAP TRANSFER LOCATION + GO $PNTIN ;INIT PRINT SUBROUTINE + GO $TYPIN ;INIT TTY INPUT SUBROUTINE + SETOM $ONETM ;SET ONE TIME FLAG + JRST @$$PAC0# +SUBTTL UUO HANDLING SUBROUTINE + +S +;*UUO INITIALIZATION +S + +$UUOIN: MOVE [GO $UORTN] ;BRING IN UUORTN ENTRY INSTR. + MOVEM JOB41 ;SETUP UUO TRAP AT JOB41 + MOVE [JRST $UOERX] + MOVEM $UUOER ;SET UUO ERROR IN "FIXED" + SETZM $UPLER# + RTN ;EXIT + +;*$UORTN - UUO PROCESSING + +$UORTN: PUT AC0 ;SAVE AC0 ON PUSH LIST + MOVE AC0,JOBUUO ;GET THE UUO + LSH AC0,-^D27 ;ISOLATE INSTRUCTION FIELD FOR UUO (RT 27 PLACES) + CAILE AC0,36 ;IS IT 36 OR LESS? (LOW) + JRST $SUBUO ;DECODE 37 @ $SUBUO +$USRUO: MOVE AC0,-1(P) ;GET USRPC + 1 (AC0 IS ALSO ON THE STACK) + SUBI 1 ; - 1 + MOVEM $SVUPC ;SAVE FOR USER UUO ROUTINE (IF NEEDED) + MOVE AC0,JOBUUO ;GET UUO FROM LOCATION 40 IN JDA + MOVEM $SVUUO ;SAVE FOR USER UUO ROUTINE + MOVE AC0,$SVUUO + LSH AC0,-^D27 ;RIGHT SHIFT FOR INDEX INTO UUO TABLE + PUT 1 + LSHC 0,-1 + ADDI UUODIS ;ADD USER UUO TABLE START TO THE UUO +$XUUO: TLNN 1,400000 + HRRZ @0 ;EVEN UUO + TLNE 1,400000 + HLRZ @0 ;ODD UUO + GETIT 1 + EXCH AC0,(P) ;PUT ADR ON STACK, AC0 BACK IN AC0 + RTN ;SPECIAL XFER TO ROUTINE USING ADR ON STACK + +$SUBUO: SUBI AC0,37 ;NORMALIZE TO MAKE LOWEST UUO = 0 + ADDI AC0,TABLE0 ;ADDR OF TABLE + NORM. UUO (0-3) + JRST @0 ;SELECT THE CORRECT ERROR UUO VIA TABLE + +TABLE0: JRST $UUO37 ;UUO = 37 .......DECODE SUBROUTINE UUO + +S +;*UUO ERROR EXIT ROUTINE +S + SALL + + GETIT AC0 ;POP OFF AC0 (KA MUUO'S) +$UOERX: PUT JOBUUO ;SAVE BAD UUO WHILE PRINTING VIA AC0 (P + 1) + PMSG <^ILLEGAL UUO^UUO]]FLAGS] PC^> + GETIT AC0 ;GET BAD UUO FROM THE STACK (P - 1) + PNTHW ;PRINT IT + PSP ;PRINT SPACE + GETIT AC0 ;GET FLAGS & UUO PC + 1 FROM STACK (P - 1) + SUBI AC0,1 ;SUBTRACT 1 + PNTHW ;PRINT FLAGS & UUO PC + PCRL ;PRINT C/R & L/F + FATAL + + LALL +S +;*DECODE ROUTINE FOR SUBROUTINE UUO'S (037) +S + +$UUO37: HRRZ JOBUUO ;GET CALLING UUO + JUMPE $PNTIT ;PRINT UUO + CAIN 0,1 + JRST $PNTIF ;PRINT FORCED UUO + TRNE 777600 + JRST $EG177 ;PRINT MESSAGE UUO + CAIL 5 + JRST $EG4 ;PRINT CHAR IMMEDIATE UUO + PUT 1 + MOVE 1,JOBUUO + LSH 1,-^D23 ;EXTRACT UUO AC FIELD + ANDI 1,17 + LSH 0,4 ;POSITION E FIELD + IOR 0,1 ;COMBINE E & AC FIELD + LSHC 0,-1 ;SET ODD/EVEN + ADDI $UOTAB-20 ;COMPUTE TABLE ENTRY OFFSET + JRST $XUUO + +$UOTAB: ;E FIELD = 2 + $PTSXF,,$PNTSX + $UOERX,,$UOERX + $DRPDV,,$PNTNM + $UOERX,,$UOERX + $UOERX,,$UOERX + $UOERX,,$UOERX + $UOERX,,$UOERX + $UOERX,,$UOERX + ;E FIELD = 3 + $YESNO,,$OPTLK + $TPOCT,,$NOYES + $TPCNV,,$TPDEC + $TALTM,,$TTLK + $TTYIN,,$TISIX + $UOERX,,$TPCLR + $PSIXF,,$PSIX + $POCSF,,$POCS + ;E FIELD = 4 + $UOERX,,$UOERX + $UOERX,,$UOERX + $UOERX,,$UOERX + $UOERX,,$UOERX + $UOERX,,$UOERX + $UOERX,,$END + $FATAL,,$ERHLT + $UOERX,,$EOP + +$EG4: MOVE JOBUUO ;IMMEDIATE CHARACTER PRINT + TLNE (1B12) + JRST [PNTCHF + JRST $EGX] + PNTCHR + JRST $EGX + +$EG177: MOVE JOBUUO ;IMMEDIATE MESSAGE PRINT + TLNE (4B12) + JRST [PSIXLF + JRST $EGX] + TLNE (2B12) + JRST [PSIXL + JRST $EGX] + TLNE (1B12) + JRST [PNTALF + JRST $EGX] + PNTAL +$EGX: GETIT 0 + RTN + +SUBTTL PROCESSOR TYPE DETERMINATION +S + +$CPUTP: SETZM CYCL60# + SETZM SM10 + SETZM KLFLG + SETZM KAIFLG +$CPKL: SETZ 1, ;IF KL10, AC1 AFTER BLT WILL CHANGE + BLT 1,0 ;Copy 1 word from 0 to 0 + SKIPN 1 ;on KL10, BLT will change AC + JRST $CPKAI + SETOM KLFLG ;KL10 - SET FLAG + +$CPINI: SKIPN MONTYP + JRST .+5 ;TOPS-10 + MOVE 1,[SIXBIT/APRID/] + SYSGT ;GET SERIAL NUMBER + MOVE 0,1 + JRST .+4 + MOVE 0,[20,,11] + GETTAB + SETZ 0, + MOVEM 0,$$SNX# ;SAVE IT + SKIPN KLFLG + RTN + CAILE 0,^D4096 ;IS THIS A KS10 ? + SETOM SM10 ;YES, SERIAL # GT 4096. + RTN + +$CPKAI: SETOM KAIFLG + MOVNI 0,1 + AOBJN 0,.+1 + SKIPE + SETZM KAIFLG ;KA10 + + JRST $CPINI +SUBTTL PROGRAM HALTS + +;*SUBROUTINE ERROR HALT +S + SALL + +$ERHLT: PNTNM ;PRINT PROGRAM NAME + PMSGF + GETIT $ERH0 + PUT 0 + MOVE AC0,$ERH0# ;LOAD HALT LOC WITH USRPC + 1 FOR RESTART + SOS ;SUBTRACT ONE FOR USRPC OF ERROR + PNT6F ;PRINT USRPC FORCED + PCRLF + +$ERHL4: GETIT AC0 + SKIPE MONTYP + JRST .+3 + CALLI 1,12 + JRST @$ERH0 + HALTF ;RETURN TO MONITOR + JRST @$ERH0 ;IF CONTINUED + LALL + +;*FATAL PROGRAM ERROR HALT +S + SALL + +$FATAL: PNTNM + PMSGF + MOVE AC0,(P) ;RETRIEVE USRPC + 1 FROM THE STACK + SOS ;- 1 + PNT6F ;PRINT IT + PCRLF + JRST $EOP ;END PROGRAM + LALL +SUBTTL PROGRAM NAME PRINTER + +;*PRINT PROGRAM NAME IF NOT STAND-ALONE OR USER MODE +S + SALL +$PNTNM: SKIPL MONCTL ;DIAG MON / SYS EXR ? + JRST $PNM2 ;NO + PNTMSG @$PNAME ;PRINT PROGRAM NAME + PMSG + HLRZ JOBVER + PNTOCS ;PRINT MCN LEVEL + PNTCI "." + HRRZ JOBVER + PNTOCS ;PRINT DEC VERSION + SKIPN MONTYP + PMSG <, TOPS-10> + SKIPE MONTYP + PMSG <, TOPS-20> + + SKIPE KLFLG + JRST [SKIPE SM10 + JRST [PMSG <, KS10> + JRST $PNM3] + PMSG <, KL10> + JRST $PNM3] + SKIPN KAIFLG + JRST [PMSG <, KA10> + JRST $PNM3] + PMSG <, KI10> + +$PNM3: SKIPN $$SNX + JRST $PNM2 + PMSG <, CPU#=> + MOVE $$SNX + PNTDEC + +$PNM2: PCRL + RTN ;EXIT + + LALL +SUBTTL *SUBRTN* END OF PASS/END OF PROGRAM ROUTINES + LALL +;*END OF PASS ROUTINE +S + SALL +$END: AOS PASCNT ;INCREMENT PASS COUNTER + SOS ITRCNT +$END2: PMSGF + MOVE PASCNT ;PRINT END OF PASS COUNT + PNTDCF + PNTCIF "." + PCRLF +$END3: AOS (P) + RTN + LALL + +;*END OF PROGRAM ROUTINE +S + +$EOP: SKIPN MONTYP + CALLI 12 + HALTF ;YES, EXIT + JRST START + LALL +SUBTTL *SUBRTN* TELETYPE INPUT ROUTINES + +S +;*CARRIAGE RETURN OR COMMA TERMINATES OCTAL, DECIMAL, OR CONVERT TYPE-IN. +;*CHARACTER OR NUMBER RETURNED IN AC0. +;*CALL SEQUENCE IS AS FOLLOWS: +;* NAME +;* NO/ERROR RESPONSE RETURN (+ 1) +;* NORMAL RESPONSE RETURN (+ 2) +;*$OPTLK = INPUT ANY CHARACTER +;*$YESNO = ASK QUESTION, CORRECT RESPONSE Y +;*$NOYES = ASK QUESTION, CORRECT RESPONSE N +;*$TPOCT = INPUT UP TO 12 OCTALS +;*$TPDEC = INPUT UP TO 11 DECIMALS +;*$TPCNV = INPUT UP TO 9 CONVERT'S +;*$TTLK = KEYBOARD CHECK, INPUT ANY CHARACTER (NO WAIT) +;*$TALTM = KEYBOARD, ALT-MODE CHECK +;*$TISIX = INPUT UP TO 6 SIXBIT CHARACTERS +S + +;*TELETYPE INPUT INITIALIZATION +S +$TYPIN: SETZM INUPTR ;CLEAR INPUT POINTER + RTN ;NO TYPE-IN AVAILABLE + +S +;*CHECKS FOR ANY KEY STRUCK, RETURNS IMMEDIATELY +;*RETURNS +1 IF NO TYPEIN, RETURNS +2 IF CHAR TYPED +S + +$TTLK: SETZ AC0, + SKIPGE MONCTL ;NO CHECK IF "MONITOR" + RTN + SKIPE MONTYP + JRST .+4 + INCHRS $TTCHR ;TOPS10 INPUT CHAR AND SKIP + RTN ;NONE AVAILABLE + JRST $HEAR4 ;GO PROCESS + PUT 1 + PUT 2 + MOVEI 1,.PRIIN + SIBE ;ANY INPUT AVAILABLE ? + JRST .+4 ;YES + GETIT 2 + GETIT 1 + RTN + PBIN ;GET INPUT CHAR + MOVEM 1,$TTCHR + GETIT 2 + GETIT 1 + JRST $HEAR4 ;CHAR TYPED, GO PROCESS +S +;*TELETYPE IMAGE MODE INPUT +;*PROVIDES UNBUFFERED MODE INPUT +;*WAITS FOREVER, RETURN WITH CHAR UPPER CASED & ECHOED +S + +$TTYIN: SKIPE MONTYP + JRST .+3 + INCHRW ;TOPS10 INPUT CHAR AND WAIT + JRST .+5 + PUT 1 + PBIN + MOVEM 1,$TTCHR + GETIT 1 + GO $HEAR4 ;PROCESS IT + JRST .-1 + RTN + +$OPTLK: MOVEM 4,$TACB4# + GO $HEAR + JRST .-1 + AOS (P) + MOVEI 4,1 + MOVEM 4,$TWCNT ;INDICATE NO TIMEOUT + MOVE 4,$TACB4 + RTN + +S +;*TELETYPE ALT-MODE CHECK ROUTINE +S + +$TALTM: GO $TTLK + RTN ;NO TYPE-IN ...EXIT + +$TALT2: CAIE 175 + CAIN 176 + JRST $TALT1 ;ALT-MODE WAS TYPED + CAIE 33 + JRST .+2 ;NO ALT-MODE + +$TALT1: JRST CPOPJ1 ;ALT-MODE, RETURN +2 + + RTN +S +;*TELETYPE INPUT CHARACTER +S + +$HEAR: SKIPE MONTYP + JRST .+3 +$$$TT0: INCHWL $TTCHR ;TOPS10 INPUT CHAR LINE MODE + JRST $HEAR4 + SKIPN INUPTR ;ANY INPUT POINTER ? + JRST .+5 ;NO, INPUT CLEARED + ILDB 0,INUPTR ;GET CHAR FROM STORE + JUMPE 0,.+3 ;USED IT ALL, GET NEW INPUT + MOVEM 0,$TTCHR ;SAVE IT + JRST $HEAR4 ;GO PROCESS + + PUT 1 + PUT 2 + PUT 3 + MOVE 1,[POINT 7,D$ISTR] + MOVEM 1,INUPTR# ;SETUP INPUT POINTER + MOVE 2,[RD%BRK!RD%TOP!^D132] + SETZ 3, + + RDTTY ;GET TTY INPUT FROM MONITOR + JRST T20ERR + + GETIT 3 + GETIT 2 + GETIT 1 + JRST $HEAR ;NOW GO PROCESS + +$TPCLR: PUT 1 + SETZM INUPTR ;CLEAR INPUT POINTER + MOVEI 1,.PRIIN + SKIPN MONTYP + CLRBFI ;TOPS10 CLEAR BUFFER + SKIPE MONTYP + CFIBF ;ERROR, CLEAR TYPE-IN BUFFER + GETIT 1 + RTN +S +;*CHARACTER PROCESSING ROUTINE FOR INPUT +;*CHARACTER RETURNED IN AC0 IS UPPER CASE +;*ACTUAL CHARACTER IS IN $TTCHR +S + +$HEAR4: MOVE 0,$TTCHR ;GET ACTUAL CHARACTER + ANDI 0,177 ;CLEAR PARITY BIT + CAIL 0,"A"+40 ;CONVERT TO UPPER CASE + CAILE 0,"Z"+40 + JRST .+2 + SUBI 0,40 + MOVEM 0,$CHRIN# ;SAVE CHARACTER + CAIE 0,15 ;IS IT CR ? + JRST $HEAR3 ;NO + SETZM $CARCT ;CLEAR CHARACTER COUNTER + SKIPN MONTYP +$$$TT1: INCHRW ;TOPS10 FLUSH LF + SKIPE MONTYP + IBP INUPTR ;GET RID OF LF + MOVE 0,CONSW + TLNN 0,PNTLPT ;LPT/LOGICAL DEVICE OUTPUT ? + JRST $HEAR2 ;NO + PCRL ;YES-ADD CRLF +$HEAR2: MOVE 0,$CHRIN ;PUT INPUT CHAR IN AC0 + AOS (P) ;SKIP RETURN +2 + RTN ;NORMAL RETURN +1 + +$HEAR3: MOVE 0,CONSW ;GET DATA SWITCHES + TLNN 0,PNTLPT ;PRINT ON LPT? + JRST $HEAR2 ;NO-EXIT + MOVE 0,$CHRIN ;YES + PNTCHR ;SEND CHAR TO LPT/LOGICAL DEV + JRST $HEAR2 ;EXIT +SUBTTL *SUBRTN* TELETYPE YES/NO TYPE-IN ROUTINE + +S +;*ACCEPTS Y OR N +;*FOR YESNO, Y IS SKIP RETURN, N OR NO RESPONSE IS DIRECT RETURN +;*FOR NOYES, N IS SKIP RETURN, Y OR NO RESPONSE IS DIRECT RETURN +;*'Y OR N - ' ASKED UPON ENTRY +S + +$NOYES: MOVEI 0,1 ;INIT FOR N ANSWER + JRST .+2 +$YESNO: MOVEI 0,0 ;INIT FOR Y ANSWER + MOVEM 1,$TACC1# ;SAVE AC'S + MOVEM 2,$TACC2# + MOVE 2,0 + +$YN1: PMSGF < Y OR N - > + GO $OPTLK + JRST $YN2 ;NO RESPONSE + CAIE 0,"Y" ;IS IT A 'Y' ? + CAIN 0,"N" ;OR AN 'N' ? + JRST .+2 ;YES + JRST $YN3 ;NEITHER, ERROR + MOVE 1,0 + LSH 1,7 ;POSITION 1ST CHAR + GO $OPTLK + JRST $YN2 ;NO RESPONSE + OR 1,0 ;MERGE 2ND CHAR + CAMN 1,$YN4(2) ;COMPARE FOR REQUESTED + JRST .+4 ;YES, RETURN +2 + CAMN 1,$YN4+1(2) ;COMPARE FOR OPPOSITE + JRST .+3 ;YES, RETURN +1 + JRST $YN3 ;ERROR, REPEAT + AOS (P) ;YES, RETURN +2 +$YN2: MOVE 2,$TACC2 ;RESTORE AC2 + MOVE 0,1 + MOVE 1,$TACC1 ;RESTORE AC1 + RTN ;RETURN +1 + +$YN3: PCRLF + GO $TPCLR ;CLEAR INPUT + JRST $YN1 + +$YN4: EXP 26215 ;'Y' (CR) + EXP 23415 ;'N' (CR) + EXP 26215 ;'Y' (CR) +SUBTTL *SUBRTN* TELETYPE OCTAL-DECIMAL-CONVERT TYPE-IN ROUTINE + +S +;*ACCEPTS 0 TO 12 OCTALS, 0 TO 11 DECIMALS, 0 TO 9 CONVERT CHARACTERS +;*NUMBER RETURNED IN AC0. +S + +$TPCNV: MOVEI AC0,2 ;SET INDEX TO CONVERT + JRST $TPCV1 +$TPDEC: MOVEI AC0,1 ;SET INDEX TO DECIMAL + JRST $TPCV1 +$TPOCT: MOVEI AC0,0 ;SET INDEX TO OCTAL + +$TPCV1: MOVEM 1,$TACD1# ;SAVE AC'S 1-3 + MOVEM 2,$TACD2# + MOVEM 3,$TACD3# + MOVE 3,0 ;LOAD AC3 WITH THE INDEX + SETZB 1,2 ;CLEAR DATA REG, CHAR COUNTER + SETZM $TYPNB# ;CLEAR ERR NUMBER + SETZM $NEGF# ;CLEAR NEGATE FLAG + SETZM $CNVD# ;CLEAR DECIMAL CONVERT FLAG + SETZM TTNBRF ;CLEAR DIGIT TYPED FLAG + + +;*INPUT AND COMPUTE NUMBER +S + +$TYPLP: GO $OPTLK + JRST $TPERR ;NO RESPONSE, GO TO ERROR EXIT + CAIN 0,"-" ;IS IT MINUS ? + JRST $NEGX ;YES + CAIN 0,"." ;IS IT PERIOD ? + JRST $CNVX ;YES + CAIN 0,15 ;IS IT CR ? + JRST $TPEXT ;YES + CAIN 0,"," ;IS IT COMMA ? + JRST $TPEXT ;YES + CAIL 0,"0" ;A VALID DIGIT ? + XCT $TPCK(3) ;YES + JRST $TPERR ;NO ...ERROR EXIT + +$TYPL1: SETOM TTNBRF ;SET DIGIT TYPED FLAG + AOS 2 ;INCREMENT CHARACTER COUNTER + XCT $TPMUL(3) ;MULT BY OCTAL/DECIMAL BASE, SHIFT CONVERT + SUBI 60 ;ADD IN NEW CHAR + ADD 1,0 + JRST $TYPLP ;REPEAT TILL CR OR COMMA +;*CHECK FOR PROPER AMOUNT OF CHARACTERS +S + +$TPEXT: XCT $TPNBR(3) ;PROPER NUMBER OF CHARACTERS + JRST $TPERR ;NO ...ERROR EXIT + CAIN 3,2 ;CONVERT ? (INDEX = 2) + JRST $CNVX1 ;YES + ;NO, EXIT + +$TPEX1: MOVE 3,$TACD3 ;RESTORE AC'S 3 & 2 + MOVE 2,$TACD2 + MOVE 0,1 ;PUT NUMBER IN AC0 + SKIPE $NEGF ;NEGATE ? + MOVN 0,1 ;YES + MOVE 1,$TACD1 ;RESTORE AC1 + AOS (P) ;RETURN +2 + RTN ;RETURN +1 + +$TPERR: MOVEM 1,$TYPNB ;SAVE NUMBER - ERROR EXIT + MOVE 3,$TACD3 ;RESTORE AC'S + MOVE 2,$TACD2 + MOVE 1,$TACD1 + RTN ;ERROR EXIT ) + + +;*NUMBER COMPUTING CONSTANTS +S + +$TPCK: CAILE 0,"7" ;OCTAL NUMBER CHECK + CAILE 0,"9" ;DECIMAL NUMBER CHECK + CAILE 0,"9" ;CONVERT NUMBER CHECK +$TPMUL: LSH 1,3 ;OCTAL BASE SHIFT + IMULI 1,^D10 ;DECIMAL BASE MULTIPLIER + LSH 1,4 ;CONVERT SHIFT +$TPNBR: CAILE 2,^D12 ;ACCEPT UP TO 12 OCTALS + CAILE 2,^D11 ;ACCEPT UP TO 11 DECIMALS + CAILE 2,^D9 ;ACCEPT UP TO 9 CONVERT +$NEGX: SKIPE 2 ;1ST CHAR ? + JRST $TPERR ;NO, ERROR EXIT ) + SETOM $NEGF ;YES, SET NEGATE FLAG + JRST $TYPLP ;GET NEXT CHAR + +$CNVX: CAIE 3,2 ;PERIOD, IN CONVERT ? + JRST $TPERR ;NO, ERROR EXIT ) + SETOM $CNVD ;YES, SET DECIMAL FLAG + JRST $TYPLP ;GET NEXT CHAR + + +;*CONVERT CONVERSION ROUTINE +S + +$CNVX1: MOVEI 2,^D9 ;NINE DIGITS + SETZM 0 + SKIPE $CNVD ;OCTAL OR DECIMAL ? + JRST $CNVX2 ;DECIMAL + TDNE 1,[421042104210] ;OCTAL + JRST $TPERR ;OCTAL ERROR, 8 OR 9 INPUT + LSH 1,1 ;SQUEEZE OUT 4TH BIT + LSHC 0,3 ;COMPACT INTO OCTAL + SOJN 2,.-2 ;COMPLETED ? + MOVE 1,0 ;YES + JRST $TPEX1 ;RETURN + +$CNVX2: SETZM 3 ;DECIMAL + SETZM 0 + IMULI 3,^D10 ;MULTIPLY BY DECIMAL BASE + LSHC 0,4 ;UNPACK NEXT DIGIT + ADD 3,0 ;ADD IN + SOJN 2,.-4 ;COMPLETED ? + MOVE 1,3 ;YES + JRST $TPEX1 ;RETURN ) + +SUBTTL *SUBRTN* TELETYPE SIXBIT INPUT ROUTINE + +S +;*INPUTS UP TO SIX CHARACTERS, TERMINATES WITH A CR OR COMMA. +;*SIXBIT WORD RETURNED IN AC0 +S + +$TISIX: MOVEM 1,$TSX1# ;SAVE AC'S + MOVEM 2,$TSX2# + MOVE 2,[POINT 6,1] + MOVEI 1,0 + +$TSXB1: GO $OPTLK + JRST $TSXB3 ;NO RESPONSE, RTN + 1 + CAIN 0,15 + JRST $TSXB2 ;CR, TERMINATE, RTN + 2 + CAIN 0,"," + JRST $TSXB2 ;COMMA, TERMINATE, RTN + 2 + CAIL 0,"0" + CAILE 0,"Z" + JRST $TSXB3 ;ERROR, RTN + 1 + CAILE 0,"9" + CAIL 0,"A" + JRST $TSXB4 ;ALPHA-NUMERIC + JRST $TSXB3 ;ERROR, RTN + 1 + +$TSXB4: TRC 0,40 ;CONVERT TO SIX-BIT + TRNE 1,77 + JRST $TSXB3 ;TOO MANY CHAR'S, RTN + 1 + IDPB 0,2 ;PUT INTO WORD + JRST $TSXB1 ;GET NEXT CHARACTER + +$TSXB2: AOS (P) ;INCR USRPC FOR RTN + 2 (NORMAL) + +$TSXB3: MOVE 0,1 ;SIXBIT WORD IN AC0 + MOVE 1,$TSX1 ;RESTORE AC'S + MOVE 2,$TSX2 + RTN ;EXIT + 1/+2 +SUBTTL *SUBRTN* PRINT SUBROUTINES + +S +;* $PNTSX PRINT SIXBIT NORMAL +;* $PTSXF PRINT SIXBIT FORCED +;* $PNTCW PRINT DF10 CONTROL WORD +;* $PNTI1 PRINT OCTAL NUMBER +;* $CHRPN PRINT CHARACTER +;* $ASCPN PRINT ASCII CHARACTER/LINE +;* $DECPN PRINT DECIMAL NUMBER +S + +S +;*PRINT SUBROUTINE INITIALIZATION +;*INITIALIZES CONTROL WORDS, AND TTY IF IN USER MODE +S + +$PNTIN: SETZM $INTDF# ;CLEAR DEVICE DEFAULT FLAG + SETZM $DVOFF# ;CLEAR DEVICE INITED FLAG + SETZM PDISF# ;CLEAR PRINT DISABLED FLAG + SETZM $PTINH# ;CLEAR PRINT 'TYPE-IN INHIBIT' FLAG + SETZM PNTINH# ;ALLOW EXEC PRINT TYPE IN INHIBIT + SETZM XOFFLAG# ;CLEAR XOFF FLAG + SETZM PNTFLG# ;CLEAR IN PRINT FLAG + SETOM PNTSPC# ;SET PRINT SPACE FLAG + MOVNI 0,^D5000 ;SET PRINT ENABLE TO 5000 LINES + MOVEM 0,PNTENB + SETZM TTYFIL# ;ALLOW EXEC FILLERS + SETZM $CRLF# ;ALLOW FREE CR/LF + SETZM $TABF ;ALLOW TAB CONVERSION + SETZM $FFF ;ALLOW FORM FEED CONVERSION + SETZM $VTF ;ALLOW VERTICAL TAB CONVERSION + + SKIPN MONTYP + JRST $PNTIX + + movei 1,.priou + rfmod ;don't translate print output + trz 2,tt%dam + tro 2,3b29 + sfmod + +$PNTIX: MOVEI REENTR ;SETUP REENTER ADDRESS + MOVEM JOBREN + SKIPGE MONCTL ;MONITOR CONTROL ? + RTN ;YES, DON'T PRINT TITLE + SKIPE $ONETM ;FIRST TIME? + RTN ;NO .....EXIT + JRST $PNTNM+2 ;YES ...PRINT PROGRAM NAME + ;AND EXIT +S +;*PRINT SUBROUTINE ENTRY POINT +;*EXIT VIA $PNTI4 BELOW +S + +$PNTIF: SETOM PNTFLG ;SET IN PRINT FLAG + SETOM $PNTTY# ;FORCE TO TTY + SETZM $PTINH + SKIPE MONTYP + JRST .+4 + TTCALL 13,0 ;TOPS10 CLEAR CONTROL O + JFCL + JRST $PNTIA + PUT 1 + PUT 2 + MOVEI 1,.PRIOU + RFMOD + TLZ 2,(TT%OSP) ;CLEAR CONTROL O + SFMOD + GETIT 2 + GETIT 1 + SETZM INUPTR ;CLEAR TTY INPUT BUFFER + JRST $PNTIA + +$PNTIT: SETOM PNTFLG ;SET IN PRINT FLAG + SETZM $PNTTY ;NOT FORCED TO TTY + SKIPL PNTENB# ;PRINT LIMIT REACHED YET? + JRST $PNTIB ;YES ..DON'T PRINT + MOVE CONSW ;READ DATA SWITCHES INTO AC0 + TLNN 0,NOPNT ;NO PRINT SWITCH SET? + JRST $PNTIA + GETIT AC0 ;YES ...RESTORE AC0 FROM STACK (P - 1) + JRST $PRNTX ;EXIT, DON'T PRINT +;*PRINT ROUTINE EXIT +S + +$PNTI4: SETZM $PNTTY ;CLEAR FORCE TO TTY FLAG + + MOVE 1,$PACA1 ;RESTORE AC'S + MOVE 2,$PACA2 + MOVE 3,$PACA3 + MOVE 4,$PACA4 + MOVE 5,$PACA5 +$PRNTX: SETZM PNTFLG ;CLEAR IN PRINT FLAG + RTN ;RETURN + +;*PRINT LIMIT WARNING & ALTERNATE EXIT PATH +S + +$PNTIB: GETIT AC0 ;RESTORE THE STACK (P - 1) + SKIPE PDISF# ;FIRST TIME PRINT DISABLED? + JRST $PRNTX ;YES ...EXIT ) + +$PNTB1: SETOM PDISF ;NO ........SET IT + MOVEM 1,$PACA1 ;SAVE AC'S 1 - 5 + MOVEM 2,$PACA2 + MOVEM 3,$PACA3 + MOVEM 4,$PACA4 + MOVEM 5,$PACA5 + SETOM $PNTTY ;SET FORCE TO TTY FLAG + MOVEI [ASCIZ/ +****** +EXCEEDED ALLOWED PRINTOUTS +/] + JRST $ASCPN-1 ;PRINT THE WARNING & EXIT +S +;*PRINT ROUTINE SELECTOR +;*BASED ON "AC FIELD" = 12 - 17 +S + +$PNTIA: MOVEM 1,$PACA1# ;SAVE AC1. + MOVEM 2,$PACA2# ;SAVE AC2. + MOVEM 3,$PACA3# ;SAVE AC3. + MOVEM 4,$PACA4# ;SAVE AC4. + MOVEM 5,$PACA5# ;SAVE AC5. + GETIT AC0 ;RESTORE AC0 FROM STACK (P - 1) + SETZM $PNT# ;CLEAR PRINT HALF WORDS FLAG + MOVE 2,LUUO + ROT 2,15 ;GET X (AC FIELD) + ANDI 2,17 ;OUT OF THE UUO + +$PNTIC: CAIN 2,17 ;X=17? + JRST $PNTLN ;YES. PRINT ASCII LINE + JUMPE 2,$ASCPN ;X=0? YES. GO PRINT 1 WORD ASCII + CAIN 2,15 ;X=15? + JRST $DECPN ;YES, PRINT DECIMALS ) + CAIN 2,16 ;X=16? + JRST $DECSP ;YES, PRINT DECIMALS, LEADING SPACES + CAIN 2,13 ;X=13? + JRST $PNTI3 ;YES, PRINT OCTALS, 6 SP 6 + CAIN 2,12 ;X=12? + JRST $CHRPN ;YES, PRINT CHARACTER ) + + JRST $PNTI1 ;NONE OF THE ABOVE, PRINT OCTAL + ;(AC FIELD <12 OR = TO 14) +S +;*SIXBIT PRINT SUBROUTINE +;*PRINTS SIXBIT WORD IN AC0 +S + +;*NORMAL PRINTOUT +S + +$PNTSX: PUT 1 ;SAVE AC1 ON STACK (P + 1) + MOVE 1,0 ;PUT SIXBIT WORD IN AC1 + MOVEI 0,0 + LSHC 0,6 ;GET NEXT CHAR INTO AC0 + ADDI 0,40 ;CONVERT TO ASCII + PNTCHR ;PRINT IT + JUMPN 1,.-4 ;LOOP TILL ALL PRINTED + GETIT 1 ;RESTORE AC1 FROM THE STACK (P - 1) + RTN ;EXIT + +;*FORCED PRINTOUT +S + +$PTSXF: PUT 1 ;SAVE AC1 ON THE STACK (P + 1) + MOVE 1,0 ;PUT SIXBIT WORD IN AC1 + MOVEI 0,0 + LSHC 0,6 ;GET NEXT CHAR INTO AC0 + ADDI 0,40 ;CONVERT TO ASCII + PNTCHF ;PRINT + JUMPN 1,.-4 ;LOOP TILL ALL PRINTED + GETIT 1 ;FROM THE STACK (P - 1) + RTN ;EXIT +S +;*SIXBIT MESSAGE PRINT ROUTINE +;*PRINTS THE SIXBIT MESSAGE THOSE ADDRESS IS IN AC0 +;*"BACKARROW" (77) SIGNIFIES END OF TEXT +;*"UPARROW" (76) SIGNIFIES CR/LF +;*"RIGHT SQUARE BRACKET" (75) SIGNIFIES TAB +S + +$PSIXF: PUT 5 + SETO 5, ;SET FORCED PRINTING FLAG + JRST .+3 + +$PSIX: PUT 5 + SETZ 5, ;NORMAL PRINTING + PUT 1 + PUT 2 + PUT 3 + PUT 4 + + HRRZ 4,0 ;MESSAGE ADDRESS TO AC4 + +$PSIX1: MOVEI 3,6 ;6 = NUM OF 6BIT CHAR PER WORD + MOVE 1,(4) ;GET FIRST/NEXT WORD OF MESSAGE + +$PSIX2: SETZ 2, + ROTC 1,6 ;C(AC1) = CHAR TO BE PRINTED + CAIN 2,77 + JRST $PSIX5 ;"BACKARROW", DONE + CAIN 2,76 + JRST $PSIX4 ;"UPARROW", CR/LF + CAIN 2,75 + MOVEI 2,151 ;"BRACKET", CHANGE TO TAB (151+40=11) + MOVEI 0,40(2) ;CHANGE TO ASCII + JUMPN 5,[PNTCHF + JRST .+2] ;FORCED PRINT + PNTCHR +$PSIX3: SOJN 3,$PSIX2 ;PRINTED ALL CHARS FROM THIS WORD ? + AOJA 4,$PSIX1 ;YES, DO NEXT WORD + +$PSIX4: JUMPN 5,[PCRLF + JRST .+2] + PCRL ;PRINT CR/LF + JRST $PSIX3 + +$PSIX5: GETIT 4 + GETIT 3 + GETIT 2 + GETIT 1 + GETIT 5 + RTN +S +;*OCTAL SUPPRESS LEADING ZEROS PRINT ROUTINE +;*PRINTS NUMBER IN AC0, SUPPRESSING LEADING ZEROS +;*PRINTS MINUS SIGN IF NUMBER IS NEGATIVE +S + +$POCSF: PUT 5 + SETO 5, ;FORCED PRINTOUT + JRST .+3 + +$POCS: PUT 5 + SETZ 5, ;NORMAL PRINTOUT + PUT 1 + PUT 2 + PUT 3 + PUT 4 + + MOVE 2,0 + JUMPGE 2,$POCS1 ;IS NUMBER NEGATIVE ? + MOVEI "-" + JUMPN 5,[PNTCHF + JRST .+2] + PNTCHR ;YES, PRINT MINUS SIGN + MOVN 2,2 ;MAKE NUMBER POSITIVE + +$POCS1: SETZ 4, + SETZB 3,1 + JUMPE 2,$POCS3 ;IF NUMBER 0, PRINT 1 ZERO + + MOVEI 3,^D12 ;PRINT UP TO 12 DIGITS +$POCS2: SETZ 1, + LSHC 1,3 + JUMPE 1,$POCS5 ;IS THIS DIGIT ZERO ? + SETO 4, ;NO, SET NON-ZERO DIGIT FLAG +$POCS3: MOVEI "0"(1) ;MAKE ASCII NUMBER + JUMPN 5,[PNTCHF + JRST .+2] + PNTCHR ;PRINT DIGIT + +$POCS4: SOJG 3,$POCS2 ;ALL DONE ? + GETIT 4 + GETIT 3 + GETIT 2 + GETIT 1 + GETIT 5 + RTN + +$POCS5: JUMPE 4,$POCS4 ;PRINTED NON-ZERO DIGIT ? + JRST $POCS3 ;YES, PRINT ZEROS +S +;*OCTAL PRINTOUT ROUTINE +;*PRINTS NUMBER IN AC0 +S + +$PNTI1: MOVE 3,2 ;MOVE X INTO AC3. + ROT 0,-3 ;ROT OCTAL NUM 3 PLACES + SOJN 3,.-1 ;X AMOUNT OF TIMES. + +$PNTI2: MOVEI 1,6 ;PUT 6 INTO AC1 SO THAT + ROTC 0,3 ;C(AC1) AFTER THE ROTC WILL BE 60 + JSP 3,$TOUT ;PLUS NUMBER TO BE PRINTED + SOJN 2,$PNTI2 ;SUB 1 FROM X...PRINT UNTIL X=0. + MOVEM 1,$PNTSV# ;SAVE NUMBER + SKIPN PNTSPC + JRST .+3 + MOVEI 1,40 ;AT THIS POINT WE HAVE PRINTED + JSP 3,$TOUT ;X AMOUNT OF NUMBER(S) AND NOW A SPACE + SKIPN $PNT# ;PRINT 6 SP 6 FLAG SET? + JRST $PNTI4 ;NO, EXIT ) + MOVE 1,$PNTSV ;RESTORE NUMBER + MOVEI 2,6 ;SETUP FOR 2ND HALF + SETZM $PNT ;CLEAR PRINT SPACE FLAG + JRST $PNTI2 ;PRINT REST OF NUMBER + +$PNTI3: MOVEI 3,14 ;SETUP FOR LH WORD + MOVEI 2,6 ;SETUP FOR FIRST HALF + SETOM $PNT ;SET PRINT 6 SP 6 FLAG + SETOM PNTSPC ;SET THE PRINT SPACE FLAG + JRST $PNTI1+1 ;PRINT FIRST HALF NUMBER + JRST $PNTI4 ;EXIT + +S +;*ASCII/CHARACTER PRINTOUT ROUTINE +;*PRINTS CHAR IN LOWER 7 BITS OF AC0 +S + +$CHRPN: ANDI 0,177 ;STRIP CHAR TO 7 BITS + MOVE 1,0 + JSP 3,$TOUT ;PRINT A CHARACTER + JRST $PNTI4 ;LEAVE + +S +;*PRINTS ASCII WHOSE ADDRESS IS IN AC0 +S + +$PNTLN: SETOM $PNT# ;SET PRINT MORE THAN 1 WORD FLAG. + +$ASCPN: MOVEM 0,$POINT# ;SAVE ADDRESS OF ASCII MESSAGE. +$ASCP1: MOVEI 2,5 ;5 = NUM OF ASCII CHAR. IN A WORD. + MOVE 0,@$POINT ;C(AC0) = FIRST/NEXT WORD OF ASCII MESS + +$ASCP2: SETZ 1, ;CLEAR AC1. + ROTC 0,7 ;C(AC1) = CHAR TO BE PRINTED. + JUMPE 1,$PNTI4 ;CHAR = NULL?..NO MORE CHAR..EXIT + JSP 3,$TOUT ;PRINT A CHAR + SOJN 2,$ASCP2 ;PNT ALL CHAR FROM THIS WORD? + AOS $POINT ;YES. INC TO GET NEXT WORD. + SKIPN $PNT ;PNT MORE THAN ONE WORD FLAG SET? + JRST $PNTI4 ;NO..LEAVE + JRST $ASCP1 ;YES...RETURN TO PNT NEXT WORD. +S +;*DECIMAL PRINTOUT ROUTINE +;*PRINTS NUMBER IN AC0 +S + +$DECSP: SETOM $PNT ;SET LEADING SPACES PRINT CONTROL + +$DECPN: JUMPGE 0,.+4 ;IS NUMBER NEGATIVE ? + MOVEI 1,"-" ;YES, PRINT MINUS SIGN + JSP 3,$TOUT + MOVN 0,0 ;MAKE NUMBER POSITIVE + GO $RADIX ;DECIMAL-ASCII CONVERSION & PRINT CHARS + JRST $PNTI4 ;EXIT + +$RADIX: MOVE 2,RADLSC ;SETUP DIGIT COUNTER + LSHC 0,-^D35 ;SHIFT RIGHT 35 BITS INTO AC1 + LSH 1,-1 ;VACATE AC1 SIGN BIT + +$DCCMP: DIV 0,RADIX ;DIVIDE DOUBLE LENGTH INTERGER BY 10 + HRLM 1,(17) ;SAVE DIGIT + SOS 2 ;COUNT DIGIT + JUMPE 0,$LDSPS ;ALL DIGITS FORMED? + GO $RADIX+1 ;NO, COMPUTE NEXT ONE + +$DECP1: HLRZ 1,(17) ;YES, RETRIEVE DIGIT + ADDI 1,60 ;CONVERT TO ASCII + JSP 3,$TOUT ;TYPE-OUT A DIGIT + RTN ;GET NEXT/EXIT + +$LDSPS: SKIPN $PNT ;LEADING SPACES PRINT SET? + JRST $DECP1 ;NO ...GO PRINT + ;YES ...DO IT +$DCSPS: SOJL 2,$DECP1 ;SPACES COMPLETE ? YES + MOVE 1,RADLSP ;NO, PRINT LEADING SPACE + JSP 3,$TOUT ;TYPE OUT THE SPACE + JRST .-3 ;CHECK FOR NEXT +SUBTTL *SUBRTN* CHARACTER OUTPUT ROUTINES + +S +;*OUTPUT TERMINATION CONTROL ROUTINE +S + +$TOUT: MOVEM 0,$PACB0# ;SAVE AC0. + MOVEM 1,$PNTYC# ;SAVE CHARACTER TO BE PRINTED + +S +;*OVERALL CHARACTER OUTPUT CONTROL ROUTINE +S + +$TOUTB: MOVE AC0,CONSW ;DATA SWITCHES INTO AC0 + AOS $CARCT# ;INC CHAR CNTR. + CAIN 1,7 ;CHAR A BELL ? + SETZM $PTINH ;YES, CLEAR PRINT INHIBIT + CAIE 1,15 ;CHAR A CR? + JRST $TOUB1 ;NO-CHK FOR LF + SKIPN $PTINH ;DON'T COUNT ^O'ED LINES + AOS PNTENB ;COUNT LINES, TILL NO MORE + SETZM $CARCT ;CLR CHAR CNTR. + +$TOUB1: CAIN 1,12 ;IS CHAR A LF? + SETZM $CARCT ;YES-CLR CHAR CNTR. + SKIPE $PNTTY ;NO-IS PRINT FORCED ON? + JRST $TOUB2 ;YES-DON'T CHECK NON-PNT SW + TLNE 0,NOPNT ;IS NON PNT SWITCH ON? + JRST (3) ;YES, RETURN + +$TOUB2: JSP 4,$TOUT2 ;SEND CHARACTER USER MODE + +$TOUB3: SKIPE USRLFF# ;NEED USER LF FILLERS ? + JRST $USRFL ;YES + SKIPE USRCRF# ;NEED USER CR FILLERS ? + JRST $USRFC ;YES + JRST $TOUTA ;NO-BACK TO PRINT ROUTINE +;*USER MODE LF & CR FILLERS +S + +$USRFC: CAIE 1,15 ;CR ? + JRST $TOUTA ;NO-RETURN TO PRINT ROUTINE + MOVE 5,USRCRF ;SEND FILLERS FOR CR + JRST $USRF1 ;DEPENDING ON 'USRCRF' + +$USRFL: CAIE 1,12 ;LF ? + JRST $TOUTA ;NO-RETURN TO PRINT + MOVE 5,USRLFF ;SEND FILLERS FOR LF +$USRF1: SOJL 5,$TOUTA ;DEPENDING ON 'USRLFF' + MOVEI 1,001 ;^A + JSP 4,$TOUT2 ;SEND CHARACTER + JRST $USRF1 + +;*RETURN BACK TO PRINTING ROUTINE FROM CHAR OUTPUT +S +$TOUTA: MOVE AC0,$PACB0 ;RESTORE AC0 + JRST (3) ;RETURN TO PRINT ROUTINE +S +;*USER MODE CHARACTER OUTPUT +S + +$TOUT2: MOVEM 4,$PACC4# + CAIN 1,26 ;DON'T PRINT NULLS + JRST @$PACC4 + MOVE 0,CONSW + TLNE 0,PNTLPT ;IS LPT PRINT SWITCH UP ? + JRST $TOUT3 ;YES, GO PRINT ON LOGICAL DEVICE + DROPDV ;CLOSE DEV IF SWITCH CHANGED +$TOUT6: MOVE 0,$CARCT ;CHARACTER NUMBER + CAIN 0,1 ;FIRST CHAR IN LINE ? + JRST $TOUT4 ;YES +$TOUT5: SKIPE NOTYPE ;TYPEOUT INHIBITED ? + JRST @$PACC4 ;YES + SKIPN MONTYP + OUTCHR 1 + SKIPE MONTYP + PBOUT ;OUTPUT VIA MONITOR TTCALL + JRST @$PACC4 ;GO RESTORE AC0 AND RETURN + +$TOUT4: SKIPL MONCTL ;SYSTEM EXERCISER + JRST $TOUT5 ;NO + PUT 1 + MOVEI 1,"?" ;PRECEDE LINE WITH ? + SKIPN MONTYP + OUTCHR 1 + SKIPE MONTYP + PBOUT + GETIT 1 + JRST $TOUT5 + +;*USER MODE LOGICAL DEVICE OUTPUT +S + +$TOUT3: SKIPN $DVOFF ;DEVICE BEEN INITED YET ? + GO $INTDV ;NO, GO DO IT + GO $PUTCR ;GO OUTPUT CHAR + SKIPN $PNTTY ;SKIP IF MESSAGE ALSO FORCED TO TTY + JRST @$PACC4 + JRST $TOUT6 ;OUTPUT +;* LOGICAL DEVICE OUTPUT ROUTINES +S + +$PUTCR: SKIPN MONTYP + JRST $PUT10 + PUT 1 + PUT 2 + MOVE 2,1 + MOVE 1,DEVJFN + BOUT + ERJMP $PUTER + GETIT 2 + GETIT 1 + RTN + +$PUTER: TMSG < +LOG OUTPUT ERROR - LOGGING STOPPED +> + SETZM LOGFLG + SETZM CONSW + GO $DRPDV + GETIT 2 + GETIT 1 + RTN +S +;*LOGICAL DEVICE INITIALIZATION +;*PHY DEV ASSIGNED AT RUN TIME +S + +$INTDV: MOVE 0,PNTEXT + MOVEM 0,$OUTEX + MOVE 0,PNTNAM ;SETUP LOGICAL OUTPUT FILE NAME + MOVEM 0,$OUTNM + MOVEM 1,$PACF1# + MOVEM 2,$PACF2# + SETZM $INTD3# + SKIPN MONTYP + JRST $INT10 ;TOPS10 + MOVE [POINT 7,FILASC,27] + MOVE 1,[ASCII/DEV:/] + MOVEM 1,FILASC +$INT21: MOVEI 1,$OUTNM + GO SIXASC ;CONVERT SIXBIT TO ASCII + HRLZI 1,(GJ%SHT) ;IF FILE EXISTS, APPEND TO IT + HRROI 2,FILASC + GTJFN + ERJMP $INT22 ;DEVICE NOT AVAILABLE, DEFAULT TO DSK + MOVEM 1,DEVJFN# + MOVE 2,[7B5!OF%APP] + OPENF + JRST T20ERR +$INT12: SETOM $DVOFF + MOVE 2,$PACF2 + MOVE 1,$PACF1 + RTN + +$INT22: SKIPE $INTD3 + JRST T20ERR + HRROI 1,[ASCIZ/ +**** +USING 'DSK' PRINT FILE +**** +/] + PSOUT + MOVE [POINT 7,FILASC,27] + MOVE 1,[ASCII/DSK:/] + MOVEM 1,FILASC + SETOM $INTD3 + JRST $INT21 +;*USER MODE CLOSE FILE +S + +$DRPDV: SKIPN $DVOFF ;DEVICE INITED? + RTN ;NO, DON'T BOTHER + SKIPN MONTYP + JRST $DRP10 ;TOPS10 + PUT 1 + MOVE 1,DEVJFN + CLOSF + JRST T20ERR + GETIT 1 + SETZM $DVOFF + RTN ;EXIT + +T20ERR: MOVEI 1,.PRIOU + HRLOI 2,.FHSLF + SETZ 3, + ERSTR + HALTF + HALTF + HALTF + +SIXASC: PUT 2 + PUT 3 + PUT 4 + MOVE 3,0 + MOVE 4,1 + MOVE 1,(4) + GO SIXSTR + MOVEI "." + IDPB 0,3 + HLLZ 1,1(4) + SKIPE 1 + GO SIXSTR + IDPB 1,3 + GETIT 4 + GETIT 3 + GETIT 2 + RTN + +SIXSTR: SETZB 0,2 + LSHC 0,6 + ADDI 0,40 + IDPB 0,3 + JUMPN 1,.-4 + RTN +;*TOPS10, LOGICAL DEVICE OUTPUT + +$PUT10: SKIPE $DVTTY# ;IF DEVICE IS TTY + JRST .+5 ;EMPTY BUFFER AFTER EACH CHAR + SOSG $OBUF+2 ;INCREMENT BYTE COUNT + JRST .+3 + IDPB 1,$OBUF+1 ;STORE CHAR + RTN + OUT $DEVCH, ;EMPTY BUFFER + JRST .-3 + +;*$INT10, TOPS10 INITIALIZE LOGICAL OUTPUT + +$INT10: MOVEM 0,$OUTNM + INIT $DEVCH,0 ;ASCII MODE, DEV CHANNEL + SIXBIT /DEV/ ;LOGICAL DEVICE, LPT,DSK,DTAX + XWD $OBUF, ;OUTPUT ONLY + JRST $INT13 ;DEV NOT AVAIL, DEFAULT TO DISK +$INT11: OUTBUF $DEVCH,1 ;SETUP OUTPUT BUFFER + ENTER $DEVCH,$OUTNM ;INIT OUTPUT FILE + JRST $OERR2 ;NO DIR ROOM, ERROR + SETOM $DVOFF ;SET DEVICE INITED FLAG + MOVEI 0,$DEVCH + DEVCHR ;GET DEVICE CHARACTERISTICS + TLNE 0,10 + SETOM $DVTTY ;DEVICE IS TTY + JRST $INT12 ;EXIT +$INT13: SKIPN $INTDF ;FIRST DEFAULT INIT ? + OUTSTR [ASCIZ/ +**** +USING 'DSK' PRINT FILE +**** +/] + SETOM $INTDF + INIT $DEVCH,0 + SIXBIT /DSK/ + XWD $OBUF, + JRST $OERR1 + JRST $INT11 + +;*USER MODE CLOSE FILE + +$DRP10: CLOSE $DEVCH, ;CLOSE FILE + STATZ $DEVCH,740000 ;RECHECK FINAL ERROR BITS + OUTSTR [ASCIZ/ +%PRINT CLOSE ERROR +/] + RELEAS $DEVCH, ;RELINQUISH DEVICE, WRITE DIRECTORY + SETZM $DVOFF + RTN ;EXIT + +$OUTER: OUTSTR [ASCIZ/ +%PRINT OUTPUT ERROR +/] + SKIPE $$OUTER + XCT $$OUTER ;EXECUTE USERS ERROR RTN, IF PROV. + EXIT 1, ;ERROR, QUIT + JRST START ;RESTART USER SEGMENT + +$OERR1: OUTSTR [ASCIZ/ +DSK INIT ERROR/] + JRST $OUTER ;DISK PRINT OUTPUT ERROR + +$OERR2: OUTSTR [ASCIZ/ +NO DIR ROOM/] + JRST $OUTER ;DISK PRINT OUTPUT ERROR +SUBTTL *STOR* RESERVED STORAGE + +;PROGRAM LITERALS + LIT +ENDSLD: 0 + +;END OF PROGRAM VARIABLES + +FILASC: BLOCK 3 + +D$ISTR: BLOCK ^D30 ;INPUT STORAGE + +PATCH: BLOCK 100 ;DEBUGGING AREA + +;PROGRAM VARIABLE WORDS + + VAR + +END: 0 +SUBTTL STORAGE -- ZEROED ON STARTUP +FIRZER:! + +LEV1PC: BLOCK 1 ;RETURN PC FOR PSI'S +LEV2PC: BLOCK 1 ; .. +LEV3PC: BLOCK 1 ; .. +LF1PC: BLOCK 1 ;RETURN PC FOR PSI'S +LF2PC: BLOCK 1 ; .. +LF3PC: BLOCK 1 ; .. +EXMADR: BLOCK 1 ;ADDRESS OF LAST EXAMINE COMMAND +BITPTR: BLOCK 1 ;BYTE POINTER TO INPUT BIT +BITBYT: BLOCK 1 ;INPUT BYTE +CMDMSG: BLOCK 1 ;POINTER TO ERROR MESSAGE +CZADR: BLOCK 1 ;WHERE TO GO ON CONTROL-Z +CZSP: BLOCK 1 ;CONTROL-Z STACK POINTER +CTADR: BLOCK 1 ;WHERE TO GO ON CONTROL-T +CMFILE: BLOCK 1 ;COMMAND JFN +UCFILE: BLOCK 1 ;INPUT JFN +DEPFLG: BLOCK 1 ;0=EXAMINE, -1=DEPOSIT +LASTCA: BLOCK 1 ;LAST CRAM ADDRESS +INTAKE: BLOCK 1 ;-1 DON'T TYPE DATA BECAUSE OF TAKE CMD +ULDSTR: BLOCK 4 ;".ULD" LINE STORAGE +IBF: BLOCK 2 ;INPUT FILE POINTERS +DSKBF: BLOCK 3 +GSBF: BLOCK 3 +DSKLIN: BLOCK ^D30 +DSKNAM: BLOCK 1 +DSKEXT: BLOCK 3 +$CCLF: BLOCK 1 +$CMNTF: BLOCK 1 +$LISTF: BLOCK 1 +CFCALL: BLOCK 1 +CFJ: BLOCK 1 +CFNBR: BLOCK 1 +CFALU: BLOCK 1 +CFSD: BLOCK 1 +CFAB: BLOCK 1 +CFRBM: BLOCK 1 +CFSPEC: BLOCK 1 +CFDISP: BLOCK 1 +CFSKIP: BLOCK 1 +CFT: BLOCK 1 +CFC: BLOCK 1 +CFSC: BLOCK 1 +CFFE: BLOCK 1 +CFFM: BLOCK 1 +CFMC: BLOCK 1 +CFDV: BLOCK 1 +CFMP: BLOCK 1 +CFCL: BLOCK 1 +CFCR: BLOCK 1 +CFMARK: BLOCK 1 +STBUF: BLOCK 40 ;STRING BUFFER +LFPDL: BLOCK 100 +ENDZER==.-1 + + RELOC <<.+1140>&777000>-140 +IPAG: BLOCK ^D512 + + END <3,,EV> + + diff --git a/apps/pdp10/tapes/diags/klad/dakad/DAKAD.MAC b/apps/pdp10/tapes/diags/klad/dakad/DAKAD.MAC index f408ca60b..07414bb0d 100644 --- a/apps/pdp10/tapes/diags/klad/dakad/DAKAD.MAC +++ b/apps/pdp10/tapes/diags/klad/dakad/DAKAD.MAC @@ -35,17 +35,16 @@ DEFINE SFLAG (A)< JRST 2,.+1(1) ;SET A FLAG> SUBTTL DIAGNOSTIC SECTION -START: -; SETZM USER# ;CLEAR USER CONTROL WORD -; JSP 0,.+1 ;GET FLAGS -; TLNE USERF ;IN USER MODE? -; SETOM USER ;YES, SET USER CONTROL WORD -; SKIPN MONFLG ;SPECIAL USER MODE? -; SETZM USER ;YES, CLEAR USER CONTROL WORD -; SKIPN USER -; JRST C00 -; SKIPL MONCTL -; TTCALL 3,PGMNAM ;MENTION OUR NAME +START: SETZM USER# ;CLEAR USER CONTROL WORD + JSP 0,.+1 ;GET FLAGS + TLNE USERF ;IN USER MODE? + SETOM USER ;YES, SET USER CONTROL WORD + SKIPN MONFLG ;SPECIAL USER MODE? + SETZM USER ;YES, CLEAR USER CONTROL WORD + SKIPN USER + JRST C00 + SKIPL MONCTL + TTCALL 3,PGMNAM ;MENTION OUR NAME JRST STARTA PGMNAM: ASCIZ/ @@ -2052,4 +2051,4 @@ C22700: SETZM 2 ;INITIALIZE AC ;********** -; JRST BEGEND + JRST BEGEND diff --git a/apps/pdp10/tapes/diags/klad/dakad/TEST.MAC b/apps/pdp10/tapes/diags/klad/dakad/TEST.MAC new file mode 100644 index 000000000..f408ca60b --- /dev/null +++ b/apps/pdp10/tapes/diags/klad/dakad/TEST.MAC @@ -0,0 +1,2055 @@ +SUBTTL DIAGNOSTIC PARAMETERS + +;ACCUMULATOR ASSIGNMENTS + +;CONTROL WORDS + +AROV=400000 ;ARITHMETIC OVERFLOW +CRY0=200000 ;CARRY 0 +CRY1=100000 ;CARRY 1 +FOV=40000 ;FLOATING OVERFLOW +BIS=20000 ;BYTE INTERRUPT +USERF=10000 ;USER MODE FLAG +EXIOT=4000 ;USER PRIV I/O FLAG +FXU=100 ;FLOATING UNDERFLOW +DCK=40 ;DIVIDE CHECK + + +;MACROS + +; STOP - USED FOR SCOPE LOOP, IF INSTRUCTION FAILS, CHANGE (JUMPA .+1) +; TO A (JUMPA X) TO CYCLE ON FAILING INSTRUCTION + +DEFINE STOP (A)< + HALT .+1 ;TEST FAILED IF PROGRAM HALTS HERE + JUMPA .+1 ;IF TEST FAILS, CHANGE THIS INSTRUCTION (JUMPA .+1) + ;TO JUMPA X(X IS THE ADDRESS OF THE FIRST + ;INSTRUCTION IN THE SUBTEST) TO LOOP ON ERROR + ;AND CHANGE HALT INSTRUCTION TO JUMPA .+1> + +; SFLAG - USED TO CLEAR ALL FLAGS THEN TO SET REQUESTED FLAG + +DEFINE SFLAG (A)< + MOVSI 1,A + JFCL 17,.+1 ;RESET ALL FLAGS + JRST 2,.+1(1) ;SET A FLAG> +SUBTTL DIAGNOSTIC SECTION + +START: +; SETZM USER# ;CLEAR USER CONTROL WORD +; JSP 0,.+1 ;GET FLAGS +; TLNE USERF ;IN USER MODE? +; SETOM USER ;YES, SET USER CONTROL WORD +; SKIPN MONFLG ;SPECIAL USER MODE? +; SETZM USER ;YES, CLEAR USER CONTROL WORD +; SKIPN USER +; JRST C00 +; SKIPL MONCTL +; TTCALL 3,PGMNAM ;MENTION OUR NAME + JRST STARTA + +PGMNAM: ASCIZ/ +PDP-10 KA10 BASIC INSTRUCTION DIAGNOSTIC (4) [DAKAD] +/ + +;BASIC INSTRUCTION TEST (3) +;THE TEST IS DESIGNED FOR INITIAL DEBUGGING OF +;PROCESSOR HARDWARE AND TO DETECT (SOLID) FAILURES +;IN THE FIELD. + +STARTA: JRST .+1 +C00: +;TESTING BEGINS HERE + +;IF ANY LOADING PROBLEMS OCCUR, START PROGRAM HERE. + +;NOTE: AN "*" IN THE COMMENT FIELD OF AN INSTRUCTION INDICATES THAT +; IT IS THE TESTED INSTRUCTION. + +SUBTTL TEST OF AC HARDWARE AND INDEX REGISTERS + +;********** + +;THIS TEST VERIFIES THAT AC1 IS ACCESSABLE +;IN THIS CASE, AC1 IS PRELOADED WITH 1. +;C(AC1) IS THEN CHECKED FOR A1. THIS TEST PASSES IF C(AC1)=1. +;IF THIS TEST FAILS, THE AC HARDWARE IS PROBABLY FAULTY + +C100: SETZ ;CLEAR AC0 + MOVEI 1,1 ;PRELOAD AC1 WITH 1 + CAIE 1,1 ;PASS IF C(AC1)=1 + STOP + +;********** + +;THIS TEST VERIFIES THAT AC2 IS ACCESSABLE. +;IN THIS CASE, AC2 IS PRELOADED WITH 2. +;C(AC2) IS THEN CHECKED FOR 2. THIS TEST PASSES IF C(AC2)=2. +;IF THIS TEST FAILS, THE AC HARDWARE IS PROBABLY FAULTY + +C200: MOVEI 2,2 ;PRELOAD AC2 WITH 2 + CAIE 2,2 ;PASS IF C(AC2)=2 + STOP + +;********** +;THIS TEST VERIFIES THAT AC4 IS ACCESSABLE. +;IN THIS CASE, AC4 IS PRELOADED WITH 4. +;C(AC4) IS THEN CHECKED FOR 4. THIS TEST PASSES IF C(AC4)=4. +;IF THIS TEST FAILS, THE AC HARDWARE IS PROBABLY FAULTY + +C300: MOVEI 4,4 ;PRELOAD AC4 WITH 4 + CAIE 4,4 ;PASS IF C(AC4)=4 + STOP + +;********** + +;THIS TEST VERIFIES THAT AC10 IS ACCESSABLE. +;IN THIS CASE, AC10 IS PRELOADED WITH 10. +;C(AC10) IS THEN CHECKED FOR 10. THIS TEST PASSES IF C(AC10)=10. +;IF THIS TEST FAILS, THE AC HARDWARE IS PROBABLY FAULTY + +C400: MOVEI 10,10 ;PRELOAD AC10 WITH 10 + CAIE 10,10 ;PASS IF C(AC10)=10 + STOP + +;********** +SN=500 + ZZ=-1 + +;THIS TEST VERIFIES THAT ALL ACS EXIST +;FIRST, EACH AC IS PRELOADED WITH ITS OWN ADDRESS; +;THEN, THE CONTENTS OF EACH AC IS CHECKED FOR ITS ADDRESS. +;IF ANY AC DOES NOT CONTAIN ITS ADDRESS, THIS TEST FAILS + +C500: REPEAT ^D16, +< ZZ=ZZ+1 + MOVEI ZZ,ZZ ;PRELOAD EACH AC WITH ITS ADDR> +PAGE + ZZ=20 + + REPEAT ^D16,< +;THIS TEST VERIFIES THAT ALL ACS EXIST. +;FIRST, EACH AC IS PRELOADED WITH ITS OWN ADDRESS; +;THEN, THE CONTENTS OF EACH AC IS CHECKED FOR ITS ADDRESS. +;IF ANY AC DOES NOT CONTAIN ITS ADDRESS, THIS TEST FAILS + +SN=SN+1 + ZZ=ZZ-1 + CAIE ZZ,ZZ ;CHECK THAT EACH AC CONTAINS ITS OWN ADDRESS + STOP + ;IN CASE OF FAILURE, LOOP TO C500 ADDRESS + +;********** +> +SN=600 + ZZ=0 + +;THIS TEST VERIFIES THAT AN ADDRESS WITHIN THE AC RANGE MAY BE ACCESSED AS +;EITHER AN AC OR A MEMORY LOCATION AND THAT EITHER REFERENCE REFERS TO THE +;SAME HARDWARE. EACH AC IS PRELOADED WITH ITS ADDRESS; THEN THE CONTENTS OF EACH +;AC IS CHECKED FOR ITS ADDRESS. IF ANY AC DOES NOT CONTAIN ITS ADDRESS, THIS TEST FAILS. + +C600: REPEAT ^D15, +< ZZ=ZZ+1 + MOVEI ZZ ;PRELOAD EACH AC WITH ITS ADDRESS + MOVEM ZZ ;BY REFERENCING EACH AC AS MEMORY.> + + ZZ=20 + + REPEAT ^D15,< +;THIS TEST VERIFIES THAT AN ADDRESS WITHIN THE AC RANGE MAY BE ACCESSED AS +;EITHER AN AC OR A MEMORY LOCATION AND THAT EITHER REFERENCE REFERS TO THE +;SAME HARDWARE. EACH AC IS PRELOADED WITH ITS ADDRESS +;THEN THE CONTENTS OF EACH AC IS CHECKED FOR ITS ADDRESS. +;IF ANY AC DOES NOT CONTAIN ITS ADDRESS, THIS TEST FAILS. + +SN=SN+1 + ZZ=ZZ-1 + CAIE ZZ,ZZ ;CHECK THAT EACH AC CONTAINS ITS OWN ADDRESS + STOP + ;IN CASE OF FAILURE, LOOP TO C600 ADDRESS + +;********** +> +SN=700 + ZZ=0 + +C700: REPEAT ^D15,< +;THIS TEST VERIFIES THAT THE INDEX REGISTERS ARE ACCESSABLE. +;FIRST, AN INDEX REGISTER IS PRELOADED WITH ITS ADDRESS; THEN, +;IT IS REFERENCED AS AN INDEX REGISTER. IF IT CONTAINS ITS ADDRESS, THIS TEST PASSES. +;THIS TEST IS REPEATED 15 TIMES IN ORDER TO TEST EACH INDEX REGISTER. + +SN=SN+1 + ZZ=ZZ+1 + MOVEI ZZ,ZZ ;PRELOAD INDEX REGISTER WITH ITS ADDRESS + CAIE ZZ,(ZZ) ;PASS IF INDEX REGISTER CONTAINS ITS ADDRESS + STOP + +;********** +> +SN=1000 + ZZ=0 + +C1000: REPEAT ^D15,< +;THIS TEST VERIFIES THAT ALL INDEX REGISTERS INDEX CORRECTLY. +;FIRST, BOTH HALVES OF THE INDEX REGISTER ARE PRELOADED WITH ITS ADDRESS. +;THEN, THE INDEX REGISTER IS REFERENCED. IT IS THEN CHECKED FOR ITS ADDRESS IN BOTH HALVES. +;IF IT CONTAINS ITS ADDRESS IN BOTH HALVES THIS TEST PASSES. +;THIS TEST IS REPEATED 15 TIMES IN ORDER TO TEST EACH INDEX REGISTER + +SN=SN+1 + ZZ=ZZ+1 + MOVEI ZZ,ZZ ;PRELOAD BOTH HALVES OF INDEX REG WITH ITS ADDRESS + HRLI ZZ,ZZ ;PASS IF INDEX REGISTER CONTAINS ITS ADDRESS + CAME ZZ,(ZZ) ;IN BOTH HALVES + STOP + +;********** +> +SUBTTL TEST OF INDEX REGISTER ADDRESSING + +;********** + +;THIS TEST VERIFIES THAT INDEX REGISTER ADDRESSING FUNCTIONS CORRECTLY. +;IN THIS TEST, A MOVE INSTRUCTION USING INDEXING IS EXECUTED. THE MOVE INSTRUCTION +;SHOULD PLACE THE CONTENTS OF THE LOCATION SPECIFIED BY INDEX REGISTER 2 INTO AC3. +;SINCE INDEX REGISTER 2 WAS PRELOADED WITH A 1 AND AC1 WAS PRELOADED WITH A 0, +;THE FINAL RESULT IN AC3 SHOULD BE 0. IF C(AC3)=0, THIS TEST PASSES. + +C1100: SETOM 3 ;PRELOAD AC3 WITH -1,,1 + SETZM 1 ;PRELOAD AC1 WITH 0 + MOVEI 2,1 ;SETUP INDEX REGISTER 2 WITH 1 + MOVE 3,(2) ;*FWT FROM INDEXED LOCATION + SKIPE 3 ;TEST INDEXING + STOP + +;********** + +SN=1200 + ZZ=0 + +C1200: REPEAT ^D18,< +;THIS TEST VERIFIES THAT INDEX REGISTER ADDRESSING FUNCTIONS CORRECTLY. +;IN THIS TEST, A MOVE INSTRUCTION USING INDEXING IS EXECUTED. THE MOVE INSTRUCTION +;SHOULD PLACE THE CONTENTS OF THE LOCATION SPECIFIED BY INDEX REGISTER 2 INTO AC3. +;SINCE INDEX REGISTER 2 WAS PRELOADED WITH A 1 AND AC1 WAS PRELOADED WITH A +;FLOATING 1. THE FINAL RESULT IN AC3 SHOULD BE A FLOATING 1. +;IF C(AC3)=A FLOATING 1, THIS TEST PASSES. + +SN=SN+1 + ZZ=ZZ+ZZ + IFE ZZ, + SETOM 3 ;PRELOAD AC3 WITH -1,,-1 + MOVEI 1,ZZ ;PRELOAD AC1 WITH FLOATING 1 + MOVEI 2,1 ;SETUP INDEX REGISTER + MOVE 3,(2) ;*FWT FROM INDEXED LOCATION + CAIE 3,ZZ ;TEST INDEXING + STOP + +;********** +> +SN=1300 + ZZ=0 + +C1300: REPEAT ^D18,< +;THIS TEST VERIFIES THAT INDEX REGISTER ADDRESSING FUNCTIONS CORRECTLY. +;IN THIS TEST, A MOVE INSTRUCTION USING INDEXING IS EXECUTED. THE MOVE INSTRUCTION +;SHOULD PLACE THE CONTENTS OF THE LOCATION SPECIFIED BY INDEX REGISTER 2 INTO AC3. +;SINCE INDEX REGISTER 2 WAS PRELOADED WITH A 1 AND AC1 WAS PRELOADED WITH A +;FLOATING 1, THE FINAL RESULT IN AC3 SHOULD BE A FLOATING 1. +;IF C(AC3)=A FLOATING 1, THIS TEST PASSES. + +SN=SN+1 + ZZ=ZZ+ZZ + IFE ZZ, + SETOM 3 ;PRELOAD AC3 WITH -1,,-1 + MOVSI 1,ZZ ;PRELOAD AC1 WITH FLOATING 1 + MOVEI 2,1 ;SETUP INDEX REGISTER + MOVE 3,(2) ;*FWT FROM INDEXED LOCATION + CAME 3,[ZZ,,0] ;TEST INDEXING + STOP + +;********** +> +;THIS TEST VERIFIES THAT INDEX REGISTER ADDRESSING FUNCTIONS CORRECTLY. +;IN THIS TEST, A MOVE INSTRUCTION USING INDEXING IS EXECUTED. THE MOVE INSTRUCTION +;SHOULD PLACE THE CONTENTS OF THE LOCATION SPECIFIED BY INDEX REGISTER 2 INTO AC3. +;SINCE INDEX REGISTER 2 WAS PRELOADED WITH A 1 AND AC1 WAS PRELOADED WITH -1,,-1, +;THE FINAL RESULT IN AC3 SHOULD BE -1,,-1. IF C(AC3)=-1,,-1, THIS TEST PASSES. + +C1400: SETZM 3 ;PRELOAD AC3 WITH 0 + SETOM 1 ;PRELOAD AC1 WITH -1,,-1 + MOVEI 2,1 ;SETUP INDEX REGISTER + MOVE 3,(2) ;*FWT FROM INDEXED LOCATION + CAME 3,[-1,,-1] ;TEST INDEXING + STOP + +;********** + +SN=1500 + ZZ=0 + +C1500: REPEAT ^D18,< +;THIS TEST VERIFIES THAT INDEX REGISTER ADDRESSING FUNCTIONS CORRECTLY. +;IN THIS TEST, A MOVE INSTRUCTION USING INDEXING IS EXECUTED. THE MOVE INSTRUCTION +;SHOULD PLACE THE CONTENTS OF THE LOCATION SPECIFIED BY INDEX REGISTER 2 INTO AC3. +;SINCE INDEX REGISTER 2 WAS PRELOADED WITH A 1 AND AC1 WAS PRELOADED WITH A +;FLOATING 0, THE FINAL RESULT IN AC3 SHOULD BE A FLOATING 0. +;IF C(AC3)=A FLOATING 0, THIS TEST PASSES. + +SN=SN+1 + ZZ=&777777 + IFE , + SETZM 3 ;PRELOAD AC3 WITH 0 + HRROI 1,ZZ ;PRELOAD AC1 WITH FLOATING 0 + MOVEI 2,1 ;SETUP INDEX REGISTER + MOVE 3,(2) ;*FWT FROM INDEXED LOCATION + CAME 3,[-1,,ZZ] ;TEST INDEXING + STOP + +;********** +> +SN=1600 + ZZ=0 + +C1600: REPEAT ^D18,< +;THIS TEST VERIFIES THAT INDEX REGISTER ADDRESSING FUNCTIONS CORRECTLY. +;IN THIS TEST, A MOVE INSTRUCTION USING INDEXING IS EXECUTED. THE MOVE INSTRUCTION +;SHOULD PLACE THE CONTENTS OF THE LOCATION SPECIFIED BY INDEX REGISTER 2 INTO AC3. +;SINCE INDEX REGISTER 2 WAS PRELOADED WITH A 1 AND AC1 WAS PRELOADED WITH A +;FLOATING 0, THE FINAL RESULT IN AC3 SHOULD BE A FLOATING 0. +;IF C(AC3)=A FLOATING 0, THIS TEST PASSES. + +SN=SN+1 + ZZ=&777777 + IFE , + SETZM 3 ;PRELOAD AC3 WITH 0 + HRLOI 1,ZZ ;PRELOAD AC1 WITH FLOATING 0 + MOVEI 2,1 ;SETUP INDEX REGISTER + MOVE 3,(2) ;*FWT FROM INDEXED LOCATION + CAME 3,[ZZ,,-1] ;TEST INDEXING + STOP + +;********** +> +;VERIFY INDEXING WHERE 'E' IS NON-ZERO + +SN=1700 + ZZ=-1 + XX=-10 + +;THIS TEST VERIFIES THAT INDEX REGISTER ADDRESSING FUNCTIONS CORRECTLY. +;IN THIS TEST, THE INDEX REG IS SET-UP WITH MOVEI ZZ+1,ZZ-XX, +;WHERE ZZ+1 IS THE INDEX REG. THE AC IS PRELOADED WITH ITS OWN ADDRESS, 0,,ZZ. +;CAIE IS USED TO TEST THE INDEXING OPERATION. +;IF THE RESULT IN C(AC)=XX+C(ZZ+1 - RIGHT), THIS TEST PASSES. +;XX+C(ZZ+1 - RIGHT) SHOULD = ZZ. + +C1700: REPEAT ^D15, + +PAGE +SN=2000 + ZZ=-1 + XX=-20 + +;THIS TEST VERIFIES THAT INDEX REGISTER ADDRESSING FUNCTIONS CORRECTLY. +;IN THIS TEST, THE INDEX REG IS SET-UP WITH MOVEI ZZ+1,ZZ-XX, +;WHERE ZZ+1 IS THE INDEX REG. INDEXING IS TESTED BY LOADING +;THE AC VIA MOVEI ZZ,XX(ZZ+1), WHERE XX+C(ZZ+1)=ZZ. +;IF THE RESULT IN THE AC EQUALS 0,,ZZ, THIS TEST PASSES. + +C2000: REPEAT ^D15, + +SUBTTL TEST OF EXCH INSTRUCTION + +;********** + +;THIS TEST VERIFIES THAT EXCH MOVES C(E) INTO AC AND +;MOVES C(AC) INTO E. +;IN THIS CASE, AC=E=0 AND C(AC)=C(E). HENCE, THE FINAL RESULT +;IN AC0 SHOULD BE 0. IF C(AC)=0, THE TEST PASSES. + +C2100: SETZ ;PRELOAD AC,E WITH 0 + EXCH ;*EXCH SHOULD PLACE 0 INTO AC0 + SKIPE ;PASS IF C(AC0)=0 + STOP + +;********** + +;THIS TEST VERIFIES THAT EXCH MOVES C(E) INTO AC AND +;MOVES C(AC) INTO E. +;IN THIS CASE, AC=E=-1,,-1 AND C(AC)=C(E). HENCE, THE FINAL RESULT +;IN AC0 SHOULD BE -1,,-1. IF C(AC)=-1,,-1, THE TEST PASSES. + +C2200: SETO ;PRELOAD AC,E WITH -1,,-1 + EXCH ;*EXCH SHOULD PLACE -1,,-1 INTO AC0 + CAME [-1] ;PASS IF C(AC0)=-1,,-1 + STOP + +;********** +;THIS TEST VERIFIES THAT EXCH MOVES C(E) INTO AC AND +;MOVES C(AC) INTO E. +;IN THIS CASE, C(AC)=-1,,0 AND C(E)=0,,-1. HENCE, THE FINAL RESULT +;IN THE AC SHOULD BE 0,,-1 AND THE RESULT IN E SHOULD BE -1,,0, +;IF THESE RESULTS OCCUR, THE TEST PASSES. + +C2400: MOVSI -1 ;PRELOAD AC WITH -1,,0 + MOVEI 1,-1 ;PRELOAD E WITH 0,,-1 + EXCH 1 ;*EXCH SHOULD PLACE 0,,-1 INTO THE AC AND -1,,0 INTO E + CAME 1,[-1,,0] ;PASS IF C(E)=-1,,0 + STOP +C2410: CAME 0,[0,,-1] ;PASS IF C(AC)=0,,-1 + STOP + +;********** + +;THIS TEST VERIFIES THAT EXCH MOVES C(E) INTO AC AND +;MOVES C(AC) INTO E. +;IN THIS CASE, C(AC)=0,,-1 AND C(E)=-1,,0. HENCE, THE FINAL RESULT +;IN THE AC SHOULD BE -1,,0 AND THE RESULT IN E SHOULD BE 0,,-1. +;IF THESE RESULTS OCCUR, THE TEST PASSES. + +C2700: MOVEI -1 ;PRELOAD AC WITH 0,,-1 + MOVSI 1,-1 ;PRELOAD E WITH -1,,0 + EXCH 1 ;*EXCH SHOULD PLACE -1,,0 INTO THE AC AND 0,,-1 INTO E + CAIE 1,-1 ;PASS IF C(E)=0,,-1 + STOP +C2710: CAME ,[XWD -1,0] ;PASS IF C(AC)=-1,,0 + STOP + +;********** +;THIS TEST IS A RELIABILITY CHECK OF EXCH. +;FIRST, AC, E ARE PRELOADED WITH 252525,,252525. THERE, EXCH IS +;EXECUTED 7 TIMES. THE AC IS THEN CHECKED FOR 252525,,252525. +;IF C(AC)=C(E)=252525,,252525, THIS TEST PASSES. +;IN THIS TEST AC=E=AC0 + +C3000: MOVE [252525252525] ;PRELOAD AC,E WITH 252525,,252525 + REPEAT 7, +< EXCH ;*EXCH SHOULD PLACE 252525,,252525 INTO AC0> + CAME [252525252525] ;PASS IF C(AC0)=252525,,252525 + STOP + +;********** +PAGE +;THIS TEST VERIFIES THAT EXCH MOVES C(AC) INTO E AND C(E) INTO THE AC. +;IN THIS CASE, C(AC)=0 AND C(E)=-1,,-1. EXCH IS EXECUTED 7 TIMES; THEN, +;THE AC IS CHECKED FOR -1,,-1 AND E IS CHECKED FOR 0. IF EITHER OF THESE +;RESULTS ARE NOT FOUND, THIS TEST FAILS. + +C3100: SETZ ;PRELOAD AC WITH 0 + SETO 1,0 ;PRELOAD E WITH -1,,-1 + REPEAT 7, +< EXCH 1 ;*EXCH SHOULD EXCHANGE C(AC) AND C(E)> + CAME [-1] ;PASS IF C(AC)=-1,,-1 + STOP +C3110: CAME 1,[0] ;PASS IF C(E)=0 + STOP + +;********** +SUBTTL TEST OF MOVEM INSTRUCTION + +;THIS TEST VERIFIES THAT MOVEM PLACES C(AC) INTO E AND DOES NOT MODIFY C(AC) +;IN THIS CASE, C(AC)=-1,,-1 AND C(E)=0. HENCE, THE RESULT IN AC AND E SHOULD +;BE -1,,-1. IF C(AC) AND C(E)=-1,,-1, THIS TEST PASSES + +C3200: SETO ;PRELOAD AC WITH -1,,-1 + SETZ 1,0 ;PRELOAD E WITH 0 + MOVEM 1 ;*MOVEM SHOULD PLACE -1,,-1 INTO E + CAME 1,[-1] ;PASS IF C(E)=-1,,-1 + STOP +C3210: CAME 0,[-1] ;PASS IF C(AC)=-1,,-1 + STOP + +;********** +SUBTTL TEST OF JFCL INSTRUCTION AND ARITHMETIC FLAGS + +;********** + +;THIS TEST VERIFIES THAT JFCL 17,.+1 ALWAYS RETURNS TO THE NEXT SEQUENTIAL INSTRUCTION +;IF JFCL SKIPS THE NEXT INSTRUCTION, THIS TEST FAILS + +C3300: MOVE [HALT .+3] ;THIS INSTRUCTION SHOULD NOT AFFECT THE TEST + JFCL 17,.+1 ;*JFCL SHOULD RETURN TO NEXT SEQUENTIAL INSTRUCTION + CAIA ;SKIP HALT INSTRUCTION IF JFCL PASSES + STOP + +;********** + +;THIS TEST VERIFIES THAT JFCL 17,.+1 ALWAYS CLEARS THE CRY0 FLAG. +;ADDI IS USED TO SET CRY0. THEN, JFCL 17,.+1 IS EXECUTED TO CLEAR CRY0. +;JFCL 4,.+2 IS EXECUTED TO DETERMINE WHETHER CRY0 WAS RESET BY THE PREVIOUS JFCL. +;THIS TEST FAILS IF JFCL 17,.+1 DID NOT CLEAR CRY0 + +C3400: MOVE [-1] ;PRELOAD AC WITH -1,,-1 + ADDI 1 ;SET CRY0 FLAG + JFCL 17,.+1 ;*CLEAR ARITHMETIC FLAGS + JFCL 4,.+2 ;PASS IF CRY0 WAS RESET BY PREVIOUS INSTRUCTION + SKIPA ;SKIP HALT IF CRY0 WAS CLEARED + STOP + +;********** +;THIS TEST VERIFIES THAT JFCL 17,.+1 ALWAYS CLEARS THE CRY1 FLAG. +;ADDI IS USED TO SET CRY1. THEN, JFCL 17,.+1 IS EXECUTED TO CLEAR CRY1. +;JFCL 4,.+2 IS EXECUTED TO DETERMINE WHETHER CRY1 WAS RESET BY THE PREVIOUS JFCL. +;THIS TEST FAILS IF JFCL 17,.+1 DID NOT CLEAR CRY1 + +C3500: MOVE [-1] ;PRELOAD AC WITH -1,,-1 + ADDI 1 ;SET CRY1 FLAG + JFCL 17,.+1 ;*CLEAR ARITHMETIC FLAGS + JFCL 2,.+2 ;PASS IF CRY1 WAS RESET BY PREVIOUS INSTRUCTION + SKIPA ;SKIP HALT IF CRY1 WAS CLEARED + STOP + +;********** + +;THIS TEST VERIFIES THAT JFCL 17,.+1 ALWAYS CLEARS THE AROV FLAG. +;ADDI IS USED TO SET AROV. THEN, JFCL 17,.+1 IS EXECUTED TO CLEAR AROV. +;JFCL 4,.+2 IS EXECUTED TO DETERMINE WHETHER AROV WAS RESET BY THE PREVIOUS JFCL. +;THIS TEST FAILS IF JFCL 17,.+1 DID NOT CLEAR AROV + +C3600: MOVSI 400000 ;PRELOAD AC WITH -1,,-1 + ADD [XWD 400000,0] ;SET AROV FLAG + JFCL 17,.+1 ;*CLEAR ARITHMETIC FLAGS + JFCL 10,.+2 ;PASS IF AROV WAS RESET BY PREVIOUS INSTRUCTION + SKIPA ;SKIP HALT IF AROV WAS CLEARED + STOP + +;********** +;THIS TEST VERIFIES THAT JFCL 0, IS A NO-OP. +;IN THIS TEST, ADD IS USED TO SET CRY0. THEN JFCL 0,.+2 IS EXECUTED. +;IF JFCL 0,.+2 DOES NOT SKIP THE NEXT INSTRUCTION, THIS TEST PASSES + +C3700: MOVSI 400000 ;PRELOAD AC WITH MOST NEGATIVE NUMBER + ADD [-1] ;SET CRY0 FLAG + JFCL .+2 ;*JFCL SHOULD RETURN TO NEXT SEQUENTIAL INSTRUCTION + SKIPA ;PASS IF JFCL DID NOT SKIP + STOP + +;********** + +;THIS TEST VERIFIES THAT JFCL 0, IS A NO-OP. +;IN THIS TEST, ADD IS USED TO SET CRY1. THEN JFCL 0,.+2 IS EXECUTED. +;IF JFCL 0,.+2 DOES NOT SKIP THE NEXT INSTRUCTION, THIS TEST PASSES + +C4000: MOVSI 200000 ;PRELOAD AC WITH MOST NEGATIVE NUMBER + ADD [XWD 200000,0] ;SET CRY1 FLAG + JFCL .+2 ;*JFCL SHOULD RETURN TO NEXT SEQUENTIAL INSTRUCTION + SKIPA ;PASS IF JFCL DID NOT SKIP + STOP + +;********** +;THIS TEST VERIFIES THAT ADDI HAS THE ABILITY TO SET AN ARITHMETIC FLAG AND +;THAT 'JFCL 17,.+2' JUMPS WHENEVER ANY ARITHMETIC FLAG IS SET. +;IN THIS TEST, ADDI SHOULD SET CRY0 AND CRY1. THEN, JFCL SHOULD SKIP +;BECAUSE A FLAG WAS SET BY ADDI +;IF THIS TEST FAILS, ADDI COULD HAVE FAILED TO SET A FLAG OR +;JFCL COULD HAVE FAILED TO JUMP WHEN A FLAG WAS SET + +C4100: MOVE [-1] ;PRELOAD AC WITH ALL ONES + ADDI 1 ;*ADDI SHOULD SET CRY0/1 FLAGS + JFCL 17,.+2 ;*JFCL SHOULD JUMP BECAUSE FLAGS ARE SET + STOP + +;********** + +;THIS TEST VERIFIES THAT CAI DOES NOT CLEAR ANY ARITHMETIC FLAGS. +;FIRST, CRY0 AND CRY1 ARE SET BY ADDI; THEN CAI IS EXECUTED. +;JFCL SHOULD JUMP BECAUSE FLAGS ARE SET. IF JFCL DOES NOT JUMP, +;THE FLAGS WERE CLEARED BY CAI. HENCE, CAI FAILED + +C4200: MOVE [-1] ;PRELOAD AC WITH -1,,-1 + ADDI 1 ;SET CYR0/1 FLAGS + CAI 17,17 ;*CAI SHOULD NOT CLEAR FLAGS + JFCL 17,.+2 ;PASS IF CAI CLEARED FLAGS + STOP + +;********** +;THIS TEST VERIFIES THAT ADDI HAS THE ABILITY TO SET AN ARITHMETIC FLAG AND +;THAT 'JFCL 17,.+2' JUMPS WHENEVER ANY ARITHMETIC FLAG IS SET. +;IN THIS TEST, ADDI SHOULD SET CRY0 AND CRY1. THEN JFCL SHOULD SKIP +;BECAUSE A FLAG WAS SET BY ADDI +;IF THIS TEST FAILS, ADDI COULD HAVE FAILED TO SET A FLAG OR +;JFCL COULD HAVE FAILED TO JUMP WHEN A FLAG WAS SET + +C4300: MOVE [-1] ;PRELOAD AC WITH ALL ONES + ADDI 1 ;*ADDI SHOULD SET CRY1 FLAGS + JFCL 2,.+2 ;*JFCL SHOULD JUMP BECAUSE CRY1 FLAG IS SET + STOP + +;********** + +;THIS TEST VERIFIES THAT ADDI HAS THE ABILITY TO SET AN ARITHMETIC FLAG AND +;THAT 'JFCL 17,.+2' JUMPS WHENEVER ANY ARITHMETIC FLAG IS SET. +;IN THIS TEST, ADDI SHOULD SET CRY0 AND CRY1. THEN, JFCL SHOULD SKIP +;BECAUSE A FLAG WAS SET BY ADDI +;IF THIS TEST FAILS, ADDI COULD HAVE FAILED TO SET A FLAG OR +;JFCL COULD HAVE FAILED TO JUMP WHEN A FLAG WAS SET + +C4400: MOVE [-1] ;PRELOAD AC WITH ALL ONES + ADDI 1 ;*ADDI SHOULD SET CRY0 FLAG + JFCL 4,.+2 ;*JFCL SHOULD JUMP BECAUSE CRY0 FLAG IS SET + STOP + +;********** +;THIS TEST VERIFIES THAT ADDI HAS THE ABILITY TO SET AN ARITHMETIC FLAG AND +;THAT 'JFCL 17,.+2' JUMPS WHENEVER ANY ARITHMETIC FLAG IS SET. +;BECAUSE A FLAG WAS SET BY ADD +;IF THIS TEST FAILS, ADDI COULD HAVE FAILED TO SET A FLAG OR +;JFCL COULD HAVE FAILED TO JUMP WHEN A FLAG WAS SET + +C4500: MOVSI 400000 ;PRELOAD AC WITH ALL ONES + ADD [XWD 400000,0] ;*ADD SHOULD SET AROV FLAG + JFCL 10,.+2 ;*JFCL SHOULD JUMP BECAUSE AROV FLAG IS SET + STOP + +;********** + +;THIS TEST VERIFIES THAT JFCL 17,.+1 ALWAYS CLEARS THE FLOATING OVERFLOW FLAG (FOV). +;FIRST JFCL 17,.+1 IS EXECUTED TO CLEAR FOV. THEN, JFCL 1,.+2 IS EXECUTED TO DETERMINE +;WHETHER FOV WAS CLEARED. IF FOV WAS CLEAR, THIS TEST PASSES + +C4600: JFCL 17,.+1 ;*CLEAR ARITHMETIC FLAGS + JFCL 1,.+2 ;PASS IF FOV WAS CLEARED + SKIPA ;SKIP HALT IF TEST PASSED + STOP + +;********** +;THIS TEST VERIFIES THAT JFCL 13, DOES NOT RESET CRY0. +;FIRST CRY0 AND CRY1 ARE SET BY ADDI; THEN, JFCL 13,.+2 IS EXECUTED +;TO CLEAR ALL ARITHMETIC FLAGS EXCEPT CRY0. +;THIS TEST PASSES IF JFCL 13,.+1 DID NOT RESET CRY0. + +C4700: MOVE [-1] ;RELOAD AC WITH -1,,-1 + ADDI 1 ;SET CRY0/1 + JFCL 13,.+1 ;*JFCL 13, SHOULD NOT RESET CRY0 + JFCL 4,.+2 ;FAIL IF CRY 0 WAS RESET + STOP + +;********** + +;THIS TEST VERIFIES THAT JFCL 15, DOES NOT RESET CRY1. +;FIRST CRY0 AND CRY1 ARE SET BY ADDI; THEN, JFCL15,.+2 IS EXECUTED +;TO CLEAR ALL ARITHMETIC FLAGS EXCEPT CRY1. +;THIS TEST PASSES IF JFCL 15,.+1 DID NOT RESET CRY1. + +C5000: MOVE [-1] ;PRELOAD AC WITH -1,,-1 + ADDI 1 ;SET CRY0/1 + JFCL 15,.+1 ;*JFCL15, SHOULD NOT RESET CRY0 + JFCL 2,.+2 ;FAIL IF CRY1 WAS RESET + STOP + +;********** +;THIS TEST VERIFIES THAT JFCL 17, DOES NOT RESET AROV. +;FIRST AROV IS SET BY ADD; THEN, JFCL 17,.+2 IS EXECUTED +;TO CLEAR ALL ARITHMETIC FLAGS EXCEPT AROV. +;THIS TEST PASSES IF JFCL 17,.+1 DID NOT RESET AROV. + +C5100: MOVSI 400000 ;PRELOAD AC WITH -1,,-1 + ADD [XWD 400000,0] ;SET AROV + JFCL 7,.+1 ;*JFCL 17, SHOULD NOT RESET AROV + JFCL 10,.+2 ;FAIL IF AROV WAS RESET + STOP + +;********** + +;THIS TEST VERIFIES THAT ADD OF 0 TO 0 WILL NOT SET AROV. +;FIRST, ALL FLAGS ARE RESET, THEN 0 IS ADDED TO 0 VIA ADD. +;AROV IS THEN CHECKED. IF AROV IS SET, THIS TEST FAILS. + +C5200: JFCL 17,.+1 ;RESET ARITHMETIC FLAGS + SETZ ;PRELOAD AC,E WITH 0 + ADD ;*ADD SHOULD NOT SET AROV + JFCL 10,.+2 ;PASS IF AROV WAS RESET + SKIPA ;SKIP HALT IF ADD PASSED + STOP + +;********** +;THIS TEST VERIFIES THAT ADD OF 0 TO 0 WILL NOT SET CRY0. +;FIRST, ALL FLAGS ARE RESET, THEN 0 IS ADDED TO 0 VIA ADD. +;CRY0 IS THEN CHECKED. IF CRY0 IS SET, THIS TEST FAILS. + + +C5300: SETZ ;RESET ARITHMETIC FLAGS + JFCL 17,.+1 ;PRELOAD AC,E WITH 0 + ADD ;*ADD SHOULD NOT SET CRY0 + JFCL 4,.+2 ;PASS IF CRY0 WAS RESET + SKIPA ;SKIP HALT IF ADD PASSED + STOP + +;********** + +;THIS TEST VERIFIES THAT ADD OF 0 TO 0 WILL NOT SET CRY1. +;FIRST, ALL FLAGS ARE RESET, THEN 0 IS ADDED TO 0 VIA ADD. +;CRY1 IS THEN CHECKED. IF CRY1 IS SET, THIS TEST FAILS. + +C5400: SETZ ;RESET ARITHMETIC FLAGS + JFCL 17,.+1 ;PRELOAD AC,E WITH 0 + ADD ;*ADD SHOULD NOT SET CRY1 + JFCL 2,.+2 ;PASS IF CRY1 WAS RESET + SKIPA ;SKIP HALT IF ADD PASSED + STOP + +;********** +;THIS TEST VERIFIES THAT THE 30X AND THE 31X INSTRUCTION GROUPS DO NOT AFFECT +;THE ARITHMETIC FLAGS. FIRST, THE FLAGS ARE CLEARED AND AC0 IS CLEARED; THEN, CAI +;AND CAM ARE EXECUTED. THE FLAGS ARE THEN CHECKED. IF ANY OF THE FLAGS ARE SET, +;THIS TEST FAILS AND CAI OR CAM IS CONSIDERED TO HAVE ERRONEOUSLY SET THE FLAGS + +C5500: JFCL 17,.+1 ;CLEAR ALL FLAGS + SETZ ;CLEAR AC,0 + CAI ;*CAI SHOULD NOT SET ANY ARITHMETIC FLAG + CAM [-1] ;*CAM SHOULD NOT SET ANY ARITHMETIC FLAG + JFCL 17,.+2 ;FAIL IF ANY FLAG WAS SET + SKIPA ;SKIP HALT IF TEST PASSED + STOP + +;********** + +;THIS TEST VERIFIES THAT THE BOOLEAN INSTRUCTION GROUPS DO NOT AFFECT +;THE ARITHMETIC FLAGS. FIRST THE FLAGS ARE CLEARED AND AC0 IS CLEARED; THEN, XOR [0] +;AND XOR [-1] ARE EXECUTED. THE FLAGS ARE THEN CHECKED. IF ANY OF THE FLAGS ARE SET, +;THIS TEST FAILS AND XOR IS CONSIDERED TO HAVE ERRONEOUSLY SET THE FLAGS + +C5600: JFCL 17,.+1 ;CLEAR ALL FLAGS + SETO ;CLEAR AC,0 + XOR [0] ;*XOR SHOULD NOT SET ANY ARITHMETIC FLAG + XOR [-1] ;*XOR SHOULD NOT SET ANY ARITHMETIC FLAG + JFCL 17,.+2 ;FAIL IF ANY FLAG WAS SET + SKIPA ;SKIP HALT IF TEST PASSED + STOP + +;********** +;THIS TEST VERIFIES THAT THE AOBJX INSTRUCTION GROUP DOES DO NOT AFFECT +;THE ARITHMETIC FLAGS. FIRST THE FLAGS ARE CLEARED AND AC0 IS CLEARED; THEN, AOBJN +;AND AOBJP ARE EXECUTED. THE FLAGS ARE THEN CHECKED. IF ANY OF THE FLAGS ARE SET, +;THIS TEST FAILS AND AOBJN OR AOBJP IS CONSIDERED TO HAVE ERRONEOUSLY SET THE FLAGS + +C5700: SETO ;CLEAR ALL FLAGS + JFCL 17,.+1 ;CLEAR AC,0 + AOBJN .+1 ;*AOBJN SHOULD NOT SET ANY ARITHMETIC ARITHMETIC + AOBJP .+1 ;*AOBJP SHOULD NOT SET ANY ARITHMETIC FLAG + JFCL 17,.+2 ;FAIL IF ANY FLAG WAS SET + SKIPA ;SKIP HALT IF TST PASSED + STOP + +;********** +;THIS TEST VERIFIES THAT SKIP DOES NOT AFFECT THE FLAGS. +;FIRST, THE ARITHMETIC FLAGS ARE CLEARED; THEN, SKIP IS EXECUTED. +;IF SKIP SETS AROV, CRYO, CRY1 OR FOV, THIS TEST FAILS. + +C5701: JFCL 17,.+1 ;CLEAR ALL FLAGS + SKIP 0,[-1] ;*SKIP SHOULD NOT SET ANY FLAGS + JFCL 17,.+2 ;FAIL IF ANY FLAG IS SET + SKIPA ;PASS IF NO FLAG IS SET + STOP + +;********** + +;THIS TEST VERIFIES THAT JUMP DOES NOT AFFECT THE FLAGS. +;FIRST, THE ARITHMETIC FLAGS ARE CLEARED; THEN, JUMP IS EXECUTED. +;IF JUMP SETS AROV, CRYO, CRY1 OR FOV, THIS TEST FAILS. + +C5702: JFCL 17,.+1 ;CLEAR ALL FLAGS + JUMP 0,[-1] ;*JUMP SHOULD NOT SET ANY FLAGS + JFCL 17,.+2 ;FAIL IF ANY FLAG IS SET + SKIPA ;PASS IF NO FLAG IS SET + STOP + +;********** +SUBTTL TEST OF JRST INSTRUCTION AND ARITHMETIC FLAGS + +;********** + +;THIS TEST VERIFIES THAT 'JRST, 0' DOES NOT SET ANY FLAGS. +;FIRST THE ARITHMETIC FLAGS ARE RESET; THEN, 'JRST 0,.+1' IS EXECUTED +;THE AROV,CRY0 AND CRY1 FLAGS ARE THEN CHECKED. IF ANY +;OF THESE FLAGS ARE SET, THIS TEST FAILS + +C6000: JFCL 17,.+1 ;RESET ALL FLAGS + JRST .+1 ;*JRST SHOULD NOT SET ANY FLAGS + JFCL 16,.+2 ;PASS IF NO FLAGS ARE SET + SKIPA ;SKIP HALT IF JRST PASSES + STOP + +;********** + +;THIS TEST VERIFIES THAT 'MOVE 2,2' DOES NOT SET ANY FLAGS. +;FIRST, THE ARITHMETIC FLAGS ARE RESET; THEN, 'MOVE 2,2' IS EXECUTED. +;THE FOV,AROV,CRY0 AND CRY1 FLAGS ARE THEN CHECKED. IF ANY +;OF THESE FLAGS ARE SET, THIS TEST FAILS + +C6100: JFCL 17,.+1 ;RESET ALL FLAGS + MOVE 2,2 ;*MOVE SHOULD NOT SET ANY FLAGS + JFCL 17,.+2 ;PASS IF NO FLAGS ARE SET + SKIPA ;SKIP HALT IF MOVE PASSED + STOP + +;********** +;THIS TEST VERIFIES THAT JRST 2,.+1(1) WILL SET THE ARITHMETIC FLAG +;SPECIFIED IN AC1. IN THIS CASE, AC1 SPECIFIES THE CRY0 FLAG. +;FIRST, ALL FLAGS ARE RESET; THEN AC1 IS SET TO SPECIFY CRY0. +;NEXT, JRST 2,.+1(1) IS EXECUTED TO SET CRY0. CRY0 IS THEN CHECKED. IF +;CRY0 IS SET, THIS TEST PASSES. OTHERWISE, JRST 2,.+1 IS FAULTY + +C6200: JFCL 17,.+1 ;CLEAR ALL FLAGS + SFLAG CRY0 ;SET CRY0 FLAG + JFCL 4,.+2 ;PASS IF CRY0 IS SET + STOP + +;********** + +;THIS TEST VERIFIES THAT JRST 2,.+(1) WILL SET THE ARITHMETIC FLAG +;SPECIFIED IN AC1. IN THIS CASE, AC1 CONTAIN 0. HENCE, JRST 2,.+1(1) +;SHOULD RESET THE ARITHMETIC FLAGS. FIRST, THE CRY0/1, FLAGS ARE SET BY ADDI; +;THEN THE FLAGS SHOULD BE CLEARED BY JRST 2,.+1. IF CRY1 WAS CLEARED, THE +;TEST PASSES. OTHERWISE, JRST 2,.+1 IS FAULTY + +C6300: MOVE [-1] ;PRELOAD AC0 WITH -1,,-1 + ADDI 1 ;SET CRY0/1 FLAGS + SFLAG 0 ;RESET ALL ARITHMETIC FLAGS + JFCL 2,.+2 ;PASS IF CRY1 IS RESET + SKIPA ;SKIP HALT INSTRUCTION IF TEST PASSED + STOP + +;********** + +;THIS TEST VERIFIES THAT JRST 2,.+(1) WILL SET THE ARITHMETIC FLAG +;SPECIFIED IN AC1. IN THIS CASE, AC1 CONTAIN 0. HENCE, JRST 2,.+1(1) +;SHOULD RESET THE ARITHMETIC FLAGS. FIRST, THE CRY0/1, FLAGS ARE SET BY ADD +;THEN THE FLAGS SHOULD BE CLEARED BY JRST 2,.+1. IF AROV WAS CLEARED, THE +;TEST PASSES. OTHERWISE, JRST 2,.+1 IS FAULTY + +C6400: MOVSI 400000 ;PRELOAD AC0 WITH -1,,-1 + ADD [-1] ;SET CRY0 AND AROV FLAGS + SFLAG 0 ;RESET ALL ARITHMETIC FLAGS + JFCL 10,.+2 ;PASS IF AROV IS RESET + SKIPA ;SKIP HALT INSTRUCTION IF TEST PASSED + STOP + +;********** + +;THIS TEST VERIFIES THAT JRST 2,.+1(1) WILL SET THE ARITHMETIC FLAG +;SPECIFIED IN AC1. IN THIS CASE, AC1 SPECIFIES THE AROV FLAG. +;FIRST, ALL FLAGS ARE RESET; THEN AC1 SET TO SPECIFY AROV. +;NEXT, JRST 2,.+1(1) IS EXECUTED TO SET AROV. AROV IS THEN CHECKED. IF +;AROV IS SET, THIS TEST PASSES. OTHERWISE, JRST 2,.+1 IS FAULTY + +C6500: SFLAG AROV ;SET AROV FLAG + JFCL 10,.+2 ;PASS IF AROV WAS SET + STOP + +;********** +;THIS TEST VERIFIES THAT JRST 2,.+1(1) WILL SET THE ARITHMETIC FLAG +;SPECIFIED IN AC1. IN THIS CASE, AC1 SPECIFIES THE CRY1 FLAG. +;FIRST, ALL FLAGS ARE RESET; THEN AC1 SET TO SPECIFY CRY1. +;NEXT, JRST 2,.+1(1) IS EXECUTED TO SET CRY1. CRY1 IS THEN CHECKED. IF +;CRY1 IS SET, THIS TEST PASSES. OTHERWISE, JRST 2,.+1 IS FAULTY + +C6600: SFLAG CRY1 ;SET CRY1 FLAG + JFCL 2,.+2 ;PASS IF CRY1 WAS SET + STOP + +;********** + +;THIS TEST VERIFIES THAT JRST 2,.+1(1) WILL SET THE ARITHMETIC FLAG +;SPECIFIED IN AC1. IN THIS CASE, AC1 SPECIFIES THE FOV FLAG. +;FIRST, ALL FLAGS ARE RESET; THEN AC1 SET TO SPECIFY FOV. +;NEXT, JRST 2,.+1(1) IS EXECUTED TO SET FOV. FOV IS THEN CHECKED. IF +;FOV IS SET, THIS TEST PASSES. OTHERWISE, JRST 2,.+1 IS FAULTY + +C6700: SFLAG FOV ;SET FOV FLAG + JFCL 1,.+2 ;PASS IF FOV WAS SET + STOP + +;********** +;THIS TEST VERIFIES THAT JFCL 0, SHOULD NEVER JUMP. +;FIRST, FOV IS SET VIA JRST2, ;THEN JFCL 0, +;IS EXECUTED. IF JFCL 0, DOES NOT SKIP, THIS TEST PASSES + +C7000: SFLAG FOV ;SET FOV FLAG + JFCL ,.+2 ;*JFCL SHOULD NOT JUMP + SKIPA ;PASS IF JFCL DID NOT JUMP + STOP + +;********** + +;THIS TEST VERIFIES THAT JRST 2,.+1(1) WILL SET THE ARITHMETIC FLAG +;SPECIFIED IN AC1. IN THIS CASE, AC1 CONTAINS 0. HENCE, JRST 2,.+1(1) +;SHOULD RESET THE ARITHMETIC FLAGS. FIRST, THE CRY0, FLAG IS SET BY JRST 2,.+1(1) +;WITH C(AC1)=CRY0. THEN, THE FLAGS SHOULD BE CLEARED BY JRST 2,.+1 WITH C(AC1)=0. +;IF CRY0 WAS CLEARED, THE TEST PASSES. OTHERWISE, JRST 2,.+1 IS FAULTY + +C7100: SFLAG CRY0 ;SET CRY0 FLAGS + SETZ 1, ;SETUP MASK TO CLEAR ARITHMETIC FLAGS + JRST 2,.+1(1) ;*RESET ARITHMETIC FLAGS + JFCL 4,.+2 ;PASS IF CRY0 FLAG WAS RESET + SKIPA ;SKIP HALT INSTRUCTION IF TEST PSSED + STOP + +;********** +;THIS TEST VERIFIES THAT JRST 2,.+1(1) WILL SET THE ARITHMETIC FLAG +;SPECIFIED IN AC1. IN THIS CASE, AC1 CONTAINS 0. HENCE, JRST 2,.+1(1) +;SHOULD RESET THE ARITHMETIC FLAGS. FIRST, THE FOV, FLAG IS SET BY JRST 2,.+1(1) +;WITH C(AC1)=FOV. THEN, THE FLAGS SHOULD BE CLEARED BY JRST 2,.+1 WITH C(AC1)=0. +;IF FOV WAS CLEARED, THE TEST PASSES. OTHERWISE, JRST 2,.+1 IS FAULTY + +C7200: SFLAG FOV ;SET FOV FLAG + SETZ 1, ;SETUP MASK TO CLEAR ARITHMETIC FLAGS, + JRST 2,.+1(1) ;*RESET ARITHMETIC FLAGS + JFCL 1,.+2 ;PASS IF FOV FLAG WAS RESET + SKIPA ;SKIP HALT INSTRUCTION IF TEST PSSED + STOP + +;********** + +;THIS TEST VERIFIES THAT JRST 2,.+1(1) WILL SET THE ARITHMETIC FLAG +;SPECIFIED IN AC1. IN THIS CASE, AC1 CONTAINS 0. HENCE, JRST 2,.+1(1) +;SHOULD RESET THE ARITHMETIC FLAGS. FIRST, THE ARITHMETIC FLAGS ARE RESET BY +;JFCL 17,.+1. THEN, THE FLAGS SHOULD BE CLEARED BY JRST 2,.+1. +;IF ALL THE ARITHMETIC FLAGS WERE CLEARED, +;THE TEST PASSES. OTHERWISE, JRST 2,.+1 IS FAULTY + +C7300: JFCL 17,.+1 ;CLEAR FLAGS + SETZ 1, ;SETUP MASK TO CLEAR ARITMETIC FLAGS + JRST 2,.+1(1) ;*RESET ARITHMETIC FLAGS + JFCL 17,.+2 ;PASS IF ALL FLAGS ARE RESET + SKIPA ;SKIP HALT INSTRUCTION IF TEST PASSED + STOP + +;********** +SUBTTL TEST OF JSP INSTRUCTION + +;********** + +;THIS TEST VERIFIES THAT JSP ALWAYS STORES THE FLAGS AND PC IN THE AC. +;IN THIS CASE, THE FLAGS ARE RESET; THEN, JSP IS EXECUTED. THE AC IS THEN +;CHECKED FOR ITS CONTENTS NON-ZERO. IF C(AC)=0, IT INDICATES +;THAT NEITHER THE FLAGS NOR THE PC WAS SAVED. HENCE, THIS TEST FAILS. + +C7400: SETZB 1 ;CLEAR AC AND SETUP MASK TO RESET FLAGS + JRST 2,.+1(1) ;RESET FLAGS + JSP .+1 ;*JSP SHOULD STORE FLAGS AND PC IN THE AC + SKIPN ;PASS IF C(AC) IS NON-ZERO + STOP ;IT DID NOT STORE ANY FLAGS OR PC + +;********** + +;THIS TEST VERIFIES THAT JSP ALWAYS STORES THE PC IN THE RIGHT HALF OF THE AC. +;IN THIS CASE, THE AC IS CLEARED, THEN, JSP IS EXECUTED. THE RIGHT HALF OF +;THE AC IS THEN CHECKED FOR ITS CONTENTS NON-ZERO. IF C(AC RIGHT HALF) +;IS NON-ZERO, IT INDICATED THAT THE PC WAS SAVED; AND THIS TEST PASSES. + +C7500: SETZ ;CLEAN AC + JSP .+1 ;*JSP SHOULD STORE THE PC IN THE AC + TRNN -1 ;PASS IF C(AC) IN NON-ZERO + STOP + +;********** +;THIS TEST VERIFIES THAT JSP ALWAYS STORES THE FLAGS IN THE LEFT HALF OF THE AC. +;FIST, THE AC IS CLEARED; THEN, SOME FLAGS ARE SET AND JSP IS EXECUTED. +;THE LEFT HALF OF THE AC IS CHECKED FOR ITS CONTENTS NON-ZERO TO DETERMINE +;WHETHER THE FLAGS WERE SAVED. IF C(AC-LEFT) IS NON-ZERO, THIS TEST PASSES + +C7600: SETZM 0 ;CLEAR AC + MOVSI 1,740000 ;SET UP MASK TO SET FLAGS + JRST 2,.+1(1) ;SET SOME ARITHMETIC FLAGS + JSP .+1 ;*JSP SHOULD STORE FLAGS IN THE AC + TLNN -1 ;PASS IF C(AC) IS NON-ZERO + STOP + +;********** + +;THIS TEST VERIFIES THAT JSP ALWAYS STORES THE FLAGS IN THE LEFT HALF OF THE AC. +;FIRST, THE AC IS CLEARED; THEN, THE AROV FLAG IS SET AND JSP IS EXECUTED. +;THEN, THE AROV FLAG BIT OF +;THE LEFT HALF OF THE AC IS CHECKED FOR ITS CONTENTS NON-ZERO TO DETERMINE +;WHETHER THE AROV FLAG WAS SAVED. IF THE AROV FLAG BIT OF THE AC IS SET, THIS TEST PASSES + +C7700: SETZM 0 ;CLEAR THE AC + SFLAG AROV ;SET AROV FLAG + JSP .+1 ;*JSP SHOULD SAVE THE FLAGS IN THE AC-LEFT + TLNN AROV ;PASS IF AROV WAS SAVED + STOP + +;********** +;THIS TEST VERIFIES THAT JSP ALWAYS STORES THE FLAGS IN THE LEFT HALF OF THE AC. +;FIRST, THE AC IS CLEARED; THEN, THE CRY0 FLAG IS SET AND JSP IS EXECUTED. +;THEN, THE CRY0 FLAG BIT OF +;THE LEFT HALF OF THE AC IS CHECKED FOR ITS CONTENTS NON-ZERO TO DETERMINE +;WHETHER THE CRY0 FLAG WAS SAVED. IF THE CRY0 FLAG BIT OF THE AC IS SET, THIS TEST PASSES + +C10000: SETZM 0 ;CLEAR THE AC + SFLAG CRY0 ;SET CRY0 FLAG + JSP .+1 ;*JSP SHOULD SAVE THE FLAGS IN THE AC-LEFT + TLNN CRY0 ;PASS IF CRY0 WAS SAVED + STOP + +;********** + +;THIS TEST VERIFIES THAT JSP ALWAYS STORES THE FLAGS IN THE LEFT HALF OF THE AC. +;FIRST, THE AC IS CLEARED; THEN, THE CRY1 FLAG IS SET AND JSP IS EXECUTED. +;THEN, THE CRY1 FLAG BIT OF +;THE LEFT HALF OF THE AC IS CHECKED FOR ITS CONTENTS NON-ZERO TO DETERMINE +;WHETHER THE FLAG WAS SAVED. IF THE CRY1 FLAG BIT OF THE AC IS SET, THIS TEST PASSES + +C10100: SETZ ;CLEAR AC + SFLAG CRY1 ;SET CRY1 FLAG + JSP .+1 ;*JSP SHOULD SAVE THE FLAGS IN THE AC-LEFT + TLNN CRY1 ;PASS IF AROV WAS SAVED + STOP + +;********** +;THIS TEST VERIFIES THAT JSP ALWAYS STORES THE FLAGS IN THE LEFT HALF OF THE AC. +;FRIST, THE AC IS CLEARED; THEN, THE FOV FLAG IS SET AND JSP IS EXECUTED. +;THEN, THE FOV FLAG BIT OF THE LEFT HALF OF THE AC IS CHECKED FOR +;ITS CONTENTS NON-ZERO TO DETERMINE WHETHER THE FOV FLAG WAS SAVED. +;IF THE FOV FLAG BIT OF THE AC IS SET, THIS TEST PASSES + +C10200: SETZ ;CLEAR THE AC + SFLAG FOV ;SET FOV FLAG + JSP .+1 ;*JSP SHOULD SAVE THE FLAGS IN THE AC-LEFT + TLNN FOV ;PASS IF FOV WAS SAVED + STOP + +;********** + +;THIS TEST VERIFIES THAT JSP WILL STORE ONLY FLAGS THAT EXIST. +;I.E. RESET FLAGS WILL NOT BE SET IN THE AC. ONLY FLAGS THAT ARE +;CLEARABLE BY JRSTF WILL BE CHECKED HERE. FIRST ALL CLEARABLE +;FLAGS ARE RESET BY JRSTF; THEN JSP IS EXECUTED. THE AC IS THEN CHECKED. +;IF ANY CLEARABLE FLAGS ARE SET IN THE AC, THIS TEST FAILS. + +C10300: SFLAG 0 ;CLEAR ALL CLEARABLE FLAGS + JSP .+1 ;*JSP SHOULD NOT STORE CLEARABLE FALGS + TLNE 761777 ;FAIL IF ANY CLEARABLE FLAG IS SET + STOP + +;********** +;THIS TEST VERIFIES THAT JSP ALWAYS JUMPS. +;IN THIS TEST, JSP .+2 IS EXECUTED. IF JSP JUMPS, THE TEST PASSES; +;OTHERWISE, THIS TEST HALTS + +C10400: JSP .+2 ;*JSP SHOULD ALWAYS JUMP + STOP + +;********** +SUBTTL TEST JRST INSTRUCTION + +;********** + +;THIS TEST VERIFIES THAT JRST ALWAYS JUMPS. +;IN THIS TEST, JRST .+2 IS EXECUTED. IF JRST JUMPS, THE TEST PASSES; +;OTHERWISE, THIS TEST HALTS + +C10500: JRST .+2 ;*JRST 0, SHOULD ALWAYS JUMP + STOP + +;********** +SUBTTL TEST OF AOBJX INSTRUCTIONS + +;********** + +;THIS TEST VERIFIES THAT AOBJN ALWAYS ADDS 1 TO BOTH HALVES OF THE AC. +;FIRST, THE AC IS CLEARED; THEN, AOBJN IS EXECUTED AND THE AC IS CHECKED +;FOR 1,,1. IF C(AC)=1,,1, THIS TEST PASSES. + +C11200: SETZ ;CLEAR THE AC + AOBJN .+1 ;*AOBJN SHOULD ADD 1 TO BOTH HALVES OF THE AC + CAME [XWD 1,1] ;PASS IF C(AC)=1,,1 + STOP + +;********** + +;THIS TEST VERIFIES THAT AOBJP ALWAYS ADDS 1 TO BOTH HALVES OF THE AC. +;FIRST, THE AC IS CLEARED; THEN AOBJP IS EXECUTED AND THE AC IS CHECKED +;FOR 1,,1. IF C(AC)=1,,1, THIS TEST PASSES. + +C11300: MOVE [XWD 377777,377777] ;PRELOAD AC WITH 377777,,377777 + AOBJP .+1 ;*AOBJP SHOULD ADD, TO BOTH HALVES OF THE AC + CAME [XWD 400000,400000] ;PASS IF C(AC)=400000,400000 + STOP + +;********** +;THIS TEST VERIFIES THAT AOBJN WILL NOT JUMP WHEN C(AC) IS POSITIVE +;FIRST, THE AC IS CLEARED; AND AOBJN IS EXECUTED. AOBJN SHOULD NOT JUMP +;BECAUSE C(AC) IS POSITIVE. IF AOBJN JUMPS, THIS TEST FAILS + +C11400: SETZ ;CLEAR THE AC + AOBJN .+2 ;*AOBJN SHOULD NOT JUMP WHEN C(AC) IS POSITIVE + SKIPA ;PASS IF AOBJN DOES NOT JUMP + STOP + +;********** + +;THIS TEST VERIFIES THAT AOBJP WILL JUMP WHEN C(AC) IS POSITIVE +;FIRST, THE AC IS CLEARED; AND AOBJP IS EXECUTED. AOBJP SHOULD JUMP +;BECAUSE C(AC) IS POSITIVE. IF AOBJP DOES NOT JUMP, THIS TEST FAILS + +C11500: SETZ ;CLEAR THE AC + AOBJP .+2 ;*AOBJP SHOULD JUMP BECAUSE C(AC) IS POSITIVE + STOP + +;********** +;THIS TEST VERIFIES THAT AOBJN WILL JUMP WHEN C(AC) IS NEGATIVE +;FIRST, THE AC IS PRELOADED WITH 400000,,0; AND AOBJN IS EXECUTED. AOBJN SHOULD JUMP +;BECAUSE C(AC) IS NEGATIVE. IF AOBJN DOES NOT JUMP, THIS TEST FAILS + +C11600: MOVE [XWD 400000,400000] ;PRELOAD AC WITH 400000,,400000 + AOBJN .+2 ;*AOBJN SHOULD JUMP BECAUSE C(AC) IS NEGATIVE + STOP + +;********** + +;THIS TEST VERIFIES THAT AOBJP WILL NOT JUMP WHEN C(AC) IS NEGATIVE. FIRST, +;THE AC IS PRELOADED WITH 400000,,0; AND AOBJP IS EXECUTED. AOBJP SHOULD NOT JUMP +;BECAUSE C(AC) IS NEGATIVE. IF AOBJP JUMPS, THIS TEST FAILS + +C11700: MOVE [XWD 400000,400000] ;PRELOAD AC WITH 400000,,400000 + AOBJP .+2 ;*AOBJP SHOULD NOT JUMP BECAUSE C(AC) IS NEGATIVE + SKIPA ;PASS IF AOBJP DOES NOT JUMP + STOP + +;********** +;THIS TEST VERIFIES THAT THERE IS A CARRY FROM BIT 18 TO BIT 17 OF THE AC ON AOBJN. +;THE AC IS PRELOADED WITH -1,,-1; THEN AOBJN IS EXECUTED. AOBJN SHOULD ADD ONE +;TO BOTH HALVES OF THE AC, GENERATING A CARRY FROM BIT 18 TO BIT 17. IF A +;CARRY WAS GENERATED, THIS TEST PASSES + +C12000: SETO ;PRELOAD AC WITH -1,, -1 + AOBJN .+1 ;*AOBJN SHOULD GENERATE A CARRY FROM BIT 18 TO 17 + CAME [1,,0] ;PASS IF C(AC)=1,,0 (CARRY WAS GENERATED) + STOP + +;********** +SUBTTL TEST SETTING OF ARITHMETIC FLAGS VIA MOVNX AND MOVMX + +;THIS TEST VERIFIES THAT MOVNI SETS CRY0 AND CRY1 FLAGS ONLY WHEN THE DATA IS 0. +;FIRST, THE ARITHMETIC FLAGS ARE RESET; THEN, MOVNI IS EXECUTED WITH DATA OF ZEROS. +;THE ARITHMETIC FLAGS ARE CHECKED. +; CRY0/1 ARE SET AND AROV AND FOV RESET, THIS TEST PASSES. + +C12100: JFCL 17,.+1 ;CLEAR FLAGS + MOVNI 0 ;* MOVNI 0 SHOULD SET CRY0/1 + JCRY0 .+2 ;PASS IF CRY0 IS SET + STOP + JCRY1 .+2 ;PASS IF CRY1 IS SET + STOP + JOV .+2 ;PASS IF AROV RESET + SKIPA + STOP + JFOV .+2 ;PASS IF FOV RESET + SKIPA + STOP + +;********** + +;THIS TEST VERIFIES THAT MOVN WILL NOT SET ARITHMETIC FLAGS WHEN THE DATA IS -1,,-1. +;FIRST, THE FLAGS ARE RESET; THEN, MOVN [-1,,-1] IS EXECUTED. +;THE ARITHMETIC FLAGS ARE CHECKED. +;IF ANY ARITHMETIC FLAG IS SET, THIS TEST FAILS. + +C12200: JFCL 17,.+1 ;CLEAR FLAGS + MOVN [-1] ;*MOVN [-1,,-1] SHOULD SET ARITHMETIC FLAGS + JFCL 17,.+2 ;FAIL IF AN ARITHMETIC FLAG IS SET + SKIPA ;SKIP HALT INSTRUCTION IF MOVN PASSED. + STOP + +;********** +;THIS TEST VERIFIES THAT MOVN WILL SET THE AROV AND +;CRY1 FLAGS ONLY WHEN THE DATA IS 400000,,0 +;FIRST, THE FLAGS ARE RESET; THEN, MOVN [400000,,0] IS EXECUTED. +;THE ARITHMETIC FLAGS ARE CHECKED. +;IF AROV AND CRY1 ARE SET AND CRY0 AND FOV ARE RESET, THIS TEST PASSES. + +C12300: JFCL 17,.+1 ;CLEAR ARITHMETIC FLAGS + MOVN [XWD 400000,0] ;*MOVN [400000,,0] SHOULD SET AROV AND CRY1 ONLY + JOV .+2 ;PASS IF AROV IS SET + STOP + JCRY1 .+2 ;PASS IF CRY0 IS SET + STOP + JCRY0 .+2 ;PASS IF CRY0 IS RESET + SKIPA + STOP + JFOV .+2 ;PASS IF FOV IS RESET + SKIPA + STOP + +;********** + +;THIS TEST VERIFIES THAT MOVM WILL SET THE AROV AND +;CRY1 FLAGS ONLY WHEN THE DATA IS 400000,,0 +;FIRST, THE FLAGS ARE RESET; THEN, MOVM [400000,,0] IS EXECUTED. +;THE ARITHMETIC FLAGS ARE CHECKED. +;IF AROV AND CRY1 ARE SET AND CRY0 AND FOV ARE RESET, THIS TEST PASSES. + +C12301: JFCL 17,.+1 ;CLEAR ARITHMETIC FLAGS + MOVM [XWD 400000,0] ;*MOVM [400000,,0] SHOULD SET AROV AND CRY1 ONLY + JOV .+2 ;PASS IF AROV IS SET + STOP + JCRY1 .+2 ;PASS IF CRY0 IS SET + STOP + JCRY0 .+2 ;PASS IF CRY0 IS RESET + SKIPA + STOP + JFOV .+2 ;PASS IF FOV IS RESET + SKIPA + STOP + +;********** +SUBTTL TEST OF AOS AND SOS INSTRUCTIONS + +;********** + +;THIS TEST VERIFIES THAT AOS ADDS 1 TO MEMORY AND DOES NOT SKIP. +;FIRST, E IS CLEARED; THEN, AOS IS EXECUTED. NEXT E IS CHECKED FOR 1. +;IF C(E) IS NOT 1 OR AOS SKIPPED, THIS TEST FAILS + +C12600: SETZ ;CLEAR E + AOS ;*AOS SHOULD ADD 1 TO C(E) AND NOT SKIP + CAIE 1 ;PASS IF C(E)=0,,1 ANDAOS DID NOT SKIP + STOP + +;********** + +;THIS TEST VERIFIES THAT AOS ADDS 1 TO MEMORY AND DOES NOT SKIP. +;FIRST, E IS PRELOADED WITH -1,,-1; THEN, AOS IS EXECUTED. NEXT E IS CHECKED FOR 0. +;IF C(E) IS NOT 0 OR AOS SKIPPED, THIS TEST FAILS + +C12700: SETO ;PRELOAD E WITH -1,,-1 + AOS ;*AOS SHOULD ADD 1 TO C(E) AND NOT SKIP + CAIE ;PASS IF C(E)=0,,0 AND AOS DID NOT SKIP + STOP + +;********** +;THIS TEST VERIFIES THAT SOS SUBTRACTS 1 FROM MEMORY AND DOES NOT SKIP. +;FIRST, E IS CLEARED; THEN, SOS IS EXECUTED. NEXT E IS CHECKED FOR -1,,-1. +;IF C(E) IS NOT -1,,-1 OR SOS SKIPPED, THIS TEST FAILS + +C13100: SETZ ;CLEAR E + SOS ;*SOS SHOULD SUBTRACT 1 FROM C(E) AND NOT SKIP + CAME [-1] ;PASS IF C(E)=-1,,-1 AND SOS DID NOT SKIP + STOP + +;********** + +;THIS TEST VERIFIES THAT SOS SUBTRACTS 1 FROM MEMORY AND DOES NOT SKIP. +;FIRST, E IS PRELOADED WITH A; THEN, SOS IS EXECUTED. NEXT E IS CHECKED FOR 0. +;IF C(E) IS NOT 0 OR SOS SKIPPED, THIS TEST FAILS + +C13200: MOVEI 1 ;PRELOAD E WITH 1 + SOS ;*SOS SHOULD SUBTRACT 1 FROM C(E) AND DID NOT SKIP + CAIE 0 ;PASS IF C(E)=0 AND SOS DID NOT SKIP + STOP + +;********** +;THIS TEST VERIFIES THAT SOS SETS CRY0/1 FLAGS IF C(E) IS A NON-ZERO NUMBER OTHER +;THAN 400000,,0. IN THIS CASE, C(E)=1. FIRST THE FLAGS ARE RESET; THEN +;SOS IS EXECUTED. THE FLAGS ARE CHECKED. IF CRY0 AND CRY1 ARE SET +;AND AROV AND FOV ARE RESET, THIS TEST PASSES. + +C13300: JFCL 17,.+1 ;RESET ARITHMETIC FLAGS + MOVEI 1 ;PRELOAD E WITH 1 + SOS ;*SOS SHOULD SET CRY0/1 + JCRY0 .+2 ;PASS IF CRY0 IS SET + STOP + JCRY1 .+2 ;PASS IF CRY1 IS SET + STOP + JOV .+2 ;PASS IF AROV IS RESET + SKIPA + STOP + JFOV .+2 ;PASS IF FOV IS RESET + SKIPA + STOP + +;********** + +;THIS TEST VERIFIES THAT AOS SETS CRY0 AND CRY1 FLAG IF C(E) IS -1,,-1 +;FIRST THE FLAGS ARE RESET; THEN +;AOS IS EXECUTED. THE FLAGS ARE CHECKED. +;IF CRY0 AND CRY1 ARE SET AND AROV AND FOV ARE RESET, THIS TEST PASSES. + +C13400: JFCL 17,.+1 ;RESET ARITHMETIC FLAGS + SETO ;PRELOAD E WITH 1 + AOS ;*AOS SHOULD SET CRY0 AND CRY1 + JCRY0 .+2 ;PASS IF CRY0 IS SET + STOP + JCRY1 .+2 ;PASS IF CRY1 IS SET + STOP + JOV .+2 ;PASS IF AROV IS RESET + SKIPA + STOP + JFOV .+2 ;PASS IF FOV IS RESET + SKIPA + STOP + +;********** +SUBTTL TEST OF INTERACTION OF JFCL, JRST, AND JSP WITH ARITHMETIC FLAGS + +;********** + +;THIS TEST VERIFIES THAT JFCL 1, WILL ALWAYS CLEAR FOV FLAG. +;FIRST, FOV IS SET VIA JRST 2, ;THEN JFCL 1,.+1 IS EXECUTED TO CLEAR FOV. +;IF FOV WAS CLEARED, THIS TEST PASSES. + +C13600: SFLAG FOV ;SET FOV FLAG + JFCL 1,.+1 ;*JFCL SHOULD RESET FOV + JFCL 1,.+2 ;PASS IF FOV IS RESET + SKIPA ;SKIP HALT IF JFCL 1,.+1 PASSED + STOP + +;********** + +;THIS TEST VERIFIES THAT JRST 2, CAN SET FXU AND JSP CAN SAVE FXU IN THE AC. +;FIRST, FXU IS SET VIA JRST 2, ;THEN, JSP IS EXECUTED. THE AC IS CHECKED +;FOR FXU. IF FXU IS SET, THIS TEST PASSES; OTHERWISE, EITHER JRST 2, OR JSP FAILED. + +C13700: SFLAG FXU ;*SET FXU FLAG + JSP .+1 ;*STORE FXU FLAG IN AC + TLNN FXU ;PASS IF FXU IS SET IN THE AC + STOP + +;********** +;THIS TEST VERIFIES THAT JRST 2, CAN RESET FXU AND JSP CAN SAVE FXU IN THE AC. +;FIRST, FXU IS SET; THEN, FXU IS RESET VIA JRST 2,. NEXT, JSP IS EXECUTED; AND +;THE AC IS CHECKED FOR FXU RESET. IF FXU IS RESET IN THE AC, THIS TEST PASSES; +;OTHERWISE, JRST 2, FAILED TO CLEAR FXU OR JSP STORED FXU INCORECTLY. + +C14000: SFLAG FXU ;SET FXU FLAG + SFLAG ;*RESET FXU FLAG + JSP .+1 ;*STORE FXU FLAG IN THE AC + TLNE FXU ;PASS IF FXU IS RESET IN THE AC + STOP + +;********** + +;THIS TEST VERIFIES THAT JRST 2, CAN SET DCK AND JSP CAN SAVE DCK IN THE AC. +;FIRST, DCK IS SET VIA JRST 2, ;THEN JSP IS EXECUTED. THE AC IS CHECKED +;FOR DCK. IF DCK IS SET, THIS TEST PASSES, OTHERWISE JRST 2, OR JSP FAILED. + +C14100: SFLAG DCK ;*SET DCK FLAG + JSP .+1 ;*STORE FXU FLAG IN AC + TLNN DCK ;PASS IF FXU IS SET IN THE AC + STOP + +;********** +;THIS TEST VERIFIES THAT JRST 2, CAN RESET DCK AND JSP CAN SAVE DCK IN THE AC. +;FIRST, FXU IS SET; THEN, DCK IS RESET VIA JRST 2,. NEXT, JSP IS EXPECTED; AND +;THE AC IS CHECKED FOR DCK RESET. IF DCK IS RESET IN THE AC, THIS TEST PASSES; +;OTHERWISE, JRST 2, FAILED TO CLEAR DCK OR JSP STORED DCK INCORRECTLY. + +C14200: SFLAG DCK ;SET DCK FLAG + SFLAG ;*RESET DCK FLAG + JSP .+1 ;*STORE DCK FLAG IN THE AC + TLNE DCK ;PASS IF DCK IS RESET IN THE AC + STOP + +;********** +SUBTTL TEST OF JUMPX INSTRUCTIONS + +;********** + +;THIS TEST VERIFIES THAT JUMPL IS DATA DEPENDENT. IT WILL JUMP IF AND ONLY IF +;C(AC) IS NEGATIVE. IN THIS TEST, THE AC CONTAINS -1,,-1. HENCE, +;JUMPL SHOULD JUMP. IF JUMPL JUMPS, THIS TEST PASSES. + +C14500: SETO ;PRELOAD AC WITH -1,,-1 + JUMPL .+2 ;*JUMPL SHOULD JUMP BECAUSE C(AC) IS NEGATIVE + STOP + +;********** + +;THIS TEST VERIFIES THAT JUMPL IS DATA DEPENDENT. IT WILL JUMP IF AND ONLY IF +;C(AC) IS NEGATIVE. IN THIS TEST, THE AC CONTAINS 0. HENCE, +;JUMPL SHOULD NOT JUMP. IF JUMPL DOES NOT JUMP, THIS TEST PASSES. + +C14600: SETZ ;PRELOAD AC WITH 0 + JUMPL .+2 ;*JUMPL SHOULD NOT JUMP + SKIPA ;PASS IF JUMPL DOES NOT JUMP + STOP + +;********** + +;THIS TEST VERIFIES THAT JUMPE IS DATA DEPENDENT. IT WILL JUMP IF AND ONLY IF +;C(AC)=0. IN THIS TEST, THE AC CONTAINS 0. HENCE, +;JUMPE SHOULD JUMP. IF JUMPE JUMPS, THIS TEST PASSES. + +C14700: SETZ ;PRELOAD AC WITH 0 + JUMPE .+2 ;*JUMPE SHOULD JUMP + STOP + +;********** +;THIS TEST VERIFIES THAT JUMPN IS DATA DEPENDENT. IT WILL JUMP IF AND ONLY IF +;C(AC) IS NON-ZERO. IN THIS TEST, THE AC CONTAINS 1. HENCE, +;JUMPN SHOULD JUMP. IF JUMPN JUMPS, THIS TEST PASSES. + +C15000: MOVEI 1 ;PRELOAD AC WITH 1 + JUMPN .+2 ;*JUMPN SHOULD JUMP + STOP + +;********** + +;THIS TEST VERIFIES THAT JUMPE IS DATA DEPENDENT. IT WILL JUMP IF AND ONLY IF +;C(AC)=0. IN THIS TEST, THE AC CONTAINS 2. HENCE, +;JUMPL SHOULD NOT JUMP. IF JUMPE DOES NOT JUMP, THIS TEST PASSES. + +C15100: MOVEI 2 ;PRELOAD AC WITH 2 + JUMPE .+2 ;*JUMPE SHOULD NOT JUMP + SKIPA ;PASS IF JUMPE DID NOT JUMP + STOP + +;********** + +;THIS TEST VERIFIES THAT JUMPN IS DATA DEPENDENT. IT WILL JUMP IF AND ONLY IF +;C(AC) IS NON-ZERO. IN THIS TEST, THE AC CONTAINS 0. HENCE, +;JUMPN SHOULD NOT JUMP. IF JUMPN DOES NOT JUMP, THIS TEST PASSES. + +C15200: SETZ ;PRELOAD AC WITH 0 + JUMPN .+2 ;*JUMPN SHOULD NOT JUMP + SKIPA ;PASS IF JUMPN DID NOT JUMP + STOP + +;********** +;THIS TEST VERIFIES THAT JUMPG IS DATA DEPENDENT. IT WILL JUMP IF AND ONLY IF +;C(AC) IS GREATER THAN 0. IN THIS TEST, THE AC CONTAINS 1. HENCE, +;JUMPG SHOULD JUMP. IF JUMPG JUMPS, THIS TEST PASSES. + +C15300: MOVEI 1 ;PRELOAD AC WITH 1 + JUMPG .+2 ;*JUMPG SHOULD JUMP + STOP + +;********** + +;THIS TEST VERIFIES THAT JUMPG IS DATA DEPENDENT. IT WILL JUMP IF AND ONLY IF +;C(AC) IS GREATER THAN 0. IN THIS TEST, THE AC CONTAINS -1,,0. HENCE, +;JUMPG SHOULD NOT JUMP. IF JUMPG DOES NOT JUMP, THIS TEST PASSES. + +C15400: MOVSI -1 ;PRELOAD AC WITH -1,,0 + JUMPG .+2 ;*JUMPG SHOULD NOT JUMP + SKIPA ;PASS IF JUMPG DID NOT JUMP + STOP + +;********** +SUBTTL TEST OF AOJ AND SOJ INSTRUCTIONS + +;********** + +;THIS TEST VERIFIES THAT AOJ ADDS 1 TO THE AC AND DOES NOT JUMP. +;FIRST, THE AC IS PRELOADED WITH 0; THEN, AOJ IS EXECUTED. NEXT, THE +;AC IS CHECKED FOR 1. IF C(AC) IS NOT 1 OR AOJ SKIPPED, THIS TEST FAILS. + +C15500: SETZ ;PRELOAD AC WITH 0 + AOJ .+2 ;*AOJ SHOULD ADD 1 TO THE AC AND NOT JUMP + CAIE 1 ;PASS IF C(AC)=1 AND AOJ DID NOT JUMP + STOP + +;********** + +;THIS TEST VERIFIES THAT AOJ ADDS 1 TO THE AC AND DOES NOT JUMP. +;FIRST, THE AC IS PRELOADED WITH -1,,-1; THEN, AOJ IS EXECUTED. NEXT, THE +;AC IS CHECKED FOR 0. IF C(AC) IS NOT 0 OR AOJ SKIPPED, THIS TEST FAILS. + +C15600: SETO ;PRELOAD AC WITH 0 + AOJ .+2 ;*AOJ SHOULD ADD 1 TO THE AC AND NOT JUMP + CAIE 0 ;PASS IF C(AC)=1 AND AOJ DID NOT JUMP + STOP + +;********** + +;THIS TEST VERIFIES THAT SOJ SUBTRACTS 1 FROM THE AC AND DOES NOT JUMP. +;FIRST, THE AC IS PRELOADED WITH 0; THEN, SOJ IS EXECUTED. NEXT, THE +;AC IS CHECKED FOR -1,,-1. IF C(AC) IS NOT -1,,-1 OR SOJ SKIPPED, THIS TEST FAILS. + +C15700: SETZ ;PRELOAD AC WITH 0 + SOJ .+2 ;*SOJ SHOULD SUBTRACT 1 FROM THE AC AND NOT JUMP + CAME [-1] ;PASS IF C(AC)=-1,,-1 AND SOJ DID NOT JUMP + STOP + +;********** +;THIS TEST VERIFIES THAT SOJ SUBTRACTS 1 FROM THE AC AND DOES NOT JUMP. +;FIRST, THE AC IS PRELOADED WITH -1,,-1; THEN, SOJ IS EXECUTED. NEXT, THE +;AC IS CHECKED FOR -1,,-2. IF C(AC) IS NOT -1,,-2 OR SOJ SKIPPED, THIS TEST FAILS. + +C16000: SETO ;PRELOAD AC WITH -1,,-1 + SOJ .+2 ;*SOJ SHOULD SUBTRACT 1 FROM THE AC AND NOT JUMP + CAME [-2] ;PASS IF C(AC)=-1,,-2 AND SOJ DID NOT JUMP + STOP + +;********** + +;THIS TEST VERIFIES THAT SOJ SUBTRACTS 1 FROM THE AC AND DOES NOT JUMP. +;FIRST, THE AC IS PRELOADED WITH 0,,1; THEN, SOJ IS EXECUTED. NEXT, THE +;AC IS CHECKED FOR 0. IF C(AC) IS NOT 0 OR SOJ SKIPPED, THIS TEST FAILS. + +C16100: MOVEI 1 ;PRELOAD AC WITH 1 + SOJ .+2 ;*SOJ SHOULD SUBTRACT 1 FROM THE AC AND NOT JUMP + CAIE 0 ;PASS IF C(AC)=0 AND SOJ DID NOT JUMP + STOP + +;********** +;THIS TEST VERIFIES THAT SOJ AC, FOLLOWED BY AOJ AC, HAS NO NET EFFECT ON C(AC). +;IN THIS CASE, THE AC IS PRELOADED WITH 0; THEN, SOJ AC, FOLLOWED BY AOJ. +;AC, IS REPEATED 7 TIMES. THE AC IS THEN CHECKED FOR ITS ORIGINAL CONTENTS, 0. +;IF C(AC)=0, THIS TEST PASSES; OTHERWISE AOJ OR SOJ FAILED. + +C16200: AC=17 + SETZ AC, ;PRELOAD AC WITH 0 + REPEAT ^D10,< + SOJ AC,. ;*SOJ SHOULD SUBTRACT 1 FROM THE AC + AOJ AC,. ;*AOJ SHOULD ADD 1 TO THE AC> + SKIPE AC ;PASS IF C(AC) IS UNCHANGED. I.E. C(AC)=0 + STOP + +;********** +;THIS TEST VERIFIES THAT SOJ SETS CRY0/1 FLAGS IF C(E) IS A NON-ZERO NUMBER OTHER +;THAN 400000,,0. IN THIS CASE, C(E)=1. FIRST THE FLAGS ARE RESET; THEN +;SOJ IS EXECUTED. THE FLAGS ARE CHECKED. IF CRY0 AND CRY1 ARE SET +;AND AROV AND FOV ARE RESET, THIS TEST PASSES. + +C16201: JFCL 17,.+1 ;RESET ARITHMETIC FLAGS + MOVEI 1 ;PRELOAD E WITH 1 + SOJ ;*SOJ SHOULD SET CRY0/1 + JCRY0 .+2 ;PASS IF CRY0 IS SET + STOP + JCRY1 .+2 ;PASS IF CRY1 IS SET + STOP + JOV .+2 ;PASS IF AROV IS RESET + SKIPA + STOP + JFOV .+2 ;PASS IF FOV IS RESET + SKIPA + STOP + +;********** + +;THIS TEST VERIFIES THAT AOJ SETS CRY0 AND CRY1 FLAG IF C(E) IS -1,,-1 +;FIRST THE FLAGS ARE RESET; THEN +;AOJ IS EXECUTED. THE FLAGS ARE CHECKED. +;IF CRY0 AND CRY1 ARE SET AND AROV AND FOV ARE RESET, THIS TEST PASSES. + +C16202: JFCL 17,.+1 ;RESET ARITHMETIC FLAGS + SETO ;PRELOAD E WITH 1 + AOJ ;*AOJ SHOULD SET CRY0 AND CRY1 + JCRY0 .+2 ;PASS IF CRY0 IS SET + STOP + JCRY1 .+2 ;PASS IF CRY1 IS SET + STOP + JOV .+2 ;PASS IF AROV IS RESET + SKIPA + STOP + JFOV .+2 ;PASS IF FOV IS RESET + SKIPA + STOP + +;********** +SUBTTL TEST OF MEMORY, BOTH AND SELF MODE INSTRUCTIONS + +;********** + +;THIS TEST VERIFIES THAT ADDM DOES NOT MODIFY C(AC) +;BOTH AC AND E ARE PRELOADED WITH -1,,-1. THEN ADDM IS EXECUTED. +;THIS TEST PASSES IF C(AC) ARE UNCHANGED + +C16400: SETOB 1 ;PRELOAD AC, E WITH -1,,-1 + ADDM 1 ;*ADDM SHOULD NOT AFFECT C(AC) + CAME [-1] ;PASS IF C(AC) IS UNMODIFIED BY ADDM + STOP + +;********** + +;THIS TEST VERIFIES THAT HRREM DOES NOT MODIFY C(AC) +;THE AC IS PRELOADED WITH 0,,-1. THEN HRRM IS EXECUTED. +;THIS TEST PASSES IF C(AC) ARE UNCHANGED + +C16500: MOVEI -1 ;PRELOAD AC WITH 0,,-1 + HRREM 1 ;*HRRM SHOULD NOT AFFECT C(AC) + CAIE -1 ;PASS IF C(AC) IS UNMODIFIED BY HRRM + STOP + +;********** +;THIS TEST VERIFIES THAT MOVSM DOES NOT MODIFY C(AC) +;THE AC IS PRELOADED WITH 0,,-1. THEN MOVSM IS EXECUTED. +;THIS TEST PASSES IF C(AC) ARE UNCHANGED + +C16600: MOVEI -1 ;PRELOAD AC WITH 0,,-1 + MOVSM 1 ;*MOVSM SHOULD NOT AFFECT C(AC) + CAIE -1 ;PASS IF C(AC) IS UNMODIFIED BY MOVSM + STOP + +;********** + +;THIS TEST VERIFIES THAT XORM DOES NOT MODIFY C(AC) +;BOTH AC AND E ARE PRELOADED WITH -1,,-1. THEN XORM IS EXECUTED. +;THIS TEST PASSES IF C(AC) ARE UNCHANGED + +C16700: SETOB 1 ;PRELOAD AC, E WITH -1,,-1 + XORM 1 ;*XORM SHOULD NOT AFFECT C(AC) + CAME [-1] ;PASS IF C(AC) IS UNMODIFIED BY XORM + STOP + +;********** +;THIS TEST VERIFIES THAT ADDB ADDS C(AC) TO C(E) AND PLACES THE +;RESULT IN BOTH AC AND E. IN THIS TEST, BOTH AC AND E ARE PRELOADED +;WITH -1,,-1, THEN, ADDB IS EXECUTED. C(AC) IS THEN COMPARED TO C(E); +;AND C(AC) IS THEN COMPARED TO -2. IF BOTH OF THESE COMPARISONS SUCCEED, THIS +;TEST PASSES; OTHERWISE, ADDB FAILED + +C17000: SETOB 1 ;PRELOAD AC, E WITH -1,,-1 + ADDB 1 ;*ADDB SHOULD ADD C(AC) TO C(E) AND PLACE RESULT + ;INTO BOTH AC AND E + CAME 1 ;PASS IF C(AC)=C(E) + STOP + CAME [-2] ;PASS IF C(AC)=-2 + STOP + +;********** + +;THIS TEST VERIFIES THAT ADDM ADDS C(AC) TO C(E) AND PLACES THE RESULT IN E +;IN THIS CASE, AC, E ARE BOTH PRELOADED WITH -1; THEN, ADDM IS EXECUTED. +;E IS THEN CHECKED FOR -2. IF C(E)=-2, THIS TEST PASSES; OTHERWISE, ADDM FAILED + +C17100: SETOB 1 ;PRELOAD AC, E WITH -1,,-1 + ADDM 1 ;*ADDM SHOULD ADD C(AC) TO C(E) + CAME 1,[-2] ;PASS IF C(E)=-2 + STOP + +;********** +;THIS TEST VERIFIES THAT HLLOS PLACES ONES ON THE RIGHT HALF OF E +;BUT DOES NOT AFFECT THE LEFT HALF OF E. IN THIS CASE, +;E IS PRELOADED WITH 0; THE, HLLOS IS EXECUTED. THE RESULT +;IN E SHOULD BE 0,,-1. IF C(E)=0,,-1, THIS TEST PASSES + +C17200: SETZM 1 ;PRELOAD E WITH 0 + HLLOS 1 ;*HLLOS SHOULD PLACE 0,,-1 INTO E + CAIE 1,-1 ;PASS IF C(E)=0,,-1 + STOP + +;********** + +;THIS TEST VERIFIES THAT MOVSS SWAPS BOTHS HALVES OF E AND +;PLACES THE RESULT IN E. IN THIS CASE, E IS PRELOADED WITH +;-1,,0; THEN, MOVSS IS EXECUTED. THE RESULT IN E SHOULD BE 0,,-1. +;IF C(E)=0,,-1, THIS TEST PASSES + +C17300: MOVSI 1,-1 ;PRELOAD E WITH -1,,0 + MOVSS 1 ;*MOVSS SHOULD PLACE 0,,-1 INTO E + CAIE 1,-1 ;PASS IF C(E)=0,,-1 + STOP + +;********** +;THIS TEST VERIFIES THAT AOS ADDS ONE TO MEMORY BUT DOES NOT SKIP +;FIRST, E IS PRELOADED WITH -1,-1; THEN, AOS IS EXECUTED. NEXT, E IS CHECKED FOR 0. +;IF C(E) IS NOT 0 OR AOS SKIPPED, THIS TEST FAILS + +C17400: SETOB 1 ;PRELOAD E WITH -1,,-1 + AOS 1 ;*AOS SHOULD ADD TO C(E) AND NOT SKIP + CAIE 1,0 ;PASS IF C(E)=0,,0 AND AOS DID NOT SKIP + STOP + +;********** + +;THIS TEST VERIFIES THAT HRLM PLACES C(AC-RIGHT) INTO E-LEFT AND DOES +;NOT MODIFY E-RIGHT. IN THIS CASE, AC IS PRELOADED WITH 0 AND E IS PRELOADED +;WITH -1,,-1. THEN, HRLM IS EXECUTED. E IS THEN CHECKED FOR 0,,-1. IF +;C(E)=0,,-1, THIS TEST PASSES + +C17500: SETZ ;PRELOAD AC WITH 0 + SETO 1, ;PRELOAD E WITH -1,,-1 + HRLM 1 ;*HRLM SHOULD PLACE 0,,-1 INTO E + CAIE 1,-1 ;PASS IF C(E)=0,,-1 + STOP + +;********** +;THIS TEST VERIFIES THAT HRRS DOES NOT MODIFY E +;E IS PRELOADED WITH 0 AND AC IS PRELOADED WITH -1,,-1. +;HRRS IS EXECUTED; THEN E IS CHECKED. IF C(E) DOES +;NOT CHANGE, THIS TEST PASSES + +C17600: SETO ;PRELOAD AC WITH -1,,-1 + SETZ 1, ;PRELOAD E WITH 0,,0 + HRRS 1 ;*HRRS SHOULD PLACE 0,,0 INTO E + SKIPE 1 + STOP + +;********** + +;THIS TEST VERIFIES THAT HRRZM PLACES C(AC-RIGHT) INTO E-RIGHT AND PLACES +;ZEROS INTO E-LEFT. IN THIS CASE, AC=E=AC1 AND C(AC)=C(E)=-1,,0. HRRZM +;IS EXECUTED AND AC1 IS CHECKED FOR 0. IF AC1=0, THIS TEST PASSES. + +C17700: SETO ;PRELOAD AC0 WITH -1,,-1 + MOVSI 1,-1 ;PRELOAD AC1 WITH -1,,0 + HRRZM 1,1 ;*HRRZM SHOULD PLACE 0 INTO AC1 + SKIPE 1 ;PASS IF C(AC1)=0 + STOP + +;********** +;THIS TEST VERIFIES THAT JFCL 17,.+1 NEVER JUMPS AND DOES NOT MODIFY C(AC0). +;FIRST, AC0 IS PRELOADED; THEN, JFCL IS EXECUTED. IF AC0 IS MODIFIED +;OR JFCL SKIPS, THIS TEST FAILS + +C20000: SETZ ;CLEAR AC0 + JFCL 17,.+1 ;*JFCL SHOULD NOT JUMP OR MODIFY C(AC0). + SKIPE ;PASS IF C(AC0)=0 AND JFCL DID NOT JUMP + STOP + +;********** + +;THIS TEST VERIFIES THAT XORM PERFORMS THE LOGICAL EXCLUSIVE OR FUNCTION +;BETWEEN C(AC) AND C(E) AND PLACES THE RESULT INTO E +;IN THIS CASE, AC AND E ARE PRELOADED WITH -1,,-1; THEN, XORM IS +;EXECUTED. IF THE RESULT IN E IS 0, THE TEST PASSES + +C20100: SETOB 1 ;PRELOAD AC,E WITH -1,,-1 + XORM 1 ;*XORM SHOULD PLACE 0 INTO E + CAIE 1,0 ;PASS IF C(E)=0 + STOP + +;********** +;THIS TEST VERIFIES THAT SETZB PLACES ZEROS INTO BOTH AC AND E. +;AFTER SETZB IS EXECUTED, BOTH AC AND E ARE CHECKED +;FOR 0. IF EITHER AC OR E CONTAINS ANY ONES, THIS TEST FAILS + +C20200: SETZB 1 ;*SETZB SHOULD PLACE ZEROES IN BOTH AC AND E + CAMN [0] ;FAIL IF C(AC) IS NON-ZERO + CAME 1 ;FAIL IF C(E) IS NON-ZERO + STOP + +;********** + +;THIS TEST VERIFIES THAT SETAB PLACES C(AC) INTO BOTH AC AND E. +;FIRST, AC IS PRELOADED WITH -1,,-1 AND E IS PRELOADED WITH 0; +;THEN, SETAB IS EXECUTED. BOTH AC AND E ARE CHECKED FOR -1,,-1 +;IF EITHER AC OR E CONTAIN ANY ZEROS, THIS TEST FAILS. + +C20300: SETZ 1, ;PRELOAD E WITH 0 + SETO ;PRELOAD AC WITH -1,,-1 + SETAB 1 ;*SETAB SHOULD PLACE -1,,-1 INTO BOTH AC AND E + CAMN [-1] ;FAIL IF C(AC) IS NOT -1,-1 + CAME 1 ;FAIL IF C(E) IS NOT -1,,-1 + STOP + +;********** +SUBTTL XCT INSTRUCTION - BASIC TESTS + +;********** + +;THIS TEST VERIFIES THAT XCT WILL EXECUTE THE INSTRUCTION SPECIFIED BY C(E) +;IN THIS CASE, C(E) SPECIFIES A MOVEI INSTRUCTION +;AFTER EXECUTING MOVEI, CONTROL SHOULD RETURN TO +;THE NEXT SEQUENTIAL INSTRUCTION FOLLOWING XCT. +;THIS TEST PASSES IF CONTROL RETURNS TO THE NEXT SEQUENTIAL INSTRUCTION FOLLOWING XCT + +C20400: SETZB 1 ;CLEAR AC0 AND AC1 + XCT [MOVEI 1,.+2] ;*XCT SHOULD RETURN CONTROL TO NEXT INSTRUCTION + SKIPA + STOP + +;********** + +;THIS TEST VERIFIES THAT XCT WILL EXECUTE THE INSTRUCTION SPECIFIED BY C(E) +;IN THIS CASE, C(E) SPECIFIES A MOVEI INSTRUCTION. +;AFTER EXECUTING MOVEI, THE AC SPECIFIED BY MOVEI IS CHECKED FOR +;0,,1 (THE EXPECTED RESULT). IF C(AC)=0,,1, THIS TEST PASSES + +C20500: SETZB 1 ;CLEAR AC + XCT [MOVEI 1,1] ;*XCT OF MOVEI SHOULD PLACE 1 IN THE AC + CAIE 1,1 ;PASS IF C(AC)=1 + STOP + +;********** +;THIS TEST VERIFIES THAT A NEST OF XCT INSTRUCTIONS WILL EXECUTE +;THE INSTRUCTION SPECIFIED BY THE MOST NESTED XCT AND RETURN CONTROL TO +;THE NEXT SEQUENTIAL INSTRUCTION FOLLOWING THE FIRST XCT. +;IN THIS CASE, THE EXECUTED INSTRUCTION IS MOVEI. AFTER EXECUTING THE MOVEI, +;C(AC) IS CHECKED FOR 0,,-1 (THE EXPECTED RESULT). IF C(AC)=0,,-1, THIS TEST PASSES + +C20600: SETZB 1 ;CLEAR AC + XCT [XCT[XCT[XCT[XCT[MOVEI 1,-1]]]]] ;*NESTED XCT OF MOVEI + ;SHOULD PLACE 0,,-1 INTO AC + CAIE 1,-1 ;PASS IF C(AC)=0,,-1 + STOP + +;********** + +;THIS TEST VERIFIES THAT XCT WILL NOT MODIFY AN AC WHICH IS NOT SPECIFIED BY THE +;EXECUTED INSTRUCTION. IN THIS CASE, AC0 IS CLEARED AND THEN CHECKED FOR ZERO AFTER +;THE XCT INSTRUCTION IS EXECUTED. AC0 SHOULD NOT BE MODIFIED. + +C20700: SETZB 1 ;CLEAR AC0,AC1 + XCT [MOVE 1,[-1]] ;*XCT SHOULD NOT MODIFY AC0 + SKIPE ;PASS IF AC0 WAS NOT MODIFIED + STOP + +;********** +;THIS TEST VERIFIES THAT XCT OF SKIPA SHOULD RETURN CONTROL TO THE +;SECOND SEQUENTIAL INSTRUCTION FOLLOWING XCT + +C21000: XCT [SKIPA] ;XCT OF SKIPA SHOULD RETURN CONTROL TO .+2 + STOP + +;********** +SUBTTL INDIRECT ADDRESSING - BASIC TESTS + +;********** + +;THIS TEST VERIFIES THAT INDIRECT ADDRESSING WORKS WHEN BOTH E AND @E +;ARE WITHIN THE AC RANGE. +;THE INSTRUCTION SPECIFYING INDIRECT ADDRESSING IS A MOVE. +;AFTER MOVE IS EXECUTED, C(AC) IS CHECKED FOR 0, +;THE INITIAL CONTENTS OF THE INDIRECT ADDRESS + +C21100: SETOM 1 ;PRELOAD AC WITH -1,,-1 + MOVEI 7,3 ;SETUP DIRECT ADDRESS WITH INDIRECT ADDRESS + SETZM 3 ;PRELOAD INDIRECT ADDRESS WITH 0 + MOVE 1,@7 ;*FWT FROM INDIRECT ADDRESSS SHOULD + ;PLACE 0 INTO THE AC + SKIPE 1 ;PASS IF C(AC)=0 + STOP + +;********** + +;THIS TEST VERIFIES THAT INDIRECT ADDRESSING WORKS WHEN BOTH E AND @E +;ARE WITHIN THE AC RANGE. +;THE INSTRUCTION SPECIFYING INDIRECT ADDRESSING IS A MOVE. +;AFTER MOVE IS EXECUTED, C(AC) IS CHECKED FOR -1,,-1, +;THE INITIAL CONTENTS OF THE INDIRECT ADDRESS + +C21200: SETZM 1 ;PRELOAD AC WITH -1,,-1 + MOVEI 7,3 ;SETUP DIRECT ADDRESS WITH INDIRECT ADDRESS + SETOM 3 ;PRELOAD INDIRECT ADDRESS WITH -1,,-1 + MOVE 1,@7 ;*FWT FROM INDIRECT ADDRESS SHOULD + ;PLACE -1,,-1 INTO THE AC + CAME 1,[-1,,-1] ;PASS IF C(AC)=-1,,-1 + STOP + +;********** +;THIS TEST VERIFIES THAT INDIRECT ADDRESSING WORKS WHEN BOTH E AND @E +;ARE WITHIN THE AC RANGE. +;THE INSTRUCTION SPECIFYING INDIRECT ADDRESSING IS A MOVE. +;AFTER MOVE IS EXECUTED, C(AC) IS CHECKED FOR 707070,,707070, +;THE INITIAL CONTENTS OF THE INDIRECT ADDRESS + +C21300: SETZM 1 ;PRELOAD AC WITH 0 + MOVEI 7,3 ;SETUP DIRECT ADDRESS WITH INDIRECT ADDRESS + MOVE 3,[707070,,707070] ;PRELOAD INDIRECT ADDRESS WITH 707070,,707070 + MOVE 1,@7 ;*FWT FROM INDIRECT ADDRESS SHOULD + ;PLACE 707070,,707070 INTO THE AC + CAME 1,[707070,,707070] ;PASS IF C(AC)=707070,,707070 + STOP + +;********** + +;THIS TEST VERIFIES THAT INDIRECT ADDRESSING WORKS WHEN E IS WITHIN THE AC RANGE +;AND @E IS BEYOND THE AC RANGE. +;THE INSTRUCTION SPECIFYING INDIRECT ADDRESSING IS A MOVE. +;AFTER MOVE IS EXECUTED, C(AC) IS CHECKED FOR 707070,,707070, +;THE INITIAL CONTENTS OF THE INDIRECT ADDRESS + +C21400: JRST .+2 + XWD 707070,707070 ;INDIRECT ADDRESS AND ITS DATA + SETZM 1 ;PRELOAD AC WITH 0 + MOVEI 7,C21400+1 ;SETUP DIRECT ADDRESS WITH INDIRECT ADDRESS + MOVE 1,@7 ;*FWT FROM INDIRECT ADDRESS SHOULD + ;PLACE 707070,,707070 INTO AC + CAME 1,C21400+1 ;PASS IF C(AC)=707070,,707070 + STOP + +;********** +;THIS TEST VERIFIES THAT INDIRECT ADDRESSING WORKS WHEN BOTH E AND @E +;ARE BEYOND THE AC RANGE. +;THE INSTRUCTION SPECIFYING INDIRECT ADDRESSING IS A MOVE. +;AFTER MOVE IS EXECUTED, C(AC) IS CHECKED FOR 202020,,202020, +;THE INITIAL CONTENTS OF THE INDIRECT ADDRESS + +C21500: JRST .+3 + .+1 ;DIRECT ADDRESS AND ITS DATA + XWD 202020,202020 ;INDIRECT ADDRESS AND ITS DATA + SETZM 1 ;PRELOAD AC WITH 0 + MOVE 1,@C21500+1 ;*FWT FROM INDIRECT ADDRESS SHOULD + ;PLACE 202020,,202020 INTO AC + CAME 1,C21500+2 ;PASS IF C(AC)=202020,,202020 + STOP + +;********** + +;THIS TEST VERIFIES THAT INDIRECT ADDRESSING WORKS WHEN BOTH E AND @E +;ARE BEYOND THE AC RANGE. +;THE INSTRUCTION SPECIFYING INDIRECT ADDRESSING IS A CAME. + +C21600: JRST .+3 + .+1 ;DIRECT ADDRESS AND ITS DATA + XWD 272727,272727 ;INDIRECT ADDRESS AND ITS DATA + MOVE 1,C21600+2 ;PRELOAD AC + CAME 1,@C21600+1 ;*CAME OF DATA FROM INDIRECT ADDRESS - NON-AC RANGE + STOP + +;********** +;THIS TEST VERIFIES THAT INDIRECT ADDRESSING WORKS WHEN E IS WITHIN THE AC RANGE +;AND @E IS BEYOND THE AC RANGE. +;THE INSTRUCTION SPECIFYING INDIRECT ADDRESSING IS A CAME. + +C21700: JRST .+2 + XWD 252525,252525 ;INDIRECT ADDRESS AND ITS DATA + MOVEI 7,C21700+1 ;SETUP DIRECT ADDRESS WITH INDIRECT ADDRESS + MOVE 1,C21700+1 ;SETUP AC + CAME 1,@7 ;*CAME IF DATA FROM INDIRECT ADDRESS - AC RANGE + STOP + +;********** +SUBTTL TEST INDIRECT ADDRESSING WITH INDEXING + +;SETUP INDEX REGISTERS + + MOVEI 1,-4 + MOVEI 3,2 + MOVEI 4,10 + MOVEI 5,1 + MOVEI 6,5 + MOVEI 7,7 + MOVEI 10,4 + MOVEI 11,-6 + MOVEI 12,5 + MOVEI 13,2 + + JRST C22000 ;RESUME TEST + +;INDIRECT ADDRESSING/INDEXING TEST TABLE + +;;;;;;;;;;; ;;;;;;;;;; ;;;;;;;;;; + +;DO NOT MODIFY THIS TABLE OR TESTS C21700 THRU C22600 INDEPENDENTLY ! + +;;;;;;;;;; ;;;;;;;;;; ;;;;;;;;;; + +E217: E217A(3) +E220: @E220A +E220B: 220220,,220220 +E217A: @E221A ;E221-4 +E221B: 221221,,221221 +E222A: 217217,,217217 ;E217A+2 +E220A: E220B +E221: E221 +E221A: E221B +E222: E221 +E223A: 223223,,223223 +E224A: E224A(4) ;E223-6 + 222222,,222222 ;E222A+7 +E225: E225 + E222A(7) ;E222+5 + @E225A ;E225+2 +E225B: 225225,,225225 +E223: E223 +E225A: E225B + 224224,,224224 ;E224A+10 +E226B: 226226,,226226 + E223A ;E223+4 +E226A: @E226A(5) ;E223+5 + E226B ;E226A+1 +;THIS TEST VERIFIES THAT INDIRECT ADDRESSING IN COMBINATION WITH INDEXING FUNCTIONS CORRECTLY. +;IN THIS CASE, MOVE 2,@E217 IS TESTED WHERE C(E217)=E217A(3) AND C(3)=0,,2. +;HENCE, THE RESULT IN THE AC SHOULD BE C(E217A+2)=217217,,217217 + +C22000: SETOM 2 ;INITIALIZE AC + MOVE 2,@E217 ;TEST INDIRECT ADDRESSING WITH INDEXING + CAME 2,E217A+2 ;PASS IF C(AC)=217217,,217217 + STOP + +;********** + +;THIS TEST VERIFIES THAT INDIRECT ADDRESSING IN COMBINATION WITH INDEXING FUNCTIONS CORRECTLY. +;IN THIS CASE, MOVE 2,@E220 IS TESTED WHERE C(E220)=@E220A AND C(E220A)=E220B. +;HENCE, THE RESULT IN THE AC SHOULD BE C(E220B)=220220,,220220 + +C22100: SETZM 2 ;INITIALIZE AC + MOVE 2,@E220 ;TEST INDIRECT ADDRESSING WITH INDEXING + CAME 2,E220B ;PASS IF C(AC)=220220,,220220 + STOP + +;********** +;THIS TEST VERIFIES THAT INDIRECT ADDRESSING IN COMBINATION WITH INDEXING FUNCTIONS CORRECTLY. +;IN THIS CASE,E221(1) 2,@E217 IS TESTED WHERE C(1)=-4 AND E221-4=E217A +;HENCE, THE RESULT IN THE AC SHOULD BE C(E217A)=@E221A=20,,E221A + +C22200: SETOM 2 ;INITIALIZE AC + MOVE 2,E221(1) ;TEST INDIRECT ADDRESSING WITH INDEXING + CAME 2,E217A ;PASS IF C(AC)=@E221A=20,,E221A + STOP + +;********** + +;THIS TEST VERIFIES THAT INDIRECT ADDRESSING IN COMBINATION WITH INDEXING FUNCTIONS CORRECTLY. +;IN THIS CASE, MOVE 2,E222(6) IS TESTED WHERE C(6)=5 +;HENCE, THE RESULT IN THE AC SHOULD BE C(E222+5)=E222A(7)=7,,E222A + +C22300: SETZM 2 ;INITIALIZE AC + MOVE 2,E222(6) ;TEST INDIRECT ADDRESSING WITH INDEXING + CAME 2,E222+5 ;PASS IF C(AC)=E222A(7)=7,,E222A + STOP + +;********** +;THIS TEST VERIFIES THAT INDIRECT ADDRESSING IN COMBINATION WITH INDEXING FUNCTIONS CORRECTLY. +;IN THIS CASE, MOVE 2,@E223(10) IS TESTED WHERE C(10)=4 AND C(E223+4)=E223A +;HENCE, THE RESULT IN THE AC SHOULD BE C(E223A)=223223,,223223 + +C22400: SETOM 2 ;INITIALIZE AC + MOVE 2,@E223(10) ;TEST INDIRECT ADDRESSING WITH INDEXING + CAME 2,E223A ;PASS IF C(AC)=223223,,223223 + STOP + +;********** + +;THIS TEST VERIFIES THAT INDIRECT ADDRESSING IN COMBINATION WITH INDEXING FUNCTIONS CORRECTLY. +;IN THIS CASE, MOVE 2,@E223(11) IS TESTED WHERE C(11)=-6, C(E223-6)=E224A(4) AND C(4)=10 +;HENCE, THE RESULT IN THE AC SHOULD BE C(E224A+10)=224224,,224224 + +C22500: SETZM 2 ;INITIALIZE AC + MOVE 2,@E223(11) ;TEST INDIRECT ADDRESSING WITH INDEXING + CAME 2,E224A+10 ;PASS IF C(AC)=224224,,224224 + STOP + +;********** +;THIS TEST VERIFIES THAT INDIRECT ADDRESSING IN COMBINATION WITH INDEXING FUNCTIONS CORRECTLY. +;IN THIS CASE, MOVE 2,@E225(13) IS TESTED WHERE C(13)=2, C(E225+2)=@E225A +;AND C(E225A)=E225B +;HENCE, THE RESULT IN THE AC SHOULD BE C(E225B)=225225,,225225 + +C22600: SETOM 2 ;INITIALIZE AC + MOVE 2,@E225(13) ;TEST INDIRECT ADDRESSING WITH INDEXING + CAME 2,E225B ;PASS IF C(AC)=225225,,225225 + STOP + +;********** + +;THIS TEST VERIFIES THAT INDIRECT ADDRESSING IN COMBINATION WITH INDEXING FUNCTIONS CORRECTLY. +;IN THIS CASE, MOVE 2,@E223(12) IS TESTED WHERE C(12)=5, C(E223+5)=@E226A(5), +;C(5)=1 AND C(E226A+1)=E226B +;HENCE, THE RESULT IN THE AC SHOULD BE C(E226B)=226226,,226226 + +C22700: SETZM 2 ;INITIALIZE AC + MOVE 2,@E223(12) ;TEST INDIRECT ADDRESSING WITH INDEXING + CAME 2,E226B ;PASS IF C(AC)=226226,,226226 + STOP + +;********** + +; JRST BEGEND diff --git a/devices/pdp10/machine/ka10/test/debugger/machine.xml b/devices/pdp10/machine/ka10/test/debugger/machine.xml index e8e85b514..c8fed782c 100644 --- a/devices/pdp10/machine/ka10/test/debugger/machine.xml +++ b/devices/pdp10/machine/ka10/test/debugger/machine.xml @@ -8,5 +8,5 @@ - + diff --git a/modules/pdp10/lib/debugger.js b/modules/pdp10/lib/debugger.js index 5c2451982..04565ac40 100644 --- a/modules/pdp10/lib/debugger.js +++ b/modules/pdp10/lib/debugger.js @@ -187,8 +187,8 @@ class DebuggerPDP10 extends Debugger { this.macro10 = null; /* - * Make it easier to access DebuggerPDP10 commands from an external REPL (eg, the WebStorm - * "live" console window); eg: + * Make it easier to access DebuggerPDP10 commands from an external REPL; + * eg, the WebStorm "live" console window: * * pdp10('r') * pdp10('dw 0:0') @@ -2566,18 +2566,20 @@ class DebuggerPDP10 extends Debugger { return; } - if (sOpcode[0] == '/' || sOpcode.indexOf(':') >= 0) { + var match = sOpcode.match(/^(['"]?)((\/|http:).*)\1$/); + if (match) { var dbg = this; if (this.macro10) { dbg.println("assembly already in progress"); } else { var addrLoad = dbgAddr.addr; - this.macro10 = new Macro10(sOpcode, addrLoad, dbg, function(macro10, sURL, nErrorCode) { + var sOptions = ""; // "p"; + this.macro10 = new Macro10(match[2], addrLoad, sOptions, dbg, function doneMacro10(nErrorCode, sURL) { if (!nErrorCode) { - dbg.loadBin(macro10.getBin(), addrLoad); + dbg.loadBin(dbg.macro10.getBin(), addrLoad); } else { - dbg.println("error assembling " + sURL + ": (" + nErrorCode + ")"); + dbg.println("error (" + nErrorCode + ") processing " + sURL); } dbg.macro10 = null; }); diff --git a/modules/pdp10/lib/macro10.js b/modules/pdp10/lib/macro10.js index ccf2bed68..2a850a65f 100644 --- a/modules/pdp10/lib/macro10.js +++ b/modules/pdp10/lib/macro10.js @@ -76,35 +76,43 @@ var Fixup; * @class Macro10 * @property {string} sURL * @property {number} nAddr + * @property {string} sOptions * @property {DebuggerPDP10} dbg - * @property {function(Macro10,string,number)} done + * @property {function(...)} done + * @property {string} sText + * @property {number} iURL + * @property {Array.} asURLs */ class Macro10 { /** - * Macro10(sURL, nAddr, dbg, done) + * Macro10(sURL, nAddr, sOptions, dbg, done) * - * The done() callback is called after the resource has been loaded and parsed, with an error code - * indicating overall success or failure. The caller must use other methods to obtain further results. + * Requests the resource(s) specified by sURL; multiple resources can be requested by separating + * them with semicolons. * - * The callback is passed three parameters: + * The done() callback is called after the resource(s) have been loaded and parsed. The caller + * must use other methods to obtain further results (eg, getBin()). * - * done(macro10, sURL, nErrorCode) + * The callback includes a non-zero error code if there was an error (and the URL): * - * If nErrorCode is zero, the assembly process completed successfully. + * done(nErrorCode, sURL) * - * For access to basic services (eg, println()), we rely on the caller. This is NOT an extension of - * Component, so those services are NOT part of this class. + * We rely on the calling component (dbg) to provide a variety of helper services (eg, println(), + * parseExpression(), etc). This is NOT a subclass of Component, so Component services are not part + * of this class. * * @this {Macro10} - * @param {string} sURL (the URL of the resource to be assembled) + * @param {string} sURL (the URL(s) of the resource to be assembled) * @param {number|null} nAddr (the absolute address to assemble the code at, if any) - * @param {DebuggerPDP10} dbg (used to provide services like println() to the Macro10 class) - * @param {function(Macro10,string,number)} done + * @param {string} sOptions (zero or more letter codes to control the assembly process) + * @param {DebuggerPDP10} dbg (used to provide helper services to the Macro10 class) + * @param {function(...)} done */ - constructor(sURL, nAddr, dbg, done) + constructor(sURL, nAddr, sOptions, dbg, done) { this.sURL = sURL; this.nAddr = nAddr || 0; + this.sOptions = sOptions; this.dbg = dbg; this.done = done; @@ -174,8 +182,8 @@ class Macro10 { this.chMacroOpen = this.chMacroClose = ''; /** - * If an ASCII/ASCIZ/SIXBIT pseudo-op is active, chASCII is set to the separator and sASCII collects - * the intervening character(s). + * If an ASCII/ASCIZ/SIXBIT pseudo-op is active, chASCII is set to the separator + * and sASCII collects the intervening character(s). * * @type {null|string} */ @@ -186,12 +194,49 @@ class Macro10 { */ this.sASCII = ""; + this.sText = ""; + this.iURL = 0; + this.asURLs = sURL.split(';'); + this.loadNextResource(); + } + + /** + * loadNextResource() + * + * @this {Macro10} + */ + loadNextResource() + { + if (this.iURL == this.asURLs.length) { + this.done(this.parseFile()); + return; + } var macro10 = this; - Web.getResource(sURL, null, true, function processMacro10(sURL, sResource, nErrorCode) { - if (!nErrorCode) { - nErrorCode = macro10.parseFile(sURL, sResource); + Web.getResource(this.asURLs[this.iURL++], null, true, function processMacro10(sURL, sResource, nErrorCode) { + if (nErrorCode) { + macro10.done(nErrorCode, sURL); + return; } - macro10.done(macro10, sURL, nErrorCode); + var sText = sResource; + if (Str.endsWith(sURL, ".html")) { + /* + * We want to parse ONLY the text between
...
tags, and eliminate any HTML entities. + */ + sText = ""; + var match, re = /
([\s\S]*?)<\/pre>/gi;
+                while (match = re.exec(sResource)) {
+                    var s = match[1];
+                    if (s.indexOf('&') >= 0) s = s.replace(/</gi, '<').replace(/>/gi, '>').replace(/&/gi, '&');
+                    sText += s;
+                }
+                match = sText.match(/&[a-z]+;/i);
+                if (match) macro10.warning("unrecognized HTML entity: " + match[0]);
+            }
+            if (macro10.sText) macro10.sText += '\n';
+            macro10.sText += sText;
+            setTimeout(function() {
+                macro10.loadNextResource();
+            }, 0);
         });
     }
 
@@ -207,38 +252,29 @@ class Macro10 {
     }
 
     /**
-     * parseFile(sPath, sContents)
+     * parseFile()
      *
      * Begin the assembly process.
      *
      * @this {Macro10}
-     * @param {string} sPath
-     * @param {string} sContents
      * @return {number}
      */
-    parseFile(sPath, sContents)
+    parseFile()
     {
         var macro10 = this;
+
+        /*
+         * If the "preprocess" option is set, then just return the plain text we retrieved.
+         */
+        if (this.sOptions.indexOf('p') >= 0) {
+            this.dbg.println(this.sText);
+            return 0;
+        }
+
         var a = this.dbg.resetVariables();
         try {
-            var sText = sContents;
-            if (Str.endsWith(sPath, ".html")) {
-                /*
-                 * We want to parse ONLY the text between 
...
tags, and eliminate any HTML entities. - */ - sText = ""; - var match, re = /
([\s\S]*?)<\/pre>/gi;
-                while (match = re.exec(sContents)) {
-                    var s = match[1];
-                    if (s.indexOf('&') >= 0) s = s.replace(/</gi, '<').replace(/>/gi, '>').replace(/&/gi, '&');
-                    sText += s;
-                }
-                match = sText.match(/&[a-z]+;/i);
-                if (match) this.warning("unrecognized HTML entity: " + match[0]);
-            }
-
             var i;
-            var asLines = sText.split(/\r?\n/);
+            var asLines = this.sText.split(/\r?\n/);
             for (i = 0; i < asLines.length; i++) {
                 this.nLine++;
                 if (!this.parseLine(asLines[i] + '\r\n')) break;
diff --git a/versions/pdpjs/1.34.2/pdp10-dbg.js b/versions/pdpjs/1.34.2/pdp10-dbg.js
index d9f066ac2..b42594952 100644
--- a/versions/pdpjs/1.34.2/pdp10-dbg.js
+++ b/versions/pdpjs/1.34.2/pdp10-dbg.js
@@ -35,28 +35,28 @@ var ra={lc:0,Db:1,nc:2,oc:3,pc:4,qc:5,rc:6,sc:7,qb:8,tc:9,Eb:10,uc:11,vc:12,Fb:1
 ad:88,bd:89,Hb:90,"[":91,"\\":92,"]":93,"^":94,_:95,"`":96,cd:97,dd:98,ed:99,d:100,e:101,fd:102,kd:103,ld:104,md:105,nd:106,k:107,od:108,pd:109,n:110,qd:111,p:112,q:113,r:114,rd:115,t:116,td:117,ud:118,vd:119,x:120,y:121,z:122,"{":123,"|":124,"}":125,"~":126,Gb:127};
 function sa(a,b){var c;if(a){b||(b=10);var d=a.charAt(0),e=0a&&-1a&&(a+=Math.pow(b,c)),a>=Math.pow(b,c)&&(c=Math.ceil(Math.log(a)/Math.log(b))));if(null==a)for(;0=f?48:55),e=String.fromCharCode(f)+e;a=Math.trunc(a/b)}return(void 0===d?"":d)+e}
-function n(a,b,c){b?12"']/g,function(a){return Ba[a]})}function Ca(a,b){return(a+"                                        ").slice(0,b)}function Da(a){return String.prototype.trim?a.trim():a.replace(/^\s+|\s+$/g,"")}var Ba={"&":"&","<":"<",">":">",'"':""","'":"'"};function Ea(a,b,c){var d=0,e=a.length,f=0;for(c||(c=function(a,b){return a>b?1:a>1,h;h=c(b,a[g]);0a?"0":"")+a}var b=new Date;return b.getFullYear()+"-"+a(b.getMonth()+1)+"-"+a(b.getDate())+" "+a(b.getHours())+":"+a(b.getMinutes())+":"+a(b.getSeconds())}
 function Ga(a,b,c,d){c=void 0===c?!1:c;var e=0,f=null,g=null;if("object"==typeof resources&&(f=resources[a]))return d&&d(a,f,e),[f,e];if(c&&"function"==typeof resources)return resources(a,function(b,c){d&&d(a,b,c)}),g;var h=window.XMLHttpRequest?new window.XMLHttpRequest:new window.ActiveXObject("Microsoft.XMLHTTP");c&&(h.onreadystatechange=function(){4===h.readyState&&(f=h.responseText,200==h.status||!h.status&&f.length&&"file:"==(window?window.location.protocol:"file:")||(e=h.status||-1),d&&d(a,
-f,e))});if(b&&"object"==typeof b){var k="",m;for(m in b)b.hasOwnProperty(m)&&(k&&(k+="&"),k+=m+"="+encodeURIComponent(b[m]));k=k.replace(/%20/g,"+");h.open("POST",a,c);h.setRequestHeader("Content-type","application/x-www-form-urlencoded");h.send(k)}else h.open("GET",a,c),"bytes"==b&&h.overrideMimeType("text/plain; charset=x-user-defined"),h.send();c||(f=h.responseText,200!=h.status&&(e=h.status||-1),d&&d(a,f,e),g=[f,e]);return g}
-function Ma(a,b){var c,d={Y:null,U:null,ta:null,sa:null};if("["==b.charAt(0)||"{"==b.charAt(0))try{var e,f,g;if("<"==b.substr(0,1))throw Error(b);g=0>b.indexOf("0x")&&0>b.indexOf("0o")&&'["'!=b.substr(0,2)?JSON.parse(b.replace(/([a-z]+):/gm,'"$1":').replace(/\/\/[^\n]*/gm,"")):eval("("+b+")");d.ta=g.load;d.sa=g.exec;if(e=g.bytes)d.Y=e;else if(e=g.words)for(d.Y=Array(2*e.length),f=c=0;c>8&255;else if(e=g.longs)for(d.Y=Array(4*e.length),f=c=0;c>8&255,d.Y[f++]=e[c]>>16&255,d.Y[f++]=e[c]>>24&255;else(e=g.data)?d.Ia=e:d.Y=g;d.Y&&(d.Y.length?1==d.Y.length&&(r(d.Y[0]),d=null):(r("Empty resource: "+a),d=null));d.U=g.symbols}catch(h){r("Resource data error ("+a+"): "+h.message),d=null}else{e=[];b=b.replace(/\n/gm," ").replace(/ +$/,"").split(" ");for(c=0;cb.indexOf("0x")&&0>b.indexOf("0o")&&'["'!=b.substr(0,2)?JSON.parse(b.replace(/([a-z]+):/gm,'"$1":').replace(/\/\/[^\n]*/gm,"")):eval("("+b+")");d.ua=g.load;d.ta=g.exec;if(e=g.bytes)d.Y=e;else if(e=g.words)for(d.Y=Array(2*e.length),f=c=0;c>8&255;else if(e=g.longs)for(d.Y=Array(4*e.length),f=c=0;c>8&255,d.Y[f++]=e[c]>>16&255,d.Y[f++]=e[c]>>24&255;else(e=g.data)?d.Ja=e:d.Y=g;d.Y&&(d.Y.length?1==d.Y.length&&(r(d.Y[0]),d=null):(r("Empty resource: "+a),d=null));d.U=g.symbols}catch(h){r("Resource data error ("+a+"): "+h.message),d=null}else{e=[];b=b.replace(/\n/gm," ").replace(/ +$/,"").split(" ");for(c=0;ca?this.Ta=this.id:(this.Ua=this.id.substr(0,a),this.Ta=this.id.substr(a+1));this.A={ready:!1,Na:!1,hb:!1,V:!1,error:!1};this.Xa=null;this.A.error=!1;this.X=c||0;this.D=this.v=this.G=this.H=this.ua=null;kb.push(this)}function lb(a,b,c){mb[a]&&b&&(mb[a][b]=c)}function nb(){return Date.now()||+new Date}
+function u(a,b,c){this.type=a;b||(b={id:"",name:""});this.id=b.id||"";this.name=b.name;this.ob=b.comment;this.Kb=b;this.exports={};this.J=this.bindings={};a=this.id.indexOf(".");0>a?this.Ta=this.id:(this.Ua=this.id.substr(0,a),this.Ta=this.id.substr(a+1));this.A={ready:!1,Na:!1,hb:!1,V:!1,error:!1};this.Xa=null;this.A.error=!1;this.X=c||0;this.D=this.v=this.G=this.H=this.va=null;kb.push(this)}function lb(a,b,c){mb[a]&&b&&(mb[a][b]=c)}function nb(){return Date.now()||+new Date}
 function r(a){window&&window.alert(a)}function ob(a){var b=!1;window&&(b=window.confirm(a));return b}function pb(a){var b,c=[];a&&(a=0<(b=a.indexOf("."))?a.substr(0,b+1):"");for(b=0;ba;a++)this.b["S"+a]=[0,0,!1,!1,this.Vb,a];this.D=this.v=this.G=this.H=null;this.exports={hold:this.Nb,toggle:this.fc,reset:this.bc,
 set:this.ec};Kb(this)}pa($b,u);l=$b.prototype;l.reset=function(a){this.stop();a&&bc(this,this.w=0)};
-l.la=function(a,b,c,d){if(this.H&&this.H.la(a,b,c,d)||this.v&&this.v.la(a,b,c,d)||this.D&&this.D.la(a,b,c,d))return!0;switch(b){case "PC":return this.J[b]=c,this.L++,!0;default:return"led"==a||"rled"==a?(this.J[b]=c,this.C[b]=d?1:0,this.L++,!0):"switch"==a?(void 0===this.b[b]&&(this.b[b]=[d?1:0,d?1:0]),this.J[b]=c,a=c.parentElement||c,a=a.parentElement||a,a.onmousedown=function(a,b){return function(){cc(a,b)}}(this,b),a.onmouseup=a.onmouseout=function(a,b){return function(){dc(a,b)}}(this,b),a.ontouchstart=
-function(a,b){return function(c){cc(a,b);c.preventDefault()}}(this,b),a.ontouchend=function(a,b){return function(){dc(a,b)}}(this,b),!0):u.prototype.la.call(this,a,b,c,d)}};l.Ea=function(a,b,c,d){this.H=a;this.G=b;this.v=c;this.D=d;ec(this);fc(this)};l.va=function(a,b){if(!b)if(this.T&&gc(),!a)this.reset(!0);else if(!this.restore(a))return!1;return!0};l.ka=function(a){return a?this.save():!0};l.save=function(){var a=new G(this);a.set(0,[this.i,this.w,this.u]);return a.data()};
+l.ma=function(a,b,c,d){if(this.H&&this.H.ma(a,b,c,d)||this.v&&this.v.ma(a,b,c,d)||this.D&&this.D.ma(a,b,c,d))return!0;switch(b){case "PC":return this.J[b]=c,this.L++,!0;default:return"led"==a||"rled"==a?(this.J[b]=c,this.C[b]=d?1:0,this.L++,!0):"switch"==a?(void 0===this.b[b]&&(this.b[b]=[d?1:0,d?1:0]),this.J[b]=c,a=c.parentElement||c,a=a.parentElement||a,a.onmousedown=function(a,b){return function(){cc(a,b)}}(this,b),a.onmouseup=a.onmouseout=function(a,b){return function(){dc(a,b)}}(this,b),a.ontouchstart=
+function(a,b){return function(c){cc(a,b);c.preventDefault()}}(this,b),a.ontouchend=function(a,b){return function(){dc(a,b)}}(this,b),!0):u.prototype.ma.call(this,a,b,c,d)}};l.Fa=function(a,b,c,d){this.H=a;this.G=b;this.v=c;this.D=d;ec(this);fc(this)};l.wa=function(a,b){if(!b)if(this.T&&gc(),!a)this.reset(!0);else if(!this.restore(a))return!1;return!0};l.la=function(a){return a?this.save():!0};l.save=function(){var a=new G(this);a.set(0,[this.i,this.w,this.u]);return a.data()};
 l.restore=function(a){if(a=a[0])hc(this,this.i=a[0]),bc(this,this.w=a[1]),ic(this,a[2]);return!0};l.bc=function(){for(var a in this.b){var b=this.b[a];b[1]=b[0]}fc(this);return!0};function jc(a,b,c){if(a=a.J[b])a.style.backgroundColor=c?"#ff0000":"#000000"}function ec(a,b){for(var c in a.C)jc(a,c,null!=b?b:a.C[c])}function kc(a,b,c){if(a=a.J[b])a.style.marginTop=c?"0px":"20px",a.style.backgroundColor=c?"#00ff00":"#228B22"}function fc(a){for(var b in a.b)kc(a,b,a.b[b][1])}
 l.Nb=function(a,b,c){if(cc(this,b)){if(c){var d=this;setTimeout(function(){dc(d,b);a&&a()},+c);return!1}dc(this,b)}return!0};l.ec=function(a,b){if("SR"==a)return ic(this,sa(b,8));var c=this.b[a];return c?(c[1]=+b?1:0,kc(this,a,c[1]),!0):!1};l.fc=function(a){return cc(this,a)?(dc(this,a),!0):!1};function cc(a,b){var c=a.b[b];return c?(kc(a,b,c[1]=1-c[1]),c[3]=!0,c[4]&&c[4].call(a,c[1],c[5]),b!=lc&&(a.P=b==mc,a.R=b==nc),!0):!1}
 function dc(a,b){var c=a.b[b];c&&(c[2]&&c[3]&&(kc(a,b,c[1]=c[0]),c[4]&&c[4].call(a,c[1],c[5])),c[3]=!1)}l.Wb=function(a){a||this.v.A.N||(H(this.v,this.i),this.b[oc]&&this.b[oc][1]&&pc(this.v))};l.Xb=function(){};l.Rb=function(a){a||this.v.W()};
@@ -74,39 +74,39 @@ l.Pb=function(a){if(!a&&!this.v.A.N)if(this.b[oc]&&this.b[oc][1])pc(this.v);else
 l.Sb=function(a){if(!a&&!this.v.A.N){var b;this.R&&uc(this);this.S==ac?b=wc(this.G,this.i):b=this.v.f(this.i);bc(this,this.w=b)}};l.Ub=function(a){a||this.v.A.N||hc(this,this.u)};l.Tb=function(a){a?(this.F=!0,ec(this,!0)):(this.F=!1,ec(this),ic(this,0))};l.Vb=function(a,b){this.u=a?this.u|1<c;c++){var d=a,e="A"+c,f=b&1<c;c++){var d=a,e="D"+c,f=b&1<b;b++)a.b["S"+b][1]=a.u&1<d.length){for(var e=0,f=Array(4096),g=0;g>>a.i;0f&&(m=f);if(h&&h.size){if(h.type==d){if(e+f<=h.B)return h.Pa+=h.B-e,h.B=e,!0;if(e>=h.B+h.Pa){m=h.size-(e-k);m>f&&(m=f);h.Pa=e-h.B+m;e=k+16384;f-=m;g++;continue}}return Gc(Hc,e,f)}e=new yc(a,e,m,16384,d);Dc(e,a.D,h);a.b[g++]=e;e=k+16384;f-=m}return 0>=f?(a.status("Added "+(c>>10)+"Kb "+Ic[d]+" at "+n(b)),!0):Gc(Jc,b,c)}
-function wc(a,b){var c=a.b[(b&a.u)>>>a.i];a.w++;b=c.D(b&16383,b);a.w--;return b}function vc(a,b,c){var d=a.b[(b&a.u)>>>a.i];a.w++;d.w(c,b&16383,b);a.w--}function Ec(a){for(var b=0,c=[],d=0;dd.length){for(var e=0,f=Array(4096),g=0;g>>a.i;0f&&(n=f);if(h&&h.size){if(h.type==d){if(e+f<=h.B)return h.Pa+=h.B-e,h.B=e,!0;if(e>=h.B+h.Pa){n=h.size-(e-k);n>f&&(n=f);h.Pa=e-h.B+n;e=k+16384;f-=n;g++;continue}}return Gc(Hc,e,f)}e=new yc(a,e,n,16384,d);Dc(e,a.D,h);a.b[g++]=e;e=k+16384;f-=n}return 0>=f?(a.status("Added "+(c>>10)+"Kb "+Ic[d]+" at "+m(b)),!0):Gc(Jc,b,c)}
+function wc(a,b){var c=a.b[(b&a.u)>>>a.i];a.w++;b=c.D(b&16383,b);a.w--;return b}function vc(a,b,c){var d=a.b[(b&a.u)>>>a.i];a.w++;d.w(c,b&16383,b);a.w--}function Ec(a){for(var b=0,c=[],d=0;d=a.ha&&(a.ha+=a.ma,c=!0);0<=a.na&&a.na<=dd(a)&&(a.ma=a.na=-1,$c(a),a.W(),c=!0);c&&a.j(dd(a)+" cycles: checksum="+q(a.Aa))}}
-l.la=function(a,b,c){var d=this;switch(b){case "power":case "reset":return this.J[b]=c,!0;case "run":return this.J[b]=c,c.onclick=function(){var a;if(a=d.H)if(a=d.H,a.A.V)a=!0;else{var b=null,c,h=pb(a.id);for(c=0;ca.aa/a.ba?b=1:d=!0;a.ea=b;b=a.bb*a.ea;if(a.ba!=b){a.ba=b;b=a.ba.toFixed(2)+"Mhz";var e=a.J.setSpeed;e&&(e.textContent=b);a.j("target speed: "+b)}c&&a.H&&hd(a.H)}sc(a,a.M);a.M=0;a.L=nb();a.P=0;fd(a);return d}function id(a,b){for(var c=a.O.length-1;0<=c;c--){var d=a.O[c];0>d[0]||b>d[0]&&(b=d[0])}return b}function jd(a){for(var b=[],c=0;c=a.ia&&(a.ia+=a.na,c=!0);0<=a.oa&&a.oa<=dd(a)&&(a.na=a.oa=-1,$c(a),a.W(),c=!0);c&&a.j(dd(a)+" cycles: checksum="+q(a.Ba))}}
+l.ma=function(a,b,c){var d=this;switch(b){case "power":case "reset":return this.J[b]=c,!0;case "run":return this.J[b]=c,c.onclick=function(){var a;if(a=d.H)if(a=d.H,a.A.V)a=!0;else{var b=null,c,h=pb(a.id);for(c=0;ca.aa/a.ba?b=1:d=!0;a.fa=b;b=a.bb*a.fa;if(a.ba!=b){a.ba=b;b=a.ba.toFixed(2)+"Mhz";var e=a.J.setSpeed;e&&(e.textContent=b);a.j("target speed: "+b)}c&&a.H&&hd(a.H)}sc(a,a.M);a.M=0;a.L=nb();a.P=0;fd(a);return d}function id(a,b){for(var c=a.O.length-1;0<=c;c--){var d=a.O[c];0>d[0]||b>d[0]&&(b=d[0])}return b}function jd(a){for(var b=[],c=0;cd[0]||(d[0]-=b,0>=d[0]&&(d[0]=-1,d[1]()))}}function kd(a,b){var c=a.R-=a.S;a.S=0;b&&(a.R=0);return c}
-l.cc=function(){if(this.A.N){this.Va>=this.eb&&fd(this,!0);this.oa=0;this.za=nb();if(this.P){var a=this.za-this.P;a>this.cb&&(this.L+=a,this.L>this.za&&(this.L=this.za))}try{do{var b=id(this,this.A.La?1:this.Ca);try{this.Ra(b)}catch(e){if("number"!=typeof e)throw e;}b=kd(this,!0);this.oa+=b;this.M+=b;tc(this,b);rc(this,b);this.fa-=b;if(0>=this.fa){this.fa+=this.Ca;++this.fb>=ld&&(this.H&&I(this.H,void 0),this.fb=0);break}}while(this.A.N)}catch(e){this.W();this.H&&this.H.stop(nb(),dd(this));yb(this,
-e.stack||e.message);return}if(this.A.N){a=setTimeout;b=this.xb;this.P=nb();var c=this.cb;this.oa&&(c=Math.round(c*this.oa/this.Ca));var c=c-(this.P-this.za),d=this.P-this.L;d&&(this.aa=Math.round(this.M/(10*d))/100,864E5<=d&&(this.T=0,ed(this)));if(0>c||this.aac&&(this.L-=c),c=0;this.Va+=this.oa;this.P+=c;a(b,c)}}};
+l.cc=function(){if(this.A.N){this.Va>=this.eb&&fd(this,!0);this.pa=0;this.Aa=nb();if(this.P){var a=this.Aa-this.P;a>this.cb&&(this.L+=a,this.L>this.Aa&&(this.L=this.Aa))}try{do{var b=id(this,this.A.La?1:this.Da);try{this.Ra(b)}catch(e){if("number"!=typeof e)throw e;}b=kd(this,!0);this.pa+=b;this.M+=b;tc(this,b);rc(this,b);this.ga-=b;if(0>=this.ga){this.ga+=this.Da;++this.fb>=ld&&(this.H&&I(this.H,void 0),this.fb=0);break}}while(this.A.N)}catch(e){this.W();this.H&&this.H.stop(nb(),dd(this));yb(this,
+e.stack||e.message);return}if(this.A.N){a=setTimeout;b=this.xb;this.P=nb();var c=this.cb;this.pa&&(c=Math.round(c*this.pa/this.Da));var c=c-(this.P-this.Aa),d=this.P-this.L;d&&(this.aa=Math.round(this.M/(10*d))/100,864E5<=d&&(this.T=0,ed(this)));if(0>c||this.aac&&(this.L-=c),c=0;this.Va+=this.pa;this.P+=c;a(b,c)}}};
 function pc(a,b){if(!Ib(a))if(a.A.N)a.j(a.toString()+" busy");else{ed(a);a.A.N=!0;a.A.$a=!0;var c=a.J.run;c&&(c.textContent="Halt");a.H&&(b&&hd(a.H,!0),a.H.start(a.L,dd(a)));a.D||a.status("Started");setTimeout(a.xb,0)}}l.Ra=function(){return 0};l.W=function(a){var b=!1;if(this.A.N){kd(this);sc(this,this.M);this.M=0;this.A.N=!1;if(b=this.J.run)b.textContent="Run";this.H&&this.H.stop(nb(),dd(this));b=!0;this.D||this.status("Stopped")}this.A.complete=a;return b};var gd=30,ld=15,Xc=["power","reset"];
-function md(a){var b=+a.model||1001;Wc.call(this,a,1E6);this.wb=b;this.Sa=+a.addrReset||0;this.Jb=nd.bind(this);this.w=K.bind(this);this.xa=null;this.sb=[];this.A.complete=!1}pa(md,Wc);l=md.prototype;l.reset=function(){this.status("Model "+this.wb);this.A.N&&this.W();this.b=this.K=this.Da=0;this.i=this.ya=this.Sa;this.I=this.ra=-1;this.F=this.u=0;this.gb=[0,0];this.pa=[0,0];this.ga=[0,0];this.qa=[0,0];this.wa=this.i;this.C=0;this.f=this.Zb;this.g=this.jc;this.xa=null;Zc(this);this.A.error=!1;Wc.prototype.reset.call(this)};
-l.Bb=function(){return 0};l.save=function(){var a=new G(this);a.set(0,[this.b,this.K,this.Da,this.i,this.ra,this.I,this.u,this.C,this.ya,this.wa,this.Sa]);a.set(1,[]);a.set(2,[this.T,this.ea,this.A.Z]);a.set(3,od(this));a.set(4,jd(this));return a.data()};
-l.restore=function(a){var b;b=a[0];ha();ca();ha();var c=b[Symbol.iterator];b=c?c.call(b):ja(b);this.b=b.next().value;this.K=b.next().value;this.Da=b.next().value;this.i=b.next().value;this.ra=b.next().value;this.I=b.next().value;this.u=b.next().value;this.C=b.next().value;this.ya=b.next().value;this.wa=b.next().value;this.Sa=b.next().value;b=a[2];this.T=b[0];ed(this,b[1]);this.A.Z=b[2];b=a[3];for(c=b.length-1;0<=c;c--){var d;a:{for(d=0;d>>b.i].f(a&16383,a)};l.jc=function(a,b){var c=this.G;a=this.wa=a;c.b[(a&c.u)>>>c.i].g(b,a&16383,a);return b};
-l.Ra=function(a){this.A.complete=!0;var b=this.D?qd(this.D)?1:this.A.$a?-1:0:0,c=a?this.A.$a?0:1:-1;this.A.$a=!1;this.R=this.S=a;this.C=this.C&-5|(b?4:0);do{if(this.C){if(this.C&4){if(rd(this.D,this.i,c)){this.W();break}++b||(this.C&=-5);c||c++}if(a=this.C&11)this.C&2?this.xa||(this.C&=-3):this.C&1&&this.C++,a=!1;if(a){if(this.C&4&&rd(this.D,this.i,c)){this.W();break}if(0>c)break}}this.C&=15;this.K&4194304?this.K=this.f(this.b):0<=this.ra?(this.K=this.Da=this.f(this.ra),this.ra=-1):(this.K=this.Da=
-this.f(this.ya=this.i),this.i=(this.i+1)%Rb);this.K&=8388607;this.b=this.K&262143;if(a=this.K>>18&15)this.b=this.b+this.f(a)&Qb;a=this.K&4194304?-1:this.Da/Xb|0;0<=a&&this.Jb(a)}while(0>4].call(this,a,a&15)}function M(a){this.w(a)}
+function md(a){var b=+a.model||1001;Wc.call(this,a,1E6);this.wb=b;this.Sa=+a.addrReset||0;this.Jb=nd.bind(this);this.w=K.bind(this);this.ya=null;this.sb=[];this.A.complete=!1}pa(md,Wc);l=md.prototype;l.reset=function(){this.status("Model "+this.wb);this.A.N&&this.W();this.b=this.K=this.Ea=0;this.i=this.za=this.Sa;this.I=this.sa=-1;this.F=this.u=0;this.gb=[0,0];this.qa=[0,0];this.ha=[0,0];this.ra=[0,0];this.xa=this.i;this.C=0;this.f=this.Zb;this.g=this.jc;this.ya=null;Zc(this);this.A.error=!1;Wc.prototype.reset.call(this)};
+l.Bb=function(){return 0};l.save=function(){var a=new G(this);a.set(0,[this.b,this.K,this.Ea,this.i,this.sa,this.I,this.u,this.C,this.za,this.xa,this.Sa]);a.set(1,[]);a.set(2,[this.T,this.fa,this.A.Z]);a.set(3,od(this));a.set(4,jd(this));return a.data()};
+l.restore=function(a){var b;b=a[0];ha();ca();ha();var c=b[Symbol.iterator];b=c?c.call(b):ja(b);this.b=b.next().value;this.K=b.next().value;this.Ea=b.next().value;this.i=b.next().value;this.sa=b.next().value;this.I=b.next().value;this.u=b.next().value;this.C=b.next().value;this.za=b.next().value;this.xa=b.next().value;this.Sa=b.next().value;b=a[2];this.T=b[0];ed(this,b[1]);this.A.Z=b[2];b=a[3];for(c=b.length-1;0<=c;c--){var d;a:{for(d=0;d>>b.i].f(a&16383,a)};l.jc=function(a,b){var c=this.G;a=this.xa=a;c.b[(a&c.u)>>>c.i].g(b,a&16383,a);return b};
+l.Ra=function(a){this.A.complete=!0;var b=this.D?qd(this.D)?1:this.A.$a?-1:0:0,c=a?this.A.$a?0:1:-1;this.A.$a=!1;this.R=this.S=a;this.C=this.C&-5|(b?4:0);do{if(this.C){if(this.C&4){if(rd(this.D,this.i,c)){this.W();break}++b||(this.C&=-5);c||c++}if(a=this.C&11)this.C&2?this.ya||(this.C&=-3):this.C&1&&this.C++,a=!1;if(a){if(this.C&4&&rd(this.D,this.i,c)){this.W();break}if(0>c)break}}this.C&=15;this.K&4194304?this.K=this.f(this.b):0<=this.sa?(this.K=this.Ea=this.f(this.sa),this.sa=-1):(this.K=this.Ea=
+this.f(this.za=this.i),this.i=(this.i+1)%Rb);this.K&=8388607;this.b=this.K&262143;if(a=this.K>>18&15)this.b=this.b+this.f(a)&Qb;a=this.K&4194304?-1:this.Ea/Xb|0;0<=a&&this.Jb(a)}while(0>4].call(this,a,a&15)}function M(a){this.w(a)}
 function td(){var a=0,b=this.f(this.b),c=b/Yb&63,d=b>>24&63,c=c-d;0>c&&(a++,c=36-d,0>c&&(c=64-d));b=c*Yb+(d<<24)+(b&16777215);a&&(b=(b+a)%E);this.g(this.b,b)}function ud(a,b){a=this.f(this.b);if(0>this.I)this.I=a,this.K=this.b|4194304;else{var c=this.I/Yb&63,d=this.I>>24&63;a=32>=c+d?(a>>c&(1<>>0:Math.trunc(a/Math.pow(2,c))%Math.pow(2,d);this.g(b,a);this.I=-1}}
 function vd(a,b){a=this.f(this.b);if(0>this.I)this.I=a,this.K=this.b|4194304;else{var c=this.I/Yb&63,d=this.I>>24&63;b=this.f(b)%Math.pow(2,d)*Math.pow(2,c)%E;a=a-a%Math.pow(2,c+d)+b+a%Math.pow(2,c);this.g(this.b,a);this.I=-1}}function wd(a,b){this.g(b,this.f(this.b))}function xd(a,b){this.g(b,this.b)}function yd(a,b){this.g(this.b,this.f(b))}function zd(a,b){this.g(b,0)}function Ad(a,b){this.g(b,C-this.f(b))}function Td(a,b){this.g(b,C)}
 function Ud(a,b){var c=this.f(this.b),d=this.f(b);this.g(b,Vd(a,d,c)+(c-(c&y)))}function Wd(a,b){var c=this.f(b);this.g(b,Vd(a,c,0))}function Xd(a,b){b=this.f(b);var c=this.f(this.b);this.g(this.b,Vd(a,c,b)+(b-(b&y)))}function Yd(a,b){var c=this.f(this.b),d=c;if(a&=384)switch(d-=d&y,a){case 256:d+=y;break;case 384:d+=c>A?y:0}c=d;this.g(this.b,c);b&&this.g(b,c)}function Zd(a,b){var c=(this.f(this.b)&y)*z,d=this.f(b);this.g(b,Vd(a,d,c)+c)}
 function $d(a,b){var c=this.b*z,d=this.f(b);this.g(b,Vd(a,d,c)+c)}function ae(a,b){b=(this.f(b)&y)*z;var c=this.f(this.b);this.g(this.b,Vd(a,c,b)+b)}function be(a,b){var c=this.f(this.b),d=(c&y)*z,c=Vd(a,c,d)+d;this.g(this.b,c);b&&this.g(b,c)}function ce(a,b){var c=this.f(this.b)&y,d=this.f(b);this.g(b,de(a,d,c)+c)}function ee(a,b){var c=this.f(b);this.g(b,de(a,c,this.b)+this.b)}function fe(a,b){b=this.f(b)&y;var c=this.f(this.b);this.g(this.b,de(a,c,b)+b)}
 function ge(a,b){var c=this.f(this.b),d=c;if(a&=384)switch(d&=y,a){case 256:d+=y*z;break;case 384:d+=c>Sb?y*z:0}c=d;this.g(this.b,c);b&&this.g(b,c)}function he(a,b){var c=this.f(this.b)/z|0,d=this.f(b);this.g(b,de(a,d,c)+c)}function ie(a,b){var c=this.f(b);this.g(b,de(a,c,0))}function je(a,b){b=this.f(b)/z|0;var c=this.f(this.b);this.g(this.b,de(a,c,b)+b)}function ke(a,b){var c=this.f(this.b),d=c/z|0,c=de(a,c,d)+d;this.g(this.b,c);b&&this.g(b,c)}function N(a){le[a&7].call(this,a,a>>3&127)}
-function me(){}function ne(){}function K(a){this.j("undefined opcode: "+n(a));pd(this,-1);this.W()}function oe(a){a>A&&(a!=B?a=Ub-a:this.u|=163840);return a}function O(a,b){var c=(a+b)%E;pe.call(this,a,b,c);return c}
-function qe(a,b,c){var d=!1,e=!1,f=b-b%B;a=a%B+b*B%E;b=this.F=f+Math.trunc(b/2);c>A&&(c=E-c,d=!d);b>A&&(a?(b=C-b,a=E-a):b&&(b=E-b),e=!0,d=!d);if(b>=c)return this.u|=131104,-1;f=this.gb;f[0]=0;f[1]=0;f=this.pa;f[0]=1;f[1]=0;f=this.ga;f[0]=c;f[1]=0;c=this.qa;c[0]=a;for(c[1]=b;0b[0]&&(b[0]+=E,b[1]--),se(this.gb,this.pa),te(this.qa)))break;ue(this.ga);ue(this.pa)}while(!te(this.pa));
-a=this.gb[0];this.F=this.qa[0];d&&a&&(a=E-a);e&&this.F&&(this.F=E-this.F);return a}
+function me(){}function ne(){}function K(a){this.j("undefined opcode: "+m(a));pd(this,-1);this.W()}function oe(a){a>A&&(a!=B?a=Ub-a:this.u|=163840);return a}function O(a,b){var c=(a+b)%E;pe.call(this,a,b,c);return c}
+function qe(a,b,c){var d=!1,e=!1,f=b-b%B;a=a%B+b*B%E;b=this.F=f+Math.trunc(b/2);c>A&&(c=E-c,d=!d);b>A&&(a?(b=C-b,a=E-a):b&&(b=E-b),e=!0,d=!d);if(b>=c)return this.u|=131104,-1;f=this.gb;f[0]=0;f[1]=0;f=this.qa;f[0]=1;f[1]=0;f=this.ha;f[0]=c;f[1]=0;c=this.ra;c[0]=a;for(c[1]=b;0b[0]&&(b[0]+=E,b[1]--),se(this.gb,this.qa),te(this.ra)))break;ue(this.ha);ue(this.qa)}while(!te(this.qa));
+a=this.gb[0];this.F=this.ra[0];d&&a&&(a=E-a);e&&this.F&&(this.F=E-this.F);return a}
 function ve(a,b,c){var d=a,e=b;b=!1;var f;d>A&&(d=E-d,b=!b);e>A&&(e=E-e,b=!b);if(dA)&&(f!=C||a<=A)&&(this.u|=131072),a;c=a;b=f;a=b-b%B;b=2*b%E+Math.trunc(c/B);c=a+c%B;d=b-b%B;a!=d&&(b=a+(b-d),this.u|=131072);this.F=c;return b}
 function we(a){a?a==B?this.u|=163840:a=Ub-a:this.u|=98304;return a}function P(a,b){var c=a-b;0>c&&(c+=E);pe.call(this,c,b,a);return c}function pe(a,b,c){a=Math.trunc(a/Tb);b=Math.trunc(b/Tb);c=Math.trunc(c/Tb);var d=a^(a^b)&(b^c);this.u=this.u|(d&2?65536:0)|(d&1?32768:0)|((a^c)&(b^c)&2?131072:0)}function Q(a,b){return((a/F|0)&(b/F|0))*F+((a&b)>>>0)}function R(a,b){return Q(a,(~(b/F|0)&15)*F+(~b>>>0))}function S(a,b){return(a>>0)}function T(a,b){return(a/F|0|b/F|0)*F+((a|b)>>>0)}function U(a){return a>>0)}function W(a){return(a/z|0)+(a&y)*z}function de(a,b,c){switch(a&384){case 0:b-=b&y;break;case 128:b=0;break;case 256:b=y*z;break;case 384:b=c>Sb?y*z:0}return b}function Vd(a,b,c){switch(a&384){case 0:b&=y;break;case 128:b=0;break;case 256:b=y;break;case 384:b=c>A?y:0}return b}
@@ -122,7 +122,7 @@ this.g(b,a)}},function(a,b){if(a=(this.b<<14>>14)%36){var c=this.f(b);0>a&&(a=36
 dA&&eA&&(this.u|=131072):e-c<=A&&(this.u|=131072);e=0;f>A&&(d+=B,e+=B)}else d=d*Math.pow(2,a)%B+Math.trunc(e%B/Math.pow(2,35-a)),e=e*Math.pow(2,a)%B,c=B-Math.pow(2,35-a),f<=A?f+c>A&&(this.u|=131072):(f-c<=A&&(this.u|=131072),d+=B,e+=B)}else-36>=a?(e=-72>=a?d>A?C:0:Math.trunc(d%B/Math.pow(2,-a-35)),d<=A?d=0:(d=C,e+=B)):(c=d>A?E-Math.pow(2,36+a):0,e=Math.trunc(e%B/Math.pow(2,-a))+
 d%B*Math.pow(2,35+a)%B,d=Math.trunc(d/Math.pow(2,-a))+c,d>A&&(e+=B));this.g(b,d);this.g(b+1&15,e)}},function(a,b){if(a=(this.b<<14>>14)%72){var c=this.f(b),d=this.f(b+1&15),e=c;0>a&&(a=72+a);36>a?(c=c*Math.pow(2,a)%E+Math.trunc(d/Math.pow(2,36-a)),d=d*Math.pow(2,a)%E+Math.trunc(e/Math.pow(2,36-a))):(c=d*Math.pow(2,a-36)%E+Math.trunc(c/Math.pow(2,72-a)),d=e*Math.pow(2,a-36)%E+Math.trunc(d/Math.pow(2,72-a)));this.g(b,c);this.g(b+1&15,d)}},function(a,b){if(a=(this.b<<14>>14)%256){var c=this.f(b),d=this.f(b+
 1&15);0=a?(d=-72>=a?0:Math.trunc(c/Math.pow(2,-a-36)),c=0):(d=Math.trunc(d/Math.pow(2,-a))+c*Math.pow(2,36+a)%E,c=Math.trunc(c/Math.pow(2,-a)));this.g(b,c);this.g(b+1&15,d)}},K,function(a,b){a=this.f(b);this.g(b,this.f(this.b));this.g(this.b,a)},function(a,b){a=!1;for(var c=this.f(b),d=c/z|0,c=c&y;!a;)this.g(c,this.f(d)),c==this.b&&(a=!0),d=d+1&y,c=c+1&y,this.A.N||(this.g(b,d*
-z+c),a||pd(this,-1),a=!0)},function(a,b){a=(this.f(b)+262145)%C;this.g(b,a);a=B&&H(this,this.b)},function(a){this.w(a)},function(a,b){a=b<<14;this.u&a&&(this.u&=~a,H(this,this.b))},function(){this.ra=this.b},K,function(a){this.w(a)},function(a,b){a=this.f(b);a+=262145;this.g(a&y,this.f(this.b));a>=E&&(a-=E);a/z|0||(this.u|=262144);this.g(b,a)},function(a,b){a=this.f(b);var c=this.f(a&y);this.g(this.b,c);this.b==b&&(a=c);a-=262145;
+z+c),a||pd(this,-1),a=!0)},function(a,b){a=(this.f(b)+262145)%C;this.g(b,a);a=B&&H(this,this.b)},function(a){this.w(a)},function(a,b){a=b<<14;this.u&a&&(this.u&=~a,H(this,this.b))},function(){this.sa=this.b},K,function(a){this.w(a)},function(a,b){a=this.f(b);a+=262145;this.g(a&y,this.f(this.b));a>=E&&(a-=E);a/z|0||(this.u|=262144);this.g(b,a)},function(a,b){a=this.f(b);var c=this.f(a&y);this.g(this.b,c);this.b==b&&(a=c);a-=262145;
 0>a&&(a+=E);(a/z|0)==y&&(this.u|=262144);this.g(b,a)},function(a){this.w(a)},function(){this.g(this.b,(this.u&y)*z+this.i);H(this,this.b+1)},function(a,b){this.g(b,(this.u&y)*z+this.i);H(this,this.b)},function(a){this.w(a)},function(a){this.w(a)},function(a,b){this.g(b,O.call(this,this.f(b),this.f(this.b)))},function(a,b){this.g(b,O.call(this,this.f(b),this.b))},function(a,b){this.g(this.b,O.call(this,this.f(b),this.f(this.b)))},function(a,b){this.g(this.b,this.g(b,O.call(this,this.f(b),this.f(this.b))))},
 function(a,b){this.g(b,P.call(this,this.f(b),this.f(this.b)))},function(a,b){this.g(b,P.call(this,this.f(b),this.b))},function(a,b){this.g(this.b,P.call(this,this.f(b),this.f(this.b)))},function(a,b){this.g(this.b,this.g(b,P.call(this,this.f(b),this.f(this.b))))},me,function(a,b){0>S(this.f(b),this.b)&&H(this,this.i+1)},function(a,b){S(this.f(b),this.b)||H(this,this.i+1)},function(a,b){0>=S(this.f(b),this.b)&&H(this,this.i+1)},function(){H(this,this.i+1)},function(a,b){0<=S(this.f(b),this.b)&&H(this,
 this.i+1)},function(a,b){S(this.f(b),this.b)&&H(this,this.i+1)},function(a,b){0S(this.f(b),this.f(this.b))&&H(this,this.i+1)},function(a,b){S(this.f(b),this.f(this.b))||H(this,this.i+1)},function(a,b){0>=S(this.f(b),this.f(this.b))&&H(this,this.i+1)},function(){H(this,this.i+1)},function(a,b){0<=S(this.f(b),this.f(this.b))&&H(this,this.i+1)},function(a,b){S(this.f(b),this.f(this.b))&&H(this,this.i+1)},function(a,b){0>>f.i;0>>=
 f.i;0>>a.i;0g&&g>=-B&&(g+=E);for(var g=Math.trunc(Math.abs(g))%E,h=d;f--&&h=ra.pb&&c<=ra.Hb&&(b=c-(ra.pb-ra.Db));b&&(a.preventDefault&&a.preventDefault(),d.Ya(b));return!0},c.onkeypress=function(a){a=a||window.event;if(!a.metaKey){var b=a.which||a.keyCode;a.altKey&&b==ra.Fb&&(b=ra.Eb);d.Ya(b);a.preventDefault&&a.preventDefault()}return!0},c.onpaste=function(a){a.stopPropagation&&a.stopPropagation();
-a.preventDefault&&a.preventDefault();(a=a.clipboardData||window.clipboardData)&&d.Ya(a.getData("Text"))},c.removeAttribute("readonly"),!0}return!1};l.Ea=function(a,b,c,d){this.H=a;this.G=b;this.v=c;this.D=d;Kb(this)};
-l.Cb=function(a){if(!this.b){var b=Yc(this.H,"connection");if(b){var c=b.split("->");if(2==c.length){var d=Da(c[0]);if(d!=this.Ta)return;c=Da(c[1]);if(this.b=qb(c)){var e=this.b.exports;if(e){var f=e.connect;f&&f.call(this.b,this.u);if(this.C=e.receiveData){this.u=a;this.status("Connected "+this.Ua+"."+d+" to "+c);return}}}}this.status("Unable to establish connection: "+b)}}};l.va=function(a,b){if(!b)if(this.Cb(this.u),!a)this.reset();else if(!this.restore(a))return!1;return!0};
-l.ka=function(a){return a?this.save():!0};l.reset=function(){};l.save=function(){var a=new G(this);a.set(0,[]);return a.data()};l.restore=function(){return!0};l.Ya=function(a){if("number"==typeof a)this.i.push(a);else if("string"==typeof a)for(var b=0,c,d=0;d>>a.i;0g&&g>=-B&&(g+=E);for(var g=Math.trunc(Math.abs(g))%E,h=d;f--&&h=ra.pb&&c<=ra.Hb&&(b=c-(ra.pb-ra.Db));b&&(a.preventDefault&&a.preventDefault(),d.Ya(b));return!0},c.onkeypress=function(a){a=a||window.event;if(!a.metaKey){var b=a.which||a.keyCode;a.altKey&&b==ra.Fb&&(b=ra.Eb);d.Ya(b);a.preventDefault&&a.preventDefault()}return!0},c.onpaste=function(a){a.stopPropagation&&a.stopPropagation();
+a.preventDefault&&a.preventDefault();(a=a.clipboardData||window.clipboardData)&&d.Ya(a.getData("Text"))},c.removeAttribute("readonly"),!0}return!1};l.Fa=function(a,b,c,d){this.H=a;this.G=b;this.v=c;this.D=d;Kb(this)};
+l.Cb=function(a){if(!this.b){var b=Yc(this.H,"connection");if(b){var c=b.split("->");if(2==c.length){var d=Da(c[0]);if(d!=this.Ta)return;c=Da(c[1]);if(this.b=qb(c)){var e=this.b.exports;if(e){var f=e.connect;f&&f.call(this.b,this.u);if(this.C=e.receiveData){this.u=a;this.status("Connected "+this.Ua+"."+d+" to "+c);return}}}}this.status("Unable to establish connection: "+b)}}};l.wa=function(a,b){if(!b)if(this.Cb(this.u),!a)this.reset();else if(!this.restore(a))return!1;return!0};
+l.la=function(a){return a?this.save():!0};l.reset=function(){};l.save=function(){var a=new G(this);a.set(0,[]);return a.data()};l.restore=function(){return!0};l.Ya=function(a){if("number"==typeof a)this.i.push(a);else if("string"==typeof a)for(var b=0,c,d=0;da.w&&a.u.length&&(a.w=0);if(0>a.w||b!=a.u[a.w])a.u.splice(0,0,b),a.w=0;a.w--}else a.R?b="end":b=a.u[a.w+1];a=[];if(b){b=b.replace(/""/g,"'");c=0;var e=null;d=d||";";for(var f=0;f<=b.length;f++){var g=b.charAt(f);if('"'==g||"'"==g)e?g==e&&(e=null):e=g;else if(g==d&&!e||!g)a.push(Da(b.substring(c,f))),c=f+1}}return a}
-function Ie(a,b,c,d){var e=b;c=c||a.ea;if(d)if(32==c)e=b>>>0;else if(32>c)e=b&(1<b||b>=a)e=b%a,0>e&&(e+=a)}else if(32>=c)e=b|0;else if(a=Math.pow(2,c-1),b<-a||b>=a)e=b%a;b!=e&&(b=e);return b}
+function Ie(a,b,c,d){var e=b;c=c||a.fa;if(d)if(32==c)e=b>>>0;else if(32>c)e=b&(1<b||b>=a)e=b%a,0>e&&(e+=a)}else if(32>=c)e=b|0;else if(a=Math.pow(2,c-1),b<-a||b>=a)e=b%a;b!=e&&(b=e);return b}
 function Je(a,b,c,d){for(d=void 0===d?-1:d;d--&&c.length;){var e=c.pop();if(2>b.length)return!1;var f=b.pop(),g=b.pop();switch(e){case "*":e=g*f;break;case "/":if(!f)return!1;e=g/f;break;case "%":if(!f)return!1;e=g%f;break;case "+":e=g+f;break;case "-":e=g-f;break;case "<<":e=g<>":e=g>>f;break;case ">>>":e=g>>>f;break;case "<":e=g":e=g>f?1:0;break;case ">=":e=g>=f?1:0;break;case "==":e=g==f?1:0;break;case "!=":e=g!=f?1:0;break;case "&":e=
-32>=a.ea?g&f:((g/Ke|0)&(f/Ke|0))*Ke+((g&f)>>>0);break;case "!":case "|":e=32>=a.ea?g|f:(g/Ke|0|f/Ke|0)*Ke+((g|f)>>>0);break;case "^^":e=g^f;break;case "&&":e=g&&f?1:0;break;case "||":e=g||f?1:0;break;default:return!1}b.push(Ie(a,e,a.ea))}return!0}
-function X(a,b,c){var d;b&&(b=Le(a,b));if(b){for(var e=0,f=!1,g=b,h=[],k=[],m=b.split(/(\|\||&&|\||^^|&|!=|!|==|>=|>>>|>>|>|<=|<<|<|-|\+|%|\/|\*)/);e=a.fa?g&f:((g/Ke|0)&(f/Ke|0))*Ke+((g&f)>>>0);break;case "!":case "|":e=32>=a.fa?g|f:(g/Ke|0|f/Ke|0)*Ke+((g|f)>>>0);break;case "^^":e=g^f;break;case "&&":e=g&&f?1:0;break;case "||":e=g||f?1:0;break;default:return!1}b.push(Ie(a,e,a.fa))}return!0}
+function X(a,b,c){var d;b&&(b=Le(a,b));if(b){for(var e=0,f=!1,g=b,h=[],k=[],n=b.split(/(\|\||&&|\||^^|&|!=|!|==|>=|>>>|>>|>|<=|<<|<|-|\+|%|\/|\*)/);e>=1,da--;g=t+g;d>>=8}d=q(c,0,!0)+" "+c+". "+n(c,0,!0)+" "+("0b"+g);32<=c&&127>c&&(d+=" '"+String.fromCharCode(c)+"'")}a.j((null!=b?b+": ":"")+d);return e}function Pe(a){var b=a.K;a.K={};return b}
-function Qe(a,b){if(b)return Oe(a,b,a.K[b]);var c=0;for(b in a.K)Oe(a,b,a.K[b]),c++;return 0>2:0)}0>c?c=a.replace(/^0+([0-9A-F]+)$/i,"$1"):c=a;return c}var Ne={"||":0,"&&":1,"!":2,"|":2,"^^":3,"&":4,"!=":5,"==":5,">=":6,">":6,"<=":6,"<":6,">>>":7,">>":7,"<<":7,"-":8,"+":8,"%":9,"/":9,"*":9},Ke=Math.pow(2,32);
-function Re(a){Ge.call(this,a);this.Ba=!1;this.za=18;this.ea=36;this.oa=["<",">"];this.na=[];this.Aa=Y();this.L=Y(0);this.ma=Y(0);this.ba=Y(0);this.F=[];this.b=this.M=this.I=[];Se(this);this.S=this.ha=0;this.i=[];this.wa=void 0;Te(this);this.D=this;this.pa={};this.X=this.yb=0;this.T=null;this.P=[];Ue(this,a.messages);this.ya=a.commands;this.O=0;this.Ha=this.xa=null;this.C=this.Da=this.Ca=this.ga=this.ra=0;this.qa=this.fa=this.aa=null;var b=this;window?void 0===window[w]&&(window[w]=function(a){return cd(b,
-a)}):void 0===global[w]&&(global[w]=function(a){return cd(b,a)})}pa(Re,Ge);function Ve(a){a=a&&a.B;null==a&&(a=-1);return a}function Y(a,b,c){return{B:void 0===a?null:a,Wa:void 0===b?!1:b,ia:!1,ca:c}}function We(a,b,c,d){a.B=b;a.Wa=c||!1;a.ia=!1;a.ca=d}function Xe(a){return[a.B,a.Wa,a.ia,a.ca,a.Za]}function Ye(a,b){var c=Y(b[0],b[1],b[2]);c.ia=b[3];b[4]&&(c.tb=He(a,c.Za=b[4]));return c}l=Re.prototype;
-l.Ea=function(a,b,c,d){this.G=b;this.H=a;this.v=c;this.fa=a.u;this.za=b.F;(a=Yc(a,"messages"))&&Ue(this,a);Ze(this,function(a){a:{var b=d.G.b,c=a[0],e=a=0,k=b.length;if(c){a=Ve($e(d,c,d.ma));if(-1===a){d.j("invalid address: "+c);break a}e=a>>>d.G.i;k=1}d.j("blockid   physical   blockaddr  used    size    type");d.j("--------  ---------  ---------  ------  ------  ----");for(var c=-1,m=0;k--;){var p=b[e];p.type==c?m++||d.j("..."):(c=p.type,m=Ic[c],p&&d.j(q(p.id,8)+"  %"+q(e<a&&a>=-B&&(a+=E);return Math.trunc(Math.abs(a))%Math.pow(2,void 0===b?36:b)}function cf(a){return n(a/Rb,6)+" "+n(a%Rb,6)}
-function Ue(a,b){a.D=a;a.X=a.yb=536870916;a.T=null;a.P=[];b=He(a,b.replace("keys","key").replace("kbd","keyboard"),!1,"|");if(b.length)for(var c in Zb){var d;a:if(d=void 0,Array.prototype.indexOf)d=b.indexOf(c,d);else{d=d||0;0>d&&(d+=b.length);0>d&&(d=0);for(var e=b.length;d>=1,da--;g=t+g;d>>=8}d=q(c,0,!0)+" "+c+". "+m(c,0,!0)+" "+("0b"+g);32<=c&&127>c&&(d+=" '"+String.fromCharCode(c)+"'")}a.j((null!=b?b+": ":"")+d);return e}function Pe(a){var b=a.K;a.K={};return b}
+function Qe(a,b){if(b)return Oe(a,b,a.K[b]);var c=0;for(b in a.K)Oe(a,b,a.K[b]),c++;return 0>2:0)}0>c?c=a.replace(/^0+([0-9A-F]+)$/i,"$1"):c=a;return c}var Ne={"||":0,"&&":1,"!":2,"|":2,"^^":3,"&":4,"!=":5,"==":5,">=":6,">":6,"<=":6,"<":6,">>>":7,">>":7,"<<":7,"-":8,"+":8,"%":9,"/":9,"*":9},Ke=Math.pow(2,32);
+function Re(a){Ge.call(this,a);this.Ca=!1;this.Aa=18;this.fa=36;this.qa=["<",">"];this.oa=[];this.Ba=Y();this.L=Y(0);this.na=Y(0);this.ba=Y(0);this.F=[];this.b=this.M=this.I=[];Se(this);this.S=this.ia=0;this.i=[];this.xa=void 0;Te(this);this.D=this;this.ra={};this.X=this.yb=0;this.T=null;this.P=[];Ue(this,a.messages);this.za=a.commands;this.O=0;this.Ia=this.ya=null;this.C=this.Ea=this.Da=this.ha=this.sa=0;this.pa=this.ga=this.aa=null;var b=this;window?void 0===window[w]&&(window[w]=function(a){return cd(b,
+a)}):void 0===global[w]&&(global[w]=function(a){return cd(b,a)})}pa(Re,Ge);function Ve(a){a=a&&a.B;null==a&&(a=-1);return a}function Y(a,b,c){return{B:void 0===a?null:a,Wa:void 0===b?!1:b,ja:!1,ca:c}}function We(a,b,c,d){a.B=b;a.Wa=c||!1;a.ja=!1;a.ca=d}function Xe(a){return[a.B,a.Wa,a.ja,a.ca,a.Za]}function Ye(a,b){var c=Y(b[0],b[1],b[2]);c.ja=b[3];b[4]&&(c.tb=He(a,c.Za=b[4]));return c}l=Re.prototype;
+l.Fa=function(a,b,c,d){this.G=b;this.H=a;this.v=c;this.ga=a.u;this.Aa=b.F;(a=Yc(a,"messages"))&&Ue(this,a);Ze(this,function(a){a:{var b=d.G.b,c=a[0],e=a=0,k=b.length;if(c){a=Ve($e(d,c,d.na));if(-1===a){d.j("invalid address: "+c);break a}e=a>>>d.G.i;k=1}d.j("blockid   physical   blockaddr  used    size    type");d.j("--------  ---------  ---------  ------  ------  ----");for(var c=-1,n=0;k--;){var p=b[e];p.type==c?n++||d.j("..."):(c=p.type,n=Ic[c],p&&d.j(q(p.id,8)+"  %"+q(e<a&&a>=-B&&(a+=E);return Math.trunc(Math.abs(a))%Math.pow(2,void 0===b?36:b)}function cf(a){return m(a/Rb,6)+" "+m(a%Rb,6)}
+function Ue(a,b){a.D=a;a.X=a.yb=536870916;a.T=null;a.P=[];b=He(a,b.replace("keys","key").replace("kbd","keyboard"),!1,"|");if(b.length)for(var c in Zb){var d;a:if(d=void 0,Array.prototype.indexOf)d=b.indexOf(c,d);else{d=d||0;0>d&&(d+=b.length);0>d&&(d=0);for(var e=b.length;d>23&&a.v.ya==b&&(b=pd(a.v,1)));if(0d&&(d=a.v.f(b)),0<=d&&(We(a.i[a.S],b),++a.S==a.i.length&&(a.S=0)));return!1}
-function uf(a,b,c,d){var e=Y(b.B),f=a.Ga(b,1),g,h,k,m=0,p=f/Vb|0,t;for(t in vf)if(g=vf[t][p&t]){h=+t;p>>=6;switch(h){case 32512:k=wf;m=p&3;break;case 32256:k=xf;m=p&7;break;case 29248:k=yf,m=(p&48)>>2|(p&6)>>1}break}k=k&&k[m]||"";"S"==k&&g>zf&&(k="B");k=Af[g||0]+k;if(g){if(28700==h)h=f/Wb&127,m=J(a,h,-1);else if(h=f>>23&15,m=J(a,h,-1),h)for(p=0;p>18&15)&&(k+="("+J(a,f,-1)+")")}else k=
-Ca(k,8)+cf(f);f=k;g="";h=J(a,e.B)+":";if(-1!==e.B&&-1!==b.B){do if(k=a.Ga(e,1),g+=" "+cf(k),null==e.B)break;while(e.B!=b.B)}h+=Ca(g,16)+f;c&&(h=Ca(h,48)+";"+(c||""),h=a.v.A.La?h+("cycles="+dd(a.v).toString()+" cs="+q(a.v.Aa)):h+(null!=d?"="+d.toString():""));return h}
-function Cf(a,b,c,d){var e=-1,f,g;if(b){for(var h=b.toUpperCase(),k=0;kzf&&(da="B");if(h==Af[g]+da){e=29248!=f?D:(D&3)<<1|(D&12)<<2;e=(t|e<<6)*Vb;break}}if(0<=e)break}if(0<=e)break}}else c&&(e=f=0);if(0<=
+function qc(a,b,c,d){if(!pf(a))return!1;var e="";null===c&&(e=(c=!a.ya||"tr"==a.ya)?"tr":"t");a.C=0;b||qd(a)&&rd(a,a.v.i,0);try{b=id(a.v,b);var f=a.v.Ra(b);0>23&&a.v.za==b&&(b=pd(a.v,1)));if(0d&&(d=a.v.f(b)),0<=d&&(We(a.i[a.S],b),++a.S==a.i.length&&(a.S=0)));return!1}
+function uf(a,b,c,d){var e=Y(b.B),f=a.Ha(b,1),g,h,k,n=0,p=f/Vb|0,t;for(t in vf)if(g=vf[t][p&t]){h=+t;p>>=6;switch(h){case 32512:k=wf;n=p&3;break;case 32256:k=xf;n=p&7;break;case 29248:k=yf,n=(p&48)>>2|(p&6)>>1}break}k=k&&k[n]||"";"S"==k&&g>zf&&(k="B");k=Af[g||0]+k;if(g){if(28700==h)h=f/Wb&127,n=J(a,h,-1);else if(h=f>>23&15,n=J(a,h,-1),h)for(p=0;p>18&15)&&(k+="("+J(a,f,-1)+")")}else k=
+Ca(k,8)+cf(f);f=k;g="";h=J(a,e.B)+":";if(-1!==e.B&&-1!==b.B){do if(k=a.Ha(e,1),g+=" "+cf(k),null==e.B)break;while(e.B!=b.B)}h+=Ca(g,16)+f;c&&(h=Ca(h,48)+";"+(c||""),h=a.v.A.La?h+("cycles="+dd(a.v).toString()+" cs="+q(a.v.Ba)):h+(null!=d?"="+d.toString():""));return h}
+function Cf(a,b,c,d){var e=-1,f,g;if(b){for(var h=b.toUpperCase(),k=0;kzf&&(da="B");if(h==Af[g]+da){e=29248!=f?D:(D&3)<<1|(D&12)<<2;e=(t|e<<6)*Vb;break}}if(0<=e)break}if(0<=e)break}}else c&&(e=f=0);if(0<=
 e&&c)for(h=c.split(","),p=0;pg||127g||15g||262143g||15e&&null!=c&&a.j("unknown instruction: "+b+" "+c);return e}function Se(a){var b,c;a.b=["bp"];if(a.M)for(b=1;b>>d.i],!1)}a.M=["br"];if(a.I)for(b=1;b>>d.i],!0);a.I=["bw"];a.ra=0;a.ha=0}
-l.Ja=function(a,b,c){var d=!0;c||eg(this,a,b,!1,!0);if(a!=this.b){var e=Ve(b);if(-1===e)this.j("invalid address: "+J(this,b.B)),d=!1;else{var f=this.G;f.b[e>>>f.i].Ja(e&16383,a==this.I)}}d&&(a.push(b),c?b.ia=!0:(gg(this,a,a.length-1,"set"),Te(this)));return d};function eg(a,b,c,d,e){var f=!1;c=Ve(c);for(var g=1;g>>d.i],b==a.I));h.ia||Te(a);break}}return f}
-function hg(a,b){for(var c=1;cd;d++){!d||d&3||(c+="\n");var e=a,f=n(d,2);We(e.Aa,d);f+="="+J(e,e.Ga(e.Aa),36)+" ";c+=f}if(b){b="";for(d=0;d=hf?1:d==ff?23:18)+" "),b+=e;c+="\n"+b}return c}l.zb=function(a,b){return a[0]>b[0]?1:a[0]>>0,g],t=Ea(p,k,a.zb);0>t&&p.splice(-(t+1),0,k)}m&&(h.a=m.replace(/''/g,'"'))}a.F.push({sd:b,B:c,Ob:d,U:e,ub:f})}function kg(a,b,c){var d=[],e=Ve(b)>>>0;for(b=0;b>>0,h=f.Ob;if(e>=g&&ee&&null!=c&&a.j("unknown instruction: "+b+" "+c);return e}function Se(a){var b,c;a.b=["bp"];if(a.M)for(b=1;b>>d.i],!1)}a.M=["br"];if(a.I)for(b=1;b>>d.i],!0);a.I=["bw"];a.sa=0;a.ia=0}
+l.Ka=function(a,b,c){var d=!0;c||eg(this,a,b,!1,!0);if(a!=this.b){var e=Ve(b);if(-1===e)this.j("invalid address: "+J(this,b.B)),d=!1;else{var f=this.G;f.b[e>>>f.i].Ka(e&16383,a==this.I)}}d&&(a.push(b),c?b.ja=!0:(gg(this,a,a.length-1,"set"),Te(this)));return d};function eg(a,b,c,d,e){var f=!1;c=Ve(c);for(var g=1;g>>d.i],b==a.I));h.ja||Te(a);break}}return f}
+function hg(a,b){for(var c=1;cd;d++){!d||d&3||(c+="\n");var e=a,f=m(d,2);We(e.Ba,d);f+="="+J(e,e.Ha(e.Ba),36)+" ";c+=f}if(b){b="";for(d=0;d=hf?1:d==ff?23:18)+" "),b+=e;c+="\n"+b}return c}l.zb=function(a,b){return a[0]>b[0]?1:a[0]>>0,g],t=Ea(p,k,a.zb);0>t&&p.splice(-(t+1),0,k)}n&&(h.a=n.replace(/''/g,'"'))}a.F.push({sd:b,B:c,Ob:d,U:e,ub:f})}function kg(a,b,c){var d=[],e=Ve(b)>>>0;for(b=0;b>>0,h=f.Ob;if(e>=g&&eb){a.j("unknown register: "+f);return}var f=0,h=a.v;switch(b){case ef:H(h,
 g);We(a.L,h.i);break;case hf:f=65536;break;case jf:f=32768;break;case kf:f=131072;break;case lf:f=32;break;case mf:f=262144}f&&(h.u=g?h.u|f:h.u&~f);I(a.H);a.j("updated registers:")}}a.j(jg(a,e));c&&(We(a.L,d.i),sf(a,J(a,a.L.B)))}}function rg(a,b){b=Da(b);var c=b.match(/^(['"])(.*?)\1$/);c?1h[0].indexOf("+"))){var m=h[0]+":";h[2]&&(m+=" "+h[2]);a.j(m)}h[3]&&(g=h[3],f=null);h=a.ba;m=b;h.B=m.B;h.Wa=m.Wa;h.ia=m.ia;h.ca=m.ca;a.j(uf(a,b,g,f));e-=b.B-k;c++}}}
-function ig(a,b,c){var d=!0;try{b.length&&"end"!=b?c||a.j(qf+b):(a.R&&(a.j("ended assemble at "+J(a,a.ba.B)),a.R=!1),b="");var e=b.charAt(0);if('"'==e||"'"==e)return!0;a.T=null;if(Jb(a)&&0p||"z"ma.length&&(a.j("note: only "+ma.length+" available"),ea=ma.length);ia-=ea;0>ia&&(null==ma[ma.length-1].B?(ea=ia+ea,ia=0):ia+=ma.length);
-var Fd=[];"call"==If&&(zb=1E5,Fd=["CALL"]);for(void 0!==Hf&&a.j(ea+" instructions earlier:");0=ma.length&&(ia=0);a.wa=ea;Kf++;zb--}}Kf||(a.j("no "+Jf+"history available"),a.wa=void 0)}else{var db=$e(a,la,a.ma);if(db){var Ia=0,Nf="ds"==ab;if(xa){if("l"==xa.charAt(0))xa=xa.substr(1)||jh,Ia=Me(a,xa);else{var Of=$e(a,xa);
-Of&&(Ia=Of.B-db.B)}0>Ia&&(Ia=0);65536Rf?".":String.fromCharCode(Rf)),zc=zc-7}Ja&&(Ja+="\n");Ja=Nf?Ja+(Ka+","):Ja+(la+": "+Ka+(0>Qf?" "+Id:""))}Ja&&a.j(Ja);a.ca=
-lh}}}}break;case "e":if("else"==g[0])break;var Sf,Tf,Uf=g[0],Kd=g[1];"e"==Uf||"ew"==Uf?(Sf=a.Ga,Tf=a.rb):Kd=null;if(null==Kd)a.j("edit memory commands:"),a.j("\tew [a] [...]  edit words at address a");else{var Ac=$e(a,Kd,a.ma);if(Ac)for(var Ld=2;LdOd;){for(var La=null,qh=256;65536>Db.B>>>
-0;){Pd.B=a.Ga(Db,2);if(null==Db.B||!qh--)break;if(!(Pd.B&1)){for(var rh=a,Bc=Pd,Wf=null,Eb=Bc.B,Xf=Eb,Qd=1;6>=Qd&&Eb;Qd++){if(2h[0].indexOf("+"))){var n=h[0]+":";h[2]&&(n+=" "+h[2]);a.j(n)}h[3]&&(g=h[3],f=null);h=a.ba;n=b;h.B=n.B;h.Wa=n.Wa;h.ja=n.ja;h.ca=n.ca;a.j(uf(a,b,g,f));e-=b.B-k;c++}}}
+function ig(a,b,c){var d=!0;try{b.length&&"end"!=b?c||a.j(qf+b):(a.R&&(a.j("ended assemble at "+J(a,a.ba.B)),a.R=!1),b="");var e=b.charAt(0);if('"'==e||"'"==e)return!0;a.T=null;if(Jb(a)&&0p||"z"ma.length&&(a.j("note: only "+ma.length+" available"),ea=ma.length);ia-=ea;0>ia&&(null==ma[ma.length-1].B?(ea=ia+ea,ia=0):ia+=ma.length);
+var Fd=[];"call"==If&&(zb=1E5,Fd=["CALL"]);for(void 0!==Hf&&a.j(ea+" instructions earlier:");0=ma.length&&(ia=0);a.xa=ea;Kf++;zb--}}Kf||(a.j("no "+Jf+"history available"),a.xa=void 0)}else{var db=$e(a,la,a.na);if(db){var Ia=0,Nf="ds"==ab;if(xa){if("l"==xa.charAt(0))xa=xa.substr(1)||kh,Ia=Me(a,xa);else{var Of=$e(a,xa);
+Of&&(Ia=Of.B-db.B)}0>Ia&&(Ia=0);65536Rf?".":String.fromCharCode(Rf)),zc=zc-7}Ja&&(Ja+="\n");Ja=Nf?Ja+(Ka+","):Ja+(la+": "+Ka+(0>Qf?" "+Id:""))}Ja&&a.j(Ja);a.ca=
+mh}}}}break;case "e":if("else"==g[0])break;var Sf,Tf,Uf=g[0],Kd=g[1];"e"==Uf||"ew"==Uf?(Sf=a.Ha,Tf=a.rb):Kd=null;if(null==Kd)a.j("edit memory commands:"),a.j("\tew [a] [...]  edit words at address a");else{var Ac=$e(a,Kd,a.na);if(Ac)for(var Ld=2;LdOd;){for(var La=null,rh=256;65536>Db.B>>>
+0;){Pd.B=a.Ha(Db,2);if(null==Db.B||!rh--)break;if(!(Pd.B&1)){for(var sh=a,Bc=Pd,Wf=null,Eb=Bc.B,Xf=Eb,Qd=1;6>=Qd&&Eb;Qd++){if(2cg)a.j("step commands:"),a.j("\tp\tstep over instruction"),
-a.j("\tpr\tstep over instruction with register update");else if(a.O)a.j("step in progress");else{var dg=Y(a.v.i);a.Ga(dg);a.O?(a.Ja(a.b,dg,!0),of(a)||(a.H&&hd(a.H),a.O=0)):sg(a,cg?"tr":"t")}break;case "r":if("reset"==b){a.H&&a.H.reset();break}rf(a,g);break;case "s":a:switch(g[1]){case "base":if(g[2]){var Gb=+g[2];if(8==Gb||10==Gb||16==Gb)a.ca=Gb;else{a.j("invalid base: "+Gb);break}}a.j("default base: "+a.ca);break;case "cs":var Hb;void 0!==g[3]&&(Hb=+g[3]);switch(g[2]){case "int":a.v.ma=Hb;break;
-case "start":a.v.Ba=Hb;break;case "stop":a.v.na=Hb;break;default:a.j("unknown cs option");break a}void 0!==Hb&&$c(a.v);a.j("checksums "+(a.v.A.La?"enabled":"disabled"));break;case "sp":void 0!==g[2]&&(ed(a.v,+g[2])||a.j("warning: using 1x multiplier, previous target not reached"));a.j("target speed: "+(a.v.ba.toFixed(2)+"Mhz")+" ("+a.v.ea+"x)");break;default:if(g[1]){a.j("unknown option: "+g[1]);break}case "?":a.j("debugger options:"),a.j("\tbase #\t\tset default base to #"),a.j("\tcs int #\tset checksum cycle interval to #"),
+a.P=[]}}var th=0,Fb="";for(na in Zb)if(!L||L==na){var uh=!!(a.X&Zb[na]);if(null===oa||oa==uh)Fb&&(Fb+=","),++th%10||(Fb+="\n\t"),"key"==na&&(na="keys"),Fb+=na}void 0===L&&a.j("message commands:\n\tm [category] [on|off]\tturn categories on/off");a.j((null!==oa?oa?"messages on:  ":"messages off: ":"message categories:\n\t")+(Fb||"none"));Te(a)}break;case "p":if("print"==g[0]){rg(a,b.substr(5));break}var bg=g[0],cg="p"==bg?0:"pr"==bg?1:-1;if("?"==g[1]||0>cg)a.j("step commands:"),a.j("\tp\tstep over instruction"),
+a.j("\tpr\tstep over instruction with register update");else if(a.O)a.j("step in progress");else{var dg=Y(a.v.i);a.Ha(dg);a.O?(a.Ka(a.b,dg,!0),of(a)||(a.H&&hd(a.H),a.O=0)):sg(a,cg?"tr":"t")}break;case "r":if("reset"==b){a.H&&a.H.reset();break}rf(a,g);break;case "s":a:switch(g[1]){case "base":if(g[2]){var Gb=+g[2];if(8==Gb||10==Gb||16==Gb)a.ca=Gb;else{a.j("invalid base: "+Gb);break}}a.j("default base: "+a.ca);break;case "cs":var Hb;void 0!==g[3]&&(Hb=+g[3]);switch(g[2]){case "int":a.v.na=Hb;break;
+case "start":a.v.Ca=Hb;break;case "stop":a.v.oa=Hb;break;default:a.j("unknown cs option");break a}void 0!==Hb&&$c(a.v);a.j("checksums "+(a.v.A.La?"enabled":"disabled"));break;case "sp":void 0!==g[2]&&(ed(a.v,+g[2])||a.j("warning: using 1x multiplier, previous target not reached"));a.j("target speed: "+(a.v.ba.toFixed(2)+"Mhz")+" ("+a.v.fa+"x)");break;default:if(g[1]){a.j("unknown option: "+g[1]);break}case "?":a.j("debugger options:"),a.j("\tbase #\t\tset default base to #"),a.j("\tcs int #\tset checksum cycle interval to #"),
 a.j("\tcs start #\tset checksum cycle start count to #"),a.j("\tcs stop #\tset checksum cycle stop count to #"),a.j("\tsp #\t\tset speed multiplier to #")}break;case "t":sg(a,g[0],g[1]);break;case "u":sf(a,g[1],g[2],8);break;case "v":if("var"==g[0]){pg(a,b.substr(3))||(d=!1);break}if("ver"==g[0]){a.j((Pb||"PDP10")+" version 1.34.2 ("+a.v.wb+",RELEASE)");a.j(window?window.navigator.userAgent:"");break}f=!0;break;case "?":if(g[1]){rg(a,b.substr(1));break}var Rd="commands:",Sd;for(Sd in ug)Rd+="\n"+
 Ca(Sd,9)+ug[Sd];qd(a)||(Rd+="\nnote: history disabled if no exec breakpoints");a.j(Rd);break;default:f=!0}f&&(a.j("unknown command: "+b),d=!1)}}catch(fg){a.j("Debugger "+(fg.stack||fg.message)),d=!1}return d}function cd(a,b,c){b=He(a,b,c);for(var d in b)if(!ig(a,b[+d]))return!1;return!0}
 var ug={"?":"help/print","a [#]":"assemble","b [#]":"breakpoint",c:"clear output","d [#]":"dump memory","e [#]":"edit memory","g [#]":"go [to #]",h:"halt","if":"eval expression","int [#]":"request interrupt",k:"stack trace",ln:"list nearest symbol(s)",m:"messages",p:"step over",print:"print expression",r:"dump/set registers",reset:"reset machine",s:"set options","t [#]":"trace","u [#]":"unassemble","var":"assign variable",ver:"print version"},zf=20,Af=".WORD HLL HLLZ HLLO HLLE HRL HRLZ HRLO HRLE HRR HRRZ HRRO HRRE HLR HLRZ HLRO HLRE MOVE MOVS MOVN MOVM EXCH BLT PUSH POP LDB DPB IBP ILDB IDPB SETZ SETO SETA SETCA SETM SETCM AND ANDCA ANDCM ANDCB IOR ORCA ORCM ORCB XOR EQV LSH LSHC ROT ROTC ADD SUB MUL IMUL DIV IDIV ASH ASHC FSC FADR FSBR FMPR FDVR DFN UFA FAD FSB FMP FDV AOBJP AOBJN CAI CAM JUMP SKIP AOJ AOS SOJ SOS TR TL TD TS XCT JFFO JFCL JSR JSP JRST JSA JRA PUSHJ POPJ BLKI DATAI BLKO DATAO CONO CONI CONSZ CONSO UUO JOV JCRY0 JCRY1 JCRY JFOV HALT JRSTF JEN".split(" "),
 ef=0,ff=1,gf=2,hf=3,jf=4,kf=5,lf=6,mf=7,df="PC RA EA C0 C1 OV ND PD".split(" "),vg={},vf=(vg[28672]={0:101},vg[32704]={5632:64,5696:63,5760:58,5824:27,5888:28,5952:25,6016:29,6080:26,10240:56,10304:48,10368:46,10432:84,10496:57,10560:49,10624:47,10752:21,10816:22,10880:69,10944:70,11008:88,11072:85,11136:83,11264:91,11328:23,11392:24,11456:92,11520:86,11584:87,11648:89,11712:90},vg[32512]={6144:65,6400:59,6656:66,6912:60,7168:67,7424:61,7680:68,7936:62,8192:17,8448:18,8704:19,8960:zf,9216:53,9472:52,
 9728:55,9984:54,11776:50,12032:51,16384:30,16640:36,16896:37,17152:34,17408:38,17664:32,17920:44,18176:40,18432:39,18688:45,18944:33,19200:41,19456:35,19712:42,19968:43,20224:31,20480:1,20736:5,20992:2,21248:6,21504:3,21760:7,22016:4,22272:8,22528:9,22784:13,23040:10,23296:14,23552:11,23808:15,24064:12,24320:16},vg[32256]={12288:71,12800:72,13312:73,13824:74,14336:75,14848:76,15360:77,15872:78},vg[29248]={24576:79,24640:80,25088:81,25152:82},vg[28700]={28672:93,28676:94,28680:95,28684:96,28688:97,
 28692:98,28696:99,28700:100},vg),wf=["","I","M","S"],xf=" L E LE A GE N G".split(" "),yf="N NE NA NN Z ZE ZA ZN C CE CA CN O OE OA ON".split(" "),Bf=[{0:85,8:102,4:103,2:104,6:105,1:106},{0:88,4:107,2:108,10:109}],nf=1E3,qf=">> ";Ya(function(){for(var a=x(document,w,"debugger"),b=0;b([\s\S]*?)<\/pre>/gi;f=b.exec(c);){var g=f[1];0<=g.indexOf("&")&&(g=g.replace(/</gi,"<").replace(/>/gi,">").replace(/&/gi,"&"));e+=g}(f=e.match(/&[a-z]+;/i))&&xg(a,"unrecognized HTML entity: "+f[0])}var h,k=e.split(/\r?\n/);for(h=0;hc&&a.error("unable to parse instruction: "+b.Ma[0]+" "+b.Ma[1])):(c=Ag(a,d,e),void 0===c?a.error("unable to parse expression: "+d):void 0===a.w[e]?a.error("undefined fixup location: "+n(e,0,!0)):c+=a.w[e]);b=Ie(a.i,c||0,36,!0);(c<-B||c>=E)&&xg(a,"truncated value "+n(c)+" at location "+n(e)+" to "+n(b));a.w[e]=b})}catch(t){a.j(t.message),a.K=
--1}a.i.K=d;return a.K}
-function yg(a,b){if(a.b){if(1==a.b){var c=b.indexOf(a.J);0<=c?(a.b++,b=b.substr(c+1)):a.error("expected "+a.F+" definition: "+b)}if(1=--f)break}0>f&&a.error("missing bracket(s): "+e);0<=k&&(g=e.substr(k,h-k));for((e=g)&&(c=c.replace(e,Eg(a,Fg,e)));e=Gg(a,c);)c=c.replace(e,e.slice(0,-1));if(!Bg(a,b,c))switch(b){case "":c&&Hg(a,0,[c]);break;case "=":b=d;d=Ag(a,c);
-void 0===d?a.error("parseExpression("+c+")"):Dg(a,b,d);break;case Ig:case Jg:case Kg:Cg(a,c);break;case Lg:Hg(a,0,[c.replace(",",",,")]);break;case Mg:case Ng:case Og:Eg(a,b,c);break;case Pg:case Qg:break;default:d=b,e=c,f=Cf(a.i,d),0<=f?(Hg(a,f,[d,e]),d=!0):d=!1,d||Hg(a,0,[b+c])}return!0}
-function Bg(a,b,c){var d=a.v[b];if(!d)return!1;if(null!=c){b=",";"("==c[0]&&(b+=")",c=c.substr(1));for(var e=[];c;){c=c.trim();var f=Rg(a,c,b);if(!f)break;e.push(f);c=c.substr(f.length+1)}zg(a,d.Ka,d.vb,e);return!0}if("_"!=b[0])return!1;switch(b.substr(1)){case Ng:d.mb||zg(a,d.Ka);break;case Og:for(;0p)break;var m=p+1,t=p+h.length;p&&f[p-1].match(/[0-9A-Z$%.]/i)||!(t>=f.length)&&f[t].match(/[0-9A-Z$%.]/i)||(f=f.substr(0,p)+k+f.substr(t),m=p+k.length)}if(!yg(a,f))break}}og.prototype.error=function(a){throw Error("error"+(this.ja?" at line "+ua(this.ja):"")+": "+a);};
-function xg(a,b){a.j("warning"+(a.ja?" at line "+ua(a.ja):"")+": "+b)}function Rg(a,b,c){c=void 0===c?",":c;for(var d=0,e=null,f=0;d"==g&&0>--f){a.error("missing bracket(s): "+b);break}d++}f?0d?c="":(c=b.substr(d+1),b=b.substr(0,d),a.u=null);a.D+=b}if(null==a.u){var d=b=0,e,f,g=a.D.length;a.F==Jg&&g++;for(var h=0;h=k&&(k-=32),k=k+32&63);d+=k*Math.pow(2,f);f-=e;b++;0>f&&(Hg(a,d),b=0)}b&&Hg(a,d)}return c}
-function Eg(a,b,c){var d,e,f,g;a.J="<";a.H=">";e=f=[];if(b==Mg){d=c.match(/([A-Z$%.][0-9A-Z$%.]*)\s*(\([^)]*\)|)\s*(<|)(.*)/i);if(!d)return a.error("unrecognized "+b+" definition: "+c),"";b=d[1];a.v[b]&&a.error("macro redefined: "+b);e=d[2].match(/[A-Z$%.][0-9A-Z$%.]*/g);c=Tg;g=3}else if(b==Fg)a.J="[",a.H="]",b="_"+ua(a.Fa,5),a.v[b]&&a.error("literal symbol redefined: "+b),d=[c[0],b+": "+c.substr(1)],c=Ug,a.G.push(b),g=0;else{g=Rg(a,c);if(!g)return a.error("missing "+b+" expression: "+c),"";c=c.substr(g.length+
-1);g=g.trim();d=c.match(/\s*(<|)(.*)/i);b="_"+b;c=Ag(a,g)||0;g=1}b=b.toUpperCase();a.b=1;var h="";d[g]&&(a.b=2,h=d[g+1],h.slice(-1)==a.H&&(a.b=0,h=h.slice(0,-1)));a.v[b]={name:b,mb:c,vb:e,Ib:f,Ka:h,ja:a.ja};a.b?a.C=b:Bg(a,b);return b}function Dg(a,b,c,d){var e,f;d=void 0===d?!1:d;e=void 0===e?!1:e;f=void 0===f?!1:f;b=b.toUpperCase().substr(0,6);d&&a.L[b]?a.error("label "+b+" redefined"):(a.L[b]={name:b,value:c,ja:a.ja,hd:d,gd:e,jd:f},a.i.K[b]=c)}
-function Hg(a,b,c){a.w[a.Fa]=b;c&&a.I.push({Fa:a.Fa,Ma:c});a.Fa++}var Ig="ASCII",Jg="ASCIZ",Mg="DEFINE",Ng="IFE",Fg="LITERAL",Pg="PAGE",Og="REPEAT",Kg="SIXBIT",Qg="SUBTTL",Lg="XWD",Tg=-1,Ug=-2,Sg=-3;
-function Vg(a,b,c){u.call(this,"Computer",a,33554432);this.A.V=!1;this.R=null;Wg(this,b);this.O=Yc(this,"autoPower",a,6);this.w=0;this.aa=+a.busWidth||+a.buswidth;this.L=this.F=this.M=null;this.K=this.T=!1;this.I=this.C=null;this.S=this.P=!1;this.ba=Yc(this,"url")||"";(Math.random()+.1).toString(36);this.i=Xg(this);if(this.v=rb("CPU",this.id)){this.D=rb("Debugger",this.id);this.G=new xc({id:this.Ua+".bus",busWidth:this.aa},this.v,this.D);var d,e=pb(this.id);if((this.u=rb("Panel",this.id))&&this.u.ua)for(b=
-0;b\nLicense: GPL version 3 or later ");for(b=0;bYg){if(Zg(d,this.L)){this.C=new G(this,"1.34.2",hh);Zg(this.C)&&(ih(this,d),a=uh,vh(this.C));this.C.set(eh,Fa());wh(this.C);var e=this.b&&!this.K;if(a==fh||ob("Click OK to restore the previous "+Pb+" machine state, or CANCEL to reset the machine.")){if(c=dh(d)){var f=d.get("code"),g=d.get("data");f&&("ok"==f?Zg(d,g):("error"==f&&"no machine state"!=
-g?(this.da("Error: "+g),"unable to verify user"==g&&(Ra(xh,""),this.i=null)):this.j(f+": "+g),vh(d),Zg(d)?(c=dh(d),e=!0):c=!1))}e&&bh(this,c?d:null)}else a==uh&&d.clear()}else bh(this);delete this.L;delete this.I}e=pb(this.id);for(f=0;fa[1];a=a[2];this.S=!0;this.A.V=!0;var d=this.J.power;d&&(d.textContent="Shutdown");this.v&&(yh(this,this.v,b,c,a),I(this,-2),this.v.Z());this.P&&(ih(this,b),b.clear());!c&&this.C&&(this.C.clear(),delete this.C);this.w=0};
-function ih(a,b){if(ob("There may be a problem with your "+Pb+" machine.\n\nTo help us diagnose it, click OK to send this "+Pb+" machine state to http://www.pcjs.org.")){var c=a.ba;a=a.i||"";b=b.toString();var d={};d.app=Pb;d.ver="1.34.2";d.url=c;d.user=a;d.type="bug";d.data=b;Ga("http://www.pcjs.org/api/v1/report",d,!0)}}
-function tg(a,b,c){var d,e="none";if(a.w)return null;a.w--;var f=new G(a,"1.34.2"),g=new G(a,"1.34.2",ch),h=Fa();g.set(eh,h);f.set(eh,h);f.set(zh,"1.34.2");f.set(Ah,window?window.location.href:null);f.set(Bh,window?window.navigator.userAgent:"");a.v&&a.v.ka&&(c&&(b&&(a.v.A.Z=a.v.A.N),a.v.W()),d=a.v.ka(b,c),"object"===typeof d&&f.set(a.v.id,d),c&&(a.v.A.V=!1,!1===d&&(e=null)));for(var h=pb(a.id),k=0;k([\s\S]*?)<\/pre>/gi;e=b.exec(c);)e=e[1],0<=e.indexOf("&")&&(e=e.replace(/</gi,"<").replace(/>/gi,">").replace(/&/gi,"&")),d+=e;(e=d.match(/&[a-z]+;/i))&&yg(a,"unrecognized HTML entity: "+e[0])}a.ea&&(a.ea+="\n");a.ea+=d;setTimeout(function(){wg(a)},0)}})}
+function xg(a){if(0<=a.R.indexOf("p"))return a.i.j(a.ea),0;var b=Pe(a.i);try{var c,d=a.ea.split(/\r?\n/);for(c=0;cc&&a.error("unable to parse instruction: "+
+b.Ma[0]+" "+b.Ma[1])):(c=Bg(a,d,e),void 0===c?a.error("unable to parse expression: "+d):void 0===a.w[e]?a.error("undefined fixup location: "+m(e,0,!0)):c+=a.w[e]);b=Ie(a.i,c||0,36,!0);(c<-B||c>=E)&&yg(a,"truncated value "+m(c)+" at location "+m(e)+" to "+m(b));a.w[e]=b})}catch(g){a.j(g.message),a.M=-1}a.i.K=b;return a.M}
+function zg(a,b){if(a.b){if(1==a.b){var c=b.indexOf(a.J);0<=c?(a.b++,b=b.substr(c+1)):a.error("expected "+a.F+" definition: "+b)}if(1=--f)break}0>f&&a.error("missing bracket(s): "+e);0<=k&&(g=e.substr(k,h-k));for((e=g)&&(c=c.replace(e,Fg(a,Gg,e)));e=Hg(a,c);)c=c.replace(e,e.slice(0,-1));if(!Cg(a,b,c))switch(b){case "":c&&Ig(a,0,[c]);break;case "=":b=d;d=Bg(a,c);
+void 0===d?a.error("parseExpression("+c+")"):Eg(a,b,d);break;case Jg:case Kg:case Lg:Dg(a,c);break;case Mg:Ig(a,0,[c.replace(",",",,")]);break;case Ng:case Og:case Pg:Fg(a,b,c);break;case Qg:case Rg:break;default:d=b,e=c,f=Cf(a.i,d),0<=f?(Ig(a,f,[d,e]),d=!0):d=!1,d||Ig(a,0,[b+c])}return!0}
+function Cg(a,b,c){var d=a.v[b];if(!d)return!1;if(null!=c){b=",";"("==c[0]&&(b+=")",c=c.substr(1));for(var e=[];c;){c=c.trim();var f=Sg(a,c,b);if(!f)break;e.push(f);c=c.substr(f.length+1)}Ag(a,d.ea,d.vb,e);return!0}if("_"!=b[0])return!1;switch(b.substr(1)){case Og:d.mb||Ag(a,d.ea);break;case Pg:for(;0p)break;var n=p+1,t=p+h.length;p&&f[p-1].match(/[0-9A-Z$%.]/i)||!(t>=f.length)&&f[t].match(/[0-9A-Z$%.]/i)||(f=f.substr(0,p)+k+f.substr(t),n=p+k.length)}if(!zg(a,f))break}}og.prototype.error=function(a){throw Error("error"+(this.ka?" at line "+ua(this.ka):"")+": "+a);};
+function yg(a,b){a.j("warning"+(a.ka?" at line "+ua(a.ka):"")+": "+b)}function Sg(a,b,c){c=void 0===c?",":c;for(var d=0,e=null,f=0;d"==g&&0>--f){a.error("missing bracket(s): "+b);break}d++}f?0d?c="":(c=b.substr(d+1),b=b.substr(0,d),a.u=null);a.D+=b}if(null==a.u){var d=b=0,e,f,g=a.D.length;a.F==Kg&&g++;for(var h=0;h=k&&(k-=32),k=k+32&63);d+=k*Math.pow(2,f);f-=e;b++;0>f&&(Ig(a,d),b=0)}b&&Ig(a,d)}return c}
+function Fg(a,b,c){var d,e,f,g;a.J="<";a.H=">";e=f=[];if(b==Ng){d=c.match(/([A-Z$%.][0-9A-Z$%.]*)\s*(\([^)]*\)|)\s*(<|)(.*)/i);if(!d)return a.error("unrecognized "+b+" definition: "+c),"";b=d[1];a.v[b]&&a.error("macro redefined: "+b);e=d[2].match(/[A-Z$%.][0-9A-Z$%.]*/g);c=Ug;g=3}else if(b==Gg)a.J="[",a.H="]",b="_"+ua(a.Ga,5),a.v[b]&&a.error("literal symbol redefined: "+b),d=[c[0],b+": "+c.substr(1)],c=Vg,a.G.push(b),g=0;else{g=Sg(a,c);if(!g)return a.error("missing "+b+" expression: "+c),"";c=c.substr(g.length+
+1);g=g.trim();d=c.match(/\s*(<|)(.*)/i);b="_"+b;c=Bg(a,g)||0;g=1}b=b.toUpperCase();a.b=1;var h="";d[g]&&(a.b=2,h=d[g+1],h.slice(-1)==a.H&&(a.b=0,h=h.slice(0,-1)));a.v[b]={name:b,mb:c,vb:e,Ib:f,ea:h,ka:a.ka};a.b?a.C=b:Cg(a,b);return b}function Eg(a,b,c,d){var e,f;d=void 0===d?!1:d;e=void 0===e?!1:e;f=void 0===f?!1:f;b=b.toUpperCase().substr(0,6);d&&a.O[b]?a.error("label "+b+" redefined"):(a.O[b]={name:b,value:c,ka:a.ka,hd:d,gd:e,jd:f},a.i.K[b]=c)}
+function Ig(a,b,c){a.w[a.Ga]=b;c&&a.I.push({Ga:a.Ga,Ma:c});a.Ga++}var Jg="ASCII",Kg="ASCIZ",Ng="DEFINE",Og="IFE",Gg="LITERAL",Qg="PAGE",Pg="REPEAT",Lg="SIXBIT",Rg="SUBTTL",Mg="XWD",Ug=-1,Vg=-2,Tg=-3;
+function Wg(a,b,c){u.call(this,"Computer",a,33554432);this.A.V=!1;this.R=null;Xg(this,b);this.O=Yc(this,"autoPower",a,6);this.w=0;this.aa=+a.busWidth||+a.buswidth;this.L=this.F=this.M=null;this.K=this.T=!1;this.I=this.C=null;this.S=this.P=!1;this.ba=Yc(this,"url")||"";(Math.random()+.1).toString(36);this.i=Yg(this);if(this.v=rb("CPU",this.id)){this.D=rb("Debugger",this.id);this.G=new xc({id:this.Ua+".bus",busWidth:this.aa},this.v,this.D);var d,e=pb(this.id);if((this.u=rb("Panel",this.id))&&this.u.va)for(b=
+0;b\nLicense: GPL version 3 or later ");for(b=0;bZg){if($g(d,this.L)){this.C=new G(this,"1.34.2",ih);$g(this.C)&&(jh(this,d),a=vh,wh(this.C));this.C.set(fh,Fa());xh(this.C);var e=this.b&&!this.K;if(a==gh||ob("Click OK to restore the previous "+Pb+" machine state, or CANCEL to reset the machine.")){if(c=eh(d)){var f=d.get("code"),g=d.get("data");f&&("ok"==f?$g(d,g):("error"==f&&"no machine state"!=
+g?(this.da("Error: "+g),"unable to verify user"==g&&(Ra(yh,""),this.i=null)):this.j(f+": "+g),wh(d),$g(d)?(c=eh(d),e=!0):c=!1))}e&&ch(this,c?d:null)}else a==vh&&d.clear()}else ch(this);delete this.L;delete this.I}e=pb(this.id);for(f=0;fa[1];a=a[2];this.S=!0;this.A.V=!0;var d=this.J.power;d&&(d.textContent="Shutdown");this.v&&(zh(this,this.v,b,c,a),I(this,-2),this.v.Z());this.P&&(jh(this,b),b.clear());!c&&this.C&&(this.C.clear(),delete this.C);this.w=0};
+function jh(a,b){if(ob("There may be a problem with your "+Pb+" machine.\n\nTo help us diagnose it, click OK to send this "+Pb+" machine state to http://www.pcjs.org.")){var c=a.ba;a=a.i||"";b=b.toString();var d={};d.app=Pb;d.ver="1.34.2";d.url=c;d.user=a;d.type="bug";d.data=b;Ga("http://www.pcjs.org/api/v1/report",d,!0)}}
+function tg(a,b,c){var d,e="none";if(a.w)return null;a.w--;var f=new G(a,"1.34.2"),g=new G(a,"1.34.2",dh),h=Fa();g.set(fh,h);f.set(fh,h);f.set(Ah,"1.34.2");f.set(Bh,window?window.location.href:null);f.set(Ch,window?window.navigator.userAgent:"");a.v&&a.v.la&&(c&&(b&&(a.v.A.Z=a.v.A.N),a.v.W()),d=a.v.la(b,c),"object"===typeof d&&f.set(a.v.id,d),c&&(a.v.A.V=!1,!1===d&&(e=null)));for(var h=pb(a.id),k=0;k=d||30<=(c.ab+=d))&&(e.textContent=c.A.N?c.aa.toFixed(2)+"Mhz":"Stopped",c.ab=0)}if(a.u&&(a=a.u,b=b||0,a.L)){c=a.v.A.N;d=!!(a.v.C&8);if(0>=b||60<=(a.K+=b)){e=a.v.i;if(a.J.PC){var f=a.D&&a.D.ca||8,e=e||0,e=8==f?n(e,void 0):q(e,void 0);a.J.PC.textContent!=e&&(a.J.PC.textContent=e)}a.K=0}-1>b?a.i=a.v.i:0g.indexOf("/")&&"/"==window.location.pathname.slice(-1)&&(g=window.location.pathname+g),e?"}"==e.slice(-1)?(e=e.slice(0,-1),1]*\sid=)(['"]).*?\2/,"$1$2"+c+"$2"+(e?" parms='"+e+"'":"")+(g?' url="'+g+'"':"")));f||(a=a.replace(/().*?(<\/xsl:variable>)/,"$1PDPjs$2"),
-a=a.replace(/().*?(<\/xsl:variable>)/,"$1"+d+"$2"));g=null;if("<"==a.charAt(0))try{f||(a=a.replace(/\s*/g,"")),window.ActiveXObject||"ActiveXObject"in window?(g=new window.ActiveXObject("Microsoft.XMLDOM"),g.async=!1,g.loadXML(a)):g=(new window.DOMParser).parseFromString(a,"text/xml")}catch(t){g=null,a=t.message}else a="unrecognized XML: "+(255/g.exec(a)){var e=d[2];b("Loading "+e+"...");Ga(e,null,!0,function(f,g,h){if(h||!g)c(a,"unable to resolve XML reference: "+d[0]+" ("+h+")");else{if(f=d[3])if(h=g.match(new RegExp("<"+d[1]+"[^>]*>"))){for(var k=h[0],m,p=/( [a-z]+=)(['"])(.*?)\2/g;m=p.exec(f);)k=0>k.indexOf(m[1])?k.replace(">",m[0]+">"):k.replace(new RegExp(m[1]+"(['\"])(.*?)\\1"),m[0]);h[0]!=k&&(g=g.replace(h[0],k))}else{c(a,"missing <"+d[1]+"> in "+e);return}g=g.replace(/<\?xml[^>]*>[\r\n]*/,
-"");a=a.replace(d[0],g);Jh(a,b,c)}})}else c(a,null)}
-function Kh(a,b,c,d,e){function f(a){if(void 0===k){var b=h&&x(h,"machine-warning");k=b&&b[0]||h}k&&(k.innerHTML=Aa(a))}function g(a){f("Error: "+a);m&&(--Gh||gb(!0));m=!1}var h,k,m=!0;Gh++;mb[b]={};try{if(h=document.getElementById(b)){var p;if("object"==typeof resources&&(p=resources.css)){var t=document.head||document.getElementsByTagName("head")[0],D=document.createElement("style");D.type="text/css";D.styleSheet?D.styleSheet.cssText=p:D.appendChild(document.createTextNode(p));t.appendChild(D)}d||
-(p=a,"pdp"==a.substr(0,3)&&(p="pdpjs"),d="/versions/"+p+"/1.34.2/components.xsl");p=function(e,k){k?Hh(d,null,a,null,!1,f,function(a,e){e?(lb(b,d,a),f("Processing "+c+"..."),window.ActiveXObject||"ActiveXObject"in window?(e=k.transformNode(e))?(h.outerHTML=e,--Gh||gb(!0)):g("transformNodeToObject failed"):document.implementation&&document.implementation.createDocument?(a=new XSLTProcessor,a.importStylesheet(e),(e=a.transformToFragment(k,document))?h.parentNode?(h.parentNode.replaceChild(e,h),--Gh||
-gb(!0)):g("invalid machine element: "+b):g("transformToFragment failed")):g("unable to transform XML: unsupported browser")):g(a)}):g(e)};"<"!=c.charAt(0)?Hh(c,b,a,e,!0,f,p):Ih(c,null,b,a,e,!1,f,p)}else g("missing machine element: "+b)}catch(da){g(da.message)}return m}window.embedPDP10=function(a,b,c,d){gb(!1);return Kh("pdp10",a,b,c,d)};window.embedPDP11=function(a,b,c,d){gb(!1);return Kh("pdp11",a,b,c,d)};window.findMachineComponent=function(a,b){return rb(b,a+".machine")};
-window.processMachineScript=function(a,b){var c=!1;a+=".machine";if("string"==typeof b&&!ub[a]){for(var c=!0,d=ub,e=a,f=b.length,g=[],h=[],k="",m=null,p=0;p=d||30<=(c.ab+=d))&&(e.textContent=c.A.N?c.aa.toFixed(2)+"Mhz":"Stopped",c.ab=0)}if(a.u&&(a=a.u,b=b||0,a.L)){c=a.v.A.N;d=!!(a.v.C&8);if(0>=b||60<=(a.K+=b)){e=a.v.i;if(a.J.PC){var f=a.D&&a.D.ca||8,e=e||0,e=8==f?m(e,void 0):q(e,void 0);a.J.PC.textContent!=e&&(a.J.PC.textContent=e)}a.K=0}-1>b?a.i=a.v.i:0g.indexOf("/")&&"/"==window.location.pathname.slice(-1)&&(g=window.location.pathname+g),e?"}"==e.slice(-1)?(e=e.slice(0,-1),1]*\sid=)(['"]).*?\2/,"$1$2"+c+"$2"+(e?" parms='"+e+"'":"")+(g?' url="'+g+'"':"")));f||(a=a.replace(/().*?(<\/xsl:variable>)/,"$1PDPjs$2"),
+a=a.replace(/().*?(<\/xsl:variable>)/,"$1"+d+"$2"));g=null;if("<"==a.charAt(0))try{f||(a=a.replace(/\s*/g,"")),window.ActiveXObject||"ActiveXObject"in window?(g=new window.ActiveXObject("Microsoft.XMLDOM"),g.async=!1,g.loadXML(a)):g=(new window.DOMParser).parseFromString(a,"text/xml")}catch(t){g=null,a=t.message}else a="unrecognized XML: "+(255/g.exec(a)){var e=d[2];b("Loading "+e+"...");Ga(e,null,!0,function(f,g,h){if(h||!g)c(a,"unable to resolve XML reference: "+d[0]+" ("+h+")");else{if(f=d[3])if(h=g.match(new RegExp("<"+d[1]+"[^>]*>"))){for(var k=h[0],n,p=/( [a-z]+=)(['"])(.*?)\2/g;n=p.exec(f);)k=0>k.indexOf(n[1])?k.replace(">",n[0]+">"):k.replace(new RegExp(n[1]+"(['\"])(.*?)\\1"),n[0]);h[0]!=k&&(g=g.replace(h[0],k))}else{c(a,"missing <"+d[1]+"> in "+e);return}g=g.replace(/<\?xml[^>]*>[\r\n]*/,
+"");a=a.replace(d[0],g);Kh(a,b,c)}})}else c(a,null)}
+function Lh(a,b,c,d,e){function f(a){if(void 0===k){var b=h&&x(h,"machine-warning");k=b&&b[0]||h}k&&(k.innerHTML=Aa(a))}function g(a){f("Error: "+a);n&&(--Hh||gb(!0));n=!1}var h,k,n=!0;Hh++;mb[b]={};try{if(h=document.getElementById(b)){var p;if("object"==typeof resources&&(p=resources.css)){var t=document.head||document.getElementsByTagName("head")[0],D=document.createElement("style");D.type="text/css";D.styleSheet?D.styleSheet.cssText=p:D.appendChild(document.createTextNode(p));t.appendChild(D)}d||
+(p=a,"pdp"==a.substr(0,3)&&(p="pdpjs"),d="/versions/"+p+"/1.34.2/components.xsl");p=function(e,k){k?Ih(d,null,a,null,!1,f,function(a,e){e?(lb(b,d,a),f("Processing "+c+"..."),window.ActiveXObject||"ActiveXObject"in window?(e=k.transformNode(e))?(h.outerHTML=e,--Hh||gb(!0)):g("transformNodeToObject failed"):document.implementation&&document.implementation.createDocument?(a=new XSLTProcessor,a.importStylesheet(e),(e=a.transformToFragment(k,document))?h.parentNode?(h.parentNode.replaceChild(e,h),--Hh||
+gb(!0)):g("invalid machine element: "+b):g("transformToFragment failed")):g("unable to transform XML: unsupported browser")):g(a)}):g(e)};"<"!=c.charAt(0)?Ih(c,b,a,e,!0,f,p):Jh(c,null,b,a,e,!1,f,p)}else g("missing machine element: "+b)}catch(da){g(da.message)}return n}window.embedPDP10=function(a,b,c,d){gb(!1);return Lh("pdp10",a,b,c,d)};window.embedPDP11=function(a,b,c,d){gb(!1);return Lh("pdp11",a,b,c,d)};window.findMachineComponent=function(a,b){return rb(b,a+".machine")};
+window.processMachineScript=function(a,b){var c=!1;a+=".machine";if("string"==typeof b&&!ub[a]){for(var c=!0,d=ub,e=a,f=b.length,g=[],h=[],k="",n=null,p=0;p