.TITLE PDP11 LOGO FOO==VERNF VERN==%FNAM2 FOO==VERNF .STITL CONFIGURATION PARAMTERS .IF1 .PRINT /0=>FULL 1=>NO DEBUG 2=>QUERY ASSSW=/ .TTYMAC FLAG ASSSW=FLAG .ENDM .IFZ ASSSW DEBUG==1 DISASS==1 GCDBUG==1 MNUSRS==10. MNSLTS==5 .ENDC .IFZ DEBUG==0 DISASS==0 GCDBUG==1 ;ZERO LATER, BUT DOESN'T WORK YET MNUSRS==4 MNSLTS==2 .ENDC .IFZ .MACR SETFLG FLG .PRINT /FLG=/ .TTYMAC FLAG FLG==FLAG .ENDM .ENDM SETFLG DEBUG SETFLG DISASS SETFLG GCDBUG SETFLG MNUSRS SETFLG MNSLTS .ENDC .ENDC .MACR FOR FLG .XLIST .IFNZ FLG .LIST .ENDM .MACR ENDC FLG .XLIST .IFZ FLG .LIST .ENDC .LIST .ENDM .STITL SYSTEM PARAMETERS A=%0 B=%1 C=%2 D=%3 E=%4 F=%5 U=%5 P=%6 SP=%6 PC=%7 ERROR=TRAP RUG=100000 ;DONT CHANGE THE S.A., RADIA!! SKPRET==EMT ;DEVICE INFORMATION ;CONSOLE SWITCHES SWB=177570 ;CONSOLE SWITCH DATA ;CONSOLE TELETYPE ;BREAK LEVEL 4 TKBRV=60 ;CONSOLE KEYBOARD BREAK VECTOR TKS=177560 ;CONSOLE KEYBOARD STATUS TKB=177562 ;CONSOLE KEYBOARD DATA TPBRV=64 ;CONSOLE PRINTER BREAK VECTOR TPS=177564 ;CONSOLE PRINTER STATUS TPB=177566 ;CONSOLE PRINTER DATA ;DM11 ;BREAK LEVEL 5 DMRBRV=310 ;DM11 RECEIVER BREAK VECTOR DMTBRV=314 ;DM11 TRANSMITTER BREAK VECTOR DMCSR=175000 ;DM11 CONTROL AND STATUS REGISTER DMBAR=175002 ;DM11 BUFFER ACTIVE REGISTER DMBCR=175004 ;DM11 BREAK CONTROL REGISTER DMTBR=175006 ;DM11 TABLE BASE REGISTER ;PROGRAMMABLE CLOCK ;BREAK LEVEL 6 PCBRV=104 ;PROGRAMMABLE CLOCK BREAK VECTOR PCS=172540 ;PROGRAMMABLE CLOCK STATUS PCSTBF=172542 ;PROGRAMMABLE CLOCK SET BUFFER PCCNT=172544 ;PROGRAMMABLE CLOCK COUNTER ;RF11/RS11 DISK ;BREAK LEVEL 5 DSKBRV=204 ;DISK BREAK VECTOR DSKS=177460 ;DISK STATUS REGISTER DSKDBR=177472 ;DISK DATA REGISTER DSKWC=177462 ;DISK WORD COUNT DSKCA=177464 ;DISK CURRENT ADDRESS DSKA=177466 ;DISK ADDRESS DSKAE=177470 ;DISK EXTENDED ADDRESS DSKMT=177474 ;DISK MAINTENCE(WELL...) DSKSG=177476 ;DISK SEGMENT ;TK DISPLAY ;BREAK LEVEL 7? DISBRV=270 ;DISPLAY BREAK VECTOR NGCSR=164040 ;DISPLAY CONTROL AND STATUS REGISTER NGREL=164042 ;DISPLAY RELOCATION REGISTER ;DC11 HIGH SPEED LIN INTERFACE ;BREAK LEVEL 5 DCRBRV=300 ;RECIEVE BREAK VECTOR DCRS=174000 ;RECIEVE STATUS WORD DCRB=174002 ;RECIEVE BUFFER DCTBRV=304 ;TRANSMIT BREAK VECTOR DCTS=174004 ;TRANSMIT STATUS DCTB=174006 ;TRANSMIT BUFFER ;POWER FAIL PFBRV=24 ;BUS ERRORS BEBRV=4 ;TRAPS TRPBRV=34 EMTBRV=30 IOTBRV=20 BPTBRV=14 PWFBRV=24 ;EAE REGISTERS DIVIDE=177300 AC=177302 MQ=177304 MULTIP=177306 SR=177310 EAESR==177311 NORMAL=177312 LGS=177314 ARS=177316 SIPRBT==2 MQZ==10 ;PSSESOR STATUS PS=177776 .STITL ALLOCATION PARAMETERS SYPDLL==100 TMPDLL==20 PPDLL==600 SPDLL==600 DBUFL==400 DDIRBL==400 DTIBFL==2000 DEDBFL==2000 DDIRL==2000 DWRTEC==103 DREADC==105 DWRTCC==107 FRTRCF==1 SWTRCF==2 SPTRCF==4 GCTRCF==10 FRSCED==1 ;FLUSHED DUE TO SCEDULEING FRDSKW==3 ;HANGING ON DISK FRTYIW==4 ;HANGING ON TYI OF CHAR FRTYOW==5 ;HANGING ON FULL TYO BUFFER FRRAND==6 ;HANGING FOR "UNKNOWN" REASON FRNEWU==7 ;HANGING BECUASE HAVE NOT YET BEEN INITIALIZED FRTYIH==10 ;HANGING ON LINE INPUT .STITL MACROS .MACR PUSH AA MOV AA,-(P) JSR PC,PPUSHT .ENDM .MACR POP AA MOV (P)+,AA JSR PC,PPOPT .ENDM .MACR PUSHS AA JSR PC,SPUSHT MOV AA,@S .ENDM .MACR POPS AA MOV @S,AA JSR PC,SPOPT .ENDM .MACR SPUSH AA MOV AA,-(P) .ENDM .MACR SPOP AA MOV (P)+,AA .ENDM .MACR SPUSHS AA SUB #2,S MOV AA,@S .ENDM .MACR SPOPS AA MOV @S,AA ADD #2,S .ENDM .MACR TEXT AA .XLIST .ASCII \AA\ .BYTE 0 .EVEN .LIST .ENDM .MACR PRTXT AA .XLIST JSR PC,ERTAS TEXT ^\AA\ .LIST .ENDM .MACR PRCR JSR PC,.CRLF .ENDM .MACR SPACE JSR PC,.SPACE .ENDM .MACR TIMER A JSR PC,.TIME .ENDM .MACR UNTIME A JSR E,.UTIME A .ENDM .MACR UTIMER A JSR PC,.TIME .ENDM .MACR UUNTIM A MOV #A,.+20 ADD USER,.+12 JSR E,.UTIME 0 .ENDM .MACR REPT1 A,B .XLIST .REPT A B .ENDR .LIST .ENDM .MACR REPT2 A,B,C .XLIST .REPT A B C .ENDR .LIST .ENDM .MACR NOP NUM .XLIST .IFG NUM BR .+ NOP .ENDC .LIST .ENDM .MACR EXCH LOC1,LOC2 MOV LOC1,EXCH1 MOV LOC2,LOC1 MOV EXCH1,LOC2 .ENDM .MACR PAD A,B .PRINT \A B\ .ENDM .STITL TRAP VECTORS ;TRAP VECTORS ;UNUSED VECTORS .=0 REPT2 100,.+2,IOT ;GO TO 2ND WORD OF VECTOR AND DIE .=TRPBRV ERRBK ;TRAP IS USED FOR ERRORS 0 .=TKBRV TKBRK ;CONSOLE TTY KEYBOARD 200 ;IS ON BR4 .=TPBRV TPBRK ;CONSOLE TTY PRINTER 200 ;IS ON BR4 .=PCBRV CLKBRK ;PROGRAMMABLE CLOCK 300 ;IS ON BR6 .=DSKBRV DSKBRK ;FIXED HEAD DISK 300 ;IS ON BR5, INT ROUTINE RUNS ON LEVEL 6 .=DISBRV DISBRK ;DISPLAY 240 ;??????????? .=DMRBRV DMRBRK ;DM11 RECEIVE 240 ;? .=DMTBRV DMTBRK ;DM11 TRANSMIT 240 ;? .=IOTBRV IOTBRK 340 .=EMTBRV EMTBK 340 .=DCRBRV ;DC11 RECIEVE DCRBRK 240 .=DCTBRV ;DC11 TRANSMIT DCTBRK 240 .STITL SYSTEM VARIABLES(ONE COPY) .=400 JMP START .=.+SYPDLL ;SYSTEM PDL SPDLP: . ;SYSTEM PDL POINTER PAT: PATCH: .=.+200 ;PATCH AREA PATEND: .=770 LVERNF: VERNF .=<.!377>+1 DMCA=.-NFDMTY .=.+40 ;DM11 CURRENT ADDRESS DMWC=.-NFDMTY .=.+40 ;DM11 -BYTE COUNT .=.+40 ;DM11 BIT ASSEMBLY TABLE .=.+40 ;UNUSED DMTT: .=.+200 ;DM11 TUMBLE TABLE TKBRK: MOV TKB,CHI BIC #177600,CHI CMP CHI,BRKCHR BNE TKBRK1 MOV PC,BRAKE TKBRK1: RTI TPBRK: HALT DISBRK: HALT DMRBRK: HALT DMTBRK: HALT TMPDLP: TMPDL TMPDL: .=.+ ELAPSE: 0 0 USER: -1 ULAST: 0 ;LAST USER WHO WAS RUN NULTIM: 0 0 TIME: 0 ;TIME IN 1/100 TH'S OF A SEC 0 ;FROM START OF SYSTEM RUN QUANT: 4 ;UQUANT SET FRCM THIS UQUANT: 0 ;TIME IN 1/100THS USER SHOULD RUN NRABLU: 0 ;NUMBER OF USERS WITH FLSADR=0 NSWPU: 0 ;NUMBER OF USERS ASSIGNED TO SLOTS BUT NOT YET IN NINU: 0 ; " " " " " " AND ALREADY IN PUSPSL: 0 ;PREFERED USER SLOT TO SWAP PUSRSP: 0 ;PREFERED USER TO SWAP OUT SWPLEP: SWPLST ;PLACE TOO PUT NEXT REQ SWPLST: .=.++2 ;LIST OF SWAP REQUESTS MSWPOR: .=.+<16*MNSLTS*2> ;MOBY SWAP IN AND OUT BLOCKS SYSWPR: .=.+<16*MNUSRS> ;10 DISK REQUEST BLOCKS FOR GENERAL USE DSKCRB: 0 ;CURRENT DISK REQUEST SLOTST: .=.+ ;WORD 1 = SLOT USER ;WORD 2 = NEG, USER COMING IN; 1, USER JUST IN, >1 USER IN A WHILE 0 ;SO END TEST ALWAYS WORKS 0 DKRTYS: 0 ;# OF DISK RETRYS CORTOP: 0 ;FIRST NON-EX LOCATION NUNODE: 0 ;NUMBER OF NODES PER USER NUSERS: 1 ;NUMBER OF USERS NSLOTS: 1 ;NUMBER OF IN CORE SLOTS NUSER2: 2 FOO==0 .MACR MSWF MSWPOR+FOO FOO==FOO+34 .ENDM SLTCAD: REPT2 MNSLTS,MSWF,0 USWCNT: 0 ;NEGATIVE LENGTH OF USER SLOT USLENT: 0 ;LENGHT OF SLOT IN BYTES DUSECT: 0 ;COUNT OF SYSTEM DISK USAGES MOD 256 DSKDST: 20000 ;DISK OFFSET( NO USER OR SYSTEM CRAP BEFORE HERE) 2 DCLRUS: 20000 ;ADDRESS OF CLEAR USER IMAGE 2 DCRBFS: 40000 ;ADDRESS OF RECIEVE BUFFERS 2 DCTBFS: 42000 ;ADDRESS OF TRANSMIT BUFFERS 2 DSKRND: 140000 ;START OF RANDOM USER STORAGE 2 SNXTDB: 100000 ;NEXT BLOCK AVAILABLE 2 SDSKAD: 100000 ;BASE OF SYSTEM DISK BLOCKS 2 SDBITB: 1 ;SYSTEM DISK BIT TABLE REPT1 7,0 SDBITE: 100000 SFLAGS: 0 ;RANDOM SYSTEM FLAGS LOCKUS: -1 ;INDEX OF USER LOCKED IN CORE GCLOCK: -1 ;USER USING GARBAGE COLLLECTOR IS LOCKED IN CRMES: .BYTE 15,0 ;CR FOR ERTAP RWWSW: 0 BRKCHR: 0 ;THE BREAK CHAR FOR TODAY! JDCSW: 0 ;DISPLAY SYSTEM VARIABLES DLEN==400 ;LENGTH OF EACH DISPLAY LIST (IN BYTES) DPDLL==60 ;LENGTH OF EACH DISPLAY PDL (IN BYTES) TLEN==20 ;LENGTH OF EACH TURTLE LIST (IN BYTES) SDPDLL==60*3 ;TOTAL LENGTH OF DISPLAY PDL AREA (IN BYTES) SDLEN==400*3 ;TOTAL LENGTH OF DISPLAY LIST AREA (IN BYTES) STLEN==20*3 ;TOTAL LENGTH OF TURTLE LIST AREA (IN BYTES) DCONS: ;USER DISPLAY CONSOLE TABLE .BYTE 0 .BYTE 1 .BYTE 2 REPT1 5,.BYTE -1 SDISBT: ;EACH ENTRY HAS A 1 IN THE NTH BIT OVER .BYTE 1,2,4 .EVEN SDPDLP: ;DISPLAY PDL POINTER TABLE +> +> +> STLIST: ;TURTLE DISPLAY LIST AREA TABLE REPT1 3,TLIST+ ;DISPLAY TEMPORARIES ;THESE MUST BE IN THIS ORDER NEWX: .WORD 0,0 ;NEWX IS A TEMPORARY STORAGE FOR ROUTINES ; LIKE SETXY. IT CONTAINS WHAT CURX WILL BE SET ; TO IF THE ROUTINE DOESN'T ; ENCOUNTER A FATAL ERROR NEWY: .WORD 0,0 ;LIKE NEWX ;END OF ORDER TUT: 0 ;TURTLE TOP. POINTS TO TOP OF TURTLE DISPLAY LIST SNPTEM: 0 ;USED BY GARBAGE COLLECTOR EXCH1: 0 .CSRET==-127. GCMKL: TOPS TOPS1 GCP1 GCP2 GCPREV 0 .STITL SYSTEM VARIABLES (ONE COPY PER USER) UBLK=. FLSRES: 0 ;REASON USER NOT RUNNING FLSADR: 0 ;ADDRESS TO START AT AFTER FLUSH UACA: 0 UACB: 0 UACC: 0 UACD: 0 UACE: 0 TIMUSD: 0 0 UPC: 0 ;PROGRAM COUNTER UTTY: 0 BRAKE: 0 ;DO NOT CHANGE THE ORDER BELOW USWPAD: .=.+4 ;BEGINNING OF SWAP AREA DTYIBF: .=.+4 ;BEGINING OF TYI BUFFER ON DISK DEDTBF: .=.+4 ;BEGINNG OF EDIT BUFFER DHDDIR: .=.+4 ;BEGINING OF DISK DIRECTORY(OF HOME DISK) UNXTDB: .=.+4 ;NEXT DISK BLOCK AWAILABLE UDSKAD: .=.+4 ;RANDOM DISK STORAGE AREA LUBLK==.-UBLK L==LUBLK .=.+ ;NODE TYPES SFUN==000000 INFIX==10000 UFUN==20000 UVAR==30000 TYP1==40000 ;THE FOLLOWING TYPES ARE NEEDED IN THIS ORDER BY THE CONVERT ROUTINES SSTR==70000 ;NOT VALID TOKEN TYPE SNP==100000 ATOM==110000 SNUM==120000 ;NOT A VALID TOKEN TYPE LNUM==130000 LSTR==140000 RNUM==150000 LIST==170000 SENT==LIST ;END OF ORDER ;BINDING TYPES FBIND==20000 VBIND==30000 SFBIND==120000 ;SWAPPED OUT FUNCTION BINDING SVBIND==130000 ;SWAPPED OUT VARIABLE BINDING ;SOE FLAGS SEE OLE MACRO STUFF VNAF==2000 ;READ FLAGS SEE DTBL: DOTF==400 ;IN LEFT HALF ;EVAL FLAGS - PUSHED BY PEVAL PTLPF==1 ;PREVIOUS TOKEN WAS LEFT PAREN RTF==2 ;REPEAT TOKEN CRF==4 ;CURRENT TOKEN IS CR EDITF==10 ;EDIT FLAG TOF==20 ;TO FLAG IFF==40 ;IF FLAG TPTF==400 ;THIS PROCEDURE TRACED FLAG ;MUST BE IN LEFT HALF ;EVAL FLAGS2 - NOT PUSHED TESTF==1 TRACEF==2 PQF==4 ;PRINT QUOTE FLAG - FOR PRSTR DPQF=10 ;DONT " " " MMF==20 ;MULTIPLE MAKE FLAG ERRF==40 ;ERROR FLAG DSAMFL==1000 ;DISK ALMOST FULL PPNAIF==2000 ;P PDL NOT ALL THE WAY IN SPNAIF==4000 ;S PDL NOT ALL THE WAY IN ;TEMP FLAGS IN TFLAGS TF6==1 TF1==100 TF2==200 TF3==400 TF4==10000 TF5==20000 ;FLAGS IN LEFT HALF OF 1ST NODE OF SWAPPED PROC LIST ; TPTF==400 DEFINED ABOVE .STITL USER VARIABLES UVBLK=. ;BELOW RELATIVE TO BASE OF SLOT WHEN USER NOT RUNNING UAB: NODESP-SLOT1 ;BASE OF CURRENT USER'S NODE SPACE S: IS-SLOT1 UPDLP: IP-SLOT1 ;USER PDL POINTER(ONLY WHEN USER NOT RUNNING) SPOPL: IS-SLOT1 SPUSHL: IS-SLOT1-524 SSWPAD: IS-SLOT1-400+4-2 SPBASE: IS-SLOT1 SPRBAO: IS-SLOT1 ;SAME FOR S : S-SPRBAO = REL ADDR OF TOP THING ON S PDL PPOPL: IP-SLOT1 PPUSHL: IP-SLOT1-524 PSWPAD: IP-SLOT1-400+4-2 PPBASE: IP-SLOT1 PRBAO: IP-SLOT1 ;PDL REL BASE ADDR OFFSET SUHCT: UHCT-SLOT1 ;START OF USER HASH CODE TABLE GCBITS: DBUF-SLOT1 BASEUS: 0 ;BASE OF USER SLOT(MUST BE LAST RELOCATED) UVREND=. ;END OF VARIABLES TO BE RELOCATED ;BELOW ARE NOT RELATIVE UAC: 0 ;EAE AC UMQ: 0 ;EAE MQ USR: 0 ;EAE STATUS REGISTER RELA==1 RELB==2 RELC==4 RELD==10 RELE==20 ACRELF: 0 NNGC: 0 ;NUMBER OF NODES GARBAGE COLLECTED ERRINA: -1 ;ADDRESS OF SWAPED IN ERROE ROUTINE SSAVEA: 0 ;PLACE S PDL SAVED WHEN MARKING SWAPED OUT PDL 0 FREE: SOFN ;START OF FREE NODES TOPS: 0 ;GC MARK FROM HERE IF NON 0 TOPS1: 0 ; " GCP1: 0 GCP2: 0 GCPREV: 0 ;THE FOLLOWING ARE PUSHED BY PEVAL CPP: 0 ;CURRENT PROCEDURE POINTER CPSN: 0 ;C.P. SWAP NO. CLN: 0 ;CURRENT LINE NO. CLP: 0 ;CURRENT LINE POINTER - GOOD IF CPSN'S AGREE CLGN: 0 ;CURRENT LINE GENERATION NO. CTN: 0 ;CURRENT TOKEN NO. CTP: 0 ;CURRENT TOKEN POINTER FUNLEV: 0 ;FUNCTION LEVEL IFLEV: 0 ;IF LEVEL FLAGS: 0 ;FLAG WORD CSPDLP: 0 ;CURRENT S PDL PTR AFTER LAST PEVAL PUSH CPDLP: 0 ;CURRENT PDL PTR AFTER LAST PEVAL PUSH ;END OF PEVAL PUSHES EXCEPT REL. S, CO AND CO+2 ARE ALSO PUSHED ;THE FOLLOWING ARE PUSHED (SOMETIMES) BY EVAL CO: 0 ;CURRENT OPERATOR 0 NOR: 0 ;NO. OF OPERANDS STILL NEEDED BEFORE CO CAN BE EXECUTED ;END OF EVAL PUSHES COF: 0 ;CURRENT OPERATOR FLAGS LO: 0 ;LAST OPERATOR 0 CT: 0 ;CURRENT TOKEN 0 ; " RDFLAG: 0 ;FOR READ LISTBD: 0 ;LIST BUILD DEPTH PSTOPR: 0 ;RETURN ADDR FOR PSTOP UNGRAB: 0 ;FOR .GRAB. PUTTING A NODE ADDR HERE MEANS THAT IT ;WILL BE THE NEXT GRABBED. GC WILL MARK FROM "UNGRAB" ;USE WITH CAUTION!! TEMP: 0 TFLAGS: 0 ;TEMP FLAGS (ALL TFN'S SHOULD EVENTALLY POINT HERE) NCHR: 0 ;FOR BLST TOPRNM: 0 ;PTR TO UOE OF PROC. BEING "TO"'ED FNLLP: 0 ;FIRST NODE OF LIST OF LINE POINTERS (FOR "TO") FLAGS2: 0 ;EVAL FLAGS - NOT PUSHED BY PEVAL ALTL: 0 ;TEST LINE POINTER LINENO: 0 ;FOR TEST MODE CHI: 0 ;FOR TYI PRMTCH: '? ;PROMPT CHAR GNCN: 0 ;"GET NEXT CHAR" NODE 0 NBKTS: 0 ;FOR RDSTR PCHR: TYO ;PLACE WHERE OUTPUT CHARS GO (TYO, BLST, ...) DBITTB: .=.+40 DBITBE=.-2 ;VARIABLES AND CONSTANTS FOR DISPLAY SYSTEM ;THESE MUST BE IN THIS ORDER DORBEG==. ;MARKS BEGINNING OF THESE VARIABLES CURX: .WORD 0,0 ;CURX = CURRENT X POSITION ; THE FIREST WORD IS THE INTEGER PART ; THE SECOND WORD IS THE FRACTION PART CURY: .WORD 0,0 ;CURY = CURRENT Y POSITION CURA: 0 ;CURA = THE CURRENT ANGLE OLDX: 0 ;CONTAINS CURX AT THE TIME OF LAST NEW SNAP OLDY: 0 ;CONTAINS CURY AT THE TIME OF LAST NEW SNAP OLDIR: .BYTE 0 ;CONTAINS DIREC WHEN DR.LIN LAST CALLED DFLAGS: .BYTE 0 .EVEN DOREND==. ;MARKS END OF THESE VARIABLES ;END OF ORDER STB: 0 ;STATIC AREA BOTTOM STT: 0 ;STATIC AREA TOP.POINTS TO TOP OF STATIC DISPLAY AREA DYB: 0 ;DYNAMIC BOTTOM. POINTS TO BOT OF DY AREA DYR: 0 ;ROVING POINTER USED BY DISPLAY STORAGE ALLOCATIN ROUTINES DYT: 0 ;POINTER TO DYNAMIC AREA TOP TUB: 0 ;POINTER TO TURTLE AREA BOTTOM SNLIST: 0 ;POINTER TO SNAP LIST SNABOT: 0 ;BOTTOM OF CURRENT SNAP SINA: 0 ;CONTAINS SIN OF THE CURENT ANGLE COSA: 0 ;CONTAINS COS OF THE CURENT ANGLE DIREC: 0 ;CONTAINS DIRECTION CODE FRO CURRENT ANGLE BYCNT: 0 ;KEEPS TRACK OF LAST BIT IN DISPLAY LIST PUSHJT: 0 ;DISPLAY PUSHJ TO TURTLE DISBIT: 0 ;HAS A BIT SET CORRESPONDING TO DISPLAY SLOT ;THIS MUST BE AT THE END MAXELN==60 ERRBUF: .=.+MAXELN LUVBLK==.-UVBLK ;DISPLAY COMMANDS ADDX==150000 ADDY==144000 ADDXY==ADDX!ADDY DPUSHJ==100000 DPOP==140200 DPOPJ==140100 DSTOP==140400 DRSTXY==143000 ;RESET X AND Y TO 0 TURSIZ==4 ;THE SIZE OF THE TURTLE ;FLAGS USED FOR DFLAGS PENUF==1 HOOKF==2 HIDETF==4 TURTF==10 TEMF==20 .STITL SYSTEM OBLIST VARIABLE==4 ;FOR VARIABLE NUMBER OF ARGUMENTS $==-1 ;DEFAULT INDICATOR IN OLE YINFIX==20 ;"YES INFIX" FLAG FOR OLE ;ARGUMENT TYPES ; 0 ==== ANYTHING ANYT==0 ATOMT==1 WORDT==ATOMT ;A WORD IS THE SAME AS AN ATOM NUMT==2 SENTT==4 SNAPT==10 LISTT==20 ANSLT==ATOMT+NUMT+SENTT+LISTT ;ALL BUT SNAP ;SOE FIELDS 1.==RIGHT BYTE (EVEN ADDR) 2.==LEFT BYTE ; 1.1==RIGHT BIT 2.8==LEFT BIT ;1.1-1.8 INPUT TYPE ACCEPTABLE BY THIS PROCEDURE ;2.1-2.2 "STANDARD" NO. OF INPUT ARGS ;2.3 VNAF 1==CAN TAKE "ANY" NO. OF ARGS ;2.5 INFIX 1==THIS IS AN INFIX PROCEDURE ;2.6-2.8 PRECEDENCE .MACR NGPTWO A .XLIST NGP2=NGP2*2 FOO==A .IFLE NGP2-FOO NGPTWO A .ENDC .LIST .ENDM ;**************************************************** ;MACRO TO DEFINE SYSTEM OBLIST ELEMENTS ;THE PARAMETERS ARE: ;1) THE PRINT NAME ;2) THE NAME OF THE POINTER TO THE OBLIST ELEMENT. ; THIS PARAMETER CAN BE $ IF YOU DON'T CARE ABOUT THE ; NAME, OR IF YOU WANT THE NAME TO BE $PNAME ;3) THE ADDRESS OF THE PROGRAM ; THIS PARAMETER CAN BE $ IF THE NAME OF THE PROGRAM ; IS THE SAME AS THE PRINT NAME ;4) THE PRECEDENCE. A NUMBER FROM 0-7 ;5) THE TYPE OF PERMISSIBLE ARGUMENTS ; IF IT CAN TAKE MORE THAN ONE KIND OF ARGUMENT ; ADD UP ALL THE KINDS. EG NUMT+LISTT+ATOMT ;6) THE STANDARD NUMBER OF ARGUMENTS + THE SYMBOL "VARIABLE" ; IF IT CAN ALSO TAKE A VARIABLE NUMBER OF ARGUMENTS ;7) THE SYMBOL "YINFIX" IF THIS IS AN INFIX OPERATOR ; ;IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT ;ANY PARAMETER THAT YOU WANT TO BE 0 YOU CAN LEAVE OUT ;ANY PARAMETER YOU DON'T CARE ABOUT YOU CAN LEAVE OUT. .MACR OLE PNAME,OBNAME,ADDR,PRECED,ARGTYP,NUMARG,QINFIX .XLIST OBX0=OBSTRT-. ;CHECK TO SEE THAT THE OBLIST DOESN'T ;OVERWRITE THE OBLIST ELEMENTS .IF2 .IFNDF OBNAME OBNAME=0 ;TO AVOID UNDEFINED SYMBOL ERROR .ENDC .ENDC .IFG OBX0 OBADD2 ;POINTER TO OBLIST ELEMENT OBADD1=. .=OBADD2 .IFL OBNAME+0 ;$ HAS BEEN DEFINED TO BE -1 $'PNAME=. .ENDC .IFGE OBNAME+0 $'OBNAME=. .ENDC .BYTE ARGTYP+0 OBX1=NUMARG+0 OBX2=PRECED+0*40 .BYTE QINFIX+OBX1+OBX2 .IFL ADDR+0 PNAME ;ADDRESS OF PROGRAM .ENDC .IFGE ADDR+0 ADDR+0 .ENDC TEXT ^\PNAME\ OBADD2=. .=OBADD1 .ENDC .IFLE OBX0 .LIST ******** NUMOBS IS LESS THAN THE NUMBER OF SYSTEM OBLIST ELEMENTS. THEREFORE, YOU ARE OVERWRITING THE SYSTEM OBLIST ******** .XLIST .ENDC .LIST .ENDM .MACR CDM A A==<.-SOBLSU>/2 .ENDM ;THE SYSTEM OBLIST ;ADD ITEMS (EXCEPT FOR SPECIAL CHAR ITEMS) ALPHABETICALLY. ;**** NUMOBS==91. ;THE NUMBER OF OBLIST ELEMENTS ;**** WHENEVER YOU ADD AN OBLIST ELEMENT, MAKE SURE YOU INCREMENT ;**** NUMOBS !!!!!! SOOMX: 2+SOBLSU ;2 > THAN HIGHEST ADDR USED IN SYS OBLIST NGP2==1 NGPTWO SOBLSU-SOBLST+2 SOBP2: NGP2 ;( SMALLEST POWER OF 2 >= NUMOBS )*2 OBADD1=. OBADD2=.+<2*NUMOBS> OBSTRT=OBADD2 ;WHERE THE SYSTEM OBLIST ELEMENTS START SOBLST: OLE AND,$ OLE BACK,$,$,2,NUMT,1 OLE BUTFIRST,$,$,2,ANYT,1 OLE BUTLAST,$,$,2,ANYT,1 OLE COUNT,$,$,2,ANYT,1 OLE CTF,$,CLRSTF,2 OLE DIFFERENCE,$,DIFF,2,NUMT,2 OLE DISPLAY,$,$,2,LISTT+SNAPT,1 OLE DO,$,$,2,,1 OLE EDIT,$,$,2 OLE ELSE,$,$,2 OLE EMPTYP,$,$,2,ANYT,1 OLE END,$,$,2 OLE EQUAL,$,$,2,NUMT,2 OLE ERASETRACE,$,ETRACE,2,,1 OLE FIRST,$,$,2,ANYT,1 OLE FORWARD,$,$,2,NUMT,1 OLE FPRINT,$,$,2,,1+VARIABLE OLE FPUT,$,$,2,,2+VARIABLE OLE GO,$,$,2,NUMT,1 OLE GREATER,$,GREATR,2,NUMT,2 OLE HEADING,$,$,2 OLE HERE,$,$,2 OLE HIDETURTLE,$,$,2 OLE HOME,$,$,2 OLE IF,$,$,2,WORDT,1 OLE KILLDISPLAY,$,$,2 OLE LAMPOFF,LPOFF,$,2 OLE LAMPON,LPON,$,2 OLE LAST,$,$,2,ANYT,1 OLE LEFT,$,$,2,NUMT,1 OLE LESS,$,$,2,NUMT,2 OLE LEVEL,$,FLEV,2 OLE LIST,$,LIST.P,2,,2+VARIABLE OLE LISTP,$,$,2,,1 OLE LPUT,$,$,2,,2+VARIABLE OLE MAKE,$,$,2,,2 OLE MOD,$,$,2,NUMT,2 OLE NEWSNAP,$,$,2 OLE NUMBERP,$,NUMBP,2,ANYT,1 OLE OF,$ OLE OUTPUT,$,$,2,0,1 OLE PENDOWN,$,$,2 OLE PENUP,$,$,2 OLE PRINT,$,$,2,ANSLT,1+VARIABLE OLE PRODUCT,$,PROD,2,NUMT,2+VARIABLE OLE QUOTIENT,$,DIVDE,2,NUMT,2 OLE REQUEST,$,RQUEST,2 OLE RIGHT,$,$,2,NUMT,1 OLE RUG,$,RUNRUG OLE SENTENCE,$,$,2,ANYT,2+VARIABLE OLE SETHEADING,$,$,2,NUMT,1 OLE SETTURTLE,$,$,2,SENTT,1 OLE SETX,$,$,2,NUMT,1 OLE SETXY,$,$,2,NUMT,2 OLE SETY,$,$,2,NUMT,1 OLE SHOW,$,$,2,,1 OLE SHOWTURTLE,$,$,2 OLE SNAP,$,$,2 OLE STARTDISPLAY,$,$,2 OLE STF,$,SETSTF,2 OLE STOP,$,$,2 OLE SUM,$,$,2,NUMT,2+VARIABLE OLE THEN,$,$,2 OLE TO,$,$,2 OLE TOOT,$,$,2,NUMT,1 OLE TRACE,$,$,2,,1 OLE TYPE,$,$,2,ANSLT,1+VARIABLE OLE VERSION,$,VERSN,2 OLE WIPE,$,$,2,ATOMT+NUMT,1 OLE WIPECLEAN,$,$,2 OLE WORD,$,$,2,ANYT,2+VARIABLE OLE WORDP,$,$,2,ANYT,1 OLE XCOR,$,$,2 SOBLSU: OLE YCOR,$,$,2 ;MUST BE ON LAST ENTRY BEFORE SINGLE CHAR ENTRIES OLE ^\!\,LLPAR,LLPAR,1,ANYT,1 CDM HAS$ OLE ^\#\,PROC,PROC,6,ATOMT,1 CDM LP$ OLE ^\(\,LPAR,LPAR,1,,1 CDM RP$ OLE ^\)\,RPAR,RPAR,1 CDM PRD$ OLE ^\*\,STAR,PROD,5,NUMT,2+VARIABLE,YINFIX CDM PLU$ OLE ^\+\,PLUS,SUM,4,NUMT,2+VARIABLE,YINFIX OLE ^\+.\,UPLUS,UPLUS,6,NUMT,1 CDM MIN$ OLE ^\-\,MINUS,DIFF,4,NUMT,2,YINFIX OLE ^\-.\,UMINS,UMINS,6,NUMT,1 CDM DIV$ OLE ^\/\,SLSH,DIVDE,5,NUMT,2,YINFIX CDM DOTS$ OLE ^\:\,DOTS,DOTS,6,ATOMT,1 CDM LSS$ OLE ^\<\,LESS,LESS,3,NUMT,2,YINFIX CDM EQL$ OLE ^\=\,EQUAL,EQUAL,3,NUMT,2,YINFIX CDM GTR$ OLE ^\>\,GRTR,GREATR,3,NUMT,2,YINFIX CDM BKSL$ ; OLE ^/^/,BKSL,MOD,5,NUMT,2,YINFIX .=OBADD2 .STITLE DISPATCH TABLE (ENGLISH) ;FLAGS-- ;FSF -- SPECIAL ON INPUT ;FOF -- SPECIAL ON OUTPUT ;FQF -- QUOTING CHARACTER ;SEPF -- SEPARATOR CHARACTER ;WSF -- WORD SEPARATOR ;NNUMF -- NOT A NUMBER ;OPERF -- OPERATOR ;FLAGS--BYTE ONE NUMBER--BYTE TWO ; FSF FOF FQF SEPF WSF NNUMF OPERF # ;^@ . . . . . NNUMF . . ;^A . . . . . NNUMF . . ;^B . FOF . . . NNUMF . 0 ;^C FSF . . . . NNUMF . 0 ;^D FSF . . . . NNUMF . 2 ;^E . . . . . NNUMF . . ;^F . . . . . NNUMF . . ;^G FSF FOF . . . NNUMF . 4 ;^H . FOF . . . NNUMF . 2 ;^I . FOF . SEPF WSF NNUMF . 10 ;^J . FOF . SEPF WSF NNUMF . 12 ;^K . FOF . SEPF WSF NNUMF . 14 ;^L . FOF . SEPF WSF NNUMF . 16 ;^M FSF FOF . SEPF WSF NNUMF . 6 ;^N FSF . . . . NNUMF . 10 ;^O . . . . . NNUMF . . ;^P . . . . . NNUMF . . ;^Q FSF . . . . NNUMF . 12 ;^R FSF . . . . NNUMF . 14 ;^S FSF . . . . NNUMF . 16 ;^T . . . . . NNUMF . . ;^U . . . . . NNUMF . . ;^V . . . . . NNUMF . . ;^W FSF . . . . NNUMF . 20 ;^X FSF . . . . NNUMF . 22 ;^Y FSF . . . . NNUMF . 24 ;^Z FSF . . . . NNUMF . 26 ;^[ . . . . . NNUMF . . ;^\ . . . . . NNUMF . . ;^] . . . . . NNUMF . . ;^^ . . . . . NNUMF . . ;^_ . . . . . NNUMF . . ;SP . . . SEPF WSF NNUMF . . ;! . . . . . NNUMF . . ;" . . . SEPF . NNUMF . . ;# . . . SEPF . NNUMF OPERF HAS$ ;$ . . . . . NNUMF . . ;% . . . . . NNUMF . . ;& . . . . . NNUMF . . ;' . . . SEPF . NNUMF . . ;( . . . SEPF . NNUMF OPERF LP$ ;) . . . SEPF . NNUMF OPERF RP$ ;* . . . SEPF . NNUMF OPERF PRD$ ;+ . . . SEPF . NNUMF OPERF PLU$ ;, . . . . . NNUMF . . ;- . . . SEPF . NNUMF OPERF MIN$ ;. . . . . . NNUMF . . ;/ . . . SEPF . NNUMF OPERF DIV$ ;0 . . . . . . . . ;1 . . . . . . . . ;2 . . . . . . . . ;3 . . . . . . . . ;4 . . . . . . . . ;5 . . . . . . . . ;6 . . . . . . . . ;7 . . . . . . . . ;8. . . . . . . . . ;9. . . . . . . . . ;: . . . SEPF . NNUMF OPERF DOTS$ ;; . . . SEPF . NNUMF . . ;< . . . SEPF . NNUMF OPERF LSS$ ;= . . . SEPF . NNUMF OPERF EQL$ ;> . . . SEPF . NNUMF OPERF GTR$ ;? . . . . . NNUMF . . ;@ . . . . . NNUMF . . ;A . . . . . NNUMF . . ;B . . . . . NNUMF . . ;C . . . . . NNUMF . . ;D . . . . . NNUMF . . ;E . . . . . NNUMF . . ;F . . . . . NNUMF . . ;G . . . . . NNUMF . . ;H . . . . . NNUMF . . ;I . . . . . NNUMF . . ;J . . . . . NNUMF . . ;K . . . . . NNUMF . . ;L . . . . . NNUMF . . ;M . . . . . NNUMF . . ;N . . . . . NNUMF . . ;O . . . . . NNUMF . . ;P . . . . . NNUMF . . ;Q . . . . . NNUMF . . ;R . . . . . NNUMF . . ;S . . . . . NNUMF . . ;T . . . . . NNUMF . . ;U . . . . . NNUMF . . ;V . . . . . NNUMF . . ;W . . . . . NNUMF . . ;X . . . . . NNUMF . . ;Y . . . . . NNUMF . . ;Z . . . . . NNUMF . . ;[ . . FQF SEPF WSF NNUMF . 0 ;\ . . . . . NNUMF . . ;] . . FQF SEPF WSF NNUMF . 2 ;^ . . . SEPF . NNUMF OPERF BKSL$ ;_ . . . SEPF . NNUMF . . ;` . . . . . NNUMF . . ;a . . . . . NNUMF . . ;b . . . . . NNUMF . . ;c . . . . . NNUMF . . ;d . . . . . NNUMF . . ;e . . . . . NNUMF . . ;f . . . . . NNUMF . . ;g . . . . . NNUMF . . ;h . . . . . NNUMF . . ;i . . . . . NNUMF . . ;j . . . . . NNUMF . . ;k . . . . . NNUMF . . ;l . . . . . NNUMF . . ;m . . . . . NNUMF . . ;n . . . . . NNUMF . . ;o . . . . . NNUMF . . ;p . . . . . NNUMF . . ;q . . . . . NNUMF . . ;r . . . . . NNUMF . . ;s . . . . . NNUMF . . ;t . . . . . NNUMF . . ;u . . . . . NNUMF . . ;v . . . . . NNUMF . . ;w . . . . . NNUMF . . ;x . . . . . NNUMF . . ;y . . . . . NNUMF . . ;z . . . . . NNUMF . . ;{ . . . . . NNUMF . . ;| . . . . . NNUMF . . ;} . . . . . NNUMF . . ;~ . . . . . NNUMF . . ;RBO FSF . . . . NNUMF . 30 .STITLE SYSTEM DISPATCH TABLE (BYTE ONE) ;FLAG DEFINITIONS FSF==200 ;SPECIAL INPUT FOF==100 ;SPECIAL OUTPUT FQF==20 ;QUOTING SEPF==4 ;SEPARATOR WSF==2 ;WORD SEPARATOR NNUMF==40 ;NOT A NUMBER OPERF==10 ;OPERATOR DTBL: .BYTE NNUMF,NNUMF ;^@ ;^A .BYTE FOF!NNUMF,FSF!NNUMF ;^B ECHOES AS BLANK ;^C COPYS NEXT CHARACTER .BYTE FSF!NNUMF,NNUMF ;^D DELETES NEXT CHARACTER ;^E .BYTE NNUMF,FSF!FOF!NNUMF ;^F ;^G BREAK .BYTE FOF!NNUMF,FOF!SEPF!WSF!NNUMF ;^H BACKSPACE ;^I TABULATE .BYTE FOF!SEPF!WSF!NNUMF,FOF!SEPF!WSF!NNUMF ;^J LINE FEED ;^K TABULATE VERTICALLY .BYTE FOF!SEPF!WSF!NNUMF,FSF!FOF!SEPF!WSF!NNUMF ;^L FORM FEED ;^M CARRIAGE RETURN ECHOES AS CARRIAGE RETURN LINE FEED .BYTE FSF!NNUMF,NNUMF ;^N GET NEXT WORD ;^O .BYTE NNUMF,FSF!NNUMF ;^P ;^Q SUPER-QUOTE .BYTE FSF!NNUMF,FSF!NNUMF ;^R COPY REST OF LINE ;^S SKIP NEXT WORD .BYTE NNUMF,NNUMF ;^T ;^U .BYTE NNUMF,FSF!NNUMF ;^V ;^W ERASE LAST WORD .BYTE FSF!NNUMF,FSF!NNUMF ;^X CLARIFY INPUT ;^Y EDIT PREVIOUS LINE .BYTE FSF!NNUMF,NNUMF ;^Z DESTROY INPUT BUFFER ;^[ MAYBE ALTMODE .BYTE NNUMF,NNUMF ;^\ ;^] .BYTE NNUMF,NNUMF ;^^ ;^_ WELL, ANY BETTER IDEAS FOR THEM? .BYTE SEPF!WSF!NNUMF,NNUMF ;SP ;! ????? .BYTE SEPF!NNUMF,SEPF!NNUMF!OPERF ;" ;# ACTION OF .BYTE NNUMF,NNUMF ;$ ;% .BYTE NNUMF,NNUMF!OPERF ;& ;' (MAYBE LE) .BYTE SEPF!NNUMF!OPERF,SEPF!NNUMF!OPERF ;( ARITHMETIC GROUPING ;) DITTO .BYTE SEPF!NNUMF!OPERF,SEPF!NNUMF!OPERF ;* MULTIPLY ;+ ADD .BYTE NNUMF,SEPF!NNUMF!OPERF ;, ;- SUBTRACT .BYTE NNUMF,SEPF!NNUMF!OPERF ;. ;/ DIVIDE .BYTE 0,0 ;0 ;1 .BYTE 0,0 ;2 ;3 .BYTE 0,0 ;4 ;5 .BYTE 0,0 ;6 ;7 .BYTE 0,0 ;8. ;9. .BYTE SEPF!NNUMF!OPERF,SEPF!NNUMF ;: THING OF ;; PROPERTY OF .BYTE SEPF!NNUMF!OPERF,SEPF!NNUMF!OPERF ;< ;= .BYTE SEPF!NNUMF!OPERF,NNUMF ;> ;? .BYTE NNUMF,NNUMF ;@ ;A .BYTE NNUMF,NNUMF ;B ;C .BYTE NNUMF,NNUMF ;D ;E .BYTE NNUMF,NNUMF ;F ;G .BYTE NNUMF,NNUMF ;H ;I .BYTE NNUMF,NNUMF ;J ;K .BYTE NNUMF,NNUMF ;L ;M .BYTE NNUMF,NNUMF ;N ;O .BYTE NNUMF,NNUMF ;P ;Q .BYTE NNUMF,NNUMF ;R ;S .BYTE NNUMF,NNUMF ;T ;U .BYTE NNUMF,NNUMF ;V ;W .BYTE NNUMF,NNUMF ;X ;Y .BYTE NNUMF,FQF!SEPF!WSF!NNUMF ;Z ;[ .BYTE NNUMF,FQF!SEPF!WSF!NNUMF ;\ LOGICAL OR ;] .BYTE SEPF!NNUMF!OPERF,SEPF!NNUMF ;^ EXPONENTIATE, MAYBE ;_ MAKE .BYTE NNUMF,NNUMF ;` GRAVE ACCENT. LOOK THAT UP ON YOUR TELTERM. ;a LOWER CASE .BYTE NNUMF,NNUMF ;b LOWER CASE ;c LOWER CASE .BYTE NNUMF,NNUMF ;d LOWER CASE ;e LOWER CASE .BYTE NNUMF,NNUMF ;f LOWER CASE ;g LOWER CASE .BYTE NNUMF,NNUMF ;h LOWER CASE ;i LOWER CASE .BYTE NNUMF,NNUMF ;j LOWER CASE ;k LOWER CASE .BYTE NNUMF,NNUMF ;l LOWER CASE ;m LOWER CASE .BYTE NNUMF,NNUMF ;n LOWER CASE ;o LOWER CASE .BYTE NNUMF,NNUMF ;p LOWER CASE ;q LOWER CASE .BYTE NNUMF,NNUMF ;r LOWER CASE ;s LOWER CASE .BYTE NNUMF,NNUMF ;t LOWER CASE ;u LOWER CASE .BYTE NNUMF,NNUMF ;v LOWER CASE ;w LOWER CASE .BYTE NNUMF,NNUMF ;x LOWER CASE ;y LOWER CASE .BYTE NNUMF,NNUMF ;Z LOWER CASE ;LEFT BRACE .BYTE NNUMF,NNUMF ;VERTICAL BAR ;RIGHT BRACE .BYTE NNUMF,FSF!NNUMF ;TILDE ;RUBOUT .STITLE SYSTEM DISPATCH TABLE (BYTE TWO) ;NUMBERS POINT TO OTHER TABLES ;$ POINTS TO SYSTEM OBLIST DTBL2: .BYTE 0,0 ;^@ ;^A .BYTE 0,0 ;^B ECHOES AS BLANK ;^C COPYS NEXT CHARACTER .BYTE 2,0 ;^D DELETES NEXT CHARACTER ;^E .BYTE 0,4 ;^F ;^G BREAK .BYTE 2,10 ;^H BACKSPACE ;^I TABULATE .BYTE 12,14 ;^J LINE FEED ;^K TABULATE VERTICALLY .BYTE 16,6 ;^L FORM FEED ;^M CARRIAGE RETURN ECHOES AS CARRIAGE RETURN LINE FEED .BYTE 10,0 ;^N GET NEXT WORD ;^O .BYTE 0,12 ;^P ;^Q SUPER-QUOTE .BYTE 14,16 ;^R ;^S SKIP NEXT WORD .BYTE 0,0 ;^T ;^U .BYTE 0,20 ;^V ;^W ERASE LAST WORD .BYTE 22,24 ;^X CLARIFY INPUT ;^Y .BYTE 26,0 ;^Z DESTROY INPUT BUFFER ;^[ MAYBE ALTMODE .BYTE 0,0 ;^\ ;^] .BYTE 0,0 ;^^ ;^_ WELL, ANY BETTER IDEAS FOR THEM? .BYTE 0,0 ;SP ;! ????? .BYTE 0,HAS$ ;" ;# ACTION OF .BYTE 0,0 ;$ ;% .BYTE 0,0 ;& ;' (MAYBE LE) .BYTE LP$,RP$ ;( ARITHMETIC GROUPING ;) DITTO .BYTE PRD$,PLU$ ;* MULTIPLY ;+ ADD .BYTE 0,MIN$ ;, ;- SUBTRACT .BYTE 0,DIV$ ;. ;/ DIVIDE .BYTE 0,0 ;0 ;1 .BYTE 0,0 ;2 ;3 .BYTE 0,0 ;4 ;5 .BYTE 0,0 ;6 ;7 .BYTE 0,0 ;8. ;9. .BYTE DOTS$,0 ;: THING OF ;; PROPERTY OF .BYTE LSS$,EQL$ ;< ;= .BYTE GTR$,0 ;> ;? .BYTE 0,0 ;@ ;A .BYTE 0,0 ;B ;C .BYTE 0,0 ;D ;E .BYTE 0,0 ;F ;G .BYTE 0,0 ;H ;I .BYTE 0,0 ;J ;K .BYTE 0,0 ;L ;M .BYTE 0,0 ;N ;O .BYTE 0,0 ;P ;Q .BYTE 0,0 ;R ;S .BYTE 0,0 ;T ;U .BYTE 0,0 ;V ;W .BYTE 0,0 ;X ;Y .BYTE 0,0 ;Z ;[ .BYTE 0,2 ;\ LOGICAL OR ;] .BYTE BKSL$,0 ;^ TEMPORARILY MODULO (MAYBE EXPONENTIATE) ;_ MAKE .BYTE 0,0 ;` GRAVE ACCENT. LOOK THAT UP ON YOUR TELTERM. ;a LOWER CASE .BYTE 0,0 ;b LOWER CASE ;c LOWER CASE .BYTE 0,0 ;d LOWER CASE ;e LOWER CASE .BYTE 0,0 ;f LOWER CASE ;g LOWER CASE .BYTE 0,0 ;h LOWER CASE ;i LOWER CASE .BYTE 0,0 ;j LOWER CASE ;k LOWER CASE .BYTE 0,0 ;l LOWER CASE ;m LOWER CASE .BYTE 0,0 ;n LOWER CASE ;o LOWER CASE .BYTE 0,0 ;p LOWER CASE ;q LOWER CASE .BYTE 0,0 ;r LOWER CASE ;s LOWER CASE .BYTE 0,0 ;t LOWER CASE ;u LOWER CASE .BYTE 0,0 ;v LOWER CASE ;w LOWER CASE .BYTE 0,0 ;x LOWER CASE ;y LOWER CASE .BYTE 0,0 ;z LOWER CASE ;{ OPEN BRACE .BYTE 0,0 ;| VERTICAL BAR, MAYBE OR, MAYBE XOR ;} CLOSE BRACE .BYTE 0,30 ;~ TILDE, LOGICAL NOT ;RBO RUBOUT???? .STITL LOSS CHECKING ROUTINES IOTBRK: INC #-4 LOSSCT=.-2 BGT LOSER SPUSH A SPUSH USER MOV #-1,USER PRCR PRTXT ^/BAD TRAP--VECTOR / MOV 6(SP),A SUB #4,A ;MAKE IT REAL CMP #BEBRV,A ;IS IT A BUS ERROR? BEQ BUSSER JSR PC,PRON PRTXT ^/ TRAPPED FROM / MOV 12(SP),A JSR PC,PRON PRCR SPOP USER SPOP A ADD #4,SP RTI EMTBRK: HALT BUSSER: PRTXT ^/BUSS ERROR!!!/ LOSER: PRTXT ^/I GIVE UP!!/ HALT BR .-2 .STITL DISK STARTER DSKSRT: MOV #DCRDRB,A ;CHECK FOR DC11 RECIEVE FIRST TST 14(A) BNE DSKSGO MOV #SYSWPR,A ;NEXT LOOK AT SYSTEM REQUESTS DSKSR1: TSTB 14(A) ;IS THE FUNCTION NON ZERO? BNE DSKSGO ;FOUND A REQUEST, GO DO IT ADD #16,A ;LOOK AT NEXT BLOCK CMP #16*MNUSRS+SYSWPR,A ;LAST BLOCK? BGT DSKSR1 MOV SWPLST,A ;MOOBY SWAP OUT REQS? BNE DSKSGO CLR DSKS RTS PC ;NO DISK REQUESTS EXTANT, BETTER LUCK NEXT TIME DSKSGO: MOV A,DSKCRB ;ADDRESS OF BLOCK ABOUT TO BE SERVICED MOV (A),B BEQ .+4 ;BRANCH IF NO JSR PC,(B) ;RUN START ROUTINE DSKSG1: TST (A)+ MOV #DSKWC,B ;START OF DISK I/O WORDS MOV (A)+,(B)+ ;WORD COUNT MOV (A)+,(B) ;CORE ADDRESS ADD #2,(B)+ ;GODFORSAKEN DEC!!!!! MOV (A)+,(B)+ ;LOW ORDER DISK ADDRESS MOV (A)+,(B)+ ;HIGH " " " TST (A)+ ;GO PAST UNUSED WORD MOVB (A),DSKS ;SET FUCTION, ENABLE INTERUPT, GO!! RTS PC DPROVK: SPUSH PS MOV #340,PS CMP #200,DSKS ;IF THE INTERUPT IS OFF AND THE DISK IS READY BNE DSKSG2 ;PROVOKE IT; OTHERWISE LEAVE IT FOR SOMEONE ELSE SPUSH A SPUSH B JSR PC,DSKSRT SPOP B SPOP A DSKSG2: SPOP PS RTS PC .STITL DISK REQUEST BLOCK GRABBER SYDRBG: SPUSH PS ;SAVE OLD PROSSESOR LEVEL MOV #340,PS ;LOCK OUT INTERUPTS MOV #SYSWPR,A ;LOOK FOR A FREE SYSTEM DISK REQUEST BLOCK SDRBG1: TST 14(A) ;IS IT FREE? BEQ SDRBG2 ADD #16,A ;LOOK AT NEXT ONE CMP #16*MNUSRS+SYSWPR,A ;ANY MORE? BGT SDRBG1 ;YES, SEE IF FREE SPOP PS ;NO MORE, WE HAVE LOST BIG WAIT ;THIS WILL PROBABLY NOT DO ANY GOOD BR SYDRBG ;AND CERTAINLY WON'T UNLESS OUR PRIORITY IS <5 SDRBG2: MOV DUSECT,14(A) ;LABEL BLOCK AS IN USE, BUT NO REQUEST INCB DUSECT+1 ;SO PEOPLE CAN DISTINGUISH SPOP PS ;YOU CAN INTERUPT NOW. RTS PC ;USER ROUTINE TO FLUSH UNTIL DISK REQUEST POINTED TO BY A DONE DSKWA2: ADD #14,A DSKWAI: MOV USER,U MOV (A),B DSKWA1: CMP B,(A) BEQ DNDONE JSR PC,RUNME RTS PC DNDONE: MOV #FRDSKW,FLSRES(U) JSR PC,FLUSH BR DSKWA1 UBLKGR: MOV #DBITTB,A ;USERS BIT TABLE ADDR MOV #DBITBE,B MOV #UNXTDB,D ;POINTER TO ADDR OF NEXT AWAILABLE BLOCK ADD USER,D MOV #DBITBE,E ;END OF USERS BIT TABLE CLR F ;DISK ISN'T NEARLY FULL BIT #DSAMFL,FLAGS2 ;IS THE DISK ALLMOST FULL? BEQ .+4 ;NO INC F ;YES JSR PC,BLKGRB ;GO DO GOOD THINGS RTS PC ;DISK REALLY FULL TST F ;IS DISK NEARLY FULL? BEQ UBLKG1 ;NO, SKIP RETURN BIS #DSAMFL,FLAGS2 ;YES WARN THE WORLD. UBLKG1: JMP SRET ;WIN ANYWAY, SKIP RETURN UBLKFR: MOV #DBITTB,E MOV USER,B MOV UDSKAD(B),D JSR PC,BLKFRE BIC #DSAMFL,FLAGS2 ;DISK NOW SURELY HAS A FREE BLOCK RTS PC ;GRABS A DISK BLOCK AND A REQUEST BLOCK ;REQUEST BLOCK ADDR RETURNS IN A ;DISK BLOCK ADDR RETURNS IN B AND C ;ARGS: BEGINNING OF BIT TABLE IN A ;END OF BIT TABLE IN B ;ADDR OF NEXT BLOCK WORDS IN D ;DISK ALMOST FULL FLAG IN F BLKGRB: CLR C BLKGR3: MOV #1,E BLKGR2: BIT E,(A) ;IS THIS BLOCK FREE? BEQ BLKGR5 ;YES, PRAISE THE LORD! INC C ;NO, TRY THE NEXT BLOCK ASL E BCC BLKGR2 ;NO OVERFLOW? TST (A)+ ;NEXT WORD CMP A,B ;AT END OF THE TABLE BLE BLKGR3 ;CONTINUE TST F ;NO BLOCK AVAILABLE, ARE WE REAL FULL? BEQ BLKGR4 ;NO, BUT CLOSE RTS PC ;YES, VERY FULL BLKGR4: INC F ;DISK ALMOST FULL BR BLKGR6 BLKGR5: BIS E,(A) ;THAT BLOCK IS NO LONGER FREE CLR F ;AND THE DISK ISN'T NEARLY FULL BLKGR6: JSR PC,SYDRBG ;GET A DISK REQUEST BLOCK MOV #-200,2(A) ;ALL BLOCKS ARE THIS LONG MOV (D),6(A) ;NEXT AVAILABLE BLOCK MOV 2(D),10(A) SPUSH (D) SPUSH 2(D) SWAB C ;MULTIPLY BY 200 ASR C BIC #100000,C MOV 6(D),2(D) ;LOW ORDER BASE ADDR ADD 4(D),C ;LOW ORDER BASE ADDR ADC 2(D) MOV C,(D) SPOP C SPOP B JMP SRET ;FREES THE DISK BLOCK WHOSE LOW ORDER ADDR IS IN C ;BASE OF THIS DISK SPACE IS IN D ;ADDRESS OF THE APPRPRIATE BIT TABLE IS IN E BLKFRE: SUB D,C ;RELOCATE DISK ADDR RELATIVE TO ZERO MOV #1,B BIT #177,C BEQ .+4 HALT BLKFR1: BIT #3777,C ;IS ADDR DIVISABLE BY 20*200? BEQ BLKFR2 ;YES SUB #200,C ;NO, TRY TO MAKE IT BE ASL B ;AND GET "REMAINDER" IN B BR BLKFR1 BLKFR2: SWAB C ;DIVIDE BY 400 ASR C ;BY 2 ASR C ;BY 2=>DIVIDED BY 400*2*2=2000=4000/2 ADD C,E ;GET POINTER INTO BIT TABLE BIC B,(E) ;AND FREE THE BLOCK RTS PC .STITL DISK INTERUPT ROUTINE DSKBRK: SPUSH A SPUSH B BIT #100000,DSKS ;ANY ERROR BITS SET? BNE DSKLOS ;BITE THE BAG! MOV DSKCRB,A ;POINTER TO FUNCTION WORD CLR 14(A) ;REQUEST HAS BEEN SERVICED MOV (A),B BEQ .+4 ;NO JSR PC,(B) ;YES, GO DO IT CLR (A) DSKRTY: JSR PC,DSKSRT ;LOOK FOR SOMETHING ELSE TO DO DSKRET: SPOP B SPOP A RTI DSKLOS: HALT ;DISK LOST BIG MOV #400,DSKS ;POWER CLEAR IT HALT ;GIVE IT A CHANCE BR DSKRTY ;TRY AGAIN(EVENTUALLY) .STITL SCHEDUALER RUNME: TST USER BGE RUNME1 RUNME2: RTS PC ;SYSTEM CALLED RUNME RUNME1: TST FLSADR(U) ;IF HE WANTS TO RUN HE SHOULD JSR HERE BEQ RUNME2 ;IF FLSADR IS ZERO, JUST KEEP RUNNING HIM MOV #-1,USER ;SYSTEM IS NOW USER JSR PC,UACSAV ;STORE HIS ACS CLR FLSADR(U) ;GUY IS NOW RUNABLE CLR FLSRES(U) INC NRABLU SPOP UPC(U) ;HE SHOULD START AFTER THE JSR PC,RUNME NEXTU1: MOV #SLOTST,A ;TRY TO RUN USER IN U NEXTU2: CMP U,(A)+ ;IS HE ASSIGNED A SLOT IN CORE? BNE NEXTU3 ;NOT THIS ONE, ANYWAY TST (A) ;IS HE ALL THE WAY IN? BLT NEXTUS ;NO CAN'T RUN HIM YET BEQ NEXTU3 CMP #FRNEWU,FLSRES(U) BNE NEXT14 MOV #UGO,FLSADR(U) TST RWWSW BNE NEXT15 MOV SLTCAD-SLOTST-2(A),C MOV #16,D JMP NEXT11 NEXT14: CLR FLSRES(U) JMP RUNUSR ;CALL TO GET INDEX OF NEXT USER TO RUN NEXTUS: SUB #LUBLK,ULAST ;COUNT BACKWARDS BGE .+10 ;DON'T GO NEG MOV #*LUBLK,ULAST ;LAST POSSIBLE USER INDEX MOV ULAST,U ;SEE IF THIS IS A GOOD GUY TO RUN NEXT15: CMP #FRTYIH,FLSRES(U) BEQ NEXTUS TST FLSADR(U) ;IF FLSADR IS ZERO, RUNABLE(???) BEQ NEXTU1 ;RUN HIM. BLT NEXTUS ;NEG=>NON EX USER MOV U,USER ;USER IS NOW USER JSR PC,UACRES ;RESTORE HIS ACS JMP @FLSADR(U) ;SEE IF HE SHOULD REALLY RUN NEXTU3: TST (A)+ ;EXTANT CORE SLOT? BNE NEXTU2 ;YES, CHECK NEXT ONE MOV PUSPSL,A ;SEE IF THERE IS A PREFERED SLOT BGT NEXTU6 MOV #SLOTST,A NEXTU4: TST (A)+ TST (A)+ BLT NEXTU4 BEQ NEXTUS CMP #1,-2(A) BEQ NEXTU4 ;GUY HASN'T RUN YET, DON'T SWAP HIM OUT MOV -2(A),B ;USER THAT MAY BE SWAPED OUT CMP B,LOCKUS ;IS HE LOCKED IN? BEQ NEXTU4 ;YES, DON'T BOTHER HIM CMP B,GCLOCK BEQ NEXTU4 TST NSWPU ;ARE THERE USERS BEING SWAPED? BEQ NEXTU6 ;NO, SWAP ONE CMP NINU,#1 ;IS THERE ONLY ONE USER IN CORE? BEQ NEXTUS ;YES, RUN HIM NEXTU6: CLR PUSPSL ;IF THERE WAS A PREFERED SLOT, WE ARE DOING IT TST -(A) MOV -2(A),B ;FOUND A GOOD SLOT, USER TO SWAP OUT INTO B MOV U,-2(A) ;NEW OCCUPANT OF SLOT FOR DEBUG BIT #SWTRCF,SFLAGS ;TRACE SWAPS? BEQ NEXTU5 SPUSH A PRTXT ^/SWAPPING: / MOV B,A JSR PC,PRON SPACE MOV U,A ;USER WHO IS COMING IN JSR PC,PRON SPACE MOV (P),A SUB #SLOTST+2,A ASR A ASR A JSR PC,PRON ;SLOT SPACE MOV TIME,A JSR PC,PRON PRCR SPOP A .ENDC ENDC DEBUG NEXTU5: CLR D MOV SLTCAD-SLOTST-2(A),C ;MOBY SWAP OUT BLOCK FOR THIS SLOT MOV #SWPOST,(C)+ ;SWAP OUT USER START ROUTINE MOV USWCNT,(C)+ ;WORD COUNT OF A USER SLOT MOV SLTCAD-SLOTST(A),(C)+ ;SLOT CORE ADDRESS MOV USWPAD(B),(C)+ ;LOW ORDER SWAP OUT ADDR OF U TO SWAP OUT MOV USWPAD+2(B),(C)+ ;HIGH OORDER TST (C)+ ;WASTED WORD MOV #DWRTEC,(C)+ ;DISK WRITE COMMAND NEXT11: DEC NINU ;ONE LESS IN CORE INC NSWPU ;ONE MORE MOVING AROUND MOV #SWPIST,(C)+ ;SWAP IN USER START ROUTINE MOV USWCNT,(C)+ ;SLOT WORD COUT MOV SLTCAD-SLOTST(A),(C)+ ;SLOT CORE ADDRESS CMP #FRNEWU,FLSRES(U) BNE NEXT12 MOV DCLRUS,(C)+ MOV DCLRUS+2,(C)+ MOV #UGO,FLSADR(U) MOV UDSKAD(U),UNXTDB(U) MOV UDSKAD+2(U),UNXTDB+2(U) BR NEXT13 NEXT12: MOV USWPAD(U),(C)+ ; " " MOV USWPAD+2(U),(C)+ ;USER ADDRESS ON DISK NEXT13: MOV A,(C)+ ;ADDRESS OF PLACE TO ZAP TO 1 WHEN DONE MOV #DREADC,(C) ;READ FROM DISK SUB #32,C ;BEGINING OF MOOBY SWAP REQ PAIR ADD D,C SPUSH PS MOV #340,PS ;NO INTS! MOV C,@SWPLEP ADD #2,SWPLEP SPOP PS MOV #-1,(A) ;NOT IN YET BR NEXT10 NEXTU7: MOV #-1,USER ;FLUSH ENTERS HERE, SYSTEM NOW USER MOV #SLOTST,A ;SEE IF THIS SUPER FLUSHED GUY IS IN CORE NEXTU8: CMP U,(A)+ BNE NEXTU9 ;NOT HERE. TST (A)+ ;IS HE REALLY IN? BLE NEXT10 ;NO, NOT REALLY CMP #FRDSKW,FLSRES ;IF JUST HUNG ON DISK BEQ NEXT10 ;FORGET HIM MOV A,PUSPSL ;HE IS PREFERED OUT MOV U,PUSRSP BR NEXT10 NEXTU9: TST (A)+ BNE NEXTU8 NEXT10: JMP NEXTUS FLUSH: TST USER BGE FLUSH4 RTS PC FLUSH4: JSR PC,UACSAV ;STOP USER; STORE HIS ACS MOV AC,UAC MOV MQ,UMQ MOV SR,USR MOV FLSADR(U),A SPOP FLSADR(U) ;SAVE PC TST A ;IS THIS GUY ALREADY STOPED? BNE NEXTU7 ;GO TRY ANOTHER GUY UUNTIM TIMUSD MOV #-1,USER TIMER NULTIM TST FLSRES(U) BNE .+10 MOV #FRRAND,FLSRES(U) DEC NRABLU MOV P,UPDLP ;SAVE USER'S POINTER MOV SPDLP,P ;SYSTEM PDL FOR DEBUG BIT #FRTRCF,SFLAGS BEQ FLUSH3 PRTXT ^/FLUSHING USER / MOV U,A JSR PC,PRON SPACE MOV TIME,A JSR PC,PRON PRCR .ENDC ENDC DEBUG FLUSH3: MOV #UVBLK,A MOV BASEUS,B ;TO BLT OUT USER VARIABLES FLUSH1: SUB B,(A)+ ;UNRELOCATE A POINTER CMP #UVREND,A ;END OF VARS TO BE UNRELOCATED? BGT FLUSH1 ;GO DO ANOTHER MOV #UVBLK,A ;SET UP FOR BLT MOV ACRELF,C BEQ FLUSH2 MOV U,D ADD #UACA-2,D ;POINTER TO USERS ACS FLUSH5: TST (D)+ ;NEXT AC TO MAYBE RELOCATE TST C BEQ FLUSH2 ;NO MORE TO RELOCATE CLC ROR C BCC FLUSH5 ;DON'T RELOCATE THIS ONE SUB B,(D) BR FLUSH5 FLUSH2: MOV (A)+,(B)+ ;ONE AT A TIME, KIDDIES! CMP #UVBLK+LUVBLK-MAXELN,A ;DONE? BGT FLUSH2 JMP NEXTUS ;RUNUSR, THE "MAIN LOOP" RUNUSR: CMP U,PUSRSP ;AM I THE GUY THEY WANT OUT? BNE .+6 ;BRANCH IF NO CLR PUSPSL ;I DON'T WANT TO GO! INC (A) ;INDICATE THAT THIS GUY HAS BEEN RUN MOV SLTCAD-SLOTST(A),D ;SLOT ADDRESS THIS GUY IS IN TST (D)+ ;REALLY RIGHT NOW MOV D,B ;BASE OF SLOT MOV #UVBLK,C ;BASE OF USER VARIABLES RUNUS1: MOV (B)+,(C)+ ;BLTTTTTTTTTTTT! CMP #UVBLK+LUVBLK,C BGT RUNUS1 MOV #UVBLK,C ;TO RELOCATE VARIABLES RUNUS2: ADD D,(C)+ ;ADD BASE OF SLOT CMP #UVREND-2,C BGT RUNUS2 MOV D,BASEUS MOV ACRELF,A BEQ RUNUS5 MOV U,B ADD #UACA-2,B RUNUS6: TST (B)+ TST A BEQ RUNUS5 CLC ROR A BCC RUNUS6 ADD D,(B) BR RUNUS6 RUNUS5: FOR DEBUG BIT #FRTRCF,SFLAGS BEQ RUNUS4 PRTXT ^/STARTING USER / MOV U,A JSR PC,PRON SPACE MOV TIME,A JSR PC,PRON PRCR .ENDC ENDC DEBUG RUNUS4: MOV P,SPDLP ;SAVE SYSTEM PDL POINTER MOV UPDLP,P ;GET USER PDL POINTER MOV U,USER ;NOW HE'S REALLY THE GUY SPUSH UPC(U) ;PLACE TO START USER MOV QUANT,UQUANT ;RUN FOR 3 1/100TH'S???? UNTIME NULTIM UTIMER TIMUSD MOV UAC,AC MOV UMQ,MQ MOV USR,SR JMP UACRES ;RESTORE USER ACS AND START USER SCHEDP: TST UQUANT ;SEE IF IT'S TIME TO FLUSH BLE .+4 ;NOT YET RTS PC SPUSH U MOV USER,U MOV #FRSCED,FLSRES(U) JSR PC,FLUSH JSR PC,RUNME SPOP U RTS PC .STITL CLOCK BREAK ROUTINE CLKBRK: SPUSH A SPUSH B ADD #200,TIME ADC TIME+2 DEC UQUANT TSTB DSKS ;IS THE DISK BUSY? BGE .+6 ;YES JSR PC,DSKSRT CMP #13183.,TIME+2 ;IS IT MIDNIGHT? BLE DATEC ;YES, CHANGE THE DATE CLKBR1: JMP @#CLKBR2 CLKBR2: SPOP B SPOP A RTI CLKBDM: BIT #7777,TIME ;EVERY 4 BRKS (=<4*128>/10,000 SECS) BNE CLKBR2 ;1/20 < T < 1/21 SECS JSR PC,DMSQ JSR PC,TI2Q BR CLKBR2 DATEC: CLR TIME+2 ;TIME IS NOW ZERO INC RDAY ;CHANGE THE DAY MOV RMONTH,A CMPB RDAY,DMON(A) BLE CLKBR1 ;NOT ON A MONTH BOUNDARY INC RMONTH MOV #1,RDAY CMP #12,RMONTH BLE CLKBR1 INC RYEAR MOV #1,RMONTH BR CLKBR1 RDAY: 0 RMONTH: 0 RYEAR: 0 DMON: .BYTE 31.,28.,31.,30.,31.,30.,31.,31.,30.,31.,30.,31. .STITL SWAP START+STOP ROUTINES SWPOST: MOV #SWPOSP,(A) ;SWAP OUT USER START, SET UP STOP RTS PC SWPOSP: TST (P)+ ;FLUSH RETURN, WE'RE NOT GOING BACK THAT WAY ADD #16,A ;POINT TO SWAP IN BLOCK JSR PC,DSKSGO ;START DISK ON THAT JMP DSKRET ;AND RETURN FROM INTERUPT SWPIST: MOV #SWPISP,(A) ;SWAP IN START, SET UP STOP RTS PC SWPISP: CLR UQUANT ;SCHED REAL SOON MOV 12(A),B ;FLAG MOV #1,(B) ;THIS GUY IS IN AND NOT RUN YET SUB #2,SWPLEP SPUSH A MOV #SWPLST+2,A MOV #SWPLST,B MOV (A)+,(B)+ BNE .-2 INC NINU ;ONE MORE GUY IN DEC NSWPU ;ONE LESS GUY MOVING SPOP A RTS PC .STITL MISC ROUTINES ACSAV: MOV E,-(P) MOV D,-(P) MOV C,-(P) MOV B,-(P) MOV A,-(P) JMP (F) ACRES: TST (P)+ MOV (P)+,A MOV (P)+,B MOV (P)+,C MOV (P)+,D MOV (P)+,E RTS F UACSAV: MOV A,UACA(U) MOV B,UACB(U) MOV C,UACC(U) MOV D,UACD(U) MOV E,UACE(U) RTS PC UACRES: MOV UACA(U),A MOV UACB(U),B MOV UACC(U),C MOV UACD(U),D MOV UACE(U),E RTS PC PPUSHT: CMP P,PPUSHL BLOS .+4 RTS PC BIT #177000,P ;IS IT THE SYSYTEM PDL? BNE .+4 RTS PC ;YES, IGNORE JMP PPSWPO ;PDL REALLY OVERFLOWED PPOPT: CMP P,PPOPL BHIS .+4 RTS PC JMP PPSWPI SPUSHT: SUB #2,S CMP S,SPUSHL BLOS .+4 RTS PC JMP SPSWPO SPOPT: ADD #2,S CMP S,SPOPL BHI .+4 RTS PC JMP SPSWPI .SPACE: PRTXT ^\ \ RTS PC .CRLF: JMP @#.+4 JSR PC,ERTAP CRMES RTS PC CRLF: MOV #15,D JMP TYO .STITL P AND S PDL SWAP OUTERS PPSWPO: JSR F,ACSAV ;TIME TO WORK! FOR DEBUG BIT #SPTRCF,SFLAGS BEQ PPSWP1 SUB #100,PPUSHL ;SO IT DOESN'T OVERFLOW AGAIN PRTXT ^/SWAPPING OUT P PDL / MOV P,A SUB A,PRBAO NEG A JSR PC,PRON PRCR ADD #100,PPUSHL .ENDC ENDC DEBUG PPSWP1: JSR PC,UBLKGR ;GET ALL THE GOOD STUFF WE NEED HALT ;WHAT, NO DISK SPACE HALT ;STOP, YOU STUPID MACHINE SPUSH B ;SAVE ADDRESS MOV PSWPAD,4(A) ;PLACE WHERE PDL IS MOVB #DWRTEC,14(A) ;WRITE IT ONTO THE RIGHT PLACE JSR PC,DSKWA2 ;FLUSH UNTIL IT IS REALLY OUT MOV BASEUS,A ADD #PDLINK+4-SLOT1,A ;GIVING US THE LINK ADDRESS+4 FOR THIS GUY MOV C,-(A) ;HIGH ORDER PART SPOP -(A) ;LOW ORDER PART BIT #PPNAIF,FLAGS2 ;WAS THE PDL NOT ALL THE WAY IN ANYWAY? BNE .+10 ;PART ALREADY OUT SUB #54,PPOPL ;NONE OUT BEFORE, CHANGE LIMIT BIS #PPNAIF,FLAGS2 ;CERTAINLY NOT ALL IN NOW MOV PSWPAD,B ;ADDRESS-2 PDL SWAPED FROM MOV (B),-(A) ;MOVE WORDS UP MOV -(B),-(A) CMP B,P BGE .-4 ADD #374,P ;PDL HAS MOVED! ADD #374,PRBAO JSR F,ACRES ;ALL DONE! RTS PC SPSWPO: JSR F,ACSAV ;TIME TO WORK! FOR DEBUG BIT #SPTRCF,SFLAGS BEQ SPSWP1 PRTXT ^/SWAPING OUT S PDL / MOV S,A SUB A,SPRBAO NEG A JSR PC,PRON PRCR .ENDC ENDC DEBUG SPSWP1: JSR PC,UBLKGR ;GET ALL THE GOOD STUFF WE NEED HALT ;WHAT, NO DISK SPACE HALT ;STOP, YOU STUPID MACHINE SPUSH B ;SAVE ADDRESS MOV SSWPAD,4(A) ;PLACE WHERE PDL IS MOVB #DWRTEC,14(A) ;WRITE IT ONTO THE RIGHT PLACE JSR PC,DSKWA2 ;FLUSH UNTIL IT IS REALLY OUT MOV BASEUS,A ADD #SDLINK+4-SLOT1,A ;GIVING US THE LINK ADDRESS+4 FOR THIS GUY MOV C,-(A) ;HIGH ORDER PART SPOP -(A) ;LOW ORDER PART BIT #SPNAIF,FLAGS2 ;WAS THE PDL NOT ALL THE WAY IN ANYWAY? BNE .+10 ;PART ALREADY OUT SUB #54,SPOPL ;NONE OUT BEFORE, CHANGE LIMIT BIS #SPNAIF,FLAGS2 ;CERTAINLY NOT ALL IN NOW MOV SSWPAD,B ;ADDRESS-2 PDL SWAPED FROM MOV (B),-(A) ;MOVE WORDS UP MOV -(B),-(A) CMP B,S BGE .-6 ADD #374,S ;PDL HAS MOVED! ADD #374,SPRBAO JSR F,ACRES ;ALL DONE! RTS PC .STITL P AND S PDL SWAPER INERS PPSWPI: BIT #PPNAIF,FLAGS2 ;IS THE PDL ALL THE WAY IN? BNE .+4 ;NO (PRAISE THE LORD!) HALT JSR F,ACSAV FOR DEBUG BIT #SPTRCF,SFLAGS BEQ PSWPI1 PRTXT ^/SWAPING IN P PDL / MOV P,A SUB A,PRBAO NEG A JSR PC,PRON PRCR .ENDC ENDC DEBUG PSWPI1: MOV PSWPAD,A MOV A,B ADD #374,A MOV (A),(B) MOV -(A),-(B) CMP A,P BGT .-4 SUB #374,P SUB #374,PRBAO JSR PC,SYDRBG TST (A)+ MOV #-200,(A)+ MOV PSWPAD,(A)+ MOV PPBASE,E MOV (E)+,C MOV C,(A)+ MOV (E),(A)+ TST (A)+ MOVB #DREADC,(A) JSR PC,DSKWAI MOV PPBASE,D TST (D)+ BNE PSWPI2 TST (D) BNE PSWPI2 BIC #PPNAIF,FLAGS2 ;IF BOTH LINKS ARE ZERO NOW, THERE IS NO MORE PDL ON DISK ADD #54,PPOPL PSWPI2: JSR PC,UBLKFR JSR F,ACRES RTS PC SPSWPI: BIT #SPNAIF,FLAGS2 ;IS THE PDL ALL THE WAY IN? BNE .+4 ;NO (PRAISE THE LORD!) HALT JSR F,ACSAV FOR DEBUG BIT #SPTRCF,SFLAGS BEQ SSWPI1 PRTXT ^/SWAPING IN S PDL / MOV S,A SUB A,SPRBAO NEG A JSR PC,PRON PRCR .ENDC ENDC DEBUG SSWPI1: MOV SSWPAD,A MOV A,B MOV (A),(B) ADD #374,A MOV (A),(B) MOV -(A),-(B) CMP A,S BGT .-6 SUB #374,S SUB #374,SPRBAO JSR PC,SYDRBG TST (A)+ MOV #-200,(A)+ MOV SSWPAD,(A)+ MOV SPBASE,E MOV (E)+,C MOV C,(A)+ MOV (E),(A)+ TST (A)+ MOVB #DREADC,(A) JSR PC,DSKWAI MOV SPBASE,D TST (D)+ BNE SSWPI2 TST (D) BNE SSWPI2 BIC #SPNAIF,FLAGS2 ;IF BOTH LINKS ARE ZERO NOW, THERE IS NO MORE PDL ON DISK ADD #54,SPOPL SSWPI2: JSR PC,UBLKFR JSR F,ACRES RTS PC .IFZ 105 SWAPER: CLR A SWAP1: PUSH A PUSHS A INC A CMP A,B BGT SWAP2 BR SWAP1 SWAP2: POP C POPS D DEC A CMP A,D BEQ .+4 HALT CMP A,C BEQ .+4 HALT TST A BEQ SWAPER BR SWAP2 .ENDC .STITL TIMER ROUTINES .TIME: SPUSH A SPUSH B SPUSH C SPUSH D SPUSH PS MOV #340,PS JSR PC,GTIME JSR PC,URELTM MOV TMPDLP,D MOV (A),(D)+ MOV -(A),(D)+ MOV D,TMPDLP CLR (A)+ CLR (A) JSR PC,RELTIM SPOP PS SPOP D SPOP C SPOP B SPOP A RTS PC .UTIME: SPUSH A SPUSH B SPUSH C SPUSH D SPUSH PS MOV #340,PS JSR PC,GTIME JSR PC,URELTM MOV (E)+,A ADD ELAPSE,(A)+ ADC (A) ADD ELAPSE+2,(A) MOV TMPDLP,D MOV -(D),ELAPSE MOV -(D),ELAPSE+2 MOV D,TMPDLP JSR PC,RELTIM SPOP PS SPOP D SPOP C SPOP B SPOP A RTS E URELTM: MOV #ELAPSE,A ADD B,(A)+ ADC (A) ADD C,(A) RTS PC RELTIM: MOV #ELAPSE,A SUB B,(A)+ SBC (A) SUB C,(A) RTS PC GTIME: MOV PCCNT,B ADD #200,B TSTB PCS BGE .+6 MOV #200,B MOV TIME+2,C ADD TIME,B ADC C RTS PC .STITL COMMUNICATE WITH MAIN MACHINE RJLSW: 0 ;NON-ZERO=> ACTIVATE COMMUNICATE LINK REDY10: 0 ;NON-ZERO=>10 IS READY SYSMES: 0 ;NUMBER OF MESSAGES WAITING FOR THE SYSTEM .MACR EXCHA X,Y MOV X,A MOV Y,X MOV A,Y .ENDM ;LOGIN STRING LOGMES: .BYTE 'Z-100,'S-100,'S-100,'_-100 .ASCII /R11LOGO/ .BYTE 33 .ASCII /U11HERE/ .BYTE 'K-100,0 .EVEN ;RECIEVE VARIABLES RBPOIN: 0 DCRBIP: DCRBF1-2 ;INITIAL POINTER DCRACF: 0 ;ACKNOWLEDGE FLAG DCRCKS: 0 ;CHECKSUM OF INCOMING WORDS DCRMID: 0 ;ID # SENT WITH MESSAGE DCRWCT: 0 ;WORD COUNT OF CURRENT MESSAGE DCRPRB: 0 ;"PARITY" BITS FOR INCOMING WORD DCRWBL: 0 ;BUILD RECIEVED WORD HERE DCRLST: .=.+40 ;MESSAGES WAITNING TO BE PICKED UP DCRDRB: .WORD 0,-400,DCRBF2-2,0,0,0,0 ;DISK REQUEST BLOCK ;TRANSMIT VARIABLES TBPOIN: 0 DCTSMS: .=.+20 ;SMALL (1 OR 2 CHAR)MESSAGES TO BE SENT DCTBST: .=.+40 ;MESSAGES WAITING TO BE SENT ;BUFFERS DCRBF1: .=.+100 ;RECIEVE BUFFER 1 DCRBF2: .=.+100 ; " " 2 ;DC11 PDLS .=.+20 RLOGIN RPDLP: .-2 .=.+20 TLOGIN TPDLP: .-2 ;RECIEVE INTERUPT ROUTINES DCRBRK: SPUSH A EXCHA RPDLP,P ;SET UP RECIEVE PDL MOV DCRB,A ;GET CHAR FROM LINE RTS PC ;RESUME PROCESSING RFLUSH: EXCHA RPDLP,P ;RESTORE PDL SPOP A RTI RLOGIN: BIS #100,DCTS ;WAKE UP TRANSMIT ROUTINE JSR PC,RFLUSH ;GET NEXT CHAR CMP #140,A ;IS IT SYNC? BNE RLOGIN ;NO, WAIT FOR THE 10 TO WAKE UP INC REDY10 ;10 IS READY TO COMMUNICATE RECLOP: JSR PC,RFLUSH ;GET THE NEXT CHAR OFF THE LINE SUB #140,A ;IS IT CONTROL CHAR? BLT RECLOP ;NO (THIS SHOULDN'T HAPPEN) CMP #10,A ;IS IT TOO BIG? BLE RECLOP ;YUP (THIS SHOULD HAPPEN EVEN LESS!!) ASL A JMP @RECTAB(A) ;DO THE CONTROL CHAR RECTAB: RECLOP ;NULL, SYNC(WHATEVER YOU WANT TO CALL IT) STPREC ;STOP! ACTREC ;WELL????? RECLOP ;??? RECLOP ;???? ACKREC ;ACKNOWLEDGEMENT OF TRANSMITTED MESSAGE NAKREC ;NEGATIVE, PLEASE SEND AGAIN DATA ;DATA BLOCK COMES NEXT STPREC:ACTREC: BR RECLOP NAKREC: MOV #-1,DCRACF ;FOR NAK BR ACKRC1 ACKREC: CLR DCRACF ACKRC1: JSR PC,GBITCH ;GET NUMBER OF MESSAGE BEING "ACK"ED BR RECLOP ;LOSE! CMP #20,A ;IS IT TOO BIG? BLE RECLOP ASL A MOV DCRACF,DCTBST(A) ;TELL TRANSMIT ROUTINES ACK OR NAK BR RECLOP DATA: CLR DCRCKS ;CLEAR CHECKSUM JSR PC,GWORD ;GET A WORD OFF THE LINE JMP RECLOP ;BAD PARITY IN WORD, CAN'T WIN MOVB DCRWBL+1,DCRMID ;SENDERS ID # FOR THIS DATA MOVB A,DCRWCT ;NUMBER OF WORDS FOLLOWING, INC. CHECKSUM MOV DCRBIP,RBPOIN ;POINTER TO CURRENT BUFFER DATA1: ADD #2,RBPOIN ;POINT TO NEXT WORD JSR PC,GWORD BR NODATA ;PARITY ERROR IN WORD MOV A,@RBPOIN ;SAVE WORD DEC DCRWCT ;IS IT THE LAST ONE(CHECKSUM)? BGT DATA1 ;NO TST DCRCKS ;SHOULD BE ZERO BNE NODATA ;NO SUCH LUCK TST DCRDRB+14 ;HAS THE LAST MESSAGE MADE IT TO THE DISK? BNE NODATA ;NO, CAN'T KEEP THIS MESSAGE SPUSH B MOV #DCRLST,B TST (B)+ ;IS THIS RECIEVE BUFFER FREE? BNE .-2 ;NO TST -(B) ;FOUND A FREE ONE CMP #DCRLST+40,B ;IS IT REALLY ONE? BGE NODATA ;NO PLACE TO PUT MESSAGE EXCHA DCRBIP,DCRDRB+4 ;EXCH BUFFER USAGE TST (A)+ MOV (A),A ;THIS IS THE MESSAGE ID MOV A,(B) ;SO THE USER CAN FIND IT BIT #177400,A ;IS THIS MESSAGE FOR THE SYSTEM? BNE .+6 ;NO INC SYSMES ;TELL THE SYSTEM IT HAS A MESSAGE SUB #DCRLST,B ASL B ASL B ASL B ASL B ADD DCRBFS,B MOV B,DCRDRB+6 MOV DCRBFS+2,DCRDRB+10 ;DISK ADDRESS OF BUFFER MOV #DCTSMS,A ;FIND A SMALL MESSAGE SLOT TST (A)+ BNE .-2 MOV #<145_10>,B BIS DCRMID,B ADD #40,B SWAB B MOV B,-(A) SPOP B JMP RECLOP NODATA: JMP RECLOP ;GET 16 BIT WORD OFF THE LINE ;6 BITS, 6 BITS, 2 PARITY+4 BITS (PPBBBB) ;3 333 222 222 111 111 GWORD: JSR PC,GBITCH ;GET A BINARY CHAR RTS PC ;BAD CHAR, LOSE MOV A,DCRWBL ;STATRT BUILDING WORD 0 000 000 000 BBB BBB JSR PC,GBITCH RTS PC ;BAD CHAR SWAB A ; 0 0BB BBB B00 000 000 ASR A ; 0 00B BBB BB0 000 000 ASR A ; 0 000 BBB BBB 000 000 BIS A,DCRWBL ; 0 000 222 222 111 111 JSR PC,GBITCH DCRRTS: RTS PC ;BAD CHAR ASL A ; 0 000 000 00B BBB BB0 ASL A ; 0 000 000 0BB BBB B00 ASL A ; 0 000 000 BBB BBB 000 ASL A ; 0 000 00B BBB BB0 000 BISB A,DCRWBL+1 ; BB BB0 000 SWAB A ; B BBB 000 000 000 0BB MOVB A,DCRPRB ; 00 000 0BB SPUSH B MOV DCRWBL,A JSR PC,BITCNT ;GET NUMBER OF BITS IN THE WORD BIC #177774,B ;MOD 4 COM B ;AND COMPLEMENTED CMP B,DCRPRB ;IS IT THE SAME AS WAS SENT ON THE LINE? BNE GWORDB ;NO, HAVE GOT BAD WORD ADD A,DCRCKS ;YES, ADD TO CHECKSUM SPOP B JMP SRET GWORDB: SPOP B RTS PC ;GET 6 BITS OFF THE LINE GBITCH: JSR PC,RFLUSH SUB #40,A BIT #177700,A BNE DCRRTS JMP SRET BITCNT: SPUSH A CLR B BR BITCT2 BITCT1: INC B BITCT2: ASL A BCS BITCT1 BNE BITCT2 SPOP A RTS PC ;TRANSMIT INTERUPT ROUTINES DCTBRK: SPUSH A EXCHA TPDLP,P RTS PC TFLUSH: MOV A,DCTB T1FLSH: EXCHA TPDLP,P SPOP A RTI TLOGIN: MOV #'Z-100,A JSR PC,TFLUSH MOV #LOGMES,TBPOIN LOGSEN: MOVB @TBPOIN,A BEQ LOGDNE INC TBPOIN BIC #100,DCTS ;DON'T CARE IF NO ECHO JSR PC,TFLUSH BR LOGSEN LOGDNE: BIC #100,DCTS ;PUT IT TO SLEEP JSR PC,T1FLSH TST REDY10 BEQ LOGDNE ;FALL IN HERE WHEN 10 IS READY TO RECIEVE .STITL INITIALIZE THE WORLD! START: RESET MOV SPDLP,P ;SET UP SYSTEM PDL CLR TIME MOV #200,PCSTBF ;EVERY 128/10000 TH'S MOV #113,PCS TST RJLSW BEQ NODC11 MOV #121,DCRS MOV #121,DCTS MOV #'Z-100,DCTB NODC11: MOV #CORCHK,BEBRV ;WHERE TO GO ON MEM TRAP MOV #LOGEND,A ;LAST LOCATION WITH CRAP IN IT ADD #200,A TST (A) ;IS IT REALLY THERE? BR .-6 ;LOOP ENDED BY MEM TRAP CORCHK: BIC #377,A MOV #BEBRV+2,BEBRV MOV A,CORTOP SUB #22000+SLOT1,A ;FUDGE AREA (NOW RADIA CAN FIT DDT THERE!) CLR B MOV #MQ+2,C MOV A,-(C) ;MOVE A TO MQ CLR -(C) ;CLEAR HIGH ORDER(AC) MOV NSLOTS,-(C) ;DIVIDE MOV MQ,B ;GET RESULT CMP B,#MSLTLN BLO .+6 MOV #MSLTLN,B BIC #37,B MOV #SLOT1-2,A ;BEGINING OF SLOT-2 (FOR DISK) MOV #SLTCAD+2,C ;ADDRESS OF SLOT MOV NSLOTS,D MOV D,NINU ;NUMBER OF USERS IN CORE NOW. CLR E SLTAL1: MOV A,(C)+ ;ADDRESS OF THIS SLOT ADD B,A ;NEXT ONE MOV E,SLOTST-SLTCAD-4(C) ;USER OF THIS SLOT MOV #1,SLOTST-SLTCAD-2(C) ;JUST SWAPED IN ADD #LUBLK,E ;NEXT USER TST (C)+ DEC D BGT SLTAL1 ;DO THIS NSLOTS TIMES MOV B,USLENT ASR B MOV B,A ;SAVE A POSITIVE WORD COUNT NEG B MOV B,USWCNT MOV #3,A MOV #-1,B ;SIE OF DISK IN A AND B SUB DSKRND,B ;MINUS RANDOM SYSTEM STORAGE SUB DSKRND+2,B MOV #MQ+2,C MOV B,-(C) MOV A,-(C) MOV NUSERS,-(C) ;DIVIDE AMOUNT OF DISK BY # OF USERS MOV #-1,A ;FULL ALOCATION TST AC BNE .+6 MOV MQ,A ;AMOUNT OF DISK PER USER DALOC2: ADD USWCNT,A ;ADD NEGATIVE WORD COUNT TO AMOUNT OF DISK SUB #DTIBFL+DEDBFL+DDIRL,A ;SUBTRACT FIXED BUFFERS BGT DALOC3 ;RESULT <15 BITS MOV #77777,A ;MAKE IT 15 BITS DALOC3: BIC #377,A ;TO GET # OF WORDS OF RANDOM STORAGE MOV A,E ;SAVE THAT QUANT IN E FOR (MUCH) LATER SWAB A MOV A,B ASL A ;NUMBER OF BLOCKS (200 WORDS) NOW IN A ASR B ASR B ASR B ;NUMBER OF BLOCKS/20 NOW IN B MOV #DBITTB,C ;SET UP TO INIT DISK BIT TABLE DALOC5: DEC B ;20 BLOCKS (=1 WORD IN TABLE)AT A TIME BLT DALOC4 ;ALL DONE CLR (C)+ BR DALOC5 DALOC4: CLR (C) ;ONLY SOME BITS ON IN THIS WORD COM (C) MOV #1,D BIC #177760,A ;# OF WORDS MOD 20 DALOC6: DEC A BLT DALOC7 BIC D,(C) ASL D BR DALOC6 DALOC7: TST (C)+ CMP C,#DBITBE BGT DALOC8 MOV #-1,(C) BR DALOC7 DALOC8: BIS #1,DBITTB ;FIRST BLOCK TO BE USED BIS #100000,DBITBE ;IMPOSSIBLE TO GO OFF TOP MOV E,D MOV #3,A MOV #-1,B MOV #MNUSRS,E MOV #LUBLK*,U UVINIT: SUB #LUBLK,U ;FOR NEXT GUY DOWN MOV #-1,FLSADR(U) ;INDICATE THAT THIS GUY ISN'T REALLY HERE CLR FLSRES(U) DEC E CMP E,NUSERS ;MAYBE HE REALLY IS HERE BGE UVINIT ;NOPE! CLR FLSADR(U) MOV #FRNEWU,FLSRES(U) MOV #UDSKAD+4,C ADD U,C SUB D,B ;AMOUNT OF RANDOM STORAGE SBC A MOV A,-(C) ;HIGH ORDER RANDOM STORAGE ADDR MOV B,-(C) ;LOW ORDER MOV A,-(C) ;HIGH ORDER RANDOM STORAGE ADDR MOV B,-(C) ;LOW ORDER SUB #DDIRL,B SBC A MOV A,-(C) ;HIGH DISK DIR MOV B,-(C) ;LOW SUB #DEDBFL,B SBC A MOV A,-(C) MOV B,-(C) SUB #DTIBFL,B SBC A MOV A,-(C) MOV B,-(C) ADD USWCNT,B BCS .+4 DEC A MOV A,-(C) MOV B,-(C) TST E BGT UVINIT MOV #SLOT1,D MOV #SOFN,B MOV #ASOFN-SLOT1,C ADD D,C ADD USLENT,D ;LAST AVAILABLE WORD ADDR CLR LINENO INIT1: INC B BIT #10000,B BNE INIT2 MOV B,(C)+ CLR (C)+ CMP D,C BHI INIT1 INIT2: CLR (C)+ CLR @C ADD #SOFN,B MOV B,NUNODE ;NUMBER OF NODES PER USER MOV #UVBLK,A ;TO INITIALIZE USER VARIABLES IN SWAPPED OUT USERS MOV #SLOT1,B ;SET UP FOR BLT SETUVS: MOV (A)+,(B)+ ;BLLLLLLLLLLLLLLLLLT CMP #UVBLK+LUVBLK,A BGT SETUVS TST RWWSW BNE STARTF JSR PC,SYDRBG ;GET A SYSTEM DISK REQUEST BLOCK CLR (A)+ ;NO START ROUTINE MOV USWCNT,(A)+ ;LENGTH OF A USER SLOT MOV #SLOT1-2,(A)+ ;SWAP OUT SLOT1 MOV DCLRUS,(A)+ ;GETS PUT INTO THE CLEAR USER PLACE MOV DCLRUS+2,(A)+ TST (A)+ MOVB #DWRTEC,(A) STARTF: MOV NUSERS,NUSER2 ASL NUSER2 TST JDCSW BNE ITINIT MOV #UTYO,TYO+2 MOV #UTYI,TYI+2 MOV #3,BRKCHR JMP NEXTUS ITINIT: JMP TINIT UGO: JSR PC,RUNME PRTXT ^/11LOGO / MOV LVERNF,A JSR PC,PRDN PRCR RSTART: MOV SALTL,ALTL MOV #100,TKS ;ENABLE INTERRUPTS FOR TYI TEST1: MLOOP: JSR PC,SCHEDP TST BRAKE(U) BEQ MLOOP1 JSR PC,BRAKR ;BREAK JMP ERTLN MLOOP1: JSR PC,GETSTR JSR PC,MREAD JSR PC,EVLINE ERROR+WDW ;WHAT SHOULD I DOO WITH (S) BR MLOOP WSTART: MOV #IP,P ;USE WITH CAUTION!! BR RSTART RUNRUG: 3 BR .+2 ;RUG SHOULD RETURN HERE IF $P'ED BR .+2 JMP NORT .STITL GET A STRING GSTR9: MOV CLN,B JSR PC,GTLINE ERROR+LDE ;LINE ..(B).. DOESN'T EXIST MOV C,A BR GSTR8 GETSTR: TST FUNLEV ;ARE WE IN A PROC BEQ GSTR0 ;NO BIT #ERRF,FLAGS2 ;ERROR, MAYBE BNE GSTR0 ;YES MOV CLP,B ;NO, GET THIS NODE OF LLP BEQ GSTR9 JSR PC,.LOAD BIT #7777,A ;IS IT LAST NODE BNE GSTR8 SPUSH A ;"STOP" POPS 5 WORDS SPUSH A SPUSH A SPUSH A JMP PSTOP GSTR8: MOV A,CLP MOV A,B JSR PC,.LOAD JSR PC,.LOAD ;OK, GET FIRST NODE OF LINE, = LINE # MOV B,CLN MOV A,CTP ;IN CASE THERE IS; NO GENERATION # MOV A,C JSR PC,.LOADC ;GET SECOND NODE CLR CLGN ; IF TYPE = SNUM, IT IS GEN # MOV A,C BIC #7777,C CMP #SNUM,C BNE GSTR6 MOV B,CLGN ;IT IS MOV A,CTP ;FALLS THROUGH ;FALLS IN GSTR6: BIS #LIST,CTP SPUSHS CTP BIT #TRACEF,FLAGS2 BEQ GSTRT PRCR PRTXT ^\ #\ MOV CPP,B JSR PC,PPNAME ;PRINT PNAME PRTXT ^\ LINE \ MOV CLN,A JSR PC,PRDN PRCR JSR PC,PRLN BR GSTRT GSTR0: BIT #TESTF,FLAGS2 BEQ GSTR1 MOV ALTL,A MOV (A)+,B BEQ DONE MOV A,ALTL PUSHS B PRCR PRTXT ^/TEST LINE / INC LINENO MOV LINENO,A JSR PC,PRDN PRCR JSR PC,PRLN CLR FLAGS CLR CO CLR CO+2 CLR NOR GSTRT: RTS PC POP A ;GET RETURN ADDR PUSH #1 JMP @A GSTR1: JSR PC,RDSTR BR GSTRT DONE: PRTXT ^/ALL DONE!/ PRCR SPOP A ;CROCK!!! JMP RSTART ;BLECTCH? .STITL READ A STRING - PTR ON S RDSTR1: PRCR RDSTR: CLR NBKTS CLR BRAKE MOV PRMTCH,D BEQ RDSTR9 JSR PC,TYO RDSTR9: JSR PC,RLINE JSR PC,BLSTI RDSTR2: JSR PC,TYI TST BRAKE BEQ .+10 JSR PC,BRAKR BR RDSTR7 CMP BRKCHR,D ;BREAK TYPED? BEQ RDSTR7 ;YES TST NBKTS ;IN A LIST? BGT RDSTR3 ;YES CMP #15,D ;CR? BEQ RDSTR4 RDSTR3: CMP #'[,D BNE RDSTR6 INC NBKTS RDSTR6: CMP #'],D BNE RDSTR5 DEC NBKTS RDSTR5: JSR PC,BLST BR RDSTR2 RDSTR4: JSR PC,BLSTF BR RDSTR ;NO CHARS TYPED PUSHS TOPS CLR TOPS RTS PC RDSTR7: JSR PC,BLSTF BR RDSTR1 JSR PC,FRELST BR RDSTR1 RQUEST: PUSH PRMTCH MOV #'<,PRMTCH JSR PC,RDSTR POP PRMTCH JMP ORT .STITL MORE READ ROUTINES!!! MREAD: TST FUNLEV ;ARE WE IN PROC? BEQ MRD1 ;NO BIT #ERRF,FLAGS2 ;YES, BUT ERROR? BNE MRD1 ;YES RTS PC ;NO MRD1: BIT #TESTF,FLAGS2 BNE MRD2 JMP READ ;CONVERT CHAR STRING TO TOKEN LIST MRD2: RTS PC RLINE: TST USER BLT RLINE1 TST JDCSW BEQ RLINE1 PUSH U MOV USER,U MOV #FRTYIH,FLSRES(U) JSR PC,FLUSH ;RETURNS WHEN LINE DONE JSR PC,RUNME POP U RLINE1: RTS PC .STITL EVAL 1 LINES EVLINE: TST TOPRNM BNE EVLI4 EVLI6: JSR PC,IGNT ;EVALUATES 1 LINES ON S EVLI1: BIT #CRF,FLAGS BNE EVLI2 JSR PC,EVAL BR EVLI3 ;NO OUTPUT, OK RTS PC EVLI3: BIT #CRF,FLAGS BNE EVLI2 JSR PC,GNT BIS #RTF,FLAGS BR EVLI1 EVLI4: MOV @S,B JSR PC,.LOAD MOV A,D BIC #7777,A CMP #SNUM,A BEQ EVLI5 ;AN SNUM CMP #LNUM,A BNE EVLI6 ;NOT EVEN A NUMBER JSR PC,.LOAD ;AN LNUM, SEE IF TOO BIG BIT #7777,A BNE EVLI7 ;TOO BIG BIC #170000,D ;MAKE IT INTO AN SNUM ADD D,A JSR PC,GRBAD MOV C,@S EVLI5: JSR PC,ADLN POPS A EVLI2: SKPRET EVLI7: ERROR+LNTB ;LINE # TOO BIG .STITL GET NEXT TOKEN GNT: BIT #RTF,FLAGS ;IS REPEAT TOKEN FLAG SET? BEQ GNT1 BIC #RTF,FLAGS ;YES MOV CT,A MOV CT+2,B BNE GNT6 CMP #SFUN,A BNE GNT6 BIS #CRF,FLAGS GNT6: RTS PC GNT1: BIC #PTLPF,FLAGS CMP #$LLPAR,CT+2 ;IS CT "(" BEQ GNT3 CMP #$LPAR,CT+2 BNE .+8. GNT3: BIS #PTLPF,FLAGS ;YES, SET PTLPF MOV CT,B ;GET LINK TO NEXT TOKEN MOV B,CTP BIT #7777,B BEQ GNT2 ;ANY TOKENS LEFT JSR PC,.LOAD ;YES GNT4: MOV A,CT MOV B,CT+2 RTS PC GNT2: BIT #CRF,FLAGS BNE GNT5 BIS #CRF,FLAGS MOV #SFUN,A CLR B BR GNT4 GNT5: ERROR+OOT ;OUT OF TOKENS IGNT: POPS B BIT #7777,B BEQ IGNT1 BIC #CRF,FLAGS JSR PC,.LOAD IGNT2: MOV A,CT MOV B,CT+2 BIS #RTF,FLAGS MOV #1,CTN RTS PC IGNT1: BIS #CRF,FLAGS MOV #SFUN,A CLR B BR IGNT2 TYO: JMP @#STYO STYO: TSTB TPS BPL .-4 MOV D,TPB RTS PC UTYO: TSTB TPS BPL .-4 MOVB D,TPB CMP #15,D BNE UTYOR MOV #12,D JSR PC,TYO MOV #15,D UTYOR: RTS PC TYOT: 0 0 CH: 0 TYI: JMP @#STYI STYI: WAIT TSTB TKS BPL STYI MOVB TKB,D BIC #177200,D BR STYO UTYI: WAIT TST CHI BEQ UTYI MOVB CHI,D CLR CHI BIC #177600,D BR TYO .STITL GARBAGE COLLECTOR NNODES==4096. GCBTL== NNODES/8./2.*2.+2. ;GARBAGE COLLECT BIT TABLE LENGTH MARKN: SPUSH A ;MARK NODE(B) SPUSH B MOV B,A BIC #170000,A BIC #177770,B MOVB BMT(B),B ASR A ASR A ASR A ADD GCBITS,A BISB B,(A) SPOP B SPOP A RTS PC BMT: .BYTE 1,2,4,10,20,40,100,200 .IFNZ GCDBUG LMT: DMK ;SYSTEM FUNCTION DMK ;INFIX (SYSTEM FUNCTION) DMK ;USER FUNCTION DMK ;VARIABLE BINDING GCDIE ;UNUSED GCDIE ;UNUSED GCDIE ;UNUSED DMK ;SHORT STRING MKSNP ;SNAP DMK ;ATOM DMK ;SHORT NUMBER GCMARK ;LONG NUMBEB GCMARK ;LONG STRING GCDIE ;TBA GCMARK ;SENTENCE GCMARK ;LIST .ENDC MARKL: CMP B,#SNP ;IS LIST A SNAP? BLOS MKL0 ;NO CMP B,# BLO MKSNPL ;YES MKL0: PUSH A ;MARK LIST SPUSH B ;NODE ADDS IN B SPUSH C .IFNZ GCDBUG SPUSH D .ENDC MOV B,A MKL1: MOV A,C BIT #7777,C ;IS THERE ANOTHER NODE BEQ MKL3 MOV C,B ;YES, MARK IT JSR PC, MARKN JSR PC,.LOADC ;GET IT .IFNZ GCDBUG MOV A,D SWAB D BIC #177417,D ASR D ASR D ASR D ;ALL THIS GIVES YOU THE TYPE*2 JMP @LMT(D) ;WHICH YOU MIGHT MARK ON DMK: BR MKL1 GCDIE: HALT GCMARK: JSR PC,MARKL BR MKL1 .ENDC MKSNPL: EXCH SNPTEM,C ;B POINTS TO SNAP JSR PC,MKDC MOV SNPTEM,C ;RESTORE C BR MKL0 MKSNP: JSR PC,MKDC ;ONLY MARKS THE DISPLAY CODE JSR PC,MKL0 ;ALSO NEED TO MARK THE NODES BR MKL1 .IFZ GCDBUG BIC #7777,A CMP #100000,A BLO MKL1 BEQ MKSNP CMP #120000,A BLOS MKL1 JSR PC,MARKL BR MKL1 .ENDC MKL3: .IFNZ GCDBUG SPOP D .ENDC SPOP C SPOP B POP A RTS PC .GCOLL: JSR F,ACSAV PUSH ACRELF MOV USER,U .GCOL2: TST GCLOCK ;IS SOMEONE ELSE GC'ING? BLT .GCOL3 ;NO, GO AHEAD JSR PC,FLUSH ;WAIT BR .GCOL2 .GCOL3: MOV U,GCLOCK JSR PC,RUNME MOV GCBITS,A ;GARBAGE COLLECT MOV #GCBTL/2-1,B ;CLEAR BIT TABLE MOV #1,(A)+ ;ALWAYS PROTECT NODE ZERO .GCOL1: CLR (A)+ DEC B BGT .GCOL1 PUSHS SNLIST ;PROTECT THESE LOSERS SPUSHS #TRUE SPUSHS #FALSE MOV #RELE,ACRELF MOV #HCC,F ;NUMBER OF HASH CODE ELEMENTS MOV SUHCT,E ;ADDRESS OF HASH TABLE MKUOBL: DEC F BLT MKTPS MOV (E)+,D ;GET A HASH CODE ELEMENT MKUOBI: MOV D,C BEQ MKUOBL ;NO MORE MOV D,B ;MARK THE NODE JSR PC,MARKN JSR PC,.LOADC MOV A,D MOV B,C JSR PC,MARKN ;MARK NODE POINTED TO BY THIS ONE JSR PC,.LOADC ;THEN GET IT JSR PC,MARKL ;SHOULD BE PNAME POINTER NODE MOV A,C MKUOE: BIT #7777,C ;ONE OTHER NODE? BEQ MKUOBI ;NO MOV C,B ;YES JSR PC,MARKN ;MARK IT JSR PC,.LOADC MOV C,SNPTEM ;SAVE IN CASE VBIND IS SNAP MOV A,C BIC #7777,A CMP #FBIND,A BEQ MKFB ;FUNCTION BINDING CMP #VBIND,A BEQ MKVB ;VARIABLE BINDING CMP #SFBIND,A BEQ MKSFB ;SWAPPED FB CMP #SVBIND,A BEQ MKSVB ;SWAPPED VB HALT ;BUG MKVB: JSR PC,MARKL BR MKUOE MKFB: JSR PC,MARKL BR MKUOE MKSVB: BR MKUOE MKSFB: JSR PC,MARKL BR MKUOE MKTPS: MOV #GCMKL,F MKRNDM: MOV (F)+,B ;POINTER TO POINTER BEQ MKSPDL ;LAST ONE MOV (B),B ;REAL NODE ADDRESS BEQ MKRNDM ;NOTHING THERE JSR PC,MARKL BR MKRNDM MKSPDL: MOV SPBASE,E MKSP1: MOV -(E),B ;GET A S PDL WORD CMP E,S ;END OF S PDL? BLT MKSP2 ;YES JSR PC,MARKL ;MARK S PDL WORD BR MKSP1 MKSP2: MOV SPBASE,A TST (A)+ BNE MKSP3 ;THERE I S PDL ON DISK, GO MARK IT TST (A) BEQ MKSP4 MKSP3: JSR PC,UBLKGR HALT HALT MOV B,SSAVEA MOV C,SSAVEA+2 ;PLACE TO SAVE S PDL MOV SSWPAD,4(A) MOVB #DWRTEC,14(A) ;WRITE OUT CURRENT S PDL JSR PC,DSKWA2 MKSP8: MOV SPBASE,B TST (B)+ ;IS @HERE ANODHER BLOCK ON DHSK? BNE MKSP5 ;YES TST (B) BEQ MKSP6 ;NO MKSP5: JSR PC,SYDRBG ;PREPARE TO SWAP IN BLOCK CLR (A)+ MOV #-200,(A)+ MOV SSWPAD,(A)+ MOV SPBASE,B MOV (B)+,(A)+ MOV (B)+,(A)+ TST (A)+ MOVB #DREADC,(A) JSR PC,DSKWAI MOV #200,F MOV SPBASE,E MKSP7: MOV -(E),B ;MRK THIS PIECE OF S PDL JSR PC,MARKL DEC F BGT MKSP7 BR MKSP8 MKSP6: JSR PC,SYDRBG ;PREPARE TO SWAP CURBENT PDLBACK CLR (A)+ MOV #-200,(A)+ MOV SSWPAD,(A)+ MOV SSAVEA,(A)+ MOV SSAVEA+2,(A)+ TST (A)+ MOVB #DREADC,(A) JSR PC,DSKWAI MOV SSAVEA,C JSR PC,UBLKFR MKSP4: JSR PC,DSGCF ADD #6,S ;GET RID OF 3 GUYS PUSHED BEFORE ;OK NOW RETURN ALL IN MARKED NODES ;RA ADDS OF LIT MAP ;RB NODE ADDS ;RC ACTUAL ADDER OF NODE ;RD BIT MAP ;RE POINT TO LIST OF FREE STORAGE RECYCLES NODES ;START COLLECTING AT LUNN(LOWEST UNPROTECTED NODE #) CLR E CLR NNGC CLR B ;NODE ZERO MOV UAB,C ;NODE ZERO ADDRESS MOV NUNODE,F ;NUMBER OF NODES MOV GCBITS,A ;BIT TABLE ADDR MOV (A)+,D SEC ROR D GCRT2: BCS GCRT3 MOV E,(C)+ ;WE HAVE A NODE, LINK IN 1ST WORD CLR (C)+ ;CLEAR SECOND MOV B,E ;NEW FREE STORAGE HEAD NODE INC NNGC BR GCRT4 GCRT3: ADD #4,C GCRT4: INC B DEC F BLE GCRT5 CLC ROR D BNE GCRT2 MOV (A)+,D ;GET NEXT WORD OF BIT MAP SEC ROR D BR GCRT2 GCRT5: MOV E,FREE ;YES MOV #-1,GCLOCK POP ACRELF JSR F,ACRES RTS PC