Trailing-Edge
-
PDP-10 Archives
-
cuspbinsrc_2of2_bb-fp63b-sb
-
10,7/smfile/smfile.mac
There is 1 other file named smfile.mac in the archive. Click here to see a list.
;MAINDEC-10-SMFILE
MCNVER=2
DECVER=7
XLIST
DEFINE NAME (MCNVER,DECVER),<
TITLE SMFILE DECSYSTEM 2020 DIAGNOSTICS FE-FILE PROGRAM, VER MCNVER,DECVER>
LIST
LALL
NAME \MCNVER,\DECVER
LOC 137
BYTE (3)0(9)MCNVER(6)0(18)DECVER
RELOC
;*COPYRIGHT 1978,1979,1986
;*DIGITAL EQUIPMENT CORPORATION
;*MARLBORO, MASS. 01752
;*JOHN R. KIRCHOFF/TL
NOSYM
SEARCH MONSYM,MACSYM
.REQUI REL:MACREL
.REQUI REL: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,<PRINTX [STARTING PASS 2]>
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 <ERR>,<
MOVEI T1,[ASCIZ "ERR"]
MOVEM T1,CMDMSG
>
IFB <ERR>,<
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"]>)],<EXPECTING TEXT>
>
DEFINE CMDNOP(FUNC,ERR,%A),<
%A:! XLIST
IFNB <ERR>,<
MOVEI T1,[ASCIZ "ERR"]
MOVEM T1,CMDMSG
>
IFB <ERR>,<
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+<Z E>>]
>
DEFINE MOVST(AC,E),<
EXTEND AC,[EXP <015B8+<Z E>>]
>
OPDEF CONFIRM [GO CFMCMD]
DEFINE OP$$AC(OP,ACLST),<
XLIST
IRP ACLST,<
OP P,ACLST
>
LIST
>
DEFINE SAVEAC,<
OP$$AC PUSH,<T1,T2,T3,T4,T5,T6,FP,CX>
>
DEFINE RESTAC,<
OP$$AC POP,<CX,FP,T6,T5,T4,T3,T2,T1>
>
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,<LUUO1=$UUOER>
IFNDEF LUUO2,<LUUO2=$UUOER>
IFNDEF LUUO3,<LUUO3=$UUOER>
IFNDEF LUUO4,<LUUO4=$UUOER>
IFNDEF LUUO5,<LUUO5=$UUOER>
IFNDEF LUUO6,<LUUO6=$UUOER>
IFNDEF LUUO7,<LUUO7=$UUOER>
IFNDEF LUUO10,<LUUO10=$UUOER>
IFNDEF LUUO11,<LUUO11=$UUOER>
IFNDEF LUUO12,<LUUO12=$UUOER>
IFNDEF LUUO13,<LUUO13=$UUOER>
IFNDEF LUUO14,<LUUO14=$UUOER>
IFNDEF LUUO15,<LUUO15=$UUOER>
IFNDEF LUUO16,<LUUO16=$UUOER>
IFNDEF LUUO17,<LUUO17=$UUOER>
IFNDEF LUUO20,<LUUO20=$UUOER>
IFNDEF LUUO21,<LUUO21=$UUOER>
IFNDEF LUUO22,<LUUO22=$UUOER>
IFNDEF LUUO23,<LUUO23=$UUOER>
IFNDEF LUUO24,<LUUO24=$UUOER>
IFNDEF LUUO25,<LUUO25=$UUOER>
IFNDEF LUUO26,<LUUO26=$UUOER>
IFNDEF LUUO27,<LUUO27=$UUOER>
IFNDEF LUUO30,<LUUO30=$UUOER>
IFNDEF LUUO31,<LUUO31=$UUOER>
IFNDEF LUUO32,<LUUO32=$UUOER>
IFNDEF LUUO33,<LUUO33=$UUOER>
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
BYTE (3)0(9)MCNVER(6)0(18)DECVER
PROMPT: ASCIZ "SMFILE>"
CMDFNC:
REPEAT 0,<
FLDBK. (.CMKEY,,MAINCM,,,[BRMSK.(KEYB0.,KEYB1.,KEYB2.,KEYB3.,\"32)])
>
REPEAT 1,<
FLDDB. (.CMKEY,,MAINCM)
>
SCMTAB MAINCM
REPEAT 0,<
CMTAB \"32,.EXIT1
>
CMABR D,EPOSIT,DEP
CMABR DE,POSIT,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 <RPCAP FAILED>
TLO T3,(SC%CTC+SC%GTB)
EPCAP
ERMSG <EPCAP FAILED>
MOVEI T1,.FHSLF ;THIS FORK
MOVE T2,[LEVTAB,,CHNTAB]
SIR
ERMSG <CAN NOT SET ADDRESS OF LEVTAB AND CHNTAB>
MOVE T1,[.TICCX,,^D30]
ATI
ERMSG <CAN NOT ENABLE CONTROL-X>
MOVE T1,[.TICCC,,^D31]
ATI
ERMSG <CAN NOT ENABLE CONTROL-C>
MOVE T1,[.TICCZ,,^D32]
ATI
ERMSG <CAN NOT ENABLE CONTROL-Z>
MOVE T1,[.TICCT,,^D33]
ATI
ERMSG <CAN NOT ENABLE CONTROL-T>
MOVE T1,[.TICCo,,^D34]
ATI
ERMSG <CAN NOT ENABLE CONTROL-o>
MOVEI T1,.FHSLF
MOVEI T2,1B19+1B30+1B31+1B32+1B33+1b34
AIC
ERMSG <AIC FAILED>
EIR
ERMSG <EIR FAILED>
JRST NEXT ;JOIN MAIN LOOP
SUBTTL MAIN LOOP
CMDERR: SKIPN MONTYP
JRST CMDE10
PUSH P,T2
MOVEI T1,.FHSLF
GETER
ERMSG <CMDERR: GETER FAILED>
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,<NOT A VALID COMMAND>
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 <GETER FAILED>
TLZ T2,-1
CAIE T2,IOX4
CALL JSHLT0
EOCF: MOVEI [ASCIZ "
[END OF COMMAND FILE]
SMFILE>"]
PNTALF
HLRZ T1,CSB+.CMIOJ
CLOSF
ERR <CAN NOT CLOSE COMMAND FILE>
MOVE T1,[.PRIIN,,.PRIOU]
MOVEM T1,CSB+.CMIOJ
SETZM INTAKE
RTN
;*COMMAND PARSER SUBROUTINES
CFMCMD: CMD CFM,<MUST END LINE WITH RETURN>
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)],<NO INFORMATION ABOUT THAT>
HRRZ T1,(T2)
PUT T1
CONFIRM
GETIT T1
JRST (T1)
IFREE: SKIPN MONTYP
JRST IFREE10
SKIPN FESETF
ERR <FE-FILE SYSTEM NOT SETUP>
PMSG <^FRONT-END FREE PAGES = >
HRRZ FEDIR+FSL
PNTDCF
PCRLF
PCRLF
RTN
IFREE10:PMSGF <N/A - TOPS-10^>
RTN
IFEFILE:SKIPN FESETF
ERR <FE-FILE SYSTEM NOT SETUP>
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 <FE-FILE SYSTEM NOT SETUP>
SKIPN MONTYP
JRST IDSK10 ;TOPS-10
HRROI T1,STBUF
HRRZ T2,FEJFN
MOVSI T3,(1B2)
JFNS
ERMSG <CAN NOT GET STRUCTURE NAME>
PMSGF <^USING >
MOVEI STBUF
PNTALF ;PRINT STRUCTURE
PTAB
MOVE T1,DSKTYP
CAIN T1,.MSRP4
PMSGF <RP04>
CAIN T1,.MSRP5
PMSGF <RP05>
CAIN T1,.MSRP6
PMSGF <RP06>
CAIN T1,11
PMSGF <RM03>
PCRLF
PCRLF
RTN
IDSK10: PMSGF <^USING >
MOVE DIRDEV
PNTSXF ;PRINT STRUCTURE
PTAB
MOVE T1,DSKTYP
CAIN T1,.DCUR4
PMSGF <RP04>
CAIN T1,.DCUR6
PMSGF <RP06>
CAIN T1,.DCUR3
PMSGF <RM03>
PCRLF
PCRLF
RTN
SUBTTL COMMANDS -- PUSH
PUSHCM: NOISE <COMMAND LEVEL>
CONFIRM
SKIPN MONTYP
JRST PUSH10
MOVSI T1,(GJ%SHT)
HRROI T2,[ASCIZ "PS:<SYSTEM>EXEC.EXE.0"]
GTJFN
ERMSG <CAN NOT GET JFN ON EXEC>
HRRZM T1,EXJFN#
MOVSI T2,(CR%CAP)
CFORK
ERMSG <CAN NOT CREATE AN EXEC FORK>
HRRZM T1,EXFORK#
HRLZ T1,T1
HRR T1,EXJFN
GET
ERMSG <CAN NOT GET EXEC>
HRRZ T1,EXFORK
MOVEI T2,0
SFRKV
ERMSG <CAN NOT START EXEC>
WFORK
pushpc: ERMSG <PUSH: WFORK ERROR>
KFORK
ERMSG <CAN NOT KILL EXEC FORK>
RTN
PUSH10: SETZB T1,T2 ;NO RUN, NO TMPCOR
PUSHJ P,CTX ;DO IT
JFCL ;DON'T CARE, MESSAGE TYPED
RTN
SUBTTL CTX. UUO DEFINITIONS
OPDEF CTX. [CALLI 215] ;UUO TO MANIPULATE JOB CONTEXTS
.CTFNC==0 ;FUNCTION CODE WORD
CT.PHY==1B0 ;PHYSICAL ONLY RUN UUO
CT.LEN==777B17 ;LENGTH OF BLOCK INCLUDING THIS WORD
CT.FNC==777777B35 ;FUNCTION CODE
.CTSVH==0 ;SAVE CURRENT CONTEXT, HALT JOB
.CTSVR==1 ;SAVE CURRENT CONTEXT, RUN PROGRAM
.CTSVT==2 ;SAVE CURRENT CONTEXT, CREATE A TOP LEVEL
.CTSVS==3 ;SAVE CURRENT CONTEXT, SWITCH TO ANOTHER
.CTSVD==4 ;SAVE CURRENT CONTEXT, RUN PROGRAM
.CTRDB==5 ;READ DATA BUFFER
.CTWDB==6 ;WRITE DATA BUFFER
.CTRQT==7 ;READ QUOTAS INTO DATA BUFFER
.CTSQT==10 ;SET QUOTAS IN DATA BUFFER
.CTDIR==11 ;RETURN A DIRECTORY MAP OF ALL CONTEXTS
.CTINF==12 ;RETURN INFORMATION ABOUT A CONTEXT
.CTDBL==1 ;DATA BUFFER LENGTH
.CTDBA==2 ;DATA BUFFER ADDRESS
.CTNAM==3 ;SIXBIT CONTEXT NAME
.CTRNO==4 ;RUN UUO OFFSET (LH RESERVED)
.CTRNB==5 ;RUN UUO BLOCK ADDRESS
.CTTMN==6 ;TMPCOR LENGTH,,SIXBIT NAME
.CTTMB==7 ;TMPCOR BUFFER ADDRESS
.CTMAX==10 ;LENGTH OF ARGUMENT BLOCK
; DATA BUFFER OFFSETS FOR FUNCTIONS .CTRQT AND .CTSQT
.CTJOB==0 ;JOB NUMBER
.CTCTQ==1 ;CONTEXT QUOTA
.CTPGQ==2 ;SAVED PAGES QUOTA
; DATA BUFFER OFFSETS FOR FUNCTION .CTDIR
;.CTJOB==0 ;JOB NUMBER
.CTWCT==1 ;RETURNED WORD COUNT OF BYTE-STREAM DATA
.CTFDW==2 ;FIRST DATA WORD OF DIRECTORY BYTE-STREAM
; DATA BUFFER OFFSETS FOR FUNCTION .CTINF
;.CTJOB==0 ;JOB NUMBER
.CTCNO==1 ;THIS CONTEXT'S NUMBER
.CTCNM==2 ;THIS CONTEXT'S NAME
.CTSNO==3 ;SUPERIOR'S CONTEXT NUMBER
.CTSNM==4 ;SUPERIOR'S CONTEXT NAME
.CTPGM==5 ;PROGRAM NAME
.CTITM==6 ;IDLE TIME IN TICKS
; ON ANY RETURN, THE AC WILL CONTAIN THE FOLLOWING
CT.DAT==1B0 ;DATA WORDS RETURNED
CT.DBT==1B1 ;DATA BUFFER TRUNCATED
CT.ETX==1B2 ;UUO ERROR TEXT IN DATA BUFFER
CT.RUN==1B3 ;RUN UUO ERROR
CT.RDL==777B27 ;WORDS IN DATA BUFFER
CT.ERR==777B35 ;ERROR CODE
; CTX. UUO ERROR CODES
CXIFC%==00 ;ILLEGAL FUNCTION CODE
CXACR%==01 ;ADDRESS CHECK READING ARGUMENTS
CXACS%==02 ;ADDRESS CHECK STORING ANSWERS
CXNEA%==03 ;NOT ENOUGH ARGUMENTS
CXNLI%==04 ;NOT LOGGED IN
CXLOK%==05 ;LOCKED IN CORE
CXDET%==06 ;DETACHED
CXSCE%==07 ;SYSTEM CONTEXT QUOTA EXCEEDED
CXSPE%==10 ;SYSTEM PAGE QUOTA EXCEEDED
CXJCE%==11 ;JOB CONTEXT QUOTA EXCEEDED
CXJPE%==12 ;JOB PAGE QUOTA EXCEEDED
CXNCS%==13 ;NOT ENOUGH CORE TO SAVE CONTEXT
CXNCD%==14 ;NOT ENOUGH CORE TO RETURN DATA BLOCK
CXICN%==15 ;ILLEGAL CONTEXT NUMBER
CXNSC%==16 ;NO SUPERIOR CONTEXT
CXNPV%==17 ;NO PRIVILEGES TO SET QUOTAS
CXIJN%==20 ;ILLEGAL JOB NUMBER
CXCSI%==21 ;CANNOT SWITCH TO AN INTERMEDIATE CONTEXT
CXCDI%==22 ;CANNOT DELETE AN INTERMEDIATE CONTEXT
CXCDC%==23 ;CANNOT DELETE THE CURRENT CONTEXT
CXCNP%==24 ;CONTEXT NOT PRIVILEGED
CXNDA%==25 ;NO DATA BLOCK AVAILABLE
; ROUTINE TO SAVE AND OPTIONALLY RUN A PROGRAM IN
; AN ALTERNATE CONTEXT.
; CALL: MOVE T1, ZERO OR OPTIONAL RUN UUO BLOCK POINTER
; MOVE T2, ZERO OR OPTIONAL BUFLEN,,BUFFER OF EDT TMPCOR TO WRITE
; PUSHJ P,CTX
; <NON-SKIP> ;CTX. UUO FAILED, ERROR MESSAGE TYPED
; <SKIP> ;CONTEXT SAVED AND RESTORED
CTX: ADJSP P,.CTMAX+20 ;ALLOCATE DATA AREA
PUSH P,[[CAIA
AOS -<.CTMAX+20>(P)
ADJSP P,-<.CTMAX+20>
RTN]]
DEFINE CTXARG,<-<.CTMAX+20>(P)>
DEFINE CTXDAT,<-<20>(P)>
MOVEI T3,CTXARG ;POINT TO ARG BLOCK
MOVEM T1,.CTRNB(T3) ;SAVE POSSIBLE RUN UUO BLOCK
HLLZM T2,.CTTMN(T3) ;SAVE TMPCOR BUFFER LENGTH
HRRZM T2,.CTTMB(T3) ;SAVE TMPCOR BUFFER ADDRESS
SKIPN T1 ;RUNNING A PROGRAM?
SKIPA T1,[.CTSVH] ;FUNCTION CODE TO SAVE AND HALT
MOVEI T1,.CTSVR ;FUNCTION CODE TO SAVE AND RUN
HRLI T1,.CTMAX ;INCLUDE ARGUMENT BLOCK LENGTH
MOVEM T1,.CTFNC(T3) ;SAVE
MOVEI T4,(SIXBIT/EDT/);EDT IS THE TMPCOR FILE NAME
SKIPE T2 ;WRITING TMPCOR?
HRRM T4,.CTTMN(T3) ;YES--SAVE TMPCOR FILE NAME
SETZM .CTNAM(T3) ;NO CONTEXT NAME
MOVEI T1,20 ;LENGTH OF DATA BLOCK
MOVEM T1,.CTDBL(T3) ;SAVE
MOVEI T1,CTXDAT ;ADDR OF DATA BLOCK
MOVEM T1,.CTDBA(T3) ;SAVE
MOVE T1,T3 ;POINT TO ARG BLOCK
CTX. T1, ;FIRE UP AN ALTERNATE CONTEXT
SKIPA ;FAILED
JRST RSKP ;RETURN
PMSGF <? Cannot save context; >
MOVEI T4,CTXER1 ;DEFAULT TO GENERIC ERROR MESSAGE
CAMN T1,T3 ;UUO LEAVE AC UNCHANGED?
MOVEI T4,CTXER0 ;YES--NOT IMPLEMENTED
TXNE T1,CT.RUN ;RUN UUO ERROR?
MOVEI T4,CTXER2 ;YES
TXNE T1,CT.ETX ;CTX. UUO ERROR TEXT IN DATA BUFFER?
MOVEI T4,CTXER3 ;YES
JRST (T4) ;DETAIL
CTXER0: PMSGF <CTX. UUO not implemented>
JRST CTXERE
CTXER1: PMSGF <CTX. UUO error >
CTXERO: LDB 0,[POINTR(T1,CT.ERR)]
PNTOCS
CTXERE: PCRL
RET
CTXER2: PMSGF <RUN UUO error >
JRST CTXERO
CTXER3: MOVEI CTXDAT
PNTAL
JRST CTXERE
SUBTTL COMMANDS -- DEBUG
SCMTAB SETCLR
CMTAB CLEAR,[0]
CMTAB SET,[-1]
ECMTAB
SCMTAB DBFLGS
CMTAB DEBUG,DEBUGF
ECMTAB
SETDEB: CMD [FLDDB.(.CMKEY,,SETCLR)],<MUST BE 'SET' OR 'CLEAR'>
HRRZ T1,(T2) ;GET POINTER
MOVE T6,(T1) ;GET FLAG
CMD [FLDDB.(.CMKEY,,DBFLGS)],<NOT A DEBUG FLAG>
HRRZ T5,(T2) ;PLACE TO STORE ANSWER
NOISE <FLAG>
CONFIRM
MOVEM T6,(T5) ;SET/CLEAR FLAG
RTN
SUBTTL COMMANDS -- ECHO
SCMTAB YESNO
CMTAB NO,0
CMTAB YES,777777
ECMTAB
ECHO: NOISE <COMMAND FILES>
CMD [FLDDB.(.CMKEY,,YESNO,<YES OR NO>,<YES>)]
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)],<CAN NOT DEPOSIT THAT>
HRRZ T1,(T2)
JRST (T1)
;*HERE TO STORE INTO CRAM
DPBC1: SETOM BC1FLG#
JRST DPCRAM+1
DPCRAM: SETZM BC1FLG
NOISE <LOCATION>
CMD [FLDDB.(.CMNUM,,^D8)],<NOT A VALID CRAM ADDRESS>
SKIPL T2
CAIL T2,4000
ERR <ADDRESS MUST BE 0 TO 3777>
MOVEM T2,EXMADR
CONFIRM
MOVE T6,EXMADR
SETOM DEPFLG
GO DPYFLD
RTN
SUBTTL COMMANDS -- SERIAL
SERIAL: NOISE <CPU SERIAL NUMBER (4097 TO 32767) INTO MICROCODE>
CMD [FLDDB.(.CMNUM,,^D10)],<NOT A VALID SERIAL NUMBER>
MOVEM T2,SNBR#
CONFIRM
MOVE T2,SNBR
SKIPL T2
CAIGE T2,^D4097
ERR <NOT A VALID SERIAL NUMBER>
CAILE T2,^D32767
ERR <NOT A VALID SERIAL NUMBER>
SKIPN RDFLAG
ERR <MUST FIRST READ MICROCODE WITH READ COMMAND>
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,<CAN NOT EXAMINE THAT>
HRRZ T1,(T2)
JRST (T1)
;*EXAMINE CRAM
EXBC1: SETOM BC1FLG
JRST EXCRAM+1
EXCRAM: SETZM BC1FLG
NOISE <LOCATION>
CMD [FLDDB.(.CMNUM,,^D8)],<NOT A VALID CRAM LOCATION>
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 <TO MONITOR>
CONFIRM
.EXIT1: 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 <HELP: CAN NOT CLOSE HELP FILE>
RTN
NOHELP: PMSGF <?CAN NOT READ >
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 <SMFILE.HLP NOT FOUND>
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)],<CAN NOT WRITE THAT>
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 <CAN NOT GET STRUCTURE NAME>
SKIPN DEBUGF
GO FIND ;FIND PHYSICAL DISK
HRROI T1,STBUF
STDEV
ERR <STDEV FAILED FOR STRUCTURE>
MOVEM T2,STRDES#
HRRZ T1,FEJFN
MOVE T2,[1,,.FBCTL]
MOVEI T3,T3
GTFDB
ERMSG <WRTSETUP: GTFDB FAILED>
TLNE T3,(FB%NXF) ;DOES FILE EXIST
ERR <FRONT-END FILE DOES NOT EXIST>
MOVE T2,[1,,.FBBYV]
MOVEI T3,T3
GTFDB
ERMSG <WRITE: GTFBD FOR SIZE FAILED>
TLZ T3,FB%PGC ;JUST PAGE COUNT
CAIGE T3,^D48
ERR <BOOTSTRAP.BIN FILE TOO SMALL>
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,,<FEDIR_-^D9>]
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 <NO DISK ADDRESS IN HOME BLOCK>
SKIPN HOMPAG+200+102
ERR <NO LENGTH IN HOME BLOCK>
WRTSEX: SETOM FESETF#
SETZM FERSETF#
RTN
;*WRTRSET - RESET FE-DIRECTORY
WRTRSET:CONFIRM
SKIPN FESETF ;FE-DIR IN CODE ?
ERR <FE-FILE SYSTEM NOT SETUP>
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 <DISK IS NOT A VALID TYPE>
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 <DISK IS NOT A VALID TYPE>
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 <CAN'T FIND DISK>
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 <DIAGNOSTIC PRE-BOOT CODE WORD INCORRECT>
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
BOOTPA=20 ;ADDRESS OF BOOTSTRAP (TOPS-10 NEEDS ACROSS RELOADS)
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 <BUFSIZ==400>
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 <FE-FILE SYSTEM NOT SETUP>
SKIPN FERSETF
ERR <FE-FILE SYSTEM NOT RESET>
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 <NOT ENOUGH FREE SPACE>
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,,<WINDOW_-^D9>]
MOVE T3,[PM%WR!PM%RD]
PMAP ;GET MONITOR PRE-BOOT IN FE-FILE
ERJMP [JSERR
JRST START]
MOVE [BTSTR1,,WINDOW]
BLT WINDOW+<RPPAGX-BTSTR1>
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 <FE-FILE SYSTEM NOT SETUP>
SKIPN FERSETF
ERR <FE-FILE SYSTEM NOT RESET>
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 <NOT ENOUGH FREE SPACE>
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,,<WINDOW_-^D9>]
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 <FE-FILE SYSTEM NOT SETUP>
SKIPN FERSETF
ERR <FE-FILE SYSTEM NOT RESET>
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 <NOT ENOUGH FREE SPACE>
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,,<WINDOW_-^D9>]
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 <CAN'T OVERLOAD PRE-BOOT PAGE>
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,,<GENPAG_-^D9>]
MOVE T3,[PM%RD]
PMAP ;GET PAGE IN SELF
ERJMP [JSERR
JRST START]
MOVE T1,P1 ;SET UP PMAP ARGUMENTS
MOVE T2,[.FHSLF,,<IPAG_-^D9>]
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 <FILE NOT FOUND>
MOVE T1,LOOK10+.RBNAM
MOVEM T1,O.NAM1 ;SAME NAME AS INPUT
;A01 TO CLEAR WHEN THE TIME COMES
MOVEM T1,FILE ;Used by CLRNDL and SETNDL
MOVEM T1,BOONAM# ;Will be used when setting after write
MOVE T1,[SIXBIT/RIM/];Not the address
MOVEM T1,EXT ;Used by CLRNDL and SETNDL
GO CLRNDL ;Will error if file doesn't exist
JFCL ;ERR NEW FILE WILL BE CREATED IN PLACE ANYWAY
;A01END
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 <FILE NOT EVEN MULTIPLE OF PAGES>
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 <FILE ENTER FAILURE>
;*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 <NOT A DIRECTORY OR ONE WE CAN'T HANDLE>
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
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 <PAGES IN EXE DIR AREN'T MONOTONICALLY INCREASING>
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 <CAN'T OVERLOAD PRE-BOOT PAGE>
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 <WRITE ERROR>
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+<RPPAGX-BTSTR1>
RTN ;DONE
;HERE TO READ DIAGNOSTIC BOOT EXE FILE
WDB10: GO OPNTEN ;OPEN INPUT FILE
ERR <FILE NOT FOUND>
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 <FILE NOT EVEN MULTIPLE OF PAGES>
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 <FILE ENTER FAILURE>
;*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 <NOT A DIRECTORY OR ONE WE CAN'T HANDLE>
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
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 <PAGES IN EXE DIR AREN'T MONOTONICALLY INCREASING>
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 <CAN'T OVERLOAD PRE-BOOT PAGE>
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 <WRITE ERROR>
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 <FILE NOT FOUND>
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 <FILE NOT EVEN MULTIPLE OF PAGES>
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 <FILE ENTER FAILURE>
;*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 <NOT A DIRECTORY OR ONE WE CAN'T HANDLE>
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
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 <PAGES IN EXE DIR AREN'T MONOTONICALLY INCREASING>
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 <CAN'T OVERLOAD PRE-BOOT PAGE>
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 <WRITE ERROR>
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,BOOTPA ;SAVE BOOT DATA VECTOR ADDRESS
MOVEM T1,BTSV20
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
MOVE BTSV20 ;RESTORE BOOT DATA VECTOR
MOVEM BOOTPA
JRST @17 ;HALT AT APPROPRIATE HALT
RDADON:!MOVE 1(T3) ;GET START ADDRESS
EXCH BTSV20 ;STORE START ADDRESS, GET BOOT DATA VECTOR
MOVEM BOOTPA ;RESTORE BDV
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 @BTSV20 ;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
BTSV20:! 0 ;SAVED BDV ADDRESS
BTVER:! BYTE (3)0(9)MCNVER(6)0(18)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 ;CORE PAGE #S FOR EACH DISK PAGE
RPPAGX: 0
IFG <.-BTSTR1>-1000,<PRINTX ?DISK BOOTSTRAP BIGGER THAN 1 PAGE>
;*WRITE MICRO-CODE ONTO DISK
WRTBC1: SETOM BC1FLG
JRST WRTCRM+1
WRTCRM: SETZM BC1FLG
NOISE <MICROCODE ONTO DISK>
CONFIRM
SKIPN FESETF ;FE-DIR IN CODE ?
ERR <FE-FILE SYSTEM NOT SETUP>
SKIPN RDFLAG
ERR <MUST FIRST READ MICROCODE WITH READ COMMAND>
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 <CAN NOT SET FILE POINTER>
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 <CAN NOT SET FILE POINTER>
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)],<NOT A VALID FILE NUMBER>
SKIPL T2
CAILE T2,366
ERR <NOT A VALID FILE NUMBER>
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 <FE-FILE SYSTEM NOT SETUP>
SKIPN MONTYP
JRST FEF10 ;TOPS-10
HRRZ T1,FEDIR+FSL ;GET FREE SPACE LENGTH
CAIGE T1,1 ;THIS NEEDS ONE PAGE
ERR <NOT ENOUGH FREE SPACE>
HLRZ T1,FEFJFN
MOVEI T2,OF%RD
OPENF ;OPEN FILE
ERR <INDIRECT OPEN ERROR>
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,,<GENPAG_-^D9>]
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 <INDIRECT CLOSE ERROR>
GO FEIFMT ;FORMAT INDIRECT FILE
MOVE T1,[.FHSLF,,<IPAG_-^D9>]
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 <INDIRECT CLOSE ERROR>
ERR <INDIRECT WRONG LENGTH>
;*FEF10, TOPS-10 WRITE FRONT-END INDIRECT FILES
FEF10: GO OPNTEN ;OPEN INPUT FILE
ERR <FILE NOT FOUND>
MOVE T1,LOOK10+.RBSIZ ;GET FILE SIZE IN WORDS
CAILE T1,^D512 ;MUST BE ONE PAGE OR LESS
ERR <INDIRECT WRONG LENGTH>
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 <FILE ENTER ERROR>
OUT WC,[IOWD ^D512,IPAG
0]
SKIPA
ERR <WRITE ERROR>
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 <INDIRECT FILE TOO BIG>
;*TYPE, TYPE CONTENTS OF INDIRECT FILE
SCMTAB ..TYPE
CMTAB INDIRECT,TYPEFI
ECMTAB
.TYPE: CMD [FLDDB.(.CMKEY,,..TYPE)],<CAN NOT TYPE THAT>
HRRZ T1,(T2)
JRST (T1)
TYPEFI: CMD [FLDDB.(.CMNUM,,^D8)],<NOT A VALID FILE NUMBER>
SKIPL T2
CAILE T2,366
ERR <NOT A VALID FILE NUMBER>
MOVEM T2,FEFNBR
CONFIRM
SKIPN FESETF
ERR <FE-FILE SYSTEM NOT SETUP>
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 <INDIRECT FILE DOES NOT EXIST>
HRL T1,FEJFN
MOVE T2,[.FHSLF,,<IPAG_-^D9>]
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 <INDIRECT FILE DOES NOT EXIST>
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 <INDIRECT FILE DOES NOT EXIST>
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 <FE-FILE SYSTEM NOT SETUP>
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,,<FEDIR_-^D9>]
SETZ T3,
PMAP ;UNMAP FE-DIR PAGE
ERJMP [JSERR
JRST START]
MOVE T1,FEJFN
CLOSF
ERR <CAN NOT CLOSE BOOTSTRAP.BIN>
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 <KS10FE.BIN ENTER ERROR>
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 <KS10FE.BIN OUTPUT ERROR>
SOJG T2,WRTD11
CLOSE DAT,
RELEAS DAT,
;A01 Only here to set "Not to be DeLeted bits after both files have been
;created
MOVE T1,FEEXT ;Get ext used when KS10FE was found
MOVEM T1,EXT ;Put it where SETNDL will use it
MOVE T1,FENAM ;Retrieve whatever name its called these days
MOVEM T1,FILE ;For use by NDL INIT routine
GO SETNDL ;Make it 1 whatever it was
ERR <ERROR SETTING NDL FOR KS10FE>
MOVE T1,[SIXBIT/RIM/];If this changes we're in trouble
MOVEM T1,EXT ;Put it where it's needed
MOVE T1,BOONAM ;Same name as used when cleared
MOVEM T1,FILE ;For use by NDL INIT routine
GO SETNDL ;Turn on "not to be DeLeted" bit
ERR <ERROR SETTING NDL FOR KSBOOT>
;A01END
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 <BADHOM: GETER FAILED>
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 <MICROCODE FROM FILE>
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 <CAN NOT OPEN MICROCODE FILE>
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,,<CRAM_-^D9>]
SKIPE BC1FLG
MOVE T2,[.FHSLF,,<CRMBC1_-^D9>]
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 <CAN NOT CLOSE MICROCODE FILE>
SETOM RDFLAG
RTN
READF: HLRZ T1,UCFILE
CLOSF ;CLOSE OUT BAD FILE
ERR <CAN NOT CLOSE MICROCODE FILE>
ERR <MICROCODE FILE WRONG LENGTH>
RTN
;*TOPS-10 MICROCODE READ PROCESS
READ10: GO OPNTEN ;OPEN INPUT FILE
ERR <FILE NOT FOUND>
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 <FILE WRONG LENGTH>
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
NDL=7 ;A01 Channel for super I/O update
;*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
;A01 Definitions and blocks for super I/O patch
Z.NDLB:! ;BEGINING OF DATA FOR SET/CLEAR NDL
IOLIST: BLOCK 2 ;I/O COMMAND LIST
OPN: BLOCK 3 ;OPEN BLOCK
RIB: BLOCK 200 ;LOOKUP/ENTER AND RIB BLOCK
Z.NDLE==.-1 ;END OF DATA FOR SET/CLEAR NDL
0
.RBSLF==177 ;Approx end of input buf
RP.NDL=1B19 ;A01 SPECIFY 'NOT TO BE DELETED'
;A01END of definitions for super I/O patch
;*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 <READ ERROR>
TRNN C,1B22 ;SEE IF END OF FILE
ERR <SHOULD NEVER HAPPEN>
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 <WRITE ERROR>
;*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 <TOPS-10 OPEN ERROR>
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 <TOPS-10 OPEN ERROR>
MOVE T1,GTJFIL ;SETUP FILE NAME
MOVEM T1,ODAT10+.RBNAM
;A01 Two instructions for SPR 10-32756
MOVEM T1,FILE# ;A01 For use by NDLINI via CLRNDL
MOVEM T1,FENAM# ;And save for setting after WRITE DONE
MOVE T1,GTJEXT ;SETUP FILE EXT
MOVEM T1,ODAT10+.RBEXT
;A01 Two instructions for SPR 10-32756
MOVEM T1,EXT# ;Used by NDLINI via CLRNDL
MOVEM T1,FEEXT# ;And save for final set
MOVE T1,GTJDIR ;SETUP PPN
MOVEM T1,ODAT10+.RBPPN
MOVEI T1,17
MOVEM T1,ODAT10
;A01 The following patch is to clear potential NDL bit when
;KS10FE already exists.
;Two instructions for SPR 10-32756
GO CLRNDL ;Make it 0 what ever it was
SKIPA ;ERR WILL MAKE A NEW FILE AND TRY AGAIN
;A01END
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 <TOPS-10 OPEN ERROR>
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 <TOPS-10 OPEN ERROR>
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 ;WE DID IT
RTN ;Error return
JRST CPOPJ1 ;Give skip (good) return
;A01 The following subroutine, SETNDL & CLRNDL,
;was inserted to control the NDL bit for files
;KS10FE.BIN and KSBOOT.RIM. The intent is to make it more
;difficult for these files to be deleted and moved because they
;are pointed to in the home block.
;calling SETBIT works the same as calling CLRBIT except that NDL
;bit is turned on instead of off
SEARCH UUOSYM
CLRNDL: TDZA T1,T1 ;CLEAR NO DELETE BIT
SETNDL: MOVEI T1,RP.NDL ;SET NO DELETE BIT
PUSH P,T1 ;SAVE THE BIT
PUSHJ P,NDLINI ;INIT STORAGE
OPEN NDL,OPN ;OPEN A CHANNEL
JRST OPNERR ;FAILED
LOOKUP NDL,RIB ;LOOK FOR THE FILE
JRST LKPERR ;FAILED
USETI NDL,0 ;THE PRIME RIB (BLOCK ZERO)
IN NDL,IOLIST ;READ IN THE RIB
SKIPA ;ALL IS WELL
JRST IOERR ;FAILED
CLOSE NDL,CL.DAT ;CLOSE OFF THE CHANNEL
MOVEI T1,RP.NDL ;BIT IN QUESTION
ANDCAM T1,RIB+.RBSTS ;FIRST CLEAR IT
MOVE T1,(P) ;GET SET/CLEAR FLAG
IORM T1,RIB+.RBSTS ;POSSIBLY SET THE BIT
MOVE T1,RIB+177 ;GET SELF BLOCK NUMBER
TLO T1,(<NDL>B12) ;INCLUDE THE CHANNEL NUMBER
SUSET. T1, ;POSITION FOR OUTPUT
JRST IOERR ;CALL IT AN I/O ERROR
OUT NDL,IOLIST ;REWRITE THE RIB
AOSA -1(P) ;ALL IS WELL
JRST IOERR ;I/O ERROR
JRST DONE ;AND FINISH UP
OPNERR: SETO T1, ;OPEN FAILURE
LKPERR: TLOA T1,-1 ;LOOKUP ERROR
IOERR: GETSTS NDL,T1 ;I/O ERROR
DONE: RELEAS NDL, ;RELEASE CHANNEL
POP P,(P) ;PHASE STACK
POPJ P, ;RETURN
NDLINI: MOVE T1,[Z.NDLB,,Z.NDLB+1] ;SET UP BLT
SETZM Z.NDLB ;CLEAR FIRST WORD
BLT T1,Z.NDLE ;ZERO STORAGE
;I/O COMMAND LIST
MOVE T1,[IOWD 200,RIB] ;POINTER TO BUFFER FOR I/O
MOVEM T1,IOLIST
;OPEN BLOCK
MOVEI T1,.IODMP ;DUMP MODE
MOVEM T1,OPN+.OPMOD
MOVE T1,DEVICE ;DEVICE NAME ORIGINALLY FOUND
MOVEM T1,OPN+.OPDEV
SETZM OPN+.OPBUF ;NO BUFFER RING HEADERS
;LOOKUP/ENTER BLOCK
MOVEI T1,.RBMAX+1 ;LENGTH OF BLOCK
MOVEM T1,RIB+.RBCNT
MOVE T1,PPN ;ORIGINAL PPN FOUND WITH MAGIC CMD IN WRTSET:
MOVEM T1,RIB+.RBPPN ;WILL NOT CHANGE THROUGH OUT PROG
MOVE T1,FILE ;FILE NAME
MOVEM T1,RIB+.RBNAM
MOVE T1,EXT ;EXTENSION
MOVEM T1,RIB+.RBEXT
POPJ P, ;RETURN
;A01END OF SUPERI/O PATCH THAT STARTED AT CLRBIT:
SUBTTL TOPS-10 INDIRECT COMMAND FILE PROCESS
$CCL: SKIPE $CCLF ;ALREADY DOING INDIRECT ?
ERR <CCL COMMAND ERROR>
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 <CCL OPEN ERROR>
INBUF $CHN,1 ;ONE BUFFER
LOOKUP $CHN,CCLDIR ;FIND COMMAND FILE
ERR <CCL FILE NOT FOUND>
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 <CCL FILE READ ERROR>
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
;A01 The following inst is for SPR 10-32756
MOVEM T2,PPN# ;For NDL super I/O
MOVE T2,GTJDEV ;GET STRUCTURE NAME
MOVEM T2,DIRDEV
MOVEM T2,DATDEV ;SAVE IT
;A01 The following inst is for SPR 10-32756
MOVEM T2,DEVICE# ;Used by NDLINI for SET & CLR of NDL
MOVE T1,[0,,DIRDEV] ;STATUS AT LOC+0
DSKCHR T1,
ERR <DEVICE SELECTION ERROR>
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 <NOT AN RH10/RH20 CONTROLLER>
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 <NOT AN RP04/RP06/RM03 DISK>
CTLROK: MOVE T1,[16,,DIRDEV] ;PHYNAME AT LOC+15
DSKCHR T1, ;GET PHY DEVICE NAME
ERR <DEVICE SELECTION ERROR>
MOVE T1,[16,,DATDEV]
DSKCHR T1,
ERR <DEVICE SELECTION ERROR>
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 <HOM CHN OPEN ERROR>
MOVEI T3,HMBK01 ;GET HOME BLK #1
GO RADHOM
ERR <HOME BLOCK #1 READ ERROR>
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 <KS10FE.BIN WRONG SIZE>
USETI DAT,PRIME ;GET LOGICAL BLK # OF 1ST BLK
IN DAT,[IOWD 200,GETBUF
0]
SKIPA
ERR <PRIME RIB READ ERROR>
GO GOARND+4
CAME T1,BTLADR ;HOME BLOCK & FILE AGREE ?
ERR <KS10FE.BIN HOME BLOCK & FILE ADDRESSES DIFFER>
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 <KS10FE.BIN READ ERROR>
TRNN T1,1B22 ;END OF FILE ?
ERR <SHOULD NEVER HAPPEN>
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 <SUSET. UUO FAILURE>
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 <SUSET. UUO FAILURE>
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 <DUMP MODE OPEN ERROR>
MOVEI T1,17 ;GET # OF ARGUMENTS
MOVEM T1,LOOK10 ;SAVE # OF ARGS IN LOOKUP BLK
LOOKUP RC,LOOK10 ;LOOKUP THE FILE
ERR <CAN'T FIND FILE>
JRST GOARND ;GO AROUND
GETBK2: GO OPRCDP ;USE DUMP MODE INPUT
ERR <DUMP MODE OPEN ERROR>
MOVEI T1,17 ;GET # OF ARGUMENTS
MOVEM T1,ENTBLK ;SAVE IT
LOOKUP RC,ENTBLK ;LOOKUP THE OUTPUT FILE
ERR <CAN'T FIND FILE>
GOARND: USETI RC,PRIME ;SET UP TO READ PRIME RIB
IN RC,[IOWD 200,GETBUF
0 ] ;READ THE PRIME RIB
SKIPA
ERR <PRIME RIB READ ERROR>
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>+1 ;28 PAGES, AND A BLOCK FOR ENTROPY
MOVEM T1,S.ALO#
GO ETER10 ;ENTER FILE
ERR <ERROR CREATING KS10FE.BIN>
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 <HOME BLOCK #1 WRITE ERROR>
;*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 <SUSET. UUO FAILURE>
IN HOM,H10LST ;BRING IN HOME BLK #10
JRST .+2 ;READ OK
ERR <HOME BLOCK #10 READ ERROR>
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 <SUSET. UUO FAILURE>
OUT HOM,H10LST ;OUTPUT HMBK10
SKIPA
ERR <HOME BLOCK #10 WRITE ERROR>
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 <MICROCODE IS NOT IN CORRECT FORMAT>
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,,<IPAG_-^D9>]
SETZ T3,
PMAP ;RELEASE LAST INPUT PAGE
ERJMP [JSERR
JRST START]
HLRZ T1,UCFILE
CLOSF
ERR <CAN NOT CLOSE MICROCODE FILE>
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 <MICROCODE ERROR EOF>
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,,<IPAG_-^D9>]
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)],<CAN NOT OUTPUT THAT>
HRRZ T1,(T2)
JRST (T1)
;*OUTRAM, OUTPUT MICROCODE ".RAM" FILE
OUTBC1: SETOM BC1FLG
JRST OUTRAM+1
OUTRAM: SETZM BC1FLG
NOISE <MICROCODE INTO .RAM FILE>
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 <CAN NOT OPEN MICROCODE OUTPUT FILE>
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 <CAN NOT CLOSE MICROCODE OUTPUT FILE>
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 <OUTPUT OPEN FAILURE>
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 <MICROCODE OUTPUT ERROR>
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 <AS>
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 <CAN NOT OPEN MAGTAPE RDI OUTPUT FILE>
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+<MTPAGX-MTSTR1>
MOVE T1,[.FHSLF,,<WINDOW_-^D9>]
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 <CAN NOT CLOSE MAGTAPE RDI FILE>
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 <CAN NOT RELEASE MAGTAPE RDI JFN>
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 <CAN'T OVERLOAD PRE-BOOT PAGE>
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,,<GENPAG_-^D9>]
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,,<IPAG_-^D9>]
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 <FILE NOT FOUND>
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 <OUTPUT OPEN FAILURE>
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 <NOT A DIRECTORY OR ONE WE CAN'T HANDLE>
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 <WRITE ERROR>
MOVEI P2,MTPAGD+1
REDEX2: MOVE M,(T6) ;BITS,,FILE PAGE NUMBER
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 <PAGES IN EXE DIR AREN'T MONOTONICALLY INCREASING>
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 <CAN'T OVERLOAD PRE-BOOT PAGE>
GO REDPAG ;READ EXE DATA PAGE
JUMPGE T5,.+6 ;JUMP IF NOT 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
AOS P2 ;POINT TO NEXT
OUT WC,[IOWD ^D512,IPAG
0]
SKIPA
ERR <WRITE ERROR>
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+<MTPAGX-MTSTR1>
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 <WRITE ERROR>
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 BOOTPA ;SAVE TOPS-20 BDV
MOVEM MTSV20
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
MOVE MTSV20 ;RESTORE BDV
MOVEM BOOTPA
JRST @17 ;HALT AT APPROPRIATE HALT
RDMTDN:! AOS T3
MOVE (T3) ;SETUP START ADDRESS
EXCH MTSV20 ;GET BDV ADDRESS, SAVE START ADDRESS
MOVEM BOOTPA ;RESTORE PREVIOUS BDV ADDRESS
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 @MTSV20 ;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
MTSV20:! 0 ;BDV ADDRESS
MTVER:! BYTE (3)0(9)MCNVER(6)0(18)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 ;CORE PAGE #S FOR EACH MTA RECORD
MTPAGX: 0
IFG <.-MTSTR1>-1000,<PRINTX ?TAPE BOOTSTRAP BIGGER THAN 1 PAGE>
SUBTTL COMMANDS -- TAKE
TAKE: NOISE <COMMANDS FROM FILE>
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 <CAN NOT CLOSE OLD COMMAND FILE>
HRRZ T1,CMFILE
MOVE T2,[7B5+OF%RD]
OPENF
ERR <CAN NOT OPEN FILE>
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 <S/D^>
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 <A/B^>
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 <RBM^>
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 <C/LR^>
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 <UPDFLD: BKJFN FAILED>
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 <CARRIAGE RETURN NOT FOLLOWED BY LINE FEED>
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 <CAN'T GET HI-CORE>
SETZM ;MAKE IT WRITABLE
SETUWP
ERR <CAN'T MAKE HI-CORE WRITABLE>
SETZM 400000
MOVE T1,[400000,,400001]
BLT T1,400000+<^D31*^D512>-1
SETOM IC1TIM
RTN
INTCR1: SETZM ;MAKE IT WRITABLE
SETUWP
ERR <CAN'T MAKE HI-CORE WRITABLE>
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 <CONTROL-T NOUT FAILED>
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: MOVE 1,[1,,1] ;IF KL10, AC1 AFTER BLT WILL CHANGE
BLT 1,1
CAMN 1,[1,,1]
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 <ERROR HALT AT >
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 <FATAL PROGRAM ERROR AT >
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 <VERSION >
HLRZ JOBVER
ROT -6 ;JUSTIFY CONVENTIONALLY
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 <END PASS >
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 <CR> - ' 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 <CR> - >
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>