TITLE LOSS DEVICE A=1 ;TEMP ;USUALLY BOJ OPCODE WORD B=2 ;TEMP ;FILE NAME 1 DURING OPEN C=3 ;TEMP ;FILE NAME 2 DURING OPEN D=4 ;TEMP E=5 ;ERRORS (ERROR # IN LH, SKIP COUNT IN RIGHT) F=6 ;FLAGS M=7 ;I/O MODE AS SEEN BY LOSER N=10 ;SEMI-TEMPORARY Q=11 ;BYTE POINTER OR BLOCK POINTER FOR SENDING TO LOSER S=12 ;CHANNEL STATUS SPECIFIED BY LOSER W=13 ;# OF WDS OR CHARS BEFORE GIVING EOF/DEVFULL U=16 ;FOR INTERRUPT LEVEL ONLY P=17 ;PDL BOJC=15 ;BOJ CHANNEL LPDL==10 ;LENGTH OF PDL ;;; FLAGS IN LEFT HALF OF F %FOPEN==400000 ;OPEN HAS SUCCEEDED %FDIR==200000 ;DIRECTORY MODE %FIOC==100000 ;IOC ERROR MODE %FINT==40000 ;INTERRUPT ON LOSER'S .IOT %FINTR==20000 ;INTERRUPT RANDOMLY LOC 41 JSR UUOH JSR TSINT LOC 100 UUOH: 0 ;UUO HANDLER JRST DIE ;DON'T USE ANY! TSINT: 0 ;INTERRUPT WORD 0 ;RETURN ADDRESS SKIPL U,TSINT JRST TSINT1 ;WORD 1 INTERRUPT TRNN U,1_BOJC ;WORD 2 - BETTER BE BOJC JRST DIE SETOM INT ;SIGNAL RECEIPT OF INTERRUPT .DISMISS TSINT+1 TSINT1: TLNE U,200000 ;BETTER BE REAL TIME INTERRUPT TLNN F,%FINTR ; AND RANDOM INT FLAG BETTER BE SET JRST DIE JUMPL S,TSINT2 ;JUMP UNLESS JOB STATUS SET UP .CALL JOBSTS JRST DIE TSINT2: .CALL JOBINT ;SO GIVE LOSER A RANDOM INTERRUPT JRST DIE .DISMISS TSINT+1 INT: 0 ;NEG => INTERRUPT RECEIVED ON BOJC JOBSTS: SETZ SIXBIT \JOBSTS\ ;SET JOB CHANNEL STATUS 1000,,BOJC ;BOJ CHANNEL # 400000,,S ;NEW CHANNEL STATUS JOBINT: SETZ SIXBIT \JOBINT\ ;GIVE INTERRUPT ON JOB CHANNEL 401000,,BOJC ;BOJ CHANNEL # JOBCON: SETZ SIXBIT \JOBRET\ ;RETURN TO LOSER 1000,,BOJC ;BOJ CHANNEL # 400000,,E ;,, OPNLUZ: .CALL JOBCON ;WANT TO ERROR OUT ON .OPEN JFCL ; - ERROR # IN LH OF E DIE: .LOGOUT ;COMMIT SUICIDE .VALUE [ASCIZ \.JPC/\] ;IF CAN'T, MUST BE DEBUGGING PDL: BLOCK LPDL ;NOT USED MUCH ANYWAY GO: MOVE P,[-LPDL,,PDL-1] SETZB F,INT SETO S, .OPEN BOJC,[17,,'BOJ] JRST DIE .SUSET [.SMASK,,[200000,,]] ;REAL TIME CLOCK .SUSET [.SMSK2,,[1_BOJC]] ;BOJ CHANNEL .SUSET [.SIFPIR,,[1_BOJC]] ;FAKE INT TO GET GOING LOOP: JUMPL S,LOOP1 .CALL JOBSTS JRST DIE LOOP1: SKIPL INT ;WAIT FOR BOJ INTERRUPT .HANG SETZM INT MOVE D,[-12,,JOBBLK] .CALL JOBCAL ;GET CRUFT ABOUT BOJ REQUEST JRST JBCLUZ TLNE A,60000 JRST CLOSE ;WANT TO CLOSE UP SHOP JRST @.+1(A) ;RH OF A HAS I/O OPCODE OPEN IOT STATUS RESET RCHST ACCESS FDELE RENMWO CALL JBCLUZ: TLNN F,%FOPEN ;JOBCAL LOST JRST DIE JRST LOOP JOBCAL: SETZ SIXBIT \JOBCAL\ ;GET INFO ABOUT JOB CALL 1000,,BOJC ;BOJ CHANNEL # 2000,,A ;BOJ REQUEST OPCODE 400000,,D ;BLOCK POINTER TO DATA AREA JOBBLK: BLOCK 12 ;ROOM FOR BOJ REQUEST DATA OPENUP: SETZ SIXBIT \OPEN\ ;OPEN FILE 4000,,MODETB(M) ;MODE 1000,,BOJC ;CHANNEL # ,,[SIXBIT \BOJ\] ;DEVICE NAME 400000,,0 ;CRETINOUS ITS CURRENTLY DEMANDS THIS MODETB: 31 ;BASICALLY, 30 ; WANT 33 ; TO OPEN 32 ; IN 35 ; MODE 34 ; INVERSE 37 ; TO 36 ; LOSER'S OPEN: TLNE F,%FOPEN ;MUSTN'T ALREADY BE OPEN JRST DIE LDB M,[410300,,A] ;I/O MODE .CALL OPENUP ;RE-OPEN BOJ IN CORRECT MODE JRST DIE MOVE B,JOBBLK+1 ;FILE NAME 1 MOVE C,JOBBLK+2 ;FILE NAME 2 CAMN B,[SIXBIT \.FILE.\] CAME C,[SIXBIT \(DIR)\] JRST OPEN1 MOVSI E,12 ;"MODE NOT AVAILABLE" TRNE M,5 ;CAN ONLY GIVE ASCII DIRECTORY JRST OPNLUZ MOVE Q,[-LDIR,,DIR] MOVEI W,LCHDIR .OPEN BOJC,[33,,'BOJ] ;RE-OPEN BOJ IN ASCII BLOCK OUTPUT JRST DIE MOVEI M,2 ;ASSUME LOSER IS BLOCK MODE TOO TLO F,%FDIR ;WE'RE IN DIRECTORY MODE OPNOK: TLO F,%FOPEN MOVEI E,1 ;SINGLE SKIP MOVEM B,CHSTAT+1 ;SAVE FILE NAMES FOR .RCHST MOVEM C,CHSTAT+2 CONTIN: .CALL JOBCON ;CONTINUE THE LOSER JRST DIE JRST LOOP ;CONTINUE US OPEN1: CAME B,[SIXBIT \IOC\] JRST OPEN1A PUSHJ P,GETN ;IOC ERROR MODE JUMPLE N,BADNAM ;CHECK SECOND FILE NAME CAILE N,LIOCTB/2 JRST OPEN1B ;CODE TOO HIGH, PUNT THE FILE NAME BUT WORK ANYWAY MOVEI D,(N) ;TRANSLATE NAMES FOR .RCHST LSH D,1 MOVE B,IOCTB-2(D) MOVE C,IOCTB-1(D) JRST OPEN1B OPEN1A: MOVE D,[-LIOCTB,,IOCTB] PUSHJ P,LOOKUP JRST OPEN2 OPEN1B: TLO F,%FIOC JRST OPNOK OPEN2: HLLZ D,B CAME D,[SIXBIT \INT\] JRST OPEN4 PUSHJ P,GETN ;INTERRUPT MODE MOVE S,N ;LOSER-SPECIFIED STATUS TLO F,%FINT HRLZ D,B JUMPE D,OPNOK ;INT ON .IOT PUSHJ P,GETN TLC F,%FINT+%FINTR ;INT AFTER SPECIFIED TIME SKIPN D,N MOVEI D,1 IMULI D,30. MOVE N,[600000,,D] .REALT N, INFINI: MOVSI W,200000 ;INFINITY (377777,, LOSES - SEE 2IOT) IOTOK: MOVE Q,IOTPTR(M) JRST OPNOK IOTPTR: 440700,,TRIX ;ASCII UNIT INPUT (FOR LOSER) 0 ;ASCII UNIT OUTPUT (UNUSED) -LTRIX,,TRIX ;ASCII BLOCK INPUT -LFLUSH,,FLUSH ;ASCII BLOCK OUTPUT 31416,,0 ;IMAGE UNIT INPUT 0 ;IMAGE UNIT OUTPUT (UNUSED) 31416,,0 ;IMAGE BLOCK INPUT -LFLUSH,,FLUSH ;IMAGE BLOCK OUTPUT OPEN4: CAME B,[SIXBIT \STATUS\] JRST OPEN5 PUSHJ P,GETN ;USER-SPECIFIED STATUS MOVEI S,(N) JRST INFINI OPEN5: CAME B,[SIXBIT \EOF\] JRST ERRS PUSHJ P,GETN ;EOF/DEVICE FULL DEVICE MOVE W,N JRST IOTOK FDELE: MOVE B,JOBBLK+1 ;FILE FILE NAME MOVE C,JOBBLK+2 ;SECOND FILE NAME ERRS: CAME B,[SIXBIT \ERR\] CAMN B,[SIXBIT \ERROR\] JRST ERROR MOVE D,[-LERRTB,,ERRTB] PUSHJ P,LOOKUP BADNAM: MOVEI N,11 ;"ILLEGAL FILE NAME" FATALN: MOVSI E,(N) FATAL: .CALL JOBCON JRST DIE JRST DIE ERROR: PUSHJ P,GETN JUMPLE N,BADNAM CAILE N,LERRTB/2 JRST FATALN ;IF OUT OF RANGE, PUNT ON THE NAME, BUT WORK ANYWAY JRST FATALN ;;; LOOK UP A PAIR OF FILE NAMES IN B AND C IN A TABLE WHOSE ;;; AOBJN POINTER IS IN D. SKIPS ON SUCCESS, LEAVING INDEX IN N. LOOKUP: MOVEI N,-2(D) LOOK0: CAMN B,(D) CAME C,1(D) JRST LOOK1 SUBI N,(D) MOVNS N LSH N,-1 POPJ1: AOS (P) POPJ P, LOOK1: AOBJP D,DIE AOBJN D,LOOK0 POPJ P, ;;; STANDARD TABLE OF .CALL-TYPE ERROR FILE NAMES ERRTB: SIXBIT \NOSUCHDEVICE\ ; 1 NO SUCH DEVICE SIXBIT \WRONG DIREC \ ; 2 WRONG DIRECTION SIXBIT \2MANY TRANSL\ ; 3 TOO MANY TRANSLATIONS SIXBIT \FILNOTFOUND \ ; 4 FILE NOT FOUND SIXBIT \DIR FULL \ ; 5 DIRECTORY FULL SIXBIT \DEVICEFULL \ ; 6 DEVICE FULL SIXBIT \DEVNOTREADY \ ; 7 DEVICE NOT READY SIXBIT \DEVNOTAVAIL \ ;10 DEVICE NOT AVAILABLE SIXBIT \ILGL FILNAM\ ;11 ILLEGAL FILE NAME SIXBIT \MODNOTAVAIL \ ;12 MODE NOT AVAILABLE SIXBIT \FILE EXISTS\ ;13 FILE ALREADY EXISTS SIXBIT \BAD CHAN# \ ;14 BAD CHANNEL NUMBER SIXBIT \2MANY ARGS \ ;15 TOO MANY ARGUMENTS (CALL) SIXBIT \PAKNOTMOUNT \ ;16 PACK NOT MOUNTED SIXBIT \DIRNOTAVAIL \ ;17 DIRECTORY NOT AVAIL SIXBIT \NON-EXUSRNAM\ ;20 NON-EXISTENT USER NAME SIXBIT \LOCAL DEVICE\ ;21 LOCAL DEVICE ONLY SIXBIT \SELF CONTRA\ ;22 SELF-CONTRADICTORY OPEN SIXBIT \FILE LOCKED\ ;23 FILE LOCKED SIXBIT \M.F.D.FULL \ ;24 M.F.D. FULL SIXBIT \DEVNOTASSIGN\ ;25 DEVICE NOT ASSIGNABLE TO THIS PROCESSOR SIXBIT \WRITE LOCKED\ ;26 DEVICE WRITE-LOCKED SIXBIT \LINK DEPTH \ ;27 LINK DEPTH EXCEEDED SIXBIT \2FEW ARGS \ ;30 TOO FEW ARGUMENTS (CALL) SIXBIT \CAN'T MODIFY\ ;31 CAN'T MODIFY JOB SIXBIT \CAN'T ACCESS\ ;32 CAN'T GET THAT ACCESS TO PAGE SIXBIT \LOSINGARGS \ ;33 MEANINGLESS ARGS SIXBIT \WRONG TYPE \ ;34 WRONG TYPE DEVICE SIXBIT \NOSUCHJOB \ ;35 NO SUCH JOB SIXBIT \VALCLRSTOSET\ ;36 VALID CLEAR OR STORED SET SIXBIT \NOCOREAVAIL \ ;37 NO CORE AVAILABLE SIXBIT \NOTTOPLEVEL \ ;40 NOT TOP LEVEL SIXBIT \OTHER END \ ;41 OTHER END OF PIPELINE GONE OR NOT OPEN SIXBIT \JOB GONE \ ;42 JOB GONE OR GOING AWAY SIXBIT \ILLEGLCALL \ ;43 ILLEGAL SYSTEM CALL NAME SIXBIT \CHNLNTOPEN \ ;44 CHANNEL NOT OPEN SIXBIT \IEMPTYOFULL \ ;45 INPUT BUF. EMPTY OR OUT. BUF. FULL SIXBIT \UNREC FILE \ ;46 UNRECOGNIZABLE FILE SIXBIT \LINKTONONEXF\ ;47 LINK TO NON-EXISTENT FILE LERRTB==.-ERRTB IOCTB: SIXBIT \HARDWROP \ ; 1 ILLEGAL HARDWARE OPERATION ATTEMPTED SIXBIT \ACCESS>EOF \ ; 2 ATTEMPTED RANDOM ACCESS TO ADDRESS BEYOND END OF FILE SIXBIT \DATA ERROR \ ; 3 NON-RECOVERABLE DATA ERROR SIXBIT \NON-EXSUBDEV\ ; 4 NON-EXISTENT SUB-DEVICE SIXBIT \OVER IOPOP \ ; 5 OVER IOPOP SIXBIT \OVER IOPUSH\ ; 6 OVER IOPUSH SIXBIT \USRCHNNOTUSR\ ; 7 USR OP CHNL DOES NOT HAVE USR OPEN SIXBIT \CHANOTOPEN \ ;10 CHNL NOT OPEN SIXBIT \DEV FULL \ ;11 DEVICE FULL SIXBIT \ILGL MODE \ ;12 CHNL IN ILLEGAL MODE ON IOT SIXBIT \ILGL ^PCODE\ ;13 ILLEGAL CHR AFTER CNTRL P ON TTY DISPLAY LIOCTB==.-IOCTB RESET: JRST IGNORE ;GOOD PLACES FOR BREAKPOINTS STATUS: JRST IGNORE ACCESS: JRST IGNORE RENMWO: JRST IGNORE CALL: JRST IGNORE IGNORE: MOVEI E,1 ;IGNORE RANDOM COMMAND .CALL JOBCON JRST DIE JRST LOOP CLOSE: JRST DIE ;SO DIE, ALREADY RCHST: TLNN F,%FOPEN JRST DIE MOVEI E,1 MOVE D,[-6,,CHSTAT] .CALL JOBRET JRST DIE JRST LOOP JOBRET: SETZ SIXBIT \JOBRET\ ;RETURN STUFF TO LOSER 1000,,BOJC ;BOJ CHANNEL # ,,E ;RETURN SPEC 400000,,D ;AOBJN POINTER TO DATA CHSTAT: 'LOS ;CRETINOUS .RCHST! 0 ;FILE NAME 1 ;FILLED IN 0 ;FILE NAME 2 ; BY OPEN 0 ;NULL SNAME -1 ;NOT RANDOM ACCESS 0 ;??? TRIX: ASCII \SILLY RABBIT, TRIX ARE FOR KIDS!!î\ ;MULTIPLE OF 5 CHARS LTRIX==.-TRIX 0 ;NEED A ZERO WORD - SEE 0IOT ;;; GIVEN FILE NAME IN C, RETURN NUMBER IN N. ;;; FILE NAME MAY BE 0,,NNNNNN OR MAY BE SIXBIT \NNNNNN\. ;;; CLOBBERS D. GETN: MOVEI N,(C) TLNN C,-1 POPJ P, PUSH P,C ;MUST PRESERVE C GETN1: SETZ D, ROTC C,6 SUBI D,20 JUMPL D,BADNAM CAIL D,8. JRST BADNAM ;;TRC D,20 ;;TRNE D,70 ;;JRST BADNAM LSH N,3 ADDI N,(D) JUMPN C,GETN1 POP P,C POPJ P, IOT: TLNN F,%FOPEN ;MUST BE OPEN TO IOT! JRST DIE TLNN F,%FIOC ;SKIP IF WE WANT AN IOC ERROR JRST IOT1 IOTIOC: .CALL SETIOC JRST DIE JRST LOOP SETIOC: SETZ SIXBIT \SETIOC\ ;SET IOC ERROR 1000,,BOJC ;BOJ CHANNEL # 400000,,N ;IOC ERROR NUMBER IOT1: TLNN F,%FINT ;SKIP IF WE WANT RANDOM INTERRUPT JRST IOT2 .CALL JOBINT JRST DIE JRST LOOP IOT2: JUMPG W,@IOTJ(M) ;JUMP ON MODE UNLESS EOF MOVEI E,1 TRNN M,1 JRST CONTIN ;FOR INPUT, JUST DON'T SEND ANYTHING MOVEI N,11 ;"DEVICE FULL" (IOC ERROR) JRST IOTIOC IOTJ: 0IOT ;ASCII UNIT INPUT 1IOT ;ASCII UNIT OUTPUT 2IOT ;ASCII BLOCK INPUT 3IOT ;ASCII BLOCK OUTPUT 4IOT ;IMAGE UNIT INPUT 5IOT ;IMAGE UNIT OUTPUT 6IOT ;IMAGE BLOCK INPUT 7IOT ;IMAGE BLOCK OUTPUT 0IOT0: MOVE Q,IOTPTR+0 0IOT: ILDB A,Q ;GOBBLE CHAR FOR LOSER JUMPE A,0IOT0 ;RAN OUT - CIRCLE BACK 1IOT: .IOT BOJC,A ;SEND LOSER THE CHAR (OR GOBBLE ONE) SOJA W,LOOP ;DECR CHAR COUNT 2IOT: HLRE A,Q ;GET COUNT OF WORDS LEFT IN IOT PTR MOVNS A MOVE B,W ADDI B,4 IDIVI B,5 CAMLE B,A JRST 2IOT3 MOVN A,B HRLM A,Q MOVE D,MASKS(C) ADDI B,-1(Q) MOVE C,[014060301406] ;FIVE ^C'S ANDM D,C ANDCAM D,(B) IORM C,(B) 2IOT3: ADDI W,(Q) .IOT BOJC,Q SUBI W,(Q) SKIPL Q ;MIGHT NOT HAVE RUN OUT MOVE Q,IOTPTR+2 JRST LOOP MASKS: 3760 ;RANDOM MASKS FOR INSTALLING ^C'S 77760 177,,77760 3777,,777760 0 ;;; *** TEMP *** DIR==TRIX LDIR==LTRIX LCHDIR==5*LDIR LFLUSH==50 FLUSH: BLOCK LFLUSH ;I GUESS TGQ DIDN'T FEEL LIKE BOTHERING TO WRITE THESE 3IOT: 4IOT: 5IOT: 6IOT: 7IOT: JRST IOTIOC ;FOR WANT OF ANYTHING BETTER TO DO END GO