;[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>