1
0
mirror of https://github.com/PDP-10/its.git synced 2026-03-06 11:23:32 +00:00

BOOTER - Dynamic Modeling login program.

This commit is contained in:
Lars Brinkhoff
2021-12-16 08:38:16 +01:00
parent 6fb68492ea
commit cbed7660b6
3 changed files with 442 additions and 0 deletions

View File

@@ -37,3 +37,7 @@ type ":vk\r"
# Survey sender demon.
respond "*" ":link sys; atsign sursnd, survey;\r"
type ":vk\r"
# Login program.
respond "*" ":midas sysbin;_syseng; booter\r"
expect ":KILL"

View File

@@ -42,6 +42,7 @@
- BKG, a Backgammon game.
- BLKLDR, Imlac secondary block loader.
- BOLIO, typesetting.
- BOOTER, Dynamic Modeling login program.
- BOOTVT, GT40 boot ROM.
- BYE, say goodbye to user. Used in LOGOUT scripts.
- CALPRT, decode a .CALL instruction's CALL block.

437
src/syseng/booter.3 Normal file
View File

@@ -0,0 +1,437 @@
;
; BOOTER - LOGIN BOOTSTRAP PROGRAM
;
TITLE BOOTER
LSTART==6 ; WHERE BOOTSTRAP LOADER WILL BE MOVED TO
PDLSIZ==20
LOC 100
LCHN==1
TYOCHN==2
TYICHN==3
PWCHN==1
MLCHN==1
A=1
B=2
C=3
D=4
P=17
DBGTTY: 21
DEBUG: 0
LCLDDT: -1 ; -1 => LOCALS GET IMMEDIATE DDT
CHKPW: 0 ; -1 => CHECK PASSWORDS FOR NON-LOCALS
; 0 => ONLY CHECK FOR GOOD UNAMES
R6PSW: 0 ; 0 => READING UNAME
; -1 => READING PSW
PXWORK: 0 ; -1 => ^PX WORKS ON TTY
DISPLY: 0 ; -1 => DISPLAY
UNAME: 0
XUNAME: 0
PSW: 0
LOCAL: 0 ; TTY IS LOCAL
TTYS1: 0 ; SAVED TTY STATUS
TTYS2: 0
TTYSS: 0
PDL: BLOCK PDLSIZ
START: MOVE P,[-PDLSIZ,PDL]
SKIPE DEBUG
JRST L0
.SUSET [.RUNAME,,A]
HLLO A,A
AOJN A,LOADIT ; ALREADY LOGGED IN -> JUST LOAD
.SUSET [.RSUPPRO,,A]
AOJN A,LOADIT ; NOT TOP LEVEL -> JUST LOAD
JRST L2
L0: .SUSET [.RCNSL,,A]
JUMPL A,LOADIT ; NO TTY -> JUST LOAD
CAME A,DBGTTY ; NOT DEBUG TTY -> JUST LOAD
JRST LOADIT
L2: PUSHJ P,OPNTTY
SKIPN LCLDDT
JRST L5
SKIPE LOCAL
JRST CLSLOD
L5: SKIPN DISPLY
JRST N1
.IOT TYOCHN,[^P]
.IOT TYOCHN,["C]
PUSHJ P,PRMAIL
N1: PUSHJ P,GTNAME
MOVEM C,UNAME
MOVEM C,XUNAME
SKIPE LOCAL
JUMPE C,CLSLOD ; LOCAL AND NO NAME GIVEN -> NO LOGIN
JUMPE C,N1 ; NOT LOCAL -> MUST GET NAME
SKIPN CHKPW ; CHECK PASSWORD?
JRST CHKUSR ; NO -> CHECK VALID USER NAME
SKIPE LOCAL
JRST CHKUSR ; LOCAL -> JUST WARN ABOUT BAD USER NAME
PUSHJ P,GTPSW
MOVE A,C ; PASSWORD
PUSHJ P,SCRAMBLE ; SCRAMBLE IT
MOVEM A,PSW
MOVE A,XUNAME
PUSHJ P,CKNAME ; GET PASSWORD FILE ENTRY
JRST BADLOG
CAMN A,PSW
JRST WIN ; WIN!
BADLOG: MOVE D,[18.,,[ASCIZ/Login incorrect.
/]]
PUSHJ P,PSTRNG
JRST N1
CHKUSR: MOVE A,XUNAME
PUSHJ P,CKNAME
JRST BADUSR ; NO SUCH USER
JRST WIN ; OK
BADUSR:
SKIPE LOCAL ; HERE IF BAD USER NAME
JRST BDLUSR ; BAD USER NAME, LOCAL TTY
MOVE D,[25.,,[ASCIZ/Unrecognized user name.
/]]
PUSHJ P,PSTRNG
JRST N1 ; GET ANOTHER NAME
BDLUSR: MOVE D,[36.,,[ASCIZ/(Warning: unrecognized user name.)
/]]
PUSHJ P,PSTRNG
JRST WIN ; LOGIN ANYWAY IF LOCAL
WIN: PUSHJ P,LOGIN
CLSLOD: .CALL [SETZ ? SIXBIT/TTYSET/ ? MOVEI TYICHN ?
TTYS1 ? TTYS2 ? SETZ TTYSS]
.VALUE
.CLOSE TYOCHN,
.CLOSE TYICHN,
JRST LOADIT
LOGIN: .CALL [SETZ ? SIXBIT/LOGIN/ ? MOVES A ? UNAME ? MOVEI 0 ? SETZ XUNAME]
JRST LOG1
.SUSET [.SXUNAM,,XUNAME]
POPJ P,
LOG1: CAIE A,%EEXFL
.VALUE ;ILLEGAL LOGIN NAME SPEC'D.
MOVE C,UNAME
MOVE A,[440600,,C] ;SPEC'D NAME IN USE - AOS IT AND TRY AGAIN.
LOG4: ILDB D,A ;FIND FIRST BLANK IN THE SPEC'D NAME.
JUMPE D,LOG6
TLNE A,770000
JRST LOG4
;THERE ARE NO BLANKS - CLOBBER THE 6TH CHARACTER.
LOG6: MOVEI D,'0 ;FIRST TRY "0" INSTEAD OF THE BLANK;
LOG5: DPB D,A
.CALL [SETZ ? SIXBIT/LOGIN/ ? C ? MOVEI 0 ? SETZ XUNAME]
AOJA D,LOG5 ;KEEP AOS'ING UNTIL LOGIN SUCCEEDS.
MOVEM C,UNAME
.IOT TYOCHN,["(]
PUSHJ P,TYOSIX
.IOT TYOCHN,[")]
.IOT TYOCHN,[^M]
.IOT TYOCHN,[^J]
POPJP: POPJ P,
TYOSIX: MOVE B,[440600,,C]
TYO6L: ILDB A,B
JUMPE A,POPJP
ADDI A,40
.IOT TYOCHN,A
JRST TYO6L
OPNTTY: .CALL [SETZ ? SIXBIT/OPEN/ ? MOVSI 21 ? MOVEI TYOCHN ? 400000,,[SIXBIT/TTY/]]
.VALUE
.CALL [SETZ ? SIXBIT/OPEN/ ? MOVSI 0 ? MOVEI TYICHN ? 400000,,[SIXBIT/TTY/]]
.VALUE
.CALL [SETZ ? SIXBIT/TTYGET/ ? MOVEI TYICHN ?
MOVEM TTYS1 ? MOVEM TTYS2 ? SETZM TTYSS]
.VALUE
MOVE A,TTYSS
SKIPN DEBUG
TLO A,%TSSII ; SUPER-IMAGE INPUT
.CALL [SETZ ? SIXBIT/TTYSET/ ? MOVEI TYICHN ? [020202020202] ?
[020202020202] ? SETZ A]
.VALUE
.CALL [SETZ ? SIXBIT/CNSGET/ ? MOVEI TYOCHN ? MOVEM ? MOVEM ? MOVEM ?
MOVEM ? MOVEM A ? SETZM B]
.VALUE
TLNE A,%TOERS ; CAN ERASE?
SETOM PXWORK ; YES -> ^PX WORKS
TLNE A,%TOERS
SETOM DISPLY ; YES -> IS DISPLAY
TLNN A,%TOOVR ; CAN'T OVERPRINT?
SETOM PXWORK ; YES -> ^PX WORKS
TRNE B,%TYMDM+%TYDIL ; IS A DIAL-UP LINE?
JRST OPN1 ; YES -> NOT LOCAL
.CALL [SETZ ? 'STYGET ? MOVEI TYICHN ? SETZM A]
.VALUE
SKIPN A ; IS A STY?
SETOM LOCAL ; NO -> LOCAL
OPN1: POPJ P,
PRMAIL: .CALL [SETZ ? SIXBIT/OPEN/ ? MOVSI 0 ? MOVEI MLCHN ?
[SIXBIT/SYS/] ? [SIXBIT/SYSTEM/] ? 400000,,[SIXBIT/MAIL/]]
JRST PRM1
PUSHJ P,PMLCHN
PRM1: SKIPN LOCAL
JRST POPJP
.CALL [SETZ ? SIXBIT/OPEN/ ? MOVSI 0 ? MOVEI MLCHN ?
[SIXBIT/SYS/] ? [SIXBIT/LOCAL/] ? 400000,,[SIXBIT/MAIL/]]
JRST PRM2
PUSHJ P,PMLCHN
PRM2: .CALL [SETZ ? SIXBIT/OPEN/ ? MOVSI 0 ? MOVEI MLCHN ?
[SIXBIT/SYS/] ? [SIXBIT/SYSTEM/] ? 400000,,[SIXBIT/BTMAIL/]]
JRST PRM3
PUSHJ P,PMLCHN
PRM3: .CALL [SETZ ? SIXBIT/OPEN/ ? MOVSI 0 ? MOVEI MLCHN ?
[SIXBIT/SYS/] ? [SIXBIT/LOCAL/] ? 400000,,[SIXBIT/BTMAIL/]]
JRST PRM4
PUSHJ P,PMLCHN
PRM4: POPJ P,
PMLCHN: .IOT MLCHN,A
JUMPL A,PML1
CAIN A,^C
JRST PML1
.IOT TYOCHN,A
JRST PMLCHN
PML1: .IOT TYOCHN,[^M]
.IOT TYOCHN,[^J]
.CLOSE MLCHN,
POPJ P,
PSTRNG: MOVE A,D
HLRZ 0,A ; COUNT
HRLI A,440700 ; BYTE POINTER
.CALL [SETZ ? SIXBIT/SIOT/ ? MOVEI TYOCHN ? A ? SETZ 0]
.VALUE
POPJ P,
GTNAME: MOVE D,[6.,,[ASCIZ/Name: /]]
SETZM R6PSW
PUSHJ P,RDSIX
POPJ P,
GTPSW: MOVE D,[10.,,[ASCIZ/Password: /]]
SETOM R6PSW
PUSHJ P,RDSIX
POPJ P,
RDSIX: PUSHJ P,PSTRNG
SETZ C,
MOVE B,[440600,,C]
R6LOOP: .IOT TYICHN,A
CAIN A,177
JRST R6RUBO
CAIN A,15
JRST R6DONE
CAIN A,12
JRST R6DONE
CAIN A,33
JRST R6DONE
CAILE A,"z
JRST R6BAD
CAIL A,"a
JRST R6LOW
CAILE A,"Z
JRST R6BAD
CAIL A,"A
JRST R6ADDC ; UPPERCASE
CAIN A,".
JRST R6ADDC
CAIG A,40
JRST R6BAD
SKIPN R6PSW
JRST R6BAD
R6ADDC: TLNN B,770000 ;CHECK FIT
JRST R6LOOP
SKIPN R6PSW
.IOT TYOCHN,A
SUBI A,40
IDPB A,B ;STORE CHARACTER
JRST R6LOOP
R6LOW: SUBI A,40 ;LOWER CASE
JRST R6ADDC
R6BAD: .IOT TYOCHN,[^G]
JRST R6LOOP
R6RUBO: JUMPE C,R6BAD ; NO CHARS
LDB A,B ; LAST CHAR
SETZ 0,
DPB 0,B ; CLEAR LAST CHAR
ADD B,[060000,,] ; DECREMENT BYTE POINTER
SKIPE R6PSW
JRST R6LOOP
SKIPN PXWORK
JRST R6R1
.IOT TYOCHN,[^P]
.IOT TYOCHN,["X]
JRST R6LOOP
R6R1: ADDI A,40
.IOT TYOCHN,A ; ECHO DELETED CHARACTER
JRST R6LOOP
R6DONE: CAMN C,[SIXBIT /AS/]
SETZM LOCAL
.IOT TYOCHN,[^M]
.IOT TYOCHN,[^J]
POPJ P,
LOADIT: SKIPN XUNAME ; HAS THE USER IDENTIFIED HIMSELF?
JRST LD1 ; NO, LOAD SYSTEM DDT
.SUSET [.SSNAME,,XUNAME]
.CALL [SETZ ? SIXBIT/OPEN/ ? MOVSI 6 ? MOVEI LCHN ?
[SIXBIT/DSK/] ? [SIXBIT/______/] ? [SIXBIT/HACTRN/] ?
XUNAME ? 403000,,A]
SKIPA
JRST LD3 ; LOAD THE FILE
CAIE A,%ENSDR ; DIRECTORY EXIST?
JRST LD1 ; YES, SO LOAD SYSTEM DDT
.CALL [SETZ ? SIXBIT/OPEN/ ? MOVSI 6 ? MOVEI LCHN ?
[SIXBIT/DSK/] ? XUNAME ? [SIXBIT/HACTRN/] ?
400000,,[SIXBIT/(INIT)/]]
JRST LD1
JRST LD3
LD1: .CALL [SETZ ? SIXBIT/OPEN/ ? MOVSI 6 ? MOVEI LCHN ?
[SIXBIT/DSK/] ? [SIXBIT/TS/] ? [SIXBIT/DDT/] ?
400000,,[SIXBIT/SYS/]]
.VALUE
LD3: MOVE 0,[LOADER,,LSTART]
BLT 0,LSTART+LODLEN ; MOVE LOADER
JRST LSTART ; EXECUTE LOADER
;
; THE LOADING PROGRAM
;
LOADER:
OFFSET LSTART-.
.CALL [SETZ ? SIXBIT/LOAD/ ? MOVEI -1 ? SETZI LCHN]
.VALUE
.IOT LCHN,IOTPTR ; READ STARTING ADDRESS
.CLOSE LCHN,
JRST @0 ; START PROGRAM
IOTPTR: -1,,0
OFFSET 0
LODLEN==.-LOADER
; SCRAMBLER
; SCRAMBLE WORD IN A
SCRAMBLE:
PUSH P,A
PUSHJ P,CBITS
MOVE C,A
MOVE B,(P)
ROT B,(A)
XOR B,(P)
MOVE A,B
PUSHJ P,CBITS
ADD C,A
ROT B,(A)
XOR B,[3.1415927]
MOVE A,B
PUSHJ P,CBITS
ADD C,A
ROT B,(A)
XOR B,[2.7182818]
MOVN A,C
ROT B,36.(A)
MOVE A,B
POP P,B
POPJ P,
;COUNT THE NUMBER OF 1'S IN WORD
CBITS: JUMPE A,POPJP ;0 GIVES QUICK ANSWER
PUSH P,B ;SAVE STUFF
PUSH P,C
MOVE B,A ;TEMP
MOVEI C,1 ;INITIAL COUNTER
SOS A
ANDB A,B ;REMOVE EXACTLY 1 "1"
JUMPN A,[AOJA C,.-2] ;COUNT AGAIN IF NOT FINISHED
MOVE A,C ;COUNT TO BE RETURNED
POP P,C
POP P,B
POPJ P,
;CKNAME CHECK FOR NAME IN MASTER FILE
; A/ 6BIT NAME TO SEARCH FOR
; 0 RETURN - NAME NOT FOUND
; 1 RETURN - A/ SCRAMBLED ENTRY
CKNAME: PUSH P,B
PUSH P,C
SKIPL NAMWDS
JRST CKNAM1
.OPEN PWCHN,[SIXBIT / "SYS PASS WORDS/]
JRST CKNML1 ;OPEN LOSS, RETURN
.CALL [SETZ ? 'FILLEN
MOVEI PWCHN
SETZM B]
JRST CKNML1 ;BAD FILE?
MOVEM B,NAMWDS
MOVEI B,1777(B) ;WORD COUNT
LSH B,-10.
SKIPE B ;SKIP IF EMPTY FILE
CAILE B,400-NAMPAG ;SKIP IF NOT TOO BIG
JRST CKNML2 ;FILE BAD SIZE?
MOVNS B ;- WDS
MOVSS B ;-WDS,,
HRRI B,NAMPAG
MOVEI C,0
.CALL [SETZ ? 'CORBLK
MOVEI 200000
MOVEI -1
B
MOVEI PWCHN
SETZ C]
JRST CKNML2 ;CORE LOST
.CLOSE PWCHN, ;CLOSE CHANNEL NOW
; A/ NAME, B/ #WDS IN FILE, C/ INDEX
CKNAM1: MOVE B,NAMWDS
TRZ B,1 ;TRUNCATE WORD COUNT
MOVEI C,0
CAMN A,NAMES(C) ;SKIP IF NOT YET
JRST [AOS -2(P) ;SKIP RETURN
MOVE A,NAMES+1(C)
JRST CKNML2]
ADDI C,2
CAMGE C,B
JRST .-4
JRST CKNML1
CKNML2: SETOM NAMWDS
.CORE NAMPAG
JFCL
CKNML1: .CLOSE PWCHN,
POP P,C
POP P,B
POPJ P,
NAMWDS: -1
LITTER: CONSTANTS
LOC <.+1777>&776000
NAMES:
NAMPAG==./2000
END START