IMD 1.16: 1/09/2008 13:02:49 84-93471-02 a702 f47102 multeze falcon init disk 12oct81    @0|)wwЀЀtQql)  " }gA `hl M@IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 MF181100810293800811012101111 811012101111) =`;nrgy w"G,{Kq1 A&}E*`(t@% ;c  765y342(.OS:: SYS"iwvc Bc A@6<# Ic B# gIjHc r TITL The Multeze Falcon INITIALIZATION - MTZINIT.ASM - A4 MACHINE :80 MTZINIT REL SHARABLE MTZINIT NAM G:M NAM MULTEZE NAM MTZINIT NAM MTZ:JOB EXTR MTZELOW EXTR MTZEDIT EXTR MTZIOEND EXTR ETCB EXTR BCTDB EXTR OE:YSIZE EXTR MTZTDB EXTR TVERROR EXTR E:MONE EXTR E:HIGH EXTR E:LOW EXTR E:SYSFLG EXTR CONNZB EXTR R:HIGH G:M EQU $ MULTEZE EQU $ E:MSG MULTMSG FMT A SUB =:23,A CHECK FOR 4/95 CPU JEQ A,MACHOK E:MSG MACHMSG JMP ALLDONE * * * INSURE MULTEZE NOT ALREADY RUNNING * MACHOK EQU $  COPY E:SYSFLG,A GET SYSTEM FLAG WORD AND =SF:MULTD,A CLEAR MULTEZE BIT JEQ A,MULTOK JUMP IF NOT RUNNING E:MSG RUNNGMSG JMP ALLDONE * MULTOK EQU $ COPY E:LOW,A MUST BE LOADED AT :200 SUB =:200,A JEQ A,LOADOK GO IF LOADED OK E:MSG BADLOAD JMP ALLDONE LOADOK EQU $ SIN 2 COPY E:SYSFLG,A GET SYSTEM FLAG WORD OR =SF:MULTD,A SET MULTEZE RUNNING FLAG COPY A,E:SYSFLG JSK TVCONN CONNECT THE EDIT TERMINALS JEQ A,ALLDONE GO IF NO EDIT TVS * * ALLOCATE LOGICAL MEMORY * COPY E:HIGH,A SAVE OLD E:HIGH COPY A,MZ:EHIGH COPY =YSIZE,Q I/O WORK AREA SIZE COPY =0,A MUL MZ:CRTS,AQ X NUMBER OF TERMINALS SUB E:HIGH,Q ALLOCATE FROM TOP OF FREE SPACE NEG Q,Q COPY Q,E:HIGH SET NEW E:HIGH COPY Q,K AND NEW STACK * COPY =MTZELOW,A SET NEW E:LOW TO JUST PAST IFT  MTZDEBUG ******************** COPY =MTZIOEND,A DEBUG MODE ******************** ENDC ADD =1,A COPY A,E:LOW THE END OF MTZCMD * COPY =MTZIOEND,A END OF EDITOR ADD =1,A JUST PAST IT ADD =:3FF,A ROUND UP TO NEXT PAGE AND =:FC00,A COPY A,EDWRK START OF EDITOR WORK AREA ADD OE:YSIZE,A ALLOCATE WORK AREA COPY A,EDBFL BOTTOM OF EDIT BUFFER * COPY =MTZEDIT,A START OF EDITOR SHIFT A,R,10 CONVERT TO PAGE NUMBER COPY A,EDLOW LOW EDITOR PAGE NUMBER COPY =MTZIOEND,A END OF EDITOR SHIFT A,R,10 CONVERT TO PAGE NUMBER COPY A,EDHIGH HIGH EDITOR PAGE NUMBER * * CONNECT THE BATCH QUEUE FILE TO LUN 'ZB' * JSK CONNZB INITIALIZE BATCH QUEUE * * INITIALIZE MAP, ALLOCATE MEMORY * JSK MAPINIT COPY TPAGES,A GET TOTAL PHYSICAL PAGES SUB =128,A MUST BE AT LEAST THIS MUCH JGE A,MEMOK GO IF ENOUGH E:MSG MEMERR REPORT INSUFFICIENT MEMORY JMP ALLDONE AND EXIT MEMOK EQU $ * * START EDIT ACTIVITIES * JSK STARTEDT * * START UP THE BATCH PROCESSOR * SIN 3 COPY E:SYSFLG,A GET SYSTEM FLAG WORD OR =SF:BATCH,A SET BATCH MODE FLAG COPY A,E:SYSFLG RESTORE FLAG WORD R:BGIN BC START BATCH CONTROL TASK * ALLDONE EQU $ E:MON EXIT AND START BATCH PROCESSOR BC BGIN: BCTDB,:7000 EDWRK WORD 0 EDITOR WORK AREA ADDRESS EDBFL WORD 0 LOW EDIT BUFFER ADDRESS EDLOW WORD 0 LOW PAGE OF EDITOR EDHIGH WORD 0 HIGH PAGE OF EDITOR LPOOL MULTMSG MSG ' The Multeze Falcon (A702)' MACHMSG MSG ' 4/95 CPU WITH MMU REQUIRED TO RUN THIS SYSTEM' RUNNGMSG MSG ' MULTEZE ALREADY RUNNING' BADLOAD MSG ' MUST LOAD AT :200' MEMERR MSG ' MUST HAVE A MINIMUM OF 128K WORDS OF MEMORY' TITL TVCONN - CONNECT EDIT TERMINALS * TVCONN EQU $ COPY =ETCB,Y EDIT TCB LIST COPY:M =0,A,MZ:CRTS ZERO TOTAL ACTIVE TERMINALS * CT10 EQU $ COPY:M =0,A,ET:STAT(Y) CLEAR STATUS COPY ET:NUM(Y),A TV NUMBER CSK A,=10 * * JMP $+2 * IF > 9, MAKE A..F ADD ='A'-'0'+1,A * * ADD ='A0',A CONVERT TO LUN COPY A,TVLUN E:SLU TVLUN CONNECT TO LUN JNE A,CT30 NO LUN FOR TV COPY X,ET:UAT(Y) SAVE UAT ADDRESS IN ETCB JEQ X,CT30 NOTHING ASSIGNED TO IT SO IGNORE IT COPY 1(X),X GET DIB ADDRESS COPY DI:FLG(X),A SEE IF IT IS A DIB JLT A,CT30 NO, MUST BE A FCB, SO IGNORE IT COPY DI:NAM(X),A WHAT IS IT ATTACHED TO? SHIFT A,RO,8 CLSN A,='T' A TVxx? JMP $+2 YES JMP CT30 NO, IGNORE IT COPY 1+DI:NAM(X),A WHICH TV (OR TY) IS IT ATTACHED TO? SUB ='00',A JEQ A,CT30 IF TV00; IT'S NOT AN EDIT TERMINAL COPY:M =1%ETS:UP,A,ET:STAT(Y) SET TV "UP" IMS MZ:CRTS BUMP TOTAL TERMINALS * CT30 EQU $ ADD =ET:SIZE,Y NEXT ETCB ENTRY COPY 0(Y),A END OF TABLE? JNE A,CT10 NO, CONTINUE COPY MZ:CRTS,A GET TOTAL TERMINALS JEQ A,CT40 GO IF NONE CONNECTED RSK * CT40 EQU $ E:MSG CTMSG ERROR COPY =0,A RSK TVLUN WORD 0 CTMSG MSG ' NO EDIT TERMINALS IN SYSTEM' LPOOL TITL MAPINIT - INITIALIZE MAP AND CACHE MAPINIT EQU $ COPY =16*64-1,Y TOTAL LOGICAL PAGES * MAP04 EQU $ SET ALL MAPS EQUAL TO MAP 0 COPY Y,Q LOGICAL PAGE NUMBER COPY Y,A AND =:3F,A PHYSICAL IS MOD 64 JSK SETMAP SET THIS PAGE JNED Y,MAP04 CONTINUE UNTIL DONE * COPY =1024,Y CLEAR THE CACHE COPY 0(Y),A BY READING 1024 JNED Y,$-1 CONSECUTIVE LOCATIONS * COPY =0,A OUT A,LUSER: SET USER NUMBER TO 0 SBIT MMUT:,A ENABLE TRANSLATION SBIT MMUC:,A AND CACHE OUT A,MCTL: SEND TO MMU * * DETERMINE THE NUMBER OF PHYSICAL PAGES INSTALLED * COPY:M UMTA:+2,A,TRAPSAVE SAVE THE OLD UMT   COPY:M UMTA:+3,A,TRAPSAVE+1 COPY:M MEMTRAP,A,UMTA:+2 SET UP NEW CONTENTS COPY:M MEMTRAP+1,A,UMTA:+3 * COPY EDWRK,A EDITOR WORK AREA SHIFT A,R,10 CONVERT TO PAGE NUMBER COPY A,LPAGE USE AS LOW PAGE NUMBER COPY =:8000,X ADDRESS OF WINDOW PAGE COPY X,Q SHIFT Q,R,10 CONVERT TO PAGE NUMBER * MAP10 EQU $ COPY TPAGES,A TOTAL PHYSICAL PAGES JSK SETMAP SET WINDOW COPY A,0(X) COPY A,1(X) IF NO TRAP, GOOD PAGE IMS TPAGES OK, CONTINUE JMP MAP10 * TRAP EQU $ ENTER HERE IF MEMORY TRAP COPY Q,A JSK SETMAP RESORE WINDOW COPY:M TRAPSAVE,A,UMTA:+2 RESTORE UMT COPY:M TRAPSAVE+1,A,UMTA:+3 * * ALLOCATE NEW PHYSICAL PAGES TO REPLACE EDITOR * IN MAP 0 * IFT MTZDEBUG ******************** JMP MAP16 IF DEBUG SKIP THIS ******************** ENDC COPY EDHIGH,A SUB EDLOW,A ADD =1,A TOTAL NUMBER OF EDITOR PAGES COPY A,X USE AS COUNT NEG A,A * * ADD TPAGES,A * TAKE EDITOR OUT OF AVALIABLE PAGES COPY A,TPAGES * * COPY EDLOW,Q LOW EDITOR PAGE NUMBER * NEXTPG EQU $ COPY CPAGE,A NEXT PHYSICAL PAGE TO USE IMS CPAGE JSK SETMAP SET NEW PAGE TO OVERLAY EDITOR ADD =1,Q NEXT LOGICAL PAGE SUB =1,X JNE X,NEXTPG CONTINUE FOR ALL EDITOR PAGES * * COMPUTE MAXIMUM EDIT BUFFER SIZE * MAP16 EQU $ COPY E:HIGH,A HIGH ADDRESS SHIFT A,RO,10 CONVERT TO PAGE NUMBER SUB LPAGE,A MAX PAGES PER EDIT BUFFER COPY A,MPAGES SAVE IT * * COMPUTE SIZE OF EDIT BUFFERS * COPY =0,A COPY TPAGES,Q TOTAL PHYSICAL PAGES SUB =64,Q AVAILABLE FOR EDIT BUFFERS DIV MZ:CRTS,AQ DIVIDED BY TOTAL TERMINALS ACTIVE CSK Q,MPAGES COMPARE WITH MAXIMUM ALLOWED JMP MAP20 SMALLER, OK NOP COPY MPAGES,Q TOO BIG, SET TO MAXIMUM COPY =0,A CLEAR REMAINDER * MAP20 EQU $ COPY A,RPAGES SAVE ODD PAGES COPY Q,BPAGES SAVE PAGES PER EDIT BUFFER * * SCAN EDIT TERMINAL CONTROL BLOCKS, ASSIGN * EDIT BUFFER ADDRESSES AND SET MAP * COPY =ETCB,Y CONTROL BLOCK TABLE * MAP30 EQU $ COPY ET:STAT(Y),A GET TERMINAL STATUS TBIT ETS:UP,A TEST IF ACTIVE JF OV,MAP50 NO, SKIP THIS ONE COPY EDWRK,A GET WORK AREA ADDRESS COPY A,ET:EDWRK(Y) SET ETCB COPY EDBFL,A GET EDIT BUFFER ADDRESS COPY A,ET:EDBFL(Y) SET ETCB COPY BPAGES,A GET PAGES PER EDIT BUFFER COPY RPAGES,Q ANY ODD PAGES? JEQ Q,MAP34 NO ADD =1,A YES, GIVE AN EXTRA TO THIS BUFFER SUB =1,Q DECREMENT ODD PAGE COUNT COPY Q,RPAGES * MAP34 EQU $ COPY ET:NUM(Y),Q GET TERMINAL NUMBER SHIFT Q,L,6 CONVERT TO LOGICAL PAGE ADD LPAGE,Q BUFFER BASE OFFSET * MAP40 EQU $ A=PAGES FOR THIS BUFFER EXCH A,CPAGE NEXT PHYSICAL TO ALLOCATE JSK SETMAP ASSIGN IN MAP ADD =1,A NEXT PAGE EXCH CPAGE,A RESTORE A ADD =1,Q NEXT LOGICAL PAGE IN BUFFER SUB =1,A DECREMENT PAGE COUNT JNE A,MAP40 CONTINUE UNTIL DONE * SUB =1,Q HIGH BUFFER PAGE AND =:3F,Q MOD 64  SHIFT Q,L,10 CONVERT TO ADDRESS OR =:3FF,Q TOP OF PAGE COPY Q,ET:EDBFH(Y) SAVE HIGH BUFFER ADDRESS * MAP50 EQU $ ADD =ET:SIZE,Y NEXT TERMINAL BLOCK COPY 0(Y),A END OF TABLE? JNE A,MAP30 NO, CONTINUE RSK * LPAGE WORD 0 LOW EDIT BUFFER PAGE NUMBER MPAGES WORD 0 MAX NUMBER OF EDIT BUFFER PAGES BPAGES WORD 0 ALLOCATED PAGES PER BUFFER RPAGES WORD 0 REMAINDER ODD PAGES TPAGES WORD 64 TOTAL PHYSICAL PAGES CPAGE WORD 64 CURRENT PHYSICAL PAGE TO ALLOCATE LPOOL MEMTRAP JST *$+1 MEMORY TRAP CONTENTS WORD GOTTRAP TRAPSAVE RES 2,0 GOTTRAP ENT JMP TRAP TITL SETMAP - SET PAGE IN TRANSLATION TABLE * * SETMAP - SUBROUTINE TO SET UP A PAG E * IN THE MMU TRANSLATION TABLE * * ENTER: A=PHYSICAL PAGE NUMBER * Q=LOGICAL PAGE NUMBER * SETMAP EQU $ PUSH XA:V OR =:3000,A ALLOW READ/WRITE/EXECUTE ACCESS ADD =:FC00,Q ADD BASE OF XLATE TABLE COPY Q,X X=XLATE TABLE ENTRY ADDRESS SIN 6 NO INTERRUPTS! IN MCTL:,Q GET MMU CONTROL REGISTER SBIT MMUA:,Q ENABLE XLATE TABLE ACCESS OUT Q,MCTL: COPY A,0(X) SET TABLE ENTRY RBIT MMUA:,Q DISABLE XLATE TABLE ACCESS OUT Q,MCTL: POP RSK LPOOL TITL STARTEDT - INITIATE EDIT ACTIVITIES STARTEDT EQU $ COPY E:HIGH,Q ADD =1,Q LOW ADDRESS OF WORK AREA COPY =ETCB,X TERM CONTROL BLOCK LIST * ST10 EQU $ COPY ET:STAT(X),A IS TERMINAL UP? TBIT ETS:UP,A JF OV,ST20 NO, SKIP IT COPY Q,ET:IOWRK(X) I/O INTERFACE WORK AREA COPY ET:EDSTK(X),Y GET STACK ADDRESS COPY Q,0(Y) SAVE I/O WORK AREA ADDRESS AT 0(L) COPY Y,A A=STACK ADDRESS COPY =MTZTDB,Y GET TDB ADDRESS COPY A,TD:AD(Y) STUFF IN STACK ADDRESS ADD =YSIZE,Q Q=NEXT I/O WORK AREA R:BGIN TVBGIN START ACTIVITY * ST20 EQU $ ADD =ET:SIZE,X NEXT ETCB COPY 0(X),A END OF LIST? IFT MTZDEBUG ******************** JMP $+2 IF DEBUG, ONLY ONE TERMINAL ******************** ENDC JNE A,ST10 NO, CONTINUE RSK YES, EXIT * TVBGIN BGIN: MTZTDB,ET:PRI TITL MTZINIT - EDIT TERMINAL INITIALIZATION ** * FUNCTION: INITIALIZE MULTEZE DATA REGION * * ENTRY: JSK MTZINIT * * EXIT: RSK * * X= EDIT TERNIMAL CONTROL BLOCK * K,L= STACK ** MTZINIT EQU $ COPY ET:IOWRK(X),Y GET WORK AREA COPY X,Q SAVE X (ETCB ADDRESS) COPY =YSIZE-1,X CLEAR WORK AREA COPY =0,A COPY A,0(X,Y) JNED X,$-1 CONTINUE WITH ZERO LOOP COPY Q,X RESTORE X COPY X,ETCBA(Y) SAVE ETCB ADDRESS COPY ET:NUM(X),A STORE TERMINAL NUMBER (<10) CSK A,=9 * * JMP $+2 * IF > 9, MAKE A..F ADD ='A'-'0'+1,A * * ADD ='00',A MAKE ASCII COPY A,TVNUM+1(Y) DO IT COPY ET:UAT(X),X GET LUN PTR COPY:M 0(X),A,SALUN(Y) ADD ='I0'-'A0',A COPY A,SILUN(Y) ADD ='O0'-'I0',A COPY A,SOLUN(Y) ADD ='E0'-'O0',A COPY A,EFLUN(Y) COPY:M 1(X),A,SADIB(Y) COPY SADIB(Y),X COPY:M DI:NAM(X),A,TVNUM(Y) STORE TERMINAL NAME COPY =SAFBUF,A INITIALIZE ISM BUFFER ADDR PTR ADD Y,A SUB =1,A KLUDGE,COMBINED WITH BP SET TO 2 COPY A,USERBUFF(Y) STICK INTO ISM BLOCK * COPY =IWAL,X INITIALIZE IWAL BLOCK COPY =:F03E,A SEMAPHORE CHECK VALUE COPY A,WCHK(X,Y) STICK INTO SEMAPHORE BLOCK COPY Y,A ADD =IWAL+WSEM,A COPY A,WSEMPTR(X,Y) INIT IWAL SEMAPHORE PTR COPY:M =0,A,WUP(X,Y) CLEAR UPPER WORD OF WAIT TIME COPY:M =40,A,WLO(X,Y) SET FOR TEN SECONDS WAIT TIME COPY Y,WID(X,Y) SET TIMER ID TO UNIQUE Y-VALUE * IWAL = WENV,WID,WSEMPTR,WUP,WLO,WPER,WFLG,WSEM,WCHK JMP INIT1 LPOOL INIT1 EQU $ IOBINT SIFIOB,SILUN(Y),SIFBUF COPY:M =BUFLEN,A,IOINDEX(X,Y) IOBINT SOFIOB,SOLUN(Y),SOFBUF COPY:M =BUFLEN,A,IOINDEX(X,Y) IOBINT SAFIOB,SALUN(Y),SAFBUF IOBINT SAFIOB2,SALUN(Y),SAFBUF COPY:M =BUFLEN,A,IOINDEX(X,Y) IOBINT DIRIOB,SILUN(Y),WORKBLOK IOBINT OCPIOB,='OC',SAFBUF SHARE BUFFER WITH SAFIOB IOBINT BATCHIOB,='ZB',BATCHBUF IOBINT MSGIOB,SALUN(Y),WORKBLOK JMP INIT2 MTZCMD REL SHARABLE MTZCMD INIT2 EQU $ * OPEN SAFIOB OPEN THE TV JMP TVERROR JUMP IF ERROR WRITEMSG =MSGIOB,FA:,MULTMSG WRITE FIRST TITLE LINE JSK TVERROR JSK MTZ:JOB WRITE =OCPIOB,FA:,=10 TO OCP ALSO JSK TVERROR RSK DONE WITH INITIALIZATION TITL J O B MTZ:JOB EQU $ COPY TVNUM(Y),A CALCULATE SECOND T ITLE LINE COPY TVNUM+1(Y),Q ADD =SAFIOB+IOBUF,Y COPY A,2(Y) COPY Q,3(Y) COPY:M =' ',A,0(Y) COPY:M ='--',A,1(Y) COPY A,4(Y) COPY:M =CRLF:,A,5(Y) ADD =6,Y OFFSET 3rd AND 4th LINES R:GATD STARDATE(Y) COPY:M =:2007,A,0(Y) COPY:M STARDATE(Y),A,1(Y) YEAR COPY:M STARDATE+2(Y),A,4(Y) DAY COPY:M =CRLF:,A,5(Y) COPY:M =:2007,A,6(Y) COPY:M STARDATE+3(Y),A,7(Y) HOUR COPY:M STARDATE+5(Y),A,10(Y) SECOND COPY:M =:0A0A,A,11(Y) * BYTEMODE COPYBM ='/',A,4(Y) COPYB A,7(Y) COPYBM =':',A,16(Y) COPY A,19(Y) COPYBM STARDATE+2(Y),A,5(Y) MON1 COPYBM STARDATE+3(Y),A,6(Y) MON2 COPYBM STARDATE+8(Y),A,17(Y) MIN1 COPYBM STARDATE+9(Y),A,18(Y) MIN2 WORDMODE * SUB =SAFIOB+IOBUF+6,Y WRITE =SAFIOB,FA:,=36 WRITE 2ND, 3RD AND 4TH TITLE LINES JSK TVERROR RSK MTZINIT REL TITL IOBINT ** * FUNCTION: INITIALIZE IOBS * * ENTRY: X=IOB DISPLACEMENT * A=LUN * Q=BUFFER * JSK IOBINT * * EXIT: A,Q UNDEFINED * SETS LUN,CRI,BUF * X=IOB * * NOTE: IOB IS FOLLOWED BY CFI * USE MACRO --> IOBINT IOB,LUN,BUFFER ** IOBINT EQU $ COPY A,IO:LUN(X,Y) SET LUN COPY Y,A ADD X,A ADD =SIFCFI-SIFIOB,A COPY A,IO:CRI(X,Y) SET CFI POINTER COPY Y,A ADD Q,A COPY A,IO:BUF(X,Y) SET BUFFER POINTER RSK END (Y),WORKBLOK JMP INIT2 MTZCMD REL SHARABLE MTZCMD INIT2 EQU $ * OPEN SAFIOB OPEN THE TV JMP TVERROR JUMP IF ERROR WRITEMSG =MSGIOB,FA:,MULTMSG WRITE FIRST TITLE LINE JSK TVERROR JSK MTZ:JOB WRITE =OCPIOB,FA:,=10 TO OCP ALSO JSK TVERROR RSK DONE WITH INITIALIZATION TITL J O B MTZ:JOB EQU $ COPY TVNUM(Y),A CALCULATE SECOND T/MACRO MTZINIT(D=sf/GEN+sf/RTX+sf/IOS+sf/SFM+sf/OS4+MTE+MTEI,L=,PAGE=57) /PRINT MTZINIT X8110081005432581100810054375811008103444/ Multeze Falcon Link JCL. / 90-93471-A700 / ASSIGN X2 TO THE DEVICE CONTAINING MTZCMD.OBJ AND MTZINIT.OBJ. / ASSIGN X3 TO THE DEVICE CONTAINING THE MULTED .OBJ FILES. / TYPE /* /DO TV AS X1=LO AS LO=MTZ.MAP LINK MTZ.SYS=X2/MTZCMD(EX=200,PA=39*104, AB.MTZCMD.TABLE:.DEBUG:.MTZELOW.MTZINIT=200, AB.MTZEDIT=1C00)+ X3/MTECONZB(UL)+ X3/MTEDIT(UL)+X3/MTEIO(UL)+X2/MTZINIT(UL)+sf/os4 AS LO=X1 PRINT MTZ.MAP 811008102938811008102938811008102938 SETEXT EXTR READTV EXTR E:ZBSEM EXTR E:BASEM EXTR E:SYSFLG EXTR DEBUG4 EXTR MTZ:JOB TITL MZ:XXXX - MULTEZE CONTROL BLOCK G:C EQU $ * * MULTEZE CONTROL BLOCK * THIS BLOCK MUST START AT :200 * CONTAINS LINKS TO IMPORTANT STUFF * JMP MULTEZE MZ:ENT - NORMAL MTZ ENTRY POINT JMP DEBUG4 MZ:DBG - DEBUG ENTRY POINT WORD ETCB MZ:ETCB - EDIT TERMINAL CONTROL BLOCKS WORD 0 MZ:CRTS - TOTAL CRT'S UP WORD 0 MZ:EHIGH - E:HIGH BEFORE MTZ STARTUP TITL MTZBGIN - MTZ TERMINAL ACTIVITY START * * ENTER: X=EDIT TERMINAL CONTROL BLOCK * K,L=STACK * MTZBGIN EQU $ * * ACTIVITY STARTS HERE WITH INTERRUPTS DISABLED FOR * ONE INSTRUCTION. MUST HOLD OFF INTERRUPTS UNTIL * MAP IS SET FOR NEW STACK. * SIN 5 COPY ET:NUM(X),A GET TERMINAL NUMBER COPY R:ACT,Y AND MY A CB COPY A,AC:MAP(Y) SET MAP NUMBER OUT A,LUSER: AND TELL MMU (LOAD USER NUMBER) SBIT UM:,S SET USER MODE JSK MTZINIT DO TERMINAL INITIALIZATION MTE1 EQU $ COPY ETCBA(Y),X TERMINAL CONTROL BLOCK ADDRESS COPY ET:MSGBF(X),X MESSAGE BUFFER ADDRESS JEQ X,MTE15 IF NO BUFFER ALLOCATED COPY 0(X),A 1st TWO CHARACTERS SUB =' ',A JLE A,MTE15 IF NO MESSAGE WAITING OR ONE BEING MOVED COPY X,Q FILENAME ADDRESS SUB =1,Q COPY =0,A 1st THING TO MOVE JSK MOVENAME COPY ETCBA(Y),X TERMINAL CONTROL BLOCK ADDRESS COPY ET:MSGBF(X),X MESSAGE BUFFER ADDRESS COPY =' ',A EXCH A,0(X) NO MORE MESSAGE WAITING COPY =DONEMSG-1,Q TBIT 7,A WAS JOB ABORTED?? JF OV,$+2 IF NOT COPY =ABORTMSG-1,Q COPY =1,A JSK MOVENAME COPY:M =2,A,TEMPA(Y) SO VIEWOUT WILL PRINT PROPER # OF CHARACTERS JSK VIEWOUT MTE15 EQU $ WRITEMSG =MSGIOB,WP:,MTEPRMPT JSK TVERROR JSK READTV READ IN A COMMAND LINE JNE A,MTE1 E:ISM ISMBLOK(Y) GET COMMAND COPY DELIMITR(Y),A GET CONTROL CHARACTER CLSN ='/',A JMP $+3 CONTROL CHAR INDICATES A COMMAND COPY:M =2,A,CLPTR(Y) NOT SLASH, MUST BE COMMAND - RESET PTR * TO A 2 (BECAUSE BUFFER STARTS WITH 0000) JSK MTZCMD PARSE AND PROCESS COMMAND JMP MTE1 GET NEXT COMMAND * MTZTDB TDB: MTZBGIN,0,$-$,ET:STK,0,15 * * COMMAND LOOP * * MTZCMD EQU $ E:ISM ISMBLOK(Y) COPY =SYMBUFF,X ADD Y,X COPY NUMCHAR(Y),Q JLE Q,CMDRET NULL COMMAND IS A NO-OP COPY =MTECMDS,A JSK LOOKUP JNE A,MTE90 JSK 0(X) GO TO COMMAND PROCESSOR CMDRET EQU $ RSK * MTE90 EQU $ WRITEMSG =MSGIOB,FA:,MTEUN UNKNOWN COMMAND JSK TVERROR  RSK GET NEXT COMMAND LPOOL TITL COMMANDS MTECMDS EQU $ WORD 8/2 BYTE 'EDIT ' WORD EDIT BYTE 'EZEDIT ' WORD EDIT BYTE 'SUBMIT ' WORD SUBMIT BYTE 'DO ' WORD SUBMIT BYTE 'DELETE ' WORD DELET BYTE 'LOCAL ' WORD LOCAL BYTE 'VIEW ' WORD VIEW BYTE 'JOB ' WORD MTZ:JOB WORD 0 TITL EDIT TERMINAL CONTROL BLOCKS ETCB EQU $ ETCB 1,STACK1 ETCB 2,STACK2 ETCB 3,STACK3 ETCB 4,STACK4 ETCB 5,STACK5 ETCB 6,STACK6 ETCB 7,STACK7 ETCB 8,STACK8 ETCB 9,STACK9 WORD 0 END OF TABLE * * EDIT TERMINAL STACKS & MESSAGE BUFFERS FROM BATCH QUEUE PROCESSOR * TERMINAL XMACRO STACK#(1) RES ET:STK BUFFR#(1) RES 7,' ' ENDM TERMINAL 1 TERMINAL 2 TERMINAL 3 TERMINAL 4 TERMINAL 5 TERMINAL 6 TERMINAL 7 TERMINAL 8 TERMINAL 9 TITL GO TO EDITOR ** * FUNCTION: CONNECT WITH EDITOR I/O INTERFACE * * ENTRY: JSK EDIT * * EXIT: RSK *** EDIT EQU $ COPY ABORTK(Y),A SEE IF EDIT IS IN PROGRESS. JNE A,EDIT1 NONZERO MEANS YES COPY K,A PREPARE FOR EDIT SUB =1,A RSK USES THIS WORD COPY A,ABORTK(Y) SET FOR TROUBLE JSK EDITENT COPY:M =0,A,ABORTK(Y) CLEAR EDIT AND ABORT FLAG JMP EDITEND EDIT1 EQU $ WRITEMSG =MSGIOB,FA:,EDITMSG JSK TVERROR EDITEND EQU $ RSK MORE COMMANDS LPOOL EDITMSG MSG ' EDIT ALREADY RUNNING' TITL L O O K U P * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * THIS SUBROUTINE DOES AN INDEFINITE ABBREVIATION LOOKUP OF A * * CHARACTER STRING AGAINST A TABLE OF KEYWORDS. * * * * ENTRY: A=ADDRESS OF TABLE * * Q=NUMBER OF CHARACTERS IN COMMAND (Q>0) * X=ADDRESS OF CHARACTER STRING * * JSK LOOKUP * * * * EXIT: RSK * * A UNCHANGED IF NOT IN TABLE, =0 IF IN TABLE * X CONTENTS OF WORD IN TABLE ASSICIATED WITH STRING * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * LOOKUP EQU $ PUSH XA:V  SAVE REGISTERS, SET XA JLE Q,LOOK4 INVALID? TOO SHORT COPY A,Y TABLE ADDRESS ==> Y COPY 0(Y),A LENGTH OF ENTRY INWORDS SHIFT A,LO,1 IN BYTES CSK A,Q JMP LOOK4 INPUT STRING TOO LONG, ISN'T IN TABLE JMP LOOK2 ) GO DO JMP LOOK2 ) LOOKUP LOOK1 EQU $ GET NEXT TABLE ENTRY WORDMODE COPY Y,Q CURRENT TABLE ADDRESS ==;> Q COPY K,Y ADDRESS OF SAVED REGISTERS ==> Y ADD *LAST:A(Y),Q UPDATE CURRENT TAGBLE ADD*RESS (ALMOST) COPY LAST:Q(Y),Y NUMBER OF CHARACTERS ==> Y EXCH Q,Y # CHARS ==> Q; TABLE ADDRESS-1 ==> Y LOOK2 EQU $ FIRST TIME ENTRY TO LOOP COPY 1(Y),A FIRST WORD OF NEXT ENTRY (TEXT) JEQ A,LOOK4 IF ALL DONE, NOT FOUND SUB =1,Q TO BE USED AS "INDEX" ADD =1,Y BUMP TO 1ST WORD OF TEXT BYTEMODE LOOK3 EQU $ COMAPRE CHARACTERS LOOP EXCH X,Y STRING ==> Y; CURRENT TABLE ==> X XNX Q COPYB 0(Y),A PICK UP BYTE FROM STRING EXCH X,Y CURRENT TABLE ==> Y; STRING ==> X XNX Q SUBB 0(Y),A BYTE FROM TABLE JNE A,LOOK1 IF NO MATCH, GET NEXT TABLE ENTRY JNED Q,LOOK3 KEEP LOOKING UNTIL ALL CHAECKED * * NAMES MATCH, GET VALUE AND RETURN COPY Y,X CURRENT TABLE ==> X COPY K,Y BASE OF SAVED REGISTERS WORDMODE MAKE SURE WE ARE IN WORD MODE ADD *LAST:A(Y),X COPY 0(X),X COPY X,LAST:X(Y) COPY A,LAST:A(Y) CLEAR A FOR GOOD FINE LOOK4 EQU $ POP RESTORE REGISTERS RSK R E T U R N LPOOL TITL BATCH CONTROL TASK BCTDB TDB: BCENT,0,BCSTK,50,0,1 BCSTK RES 50,0 STACK BCTICK TICK: 0,BCSEMA4,240 2 SECOND TICK CLOCK BCSEMA4 SDB: 0 CLOCK SEMAPHORE BCENT EQU $ TASK ENTRY POINT SIN 8 COPY E:SYSFLG,A GET SYSTEM FLAG WORD AND =SF:BATCH,A IS BATCH RUNNING? JEQ A,BC10 NO, IGNORE SENSE SWITCH JT SS,BC10 IF SENSE SW ON, LEAVE BATCH RUNNING XOR E:SYSFLG,A TURNOFF BATCH PROCESSING COPY A,E:SYSFLG R:SIG *E:BASEM SIGNAL SEMA4 * BC10 EQU $ R:ITIC BCTICK START 2 SECOND TIMER R:WAIT BCSEMA4 WAIT JMP BCENT LPOOL TITL COMMAND PROCESSOR MESSAGES MTEUN MSG ' ILLEGAL MULTEZE COMMAND' MTEPRMPT MSG ' ' MTEMORE MSG ' MTE..' TITL EDITOR I/O INTERFACE MESSAGES NAM SIGNON NAM CMDMORE NAM OPTMSG NAM NORMAL NAM RENMSG SIGNON WORD SIGNEND-$-1*2 BYTE ' The Multeze Falcon (' DOUBLE REV IFT REV<='A700' IFT REV>='A600' BYTE ') Assembled(' ASMDATE BYTE ') Linked(' LINKDATE ENDC ENDC BYTE ')' SIGNEND EQU $ CMDMORE MSG ' EZE..' OPTMSG MSG ' COMMAND FILE IGNORED' NORMAL MSG ' NORMAL TERMINATION' RENMSG MSG ' FILE RENAME ERROR' TITL OPERATOR COMMUNICATION PROMPTS * THESE ARE THE VARIOUS PROMPTS USED BY THE EDITOR AND ARE * OUTPUT VIA A CALL TO O:PROMPT WITH THE PROMPT ADDRESS IN A * AND THE LUN IN Q NAM CMDPROMT NAM FINPROMT NAM SUBPROMT NAM DSSPROMT NAM INSPROMT NAM INPPROMT NAM LISPROMT CMDPROMT BYTE :0A,'',:1D FINPROMT BYTE :0A,'' RES 40,'..' SUBPROMT BYTE :0A,'' RES 40,'..' DSSPROMT BYTE :0A,'>',:1D INSPROMT BYTE :0A,'>',:1D INPPROMT BYTE :0A,'>',:1D LISPROMT BYTE :0A,'',:1D DONEMSG BYTE 'JOB COMPLETED',7 ABORTMSG BYTE 7,'JOB ABORTED',7,7 TITL LOCAL DIRECTORY ** * FUNCTION: SETS THE LOCAL "EF" TO THE DIRECTORY SPECIFIED * * ENTRY: JSK LOCAL * * EXIT: RSK * USES LUN I1 + TERMINAL NUMBER AS A SCRATCH LUN * * LOCAL EQU $ E:GFN WORKBLOK(Y),EFLUN(Y),SILUN(Y) GET NEW DIRECTORY NAME CLSN A,=3 IS IT DIRECTORY? JMP LOCAL1 YES, IT'S OK WRITEMSG =MSGIOB,FA:,LOCALINV JSK TVERROR JMP LOCALEN D LOCAL1 EQU $ COPY:M EFLUN(Y),A,LUN:+WORKBLOK(Y) FOR CONNECT F:CONN WORKBLOK(Y) JGT A,LOCALEND IF CONNECT GOOD WRITEMSG =MSGIOB,FA:,LOCALBAD JSK TVERROR LOCALEND EQU $ RSK LPOOL TITL DELETE ** * FUNCTION: DELETES THE SPECIFIED FILES * * ENTRY: JSK DELET * * EXIT: RSK * * DELET EQU $ E:GFN WORKBLOK(Y),EFLUN(Y),SILUN(Y) GET FILE NAME JEQ A,DELET1 IF OK WRITEMSG =MSGIOB,FA:,DELETINV JSK TVERROR JMP DELETEND DELET1 EQU $ COPY DELIMITR(Y),A CLSN A,=',' JMP DELET2 IF DELIMITER LOOKS GOOD CLSN A,='+' JMP DELET2 DITTO JNE A,DELET3 IF NOT END OF LINE DELET2 EQU $ COPY 1+NAMEXT+WORKBLOK(Y),A SUB ='IR',A JNE A,DELET25 NOT A DIRECTORY COPY NAMEXT+WORKBLOK(Y),A CLSN A,='D' JMP DELET4 DELET25 EQU $ F:DELE WORKBLOK(Y) JGT A,DELETEND IF DELETE GOOD WRITEMSG =MSGIOB,FA:,DELETBAD JSK TVERROR DELETEND EQU $ COPY DELIMITR(Y),A CLSN A,=',' JMP DELET IF MORE TO DO CLSN A,='+' JMP DELET DITTO RSK DELET3 EQU $ WRITEMSG =MSGIOB,FA:,DELETUNK JSK TVERROR RSK DELET4 EQU $ WRITEMSG =MSGIOB,FA:,DELETDIR JSK TVERROR RSK TITL SUBMIT ** * FUNCTION: PROCESS THE SUBMIT COMMAND * * ENTRY: JSK SUBMIT * * EXIT: RSK * NOTE: ALL REGISTERS PRESERVED * /SUBMIT FILENAME ** SUBMIT EQU $ PUSH XA:V SUBAGAIN EQU $ E:GFN WORKBLOK(Y),EFLUN(Y),SILUN(Y) JNE A,SUBINV COPY WORKBLOK+NAMPT:(Y),A JNE A,SUB1 FILENAME IS OK SUBINV EQU $ WRITEMSG =MSGIOB,FA:,INVALID JSK TVERROR JMP SUBEND LPOOL SUBINV2 EQU $ WRITEMSG =MSGIOB,FA:,NOFMSG JSK TVERROR JMP SUBEND SUB1 EQU $ SETEXT ='J',='CL',=WORKBLOK TRY .JCL SUB2 EQU $ COPY:M SILUN(Y),A,LUN:+WORKBLOK(Y) F:CONN WORKBLOK(Y) JLE A,SUBINV2 IF BAD CONNECT R:WAIT *E:ZBSEM WAIT FOR ENTRY TO BATCH FILE OPEN BATCHIOB OPEN THE FILE JMP SUBERR WRITE =BATCHIOB,FS:,=BQBLOK:L*2 WRITE THE FILENAME ETC. JMP SUBERR COPY:M =0,A,IOBLEN(X,Y) COPY A,IOBLEN+1(X,Y) ZERO CFI READ =BATCHIOB,DS:,=12 READ CONTROL RECORD TO UPDATE JOB COUNT JMP SUBERR COPY WORKBLOK+BQNUM:(Y),A GET NUMBER OF JOBS ADD =1,A INCLUDE THIS JOB COPY A,WORKBLOK+BQNUM:(Y) RECORD ON FILE COPY:M =0,A,IOBLEN(X,Y) COPY A,IOBLEN+1(X,Y) WRITE =BATCHIOB,DS:,=12 JMP SUBERR CLOSE BATCHIOB JMP SUBERR R:SIG *E:BASEM SIGNAL USAGE R:SIG *E:ZBSEM SIGNAL INTERLOCK COPY DELIMITR(Y),A ANY MORE FILES TO SUBMIT? JEQ A,SUBEND SUB =CR:,A HOW ABOUT A CARRIAGE RETURN? JEQ A,SUBEND COPY:M =0,A,WORKBLOK+VOLPT:(Y) CLEAR OUT VOLUME POINTER JMP SUBAGAIN MORE FILES, DO IT!!!! SUBEND EQU $ JSK VEWBATCH COPY:M =0,A,WORKBLOK+VOLPT:(Y) CLEAR OUT VOLUME POINTER POP RSK LPOOL SUBERR EQU $ WRITEMSG =MSGIOB,FA:,SUBSUB JSK TVERROR R:SIG *E:ZBSEM SIGNAL INTERLOCK JMP SUBEND LPOOL TITL VIEW * * FUNCTION: VIEW A DIRECTORY IN N(AMEONLY) FORMAT * * ENTRY: JSK VIEW * * EXIT: RSK * VIEW EQU $ PUSH XA:V E:GFN WORKBLOK(Y),EFLUN(Y),SILUN(Y) CLSN A,=3 WAS IT A DIRECTORY ?  JMP VIEW0 YEP CLSN A,=1 HOW ABOUT DEFAULTING TO CURRENT LOCAL DIRECTORY ? JMP VIEW0 THAT'S IT ! JMP VIEW9 REALLY BAD VIEW0 COPY:M =0,A,TEMPA(Y) RESET LINE ITEM COUNT COPY:M SILUN(Y),A,WORKBLOK+LUN:(Y) SUPPLY LUN FOR CONNECT COPY WORKBLOK+NAMPT:(Y),A IS THERE A NAME? JNE A,VIEW05 IF YES, DO CONNECT COPY WORKBLOK+FNO:(Y),A HOW ABOUT A FILE? JNE A,$+2 IF REAL FILE HERE COPY =1,A USE ROOT DIRECTORY COPY A,WORKBLOK+NAMPT:(Y) F:CFNO WORKBLOK(Y) DO CONNECT JMP VIEW07 CONTINUE VIEW05 F:CONN WORKBLOK(Y)  DO CONNECT VIEW07 SUB =1,A JLE A,VIEW91J OPEN SIFIOB OPEN DIRECTORY JMP VIEW91 COPY =SIFIOB,X OFFSET FOR INPUT IOB COPY:M =0,A,SIFCFI-SIFIOB(X,Y) * SET CFI TO COPY A,SIFCFI+1-SIFIOB(X,Y) * START OF DIRECTORY VIEW1 READ =SIFIOB,FS:,=16 GET NEXT DIRECTORY ENTRY VIEW91J JMP VIEW91 COPY =SIFBUF,X OFFSET OF BUFFER COPY 1(X,Y),A IS THIS LOGICAL END OF DIRECTORY ? JEQ A,VIEW8 YEP, GET OUT SHIFT A,RO,8 CLSN ='.',A IS IT A DIRECTORY? JMP VIEW1 YES, IGNORE IT COPY 0(X,Y),A IS THIS ENTRY DELETED ? JEQ A,VIEW1 IF SO, IGNORE IT COPY TEMPA(Y),A GET NUMBER OF FN'S ON THIS LINE CLSN A,=5 5 IS ENOUGH JSK VIEWOUT PRINT THE LINE COPY =SIFBUF,Q MOVE FILENAME TO OUTPUT BUFFER ADD Y,Q DO SETUP FOR MOVE JSK MOVENAME IMS TEMPA(Y) BUMP COUNT OF LINE ITEMS JMP VIEW1 GO GET NEXT FILENAME LPOOL VIEW8 JSK VIEWOUT FINISH LINE CLOSE SIFIOB JMP VIEW91 VIEW81 POP RSK VIEW9 EQU $ COPY WORKBLOK+NAMPT:(Y),X JEQ X,VIEW901 COPY 0(X),A SUB ='BA',A JNE A,VIEW901 COPY 1(X),A SUB ='TC',A JNE A,VIEW901 COPY 2(X),A SUB ='H ',A JNE A,VIEW901 JSK VEWBATCH JMP VIEW81 VIEW901 EQU $ WRITEMSG =MSGIOB,FA:,VDIRONLY JSK TVERROR JMP VIEW81 VIEW91 WRITEMSG =MSGIOB,FA:,VFILEERR JSK TVERROR JMP VIEW8 VIEWOUT COPY TEMPA(Y),A GET COUNT OF ITEMS JEQ A,VIEWOUT1 NUTHIN' TO DO SHIFT A,LO,4 NUMBER OF BYTES WRITE =SAFIOB,FA:,A PRINT LINE JSK TVERROR COPY:M =0,A,TEMPA(Y) RESET COUNT OF LINE ITEMS VIEWOUT1 RSK MOVENAME EQU $ COPY =7,X SHIFT A,LO,3 ADD =SAFBUF,A ADD A,Y COPY Q,0(Y) VIEW2 COPY *0(X,Y),Q ACTUAL MOVE LOOP SBIT CY:,S WHILE MOVING, REPLACE BLANKS WITH LEADER DOTS VIEW21 ROTATE Q,L,8 CLSN Q,=' ' ADD ='.'-' ',Q JT CY,VIEW21 DO IT TWICE COPY Q,0(X,Y) PUT IT BACK JNED X,VIEW2 COPY =' ',Q PUT IN TWO BLANKS BETWEEN FILENAMES EXCH Q,0(Y) AND RESTORE SOURCE ADDRESS SUB A,Y RSK LPOOL TITL VIEW BATCH VEWBATCH EQU $ R:WAIT *E:ZBSEM WAIT FOR ENTRY TO BATCH FILE OPEN BATCHIOB OPEN THE FILE JMP VIEWBERR COPY =BATCHIOB,X COPY:M =0,A,IOBLEN(X,Y) COPY A,IOBLEN+1(X,Y) ZERO CFI READ =BATCHIOB,DS:,=16 READ CONTROL RECORD TO GET # OF JOBS AND POS OF 1ST JMP VIEWBERR COPY:M BQPTR:+WORKBLOK(Y),A,IOBLEN(X,Y) COPY:M BQPTR:+1+WORKBLOK(Y),A,IOBLEN+1(X,Y) COPY:M =' ',A,1+BQNUM:+WORKBLOK(Y) EXCH WORKBLOK+BQNUM:(Y),A GET NUMBER OF JOBS COMP A,A COPY A,TEMPB(Y) COPY =WORKBLOK-1,Q ADD Y,Q COPY =0,A JSK MOVENAME COPY:M =1,A,TEMPA(Y) IMS TEMPB(Y) JMP VIEWB1 JMP VIEWB2 VIEWB1 EQU $ READ =BATCHIOB,FS:,=BQBLOK:L*2 READ NEXT ENTRY JMP VIEWBERR COPY LUN:+WORKBLOK(Y),Q ADD ='v '-'I ',Q SETEXT ='t',Q,=WORKBLOK COPY TEMPA(Y),A NUMBER OF FN'S ON THIS LINE CLSN A,=5 JSK VIEWOUT COPY =NAMBEG+WORKBLOK-1,Q ADD Y,Q JSK MOVENAME IMS TEMPA(Y) BUMP COUNT OF FN'S IMS TEMPB(Y) ARE WE DONE? JMP VIEWB1 NO!! VIEWB2 EQU $ JSK VIEWOUT PRINT LAST LINE CLOSE BATCHIOB JMP VIEWBERR VIEWB3 EQU $ COPY:M =0,A,WORKBLOK+VOLPT:(Y) CLEAR OUT VOLUME POINTER R:SIG *E:ZBSEM SIGNAL INTERLOCK RSK VIEWBERR EQU $ WRITEMSG =MSGIOB,FA:,VIEWBXX JSK TVERROR JMP VIEWB3 LPOOL TITL MESSAGES SUBSUB MSG ' SUBMIT - PROCESSING ERROR!' NOFMSG MSG ' SUBMIT - CANNOT FIND FILE!' INVALID MSG ' SUBMIT - INVALID SYNTAX!' LOCALBAD MSG ' LOCAL - CONNECT FAILED!' LOCALINV MSG ' LOCAL - MUST BE A DIRECTORY' DELETINV MSG ' DELETE - BAD FILE NAME' DELETBAD MSG ' DELETE -   CANNOT FIND FILE' DELETUNK MSG ' DELETE - BAD FILE NAME TERMINATOR' DELETDIR MSG ' DELETE - CAN''T DELETE DIRECTORIES!' VDIRONLY MSG ' VIEW - ONLY A DIRECTORY OR "BATCH" MAY BE SPECIFIED' VFILEERR MSG ' VIEW - ERROR IN DIRECTORY I/O OPERATION' VIEWBXX MSG ' VIEW BATCH - I/O ERROR IN BATCH::.SYQ' MTZELOW REL SHARABLE MTZELOW MTZELOW RES 1 END QPTR:+WORKBLOK(Y),A,IOBLEN(X,Y) COPY:M BQPTR:+1+WORKBLOK(Y),A,IOBLEN+1(X,Y) COPY:M =' ',A,1+BQNUM:+WORKBLOK(Y) EXCH WORKBLOK+BQNUM:(Y),A GET NUMBER OF JOBS COMP A,A COPY A,TEMPB(Y) COPY =WORKBLOK-1,Q ADD Y,Q COPY =0,A JSK MOVENAME COPY:M =1,A,TEMPA(Y) IMS TEMPB(Y) JMP VIEWB1 JMP VIEWB2 VIEWB1 EQU $ READ =BATCHIOB,FS:,=BQBLOK:L*2 READ NEXT ENTRY JMP VIEWBERR COPY LUN:+WORKBLOK(Y),Q ADD ='v '-'I 'MACRO MTZCMD(D=sf/GEN+sf/RTX+sf/IOS+sf/SFM+sf/OS4+MTE+MTEI,L=,PAGE=57) PRINT MTZCMD p8103170729195081100810345525811008103510 JMTZ:JOB MTZINIT MULTEZE JG:M O0SEGMENTBLANK MTZINIT OMTZCMD o ^KR:GATD I:IO E:SLU KE:MON R:BGIN E:MSG KCONNZB E:SYSFLGE:LOW KE:HIGH TVERROR MTZTDB KOE:YSIZEBCTDB ETCB KMTZIOENDMTZEDIT MTZELOW im MACRO (F101) igg  CĞC C i¸ Gϲ@Aǰp@    C/:Dt pbtpttt ttt tt`t  The Multeze Falcon (A 702). 4/95 CPU WITH MMU REQUIRED TO RUN THIS SY STEM MULTEZE ALREADY R UNNING MUST LOAD AT :2 00, MUST HAVE A MINIMUM OF 128K WORDS OF MEMORY A@  ФB1Nˀy T C Aߛk @A#  #  NO EDIT TERMINALS IN SYSTEMtA0t00t @``?u@u  <܂ۃ ΢@ N儀ʞz@ ڇʂهɃˏ   ޺K*1 ¯ JG¥ ƣ2A 6كCDšQC JƖ @NPʐ K JX? NEk @# @@t FIHGv  C @ʋ @_A@ B @ Bc # 0YK6ć@`ⷄEʶ:+ # t `g @ 5 @@  KNLMP OOJ b o` (tt  009>@)@L IM ʢMŸ )ڀN INI ʢLI IINI d OC'ZBdi )ڂ҄ڟϢστĂ  ˄0 Ä0# g JKkBC @ADE k @LANDE FOGQJK% /DG : PSZE[F`QaR'j ) $Ă0# 0t db --  i `" `B# T MTZELOW im MACRO (F101) igg  CĞC C i¸ Gϲ@Aǰp@    C/:Dt pbtpttt ttt tt   MTZINIT.JCL - ASSEMBLES MTZINIT.ASM - 93471-72-A702 /MACRO MTZINIT(D=sf/GEN+sf/RTX+sf/IOS+sf/SFM+sf/OS4+MTE+MTEI,L=,PAGE=57) /PRINT MTZINIT 811008102938811008102938811008102938 MTZCMD.JCL - ASSEMBLES MTZCMD.ASM - 93471-73-A702 MACRO MTZCMD(D=sf/GEN+sf/RTX+sf/IOS+sf/SFM+sf/OS4+MTE+MTEI,L=,PAGE=57) PRINT MTZCMD 811008102938811008102938811008102938/ Multeze Falcon Link JCL 93471-74-A702 / ASSIGN X2 TO THE DEVICE CONTAINING MTZCMD.OBJ AND MTZINIT.OBJ. / ASSIGN X3 TO THE DEVICE CONTAINING THE MULTED .OBJ FILES. / TYPE /* /DO TV AS X1=LO AS LO=MTZ.MAP LINK MTZ.SYS=X2/MTZCMD(EX=200,PA=39*104, AB.MTZCMD.TABLE:.DEBUG:.MTZELOW.MTZINIT=200, AB.MTZEDIT=1C00)+ X3/MTECONZB(UL)+ X3/MTEDIT(UL)+X3/MTEIO(UL)+X2/MTZINIT(UL)+sf/os4 AS LO=X1 PRINT MTZ.MAP 811008102938811008102938811008102938EDZt : :drt   ILLEGAL MULTEZE COMMA ND  MTE..g   The Multeze Falcon (A702) g  EZE..g   COMMAND FILE IGNORED g  NORMAL TERMINATION g  FILE RENAME ERRORg  g (..g (..g >g >g >g  JOB COMPLETEDJ OB ABORTEDPL) b% Ă ł0 PUKĂ ł0# tt   PL) b%tLsڄĂ  łn0ka , + ڀ^À] DKX Ă łS0Pa ,P +N# GĂ łB 0?# ;Ă ł6 03# C @PL) b%' Qߢ$Ă ł0 IR , : L  ׄĂ ł 0  J)ˀLUZt  Ă'Ģ Ă 0 Ȅɢ Ă0 V V Ȅɢ Ă 0E'Zt Zt  aE C R Rc # 01 w CLt ' Ă ł0Zt bt  C @PL) b%   DLUQǀT Q  )@C@ )@ Ȅ)@ Ă0 )MSy .r0D IM@bDh D Pt )@E@ c # Q1KȀŀ qĂ ł 0eĂ ł  0 PDK1)Ă 0 D# )! `@ NrL KV<5…@`# t BATCH  _ zZt  ԂԄ'â Ȅɢ  ĂɄ0WȀXɂaW V EI@b F DE Ă0Uʫ t@@ )D "I@b-DEi E' RZt  # Ă ł&0#o'0 -t1   SUBMIT - PROCESSING E RROR!  SUBMIT - CANNOT FIND FILE!  SUBMIT -  INVALID SYNTAX!  LOCAL - CONNECT FAILED! LOC AL - MUST BE A DIRECTORY  DELETE - BAD FILE NAM E  DELETE - CANNOT FIN D F  ILE" DELETE - BAD FI LE NAME TERMINATOR$ DEL ETE - CAN'T DELETE DIREC TORIES! 4 VIEW - ONLY A DIRECTORY OR "BATCH" MA Y BE SPECIFIED( VIEW -  ERROR IN DIRECTORY I/O O PERATION& VIEW BATCH -  I/O ERROR IN BATCH::.SYQiga ,/ Multeze Falcon Link JCL. / 90-93471-A700 AS X1=LO AS LO=MTZ.MAP LINK MTZ.SYS=MTZCMD(EX=200,PA=39*104, AB.MTZCMD.TABLE:.DEBUG:.MTZELOW.MTZINIT=200, AB.MTZEDIT=1C00)+ MTECONZB(UL)+ MTEDIT(UL)+MTELV+MTEIO(UL)+MTZINIT(UL)+sf/os4 AS LO=X1 PRINT MTZ.MAP 8110131737260081101317372625811026144839 TITL The Multeze Falcon MTZCMD PROCESSOR - MTZCMD.ASM - A7 MACHINE :80 REV SET 'A502' REV SET 'A600' 6mar1981 CHW Updated to use F109 editor. REV SET 'A700' 02sep1981 CHW Updated to use F300 editor. REV SET 'A701' 02sep1981 VAW&CHW added VIEW BATCH REV SET 'A702' 24sep1981 CHW prevented editing .DIR or directory device. REV SET 'A703' 13oct1981 VAW added PRINT command MTZCMD REL SHARABLE MTZCMD NAM G:C NAM MTZCMD NAM MTZELOW NAM MTZTDB NAM BCTDB NAM ETCB EXTR MULTEZE EXTR MTZINIT EXTR EDITENT EXTR TVERROR EXTR SETEXT EXTR READTV EXTR E:ZBSEM EXTR E:BASEM EXTR E:SYSFLG EXTR DEBUG4 EXTR MTZ:JOB TITL MZ:XXXX - MULTEZE CONTROL BLOCK G:C EQU $ * * MULTEZE CONTROL BLOCK * THIS BLOCK MUST START AT :200 * CONTAINS LINKS TO IMPORTANT STUFF * JMP MULTEZE MZ:ENT - NORMAL MTZ ENTRY POINT JMP DEBUG4 MZ:DBG - DEBUG ENTRY POINT WORD ETCB MZ:ETCB - EDIT TERMINAL CONTROL BLOCKS WORD 0 MZ:CRTS - TOTAL CRT'S UP WORD 0 MZ:EHIGH - E:HIGH BEFORE MTZ STARTUP TITL MTZBGIN - MTZ TERMINAL ACTIVITY START * * ENTER: X=EDIT TERMINAL CONTROL BLOCK * K,L=STACK * MTZBGIN EQU $ * * ACTIVITY STARTS HERE WITH INTERRUPTS DISABLED FOR * ONE INSTRUCTION. MUST HOLD OFF INTERRUPTS UNTIL * MAP IS SET FOR NEW STACK. * SIN 5 COPY ET:NUM(X),A GET TERMINAL NUMBER COPY R:ACT,Y AND MY ACB COPY A,AC:MAP(Y) SET MAP NUMBER OUT A,LUSER: AND TELL MMU (LOAD USER NUMBER) SBIT UM:,S SET USER MODE JSK MTZINIT DO TERMINAL INITIALIZATION MTE1 EQU $ COPY ETCBA(Y),X TERMINAL CONTROL BLOCK ADDRESS COPY ET:MSGBF(X),X MESSAGE BUFFER ADDRESS JEQ X,MTE15 IF NO BUFFER ALLOCATED COPY 0(X),A 1st TWO CHARACTERS SUB =' ',A JLE A,MTE15 IF NO MESSAGE WAITING OR ONE BEING MOVED COPY X,Q FILENAME ADDRESS SUB =1,Q COPY =0,A 1st THING TO MOVE JSK MOVENAME COPY ETCBA(Y),X TERMINAL CONTROL BLOCK ADDRESS COPY ET:MSGBF(X),X MESSAGE BUFFER ADDRESS COPY =' ',A EXCH A,0(X) NO MORE MESSAGE WAITING COPY =DONEMSG-1,Q TBIT 7,A WAS JOB ABORTED?? JF OV,$+2 IF NOT COPY =ABORTMSG-1,Q COPY =1,A JSK MOVENAME COPY:M =2,A,TEMPA(Y) SO VIEWOUT WILL PRINT PROPER # OF CHARACTERS JSK VIEWOUT MTE15 EQU $ WRITEMSG =MSGIOB,WP:,MTEPRMPT JSK TVERROR JSK READTV READ IN A COMMAND LINE JNE A,MTE1 E:ISM ISMBLOK(Y) GET COMMAND COPY DELIMITR(Y),A GET CONTROL CHARACTER CLSN ='/',A JMP $+3 CONTROL CHAR INDICATES A COMMAND COPY:M =2,A,CLPTR(Y) NOT SLASH, MUST BE COMMAND - RESET PTR * TO A 2 (BECAUSE BUFFER STARTS WITH 0000) JSK MTZCMD PARSE AND PROCESS COMMAND JMP MTE1 GET NEXT COMMAND * MTZTDB TDB: MTZBGIN,0,$-$,ET:STK,0,15 * *  COMMAND LOOP * * MTZCMD EQU $ E:ISM ISMBLOK(Y) COPY =SYMBUFF,X ADD Y,X COPY NUMCHAR(Y),Q JLE Q,CMDRET NULL COMMAND IS A NO-OP COPY =MTECMDS,A JSK LOOKUP JNE A,MTE90 JSK 0(X) GO TO COMMAND PROCESSOR CMDRET EQU $ RSK * MTE90 EQU $ WRITEMSG =MSGIOB,FA:,MTEUN UNKNOWN COMMAND JSK TVERROR RSK GET NEXT COMMAND LPOOL TITL COMMANDS MTECMDS EQU $ WORD 8/2 BYTE 'EDIT ' WORD EDIT BYTE 'EZEDIT ' WORD EDIT BYTE 'SUBMIT ' WORD SUBMIT BYTE 'DO ' WORD SUBMIT BYTE 'DELETE ' WORD DELET BYTE 'LOCAL ' WORD LOCAL BYTE 'VIEW ' WORD VIEW BYTE 'JOB ' WORD MTZ:JOB BYTE 'PRINT ' WORD PRINT WORD 0 TITL EDIT TERMINAL CONTROL BLOCKS ETCB EQU $ ETCB 1,STACK1 ETCB 2,STACK2 ETCB 3,STACK3 ETCB 4,STACK4 ETCB 5,STACK5 ETCB 6,STACK6  ETCB 7,STACK7 ETCB 8,STACK8 ETCB 9,STACK9 WORD 0 END OF TABLE * * EDIT TERMINAL STACKS & MESSAGE BUFFERS FROM BATCH QUEUE PROCESSOR * TERMINAL XMACRO STACK#(1) RES ET:STK BUFFR#(1) RES 7,' ' ENDM TERMINAL 1 TERMINAL 2 TERMINAL 3 TERMINAL 4 TERMINAL 5 TERMINAL 6 TERMINAL 7 TERMINAL 8 TERMINAL 9 TITL GO TO EDITOR ** * FUNCTION: CONNECT WITH EDITOR I/O INTERFACE * * ENTRY: JSK EDIT * * EXIT: RSK *** EDIT EQU $ COPY ABORTK(Y),A SEE IF EDIT IS IN PROGRESS. JNE A,EDIT1 NONZERO MEANS YES COPY K,A PREPARE FOR EDIT SUB =1,A RSK USES THIS WORD COPY A,ABORTK(Y) SET FOR TROUBLE JSK EDITENT COPY:M =0,A,ABORTK(Y) CLEAR EDIT AND ABORT FLAG JMP EDITEND EDIT1 EQU $ WRITEMSG =MSGIOB,FA:,EDITMSG JSK TVERROR EDITEND EQU $ RSK MORE COMMANDS LPOOL EDITMSG MSG ' EDIT ALREADY RUNNING' TITL L O O K U P * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * THIS SUBROUTINE DOES AN INDEFINITE ABBREVIATION LOOKUP OF A * * CHARACTER STRING AGAINST A TABLE OF KEYWORDS. * * * * ENTRY: A=ADDRESS OF TABLE * * Q=NUMBER OF CHARACTERS IN COMMAND (Q>0) * X=ADDRESS OF CHARACTER STRING * * JSK LOOKUP * * * * EXIT: RSK * * A UNCHANGED IF NOT IN TABLE, =0 IF IN TABLE * X CONTENTS OF WORD IN TABLE ASSICIATED WITH STRING * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * LOOKUP EQU $ PUSH XA:V SAVE REGISTERS, SET XA JLE Q,LOOK4 INVALID? TOO SHORT COPY A,Y TABLE ADDRESS ==> Y COPY 0(Y),A LENGTH OF ENTRY INWORDS SHIFT A,LO,1 IN BYTES CSK A,Q JMP LOOK4 INPUT STRING TOO LONG, ISN'T IN TABLE JMP LOOK2 ) GO DO JMP LOOK2 ) LOOKUP LOOK1 EQU $ GET NEXT TABLE ENTRY WORDMODE COPY Y,Q CURRENT TABLE ADDRESS ==;> Q COPY K,Y ADDRESS OF SAVED REGISTERS ==> Y ADD *LAST:A(Y),Q UPDATE CURRENT TAGBLE ADD*RESS (ALMOST) COPY LAST:Q(Y),Y NUMBER OF CHARACTERS ==> Y EXCH Q,Y # CHARS ==> Q; TABLE ADDRESS-1 ==> Y LOOK2 EQU $ FIRST TIME ENTRY TO LOOP COPY 1(Y),A FIRST WORD OF NEXT ENTRY (TEXT) JEQ A,LOOK4 IF ALL DONE, NOT FOUND SUB =1,Q TO BE USED AS "INDEX" ADD =1,Y BUMP TO 1ST WORD OF TEXT BYTEMODE LOOK3 EQU $ COMAPRE CHARACTERS LOOP EXCH X,Y STRING ==> Y; CURRENT TABLE ==> X XNX Q COPYB 0(Y),A PICK UP BYTE FROM STRING EXCH X,Y CURRENT TABLE ==> Y; STRING ==> X XNX Q SUBB 0(Y),A BYTE FROM TABLE JNE A,LOOK1 IF NO MATCH, GET NEXT TABLE ENTRY JNED Q,LOOK3 KEEP LOOKING UNTIL ALL CHAECKED * * NAMES MATCH, GET VALUE AND RETURN COPY Y,X CURRENT TABLE ==> X COPY K,Y BASE OF SAVED REGISTERS WORDMODE MAKE SURE WE ARE IN WORD MODE ADD *LAST:A(Y),X COPY 0(X),X COPY X,LAST:X(Y) COPY A,  LAST:A(Y) CLEAR A FOR GOOD FINE LOOK4 EQU $ POP RESTORE REGISTERS RSK R E T U R N LPOOL TITL BATCH CONTROL TASK BCTDB TDB: BCENT,0,BCSTK,50,0,1 BCSTK RES 50,0 STACK BCTICK TICK: 0,BCSEMA4,240 2 SECOND TICK CLOCK BCSEMA4 SDB: 0 CLOCK SEMAPHORE BCENT EQU $ TASK ENTRY POINT SIN 8 COPY E:SYSFLG,A GET SYSTEM FLAG WORD AND =SF:BATCH,A IS BATCH RUNNING? JEQ A,BC10 NO, IGNORE SENSE SWITCH JT SS,BC10 IF SENSE SW ON, LEAVE BATCH RUNNING XOR E:SYSFLG,A TURNOFF BATCH PROCESSING COPY A,E:SYSFLG R:SIG *E:BASEM SIGNAL SEMA4 * BC10 EQU $ R:ITIC BCTICK START 2 SECOND TIMER R:WAIT BCSEMA4 WAIT JMP BCENT LPOOL TITL COMMAND PROCESSOR MESSAGES MTEUN MSG ' ILLEGAL MULTEZE COMMAND' MTEPRMPT MSG ' ' MTEMORE MSG ' MTE..' TITL EDITOR I/O INTERFACE MESSAGES NAM SIGNON NAM CMDMORE NAM OPTMSG NAM NORMAL NAM RENMSG SIGNON WORD SIGNEND-$-1*2 BYTE ' The Multeze Falcon (' DOUBLE REV IFT REV<='A700' IFT REV>='A600' BYTE ') Assembled(' ASMDATE BYTE ') Linked(' LINKDATE ENDC ENDC BYTE ')' SIGNEND EQU $ CMDMORE MSG ' EZE..' OPTMSG MSG ' COMMAND FILE IGNORED' NORMAL MSG ' NORMAL TERMINATION' RENMSG MSG ' FILE RENAME ERROR' TITL OPERATOR COMMUNICATION PROMPTS * THESE ARE THE VARIOUS PROMPTS USED BY THE EDITOR AND ARE * OUTPUT VIA A CALL TO O:PROMPT WITH THE PROMPT ADDRESS IN A * AND THE LUN IN Q NAM CMDPROMT NAM FINPROMT NAM SUBPROMT NAM DSSPROMT NAM INSPROMT NAM INPPROMT NAM LISPROMT CMDPROMT BYTE :0A,'',:1D FINPROMT BYTE :0A,'' RES 40,'..' SUBPROMT BYTE :0A,'' RES 40,'..' DSSPROMT BYTE :0A,'>',:1D INSPROMT BYTE :0A,'>',:1D INPPROMT BYTE :0A,'>',:1D LISPROMT BYTE :0A,'',:1D DONEMSG BYTE 'JOB COMPLETED',7 ABORTMSG BYTE 7,'JOB ABORTED',7,7 TITL LOCAL DIRECTORY ** * FUNCTION: SETS THE LOCAL "EF" TO THE DIRECTORY SPECIFIED * * ENTRY: JSK LOCAL * * EXIT: RSK * USES LUN I1 + TERMINAL NUMBER AS A SCRATCH LUN * * LOCAL EQU $ E:GFN WORKBLOK(Y),EFLUN(Y),SILUN(Y) GET NEW DIRECTORY NAME CLSN A,=3 IS IT DIRECTORY? JMP LOCAL1 YES, IT'S OK WRITEMSG =MSGIOB,FA:,LOCALINV JSK TVERROR JMP LOCALEND LOCAL1 EQU $ COPY:M EFLUN(Y),A,LUN:+WORKBLOK(Y) FOR CONNECT F:CONN WORKBLOK(Y) JGT A,LOCALEND IF CONNECT GOOD WRITEMSG =MSGIOB,FA:,LOCALBAD JSK TVERROR LOCALEND EQU $ RSK LPOOL TITL DELETE ** * FUNCTION: DELETES THE SPECIFIED FILES * * ENTRY: JSK DELET * * EXIT: RSK * * DELET EQU $ E:GFN WORKBLOK(Y),EFLUN(Y),SILUN(Y) GET FILE NAME JEQ A,DELET1 IF OK WRITEMSG =MSGIOB,FA:,DELETINV JSK TVERROR JMP DELETEND DELET1 EQU $ COPY DELIMITR(Y),A CLSN A,=',' JMP DELET2 IF DELIMITER LOOKS GOOD CLSN A,='+' JMP DELET2 DITTO JNE A,DELET3 IF NOT END OF LINE DELET2 EQU $ COPY 1+NAMEXT+WORKBLOK(Y),A SUB ='IR',A JNE A,DELET25 NOT A DIRECTORY COPY NAMEXT+WORKBLOK(Y),A CLSN A,='D' JMP DELET4 DELET25 EQU $ F:DELE WORKBLOK(Y) JGT A,DELETEND IF DELETE GOOD WRITEMSG =MSGIOB,FA:,DELETBAD JSK TVERROR DELETEND EQU $ COPY DELIMITR(Y),A CLSN A,=',' JMP DELET IF MORE TO DO CLSN A,='+' JMP DELET DITTO RSK DELET3 EQU $ WRITEMSG =MSGIOB,FA:,DELETUNK JSK TVERROR RSK DELET4 EQU $ WRITEMSG =MSGIOB,FA:,DELETDIR JSK TVERROR RSK TITL SUBMIT ** * FUNCTION: PROCESS THE SUBMIT COMMAND * * ENTRY: JSK SUBMIT * * EXIT: RSK * NOTE: ALL REGISTERS PRESERVED * /SUBMIT FILENAME ** SUBMIT EQU $  PUSH XA:V SUBAGAIN EQU $ E:GFN WORKBLOK(Y),EFLUN(Y),SILUN(Y) JNE A,SUBINV COPY WORKBLOK+NAMPT:(Y),A JNE A,SUB1 FILENAME IS OK SUBINV EQU $ WRITEMSG =MSGIOB,FA:,INVALID JSK TVERROR JMP SUBEND LPOOL SUBINV2 EQU $ WRITEMSG =MSGIOB,FA:,NOFMSG JSK TVERROR JMP SUBEND SUB1 EQU $ SETEXT ='J',='CL',=WORKBLOK TRY .JCL SUB2 EQU $ COPY:M SILUN(Y),A,LUN:+WORKBLOK(Y) F:CONN WORKBLOK(Y) JLE A,SUBINV2 IF BAD CONNECT R:WAIT *E:ZBSEM WAIT FOR ENTRY TO BATCH FILE OPEN BATCHIOB OPEN THE FILE JMP SUBERR WRITE =BATCHIOB,FS:,=BQBLOK:L*2 WRITE THE FILENAME ETC. JMP SUBERR COPY:M =0,A,IOBLEN(X,Y) COPY A,IOBLEN+1(X,Y) ZERO CFI READ =BATCHIOB,DS:,=12 READ CONTROL RECORD TO UPDATE JOB COUNT JMP SUBERR COPY WORKBLOK+BQNUM:(Y),A GET NUMBER OF JOBS ADD =1,A INCLUDE THIS JOB COPY A,WORKBLOK+BQNUM:(Y) RECORD ON FILE COPY:M =0,A,IOBLEN(X,Y) COPY A,IOBLEN+1(X,Y) WRITE =BATCHIOB,DS:,=12 JMP SUBERR CLOSE BATCHIOB JMP SUBERR R:SIG *E:BASEM SIGNAL USAGE R:SIG *E:ZBSEM SIGNAL INTERLOCK COPY DELIMITR(Y),A ANY MORE FILES TO SUBMIT? JEQ A,SUBEND SUB =CR:,A HOW ABOUT A CARRIAGE RETURN? JEQ A,SUBEND COPY:M =0,A,WORKBLOK+VOLPT:(Y) CLEAR OUT VOLUME POINTER JMP SUBAGAIN MORE FILES, DO IT!!!! SUBEND EQU $ JSK VEWBATCH COPY:M =0,A,WORKBLOK+VOLPT:(Y) CLEAR OUT VOLUME POINTER POP RSK LPOOL SUBERR EQU $ WRITEMSG =MSGIOB,FA:,SUBSUB JSK TVERROR R:SIG *E:ZBSEM SIGNAL INTERLOCK JMP SUBEND  LPOOL TITL VIEW * * FUNCTION: VIEW A DIRECTORY IN N(AMEONLY) FORMAT * * ENTRY: JSK VIEW * * EXIT: RSK * VIEW EQU $ PUSH XA:V  E:GFN WORKBLOK(Y),EFLUN(Y),SILUN(Y) CLSN A,=3 WAS IT A DIRECTORY ? JMP VIEW0 YEP CLSN A,=1 HOW ABOUT DEFAULTING TO CURRENT LOCAL DIRECTORY ? JMP VIEW0 THAT'S IT ! JMP VIEW9 REALLY BAD VIEW0 COPY:M =0,A,TEMPA(Y) RESET LINE ITEM COUNT COPY:M SILUN(Y),A,WORKBLOK+LUN:(Y) SUPPLY LUN FOR CONNECT COPY WORKBLOK+NAMPT:(Y),A IS THERE A NAME? JNE A,VIEW05 IF YES, DO CONNECT COPY WORKBLOK+FNO:(Y),A HOW ABOUT A FILE? JNE A,$+2 IF REAL FILE HERE COPY =1,A USE ROOT DIRECTORY COPY A,WORKBLOK+NAMPT:(Y) F:CFNO WORKBLOK(Y) DO CONNECT JMP VIEW07 CONTINUE VIEW05 F:CONN WORKBLOK(Y) DO CONNECT VIEW07 SUB =1,A JLE A,VIEW91J OPEN SIFIOB OPEN DIRECTORY JMP VIEW91 COPY =SIFIOB,X OFFSET FOR INPUT IOB COPY:M =0,A,SIFCFI-SIFIOB(X,Y) * SET CFI TO COPY A,SIFCFI+1-SIFIOB(X,Y) * START OF DIRECTORY VIEW1 READ =SIFIOB,FS:,=16 GET NEXT DIRECTORY ENTRY VIEW91J JMP VIEW91 COPY =SIFBUF,X OFFSET OF BUFFER COPY 1(X,Y),A IS THIS LOGICAL END OF DIRECTORY ? JEQ A,VIEW8 YEP, GET OUT SHIFT A,RO,8 CLSN ='.',A IS IT A DIRECTORY? JMP VIEW1 YES, IGNORE IT COPY 0(X,Y),A IS THIS ENTRY DELETED ? JEQ A,VIEW1 IF SO, IGNORE IT COPY TEMPA(Y),A GET NUMBER OF FN'S ON THIS LINE CLSN A,=5 5 IS ENOUGH JSK VIEWOUT PRINT THE LINE COPY =SIFBUF,Q MOVE FILENAME TO OUTPUT BUFFER ADD Y,Q DO SETUP FOR MOVE JSK MOVENAME IMS TEMPA(Y) BUMP COUNT OF LINE ITEMS JMP VIEW1 GO GET NEXT FILENAME LPOOL VIEW8 JSK VIEWOUT FINISH LINE CLOSE SIFIOB JMP VIEW91 VIEW81 POP RSK VIEW9 EQU $ COPY WORKBLOK+NAMPT:(Y),X JEQ X,VIEW901 COPY 0(X),A SUB ='BA',A JNE A,VIEW901 COPY 1(X),A SUB ='TC',A JNE A,VIEW901 COPY 2(X),A SUB ='H ',A JNE A,VIEW901 JSK VEWBATCH JMP VIEW81 VIEW901 EQU $ WRITEMSG =MSGIOB,FA:,VDIRONLY JSK TVERROR JMP VIEW81 VIEW91 WRITEMSG =MSGIOB,FA:,VFILEERR   JSK TVERROR JMP VIEW8 VIEWOUT COPY TEMPA(Y),A GET COUNT OF ITEMS JEQ A,VIEWOUT1 NUTHIN' TO DO SHIFT A,LO,4 NUMBER OF BYTES WRITE =SAFIOB,FA:,A PRINT LINE JSK TVERROR COPY:M =0,A,TEMPA(Y) RESET COUNT OF LINE ITEMS VIEWOUT1 RSK MOVENAME EQU $ COPY =7,X SHIFT A,LO,3 ADD =SAFBUF,A ADD A,Y COPY Q,0(Y) VIEW2 COPY *0(X,Y),Q ACTUAL MOVE LOOP SBIT CY:,S WHILE MOVING, REPLACE BLANKS WITH LEADER DOTS VIEW21 ROTATE Q,L,8 CLSN Q,=' ' ADD ='.'-' ',Q JT CY,VIEW21 DO IT TWICE COPY Q,0(X,Y) PUT IT BACK JNED X,VIEW2 COPY =' ',Q PUT IN TWO BLANKS BETWEEN FILENAMES EXCH Q,0(Y) AND RESTORE SOURCE ADDRESS SUB A,Y RSK LPOOL TITL VIEW BATCH VEWBATCH EQU $ R:WAIT *E:ZBSEM WAIT FOR ENTRY TO BATCH FILE OPEN BATCHIOB OPEN THE FILE JMP VIEWBERR COPY =BATCHIOB,X COPY:M =0,A,IOBLEN(X,Y) COPY A,IOBLEN+1(X,Y) ZERO CFI READ =BATCHIOB,DS:,=16 READ CONTROL RECORD TO GET # OF JOBS AND POS OF 1ST JMP VIEWBERR COPY:M BQPTR:+WORKBLOK(Y),A,IOBLEN(X,Y) COPY:M BQPTR:+1+WORKBLOK(Y),A,IOBLEN+1(X,Y) COPY:M =' ',A,1+BQNUM:+WORKBLOK(Y) EXCH WORKBLOK+BQNUM:(Y),A GET NUMBER OF JOBS COMP A,A COPY A,TEMPB(Y) COPY =WORKBLOK-1,Q ADD Y,Q COPY =0,A JSK MOVENAME COPY:M =1,A,TEMPA(Y) IMS TEMPB(Y) JMP VIEWB1 JMP VIEWB2 VIEWB1 EQU $ READ =BATCHIOB,FS:,=BQBLOK:L*2 READ NEXT ENTRY JMP VIEWBERR COPY LUN:+WORKBLOK(Y),Q ADD ='v '-'I ',Q SETEXT ='t',Q,=WORKBLOK COPY TEMPA(Y),A NUMBER OF FN'S ON THIS LINE CLSN A,=5 JSK VIEWOUT COPY =NAMBEG+WORKBLOK-1,Q ADD Y,Q JSK MOVENAME IMS TEMPA(Y) BUMP COUNT OF FN'S IMS TEMPB(Y) ARE WE DONE? JMP VIEWB1 NO!! VIEWB2 EQU $ JSK VIEWOUT PRINT LAST LINE CLOSE BATCHIOB JMP VIEWBERR VIEWB3 EQU $ COPY:M =0,A,WORKBLOK+VOLPT:(Y) CLEAR OUT VOLUME POINTER R:SIG *E:ZBSEM SIGNAL INTERLOCK RSK VIEWBERR EQU $ WRITEMSG =MSGIOB,FA:,VIEWBXX JSK TVERROR JMP VIEWB3 LPOOL TITL PRINT PRINT EQU $ E:GFN WORKBLOK(Y),EFLUN(Y),SILUN(Y) GET FILE NAME JEQ A,PRINT1 WRITEMSG =MSGIOB,FA:,PRINTINV JSK TVERROR JMP PRINTEND PRINT1 EQU $ COPY =1,A ONE COPY OF FILE E:PRINT WORKBLOK(Y) PRINT FILE JEQ X,PRINTEND WRITEMSG =MSGIOB,FA:,PRINTBAD JSK TVERROR PRINTEND EQU $ COPY DELIMITR(Y),A CLSN A,=',' JMP PRINT CLSN A,='+' JMP PRINT RSK LPOOL TITL MESSAGES SUBSUB MSG ' SUBMIT - PROCESSING ERROR!' NOFMSG MSG ' SUBMIT - CANNOT FIND FILE!' INVALID MSG ' SUBMIT - INVALID SYNTAX!' LOCALBAD MSG ' LOCAL - CONNECT FAILED!' LOCALINV MSG ' LOCAL - MUST BE A DIRECTORY' DELETINV MSG ' DELETE - BAD FILE NAME' DELETBAD MSG ' DELETE - CANNOT FIND FILE' DELETUNK MSG ' DELETE - BAD FILE NAME TERMINATOR' DELETDIR MSG ' DELETE - CAN''T DELETE DIRECTORIES!' VDIRONLY MSG ' VIEW - ONLY A DIRECTORY OR "BATCH" MAY BE SPECIFIED' VFILEERR MSG ' VIEW - ERROR IN DIRECTORY I/O OPERATION' VIEWBXX MSG ' VIEW BATCH - I/O ERROR IN BATCH::.SYQ' PRINTINV MSG ' PRINT - BAD FILE NAME' PRINTBAD MSG ' PRINT - CAN''T FIND FILE' MTZELOW REL SHARABLE MTZELOW MTZELOW RES 1 END TEMPA(Y),A NUMBER OF FN'S ON THIS LINE CLSN A,=5 JSK VIEWOUT COPY =NAMBEG+WORKBLOK-1,Q ADD Y,Q JSK MOVENAME IMS TEMPA(Y) BUMP COUNT OF FN'S IMS TEMPB(Y) ARE WE DONE? JMP VIEWB1 NO!! VIEWB2 EQU $ JSK VIEWOUT PRINT LAST LINE CLOSE BATCHIOB JMP VIEWBERR VIEWB3 EQU $ COPY:M =0,A,WORKBLOK+VOLPT:(Y) CLEAR OUT VOLUME POINTER R:SIG *E:ZBSEM SIGNAL INTERLOCK RSK VIEWBERR EQU $ WRITEMSG =MSGIOB,FA JLISPROMTINPPROMTINSPROMTJDSSPROMTSUBPROMTFINPROMTJCMDPROMTRENMSG NORMAL JOPTMSG CMDMORE SIGNON JBCSEMA4 ETCB BCTDB JMTZTDB MTZELOW MTZCMD JG:C O0SEGMENTBLANK MTZCMD OTABLE: MTZELOW o KE:PRINT F:CFNO F:DELE KF:CONN E:GFN R:WAIT KR:ITIC R:SIG E:ISM KI:IO MTZ:JOB DEBUG4 KE:SYSFLGE:BASEM E:ZBSEM KREADTV SETEXT TVERROR KEDITENT MTZINIT MULTEZE NR:SL R:TDBL im MACRO (F101) ig O!F@1T @ J @§ 6¥  DĂ ł0)! ba / nRtttt t  c U$tigkdiIg )! bp)' bbRĂ#  dĂ ł0[# eEDIT EZEDIT SUBMIT NDO NDELETE LOCAL VIEW JOB t PRINT  g 4;nu EL  4  n    E    Bp B B ł0# tt  EDIT ALREADY RUNNING  C @R`@K'@` `pBC`HARJk%`(C @ `(C @U ``p'BDBc # i gkd2di2dikg >iEDZt : :drt   ILLEGAL MULTEZE COMMA ND  MTE..g   The Multeze Falcon (A703) g  EZE..g   COMMAND FILE IGNORED g  NORMAL TERMINATION g  FILE RENAME ERRORg  g (..g (..g >g >g >g  JOB COMPLETEDJ OB ABORTEDPL) b% Ă ł0 PUKĂ ł0# tt D 7 PL) b%tLsڄĂ  łn0ka , + ڀ^À] DKX Ă łS0Pa ,P +N# GĂ łB 0?# ;Ă ł6 03# C @PL) b%' Qߢ$Ă ł0 SIR ` n ) ׄĂ ł 0  J)ˀLUZt Ă'Ģ Ă 0 Ȅɢ Ă0 V V Ȅɢ Ă 0E'Zt Zt aE C R Rc # 01 | CLt ' Ă ł0Ztbt  C @PL) b%   DLUQǀT Q  )@C@ )@ Ȅ)@ Ă0 )MSy .r0D IM@bDh I Ut )@E@ c # Q1KȀŀ qĂ ł 0eĂ ł  0 PDK1)Ă 0 D# )! `@ NrL KV<5…@`# t BATCH  Zt ՂՄ'â Ȅɢ  ʄ0WȀXɂaW V EI@b F DE Ă0Uʬ t@@ )D "I@b-DEi E' RZt # Ă ł&0#o'0 -t1  PL) b%LoĂ  ł 0 ) b1K ^Ă ł0a ,Z +X# t t t  SUBMIT - PROCESSING E RROR!  SUBMIT - CANNOT FIND FILE!  SUBMIT -   INVALID SYNTAX!  LOCAL - CONNECT FAILED! LOC AL - MUST BE A DIRECTORY  DELETE - BAD FILE NAM E  DELETE - CANNOT FIN D FILE" DELETE - BAD FI LE NAME TERMINATOR$ DEL ETE - CAN'T DELETE DIREC TORIES! 4 VIEW - ONLY A DIRECTORY OR "BATCH" MA Y BE SPECIFIED( VIEW -  ERROR IN DIRECTORY I/O O PERATION& VIEW BATCH -  I/O ERROR IN BATCH::.SYQ  PRINT - BAD FILE NAME  PRINT - CAN'T FIND FILEig SIR ` n ) ׄĂ ł 0  J)ˀLUZt Ă'Ģ Ă 0 Ȅɢ Ă0 V V Ȅɢ Ă 0E'Zt Zt aE C R Rc # 01 | CLt ' Ă ł0Ztbt  C @PL) b% TITL The Multeze Falcon INITIALIZATION - MTZINIT.ASM - 93471-21-A702 MACHINE :80 MTZINIT REL SHARABLE MTZINIT NAM G:M NAM MULTEZE NAM MTZINIT NAM MTZ:JOB EXTR MTZELOW EXTR MTZEDIT EXTR MTZIOEND EXTR ETCB EXTR BCTDB EXTR OE:YSIZE EXTR MTZTDB EXTR TVERROR EXTR E:MONE EXTR E:HIGH EXTR E:LOW EXTR E:SYSFLG EXTR CONNZB EXTR R:HIGH G:M EQU $ MULTEZE EQU $ E:MSG MULTMSG FMT A SUB =:23,A CHECK FOR 4/95 CPU JEQ A,MACHOK E:MSG MACHMSG JMP ALLDONE * * * INSURE MULTEZE NOT ALREADY RUNNING * MACHOK EQU $ COPY E:SYSFLG,A GET SYSTEM FLAG WORD AND =SF:MULTD,A CLEAR MULTEZE BIT JEQ A,MULTOK JUMP IF NOT RUNNING E:MSG RUNNGMSG JMP ALLDONE * MULTOK EQU $ COPY E:LOW,A MUST BE LOADED AT :200 SUB =:200,A JEQ A,LOADOK GO IF LOADED OK E:MSG BADLOAD JMP ALLDONE LOADOK EQU $ SIN 2 COPY E:SYSFLG,A GET SYSTEM FLAG WORD OR =SF:MULTD,A SET MULTEZE RUNNING FLAG COPY A,E:SYSFLG JSK TVCONN CONNECT THE EDIT TERMINALS JEQ A,ALLDONE GO IF NO EDIT TVS * * ALLOCATE LOGICAL MEMORY * COPY E:HIGH,A SAVE OLD E:HIGH COPY A,MZ:EHIGH COPY =YSIZE,Q I/O WORK AREA SIZE COPY =0,A MUL MZ:CRTS,AQ X NUMBER OF TERMINALS SUB E:HIGH,Q ALLOCATE FROM TOP OF FREE SPACE NEG Q,Q COPY Q,E:HIGH SET NEW E:HIGH COPY Q,K AND NEW STACK * COPY =MTZELOW,A SET NEW E:LOW TO JUST PAST IFT MTZDEBUG ******************** COPY =MTZIOEND,A DEBUG MODE ******************** ENDC ADD =1,A COPY A,E:LOW THE END OF MTZCMD * COPY =MTZIOEND,A END OF EDITOR ADD =1,A JUST PAST IT ADD =:3FF,A ROUND UP TO NEXT PAGE AND =:FC00,A COPY A,EDWRK START OF EDITOR WORK AREA ADD OE:YSIZE,A ALLOCATE WORK AREA COPY A,EDBFL BOTTOM OF EDIT BUFFER * COPY =MTZEDIT,A START OF EDITOR SHIFT A,R,10 CONVERT TO PAGE NUMBER COPY A,EDLOW LOW EDITOR PAGE NUMBER COPY =MTZIOEND,A END OF EDITOR SHIFT A,R,10 CONVERT TO PAGE NUMBER COPY A,EDHIGH HIGH EDITOR PAGE NUMBER * * CONNECT THE BATCH QUEUE FILE TO LUN 'ZB' * JSK CONNZB INITIALIZE BATCH QUEUE * * INITIALIZE MAP, ALLOCATE MEMORY * JSK MAPINIT COPY TPAGES,A GET TOTAL PHYSICAL PAGES SUB =128,A MUST BE AT LEAST THIS MUCH JGE A,MEMOK GO IF ENOUGH E:MSG MEMERR REPORT INSUFFICIENT MEMORY JMP ALLDONE AND EXIT MEMOK EQU $ * * START EDIT ACTIVITIES * JSK STARTEDT * * START UP THE BATCH PROCESSOR * SIN 3 COPY E:SYSFLG,A GET SYSTEM FLAG WORD OR =SF:BATCH,A SET BATCH MODE FLAG COPY A,E:SYSFLG RESTORE FLAG WORD R:BGIN BC START BATCH CONTROL TASK * ALLDONE EQU $ E:MON EXIT AND START BATCH PROCESSOR BC BGIN: BCTDB,:7000 EDWRK WORD 0 EDITOR WORK AREA ADDRESS EDBFL WORD 0 LOW EDIT BUFFER ADDRESS EDLOW WORD 0 LO W PAGE OF EDITOR EDHIGH WORD 0 HIGH PAGE OF EDITOR LPOOL MULTMSG MSG ' The Multeze Falcon (A702)' MACHMSG MSG ' 4/95 CPU WITH MMU REQUIRED TO RUN THIS SYSTEM' RUNNGMSG MSG ' MULTEZE ALREADY RUNNING' BADLOAD MSG ' MUST LOAD AT :200' MEMERR MSG ' MUST HAVE A MINIMUM OF 128K WORDS OF MEMORY' TITL TVCONN - CONNECT EDIT TERMINALS * TVCONN EQU $ COPY =ETCB,Y EDIT TCB LIST COPY:M =0,A,MZ:CRTS ZERO TOTAL ACTIVE TERMINALS * CT10 EQU $ COPY:M =0,A,ET:STAT(Y) CLEAR STATUS COPY ET:NUM(Y),A TV NUMBER CSK A,=10 * * JMP $+2 * IF > 9, MAKE A..F ADD ='A'-'0'+1,A * * ADD ='A0',A CONVERT TO LUN COPY A,TVLUN E:SLU TVLUN CONNECT TO LUN JNE A,CT30 NO LUN FOR TV COPY X,ET:UAT(Y) SAVE UAT ADDRESS IN ETCB JEQ X,CT30 NOTHING ASSIGNED TO IT SO IGNORE IT COPY 1(X),X  GET DIB ADDRESS COPY DI:FLG(X),A SEE IF IT IS A DIB JLT A,CT30 NO, MUST BE A FCB, SO IGNORE IT COPY DI:NAM(X),A WHAT IS IT ATTACHED TO? SHIFT A,RO,8 CLSN A,='T' A TVxx? JMP $+2 YES JMP CT30 NO, IGNORE IT COPY 1+DI:NAM(X),A WHICH TV (OR TY) IS IT ATTACHED TO? SUB ='00',A JEQ A,CT30 IF TV00; IT'S NOT AN EDIT TERMINAL COPY:M =1%ETS:UP,A,ET:STAT(Y) SET TV "UP" IMS MZ:CRTS BUMP TOTAL TERMINALS * CT30 EQU $ ADD =ET:SIZE,Y NEXT ETCB ENTRY COPY 0(Y),A END OF TABLE? JNE A,CT10 NO, CONTINUE COPY MZ:CRTS,A GET TOTAL TERMINALS JEQ A,CT40 GO IF NONE CONNECTED RSK * CT40 EQU $ E:MSG CTMSG ERROR COPY =0,A RSK TVLUN WORD 0 CTMSG MSG ' NO EDIT TERMINALS IN SYSTEM' LPOOL TITL MAPINIT - INITIALIZE MAP AND CACHE MAPINIT EQU $ COPY =16*64-1,Y TOTAL LOGICAL PAGES * MAP04 EQU $ SET ALL MAPS EQUAL TO MAP 0 COPY Y,Q LOGICAL PAGE NUMBER COPY Y,A AND =:3F,A PHYSICAL IS MOD 64 JSK SETMAP SET THIS PAGE JNED Y,MAP04 CONTINUE UNTIL DONE * COPY =1024,Y CLEAR THE CACHE COPY 0(Y),A BY READING 1024 JNED Y,$-1 CONSECUTIVE LOCATIONS * COPY =0,A OUT A,LUSER: SET USER NUMBER TO 0 SBIT MMUT:,A ENABLE TRANSLATION SBIT MMUC:,A AND CACHE OUT A,MCTL: SEND TO MMU * * DETERMINE THE NUMBER OF PHYSICAL PAGES INSTALLED * COPY:M UMTA:+2,A,TRAPSAVE SAVE THE OLD UMT COPY:M UMTA:+3,A,TRAPSAVE+1 COPY:M MEMTRAP,A,UMTA:+2 SET UP NEW CONTENTS COPY:M MEMTRAP+1,A,UMTA:+3 * COPY EDWRK,A EDITOR WORK AREA SHIFT A,R,10 CONVERT TO PAGE NUMBER COPY A,LPAGE USE AS LOW PAGE NUMBER COPY =:8000,X ADDRESS OF WINDOW PAGE COPY X,Q SHIFT Q,R,10 CONVERT TO PAGE NUMBER * MAP10 EQU $ COPY TPAGES,A TOTAL PHYSICAL PAGES JSK SETMAP SET WINDOW COPY A,0(X) COPY A,1(X) IF NO TRAP, GOOD PAGE IMS TPAGES OK, CONTINUE JMP MAP10 * TRAP EQU $ ENTER HERE IF MEMORY TRAP COPY Q,A JSK SETMAP RESORE WINDOW COPY:M TRAPSAVE,A,UMTA:+2 RESTORE UMT COPY:M TRAPSAVE+1,A,UMTA:+3 * * ALLOCATE NEW PHYSICAL PAGES TO REPLACE EDITOR * IN MAP 0 * IFT MTZDEBUG ******************** JMP MAP16 IF DEBUG SKIP THIS ******************** ENDC COPY EDHIGH,A SUB EDLOW,A ADD =1,A TOTAL NUMBER OF EDITOR PAGES COPY A,X USE AS COUNT NEG A,A * * ADD TPAGES,A * TAKE EDITOR OUT OF AVALIABLE PAGES COPY A,TPAGES * * COPY EDLOW,Q LOW EDITOR PAGE NUMBER * NEXTPG EQU $ COPY CPAGE,A NEXT PHYSICAL PAGE TO USE IMS CPAGE JSK SETMAP SET NEW PAGE TO OVERLAY EDITOR ADD =1,Q NEXT LOGICAL PAGE SUB =1,X JNE X,NEXTPG CONTINUE FOR ALL EDITOR PAGES * * COMPUTE MAXIMUM EDIT BUFFER SIZE * MAP16 EQU $ COPY E:HIGH,A HIGH ADDRESS SHIFT A,RO,10 CONVERT TO PAGE NUMBER   SUB LPAGE,A MAX PAGES PER EDIT BUFFER COPY A,MPAGES SAVE IT * * COMPUTE SIZE OF EDIT BUFFERS * COPY =0,A COPY TPAGES,Q TOTAL PHYSICAL PAGES SUB =64,Q AVAILABLE FOR EDIT BUFFERS DIV MZ:CRTS,AQ DIVIDED BY TOTAL TERMINALS ACTIVE CSK Q,MPAGES COMPARE WITH MAXIMUM ALLOWED JMP MAP20 SMALLER, OK NOP COPY MPAGES,Q TOO BIG, SET TO MAXIMUM COPY =0,A CLEAR REMAINDER * MAP20 EQU $ COPY A,RPAGES SAVE ODD PAGES COPY Q,BPAGES SAVE PAGES PER EDIT BUFFER * * SCAN EDIT TERMINAL CONTROL BLOCKS, ASSIGN * EDIT BUFFER ADDRESSES AND SET MAP * COPY =ETCB,Y CONTROL BLOCK TABLE * MAP30 EQU $ COPY ET:STAT(Y),A GET TERMINAL STATUS TBIT ETS:UP,A TEST IF ACTIVE JF OV,MAP50 NO, SKIP THIS ONE COPY EDWRK,A GET WORK AREA ADDRESS COPY A,ET:EDWRK(Y) SET ETCB COPY EDBFL,A GET EDIT BUFFER ADDRESS COPY A,ET:EDBFL(Y) SET ETCB COPY BPAGES,A GET PAGES PER EDIT BUFFER COPY RPAGES,Q ANY ODD PAGES? JEQ Q,MAP34 NO ADD =1,A YES, GIVE AN EXTRA TO THIS BUFFER SUB =1,Q DECREMENT ODD PAGE COUNT COPY Q,RPAGES * MAP34 EQU $ COPY ET:NUM(Y),Q GET TERMINAL NUMBER SHIFT Q,L,6 CONVERT TO LOGICAL PAGE ADD LPAGE,Q BUFFER BASE OFFSET * MAP40 EQU $ A=PAGES FOR THIS BUFFER EXCH A,CPAGE NEXT PHYSICAL TO ALLOCATE JSK SETMAP ASSIGN IN MAP ADD =1,A NEXT PAGE EXCH CPAGE,A RESTORE A ADD =1,Q NEXT LOGICAL PAGE IN BUFFER SUB =1,A DECREMENT PAGE COUNT JNE A,MAP40 CONTINUE UNTIL DONE * SUB =1,Q HIGH BUFFER PAGE AND =:3F,Q MOD 64 SHIFT Q,L,10 CONVERT TO ADDRESS OR =:3FF,Q TOP OF PAGE COPY Q,ET:EDBFH(Y) SAVE HIGH BUFFER ADDRESS * MAP50 EQU $ ADD =ET:SIZE,Y NEXT TERMINAL BLOCK COPY 0(Y),A END OF TABLE? JNE A,MAP30 NO, CONTINUE RSK * LPAGE WORD 0 LOW EDIT BUFFER PAGE NUMBER MPAGES WORD 0 MAX NUMBER OF EDIT BUFFER PAGES BPAGES WORD 0 ALLOCATED PAGES PER BUFFER RPAGES WORD 0 REMAINDER ODD PAGES TPAGES WORD 64 TOTAL PHYSICAL PAGES CPAGE WORD 64 CURRENT PHYSICAL PAGE TO ALLOCATE LPOOL MEMTRAP JST *$+1 MEMORY TRAP CONTENTS WORD GOTTRAP TRAPSAVE RES 2,0 GOTTRAP ENT JMP TRAP TITL SETMAP - SET PAGE IN TRANSLATION TABLE * * SETMAP - SUBROUTINE TO SET UP A PAGE * IN THE MMU TRANSLATION TABLE * * ENTER: A=PHYSICAL PAGE NUMBER * Q=LOGICAL PAGE NUMBER * SETMAP EQU $ PUSH XA:V OR =:3000,A ALLOW READ/WRITE/EXECUTE ACCESS ADD =:FC00,Q ADD BASE OF XLATE TABLE COPY Q,X X=XLATE TABLE ENTRY ADDRESS SIN 6 NO INTERRUPTS! IN MCTL:,Q GET MMU CONTROL REGISTER SBIT MMUA:,Q ENABLE XLATE TABLE ACCESS OUT Q,MCTL: COPY A,0(X) SET TABLE ENTRY RBIT MMUA:,Q DISABLE XLATE TABLE ACCESS OUT Q,MCTL: POP RSK LPOOL TITL STARTEDT - INITIATE EDIT ACTIVITIES STARTEDT EQU $ COPY E:HIGH,Q ADD =1,Q LOW ADDRESS OF WORK AREA COPY =ETCB,X TERM CONTROL BLOCK LIST * ST10 EQU $ COPY ET:STAT(X),A IS TERMINAL UP? TBIT ETS:UP,A JF OV,ST20 NO, SKIP IT COPY Q,ET:IOWRK(X) I/O INTERFACE WORK AREA COPY ET:EDSTK(X),Y GET STACK ADDRESS COPY Q,0(Y) SAVE I/O WORK AREA ADDRESS AT 0(L) COPY Y,A A=STACK ADDRESS COPY =MTZTDB,Y GET TDB ADDRESS COPY A,TD:AD(Y) STUFF IN STACK ADDRESS ADD =YSIZE,Q Q=NEXT I/O WORK AREA R:BGIN TVBGIN START ACTIVITY * ST20 EQU $ ADD =ET:SIZE,X NEXT ETCB COPY 0(X),A END OF LIST? IFT MTZDEBUG ******************** JMP $+2 IF DEBUG, ONLY ONE TERMINAL ******************** ENDC JNE A,ST10 NO, CONTINUE RSK YES, EXIT * TVBGIN BGIN: MTZTDB,ET:PRI TITL MTZINIT - EDIT TERMINAL  INITIALIZATION ** * FUNCTION: INITIALIZE MULTEZE DATA REGION * * ENTRY: JSK MTZINIT * * EXIT: RSK * * X= EDIT TERNIMAL CONTROL BLOCK * K,L= STACK ** MTZINIT EQU $ COPY ET:IOWRK(X),Y GET WORK AREA COPY X,Q SAVE X (ETCB ADDRESS) COPY =YSIZE-1,X CLEAR WORK AREA COPY =0,A COPY A,0(X,Y) JNED X,$-1 CONTINUE WITH ZERO LOOP COPY Q,X RESTORE X COPY X,ETCBA(Y) SAVE ETCB ADDRESS COPY ET:NUM(X),A STORE TERMINAL NUMBER (<10) CSK A,=9 * * JMP $+2 * IF > 9, MAKE A..F ADD ='A'-'0'+1,A * * ADD ='00',A MAKE ASCII COPY A,TVNUM+1(Y) DO IT COPY ET:UAT(X),X GET LUN PTR COPY:M 0(X),A,SALUN(Y) ADD ='I0'-'A0',A COPY A,SILUN(Y) ADD ='O0'-'I0',A COPY A,SOLUN(Y) ADD ='E0'-'O0',A COPY A,EFLUN(Y) COPY:M 1(X),A,SADIB(Y) COPY SADIB(Y),X COPY:M DI:NAM(X),A,TVNUM(Y) STORE TERMINAL NAME COPY =SAFBUF,A INITIALIZE ISM BUFFER ADDR PTR ADD Y,A SUB =1,A KLUDGE,COMBINED WITH BP SET TO 2 COPY A,USERBUFF(Y) STICK INTO ISM BLOCK * COPY =IWAL,X INITIALIZE IWAL BLOCK COPY =:F03E,A SEMAPHORE CHECK VALUE COPY A,WCHK(X,Y) STICK INTO SEMAPHORE BLOCK COPY Y,A ADD =IWAL+WSEM,A COPY A,WSEMPTR(X,Y) INIT IWAL SEMAPHORE PTR COPY:M =0,A,WUP(X,Y) CLEAR UPPER WORD OF WAIT TIME COPY:M =40,A,WLO(X,Y) SET FOR TEN SECONDS WAIT TIME COPY Y,WID(X,Y) SET TIMER ID TO UNIQUE Y-VALUE * IWAL = WENV,WID,WSEMPTR,WUP,WLO,WPER,WFLG,WSEM,WCHK JMP INIT1 LPOOL INIT1 EQU $ IOBINT SIFIOB,SILUN(Y),SIFBUF COPY:M =BUFLEN,A,IOINDEX(X,Y) IOBINT SOFIOB,SOLUN(Y),SOFBUF COPY:M =BUFLEN,A,IOINDEX(X,Y) IOBINT SAFIOB,SALUN(Y),SAFBUF IOBINT SAFIOB2,SALUN(Y),SAFBUF COPY:M =BUFLEN,A,IOINDEX(X,Y) IOBINT DIRIOB,SILUN(Y),WORKBLOK IOBINT OCPIOB,='OC',SAFBUF SHARE BUFFER WITH SAFIOB IOBINT BATCHIOB,='ZB',BATCHBUF IOBINT MSGIOB,SALUN(Y),WORKBLOK JMP INIT2 MTZCMD REL SHARABLE MTZCMD INIT2 EQU $ * OPEN SAFIOB OPEN THE TV JMP TVERROR JUMP IF ERROR WRITEMSG =MSGIOB,FA:,MULTMSG WRITE FIRST TITLE LINE JSK TVERROR JSK MTZ:JOB WRITE =OCPIOB,FA:,=10 TO OCP ALSO JSK TVERROR RSK DONE WITH INITIALIZATION TITL J O B MTZ:JOB EQU $ COPY TVNUM(Y),A CALCULATE SECOND TITLE LINE COPY TVNUM+1(Y),Q ADD =SAFIOB+IOBUF,Y COPY A,2(Y) COPY Q,3(Y) COPY:M =' ',A,0(Y) COPY:M ='--',A,1(Y)  COPY A,4(Y) COPY:M =CRLF:,A,5(Y) ADD =6,Y OFFSET 3rd AND 4th LINES R:GATD STARDATE(Y) COPY:M =:2007,A,0(Y) COPY:M STARDATE(Y),A,1(Y) YEAR COPY:M STARDATE+2(Y),A,4(Y) DAY COPY:M =CRLF:,A,5(Y) COPY:M =:2007,A,6(Y) COPY:M STARDATE+3(Y),A,7(Y) HOUR COPY:M STARDATE+5(Y),A,10(Y) SECOND COPY:M =:0A0A,A,11(Y) * BYTEMODE COPYBM ='/',A,4(Y) COPYB A,7(Y) COPYBM =':',A,16(Y) COPY A,19(Y) COPYBM STARDATE+2(Y),A,5(Y) MON1 COPYBM STARDATE+3(Y),A,6(Y) MON2 COPYBM STARDATE+8(Y),A,17(Y) MIN1 COPYBM STARDATE+9(Y),A,18(Y) MIN2 WORDMODE * SUB =SAFIOB+IOBUF+6,Y WRITE =SAFIOB,FA:,=36 WRITE 2ND, 3RD AND 4TH TITLE LINES JSK TVERROR  RSK MTZINIT REL TITL IOBINT ** * FUNCTION: INITIALIZE IOBS * * ENTRY: X=IOB DISPLACEMENT * A=LUN * Q=BUFFER * JSK IOBINT * * EXIT: A,Q UNDEFINED * SETS LUN,CRI,BUF * X=IOB * * NOTE: IOB IS FOLLOWED BY CFI * USE MACRO --> IOBINT IOB,LUN,BUFFER ** IOBINT EQU $ COPY A,IO:LUN(X,Y) SET LUN COPY Y,A ADD X,A ADD =SIFCFI-SIFIOB,A COPY A,IO:CRI(X,Y) SET CFI POINTER COPY Y,A ADD Q,A COPY A,IO:BUF(X,Y) SET BUFFER POINTER RSK END (Y),WORKBLOK JMP INIT2 MTZCMD REL SHARABLE MTZCMD INIT2 EQU $ * OPEN SAFIOB  OPEN THE TV JMP TVERROR JUMP IF ERROR WRITEMSG =MSGIOB,FA:,MULTMSG WRITE FIRST TITLE LINE JSK TVERROR JSK MTZ:JOB WRITE =OCPIOB,FA:,=10 TO OCP ALSO JSK TVERROR RSK DONE WITH INITIALIZATION TITL J O B MTZ:JOB EQU $ COPY TVNUM(Y),A CALCULA TITL The Multeze Falcon MTZCMD PROCESSOR - MTZCMD.ASM - 93471-12-A702 MACHINE :80 REV SET 'A502' REV SET 'A600' 6mar1981  CHW Updated to use F109 editor. REV SET 'A700' 02sep1981 CHW Updated to use F300 editor. REV SET 'A701' 02sep1981 VAW&CHW added VIEW BATCH REV SET 'A702' 24sep1981 CHW prevented editing .DIR or directory device. REV SET 'A703' 13oct1981 VAW added PRINT command MTZCMD REL SHARABLE MTZCMD NAM G:C NAM MTZCMD NAM MTZELOW NAM MTZTDB NAM BCTDB NAM ETCB EXTR MULTEZE EXTR MTZINIT EXTR EDITENT EXTR TVERROR EXTR SETEXT EXTR READTV EXTR E:ZBSEM EXTR E:BASEM EXTR E:SYSFLG EXTR DEBUG4  EXTR MTZ:JOB TITL MZ:XXXX - MULTEZE CONTROL BLOCK G:C EQU $ * * MULTEZE CONTROL BLOCK * THIS BLOCK MUST START AT :200 * CONTAINS LINKS TO IMPORTANT STUFF * JMP MULTEZE MZ:ENT - NORMAL MTZ ENTRY POINT JMP DEBUG4 MZ:DBG - DEBUG ENTRY POINT WORD ETCB MZ:ETCB - EDIT TERMINAL CONTROL BLOCKS WORD 0 MZ:CRTS - TOTAL CRT'S UP WORD 0 MZ:EHIGH - E:HIGH BEFORE MTZ STARTUP TITL MTZBGIN - MTZ TERMINAL ACTIVITY START * * ENTER: X=EDIT TERMINAL CONTROL BLOCK * K,L=STACK * MTZBGIN EQU $ * * ACTIVITY STARTS HERE WITH INTERRUPTS DISABLED FOR * ONE INSTRUCTION. MUST HOLD OFF INTERRUPTS UNTIL * MAP IS SET FOR NEW STACK. * SIN 5 COPY ET:NUM(X),A GET TERMINAL NUMBER COPY R:ACT,Y AND MY ACB COPY A,AC:MAP(Y) SET MAP NUMBER OUT A,LUSER: AND TELL MMU (LOAD USER NUMBER) SBIT UM:,S SET USER MODE JSK MTZINIT DO TERMINAL INITIALIZATION MTE1 EQU $ COPY ETCBA(Y),X TERMINAL CONTROL BLOCK ADDRESS COPY ET:MSGBF(X),X MESSAGE BUFFER ADDRESS JEQ X,MTE15 IF NO BUFFER ALLOCATED COPY 0(X),A 1st TWO CHARACTERS SUB =' ',A JLE A,MTE15 IF NO MESSAGE WAITING OR ONE BEING MOVED COPY X,Q FILENAME ADDRESS SUB =1,Q COPY =0,A 1st THING TO MOVE JSK MOVENAME COPY ETCBA(Y),X TERMINAL CONTROL BLOCK ADDRESS COPY ET:MSGBF(X),X MESSAGE BUFFER ADDRESS COPY =' ',A EXCH A,0(X) NO MORE MESSAGE WAITING COPY =DONEMSG-1,Q TBIT 7,A WAS JOB ABORTED?? JF OV,$+2 IF NOT COPY =ABORTMSG-1,Q COPY =1,A JSK MOVENAME  COPY:M =2,A,TEMPA(Y) SO VIEWOUT WILL PRINT PROPER # OF CHARACTERS JSK VIEWOUT MTE15 EQU $ WRITEMSG =MSGIOB,WP:,MTEPRMPT JSK TVERROR JSK READTV READ IN A COMMAND LINE JNE A,MTE1 E:ISM ISMBLOK(Y) GET COMMAND COPY DELIMITR(Y),A GET CONTROL CHARACTER CLSN ='/',A JMP $+3 CONTROL CHAR INDICATES A COMMAND COPY:M =2,A,CLPTR(Y) NOT SLASH, MUST BE COMMAND - RESET PTR * TO A 2 (BECAUSE BUFFER STARTS WITH 0000) JSK MTZCMD PARSE AND PROCESS COMMAND JMP MTE1 GET NEXT COMMAND * MTZTDB TDB: MTZBGIN,0,$-$,ET:STK,0,15 * * COMMAND LOOP * * MTZCMD EQU $ E:ISM ISMBLOK(Y) COPY =SYMBUFF,X ADD Y,X COPY NUMCHAR(Y),Q JLE Q,CMDRET NULL COMMAND IS A NO-OP COPY =MTECMDS,A JSK LOOKUP JNE A,MTE90 JSK 0(X) GO TO COMMAND PROCESSOR CMDRET EQU $ RSK * MTE90 EQU $ WRITEMSG =MSGIOB,FA:,MTEUN UNKNOWN COMMAND JSK TVERROR RSK GET NEXT COMMAND LPOOL TITL COMMANDS MTECMDS EQU $ WORD 8/2 BYTE 'EDIT ' WORD EDIT BYTE 'EZEDIT ' WORD EDIT BYTE 'SUBMIT ' WORD SUBMIT BYTE 'DO ' WORD SUBMIT BYTE 'DELETE ' WORD  DELET BYTE 'LOCAL ' WORD LOCAL BYTE 'VIEW ' WORD VIEW BYTE 'JOB ' WORD MTZ:JOB BYTE 'PRINT ' WORD PRINT WORD 0 TITL EDIT TERMINAL CONTROL BLOCKS ETCB EQU $ ETCB 1,STACK1 ETCB 2,STACK2 ETCB 3,STACK3 ETCB 4,STACK4 ETCB 5,STACK5 ETCB 6,STACK6 ETCB 7,STACK7 ETCB 8,STACK8 ETCB 9,STACK9 WORD 0 END OF TABLE * * EDIT TERMINAL STACKS & MESSAGE BUFFERS FROM BATCH QUEUE PROCESSOR * TERMINAL XMACRO STACK#(1) RES ET:STK BUFFR#(1) RES 7,' ' ENDM TERMINAL 1 TERMINAL 2 TERMINAL 3 TERMINAL 4 TERMINAL 5 TERMINAL 6 TERMINAL 7 TERMINAL 8 TERMINAL 9 TITL GO TO EDITOR ** * FUNCTION: CONNECT WITH EDITOR I/O INTERFACE * * ENTRY: JSK EDIT * * EXIT: RSK *** EDIT EQU $ COPY ABORTK(Y),A SEE IF EDIT IS IN PROGRESS. JNE A,EDIT1 NONZERO MEANS YES COPY K,A PREPARE FOR EDIT SUB =1,A RSK USES THIS WORD COPY A,ABORTK(Y) SET FOR TROUBLE JSK EDITENT COPY:M =0,A,ABORTK(Y) CLEAR EDIT AND ABORT FLAG JMP EDITEND EDIT1 EQU $ WRITEMSG =MSGIOB,FA:,EDITMSG JSK TVERROR EDITEND EQU $ RSK MORE COMMANDS  LPOOL EDITMSG MSG ' EDIT ALREADY RUNNING' TITL L O O K U P * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * THIS SUBROUTINE DOES AN INDEFINITE ABBREVIATION LOOKUP OF A * * CHARACTER STRING AGAINST A TABLE OF KEYWORDS. * * * * ENTRY: A=ADDRESS OF TABLE * * Q=NUMBER OF CHARACTERS IN COMMAND (Q>0) * X=ADDRESS OF CHARACTER STRING * * JSK LOOKUP * * * * EXIT: RSK * * A UNCHANGED IF NOT IN TABLE, =0 IF IN TABLE * X CONTENTS OF WORD IN TABLE ASSICIATED WITH STRING * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * LOOKUP EQU $ PUSH XA:V SAVE REGISTERS, SET XA JLE Q,LOOK4 INVALID? TOO SHORT COPY A,Y TABLE ADDRESS ==> Y COPY 0(Y),A LENGTH OF ENTRY INWORDS SHIFT A,LO,1 IN BYTES CSK A,Q JMP LOOK4 INPUT STRING TOO LONG, ISN'T IN TABLE JMP LOOK2 ) GO DO JMP LOOK2 ) LOOKUP LOOK1 EQU $ GET NEXT TABLE ENTRY WORDMODE COPY Y,Q CURRENT TABLE ADDRESS ==;> Q COPY K,Y ADDRESS OF SAVED REGISTERS ==> Y ADD *LAST:A(Y),Q UPDATE CURRENT TAGBLE ADD*RESS (ALMOST) COPY LAST:Q(Y),Y NUMBER OF CHARACTERS ==> Y EXCH Q,Y # CHARS ==> Q; TABLE ADDRESS-1 ==> Y LOOK2 EQU $ FIRST TIME ENTRY TO LOOP COPY 1(Y),A FIRST WORD OF NEXT ENTRY (TEXT) JEQ A,LOOK4 IF ALL DONE, NOT FOUND SUB =1,Q TO BE USED AS "INDEX" ADD =1,Y BUMP TO 1ST WORD OF TEXT BYTEMODE LOOK3 EQU $ COMAPRE CHARACTERS LOOP EXCH X,Y STRING ==> Y; CURRENT TABLE ==> X XNX Q COPYB 0(Y),A PICK UP BYTE FROM STRING EXCH X,Y CURRENT TABLE ==> Y; STRING ==> X XNX Q SUBB 0(Y),A BYTE FROM TABLE JNE A,LOOK1 IF NO MATCH, GET NEXT TABLE ENTRY JNED Q,LOOK3 KEEP LOOKING UNTIL ALL CHAECKED * * NAMES MATCH, GET VALUE AND RETURN COPY Y,X CURRENT TABLE ==> X COPY K,Y BASE OF SAVED REGISTERS WORDMODE MAKE SURE WE ARE IN WORD MODE ADD *LAST:A(Y),X COPY 0(X),X COPY X,LAST:X(Y) COPY A,LAST:A(Y) CLEAR A FOR GOOD FINE LOOK4 EQU $ POP RESTORE REGISTERS RSK R E T U R N LPOOL TITL BATCH CONTROL TASK BCTDB TDB: BCENT,0,BCSTK,50,0,1 BCSTK RES 50,0 STACK BCTICK TICK: 0,BCSEMA4,240 2 SECOND TICK CLOCK BCSEMA4 SDB: 0 CLOCK SEMAPHORE BCENT EQU $ TASK ENTRY POINT SIN 8 COPY E:SYSFLG,A GET SYSTEM FLAG WORD AND =SF:BATCH,A IS BATCH RUNNING? JEQ A,BC10 NO, IGNORE SENSE SWITCH JT SS,BC10 IF SENSE SW ON, LEAVE BATCH RUNNING XOR E:SYSFLG,A TURNOFF BATCH PROCESSING COPY A, E:SYSFLG R:SIG *E:BASEM SIGNAL SEMA4 * BC10 EQU $ R:ITIC BCTICK START 2 SECOND TIMER R:WAIT BCSEMA4 WAIT JMP BCENT LPOOL TITL COMMAND PROCESSOR MESSAGES MTEUN MSG ' ILLEGAL MULTEZE COMMAND' MTEPRMPT MSG ' ' MTEMORE MSG ' MTE..' TITL EDITOR I/O INTERFACE MESSAGES NAM SIGNON NAM CMDMORE NAM OPTMSG NAM NORMAL NAM RENMSG SIGNON WORD SIGNEND-$-1*2 BYTE ' The Multeze Falcon (' DOUBLE REV IFT REV<='A700' IFT REV>='A600' BYTE ') Assembled(' ASMDATE BYTE ') Linked(' LINKDATE ENDC ENDC BYTE ')' SIGNEND EQU $ CMDMORE MSG ' EZE..' OPTMSG MSG ' COMMAND FILE IGNORED' NORMAL MSG ' NORMAL TERMINATION' RENMSG MSG ' FILE RENAME ERROR' TITL OPERATOR COMMUNICATION PROMPTS * THESE ARE THE VARIOUS PROMPTS USED BY THE EDITOR AND ARE *  OUTPUT VIA A CALL TO O:PROMPT WITH THE PROMPT ADDRESS IN A * AND THE LUN IN Q NAM CMDPROMT NAM FINPROMT NAM SUBPROMT  NAM DSSPROMT NAM INSPROMT NAM INPPROMT NAM LISPROMT CMDPROMT BYTE :0A,'',:1D FINPROMT BYTE :0A,'' RES 40,'..' SUBPROMT BYTE :0A,'' RES 40,'..' DSSPROMT BYTE :0A,'>',:1D INSPROMT BYTE :0A,'>',:1D INPPROMT BYTE :0A,'>',:1D LISPROMT BYTE :0A,'',:1D DONEMSG BYTE 'JOB COMPLETED',7 ABORTMSG BYTE 7,'JOB ABORTED',7,7 TITL LOCAL DIRECTORY ** * FUNCTION: SETS THE LOCAL "EF" TO THE DIRECTORY SPECIFIED * * ENTRY: JSK LOCAL * * EXIT: RSK * USES LUN I1 + TERMINAL NUMBER AS A SCRATCH LUN * * LOCAL EQU $ E:GFN WORKBLOK(Y),EFLUN(Y),SILUN(Y) GET NEW DIRECTORY NAME CLSN A,=3 IS IT DIRECTORY? JMP LOCAL1 YES, IT'S OK WRITEMSG =MSGIOB,FA:,LOCALINV JSK TVERROR JMP LOCALEND LOCAL1 EQU $ COPY:M EFLUN(Y),A,LUN:+WORKBLOK(Y) FOR CONNECT F:CONN WORKBLOK(Y) JGT A,LOCALEND IF CONNECT GOOD WRITEMSG =MSGIOB,FA:,LOCALBAD JSK TVERROR LOCALEND EQU $ RSK LPOOL TITL DELETE ** * FUNCTION: DELETES THE SPECIFIED FILES * * ENTRY: JSK DELET * * EXIT: RSK * * DELET EQU $ E:GFN WORKBLOK(Y),EFLUN(Y),SILUN(Y) GET FILE NAME JEQ A,DELET1 IF OK WRITEMSG =MSGIOB,FA:,DELETINV JSK TVERROR JMP DELETEND DELET1 EQU $ COPY DELIMITR(Y),A CLSN A,=',' JMP DELET2 IF DELIMITER LOOKS GOOD CLSN A,='+' JMP DELET2 DITTO JNE A,DELET3 IF NOT END OF LINE DELET2 EQU $ COPY 1+NAMEXT+WORKBLOK(Y),A SUB ='IR',A JNE A,DELET25 NOT A DIRECTORY COPY NAMEXT+WORKBLOK(Y),A CLSN A,='D' JMP DELET4 DELET25 EQU $ F:DELE WORKBLOK(Y) JGT A,DELETEND IF DELETE GOOD WRITEMSG =MSGIOB,FA:,DELETBAD JSK TVERROR DELETEND EQU $ COPY DELIMITR(Y),A CLSN A,=',' JMP DELET IF MORE TO DO CLSN A,='+' JMP DELET DITTO RSK DELET3 EQU $ WRITEMSG =MSGIOB,FA:,DELETUNK JSK TVERROR RSK DELET4 EQU $ WRITEMSG =MSGIOB,FA:,DELETDIR JSK TVERROR RSK TITL SUBMIT ** * FUNCTION: PROCESS THE SUBMIT COMMAND * * ENTRY: JSK SUBMIT * * EXIT: RSK * NOTE: ALL REGISTERS PRESERVED * /SUBMIT FILENAME ** SUBMIT EQU $ PUSH XA:V SUBAGAIN EQU $ E:GFN WORKBLOK(Y),EFLUN(Y),SILUN(Y) JNE A,SUBINV COPY WORKBLOK+NAMPT:(Y),A JNE A,SUB1  FILENAME IS OK SUBINV EQU $ WRITEMSG =MSGIOB,FA:,INVALID JSK TVERROR JMP SUBEND LPOOL SUBINV2 EQU $ WRITEMSG =MSGIOB,FA:,NOFMSG JSK TVERROR JMP SUBEND SUB1 EQU $ SETEXT ='J',='CL',=WORKBLOK TRY .JCL SUB2 EQU $ COPY:M SILUN(Y),A,LUN:+WORKBLOK(Y) F:CONN WORKBLOK(Y) JLE A,SUBINV2 IF BAD CONNECT R:WAIT *E:ZBSEM WAIT FOR ENTRY TO BATCH FILE OPEN BATCHIOB OPEN THE FILE JMP  SUBERR WRITE =BATCHIOB,FS:,=BQBLOK:L*2 WRITE THE FILENAME ETC. JMP SUBERR COPY:M =0,A,IOBLEN(X,Y) COPY A,IOBLEN+1(X,Y) ZERO CFI READ =BATCHIOB,DS:,=12 READ CONTROL RECORD TO UPDATE JOB COUNT JMP SUBERR COPY WORKBLOK+BQNUM:(Y),A GET NUMBER OF JOBS ADD =1,A INCLUDE THIS JOB COPY A,WORKBLOK+BQNUM:(Y) RECORD ON FILE COPY:M =0,A,IOBLEN(X,Y) COPY A,IOBLEN+1(X,Y) WRITE =BATCHIOB,DS:,=12 JMP SUBERR CLOSE BATCHIOB JMP SUBERR R:SIG *E:BASEM SIGNAL USAGE R:SIG *E:ZBSEM SIGNAL INTERLOCK COPY DELIMITR(Y),A ANY MORE FILES TO SUBMIT? JEQ A,SUBEND SUB =CR:,A HOW ABOUT A CARRIAGE RETURN? JEQ A,SUBEND COPY:M =0,A,WORKBLOK+VOLPT:(Y) CLEAR OUT VOLUME POINTER JMP SUBAGAIN MORE FILES, DO IT!!!! SUBEND EQU $ JSK VEWBATCH COPY:M =0,A,WORKBLOK+VOLPT:(Y) CLEAR OUT VOLUME POINTER POP RSK LPOOL SUBERR EQU $ WRITEMSG =MSGIOB,FA:,SUBSUB JSK TVERROR R:SIG *E:ZBSEM SIGNAL INTERLOCK JMP SUBEND LPOOL TITL VIEW * * FUNCTION: VIEW A DIRECTORY IN N(AMEONLY) FORMAT * * ENTRY: JSK VIEW * * EXIT: RSK * VIEW EQU $  PUSH XA:V E:GFN WORKBLOK(Y),EFLUN(Y),SILUN(Y) CLSN A,=3 WAS IT A DIRECTORY ? JMP VIEW0 YEP CLSN A,=1 HOW ABOUT DEFAULTING TO CURRENT LOCAL DIRECTORY ? JMP VIEW0 THAT'S IT ! JMP VIEW9 REALLY BAD VIEW0 COPY:M =0,A,TEMPA(Y) RESET LINE ITEM COUNT COPY:M SILUN(Y),A,WORKBLOK+LUN:(Y) SUPPLY LUN FOR CONNECT COPY WORKBLOK+NAMPT:(Y),A IS THERE A NAME? JNE A,VIEW05 IF YES, DO CONNECT COPY WORKBLOK+FNO:(Y),A HOW ABOUT A FILE? JNE A,$+2 IF REAL FILE HERE COPY =1,A USE ROOT DIRECTORY COPY A,WORKBLOK+NAMPT:(Y) F:CFNO WORKBLOK(Y) DO CONNECT JMP VIEW07 CONTINUE VIEW05 F:CONN WORKBLOK(Y) DO CONNECT VIEW07 SUB =1,A JLE A,VIEW91J OPEN SIFIOB OPEN DIRECTORY JMP VIEW91 COPY =SIFIOB,X OFFSET FOR INPUT IOB COPY:M =0,A,SIFCFI-SIFIOB(X,Y) * SET CFI TO COPY A,SIFCFI+1-SIFIOB(X,Y) * START OF DIRECTORY VIEW1 READ =SIFIOB,FS:,=16 GET NEXT DIRECTORY ENTRY VIEW91J JMP VIEW91 COPY =SIFBUF,X OFFSET OF BUFFER COPY 1(X,Y),A IS THIS LOGICAL END OF DIRECTORY ? JEQ A,VIEW8 YEP, GET OUT SHIFT A,RO,8 CLSN ='.',A IS IT A DIRECTORY? JMP VIEW1 YES, IGNORE IT COPY 0(X,Y),A IS THIS ENTRY DELETED ? JEQ A,VIEW1 IF SO, IGNORE IT COPY TEMPA(Y),A GET NUMBER OF FN'S ON THIS LINE CLSN A,=5 5 IS ENOUGH JSK VIEWOUT PRINT THE LINE COPY =SIFBUF,Q MOVE FILENAME TO OUTPUT BUFFER ADD Y,Q DO SETUP FOR MOVE JSK MOVENAME IMS TEMPA(Y) BUMP COUNT OF LINE ITEMS JMP VIEW1 GO GET NEXT FILENAME LPOOL VIEW8 JSK VIEWOUT FINISH LINE CLOSE SIFIOB JMP VIEW91 VIEW81 POP RSK VIEW9 EQU $ COPY WORKBLOK+NAMPT:(Y),X JEQ X,VIEW901 COPY 0(X),A SUB ='BA',A JNE A,VIEW901 COPY 1(X),A SUB ='TC',A JNE A,VIEW901 COPY 2(X),A SUB ='H ',A JNE A,VIEW901 JSK VEWBATCH JMP VIEW81 VIEW901 EQU $ WRITEMSG =MSGIOB,FA:,VDIRONLY JSK TVERROR JMP VIEW81 VIEW91 WRITEMSG =MSGIOB,FA:,VFILEERR JSK TVERROR JMP VIEW8 VIEWOUT COPY TEMPA(Y),A GET COUNT OF ITEMS JEQ A,VIEWOUT1 NUTHIN' TO DO SHIFT A,LO,4 NUMBER OF BYTES WRITE =SAFIOB,FA:,A PRINT LINE JSK TVERROR COPY:M =0,A,TEMPA(Y) RESET COUNT OF LINE ITEMS VIEWOUT1 RSK MOVENAME EQU $ COPY =7,X SHIFT A,LO,3 ADD =SAFBUF,A ADD A,Y COPY Q,0(Y) VIEW2 COPY *0(X,Y),Q ACTUAL MOVE LOOP SBIT CY:,S WHILE MOVING, REPLACE BLANKS WITH LEADER DOTS VIEW21 ROTATE Q,L,8 CLSN Q,=' ' ADD ='.'-' ',Q JT CY,VIEW21 DO IT TWICE COPY Q,0(X,Y) PUT I T BACK JNED X,VIEW2 COPY =' ',Q PUT IN TWO BLANKS BETWEEN FILENAMES EXCH Q,0(Y) AND RESTORE SOURCE ADDRESS SUB A,Y RSK LPOOL TITL VIEW BATCH VEWBATCH EQU $ R:WAIT *E:ZBSEM WAIT FOR ENTRY TO BATCH FILE OPEN BATCHIOB OPEN THE FILE JMP VIEWBERR COPY =BATCHIOB,X COPY:M =0,A,IOBLEN(X,Y) COPY A,IOBLEN+1(X,Y) ZERO CFI READ =BATCHIOB,DS:,=16 READ CONTROL RECORD TO GET # OF JOBS AND POS OF 1ST JMP VIEWBERR COPY:M BQPTR:+WORKBLOK(Y),A,IOBLEN(X,Y) COPY:M BQPTR:+1+WORKBLOK(Y),A,IOBLEN+1(X,Y) COPY:M =' ',A,1+BQNUM:+WORKBLOK(Y) EXCH WORKBLOK+BQNUM:(Y),A GET NUMBER OF JOBS COMP A,A COPY A,TEMPB(Y) COPY =WORKBLOK-1,Q ADD Y,Q COPY =0,A JSK MOVENAME COPY:M =1,A,TEMPA(Y) IMS TEMPB(Y) JMP VIEWB1 JMP VIEWB2 VIEWB1 EQU $ READ =BATCHIOB,FS:,=BQBLOK:L*2 READ NEXT ENTRY JMP VIEWBERR COPY LUN:+WORKBLOK(Y),Q ADD ='v '-'I ',Q SETEXT ='t',Q,=WORKBLOK COPY TEMPA(Y),A NUMBER OF FN'S ON THIS LINE CLSN A,=5 JSK VIEWOUT COPY =NAMBEG+WORKBLOK-1,Q ADD Y,Q JSK MOVENAME IMS TEMPA(Y) BUMP COUNT OF FN'S IMS TEMPB(Y) ARE WE DONE? JMP VIEWB1 NO!! VIEWB2 EQU $ JSK VIEWOUT PRINT LAST LINE CLOSE BATCHIOB JMP VIEWBERR VIEWB3 EQU $ COPY:M =0,A,WORKBLOK+VOLPT:(Y) CLEAR OUT VOLUME POINTER R:SIG *E:ZBSEM SIGNAL INTERLOCK RSK VIEWBERR EQU $ WRITEMSG =MSGIOB,FA:,VIEWBXX JSK TVERROR JMP VIEWB3 LPOOL TITL PRINT PRINT EQU $ E:GFN WORKBLOK(Y),EFLUN(Y),SILUN(Y) GET FILE NAME  JEQ A,PRINT1 WRITEMSG =MSGIOB,FA:,PRINTINV JSK TVERROR JMP PRINTEND PRINT1 EQU $ COPY =1,A ONE COPY OF FILE E:PRINT WORKBLOK(Y) PRINT FILE JEQ X,PRINTEND WRITEMSG =MSGIOB,FA:,PRINTBAD JSK TVERROR PRINTEND EQU $ COPY DELIMITR(Y),A CLSN A,=',' JMP PRINT CLSN A,='+' JMP PRINT RSK LPOOL TITL MESSAGES SUBSUB MSG ' SUBMIT - PROCESSING ERROR!' NOFMSG MSG ' SUBMIT - CANNOT FIND FILE!' INVALID MSG ' SUBMIT - INVALID SYNTAX!' LOCALBAD MSG ' LOCAL - CONNECT FAILED!' LOCALINV MSG ' LOCAL - MUST BE A DIRECTORY' DELETINV MSG ' DELETE - BAD FILE NAME' DELETBAD MSG ' DELETE - CANNOT FIND FILE' DELETUNK MSG ' DELETE - BAD FILE NAME TERMINATOR' DELETDIR MSG ' DELETE - CAN''T DELETE DIRECTORIES!' VDIRONLY MSG ' VIEW - ONLY A DIRECTORY OR "BATCH" MAY BE SPECIFIED' VFILEERR MSG ' VIEW - ERROR IN DIRECTORY I/O OPERATION' VIEWBXX MSG ' VIEW BATCH - I/O ERROR IN BATCH::.SYQ' PRINTINV MSG ' PRINT - BAD FILE NAME' PRINTBAD MSG ' PRINT - CAN''T FIND FILE' MTZELOW REL SHARABLE MTZELOW MTZELOW RES 1 END - MUST BE A DIRECTORY' DELETINV MSG ' DELETE - BAD FILE NAME' DELETBAD MSG ' DELETE - CANNOT FIND FILE' DELETUNK MSG ' DELETE - BAD FILE NAME TERMINATOR' DELETDIR MSG ' DELETE - CAN''T DELETE DIRECTORIES!' VDIRONLY MSG ' VIEW - ONLY A DIRECTORY OR "BATCH" MAY BE SPECIFIED' VFILEERR MSG ' VIEW - ERROR IN DIRECTORY I/O OPERATION' VIEWBXX MSG ' VIEW BATCH - I/O ERROR IN BATCH::.SYQ' PRINTINV MSG '  TITL The Multeze Falcon INITIALIZATION - MTZINIT.ASM - 93471-11-A702 MACHINE :80 MTZINIT REL SHARABLE MTZINIT NAM G:M NAM MULTEZE NAM MTZINIT NAM MTZ:JOB EXTR MTZELOW EXTR MTZEDIT EXTR MTZIOEND EXTR ETCB EXTR BCTDB EXTR OE:YSIZE EXTR MTZTDB EXTR TVERROR EXTR E:MONE EXTR E:HIGH EXTR E:LOW EXTR E:SYSFLG EXTR CONNZB EXTR R:HIGH G:M EQU $ MULTEZE EQU $ E:MSG MULTMSG FMT A SUB =:23,A CHECK FOR 4/95 CPU JEQ A,MACHOK E:MSG MACHMSG JMP ALLDONE * * * INSURE MULTEZE NOT ALREADY RUNNING * MA CHOK EQU $ COPY E:SYSFLG,A GET SYSTEM FLAG WORD AND =SF:MULTD,A CLEAR MULTEZE BIT JEQ A,MULTOK JUMP IF NOT RUNNING E:MSG RUNNGMSG JMP ALLDONE * MULTOK EQU $ COPY E:LOW,A MUST BE LOADED AT :200 SUB =:200,A JEQ A,LOADOK GO IF LOADED OK E:MSG BADLOAD JMP ALLDONE LOADOK EQU $ SIN 2 COPY E:SYSFLG,A GET SYSTEM FLAG WORD OR =SF:MULTD,A SET MULTEZE RUNNING FLAG COPY A,E:SYSFLG JSK TVCONN CONNECT THE EDIT TERMINALS JEQ A,ALLDONE GO IF NO EDIT TVS * * ALLOCATE LOGICAL MEMORY * COPY E:HIGH,A SAVE OLD E:HIGH COPY A,MZ:EHIGH COPY =YSIZE,Q I/O WORK AREA SIZE COPY =0,A MUL MZ:CRTS,AQ X NUMBER OF TERMINALS SUB E:HIGH,Q ALLOCATE FROM TOP OF FREE SPACE NEG Q,Q COPY Q,E:HIGH SET NEW E:HIGH COPY Q,K AND NEW STACK * COPY =MTZELOW,A SET NEW E:LOW TO JUST PAST IFT MTZDEBUG ******************** COPY =MTZIOEND,A DEBUG MODE ******************** ENDC ADD =1,A COPY A,E:LOW THE END OF MTZCMD * COPY =MTZIOEND,A END OF EDITOR ADD =1,A JUST PAST IT ADD =:3FF,A ROUND UP TO NEXT PAGE AND =:FC00,A COPY A,EDWRK START OF EDITOR WORK AREA ADD OE:YSIZE,A ALLOCATE WORK AREA COPY A,EDBFL BOTTOM OF EDIT BUFFER * COPY =MTZEDIT,A START OF EDITOR SHIFT A,R,10 CONVERT TO PAGE NUMBER COPY A,EDLOW LOW EDITOR PAGE NUMBER COPY =MTZIOEND,A END OF EDITOR SHIFT A,R,10 CONVERT TO PAGE NUMBER COPY A,EDHIGH HIGH EDITOR PAGE NUMBER * * CONNECT THE BATCH QUEUE FILE TO LUN 'ZB' * JSK CONNZB INITIALIZE BATCH QUEUE * * INITIALIZE MAP, ALLOCATE MEMORY * JSK MAPINIT COPY TPAGES,A GET TOTAL PHYSICAL PAGES SUB =128,A MUST BE AT LEAST THIS MUCH JGE A,MEMOK GO IF ENOUGH E:MSG MEMERR REPORT INSUFFICIENT MEMORY JMP ALLDONE AND EXIT MEMOK EQU $ * * START EDIT ACTIVITIES * JSK STARTEDT * * START UP THE BATCH PROCESSOR * SIN 3 COPY E:SYSFLG,A GET SYSTEM FLAG WORD OR =SF:BATCH,A SET BATCH MODE FLAG COPY A,E:SYSFLG RESTORE FLAG WORD R:BGIN BC START BATCH CONTROL TASK * ALLDONE EQU $ E:MON EXIT AND START BATCH PROCESSOR BC BGIN: BCTDB,:7000 EDWRK WORD 0 EDITOR WORK AREA ADDRESS EDBFL WORD 0 LOW EDIT BUFFER ADDRESS EDLOW WORD 0 LOW PAGE OF EDITOR EDHIGH WORD 0 HIGH PAGE OF EDITOR LPOOL MULTMSG MSG ' The Multeze Falcon (A702)' MACHMSG MSG ' 4/95 CPU WITH MMU REQUIRED TO RUN THIS SYSTEM' RUNNGMSG MSG ' MULTEZE ALREADY RUNNING' BADLOAD MSG ' MUST LOAD AT :200' MEMERR MSG ' MUST HAVE A MINIMUM OF 128K WORDS OF MEMORY' TITL TVCONN - CONNECT EDIT TERMINALS * TVCONN EQU $ COPY =ETCB,Y EDIT TCB LIST COPY:M =0,A,MZ:CRTS ZERO TOTAL ACTIVE TERMINALS * CT10 EQU $ COPY:M =0,A,ET:STAT(Y) CLEAR STATUS COPY ET:NUM(Y),A TV NUMBER CSK A,=10 * * JMP $+2 * IF > 9, MAKE A..F ADD ='A'-'0'+1,A * * ADD ='A0',A CONVERT TO LUN COPY A,TVLUN E:SLU TVLUN CONNECT TO LUN JNE A,CT30 NO LUN FOR TV COPY X,ET:UAT(Y) SAVE UAT ADDRESS IN ETCB JEQ X,CT30 NOTHING ASSIGNED TO IT SO IGNORE IT COPY 1(X),X  GET DIB ADDRESS COPY DI:FLG(X),A SEE IF IT IS A DIB JLT A,CT30 NO, MUST BE A FCB, SO IGNORE IT COPY DI:NAM(X),A WHAT IS IT ATTACHED TO? SHIFT A,RO,8 CLSN A,='T' A TVxx? JMP $+2 YES JMP CT30 NO, IGNORE IT COPY 1+DI:NAM(X),A WHICH TV (OR TY) IS IT ATTACHED TO? SUB ='00',A JEQ A,CT30 IF TV00; IT'S NOT AN EDIT TERMINAL COPY:M =1%ETS:UP,A,ET:STAT(Y) SET TV "UP" IMS MZ:CRTS BUMP TOTAL TERMINALS * CT30 EQU $ ADD =ET:SIZE,Y NEXT ETCB ENTRY COPY 0(Y),A END OF TABLE? JNE A,CT10 NO, CON TINUE COPY MZ:CRTS,A GET TOTAL TERMINALS JEQ A,CT40 GO IF NONE CONNECTED RSK * CT40 EQU $ E:MSG CTMSG ERROR COPY =0,A RSK TVLUN WORD 0 CTMSG MSG ' NO EDIT TERMINALS IN SYSTEM' LPOOL TITL MAPINIT - INITIALIZE MAP AND CACHE MAPINIT EQU $ COPY =16*64-1,Y TOTAL LOGICAL PAGES * MAP04 EQU $ SET ALL MAPS EQUAL TO MAP 0 COPY Y,Q LOGICAL PAGE NUMBER COPY Y,A AND =:3F,A PHYSICAL IS MOD 64 JSK SETMAP SET THIS PAGE JNED Y,MAP04 CONTINUE UNTIL DONE * COPY =1024,Y CLEAR THE CACHE COPY 0(Y),A BY READING 1024 JNED Y,$-1 CONSECUTIVE LOCATIONS * COPY =0,A OUT A,LUSER: SET USER NUMBER TO 0 SBIT MMUT:,A ENABLE TRANSLATION SBIT MMUC:,A AND CACHE OUT A,MCTL: SEND TO MMU * * DETERMINE THE NUMBER OF PHYSICAL PAGES INSTALLED * COPY:M UMTA:+2,A,TRAPSAVE SAVE THE OLD UMT COPY:M UMTA:+3,A,TRAPSAVE+1 COPY:M MEMTRAP,A,UMTA:+2 SET UP NEW CONTENTS COPY:M MEMTRAP+1,A,UMTA:+3 * COPY EDWRK,A EDITOR WORK AREA SHIFT A,R,10 CONVERT TO PAGE NUMBER COPY A,LPAGE USE AS LOW PAGE NUMBER COPY =:8000,X ADDRESS OF WINDOW PAGE COPY X,Q SHIFT Q,R,10 CONVERT TO PAGE NUMBER * MAP10 EQU $ COPY TPAGES,A TOTAL PHYSICAL PAGES JSK SETMAP SET WINDOW COPY A,0(X) COPY A,1(X) IF NO TRAP, GOOD PAGE IMS TPAGES OK, CONTINUE JMP MAP10 * TRAP EQU $ ENTER HERE IF MEMORY TRAP COPY Q,A JSK SETMAP RESORE WINDOW COPY:M TRAPSAVE,A,UMTA:+2 RESTORE UMT COPY:M TRAPSAVE+1,A,UMTA:+3 * * ALLOCATE NEW PHYSICAL PAGES TO REPLACE EDITOR * IN MAP 0 * IFT MTZDEBUG ******************** JMP MAP16 IF DEBUG SKIP THIS ******************** ENDC COPY EDHIGH,A SUB EDLOW,A ADD =1,A TOTAL NUMBER OF EDITOR PAGES COPY A,X USE AS COUNT NEG A,A * * ADD TPAGES,A * TAKE EDITOR OUT OF AVALIABLE PAGES COPY A,TPAGES * * COPY EDLOW,Q LOW EDITOR PAGE NUMBER * NEXTPG EQU $ COPY CPAGE,A NEXT PHYSICAL PAGE TO USE IMS CPAGE JSK SETMAP SET NEW PAGE TO OVERLAY EDITOR ADD =1,Q NEXT LOGICAL PAGE SUB =1,X JNE X,NEXTPG CONTINUE FOR ALL EDITOR PAGES * * COMPUTE MAXIMUM EDIT BUFFER SIZE * MAP16 EQU $ COPY E:HIGH,A HIGH ADDRESS SHIFT A,RO,10 CONVERT TO PAGE NUMBER  SUB LPAGE,A MAX PAGES PER EDIT BUFFER COPY A,MPAGES SAVE IT * * COMPUTE SIZE OF EDIT BUFFERS * COPY =0,A COPY TPAGES,Q TOTAL PHYSICAL PAGES SUB =64,Q AVAILABLE FOR EDIT BUFFERS DIV MZ:CRTS,AQ DIVIDED BY TOTAL TERMINALS ACTIVE CSK Q,MPAGES COMPARE WITH MAXIMUM ALLOWED JMP MAP20 SMALLER, OK NOP COPY MPAGES,Q TOO BIG, SET TO MAXIMUM COPY =0,A CLEAR REMAINDER * MAP20 EQU $ COPY A,RPAGES SAVE ODD PAGES COPY Q,BPAGES SAVE PAGES PER EDIT BUFFER * * SCAN EDIT TERMINAL CONTROL BLOCKS, ASSIGN * EDIT BUFFER ADDRESSES AND SET MAP * COPY =ETCB,Y CONTROL BLOCK TABLE * MAP30 EQU $ COPY ET:STAT(Y),A GET TERMINAL STATUS TBIT ETS:UP,A TEST IF ACTIVE JF OV,MAP50 NO, SKIP THIS ONE COPY EDWRK,A GET WORK AREA ADDRESS COPY A,ET:EDWRK(Y) SET ETCB COPY EDBFL,A GET EDIT BUFFER ADDRESS COPY A,ET:EDBFL(Y) SET ETCB COPY BPAGES,A GET PAGES PER EDIT BUFFER COPY RPAGES,Q ANY ODD PAGES? JEQ Q,MAP34 NO ADD =1,A YES, GIVE AN EXTRA TO THIS BUFFER SUB =1,Q DECREMENT ODD PAGE COUNT COPY Q,RPAGES * MAP34 EQU $ COPY ET:NUM(Y),Q GET TERMINAL NUMBER SHIFT Q,L,6 CONVERT TO LOGICAL PAGE ADD LPAGE,Q BUFFER BASE OFFSET * MAP40 EQU $ A=PAGES FOR THIS BUFFER EXCH A,CPAGE NEXT PHYSICAL TO ALLOCATE JSK SETMAP ASSIGN IN MAP ADD =1,A NEXT PAGE EXCH CPAGE,A RESTORE A ADD =1,Q N EXT LOGICAL PAGE IN BUFFER SUB =1,A DECREMENT PAGE COUNT JNE A,MAP40 CONTINUE UNTIL DONE * SUB =1,Q HIGH BUFFER PAGE AND =:3F,Q MOD 64 SHIFT Q,L,10 CONVERT TO ADDRESS OR =:3FF,Q TOP OF PAGE COPY Q,ET:EDBFH(Y) SAVE HIGH BUFFER ADDRESS * MAP50 EQU $ ADD =ET:SIZE,Y NEXT TERMINAL BLOCK COPY 0(Y),A END OF TABLE? JNE A,MAP30 NO, CONTINUE RSK * LPAGE WORD 0 LOW EDIT BUFFER PAGE NUMBER MPAGES WORD 0 MAX NUMBER OF EDIT BUFFER PAGES BPAGES WORD 0 ALLOCATED PAGES PER BUFFER RPAGES WORD 0 REMAINDER ODD PAGES TPAGES WORD 64 TOTAL PHYSICAL PAGES CPAGE WORD 64 CURRENT PHYSICAL PAGE TO ALLOCATE LPOOL MEMTRAP JST *$+1 MEMORY TRAP CONTENTS WORD GOTTRAP TRAPSAVE RES 2,0 GOTTRAP ENT JMP TRAP TITL SETMAP - SET PAGE IN TRANSLATION TABLE * * SETMAP - SUBROUTINE TO SET UP A PAGE * IN THE MMU TRANSLATION TABLE * * ENTER: A=PHYSICAL PAGE NUMBER * Q=LOGICAL PAGE NUMBER * SETMAP EQU $ PUSH XA:V OR =:3000,A ALLOW READ/WRITE/EXECUTE ACCESS ADD =:FC00,Q ADD BASE OF XLATE TABLE COPY Q,X X=XLATE TABLE ENTRY ADDRESS SIN 6 NO INTERRUPTS! IN MCTL:,Q GET MMU CONTROL REGISTER SBIT MMUA:,Q ENABLE XLATE TABLE ACCESS OUT Q,MCTL: COPY A,0(X) SET TABLE ENTRY RBIT MMUA:,Q DISABLE XLATE TABLE ACCESS OUT Q,MCTL: POP RSK LPOOL TITL STARTEDT - INITIATE EDIT ACTIVITIES STARTEDT EQU $ COPY E:HIGH,Q ADD =1,Q LOW ADDRESS OF WORK AREA COPY =ETCB,X TERM CONTROL BLOCK LIST * ST10 EQU $ COPY ET:STAT(X),A IS TERMINAL UP? TBIT ETS:UP,A JF OV,ST20 NO, SKIP IT COPY Q,ET:IOWRK(X) I/O INTERFACE WORK AREA COPY ET:EDSTK(X),Y GET STACK ADDRESS COPY Q,0(Y) SAVE I/O WORK AREA ADDRESS AT 0(L) COPY Y,A A=STACK ADDRESS COPY =MTZTDB,Y GET TDB ADDRESS COPY A,TD:AD(Y) STUFF IN STACK ADDRESS ADD =YSIZE,Q Q=NEXT I/O WORK AREA R:BGIN TVBGIN START ACTIVITY * ST20 EQU $ ADD =ET:SIZE,X NEXT ETCB COPY 0(X),A END OF LIST? IFT MTZDEBUG ******************** JMP $+2 IF DEBUG, ONLY ONE TERMINAL ******************** ENDC JNE A,ST10 NO, CONTINUE RSK YES, EXIT * TVBGIN BGIN: MTZTDB,ET:PRI TITL MTZINIT - EDIT TERMINAL INITIALIZATION ** * FUNCTION: INITIALIZE MULTEZE DATA REGION * * ENTRY: JSK MTZINIT * * EXIT: RSK * * X= EDIT TERNIMAL CONTROL BLOCK * K,L= STACK ** MTZINIT EQU $ COPY ET:IOWRK(X),Y GET WORK AREA COPY X,Q SAVE X (ETCB ADDRESS) COPY =YSIZE-1,X CLEAR WORK AREA COPY =0,A COPY A,0(X,Y) JNED X,$-1 CONTINUE WITH ZERO LOOP COPY Q,X RESTORE X COPY X,ETCBA(Y) SAVE ETCB ADDRESS COPY ET:NUM(X),A STORE TERMINAL NUMBER (<10) CSK A,=9 * * JMP $+2 * IF > 9, MAKE A..F ADD ='A'-'0'+1,A * * ADD ='00',A MAKE ASCII COPY A,TVNUM+1(Y) DO IT COPY ET:UAT(X),X GET LUN PTR COPY:M 0(X),A,SALUN(Y) ADD ='I0'-'A0',A COPY A,SILUN(Y) ADD ='O0'-'I0',A COPY A,SOLUN(Y) ADD ='E0'-'O0',A COPY A,EFLUN(Y) COPY:M 1(X),A,SADIB(Y) COPY SADIB(Y),X COPY:M DI:NAM(X),A,TVNUM(Y) STORE TERMINAL NAME COPY =SAFBUF,A INITIALIZE ISM BUFFER ADDR PTR ADD Y,A SUB =1,A KLUDGE,COMBINED WITH BP SET TO 2 COPY A,USERBUFF(Y) STICK INTO ISM BLOCK * COPY =IWAL,X INITIALIZE IWAL BLOCK COPY =:F03E,A SEMAPHORE CHECK VALUE COPY A,WCHK(X,Y) STICK INTO SEMAPHORE BLOCK COPY Y,A ADD =IWAL+WSEM,A COPY A,WSEMPTR(X,Y) INIT IWAL SEMAPHORE PTR COPY:M =0,A,WUP(X,Y) CLEAR UPPER WORD OF WAIT TIME COPY:M =40,A,WLO(X,Y) SET FOR TEN SECONDS WAIT TIME COPY Y,WID(X,Y) SET TIMER ID TO UNIQUE Y-VALUE * IWAL  = WENV,WID,WSEMPTR,WUP,WLO,WPER,WFLG,WSEM,WCHK JMP INIT1 LPOOL INIT1 EQU $ IOBINT SIFIOB,SILUN(Y),SIFBUF COPY:M =BUFLEN,A,IOINDEX(X,Y) IOBINT SOFIOB,SOLUN(Y),SOFBUF COPY:M =BUFLEN,A,IOINDEX(X,Y) IOBINT SAFIOB,SALUN(Y),SAFBUF IOBINT SAFIOB2,SALUN(Y),SAFBUF COPY:M =BUFLEN,A,IOINDEX(X,Y) IOBINT DIRIOB,SILUN(Y),WORKBLOK IOBINT OCPIOB,='OC',SAFBUF SHARE BUFFER WITH SAFIOB IOBINT BATCHIOB,='ZB',BATCHBUF IOBINT MSGIOB,SALUN(Y),WORKBLOK JMP INIT2 MTZCMD REL SHARABLE MTZCMD INIT2 EQU $ * OPEN SAFIOB OPEN THE TV JMP TVERROR JUMP IF ERROR WRITEMSG =MSGIOB,FA:,MULTMSG WRITE FIRST TITLE LINE JSK TVERROR JSK MTZ:JOB WRITE =OCPIOB,FA:,=10 TO OCP ALSO JSK TVERROR RSK DONE WITH INITIALIZATION TITL J O B MTZ:JOB EQU $ COPY TVNUM(Y),A CALCULATE SECOND TITLE LINE COPY TVNUM+1(Y),Q ADD =SAFIOB+IOBUF,Y COPY A,2(Y) COPY Q,3(Y) COPY:M =' ',A,0(Y) COPY:M ='--',A,1(Y)  COPY A,4(Y) COPY:M =CRLF:,A,5(Y) ADD =6,Y OFFSET 3rd AND 4th LINES R:GATD STARDATE(Y) COPY:M =:2007,A,0(Y) COPY:M STARDATE(Y),A,1(Y) YEAR COPY:M STARDATE+2(Y),A,4(Y) DAY COPY:M =CRLF:,A,5(Y) COPY:M =:2007,A,6(Y) COPY:M STARDATE+3(Y),A,7(Y) HOUR COPY:M STARDATE+5(Y),A,10(Y) SECOND COPY:M =:0A0A,A,11(Y) * BYTEMODE COPYBM ='/',A,4(Y) COPYB A,7(Y) COPYBM =':',A,16(Y) COPY A,19(Y) COPYBM STARDATE+2(Y),A,5(Y) MON1 COPYBM STARDATE+3(Y),A,6(Y) MON2 COPYBM STARDATE+8(Y),A,17(Y) MIN1 COPYBM STARDATE+9(Y),A,18(Y) MIN2 WORDMODE * SUB =SAFIOB+IOBUF+6,Y WRITE =SAFIOB,FA:,=36 WRITE 2ND, 3RD AND 4TH TITLE LINES JSK TVERROR  RSK MTZINIT REL TITL IOBINT ** * FUNCTION: INITIALIZE IOBS * * ENTRY: X=IOB DISPLACEMENT * A=LUN * Q=BUFFER * JSK IOBINT * * EXIT: A,Q UNDEFINED * SETS LUN,CRI,BUF * X=IOB * * NOTE: IOB IS FOLLOWED BY CFI * USE MACRO --> IOBINT IOB,LUN,BUFFER ** IOBINT EQU $ COPY A,IO:LUN(X,Y) SET LUN COPY Y,A ADD X,A ADD =SIFCFI-SIFIOB,A COPY A,IO:CRI(X,Y) SET CFI POINTER COPY Y,A ADD Q,A COPY A,IO:BUF(X,Y) SET BUFFER POINTER RSK END (Y),WORKBLOK JMP INIT2 MTZCMD REL SHARABLE MTZCMD INIT2 EQU $ * OPEN SAFIOB OPEN THE TV JMP TVERROR JUMP IF ERROR WRITEMSG =MSGIOB,FA:,MULTMSG WRITE FIRST TITLE LINE JSK TVERROR JSK MTZ:JOB WRITE =OCPIOB,FA:,=10 TO OCP ALSO JSK TVERROR RSK DONE WITH INITIALIZATION TITL J O B MTZ:JOB EQU $ COPY TVNUM(Y),A CALCULAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII! IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIEe811008102938811008102938820114105851e@811008102938811008102938820114105656" e811008102938811008102938820114105740e811008102938811008102938811008102938811008102938811008102938811008102938e IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII? IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIA IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIB IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIC IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIID IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIE IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIF G H I J K L