diff --git a/build/dm.tcl b/build/dm.tcl index 6b8ebcee..2a567f90 100644 --- a/build/dm.tcl +++ b/build/dm.tcl @@ -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" diff --git a/doc/programs.md b/doc/programs.md index 3b70bb8f..1e9b99e7 100644 --- a/doc/programs.md +++ b/doc/programs.md @@ -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. diff --git a/src/syseng/booter.3 b/src/syseng/booter.3 new file mode 100644 index 00000000..7f3ab37d --- /dev/null +++ b/src/syseng/booter.3 @@ -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 + \ No newline at end of file