diff --git a/src/klh/ar9.flight b/src/klh/ar9.flight new file mode 100644 index 00000000..963db25c Binary files /dev/null and b/src/klh/ar9.flight differ diff --git a/src/klh/cub.24 b/src/klh/cub.24 new file mode 100644 index 00000000..5322a17c --- /dev/null +++ b/src/klh/cub.24 @@ -0,0 +1,1950 @@ + TITLE CUBWAR + SUBTTL GENERAL DEFINITIONS + +ITS==1 ;ASSEMBLE ITS VERSION +CMU==0 + OPDEF PJRST [JRST] +IFN CMU, TRMOP.= ;EQUIV. + +A0=0 +A1=1 +A2=2 +A3=3 +A4=4 +A5=5 +A6=6 +A7=7 +A10=10 +A11=11 +A12=12 +A13=13 +IFN CMU,{ +A14=14 +A15=15 +A16=16 +} +IFN ITS,{ ;INTERRUPT HANDLER REGISTERS +I14=14 +I15=15 +I16=16 +} +P=17 + +SHPCRX==0 ;X COORDINATE +SHPCRY==SHPCRX+1 ;Y COORDINATE +SHPCRZ==SHPCRY+1 ;Z COORDINATE +SHPCRF==SHPCRZ+1 ;FORWARD FACING +SHPCRU==SHPCRF+1 ;UPWARD FACING +SHPRNC==SHPCRU+1 ;REINCARNATIONS +SHPFRD==SHPRNC+1 ;FORWARD RADAR RANGE +SHPMRX==SHPFRD+1 ;MOBILE RADAR X +SHPMRY==SHPMRX+1 ;MOBILE RADAR Y +SHPMRZ==SHPMRY+1 ;MOBILE RADAR Z +SHPBLZ==SHPMRZ+1 ;BLAZERS LEFT +SHPHIT==SHPBLZ+1 ;HITS +SHPTIM==SHPHIT+1 ;TIME BLAZERS RECHARGED +SHPTRC==SHPTIM+1 ;NUMBER OF TRACED SHIP +SHPRAT==SHPTRC+1 ;RATING +SHPNUM==SHPRAT+1 ;PLAYER NUMBER +SHPINB==SHPNUM+1 ;INPUT BUFFER +SHPOUB==SHPINB+3 ;OUTPUT BUFFER +SHPINU==SHPOUB+3 ;INPUT UUO +SHPOUU==SHPINU+1 ;OUTPUT UUO +SHPTTY==SHPOUU+1 ;TTY NUMBER +SHPNAM==SHPTTY+1 ;POINTER TO NAME +SHPLEN==SHPNAM+1 ;LENGTH OF SHIP BLOCK + +IFN ITS,{ +LOC 41 + JSR UUOH ;UUO HANDLER TO SIMULATE SOME 10-50 STUFF + JSR INT ;INTERRUPT HANDLER FOR I/O +LOC 100 + + ;SIMULATED 10-50 UUO'S + OPDEF CALLI [1000,,0] + OPDEF TTCALL [2000,,0] + OPDEF INPUT [3000,,0] + OPDEF OUTPUT [4000,,0] +UUOMAX==4 + OPDEF RESET [CALLI 0] +MSTIME= +LOCK= +HIBER= + +TYIC==16 ;TTY INPUT CH +TYOC==17 ;TTY OUTPUT CH +$OPCOD==331100 ;BYTE PTR FIELD +$ACFLD==270400 ;" + + +PAT: +PATCH: BLOCK 100 + +UUOH: 0 + MOVEM A13,A13SAV# + LDB A13,[$OPCOD,,40] ;GET OP CODE OF UUO + CAIG A13,UUOMAX ;CHECK + JRST @UUOTAB(A13) ;GO DO IT + .VALUE ;BAD UUO +UUORET: MOVE A13,A13SAV + JRST @UUOH + +UUOTAB: [.VALUE] ;0 + UCALLI ;CALLI E + UTTCAL ;TTCALL AC, + UINPT ;INPUT + UOUTPT ;OUTPUT + +UCALLI: HRRZ A13,40 ;GET E + CAIN A13,0 ;RESET? + JRST URESET + CAIN A13,23 ;MSTIME? + JRST UMSTIM + CAIN A13,60 ;LOCK? + JRST ULOCK + CAIN A13,72 ;HIBER? + JRST UHIBER + .VALUE ;UNIMPLEMENTED CALLI + +URESET: .SUSET [.SMSK2,,[0]] ;DISABLE AND + .SUSET [.SIFPIR,,[0]] ;CLEAR ALL 2ND WD INTS. + .IOPDL ;RESET IOPDL (MIGHT USE SOMEDAY) + + MOVSI A13,-17 ;AOBJN TRHU IO CHANNELS +URSET1: XCT CLSETB(A13) ;CLOSE + SETOM CHNCNT(A13) ;SET BUFFER CNT=-1 + AOBJN URSET1 + SETZM TTYSTI + SETZM TTYSTO + SETZM INAVAL + JRST UUORET + +UMSTIM: MOVEM A12,A12SAV# + .PDTIME A12, ;GET TIME IN 60TH'S + IMULI A12,<=1000/=60> ;SO AS TO APPROX. MILLISECS. + LDB A13,[$ACFLD,,40] ;GET AC FIELD + MOVEM A12,(A13) ;STORE + MOVE A12,A12SAV + JRST UUORET + +ULOCK: JRST UUORET + +UHIBER: LDB A13,[$ACFLD,,40] + HLRZ A13,(A13) ;GET LH OF HIBER'S AC + CAIE A13,20 ;ONLY THIS COMBINATION IMPLEMENTED + .VALUE + SKIPN INAVAL ;SKIP WHEN INPUT AVAILABLE + .HANG ;ELSE WAIT FOREVER + AOS UUOH ;SKIP ON RETURN + JRST UUORET + + +UINPT: MOVEM A12,A12SAV + MOVEM A11,A11SAV# + LDB A12,[$ACFLD,,40] + LSH A12,1 ;*2 + SUBI A12,2 ;GET INPUT CHANNEL # + SKIPG A11,CHNCNT(A12) ;CHARS IN BUFFER WAITING? + .VALUE ;UGH, TRIED TO 'INPUT' WHEN NOTHING THERE. + MOVE A13,CHTPGB(A12) ;GET ADDR OF PGM BUFFER BLK + MOVEM A11,1(A13) ;STORE # CHARS + MOVE A11,CHSTPT(A12) ;GET PTR TO BEG OF BUFF + MOVEM A11,(A13) ;STORE PTR + MOVE A11,CHMSK(A12) ;GET BIT FOR MASK + ANDCAM A11,INAVAL ;TURN OFF BIT FOR THIS CHANNEL + MOVE A11,A11SAV + MOVE A12,A12SAV + JRST UUORET + +UOUTPT: MOVEM A12,A12SAV + MOVEM A11,A11SAV + LDB A12,[$ACFLD,,40] + LSH A12,1 + SUBI A12,1 ;GET CHANNEL # (OUTPUT!) + DPB A12,[$ACFLD,,IOTINS] + MOVE A13,CHTPGB(A12) ;GET ADDR OF PGM BUFFER BLK + MOVE A12,CHSTPT(A12) ;GET START PTR TO BUFFER + MOVEM A12,(A13) ;STORE IN PGM BLK + MOVEI A11,CHBFMX ;SET UP MAX CHS IN BUFF + SKIPG 1(A13) ;SEE IF OUTPUTTING BECAUSE BUFFER FULL + SKIPA A11,[CHBFMX-1] ;YES, JUST USE THIS # + SUB A11,1(A13) ;SUB. TO FIND # CHARS TO OUTPUT + + HRRZM A12,IOTPTR + IDIVI A11,5 ;FIND # WHOLE WDS (BLOCK OUTPUT) + JUMPE A11,UOUTP2 ;NO WHOLE WDS + MOVN A11,A11 ;NEGATE + HRLM A11,IOTPTR ;FOR AOBJN TYPE PTR + XCT IOTINS ;DO WHOLE WDS. +UOUTP2: JUMPE A12,UOUTP3 ;NO LEFTOVER CHARS? + MOVE A11,@IOTPTR ;SHOULD GET LAST (PARTIAL) WD + LSH A11,@BLSHTB(A12) ;BLOCK PTR SHIFT TO GET CHARS RIGHT ADJ. + MOVE A12,BPTRTB(A12) ;BLOCK PTR + MOVEM A12,IOTPTR ;SET UP + XCT IOTINS ;SPIT OUT LAST CHARS +UOUTP3: MOVEI A11,CHBFMX + MOVEM A11,1(A13) ;SET UP CNT AGAIN (BUFF PTR WAS INIT'D BEFORE .IOT) + MOVE A11,A11SAV + MOVE A12,A12SAV + JRST UUORET + +TTYSTI: 0 ;-1 WHEN TYIC OPEN +TTYSTO: 0 ;-1 WHEN TYOC OPEN + +IOTINS: .IOT 0,IOTPTR +IOTPTR: 0 + +BPTRTB: 0 + 377777,,A11 + 477777,,A11 + 577777,,A11 + 677777,,A11 + -1,,A11 + +BLSHTB: 0 + 0,,-=28 + 0,,-=21 + 0,,-=14 + 0,,-=7 + 0 + + +UTTCAL: LDB A13,[$ACFLD,,40] + JRST @UTTCAC(A13) ;GO TO APPROPRIATE TTCALL ROUT. +UTTCAC: UTTC0 + UTTC1 + [.VALUE] + UTTC3 +REPEAT =12,{ [.VALUE] +} + + ;INCHRW - INPUT CHAR, WAIT UNTIL. +UTTC0: SKIPE TTYSTI ;SEE IF TTYI OPEN OR NOT + JRST UTTC01 ;YUP + .OPEN TYIC,[0,,'TTY'] ;UNIT ASCII IN + .VALUE + SETOM TTYSTI +UTTC01: .IOT TYIC,A13 ;GET CHAR + MOVEM A13,@40 ;STORE + JRST UUORET + + ;OUTCHR - OUTPUT A CHAR +UTTC1: LDB A13,[000700,,@40] ;GET THE CHAR + SKIPE TTYSTO ;SEE IF TTYO OPEN OR NOT + JRST UTTC11 ;YUP + .OPEN TYOC,[1,,'TTY'] ;UNIT ASCII OUT + .VALUE + SETOM TTYSTO +UTTC11: .IOT TYOC,A13 + JRST UUORET + + ;OUTSTR - OUTPUT A STRING +UTTC3: MOVE A13,40 ;GET ADDR OF STRING + HRLI A13,440700 ;SET UP PTR + MOVEM A13,OSTRPT# + SKIPE TTYSTO + JRST UTTC32 + .OPEN TYOC,[1,,'TTY'] + .VALUE + SETOM TTYSTO + CAIA +UTTC31: .IOT TYOC,A13 +UTTC32: ILDB A13,OSTRPT ;GET CHAR + JUMPN A13,UTTC31 ;LOOP TIL FIND NULL + JRST UUORET +} + SUBTTL MAIN LOOP + +CUBSTR: RESET ;DROP OLD CHANNELS + MOVE P,[-STKL,,STACK] + PUSHJ P,INITAL ;GET PLAYERS IN + MOVEI A1,1 ;LOCK INTO CORE + LOCK A1, + CAI + MOVEI A10,SHIPS ;FIRST SHIP + +MAINLP: PUSHJ P,QUERY ;FIND SOME COMMANDS + JRST MAINCM ;GOT ONE + MOVSI A1,20 ;WAIT FOR TTY INPUT + HIBER A1, + HALT ;WHAT? + JRST MAINLP + +MAINCM: PUSHJ P,MAKMOV ;INTERPRET MOVE + MOVEI A0,">" + PUSHJ P,OUTCHR ;COMMAND PROMPT + XCT SHPOUU(A10) ;FORCE OUTPUT + JRST MAINLP + SUBTTL MAKMOV - COMMAND INTERPRETER +MAKMOV: PUSHJ P,INPCHR ;GET THE COMMAND + POPJ P, ;NOTHING THERE + TRZ A0,040 ;UPPER CASE + MOVE A1,[-CMNDCT,,CMNDTB] ;COMMAND TABLE + +MAKDCD: HRRZ A2,(A1) ;COMMAND CHARACTER + CAIN A0,(A2) + JRST MAKDSP ;DISPATCH IT + AOBJN A1,MAKDCD + +MAKERC: MOVEI A1,MESG01 ;"WHAT?" + PUSHJ P,OUTSTR + +MAKCLR: PUSHJ P,INPCHR + POPJ P, + JRST .-2 + +MAKERE: MOVEI A1,MESG01 ;"WHAT?" + PJRST OUTSTR + +MAKDSP: HLRZ A2,(A1) ;GET ROUTINE ADDRESS + JRST (A2) + +MAKCMR: PUSHJ P,INPCHR ;GET SECOND CHARACTER + JRST MAKERE + TRZ A0,040 ;UPPER CASE + CAIN A0,"N" ;"RN"? + PJRST RENAMP + CAIN A0,"T" ;"RT"? + JRST MAKCMC + MOVEI A1,4 + CAIN A0,"R" ;"RR"? + JRST MAKCCJ + MOVEI A1,5 + CAIN A0,"L" ;"RL"? + JRST MAKCCJ + JRST MAKERC + +MAKCMC: MOVEI A1,(A1) + SUBI A1,CMNDTB ;MAKE INDEX +MAKCCJ: PUSHJ P,CHGORE ;CHANGE ORIENTATION + JRST MAKCLR + +MAKCMN: PUSHJ P,INPCHR ;GET INPUT + JRST MAKERE + TRZ A0,040 + CAIN A0,"P" ;"NP"? + PJRST NEWPLR + CAIE A0,"M" ;"NM"? + JRST MAKERC + PUSHJ P,RATING + JRST MAKCLR + +MAKCMM: PUSHJ P,INPCHR ;GET INPUT + PJRST MMOVE ;"M" + TRZ A0,040 + CAIN A0,"V" ;"MV"? + JRST MAKMV2 + CAIN A0,"R" ;"MR"? + PJRST MOBRDR + CAIE A0,"S" ;"MS"? + JRST MAKERC + PJRST MESSAG + +MAKCMF: PUSHJ P,INPCHR ;GET INPUT + PJRST FORRDR ;ASSUME "FR" + TRZ A0,040 + CAIN A0,"R" ;REALLY "FR"? + PJRST FORRDR + CAIN A0,"B" ;"FB"? + JRST MAKMV1 + CAIE A0,"A" ;"FA"? + JRST MAKERC + PUSHJ P,FACING + JRST MAKCLR + +MAKMV1: PUSHJ P,BLAZER ;FIRE BLAZER + JRST MAKCLR + +MAKMV2: PUSHJ P,MMOVE + JRST MAKCLR + SUBTTL MOVE ROUTINE +MMOVE: MOVE A1,SHPCRF(A10) ;FORWARD FACING NUMBER + MOVEI A2,GENWK1 ;WORK AREA 1 + PUSHJ P,NVFUNC ;INTERPRET NUMBER + MOVEI A1,(A10) ;COPY POINTER + HRLI A1,-3 ;3 WORDS + SETZ A2, + +MOVER1: MOVE A0,(A1) ;GET COORDINATE + ADDB A0,GENWK1(A2) ;ACCUMULATE + JUMPLE A0,MOVER2 ;OUT OF CUBE + CAMLE A0,CUBSIZ + JRST MOVER2 + AOJ A2, + AOBJN A1,MOVER1 ;REPEAT + MOVE A0,GENWK1 ;REPLACE COORDINATES + MOVEM A0,SHPCRX(A10) + MOVE A1,GENWK1+1 + MOVEM A1,SHPCRY(A10) + MOVE A1,GENWK1+2 + MOVEM A1,SHPCRZ(A10) + POPJ P, + +MOVER2: MOVEI A1,MESG02 ;"NO" + PJRST OUTSTR + SUBTTL QUERY - TERMINAL POLLING ROUTINE +QUERY: MOVEI A7,(A10) ;REMEMBER WHERE I STARTED + +QUERY1: ADDI A10,SHPLEN ;NEXT SHIP + CAMLE A10,LSTSHP ;TOO FAR? + MOVEI A10,SHIPS ;RECYCLE + SKIPE SHPINB+2(A10) ;DATA IN BUFFER? + POPJ P, ;USE THAT SHIP +IFN CMU,{ MOVEI A1,1 ;SKIP ON INPUT READY + MOVE A2,SHPTTY(A10) ;FOR THIS TTY + MOVE A3,[2,,1] + TRMOP. A3, + CAIA +} +IFN ITS,{ MOVE A1,SHPNUM(A10) ;GET PLAYER # + LSH A1,1 ;*2 + SUBI A1,2 ;TO GET INPUT CHANNEL + MOVE A1,CHMSK(A1) ;GET BIT MASK FOR IT + AND A1,INAVAL ;SEE IF BIT IS ON (IE INPUT AVAILABLE) + SKIPE A1 +} + POPJ P, + CAIE A10,(A7) ;LAST ONE? + JRST QUERY1 ;NO + +CPOPJ1: AOS (P) +CPOPJ: POPJ P, + SUBTTL BLAZER ROUTINE +BLAZER: MSTIME A0, ;GET CURRENT TIME + CAMGE A0,SHPTIM(A10) ;BLAZER READY? + JRST BLZR06 ;NO + SOSGE SHPBLZ(A10) ;ONE LESS BLAZER + JRST BLZR08 ;OUT OF FIRES + MOVE A3,SHPCRX(A10) ;COPY COORDINATES + MOVE A4,SHPCRY(A10) + MOVE A5,SHPCRZ(A10) + ADDI A0,=2000 ;TWO SECOND + MOVEM A0,SHPTIM(A10) ;DELAY + MOVE A1,SHPCRF(A10) ;FORWARD FACING + MOVEI A2,A11 ;INTO REGISTERS + PUSHJ P,NVFUNC + +BLZR05: MOVE A7,NPLARS + MOVEI A6,SHIPS + +BLZR01: CAIN A6,(A10) ;MY SHIP? + JRST BLZR03 + CAME A3,SHPCRX(A6) + JRST BLZR03 + CAME A4,SHPCRY(A6) + JRST BLZR03 + CAMN A5,SHPCRZ(A6) + PJRST KILL ;SCORE A HIT + +BLZR03: ADDI A6,SHPLEN ;NEXT SHIP + SOJG A7,BLZR01 + MOVEI A1,3 + +BLZR04: MOVE A0,2(A1) + ADD A0,A10(A1) + JUMPE A0,BLZR09 + CAMLE A0,CUBSIZ ;OFF THE EDGE? + JRST BLZR09 + MOVEM A0,2(A1) ;NEW BLAZER POSITION + SOJG A1,BLZR04 + JRST BLZR05 ;CHECK THE SHIPS AGAIN + +BLZR06: MOVEI A1,MESG03 ;"NOT YET" + PJRST OUTSTR + +BLZR08: SETZM SHPBLZ(A10) ;FIX COUNT + MOVEI A1,MESG04 ;"OUT OF BLAZERS" + PJRST OUTSTR +BLZR09: MOVEI A1,MESG05 ;"MISSED" + PJRST OUTSTR + SUBTTL KILL ROUTINE +; INPUT: A10 POINTS TO WINNER, A6 TO LOSER +; OUTPUT: RETURNS A10. + +KILL: AOS SHPRAT(A10) ;TWO POINTS FOR A HIT + AOS SHPRAT(A10) + SOS SHPRAT(A6) + SOS SHPRAT(A6) + SOSG SHPHIT(A6) ;CAN HE TAKE MORE? + JRST KILL10 ;NO, REINCARNATE + MOVEI A0,3 + SUB A0,SHPHIT(A6) ;WHICH HIT IS THIS + ADDI A0,060 + DPB A0,[POINT 7,MESG06+1,20] + MOVEI A7,(A10) + MOVEI A10,(A6) ;WRITE TO LOSER + MOVEI A1,MESG06 ;"HIT #N FROM ' + PUSHJ P,OUTSTR + MOVE A1,SHPNAM(A7) + PUSHJ P,OUTRPT + PUSHJ P,OUTCRL + XCT SHPOUU(A10) ;FORCE OUTPUT + MOVEI A10,(A7) ;BACK TO WINNER + MOVEI A1,MESG07 ;"BLAZER HIT ON " + PUSHJ P,OUTSTR + MOVE A1,SHPNAM(A6) + PUSHJ P,OUTRPT + PUSHJ P,OUTCRL + MOVE A1,SHPNUM(A7) ;GET SHIP # + CAME A1,SHPTRC(A6) ;WAS HE TRACKING ME? + JRST CPOPJ ;NO + SETZM SHPTRC(A6) ;DROP THE TRACE + MOVEI A1,MESG08 ;"TRACE HAS BEEN BROKEN" + PUSHJ P,OUTSTR + MOVEI A10,(A6) ;BACK TO LOSER + MOVEI A1,MESG09 + PUSHJ P,OUTSTR + XCT SHPOUU(A10) ;FORCE OUTPUT + MOVEI A10,(A7) + AOS SHPRAT(A7) ;ONE POINT + SOS SHPRAT(A6) + POPJ P, + +KILL10: MOVEI A7,(A10) ;SAVE WINNER'S SHIP + MOVEI A10,(A6) + MOVEI A1,MESG10 ;"YOU HAVE BEEN KILLED BY" + PUSHJ P,OUTSTR + MOVE A1,SHPNAM(A7) + PUSHJ P,OUTRPT + PUSHJ P,OUTCRL + MOVEI A0,12 ;TEN POINTS + ADDM A0,SHPRAT(A7) + MOVN A0,A0 + ADDM A0,SHPRAT(A6) + MOVEI A10,SHIPS ;CHECK ALL OTHER SHIPS + MOVE A5,NPLARS + +KILL12: CAMN A6,SHPTRC(A10) ;IN HIS TRACE? + SETZM SHPTRC(A10) ;NO LONGER + PUSHJ P,OUTCRL + MOVE A1,SHPNAM(A6) + PUSHJ P,OUTRPT + MOVEI A1,MESG11 ;"KILLED BY" + PUSHJ P,OUTSTR + MOVE A1,SHPNAM(A7) + PUSHJ P,OUTRPT + PUSHJ P,OUTCRL + XCT SHPOUU(A7) + ADDI A10,SHPLEN + SOJG A5,KILL12 + MOVEI A0,3 ;SALVAGED BLAZERS + ADDM A0,SHPBLZ(A7) + MOVEI A10,(A6) + AOS SHPRNC(A6) ;REINCARNATION + PUSHJ P,INIPLR ;RESTART SHIP + MOVEI A1,MESG12 ;"YOU HAVE BEEN REINCARNATED" + PUSHJ P,OUTSTR + XCT SHPOUU(A6) ;FORCE TYPEOUT + MOVEI A10,(A7) ;BACK TO WINNER + POPJ P, + SUBTTL INIPLR - INITIALIZE SHIP VARIABLES +INIPLR: PUSH P,A2 ;SAVE REGISTER + MOVEI A2,(A10) + HRLI A2,-3 ;WORD COUNTER + +IPLR10: PUSHJ P,RANDOM + FMPR A0,CUBSZF ;CUBE LOCATION + FADRI A0,(1.0) ;PLUS ONE + PUSHJ P,IFIX + MOVEM A0,(A2) + AOBJN A2,IPLR10 + PUSHJ P,RANDOM + FMPRI A0,(6.0) ;PICK A FACING + FADRI A0,(1.0) + PUSHJ P,IFIX + MOVEM A0,SHPCRF(A10) ;FORWARD FACING + +IPLR20: PUSHJ P,RANDOM + FMPRI A0,(6.0) + FADRI A0,(1.0) + PUSHJ P,IFIX + MOVEM A0,SHPCRU(A10) ;UPWARD FACING + AOJ A0, + ASH A0,-1 + MOVE A1,SHPCRF(A10) + AOJ A1, + ASH A1,-1 + CAMN A0,A1 + JRST IPLR20 + MOVE A0,NPLARS + IMULI A0,3 + MOVEM A0,SHPBLZ(A10) ;NEW BLAZERS + MOVEI A0,3 + MOVEM A0,SHPHIT(A10) + SETZM SHPTRC(A10) + SETZM SHPTIM(A10) + POP P,A2 + POPJ P, + SUBTTL NEWPLR ROUTINE +NEWPLR: CAIE A10,SHIPS ;FIRST ONE? + JRST NPLR09 ;NO + SETZ A2, + +NPLR01: PUSHJ P,INPCHR ;START TTY NUMBER + JRST NPLR11 + SUBI A0,060 + JUMPL A0,NPLR02 ;POOR + CAILE A0,7 + JRST NPLR02 + ASH A2,3 ;APPEND DIGIT + ADD A2,A0 + JRST NPLR01 + +NPLR02: JUMPE A2,NPLR10 ;NO TTY # + ADDI A0,060 ;REPAIR LAST CHAR + MOVE A1,NPLARS + IMULI A1,SHPLEN + MOVEI A7,SHIPS(A1) ;THE NEW SHIP + MOVE A6,SHPNAM(A7) + HRRZ A1,A6 ;COPY POINTER + SETZM (A1) + SETZM 1(A1) + SETZM 2(A1) + SETZM 3(A1) + MOVEI A5,=18 + JRST NPLR06 + +NPLR05: PUSHJ P,INPCHR ;GET NAME CHARACTER + JRST NPLR08 ;DONE + +NPLR06: CAME A6,SHPNAM(A7) ;UNCHANGED? + JRST NPLR07 + CAIN A0," " + JRST NPLR05 + +NPLR07: IDPB A0,A6 + SOJG A5,NPLR05 + MOVEI A1,MESG14 ;"NAME TOO LONG" + PUSHJ P,OUTSTR + JRST MAKCLR + +NPLR08: CAMN A6,SHPNAM(A7) ;GET ANYTHING? + JRST NPLR12 + SETZM SHPRNC(A7) + SETZM SHPRAT(A7) + TRO A2,200000 + MOVEM A2,SHPTTY(A7) + PUSHJ P,INITTY ;START UP TERMINAL + JRST NPLR13 + SETZM SHPTIM(A7) ;READY TO FIRE + MOVEI A10,(A7) + PUSHJ P,INIPLR ;PUT HIM IN SPACE + AOS NPLARS + MOVEI A10,SHIPS ;BACK TO CONTROLLER + POPJ P, + +NPLR09: MOVEI A1,MESG01 ;"WHAT?" + PUSHJ P,OUTSTR + JRST MAKCLR + +NPLR10: MOVEI A1,MESG15 ;"TTY #?" + PUSHJ P,OUTSTR + JRST MAKCLR + +NPLR11: MOVEI A1,MESG01 ;"WHAT?" + PJRST OUTSTR + +NPLR12: MOVEI A1,MESG16 ;"NO NAME" + PJRST OUTSTR + +NPLR13: MOVEI A1,MESG17 ;"BAD TTY" + PJRST OUTSTR + SUBTTL MESSAGE SENDING ROUTINE +MESSAG: SETZ A3, + MOVE A2,[POINT 7,A3] ;READY TO INSERT + MOVEI A4,5 + +MSGR01: PUSHJ P,INPCHR ;GET NAME CHARACTER + JRST MAKERE + CAIN A0,":" ;NAME TERMINATOR? + JRST MSGR03 + CAIN A0," " + JRST MSGR01 + IDPB A0,A2 + SOJG A4,MSGR01 + +MSGR02: PUSHJ P,INPCHR + JRST MAKERE + CAIN A0,":" ;TERMINATOR? + JRST MSGR02 + +MSGR03: SETZ A5, ;ASSUME *ALL + CAMN A3,STARB ;IS IT? + JRST MSGR05 + SETO A5, + MOVEI A6,SHIPS + MOVE A4,NPLARS + MOVEI A7,(A10) ;SAVE SENDERS SHIP + +MSGR04: CAMN A3,@SHPNAM(A6) ;RIGHT NAME? + JRST MSGR05 ;YES + ADDI A6,SHPLEN + SOJG A4,MSGR04 + MOVEI A1,MESG18 ;"WHO?" + PUSHJ P,OUTSTR + JRST MAKCLR + +MSGR05: MOVE A3,[POINT 7,GENWK1] + +MSGR06: PUSHJ P,INPCHR + JRST MSGR07 + IDPB A0,A3 ;ACCUMULATE + JRST MSGR06 + +MSGR07: SETZ A0, + IDPB A0,A3 ;TERMINATE + JUMPE A5,MSGR08 ;FOR *ALL? + MOVEI A10,(A6) ;RECIEVER + MOVEI A1,MESG19 ;"MESSAGE FROM " + PUSHJ P,OUTSTR + MOVE A1,SHPNAM(A7) + PUSHJ P,OUTRPT + MOVEI A1,MESG20 ;" : " + PUSHJ P,OUTSTR + MOVE A1,[POINT 7,GENWK1] + PUSHJ P,OUTSTR + PUSHJ P,OUTCRL + XCT SHPOUU(A10) ;FORCE TYPEOUT + MOVEI A10,(A7) + POPJ P, + +MSGR08: MOVEI A7,(A10) ;SAVE SENDER + MOVEI A10,SHIPS + MOVE A4,NPLARS + +MSGR09: CAIN A10,(A7) + JRST MSGR10 + MOVEI A1,MESG21 ;"MSG TO ALL FROM " + PUSHJ P,OUTSTR + MOVE A1,SHPNAM(A7) + PUSHJ P,OUTRPT + MOVEI A1,MESG20 + PUSHJ P,OUTSTR + MOVE A1,[POINT 7,GENWK1] + PUSHJ P,OUTRPT + PUSHJ P,OUTCRL + XCT SHPOUU(A10) ;FORCE OUTPUT + +MSGR10: ADDI A10,SHPLEN + SOJG A4,MSGR09 + MOVEI A10,(A7) + POPJ P, + SUBTTL CHGORE ROUTINE +CHGORE: MOVE A4,A1 ;COPY INDEX + MOVE A1,SHPCRF(A10) ;FORWARD FACING + MOVEI A2,GENWK1 + PUSHJ P,NVFUNC + MOVE A1,SHPCRU(A10) ;UPWARD FACING + MOVEI A2,GENWK2 + PUSHJ P,NVFUNC + JRST .+1(A4) ;DISPATCH + JRST CHG010 + JRST CHG020 + JRST CHG030 + JRST CHG040 + JRST CHG050 + JRST CHG060 + +; LEFT TURN +CHG010: HRREI A3,-1 + CAIA + +; RIGHT TURN +CHG020: MOVEI A3,1 + MOVEI A1,GENWK1 + MOVEI A2,GENWK2 + PUSHJ P,CROSS + JRST CHG070 + +; TURN UP +CHG030: MOVSI A1,-3 +CHG034: MOVE A2,GENWK2(A1) + MOVN A0,GENWK1(A1) + MOVEM A0,GENWK2(A1) + MOVEM A2,GENWK1(A1) + AOBJN A1,CHG034 + JRST CHG070 + +; TURN DOWN +CHG040: MOVSI A1,-3 +CHG044: MOVE A2,GENWK1(A1) + MOVN A0,GENWK2(A1) + MOVEM A0,GENWK1(A1) + MOVEM A2,GENWK2(A1) + AOBJN A1,CHG044 + JRST CHG070 + +; ROLL RIGHT +CHG050: SKIPA A3,[-1] + +; ROLL LEFT +CHG060: MOVEI A3,1 + MOVEI A1,GENWK2 + MOVEI A2,GENWK1 + PUSHJ P,CROSS + +CHG070: MOVEI A1,GENWK1 + PUSHJ P,VNFUNC + MOVEM A0,SHPCRF(A10) ;NEW FORWARD FACING + MOVEI A1,GENWK2 + PUSHJ P,VNFUNC + MOVEM A0,SHPCRU(A10) ;NEW UPWARD FACING + POPJ P, + SUBTTL CROSS ROUTINE +CROSS: MOVE A4,1(A1) + IMUL A4,2(A2) + MOVE A5,2(A1) + IMUL A5,1(A2) + SUB A4,A5 + MOVE A11,A4 + + MOVE A4,2(A1) + IMUL A4,(A2) + MOVE A5,(A1) + IMUL A5,2(A2) + SUB A4,A5 + MOVE A12,A4 + + MOVE A4,(A1) + IMUL A4,1(A2) + MOVE A5,1(A1) + IMUL A5,(A2) + SUB A4,A5 + MOVE A13,A4 + + MOVSI A4,-3 + +CROSSL: MOVE A5,A11(A4) + IMUL A5,A3 + MOVEM A5,(A1) + AOJ A1, + AOBJN A4,CROSSL + POPJ P, + SUBTTL MOBILE RADAR ROUTINE +MOBRDR: PUSHJ P,INPCHR ;FIND DATA + JRST MOBR03 ;DEFAULTED + HRLZI A2,-3 + JRST MOBR02 + +MOBR01: PUSHJ P,INPCHR + JRST MOBR03 + +MOBR02: CAIN A0,040 ;BLANK? + JRST MOBR01 + CAIN A0,"," + JRST MOBR01 + SUBI A0,060 + JUMPL A0,MOBR03 + CAILE A0,11 + JRST MOBR03 + MOVEM A0,A11(A2) ;REMEMBER INDEX + AOBJN A2,MOBR01 + MOVEM A11,SHPMRX(A10) + MOVEM A12,SHPMRY(A10) + MOVEM A13,SHPMRZ(A10) + PUSHJ P,INPCHR + CAIA + JRST .-2 + +MOBR03: SKIPE SUPPRT ;SUPPRESS PRINT? + JRST MOBR05 + MOVEI A2,SHPMRX(A10) ;MR PARAMETERS + HRLI A2,-3 + MOVE A3,[POINT 7,MESG22,20] + +MOBR04: MOVE A0,(A2) ;PICK UP INDEX + ADDI A0,060 + IDPB A0,A3 + IBP A3 ;SKIP + IBP A3 + AOBJN A2,MOBR04 + MOVEI A1,MESG22 + PUSHJ P,OUTSTR + +MOBR05: MOVE A1,SHPCRF(A10) ;FORWARD FACING + MOVEI A2,GENWK2 + PUSHJ P,NVFUNC + MOVE A1,SHPCRU(A10) ;UPWARD FACING + MOVEI A2,GENWK3 + PUSHJ P,NVFUNC + MOVE A1,GENWK2 + ADD A1,GENWK2+1 + ADD A1,GENWK2+2 + MOVEM A1,SUMWK2 + MOVE A1,GENWK3 + ADD A1,GENWK3+1 + ADD A1,GENWK3+2 + MOVEM A1,SUMWK3 + MOVEI A3,SHPMRX(A10) + MOVSI A2,-3 + +MOBR06: PUSHJ P,CORSEL ;SELECT COORDINATE + MOVEI A0,1 + JUMPGE A1,.+3 + MOVN A0,A0 + MOVM A1,A1 + IMUL A0,(A3) + SOJ A1, + MOVE A6,A1 + ADDI A6,(A10) + ADD A0,(A6) + MOVEM A0,GENWK1(A1) + AOJ A3, + AOBJN A2,MOBR06 + MOVEI A0,SHPCRF(A10) + MOVEI A1,GENWK1 + PJRST PRTRDR ;PERFORM RADAR + SUBTTL FORWARD RADAR ROUTINE +FORRDR: CAIE A0,"R" ;COULD THERE BE A NUMBER? + JRST FORD02 ;NO + +FORD01: PUSHJ P,INPCHR + JRST FORD02 + CAIN A0," " + JRST FORD01 + SUBI A0,060 + JUMPL A0,MAKERC + CAIL A0,10 + JRST MAKERC + MOVEM A0,SHPFRD(A10) ;FORWARD RANGE + PUSHJ P,INPCHR ;CLEAR INPUT + CAIA + JRST .-2 + +FORD02: MOVE A1,SHPCRF(A10) + MOVEI A2,GENWK1 + PUSHJ P,NVFUNC + MOVE A0,SHPFRD(A10) + ADDI A0,060 + DPB A0,[POINT 7,MESG23+1,34] + MOVEI A1,MESG23 ;"DISP = N" + PUSHJ P,OUTSTR + MOVE A0,SHPCRU(A10) + SOJ A0, + TRNN A0,1 + ADDI A0,2 + SETOM FRFLAG ;FORWARD RADAR FMT + MOVEM A0,GENWK4 + MOVE A0,SHPCRF(A10) + MOVEM A0,GENWK4+1 + MOVE A1,SHPFRD(A10) + MOVSI A2,-3 + +FORD03: MOVE A0,GENWK1(A2) + IMUL A0,A1 + ADD A0,(A10) + MOVEM A0,GENWK1(A2) + AOJ A10, + AOBJN A2,FORD03 + SUBI A10,3 + MOVEI A0,GENWK4 ;DIRECTION NUMBERS + MOVEI A1,GENWK1 + PUSHJ P,PRTRDR + SETZM FRFLAG + POPJ P, + SUBTTL CORSEL COORDINATE SELECTOR +; ROUTINE TO SELECT THE CURRENT FORWARD AXIS (LH(A2)=-3), +; CURRENT UPWARD AXIS (LH(A2)=-2), OR THE LEFT TO RIGHT AXIS +; (LH(A2)=-1). +; THIS ROUTINE MAPS THE COORDINATE DISPLACEMENT TYPED IN BY THE +; PLAYER INTO THE ABSOLUTE X, Y, Z COORDINATES USED INTERNALLY. +; A 1, 2, OR 3 IS RETURNED IN A1 WHICH INDICATES RESPECTIVELY +; THAT THE X, Y, OR Z AXIS IS THE FORWARD, UPWARD, OR +; LEFT-RIGHT AXIS. THE RETURNED VALUE IS ALSO POSITIVE +; OR NEGATIVE WHICH INDICATES THAT THE SHIP IS ORIENTED +; IN THE POSITIVE OR NEGATIVE DIRECTION. + +CORSEL: HLRE A1,A2 ;COPY CODE + JRST .+4(A1) ;DISPATCH + JRST CORS30 + JRST CORS20 + MOVSI A1,-3 ;LAST + +CORS10: SKIPE GENWK2(A1) + CAIA + SKIPE GENWK3(A1) +CORS12: AOBJN A1,CORS10 + MOVEI A1,1(A1) + IMUL A1,SUMWK2 + IMUL A1,SUMWK3 + POPJ P, + +CORS20: MOVSI A1,-3 ;SECOND + SKIPN GENWK3(A1) + AOBJN A1,.-1 + MOVEI A1,1(A1) + IMUL A1,GENWK3-1(A1) + POPJ P, + +CORS30: MOVSI A1,-3 ;FIRST + SKIPN GENWK2(A1) + AOBJN A1,.-1 + MOVEI A1,1(A1) + IMUL A1,GENWK2-1(A1) + POPJ P, + SUBTTL PRTRDR ROUTINE +PRTRDR: PUSH P,A0 ;SAVE A0 + PUSH P,A1 + SKIPN FRFLAG + JRST PRDR01 + MOVEI A2,GENWK2 + MOVE A1,@A0 ;GET FF + PUSHJ P,NVFUNC + MOVE A1,-1(P) ;RECOVER A0 + MOVE A1,1(A1) ;GET UF + MOVEI A2,GENWK3 + PUSHJ P,NVFUNC + MOVE A0,GENWK2 + ADD A0,GENWK2+1 + ADD A0,GENWK2+2 + MOVEM A0,SUMWK2 + MOVE A0,GENWK3 + ADD A0,GENWK3+1 + ADD A0,GENWK3+2 + MOVEM A0,SUMWK3 + +; S=SUM(FRF)*SUM(URF)*LSIGN((FF+1)/2,(UF+1)/2) + +PRDR01: MOVE A1,-1(P) ;RESTORE A0 + MOVE A2,(A1) ;GET FF + MOVE A3,1(A1) ;AND UF + AOJ A2, + AOJ A3, + ASH A2,-1 + ASH A3,-1 + SOJ A2, + SOJ A3, + IMULI A2,3 + ADD A2,A3 + MOVE A6,LSIGN(A2) + IMUL A6,SUMWK2 + IMUL A6,SUMWK3 + +; LRF(J)=(1-IABS(FRF(J)+URF(J)))*S + MOVSI A2,-3 + +PRDR02: MOVE A1,GENWK2(A2) + ADD A1,GENWK3(A2) + MOVM A1,A1 + MOVEI A0,1 + SUB A0,A1 + IMUL A0,A6 + MOVEM A0,GENWK5(A2) + AOBJN A2,PRDR02 +; TAKE EACH SHIP AND FILL IN 'CUBEWK' +; WITH THE APPROPRIATE SHIP NUMBERS IN ASCII. + MOVEI A4,SHIPS + MOVN A3,NPLARS + HRLZ A3,A3 + +PRDR03: MOVEI A2,061(A3) ;THIS SHIP'S NUMBER + MOVE A1,SHPCRX(A4) + SOJ A1, + IMULI A1,=64 + MOVE A0,SHPCRY(A4) + SOJ A0, + IMULI A0,10 + ADD A1,A0 + MOVE A0,SHPCRZ(A4) + SOJ A0, + ADD A1,A0 + MOVEM A2,CUBEWK(A1) ;FILL ADDRESSED LOCATION + ADDI A4,SHPLEN + AOBJN A3,PRDR03 + MOVE A1,(P) ;RECOVER A1 + +; F=FRF(1)*X +FRF(2)*Y +FRF(3)*Z + MOVE A0,(A1) + IMUL A0,GENWK2 + MOVE A3,1(A1) + IMUL A3,GENWK2+1 + ADD A0,A3 + MOVE A3,2(A1) + IMUL A3,GENWK2+2 + ADD A0,A3 + MOVEM A0,GENWK6 + +; U=URF(1)*X +URF(2)*Y +URF(3)*Z + MOVE A0,(A1) + IMUL A0,GENWK3 + MOVE A3,1(A1) + IMUL A3,GENWK3+1 + ADD A0,A3 + MOVE A3,2(A1) + IMUL A3,GENWK3+2 + ADD A0,A3 + MOVEM A0,GENWK6+1 + +; L=LRF(1)*X +LRF(2)*Y +LRF(3)*Z + MOVE A0,(A1) + IMUL A0,GENWK5 + MOVE A3,1(A1) + IMUL A3,GENWK5+1 + ADD A0,A3 + MOVE A3,2(A1) + IMUL A3,GENWK5+2 + ADD A0,A3 + MOVEM A0,GENWK6+2 + +; FILL IN THE SCREEN + MOVSI A2,-11 + +PRDR04: MOVE A3,UOFSET(A2) + ADD A3,GENWK6+1 + MOVE A4,LOFSET(A2) + ADD A4,GENWK6+2 + +; (A5,A6,A7)_FRF(J)*F +URF(J)*A3 +LRF(J)*A4 + MOVSI A11,-3 + +PRDR05: MOVE A0,GENWK2(A11) + IMUL A0,GENWK6 + MOVE A1,GENWK3(A11) + IMUL A1,A3 + ADD A0,A1 + MOVE A1,GENWK5(A11) + IMUL A1,A4 + ADD A0,A1 + MOVEM A0,5(A11) + AOBJN A11,PRDR05 + + JUMPLE A5,PRDR06 ;CHECK FOR CUBE WALL + JUMPLE A6,PRDR06 + JUMPLE A7,PRDR06 + CAMLE A5,CUBSIZ + JRST PRDR06 + CAMLE A6,CUBSIZ + JRST PRDR06 + CAMLE A7,CUBSIZ + JRST PRDR06 + +; SCREEN(J,K) = CUBEWK(A5,A6,A7) + SOJ A5, + SOJ A6, + SOJ A7, + IMULI A5,=64 + IMULI A6,10 + ADD A5,A6 + ADD A5,A7 + MOVE A5,CUBEWK(A5) + MOVEM A5,SCREEN(A2) + CAIN A5,"-" ;EMPTY? + JRST PRDR07 + SUBI A5,060 + CAMN A5,SHPNUM(A10) ;OWN SHIP? + JRST PRDR07 + SKIPE FRFLAG ;FORWARD RADAR + JRST PRDR07 + SOJ A5, + IMULI A5,SHPLEN + MOVEI A6,(A10) ;SAVE SENDER + MOVEI A10,SHIPS(A5) + MOVEI A1,MESG24 ;"BEING SCANNED" + PUSHJ P,OUTSTR + XCT SHPOUU(A10) ;FORCE OUTPUT + MOVEI A10,(A6) + JRST PRDR07 + +PRDR06: MOVEI A5,"*" + MOVEM A5,SCREEN(A2) + +PRDR07: AOBJN A2,PRDR04 + SKIPE SUPPRT ;TRACE? + JRST PRDR09 + MOVSI A2,-11 + MOVE A3,[POINT 7,MESG25] + +PRDR08: MOVE A0,SCREEN(A2) ;GET TYPEOUT + IDPB A0,A3 + IBP A3 + IBP A3 + AOBJN A2,PRDR08 + MOVEI A1,MESG25 ;THE SCAN + PUSHJ P,OUTSTR + +PRDR09: MOVEI A0,"-" ;EMPTINESS + MOVE A1,[-=512,,CUBEWK] + MOVEM A0,(A1) + AOBJN A1,.-1 + POP P,A1 + POP P,A0 + POPJ P, + SUBTTL MATHEMATICAL UTILITIES +IFIX: MOVEM A0,FIXWRK ;SAVE SIGN + MOVM A0,A0 + MULI A0,400 + EXCH A0,A1 + ASH A0,-243(A1) + SKIPGE FIXWRK + MOVNS A0,0 + POPJ P, + +NVFUNC: PUSH P,A3 ;SAVE A3 + HRLI A2,-3 +NVFNC1: SETZM (A2) ;ASSUME CLEAR + HLRE A3,A2 ;ASSUME CLEAR + MOVEI A0,4 + ADD A0,A3 + MOVE A3,A1 + AOJ A3, + ASH A3,-1 + CAME A3,A0 + JRST NVFNC2 + ASH A0,2 + MOVE A3,A1 + ASH A3,1 + SUB A3,A0 + ADDI A3,1 + MOVN A3,A3 + MOVEM A3,(A2) +NVFNC2: AOBJN A2,NVFNC1 + POP P,A3 + POPJ P, + +VNFUNC: PUSH P,A2 + HRLI A1,-3 + MOVEI A2,4 +VNFNC1: SKIPN (A1) + JRST VNFNC2 + MOVE A0,A2 + SUB A0,(A1) + SUBI A0,1 + ASH A0,-1 +VNFNC2: ADDI A2,4 + AOBJN A1,VNFNC1 + POP P,A2 + POPJ P, + SUBTTL FACING ROUTINE +FACING: MOVE A2,[POINT 7,MESG26] + MOVE A3,SHPCRU(A10) ;UPWARD FACING + MOVE A3,FACNAM-1(A3) + IDPB A3,A2 + ASH A3,-7 + IDPB A3,A2 + IBP A2 + IBP A2 + MOVE A3,SHPCRF(A10) ;FORWARD FACING + MOVE A3,FACNAM-1(A3) + IDPB A3,A2 + ASH A3,-7 + IDPB A3,A2 + MOVE A2,[POINT 7,MESG26+2,6] + MOVEI A4,(A10) + HRLI A4,-3 + +FACNG1: MOVE A0,(A4) ;GET COORDINATE + ADDI A0,060 ;MAKE INTO ASCII + IDPB A0,A2 + IBP A2 + IBP A2 + AOBJN A4,FACNG1 + MOVEI A1,MESG26 ;INFORMATION LINE + PJRST OUTSTR + SUBTTL RATING ROUTINE +RATING: MOVEI A1,MESG27 ;HEADER LINE + PUSHJ P,OUTSTR + MOVEI A5,SHIPS + MOVN A4,NPLARS + MOVS A4,A4 + HRRI A4,1 + +RATNG1: MOVE A2,[POINT 7,MESG28] + MOVE A1,SHPNUM(A5) + ADDI A1,060 + IDPB A1,A2 + IBP A2 + IBP A2 + IBP A2 + MOVE A3,SHPNAM(A5) + MOVEI A6,=18 + +RATNG2: ILDB A0,A3 + JUMPE A0,RATNG3 + IDPB A0,A2 + SOJA A6,RATNG2 + +RATNG3: MOVEI A0," " + IDPB A0,A2 + SOJG A6,.-1 + MOVM A6,SHPRAT(A5) ;RATING + MOVEI A1,5 + +RATNG4: IDIVI A6,12 + ADDI A7,060 + PUSH P,A7 + JUMPE A6,RATNG8 ;IF DONE + SOJG A1,RATNG4 + JRST RATNG7 + +RATNG6: MOVEI A7," " + PUSH P,A7 + +RATNG8: SOJG A1,RATNG6 + +RATNG7: MOVEI A1,5 ;ASSUMED LENGTH + SKIPL SHPRAT(A5) + JRST RATNG5 + MOVEI A1,4 + POP P,A0 + MOVEI A0,"-" + IDPB A0,A2 + +RATNG5: POP P,A0 + IDPB A0,A2 + SOJG A1,RATNG5 + + MOVEI A1,3 + SUB A1,SHPHIT(A5) + ADDI A1,060 + DPB A1,[POINT 7,MESG28+6,27] + MOVE A6,SHPBLZ(A5) + IDIVI A6,12 + ADDI A6,060 + MOVE A2,[POINT 7,MESG28+8,6] + DPB A6,A2 + ADDI A7,060 + IDPB A7,A2 + MOVE A2,[POINT 7,MESG28+9,27] + MOVE A6,SHPRNC(A5) + IDIVI A6,12 + ADDI A6,060 + ADDI A7,060 + DPB A6,A2 + IDPB A7,A2 + MOVEI A1,MESG28 + PUSHJ P,OUTSTR + ADDI A5,SHPLEN + AOBJN A4,RATNG1 + POPJ P, + SUBTTL TRACE ROUTINES +TRACEA: MOVE A2,SHPTRC(A10) ;GET TRACE POINTER + JUMPE A2,TRACEB ;TRY TO MAKE TRACE + PUSHJ P,INPCHR + CAIA + JRST .-2 + +TRACA1: SOJ A2, + IMULI A2,SHPLEN + ADDI A2,SHIPS + MOVE A3,[POINT 7,MESG29+3] + HRLI A2,-3 + +TRACA2: MOVE A0,(A2) ;GET COORDINATE + ADDI A0,060 + IDPB A0,A3 + IBP A3 + IBP A3 + AOBJN A2,TRACA2 + MOVEI A1,MESG29 + PUSHJ P,OUTSTR + MOVEI A3,(A10) ;SAVE TRACING SHIP + MOVEI A10,-3(A2) ;GET TRACED SHIP + MOVEI A1,MESG24 ;"BEING SCANNED" + PUSHJ P,OUTSTR + XCT SHPOUU(A10) ;FORCE OUTPUT + MOVEI A10,(A3) + POPJ P, + +TRACEB: SETOM SUPPRT ;SUPPRESS PRINT + PUSHJ P,MOBRDR + SETZM SUPPRT + MOVSI A1,-11 + +TRACB1: MOVE A2,SCREEN(A1) ;INSPECT SPACE + CAIN A2,"*" ;CUBE EDGE? + JRST TRACB2 + CAIE A2,"-" ;VOID? + JRST TRACB3 ;NO, A SHIP + +TRACB2: AOBJN A1,TRACB1 + MOVEI A1,MESG30 ;"NOBODY THERE" + PJRST OUTSTR + +TRACB3: SUBI A2,060 ;MAKE NUMBER + CAMN A2,SHPNUM(A10) ;MY OWN? + JRST TRACB2 + MOVEM A2,SHPTRC(A10) ;TRACE IS ON + JRST TRACA1 ;SHOW HIS POSITION + SUBTTL RENAME ROUTINE +RENAMP: MOVE A2,SHPNAM(A10) ;POINT TO NAME + HRRZ A1,A2 + SETZM (A1) + SETZM 1(A1) + SETZM 2(A1) + SETZM 3(A1) + MOVEI A3,=18 + +RENAM1: PUSHJ P,INPCHR + JRST RENAM3 + CAME A2,SHPNAM(A10) ;LEADING CHAR? + JRST RENAM2 + CAIN A0," " + JRST RENAM1 + +RENAM2: IDPB A0,A2 + SOJG A3,RENAM1 + PUSHJ P,INPCHR + CAIA + JRST .-2 + MOVEI A1,MESG14 + PUSHJ P,OUTSTR + +RENAM3: MOVE A0,SHPNUM(A10) + ADDI A0,060 + DPB A0,[POINT 7,MESG36+1,34] + MOVEI A7,(A10) + MOVEI A10,SHIPS + MOVE A2,NPLARS + +RENAM4: MOVEI A1,MESG36 ;PLAYER NOW NAMED + PUSHJ P,OUTSTR + MOVE A1,SHPNAM(A7) + PUSHJ P,OUTRPT + PUSHJ P,OUTCRL + XCT SHPOUU(A10) + ADDI A10,SHPLEN + SOJG A2,RENAM4 + MOVEI A10,(A7) + POPJ P, + SUBTTL CUBESIZE ROUTINE +CBSIZP: CAIE A10,SHIPS ;FIRST PLAYER? + JRST MAKERC +CBSIZ1: PUSHJ P,INPCHR + JRST MAKERE + CAIN A0,"U" ;EXTRA CHARACTER? + JRST CBSIZ1 + CAIN A0," " + JRST CBSIZ1 + DPB A0,[POINT 7,MESG37+3,27] + SUBI A0,060 + JUMPLE A0,MAKERC + CAILE A0,10 + JRST MAKERC + MOVEM A0,CUBSIZ + FSC A0,233 + MOVEM A0,CUBSZF + MOVEI A10,SHIPS + MOVE A3,NPLARS + +CBSIZ2: HRLI A10,-3 + MOVE A2,[POINT 7,MESG37+7,13] + +CBSIZ3: PUSHJ P,RANDOM + FMPR A0,CUBSZF + FADRI A0,(1.0) + PUSHJ P,IFIX + MOVEM A0,(A10) + ADDI A0,060 + IDPB A0,A2 + IBP A2 + IBP A2 + AOBJN A10,CBSIZ3 + SUBI A10,3 + MOVEI A1,MESG37 ;"CUBE SIZE IS NOW ", + PUSHJ P,OUTSTR ;"YOU ARE NOW AT " + XCT SHPOUU(A10) + ADDI A10,SHPLEN + SOJG A3,CBSIZ2 + MOVEI A10,SHIPS + POPJ P, + SUBTTL INITIALIZATION ROUTINE +INITAL: MOVEI A1,6 ;DEFAULT CUBESIZE + MOVEM A1,CUBSIZ + MOVSI A1,(6.0) + MOVEM A1,CUBSZF + MOVEI A1,"-" ;VOID MARKER + MOVE A2,[-=512,,CUBEWK] + MOVEM A1,(A2) + AOBJN A2,.-1 + +INIT01: TTCALL 3,MESG31 ;"HOW MANY PLAYERS?" + TTCALL 0,A1 + SUBI A1,060 + JUMPLE A1,INIT01 + CAILE A1,12 + JRST INIT01 + MOVEM A1,NPLARS + CAIGE A1,5 ;CUBE TOO SMALL? + JRST INIT02 + MOVEI A0,10 + MOVEM A0,CUBSIZ + MOVSI A0,(8.0) + MOVEM A0,CUBSZF + +INIT02: TTCALL 3,MESG32 ;"GIVE ME TTY NUMBERS" + MOVEI A7,SHIPS + +INIT03: TTCALL 0,A2 ;GET HIGH DIGIT + SUBI A2,060 + JUMPL A2,INIT07 + CAILE A2,7 + JRST INIT07 + ASH A2,3 + TTCALL 0,A3 + SUBI A3,060 + JUMPL A3,INIT07 + CAILE A3,7 + JRST INIT07 + MOVEI A0," " + TTCALL 1,A0 + ADD A2,A3 + TRO A2,200000 ;ADD TTY BITS + MOVEM A2,SHPTTY(A7) + ADDI A7,SHPLEN + SOJG A1,INIT03 + MOVEI A7,SHIPS ;NOW TRY TO INIT THEN + MOVE A2,NPLARS + +INIT04: PUSHJ P,INITTY + JRST INIT08 ;CAN'T OPEN TTY + ADDI A7,SHPLEN + SOJG A2,INIT04 + TTCALL 3,MESG38 + MOVEI A10,SHIPS + MOVE A7,NPLARS + +INIT05: MOVEI A1,MESG33 ;"GIVE ME YOUR NAME" + PUSHJ P,OUTSTR + XCT SHPOUU(A10) + SETZM SHPBLZ(A10) ;MY INDICATOR + ADDI A10,SHPLEN + SOJG A7,INIT05 + PUSHJ P,GETNAM ;GET NAMES + TTCALL 3,MESG34 + MOVEI A10,SHIPS + MOVE A7,NPLARS + +INIT06: MOVEI A1,MESG34 ;"LET THE WAR BEGIN" + PUSHJ P,OUTSTR + XCT SHPOUU(A10) + ADDI A10,SHPLEN + SOJG A7,INIT06 + POPJ P, + +INIT07: TTCALL 3,MESG35 ;"BAD TTY #" + JRST INIT03 + +INIT08: TTCALL 3,MESG17 ;"CANT GET TO TTY" + MOVE A1,NPLARS + JRST INIT02 ;START OVER + SUBTTL NAME GETTING ROUTINE +GETNAM: MOVEI A10,SHIPS ;READY FOR QUERY + MOVE A6,NPLARS + +GETNM1: PUSHJ P,QUERY + JRST GETNM2 ;INTERPRET + MOVSI A1,20 + HIBER A1, ;WAIT FOR TTY LINE + HALT + JRST GETNM1 + +GETNM2: SKIPE SHPBLZ(A10) ;NAME ALREADY THERE? + JRST GETNM7 ;YES + MOVE A2,SHPNAM(A10) ;POINT TO NAME + MOVEI A3,=18 + HRRZ A1,A2 + SETZM (A1) + SETZM 1(A1) + SETZM 2(A1) + SETZM 3(A1) + +GETNM3: PUSHJ P,INPCHR + JRST GETNM5 + CAME A2,SHPNAM(A10) ;LEADING BLANKS? + JRST GETNM4 + CAIN A0," " + JRST GETNM3 + +GETNM4: IDPB A0,A2 + SOJG A3,GETNM3 + MOVEI A1,MESG14 ;"NAME TOO LONG" + PUSHJ P,OUTSTR + XCT SHPOUU(A10) + JRST GETNM7 ;RETRY + +GETNM5: CAMN A2,SHPNAM(A10) ;NULL NAME? + JRST GETNM6 + PUSHJ P,INIPLR ;FILL IN SHIP BLOCK + SETZM SHPRNC(A10) ;NO DEATHS YET + SETZM SHPRAT(A10) + SOJG A6,GETNM1 + POPJ P, ;ALL READY + +GETNM6: MOVEI A1,MESG16 ;"NO NULL NAMES" + PUSHJ P,OUTSTR + XCT SHPOUU(A10) + JRST GETNM1 + +GETNM7: PUSHJ P,INPCHR + JRST GETNM1 + JRST .-2 + SUBTTL TELETYPE INITIALIZER +INITTY: MOVE A5,SHPTTY(A7) ;GET TTY NUMBER +IFN CMU,{ TRZ A5,200000 ;CLEAR TRMNO. BIT + MOVE A11,A5 + TRZ A5,000007 + ASH A5,3 + TRZ A11,000070 + ADD A5,A11 + TRO A5,202020 + HRLI A5,646471 + MOVEI A4,1 ;SET LINE MODE + MOVEI A6,SHPINB(A7) + HRLI A6,SHPOUB(A7) + MOVE A11,SHPOUU(A7) ;FIND OUTPUT UUO + TLZ A11,777000 ;KILL UUO CODE + TLO A11,050000 ;ADD OPEN CODE + HRRI A11,A4 + XCT A11 + POPJ P, ;FAILED +} +IFN ITS,{ MOVE A11,A5 + ROT A11,-3 ;GET FIRST 3 BITS + MOVEI A5,(A11) + LSH A5,6 + ROT A11,3 + ANDI A11,7 + ADDI A5,(A11) + ADDI A5,'T00' ;GET TNN + HRLI A5,0 ;SET UP MODE (UNIT ASCII IN) + MOVE A4,SHPNUM(A7) ;FIND PLAYER # (TO GET CHANNEL # FROM) + LSH A4,1 + SUBI A4,2 ;INPUT CHANNEL IS <#*2>-2 + HRRZI A6,A5 ;EFF ADDR FOR .OPEN + HLL A6,OPNTAB(A4) ; .OPEN CH, + XCT A6 + POPJ P, ;INPUT OPEN FAILED + CAIN A4,TYIC + SETZM TTYSTI + ADDI A4,1 ;OUTPUT CH= INPUT+1 + HLL A6,OPNTAB(A4) + HRLI A5,3 ;MODE=BLOCK OUT + XCT A6 + POPJ P, ;FAILED + CAIN A4,TYOC + SETZM TTYSTO + + SETOM CHNCNT(A4) ;SET RANDOM VARIABLES FOR EACH CH + MOVEI A5,CHBFMX + MOVEM A5,SHPOUB+2(A7) ;SET UP BUFFER CNT + MOVE A5,CHSTPT(A4) ;PTR INTO BUFFER + MOVEM A5,SHPOUB+1(A7) + MOVEI A5,SHPOUB+1(A7) + MOVEM A5,CHTPGB(A4) ;SAVE INDEX TO BLK + + SOJ A4, + SETOM CHNCNT(A4) + SETZM SHPINB+2(A7) + MOVEI A5,SHPINB+1(A7) + MOVEM A5,CHTPGB(A4) + MOVE A5,CHMSK(A4) ;GET BIT MSK + .SUSET [.SIMSK2,,A5] ;ENABLE INPUT INTS. ON THIS CHANNEL +} + MOVEM A7,LSTSHP + AOS (P) + POPJ P, + SUBTTL RANDOM NUMBER GENERATOR +RANDOM: MOVE A0,RANNUM + MUL A0,RANLST + ASHC A0,4 + LSH A1,-4 + ADD A0,A1 + TLZE A0,760000 + ADDI A0,1 + MOVEM A0,RANLST + HLRZ A1,A0 + FSC A1,216 + HRLI A0,0 + FSC A0,174 + FAD A0,A1 + POPJ P, + SUBTTL TELETYPE I/O ROUTINES +OUTCHR: SOSG SHPOUB+2(A10) ;CHECK SPACE + XCT SHPOUU(A10) ;GET MORE + IDPB A0,SHPOUB+1(A10) ;INSERT CHARACTER + POPJ P, + +OUTSTR: HRLI A1,440700 ;ADD POINTER + +OUTRPT: ILDB A0,A1 ;GET CHARACTER + JUMPE A0,CPOPJ + PUSHJ P,OUTCHR + JRST OUTRPT + +OUTCRL: MOVEI A0,015 + PUSHJ P,OUTCHR + MOVEI A0,012 + PJRST OUTCHR + +INPCHR: SOSGE SHPINB+2(A10) ;CHARACTERS READY? + XCT SHPINU(A10) + ILDB A0,SHPINB+1(A10) + JUMPE A0,INPCHR ;IGNORE NULLS + CAIN A0,033 + JRST INPCH1 ;TREAT ESC LIKE EOL + CAIN A0,015 ;IGNORE CR + JRST INPCHR + CAIE A0,012 ;LINE FEED? DO EOL HANDLING + JRST CPOPJ1 ;ORDINARY RETURN + +INPCH1: SETZB A0,SHPINB+2(A10) +IFN ITS,{ PUSH P,A1 + MOVE A1,SHPNUM(A10) ;GET PLAYER # + LSH A1,1 + SUBI A1,2 ;GET INPUT CH # FOR PLAYER + SETOM CHNCNT(A1) ;INDICATE MUST INITIALIZE BUFFER + MOVE A1,CHMSK(A1) ;GET BIT FOR THIS CHAN + .SUSET [.SADF2,,A1] ;CLEAR DEFER BIT; ENABLE INTS FOR CHAN + POP P,A1 ;I.E. NOW FREE TO GET MORE CHARS INTO BUFFER +} + POPJ P, + +IFN ITS,{ +INT: 0 + 0 + SKIPL I15,INT ;GET INT. BITS + JRST INTFW ;HMM, NOT I/O INT. + ANDI I15,177777 ;IO CHANNEL FIELD- LAST 16. BITS + JFFO I15,INT0 ;GET CNT OF LEADING 0'S + JRST INTRET ;NOTHING LEFT +INT0: SUBI I16,=35 ;GET -<# OF CH> + MOVN I16,I16 ;CH # + ANDCM I15,CHMSK(I16) ;KILL THE BIT FOR CHAN WE'RE HANDLING + MOVEM I15,INT ;AND SAVE + + MOVE I14,I16 + .ITYIC I14, + JRST INT99 ;NOT REALLY ANYTHING THERE + XCT IOTTB(I16) ;GET CHAR INTO I14 + CAIN I14,177 ;RUBOUT? + JRST INTRBT + AOSG I15,CHNCNT(I16) ;ADD ONE TO COUNT IN BUFFER + JRST INTBFI ;IF ZERO, SIGN TO GO INITIALIZE BUFFER(RETURN TO INT20) +INT20: CAIN I14,15 ;CR? + JRST INTCR + CAILE I15,CHBFMX ;CHECK FOR BLOATED BUFFER + JRST INT90 ;THROW AWAY CHAR IF FULL + IDPB I14,CHBFPT(I16) ;STORE + +INT99: SKIPE I15,INT ;GET INT. WD AGAIN + JFFO I15,INT0 ;MUNG IF ANYTHING LEFT +INTRET: .DISMIS INT+1 ;RETURN TO MAIN PROGRAM + +INT90: MOVE I14,CHMSK(I16) ;GET BIT MSK + IORM I14,INAVAL ;AND INDICATE INPUT AVAILABLE + .SUSET [.SIDF2,,I14] ;AND DEFER INTS FOR THIS CHAN + JRST INT99 + +INTRBT: MOVEI I15,1(I16) ;GET OUTPUT CH # + SOSL CHNCNT(I16) ;DECREMENT CNT + JRST INTRB5 ;NOTHING LEFT + LDB I14,CHBFPT(I16) ;GET LAST CHAR + XCT IOTTB(I15) ;OUTPUT CHAR + MOVE I15,CHBFPT(I16) ;DECREMENT POINTER. + ADD I15,[70000,,0] ;INCREASE P + SKIPG I15, ;SKIP + SUB I15,[430000,,1] ;UNLESS WENT OFF EDGE...RESET + MOVEM I15,CHBFPT(I16) ;STORE DECREMENTED PTR BACK + JRST INT99 +INTRB5: MOVEI I14,15 ;OUTPUT CR + XCT IOTTB(I15) + MOVEI I14,12 ;AND LF + XCT IOTTB(I15) + SETZM CHNCNT(I16) ;ZERO CNT + MOVE I15,CHSTPT(I16) ;GET PTR TO START + MOVEM I15,CHBFPT(I16) ;AND SET UP + JRST INT99 + +INTCR: AOS I15,CHNCNT(I16) ;INCRMENT CNT AGAIN FOR LF + IDPB I14,CHBFPT(I16) ;DEPOSIT CR + MOVEI I14,12 ;AND SUPPLY LF + IDPB I14,CHBFPT(I16) + MOVE I15,CHMSK(I16) ;AND NOW DEFER INTS ON THIS CHANNEL + .SUSET [.SIDF2,,I15] + IORM I15,INAVAL ;AND TURN ON BIT INDICATING INPUT AVAIL ON THIS CHAN. + JRST INT99 ;THRU WITH THIS CHAN + +INTBFI: MOVE I15,CHSTPT(I16) ;INITIALIZE...GET PTR TO START OF BUFFER + MOVEM I15,CHBFPT(I16) ;STORE + MOVEI I15,1 ;AND CNT + MOVEM I15,CHNCNT(I16) + JRST INT20 ;RETURN TO PROCESS INPUT CHAR + +INTFW: .VALUE ;STOP IF HIT INT. NOT PROVIDED FOR + .DISMIS INT+1 + + +INAVAL: 0 ;BITS IN THIS WORD INDICATE INPUT AVAILABLE +CHTPGB: BLOCK 20 ;FOR EACH CH, ADDR+1 OF MAIN PROGRAM'S DEC-STYLE BLOCK +CHNCNT: BLOCK 20 +CHBFPT: BLOCK 20 +CHBFMX== =100 ;# CHARS MAXIMUM IN EACH BUFF. +CHBFWL==</5>+1 ;FIND # WDS PER BUFFER (ENSURE ROOM FOR 2 EXTRA CHARS) +CHSTPT: FOR C_0,17 +{ 440700,,CHBUFF+CHBFWL*C +} +CHBUFF: BLOCK 20*CHBFWL ;ROOM FOR ALL BUFFERS + +OPNTAB: FOR C_0,17 +{ .OPEN C, +} +CLSETB: FOR C_0,17 +{ .CLOSE C, +} +IOTTB: FOR C_0,17 +{ .IOT C,I14 +} +CHMSK: FOR C_0,17 +{ 1C +} + +} ;END OF BIG CONDITIONAL + + SUBTTL CONSTANTS +CMNDTB: MAKCMC,,"L" + MAKCMR,,"R" + MAKCMC,,"U" + MAKCMC,,"D" + MAKCMM,,"M" + MAKCMN,,"N" + MAKCMF,,"F" + CBSIZP,,"C" + MAKMV1,,"B" + TRACEA,,"P" + TRACEB,,"T" +CMNDCT==.-CMNDTB + +STARB: ASCIZ "*" +RANNUM: 4544,,503720 + +LSIGN: OCT 0,1,777777777777,777777777777,0,1 + OCT 1,777777777777,0 +LOFSET: OCT 777777777777,0,1,777777777777,0,1 + OCT 777777777777,0,1 +UOFSET: OCT 1,1,1,0,0,0 + OCT 777777777777,777777777777,777777777777 +FACNAM: 26053 + 26055 + 26253 + 26255 + 26453 + 26455 + +MESG01: ASCIZ "What? +" +MESG02: ASCIZ "No +" +MESG03: ASCIZ "Not yet +" +MESG04: ASCIZ "Out of Blazers +" +MESG05: ASCIZ "Missed +" +MESG07: ASCIZ "Blazer hit on " +MESG08: ASCIZ "Trace on you has been broken +" +MESG09: ASCIZ "Trace lock has been broken +" +MESG10: ASCIZ "You have been killed by " +MESG11: ASCIZ " killed by " +MESG12: ASCIZ "You have been reincarnated +" +MESG14: ASCIZ "Name too long +" +MESG15: ASCIZ "Teletype number not given +" +MESG16: ASCIZ "Name not given +" +MESG17: ASCIZ "Unable to initialize teletype +" +MESG18: ASCIZ "Receiver not found +" +MESG19: ASCIZ "Message from " +MESG20: ASCIZ ": " +MESG21: ASCIZ " +Msg to all from " +MESG24: ASCIZ " +*****Being Scanned! +" +MESG27: ASCIZ " RATING HITS BLZRS DEATHS +" +MESG30: ASCIZ "No ship seen to Trace +" +MESG31: ASCIZ "How many players? 1-8 : " +MESG32: ASCIZ " +Enter TTY numbers, two digits each +: " +MESG33: ASCIZ "Enter name to identify your ship : " +MESG34: ASCIZ "All players ready, proceed with game +" +MESG35: ASCIZ "Bad TTY number +" +MESG38: ASCIZ "Obtaining Player names. +" + SUBTTL VARIABLES +STKL==100 +STACK: BLOCK STKL + +GENWK1: BLOCK 3 +GENWK2: BLOCK 3 +GENWK3: BLOCK 3 +GENWK4: BLOCK 2 +GENWK5: BLOCK 3 +GENWK6: BLOCK 3 + +SUMWK2: 0 +SUMWK3: 0 + +CUBEWK: BLOCK =512 +SCREEN: BLOCK 9 + +NPLARS: 0 +LSTSHP: 0 +CUBSIZ: 0 +CUBSZF: 0 +RANLST: 1,,-1 +SUPPRT: 0 +FRFLAG: 0 +FIXWRK: 0 + +SHIPS: FOR N_1,10 +{ BLOCK =15 + N + BLOCK 6 + INPUT N, + OUTPUT N, + 0 + POINT 7,NAMES+<*4> +} + +NAMES: BLOCK 40 + +MESG06: ASCIZ " +HIT #0 from " +MESG22: ASCIZ " + 0, 0, 0 +" +MESG23: ASCIZ " +DIST = 0 +" +MESG25: ASCIZ "0 0 0 +0 0 0 +0 0 0 + +" +MESG26: ASCIZ "+x ++x =>( 0, 0, 0) +" +MESG28: ASCIZ "0) 00000 0 00 00 +" +MESG29: ASCIZ "Traced ship = (0, 0, 0) +" +MESG36: ASCIZ " +Player 0 is now named " +MESG37: ASCIZ " +Cubesize is now 0 +You are now at (0, 0, 0) +" + + END CUBSTR +  \ No newline at end of file diff --git a/src/klh/cubwar.doc b/src/klh/cubwar.doc new file mode 100644 index 00000000..cebd4c10 --- /dev/null +++ b/src/klh/cubwar.doc @@ -0,0 +1,203 @@ + + + CUBE WAR + + Cubewar is a computer game played on conventional terminals +between from two to eight players. It has been transmitted through +the ARPANet from its originator, Jim Sulzen at UC-at-Irvine. +It is a highly interactive program, +which will be kept quite busy handling all of its +terminals. Thus, it will often be a load on the system, +and a moderately used system may not be able to provide adequate +response to Cubewar. According, it should be used during idle +time whenever possible. + + The game is played within a cube of space, from 6 +to 8 cubes on a side. Each player is a 'ship' in this cubical +space, provided with simple means of locating others, and armed +with a 'blazer' to attack other ships. The cubes which make up +cubical space might be thought of as quarants in StarTrek, within +which a ship may have varying locations. This is not the case. +A ship is either in one cube, or it is not; there are no variations +on the fact of being 'in' a particular cube. + + A ship has a particular direction in which it is facing, +one direction which is directly in 'front' of the ship. +This is one of the six possible directions relative to the cube, +with no grades in between. Consider a left-handed Cartesian +coordinate system. The direction directly in front of you +is 'plus-X', while the opposite is 'minus-X.' To your right +is the 'plus-Y' direction, to your left is 'minus-Y,' upward is +'plus-Z' and downward is 'minus-Z.' This is the system used in +defining Cubewar directions. In addition, a cube has a three-digit +address, from (1,1,1) to (8,8,8) assuming a size-8 cube. + + In addition to a 'forward' direction, the ship has a definite +'upward' direction. The two facings, forward and upward, are used +to specify what area of space is examined by the Radar commands. +The two facings, of course, will be 90 degrees apart. +You have six commands to alter the orientation of your ship: +Right Turn (RT), Left Turn (LT), UP, Down (DN), Rotate Right +(RR), and Rotate Left (RL). + + The ships have movement ability, through the Move (MV) +command. This causes the ship to take one step in the 'forward' +direction. There is no way to order the ship to 'keep moving,' +you must issue a MV for each step. The ship will not be permited +to leave the cube; there is nowhere else to go. + Radar: There are two commands available to let you see +what is outside of your ship. These are Forward Radar and +Mobile Radar. Both of these show you a grid of nine squares, +giving you the contents of nine cubes in space. What is shown +is either an asterisk, a dash, or a number. An asterisk indicates +that the cube section is outside the cube, and the dash indicates +that the cube section is empty. A one-digit number indicates that the +cube section is occupied by a ship, and the number shows which +ship. By this you may recognize you, your friends, and your enemies. + + The difference between the Forward and Mobile Radars is in +which cube sections are shown. The simple one is the Forward radar. +It takes a parameter, entered like 'FR2', which gives the distance +between your ship and the start of the display. For example, +a 'FR' command alone would produce something like + + - - - + - 1 - + - - - + +which means that you (ship #1) have nothing around you. With forward +radar the nine locations shown will be in the same 'plane' as your ship. +Consider your orientation, with a specific forward and upward direction. +Forward radar shows you what is in front of you or just on each side of +you, and never what is above or below you. For reasonableness it will +also not show you what is behind you. This means that the bottom line shown +is waste; you can make better use of the display by pushing the scan forward +a few cubes, like 'FR1', which might show + + - - 5 + - - - + - 1 - + +which shows your ship one step backwards. It also shows ship #5 two +cubes ahead of you and one to the right. Recall the commands given +above. Perform a RT, an MV, and a LT. Where are you now? +Another 'FR1' gives you + - 5 - + - - - + - 1 - +so you are on the same plane, but one step to your right. + You have on the front of your ship a Blazer which will project +directly in front of your ship until it hits something. It will enter +each cube in front of you until it finds a ship, or the edge of the cube. +Since ship 5 is right in front of you, typing 'FB' will result in the +message 'BLAZER HIT ON PHANTOM' or something like it. This means that you +hit him. It also tells you 'his' name, the name he typed what the game +started up. Now if you FB again, if he hasn't moved yet, you will get +another similar message. A ship can take two blazer hits. The third +time it gets hit, it is 'destroyed', and disappears, with the message +'PLAYER PHANTOM KILLED BY NOVICE' sent to all the players. +(The name NOVICE was what ever you said you were.) Your victim got +recreated someplace else in the cube. + Mobile Radar: This is rather more complicated than Forward +Radar. This takes a three-digit number as parameter. These numbers +give the location of a cube in space, with the given displacement +from your ship. The first digit is the X-displacement, the second Y, +the last Z. Thus, 'MR300' refers to the third cube in front of you. +What does it do with this cube? It takes a cross-section of the +cube around that cube section, at right angles to the line between you +and that section. That is, it shows what is above and below the given +cube section. Consider the previous example with FR. Given the situation + + - 5 - + - - - + - 1 - + +the command 'MR200' will give the display + + - - - + - 5 - + - - - + +which means that ship 5 is at range 2 (since MR200 found him) and +directly in front of you (which you knew). Now do a DN (Down), Move, +and UP. Consider where you are now. FR finds nothing, since the +enemy is not on your plane, but on the one above you. But 'MR200' gives + + - 5 - + - - - + - - - + +which means that he is still 2 steps in front of you, but, as you see, +one level above you. + + This permits you to examine much more space than FR permits. +You can use FR to look for ships to shoot at immediately. Mobile +Radar will permit you to examine a whole 'tunnel' in front of you +to find someone who can't see you on Forward Radar. To give him +a warning, whenever anybody is shown an a Mobile Radar scan be gets +the message '***BEING SCANNED' which gives him a chance to move. + Scoring: To give some way of comparing the performances of +the many players, points are scored for each player. Two points are +scored for hitting somebody with a blazer, and ten for killing him. +The 'Name' command, NM, gives a display of the performances of all +the players. For instance, + + RATING HITS BLZRS DEATHS +1) NOVICE 16 0 13 0 +2) LORD BALTIMORE 48 1 19 0 +3) AVENGER 5 2 7 1 +4) PIMPERNEL - 41 0 9 3 +5) PHANTOM - 28 0 6 2 + +Observe the Rating column. Every time you get two points, +your opponent loses two points. The hits column shows how many +hits the ship has taken, towards the limit of three. The BLZRS +column shows how many Blazer fires the ship has left. Each ship +starts with 3 times as many blazers as there are players, and +get 3 as a bonus whenever it kills another ship. The Deaths column +shows how many times the player took his three hits and had to be +recreated. + EtCetera: The Message command permits you to send messages +to other players, or to all the players at once. The formats are + MS phant:got you! +or MS *:everyone after number 5! + +where the player's name is given followed by a colon and the message. +In some versions the first five letters of the name are required, +in others the first three. To send the message to everyone +the player name is given as an asterisk. + + The Trace command (TR) may be issued when you see somone +on the Mobile radar. Thereafter, you can issue Print Trace (PT) and be +told where in space that ship has gone to. It is given in cube-relative +locations, so you must know where you are to make use of the information. +The Facing command (FA) gives a display like + +Z + +X => (4,6,1) +which means that your ship is at X=4, Y=6, Z=1, and that +X is in +front of you and +Z is above you. + + Due to all sorts of reasons you may be disenchanted with the +name you gave when you started the game. To change it type + RNnewname +and it will be announced to everyone to keep things straight. + + The default Cube size is 6X6X6. If there are 5 or more +players it goes up to 8X8X8, which is the absolute limit. +Should you wish to change the size, the player who started the game +can say + CU 7 +for instance, to change the size to 7X7X7. + + The game may be in progress when another player arrives. +Rather than restarting the game, the person who is running it can issue + NP25newplayername +to define TTY25, for instance, to be player 'newplayername'. +If he doesn't like his name, after all, he can change it. + CubeWar is started by a RUN CUBWAR[A630DK32]. +Answer the question "How Many Players?" with the number 1 through 8, +no CR required. Provide the TTY numbers as two digits each, no more +no less, no delimiters, no carriage return. If it says you blew it, +and asks again, retype all the TTY numbers. CUBWAR is maintained +and developed by Dave King, KING@CMUA or KING@CMUB. + z't \ No newline at end of file diff --git a/src/klh/flight.306 b/src/klh/flight.306 new file mode 100644 index 00000000..622e72ca --- /dev/null +++ b/src/klh/flight.306 @@ -0,0 +1,3667 @@ +TITLE FLIGHT SIM. + +A=1 +B=2 +C=3 +D=4 +X=5 +Y=6 +I=7 +J=10 +P=11 + +LC%ES==12 +LP%IF==13 +ZP%MD==14 +Z%IN==12 + +U=15 +V=16 +W=17 + +IMD==6 +ZMD==0 +PMD==1 +VMD==4 +VCMD==5 +CMD==3 +IMX=574 +OMX==570 +IORSET=633550 +DISCH==5 +SDISCH==4 +TTCH==6 +CLCH==2 +SISET==100 +PDS==100 +DDT=34000 +DSIS==3000 +MXMEM==12100+CLCH + +FOOF==1 + + +; UUO DEFINEINGS + +PRNT=001000,,0 +SAC=002000,,0 +UAC=003000,,0 +WATE=004000,,0 ;UNUSED UUO +VAAX=005000,,0 ;UNUSED UUO +MACDMP=37400 + R==V +S==J + +Z%SC==U +Z%ST==W + +IMD==6 +ZMD==0 +PMD==1 +VMD==4 +CMD==3 + +SIXTH==252 +PDS==300 +MX==1 +TEN==2 +IMX==574 +STDS==2440 +MVDS==3000 + +DEFINE 4PUT L +IRPS Q,,A B C D,R,,L + MOVEI 0,R + JSP Q,(Q) +TERMIN +TERMIN +.OPEN=.OPEN +.CLOSE=.CLOSE +.DSTART=.DSTART +.DSTOP=.DSTOP +.DCLOCE=.DCLOSE +.IOT=.IOT +.SLEEP=.SLEEP +.SUSET=.SUSET +.DISMIS=.DISMIS +.CORE=.CORE + + LOC 41 + JSR UUOH + + LOC 40+2*TTCH + JSR TTYBK + + LOC 40+2*CLCH + JSR CLOCK + + LOC 40+2*DISCH + BLKO DIS,BLKOP + JRST 4,. + + LOC 40+2*SDISCH + JSR DISIN + JRST 4,. + LOC 100 + + +GO: CONO IORSET+CLCH + CONO 460,0 + CONO TTY,TTCH + MOVE A,[JSR UUOH] + MOVEM A,41 + MOVE P,[-PDS,,PDL-1] + PUSHJ P,DSTOP + + SETZM REMX + MOVE A,[50.0] + MOVEM A,REMY + MOVE A,NODEG + PUSHJ P,ANGXY + MOVEM A,SINA + MOVEM B,SINB + MOVE A,[360.0] + FDVR A,NODEG + PUSHJ P,FIX + MOVEM A,NOLINS + + CONO 420,40 + SETZM COUNT' + SETOM TTYOFF' + SETOM ONCE' + SETOM ONCE1' + SETZM TRACE' + MOVEI A,SISET-1 + MOVEM A,INPNTR + MOVEM A,OTPNTR + CONO PI,12276 + + MOVEI A,XTAB + MOVEM A,MACDMP+0 + MOVEI A,YTAB + MOVEM A,MACDMP+1 + MOVEI A,ZTAB + MOVEM A,MACDMP+2 + MOVEI A,XTAB1 + MOVEM A,MACDMP+3 + MOVEI A,YTAB1 + MOVEM A,MACDMP+4 + MOVEI A,ZTAB1 + MOVEM A,MACDMP+5 +IDL: JRST TEST1 + +TIME: 0 + +TEST1: MOVE P,[-PDS,,PDL-1] ; GO FLY + PUSHJ P,DSTOP + MOVSI A,-6 + SETZM ROL(A) + AOBJN A,.-1 + MOVE A,[1000.0] + MOVEM A,XE + + MOVEI A,3777 + MOVEM A,EVLI + PUSHJ P,SETUPF + MOVE A,TIME + PUSHJ P,FLT + MOVEM A,LTIME +RELIN1: PUSHJ P,SWBP + PUSHJ P,FLY + PUSHJ P,MVINS + PUSHJ P,MAIRP + + PUSHJ P,DCRFT + JRST RELIN1 + +TEST: MOVE P,[-PDS,,PDL-1] ; RANDOME POSISHIONING + PUSHJ P,DSTOP + SETZM DZON + MOVSI A,-6 + SETZM ROL(A) + AOBJN A,.-1 + MOVSI A,(1000.0) + MOVEM A,XE + +RELIN: PUSH P,U + PUSH P,V + PUSH P,W + PUSH P,I + PUSH P,J + + PUSHJ P,SWBP + DATAI 420,B + + SETZM A + TLNN B,100000 + MOVN A,TIPA + TLNN B,40000 + MOVE A,TIPA + FADRM A,PCH + + MOVE A,[360.0] + SKIPGE PCH + FADRM A,PCH + MOVE A,[-360.0] + CAMLE A,[360.0] + FADRM A,PCH + + SETZM A + TLNN B,400000 + MOVE A,TIPA + TLNN B,200000 + MOVN A,TIPA + FADRM A,YAW + + MOVE A,[360.0] + SKIPGE YAW + FADRM A,YAW + MOVE A,[-360.0] + CAMLE A,[360.0] + FADRM A,YAW + + TLNN B,20000 + SETOM RMONE + TLNN B,20000 + JRST CONT + SKIPE RMONE + AOS A,GOING + SETZM RMONE + MOVE A,GOING + CAIL A,4 + SETZB A,GOING + SKIPN GOING + JRST CONT + CAIN A,2 + JRST CONT + + CAIN A,1 + MOVE B,[MOVE C,VEMC(B)] + CAIN A,3 + MOVE B,[MOVN C,VEMC(B)] + MOVEM B,PMI + + MOVSI B,-3 +REMV: MOVE A,MXTB + SUBI A,3777 + PUSHJ P,FLT + FMPR A,[0.005] +PMI: JRST 4,. + FMPR C,A + FADRM C,XE(B) + AOBJN B,REMV + +CONT: POP P,J + POP P,I + POP P,W + POP P,V + POP P,U + + PUSHJ P,DCRFT + JRST RELIN + +DCRFT: PUSHJ P,TRNS +ITS: TRN GETITS + MOVEI A,WORLD + PUSHJ P,GETPE +IFN FOOF,[ SETOM DOBJ + MOVEI A,LFOO + TRN P,GETPE + SKIPL DOBJ + SETZM FOOP] + + MOVEI A,RUNW + PUSHJ P,GETPE + MOVEI A,HEL + TRN P,GETPE +DSENT: MOVEI A,3000 ;STOP DISPLAY + IDPB A,BP + PUSHJ P,DSTART + POPJ P, + + +TIPA: 1.0 +RMONE: 0 +GOING: 0 +FOOP: 77777 + +GETITS: MOVEI A,WORLD1 + PUSHJ P,GETPE + JRST DSENT + IFN FOOF,[LFOO: AOS I,FOOP + CAIG I,10 + POPJ P, + SETZM DOBJ + MOVE I,[200-BARIND,,200] + JRST ILOOP] + +WORLD1: MOVSI I,-8 + JRST ILOOP +WORLD: MOVSI I,-36 + JRST ILOOP +PYR: MOVSI I,-8 +ILOOP: MOVE U,XTAB(I) + MOVE V,YTAB(I) + MOVE W,ZTAB(I) + JSP A,(A) +ILOOP1: MOVE U,XTAB1(I) + MOVE V,YTAB1(I) + MOVE W,ZTAB1(I) + JSP A,(A) + AOBJN I,ILOOP + POPJ P, + +GFROB: MOVSI U,@GFSC +GFSC: MOVSI W,236000 + MOVE V,W + XOR V,U + TLC V,236000 +GFLP: JSP A,(A) + MOVSI V,40 + ADDB V,W + XOR V,U + TLC V,236000 + JSP A,(A) + CAMGE W,[236740,,] + JRST GFLP + ADD U,[40,,] + TLNE U,740 + JRST GFSC + POPJ P, + +RUNW: MOVSI I,(MOVN V,(I)) + HLLM I,ILOOP+1 + HLLM I,ILOOP1+1 + MOVE I,[-14,,9] + PUSHJ P,ILOOP + MOVSI I,(MOVN U,(I)) + HLLM I,ILOOP + HLLM I,ILOOP1 + MOVE I,[-10,,8+5] + PUSHJ P,ILOOP + MOVSI I,(MOVE V,(I)) + HLLM I,ILOOP+1 + HLLM I,ILOOP1+1 + MOVE I,[-10,,8+5] + PUSHJ P,ILOOP + MOVE I,[-1,,8] + PUSHJ P,ILOOP + MOVSI I,(MOVE U,(I)) + HLLM I,ILOOP + HLLM I,ILOOP1 + POPJ P, + + HEL: SETZM W + MOVE I,NOLINS +HELBK: SETZB U,V + JSP A,(A) + MOVE U,REMX + MOVE V,REMY + JSP A,(A) + FMPR U,SINB + FMPR V,SINA + FADR U,V + MOVEM U,SAVX + MOVE U,REMX + MOVE V,REMY + FMPR V,SINB + FMPR U,SINA + FSBR V,U + MOVE U,SAVX + MOVEM U,REMX + MOVEM V,REMY + FADR W,AOSZ + SOJG I,HELBK + POPJ P, + +NODEG: 13.5 +AOSZ: 13.0 + +REMX: 0 +REMY: 0 +SINA: 0 +SINB: 0 +NOLINS: 0 + + +TRNS: MOVEM A,INDX' + MOVSI C,-3 ;GET SIN ROL PCH YAW +RESIN: MOVE A,ROL(C) + PUSHJ P,SIND + MOVEM A,SINR(C) + AOBJN C,RESIN + + MOVSI C,-3 ;GET COS ROL PCH YAW +RECOS: MOVE A,ROL(C) + PUSHJ P,COSD + MOVEM A,COSR(C) + AOBJN C,RECOS + + MOVE A,COSY ;GET VECTOR EMC + FMPR A,COSP + MOVEM A,VEMC ;X COMPONENT + MOVE A,SINY + FMPR A,COSP + MOVEM A,VEMC+1 ;Y COMPONENT + MOVE A,SINP + MOVEM A,VEMC+2 ;Z COMPONENT + + SETOM FTRN' ;GET VMC AND VMPC + SETZM C +GETPRM: MOVE A,SINY + FMPR A,COSR + MOVE B,COSY + FMPR B,SINP + FMPR B,SINR + FSBR A,B + MOVEM A,VMC(C) ; X COMP + + MOVN A,COSY + FMPR A,COSR + MOVE B,SINY + FMPR B,SINP + FMPR B,SINR + FSBR A,B + MOVEM A,VMC+1(C) ; Y COMP + + MOVE A,COSP + FMPR A,SINR + MOVEM A,VMC+2(C) ; Z COMP + AOSE FTRN + POPJ P, + EXCH A,SINR + EXCH A,COSR + EXCH A,SINR + MOVNS COSR + MOVEI C,3 + JRST GETPRM + + +GETPE: JSP A,(A) + SETZM FPFLG' + PUSHJ P,GETXYT + MOVEM X,X1 + MOVEM Y,Y1 + JSP A,(A) + PUSHJ P,GETXYT + + SKIPN B,FPFLG + JRST WING + CAIN B,2 + JRST GETPE + SKIPGE D + EXCH X,X1 + SKIPGE D + EXCH Y,Y1 + FSBRM X,X1 ; X1 Y1 IS BAD PNT + FSBRM Y,Y1 + EXCH X,X1 + EXCH Y,Y1 + FSC X,33 + FSC Y,33 + EXCH X,X1 + EXCH Y,Y1 + FADRM X,X1 + FADRM Y,Y1 + +WING: MOVEM A,SAVA1 + PUSHJ P,DVEC + SKIPE DLIN + SETOM DOBJ + MOVE A,SAVA1 + JRST GETPE + +SAVA1: 0 +DOBJ: 0 + +GETXYT: MOVE B,U + FSBR B,XE + MOVEM B,VPE + FMPR B,VEMC + MOVE C,V + FSBR C,YE + MOVEM C,VPE+1 + FMPR C,VEMC+1 + FADR B,C + MOVE C,W + FSBR C,ZE + MOVEM C,VPE+2 + FMPR C,VEMC+2 + FADR B,C + MOVSI D,(-1.0) + JFCL 10,.+1 + FDVR D,B ; D CONTANES T + JFCL 10,MUNGD +FMUNG: SKIPGE D + AOS FPFLG + + MOVE B,VPE + FMPR B,VMC + MOVE C,VPE+1 + FMPR C,VMC+1 + FADR B,C + MOVE C,VPE+2 + FMPR C,VMC+2 + FADR B,C + MOVE X,D + FMPR X,B + FDVR X,SCALE ; X CONTANES 340 X + + MOVE B,VPE + FMPR B,VMPC + MOVE C,VPE+1 + FMPR C,VMPC+1 + FADR B,C + MOVE C,VPE+2 + FMPR C,VMPC+2 + FADR B,C + MOVE Y,D + FMPR Y,B + FDVR Y,SCALE ; Y CONTANES 340 Y + FADR X,[511.0] + FADR Y,[511.0] + POPJ P, + +MUNGD: ASH D,-12 + TLC D,300400 + JRST FMUNG + X1: 0 +Y1: 0 + +ROL: 0 +PCH: 0 +YAW: 0 + +XE: 0 +YE: 0 +ZE: 0 + +SINR: 0 +SINP: 0 +SINY: 0 + +COSR: 0 +COSP: 0 +COSY: 0 +VEMC: BLOCK 3 +VMC: BLOCK 3 ;VMC MUST FOLOW VMPC +VMPC: BLOCK 3 +VPE: BLOCK 3 +SCALE: 0.002 + DVEC: SETOM DLIN + SETZM ONEON' + JUMPL X,SECT + CAMLE X,[1023.0] + JRST SECT + JUMPL Y,SECT + CAMG Y,[1023.0] + SETOM ONEON +SECT: SKIPGE X1 + JRST NOTTWO + MOVE A,[1023.0] + CAMG A,X1 + JRST NOTTWO + SKIPGE Y1 + JRST NOTTWO + CAMG A,Y1 + JRST NOTTWO + SKIPL ONEON + JRST SECON +TWOON: PUSHJ P,XYFIX + EXCH X,X1 + EXCH Y,Y1 + PUSHJ P,XYFIX + +NEWDV: TRN TWOON1 + + MOVEI ZP%MD,PMD + MOVE Z%IN,UVIN + PUSHJ P,ZRM + MOVEI ZP%MD,VMD + MOVEI LP%IF,0 + PUSHJ P,PNT + MOVE A,X + MOVE B,Y +REVEC: MOVN X,A + MOVN Y,B + ADD X,X1 + ADD Y,Y1 + MOVM C,X + MOVM D,Y + CAILE C,177 + JRST TLONG + CAILE D,177 + JRST TLONG + MOVEI LC%ES,1 + MOVEI LP%IF,1 + JRST LIN + +TLONG: SETZM DOEX' + CAMLE C,D + SETOM DOEX + SKIPE DOEX + EXCH C,D + IMULI C,376 + IDIV C,D + AOS C + ASH C,-1 + MOVEI D,177 + SKIPE DOEX + EXCH C,D + SKIPGE X + MOVNS C + SKIPGE Y + MOVNS D + MOVE X,C + MOVE Y,D + MOVEI LC%ES,0 + MOVEI LP%IF,1 + PUSHJ P,LIN + ADD A,X + ADD B,Y + JRST REVEC + +SECON: MOVE C,X1 + MOVE D,Y1 + FSBR C,X + FSBR D,Y + MOVM ZP%MD,C + MOVM B,D + SUB ZP%MD,B + SETZM INVRT + MOVE A,X1 + MOVE B,Y1 + JUMPL ZP%MD,SECON1 + EXCH A,B + EXCH C,D + SETOM INVRT +SECON1: MOVEM A,XSAV + MOVEM B,YSAV + JRST SQZVEC + +NOTTWO: SKIPL ONEON + JRST NUNON + MOVE C,X + MOVE D,Y + FSBR C,X1 + FSBR D,Y1 + MOVM A,C + MOVM B,D + SETZM INVRT + CAMG B,A + SETOM INVRT + CAMG B,A + EXCH X,Y + CAMG B,A + EXCH D,C + MOVEM X,XSAV + MOVEM Y,YSAV + JRST SQZVEC + NUNON: MOVE A,X + MOVE B,Y + FSBR A,X1 + FSBR B,Y1 + MOVMS A + MOVMS B + SETZM INVRT' + CAMG B,A + SETOM INVRT + SKIPE INVRT + EXCH X,Y + SKIPN INVRT + JRST .+4 + EXCH A,X1 + EXCH A,Y1 + EXCH A,X1 + + MOVEI A,0 + PUSHJ P,GETX + SKIPL B + JRST FLGMIN + MOVE A,[1023.0] + PUSHJ P,GETX + JUMPL B,DVLOS + +FLGMAX: MOVE C,A + MOVE D,[1023.0] + MOVEM C,XSAV' + MOVEM D,YSAV' + CAMG Y,Y1 + FSBR C,X + CAMG Y,Y1 + FSBR D,Y + CAMLE Y,Y1 + FSBR C,X1 + CAMLE Y,Y1 + FSBR D,Y1 + JRST SPOUT + +FLGMIN: MOVE C,A + SETZM D + MOVEM C,XSAV + MOVEM D,YSAV + CAML Y,Y1 + FSBR C,X + CAML Y,Y1 + FSBR D,Y + CAMGE Y,Y1 + FSBR C,X1 + CAMGE Y,Y1 + FSBR D,Y1 +SPOUT: SKIPN INVRT + JRST SQZVEC + EXCH X,Y + EXCH A,X1 + EXCH A,Y1 + EXCH A,X1 + +SQZVEC: MOVM A,D + FDVR A,[-126.99] + FDVR C,A + FDVR D,A + + SKIPE INVRT + EXCH C,D + MOVE X,XSAV + MOVE Y,YSAV + SKIPE INVRT + EXCH X,Y + PUSHJ P,XYFIX + MOVEI ZP%MD,PMD + MOVE Z%IN,UVIN + PUSHJ P,ZRM + MOVEI ZP%MD,VCMD + MOVEI LP%IF,0 + PUSHJ P,PNT + MOVE X,C + MOVE Y,D + PUSHJ P,XYFIX + MOVEI LC%ES,1 + MOVEI LP%IF,1 + JRST LIN + +GETX: MOVE B,Y1 + FSBR A,Y + FSBR B,Y + FDVR A,B + SKIPGE A + JRST SPLOS + CAML A,[1.0] + JRST SPLOS + MOVE B,[1.0] + FSBR B,A + FMPR B,X + FMPR A,X1 + FADR A,B + SKIPGE A + JRST SPLOS + CAMLE A,[1023.0] + JRST SPLOS + SETZM B + POPJ P, + +SPLOS: SETOM B + POPJ P, + +DVLOS: SETZM DLIN + POPJ P, + +DLIN: 0 +UVIN: 7 + +TWOON1: MOVEI A,020150 ;GO IN TO POINT MODE SCALE 2 INT 7 + IDPB A,BP + SUB X,X1 + SUB Y,Y1 + ASH X,-1 + ASH Y,-1 + ADDM X,X1 + ADDM Y,Y1 + MOVMS X + MOVMS Y + MOVEI A,200000 + DPB X,[000700,,A] + DPB Y,[100700,,A] + MOVE X,X1 + MOVE Y,Y1 + TRO X,102000 + TRO Y,220000 + IDPB Y,BP + IDPB X,BP + IDPB A,BP + TRC A,500200 + IDPB A,BP + POPJ P, + + +MAIRP: MOVE A,ALRTIP + MOVEM A,ROL + + MOVE A,CMPS + PUSHJ P,FLT + FMPR A,[0.0879] + MOVEM A,YAW + + MOVE A,EVLI + PUSHJ P,FLT + FMPR A,[0.0219] + FSBR A,[45.0] + MOVEM A,PCH + + MOVE A,WAIS + PUSHJ P,FLT + MOVE B,A + MOVE A,YAW + PUSHJ P,COSD + FMPR A,B + FMPR A,BUGMV + FADRM A,XE + MOVE A,YAW + + PUSHJ P,SIND + FMPR A,B + FMPR A,BUGMV + FADRM A,YE + + MOVE A,ALTUD + PUSHJ P,FLT + FMPR A,[0.244] + MOVEM A,ZE + + POPJ P, + +BUGMV: -0.003 + DSTART: PUSH P,A + PUSH P,B + MOVE B,WCHBP + MOVEI A,DSL1-1 + TRNE B,1 + MOVEI A,DSL2-1 + MOVEM A,DSLP' + SETZM DSTOPD + CAME A,WUTDIS + TRN .-1 + POP P,B + POP P,A +CPOPJ: POPJ P, + +DSTOP: SETOM DSTOPD' + CONO DIS,100 + POPJ P, + +DISIN: 0 + CONSO DIS,7 + JRST RELOD + CONSO DIS,400 ;2400 PIT PEN DEBUG FETCH + JRST APLG + + SKIPE DZON + JRST RELOD + + AOSG TICK + JRST RELOD + CONO DIS,0 + JRST 12,@DISIN + +APLG: CONO DIS,15200+SDISCH_3+DISCH + JRST 12,@DISIN + +RELOD: MOVEM A,DSAVA + + SKIPL DZON + JRST NORMD + SETCMM ZOST + MOVEI A,DSL0-1 + SKIPE ZOST + +NORMD: MOVE A,DSLP + MOVEM A,BLKOP' + MOVEM A,WUTDIS' + CONO DIS,100+SDISCH_3+DISCH + MOVE A,DSAVA + JRST 12,@DISIN + +SWBP: PUSH P,A + PUSH P,X + PUSH P,Y + AOS A,WCHBP' + MOVE X,[442200,,DSL1] + MOVE Y,[442200,,DSL2] + MOVEM X,BP' + TRNE A,1 + MOVEM Y,BP + POP P,Y + POP P,X + POP P,A + POPJ P, + + +TICK: 0 +ZOST: 0 +DSAVA: 0 + +OVER: PUSH P,A ; OVER SKIPS WHEN DISL IS FULL + PUSH P,B + MOVE A,WCHBP + MOVEI B,DSL1 + TRNE A,1 + MOVEI B,DSL2 + HRRZ A,BP + SUB A,B + CAIL A,MVDS-20 + AOS -2(P) + POP P,B + POP P,A + POPJ P, + ;FLOATING POINT SINE AND COSINE. +;ANS IN A,B; COSQ GIVES COS OF LAST SIN ARG, -SIN OF LAST COS +SIND: FMPR A,[.01745329251994] ;PI/180 + JRST SIN + +COSD: FMPR A,[.01745329251994] +COS: FADR A,[1.5707963267] ;PI/2 +SIN: CAMG A,[164475536723] ;.00015148419(SAVES A CONSTANT. COULD USE .000211431983) + CAMGE A,[-.0001] ;SMALLNESS OF ABS X PERMITS SIN X _ X + JRST .+2 + POPJ P, ;AND THREATENS UNDERFLOW + PUSH P,B + FDVR A,[1.5707963267] ;PI/2 + MOVEM A,SINTM' + MULI A,400 + TSC A,A ;CAML A,...SETZB B,SINTM WOULD PREVENT HUGE ANSWER FOR ARG > 2**27 + ASH B,-243(A) + DPB B,[10100,,SINOB] + MOVNS A,B + ANDCMI A,1 + TLC A,232000 + FAD A,A + FADRB A,SINTM +SINQ: TRNN B,2 +SINR1: SKIPA B,SINTM + MOVNS B,SINTM + FMPR B,[164475536723] ;.00015148419 + FMP A,A + FADR A,[574377353254] ;-4.0084431 + FMPR B,A + FADR A,[574142162777] ;-6.4652405 + FMPR B,A + FADR A,[202444705313] ;2.2881683 + FMPR A,A + FADR A,[210547761702] ;179.98621 + FMPRB A,B + POP P,B + POPJ P, + +COSQ: MOVSI A,(1.0) + SKIPL SINTM + MOVNS A + FADRB A,SINTM +SINOB: SETCMI B,. + JRST SINQ + + +;FLOATING POINT SQUARE ROOT FUNCTION + +SQRT: MOVEM B,BSAV1 + MOVMS A + JUMPLE A,SQ2 + ASHC A,-33 + SUBI A,201 + ROT A,-1 + HRRM A,SQ1 + LSH A,-43 + ASH B,-10 + FSC B,177(A) + MOVEM B,ST + FMP B,S1(A) + FAD B,S2(A) + MOVE A,ST + FDV A,B + FAD B,A + FSC B,-1 + MOVE A,ST + FDV A,B + FADR A,B +SQ1: FSC A,0 +SQ2: MOVE B,BSAV1 + POPJ P, + +S1: 0.8125 + 0.578125 +S2: 0.302734 + 0.421875 + +ST: 0 +BSAV1: 0 + +;FLOATING POINT ARCTANGENT, VERSION 1 + +ATAN: MOVEM B,BSAV + MOVM B,A + CAMG B,A1 + JRST ATANX + MOVEM A,C2 + CAML B,A2 + JRST AT4 + MOVEM C,C1 + MOVSI C,201400 + SETZM I1 + CAMG B,C + AOSA I1 + FDVM C, B + MOVEM B,C3 + FMP B, B + MOVE C,KB3 + FAD C, B + MOVE A,KA3 + FDVM A,C + FAD C, B + FAD C,KB2 + MOVE A,KA2 + FDVM A,C + FAD C,B + FAD C,KB1 + MOVE A,KA1 + FDV A,C + FADR A,KB0 + FMPR A,C3 + MOVE B,A3 + SKIPN I1 + FSBRM B,A + SKIPA C,C1 +AT4: MOVE A,A3 + SKIPGE C2 + MOVNS A +ATANX: MOVE B,BSAV + POPJ P, + +A1: 145000000000 +A2: 233000000000 +A3: 201622077325 +KB0: 0.1746554388 +KB1: 6.762139240 +KB2: 3.316335425 +KB3: 1.448631538 +KA1: 3.709256262 +KA2: -7.106760045 +KA3: -0.2647686202 + + + +C1: 0 +C2: 0 +C3: 0 +I1: 0 +BSAV: 0 + + +TTYBK: 0 + PUSH P,A + PUSH P,B + + CONSZ TTY,10 + JRST TYOINT + CONSZ TTY,40 + JRST TYIINT + JRST 4,0 + +TYIINT: DATAI TTY,A + ANDI A,177 +TBACK: MOVE B,COUNT + CAIL B,SISET + JRST .+2 + PUSHJ P,TYO + MOVEM A,TYI + XCT TTAB(A) + JRST OUT1 + +TYOINT: SKIPLE COUNT + JRST .+4 + CONO TTY,200+TTCH + SETOM TTYOFF' + JRST OUT1 + MOVE A,OTPNTR + DATAO TTY,TTYTAB(A) + SOS COUNT + SOSL OTPNTR + JRST OUT1 + MOVEI A,SISET-1 + MOVEM A,OTPNTR + +OUT1: POP P,B + POP P,A + JRST 12,TTYBK@ + + + +TYO: PUSH P,B + MOVE B,COUNT + CAIL B,SISET + JRST .-2 + MOVE B,INPNTR + MOVEM A,TTYTAB(B) + AOS COUNT + SOSL INPNTR + JRST OUT + MOVEI B,SISET-1 + MOVEM B,INPNTR + +OUT: AOSN TTYOFF + CONO TTY,10+TTCH + POP P,B + POPJ P, + + +TTYW: SKIPL TTYOFF + JRST .-1 + POPJ P, + +TYI: 0 + + +CLOCK: 0 + PUSH P,A + PUSH P,B + PUSH P,C + CONSZ 200000 + JRST PIDLOV +AOST: CONSO 1000 + JRST SOMLOS + AOS TIME + SKIPE TRACE + AOS TIME1' + CONO 001000+CLCH + + MOVE A,[-3,,150] +XPT1: DATAO IMX,A + CONO IMX,0 + CONSO IMX,10 + JRST .-1 + DATAI IMX,B + ASH B,1 + TLC B,232000 + FAD B,B + MOVEM B,MXTB3-150(A) + AOBJN A,XPT1 + + MOVEI A,171 +XPT2: DATAO IMX,A + CONO IMX,0 + CONSO IMX,10 + JRST .-1 + DATAI IMX,A + ASH A,1 + PUSHJ P,FLT + MOVEM A,MXTB3+3 + MOVE A,[-8,,70] +XINPUT: DATAO IMX,A + CONO IMX,0 + CONSO IMX,10 + JRST .-1 + DATAI IMX,B + ASH B,1 + MOVEM B,MXTB-70(A) + AOBJN A,XINPUT + + TMOUT: SKIPN TRACE + JRST TMOUT1 + JFCL + SETZM NOCAL' + MOVSI B,-20 +RECNT: MOVE A,PTAB(B) + AND A,[777000,,0] + CAME A,[TRN 0] + AOS NOCAL + AOBJN B,RECNT + MOVE B,NOCAL + EXCH B,LNOCAL' + SKIPG NOCAL + PUSHJ P,PT1 + CAMN B,NOCAL + JRST SAMEN + SETOM ONCE + SETOM ONCE1 + +SAMEN: SKIPL ONCE + JRST NORM + MOVEI B,1770 + IDIV B,MULBG + MOVN B,B + HRLZ B,B + PUSHJ P,PROUT + AOBJN B,.-1 + JRST TMOUT1 + +NORM: PUSHJ P,PROUT + + +TMOUT1: SKIPGE DSTOPD + JRST RELOUT + + SETOM TICK + CONSO DIS,7 + CONO PI,4000+200_- + +RELOUT: POP P,C + POP P,B + POP P,A + JRST 12,@CLOCK + +PROUT: PUSH P,B + MOVSI C,-20 +REPR: XCT PTAB(C) + MOVE B,PTAB(C) + AND B,[777000,,0] + CAME B,[TRN 0] + PUSHJ P,PT1 + AOBJN C,REPR + POP P,B + POPJ P, + + +PIDLOV: CONO 400000 + PRNT [ASCII /PDL OVER FLOW +/] + JRST 10,.+1 + PUSHJ P,TTYW + JRST DDT + +SOMLOS: CONI A + CONO 0 + PRNT [ASCII /NON X MEM OR SOME LOSS CONI A +/] + JRST 10,.+1 + PUSHJ P,TTYW + JRST DDT + + +PT3: PUSHJ P,.+1 +PT2: PUSHJ P,.+1 +PT1: PUSH P,X + PUSH P,Y + SAC + AOSN ONCE + SETZM NOPTSS + SKIPN NOPTSS + PUSHJ P,SETUP + MOVE X,TIME1 + IMUL X,MULBG + ANDI X,1777 + MOVE Y,A + ASH Y,-4 + ADDI Y,1000 + MOVEI ZP%MD,PMD + MOVEI LP%IF,1 + PUSHJ P,PNT + AOS X,NOPTSS' +NPBUG: MOVEI Y,1770 + IDIV Y,MULBG + IMUL Y,NOCAL + CAML X,Y + PUSHJ P,ZEROL + UAC + POP P,Y + POP P,X + POPJ P, + +SETUP: SKIPE NOPTSS + POPJ P, + SKIPN ONCE + PUSHJ P,DSTOP + SETZM WCHBP + PUSHJ P,SWBP + MOVEI ZP%MD,PMD + MOVEI Z%IN,3 + PUSHJ P,ZRM + POPJ P, + +ZEROL: SETZM NOPTSS + MOVEI ZP%MD,ZMD + MOVEI LP%IF,0 + PUSHJ P,PNT + MOVEI X,3000 + IDPB X,BP + AOSE ONCE1 + POPJ P, + MOVEI X,DSL2-1 + MOVEM X,DSLP + SETZM DSTOPD + POPJ P, + POPJ P, + +MULBG: 3 + +IMXBK1: 0 + CONSO IMX,10 + JRST .-1 +; MOVEM A,IMXPTR + MOVEI A,100 + SOJG A,. + SETZM A + LDB A,[301400,,MXTB1+0] + MOVEM A,MXTB+0 + LDB A,[141400,,MXTB1+0] + MOVEM A,MXTB+1 + LDB A,[001400,,MXTB1+0] + MOVEM A,MXTB+2 + LDB A,[301400,,MXTB1+1] + MOVEM A,MXTB+3 + LDB A,[141400,MXTB1+1] + MOVEM A,MXTB+4 + LDB A,[001400,,MXTB1+1] + MOVEM A,MXTB+5 + LDB A,[301400,,MXTB1+2] + MOVEM A,MXTB+6 + LDB A,[141400,,MXTB1+2] + MOVEM A,MXTB+7 + MOVE A,[-8,,MXTB1-1] +; EXCH A,IMXPTR +; CONO IMX,37760+IMXCH + JRST 12,@IMXBK + + +IMXBK: 0 +; BLKI IMX,IMXPTR + JRST REIMX + JRST 12,@IMXBK +REIMX: MOVEM A,ISAVA + MOVE A,[-8,,MXTB-1] +; MOVEM A,IMXPTR + CONO IMX,12040 + MOVE A,ISAVA + JRST 12,@IMXBK +DCBK: 0 +; MOVEM A,MXTBP + AOS A,WDC' + TRNE A,1 + JRST DCBK1 + MOVE A,[-8,,MXTB-1] +; EXCH A,MXTBP + CONO 764,21140 +; CONO DC,4160+DCCH + JRST 12,@DCBK + +DCBK1: JRST 12,@DCBK +MXTB1: BLOCK 8 +ISAVA: 0 + +UUOH: 0 + PUSH P,A + PUSH P,40 + PUSH P,UUOH + LDB A,[330500,,40] + XCT UUOTAB(A) + POP P,UUOH + POP P,40 + POP P,A + JRST @UUOH + + +GETNO: MOVE A,NO + SETZM NO + POPJ P, + +;UUO RUTEENS + + +PRINT: MOVSI A,440700 + HRR A,40 + MOVEM A,ULDBP' +PBACK: MOVE A,COUNT + CAIL A,SISET + POPJ P, + ILDB A,ULDBP + CAIN A," + POPJ P, + PUSHJ P,TYO + JRST PBACK + +SACR: EXCH 12,SAV11' + EXCH 13,SAV12' + EXCH 14,SAV13' + EXCH 15,SAV14' + EXCH 16,SAV15' + EXCH 17,SAV16' + POPJ P, + +UACR: EXCH 12,SAV13' + EXCH 13,SAV12' + EXCH 14,SAV13' + EXCH 15,SAV14' + EXCH 16,SAV15' + EXCH 17,SAV16' + POPJ P, + + +WATER: POPJ P, ;UNUSED UUO +VARUT: POPJ P, ;UNUSED UUO + +NVWAT: HRRZ A,40 + CAML A,NVBUG + JRST NVWAT + POPJ P, + +NVBUG: 30 + +;TTY RUTEENS + +NUMBER: MOVE B,NO' + LSH B,3 + ADDI B,-60(A) + MOVEM B,NO' + POPJ P, + +IDL1: MOVE P,[-PDS,,PDL-1] + JRST 10,IDL + +FLSHIO: CONO DIS,100 + CONO IMX,0 + DATAO 20,[-1] + POPJ P, + +GODDT: POP P,B + POP P,A + CONO PI,400 + JRST DDT + +PR: CONO TTY,200+TTCH + SETOM TTYOFF + CONO PI,200 + JRST 12,@TTYBK + RODE==50000.0 +VCSIS==400 + +XTAB: 1000.0 ; PYRIMID (8 LINES) + 1064.0 + RODE + 1000.0 + 1000.0 + 1064.0 + 1064.0 + 1000.0 + + 100.0 ; RUN WAY (13 LINES) + 100.0 + 100.0 + 0 + 0 +; 0 + 50.0 + 37.5 + 62.5 + 25.0 + 50.0 + 75.0 + 100.0 + 100.0 + + 100.0 ; GLIDE SLOPE (1 LINES> + + -1000000.0 ;HORIZON (4 LINES) + +1000000.0 + +1000000.0 + -1000000.0 + + 500000.0 ;MOUNTINS + 250000.0 + 500000.0 + 250000.0 + BLOCK VCSIS + +YTAB: 00.0 ; PIRMID + -RODE + 64.0 + RODE + 00.0 + 00.0 + 64.0 + 64.0 + + -1700.0 ; RUNWAY + -1700.0 + -1200.0 + -50.0 + -450.0 +; -850.0 + -800.0 + -925.0 + -925.0 + -1050.0 + -1050.0 + -1050.0 + -1700.0 + -1500.0 + + 0 ; GLIDE SLOPE + + -1000000.0 ; HORIZON + -1000000.0 + +1000000.0 + +1000000.0 + + 1000000.0 ;MOUNTINS + 1000000.0 + -1000000.0 + -1000000.0 + + BLOCK VCSIS + +ZTAB: REPEAT 10,0 ; PIRMID + REPEAT 15,0 ; RUN WAY + -200.0 ; GLIDE SLOPE + REPEAT 4,0 ;HORIZON + REPEAT 4,0 ;MOUNTAINS + + BLOCK VCSIS + +XTAB1: RODE ; PIRMID + 1064.0 + 1000.0 + 1000.0 + 1032.0 + 1032.0 + 1032.0 + 1032.0 + + 100.0 ;RUN WAY + -100.0 + -100.0 + 0 + 0 +; 0 + 50.0 + 37.5 + 62.5 + 25.0 + 50.0 + 75.0 + 0 + 0 + + -100.0 ; GLIDE SLOPE + + +1000000.0 ; HORIZON + +1000000.0 + -1000000.0 + -1000000.0 + + 375000.0 ;MOUNTINS + 375000.0 + 375000.0 + 375000.0 + + BLOCK VCSIS + +YTAB1: 00.0 ; PIRIMID + RODE + 64.0 + -RODE + 32.0 + 32.0 + 32.0 + 32.0 + + 1700.0 ; RUN WAY + -1700.0 + -1200.0 + -350.0 + -750.0 +; -1150.0 + -900.0 + -1025.0 + -1025.0 + -1150.0 + -1150.0 + -1150.0 + -1500.0 + -1300.0 + + 0 ; GLIDE SLOPE + + -1000000.0 ; HORIZON + +1000000.0 + +1000000.0 + -1000000.0 + + 1000000.0 ;MOUNTINS + 1000000.0 + -1000000.0 + -1000000.0 + + BLOCK VCSIS + +ZTAB1: 00.0 ; PIRIMED + 00.0 + 00.0 + 00.0 + 45.0 + 45.0 + 45.0 + 45.0 + + + REPEAT 15,0 ; RUN WAY + + -200.0 ; GLIDE SLOPE + + REPEAT 4,0 ; HORIZON + + 50000.0 ;MOUNTINS + 50000.0 + 30000.0 + 30000.0 + + BLOCK VCSIS + + IFN FOOF,[ +BARIND==200 + +ZZ==. + DEFINE LINE1 X0,Y0,Z0,X1,Y1,Z1 + LOC XTAB+BARIND + X0 + LOC YTAB+BARIND + Y0 + LOC ZTAB+BARIND + Z0 + LOC XTAB1+BARIND + X1 + LOC YTAB1+BARIND + Y1 + LOC ZTAB1+BARIND + Z1 +BARIND==BARIND+1 + TERMIN + + DEFINE HBAR LN,LD,RD,XO,YO,XT,YT + LINE1 \,\,0.0,\,\<.OP FADR YO <.OP FMPR YT LN>>,0.0 + LINE1 \,\<.OP FADR YO <.OP FMPR YT LN>>,0.0,\<.OP FSBR XO <.OP FMPR 5.0 XT>>,\<.OP FADR YO <.OP FMPR YT <.OP FADR LN RD>>>,7.0 + LINE1 \<.OP FSBR XO <.OP FMPR 5.0 XT>>,\<.OP FADR YO <.OP FMPR YT <.OP FADR LN RD>>>,7.0,\<.OP FSBR XO <.OP FMPR 10.0 XT>>,\<.OP FADR YO <.OP FMPR LN YT>>,0.0 + LINE1 \<.OP FSBR XO <.OP FMPR 10.0 XT>>,\<.OP FADR YO <.OP FMPR LN YT>>,0.0,\,\<.OP FADR YO <.OP FMPR YT LN>>,0.0 + LINE1 \<.OP FSBR XO <.OP FMPR 5.0 XT>>,\<.OP FADR YO <.OP FMPR YT <.OP FADR LN RD>>>,7.0,\<.OP FSBR XO <.OP FMPR 5.0 XT>>,\<.OP FADR YO <.OP FMPR YT LD>>,7.0 + LINE1 \<.OP FSBR XO <.OP FMPR 5.0 XT>>,\<.OP FADR YO <.OP FMPR YT LD>>,7.0,\,\,0.0 + LINE1 \,\,0.0,\<.OP FSBR XO <.OP FMPR 10.0 XT>>,\,0.0 + LINE1 \<.OP FSBR XO <.OP FMPR 10.0 XT>>,\,0.0,\<.OP FSBR XO <.OP FMPR 5.0 XT>>,\<.OP FADR YO <.OP FMPR LD YT>>,7.0 + LINE1 \<.OP FSBR XO <.OP FMPR 10.0 XT>>,\,0.0,\<.OP FSBR XO <.OP FMPR 10.0 XT>>,\<.OP FADR YO <.OP FMPR LN YT>>,0.0 + TERMIN + + DEFINE VBAR LN,LD,RD,XO,YO,XT,YT + LINE1 \,\,0.0,\<.OP FADR XO <.OP FMPR XT LN>>,\,0.0 + LINE1 \<.OP FADR XO <.OP FMPR XT LN>>,\,0.0,\<.OP FADR XO <.OP FMPR XT <.OP FADR LN RD>>>,\<.OP FSBR YO <.OP FMPR 5.0 YT>>,7.0 + LINE1 \<.OP FADR XO <.OP FMPR XT <.OP FADR LN RD>>>,\<.OP FSBR YO <.OP FMPR 5.0 YT>>,7.0,\<.OP FADR XO <.OP FMPR LN XT>>,\<.OP FSBR YO <.OP FMPR 10.0 YT>>,0.0 + LINE1 \<.OP FADR XO <.OP FMPR LN XT>>,\<.OP FSBR YO <.OP FMPR 10.0 YT>>,0.0,\<.OP FADR XO <.OP FMPR XT LN>>,\,0.0 + LINE1 \<.OP FADR XO <.OP FMPR XT <.OP FADR LN RD>>>,\<.OP FSBR YO <.OP FMPR 5.0 YT>>,7.0,\<.OP FADR XO <.OP FMPR XT LD>>,\<.OP FSBR YO <.OP FMPR 5.0 YT>>,7.0 + LINE1 \<.OP FADR XO <.OP FMPR XT LD>>,\<.OP FSBR YO <.OP FMPR 5.0 YT>>,7.0,\,\,0.0 + LINE1 \,\,0.0,\,\<.OP FSBR YO <.OP FMPR 10.0 YT>>,0.0 + LINE1 \,\<.OP FSBR YO <.OP FMPR 10.0 YT>>,0.0,\<.OP FADR XO <.OP FMPR LD XT>>,\<.OP FSBR YO <.OP FMPR 5.0 YT>>,7.0 + LINE1 \,\<.OP FSBR YO <.OP FMPR 10.0 YT>>,0.0,\<.OP FADR XO <.OP FMPR LN XT>>,\<.OP FSBR YO <.OP FMPR 10.0 YT>>,0.0 + TERMIN + + VBAR 100.0,5.0,-5.0,0.0,0.0,1.0,-1.0 + HBAR 60.0,-5.0,-5.0,100.0,10.0,1.0,1.0 + HBAR 40.0,-5.0,-5.0,55.0,10.0,1.0,1.0 + + VBAR 80.0,-5.0,5.0,10.0,100.0,1.0,-1.0 + HBAR 70.0,5.0,-5.0,100.0,100.0,1.0,1.0 + VBAR 80.0,-5.0,5.0,90.0,170.0,-1.0,1.0 + HBAR 70.0,5.0,-5.0,0.0,170.0,-1.0,-1.0 + + VBAR 80.0,-5.0,5.0,10.0,200.0,1.0,-1.0 + HBAR 70.0,5.0,-5.0,100.0,200.0,1.0,1.0 + VBAR 80.0,-5.0,5.0,90.0,270.0,-1.0,1.0 + HBAR 70.0,5.0,-5.0,0.0,270.0,-1.0,-1.0 + +LOC ZZ +] + TTYTAB: BLOCK SISET +INPNTR: SISET-1 +OTPNTR: SISET-1 +SENSD: -1 +PAT: BLOCK 100 +UUOTAB: REPEAT 40,JRST 4,1 +TTAB: REPEAT 200,JFCL + MXTB2+5 + +XTAB2: BLOCK 20 +YTAB2: BLOCK 20 +XTAB3: BLOCK 20 +YTAB3: BLOCK 20 + + +PTAB: REPEAT 20,TRN + JRST 4,. + +ZZ==. + + LOC PTAB + REPEAT 4,MOVE A,MXTB+.RPCNT +LOC ZZ +MXTB3: BLOCK 5 +MXTB: BLOCK 12 +MXTB2: BLOCK 8 + +MXTB2P: MXTB2+3 + MXTB2+7 + MXTB2+6 + MXTB2+0 + MXTB2+1 + MXTB2+2 + +MXTB2Q: MXTB2+4 + +; UUOS + +ZZ==. + + + LOC UUOTAB+PRNT_<-33> + PUSHJ P,PRINT + + LOC UUOTAB+SAC_<-33> + PUSHJ P,SACR + + LOC UUOTAB+UAC_<-33> + PUSHJ P,UACR + + LOC UUOTAB+WATE_<-33> + PUSHJ P,WATER ;UNUSED UUO + + LOC UUOTAB+VAAX_<-33> + PUSHJ P,VARUT ;UNUSED UUO + + LOC ZZ + + +; TTY COMANDS + +ZZ==. + + + LOC TTAB+"C ;SENS OF DISP + SETCMM DZON + + LOC TTAB+"D ;GO TO DDT + JRST GODDT + + LOC TTAB+"F ; GO FLY + JRST 10,TEST1 + + LOC TTAB+"I ;JRST TO GO + JRST 10,GO + + LOC TTAB+11 ;^I JRST IDL + PUSHJ P,IDL1 + + LOC TTAB+"L ;FLUSH ALL I/O + PUSHJ P,FLSHIO + + LOC TTAB+"P + JRST 10,CPOTS ; CALABRATE POTS + + LOC TTAB+"T + JRST 10,TEST + + + LOC TTAB+"X ;TRACE SCOPE + SETCMM TRACE + + + LOC TTAB+"Z ;SETZM NUMBER BUFF + PUSHJ P,GETNO + + LOC TTAB+"0 ;INPUT NUMBERS INTO BUFF + REPEAT 10,PUSHJ P,NUMBER + + LOC ZZ + + + +; JRST 4 ERRORS + + +;TTY SPAZZ JRST 4,0 + +;UUOH SPAZZ JRST 4,1 + + SETUPF: SETOM FIRST' + SETOM FIRST1' + SETZM BSTOL' + SETZM ALRTIP' + SETZM CMPS' + MOVEI A,7 + MOVEM A,CHIN1' + SETOM A + PUSHJ P,DRINS + POPJ P, + +FLY1: MOVE A,MXTB3+3 + FSBR A,MINP+3 + FMPR A,DIFP+3 + FSBR A,TOPS + MOVN A,A + PUSHJ P,FIX + MOVEM A,THRI + + MOVE A,MXTB3+1 + FSBR A,MINP+1 + FMPR A,DIFP+1 + FSBR A,TOPS + MOVN A,A + PUSHJ P,FIX + MOVEM A,EVLI1 + PUSHJ P,ISSTL + + MOVE A,MXTB3+2 + FSBR A,MINP+2 + FMPR A,DIFP+2 + JFCL + JFCL + PUSHJ P,FIX + MOVEM A,ALRI + + MOVE A,MXTB3 + FSBR A,MINP + FMPR A,DIFP + JFCL + JFCL + PUSHJ P,FIX + MOVEM A,RUDI1 + + POPJ P, + +CPOTS: MOVE P,[-PDS,,PDL-1] + PUSHJ P,RSTAB + MOVSI B,-4 +REPT: MOVE A,MXTB3(B) + CAMGE A,MINP(B) + MOVEM A,MINP(B) + CAMLE A,MAXP(B) + MOVEM A,MAXP(B) + MOVE A,MAXP(B) + FSBR A,MINP(B) + MOVE C,TOPS + FDVR C,A + MOVEM C,DIFP(B) + AOBJN B,REPT + JRST REPT-1 + +MAXP: 3438.0 + 4072.0 + 1316.0 + 3676.0 + +MINP: 2322.0 + 196.0 + 676.0 + 2722.0 + +DIFP: 3.6693548 + 1.0565015 + 6.3984375 + 4.2924528 +î + RSTAB: MOVSI A,-4 + MOVE B,TOPS + SETZM MAXP(A) + MOVEM B,MINP(A) + AOBJN A,.-2 + POPJ P, + +EVLI1: 3777 +RUDI1: 0 +TOPS: 4095.0 +STL1: 2000 +STL2: 777 +LTFOO: 0 + +ISSTL: MOVEI A,3777 + MOVE B,WAIS + CAMG B,STL1 + MOVEM A,EVLI1 + MOVE B,EVLI + CAMGE B,STL2 + MOVEM A,EVLI1 + MOVE A,TIME + ADDI A,60. + MOVEM A,LTFOO + POPJ P, + FLY: TRN FLY1 + MOVE A,MXTB + MOVEM A,THRI' + MOVEI A,3777 + MOVEM A,RUDI1 + MOVNI B,100 + MOVN C,B + DATAI 420,A + TLNN A,100000 + ADDM B,EVLI1 + TLNN A,40000 + ADDM C,EVLI1 + MOVEI B,3777 + TLNN A,400000 + MOVEI B,3777+2000 + TLNN A,200000 + MOVEI B,3777-2000 + MOVEM B,ALRI' + SKIPGE EVLI1 + SETZM EVLI1 + MOVEI A,7777 + CAMGE A,EVLI1 + MOVEM A,EVLI1 + POPJ P, + + +INIMX: PUSH P,B + HLRZ B,A + HRRZ A,A + DATAO IMX,A + CONO IMX,0 + CONSO IMX,10 + JRST .-1 + DATAI IMX,A + ASH A,(B) + POP P,B + POPJ P, + +THRICH: 0,,15 +RUDICH: 2,,150 +EVLICH: 3,,151 +ALRICH: 2,,152 +EVLI: 0 +RUDI: 0 + +INIT: MOVE A,RUDICH + PUSHJ P,INIMX + MOVEI B,3777 + SUB B,A + MOVEM B,RUDIBG' + + MOVE A,EVLICH + PUSHJ P,INIMX + MOVEI B,3777 + SUB B,A + MOVEM B,EVLIBG' + + MOVE A,ALRICH + PUSHJ P,INIMX + MOVEI B,3777 + SUB B,A + MOVEM B,ALRIBG' + + POPJ P, + +DRINS: PUSH P,A + PUSH P,X + PUSH P,Y + PUSH P,R + MOVE A,[442200,,DSL0] + MOVEM A,BP' + PUSHJ P,DTIC + PUSHJ P,DCOM + TRN P,DADF + PUSHJ P,DAIS + PUSHJ P,DART + PUSHJ P,DALT + PUSHJ P,DRPM + PUSHJ P,DTBK + PUSHJ P,DRAT +; PUSHJ P,DIPS + + MOVEI A,3000 + IDPB A,BP + SETOM DZON' + + POP P,R + POP P,Y + POP P,X + POP P,A + POPJ P, + + +MVINS: MOVE A,TIME + PUSHJ P,FLT + EXCH A,LTIME + FSBR A,LTIME + FMPR A,[-0.1] + MOVEM A,ETIME + + MOVE A,MXTB + MOVEI B,0 + CAIL A,3777 + SETOM B + SKIPE AUTO + PUSHJ P,AINS + MOVEM B,DZON + HRRZ B,BOTOM + SETZM GRND + CAMN B,ALTUD + SETOM GRND + PUSHJ P,MRPM + PUSHJ P,MART + PUSHJ P,MAIS + PUSHJ P,MRAT + PUSHJ P,MALT + PUSHJ P,MTBK + PUSHJ P,MCOM + PUSHJ P,MTIC +; PUSHJ P,MIPS + POPJ P, + + +ETIME: 0 +LTIME: 0 +GRND: 0 +AUTO: -1 +DHITE: 3000 + +AINS: MOVE A,ALTUD + CAMG A,DHITE + SETZB B + CAML A,DHITE + SETOM B + POPJ P, + +DGLS: MOVEI A,SIXTH*1 + MOVEM A,XOFS + MOVEI A,SIXTH*5 + MOVEM A,YOFS + MOVE I,DIN + MOVEI S,1 + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE R,[10.0] + PUSHJ P,RING + MOVEI A,071423 + PUSHJ P,DNAM + POPJ P, + +DIN: 4 + +DTIC: MOVEI A,SIXTH*1 + MOVEM A,XOFS + MOVEI A,SIXTH*5 + MOVEM A,YOFS + MOVE I,DIN + MOVEI S,1 + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE R,[0.1] + PUSHJ P,RING + MOVE R,[0.2] + PUSHJ P,RING + MOVE R,[0.3] + PUSHJ P,RING + MOVE R,[10.0] + PUSHJ P,RING + MOVEI A,241103 + PUSHJ P,DNAM + MOVEI A,TCLC + MOVEI B,60. + MOVEI C,4 + MOVE X,[0.0] + MOVE Y,[360.0] + SETOM 360DG' + PUSHJ P,LINS + POPJ P, + +DCOM: MOVEI A,SIXTH*3 + MOVEM A,XOFS + MOVEI A,SIXTH*5 + MOVEM A,YOFS + MOVE I,DIN + MOVEI S,1 + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE R,[0.1] + PUSHJ P,RING + MOVE R,[0.2] + PUSHJ P,RING + MOVE R,[0.3] + PUSHJ P,RING + MOVE R,[10.0] + PUSHJ P,RING + MOVEI A,040722 + PUSHJ P,DNAM +DCOM1: MOVEI A,TCOM + MOVEI B,36. + MOVEI C,2 + MOVE X,[0.0] + MOVE Y,[360.0] + SETOM 360DG' + PUSHJ P,LINS + POPJ P, + +DADF: MOVEI A,SIXTH*5 + MOVEM A,XOFS + MOVEI A,SIXTH*5 + MOVEM A,YOFS + MOVE I,DIN + MOVEI S,1 + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE R,[10.0] + PUSHJ P,RING + MOVEI A,010406 + PUSHJ P,DNAM + JRST DCOM1 + +DNAM: PUSH P,X + PUSH P,Y + MOVE X,BP + MOVEM X,SBP1' + MOVE X,[-1.0] + MOVE Y,[-3.0] + PUSHJ P,POS + MOVEI ZP%MD,CMD + PUSHJ P,ZRMF + MOVEI LC%ES,1 + PUSHJ P,CHR + POP P,Y + POP P,X + POPJ P, + DAIS: MOVEI A,SIXTH*1 + MOVEM A,XOFS + MOVEI A,SIXTH*3 + MOVEM A,YOFS + MOVE I,DIN + MOVEI S,1 + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE R,[0.1] + PUSHJ P,RING + MOVE R,[0.2] + PUSHJ P,RING + MOVE R,[0.3] + PUSHJ P,RING + MOVE R,[10.0] + PUSHJ P,RING + MOVEI A,TAIS + MOVEI B,21. + MOVEI C,1 + MOVE X,[0.0] + MOVE Y,[320.0] + SETZM 360DG + PUSHJ P,LINS + MOVEI A,110123 + PUSHJ P,DNAM + MOVE A,[0.0] + MOVE B,[2.0] + MOVE X,[4.5] + MOVE Y,[1.5] + PUSHJ P,BOX + MOVE X,[-1.5] + MOVE Y,[2.0] + PUSHJ P,POS + MOVEI ZP%MD,CMD + MOVEI Z%IN,3 + MOVEI Z%SC,1 + MOVEI Z%ST,0 + MOVE A,BP + MOVEM A,SBPC' + PUSHJ P,ZRMF + MOVEI A,232401 + IDPB A,BP + MOVEI A,141437 + IDPB A,BP + POPJ P, + +DART: MOVEI A,SIXTH*3 + MOVEM A,XOFS + MOVEI A,SIXTH*3 + MOVEM A,YOFS + MOVE I,DIN + MOVEI S,1 + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE R,[10.0] + PUSHJ P,RING + MOVE R,[7.5] + PUSHJ P,RING + MOVE A,[0.0] + MOVE B,[0.0] + MOVE X,[10.0] + MOVE Y,[0.5] + PUSHJ P,BOX + POPJ P, + +DALT: MOVEI A,SIXTH*5 + MOVEM A,XOFS + MOVEI A,SIXTH*3 + MOVEM A,YOFS + MOVE I,DIN + MOVEI S,1 + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE R,[0.1] + PUSHJ P,RING + MOVE R,[0.2] + PUSHJ P,RING + MOVE R,[0.3] + PUSHJ P,RING + MOVE R,[10.0] + PUSHJ P,RING + MOVEI A,TALT + MOVEI B,50. + MOVEI C,4. + MOVE X,[0.0] + MOVE Y,[360.0] + SETOM 360DG + PUSHJ P,LINS + MOVEI A,011424 + PUSHJ P,DNAM + POPJ P, + +DRPM: MOVEI A,SIXTH*1 + MOVEM A,XOFS + MOVEI A,SIXTH*1 + MOVEM A,YOFS + MOVE I,DIN + MOVEI S,1 + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE R,[0.1] + PUSHJ P,RING + MOVE R,[0.2] + PUSHJ P,RING + MOVE R,[0.3] + PUSHJ P,RING + MOVE R,[10.0] + PUSHJ P,RING + MOVEI A,TRPM + MOVEI B,36. + MOVEI C,4 + MOVE X,[200.0] + MOVE Y,[520.0] + SETZM 360DG + PUSHJ P,LINS + MOVEI A,222015 + PUSHJ P,DNAM + POPJ P, + +DTBK: MOVEI A,SIXTH*3 + MOVEM A,XOFS + MOVEI A,SIXTH*1 + MOVEM A,YOFS + MOVE I,DIN + MOVEI S,1 + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE R,[0.1] + PUSHJ P,RING + MOVE R,[0.2] + PUSHJ P,RING + MOVE R,[0.3] + PUSHJ P,RING + MOVE R,[10.0] + PUSHJ P,RING + MOVE X,[2.0] + MOVE Y,[2.0] + MOVE A,[0.0] + MOVE B,[8.0] + PUSHJ P,BOX + MOVE A,[6.0] + MOVE B,[5.0] + PUSHJ P,BOX + MOVE A,[-6.0] + MOVE B,[5.0] + PUSHJ P,BOX + MOVEI I,4 + MOVE X,[10.0] + MOVE Y,[2.0] + MOVE A,[0.0] + MOVE B,[-5.0] + PUSHJ P,BOX + MOVE X,[2.0] + PUSHJ P,BOX + MOVE X,[-6.0] + MOVE Y,[5.0] + PUSHJ P,POS + MOVEI ZP%MD,CMD + PUSHJ P,ZRMF + MOVEI A,143737 + IDPB A,BP + MOVE X,[6.0] + MOVE Y,[5.0] + PUSHJ P,POS + MOVEI ZP%MD,CMD + PUSHJ P,ZRMF + MOVEI A,223730 + IDPB A,BP + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE R,[1.0] + MOVEI I,7 + MOVEI A,-120 + ADDM A,YOFS + PUSHJ P,RING + MOVE A,SBPP + MOVEM A,SBP' + LDB A,SBP + MOVEM A,SBALL' + POPJ P, + +DRAT: MOVEI A,SIXTH*5 + MOVEM A,XOFS + MOVEI A,SIXTH*1 + MOVEM A,YOFS + MOVE I,DIN + MOVEI S,1 + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE R,[0.1] + PUSHJ P,RING + MOVE R,[0.2] + PUSHJ P,RING + MOVE R,[0.3] + PUSHJ P,RING + MOVE R,[10.0] + PUSHJ P,RING + MOVEI A,TRAT + MOVEI B,12. + MOVEI C,0 + MOVE X,[0.0] + MOVE Y,[360.0] + SETOM 360DG + PUSHJ P,LINS + MOVEI A,031415 + PUSHJ P,DNAM + POPJ P, + +DIPS: PUSH P,A + PUSH P,X + PUSH P,Y + PUSH P,GAN + MOVE X,[1.0] + MOVEM X,GAN +; HLRZ X,XYTEN +; HRRZ Y,XYTEN + MOVEI S,2 + MOVEI I,7 + ADDI Y,11 + MOVEM X,XOFS + MOVEM Y,YOFS + MOVEI A,355240 + PUSHJ P,DNAM + MOVE A,SBP1 + MOVEM A,SIPS' + POP P,GAN + POP P,Y + POP P,X + POP P,A + POPJ P, + +MTIC: MOVEI A,SIXTH*1 + MOVEM A,XOFS + MOVEI A,SIXTH*5 + MOVEM A,YOFS + MOVE I,NIN + MOVEI S,0 + + MOVE R,[15.0] + MOVE A,TIME + PUSHJ P,FLT + FDVR A,[10.0] + PUSHJ P,TNED + FDVR A,[60.0] + MOVE R,[14.0] + PUSHJ P,TNED + FDVR A,[12.0] + MOVE R,[11.0] + JRST TNED + +TNED: SKIPN DZON + POPJ P, + PUSH P,A + PUSHJ P,ANGXY + SETZM X + MOVE Y,R + FMPR Y,GAN + PUSHJ P,ROT1 + PUSHJ P,LINE + POP P,A + POPJ P, + +MCOM: MOVEI A,SIXTH*3 + MOVEM A,XOFS + MOVEI A,SIXTH*5 + MOVEM A,YOFS + MOVE R,LNTHN + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE I,NIN + MOVEI S,0 + MOVE A,CMPS + CAILE A,7777 + SUBI A,7777 + SKIPGE A + ADDI A,7777 + MOVEM A,CMPS + MOVE A,COMPI + ASH A,-7 + PUSHJ P,FLT + FMPR A,ETIME + PUSHJ P,FIX + ADDB A,CMPS + SKIPN DZON + POPJ P, + PUSHJ P,NEDL + PUSHJ P,LINE + POPJ P, + +NIN: 5 + +MADF: POPJ P, + +MAIS: MOVEI A,SIXTH*1 + MOVEM A,XOFS + MOVEI A,SIXTH*3 + MOVEM A,YOFS + SKIPE GRND + MOVE A,THRI + SKIPL GRND + MOVE A,EVLI + SKIPL GRND + ADDI A,440 + SUB A,WAIS + PUSHJ P,FLT + MOVE B,[0.015] + SKIPE GRND + PUSHJ P,ROLING + FMPR A,B + FMPR A,ETIME + PUSHJ P,FIX + ADDB A,WAIS + MOVE R,LNTHN + MOVE X,[0.0] + MOVE Y,[340.0] + MOVE I,NIN + MOVEI S,0 + SKIPN DZON + POPJ P, + PUSHJ P,NEDL + PUSHJ P,LINE + POPJ P, + +ROLING: MOVE B,[0.004] + SKIPGE A + MOVE B,[0.01] + POPJ P, + +MART: MOVEI A,SIXTH*3 + MOVEM A,XOFS + MOVEI A,SIXTH*3 + MOVEM A,YOFS + MOVE I,NIN + MOVEI S,0 + MOVE A,EVLI1 + SUB A,EVLI + ASH A,-4 + PUSHJ P,FLT + FMPR A,ETIME + PUSHJ P,FIX + ADDB A,EVLI + PUSHJ P,FLT + FDVR A,[4095.0] + FMPR A,[180.0] + MOVEM A,SAVAF' + MOVE X,[0.0] + MOVE Y,[-15.0] + FMPR X,GAN + FMPR Y,GAN + SKIPN DZON + JRST .+3 + PUSHJ P,ANGXY + PUSHJ P,ROT1 + MOVEM X,X1F' + MOVEM Y,Y1F' + MOVN A,SAVAF + MOVE X,[0.0] + MOVE Y,[-15.0] + FMPR X,GAN + FMPR Y,GAN + PUSHJ P,ANGXY + PUSHJ P,ROT1 + MOVE A,ALRI + SUBI A,3777 + PUSHJ P,FLT + FMPR A,[0.001] + MOVN A,A + +MDED: MOVEM A,MABA' + MOVMS A + CAMG A,DEDZ + SETZB A,MABA + HRRZ A,BOTOM + CAME A,ALTUD + JRST NOBT + MOVE A,BTBUG + SKIPL ALRTIP + MOVN A,BTBUG + MOVEM A,MABA + MOVM A,ALRTIP + CAMLE A,BTBUG + JRST NOBT + SETZB A,ALRTIP + SETZM MABA +NOBT: MOVE A,MABA + + FMPR A,ETIME + FADRB A,ALRTIP + + MOVEM A,MABA + MOVMS A + CAMG A,TLIM + JRST NOLIM + MOVE A,TLIM + SKIPGE MABA + MOVN A,TLIM + MOVEM A,MABA + MOVEM A,ALRTIP + +NOLIM: MOVE A,MABA + PUSHJ P,ANGXY + PUSHJ P,ROT1 + MOVEM X,X2' + MOVEM Y,Y2' + MOVE X,X1F + MOVE Y,Y1F + SKIPN DZON + POPJ P, + PUSHJ P,ROT1 + PUSHJ P,POSLIN + POPJ P, + +TLIM: 70.0 +DEDZ: 0.2 +BTBUG: 2.0 + +MALT: MOVEI A,SIXTH*5 + MOVEM A,XOFS + MOVEI A,SIXTH*3 + MOVEM A,YOFS + MOVE I,NIN + MOVEI S,0 + MOVE R,[10.0] + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE A,RATOC + SUBI A,3777 + ASH A,-5 + PUSHJ P,FLT + FMPR A,ETIME + PUSHJ P,FIX + ADDB A,ALTUD + +BOTOM: CAIL A,40 + JRST NOGND + HRRZ A,BOTOM + MOVEM A,ALTUD + +NOGND: IDIVI A,7777 + IMULI A,7777/10. + PUSH P,B + IDIVI B,10. + ADD A,B + POP P,B + SKIPN DZON + POPJ P, + PUSHJ P,NEDL + PUSHJ P,LINE + MOVE A,B ; B IS REMBER BIG HAND + MOVE R,LNTHN + MOVE X,[0.0] + MOVE Y,[360.0] + PUSHJ P,NEDL + PUSHJ P,LINE + POPJ P, + +MRPM: MOVEI A,SIXTH*1 + MOVEM A,XOFS + MOVEI A,SIXTH*1 + MOVEM A,YOFS + MOVE R,LNTHN + MOVE X,[200.0] + MOVE Y,[520.0] + MOVEI S,0 + MOVE I,NIN + MOVE A,THRI + SUB A,WRPM + PUSHJ P,FLT +BRPM: FMPR A,[0.1] + FMPR A,ETIME + PUSHJ P,FIX + ADDB A,WRPM + SKIPN DZON + POPJ P, + PUSHJ P,NEDL + PUSHJ P,LINE + POPJ P, + +MTBK: MOVEI A,SIXTH*3 + MOVEM A,XOFS + MOVEI A,SIXTH*1 + MOVEM A,YOFS + MOVE R,LNTHN + MOVE I,NIN + MOVEI S,0 + MOVE X,[270.0] + MOVE Y,[450.0] + MOVE B,RUDI1 + SUB B,RUDI + ASH B,-2 + MOVE A,B + PUSHJ P,FLT + FMPR A,ETIME + PUSHJ P,FIX + MOVE B,A + ADDB B,RUDI + SUBI B,3777 + ASH B,-1 + MOVN A,ALRTIP + FMPR A,[50.0] + PUSHJ P,FIX + ADD A,B + MOVEM A,COMPI' + ADDI A,3777 + SKIPN DZON + JRST .+3 + PUSHJ P,NEDL + PUSHJ P,LINE + MOVE B,RUDI + SUBI B,3777 + MOVN B,B +ASHB: ASH B,-5 + MOVE A,ALRTIP + PUSHJ P,FIX + ASH A,0 + MOVN A,A + ADD B,A + MOVE A,SBALL + ADD A,B + DPB A,SBP + POPJ P, + WFOO: 0 +MRAT: MOVEI A,SIXTH*5 + MOVEM A,XOFS + MOVEI A,SIXTH*1 + MOVEM A,YOFS + MOVE A,EVLI + CAMGE A,STL2 ;STALL POINT + JRST STOL + MOVE B,WAIS + CAMG B,STL1 + JRST STOL + MOVE B,CHIN + CAIE B,3 + PUSHJ P,EXIN + PUSHJ P,SETIN + PUSHJ P,FLT + FSBR A,[777'.0] + FDVR A,[3584.0] + MOVE B,[1.0] + FSBR B,A + MOVE A,WRPM + PUSHJ P,FLT + FDVR A,[4095.0] + FMPR A,[2561.0] + FADR A,[2000.0] + FMPR A,B + PUSHJ P,FIX +ST1: MOVE R,LNTHN + MOVE X,[90.0] + MOVE Y,[450.0] + MOVE I,NIN + MOVEI S,0 + SUB A,WCLM + PUSHJ P,FLT + FMPR A,WFOO + FMPR A,ETIME + PUSHJ P,FIX + ADDB A,WCLM + SUBI A,3777 + MOVE B,[0.1] + SKIPL A + FSC B,2 + MOVEM B,WFOO + SKIPL A + ASH A,-2 + ADDI A,3777 + MOVEM A,RATOC' + SKIPN DZON + POPJ P, + + HRRZ A,BOTOM + CAME A,ALTUD + JRST NGOUT + MOVE A,RATOC1 + PUSHJ P,FLT + FSBR A,[2047.0] + MOVN A,A + FMPR A,[0.1] + FMPR A,ETIME + PUSHJ P,FIX + ADDB A,RATOC1 + JRST NGOUT1 +NGOUT: MOVE A,RATOC + MOVEM A,RATOC1 +NGOUT1: PUSHJ P,NEDL + PUSHJ P,LINE + POPJ P, + +STOL: AOS A,BSTOL + CAIL A,3 + SETZM BSTOL + SKIPN BSTOL + PUSHJ P,EXIN + PUSHJ P,SETIN + MOVEI A,1777 + JRST ST1 + +SETIN: PUSH P,BP + PUSH P,A + MOVE A,SBPC + MOVEM A,BP + MOVEI ZP%MD,CMD + MOVE Z%IN,CHIN + MOVEI Z%SC,1 + MOVEI Z%ST,0 + PUSHJ P,ZRMF + POP P,A + POP P,BP + POPJ P, + +EXIN: EXCH A,CHIN + EXCH A,CHIN1 + EXCH A,CHIN + POPJ P, + +RATOC1: 0 + +MIPS: PUSH P,A + PUSH P,BP + PUSH P,SIPS + MOVE A,SIPS + MOVEM A,BP + PUSHJ P,DIPS + POP P,SIPS + POP P,BP + POP P,A + POPJ P, + +LINS: PUSH P,A + PUSH P,B + PUSH P,C + PUSH P,R + PUSH P,X + PUSH P,Y + MOVEM A,TBP' + MOVEM B,NOBL' + MOVEM C,NOLL' + MOVEM R,RADG' + MOVEM X,STRG' + MOVEM Y,STPG' + SETZM LINL' + SETZM NOTMS' + PUSHJ P,STGR + JRST RELINF + + + +RELINF: MOVEI ZP%MD,PMD + MOVE Z%IN,I + MOVE Z%SC,S + MOVEI Z%ST,0 + PUSHJ P,ZRMF + PUSHJ P,XYFIX + ASH X,@S + ASH Y,@S + MOVEI LP%IF,0 + MOVEI ZP%MD,ZMD + ADD X,XOFS + ADD Y,YOFS + PUSHJ P,PNTF + PUSHJ P,LNTHL + MOVEI ZP%MD,VMD + MOVEI Z%SC,0 + PUSHJ P,ZRMF + MOVEI LC%ES,1 + MOVEI LP%IF,1 + PUSHJ P,LIN + MOVEI ZP%MD,ZMD + MOVE Z%SC,S + SKIPE LINL + JRST NOCHR + MOVEI ZP%MD,PMD + MOVE Z%IN,I + PUSHJ P,ZRMF + PUSH P,A + HRRZ A,TBP + ADD A,NOTMS + MOVE A,@A + SKIPN A + JRST POPAF + POP P,A + PUSHJ P,COMCP + MOVEI LP%IF,0 + MOVEI ZP%MD,CMD + PUSHJ P,PNTF + PUSH P,A + MOVE A,TBP + ADD A,NOTMS + HLRZ C,@A + IDPB C,BP + MOVEI C,373737 + IDPB C,BP + POP P,A +NOCHR: AOS LINL + AOS NOTMS + MOVE C,NOTMS + CAML C,NOBL + JRST OUTGR + MOVE C,LINL + CAMLE C,NOLL + SETZM LINL + MOVE X,XSAV1 + MOVE Y,YSAV1 + PUSHJ P,ROT1 + MOVEM X,XSAV1 + MOVEM Y,YSAV1 + JRST RELINF +OUTGR: POP P,Y + POP P,X + POP P,R + POP P,C + POP P,B + POP P,A + POPJ P, + +POPAF: POP P,A + JRST NOCHR + +STGR: PUSH P,C + MOVE A,STRG + MOVE Y,GAN + FMPR Y,RADG + SETZM X + PUSHJ P,ANGXY + PUSHJ P,ROT1 + MOVEM X,XSAV1' + MOVEM Y,YSAV1' + MOVE C,STPG + FSBR C,STRG + MOVE A,NOBL + SKIPN 360DG + SOS A + PUSHJ P,FLT + FDVRM C,A + PUSHJ P,ANGXY + POP P,C + POPJ P, + + +LNTHL: MOVE X,XSAV1 + MOVE Y,YSAV1 + SKIPE LINL + JRST LITL + FMPR X,[-0.4] + FMPR Y,[-0.4] + JRST BIGO +LITL: FMPR X,[-0.2] + FMPR Y,[-0.2] +BIGO: PUSHJ P,XYFIX + POPJ P, + +COMCP: PUSH P,A + PUSH P,B + MOVE X,XSAV1 + MOVE Y,YSAV1 + FMPR X,[1.4] + FMPR Y,[1.4] + PUSHJ P,XYFIX + MOVE B,TBP + ADD B,NOTMS + HRRZ B,@B + MOVE A,[-10] + SKIPE B + MOVE A,[-5] + ASH A,@S + ADD X,A + MOVE A,[-3] + ASH A,@S + ADD Y,A + ADD X,XOFS + ADD Y,YOFS + POP P,B + POP P,A + POPJ P, + + +TALY: PUSH P,A + HLRZ A,BP + LSH A,-14 + SKIPE A + JRST TAL3 + MOVEI A,3000 + REPEAT 6,IDPB A,BP + POP P,A + POPJ P, +TAL3: MOVEI A,3000 + REPEAT 7,IDPB A,BP + POP P,A + POPJ P, + +ANGXY: MOVE B,A + PUSHJ P,COSD + EXCH A,B + PUSHJ P,SIND + POPJ P, + +NEDL: PUSH P,A + PUSH P,B + PUSHJ P,FLT + FSBR Y,X + FDVR Y,[4095.0] + FMPR A,Y + FADR A,X + PUSHJ P,ANGXY + MOVE X,[0.0] + MOVE Y,GAN + FMPR Y,R + MOVEM A,SSIN' + MOVEM B,SCOS' + PUSHJ P,ROT1 + POP P,B + POP P,A + POPJ P, + +ROT1: PUSH P,X + PUSH P,Y + FMPR X,B + FMPR Y,A + FADR X,Y + MOVEM X,SAVX' + POP P,Y + POP P,X + FMPR Y,B + FMPR X,A + FSBR Y,X + MOVE X,SAVX + POPJ P, + + +LINE: PUSH P,X + PUSH P,Y + MOVEI ZP%MD,PMD + MOVE Z%IN,I + MOVE Z%SC,S + MOVEI Z%ST,0 + PUSHJ P,ZRMF + MOVE X,XOFS + MOVE Y,YOFS + MOVEI LP%IF,0 + MOVEI ZP%MD,VMD + PUSHJ P,PNTF + MOVE X,-1(P) + MOVE Y,(P) + PUSHJ P,XYFIX + MOVEI LC%ES,1 + MOVEI LP%IF,1 + PUSHJ P,LIN + POP P,Y + POP P,X + POPJ P, + + + +POSLIN: PUSH P,A + PUSH P,B + PUSH P,X + PUSH P,Y + PUSH P,XOFS + PUSH P,YOFS + PUSHJ P,XYFIX + ADDM X,XOFS + ADDM Y,YOFS + MOVE X,X2 + MOVE Y,Y2 + PUSHJ P,XYFIX + ADD X,-1(P) + ADD Y,(P) + SUB X,XOFS + SUB Y,YOFS + ASH X,-1 + ASH Y,-1 + MOVE A,X + MOVE B,Y + PUSHJ P,XYFLT + PUSHJ P,LINE + ADDM A,XOFS + ADDM B,YOFS + PUSHJ P,LINE + POP P,YOFS + POP P,XOFS + POP P,Y + POP P,X + POP P,B + POP P,A + POPJ P, + + +BOX: PUSH P,A + PUSH P,B + PUSH P,X + PUSH P,Y + MOVEI ZP%MD,PMD + MOVE Z%IN,I + MOVE Z%SC,S + MOVEI Z%ST,0 + PUSHJ P,ZRMF + FMPR X,GAN + FMPR Y,GAN + PUSHJ P,XYFIX + MOVEM X,XSAV' + MOVEM Y,YSAV' + ASH X,@S + ASH Y,@S + ASH X,-1 + ASH Y,-1 + ADD X,XOFS + ADD Y,YOFS + FMPR A,GAN + FMPR B,GAN + EXCH A,B + PUSHJ P,FIX + EXCH A,B + PUSHJ P,FIX + ASH A,@S + ASH B,@S + ADD X,A + ADD Y,B + MOVEI LP%IF,0 + MOVEI ZP%MD,VMD + PUSHJ P,PNTF + MOVEI LC%ES,0 + MOVEI LP%IF,1 + MOVEI X,0 + MOVN Y,YSAV + PUSHJ P,LIN + MOVN X,XSAV + MOVEI Y,0 + PUSHJ P,LIN + MOVEI X,0 + MOVE Y,YSAV + PUSHJ P,LIN + MOVE X,XSAV + MOVEI Y,0 + MOVEI LC%ES,1 + PUSHJ P,LIN + POP P,Y + POP P,X + POP P,B + POP P,A + POPJ P, + + +POS: PUSH P,A + PUSH P,X + PUSH P,Y + MOVEI ZP%MD,PMD + MOVE Z%IN,I + MOVE Z%SC,S + MOVEI Z%ST,0 + PUSHJ P,ZRMF + FMPR X,GAN + FMPR Y,GAN + PUSHJ P,XYFIX + ASH X,@S + ASH Y,@S + ADD X,XOFS + ADD Y,YOFS + MOVE A,[-2] + ASH A,@S + ADD X,A + MOVE A,[-3] + ASH A,@S + ADD Y,A + MOVEI LP%IF,0 + MOVEI ZP%MD,ZMD + PUSHJ P,PNTF + POP P,Y + POP P,X + POP P,A + POPJ P, + + + +RING: JRST RING1 + PUSH P,A + PUSH P,B + PUSH P,C + PUSH P,X + PUSH P,Y + MOVEI ZP%MD,PMD + MOVE Z%IN,I + MOVE Z%SC,S + MOVEI Z%ST,0 + PUSHJ P,ZRMF + MOVEM X,XSAV' + FSBR Y,X + FDVR Y,NOPTS + PUSHJ P,XYFIX + MOVE C,Y + MOVE A,XSAV + PUSHJ P,ANGXY + MOVE X,[0.0] + MOVE Y,R + FMPR Y,GAN + PUSHJ P,ROT1 + MOVE A,NOPTS + MOVEI LP%IF,1 + PUSHJ P,ANGXY + JRST PLTP+1 +PLTP: PUSHJ P,ROT1 + PUSH P,X + PUSH P,Y + PUSHJ P,XYFIX + ASH X,@S + ASH Y,@S + ADD X,XOFS + ADD Y,YOFS + PUSHJ P,PNTF + POP P,Y + POP P,X + CAIN C,1 + MOVEI ZP%MD,ZMD + SOJGE C,PLTP + POP P,Y + POP P,X + POP P,C + POP P,B + POP P,A + POPJ P, + +RING1: PUSH P,A + PUSH P,B + PUSH P,X + PUSH P,Y + PUSH P,R + MOVEI ZP%MD,PMD + MOVE Z%IN,I + JFCL + MOVE Z%SC,S + MOVEI Z%ST,0 + PUSHJ P,ZRMF + MOVE X,R + MOVE Y,[0.0] + FMPR X,GAN + PUSHJ P,XYFIX + ASH X,@S + ASH Y,@S + ADD X,XOFS + ADD Y,YOFS + MOVEI LP%IF,0 + MOVEI ZP%MD,IMD + PUSHJ P,PNTF + MOVE A,BP + MOVEM A,SBPP' + MOVE A,R + FMPR A,GAN + PUSHJ P,FIX + MOVE R,A + MOVN B,S + ASH A,(B) + PUSHJ P,CIRCR + POP P,R + POP P,Y + POP P,X + POP P,B + POP P,A + POPJ P, + + +E==S +M==LC%ES +T==LP%IF + + +CIRCR: MOVEM 15,ACBLK+15 + MOVEI 15,ACBLK + BLT 15,ACBLK+14 + MOVSI A,265012 ;.7071068 + MULI A,(R) + DPB A,[014200,,B] ;EVEN PROD > 0 + MOVEI C,(R) + IMUL C,C + SUBI C,(A) ;R*R-Y + IMUL A,B + SUB C,A ;R*R-Y-2*Y*Y + JUMPLE C,BGOOD + SUBI C,(B) + CAIGE C,3 + AOSA B + ADDI B,2 +BGOOD: MOVNI E,1(B) + ASH E,21 + IDIVI B,8 + HRRM B,BIGIN + HRRM C,PHASIN + MOVSI X,-4 + MOVEI Y,0 + MOVE M,BP + MOVEI A,200000 + TLZE M,220000 + TROA Y,4 + AOSA M + IDPB A,BP + IDPB A,BP + MOVE B,BP + IDPB A,B +CRLUP: HRRM M,BPA(X) + MOVE T,PHASES(Y) + HLLM T,BPA(X) + ADD T,IDBS(X) + MOVEM T,A(X) +BIGIN: ADDI M,. +PHASIN: ADDI Y,. + TRZE Y,8 + AOS M + AOBJN X,CRLUP + SKIPE Y + TLOA M,220000 + SOS M + HRLS Y,BP + ADDI Y,1 + BLT Y,(M) + MOVEI Y,600000 + DPB Y,M + MOVEM M,BP + MOVNI Y,1 ;14 10 + MOVEI T,0 ;17 3 13 + MOVEI X,(R) + PUSHJ P,CIRLP + MOVSI 15,ACBLK + BLT 15,15 + POPJ P, +CIRLP: AOBJP E,CDUN + ADDI Y,2 + ADDI T,(Y) + CAIL T,(X) + SOJA X,CDIAG + 4PUT 2 14 3 10 + PUSHJ P,CIRLP + 4PUT 14 3 10 2 + POPJ P, +CDIAG: SUBI T,(X) ;.+2,DOUT+2=CAT; .+6,+8 MONK + SUBI T,1(X) + 4PUT 16 17 13 12 + PUSHJ P,CIRLP +CDOUT: 4PUT 16 17 13 12 + POPJ P, +CDUN: TRNN E,400000 + JRST CDOUT + POPJ P, +ACBLK: BLOCK 16 +IRPC Q,,ABCD +IDB!Q: REPEAT 4,[ + JSP Q,(Q) + IDPB 0,BP!Q] + MOVSI 0,-20000 + ADDM 0,BP!Q +JDB!Q: REPEAT 4,[ + JSP Q,(Q) + IDPB 0,BP!Q] + MOVE 0,[420000,,1] + ADDM 0,BP!Q + JRST IDB!Q +TERMIN +IRPC Q,,ABCD +BP!Q: 0 +TERMIN +IDBS: IRPC Q,,ABCD + IDB!Q +TERMIN +PHASES: 420400,,1 + 360400,,3 + 320400,,5 + 260400,,7 + 200400,,13 + 140400,,15 + 100400,,17 + 040400,,21 + + + +PNT: PUSH P,A + ANDI Y,1777 + MOVEI A,200000+PMD_15(Y) + IDPB A,BP + LDB A,[1200,,X] + DPB ZP%MD,[150300,,A] + DPB LP%IF,[120100,,A] + IDPB A,BP + POP P,A + POPJ P, + + +CHR: PUSH P,A + IDPB A,BP + SKIPG LC%ES + JRST CHROUT + MOVEI A,373737 + IDPB A,BP +CHROUT: POP P,A + POPJ P, + +PNTF: PUSH P,A + PUSH P,X + PUSH P,Y + ANDI X,1777 + ANDI Y,1777 + MOVEI A,PMD + DPB A,[150300,,Y] + MOVE A,ZP%MD + DPB A,[150300,,X] + TRZ Y,2000 + TRZ X,2000 + SKIPE LP%IF + TRO X,2000 + TRZ X,200000 + TRO Y,200000 + IDPB Y,BP + IDPB X,BP + POP P,Y + POP P,X + POP P,A + POPJ P, + + + +LIN: PUSH P,X + PUSH P,Y + TRNN X,400000 + JRST DOY + MOVMS X + TRO X,200 +DOY: TRNN Y,400000 + JRST DDOY + MOVMS Y + TRO Y,200 +DDOY: ANDI X,377 + ANDI Y,377 + LSH Y,10 + ADD X,Y + TRZ X,600000 + SKIPLE LC%ES + TRO X,400000 + SKIPLE LP%IF + TRO X,200000 + IDPB X,BP + POP P,Y + POP P,X + POPJ P, + + +ZRMF: PUSH P,A + PUSH P,B + SETZM B + MOVE A,ZP%MD + DPB A,[150300,,B] + MOVE A,Z%IN + DPB A,[000300,,B] + MOVE A,Z%SC + DPB A,[040200,,B] + TRZ B,3000 + SKIPLE Z%ST + TRO B,3000 + TRO B,10 + TRO B,100 + TRZ B,10000 + IDPB B,BP + POP P,B + POP P,A + POPJ P, + + +ZRM: DPB ZP%MD,[150300,,Z%IN] + TRO Z%IN,110 + IDPB Z%IN,BP + POPJ P, + +XYFIX: PUSH P,Y+1 + MULI Y,400 + TSC Y,Y + ASH Y+1,-243(Y) + MULI X,400 + TSC X,X + ASH X+1,-243(X) + MOVE X,X+1 + MOVE Y,Y+1 + POP P,Y+1 + POPJ P, + +XYFLT: TLC X,232000 + FAD X,X + TLC Y,232000 + FAD Y,Y + POPJ P, + +FIX: PUSH P,A+1 + MULI A,400 + TSC A,A + ASH A+1,-243(A) + MOVE A,A+1 + POP P,A+1 + POPJ P, + +FLT: TLC A,232000 + FAD A,A + POPJ P, + + +NOPTS: 2.0 +FOOI: 0 +GAN: 8.0 +CHIN: 3 +WRPM: 0 +WAIS: 0 +WCLM: 0 + +LNTHN: 14.0 +ALTUD: 7777 +XOFS: 0 +YOFS: 0 +PDL: BLOCK PDS +DSL0: BLOCK STDS +DSL1: BLOCK MVDS +DSL2: BLOCK MVDS + TCOM: 401640,,0 + 0 + 0 + 406340,,0 + 0 + 0 + 406640,,0 + 0 + 0 + 400540,,0 + 0 + 0 + 616240,,1 + 0 + 0 + 616540,,1 + 0 + 0 + 402340,,0 + 0 + 0 + 626140,,1 + 0 + 0 + 626440,,1 + 0 + 0 + 402740,,0 + 0 + 0 + 636040,,1 + 0 + 0 + 636340,,1 + 0 + 0 + 0 + + +TCLC: 616240,,1 + 0 + 0 + 0 + 0 + 406140,,0 + 0 + 0 + 0 + 0 + 406240,,0 + 0 + 0 + 0 + 0 + 406340,,0 + 0 + 0 + 0 + 0 + 406440,,0 + 0 + 0 + 0 + 0 + 406540,,0 + 0 + 0 + 0 + 0 + 406640,,0 + 0 + 0 + 0 + 0 + 406740,,0 + 0 + 0 + 0 + 0 + 407040,,0 + 0 + 0 + 0 + 0 + 407140,,0 + 0 + 0 + 0 + 0 + 616040,,1 + 0 + 0 + 0 + 0 + 616140,,1 + 0 + 0 + 0 + 0 + 0 + +TAIS: 406040,,0 + 0 + 626040,,1 + 0 + 646040,,1 + 0 + 666040,,1 + 0 + 706040,,1 + 0 + 616060,,0 + 0 + 616260,,0 + 0 + 616460,,0 + 0 + 616660,,0 + 0 + 617060,,0 + 0 + 626060,,0 + 0 + +TALT: 406040,,0 + 0 + 0 + 0 + 0 + 406140,,0 + 0 + 0 + 0 + 0 + 406240,,0 + 0 + 0 + 0 + 0 + 406340,,0 + 0 + 0 + 0 + 0 + 406440,,0 + 0 + 0 + 0 + 0 + 406540,,0 + 0 + 0 + 0 + 0 + 406640,,0 + 0 + 0 + 0 + 0 + 406740,,0 + 0 + 0 + 0 + 0 + 407040,,0 + 0 + 0 + 0 + 0 + 407140,,0 + 0 + 0 + 0 + 0 + + + +TRAT: 406340,,0 + 406440,,0 + 406540,,0 + 0 + 406540,,0 + 406440,,0 + 406340,,0 + 406240,,0 + 406140,,0 + 406040,,0 + 406140,,0 + 406240,,0 + +TRPM: 406040,,0 + 0 + 0 + 0 + 0 + 406540,,0 + 0 + 0 + 0 + 0 + 616040,,1 + 0 + 0 + 0 + 0 + 616540,,1 + 0 + 0 + 0 + 0 + 626040,,1 + 0 + 0 + 0 + 0 + 626540,,1 + 0 + 0 + 0 + 0 + 636040,,1 + 0 + 0 + 0 + 0 + 636540,,1 + + + +END + \ No newline at end of file diff --git a/src/klh/mazser.141 b/src/klh/mazser.141 new file mode 100644 index 00000000..521e8348 --- /dev/null +++ b/src/klh/mazser.141 @@ -0,0 +1,2308 @@ +TITLE MAZE + +; PDP-10 Half of MAZE Game, by Dave Lebling (January, 1974) +; Much altered by Ken Harrenstien (KLH @ MIT-AI) since. + +; MAZE COMMANDS: These are typed on the command line. Any number may +; be typed. + +; C - evade usage restrictions. this is for debugging purposes. +; normally MAZE can only be played on weekends and from 8pm to +; 8am during the week. + +; I - causes input from imlac to be scripted to the file ;MAZIN >. + +; L - informs the program that you are already loaded, and therefore +; do not need the auto-load feature. + +; O - causes output to imlac to be scripted to the file ;MAZOUT >. + +; Q - brings up MAZE in quiet mode. that implies that no loading be +; done and output be done to the TTY in ascii mode. useful for +; debugging. + +; R - causes MAZE to come up as a ROBOT. does a :PROCED when it is +; done initializing. typing control-G to a robot causes him to +; die and leave the game gracefully. + +; S - causes MAZE to record info about use, specifically time, user name, +; and tty #. + +; Additionally, the first player up has the option of loading an alter- +; nate maze. Typing CRLF to the query forgoes that option. Otherwise +; a file specification of the file to be used should be typed. The file +; itself is expected to contain 32. words of description, each word 16. +; bits right-justified. A bit that is on defines a wall, a bit that is +; zero defines a hallway. + +; MAZE PROTOCOL: Whenever certain ascii characters are received, the +; program expects the next several (from one to about 10) to be argu- +; ments to those characters. The first argument in all cases is the +; ID# of the IMLAC originating the command. ID#s run from 1 to 8. + +; PLAYER LEAVES GAME ; sent out when cntrl-Z typed. +; 001 +; + +; PLAYER MOVED ; defines position. see new protocol. +; 002 +; +; +; +; + +; PLAYER DIED ; announced with glee by shooting imlac. +; 003 +; +; + +; ANNOUNCE NEW PLAYER ; this is actually inserted in buffers by the 10. +; 004 +; +; <6 characters of ID name (login name)> +; <4 characters of score, 2 for, 2 against, \ 100> + +; any other characters received by IMLAC MAZE are displayed in a four +; line ring ("talk") buffer at the bottom of the display, unless "new protocol" is +; in effect; this protocol echoes only 010-017 and 040-137 inclusive, all +; other codes have some significance under the new protocol. + +; NEW PROTOCOL for MOVING +; The lower 3 bits of char are taken as ID of originator, and +; the upper 4 bits designate an action as follows: + +; 02x - Turn right +; 03x - Turn left +; 14x - Turn around +; 15x - Move forward 1 step in current direction +; 16x - Move backward 1 step etc. +; 17x - Reserved, no function. + +; Hence, one character serves to transmit "relative movement" information which +; amounts to a much more efficient way of communicating with the imlacs. The +; program is I/O and not CPU bound. + +.MLLIT==1 + +DEFINE SETF TEXT,FLG ;useful set-flag macro! +IFDEF FLG,.STOP +.TAG FOOBAR +PRINTC "TEXT +FLG=" +.TTYMAC FLAG +IFSE FLAG,YES,FLG==1 +IFSE FLAG,NO,FLG==0 +IFSE FLAG,Y,FLG==1 +IFSE FLAG,N,FLG==0 +IFNDEF FLG,FLG==FLAG +TERMIN +IFNDEF FLG,.GO FOOBAR +TERMIN + +; assembler conditionals + SETF [Fast protocol?]NPTCL ; when set, use new protocol + SETF [Debug error checking?]DEBUG ; when set, put in extra error checking + SETF [Stats?]STATS ; when set, keep stats on MAZE use + +; ac definitions + +FLAGS=0 ; program flags +A=1 +B=2 +C=3 +D=4 +E=5 ; offset of impure page! don't touch! +T=6 ; super temporary, assume clobbered by all subr. calls. +;=7 ; +G=10 ; used by interrupt routines only. +H=11 ; " +I=12 ; " + +TO=13 ; holds state of TTY output buffer +ID=14 ; hold id for use in general routines +ME=15 ; hold id number of this player +FLGNUM=16 ; buffer change flag (local copy) + +P=17 ; pdl pointer + + ; paging hackery. +IPAG==2 ; # of global impure page +IOFF==IPAG*2000 +PPAG==IPAG+1 ; # of page beginning global pure +POFF==PPAG*2000 + + ; program flags +LOADED==1 ; maze program already loaded, don't load it again +QUIET==2 ; not using an imlac (debug) +SCRIN==4 ; script input to ;MAZREC > (debug) +SCROUT==10 ; script output to ;MAZOUT > (debug) +ROBBY==20 ; ROBOT player +CHEAT==40 ; play during day +SPYSTA==100 ; collect spy statistics + + ; random definitions +TTYS==9. ; number of players (one is global buffer) +BUFSIZ==50 ; size of console input buffers +TYIMSK==1 ; tty interrupt mask bit + + ; call uuo definitions +CIMM==1000,,0 ; immediate argument +CRTN==2000,,0 ; return argument +CERR==3000,,0 ; return error code +CTL==4000,,0 ; control +CTLI==5000,,0 ; immediate control + + ; channels +TYIC==1 ; tty input channel +TYOC==2 ; tty output channel +SCRI==3 ; input script channel +SCRO==4 ; output script channel +LCI==5 ; loading input +LCO==6 ; loading output + +; macro for system calls +DEFINE SYSCAL A,B + .CALL [SETZ ? SIXBIT /A/ ? B ((SETZ))] +TERMIN + +; macro for reducing pain +DEFINE PUSHAE AC,LIST +IRP LOC,,[LIST] +PUSH AC,LOC +TERMIN +TERMIN +DEFINE POPAE AC,LIST +IRP LOC,,[LIST] +POP AC,LOC +TERMIN +TERMIN + +; macros to output text +DEFINE TYPE ARG + MOVEI A,[ASCIZ ARG] + PUSHJ P,LINOUT +TERMIN +DEFINE TYPECR ARG + MOVEI A,[ASCIZ ARG] + PUSHJ P,LINCR +TERMIN + +; Random macro to make defaulting filenames easier. +DEFINE DEFULT LOC,DEFARG + SKIPN LOC + JRST [MOVEM A,LOC ? MOVE A,DEFARG ? EXCH A,LOC ? JRST .+1] +TERMIN + ; * LOCAL IMPURE VARIABLES * +LOC 42 + JSR TTYINT ; interrupt handler vector + +LOC 100 + ; push down stack +PDLNTH==50 ; length of pdl +PDL: BLOCK PDLNTH ; pdl +OUTBUF: BLOCK 7 + +; variables for alternate maze reading and loading + +; command buffer -- for reading name of alternate MAZE file +COMLNG==20. ; length of command buffer +COMMND: BLOCK COMLNG ; command buffer +COMPTR: 440700,,COMMND ; byte pointer into command buffer + +; loading buffer +LODSIZ==1000 ; size of loading buffer +LODBUF: BLOCK LODSIZ +OB: 440700,,LODBUF+100 + +; TTY output buffer (SIOT faster than unit mode) +TTYSIZ==200. ;buffer up 200 chars +TTYBUF: BLOCK /5 +TTYPTR: 440700,,TTYBUF +TTYCNT: 0 ;countdown of chars in buffer. + +; variables for care and feeding of imlac program in core. +IMLLEN: 0 ; length in wds of imlac prgm, if in core at IMLPRG. +IMLPGP: 0 ; holds -<# pgs>,,imlpag for use in freeing the core. + + +; local byte pointers into global buffers +BPSPTR: -TTYS,,BPS +BPS: BLOCK TTYS + +; information about this player + +FIRST: 0 ; non-zero if first player +MYNAME: 0 ; sixbit of my uname (or ROBOTn) +MYBIT: 0 ; 1 lsh'ed by my id-1 (ID 3 => 4) +QNAME: 0 ; name we want (typed in by "name") +MYSNAM: 0 ; sname which job had on startup. used to open script files. + +; tty interrupt dispatch + +TTYINT: 0 + 0 + MOVEI I,TYIC + .ITYIC I, ; get interrupting char if any + .DISMIS TTYINT+1 ; nothing? + PUSH P,A + .IOT TYIC,A ; something there, get the char. +IFN DEBUG,[ + CAILE A,177 + JSR BUGHLT +] + PUSHJ P,@CHRVEC(A) ; go do routine +NOMSG: POP P,A + .DISMIS TTYINT+1 ; return + +; Character vectoring table. fast and simple (and all that room in the page +; was going to waste anyway...) + +CHRVEC: CPOPJ ; 000 - nil + GETOUT ; 001 - Player left game + NEWLOC ; 002 - Player moved + MURDER ; 003 - Player was shot + CPOPJ ; 004 - New player in game(ignore, imlac never sends) + CPOPJ ; 005 - nil + CPOPJ ; 006 - nil + SUICID ; 007 - ^G, kill self and return to DDT +IFN NPTCL,[ +REPEAT 10,COMTLK ; 010-017 echoed to talk buffer. +REPEAT 10,NCMDIR ; 020-027 New Protocol "turn right" +REPEAT 10,NCMDIR ; 030-037 New Protocol "turn left" +REPEAT 100,COMTLK ; 040-137 echoed to talk buffer. +REPEAT 10,NCMDIR ; 140-147 New Protocol "turn around" +REPEAT 10,NCMFWD ; 150-157 New Protocol "move forward" +REPEAT 10,NCMBKD ; 160-167 New Protocol "move backward" +REPEAT 10,CPOPJ ; 170-177 nil +] +IFE NPTCL,[ +REPEAT 170,COMTLK ; 010-177 echoed in talk buffer +] +CPOPJ: POPJ P, + +DBUGSW: DEBUG ; set nonzero if debugging. + +BUGHLT: 0 ;halt here if bug hit. + .VALUE ;should not try to return anything but chars 40-137! + JRST @BUGHLT ;if $P'd, try to continue. + +; * quit * + +QUIT: 0 ; JSR'd to, so can tell where we came from + SKIPE DBUGSW + .VALUE ;don't die if debugging. + .VALUE [ASCIZ ".JPC/ +:KILL "] + JRST .-1 ; if continued, .value again + ; * ROBOT PLAYER VARIABLES * + +; firing variables +ATIME: 0 ; if nonzero, time when fired bullet arrives +ALOCN: 0 ; if nonzero, where robot was when bullet fired +AVICTI: 0 ; if nonzero, id bits of possible victims + +; macro variables +ANEXT: 0 ; if non-zero, next time we move, do this +APEEK: 0 ; turn-around-and-peek probability, 0 - 40 + +DOZE: 40 ; time between robot moves * 4, initially 1/3 second + +SEEDHI: 0 ; seeds for random number generator +SEEDLO: 0 + +; robot move decision data + +AHEAD: 0 ; views in four directions +ARIGHT: 0 ; 0 -- wall immediately ahead +ABACK: 0 ; n,,m -- n is number of squares before wall +ALEFT: 0 ; m is id bits of people who can be seen + +AHMOVE: 0 ; coords to use to actually do four possible +ARMOVE: 0 ; things +ABMOVE: 0 +ALMOVE: 0 + +AHPROB: 0 ; value and later normalized probability for +ARPROB: 0 ; each possible move +ABPROB: 0 +ALPROB: 0 + +FFIPAG==<.+1777>/2000 ;first free locally impure page. + ; * GLOBAL IMPURE * + +LOC IOFF ; page 2 + +; the maze that the game is in, where to find it +; (note that if global maze exists, specs here are ignored and global is used.) +SCN1: 0 ; name1 (0 if using default assembled maze) +SCN2: 0 ; name2 +SCDIR: 0 ; user +SCDEV: 0 ; device + +; definitions for use in loading alternate mazes +MAZSIZ==40 ; number of words in a maze +MAZIML==<12+<40*4>+12+<2*4>+6+4>/5 ; number of words after imtraning +MAZBEG==10020 ; location of beginning of maze in imlac + +; flag that something happened +FLGGLO: 0 ; aos'ed for every message + +; global information tables + +GPSPTR: -TTYS,,<.-IOFF>+1 ; pointers into global input buffers +GPS: 440700,,GB0-IOFF(E) + 440700,,GB1-IOFF(E) + 440700,,GB2-IOFF(E) + 440700,,GB3-IOFF(E) + 440700,,GB4-IOFF(E) + 440700,,GB5-IOFF(E) + 440700,,GB6-IOFF(E) + 440700,,GB7-IOFF(E) + 440700,,GB8-IOFF(E) + +GGPPTR: -TTYS,,<.-IOFF>+1 ; guaranteed good pointers into global input buffers +GGP: 440700,,GB0-IOFF(E) + 440700,,GB1-IOFF(E) + 440700,,GB2-IOFF(E) + 440700,,GB3-IOFF(E) + 440700,,GB4-IOFF(E) + 440700,,GB5-IOFF(E) + 440700,,GB6-IOFF(E) + 440700,,GB7-IOFF(E) + 440700,,GB8-IOFF(E) + +GBSPTR: -TTYS,,<.-IOFF>+1 ; console buffers +GBS: +GB0: BLOCK BUFSIZ +GB1: BLOCK BUFSIZ +GB2: BLOCK BUFSIZ +GB3: BLOCK BUFSIZ +GB4: BLOCK BUFSIZ +GB5: BLOCK BUFSIZ +GB6: BLOCK BUFSIZ +GB7: BLOCK BUFSIZ +GB8: BLOCK BUFSIZ + +; global player information + +; id name +IDSPTR: -TTYS,,<.-IOFF>+1 ; sixbit (uname of each player) +IDS: BLOCK TTYS + +; score +SCRPTR: -TTYS,,<.-IOFF>+1 ; left half times winner, right half times dead +SCORE: BLOCK TTYS + +; dead +DEAPTR: -TTYS,,<.-IOFF>+1 ; non-zero when a player is dead +DEAD: BLOCK TTYS + +; coordinates +COOPTR: -TTYS,,<.-IOFF>+1 ; left half is direction, right offset in maze +COORD: BLOCK TTYS + +; buffer locks +LCKPTR: -TTYS,,<.-IOFF>+1 ; -1 implies buffer locked -- don't read from it +LOCKED: BLOCK TTYS + + ; the maze itself + +; it is 512. words long (16. wide by 32. high). normally the assembled +; in version is used, but if an alternate maze is used it is loaded in +; on top. + +; -1 == wall +; 0 -- empty square +; n -- id bits of all those in this square ORed together + +; macro to make a "row" of the maze +; bits in argument that are 1 become filled squares, 0 bits become empty +; squares. note that the entire border is filled in! +DEFINE ROWMAK RRR +RR=RRR +REPEAT 16.,[ + IFE , 0 + IFN , -1 + RR=RR_1 +] +TERMIN + +LAMAZE: 0 ; -1 implies this is already set up (only used if + ; non-standard maze being used + +; the maze itself +AMAZE: ROWMAK 177777 + ROWMAK 106401 + ROWMAK 124675 + ROWMAK 121205 + ROWMAK 132055 + ROWMAK 122741 + ROWMAK 106415 + ROWMAK 124161 + ROWMAK 121405 + ROWMAK 135775 + ROWMAK 101005 + ROWMAK 135365 + ROWMAK 121205 + ROWMAK 127261 + ROWMAK 120205 + ROWMAK 106765 + ROWMAK 124405 + ROWMAK 166575 + ROWMAK 122005 + ROWMAK 107735 + ROWMAK 120001 + ROWMAK 135575 + ROWMAK 105005 + ROWMAK 125365 + ROWMAK 125225 + ROWMAK 121265 + ROWMAK 105005 + ROWMAK 135375 + ROWMAK 100201 + ROWMAK 135675 + ROWMAK 110041 + ROWMAK 177777 + +; stuff from here to end of page is located for benefit of random programs +; that want to get at maze data; same reason applies to use of indexed +; (by E) pointers, so that global tables can be mapped to other addresses +; by other programs. + +LOC IOFF+1737 +ESSPTR: -9.,,<.-IOFF>+1 ; Table filled with either a NOP or POPJ +ESSWS: REPEAT 9.,ESPOPJ ; E & S instruction, so it can detect + ; (non) existence of players. +ESNOP==20,,0 ; E&S NOP indicates player active +ESPOPJ==22,,0 ; E&S POPJ indicates nonexistent + +LOC IOFF+1757 +UNMPTR: -9.,,<.-IOFF>+1 ; so can tell actual unames of players. +UNM: BLOCK 9. + +IFN STATS,[ +; more or less positive identification of this page as a MAZE page. +LOC IOFF+1776 + SIXBIT /MAZE/ + SIXBIT /EZAM/ +] + ; * SHARED PURE * + +LOC POFF ; pure pages start here + +; the default file containing an IMTRANed version of the IMLAC half of the +; program. Not used unless INITializing or there is no imlac program +; resident in core, in which case this is tried. +IMLDIR: SIXBIT /IMLAC / ; directory +IMLDEV: SIXBIT /DSK/ +IMLFN1: SIXBIT /M/ +IMLFN2: SIXBIT /IML/ + +; default file containing alternate maze. +MAZDEV: SIXBIT /DSK/ +MAZDIR: SIXBIT /IMLAC/ +MAZFN1: SIXBIT // ;NO STANDARD FN1 FOR MAZE FILE +MAZFN2: SIXBIT /MAZE/ + +; command character definitions + +%OUT==1 ; leave game +%MOV==2 ; move +%DIE==3 ; player dead +%NEW==4 ; new player enters game + +%COMSZ==4 ; max old-protocol value + +; pointers to beg of each global input buffer +GSSPTR: -TTYS,,GSS ; reset routines use these +GSS: 440700,,GB0-IOFF(E) + 440700,,GB1-IOFF(E) + 440700,,GB2-IOFF(E) + 440700,,GB3-IOFF(E) + 440700,,GB4-IOFF(E) + 440700,,GB5-IOFF(E) + 440700,,GB6-IOFF(E) + 440700,,GB7-IOFF(E) + 440700,,GB8-IOFF(E) + +; "pointer values" upon which to reset global buffer ptrs. +GSSEND: 010700,,+GB0-IOFF(E) + 010700,,+GB1-IOFF(E) + 010700,,+GB2-IOFF(E) + 010700,,+GB3-IOFF(E) + 010700,,+GB4-IOFF(E) + 010700,,+GB5-IOFF(E) + 010700,,+GB6-IOFF(E) + 010700,,+GB7-IOFF(E) + 010700,,+GB8-IOFF(E) + + +; Handy-dandy quik-ref table of player-ID bit masks +IDBITB: 0 + REPEAT 8.,1_.RPCNT + ; here to join game and then enter loop + +JOIN: PUSHJ P,NEWGUY ; initialize a new player + +; now set local ptrs to same as global ones +; we use pointers from a table set up at end of each command -- this +; ensures lack of gross timing errors when loser is caught will pants down + MOVE C,GGPPTR ; aobjn pointer to "good" global pointers + ADDI C,IOFF + MOVE B,BPSPTR ; aobjn pointer to local pointer table +SETLU1: MOVE A,(C) + MOVEM A,(B) + AOBJN C,.+1 + AOBJN B,SETLU1 + +; hang waiting for a message -- our copy of message count different +; from global means one has arrived +THELUP: PUSHJ P,TTYFRC ; force out any TTY output generated + CAMN FLGNUM,FLGGLO ; hang on flgglo changing + .HANG ; means message has occurred + MOVE FLGNUM,FLGGLO ; copy it to flgnum + +; first look to see if we're dead + SKIPN DEAD(ME) + JRST BUFTOP ; not dead, thank goodness + HRRZ A,COORD(ME) ; dead. get coord +IFN DEBUG,[ + CAIL A,1000 + JSR BUGHLT +] + MOVE B,IDBITB(ME) ; and set up bit to + ANDCAM B,AMAZE(A) ; remove us from global maze. + MOVEI A,45. ; allow 1.5 sec for imlac's "died" display to + .SLEEP A, ; finish. + SETZM DEAD(ME) ; and make us alive again + +; loop through buffers +BUFTOP: MOVSI ID,-TTYS ; aobjn ptr thru buffs, start with global id 0 + +; our buffer? +CHKQUE: CAIN ME,(ID) ; ignore our own buffer + JRST BUFLUP + MOVE C,BPS(ID) ; get local buffer pointer + +; global pointer same as local and buffer not locked? +QUELUP: CAME C,GPS(ID) ; same as global? + SKIPE LOCKED(ID) ; don't if he is locked + JRST BUFLUP ; bptrs same or his is locked + +; output chars from buffer until pointer same as local one + ILDB A,C ; get next character + PUSHJ P,TTYO ; put it out + CAMN C,GSSEND(ID) ; reached end of buffer? + MOVE C,GSS(ID) ; yes, reset to beginning (wraparound) + MOVEM C,BPS(ID) + JRST QUELUP ; loop + +; here to move to next buffer +BUFLUP: AOBJN ID,CHKQUE ; loop + JRST THELUP ; reenter main loop at the hang + ; * JOIN GAME * + +; first check if this is someone reentering after lossage (crash of +; IMLAC program, for instance) +NEWGUY: MOVE A,IDSPTR ; aobjn pointer to id names + ADDI A,IOFF + AOBJN A,.+1 ; skip talk buffer + MOVE B,(A) + CAMN B,MYNAME ; same as my name? + JRST NEWID ; yes, just reuse it + AOBJN A,.-3 ; loop + +; not reentering, so just find zero id slot. + MOVE A,IDSPTR + ADDI A,IOFF + AOBJN A,.+1 ; ignore talk buffer + SKIPN (A) ; zero? + JRST NEWID ; yes + AOBJN A,.-2 ; loop + +; no room -- i'm not sure if this will even type out reasonably. + TYPECR [Sorry, game is full now, try again later] + JSR QUIT ; kill job + +; here we have a new id +NEWID: HRRZS A ; points to slot in id table + SUBI A,IDS ; get offset -- it will be id number + MOVE ME,A ; id of new player + +; set up global data +; ME/ my id number + MOVE A,MYNAME ; my id name + MOVEM A,IDS(ME) ; put it out + .SUSET [.RUNAM,,A] + MOVEM A,UNM(ME) + SETZM DEAD(ME) ; i'm alive! + +; send out new player message +; sent out on TTY so our IMLAC will be informed -- remember that what +; goes in our buffer is ignored by us + SETOM LOCKED(ME) ; lock buffer + MOVEI A,%NEW ; command + PUSHJ P,TTYO ; type it, as our IMLAC must be told too + PUSHJ P,PUT ; new player + +; new player's id number + MOVE A,ME + PUSHJ P,TTYO + PUSHJ P,PUT ; new player's id number + +; now output name of new player + MOVE B,MYNAME ; sixbit of my name + MOVE C,[440600,,B] +OIDLP: ILDB A,C + ADDI A,40 + PUSHJ P,TTYO + PUSHJ P,PUT + CAME C,[000600,,B] + JRST OIDLP ; loop + +; now send score + MOVE B,SCORE(ME) ; my score + MOVE C,SCBPTR ; byte pointers +OSCRXX: LDB A,(C) + IORI A,100 + PUSHJ P,TTYO + PUSHJ P,PUT + AOBJN C,OSCRXX + +; loop through everyone who is active +; to get new player up to date + MOVEI C,1 ; start with id one, ignore talk buffer +IDTOP: CAME C,ME ; if me, ignore + SKIPN A,IDS(C) ; player exists? + JRST IDLOOP ; no + +; output someone's id and position +; from our IMLAC's point of view they are new players + MOVEI A,%NEW + PUSHJ P,TTYO + MOVE A,C + PUSHJ P,TTYO +; now id name and position if any + MOVE B,IDS(C) ; id name + PUSHJ P,OSIX + MOVE B,SCORE(C) ; score + PUSHJ P,OSCORE + MOVE A,C ; A/ id of who we send + SKIPE B,COORD(C) ; B/ position + PUSHJ P,SENDB ; sends a position in COORD format + +IDLOOP: CAIE C,TTYS-1 ; done? + AOJA C,IDTOP ; no, loop + +; now let the losers read it + MOVE A,GPS(ME) + MOVEM A,GGP(ME) ; set up first guaranteed good pointer. + MOVE A,[ESNOP] + MOVEM A,ESSWS(ME) ; now tell E&S we're alive. + SETZM LOCKED(ME) ; unlock the buffer + AOS FLGGLO ; indicate a message sent + POPJ P, ; return + +SENDB: PUSH P,A + MOVEI A,%MOV + PUSHJ P,PUT + PUSHJ P,TTYO + MOVE A,(P) ; get ID of person to move + PUSHJ P,PUT + PUSHJ P,TTYO + HLRZ A,B ; get direction + IORI A,100 + PUSHJ P,PUT + PUSHJ P,TTYO + LDB A,[000400,,B] ; get x coord + IORI A,100 + PUSHJ P,PUT + PUSHJ P,TTYO + LDB A,[040500,,B] ; get y coord + IORI A,100 + PUSHJ P,PUT + PUSHJ P,TTYO + POP P,A + POPJ P, + + +; * ROUTINES TO EXECUTE UPON IMLAC INPUT ARE HERE * +; These routines are interrupt driven and clobber G,H,I with +; reckless abandon. In general the only acc smashed which is shared with +; non-interrupt routines is A; it and any others are saved. +; Robots make no use of these routines, as they get their information +; directly from the global-impure tables. + +DEFINE CMINIT + SETOM LOCKED(ME) ; lock buffer + PUSHJ P,PUT ; put command in buffer +TERMIN + +PJRST==JRST ; replaces pushj p, foo ? popj p, with pjrst foo + +; Interrupt routines PJRST here when done - standard return. +ENDMES: MOVE A,GPS(ME) ; end of message, update "good" buffer pointer + MOVEM A,GGP(ME) + SETZM LOCKED(ME) ; unlock buffer + AOS FLGGLO ; signal that we sent a message + POPJ P, + +; control G means leave game gracefully if possible, abruptly if must. +SUICID: MOVEI A,%OUT + PUSHJ P,PUT ; send "OUT" message + MOVE A,ME ; and say its me + JRST GETOU1 ; go die, never return. + +COMTLK: PUSHJ P,TPUT ; put char in talk buffer (global id 0) + ; this is only place where anything is inserted in it. + PJRST ENDMES ; return + + ; New Protocol uses single character for any change of direction or +;position. Old protocol used 5 chars per change. Hopefully reduction +;of I/O (the limiting factor) will approach 1/5 over old mode. + +; Bits 1.7-1.6 If both 0 or both 1, rest of character is a command. +; Bits 1.6-1.4 Command #. +; = 0 Old style protocol command +; = 1 Reserved +; = 2 Turn Right (no move) +; = 3 Turn Left (no move) +; = 4 Flip over (no move) +; = 5 Move Forward (no turn) +; = 6 Move Backward (no turn) +; = 7 Reserved +; Bits 1.3-1.1 Player ID. + +IFN NPTCL,[ +DEFINE NCMINI + MOVE G,A + TRZ G,100 ; remove any such bit + LSHC G,-3 ; get command # in g + LSH H,-33. ; and player ID in h + CAIE H,-1(ME) ; check, should be our own ID (0-7 cmp'd with 1-8) + POPJ P, ; ugh, isn't us, ignore char. + SETOM LOCKED(ME) ; ah, lock buffer + PUSHJ P,PUT ; insert command. +TERMIN + + ; Change Direction +NCMDIR: NCMINI + SETZM DEAD(ME) + HLRZ A,COORD(ME) ;get direction already existing +IFN DEBUG,[ + CAILE A,3 + JSR BUGHLT +] + MOVE A,@(G)[ 0 + 0 + (A)[1 ? 2 ? 3 ? 0] ;get new direction for right-turn + (A)[3 ? 0 ? 1 ? 2] ;for left turn + (A)[2 ? 3 ? 0 ? 1]] ;for flip-over. + HRLM A,COORD(ME) + PJRST ENDMES + + ; Move Backward +NCMBKD: HLRZ I,COORD(ME) +IFN DEBUG,[ + CAILE I,3 + JSR BUGHLT +] + MOVE I,(I)[2 ? 3 ? 0 ? 1] ; set direction to move backwards + JRST NCMFW1 + + ; Move Forward +NCMFWD: HLRZ I,COORD(ME) ; for fwd move, just get direction. +IFN DEBUG,[ + CAILE I,3 + JSR BUGHLT +] +NCMFW1: NCMINI + SETZM DEAD(ME) + HRRZ G,COORD(ME) ;get our coordinate +IFN DEBUG,[ + CAIL G,1000 + JSR BUGHLT +] + MOVE H,IDBITB(ME) ;get our id bit + ANDCAM H,AMAZE(G) ;remove us from that coordinate + ; now separate x, y and adjust according to direction + IDIVI G,16. ;get y in g, x in h (0,0 is upper left) + XCT (I)[SOS G ;go north, decrement y + AOS H ;go east, increment x + AOS G ;go south, increment y + SOS H] ;go west, decrement x + DPB G,[040500,,H] ; overlay Y onto X (loses only if X neg) + ANDI H,777 ; for which purpose safety mask is made. + HRRM H,COORD(ME) ;update global offset + MOVE A,IDBITB(ME) + IORM A,AMAZE(H) ;put us back in maze + PJRST ENDMES + +] ;END OF IFN NPTCL + + + ; * COMMAND HANDLERS * + +; * PLAYER QUIT * + +; this command takes a single argument, the id of the guy who is quitting. +; the ID, SCORE, and COORDINATE are zeroed. the buffer is unlocked, and +; the player is removed from the global maze. the job is then killed. + +GETOUT: CMINIT + .IOT TYIC,A ; read argument (id# of who quit) +GETOU1: PUSHJ P,PUT ; enter here to kill robot + +; if not me who quit, don't do anything to our stuff + CAME A,ME + PJRST ENDMES + +; zero information about this loser + MOVE A,[ESPOPJ] + MOVEM A,ESSWS(ME) ; tell E&S we're not there + SETZM IDS(ME) + SETZM SCORE(ME) + SETZM COORD(ME) + AOS FLGGLO + SETZM LOCKED(ME) + MOVE A,ME + PUSHJ P,REMOVE + .LOGOUT ;try to logout, in case disowned. + .BREAK 16,140000 ; tell DDT to kill us. + JRST .-2 + +; * PLAYER MOVED * + +; this command gives a new location for us. first argument is id of +; who moved (thanx to gat you can move other people!) rest of arguments +; are direction (N=0, E=1, S=2, W=3), and an X and Y coordinate within +; the maze of the new location (X=0-15, Y=0-31). all but the id are +; ORed with 100 so that the ascii is always good. + +NEWLOC: CMINIT + .IOT TYIC,A ; get id of who moved +IFN DEBUG,[ + CAIL A,10 + JSR BUGHLT ; if arg bad. +] + PUSHJ P,PUT ; put it out in buffer + SETZM DEAD(A) ; if we moved we ain't dead yet! + PUSHJ P,REMOVE ; remove us from old position + +; set up id bit of who moved + MOVE G,IDBITB(A) ; pluck from handy table + +; new direction + .IOT TYIC,A ; get direction + PUSHJ P,PUT ; put it out + ANDI A,3 ; AND it down to 3 bits + HRLM A,COORD(ME) ; put out as new direction +; new x loc + .IOT TYIC,A ; get x + PUSHJ P,PUT ; put it out + MOVE H,A ; save x loc + ANDI H,17 ; AND it down to 4 bits (0-15) +; new y loc + .IOT TYIC,A ; get y + PUSHJ P,PUT ; put it out + ANDI A,37 ; AND it to 5 bits (0-31) + +; update coordinate and global maze + LSH A,4 ; y*16 + x = offset in global maze + ADD A,H + HRRM A,COORD(ME) ; put out as new offset + IORM G,AMAZE(A) ; add us to global maze using id bit and offset (a) + PJRST ENDMES + +; * PLAYER DIED * + +; player was shot. message is originated by shooter, and comes in as +; his id, id of who was shot. updates SCORE of each. left half is +; times you were murderer, right is times you were victim. + +MURDER: CMINIT + .IOT TYIC,A ; get id of murderer +IFN DEBUG,[ + CAIL A,10 + JSR BUGHLT +] + MOVSI G,1 ; aos his score of kills + ADDM G,SCORE(A) + PUSHJ P,PUT ; put him out + .IOT TYIC,A ; id of victim +IFN DEBUG,[ + CAIL A,10 + JSR BUGHLT +] + AOS SCORE(A) ; aos his score of deaths + SETOM DEAD(A) ; make him dead + PUSHJ P,PUT ; put him out + PJRST ENDMES + +; adding and removing people in global maze (somewhat localized for debugging) + +; remove a guy from global maze (only done by guy himself either at +; end of game or if he notices he's dead or if he moves) +; A/ guy to remove +REMOVE: + +IFN DEBUG,[ + CAIL A,10 + JSR BUGHLT +] + PUSH P,B + PUSH P,C + HRRZ B,COORD(A) ; get his coordinate + MOVE C,IDBITB(A) ; and his bit +IFN DEBUG,[ + CAIL B,1000 + JSR BUGHLT +] + ANDCAM C,AMAZE(B) ; AND to remove him + POP P,C + POP P,B + POPJ P, + +; put a guy into global maze +; A/ offset into global maze +; B/ id bit of guy to add +ADDGUY: + +IFN DEBUG,[ + CAIL A,1000 + JSR BUGHLT +] + IORM B,AMAZE(A) ; OR his id bit into global maze + POPJ P, + ; * OUTPUT ROUTINES * + +; * output single character to TTY * + +TTYO: IDPB A,TO ;deposit character in buffer + SOSLE TTYCNT ;drop through if buffer full + POPJ P, + + ; Force tty buffer out. +TTYFRC: MOVEI TO,TTYSIZ + SUBB TO,TTYCNT ;get # of chars to output + JUMPE TO,TTYFR2 + MOVE TO,TTYPTR + TRNE FLAGS,SCROUT + PUSHJ P,OSRCIP + SYSCAL SIOT,[CIMM TYOC ? TO ? TTYCNT] + JSR QUIT +TTYFR2: MOVEI TO,TTYSIZ + MOVEM TO,TTYCNT + MOVE TO,TTYPTR + POPJ P, + + + ; script crlf if old-style command character +OSRCIP: PUSH P,A + PUSH P,B + .IOT SCRO,["|] + MOVE B,TTYCNT +OSCRI2: ILDB A,TO + CAILE A,%COMSZ + JRST .+3 + .IOT SCRO,[15] + .IOT SCRO,[12] +; script space if not command character + CAILE A,%COMSZ + .IOT SCRO,[40] +; now convert to number and output + LDB T,[060300,,A] + IORI T,"0 + .IOT SCRO,T + LDB T,[030300,,A] + IORI T,"0 + .IOT SCRO,T + LDB T,[000300,,A] + IORI T,"0 + .IOT SCRO,T + SOJG B,OSCRI2 + MOVE TO,TTYPTR + POP P,B + POP P,A + POPJ P, + +; here to script input +ISCRIP: TRNN FLAGS,SCRIN ; if scripting, do other hair + POPJ P, + .IOT SCRI,[40] +; now convert to number and output + LDB T,[060300,,A] + IORI T,"0 + .IOT SCRI,T + LDB T,[030300,,A] + IORI T,"0 + .IOT SCRI,T + LDB T,[000300,,A] + IORI T,"0 + .IOT SCRI,T + POPJ P, + +; here to script a crlf +SICRLF: TRNN FLAGS,SCRIN + POPJ P, + .IOT SCRI,[^M] + .IOT SCRI,[^J] + POPJ P, + +; * output a character into a global buffer * + +; put a character out into talk buffer +TPUT: PUSH P,ID + SETZ ID, + PJRST PUT1 + +; put character out in my buffer +PUT: PUSH P,ID + MOVE ID,ME ; for buffer pointer update + +PUT1: +IFN DEBUG,[ + PUSH P,B ; CHECK VALIDITY OF PTR + HRRZ B,GPS(ID) + CAIGE B,GB0-IOFF + JSR BUGHLT + CAILE B,GB8+BUFSIZ-IOFF + JSR BUGHLT + POP P,B +] + IDPB A,GPS(ID) ; put out character + PUSHJ P,ISCRIP + PUSH P,A ; update buffer pointer +IFN DEBUG,[ + CAIL ID,10 + JSR BUGHLT +] + MOVE A,GPS(ID) + CAMN A,GSSEND(ID) ; buffer pointer at end of buffer? + MOVE A,GSS(ID) ; if so, reset (wraparound to beg) + MOVEM A,GPS(ID) + POP P,A + POP P,ID + POPJ P, + +; * output sixbit to tty * + +OSIX: PUSH P,I + MOVE I,[440600,,B] +OSIXLP: ILDB A,I + ADDI A,40 + PUSHJ P,TTYO + CAME I,[000600,,B] + JRST OSIXLP + POP P,I + POPJ P, + +; * output score to tty * + +OSCORE: PUSH P,I + MOVE I,SCBPTR +OSCRLP: LDB A,(I) + IORI A,100 + PUSHJ P,TTYO + AOBJN I,OSCRLP + POP P,I + POPJ P, + +SCBPTR: -4,,.+1 + 300600,,B + 220600,,B + 060600,,B + 000600,,B + +; * output messages * + +LINCR: PUSHJ P,LINOUT + .IOT TYOC,[15] + POPJ P, + +LINOUT: PUSH P,A + HRLI A,440700 +LOUP: ILDB T,A ; pick up letter + JUMPE T,FINZ ; zero if done + CAIE T,^J + .IOT TYOC,T ; output letter + JRST LOUP ; back for more +FINZ: POP P,A + POPJ P, + +; * ROBOT PLAYER SETUP * + +; proceed the job +ROBOT: .VALUE [ASCIZ /:PROCED +/] + +; find an id number + MOVE A,IDSPTR + ADDI A,IOFF + AOBJN A,.+1 ; ignore talk buffer + SKIPN (A) + JRST ROBID + AOBJN A,.-2 + JSR QUIT ; kill job, no room + +; here we have a new id +ROBID: HRRZS A + SUBI A,IDS + MOVE ME,A ; id of new player + +; send new player message + SETOM LOCKED(ME) + PUSHJ P,SICRLF + MOVEI A,%NEW ; new player + PUSHJ P,PUT + MOVE A,ME ; id # + PUSHJ P,PUT +; name is "ROBOTn", where n is id number +IRPC X,,[ROBOT] + MOVEI A,"X + PUSHJ P,PUT +TERMIN + MOVE A,ME + IORI A,60 + PUSHJ P,PUT + +; set up id slot, MYNAME, and MYBIT + SKIPN A,QNAME + MOVE A,[SIXBIT /ROBOT0/] + PUSHJ P,NAMEX + AOJA A,.-1 + MOVEM A,IDS(ME) ; id name slot + MOVEM A,MYNAME ; local copy of our name + .SUSET [.RUNAM,,A] + MOVEM A,UNM(ME) + MOVE A,ME + MOVEI B,1 + LSH B,-1(A) + MOVEM B,MYBIT ; id bit -- word with bit # "ID" one + +; send my score + MOVE B,SCORE(ME) + MOVE I,SCBPTR +ROBSCR: LDB A,(I) + IORI A,100 + PUSHJ P,PUT + AOBJN I,ROBSCR + MOVE I,GPS(ME) ; set up "good" pointer to our global buffer + MOVEM I,GGP(ME) + MOVE A,[ESNOP] + MOVEM A,ESSWS(ME) ; tell E&S we're alive. + SETZM LOCKED(ME) ; unlock buffer + ; * ROBOT PLAYER LOOP * + +; comes here to restart after dying +ROBNEW: SOS A,DOZE ; go a little faster to compensate for dying + CAIGE A,4 ; can't get faster than four, though + AOS DOZE + SETZM DEAD(ME) ; make us alive again + MOVE A,ME + PUSHJ P,REMOVE ; remove corpse from maze + +; random start up position +ROBRAN: PUSHJ P,RANDOM ; random direction + ANDI A,3 ; 3 bits + MOVE B,A ; save it + PUSHJ P,RANDOM ; random position + ANDI A,777 ; 9 bits +ROBRLP: SKIPL AMAZE(A) ; space in maze not wall? + JRST ROBLOC ; exit + SOJE A,ROBRAN ; wall, go back one + JRST ROBRLP ; loop + +; put out new location +ROBLOC: HRL A,B ; direction in left half + MOVEM A,COORD(ME) ; xy coord + HRRZS A ; A/ coord + MOVE B,MYBIT ; B/ id bit + PUSHJ P,ADDGUY ; add to global maze + PUSHJ P,SENDME ; send out my position + +; loop for robot player + +ROBLUP: SKIPE DEAD(ME) ; am i dead? + JRST ROBNEW ; yes, better do something about it + PUSHJ P,AUTO ; do something + MOVE A,DOZE ; sleep for a while + LSH A,-2 ; doze for DOZE/4 + .SLEEP A, + +; pending shot? + SKIPN ATIME ; if non-zero, a shot is pending + JRST ROBLUP ; no, just loop + .RDTIME A, ; time + CAMGE A,ATIME ; two seconds passed? + JRST ROBLUP ; no, loop + PUSHJ P,ADEAD ; kill anyone left there + SETZM ATIME ; no more shot + JRST ROBLUP ; loop + ; * ROBOT PLAYER DECISION ROUTINES * + +; decides on and executes a move for the robot +AUTO: PUSHJ P,ASETUP ; set up moves and "vision" data + SKIPE ATIME ; skip if no pending shot + JRST AMOVE ; pending shot, can't fire again + +; fire at anyone visible +AFIRE: HRRE A,AHEAD ; look for visible people ahead + JUMPLE A,AMOVE ; no one visible + +; someone visible + SETZM ANEXT ; flush any pending "macro" + MOVEM A,AVICTI ; victims + MOVE A,COORD(ME) ; my current position + MOVEM A,ALOCN ; save it + .RDTIME A, + ADDI A,60. ; two seconds from now we will check them + MOVEM A,ATIME ; save it + POPJ P, ; return + +; couldn't fire, so we move instead +AMOVE: MOVE A,ME ; get my id # + PUSHJ P,REMOVE ; remove from the global maze + SKIPN ANEXT ; skip if we already have a move planned + JRST AMOVE1 ; nope + +; here to use pre-planned move + MOVE A,ANEXT ; get pre-planned move + SETZM ANEXT ; remove "macro" + JRST AMOVE2 ; go use it + +; here to figure out a move +AMOVE1: PUSHJ P,AVALUE ; returns the "best" move in A + +; here to actually do a move +AMOVE2: MOVEM A,COORD(ME) ; new position + HRRZS A ; coordinate + MOVE B,MYBIT ; my id bit + PUSHJ P,ADDGUY ; add myself back into maze + PUSHJ P,SENDME ; and send out new location + POPJ P, ; return + ; * ROBOT PLAYER MOVE SELECTOR * + +; returns a move based on a random selection weighted as follows (where N +; is the number of squares before a wall is hit in a given direction): + +; move forward: 10*N, or N if other players are visible +; turn right: 10*N +; turn left: 10*N +; turn back: 1 + +; algorithm is such that robot never turns to face a blank wall, and if +; he turns to look down a corridor, he always advances at least one square +; into the corridor. + +AVALUE: PUSH P,B + PUSH P,C + SETZM AHPROB ; zero value/probability locations + SETZM ARPROB + SETZM ABPROB + SETZM ALPROB + SETZ C, ; zero value total + +; move forward + MOVE A,AHEAD ; view forward + JUMPE A,AVALR ; negative -- wall + HLRZ B,A ; empty squares + HRRZS A ; visible people + SKIPN A ; any visible? + IMULI B,10 ; no, weight by 10 + MOVEM B,AHPROB ; value of move forward + ADD C,B ; update total of values + +; turn right +AVALR: MOVE A,ARIGHT ; view right + JUMPE A,AVALB ; anything? + HLRZ B,A ; get number of squares + IMULI B,10 ; weight by 10 + MOVEM B,ARPROB ; value of move right + ADD C,B ; update total + +; turn back +AVALB: MOVE A,ABACK ; view back + JUMPE A,AVALL ; wall? + MOVEI B,1 ; currently just value of 1 + MOVEM B,ABPROB + ADD C,B ; update total + +; turn left +AVALL: MOVE A,ALEFT ; view left + JUMPE A,AVALN ; wall? + HLRZ B,A ; free squares + IMULI B,10 ; weight by 10 + MOVEM B,ALPROB ; value of turn left + ADD C,B ; update total + +; normalize the values to numbers between 0 and 1000 +; which mark off the boundaries between probabilities. +AVALN: ; C/ total of values + +IRP AX,,[AHPROB,ARPROB,ABPROB,ALPROB] + MOVE A,AX ; get value + PUSHJ P,NORMAL ; normalize + ADDB A,B ; total + MOVEM A,AX ; put it back out +TERMIN + +; remainder of 1000. in B + PUSHJ P,RANDOM ; get random number between 0 and 1000. + IDIVI A,1000. ; remainder ends up in B + +; move forward? + CAML B,AHPROB ; less than ahead number? + JRST ARCHK ; nope + MOVE A,AHMOVE ; move forward! + JRST AVALX ; return + +; turn right? +ARCHK: CAML B,ARPROB ; less than turn right number? + JRST ABCHK + MOVE A,ARMOVE ; turn right + PUSHJ P,DOMOVE ; and always go forward after that + MOVEM B,ANEXT ; put out as "macro" + JRST AVALX + +; turn around +ABCHK: CAML B,ABPROB ; turn around? + JRST ALCHK ; nope + MOVE A,ABMOVE ; get turn + JRST AVALX + +; turn left +ALCHK: CAML B,ALPROB ; turn left? + JRST ANULL ; nope + MOVE A,ALMOVE + PUSHJ P,DOMOVE ; after left turn always move forward + MOVEM B,ANEXT ; put out as "macro" + JRST AVALX + +; no move, do nothing -- happens sometimes due to roundoff errors +ANULL: MOVE A,COORD(ME) ; just return current position + +; check to see if better to do quick turn around to look for people +; sneaking up on us +AVALX: HLRZ B,COORD(ME) ; current direction + HLRZ T,A ; new direction + CAME T,B ; directions same? + JRST AVAL1 ; no, zero apeek +; directions same, should we turn around? + AOS APEEK + EXCH B,A + PUSHJ P,RANDOM ; random number + EXCH B,A + ANDI B,37 ; make it between 0 and 37 + CAMLE B,APEEK ; less than apeek? + JRST AVALXX ; nope, don't peek + MOVE A,COORD(ME) ; yes, peek. instead of what we were + MOVEM A,ANEXT ; going to do, return "back" move and + MOVE A,ABMOVE ; then turn back to current position next time +AVAL1: SETZM APEEK ; zero peek count -- either turned or peeked + +; return move in A -- equals coordinates of player after move made +AVALXX: POP P,C + POP P,B + POPJ P, + ; find out who died -- called 2 seconds after a shot was fired. +; anyone still visible from where we fired the shot will be dead. +; send out messages indicating they are dead. +ADEAD: PUSHAE P,[A,B,C] + MOVE A,ALOCN ; pick up where we were + PUSHJ P,SEE ; find out who is visible + AND A,AVICTIM ; keep only those who were visible before + JUMPLE A,JFFXIT ; exit if everyone got away + +; tell them they're dead + MOVE B,A ; save id bits of who dies + +JFFLUP: JFFO B,JFFDO ; find first bit +JFFXIT: POPAE P,[C,B,A] ; exit, no bits on anymore + POPJ P, + +; here a bit was found in victim word, so tell him he's dead +JFFDO: MOVNS C ; - + ADDI C,36. ; bit position of loser = id# + MOVE A,C ; get id# into A + PUSHJ P,ADIE ; die! +; now turn off that bit from victim word + MOVEI A,1 + LSH A,-1(C) ; C is number of bit that should be on + TRZ B,(A) + JRST JFFLUP ; and loop to find next victim + +; kill a specific hacker, id# in a +; whenever robot kills someone, he slows down a little bit, to compensate +; for being so good. idea is that eventually he reaches an equilibrium +; with caliber of his opposition. +ADIE: SKIPE DEAD(A) ; skip only if not already dead + POPJ P, + SETOM LOCKED(ME) ; lock buffer + PUSHJ P,SICRLF + PUSH P,A ; save his id# + MOVEI A,%DIE ; send player died message + PUSHJ P,PUT + MOVE A,ME ; my id (as murderer) + PUSHJ P,PUT + POP P,A ; recover his id + PUSHJ P,PUT ; send it (as victim) + SETOM DEAD(A) ; make him dead + AOS SCORE(A) ; increment times killed for victim + MOVSI T,1 + ADDM T,SCORE(ME) ; and increment my count of wins. + AOS DOZE ; slow me down a bit, i'm getting too good + MOVE T,GPS(ME) ; and update "good" buffer pointer + MOVEM T,GGP(ME) + SETZM LOCKED(ME) ; unlock buffer + AOS FLGGLO ; and indicate message sent + POPJ P, ; return + ; checks for those who can be seen from a given place +; pass coord-like contents in A, returns those who can be seen + +SEE: PUSHAE P,[B,C,D] + HRRZ B,A ; B/ coordinate + HLRZ C,A ; C/ direction + SETZB A,D ; A/ people visible + ; D/ number of squares +IFN DEBUG,[ + CAILE B,777 + JSR BUGHLT + CAILE C,3 + JSR BUGHLT +] +SEELUP: XCT AFORW(C) ; move forward + SKIPGE AMAZE(B) ; wall? + JRST SEERX ; yes, exit + +; add to information we are gathering +SEEADD: IOR A,AMAZE(B) ; add new victims + AOS D ; add another square + JRST SEELUP ; loop + +; normal exit +SEERX: HRL A,D ; return A/ ,, + POPAE P,[D,C,B] + POPJ P, + ; pick up our position and collect view in each direction and create +; move we would use if we moved/turned in that direction. +ASETUP: PUSHAE P,[A,B] + +; forward move + MOVE A,COORD(ME) + MOVE B,A + MOVEM A,AHMOVE ; for the moment, move ahead is noop + PUSHJ P,SEE ; what is ahead? + MOVEM A,AHEAD ; save it + JUMPE A,ASETU1 ; if wall, go on to right turn + HLRZ A,AHMOVE ; no wall, figure out what move ahead + MOVE B,AHMOVE ; would be by executing appropriate + XCT AFORW(A) ; instruction from AFORW table + MOVEM B,AHMOVE ; real forward move +; turn right +ASETU1: MOVE B,COORD(ME) + PUSHJ P,ASTURN ; do turn + MOVEM A,ARMOVE ; result of right turn + PUSHJ P,SEE ; what is to right? + MOVEM A,ARIGHT +; turn back + PUSHJ P,ASTURN ; do turn + MOVEM A,ABMOVE ; result of back turn + PUSHJ P,SEE ; what is behind us? + MOVEM A,ABACK +; turn left + PUSHJ P,ASTURN ; do turn + MOVEM A,ALMOVE ; result of left turn + PUSHJ P,SEE ; what is off to left? + MOVEM A,ALEFT +; exit + POPAE P,[B,A] + POPJ P, + +; instructions to move in NESW direction +AFORW: SUBI B,1._4 ; move to north + AOS B ; move to east + ADDI B,1._4 ; move to south + SOS B ; move to west + +; turn to next direction +ASTURN: ADD B,[1,,0] ; just aos direction + AND B,[3,,777] ; and AND back to legal information + MOVE A,B ; return in A and B + POPJ P, + ; normalize to 1000. +; A/ value to normalize +; C/ total of values being normalized +NORMAL: PUSH P,B + IMULI A,1000. ; multiply times 1000 + IDIV A,C ; and divide by total of values + POP P,B + POPJ P, + +; random number generator stolen from HAKMEM +RANDOM: PUSH P,B + MOVE A,SEEDHI + MOVE B,SEEDLO + MOVEM A,SEEDLO + LSHC A,35. + XORB A,SEEDHI + MOVMS A + POP P,B + POPJ P, + +; given a direction/coordinate in A, returns new coordinate in B +DOMOVE: PUSH P,A + MOVE B,A ; coord into B + HLRZS A ; direction + XCT AFORW(A) ; move forward + POP P,A + POPJ P, + +; send current location from COORD(id#) +; A/ an id # +SENDA: PUSH P,B + MOVE B,A ; into B +IFN DEBUG,[ + CAILE B,7 + JSR BUGHLT +] + SETOM LOCKED(B) ; lock buffer + MOVEI A,%MOV ; move command + PUSHJ P,PUT ; put it out + MOVE A,B ; id# + PUSHJ P,PUT ; put it + HLRZ A,COORD(B) ; direction + IORI A,100 + PUSHJ P,PUT ; put it + LDB A,[000400,,COORD(B)] ; x coordinate + IORI A,100 + PUSHJ P,PUT ; put it + LDB A,[040500,,COORD(B)] ; y coordinate + IORI A,100 + PUSHJ P,PUT ; put it + PUSH P,GPS(B) ; set up "good" global buffer pointer + POP P,GGP(B) ; core-core transfer. + SETZM LOCKED(B) ; unlock buffer + AOS FLGGLO ; and indicate message sent + POP P,B + POPJ P, + +; same as SENDA but always uses local ID # +SENDME: PUSH P,A + PUSHJ P,SICRLF + MOVE A,ME ; get id of me + PUSHJ P,SENDA ; and send + POP P,A + POPJ P, + +CONSTANTS ;try to keep most commonly ref'd stuff in 1 page. +VARIABLES + +; start up + +START: MOVEI E,IOFF ; OFFSET of impure page + MOVE P,[-PDLNTH,,PDL] ; set up pdl pointer + + .RDTIME A, ; seeds for random number generator + MOVEM A,SEEDHI + MOVE A,[3.14159] + MOVEM A,SEEDLO + + .BREAK 12,[5,,COMMND] ; get command line that started us + .SUSET [.RUNAM,,MYNAME] ; get our uname -- (id unless robot or id given) + .SUSET [.RSNAM,,MYSNAM] ; get initial sname for use by script-file opens + .SUSET [.SSNAM,,MYNAME] ; and set sname to uname, to wipe out traces + ; of where loaded from. might be set to name + ; which player uses in maze, but too obvious. + + +; read command line and set flag bits in FLAGS appropriately + +RESTRT: MOVE A,[440700,,COMMND] + SETZ FLAGS, + +COMRED: ILDB B,A ; get next character from command line + CAIL B,"a ; convert to uppercase + CAILE B,"z + CAIA + SUBI B,40 + CAIGE B,40 ; halt on any cntrl (null, ^M, etc) + JRST TTYOPN ; no more + + CAIN B,"" ; " -- read name + PUSHJ P,NAMRED + CAIN B,"L ; L -- don't load IMLAC program + TRO FLAGS,LOADED + CAIN B,"I ; I -- script input to ";MAZIN >" + JRST [ TRO FLAGS,SCRIN + .CALL ISCOPN ; open file to script input from imlac + JSR QUIT + JRST .+1] + CAIN B,"O ; O -- script output to ";MAZOUT >" + JRST [ TRO FLAGS,SCROUT + .CALL OSCOPN ; open fie to script output to imlac + JSR QUIT + JRST .+1] + CAIN B,"Q ; Q -- don't output at all (debugging) + TRO FLAGS,QUIET + CAIN B,"R ; R -- this player is a robot + TRO FLAGS,ROBBY + CAIN B,"C ; C -- evade usage restrictions + TRO FLAGS,CHEAT +IFN STATS,[ + CAIN B,"S ; S -- Spy statistics + TRO FLAGS,SPYSTA +] + JRST COMRED ; loop to read another character + + +ISCOPN: SETZ ? SIXBIT /OPEN/ ? [.UAO,,SCRI] ? ['DSK,,0] + [SIXBIT /MAZIN/] ? [SIXBIT />/] ? SETZ MYSNAM + +OSCOPN: SETZ ? SIXBIT /OPEN/ ? [.UAO,,SCRO] ? ['DSK,,0] + [SIXBIT /MAZOUT/] ? [SIXBIT />/] ? SETZ MYSNAM + ; open ttys for initial interaction +TTYOPN: +IFN STATS,[ + TRNE FLAGS,SPYSTA + PUSHJ P,REINIT ;WRITE OUT INCRIMINATING INFO +] + .OPEN TYIC,[.UAI,,'TTY] + JSR QUIT + .OPEN TYOC,[.UAO,,'TTY] + JSR QUIT + +; output name of program and ground rules + TYPECR [MAZE.76] + +; see if legitimate to play. time must be right and user must be real +; DMS user (ie, he must have a directory) + TRNE FLAGS,CHEAT + JRST QSHARE ; don't bother, he's cheating + +; does he have a directory? open it and see + SYSCAL OPEN,[CIMM LCI ? ['DSK,,0] + [SIXBIT /.FILE./] ? [SIXBIT /(DIR)/] ? MYNAME] + SKIPA + JRST TIMCHK + +; doesn't have a directory, so he can't play + TYPECR [Sorry, MAZE is not available at this time.] + JSR QUIT ; leave game + +; is it night or weekend? if not, can't play +TIMCHK: .CLOSE LCI, ; close channel open to dir + .RLPDT A, + LDB C,[320300,,B] ; get day of week + CAIE C,0 ; skip if sunday + CAIN C,6 ; don't skip if saturday + JRST QSHARE ; you can play! you lucky devil + +; its not weekend, but maybe its night time + .RTIME A, ; what time is it? + CAML A,[SIXBIT /080000/] ; before 8am? + CAML A,[SIXBIT /200000/] ; after 8pm? + JRST QSHARE ; he can play, by god! + +; time of day is wrong + TYPECR [Sorry, you cannot play MAZE during the day, come back later.] + JSR QUIT ; die horribly + ; This stuff needs to be $G'd before PDUMP'ing so that +; the mapping from file will happen correctly, and so there will be an +; imlac program available... +%CBLOK==2000 ;not defined in MIDAS yet +INIT: MOVEI P,PDL +; SYSCAL CORBLK,[CIMM %CBPRV ? [-1] ? CIMM PPAG] +; .VALUE +; SYSCAL CORBLK,[CIMM %CBNDW ? [-1] ? CIMM IPAG] +; .VALUE + .OPEN TYIC,[.UAI,,'TTY] + .VALUE + .OPEN TYOC,[.UAO,,'TTY] + .VALUE + TYPECR [Give filespec of IMTRANed imlac program] +INIT2: TYPE [(CR for DSK:IMLAC;M IML): ] + PUSHJ P,RCMD + PUSHJ P,SCNAME ; parse filename + DEFULT SCDEV,IMLDEV + DEFULT SCDIR,IMLDIR + DEFULT SCN1,IMLFN1 + DEFULT SCN2,IMLFN2 + +; now have filespec to pull imlac program from. Open channel + SYSCAL OPEN,[[.BII,,LCI] ? SCDEV ? SCN1 ? SCN2 ? SCDIR] + JRST [ TYPECR [Can't open file, try again.] + JRST INIT2] + SYSCAL FILLEN,[CIMM LCI ? CRTN IMLLEN] ;get length of file + .VALUE ;ugh bletch! + +; Have LCI channel ready, now read into core at IMLPAG. + MOVE C,IMLLEN ; get # wds in imlac progm + ADDI C,1777 ; round up to # pages + IDIVI C,2000 + MOVN A,C ;keep # pgs in C for later use + HRLZS A + HRRI A,IMLPAG ; now have -<# pgs>,,page # to start at. + MOVEM A,IMLPGP ; store ptr. for when freeing. + SYSCAL CORBLK,[CIMM %CBNDW ? [-1] ? A ? [%JSNEW]] ;get pgs for imlac pgm storage + .VALUE ; failed. + MOVN A,IMLLEN + HRLZS A + HRRI A,IMLPRG ; now fix up aobjn for input + .IOT LCI,A ; get pgm + .CLOSE LCI, ; won, close it. + + MOVE A,[COMMND,,COMMND+1] ; zero command buffer before + SETZM COMMND ; dumping. + BLT A,COMMND+COMLNG-1 + + ; at this point should have finished all mods to core. + SYSCAL CORBLK,[CIMM %CBPRV+%CBNDW+%CBLOK ? [-1] ? CIMM 0] ;ensure locked + .VALUE + MOVEI A,FFIPAG + CAIL A,IPAG ;if page 1 isn't used, + JRST INIT4 + SYSCAL CORBLK,[CIMM 0 ? [-1] ? CIMM FFIPAG] ;then flush it. + .VALUE +INIT4: SYSCAL CORBLK,[CIMM %CBNDW+%CBPUB+%CBLOK ; make page 2 global impure. + [-1] ? CIMM IPAG] + .VALUE + + ; Now form aobjn for call to purify all global pure pages. + MOVE A,C ; find # pgs used for imlac pgm storage + ADDI A,IMLPAG ; get page # of first non-pure + SUBI A,PPAG ; find # of pages to purify + MOVNS A,A + HRLZS A + HRRI A,PPAG + SYSCAL CORBLK,[CIMM %CBPRV+%CBLOK ? [-1] ? A] ; make pages private & locked + .VALUE ; (OK since only 3 or so) + + TYPECR [Mapping done, now dump.] + .VALUE [ASCIZ /:PDUMP /] + .VALUE [ASCIZ /:KILL /] ;in case he tries to $P + + +; free the pages occupied by resident imlac program. +IMLPGF: PUSH P,A + SKIPL A,IMLPGP ; get the AOBJN page ptr + JRST POPAJ + SYSCAL CORBLK,[CIMM 0 ? [-1] ? A] ;flush them! + JSR QUIT + SETZM IMLLEN + SETZM IMLPGP ; clear all indicators to existence of page +POPAJ: POP P,A + POPJ P, + ; set up sharing properly -- all MAZEs have same high segment +; automagically, but they manually share page 2, where all the goodies +; are + +; get sharer of my first high-seg page, if any +QSHARE: SYSCAL CORTYP,[CIMM PPAG ? CRTN A ? CRTN B] ; find out state of high seg page + JSR QUIT ; call failed, die + MOVEM B,FIRST ; save result for later misuse + JUMPG B,GETHIM ; if >0, is job number of sharer + +; result was -1, therefore we are first one up -- make page 2 writeable, +; shared, and locked. + SYSCAL CORBLK,[CIMM %CBNDW+%CBPUB+%CBLOK ? [-1] ? CIMM IPAG] + JSR QUIT ; failed, die + +; now tell him he is winner, ask if wants special maze + TYPECR [You are the first rat in - specify maze file to use] + TYPE [(CR for standard maze):] +ASKMAZ: PUSHJ P,RCMD ; read command line + PUSHJ P,SCNAME ; parse it + +; hack defaults: "DSK:IMLAC;xxxxx MAZE" + SKIPN SCN1 + JRST START2 ; if no fn1 given, use default (assembled)maze. + DEFULT SCDEV,MAZDEV + DEFULT SCDIR,MAZDIR + DEFULT SCN2,MAZFN2 + PUSHJ P,GETMAZ ; try to get it + JRST [ TYPE [Couldn't get maze, try again:] + JRST ASKMAZ] + SETOM LAMAZE ; indicate global maze set up. + JRST START2 ; now that we have hacked defaults, load + +; get global writeable page 2; all other than first up come here. +; job number of sharer we want is in B +GETHIM: TRO B,400000 ; get it bit + SYSCAL CORBLK,[CIMM %CBNDW+%CBPUB+%CBLOK + [-1] ? CIMM IPAG ? B ? CIMM IPAG] ;get it + JSR QUIT ; lost, die + +; inform loser of his state + TYPECR [You are joining a game already in progress] + JRST START2 + + +; now load console if he didn't ask you not to +; unless funny bits on, we always load the IMLAC half of the program +; if non-standard maze being used, we read that even when funny bits +; are on if we are first up, so that global copy of maze can be initialized. +; in general, maze not loaded for ROBBY (player is robot), LOADED (player +; claims to be loaded already), and QUIET (for debugging). + +; name ok? +START2: SKIPN A,QNAME ; gave his own name? + JRST STARTL + PUSHJ P,NAMEX ; skip if name is unique. + AOJA A,.-1 ; AOS it until it is. + MOVEM A,MYNAME + +; load it +STARTL: TRNE FLAGS,ROBBY\LOADED\QUIET + JRST START3 ; skip MAZE loading if requested. + TYPECR [Hang on!] + MOVEI A,60. ; wait a couple sec so he can read typeout. + .SLEEP A, + PUSHJ P,LOADER ; load the MAZE program itself + PUSHJ P,LODMAZ ; load global maze into imlac +START3: PUSHJ P,IMLPGF ; free the pages occupied by imlac prog (if it existed) + TRNE FLAGS,ROBBY ; if robot, don't open TTYs + JRST ROBOT ; and go off into special routine. + + ; open TTY for playing. + .OPEN TYIC,[.UII,,'TTY] ; normal input + JSR QUIT + TRNE FLAGS,QUIET ; skip if not quiet mode + JRST [ .OPEN TYOC,[.UAO,,'TTY] ; quiet, use "normal" ASCII + JSR QUIT + JRST JOIN] + .OPEN TYOC,[40+.UIO,,'TTY] ; super-image output. + JSR QUIT + SYSCAL TTYGET,[CIMM TYIC ; make superimage on input also. + CRTN A ? CRTN B ? CRTN C] + JSR QUIT + TLO C,2 ; set superimage input bit. + SYSCAL TTYSET,[CIMM TYIC ? A ? B ? C] + JSR QUIT + + ; Final initialization. + MOVEI TO,TTYSIZ + MOVEM TO,TTYCNT ; set count of chars in output buffer + MOVE TO,TTYPTR ; and set up ptr + .SUSET [.SMASK,,[TYIMSK]] ;enable TTY interrupt only + .SUSET [.SMSK2,,[0]] + +; start IMLAC program at 10000 + MOVEI A,30. ; sleep for half a sec. first + .SLEEP A, + .IOT TYOC,[^A] + .IOT TYOC,[^F] + .RESET TYIC, ;reset input so anything he typed before start is zapped + .SUSET [.SPICLR,,[-1]] ;and now enable input ints! + JRST JOIN + + ; ** ALTERNATE MAZE LOADING ROUTINES ** + +; start up a load -- open tty for output, start 40 loader, sleep for +; one second + +LSTART: .OPEN LCO,[40+.BIO,,'TTY] ; superimage block output + .VALUE + MOVE A,[477777,,[ASCII / /]] + .IOT LCO,A ; start console at 40. + MOVEI A,30. + .SLEEP A, + POPJ P, + +; load the maze program + +LOADER: SKIPE IMLLEN ; if no imlac prog in core, get from default file. + JRST FLOADR ; ah, pull from core. + SYSCAL OPEN,[[.BII,,LCI] ? IMLDEV ? IMLFN1 ? IMLFN2 ? IMLDIR] + JSR QUIT ; open failed, die + PUSHJ P,LSTART + PUSHJ P,LOAD + .CLOSE LCI, + .CLOSE LCO, + POPJ P, + +; given an channel (LCI) output it to the TTY + +LOAD: MOVE A,[-LODSIZ,,LODBUF] + MOVE B,A + .IOT LCI,A + MOVE C,B + MOVE B,A + HLLZS A + SUBM C,A + .IOT LCO,A + JUMPGE B,LOAD + .CLOSE LCI, + POPJ P, + + +; load maze program from our own core and flush pages. +FLOADR: PUSHJ P,LSTART + PUSHJ P,FLOAD + .CLOSE LCO, + POPJ P, + +; "fast load" or "fake load" as you wish. +FLOAD: PUSH P,A + MOVN A,IMLLEN + HRLZS A + HRRI A,IMLPRG ; make AOBJN to imtran'd file in core. + .IOT LCO,A + POP P,A + POPJ P, + + + +; load the global maze into imlac over top of dummy one. + +LODMAZ: TRNE FLAGS,ROBBY\LOADED\QUIET + POPJ P, ; don't load if flags disagree. + PUSHAE P,[A,B,C,D] + PUSHJ P,LSTART ; start the load + +; load the block loader + SYSCAL OPEN,[[.BII,,LCI] ? ['DSK,,0] + [SIXBIT /IMLAC/] ? [SIXBIT /BLKLDR/] ? [SIXBIT /IMLAC/]] + JSR QUIT + PUSHJ P,LOAD ; load it + +; fake up LODBUF by munching global maze back into maze-file format. + PUSHJ P,MSETDN + MOVE A,[440700,,LODBUF+100] + MOVEM A,OB + +; IMTRAN the loaded file and output it to imlac + MOVEI A,MAZSIZ ; count of words in block + PUSHJ P,EMIT2 +; set up address + MOVEI A,MAZBEG ; address to load block + PUSHJ P,EMIT4 +; do checksum + MOVE A,[-MAZSIZ,,LODBUF] + PUSHJ P,CHKSUM ; also does fake indirect hack + MOVE D,A ; save checksum +; output good words + MOVE C,[-MAZSIZ,,LODBUF] +DATLUP: MOVE A,(C) ; get a word + PUSHJ P,EMIT4 ; output it + AOBJN C,DATLUP ; and loop +; output checksum + MOVE A,D + PUSHJ P,EMIT4 ; output it + +; output auto-start block + MOVEI A,2 ; two words long + PUSHJ P,EMIT2 + MOVEI A,37713 ; address to load + PUSHJ P,EMIT4 + MOVEI A,113714 ; 3713/ JMP @3714 + PUSHJ P,EMIT4 + MOVEI A,101 ; 3714/ 101 + PUSHJ P,EMIT4 + MOVEI A,114015 ; checksum + PUSHJ P,EMIT4 + +; here to write out block of count and address -1, which indicates +; loading is done + SETO A, + PUSHJ P,EMIT2 ; two chars of count + SETO A, + PUSHJ P,EMIT4 ; four chars of location + +; now output the imtraned file + MOVE A,[-MAZIML,,LODBUF+100] + .IOT LCO,A + .CLOSE LCO, + +; exit from maze loader +LODMAX: POPAE P,[D,C,B,A] + POPJ P, + ; GETMAZ - pulls file defined by SCDIR, SCDEV, SCN1,SCN2 into LODBUF +;and munches into global maze format. + +GETMAZ: PUSH P,A + SYSCAL OPEN,[[.BII,,LCI] ? SCDEV ? SCN1 ? SCN2 ? SCDIR] + JRST POPAJ ; non-skip return if lose. + MOVE A,[-LODSIZ,,LODBUF] + .IOT LCI,A ; ZAP + .CLOSE LCI, + PUSHJ P,MSETUP ; convert into global format + POP P,A + AOS (P) ; skip return if win. + POPJ P, + +; given an alternate maze in LODBUF, we update the global maze in AMAZE +; in this routine. for each word, a one bit is a wall, a zero bit is a hallway. +MSETUP: PUSHAE P,[A,B,C,D] + MOVE B,[-MAZSIZ,,LODBUF] ; aobjn pointer to words + SETZ C, ; offset in AMAZE +; loop through words +MSET1: MOVEI D,100000 ; first bit + MOVE A,(B) ; get a word +; loop through bits +MSET2: SETZM AMAZE(C) ; assume zero + TDNE A,D ; is it? + SETOM AMAZE(C) ; no, make it -1 + AOS C ; move to next word of AMAZE + LSH D,-1 ; next bit mask + JUMPN D,MSET2 ; loop if mask still non-zero + AOBJN B,MSET1 ; loop for next word after mask runs out +; return + POPAE P,[D,C,B,A] + POPJ P, + +; given global maze, reverse MSETUP and form a maze-file formatted buffer +;in LODBUF. +MSETDN: PUSHAE P,[A,B,C,D] + MOVE B,[-MAZSIZ,,LODBUF] + SETZ C, +MSETD1: MOVEI D,100000 + SETZ A, +MSETD2: SKIPGE AMAZE(C) ; test cell in maze + IORI A,(D) ; -1 means filled, set bit in word. + AOJ C, ; increment offset into global maze + LSH D,-1 + JUMPN D,MSETD2 ;loop til 16-bit wd done + MOVEM A,(B) ; store wd in lodbuf + AOBJN B,MSETD1 + POPAE P,[D,C,B,A] + POPJ P, + + ; * IMTRAN UTILITY ROUTINES * + +; emit a character -- right most 4 bits of word +; A/ character +EMIT: IORI A,100 ; make it right sort of ascii + IDPB A,OB + POPJ P, + +; emit 2 characters -- right most 8 bits of word +; A/ 2 characters +EMIT2: PUSH P,B + MOVE B,A + LDB A,[040400,,B] ; get first char + PUSHJ P,EMIT ; output + LDB A,[000400,,B] ; get second char + PUSHJ P,EMIT ; output + POP P,B + POPJ P, + +; emit four characters -- rightmost 16 bits of word +; A/ four characters +EMIT4: PUSHAE P,[B,C,D] + MOVE B,A + MOVE C,[200400,,B] ; abptr + MOVNI D,4 ; count + ; loop through four chars +EMIT4L: ILDB A,C ; get it + PUSHJ P,EMIT ; output it + AOJL D,EMIT4L ; loop til done + POPAE P,[D,C,B] + POPJ P, + +; do checksum on a block +; A/ cptr to block +CHKSUM: PUSHAE P,[B,C] + MOVE B,A + SETZ A, +CHK1: MOVE C,(B) + TLZE C,20 + TRO C,100000 + ANDI C,177777 + MOVEM C,(B) + ADD A,C + CAILE A,177777 + AOS A + ANDI A,177777 + AOBJN B,CHK1 + POPAE P,[C,B] + POPJ P, + ; * COMMAND READER * + +; used to read names of files and such +RCMD: MOVE B,[440700,,COMMND] + MOVEM B,COMPTR + MOVEI C,0 +RCMD1: .IOT TYIC,A + CAIN A,177 + JRST RUB + IDPB A,B + CAML B,[350700,,COMMND+COMLNG-1] + JRST RCFUL + CAIL A,40 + AOJA C,RCMD1 +RCMDX: MOVEI A,0 + IDPB A,B + POPJ P, + +RCFUL: MOVEI A,15 + IDPB A,B + JRST RCMDX + +RUB: SOJL C,RCMD + LDB A,B + .IOT TYOC,A + ADD B,[070000,,] + TLNE B,400000 + ADD B,[347777,,-1] + JRST RCMD1 + +; * PARSE A FILE SPEC READ IN * + +SCNAME: SETZM SCN1 + SETZM SCN2 + SETZM SCDEV + SETZM SCDIR + MOVSI C,-4 +SCNGET: PUSHJ P,GETSYL + CAIN A,': + MOVEM B,SCDEV + CAIN A,'; + MOVEM B,SCDIR + JUMPG A,SCNGET + MOVEM B,SCN1(C) + JUMPL A,SCNX + AOBJN C,SCNGET +SCNX: popj p, + SKIPE A,SCDEV + HLRM A,(D) + SKIPE A,SCN1 + MOVEM A,1(D) + SKIPE A,SCN2 + MOVEM A,2(D) + SKIPN SCDIR + POPJ P, + MOVE A,SCDIR + MOVEM A,3(D) + POPJ P, + ; * parse a syllable from a command line * + +GETSYL: PUSH P,[0] + MOVE B,[440600,,(P)] +GETSLP: PUSHJ P,GETCCA + JUMPE A,GETSX ; no char + CAIN A, + JRST GETQOT + SUBI A,40 + JUMPL A,GETSX + JUMPE A,GETSP + CAIE A,': + CAIN A,'; + JRST GETSX +GETSPT: CAIL A,100 + SUBI A,40 + TLNE B,770000 + IDPB A,B + JRST GETSLP +GETQOT: PUSHJ P,GETCCA + SUBI A,40 + JUMPGE A,GETSPT + JRST GETSX +GETSP: TLNE B,400000 + JRST GETSLP +GETSX: POP P,B + POPJ P, + +; * get a character from command line * +GETCCA: ILDB A,COMPTR + JUMPE A,GETZER + CAIE A,14 + CAIN A,12 + JRST GETCCA + CAIE A,15 + POPJ P, +GETZER: PUSH P,COMPTR + SETZ T, + IDPB T,COMPTR + POP P,COMPTR + POPJ P, + +NAMRED: PUSH P,B + PUSH P,C + SETZ B, + MOVE C,[440600,,B] +NAMRLP: ILDB T,A + CAIL T,40 + CAIN T,"" + JRST NAMEND + CAIGE T,100 + JRST .+3 + SUBI T,40 + JRST .-3 + IDPB T,C + JRST NAMRLP +NAMEND: SKIPE B + MOVEM B,QNAME + POP P,C + POP P,B + POPJ P, + +NAMEX: PUSH P,B + MOVE B,IDSPTR + ADDI B,IOFF + CAMN A,(B) + JRST NAMEXX + AOBJN B,.-2 + AOS -1(P) +NAMEXX: POP P,B + POPJ P, + +IFN STATS,[ +REINIT: PUSHAE P,[A,B,C,D] +REC1: SYSCAL OPEN,[[100000+.BIO,,LCI] ;WRITEOVER MODE + ['DSK,,0] ? [SIXBIT /.TTYS_/] + [SIXBIT /LOADED/] ? [SIXBIT /IMLAC/]] + JRST TRYAGN + SYSCAL FILLEN,[CIMM LCI ? CRTN A] + JRST ENDREC + SYSCAL ACCESS,[CIMM LCI ? A] + JFCL + MOVE D,[440700,,OUTBUF] + .SUSET [.RUNAM,,A] + MOVE C,A + PUSHJ P,OUTSIX + MOVE A,[SIXBIT / /] + PUSHJ P,OUTSIX + .RDATI A, + PUSHJ P,OUTSIX + MOVE A,[SIXBIT / /] + PUSHJ P,OUTSIX + MOVE A,B + PUSHJ P,OUTSIX + MOVE A,[ASCII / +/] + MOVEM A,OUTBUF+6 + MOVE A,[-7,,OUTBUF] + .IOT LCI,A +ENDREC: .CLOSE LCI, + POPAE P,[D,C,B,A] + POPJ P, + +TRYAGN: SYSCAL OPEN,[[.BIO,,LCI] ? ['DSK,,0] ;TRY NON-WRITEOVER + [SIXBIT /.TTYS_/] ? [SIXBIT /LOADED/] + [SIXBIT /IMLAC/]] + JRST ENDREC + .CLOSE LCI, + JRST REC1 + +OUTSIX: PUSH P,B + MOVE B,[440600,,A] + ILDB T,B + ADDI T,40 + IDPB T,D + CAME B,[600,,A] + JRST .-4 + POP P,B + POPJ P, +] +CONSTANTS +VARIABLES + + +; See IMLLEN and IMLPGP and INIT and FLOADR for details of imlac-program residence. +IMLPAG==<.+1777>/2000 ; page # where imlac program gets stored in core + ; (force to page boundary) +IMLPRG==IMLPAG*2000 ; corresponding address + + END START + \ No newline at end of file diff --git a/src/klh/mazwar.44 b/src/klh/mazwar.44 new file mode 100644 index 00000000..24579226 --- /dev/null +++ b/src/klh/mazwar.44 @@ -0,0 +1,3183 @@ +TITLE MAZE.3 GREG THOMPSON (GAT) 04/11/74 +; +; DEFINE IMLAC INSTRUCTION SET +; +.INSRT IMSRC;IMDEFS > +; +; INSTRUCTIONS TO GAME +; +; MAZE +; +; Maze is a experiment in 3 dimensional graphics and intertask +; teleconferencing. It is a hunt and seek game that can involve up to +; eight Imlacs. The Imlac user is placed in a 16 by 32 square maze and +; attempts to hunt down and destroy the other inhabitents of the maze (the +; other Imlac users) before they do the same to him. Each player is +; represented by his uname (1 through 8 characters) as he moves through the +; maze. The various keys that are used to move through the maze and to +; fire are described below. +; +; UP ARROW - Move forward 1 square. +; DOWN ARROW - Back up one square. +; LEFT ARROW - Turn 90 degrees to the left. +; RIGHT ARROW- Turn 90 degrees to the right. +; FUNCTION 4 - Turn 180 degrees around. +; PAGE XMIT - Peek around the corner to the left. +; XMIT - Peek around the corner to the right. +; ESC - Fire. +; CTRL -Z - Exit maze program. +; FORM - Erase dispay buffer. +; FUNCTION 7 - Look at maze from top. +; +; The player enters the maze by typing MAZE to monit or MAZE^k to +; DDT, while at an imlac. The screen will be blank for a minute or two +; while the imlac side of the maze program is loaded after which the player +; is placed in to the maze along with any other players. A letter on the +; top of the screen indicates the direction you are currently facing. The +; unames of the other players are listed on the sides followed their score +; and the number of times they were shot. Anytime a player is shot the +; bell will ring and an "!" will be placed next to the shooting players +; score and an "*" will be placed next to the number of times shot counter +; of the player that was just shot. Holding down the up or down arrow keys +; will cause them to repeat. After a shot is fired the player who is being +; shot at has two seconds to get out of view of the position that the +; shooting player was at at the time he fired the shot. All other +; characters typed are placed in a display buffer at the bottom of all the +; imlac's screen. Holding the Function-7 (or TAB as the case my be) will +; allow you to view your position in the maze from the top. +; The 3 buttons on the mouse and the 5 keyset buttons may be used as +; controls and have the following functions, starting from the left of the +; mouse; peek left, fire, peek right, turn around, turn left, move +; forward, turn right, and move backwards. +; Users may specify their own mazes if they are the first player in a +; maze by giving a file name after "maze to use: ". Just a CR will default +; to the standard maze. User mazes must have a specific format if they are +; to be able to work. They must begin with a LOC 10020 followed by the label +; MAZE: on the first of 32. octal words which form a bit map for the +; maze. The maze must end with LOC 17713, JMP@ .+1, 101, and an END. +; After assembling the maze must be imtraned by using the "IMTRAN" command. +; A muddle function exists for printing out formated source mazes. It is +; initiated by floading "imlac;maze print" in muddle and then issuing +; $ where the output file +; spec defaults to the TTY. An example of a formated source maze is given +; below: +; +; +;.INSRT IMSRC;IMDEFS > +; +; LOC 10020' +; +; MAZE: 177777 ; HERE IS THE 32 WORD MAZE. +; 106401 ; NO FOUR SQUARES MAY BE EMPTY. +; 124675 ; AND SHARE A COMMON CORNER. +; 121205 ; ALL OUTSIDE WALLS MUST BE FILLED IN. +; 132055 ; THIS IS THE DEFAULT MAZE. +; 122741 +; 106415 +; 124161 +; 121405 +; 135775 +; 101005 +; 135365 +; 121205 +; 127261 +; 120205 +; 106765 +; 124405 +; 166575 +; 122005 +; 107735 +; 120001 +; 135575 +; 105005 +; 125365 +; 125225 +; 121265 +; 105005 +; 135375 +; 100201 +; 135675 +; 110041 +; 177777 +; +; END 101' ; AUTO START BACK INTO CONSOLE PROGRAM + + +; Players start in random loctions. + +; The current default maze is: +; +; N O R T H +; +; +; $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ +; $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ +; $$$ $$$$$$ $$$ $$$ +; $$$ $$$$$$ $$$ $$$ +; $$$ $$$ $$$ $$$$$$ $$$$$$$$$$$$ $$$ +; $$$ $$$ $$$ $$$$$$ $$$$$$$$$$$$ $$$ +; $$$ $$$ $$$ $$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$ $$$ +; $$$ $$$$$$ $$$ $$$ $$$$$$ $$$ +; $$$ $$$$$$ $$$ $$$ $$$$$$ $$$ +; $$$ $$$ $$$ $$$$$$$$$$$$ $$$ +; $$$ $$$ $$$ $$$$$$$$$$$$ $$$ +; $$$ $$$$$$ $$$ $$$$$$ $$$ +; $$$ $$$$$$ $$$ $$$$$$ $$$ +; $$$ $$$ $$$ $$$$$$$$$ $$$ +; $$$ $$$ $$$ $$$$$$$$$ $$$ +; $$$ $$$ $$$$$$ $$$ $$$ +; $$$ $$$ $$$$$$ $$$ $$$ +; $$$ $$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$ $$$ +; $$$ $$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$ $$$ +; $$$ $$$ $$$ $$$ +; $$$ $$$ $$$ $$$ +; $$$ $$$$$$$$$ $$$ $$$$$$$$$$$$ $$$ $$$ +; $$$ $$$$$$$$$ $$$ $$$$$$$$$$$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$ $$$ +; W $$$ $$$ $$$$$$$$$ $$$ $$$$$$ $$$ E +; $$$ $$$ $$$$$$$$$ $$$ $$$$$$ $$$ +; E $$$ $$$ $$$ $$$ $$$ A +; $$$ $$$ $$$ $$$ $$$ +; S $$$ $$$$$$ $$$$$$$$$$$$$$$ $$$ $$$ S +; $$$ $$$$$$ $$$$$$$$$$$$$$$ $$$ $$$ +; T $$$ $$$ $$$ $$$ $$$ $$$ T +; $$$ $$$ $$$ $$$ $$$ $$$ +; $$$$$$$$$ $$$$$$ $$$ $$$$$$$$$$$$$$$ $$$ +; $$$$$$$$$ $$$$$$ $$$ $$$$$$$$$$$$$$$ $$$ +; $$$ $$$ $$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$ +; $$$ $$$$$$$$$$$$$$$$$$ $$$$$$$$$ $$$ +; $$$ $$$$$$$$$$$$$$$$$$ $$$$$$$$$ $$$ +; $$$ $$$ $$$ +; $$$ $$$ $$$ +; $$$ $$$$$$$$$ $$$$$$ $$$$$$$$$$$$$$$ $$$ +; $$$ $$$$$$$$$ $$$$$$ $$$$$$$$$$$$$$$ $$$ +; $$$ $$$ $$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$$$$$$$$$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$$$$$$$$$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$ $$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$ $$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$$$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$$$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$ +; $$$ $$$$$$$$$ $$$ $$$$$$$$$$$$$$$$$$ $$$ +; $$$ $$$$$$$$$ $$$ $$$$$$$$$$$$$$$$$$ $$$ +; $$$ $$$ $$$ +; $$$ $$$ $$$ +; $$$ $$$$$$$$$ $$$$$$$$$ $$$$$$$$$$$$ $$$ +; $$$ $$$$$$$$$ $$$$$$$$$ $$$$$$$$$$$$ $$$ +; $$$ $$$ $$$ $$$ +; $$$ $$$ $$$ $$$ +; $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ +; $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ +; +; +; S O U T H + +; MAZE PROTOCOL: MESSAGES ARE SENT TO ALL OTHER IMLACS +; DO NOT SEND TO ORIGINATING IMLAC +; +; 001 -- PLAYER LEAVES GAME +; +; +; 002 -- PLAYER MOVED +; +; +; +; +; +; 003 -- PLAYER DIED +; +; +; +; 004 -- ANNOUNCE NEW PLAYER +; +; <6 CHARS OF ID NAME> +; <2 CHAR # OF HITS WITH 100 BIT ON> (HIGH ORDER 6 BITS THEN LOW ORDER 6 BITS) +; <2 CHAR # OF DEATHS WITH 100 BIT ON> +; +; 014 -- ERASE DISPLAY RING BUFFER +; +; +; IDS MUST BE >= 1 AND <= 8. +; +; ALL INCOMING MESSAGES ARE CHECKED FOR LEGALITY. BAD MESSAGES ARE FLUSHED. +; A NUMBER IN THE STATUS LINE INDICATES THE NUMBER OF BAD MESSAGES RECIEVED. +; INFORMATION CONCERNING THE LAST BAD MESSAGE RECIEVED IS SAVED FOR LATER EVALUATION. +; +; ALL CHARACTERS SUBROUTINES AND THE DJMS TABLE IS UP IN THE CONSOLE PROGRAM (SSV). +; THE DJMS TABLE IS ACCESSED THROUGH LOCATION 24 OCTAL WHICH STARTS WITH THE ENTRY +; FOR OCTAL CODE 40 (SPACE). +; +; ANY CHARACTERS TYPED ON CONSOLE (>014') ARE SENT TO PDP-10 AND SHOULD +; BE ECHOED TO ALL! CONSOLES INCLUDING THE ORIGINATOR. +; +; ANY OTHER CHARACTERS RECEIVED BY IMLAC ARE DISPLAYED IN A +; RING BUFFER AT THE BOTTOM OF THE PICTURE. +; +; THE FIRST ANNOUNCE NEW PLAYER MESSAGE THE IMLAC RECIEVES DEFINES ITS ID. +; +; THIS VERSION REQUIRES A GRAPHICS IMLAC WITH LONG VECTOR HARDWARE +; MULTI-LEVEL SUBROUTINING, AND 8K DISPLAY ADDRESSING MOD. +; +; THE MESSAGE SWITCHING PROGRAM ON THE 10 MUST ALSO KEEP TRACK +; OF THE CURRENT SCORES OF ALL THE PLAYERS SO WHEN A NEW PLAYER +; JOINS INTO A ALREADY EXISTING GAME HE MAY RECIEVE THE CURRECT +; SCORES OF ALL THE PLAYERS. +; +; WHEN AN IMLAC WANTS TO JOIN AN EXISTING MAZE THE FOLLOWING OCCURS: +; 1) THE MAZE PROGRAM IS LOADED INTO HIS IMLAC. +; 2) THE CURRENT MAZE IS LOADED ON TOP OF THE DEFAULT MAZE +; IF THE DEFAULT MAZE IS NOT BEING USED. +; 3) A TYPE 4 MESSAGE IS SENT TO ALL IMLACS ANOUNCING THE +; NEW IMLAC. THE NEW IMLAC GETS HIS ID FROM THIS MESSAGE. +; 4) TYPE 4 MESSAGES FOR ALL THE OTHER PLAYERS ARE SENT TO +; THE NEW IMLAC. +; +; +; WRITTEN BY: +; +; STEVE COLLEY CAL TECH ORIGINAL IDEA OF MAZE, STAND-ALONE MAZE +; & CRUDE MULTIPLE PLAYERS +; GREG THOMPSON M.I.T. FULL MULTIPLE PLAYERS ADDITIONS +; P. D. LEBLING M.I.T. PDP-10 MESSAGE SWITCHER AND ROBOTS +; HOWARD PALMER STANFORD ORIGINAL IDEA & STAND-ALONE VERSION OF MAZE +; +; further munged by KLH/CBF for fast new protocol. + +EXPUNGE MOVE,PTR,EXP ; To keep midas from barfing "RES" at use of these syms in prg. +FAST==1 ; to assemble fast-protocol version. +cheat==0 ;conditional to assemble cheater stuffs + +.mllit==1 + + LOC 10000' + +RADIX 8. +.ADDR.=1 + + JMP START ; STARTING POINT + JMP RESTART ; RESTARTING ENTRY POINT + JMP LEAVE ; ENTRY TO RETURN TO SSV (ON ERROR) + JMP RETN ; REENTER MAZE MAIN LOOP + + LOC 10020' + +MAZE: 177777 ; HERE IS THE 32 WORD MAZE + 106401 ; NO FOUR SQUARES MAY BE EMPTY + 124675 ; AND SHARE A COMMON CORNER + 121205 ; ALL OUTSIDE WALLS MUST BE FILLED IN + 132055 + 122741 + 106415 + 124161 + 121405 + 135775 + 101005 + 135365 + 121205 + 127261 + 120205 + 106765 + 124405 + 166575 + 122005 + 107735 + 120001 + 135575 + 105005 + 125365 + 125225 + 121265 + 105005 + 135375 + 100201 + 135675 + 110041 + 177777 + +; DSTAT, DX, DY, DIR IS MY POSITION AND POINT INTO INFO TABLE + +DSTAT: 0 ; STATUS FLAG +DX: 0 ; X POSITION OF THIS IMLAC +DY: 0 ; Y POSITION OF THIS IMLAC + ; START OUT BIG SO WE WON'T SHOW UP ON MAP +DIR: 0 ; DIRECTION HE IS POINTING + ; BITS 14 AND 15 HAVE MEANING + ; BIT 14 BIT 15 + ; 0 0 NORTH + ; 0 1 EAST + ; 1 0 SOUTH + ; 1 1 WEST +DPTR=10' ; INDEX LOC 10 USED AS POINTER +VISPT=11' +VISPT2=12' +VISPT3=13' +VISPT4=14' +VISPT5=15' + ; INDEX LOCATION 16' AND 17' USED BY INTERUPT ROUTINE +NEXTBIT:0 +ETEM: 0 +WPTR: 0 +WPTR2: 0 +CNT: 0 ; COUNTERS +CNT2: 0 +KILL: 0 ; LAST PLAYER KILLED BY THIS IMLAC +PTR4: 0 ; POINTERS +PTR3: 0 +PTR2: 0 +PTR: 0 +XDELTA: 0 +YDELTA: 0 +BEAMBIT:0 +LASTRIG:0 +LASTLEF:0 +HALLNGTH:0 +MYREAL: 0 ; THE REAL ID OF THIS IMLAC +MYBIT: 0 ; THE ID OF THIS IMLAC +mybit1: 0 ; MYBIT-1 (normalize to 0-7) +IID: 0 ; TEMPORARY IMLAC ID USED FOR SEE ROUTINE +MPTR: 0 +BIT: 0 +KEY: 0 ; LAST KEY READ IN +HOME: 1372' ; CTRL Z [EXITS PROGRAM] +BACKUP: 204' ; DOWN ARROW (BACKUP ONE SQUARE) +RTURN: 205' ; RIGHT ARROW (TURN 90 DEGREES RIGHT) +MOVE: 206' ; UP ARROW (MOVE FORWARD ONE SQUARE) +LTURN: 210' ; LEFT ARROW (TURN 90 DEGREES LEFT) +TURNA: 234' ; FUNCTION 4 (TURN 180 DEGREES AROUND) +TEM1: 0 ; TEMPORARYS +TEM2: 0 +TEM3: 0 +PEEKR: 202' ; XMIT (PEEK TO THE RIGHT) +FIRE: 233' ; ESC (FIRE) +PEEKL: 216' ; PAGE XMIT (PEEK TO THE LEFT) +ERING: 214' ; FORM (ERASE RING BUFFER) +TOPVW: 211' ; TAB (GET A TOP VIEW OF MAZE) +KEYSET: 0 ; LAST VALUE FROM KEYSET +KSCNT: 0 ; KEYSET REPEAT COUNTER +TOPSW: -1 ; INDICATES WHETHER A TOP OR INSIDE VIEW +ifn fast,[ +relcnt: 0 ;counter of rel positions between abs +] + SUBTTL Start of game + +; START OF GAME + +START: IOF ; DISABLE ANY INTERUPTS + CLA + DAC ICNT ; SET NO MESSAGE PENDING + DAC MYBIT ; INDICATE WE HAVE NO ID + MSW ; SET INITIAL KEYSET VALUE + DAC KEYSET + LAC [7776'] ; LIMIT SSV'S DISPLAY LIST + DAC@ [25'] + JMS ERASE ; RESET RING BUFFER + LAC [MESAGE-1] ; SET UP YOU WERE SHOT MESSAGE + DAC 11' + LAC [YWSB-1] + DAC 12' + LWC 17. + DAC CNT2 +SETUPN: LAC@ 12' + JMS GETCHR + DAC@ 11' + ISZ CNT2 + JMP SETUPN + +; NOW WAIT FOR OUR ID + + JMS CHARIN + LAC MYBIT ; WAIT FOR IDENTIFIER MESSAGE TO COME IN + ASN ; HAS IT BEEN SET YET? + JMP .-3 ; NO, KEEP WAITING + STA + DAC TOPSW ; DISPLAY TOP VIEW + +; PLACE PLAYER IN MAZE + +RESTART:KCF ; RESET KEYBOARD +RESET1: JMS RANDOM + AND [17'] + DAC@ DX + JMS RANDOM + AND [37'] + DAC@ DY + JMS PNTBIT + LAC@ MPTR + AND BIT + ASZ + JMP RESET1 + JMS RANDOM + AND [3] + DAC@ DIR + LAC [AD1] ; RESET TO MAIN SCREEN + DAC WHICHD +ifn fast,[ + cla + dac relcnt ; force abs. position out first thing. +] + JMP RETN4 + +RETN2: CLA ; LOOK FROM INSIDE MAZE + DAC TOPSW +; +; SEND NEW POSITION TO 10 +; +RETN4: STA ; SET TO PLAYING STATUS + DAC@ DSTAT + JMS PRINT ; BUILD CURRENT DISPLAY +ife fast,[ + jms absmsg ; send out absolute position + jmp retn +] +ifn fast,[ + lac relcnt + asm ; if GE 0, something wants an abs pos sent out. + jms absmsg ; sigh, send absolute + jmp retn ; and continue + + +relmsg: 0 + ior mybit1 + jms send1 + isz relcnt + nop + jmp@ relmsg + +] ;end of ifn fast + +; Send new absolute position +absmsg: 0 +ifn fast,[ + lwc 20 ;number of rel messages before an abs + dac relcnt ;set counter +] + LAW 2 ; SEND MOVED MESSAGE CODE + JMS SEND1 + LAC MYBIT ; SEND MY ID + JMS SEND1 + LAC@ DIR ; SEND NEW DIRECTION + AND [3] ; SEND ONLY LOWER 2 BITS! + IOR [100'] + JMS SEND1 + LAC@ DX ; SEND NEW X LOCATION + IOR [100'] + JMS SEND1 + LAC@ DY ; SEND NEW Y LOCATION + IOR [100'] + JMS SEND1 + jmp@ absmsg ;return + SUBTTL Main Loop +; MAIN LOOP + +RETN: JMS CHARIN ; GET STUFF FROM TEN + JMS DISP ; MAINTAIN DISPLAY +RETN3: KSF ; NO, IS THERE A KEY DOWN? + JMP KSCHK ; NO, NOW CHECK KEYSET + CAL ; YES, READ THE KEY + KRC + DAC KEY + LWC 8. ; SET UP TO REPT KEY (TIME BEFORE START REPEATING) + DAC REPTCNT +REPT: LAC KEY +KEYREPT:SAM HOME ; IS IT CTRL-Z? + JMP KEYCHK + LAC MYBIT ; REMOVE ME FROM MAZE + DAC ININFO + JMP GONER + +; CHECK KEYSET + +KSCHK: CLA + MSW + SAM KEYSET ; HAS IT CHANGED? + JMP .+2 ; YES, SO DO SOMETHING ABOUT IT + JMP RETN ; NO, RE-ENTER MAIN LOOP + DAC KEYSET ; SAVE NEW VALUE + LWC 15. ; SET UP TO REPEAT + DAC KSCNT +KSREPT: LAC [BACKUP] ; NOW FIGURE WHICH KEY TO SIMULATE + DAC PTR + LAC KEYSET + IOR [174340'] ; TURN ON BITS TO IGNORE + CMA\CLL + ASN + JMP RETN + RAR 1 + LSZ + JMP GOTIT + XAM PTR + IAC + XAM PTR + JMP .-6 +GOTIT: LAC@ PTR ; GET APPROPRIATE KEY + DAC KEY + JMP KEYREPT + +; SEE IF WE ARE BLOWING UP + +KEYCHK: LAC BIGEXP ; IF SO THEN IGNORE KEYS + ASZ + JMP RETN ; YES, SO WAIT IT OUT + +; CHECK FOR VARIOUS KEYBOARD COMMANDS + +KEY1: LAC KEY + SAM RTURN ; TURN RIGHT? + JMP KEY2 + ISZ@ DIR + NOP +ifn fast,[ + lac [20'] ; new protocol for right turn + jms relmsg +] + JMP RETN2 +KEY2: SAM LTURN ; LEFT TURN? + JMP KEY3 + LAC@ DIR + SUB [1] + DAC@ DIR +ifn fast,[ + lac [30'] ; new protocol for left turn + jms relmsg +] + JMP RETN2 +KEY3: SAM MOVE ; MOVE FORWARD? + JMP KEY4 + JMS MOVER + JMP RETN +ifn fast,[ + lac [150'] ; new protocol for move forward + jms relmsg +] + JMP RETN2 +KEY4: SAM PEEKL ; PEEK LEFT? + JMP KEY5 + JMS MOVER + JMP RETN + LAC@ DIR + SUB [1] + DAC@ DIR + JMS HOLD + LAC@ DIR + SUB [1] + DAC@ DIR +PEEKER: JMS MOVER + JMP RETN + JMS ADIR2 + JMP RETN2 +KEY5: SAM PEEKR ; PEEK RIGHT? + JMP KEY6 + JMS MOVER + JMP RETN + ISZ@ DIR + NOP + JMS HOLD + ISZ@ DIR + NOP + JMP PEEKER +KEY6: SAM TURNA ; TURN AROUND? + JMP KEY7 + JMS ADIR2 +ifn fast,[ + lac [140'] ; new protocol for turn-around + jms relmsg +] + JMP RETN2 +KEY7: SAM BACKUP ; BACK UP? + JMP KEY8 + JMS ADIR2 + JMS MOVER + JMP key7np + JMS ADIR2 +ifn fast,[ + lac [160'] ; new protocol for move backwards. + jms relmsg +] + JMP RETN2 +key7np: JMS ADIR2 ; Can't move backwards, restore direction. + JMP RETN + +ADIR2: 0 + LAC@ DIR + ADD [2] + DAC@ DIR + JMP@ ADIR2 + +KEY8: SAM FIRE ; FIRE? + JMP KEY9 + +; LOOK FOR VISIBLE OPPONENT TO SHOOT AT + + LAC [THING+4] ; SET DISPLAY LIST POINTER + DAC PTR + LWC 8. ; 8 POSSIBLE IMLACS + DAC CNT2 + LAC [IM1+4] ; SET INFO TABLE POINTER + DAC VISPT + IAC + DAC PTR2 +CHKNEXT:LAC@ PTR ; GET DISPLAY BODY + SAM [DNOP] ; IS HE VISIBLE? + JMP NOTDNOP +NOTHIM: LAC VISPT ; NO, BUMP POINTERS TO NEXT PLAYER + ADD [11.] +BUMPTRS:DAC VISPT + IAC + DAC PTR2 + LAC PTR + ADD [6] + DAC PTR + ISZ CNT2 ; DID WE CHECK THEM ALL + JMP CHKNEXT ; NO + JMP RETN ; YES, RETURN +NOTDNOP:SAM JMSEXP ; COULD HE ALREADY BE EXPLODING? + JMP FOUNONE ; NO, SO WE FOUND A OPPONENT TO SHOOT AT + JMP NOTHIM ; YES, SO DON'T FIRE AT HIM +FOUNONE:LAC@ PTR2 ; ARE WE ALREADY FIRING ON THIS GUY? + ASZ ; IF SO THEN DON'T FIRE AGAIN + JMP NOTHIM + LWC 80. ; SET 2 SECOND DELAY TO ALLOW PLAYER TO DODGE IT + DAC@ VISPT + LAC@ DIR + DAC@ VISPT + LAC@ DX ; SAVE OUR LOCATION + DAC@ VISPT + LAC@ DY + DAC@ VISPT + LAC VISPT ; NOW CHECK NEXT PLAYER + ADD [7] + JMP BUMPTRS +; +; DOES HE WANT SCREEN ERASED? +; +KEY9: SAM ERING + JMP VIEWTOP ; NO + JMS ERASE ; YES, SO ERASE IT + JMP RETN ; THEN RETURN TO MAIN LOOP +; +; +; LOOK AT MAZE FROM TOP +; +VIEWTOP:SAM TOPVW ; LOOK AT MAZE FROM TOP? +ife cheat, jmp sendit +ifn cheat, JMP CHNGP + STA ; YES, SET FLAG FOR TOP VIEW + DAC TOPSW + JMS PRINT ; AND BUILD DISPLAY +VTWAIT: JMS CHARIN + JMS DISP + CAL + KRB + SAM TOPVW ; DISPLAY TOP VIEW AS LONG + JMP .+2 ; AS KEY IS HELD DOWN + JMP VTWAIT + CLA ; LOOK INSIDE AGAIN + DAC TOPSW + JMS PRINT + JMP RETN + +ifn cheat,[ +; +; SECRET ID SWITCHING KEYS +; +; CTRL-REPT 0 TO : +; 0 RETURN TO ORIGINAL ID +; N CHANGES TO ID N +; : COMPLEMENT FORWARD SQUARE +; +CHNGP: SUB [3260'] + ASP + JMP SENDIT + SAM [10.] ; CTRL-REPT : ? + JMP .+2 ; NO + JMP ZAP ; YES + ASN ; CTRL-REPEAT 0? + LAC MYREAL ; IF SO GET MY REAL ID + SUB [9.] + ASM + JMP RETN + ADD [9.] + DAC TEM1 + SAL 3 + ADD [IML1-8.] ; SEE IF THIS PLAYER IS PLAYING + DAC TEM2 ; BY SEEING IF HIS NAME EXISTS + LAC [DJMS D040,] + SAM@ TEM2 + JMP .+2 + JMP RETN + LAC TEM1 + JMS GETD ; CHANGE US TO NEW ID + JMS PRINT ; DISPLAY NEW VIEW + JMP RETN +ZAP: JMS MOV ; SET UP PTRS TO NEXT SQUARE + LAC@ MPTR ; NOW FLIP BIT + XOR BIT + DAC@ MPTR + JMS PRINT ; REBUILD DISPLAY + JMP RETN +] ;end of ifn cheat. + +; SEND OTHER CHARACTERS TO 10 +; +SENDIT: +ifn cheat, ADD [3260'] + AND [177'] + SAM [15'] ; CR? + JMP .+2 + JMP SENDOK + SUB [40'] ; CONTROL CODE? + ASP + JMP RETN ; YES, SO IGNORE IT + sub [100'] ;it's a 40-177 char, see if it's 140-177 + asp + add [40'] ;no, it's 40-137, get char back. + add [100'] ;yes, 140-177. make it uppercase. + +SENDOK: JMS SEND1 ; NOW SEND IT TO 10. char is either 40-137 or 15. + JMP RETN +; +; HOLD A POSITION FOR AS LONG AS THE SAME KEY IS HELD DOWN +; +HOLD: 0 + JMS PRINT ; UPDATE DISPLAY +HOLD1: JMS CHARIN ; GET STUFF FROM TEN + JMS DISP ; MAINTAIN DISPLAY + CAL + KRB + SAM KEY ; IS THE SAME KEY DOWN? + JMP TSTKS ; NO, TEST KEY SET FOR KEY STILL DOWN + JMP HOLD1 ; YES, HOLD THIS LOCATION +TSTKS: CLA + MSW + ASN ; DO WE HAVE THE HARDWARE? + JMP@ HOLD ; NO, JUST RETURN + AND [2400'] ; IF EITHER PEEK LEFT OR RIGHT STILL + XOR [2400'] + ASZ ; DOWN THEN HOLD POSITION + JMP HOLD1 + JMP@ HOLD ; RETURN +; +; POINT MPTR TO APPROPRIATE WORD MAZE (Y) +; AND BIT TO APPROPRIATE BIT IN WORD FOR OUR +; CURRENT LOCATION +; +PNTBIT: 0 + LAC [MAZE] + ADD@ DY + DAC MPTR + LAC@ DX + ASZ + JMP PNT1 + LAC [100000'] + JMP PNT2 +PNT1: CIA + DAC CNT + CLL + LAC [100000'] + RAR 1 + ISZ CNT + JMP .-2 +PNT2: DAC BIT + JMP@ PNTBIT +; +; MOVE FORWARD ONE SQUARE +; +MOV: 0 + CLA ; CLEAR OUT INCREMENTS + DAC TEM1 ; Y INCREMENT + DAC TEM2 ; X INCREMENT + JMS PNTBIT ; POSITION TO CURRENT POSITION + LAC@ DIR ; SEE WHICH DIRECTION WE ARE HEADING + AND [1] + ASZ + JMP MOVEWE + JMS CREMENT ; MOVE NORTH OR SOUTH + DAC TEM1 + ADD MPTR + DAC MPTR + JMP@ MOV ; RETURN +MOVEWE: JMS CREMENT ; MOVE WEST OR EAST + AND [20'] + IOR [RAL 1] + DAC NOPER + LAC BIT + CLL +NOPER: NOP + DAC BIT + JMS CREMENT + CIA + DAC TEM2 ; SET X INCREMENT + JMP@ MOV +MOVER: 0 + JMS MOV ; MOVE FORWARDS ONE SQUARE + LAC@ MPTR ; SEE IF IT IS A WALL + AND BIT + ASZ + JMP@ MOVER ; A OPEN SQUARE + LAC TEM2 ; UPDATE X TO THIS SQUARE + ADD@ DX + DAC@ DX + LAC TEM1 ; UPDATE Y + ADD@ DY + DAC@ DY + ISZ MOVER ; AND INDICATE WE MOVED BY SKIPPING + JMP@ MOVER +; +; RETURN 1 OR -1 ACCORDING TO WHICH DIRECTION WE ARE HEADING +; +CREMENT: 0 + LAC@ DIR + SAR 1 + AND [1] + ASN + LAC [-1] + JMP@ CREMENT + +; REFRESHING ROUTINE + +REFR: 0 + DSF + SSF + JMP@ REFR + SCF + LAC WHICHD ; GET APPROPRIATE DISPLAY LIST ADDRESS + DLA + DON + STA ; INDICATE 40 CYCLE SYNC + DAC SYNC + JMP@ REFR +WHICHD: AD1 ; CONTAINS ADDRESS OF CURRENT DISPLAY +SYNC: 0 ; 40 CYCLE SYNC FLAG +BIGEXP: 0 ; OUR EXPLOSION COUNTER +JMSEXP: DJMS EXPLOSIN +EXP: DDSP + DDSP + DDSP +INC1: DDSP +INC2: DDSP +INC3: DDSP + DRJM +EXPLOSIN:DLXA 1000 + DJMS WAIT + DSTS 3 + INC E,D03 + INC D03,100' + DJMS EXP + INC E,D00 +INC4: INC D00,D00 + INC 100',100' + DJMS EXP + INC E,D00 +INC5: INC D00,D00 +INC6: INC D00,D00 + INC 100',100' + DJMP EXP + +; KEEP DISPLAY AND TIMED OCCURANCES RUNNING +; +DISP: 0 + JMS REFR ; KEEP UP DISPLAY + LAC SYNC ; HAS THE 40 CYCLE SYNC OCCURED YET? + ASM + JMP@ DISP ; NO, JUST RETURN + CLA ; YES, RESET IT + DAC SYNC +; +; CHECK FOR OUR BLOWING UP +; + LAC BIGEXP ; ARE WE BLOWING UP? + ASN + JMP CHKOPP ; NO + ISZ BIGEXP ; IS IT FINSHED? + JMP UPDTBIG ; NO, UPDATE IT + JMP RESTART ; YES, NOW RESTART THE IMLAC +; +; UPDATE 4 POINTERS +; +BUMPPTS:0 + LAC VISPT2 + ADD [5] + DAC VISPT2 + LAC VISPT3 + ADD [5] + DAC VISPT3 + LAC VISPT4 + ADD [5] + DAC VISPT4 + LAC VISPT5 + ADD [5] + DAC VISPT5 + JMP@ BUMPPTS +; +; UPDATE A DLXA OR DLYA +; +UPDTSUB:0 + LAC@ VISPT2 ; GET OLD DLXA OR DLYA + ADD@ VISPT ; ADD IN INCREMENT + AND [1777'] ; MASK TO POSITION BITS + DAC TEM2 ; SAVE NEW POSITION + LAC@ VISPT3 ; GET OLD DLXA OR DLYA AGAIN + AND [30000'] ; GET DLXA OR DLYA OPCODE BIT + IOR TEM2 ; OR IN POSITION + DAC@ VISPT4 ; STORE IT BACK ON TOP OF OLD DLXA OR DLYA + JMP@ UPDTSUB ; RETURN + +; UPDATE OUR EXPLOSION ROUTINE +; +UPDTBIG:LWC 8. ; EIGHT PIECES TO UPDATE + DAC CNT ; SET COUNTER + LAC [BIGX1INC-1] ; SET POINTER TO UPDATE LIST + DAC VISPT + LAC [BIGX1-1] ; SET POINTERS TO DISPLAY LIST + DAC VISPT2 + DAC VISPT3 + DAC VISPT4 +UPDTLOOP:JMS UPDTSUB ; UPDATE X + JMS UPDTSUB ; UPDATE Y + JMS BUMPPTS ; UPDATE POINTERS + ISZ CNT ; HAVE I DONE ALL 8 BITS? + JMP UPDTLOOP ; NO, DO NEXT ONE +; YES, FALL THROUGH +; OPPONENTS EXPLOSION ROUTINE +; +CHKOPP: LAC [THING-2] ; CHECK EXPLOSION TIMERS + DAC PTR + LAC [IM1-2] + DAC PTR2 + LWC 9. + DAC CNT2 +OPPBUMP:LAC PTR + ADD [6.] + DAC PTR + LAC PTR2 + ADD [11.] + DAC PTR2 + SUB [9.] + DAC PTR3 + ISZ CNT2 + JMP OPPLOOP + JMP UPDATE +OPPLOOP:LAC@ PTR2 ; SEE IF THERE IS AN EXPLOSION ON THIS PLAYER + ASN + JMP OPPBUMP + ISZ@ PTR2 ; YES, BUT HAS IT RUN OUT? + JMP OPPBUMP + CLA + DAC@ PTR3 ; YES, SO INDICATE PLAYER UNACTIVE + LAC [DNOP] + DAC@ PTR ; TURN HIS EXPLOSION OFF + JMP OPPBUMP +; +; KEEP UPDATEING RANDOM EXPLOSION +; +UPDATE: JMS RANDOM ; UPDATE EXPLOSION (GET RANDOM NUMBER) + AND [77'] + DAC TEM1 + IOR [INC E,B00] + DAC INC1 + AND [77'] + SAL 3 + SAL 3 + SAL 2 + DAC TEM2 + ADD TEM1 + XOR [INC 344,344] + DAC INC2 + LAC TEM2 + IOR [INC B00,100'] + DAC INC3 + JMS RANDOM + AND [77'] + DAC TEM1 + SAL 3 + SAL 3 + SAL 2 + IOR TEM1 + IOR [140300'] + DAC INC4 + XOR [22044'] + DAC INC5 + DAC INC6 + +; CHECK FOR BULLET FIRED AND IF IT HITS ITS MARK +; +CHKBULL:LAC [THING+3] + DAC PTR2 + IAC + DAC PTR3 + LAC [IM1+5] + DAC PTR + SUB [5] + DAC SEEPT + LWC 8. ; 8 IMLACS TO CHECK + DAC CNT2 +DISP1: LAC@ PTR + ASZ + JMP DISP2 +DISPNO: LAW 11. + ADD PTR + DAC PTR + SUB [5] + DAC SEEPT + LAW 6 + ADD PTR2 + DAC PTR2 + IAC + DAC PTR3 + ISZ CNT2 + JMP DISP1 +; +; NOW CHECK FOR REPTING KEYS +; + LAC REPTCNT ; REPT ON? + ASN + JMP CHKKS ; NO, BUT CHECK FOR KEYSET REPEAT + ISZ REPTCNT + JMP CHKKS + CLA + KRB + SAM KEY + JMP CHKKS + SAM MOVE ; ONLY REPEAT : MOVE FORWARDS? + JMP .+2 + JMP .+3 + SAM BACKUP ; MOVE BACKWARDS? + JMP CHKKS + LWC 3. + DAC REPTCNT + JMP REPT ; DO KEY AGAIN +REPTCNT:0 +CHKKS: LAC KSCNT ; KEYSET REPT ON? + ASN + JMP@ DISP ; NO, SO RETURN + ISZ KSCNT + JMP@ DISP + CLA + MSW + SAM KEYSET ; IS IT THE SAME?? + JMP@ DISP + SAM [3433'] ; MOVE FORWARDS? + JMP .+2 + JMP .+3 + SAM [3436'] ; MOVE BACKWARDS? + JMP@ DISP + LWC 3. + DAC KSCNT + JMP KSREPT +; +; IF THERE IS STILL A PLAYER VISIBLE THEN KILL IT +; +DISP2: ISZ@ PTR ; IS IT TOTALLY FIRED YET? + JMP DISPNO + LAC@ SEEPT ; IS HE STILL ALIVE + ASM + JMP DISPNO + ISZ PTR + LAC@ PTR ; GET OUR OLD DIRECTION + AND [3] + DAC@ [SAVEDIR] + ISZ PTR + LAC@ PTR ; GET OUR OLD X + DAC@ [SAVEDX] + ISZ PTR + LAC@ PTR ; GET OUR OLD Y + DAC@ [SAVEDY] + LAC PTR ; RESET POINTER + SUB [3] + DAC PTR + SUB [5] + DAC PTR4 ; SET UP POINTER FOR SEE ROUTINE + LAW 9. + ADD CNT2 + DAC KILL + DAC IID + JMS@ [SEE] ; SEE IF PLAYER HASN'T MOVED OUT OF THE WAY + JMP DISPNO ; HE MADE IT IN TIME + COA ; NO, SO SHOOT HIM DOWN + DAC@ PTR4 ; INDICATE THAT HE IS NOW DYING + LAW 3 ; SEND PLAYER KILLED MESSAGE + JMS SEND1 + LAC MYBIT ; SEND MY ID + JMS SEND1 + LAC KILL ; SEND ID OF PLAYER KILLED + JMS SEND1 + LAC [DNOP] + DAC@ PTR2 ; TURN OFF EYES + LAC JMSEXP ; PUT IN EXPLOSION IN PLACE OF ID + DAC@ PTR3 + LAC PTR4 ; POINT TO EXPLOSION COUNT + ADD [9.] + DAC PTR4 + LWC 60. ; SET EXPLOSION TO LAST 1 1/2 SEC. + DAC@ PTR4 + LAC MYBIT ; BUMP OUR SCORE + JMS UPSCORE + JMP DISPNO + +; SEND A WORD TO THE 10 +; +SEND1: 0 + DAC TEM1 ; SAVE CHARACTER + JMS REFR ; KEEP DISPLAY UP + TSF ; WAIT FOR OUTPUT FLAG + JMP .-2 ; NOT READY YET + LAC TEM1 ; GET CHARACTER BACK + TPC ; TRANSMIT CHARACTER + LAC TEM1 + JMP@ SEND1 ; RETURN +; +; RANDOM NUMBER GENERATOR +; +RANDOM: 0 + lac rnd + add mybit + ral 2 + dac rnd + xor@ rnd + dac rnd + jmp@ random +RND: 0 + + +; UPDATE SCORE IN INFO TABLES AND IN DISPLAY LIST +; ENTER WITH ID IN AC + +UPSCORE:0 + DAC SAVEID ; SAVE ID + LWC 8. ; NOW TURN ALL ! AND  * OFF + DAC UPCNT + LAC [SCORE+3] + DAC PTSCORE +CLRALL: LAC [DNOP] + DAC@ PTSCORE + LAW 5 + ADD PTSCORE + DAC PTSCORE + LAC [DNOP] + DAC@ PTSCORE + LAW 9. + ADD PTSCORE + DAC PTSCORE + ISZ UPCNT + JMP CLRALL + LAC SAVEID ; NOW BUMP SHOOTING PLAYERS SCORE + JMS POSITION ; POSITION US TO CORRECT TABLE + LAC ITEMP1 ; BUMP POINTER TO COUNT + ADD [4] + DAC ITEMP1 + ISZ@ ITEMP1 ; BUMP SCORE BY ONE + NOP + LAC SAVEID ; POINT TO SHOOTING PLAYERS SCORE IN DISPLAY + JMS POINTSC + JMS SCOREIT + LAW 41' ; INSERT EXCLAMATION MARK + JMS GETCHR + DAC@ PTSCORE + LAC KILL ; NOW DO SHOT PLAYER SHOT COUNT + JMS POSITION + ADD [10.] + DAC ITEMP1 + ISZ@ ITEMP1 ; BUMP IT ALSO + NOP + LAC KILL ; NEXT UPDATE THE SHOT COUNT IN DISPLAY + JMS POINTSC + ADD [5] + DAC PTSCORE + JMS SCOREIT + LAW 52' ; INSERT ASTERIC + JMS GETCHR + DAC@ PTSCORE + BEL ; RING BELL INDICATING PLAYER SHOT + JMP@ UPSCORE ; RETURN +POINTSC:0 + CIA + DAC UPCNT + LAC [SCORE-14.] ; POINT TO DISPLAY LIST TO UPDATE SCORE + ADD [14.] + ISZ UPCNT + JMP .-2 + DAC PTSCORE + JMP@ POINTSC +; +; SCORE GENERATOR SUBROUTINE +; ENTER WITH ITEMP1 -> SCORE TO BE CONVERTED +; PTSCORE -> 3 WORDS WHERE DJMSES ARE TO BE PLACED +; LEAVE WITH PTSCORE -> WORD 4 (ONE PAST THE 3 DJMSES) +; +SCOREIT:0 + CLA + DAC HUNDR + DAC TENS + DAC ONES + LAC@ ITEMP1 ; GET CURRENT SCORE + SUB [1000.] ; MAKE IT MOD 1000 + ASM + JMP .-2 + ADD [1000.] + DAC@ ITEMP1 ; STORE IT BACK FOR POSTERITY + SUB [100.] + ASP + JMP DOTENS + ISZ HUNDR + JMP .-4 +DOTENS: ADD [100.] + SUB [10.] + ASP + JMP DOONES + ISZ TENS + JMP .-4 +DOONES: ADD [10.] + DAC ONES + LAC HUNDR + ASN + JMP ZROSUP + JMS DODIGIT + LAC TENS +DTENS: JMS DODIGIT + LAC ONES + JMS DODIGIT + JMP@ SCOREIT +ZROSUP: LWC 20' + JMS DODIGIT + LAC TENS + ASN + LWC 20' + JMP DTENS +DODIGIT:0 + ADD [60'-40'] + ADD@ [24'] + DAC UPCNT + LAC@ UPCNT +DACIT: DAC@ PTSCORE + ISZ PTSCORE + JMP@ DODIGIT +SAVEID: 0 +PTSCORE:0 +UPCNT: 0 +ONES: 0 +TENS: 0 +HUNDR: 0 + +; BUILD A LONG VECTOR INSTRUCTION +; +LV: 0 + LAC XDELTA + AND [40000'] + DAC TEM3 + LAC XDELTA + ASP + CIA + DAC XDELTA + LAC YDELTA + AND [20000'] + IOR TEM3 + DAC TEM3 + LAC YDELTA + ASP + CIA + DAC YDELTA + SUB XDELTA + ASM + JMP LV1 + AND [7777'] + IOR [40000'] + DAC@ DPTR + LAC XDELTA + IOR BEAMBIT + DAC@ DPTR + LAC YDELTA + JMP LV2 +LV1: CIA + AND [7777'] + IOR [40000'] + DAC@ DPTR + LAC YDELTA + IOR BEAMBIT + DAC@ DPTR + LAC XDELTA + IOR [10000'] +LV2: IOR TEM3 + DAC@ DPTR + JMP@ LV + +; GENERATE NEW DISPLAY +; SEND I MOVED MESSAGE TO 10 +; SET UP POSSIBLE VISIBLE OPPONENTS + +PRINT: 0 + LAC@ DSTAT ; CHECK STATUS OF PLAYER + ASZ ; IS HE NOT PLAYING? + JMP INGAME ; NO + LAW 116' ; YES, DISPLAY A "N" THEN + JMP SETST +HEACT: LAC [DJMS D040,] ; IF HE IS ACTIVE THEN DON'T DISPLAY ANYTHING + JMP SETST2 +INGAME: ASP ; IS HE DYING? + JMP HEACT ; NO, THEN HE IS ACTIVE! + LAW 104' ; YES, THEN DISPLAY A "D" FOR DEAD +SETST: JMS GETCHR ; GET THE CHARACTER +SETST2: DAC@ [DEAD] ; PUT IT IN DISPLAY + LAC@ DIR ; FIRST DO DIRECTION LETTER + AND [3] + ADD [DIRLET] + DAC TEM1 + LAC@ TEM1 + JMS GETCHR + DAC@ [LETTER] + LAC TOPSW ; SEE IF TOP OR INSIDE VIEW + ASN + JMP INSIDE +TOPV: LAC [DLIST-1] ;WRITE OVER MAZE DISPLAY LIST + DAC DPTR + LAC [DLYA 1600',] + DAC@ DPTR + LAC [DJMS DNL3,] + DAC@ DPTR + LWC 32. + DAC CNT + LAC [MAZE-1] + DAC PTR + LAC@ DY + SAL 3 + SAL 1 + ADD@ DX + IAC + CIA + DAC PTR4 +NXTW: LWC 16. + DAC CNT2 + LAC [100000'] + DAC BIT + ISZ PTR +NXTB: ISZ PTR4 ; HAVE WE REACHED OUR LOCATION? + JMP .+2 + JMP ME + LAC@ PTR ; SEE IS SQUARE OPEN OR CLOSED + AND BIT + ASZ + JMP ON + LAC [DJMS SPMAZE,] + JMP ON+1 +ME: LAC@ DIR ; FIGURE OUT WHICH ARROW TO USE + AND [3] + ADD [ARROWS] + DAC PTR3 + LAC@ PTR3 + JMP ON+1 +ON: LAC [DJMS CHARMZE,] + DAC@ DPTR + CLL + LAC BIT + RAR 1 + DAC BIT + ISZ CNT2 ; THIS LINE DONE? + JMP NXTB + LAC [DJMS DNL3,] + DAC@ DPTR + ISZ CNT + JMP NXTW ; THIS ROW DONE? + CLA ; DHLT AT END + DAC@ DPTR + JMP@ PRINT +INSIDE: JMS PNTBIT + LAC [WALLS] + DAC WPTR + IAC + DAC WPTR2 + CLA + DAC CNT + LAC [DLIST-1] + DAC DPTR + LAC [20000'] + DAC BEAMBIT + DSN + JMP .-1 + LAC@ DIR + AND [1] + ASZ + JMP EW + JMS CREMENT + DAC TEM1 + CIA + AND [20'] + IOR [RAL 1] + DAC NOP2 + XOR [20'] + DAC NOP3 +PRNT1: LAC MPTR + ADD TEM1 + DAC NEXTBIT + LAC@ NEXTBIT + AND BIT + DAC NEXTBIT + LAC BIT + CLL +NOP2: NOP + AND@ MPTR + JMS LBIT + LAC BIT + CLL +NOP3: NOP + AND@ MPTR + JMS RBIT + LAC MPTR + ADD TEM1 + DAC MPTR + LAC NEXTBIT + JMS ENDCHECK + LAC CNT + SAM [31.] ; SPECIAL CHECK + JMP .+2 + JMP CLOSEOUT + ISZ WPTR + ISZ WPTR2 + ISZ CNT + JMP PRNT1 +EW: JMS CREMENT + DAC TEM1 + AND [20'] + IOR [RAL 1] + DAC NOP4 + DAC NOP5 +PRNT2: LAC BIT + CLL +NOP5: NOP + AND@ MPTR + DAC NEXTBIT + LAC MPTR + ADD TEM1 + DAC TEM2 + LAC BIT + AND@ TEM2 + JMS LBIT + LAC MPTR + SUB TEM1 + DAC TEM2 + LAC BIT + AND@ TEM2 + JMS RBIT + LAC BIT + CLL +NOP4: NOP + DAC BIT + LAC NEXTBIT + JMS ENDCHECK + ISZ WPTR + ISZ WPTR2 + ISZ CNT + JMP PRNT2 +LBIT: 0 + DAC LASTLEF + ASZ + JMP LB1 + LAC@ WPTR ; HALLWAY + CIA + ADD WALLS + IOR [10000'] + DAC@ DPTR + LAC@ WPTR + ADD WALLS + IOR [20000'] + DAC@ DPTR + LAC [DJMS WAIT,] + DAC@ DPTR + LAC CNT + ASN + JMP LB2 + CAL + DAC XDELTA + LAC@ WPTR + SAL 1 + CIA + DAC YDELTA + JMS LV +LB2: LAC@ WPTR2 + CIA + ADD WALLS + IOR [20000'] + DAC@ DPTR + LAC [DJMS WAIT,] + DAC@ DPTR + CAL + DAC YDELTA + LAC@ WPTR + SUB@ WPTR2 + DAC XDELTA + JMS LV + JMS FIX + CAL + DAC XDELTA + LAC@ WPTR2 + SAL 1 + DAC YDELTA + JMS LV + LAC [20000'] + DAC BEAMBIT + CAL + DAC YDELTA + LAC@ WPTR2 + SUB@ WPTR + DAC XDELTA + JMS LV + JMP@ LBIT +LB1: LAC@ WPTR2 ; WALL + CIA + ADD WALLS + IOR [10000'] + DAC@ DPTR + LAC@ WPTR2 + ADD WALLS + IOR [20000'] + DAC@ DPTR + LAC [DJMS WAIT,] + DAC@ DPTR + LAC@ WPTR + SUB@ WPTR2 + DAC YDELTA + CIA + DAC XDELTA + JMS LV + LAC@ WPTR + CIA + ADD WALLS + IOR [10000'] + DAC@ DPTR + XOR [30000'] + DAC@ DPTR + LAC [DJMS WAIT,] + DAC@ DPTR + LAC@ WPTR + SUB@ WPTR2 + DAC XDELTA + DAC YDELTA + JMS LV + JMP@ LBIT +RBIT: 0 + DAC LASTRIG + ASZ + JMP RB1 + LAC@ WPTR ; HALLWAY + ADD WALLS + IOR [10000'] + DAC@ DPTR + XOR [30000'] + DAC@ DPTR + LAC [DJMS WAIT,] + DAC@ DPTR + LAC CNT + ASN + JMP RB2 + CAL + DAC XDELTA + LAC@ WPTR + SAL 1 + CIA + DAC YDELTA + JMS LV +RB2: LAC@ WPTR2 + CIA + ADD WALLS + IOR [20000'] + DAC@ DPTR + LAC [DJMS WAIT,] + DAC@ DPTR + CAL + DAC YDELTA + LAC@ WPTR2 + SUB@ WPTR + DAC XDELTA + JMS LV + JMS FIX + CAL + DAC XDELTA + LAC@ WPTR2 + SAL 1 + DAC YDELTA + JMS LV + LAC [20000'] + DAC BEAMBIT + CAL + DAC YDELTA + LAC@ WPTR + SUB@ WPTR2 + DAC XDELTA + JMS LV + JMP@ RBIT +RB1: LAC@ WPTR2 ; WALL + ADD WALLS + IOR [10000'] + DAC@ DPTR + XOR [30000'] + DAC@ DPTR + LAC [DJMS WAIT,] + DAC@ DPTR + LAC@ WPTR + SUB@ WPTR2 + DAC XDELTA + DAC YDELTA + JMS LV + LAC@ WPTR2 + ADD WALLS + IOR [10000'] + DAC@ DPTR + LAC@ WPTR2 + CIA + ADD WALLS + IOR [20000'] + DAC@ DPTR + LAC [DJMS WAIT,] + DAC@ DPTR + LAC@ WPTR + SUB@ WPTR2 + DAC XDELTA + CIA + DAC YDELTA + JMS LV + JMP@ RBIT +FIX: 0 + CLL + LAC NEXTBIT + ASN + STL + CLA + RAR 3 + DAC BEAMBIT + JMP@ FIX +ENDCHECK:0 + ASN + JMP@ ENDCHECK +CLOSEOUT:LAC CNT ; SET LENGTH OF HALLWAY + DAC HALLNGTH + LAC@ WPTR2 + ADD WALLS + IOR [20000'] + DAC@ DPTR + XOR [30000'] + DAC@ DPTR + LAC [DJMS WAIT,] + DAC@ DPTR + CAL + DAC YDELTA + LAC@ WPTR2 + SAL 1 + DAC ETEM + CIA + DAC XDELTA + JMS LV + LAC LASTLEF + ASZ + LAC [20000'] + DAC BEAMBIT + CAL + DAC XDELTA + LAC ETEM + CIA + DAC YDELTA + JMS LV + LAC [20000'] + DAC BEAMBIT + CAL + DAC YDELTA + LAC ETEM + DAC XDELTA + JMS LV + LAC LASTRIG + ASN + JMP EN1 + CAL + DAC XDELTA + LAC ETEM + DAC YDELTA + JMS LV +EN1: CAL + DAC@ DPTR ; INSERT THE DHLT + JMS VISIBLE ; NOW CHECK FOR VISIBLE OPPONENTS + JMP@ PRINT + +; CHECK FOR VISIBLE OPPONENTS +; +VISIBLE:0 + LWC 9. ; 8 IMLACS TO DO + DAC CNT2 + LAC [DSPTCH-1] ; SET POINTER TO IMLAC INFO TABLES + DAC VISPT + LAC [THING-1] ; SET UP POINTER TO DLYA'S + DAC VISPT2 + IAC ; POINT TO DSTS'S + DAC VISPT3 + ADD [2] ; POINT TO DJMS'S EYES + DAC VISPT4 + IAC ; POINT TO DJMS'S BODY (NAME) + DAC VISPT5 +VISLOOP:ISZ CNT2 ; HAVE WE CHECKED ALL 8? + JMP .+2 ; NO + JMP@ VISIBLE ; YES, RETURN + LAC@ VISPT ; GET ADDRESS OF IMLAC'S INFO TABLE + DAC SEEPT + DAC PTR4 + LAC@ SEEPT ; MAY CHANGE IT ON US, SO GET STATUS + ASZ ; IS THIS IMLAC PLAYING? + JMP PLAYING ; YES + JMP .+3 +BLOWING:LAC JMSEXP + JMP .+2 +NOSEE: LAC [DNOP] ; NO, SO MAKE HIM INVISBLE OR EXPLODING + ISZ VISPT2 ; DON'T CHANGE Y + ISZ VISPT3 ; DON'T CHANGE DSTS + DAC@ VISPT5 ; SET TO INVISIBLE OR EXPLODING + LAC [DNOP] ; NO EYES WANTED + DAC@ VISPT4 +BUMP: JMS BUMPPTS ; UPDATE POINTERS TO NEXT IMLAC + JMP VISLOOP ; NOW DO NEXT IMLAC +; +; ACTIVE PLAYER +; +PLAYING:LAW 9. ; SET ID + ADD CNT2 + DAC IID + JMS SEEUS ; SEE IF IT CAN BE SEEN + JMP NOSEE ; CAN'T BE SEEN + LAC@ PTR4 ; COULD HE BE BLOWING UP? + ASP + JMP HEVIS ; HE IS VISIBLE + JMP BLOWING ; HE IS BLOWING UP +SEEUS: 0 + LAC@ DIR + AND [3] + DAC@ [SAVEDIR] + LAC@ DX + DAC@ [SAVEDX] + LAC@ DY + DAC@ [SAVEDY] + JMS@ [SEE] + JMP@ SEEUS + ISZ SEEUS + JMP@ SEEUS +SEEPT: 0 +FTEMP: 0 +; +; VISIBLE OPPONNENT! +; +FIGX: 0 + LAC@ [DISTAN] ; NOW I KNOW I SEE HIM + ADD [WALLS] ; GET CURRECT POSITION FOR NAME + DAC FTEMP + LAC@ FTEMP + CIA + ADD WALLS + IOR [20000'] ; MAKE IT A DLYA + JMP@ FIGX +HEVIS: JMS FIGX ; FIGURE THE NEW DLXA + DAC@ VISPT2 ; STICK IT IN + LAC@ [DISTAN] ; GET DISTANCE TO OPPONENT + SAR 3 ; SCALE IT TO 2 SIGNIFICANT BITS + XOR [3] ; COMPLEMENT MEANNING + IOR [DSTS 0] ; MAKE IT A DSTS INSTRUCTION + DAC@ VISPT3 ; STICK IT IN DISPLAY + JMS FIGEYES ; FIGURE OUT WHETHER OR NOT EYES SHOULD BE DISPLAYED + DAC@ VISPT4 + LAC IID ; NOW SEE WHICH OPPONENT WE CAN SEE + ADD [TNUM-1] ; GET APPROPRIATE NAME + DAC TEM2 + LAC@ TEM2 + DAC@ VISPT5 ; STICK APPROPRIATE DJMP TO NAME IN DISPLAY LIST + JMP BUMP ; NOW DO NEXT OPPONENT +FIGEYES:0 + LAC@ DIR ; SEE IF WE ARE FACING EACH OTHER + AND [3] + ADD [4] + SUB@ [IDIR] + AND [3] + ADD [EYTAB] + DAC FTEMP + LAC@ FTEMP + JMP@ FIGEYES +; +; SHIFT TO THE LEFT 13 SUBROUTINE +; +SAR13:0 + SAR 3 + SAR 3 + SAR 3 + SAR 3 + SAR 1 + ASN + LAW 1 + JMP@ SAR13 + +; BLOW US UP AND START AGAIN + +ENDER: CLA ; RETURN TO INSIDE DISPLAY + DAC TOPSW + LAC [AD2] ; SET BLOW UP DISPLAY AS CURRENT DISPLAY + DAC WHICHD + LAC [BIGX1INC-1] ; SET POINTER TO INCREMENT TABLE + DAC VISPT + LWC 4. ; 8 PIECES TO DO BUT WE WILL SET UP 2 AT A TIME + DAC CNT +BLOWLOOP:JMS RANDOM ; GET RANDOM NUMBER + JMS SAR13 ; SCALE IT TO 2 +- SIG BITS + DAC TEM1 ; SAVE FOR NEXT BIT + DAC@ VISPT ; STORE DELTA IN FIRST X + JMS RANDOM ; GET ANOTHER RANDOM NUMBER + JMS SAR13 ; SCALE IT TOO + DAC TEM2 ; ALSO SAVE IT + DAC@ VISPT ; STORE DELTA IN FIRST Y + LAC TEM1 ; GET BACK FIRST DELTA X + CIA ; WE WANT TO BALANCE EXPLOSION SO + DAC@ VISPT ; MAKE NEXT BIT GO OPPOSITE DIRECTION + LAC TEM2 ; STORE SECOND Y ALSO IN OPPOSITE DIRECTION + CIA + DAC@ VISPT + ISZ CNT ; ARE WE DONE WITH SETTING UP DELTAS + JMP BLOWLOOP ; NO, DO NEXT 2 + LAC [BIGX1-1] ; NOW RESET DISPLAY LIST DLXAS AND DLYAS + DAC TEM1 + LWC 8. ; EIGHT BITS TO DO + DAC CNT +CLRLOOP:JMS CLRSUB ; RESET THE DLXA + JMS CLRSUB ; RESET THE DLYA + LAC TEM1 ; UPDATE POINTER TO NEXT BIT OF EXPLOSION + ADD [5] + DAC TEM1 + ISZ CNT ; DID WE DO ALL EIGHT BITS? + JMP CLRLOOP ; NO, DO THE REST + JMP RETN ; WAIT EXPLOSION OUT +CLRSUB: 0 + ISZ TEM1 ; POSITION POINTER + LAC@ TEM1 ; GET DLXA OR DLYA + AND [30000'] ; GET OPCODE BITS + IOR [1000'] ; POSITION TO CENTER OF SCREEN + DAC@ TEM1 ; STUFF IT BACK + JMP@ CLRSUB ; RETURN + +; TTY INPUT HANDLER + +CHARIN: 0 + RSF ; TTY INPUT? + JMP EXIT ; NO, SO IGNORE INTERUPT + CLA + RRC ; GET CHARACTER + AND [177'] ; MASK TO 7 CHARACTERS + DAC INCHAR ; SAVE IT +; +; CHECK TO SEE IF WE ARE WAITING FOR CHARACTERS +; + LAC ICNT + ASN + JMP SETUP ; NO SO INTERPRET CHARACTER WE GOT + LAC INCHAR ; YES, SO STUFF CHARACTER IN INFO TABLE + DAC@ 17' + ISZ ICNT ; WAS THAT ALL WE WANTED? + JMP EXIT ; NO, WAIT FOR MORE + JMP@ IDSPTCH ; YES, GO TO ROUTINE NOW +SETUP: LAC [ININFO-1] ; SET UP INPUT BUFFER + DAC 17` +; +; CHECK FOR IMLAC WANTS OUT MESSAGE +; IF HE DOES THEN DO THE FOLLOWING: +; 1) INDICATE IMLAC NON-ACTIVE IN INFO TABLE +; 2) DNOP HIS SCORE, BODY, EYES AND NAME +; +CHK1: LAC INCHAR ; GET CHARACTER READ BACK + SAM [1] ; IS IT TYPE 1? + JMP CHK2 ; NO, CHECK NEXT TYPE + LWC 1 ; WAIT FOR ONE MORE WORD [ID] + DAC ICNT + LAC [DTYP1] ; SET UP DISPATCH ADDRESS +SETOUT: DAC IDSPTCH + JMP EXIT ; WAIT FOR CHARACTERS TO COME IN +DTYP1: JMS TESTID ; GET ID OF IMLAC THAT WANTS OUT +GONER: ASN + JMS ERROR ; ERROR IF ID = 0 + JMS POSITION ; GET POSITION INTO INFO TABLE + DAC 17' + LWC 10. + DAC ICNT2 ; CLEAR INFO ENTRY + CLA + DAC@ ITEMP1 ; CLEAR STATUS + DAC@ 17' ; CLEAR THE REST + ISZ ICNT2 + JMP .-2 + JMS GETCNT ; NOW CLEAR DISPLAY LIST SCORE + LAC [SCORE-15.] + ADD [14.] + ISZ ICNT2 + JMP .-2 + DAC 17' + LAC [DNOP] ; DNOP ALL DIGITS + DAC@ 17' + DAC@ 17' + DAC@ 17' + DAC@ 17' + ISZ 17' + DAC@ 17' + DAC@ 17' + DAC@ 17' + DAC@ 17' + JMS GETCNT ; NOW CLEAR DISPLAYED NAME + LAC [IML1-9.] + ADD [8.] + ISZ ICNT2 + JMP .-2 + DAC 17' + LAC [DJMS D040,] ; GET SPACE + DAC@ 17' + DAC@ 17' + DAC@ 17' + DAC@ 17' + DAC@ 17' + DAC@ 17' + DAC@ 17' + JMS GETCNT ; FINALLY MAKE HIM INVISIBLE + LAC [THING-4] + ADD [6] + ISZ ICNT2 + JMP .-2 + DAC 17' + LAC [DNOP] + DAC@ 17' ; CLEAR EYES + DAC@ 17' ; CLEAR BODY (NAME) + LAC ININFO ; SEE IF IT IS MY REAL IT THAT IS LEAVING + SAM MYREAL ; IF SO THEN EXIT PROGRAM, RETURN TO SSV + JMP CHKNR +; +; EXIT ROUTINE +; SEND PLAYER WANTS OUT TO 10 +; THEN RETURN TO SSV +; + LAW 1 ; SEND I WANT OUT CODE + JMS SEND1 + LAC MYREAL ; SEND MY ID + JMS SEND1 + LAC [17776'] ; RESTORE SSV'S BUFFER TO FULL BUFFER + DAC@ [25'] +LEAVE: IOF ; TURN OFF INTERUPTS + JMP@ .+1 ; NOW EXIT TO SSV + 101' ; ADDRESS OF WHERE TO EXIT TO +CHKNR: SAM MYBIT ; SEE IF IT IS THE GUY WE ARE SIM. + JMP EXIT ; IF NOT THEN WE ARE DONE + LAW 1 ; SENT LEAVING MESSAGE TO 10 FOR HIM + JMS SEND1 + LAC MYBIT + JMS SEND1 + LAC MYREAL ; RETURN TO OUR REAL ID + JMS GETD + JMS PRINT ; REBUILD DISPLAY + JMP EXIT + SUBTTL Player Moved (Type 1) +; CHECK FOR MOVED TO NEW LOCATION MESSAGE +; IF IT IS THEN DO THE FOLOWING: +; 1) INDICATE PLAYER ACTIVE IN INFO TABLE +; 2) UPDATE DIR, X, AND Y IN INFO TABLE +; 3) CHECK VISIBILITY AND SET IT CORRECTLY +; +CHK2: +ifn fast,[ + sub [20'] ; no chance of move if <20 + asp ; skip if 0 or + + jmp chk23 ; negative, not a new protocol move. + sub [20'] ; a move if 17< x <40 + asp + jmp chk22 ;ah, if 20=< and <40, definitely new-ptcl move. + sub [100'] ; a move if GE 140 + asp + jmp insrtch ; 40=< and <140, a char. +chk22: lac inchar + jmp@ [chki20] ;new ptcl move. go hack. +chk23:] + + lac inchar + SAM [2] ; IS IT TYPE 2? + JMP CHK3 ; NO BUT SEE IF IT IS TYPE 3 + LWC 4 ; 4 MORE WORDS TO COME + DAC ICNT + LAC [DTYP2] ; SET UP DISPATCH LOCATION + JMP SETOUT +DTYP2: JMS TESTID + DAC IID + JMS POSITION ; INDICATE PLAYER IS ACTIVE IN INFO TABLES + LAC@ ITEMP1 ; GET CURRENT STATUS + ASZ + ASP ; IGNORE MESSAGE IF HE IS EXPLODING + JMP .+2 + JMP EXIT + STA + DAC@ ITEMP1 ; SAY PLAYER IS ACTIVE + ISZ ITEMP1 + LAC ININFO+1 ; SAVE NEW DIRECTION + IOR [100'] + AND [103'] + SAM ININFO+1 + JMS ERROR ; DIRECTION GREATER THAN 3 + AND [3] ; OR NOT IN 10N FORMAT + DAC@ ITEMP1 + ISZ ITEMP1 + LAC ININFO+2 ; SAVE NEW X LOCATION + JMS TESTLOC ; MAKE SURE IT IS LEGAL + DAC@ ITEMP1 + ISZ ITEMP1 + LAC ININFO+3 ; SAVE NEW Y LOCATION + JMS TESTLOC + DAC@ ITEMP1 + + ;re-entry pt from higher 2k +chk25: JMS GETCNT ; SET UP POINTER TO HIS DISPLAY LIST SLOT + LAC [THING-7] + ADD [6] + ISZ ICNT2 + JMP .-2 + DAC 17' + JMS SEEUS ; CAN HE BE SEEN? + JMP NOTVIS ; NO + JMS FIGX ; YES, NOW FIGURE DLXA + DAC@ 17' ; STORE IT AWAY + LAC@ [DISTAN] ; NOW FIGURE DSTS + SAR 3 + XOR [3] + IOR [DSTS 0] + DAC@ 17' + ISZ 17' ; SKIP OVER WAIT + JMS FIGEYES ; NEXT DO EYES + DAC@ 17' ; STORE THEM + LAC IID ; LAST IS NAME + ADD [TNUM-1] + DAC ITEMP1 + LAC@ ITEMP1 + DAC@ 17' + JMP MCHK ; SEE IF ID IS OURS +NOTVIS: LAC [DNOP] ; IF NOT VISIBLE THEN MAKE IT SO + ISZ 17' ; SKIP DLXA + ISZ 17' ; SKIP DSTS + ISZ 17' ; SKIP OVER WAIT + DAC@ 17' ; CLEAR EYES + DAC@ 17' ; CLEAR BODY (NAME) +MCHK: LAC IID ; SEE IF IT IS US + SAM MYBIT + JMP EXIT ; NO, DONE + JMS PRINT ; IF SO THEN UPDATE DISPLAY + JMP EXIT ; DONE + SUBTTL Player Died (Type 3) +; CHECK FOR PLAYER SHOT MESSAGE +; IF SO THEN DO THE FOLLOWING: +; 1) INDICATE IN TABLE THAT HE IS BLOWING UP +; 2) BUMP SHOOTING PLAYERS SCORE +; 3) GENERATE EXPLOSION IF VISIBLE +; 4) IF THIS IMLAC GOT HIT THEN: +; A) SET LIFE FLAG TO SHOT +; B) PUT NAME OF WHO SHOT US IN WHODIDIT +; +CHK3: SAM [3] ; TYPE 3? + JMP CHK4 ; NO, BUT TRY TYPE 4 + LWC 2 ; TWO WORDS TO WAIT FOR + DAC ICNT + LAC [DTYP3] ; SET DISPATCH ADDRESS + JMP SETOUT +DTYP3: JMS TESTID + LAC ININFO+1 + ASN + JMS ERROR ; ID ZERO + SUB [9.] + ASP + JMP .+3 + ADD [9.] + JMS ERROR ; ID GREATER THAN 8 + ADD [9.] + DAC KILL ; SAVE DYING ID FOR UPSCORE + JMS POSITION ; INDICATE PLAYER IS DYING + COA + DAC@ ITEMP1 + LAC ITEMP1 + ADD [5] + DAC ITEMP1 + ADD [4] + DAC ITEMP2 + CAL ;TURN OFF ANY FIRING WE HAVE ON HIM + DAC@ ITEMP1 + LWC 60. ; SET EXPLOSION TO LAST 1 1/2 SEC + DAC@ ITEMP2 + LAC ININFO+1 ; SEE IF I WAS SHOT + SAM MYBIT + JMP NOTME + LAC ININFO + ADD [TNUM-1] ; SAY WHO DID IT IN WHODIDIT + DAC ITEMP2 + LAC@ ITEMP2 + DAC@ [WHODIDIT] + LAC ININFO ; WAIT LONGER IN BIG + DAC BIGEXP ; EXPLOSION IF WE ARE PLAYING OURSELVES + SAM MYREAL ; SO OUR NEW STARTING LOC WILL BE IN EFFECT + JMP .+3 + LWC 120. + JMP .+2 + LWC 80. + XAM BIGEXP + JMS UPSCORE ; UPDATE SCORES + JMP ENDER +NOTME: LAC ININFO+1 ; NOW POINT INTO DISPLAY LIST + CIA + DAC ICNT2 + LAC [THING-2] + ADD [6] + ISZ ICNT2 + JMP .-2 + DAC ITEMP2 + SUB [1] ; SET POINTER TO EYES + DAC ITEMP1 + LAC@ ITEMP2 ; IS HE CURRENTLY VISIBLE? + SAM [DNOP] + JMP VIS1 ; YES + JMP NOEXPLO ; NO +VIS1: LAC [DNOP] + DAC@ ITEMP1 ; YES, CLEAR EYES + LAC JMSEXP ; STICK IN JMS TO EXPLOSION + DAC@ ITEMP2 +NOEXPLO:LAC ININFO ; BUMP SCORES + JMS UPSCORE ; AND UPDATE SCORES IN DISPLAY LIST + JMP EXIT + SUBTTL New Name (Type 4) +; CHECK TO SEE IF NEW NAME SPECIFIED +; IF SO THEN DO THE FOLLOWING: +; 1) FILL IN APPROPRATE NAME DISPLAY SUBROUTINE +; 2) IF MYBIT = 0 THEN ASSIGN THE ID TO MYBIT +; +CHK4: SAM [4] ; TYPE 4? + JMP ERASER ; NO, KEEP LOOKING + LWC 11. ; 11. MORE CHARACTERS TO WAIT FOR + DAC ICNT + LAC [DTYP4] ; SET DISPATCH ADDRESS + JMP SETOUT +DTYP4: JMS TESTID + LAC MYBIT ; SEE IF MYBIT IS ZERO + ASZ + JMP GOTMINE + LAC ININFO ; YES, SO SET OUR ID + DAC MYREAL + JMS GETD +ife fast, DAC@ [ORIG] ; INDICATE ORIGIONAL ID IN DISPLAY +GOTMINE:LAC [ININFO] ; SET UP POINTERS FOR TRANSFER + DAC 16' + JMS GETCNT + LAC [IML1-8.] ; REMEMBER 1ST CHAR IS OFFSET CHAR + ADD [8.] + ISZ ICNT2 + JMP .-2 + DAC 17' + DAC ITEMP2 + CLA + DAC SPACES + LWC 6 ; MOVE 6 CHARACTER NAME + DAC ICNT2 +CONVNXT:LAC@ 16' + SUB [140'] ; TRANSLATE TO LOWER CASE + ASM + SUB [40'] + ADD [140'] + SAM [40'] ; SPACE? + JMP .+2 ; NO + ISZ SPACES ; YES COUNT THEM FOR OFFSET CHAR + JMS GETCHR ; CONVERT TO DJMS + DAC@ 17' + ISZ ICNT2 + JMP CONVNXT + LAC SPACES ; NOW FIX OFFSET CHARACTER + ADD [CENTER] + DAC ITEMP1 + LAC@ ITEMP1 + DAC@ ITEMP2 + LAC ININFO ; NOW STORE SCORES + JMS POSITION + ADD [4] + DAC ITEMP1 + JMS FIXSCO ; DO # OF OPPONENTS SHOT + LAC ININFO + JMS POINTSC + JMS SCOREIT + LAC ITEMP1 + ADD [6] + DAC ITEMP1 + JMS FIXSCO ; NOW DO # OF TIMES SHOT + LAC ININFO + JMS POINTSC + ADD [5] + DAC PTSCORE + JMS SCOREIT + JMP EXIT +FIXSCO: 0 + LAC@ 16' + AND [77'] + SAL 3 + SAL 3 + DAC ITEMP2 + LAC@ 16' + AND [77'] + IOR ITEMP2 + DAC@ ITEMP1 + JMP@ FIXSCO +SPACES: 0 + +; SET UP OUR ID +; +; ENTER WITH ID IN AC +; +GETD: 0 + DAC MYBIT + sub [1] + dac mybit1 ; store normalized 0-7 ID. + ADD [DSPTCH] + DAC ITEMP1 + LAC@ ITEMP1 ; SET UP DSTAT, DX, DY, AND DIR PTRS + DAC DSTAT + IAC + DAC DIR + IAC + DAC DX + IAC + DAC DY +ife fast,[ + LAC MYBIT ; NOW GET OUR ID IN CHARACTER + IOR [60'] + JMS GETCHR + DAC@ [CURENT] ; SAY OUR CURRENT ID IN DISPLAY +] + JMP@ GETD +; +; +; ERASE RING BUFFER? +; +ERASER: SAM [14'] ; TYPE 4? + JMP INSRTCH ; NO, JUST INSERT INTO RING BUFFER + JMS ERASE + JMP EXIT +ERASE: 0 + LWC 4 ; RESET LINE COUNT + DAC RINGLC + LAC [RINGST] ; RESET BOTH POINTERS + DAC RNGPT + IAC + DAC RNGPT2 + LAC [DJMS D012,] ; REPLACE DJMP TO CURSER + DAC@ RNGPT + LAC [DJMS CUR,] + DAC@ RNGPT2 + LAC [DJMP RINGST,] + DAC@ [RING] + DAC@ [RINGEND] + JMP@ ERASE +; +; GET DJMS FOR A CHARACTER +; +GETCHR: 0 + AND [177'] ; MASK TO 7 BITS + SAM [12'] ; LINE FEED? + JMP .+3 + LAC [DJMS D012,] + JMP STORECH + SAM [10'] ; BACK SPACE? + JMP .+3 + LAC [DJMS D010,] + JMP STORECH + SAM [15'] ; CR? + JMP .+3 + LAC [DJMS D015,] + JMP STORECH + SUB [40'] ; DON'T ALLOW ANYTHING BELOW 40 + ASP + CLA + ADD [40'] + SUB [140'] ; TRANSLATE TO LOWER CASE + ASM + SUB [40'] + ADD [140'-40'] + ADD@ [24'] ; CONVERT TO DJMS + DAC ITEMP1 + LAC@ ITEMP1 +STORECH:DAC ITEMP1 + JMP@ GETCHR + +; INSERT CHARACTER INTO RING BUFFER +; +INSRTCH:JMS FORWARD + LAC INCHAR + JMS GETCHR ; GET DJMS FOR CHARACTER + SAM [DJMS D012,] + JMP NOTNL ; NO + ISZ RINGLC ; YES, BUT IS THERE ROOM ON SCREEN? + JMP NOTNL + JMS ROLL + JMP OK +NOTNL: LAC RNGPT2 + SAM RNGPT ; HAVE WE FILLED ENTIRE BUFFER? + JMP OK ; NO + JMS ROLL ; YES, ROLL TOP LINE OFF +OK: LAC [DJMP CUR,] + DAC@ RNGPT2 + JMS BACK ; BACK UP POINTER + LAC ITEMP1 ; GET DJMS AGAIN + DAC@ RNGPT2 ; STICK IN ON TOP OF OLD DJMP CUR + JMS FORWARD ; MOVE POINTER BACK UP + LAC INCHAR + SAM [15'] + JMP EXIT ; DONE + LAW 12' + DAC INCHAR + JMP INSRTCH +FORWARD:0 ; ROLL RNGPT2 FORWARD ONE SLOT + LAC RNGPT2 + IAC + SAM [RINGEND] + JMP .+2 + LAC [RINGST] + DAC RNGPT2 + JMP@ FORWARD +BACK: 0 + STA + ADD RNGPT2 + SAM [RING] + JMP .+2 + LAC [RINGEND-1] + DAC RNGPT2 + JMP@ BACK + +; +ROLL: 0 ; ROLL RINGPT FORWARD ONE LINE +LOOK: LAC RNGPT + IAC + SAM [RINGEND] + JMP .+2 + LAC [RINGST] + SAM RNGPT2 + JMP .+4 + JMS ERASE + JMS FORWARD + JMP@ ROLL + DAC RNGPT + LAC@ RNGPT + SAM [DJMS D012,] + JMP LOOK +MOVED: LAC RNGPT + AND [7777'] + IOR [160000'] + DAC@ [RING] + STA + ADD RINGLC + DAC RINGLC + JMP@ ROLL +; +; RETURN FROM CHARACTER READ +; +EXIT: JMP@ CHARIN +GETCNT: 0 + LAC ININFO ; GET ID OF MESSAGE ORIGINATOR + CIA ; MAKE IT INTO A COUNT + DAC ICNT2 + JMP@ GETCNT +POSITION:0 + ADD [DSPTCH-1] ; POINT TO CORRECT STATUS INDICATOR + DAC ITEMP1 + LAC@ ITEMP1 + DAC ITEMP1 + DAC SEEPT ; ALSO SET SEEPT FOR TYPE 2 COMMAND + JMP@ POSITION +TESTID: 0 ; TEST FOR VALID ID IN ININFO + LAC ININFO + ASN ; ALSO CAN'T BE ZERO + JMS ERROR ; ID ZERO OR SAME AS MYBIT + SUB [9.] ; CAN'T BE > OR = TO 9. + ASP + JMP TESTOK + LAC ININFO + JMS ERROR ; ID GREATER THAN 8 +TESTOK: LAC ININFO ; ALL OK SO RETURN WITH ID IN AC + JMP@ TESTID +TESTLOC:0 ; TEST TO SEE IF LEGAL LOCATION + AND [77'] ; MINIMUM IS LOCATION 1 + ASN + JMS ERROR ; LOCATION ZERO + SUB [32.] + ASP + JMP .+3 + ADD [32.] + JMS ERROR ; LOCATION GREATER THAN 31. + ADD [32.] + JMP@ TESTLOC + SUBTTL Error Handling Routine +; ERROR HANDLING ROUTINE +; +ERROR: 0 ; ADDRESS OF WHERE THE ERROR WAS FOUND + DAC ERRAC ; SAVE AC ERROR MESSAGE + LAC IDSPTCH ; SAVE DISPATCH ADDRESS + DAC ERRDSP + LWC 11. + DAC ICNT2 ; NOW SAVE INFO AREA + LAC [ININFO-1] + DAC 17' + LAC [ERRINFO-1] + DAC 16' +SVELOP: LAC@ 17' + DAC@ 16' + ISZ ICNT2 + JMP SVELOP + ISZ ERRCNT ; BUMP THE ERROR COUNT + NOP + LAC ERRCNT ; NOW DISPLAY IT + JMS GETCHR + DAC@ [ERRCHAR] + JMP EXIT ; NOW IGNORE BAD MESSAGE +ERRAC: 0 ; SAVED AC +ERRDSP: 0 ; SAVED DISPATCH ADDRESS +ERRCNT: 60' ; ERROR COUNT + SUBTTL Routine Variables +; ROUTINES VARIABLES +; +INCHAR: 0 ; LAST CHARACTER READ IN +ICNT: 0 ; THE NUMBER OF CHARACTERS WE ARE WAITING FOR +ICNT2: 0 ; GENERAL PURPOSE COUNTER USED IN ROUTINE +ITEMP1: 0 ; TEMPORARY LOCATIONS +ITEMP2: 0 ; ANOTHER TEMPORARY LOCATION +IDSPTCH:0 ; DISPATCHING ADDRESS FOR COMMAND ROUTINES +RNGPT: RINGST ; FIRST CHARACTER OF RING BUFFER POINTER +RNGPT2: RINGST+1 ; LAST CHARACTER OF RING BUFFER POINTER +RINGLC: -4 ; RING BUFFER LINE COUNTER +ININFO: 0 ; INPUT INFORMATION FROM 10 BUFFER + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 +; +; CONSTANTS GO HERE AT END OF THIS 2K !!!!! ANY REFS TO OR FROM +; SUCCEEDING 2K MUST BE INDIRECT-ADDRESS! BLEAH!!!!!! (KLH) +; +CONSTANTS + +;LOC 14000 ;happens about here anyway, just needs precision. + +; +; DISTANCES TO WALLS TABLE +; +WALLS: 511. ; DISTANCES TO WALLS + 450. + 358. + 281. + 225. + 184. + 155. + 133. + 116. + 103. + 92. + 83. + 75. + 70. + 64. + 60. + 56. + 53. + 50. + 47. + 45. + 43. + 41. + 39. + 37. + 35. + 33. + 31. + 29. + 27. + 25. +; +; ERROR SAVING OF INFO INFORMATION AREA +; +ERRINFO:0 ; HOLDS 2ND CHARACTER OF LAST BAD MESSAGE + 0 ; HOLDS THE REST OF THE MESSAGE + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 +; +; N DIRECTION LETTER TABLE +; E +; S +; W +; +DIRLET: 116' + 105' + 123' + 127' +; +; YOU WERE SHOT BY: MESSAGE +; +YWSB: 131' + 117' + 125' + 40' + 127' + 105' + 122' + 105' + 40' + 123' + 110' + 117' + 124' + 40' + 102' + 131' + 72' +; +; EYES AND ARROWS TABLE +; +EYTAB: DJMS AWAY + DJMS TOLEFT + DJMS EYES + DJMS TORIGHT +; +; OFFSET FOR NAME TABLE +; +CENTER: DJMS OFF6 + DJMS OFF5 + DJMS OFF4 + DJMS OFF3 + DJMS OFF2 + DJMS OFF1 + DNOP +OFF6: INC E,DM30 + INC DM30,100' +OFF5: INC E,DM30 + INC DM20,100' +OFF4: INC E,DM30 + INC DM30,100' +OFF3: INC E,DM30 + INC DM20,100' +OFF2: INC E,DM30 + INC DM30,100' +OFF1: INC E,DM30 + INC DM20,140' +; +; DJMSES TO NAME LABELS ROUTINES +; +TNUM: DJMS IML1 + DJMS IML2 + DJMS IML3 + DJMS IML4 + DJMS IML5 + DJMS IML6 + DJMS IML7 + DJMS IML8 +; +; BIG EXPLOSION INFO TABLE +; +BIGX1INC:0 +BIGY1INC:0 +BIGX2INC:0 +BIGY2INC:0 +BIGX3INC:0 +BIGY3INC:0 +BIGX4INC:0 +BIGY4INC:0 +BIGX5INC:0 +BIGY5INC:0 +BIGX6INC:0 +BIGY6INC:0 +BIGX7INC:0 +BIGY7INC:0 +BIGX8INC:0 +BIGY8INC:0 + SUBTTL Imlac Info Tables +; IMLAC INFORMATION TABLES +; +DSPTCH: IM1 + IM2 + IM3 + IM4 + IM5 + IM6 + IM7 + IM8 +IMINFL==11. ;# wds info per imlac +IM1: 0 ; STATUS WORD -1 IF ACTIVE 1 IF DYING 0 IF NOT IN GAME + 0 ; DIRECTION + 0 ; X LOCATION + 0 ; Y LOCATION + 0 ; PLAYERS SCORE + 0 ; BULLET COUNTER + 0 ; MY DIRECTION AT TIME OF FIRE + 0 ; MY X LOCATION AT TIME OF FIRE + 0 ; MY Y LOCATION AT TIME OF FIRE + 0 ; EXPLOSION TIMER + 0 ; SHOT DEAD COUNTER +IM2: BLOCK IMINFL +IM3: BLOCK IMINFL +IM4: BLOCK IMINFL +IM5: BLOCK IMINFL +IM6: BLOCK IMINFL +IM7: BLOCK IMINFL +IM8: BLOCK IMINFL + SUBTTL SEE Test +; TEST TO SEE IF PLAYER WHOSE ID IS IN IID IS VISIBLE +; SEEPT SHOULD POINT TO STATUS WORD IN INFO TABLE +; DISTAN WILL CONTAIN DISTANCE TO OPPONENT ON RETURN IF VISIBLE +; SKIPS IF PLAYER SEEN +; +SEE: 0 + CLA + DAC DISTAN + LAC@ [SEEPT] ; SET UP LOCAL SEEPT + DAC SEEPT2 + ISZ SEEPT2 ; POINT TO DIRECTION + LAC@ SEEPT2 + DAC IDIR ; SAVE DIRECTION IN IDIR + ISZ SEEPT2 ; POINT TO X LOCATION + LAC@ SEEPT2 + DAC IX ; SAVE IT IN IX + ISZ SEEPT2 + LAC@ SEEPT2 ; NOW GET Y LOC + DAC IY + LAC SAVEDIR ; SEE WHICH WAY WE ARE POINTING + AND [1] + ASZ + JMP WEAST ; WEST OR EAST +SNORTH: LAC IX ; SOUTH OR NORTH CHECK HIS X TO MY X + SAM SAVEDX ; DOES IT MATCH? + JMP@ SEE ; NO + LAC IY ; YES, NOW GET THE Y DIFFERENCE + SUB SAVEDY + ASN ; IS HE IN MY SQUARE? + JMP@ SEE ; YES, THEN I CAN'T SEE HIM + DAC SEEPT2 ; SAVE DISTANCE TO HIM + ASP ; SEE IF DISTANCE POSITIVE + JMP HENORTH ; NO, HE MUST BE NORTH OF ME + CIA ; YES, SO HE IS SOUTH OF ME + DAC SEEPT2 ; MAKE DISTANCE NEGATIVE + JMP HESOUTH +HEEAST: LAW 2 +HENORTH=HEEAST + AND SAVEDIR ; SEE IF I AM LOOKING NORTH + ASZ ; IF NOT THEN I CAN'T SEE HIM + JMP@ SEE ; I LOOK SOUTH SO I CAN'T SEE HIM + JMP CHKLN ; OK SO FAR, NOW CHECK LENGTH OF HALL +HESOUTH:LAW 2 +HEWEST=HESOUTH + AND SAVEDIR ; SEE IF I AM LOOKING SOUTH + ASN ; IF NOT THEN I CAN'T SEE HIM + JMP@ SEE ; I NO SEE HIM + JMP CHKLN ; SO FAR SO GOOD, BUT CHECK HALLWAY LENGTH +WEAST: LAC IY ; CHECK HIS Y TO MY Y + SAM SAVEDY ; IT MUST MATCH + JMP@ SEE ; CAN'T SEE HIM + LAC IX ; NOW GET THE X DIFFERENCE + SUB SAVEDX + ASN ; IS HE IN MY SQUARE? + JMP@ SEE ; YES, SO I CAN'T SEE HIM + DAC SEEPT2 ; SAVE THE DISTANCE TO HIM + ASP ; BUT SEE IF POSITIVE DISTANCE + JMP HEWEST ; NO, NEGATIVE SO HE IS WEST OF ME + CIA + DAC SEEPT2 + JMP HEEAST ; HE IS EAST OF ME +CHKLN: LAC SEEPT2 + CIA ; SET DISTANCE TO OPPONENT + DAC DISTAN +CHKLN1: LAW 1 + AND SAVEDIR + ASZ + JMP CHKLN3 + JMS CREM2 + ADD SAVEDY + DAC SAVEDY +CHKLN2: LAC [MAZE] + ADD SAVEDY + DAC MPTR2 + LAC SAVEDX + ASZ + JMP PT1 + LAC [100000'] + JMP PT2 +PT1: CIA + DAC MCNT + CLL + LAC [100000'] + RAR 1 + ISZ MCNT + JMP .-2 +PT2: DAC BIT2 + LAC@ MPTR2 + AND BIT2 ; SEE IF IT IS AN OPEN SQUARE + ASZ + JMP@ SEE + ISZ SEEPT2 ; ARE WE AS FAR AS THE OPPONENT? + JMP CHKLN1 ; NO + LAC@ [IID] ; YES, SEE IF HE IS ME + SAM@ [MYBIT] + ISZ SEE ; DON'T SKIP IF SO (CAN'T SEE ME) + JMP@ SEE +CHKLN3: JMS CREM2 + CIA + ADD SAVEDX + DAC SAVEDX + JMP CHKLN2 +CREM2: 0 + LAC SAVEDIR + SAR 1 + AND [1] + ASN + LAC [-1] + JMP@ CREM2 +DISTAN: 0 +SAVEDIR:0 +SAVEDX: 0 +SAVEDY: 0 +SEEPT2: 0 +MCNT: 0 +MPTR2: 0 +IY: 0 ; OBJECT ID Y LOCATION +IX: 0 ; OBJECT ID X LOCATION +IDIR: 0 ; OBJECT ID IMLAC DIRECTION +BIT2: 0 + SUBTTL New-protocol checking/munching + +; CHKI20 routine to handle new-protocol checking and munching, +; as well as old. +;put here since no room in lower 2k of core. + +ifn fast,[ + +chki20: and [7] ;get normalized ID, no need to test range! + iac ;make it 1-8. + dac@ [iid] ;store for what wants it. + jms@ [position] ;set up itemp1 and seept pointers into info tabs + lac@ [itemp1] + dac ctemp1 ;get itemp1 into a var within our 2k. + lac@ ctemp1 ;get current status + asz + asp ;ignore this msg if he's exploding + jmp .+2 + jmp@ [exit] + sta + dac@ ctemp1 ;say player is active + lac ctemp1 + iac + dac plrd ;save ptr to direction + iac + dac plrx ;save ptr to x coord + iac + dac plry ;save ptr to y coord + dac ctemp1 + dac@ [itemp1] + ;itemp1 is now satisfactorily updated, and + ;indices into position tables done, now do function. + lac@ [inchar] + and [70'] ;only interested in function digit + sar 3 + add [jmp plrvec] + dac plrjmp +plrjmp: 0 +plrvec: jmp badvec + jmp badvec + jmp plrtrn ; 2 - right turn + jmp plltrn ; 3 - left turn + jmp plflip ; 4 - turn around + jmp plmove ; 5 - move forward + jmp plback ; 6 - move backward +badvec: jms@ [error] ; 7 - bad + jmp@ [exit] + +plrd: 0 ;pointer to direction +plrx: 0 ;pointer to x coord +plry: 0 ;guess what + +plrtrn: lac@ plrd ;get direction + iac ;right turn + and [3] + dac@ plrd + jmp plrdon +plltrn: lac@ plrd + sub [1] ;left turn + and [3] + dac@ plrd + jmp plrdon +plflip: lac@ plrd + add [2] ;turn right twice to turn-around + and [3] + dac@ plrd + jmp plrdon +plback: lac@ plrd ;backward-- reverse direction then move. + add [2] + jmp .+2 +plmove: lac@ plrd + and [3] + add [jmp pldvec] + dac plmjmp +plmjmp: 0 +pldvec: jmp plmnor ;north + jmp plmea ;east + jmp plmsou ;south + jmp plmwes ;west +plmnor: lac@ plry + sub [1] ;decrement Y coord for north moving + jms@ [testloc] + dac@ plry + jmp plrdon +plmea: lac@ plrx + iac ;increment X coord for east + jms@ [testloc] + dac@ plrx + jmp plrdon +plmsou: lac@ plry + iac ; incrment Y coord for south + jms@ [testloc] + dac@ plry + jmp plrdon +plmwes: lac@ plrx + sub [1] ; decrement X coord for west + jms@ [testloc] + dac@ plrx + jmp plrdon + +plrdon: lac@ [iid] ;get player id again + dac@ [ininfo] ;and fake out stupid routine + jmp@ [chk25] ;done with new ptcl handling. + +ctemp1: 0 ;pointer substi. for itemp1 +] ;end of ifn fast + +CONSTANTS + SUBTTL Display stuff +; NAME SUBROUTINES +; 5 CHARACTER NAME +; +IML1: REPEAT 7,DJMS D040 + DRJM ; RETURN JUMP +IML2: REPEAT 7,DJMS D040 + DRJM +IML3: REPEAT 7,DJMS D040 + DRJM +IML4: REPEAT 7,DJMS D040 + DRJM +IML5: REPEAT 7,DJMS D040 + DRJM +IML6: REPEAT 7,DJMS D040 + DRJM +IML7: REPEAT 7,DJMS D040 + DRJM +IML8: REPEAT 7,DJMS D040 + DRJM +; +; GSV CHARACTER SUBROUTINES +; +CUR: INC E,D0M1 + INC D0M3,B30 + INC B30,B30 + INC D03,D20 + INC D01,T + DJMP DLIST +WAIT: INC E,P ; 40 MICROSECOND WAIT + REPEAT 8.,INC P,P + INC P,140 +D010: INC E,DM30 + INC DM30,DM30 + INC DM20,140' +D012: INC E,D0M3 ; END_OF_LINE + INC D0M3,D0M3 + INC D0M3,D0M3 + INC D0M3,D0M3 + INC X,X +D015: DLXA 200 + DJMS WAIT + DRJM +DNL3: DLXA 540 + DJMP DNL+1 +DNL2: DLXA 1710 + DJMP .+2 +DNL: DLXA 10 + DJMS WAIT + DJMP D012 +D040: INC E,D30 ; SPACE + INC D30,D30 + INC D20,X +EYES: INC E,D03 ; EYES + INC D03,D03 + INC D03,DM33 + INC B00,B00 + INC D30,D30 + INC B00,B00 + INC DM30,D00 + INC D0M3,D0M3 + INC D0M3,D0M3 + INC D0M3,140' +CMZE: INC E,B03 + INC B03,B03 + INC B03,B03 + INC B03,B02 + INC B30,B30 + INC B30,B10 + INC B0M3,B0M3 + INC B0M3,B0M3 + INC B0M3,B0M3 + INC B0M2,BM30 + INC BM30,BM30 + INC BM10,B12 + INC B12,B12 + INC B12,B12 + INC B12,B12 + INC B12,B12 + INC B12,DM30 + INC DM30,DM30 + INC DM10,B1M2 + INC B1M2,B1M2 + INC B1M2,B1M2 + INC B1M2,B1M2 + INC B1M2,B1M2 + INC B1M2,D10 + INC 140',140' +CHARMZE:DJMS CMZE + DJMP CMZE +SPMAZE: INC E,D30 + INC D30,D30 + INC D30,D30 + INC D30,D30 + INC D10,140' +ARROWS: DJMS UPARR + DJMS RIGHTARR + DJMS DOWNARR + DJMS LEFTARR +RIGHTARR:INC E,D33 + INC D03,D33 + INC B30,B30 + INC B30,B10 + INC BM2M2,B02 + INC B02,B2M2 + INC D3M3,D3M3 + INC D0M3,140' +LEFTARR:INC E,D33 + INC D03,D33 + INC B22,B0M2 + INC B0M2,BM22 + INC B30,B30 + INC B30,B10 + INC D3M3,D3M3 + INC D0M3,140' +UPARR: INC E,D30 + INC D30,D30 + INC D23,B03 + INC B03,B03 + INC B01,BM2M2 + INC B20,B20 + INC BM22,D00 + INC D3M3,D3M3 + INC D3M3,D2M3 + INC D0M1,140' +DOWNARR:INC E,D30 + INC D30,D30 + INC D23,B12 + INC BM20,B1M2 + INC B03,B03 + INC B03,B01 + INC D3M3,D3M3 + INC D3M3,D2M3 + INC D0M1,140' +AWAY: DLV D,0,20. + DLV B,0,15. + DLV B,-2,-5. + DLV B,4.,0 + DLV B,-2.,5. + DLV D,0,-35. + DRJM +TOLEFT: DLV D,0,20. + DLV B,-15.,0 + DLV B,5.,2 + DLV B,0,-4. + DLV B,-5.,2 + DLV D,15.,-20. + DRJM +TORIGHT:DLV D,0,20. + DLV B,15.,0 + DLV B,-5.,2. + DLV B,0,-4. + DLV B,5.,2. + DLV D,-15.,-20. + DRJM + +; +; BIG EXPLOSION DISPLAY LIST +; +AD2: DHVS 2 + DADR ; TURN ON 8K DISPLAY ADDRESSING + DLXA 500 + DLYA 1200 + DJMS WAIT +; +; YOU WERE SHOT BY: +; +MESAGE: REPEAT 17.,DJMS DNOP + DLXA 1000 + DLYA 1000 + DJMS WAIT +; +; DJMS TO PLAYER WHO DID THE KILLING +; +WHODIDIT:DJMS D040 + DSTS 3 + +IRP N,,[1,2,3,4,5,6,7,8] +BIGX!N: DLXA 1000 +BIGY!N: DLYA 1000 + DJMS WAIT + DNOP + DNOP + DNOP + DJMS EXPLOSIN+2 +TERMIN + DHLT + SUBTTL Main Display List +; START OF MAIN DISPLAY LIST + +AD1: DHVS 1 + DADR ; TURN ON 8K DISPLAY ADDRESSING + ; (USE 0 BIT TO INDICATE WHICH 4K) + DLXA 50 + DLYA 1300 + DJMS WAIT + DJMS IML1 + DJMS DNL +SCORE: REPEAT 4,DNOP ; DISPLAY NAMES AND SCORES HERE + DJMS DNL + REPEAT 4,DNOP + DLXA 50 + DLYA 1100 + DJMS WAIT + DJMS IML2 + DJMS DNL + REPEAT 4,DNOP + DJMS DNL + REPEAT 4,DNOP + DLXA 50 + DLYA 700 + DJMS WAIT + DJMS IML3 + DJMS DNL + REPEAT 4,DNOP + DJMS DNL + REPEAT 4,DNOP + DLXA 50 + DLYA 500 + DJMS WAIT + DJMS IML4 + DJMS DNL + REPEAT 4,DNOP + DJMS DNL + REPEAT 4,DNOP + DLXA 1724 + DLYA 1300 + DJMS WAIT + DJMS IML5 + DJMS DNL2 + REPEAT 4,DNOP + DJMS DNL2 + REPEAT 4,DNOP + DLXA 1724 + DLYA 1100 + DJMS WAIT + DJMS IML6 + DJMS DNL2 + REPEAT 4,DNOP + DJMS DNL2 + REPEAT 4,DNOP + DLXA 1724 + DLYA 700 + DJMS WAIT + DJMS IML7 + DJMS DNL2 + REPEAT 4,DNOP + DJMS DNL2 + REPEAT 4,DNOP + DLXA 1724 + DLYA 500 + DJMS WAIT + DJMS IML8 + DJMS DNL2 + REPEAT 4,DNOP + DJMS DNL2 + REPEAT 4,DNOP + DLYA 1720 +; +; STATUS LINE +; + DLXA 60 + DJMS WAIT +ife fast,[ +ORIG: DJMS D040 ; ORIGIONAL ID + DJMS D040 +CURENT: DJMS D040 ; CURRENT ID + DJMS D040 +] +DEAD: DJMS D040 ; STATUS OF PLAYER + DJMS D040 +ERRCHAR:DJMS D040 ; NUMBER OF MESSAGES IN ERROR +; +; +; N, S, E, OR W LETTER +; + DLXA 1000 + DJMS WAIT + DSTS 3 +LETTER: DJMS D040 +; +; THIS IS WHERE THE 8 POSSIBLE PLAYERS APPEAR +; +; DLXA 1000 +; DLYA +; DSTS +; DJMS WAIT +; DJMS +; DJMS +; + +THING=.+1 +REPEAT 8.,[ + DLXA 1000 + DJMS D040 + DJMS D040 + DJMS WAIT + DJMS D040 + DJMS D040 +] + +; RING BUFFER + + DSTS 1 + DLXA 200 + DLYA 130 + DJMS WAIT +RING: DJMP RINGST +RINGST: DJMS D012 + DJMP CUR + BLOCK 160. +RINGEND:DJMP RINGST + +; DISPLAY LIST FOR MAZE STARTS HERE + +DLIST: DHLT + +; RETURN TO CONSOLE PROGRAM AFTER LOADING + + END 101' + \ No newline at end of file