IMD 1.16: 31/08/2008 10:48:53 84-93928-03 a100 f92803 bus monitor diag-dld2 format lsi2   ?nI7D@@8p8q0  nIPnI1f! %&&&$(('*9'C# LAC0HU U1G1JPS ?(K٠8p<0=q>>?Ơ2:GF4;9/!> ֠8:8=9O A9R"! &:ƭ >-A)>?8p?r8p?r8pΠ95o9A;mYWZd)]N- RI/%663ОDD(G6p9R<ʳ:!9RY]_!C3]^#uj!( o7//?)wdch c:T88888"$>H !  1 .H !0 !#(rr  F !Cr:',Q9 1  . H1  1 0  1 S &>:J;;;::;::;:m9[ee Pc`9A;l^H;z:IA=q;z=q;z "IV!,:}:&<;}$:q: :}::q:1;}<:q:!^;ldef;X;k;j<;l<0:i! (H:i<%:i  3 :i   vOQQG:q:kCjA  !.76H?0]\1(9!71@E&01*7+ ;>(PCF{:q:4<<:q:vvvv 8A(D=qޭz=q)>?8p?r8p?r8pΠP" !=8B:};Z<;}j325L:J2 0\H^cHFg(R6QQNRP I8\>$?  -kl 1216yz{}(j8:};Z < :<0W3 5;Y;;;;;;;;;;Y;Y;Y;;;syt ! !1(^ (YZ -$SG(1@Au s9Y X !6WP"HКSQP 400'S<< >= A&&A%PG<0T+<<= =G8c!  !-T4=q_\!)XU1\2YJ=$Q 6 ^ (228S+=`D B !I}=l' 1 1 1Zk\p=q:o; <8=2X0R  =O=V=Z > ?nI7D@@8p8q0  nIPnI1f! %&&&$(('*9'C# LAC0HU U1G1JPS ?(K٠8p<0=q>>?ITUTVUOQ  J ID!+  !< D:GH875AlI,521 /!!'$&($$%" $  #nI" P0ɲ HVWY= >>:gulD8I9X8!X"I2flclP0X]nR8F13Sl X!"2 HlGl Bn P 8R9n$DZ 9h?2  JSK O:CMD OUTPUT PROMPT/GET RESPONSE COPY =COMNDLST-2,X GET COMMAND TABLE ADDRESS NXTCOM10 EQU  $ ADD =2,X BUMP SEARCH INDEX COPY 0(X),Q GET A TABLE VALUE JNE Q,NXTCOM20  CONTINUE IF NOT AT TABLE END JMP SYERROR PROCESS SYNTAX ERROR NXTCOM20 EQU $ XOR A,Q  DO THEY MATCH ? JNE Q,NXTCOM10 JUMP IF NOT * COPY 1(X),Q GET COMMAND ROUTNIE ADDRESS  COPY Q,TEMP01(Y) SAVE IT COPY =CI,X SET LUN JSK O:IO GET NEXT CHAR JEQ X,NXTCOM30 JUMP IF NO I/O ERROR JMP ERROR PROCESS I/O ERROR NXTCOM30 EQU $ JMP *TEMP01(Y)  GO TO COMMAND ROUTNIE COMNDLST EQU $ WORD 'D' WORD DCOMMAND WORD 'L' WORD LCOMMAND WORD 'M' WORD MCOMMAND WORD 'R' WORD RCOMMAND WORD 'T' WORD TCOMMAND WORD 'U' WORD UCOMMAND WORD 'S' WORD SCOMMAND WORD 'O' WORD OCOMMAND WORD 0 LPOOL TITL LOAD MAP PROCESSOR * WILL PROCESS LOAD MAP REQUESTS IN FORMAT * M,U OR M,D FOR DEFINED AND UNDEFINED * SYMBOLS RESPECTIVELY MCOMMAND EQU $ CLSN A,=',' COMMA DELIMITER? JMP $+2 YES JMP SYERROR SYNTAX ERROR JSK GETCHR READ NEXT CHARACTER JMP ERROR COPY =-1,Q RESET LINECOUNT COPY Q,LINECT(Y) CLSN A,='U' WANTS UNDEFINED MAP JMP MCOMM10 YES CLSN A,='D' WANTS DEFIED MAP? JMP MCOMM20 YES JMP SYERROR WANTS NEITHER SYNTAX ERROR MCOMM10 EQU $ XOR Q,Q RESET RESOLVED JMP MCOMM30 MCOMM20 EQU $ COPY =1%RESOLVED,Q SET RESOLVED MCOMM30 EQU $ JSK GETCHR READ NEXT JMP ERROR CLSN A,=CRETURN CR DELIMITER JMP $+2 YES JMP SYERROR SYNTAX ERROR COPY Q,TEMP05(Y) SAVE D OR U COPY SYMCOUNT(Y),Q GET SYMBOL COUNT COPY SYMTABEG(Y),X GET FIRST ENTRY ADDRESS MCOMM40 EQU $ JEQD Q,MCOMM60 LAST ENTRY? COPY FLAGS(X),A GET TYPE FLAGS TBIT SEGMENT,A DON'T PRINT SEGMENT ENTRIES JT OV,MCOMM50 TBIT REFER,A DON'T DO FOR REFERENCE BLOCK JT OV,MCOMM50 XOR TEMP05(Y),A COMPARE RESOLVED FLAGS TBIT RESOLVED,A DO THEY DIFFER JT OV,MCOMM50 DON'T PRINT IF YES JSK OUTSYM PRINT SYMBOL JMP ERROR ERROR EXIT MCOMM50 EQU $ SUB =SYMLNG,X MOVE TO NEXT SYMBOL JMP MCOMM40 MCOMM60 EQU $ JMP NXTCOMND LPOOL TITL DEFINE COMMAND PROCESSOR * WIL L PROCESS SYMBOL DEFINITION COMMANDS IN THE FORMAT * D,SYMBOL,ADDRESS DCOMMAND EQU $ COPY =1%NAM,Q NAM TYPE FLAG DCOMM010 EQU $ CLSN A,=',' COMMA NEXT? JMP $+2 YES JMP SYERROR SYNTAX ERROR COPY SYMTABND(Y),X GET NEW ENTRY ADDRESS COPY Q,FLAGS(X) INIT TYPE FLAGS XOR A,A CLEAR A COPY A,REFADR(X) ZERO REFERENCE POINTER COPY A,TEMP02(Y) ZERO TEMP COUNT FOR FINDSYM COPY X,TEMP01(Y) ENTRY LOC FOR FINDSYM JSK GETPARM READ SYMBOL JMP ERROR ERROR EXIT CLSN A,=',' COMMA FOLLOWS? JMP $+2 YES JMP SYERROR SYNTAX ERROR JSK A2BIN READ ADDRESS (A REG) JMP ERROR ERROR EXIT JSK FINDSYM FIND OR ADD ENTRY COPY A,DEFADR(X) PUT DEFINITION OR FLAGS(X),Q COMBINE ALL FLAGS TBIT RESOLVED,Q ALREADY RESOLVED JF OV,$+2 SBIT MULTIPLE,Q MULTIPLY DEFINED SBIT RESOLVED,Q SET RESOLVED COPY Q,FLAGS(X) REPLACE COPY TEMP01(Y),A COPY A,SYMTABND(Y) REPLACE COPY TEMP02(Y),A GET TEMP SYMBOL COUNT ADD SYMCOUNT(Y),A ADD PREVIOUS COUNT COPY A,SYMCOUNT(Y) SAVE TOTAL JMP NXTCOMND TITL LIBRARY & UNCONDITIONAL LOAD LCOMMAND EQU $ COPY SYSFLAGS(Y),Q GET FLAG WORD RBIT ULOAD,Q INDICATE LIBRARY LOAD  JMP UCOMM010 CONTINUE UCOMMAND EQU $ COPY SYSFLAGS(Y),Q GET FLAG WORD SBIT ULOAD,Q INDICATE UNCONDITIONAL LOAD UCOMM010 EQU $ COPY Q,SYSFLAGS(Y) SAVE FLAG WORD SUB =',',A IS CHAR A COMMA ? JEQ A,UCOMM030 JUMP IF YES UCOMM020 EQU $ JMP SYERROR PROCESS SYNTAX ERROR UCOMM030 EQU $ COPY =BI,A SET LUN JSK O:CDEV ASSIGN PHYSICAL DEVICE JEQ X,UCOMM050  CONTINUE IF NO ERROR UCOMM040 EQU $ JMP ERROR PROCESS ERROR UCOMM050 EQU $ SUB =CRETURN,A IS TERMINATOR A CR ? JNE A,UCOMM020 ERROR IF NOT COPY =BI,X SET LUN JSK O:OPEN OPEN BI DEVICE JNE X,UCOMM040 JUMP IF ERROR JMP NEXTYPE BEGIN FILE PROCESSING  TITL SPECIFY REL OFFSET SCOMMAND EQU $ COPY =1%SEGMENT,Q SEGMENT TYPE FLAG JMP DCOMM010 PROCESS AS A DEFINE RCOMMAND EQU $ CLSN A,=',' COMMA? JMP $+2 YES JMP SYERROR SYNTAX ERROR JSK A2BIN CONVERT TO BINARY JMP ERROR ERROR EXIT COPY A,NXTBLK(Y) STORE AS NEXT ALLOCATION ADDRESS JMP NXTCOMND TITL UNTHREAD SYMBOL TABLE * THIS ROUTINE WILL STUFF THE DEF ADR INTO THE SYMBOL * REFERANCE CHAIN. AFTER THE SYMBOL CHAIN HAS BEEN * UNTHREADED THE REF ADR IS SET TO ZERO SO THAT IT * WILL BE IGNORED IF SUBSEQUENTG "T" COMMANDS ARE * ISSUED. * ENTRY : REG A = SECOND CHAR OF COMMAND * JMP TCOMMAND * EXIT : REG A = DESTROYED * Q,X,Y = PRESERVED * TCOMMAND EQU  $ SUB =CRETURN,A IS THE NEXT CHAR A CR ? JEQ A,TCOMM010 CONTINUE IF NO ERROR JMP TCERROR PROCESS ERROR TCOMM010 EQU $ COPY SYMCOUNT(Y),Q GET NUMBER OF SYMBOLS IN TABLE COPY SYMTABEG(Y),X GET SYMBOL TABLE ADR TCOMM020 EQU $ JEQD Q,TCOMM060 CHECK FOR LAST ENTRY COPY FLAGS(X),A GET SYMBOL FLAGS COPY A,TCFLAGS(Y) SAVE ABS/REL FLAG TBIT SEGMENT,A SEGMENT ENTRY? JT OV,TCOMM050 JUMP IF YES TBIT REFER,A DON'T DO REFERENCE BLOCK JT O V,TCOMM050 JSK WREF OUTPUT ALL REFERENCES TO THIS SYMBOL JMP ERROR COPY =0,A COPY A,REFADR(X) ZERO REFERENCE ADDRESS TCOMM050 EQU $ SUB =SYMLNG,X POINT TO NEXT SYMBOL JMP TCOMM020 CONTINUE TILL DONE TCOMM060 EQU $ JSK FLUSH JMP ERROR COPY ENDTC(Y),A WRITE LAST VALID END TC JSK OUTBYTE JMP ERROR COPY ENDADR(Y),A WRITE TRANSFER ADDRESS JSK OUTWORD JMP ERROR COPY =BO,X  JSK O:CLOS JMP NXTCOMND LPOOL TITL OUTPUT ABSOLUTE BINARY FILE * THIS ROUTINE WILL OUTPUT CORE TO THE BO FILE * IN RESPONSE TO THE COMMAND: O,DEVICE,LOWADR,HIADR * TYPECODES USED WILL BE ACCEPTABLE TO AUTOLOAD. OCOMMAND EQU $ CLSN A,=',' COMMA NEXT DELIMITER? JMP $+2 YES JMP SYERROR NO,SYNTAX ERROR COPY =BO,A SET BO AS FILE TO CONNECT JSK O:CDEV READ AND CONNECT FILE JEQ X,$+2 ANY ERRORS? JMP ERROR CLSN A,=CRETURN NEXT CHARACTER SHOULD BE CR JMP $+2 YES JMP SYERROR COPY =BO,X JSK O:OPEN OPEN FILE BO JEQ X,$+2 JMP ERROR COPY =TCBGIN,A GET START TYPE CODE JSK OUTBYTE WRITE TO BO JMP ERROR * COPY =0,A JSK OUTWORD WRITE A ZERO TO BO JMP ERROR JMP NXTCOMND LPOOL TITL TYPE CODE DISTRIBUTOR *  THIS ROUTINE WILL GET THE NEXT BYTE FROM BI AND PROCESS * IT AS A TYPE CODE. UPON FINDING A MATCH WITH THE TYPE *  CODE TABLE THE LOAD FLAG IS CHECKED. IF THE LOAD FLAG * IS ON, THE NEXT BYTE/WORD IS READ AND CONTROL IS PASSED *  TO THE TC ROUTINE. IF THE LOAD FLAG IS OFF, THE BYTES * ASSOCIATED TO THIS TC ARE SKIPPED. * ENTRY : REG Y = TEMP CELLS POINTER * JMP NEXTYPE * EXIT : REG Y = TEMP CELLS POINTER * REG. A = NEXT BYTE/WORD * TCFLAGS = FLAGS ASSOCIATED WITH THIS TC * NEXTYPE EQU $ JSK READBYTE GET THE TYPE CODE BYTE JMP IOERROR RETURN HERE IF ERROR ENTPRTN EQU $ COPY A,TYPECODE(Y) SAVE INTO TEMP CELL COPY =TCTABLE,X GET TABLE ADDRESS NEXTY010 EQU $ COPY 1(X),Q GET THIS TYPE CODE FLAGWORD COPY Q,TCFLAGS(Y) SAVE INTO TEMP CELL COPY 0(X),Q GET A TABLE ENTRY JNE Q,NEXTY015  JUMP IF NOT AT TABLE END JMP TCERROR OUTPUT TC ERROR NEXTY015 EQU $ XOR A,Q COMPARE WITH TABLE ENTRY CLSN =0,Q DO THEY MATCH ? JMP NEXTY020 YES, PROCESS IT ADD =3,X BUMP TABLE ADR JMP NEXTY010 CONTINUE WITH NEXT ENTRY * FOUND A MATCH IN TC TABLE NEXTY020 EQU $ COPY TCFLAGS(Y),Q GET THIS TYPE CODE FLAGWORD TBIT NXTWD,Q SHOULD WE READ NEXT WORD ?  JF OV,NEXTY030 JUMP AROUND IF NOT JSK READWORD READ NEXT WORD JMP IOERROR RETURN HERE IF ERROR NEXTY030 EQU $ TBIT NXTBY,Q SHOULD WE READ NEXT BYTE ? JF OV,NEXTY040 JUMP AROUND IF NOT JSK READBYTE READ NEXT BYTE JMP IOERROR RETURN HERE IF ERROR NEXTY040 EQU $  COPY TYPECODE(Y),Q GET CURRENT TYPE CODE CLSN =TCENTP,Q IS IT A LIST NAM ? JMP NEXTY080 SKIP LOAD TEST IF YES CLSN =TCBGIN,Q IS IT BEGIN PROG ? JMP NEXTY080 SKIP LOAD TEST IF YES  COPY SYSFLAGS(Y),Q GET GLOBAL FLAG WORD TBIT LOAD,Q IS THE LOAD FLAG ON ? JT OV,NEXTY080 JUMP TO PROCESS TC IF YES * SKIP THIS TYPE CODE RECORD COPY TCFLAGS(Y),Q GET TC FLAGS TBIT FIXED,Q  SKIP IN FIXED FORMAT ? JF OV,NEXTY050 JUMP IF VARIABLE FORMAT COPY 0(X),A GET SKIP COUNT WORD SHIFT A,RO,8 ISOLATE SKIP COUNT NEXTY050 EQU $ TBIT WDCNT,Q IS COUNT SPECIFIED IN WORDS ? JF OV,NEXTY060 JUMP IF NOT SHIFT A,LO,1 DOUBLE COUNT FOR # OF BYTES NEXTY060 EQU $ COPY A,Q SAVE COUNT NEXTY070 EQU $ JEQD Q,NEXTYPE DECREMENT COUNT, JUMP WHEN DONE JSK READBYTE SKIP A BYTE JMP IOERROR RETURN HERE IF ERROR JMP NEXTY070 CONTINUE * JUMP TO TYPE CODE PROCESSOR ROUTINE NEXTY080 EQU $ COPY 2(X),X GET TC PROCESSOR ADDRESS JMP 0(X)  JUMP TO PROCESS TC LPOOL TITL INTERMEDIATE ACCESS INTR EQU $ * PROCESS REFERNCE TO OTHER SEGMENT JSK FINDINDX GET SEGMENT ENTRY JMP TCERROR JSK READWORD GET OFFSET INTO SEGMENT JMP IOERROR ERROR EXIT RBIT CY,S TURN OFF CARRY  ADDC DEFADR(X),A RELOCATE, CHECK FOR OVERFLOW JF CY,INTR10 COPY =E:AE2,X ADDRESSING ERROR JMP ERROR INTR10 EQU $ JSK WDATA OUTPUT RELOCATED VALUE JMP ERROR IMS *LOCATION(Y) INCREMENT PC JSK READWORD GET MASK JMP IOERROR ERROR EXIT JMP NEXTYPE  TITL ERROR PROCESSING ROUTINES SYERROR EQU $ COPY =E:SE,X INDICATE SYNTAX ERROR JMP ERROR TCERROR  EQU $ COPY TYPECODE(Y),A GET TYPE CODE AS OPTIONAL VALUE COPY =E:TC,X IOERROR EQU $ CLSN =E:EOF,X IS IT END OF FILE ? JMP EOF JUMP IF YES ERROR EQU $ JSK O:ERFL OUTPUT THE ERFLOR CODE JMP NXTCOMND EOF EQU $ COPY =BI,X JSK O:CLOS CLOSE BI AT EOF JSK EOFMSG JMP ERROR JMP NXTCOMND LPOOL TITL TYPE CODE TABLE TCTABLE EQU $ WORD TCENDA * END(ABS) BITS MASK NXTWD,FIXED,ABS SPECIFY NONE,BITS WORD ENDA WORD TCENDR * END(REL) BITS MASK NXTWD,FIXED,REL SPECIFY NONE,BITS WORD ENDR WORD TCORGA * ORG(ABS) BITS MASK NXTWD,FIXED,ABS SPECIFY NONE,BITS WORD ORGA WORD TCORGR * ORG(REL) BITS MASK NXTWD,FIXED,REL SPECIFY NONE,BITS WORD ORGR WORD TCTAB * TEXT(ABS) BITS MASK ABS,NXTWD,WDCNT SPECIFY NONE,BITS WORD TAB WORD TCTRLW *TEXT(REL) BITS MASK REL,NXTWD,WDCNT SPECIFY NONE,BITS WORD TRLW WORD 2%8+TCRESF * RESERVE AND FILL BITS MASK NXTWD,FIXED SPECIFY NONE,BITS WORD RESF WORD TCBRLW * TEXT(BYTE REL) BITS MASK NXTWD,FIXED SPECIFY NONE,BITS WORD BRLW WORD TCBGIN *BEGIN BITS MASK NXTWD,FIXED SPECIFY NONE,BITS WORD BGIN WORD TCNULL * NULL BITS MASK SPECIFY NONE,BITS WORD NULL WORD TCENTP * LIST EXT DEF BITS MASK NXTBY,NAM SPECIFY NAM,BITS WORD ENTP WORD TCEXTP * LIST EXT REF BITS MASK NXTBY,EXTR SPECIFY EXTR,BITS WORD EXTP WORD TCENTS * LIST SEC EXT DEF BITS MASK NXTBY,SNAM SPECIFY SNAM,BITS WORD ENTS WORD TCEXTS * LIST SEC EXT REF BITS MASK NXTBY,SEXT SPECIFY SEXT,BITS WORD EXTS WORD TCCHNP * LIST CHAINS BITS MASK NXTBY,CHAIN,ABS SPECIFY CHAIN,BITS WORD CHNP WORD TCSGMT * LIST SEG NAMES BITS MASK NXTBY,SEGMENT SPECIFY SE GMENT,BITS WORD SGMT WORD 4%8+TCINTR * INTERMEDIATE ACCESS BITS MASK SEGMENT,FIXED,NXTBY SPECIFY SEGMENT,BITS WORD INTR WORD TCZOP * STACK DEFINITION BITS MASK FIXED SPECIFY NONE,BITS WORD ZOP WORD TCDENP * DEF EXTERNAL(PRI) BITS MASK NXTBY,FIXED SPECIFY NAM,BITS WORD DENP WORD TCDENS * DEF EXT(SEC) BITS MASK NXTBY,FIXED SPECIFY SNAM,BITS WORD DENS WORD TCLOC * LOC CNTR BITS MASK NXTBY,FIXED SPECIFY SEGMENT,BITS WORD LOC WORD TCNCHP * CHAIN ELEMENT BITS MASK NXTBY,FIXED SPECIFY CHAIN,BITS  WORD NCHP WORD TCHCHP * CHAIN HEAD BITS MASK NXTBY,FIXED SPECIFY CHAIN,BITS WORD HCHP WORD TCNOTE * NOTE BITS MASK SPECIFY NONE,BITS WORD NOTE WORD TCTEXP * TEXT EXT (PR) BITS MASK NXTBY,FIXED SPECIFY EXTR,BITS WORD TEXP WORD TCTEXS * TEXT EXTERNAL (SEC) BITS MASK NXTBY,FIXED SPECIFY SEXT,BITS WORD TEXS WORD TCSGML * LIST SEG ATTRIBUTES BITS MASK NXTBY SPECIFY SEGMENT,BITS WORD SGML WORD 0 END OF TABLE TITL PROCESS TCENDA (02) & TCENDR (03) ENDA EQU $ ENDR EQU $ COPY =:FFFF,Q CSN A,Q DONT'T STORE FFFF AS TA STORE ONLY LAST GOOD TA JMP ENDA10 JSK RELOCATE RELOCATE END ADR  JMP ERROR RETURN HERE IF ERROR COPY A,ENDADR(Y) SAVE AS ENDING ADR COPY TYPECODE(Y),A SAVE TYPE CODE COPY A,ENDTC(Y) ENDA10 EQU $ JMP NEXTYPE PROCESS NEXT TYPE CODE TITL PROCESS TCORGA (04) & TCORGR (05) ORGA EQU $ ORGR EQU $ JSK RELOCATE RELOCATE DATA WORD JMP ERROR RETURN HERE IF ERROR COPY A,*LOCATION(Y) STORE AS NEW PC COPY TCFLAGS(Y),Q GET ABS/REL FLAG AND =1%ABS,Q ISOLATE COPY SYSFLAGS(Y),X RBIT ABS,X CLEAR OLD ABS/REL OR X,Q COPY Q,SYSFLAGS(Y) RESTORE * JSK WORG WRITE NEW ORG THIS PC JMP ERROR JMP NEXTYPE PROCESS NEXT TYPE CODE TITL PROCESS TCTAB (06) & TCTRLW (07) TAB EQU $ TRLW  EQU $ COPY SYSFLAGS(Y),X LOOK AT SYSTEM FLAGS NEG A,Q TRLW10 EQU $ JSK READWORD GET A DATA WORD JMP IOERROR RETURN HERE IF ERROR JSK RELOCATE RELOCATE DATA WORD JMP ERROR TBIT ZOPFLAG,X WAS TCZOP SPECIFIED? JF OV,TRLW20 JUMP IF NOT JSK PUSHSTK JMP ERROR JMP TRLW30 DON'T STORE DTA WORD TRLW20 EQU $ JSK WDATA WRITE DATA WORD TO BO JMP ERROR IMS *LOCATION(Y) INCREMENT PC TRLW30 EQU $ IJNE Q,TRLW10 CONTINUE JMP NEXTYPE PROCESS NEXT TYPE CODE TITL PROCESS TCRESF (08) RESF EQU $ JSK WTC WRITE TYPE CODE TO BO JMP ERROR JSK OUTWORD WRITE COUNT TO BO JMP ERROR  ADD *LOCATION(Y),A ADD COUNT TO PC COPY A,*LOCATION(Y) UPDATA PC JSK READWORD READ DATA WORD JMP IOERROR JSK OUTWORD WRITE TO BO JMP ERROR JMP NEXTYPE PROCESS NEXT TYPE CODE TITL PROCESS TCBRLW (09) BRLW EQU $  JSK RELOCATE RELOCATE DATA WORD JMP ERROR RETURN HERE IF ERROR COPY SYSFLAGS(Y),Q GET GLOBOL FLAGS TBIT ZOPFLAG,Q WAS TCZOP SPECIFIED ? JF OV,BRLW10 JUMP IF NOT JSK PUSHSTK SAVE ON STACK JMP ERROR JMP BRLW20 DONT STORE DATA WORD BRLW10 EQU $ JSK WTC WRITE TYPE CODE TO BO JMP ERROR JSK OUTWORD WRITE ADDRESS TO BO JMP ERROR BRLW20 EQU $ JMP NEXTYPE PROCESS NEXT TYPE CODE  TITL PROCESS TCBGIN (18) BGIN EQU $ JEQ A,BGIN10 FLAG WORD MUST BE ZERO JMP TCERROR  OUTPUT TC ERROR BGIN10 EQU $ JSK INITINDX ZERO INDEX CHAIN POINTERS COPY SYSFLAGS(Y),A GET GLOBAL FLAGS TBIT ULOAD,A CHECK FOR UNCONDITIONAL LOAD JT OV,BGIN20 RBIT LOAD,A MOVE ULOAD TO LOAD JMP BGIN30 BGIN20 EQU $ SBIT LOAD,A MOVE ULOAD TO LOAD BGIN30 EQU $ COPY A,SYSFLAGS(Y) REPLACE JMP NEXTYPE PROCESS NEXT TYPE CODE TITL PROCESS LIST TYPE CODES EXTP EQU $ ENTS EQU $ EXTS EQU $ CHNP EQU $ SGMT EQU $ SHIFT A,RO,3 CHANGE TO NUMBER OF ENTRIES NEG A,Q NEGATE COUNT FOR INDEX XOR A,A CLEAR REG A COPY A,TEMP02(Y) CLEARY TEMPORARY SYMBOL COUNT COPY SYMTABND(Y),A GET END OF SYM TAB ADR COPY A,TEMP01(Y) SAVE INTO TEMP CELL PROSYM10 EQU $ JSK STORESYM APPEND SYMBOL TO CURRENT TABLE JMP ERROR RETURN HĠ@- )B¹.¹AK,A OR FLAGS(X),A COMBINE FLAGS COPY A,FLAGS(X) RESTORE JSK LINKINDX LINK TO INDEX CHAIN IJNE Q,PROSYM10 BUMP INDEX COUNT COPY TEMP01(Y),A GET TEMP SYMBOL END ADR COPY A,SYMTABND(Y) INCLUDE THESE SUMBOLS IN TABLE  COPY TEMP02(Y),A GET TEMP SYMBOL COUNT ADD SYMCOUNT(Y),A INCLUDE THESE IN TOTAL COUNT COPY A,SYMCOUNT(Y) SAVE TOTAL COUNT PROSYM20 EQU $ JMP NEXTYPE GET NEXT TYPE CODE LPOOL TITL PROCESS TCNULL (40) NULL EQU $ JMP NEXTYPE PROCESS NEXT TYPE CODE TITL PROCESS TCZOP (66) ZOP EQU $ COPY SYSFLAGS(Y),Q GET FLAG WORD SBIT ZOPFLAG,Q INDICATE TCZOP SPECIFIED COPY Q,SYSFLAGS(Y) RESTORE FLAG WORD JMP NEXTYPE PROCESS NEXT TYPE CODE TITL PROCESS TCDENP (67) & TCDENS (68) DENP EQU $ DENS EQU $ JSK FINDINDX FIND SYMBOL (BY INDEX) JMP TCERROR  RETURN HERE IF ERROR COPY *LOCATION(Y),A GET CURRENT PC COPY SYSFLAGS(Y),Q GET ABS/REL FLAGS TBIT ZOPFLAG,Q IS TCZOP SEQUENCE? JF OV,DEN020 RBIT ZOPFLAG,Q RESET ZOP FLAG COPY Q,SYSFLAGS(Y) JSK POPSTK GET PC FROM STACK JMP ERROR COPY TCFLAGS(Y),Q GET ABS REL FROM STACK * DEN020 EQU $ * JSK CKMULT CHECK FOR MULTIPLE DEFINITION JMP DEN030 YES, MULTIPLE DEFINITION COPY A,DEFADR(X) STORE DEFINITION IN SYM TAB COPY FLAGS(X),A GET SYMBOL FLAGS SBIT RESOLVED,A GET RESOLVED FLAG AND =1%ABS,Q ISOLATE ABS/REL OR Q,A INCLUDE W/ SYMBOL FLAGS COPY A,FLAGS(X) RESTORE FLAGS DEN030 EQU $ JMP NEXTYPE PROCESS NEXT TYPE CODE TITL PROCESS TCLOC (69) LOC EQU $ COPY A,Q MOVE INDEX FOR CALCULATION ADD Y,Q ADD SCRATCHPAD ADD =PC0,Q ADD PC BASE COPY Q,LOCATION(Y) STORE PC POINTER JSK FINDINDX GET SYM BY INDEX JMP TCERROR ERROR EXIT COPY DEFABBTL PROCESS TCNCNP (6B) NCHP EQU $ JSK FINDINDX FIND SYMBOL (BY INDEX) JMP TCERROR R ETURN HERE IF ERROR COPY FLAGS(X),A GET ABS/REL FROM SYMBOL FLAGS COPY A,TCFLAGS(Y) STORE AS CURRENT ABS/REL RBIT ABS,A CLEAR ABS/REL COPY SYSFLAGS(Y),Q GET GLOBAL ABS/REL AND =1%ABS,Q ISOLATE OR Q,A COMBINE GLOBAL ABS/REL WITH SYMBOL FLAGS SBIT RESJ^bc[B8l^\(WX(RTJS* OOOB=F;ЊD5421?.';,+)8/$$Q( \` u8Q1+/////....I2ϠɯϠԠĠčϠàčPzkqpvxGKKK Κ̚ʚӠҠà֠ŠӠԨөĠkҠǨԠŠΠҍҩΠ̠ӠĬŠΠҠРΠҠРϠǠΠҍҠĠŠԠ٠ũҠԠΠ\ ӠXDhH  4    /mkhJfPU] !!!!!D4 Z W( "R, '8YYZZ !52P.,*,-'%   ($  ƍrƊpD ?5  0  1S8L (( į 0‹ 0  w%d FX13ylSX!"2 plmlH jn P 8R>an.8D۬?@X) D $ճ U P XX F0H0 J'Š  ($ff7XaD`JP$&(&p.P00"(9?(?%?›0XE Dךji 6e-2 )2 vstup[}zqxfb\P?{11 ßX 0D&՚ Җґ   -p11k66K1b1ce@@Dv@@@hh@glfleldl@(8BQHlaIlFlb@b K@M9,B @>9X5 D33321Ɵ-+**)XC$$ ›X DX0 KJ Cv L M Nptufb[X 0Dß X  e@ qppooX Dl/k6h45[c;a>?@AXUGG ԠΠΠ٠ϠҠàӠԠŠԮϠԍŠȠΠǠŠȠƠԠԊ6}zsqx@ DCײ>X D"$Ƕ.'·'#ss@@ V dg<?Ob (PY LKD ! 3% !( Ɔ $(1 S$!+ !:R P P! P e  I i @ c   :9@h 4;A>iA# % w x"F13lKX!"2 l}lV zn P 8R`qn 'fD!ƪƠEƊG .)'R"Ƈ!ƠƠc_[ W S!w#+ ; < = > ?"d(1 ț1 R      -  @w n50 P10 1"0(ƠH(P(P(P(P8QQQQQ 2,ƮBB$( 6S֞+%(q"%0 Hg57 CFH$ ƮOV  7 (&Ơ ! &! 9hXXXH   $ * ) ' &" +hX X X H   = > ?# (ƽ$wƠ # ; <9XV)RRRћQQQQ0P!OLNNIMJGG>;8N97;7:59633(%8P,Ơƨ'Ʃƽ³!ƠƠƨʳƩƽг &&v!"< .    -! (i !"f 0 "#%--(#0'"P $2ۚDh2  Rhl@# (&? ? > = ;KW0 Ÿ\U(f^hd0$ u Ơp!`"`" 7wƌ- 2 #P0 ߝ   "B &:#2*Ɗ,6jjƮ mcƮ_^ ЛZS·GVIL6I$I֟6G AַA0?_=<!G5!H1L...,,, $!%$/b 2  "H " !# w ߠ  &-PPPPPP 1 $Ơ1ʜƠƿϷ ѷ"Ʈ%b  - !# J@0JD1! P X  #%&v"< "&!!`"`_,PH    /%0 +**)@ 0@@^  @ԛ  1 4% 5 =" (i :#; !#P H  5 +% tw(" _ 8DH1 8$ E Ʈ   #2 NMML K&CFƿIF"AGR8G63543210V+'&#"! #o w #  "w !  #I#$$$$$,$a 9%<%B%A%C%>%?%@~lussssr @@M P XXUT1P8KOQ2H( PEQ"0'H),k,.87698 9;=P!Ϟ=?0!HXHGHX! 1?X"""&Z!#% 7 ("$U$W  i'673Ơ,Ơ)X((XHӂ%%0""0"ƠXޓJp1Hig00HcXH_#"`"!P&:{Nvuus sƮmkĢhŢgɢfҢeעd cc!$q@sl[v,'J(CBAA<= l!l"l/0008-',,, J^dj  y >&&&&&&&"|&&&&ƱƽpƲ  (KƽwƳƽ~ƽ::9Ac95ƽ.!2!4;!D7==cyOI1BGlށWK1JQtމ_S1B0W1EHޒh`d$W?!"0(iSTERS PRESERVED * NAM STORESYM EXTR READWORD,O4:BLL STORESYM EQU $ PUSH :0040 SAVE REGISTERS COPY TCFLAGS(Y),A GET FLAGS AND =1%ABS++TYPEMASK,A ISOLATE TYPE FLAGS; ALLOW ABS COPY TEMP01(Y),Y GET DESTINATION ADR COPY kҠǨԠŠΠҍҩΠ̠ӠĬŠΠҠРΠҠРϠǠΠҍҠĠŠԠ٠ũҠԠΠ\ ӠXDhH  4    /mkhJfPU] !!!!!D4 Z W( "R, '8YYZZ !52P.,*,-'%   ($  ƍrƊpD ?5  0  1S8L (( į 0‹ 0  w%d FX13ylSX!"2 plmlH jn P 8R>an.8D۬?@X) D $ճ U P XX F0H0 J'Š  ($ff7XaD`JP$&(&p.P00"(9?(?%?›0XE Dךji 6e-2 )2 vstup[}zqxfb\P?{11 ßX 0D&՚ Җґ   -p11k66K1b1ce@@Dv@@@hh@glfleldl@(8BQHlaIlFlb@b K@M9,B @>9X5 D33321Ɵ-+**)XC$$ ›X DX0 KJ Cv L M Nptufb[X 0Dß X  e@ qppooX Dl/k6h45[c;a>?@AXUGG ԠΠΠ٠ϠҠàӠԠŠԮϠԍŠȠΠǠŠȠƠԠԊ6}zsqx@ DCײ>X D"$Ƕ.'·'#ss@@ V dg<?Ob (PY LKD ! 3% !( Ɔ $(1 S$!+ !:R P P! P e  I i @ c   :9@h 4;A>iA# % w x"F13lKX!"2 l}lV zn P 8R`qn 'fD!ƪƠEƊG .)'R"Ƈ!ƠƠc_[ W S!w#+ ; < = > ?"d(1 ț1 R    -  @w n50 P10 1"0(ƠH(P(P(P(P8QQQQQ 2,ƮBB$( 6S֞+%(q  "%0 Hg57 CFH$ ƮOV  7 (&Ơ ! &! 9hXXXH   $ * ) ' &" +hX X X H   = > ?# (ƽ$wƠ # ; <9XV)RRRћQQQQ0P!OLNNIMJGG>;8N97;7:59633(%8P,Ơƨ'Ʃƽ³!ƠƠƨʳƩƽг &&v!"< .    -! (i !"f 0 "#%--(#0'"P $2ۚDh2  Rhl@# (&? ? > = ;KW0 Ÿ\U(f^hd0$ u Ơp!`"`" 7wƌ- 2 #P0 ߝ   "B &:#2*Ɗ,6jjƮ mcƮ_^ ЛZS·GVIL6I$I֟6G AַA0?_=<!G5!H1L...,,, $!%$/b 2  "H " !# w ߠ  &-PPPPPP 1 $Ơ1ʜƠƿϷ ѷ"Ʈ%b  - !# J@0JD1! P X  #%&v"< "&!!`"`_,PH    /%0 +**)@ 0@@^  @ԛ  1 4% 5 =" (i :#; !#P H  5 +% tw(" _ 8DH1 8$ E Ʈ   #2 NMML K&CFƿIF"AGR8G63543210V+'&#"! #o w #  "w !  #I#$$$$$,$a 9%<%B%A%C%>%?%@~lussssr @@M P XXUT1P8KOQ2H( PEQ"0'H),k,.87698 9;=P!Ϟ=?0!HXHGHX! 1?X"""&Z!#% 7 ("$U$W  i'673Ơ,Ơ)X((XHӂ%%0""0"ƠXޓJp1Hig00HcXH_#"`"!P&:{Nvuus sƮmkĢhŢgɢfҢeעd cc!$q@sl[v,'J(CBAA<= l!l"l/0008-',,, J^dj  y >&&&&&&&"|&&&&ƱƽpƲ(KƽwƳƽ~ƽ::9Ac95ƽ.!2!4;!D7==cyOI1BGlށWK1JQtމ_S1B0W1EHޒh`d$W?!"0(i  STERS PRESERVED * NAM STORESYM EXTR READWORD,O4:BLL STORESYM EQU $ PUSH :0040 SAVE REGISTERS COPY TCFLAGS(Y),A GET FLAGS AND =1%ABS++TYPEMASK,A ISOLATE TYPE FLAGS; ALLOW ABS COPY TEMP01(Y),Y GET DESTINATION ADR COPY O4:BLL,X GET END (LOWER) OF WORD AREA CSM Y,X COMPARE THE ADDRESSES JMP STORE025 NEW SYMBOL ENTRY OUT OF AREA NOP XOR X,X CLEAR WORD INDEX COPY X,DEFADR(Y) CLEAR DEF ADR WORD COPY X,REFADR(Y) CLEAR REF ADR WORD COPY A,FLAGS(Y) SET FLAG WORD COPY X,INDEX(Y) CLEAR INDEX STORE010 EQU $ CLSN =4,X HAVE WE GOTTEN 4 WORDS ? JMP STORE020 YES, DONE WITH TEXT JSK READWORD READ IN SYMBOL TEXT  JMP STORE030 RETURN HERE IF ERROR COPY A,0(X,Y) SAVE WORD INTO SYMBOL TABLE IJNE X,STORE010 BUMP STORAGE INDEX STORE020 EQU $ COPY K,Y GET STACK POINTER IMS STACKRTN(Y) BUMP ADR TO NO ERROR RETURN JMP STORE040 SKIP ERROR PROCESSING STORE025 EQU $ COPY =E:SO,X INDICATE SYMBOL TABLE OVERFLOW STORE030 EQU $ COPY K,Y GET STACK POINTER COPY X,STACKX(Y) SAVE ERROR CODE STORE040 EQU $ POP RSK END F ERROR COPY A,0(X,Y) SAVE WORD INTO SYMBOL TABLE IJNE X,STORE010 BUMP STORAGE INDEX STORE020 EQU $ COPY K,Y GET STACK POINTER IMS STACKRTN(Y) BUMP ADR TO NO ERROR RETURN JMP STORE040 SKIP ERROR PROCESSING STORE025 EQU $ COPY =E:SO,X INDICATE SYMBOL TABLE OVERFLOW STORE030 EQU $ COPY K,Y GET STACK POINTER COPY X,STACKX(Y) SAVE ERROR CODE STORE040 E TITL RELOCATE DATA WORD * THIS ROUTINE WILL RELOCATE THE WORD IN REGISTER A * ACCORDING TO THE BITS SET IN TCFLAGS. * ENTRY : A = DATA WORD * JSK RELOCATE * EXIT : A = RELOCATED WORD * NAM RELOCATE RELOCATE EQU $ PUSH :0040 SAVE REGISTERS COPY RELOC(Y),X GET RELOCATION BIAS COPY TCFLAGS(Y),Q GET THE FLAG WORD TBIT ABS,Q IS IT ABS MODE ? JT OV,RELOCA20 IF YES, DONT CHANGE ADR  TBIT REL,Q IS IT REL MODE ? JT OV,RELOCA10 JUMP IF YES, ELSE BYTE REL SHIFT X,LO,1  DOUBLE LOC VALUE JT OV,RELOCA30 JUMP IF INVALID ADR RELOCA10 EQU $ RBIT CY,S INSURE CARRY NOT ON COPY X,TEMP01(Y) PUT LOC IN MEM FOR ADDC ADDC TEMP01(Y),A ADD LOC TO ADR JT CY,RELOCA30 JUMP IF ADR ERROR RELOCA20 EQU $ COPY K,Y GET STACK POINTER COPY A,STACKA(Y) PUT RELOCATED VALUE INTO A IMS STACKRTN(Y) BUMP PAST ERROR RTN ADR JMP RELOCA40 CONTINUE RELOCA30 EQU  $ COPY K,Y GET STACK POINTER COPY =E:AE2,X GET ADDRESSING ERROR CODE COPY X,STACKX(Y) SAVE ERROR CODE RELOCA40 EQU $ POP RESTORE REGISTERS RSK RETURN LPOOL END ROR RELOCA20 EQU $ COPY K,Y GET STACK POINTER COPY A,STACKA(Y) PUT R  TITL READ NEXT WORD/BYTE SERVICE * THESE ROUTINES WILL GET THE NEXT WORD OR BYTE FROM THE * BI DEVICE.  IN THE CASE OF NEXTBYTE, THE LEFT HALF OF * THE DATA REGISTER IS UNCHANGED. IN THE CASE OF NO ERROR * THE RETURN ADDRESS IS MODIFIED IN THE STACK SO THE RSK * WILL CAUSE CONTROL TO PASS TO THE RSK ADDRESS+1. * ENTRY : REG A = DATA * JSK NEXTBYTE FOR BYTE REQUEST * JSK READWORD FOR WORD REQUEST * EXIT : REG A = DATA WORD * REG X = ERROR CODE (ONLY IF ERROR) * NAM READWORD NAM READBYTE EXTR O:IO READWORD EQU $ JSK NEXTBYTE GET A BYTE, FALL THROUGH FOR SECOND BYTE JMP NEXTB030 RETURN HERE IF ERROR JMP NEXTBYTE GET A DATA BYTE READBYTE EQU $ XOR A,A INSURE NULL DATA REGISTER NEXTBYTE EQU $ PUSH :0040 SAVE REGISTERS SHIFT A,LO,8 SAVE FIRST BYTE TO FORM WORD COPY =BI,X SET LUN TO BI FOR I/O JSK O:IO GET THE NEXT DATA BYTE COPY K,Y GET STACK POINTER JNE X,NEXTB010 JUMP IF I/O ERROR IMS STACKRTN(Y) BUMP ADR TO NO ERROR RETURN  COPY A,STACKA(Y) STUFF DATA WORD INTO REG A JMP NEXTB020 CONTINUE NEXTB010 EQU $ COPY X,STACKX(Y) STUFF ERROR CODE INTO REG X NEXTB020 EQU $ POP RESTORE REGISTERS NEXTB030 EQU $  RSK RETURN END OR I/O JSK O:IO GET THE NEXT DATA BYTE COPY K,Y GET STACK POINTER JNE X,NEXTB010 JUMP IF I/O ERROR IMS STACKRTN(Y) BUMP ADR TO NO ERROR RETURN  COPY A,STACKA(Y) STUFF DATA WORD INTO REG A JMP NEXTB020 CONTINUE NEXTB010 EQU $ COPY X,STACKX(Y) STUFF ERROR CODE INTO REG X NEXTB020 EQU $ POP RESTORE REGISTERS NEXTB030 EQU $  TITL GETCHR * THIS ROUTINE WILL READ ONE CHARACTER THROUGH THE * CONSOLE DEVICE. THE CHARACTER IS RETURNED IN THE A * REGISTER. * ENTRY: JSK GETCHR * ERROR RETURN (ERROR CODE IN X) *  NORMAL RETURN (INPUT CHARACTER IN A) NAM GETCHR EXTR O:IO LOAD O:BOUT LOAD O:BIN GETCHR EQU $ PUSH :0040  COPY K,Y ADDRESS STACK COPY =CI,X READ FROM CONSOLE JSK O:IO INPUT ONE CHARACTER TO A JNE X,GETCHR01 ERROR? COPY A,STACKA(Y) RETURN CHARACTER IMS STACKRTN(Y) NORMAL RETN POP RESTORE REGISTERS RSK GETCHR01 EQU $ COPY X,STACKX(Y) RETURN ERROR CODE  POP RSK END REGISTER. * ENTRY: JSK GETCHR * ERROR RETURN (ERROR CODE IN X) *  NORMAL RETURN (INPUT CHARACTER IN A) NAM GETCHR EXTR O:IO LOAD O:BOUT LOAD O:BIN GETCHR EQU $ PUSH :0040  COPY K,Y ADDRESS STACK COPY =CI,X READ FROM CONSOLE JSK O:IO INPUT ONE CHARACTER TO A JNE X,GETCHR01 ERROR? COPY A,STACKA( TITL CH2HEX * THIS ROUTINE WILL CONVERT AN ASCII CHARACTER TO * ITS HEX EQUIVALENT IF IT HAS ONE. * ENTRY: A=ASCII CHARACTER * JSK CH2HEX * ERROR RETURN (CHARACTER WAS NOT 0-9,A-F) *   NORMAL RETURN (HEX IN A) NAM CH2HEX CH2HEX EQU $ PUSH :0040 SUB ='9',A CHECK GT 9 JGT A,CH2HEX01 MIGHT BE A-F ADD ='9'-'0',A CHECK LT 0 JLT A,CH2HEX03 IS A LIZARD JMP CH2HEX02 IS 0-9 CH2HEX01 EQU $ SUB ='F'-'9',A CHECK GT F JGT A,CH2HEX03 A LIZARD ADD ='F'-'A',A CHECK LT A JLT A,CH2HEX03 LIZARD ADD =10,A ADD 10 TO MAKE HEX CH2HEX02 EQU $ COPY K,Y COPY A,STACKA(Y) RETURN HEX IMS STACKRTN(Y) NORMAL RETURN CH2HEX03 EQU $ POP RSK END R RETURN (CHARACTER WAS NOT 0-9,A-F) *  NORMAL RETURN (HEX IN A) NAM CH2HEX CH2HEX EQU $ PUSH :0040 SUB ='9',A CHECK GT 9 JGT A,CH2HEX01 MIGHT BE A-F ADD ='9'-'0',A CHECK LT 0 JLT A,CH2HEX03 IS A LIZARD JMP CH2HEX02 IS 0-9 CH2HEX01 EQU $ SUB ='F'-'9',A CHECK GT F JGT A,CH2HEX TITL EOFMSG * THIS ROUTINE WILL WRITE THE END OF FILE MESSAGE * TO THE LO FILE. THIS MESSAGE CONSISTS OF THE * NEXT STARTING ADDRESS OF THE PROGRAM AND DATA * SEGMENTS, THIS LAST ENTERED EXECUTION ADDRESS, AND * THE COUNT OF UNRESOLVED EXTERNALS. * ENTRY: JSK EOFMSG * ERROR RETURN (ERROR CODE IN X) *  NORMAL RETURN (ALL REGISTERS PRESERVED) NAM EOFMSG EXTR O:IO,O:MSG,BLANKS EXTR FINDSYM,B2AH EXTR OL:END EOFMSG EQU $  PUSH :0040 SAVE REGISTERS JSK BLANKS OUTPUT LEADING BLANKS JMP EOFMSG60 ERROR EXIT COPY =PROG,X GET NAME OF PROGRAM SEGMENT  JSK SEGMSG OUTPUT ASSOCIATED MESSAGE JNE X,EOFMSG60 ERROR EXIT COPY =DATA,X GET NAME OF DATA SEGMENT JSK SEGMSG JNE X,EOFMSG60 ERROR EXIT COPY =EX,X GET ADDRESS OF TA PREFIX COPY =LO,Q COPY =4,A MESSAGE LENGTH JSK O:MSG OUTPUT PREFIX JNE X,EOFMSG60 COPY ENDADR(Y),Q GET LAST TRANSFER ADDRESS JSK B2AH CONVERT TO ASCII AND OUTPUT JMP EOFMSG60 ERROR EXIT JSK BLANKS SEPARATE WITH BLANKS JMP EOFMSG60 ERROR EXIT COPY =UE,X GET ADDRESS OF PREFIX COPY =LO,Q COPY =4,A MESSAGE LENGTH JSK O:MSG WRITE PREFIX JNE X,EOFMSG60 CHECK ERROR STATUS JSK UECOUNT COUNT UNRESOLVED EXTERNALS JSK B2AH OUTPUT JMP EOFMSG60 ERROR EXIT JSK BLANKS SEPARATE WITH BLANKS JMP EOFMSG60 ERROR EXIT COPY ='(',A COPY =LO,X JSK O:IO OUTPUT LEFT PAREN FOR LAMBDA LIMITS JNE X,EOFMSG60 COPY SYMTABND(Y),Q GET LAMBDA LOW ADDRESS JSK B2AH OUTPUT JMP EOFMSG60 ERROR EXIT COPY ='-',A COPY =LO,X JSK O:IO OUTPUT DASH BETWEEN LIMITS JNE X,EOFMSG60 COPY =OL:END,Q GET TOP OF LAMBDA JSK B2AH OUTPUT JMP EOFMSG60 ERROR EXIT COPY =')',A COPY =LO,X JSK O:IO OUTPUT RIGHT PAREN AFTER LAMBDA LIMITS JNE X,EOFMSG60 COPY =CRETURN,A COPY =LO,X JSK O:IO OUTPUT CR AT END OF LINE JNE X,EOFMSG60 COPY K,Y INDEX STACK IMS STACKRTN(Y) NORMAL RETURN JMP EOFMSG70 EOFMSG60 EQU $ COPY K,Y COPY X,STACKX(Y) EOFMSG70 EQU $ POP RSK RETURN TITL SEGMSG SEGMSG EQU $ COPY X,TEMP01(Y) PREPARE ADDRESS FOR FINDSYM ADD =SYMLNG,X ADDRESS PREFIX MESSAGE COPY =LO,Q COPY =4,A MESSAGE LENGTH JSK O:MSG OUTPUT PREFIX MESSAGE JNE X,SEGMSG20 CHECK IO ERROR JSK FINDSYM FIND SEGMENT ENTRY COPY REFADR(X),Q GET RELOCATION VALUE ADD DEFADR(X),Q ADD SEGMENT LENGTH JSK B2AH OUTPUT NEXT AVAILABLE ADDRESS JMP SEGMSG20 ERROR EXIT JSK BLANKS OUTPUT TRAILING BLANKS JMP SEGMSG20 XOR X,X CLEAR ERROR INDICATOR RSK RETURN SEGMSG20 EQU $ RSK RETURN WITH ERROR STILL IN X * * TITL CONSTANT AREA PROG EQU $ BYTE ' ' WORD 0,0, 0 WORD 1%SEGMENT BYTE 'RP= ' DATA EQU $ BYTE 'DATA ' WORD 0,0,0 WORD 1%SEGMENT BYTE 'RD= ' EX EQU $ BYTE 'EX= ' UE EQU $ BYTE 'UE= ' * * TITL UECOUNT RS MASK RESOLVED,SEGMENT,REFER * UECOUNT EQU $ PUSH :0040 COPY SYMCOUNT(Y),Q GET NO. SYMTAB ENTRIES COPY SYMTABEG(Y),X GET TABLE START XOR Y,Y ZERO UE COUNT UECOUNT1 EQU $ JEQD Q,UECOUNT2 LAST ENTRY? COPY FLAGS(X),A NO, GET FLAGS FROM ENTRY SUB =SYMLNG,X MOVE TO NEXT ENTRY AND =RS,A DON'T COUNT SEGMENTS OR RESOLVED ENTRIES JNE A,UECOUNT1 IJNE Y,UECOUNT1 BUMP COUNT1 AND GO TO NEXT ENTRY UECOUNT2 EQU $ COPY K,X INDEX STACK COPY Y,STACKQ(X) RETURN COUNT IN Q POP RSK END 'UE= ' * * TITL UECOUNT RS MASK RESOLVED,SEGMENT,REFER * UECOUNT EQU $ PUSH :0040 COPY SYMCOUNT(Y),Q GET NO. SYMTAB ENTRIES COPY SYMTABEG(Y),X GET TABLE START XOR Y,Y ZERO UE COUNT UECOUNT1 EQU $ JEQD Q,UECOUNT2 LAST ENTRY? COPY FLAGS(X),A NO, GET FLAGS FROM ENTRY SUB =SYMLNG,X MOVE TO NEXT ENTRY AND =RS,A DON'T COUNT SEGMENTS OR RESOLVED ENTRIES JNE A,UECOUNT1 * THIS ROUTINE WILL READ CHARACTERS FROM CI AND * CONVERT TO BINARY. CHARACTERS ARE READ UNTIL * A CR OR NON HEX CHARACTER IS READ. ONLY THE * LAST FOUR CHARACTERS ARE RETAINED. * ENTRY: JSK A2BIN *  ERROR RETURN (I/O OR NON HEX ) * NORMAL RETURN (A=BINARY NUMBER) NAM A2BIN EXTR O:H2B A2BIN EQU $ PUSH :0040 SAVE REGISTERS COPY K,Y INDEX STACK JSK O:H2B READ AND CONVERT BINARY JNE X,A2BIN040 I/O ERROR OR OVERFLOW CLSN A,=CRETURN FINISHED JMP A2BIN050 YES A2BIN030 EQU $ COPY =E:SE,X SYNTAX ERROR A2BIN040 EQU $ COPY X,STACKX(Y) RETURN ERROR CODE  POP RSK A2BIN050 EQU $ COPY Q,STACKA(Y) RETURN RESULT IN A IMS STACKRTN(Y) POP RSK END ENTRY: JSK A2BIN *  ERROR RETURN (I/O OR NON HEX ) * NORMAL RETURN (A=BINARY NUMBER) NAM A2BIN EXTR O:H2B A2BIN EQU $ PUSH :0040 SAVE REGISTERS COPY K,Y INDEX STACK JSK O:H2B READ AND CONVERT BINARY JNE X,A2BIN040 I/O ERROR OR OVERFLOW CLSN A,= TITL GETPARM * THIS ROUTINE WILL READ A STRING OF CHARACTERS * FROM THE CI FILE AND STORE THEM IN THE BUFFER * PROVIDED. UP TO 8 CHARACTERS ARE ACCEPTED. CR * OR ',' ARE LEGAL DELIMITERS. THE DELIMITER * FOUND IN RETURNED IN THE A REGISTER. THE INPUT * BUFFER IS FILLED TO BLANKS BEFORE INPUT. * ENTRY: X= ADDRESS OF INPUT BUFFER * JSK GETPARM * ERROR RETURN (CODE IN X REG) * NORMAL RETURN (DELIMITER IN A REG) NAM GETPARM EXTR GETCHR,O4:BLL GETPARM EQU $ PUSH :0040 SAVE REGS COPY O4:BLL,A GET LOWER END OF WORK AREA CSM X,A COMPARE WITH NEW ENTRY ADDRESS JMP GETPAR07 ERROR IF TABLE LT O4:BLL NOP COPY X,Y BUFFER ADDRESS IN Y COPY =' ',A BLANKS TO A COPY =3,X FOUR WORD BUFFER GETPAR01 EQU $ COPY A,0(X,Y) BLANK BUFFER JNED X,GETPAR01 NEXT WORD XOR A,A CLEAR INPUT REGISTER XOR X,X CLEAR INDEX TO BUFFER GETPAR02 EQU $ JSK GETCHR READ NEXT CHARACTER JMP GETPAR06 ERROR EXIT CLSN A,=',' END OF PARAMETER IF COMMA JMP GETPAR04 NORMAL RETURN CLSN A,=CRETURN END OF PARAMETER IF CR JMP GETPAR04 NORMAL RETURN SBIT BM,S ENTER BYTE MODE COPYB A,0(X,Y) STORE CHARACTER IN BUFFER RBIT BM,S LEAVE BYTE MODE CLSN X,=8 TEST FOR OVER 9 CHARACTERS  INPUT JMP GETPAR05 YES, SYNTAX ERROR IJNE X,GETPAR02 NO, GET NEXT CHARACTER GETPAR04 EQU $ COPY K,Y ADDRESS STACK COPY A,STACKA(Y) RETURN DELIMETER FOUND IMS STACKRTN(Y) INCREMENT TO NORMAL RETURN POP RESTORE REGISTERS RSK GETPAR05 EQU $ COPY =E:SE,X SYNTAX ERROR GETPAR06 EQU $ COPY K,Y ADDRESS STACK COPY X,STACKX(Y) ERROR CODE IN X POP RESTORE OTHER REGS RSK GETPAR07 EQU $ COPY =E:SO,X JMP GETPAR06 REPORT SYMBOL TABLE OVERFLOW END T BM,S LEAVE BYTE MODE CLSN X,=8 TEST FOR OVER 9 CHARACTERS INPUT JMP GETPAR05 YES, SYNTAX ERROR IJNE X,GETPAR02 NO, GET NEXT CHARACTER GETPAR04 EQU $ COPY K,Y ADDRESS STACK COPY A,STACKA(Y) RETURN DELIMETER FOUND IMS STACKRTN(Y) INCREMENT TO NORMAL RETURN POP RESTORE REGISTERS RSK GETPAR05 EQU $ COPY =E:S TITL SET DESIRED TCFLAG BITS MACRO MASK MASK:: SET 0 IFT #?>0 MASK:: SET 1%#1++MASK:: ENDC IFT #?>1 MASK:: SET 1%#2++MASK:: ENDC IFT #?>2 MASK:: SET 1%#3++MASK:: ENDC IFT #?>3 MASK:: SET 1%#4++MASK:: ENDC IFT #?>4 MASK:: SET 1%#5++MASK:: ENDC IFT #?>5 MASK:: SET 1%#6++MASK:: ENDC #(-1) SET MASK:: ENDM MACRO SPECIFY WORD #(1)%13++#(2) ENDM TITL  EQUATES * TEMP CELL DEFINITIONS PC0 EQU 0 SEGMENT PC ARRAY FIRST ELEMENT LINECT EQU 21 ENDTC EQU 22 02 OR 03, LAST EX ADDRESS TYPE CHNHDS EQU 23 CHAIN HEAD POINTERS FOR SYMBOL TYPES RELOC EQU 29 CURRENT RELOCATION BIAS NXTBLK EQU 31 NEXT MEMORY ALLOCATION BLOCK START ADDRESS LOCATION EQU 32 CURRENT PC SYMTABEG EQU 34 SYMBOL TABLE BEG ADR SYMTABND EQU 35 SYMBOL TABLE END ADR SYMCOUNT EQU 36 NUMBER OIF SYMBOLS IN TABLE TYPECODE EQU 37  CURRENT TYPE CODE TCFLAGS EQU 38 CURRENT TYPE CODE FLAGS SYSFLAGS EQU 39 GENERAL SYSTEMS FLAGS DATATC EQU 40 TYPE CODE FOR OUTPUT ASSEMBLY BUFFER DATACT EQU 41 COUNT OF WORDS IN OUTPUT ASSEMBLY BUFFER ENDADR EQU 43  LAST OBTAINED EXECUTION ADR BUFADR EQU 44 ADDRESS OF ASSEMBLY OUTPUT BUFFER STACKP EQU 46 LINKER STACK POINTER ASTACK EQU 47 LINKER ADDRESS STACK TSTACK EQU 52 LINKER TYPE STACK TEMP01 EQU 59 TEMP02 EQU 60 TEMP CELL TEMP03 EQU 61 TEMP CELL TEMP04 EQU 62 TEMP CELL TEMP05 EQU 63 TEMP CELL * TYPE CODE DEFINITIONS TCENDA EQU :02 TCENDR EQU :03 TCORGA EQU :04 TCORGR EQU :05 TCTAB EQU :06 TCTRLW EQU :07 TCRESF EQU :08 TCBRLW EQU :09 TCBGIN EQU :18 TCNULL EQU :40 TCENTP EQU :4A TCEXTP EQU :4B TCENTS EQU :4C TCEXTS EQU :4D TCCHNP EQU :4E TCSGMT EQU :4F TCINTR EQU :64 TCZOP EQU :66 TCDENP EQU :67 TCDENS EQU :68 TCLOC EQU :69 TCNCHP EQU :6B TCHCHP EQU :6C TCNOTE EQU :6D TCSGML EQU :6F TCTEXP EQU :74 TCTEXS EQU :75 * TCFLAGS BIT EQUATES SEGMENT EQU 0 CHAIN EQU 1 SEXT EQU 2 EXTR EQU 3 SNAM EQU 4 NAM EQU 5 WDCNT EQU 12 RESOLVED EQU 10 REFER EQU 8 MULTIPLE EQU 7 ABS EQU 6 REL EQU 7 OFFSET EQU 9 FIXED EQU 9 NXTBY EQU 10 NXTWD EQU 11 * SYMBOL TABLE ENTRY EQUATES SYMWORD1 EQU 0 SYMWORD2 EQU 1 SYMWORD3 EQU 2 SYMWORD4 EQU 3 DEFADR EQU 4 REFADR EQU 5 FLAGS EQU 7 INDEX EQU 6 SYMLNG EQU 8 * REFERENCE BLOCK EQUATES RINDX EQU 7 RLINK EQU 0 *   SYSTEM GLOBAL FLAGS LOAD EQU 2 ULOAD EQU 3 ZOPFLAG EQU 4 * BIT MASK EQUATES TYPEMASK MASK SEGMENT,CHAIN,SEXT,EXTR,SNAM,NAM * GENERAL USAGE EQUATES CI EQU 0 BO EQU 5 CO EQU 1 BI EQU 4 LO EQU 6 CY EQU 0 BM EQU 2 NONE EQU 0 STACKL EQU 0 STACKS EQU 1 STACKA EQU 2 STACKQ EQU 3 STACKX EQU 4 STACKY EQU 5 STACKRTN EQU 6 STACKSZE EQU :80 SIZE OF USER STACK BUFSIZ EQU 255 OUTPUT ASSEMBLY BUFFER LENGTH E:EOF EQU :0001 EOF ERROR CODE E:SE EQU :0020 SYNTAX ERROR CODE E:AE1 EQU :0014 ADDRESS IN LOADER E:AE2 EQU :0018 OUT OF ADDRESS SPACE E:AE3 EQU :0019 ADDRESS IN ROM OR NO MEMORY E:SO EQU :0013 E:TC EQU :8015 TYPE CODE ERROR CODE PARITY EQU :0000 PARITY STANDARDIZATION (7-BIT) CRETURN EQU :0D;PARITY CARRAIGE RETURN LF EQU :0A LINE FEED FF EQU :0C FORM FEED NUMTYPES EQU 6 * O4:BLL EQU 1 O4:BWD EQU 2 O4:LPP EQU 5 O4:WHL EQU 3 END R LENGTH TITL OUTWORD, OUTBYTE * THIS ROUTINE WILL OUTPUT ONE BYTE OR WORD TO THE BO * FILE. ENTRY: JSK OUTWORD (REG A CONTAINS WORD TO BE OUTPUT) * ERROR RETURN (ERROR CODE IN X) * NORMAL RETURN (ALL REGS PRESERVED) * NAM OUTBYTE,OUTWORD EXTR O:IO OUTBYTE EQU $ PUSH :0040 JMP OUTW05 OUTWORD EQU $ PUSH :0040 ROTATE A,L,8 OUTPUT LEFT BYTE FIRST COPY =BO,X WRITE TO FILE BO JSK O:IO JNE X,OUTW10 ROTATE A,L,8 OUTPUT RIGHT BYTE OUTW05 EQU $ COPY =BO,X JSK O:IO JNE X,OUTW10 COPY K,Y INDEX STACK IMS STACKRTN(Y) NORMAL RETURN JMP OUTW20 OUTW10 EQU $ COPY K,Y INDEX STACK COPY X,STACKX(Y) RETURN ERROR CODE OUTW20 EQU $ POP RSK END ERROR CODE IN X) * NORMAL RETURN (ALL REGS PRESERVED) * NAM OUTBYTE,OUTWORD EXTR O:IO OUTBYTE EQU $ PUSH :0040 JMP OUTW05 OUTWORD EQU $ PUSH :0040 ROTATE A,L,8 OUTPUT LEFT BYTE FIRST COPY =BO,X WRITE TO FILE BO JSK O:IO JNE X,OUTW10 ROTATE A,L,8 OUTPUT RIGHT BYTE OUTW05 EQU $ COP TITL OL:END NAM OL:END * THIS MODULE MARKS THE END OF LAMBDA4. IT SHOULD * BE THE LAST MODULE IN THE LAST LIBRARY FROM * WHICH LAMBDA4 IS LINKED. OL:END EQU $ WORD 0 END 7603010001367576030100013725  TITL WTC * * OUTPUT CURRENT TYPE CODE BYTE TO BO * NAM WTC EXTR OUTBYTE,FLUSH * WTC EQU $ PUSH :0040 JSK FLUSH FLUSH ASSEMBLY BUFFER JMP WTC10 COPY TYPECODE(Y),A JSK OUTBYTE WRITE BYTE TO BO JMP WTC10 ERROR RETURN COPY K,Y INDEX STACK IMS STACKRTN(Y) NORMAL RETURN JMP WTC20 * WTC10 EQU $ * COPY K,Y INDEX STACK COPY X,STACKX(Y) ERROR CODE * WTC20 EQU $ POP RSK  END 7603010029317576030100293225 TITL WREF NAM WREF * ORG ABS OR REL AT EACH ADDRESS STORED IN THE REFERENCE * BLOCK ASSOCIATED WITH EACH CHAIN HEAD OR EXTERNAL. * PUT DATA DEFINED BY THE SYMBOL AT THAT ADDRESS. * ENTRY: REG X CONTAINS ADDRESS OF SYMBOL TABLE EN TRY * TCFLAGS CONTAINS ABS/REL FLAG FOR SYMBOL DEFINITION * * JSK WREF * ERROR RETURN (REG X HAS ERROR CODE) * NORMAL RETURN * EXTR WDATA,OUTBYTE,OUTWORD,FLUSH WREF EQU $ PUSH :0040 * * STORE DEFINITION ADDRESS IN TEMP LOCATION * COPY DEFADR(X),A GET DEFINITION ADDRESS FROM SYM TAB COPY A,TEMP01(Y) STORE TEMP COPY REFADR(X),X LOAD REFERENCE BLOCK ADDRESS * WREF10 EQU $ * * IF ADDRESS IS ZERO, RETURN * JEQ X,WREF80 * * OTHERWISE, LOAD INDEX WORD AND ISOLATE INDEX * COPY RINDX(X),Q SHIFT Q,RO,12 * * IF INDEX IS END OF BLOCK, TRY NEXT REFERENCE BLOCK * WREF20 EQU $ * ADD =1,Q CLSN Q,=RINDX JMP WREF50 * * PROCESS ONE REFERENCE ADDRESS HERE. FIRST * ORG REL OR ABS AT ADDRESS * JSK FLUSH FLUSH OUTPUT BUFFER BEFORE WRITING TO BO JMP WREF90 * COPY RINDX(X),A GET ABS/REL FLAGS SHIFT Q,LO,4 SHIFT INDEX TO K4 FIELD XNX Q TEST BIT 'INDEX' TBIT 0,A INDEX THIS INSTR. WITH REG Q JT OV,WREF40 COPY =TCORGR,A PICK UP ORG REL JMP WREF42 * WREF40 EQU $ COPY =TCORGA,A PICK ORG ABS * WREF42 EQU $ JSK OUTBYTE WRITE TO BO JMP WREF90 ERROR RETURN * * OUTPUT ADDRESS * SHIFT Q,RO,4 SHIFT Q TO D6 FIELD XNX Q LOAD ADDRESS FROM REFERENCE BLOCK 'INDEX' COPY 0(X),A THIS INSTRUCTION INDEXED BY REG Q JSK OUTWORD WRITE TO BO JMP WREF90 ERROR EXIT * * WRITE THE SYMBOL DEFINITION * COPY TEMP01(Y),A GET DEFINITION FROM TEMP JSK WDATA WRITE TO BO JMP WREF90 ERROR EXIT JMP WREF20 * WREF50 EQU $ COPY RLINK(X),X JMP WREF10 * WREF80 EQU $ COPY K,Y INDEX STACK IMS STACKRTN(Y) NORMAL RETURN JMP WREF100 * WREF90 EQU $ COPY K,Y COPY X,STACKX(Y) * WREF100 EQU $ POP RSK END Q,RO,4 SHIFT Q TO D6 FIELD XNX Q LOAD ADDRESS FROM REFERENCE BLOCK 'INDEX' COPY 0(X), TITL WDATA NAM WDATA EXTR FLUSH * WDATA EQU $ PUSH :0040 COPY A,X SAVE DATA ITEM FOR A WHILE COPY TCFLAGS(Y),A LOAD ABS/REL INFO TBIT ABS,A JT OV,WDATA10 COPY =TCTRLW,A LOAD REL TC JMP WDATA12 * WDATA10 EQU $ COPY =TCTAB,A LOAD ABS TC * WDATA12 EQU $ CSK A,DATATC(Y) THIS TC SAME AS LAST? JMP WDATA15 NO JMP WDATA15 NO COPY DATACT(Y),Q YES,LOAD WORD COUNT CSK Q,=BUFSIZ COMPARE WORD COUNT WITH MAX SIZE JMP WDATA20 LESS THAN MAX NOP GREATER THAN MAX * WDATA15 EQU $ JSK FLUSH EQUAL TO MAX, FLUSH BUFFER JMP WDATA90 COPY A,DATATC(Y) INIT NEW TYPE CODE IMS DATACT(Y) SET COUNT TO 1 COPY =0,A COPY A,*BUFADR(Y) SET TC RECORD WORD COUNT TO 0 * WDATA20 EQU $ COPY X,A RESTORE DATA ITEM IMS *BUFADR(Y) INCREMENT WORD COUNT IN TC RECORD COPY DATACT(Y),X LOAD BUFFER INDEX IMS DATACT(Y) INCREMENT BUFFER INDEX COPY BUFADR(Y),Y INDEX OUTPUT BUFFER COPY A,0(X,Y) STORE DATA ITEM IN BUFFER * COPY K,Y INDEX STACK IMS STACKRTN(Y) NORMAL RETURN JMP WDATA100 * WDATA90 EQU $ COPY K,Y INDEX STACK COPY X,STACKX(Y) RETURN ERROR CODE * WDATA100 EQU $ POP RSK END IMS DATACT(Y) SET COUNT TO 1 COPY =0,A COPY A,*BUFADR(Y) SET TC RECORD WORD COUNT TO 0 * WDATA20 EQU $ COPY X,A RESTORE DATA ITEM IMS *BUFADR(Y) INCREMENT WORD COUNT IN TC RECORD COPY DATACT(Y),X LOAD BUFFER INDEX IMS DATACT(Y) INCREMENT BUFFER INDEX COPY BUFADR(Y),Y INDEX OUTPUT BUFFER COPY A,0(X,Y) STORE DATA ITEM IN BUFFER * COPY K,Y INDEX STACK IMS STACKRTN(Y) NORMAL RETURN JMP WDATA100 * WDATA90 EQU $ COPY K,Y INDEX STACK COPY X,  TITL WORD NAM WORG * WRITE ORG THE CURRENT PROGRAM COUNTER TO BO * * ENTRY: JSK WORG * ERROR RETURN * NORMAL RETURN * EXTR OUTBYTE,OUTWORD,FLUSH WORG EQU $ PUSH :0040 COPY SYSFLAGS(Y),A TBIT ABS,A JT OV,WORG10 COPY =TCORGR,A JMP WORG20 * WORG10 EQU $ COPY =TCORGA,A * WORG20 EQU $ CSK A,DATATC(Y) COMPARE WITH PREVIOUS TC JMP WORG30 NOT EQ JMP WORG30 NOT EQ * WORG25 EQU $ COPY *LOCATION(Y),A GET CURRENT PC COPY A,*BUFADR(Y) PUT IN OUTPUT BUFFER COPY K,Y INDEX STACK IMS STACKRTN(Y) NORMAL RETURN JMP WORG100 WORG30 EQU $ JSK FLUSH FLUSH OUTPUT BUFFER JMP WORG90 COPY A,DATATC(Y) INITIALIZE NEW TYPE CODE IMS DATACT(Y) SET BUFFER COUNT TO 1 JMP WORG25 WORG90 EQU $ COPY K,Y INDEX STACK COPY X,STACKX(Y) WORG100 EQU $ POP RSK END ORG10 EQU $ COPY =TCORGA,A * WORG20 EQU $ CSK A,DATATC(Y) COMPARE WITH PREVIOUS TC JMP WORG30 NOT EQ JMP WORG30 NOT EQ * WORG25 EQU $ COPY *LOCATION(Y),A GET CURRENT PC COPY A,*BUFADR(Y) PUT IN OUTPUT BUFFER COP TITL SAVREF TITL NAM SAVREF * STORE EXTERNAL OR CHAIN REFERENCE SOMEWHERE IN * SYMBOL TABLE. * * ENTRY: REG X CONTAINS ADDRESS OF SYMBOL TABLE ENTRY * JSK SAVREF * ERROR RETURN * NORMAL RETURN * EXTR GETBLOCK SAVREF EQU $ PUSH :0040 * CHECK FOR FIRST REFERENCE BLOCK, IF NONE EXISTS, * ALLOCATE ONE * COPY REFADR(X),Q GET REFERENCE BLOCK LINK JNE Q,SAV10 IF ZERO JSK GETBLOCK ALLOCATE NEW ONE JMP SAV90 ERROR IF NONE AVAILABLE COPY Q,REFADR(X) PUT NEW ADDRESS IN SYMBOL TABLE * SAV10 EQU $ * * SEARCH FOR THE LAST REFERENCE BLOCK * COPY Q,X INDEX REFERENCE BLOCK COPY RLINK(X),Q GET FUTHER LINK IF ANY JEQ Q,SAV20 LAST ENTRY? JMP SAV10 NO * SAV20 EQU $ * * IF INDEX TO NEXT ENTRY IS ZERO, REFERENCE BLOCK * IS FULL; ALLOCATE NEW BLOCK * COPY RINDX(X),Q GET WORD WITH INDEX SHIFT Q,RO,12 ISOLATE INDEX JNE Q,SAV30 ENTRY FULL JSK GETBLOCK ALLOCATE NEW BLOCK JMP SAV90 NONE AVAILABLE ERROR EXIT COPY Q,RLINK(X) STORE LINK TO NEW BLOCK IN PREVIOUS ONE COPY Q,X INDEX NEW BLOCK JMP SAV20 GET INDEX ASBEFORE * SAV30 EQU $ * * STORE CURRENT LOCATION COUNTER AT POINT INDICATED * BY INDEX, STORE CURRENT ABS/REL FLAG IN INDEX WORD, * UPDATE INDEX, RETURN * COPY *LOCATION(Y),A GET CURRENT PC XNX Q STORE ADDRESS, INDEXING SCHEME WITH QUESTIONABLE MERITS COPY A,0(X) DISPLACEMENT REPLACED WITH CONTENTS OF Q * SUB =1,Q DECREMENT INDEX SHIFT Q,LO,4 MOVE Q TO K4 FIELD * COPY SYSFLAGS(Y),A GET GLOBAL ABS/REL FLAG AND =1%ABS,A ISOLATE ABS/REL BIT SHIFT A,RO,ABS MOVE TO BIT 0 * * SHIFT ABS/REL TO BIT POSITION 'INDEX' * XNX Q EXECUTE LEFT SHIFT WORD :0E01 SHIFT LEFT SKELETON (SHIFT A,LO,?) * OR RINDX(X),A COMBINE WITH OLD FLAGS AND =:FFF,A REMOVE OLD INDEX * SHIFT Q,LO,8 MOVE INDEX TO FINAL POSITION OR Q,A COMBINE INDEX OR ABS/REL FLAGS COPY A,RINDX(X) STORE IN REFERENCE BLOCK * COPY K,Y INDEX STACK IMS STACKRTN(Y) NORMAL RETURN JMP SAV100 * SAV90 EQU $ COPY K,Y INDEX STACK COPY X,STACKX(Y) ERROR CODE TO X * SAV100 EQU $ POP RSK END T A,RO,ABS MOVE TO BIT 0 * * SHIFT ABS/REL TO BIT POSITION 'INDEX' * XNX Q EXECUTE LEFT SHIFT WORD :0E01 SHIFT LEFT SKELETON (SHIFT A,LO,?) * OR RINDX(X),A COMBINE WITH OLD FLAGS AND =:FFF ,A REMOVE OLD INDEX * SHIFT Q,LO,8 MOVE INDEX TO FINAL POSITION OR Q,A COMBINE INDEX OR ABS/REL FLAGS COPY A,RINDX(X) STORE IN REFERENCE BLOCK * COPY K,Y INDEX STACK IMS STACKRTN(Y) NORMAL RETURN JMP SAV100 * SAV90 EQU $ COPY K,Y INDEX STACK COPY X TITL PUSHSTK NAM PUSHSTK * * PUSH VALUE INTO LINKER STACK. TAKE TYPECODE FLAGS * AND PUSH INTO TYPE STACK. * *  ENTRY: REG A CONTAINS VALUE TO PUSH * JSK PUSHSTK * ERROR RETURN (STACK OVERFLOW) *  NORMAL RETURN * PUSHSTK EQU $ PUSH :0040 COPY STACKP(Y),X GET STACK POINTER COPY A,ASTACK(X,Y) STORE VALUE IN ADDRESS STACK COPY TCFLAGS(Y),A GET CURRENT TC CODE FLAGS COPY A,TSTACK(X,Y) STORE IN TYPE STACK IMS STACKP(Y) INCRMENT SP COPY K,Y INDEX STACK IMS STACKRTN(Y) NORMAL RTN POP RSK END NKER STACK. TAKE TYPECODE FLAGS * AND PUSH INTO TYPE STACK. * *  ENTRY: REG A CONTAINS VALUE TO PUSH * JSK PUSHSTK * ERROR RETURN (STACK OVERFLOW) *  NORMAL RETURN * PUSHSTK EQU $ PUSH :0040 COPY STACKP(Y),X GET STACK POINTER COPY A,ASTACK(X,Y) STORE VALUE IN ADDRESS STACK COPY TCFLAGS(Y),A GET CURRENT TC CODE FLAGS COPY A,TSTACK(X,Y) STORE IN TYPE STACK IMS STACKP(Y) INCRMENT SP COPY K,Y  TITL POPSTK NAM POPSTK * POP VALUE FROM LINKER STACK INTO REG A. PUT TYPECODE FLAGS * IN CURRENT TYPECODE WORD. * * ENTRY: JSK POPSTS * ERROR RETURN (STACK EMPTY) * NORMAL RERURN * EXIT: REG A CONTAINS VALUE FROM STACK * POPSTK EQU $ PUSH :0040 COPY STACKP(Y),X GET SP SUB =1,X DECREMENT SP COPY TSTACK(X,Y),A GET TYPE CODE FLAGS COPY A,TCFLAGS(Y) COPY ASTACK(X,Y),A GET VALUE FROM ADDRESS STACK COPY X,STACKP(Y) RESTORE SP COPY K,Y COPY A,STACKA(Y) RETURN PARAMETER IMS STACKRTN(Y) NORMAL RETURB POP RSK END T TYPECODE FLAGS * IN CURRENT TYPECODE WORD. * * ENTRY: JSK POPSTS * ERROR RETURN (STACK EMPTY) * NORMAL RERURN * EXIT: REG A CONTAINS VALUE FROM STACK * POPSTK EQU $ PUSH :0040 COPY STACKP(Y),X GET SP SUB =1,X DECREMENT SP COPY TSTACK(X,Y),A GET TYPE CODE FLAGS COPY A,TCFLAGS(Y) COPY ASTACK(X,Y),A GET VALUE FROM ADDRESS STACK COPY X,STACKP(Y) RESTORE SP COPY K,Y COPY /DE UF.SL:.OBJ /CO UF.SL:.OBJ=UF.SL:MAIN.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.L:FINDINDX.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.SL:FINDSYM.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.SL:LOADTEST.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.SL:STORESYM.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.SL:SAVREF.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.SL:CKMULT.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.SL:WREF.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.SL:WDATA.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.SL:WTC.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.SL:WORG.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.SL:GETBLOCK.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.SL:PUSHSTK.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.SL:POPSTK.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.SL:FLUSH.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.L:RELOCATE.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.L:READWORD.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.L:OUTWORD.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.L:B2AH.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.SL:OUTSYM.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.SL:HEADER.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.L:INITINDX.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.L:LINKINDX.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.L:G ETCHR.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.L:A2BIN.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.L:GETPARM.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.SL:EOFMSG.OBJ /LINK SL:=UF.SL:+UF.IOSD.OBJ+L:OL:END.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.L:READWORD.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.L:OUTWORD.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.L:B2AH.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.SL:OUTSYM.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.SL:HEADER.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.L:INITINDX.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.L:LINKINDX.OBJ /CO UF.SL:.OBJ=UF.SL:.OBJ+UF.L:G/CO XX=SL:MAIN /CO XX=L:LINKINDX /CO XX=L:INITINDX /CO XX=L:FINDINDX /CO XX=L:B2AH /CO XX=SL:CKMULT /CO XX=SL:GETBLOCK /CO XX=SL:OUTSYM /CO XX=SL:HEADER /CO XX=SL:FINDSYM /CO XX=SL:LOADTEST /CO XX=SL:FLUSH /CO XX=SL:STORESYM /CO XX=L:RELOCATE /CO XX=L:READWORD /CO XX=L:GETCHR /CO XX=L:CH2HEX /CO XX=SL:EOFMSG /CO XX=L:A2BIN /CO XX=L:GETPARM /CO XX=SL:DEF /CO XX=L:OUTWORD /CO XX=L:OL:END /CO XX=SL:WTC /CO XX=SL:WREF /CO XX=SL:WDATA /CO XX=SL:WORG /CO XX=SL:SAVREF /CO XX=SL:PUSHSTK /CO XX=SL:POPSTK /CO XX=SL:LINK /CO XX=SL:BACKUP /CO XX=SL:SOURCE /CO XX=IOSD.OBJ /CO XX=L:OL:END.OBJ /CO XX=SL:.OBJ /CO XX=SL:.BIN /CO XX=SL:.ASM /CO XX=SL:OUTSYM /CO XX=SL:HEADER /CO XX=SL:FINDSYM /CO XX=SL:LOADTEST /CO XX=SL:FLUSH /CO XX=SL:STORESYM /CO XX=L:RELOCATE /CO XX=L:READWORD /CO XX=L:GETCHR /CO XX=L:CH2HEX /CO XX=SL:EOFMSG /CO XX=L:A2BIN /CO XX=L:GETPARM /CO XX=SL:DEF /CO XX=L:OUTWORD /CO XX=L:OL:END /CO XX=SL:WTC /CO XX=SL:WREF /CO XX=SL:WDATA /CO XX=SL:WORG /CO XX=SL:SAVREF /CO XX=SL:PUSHSTK /CO XX=SL:POPSTK /CO XX=SL:L/DE UF.SL:.ASM /CO UF.SL:.ASM=UF.SL:MAIN. /CO UF.SL:.ASM=UF.SL:.ASM+UF.L:FINDINDX. /CO UF.SL:.ASM=UF.SL:.ASM+UF.SL:FINDSYM. /CO UF.SL:.ASM=UF.SL:.ASM+UF.SL:LOADTEST. /CO UF.SL:.ASM=UF.SL:.ASM+UF.SL:STORESYM. /CO UF.SL:.ASM=UF.SL:.ASM+UF.SL:SAVREF. /CO UF.SL:.ASM=UF.SL:.ASM+UF.SL:CKMULT. /CO UF.SL:.ASM=UF.SL:.ASM+UF.SL:WREF. /CO UF.SL:.ASM=UF.SL:.ASM+UF.SL:WDATA. /CO UF.SL:.ASM=UF.SL:.ASM+UF.SL:WTC. /CO UF.SL:.ASM=UF.SL:.ASM+UF.SL:WORG. /CO UF.SL:.ASM=UF.SL:.ASM+UF.SL:GETBLOCK. /CO UF.SL:.ASM=UF.SL:.ASM+UF.SL:PUSHSTK. /CO UF.SL:.ASM=UF.SL:.ASM+UF.SL:POPSTK. /CO UF.SL:.ASM=UF.SL:.ASM+UF.SL:FLUSH. /CO UF.SL:.ASM=UF.SL:.ASM+UF.L:RELOCATE. /CO UF.SL:.ASM=UF.SL:.ASM+UF.L:READWORD. /CO UF.SL:.ASM=UF.SL:.ASM+UF.L:OUTWORD. /CO UF.SL:.ASM=UF.SL:.ASM+UF.L:B2AH. /CO UF.SL:.ASM=UF.SL:.ASM+UF.SL:OUTSYM. /CO UF.SL:.ASM=UF.SL:.ASM+UF.SL:HEADER. /CO UF.SL:.ASM=UF.SL:.ASM+UF.L:INITINDX. /CO UF.SL:.ASM=UF.SL:.ASM+UF.L:LINKINDX. /CO UF.SL:.ASM=UF.SL:.ASM+UF.L:GETCHR. /CO UF.SL:.ASM=UF.SL:.ASM+UF.L:A2BIN. /CO UF.SL:.ASM=UF.SL:.ASM+UF.L:GETPARM. /CO UF.SL:.ASM=UF.SL:.ASM+UF.SL:EOFMSG. F.SL:.ASM=UF.SL:.ASM+UF.SL:FLUSH. /CO UF.SL:.ASM=UF.SL:.ASM+UF.L:RELOCATE. /CO UF.SL:.ASM=UF.SL:.ASM+UF.L:READWORD. /CO UF.SL:.ASM=UF.SL:.ASM+UF.L:OUTWORD. /CO UF.SL:.ASM=UF.SL:.ASM+UF.L:B2AH. /CO UF.SL:.ASM=UF.SL:.ASM+UF.SL:OUTSYM. /CO UF.SL:.ASM=UF.SL:.ASM+UF.SL:HEADER. /CO UF.SL:.ASM=UF.SL:.ASM+UF.L:INITINDX. /CO UF.SL:.ASM=UF.SL:.ASM+UF.L:LINKINDX. /CO UF.SL:.ASM=UF.SL:.ASM+UF.L:GETCHR. /CO UF.SL:.ASM=UF.SL:.ASM+UF.L:A2BIN. /CO UF.SL:.ASM=UF.SL:.ASJSTART: O:ISE O:SE JO:H2B O:ERFL O:CMD O0SEGMENT DATA o KFCTAB FB:SIZ LP:CTL KO:ERR O4:BEG O:UDEV KO:URD GETLU O:OPEN KO:CDEV O:IO ig C @`pB)1)1 @@JAk`pBc # ) p , ܀# g C @I )    E  N1@q   0`p)DBC\f8gC @f:g) ,ECg C @)c # M pQ  pĆDE  1)1 (_I C ™ DX3ǔl QǏJHPPEzttt tt kt >qHCE CCsT g1 ± , `@ , " Ƨ)Y1)TIk тU@V لWHN+kTj @`pF #) 3{gttCIttt:JO:DELE O:RNAM O0SEGMENT DATA o KO:ALOC O:AUXM O:SEOF KGETFL: FRE:BF GETLU KO:RETN O:UWR O:MOVE KO:AMAP O:URD O:SRCH KO:FDIR MO:DOPN ig C @E1 @ 6܃C  @ p `+IC @ p + pK pc c I pB Hătutt t ttt tg C @sEr1 o oD`I  @H@kT DUJC @FQCE c  ku HAkT @ąKBE@C @ H @@+kTc  1C @ Ck  @ c K   @i ABtt tttJO:UDEV O0SEGMENT DATA o KGETLU O:CLOS MO:DOPN ig C @`pDqM `E BB`piIABc # ttuJO:POS O0SEGMENT DATA o UKO:DOPN GET:SZ GT:3EX KRDDISC HALT:: O:MSG KGETLU O:CLOS O:IO KO:OPEN ig C @1kE D@ I6B @Ić)`p `pD BAơ`pD ΥQE I`pD B@D1F @1 D zDBBc # FEED ME() ttttttMMBttt tJIS:DU NO:DK O:D:RT JGET:DV O:CONN O:CDEV O0SEGMENT DATA o aKDCTAB O:IO O:CLOS KGETLU O:RETN MC:NOIO C:DISC O:DOPN ig)g C @ qS1G p `BC @E  A@C @`pJ1) Dgr)gH)HJg KN`pJEc  c # @6A sXM mg  # + T) # tttuutuPT TYPPTZtJO:MSG O:ERR O0SEGMENT DATA o kKDCTAB O:IO ifg C @.)8ˀ`pD 81H 'B@ @ D.1.1G '7+  D3O :B ByB9B ) c #  7) # I# **DE **PE  **SE @CFtI tg C @` @UM p@rp 1UF p@jk12`pDc # JO:BY2H O0SEGMENT DATA o ig .2` xꘀ@.2r` x @# 0123456789ABCDEF JGETLU O:IRTN O:RETN JO:IO O:CLOS O:OPEN O0SEGMENT DATA o MKLUTAB ig ,)C @@6 p GgC @qB EgC @F  g`pBBB g`pDc # g & A@ +T@ SA SO.@qF 1A B1 # # # tJO:REPL O:CREA O0SEGMENT  DATA o KO:RETN GETLU MO:DCRE O:DRPL O:DOPN igC @qB g C @q; EEEEttuuuJO:ISE O:SE O:H2B JO:ERFL O:CMD O0SEGMENT DATA o KLP:CTL O4:DBG O4:ASM KO4:LAM O4:EDT O::::: KO:ERR GETLU O:OPEN KO:CDEV O:IO ig C @`pB)1)1 @@JAk`pBc # ) p ,܀# g C @I )    E  N1@q   0`p)DBC\f8gC @f:g) ,ECg C @) c # M Q  pĆD³ Aò Eñ Lð Dï;@j] nZ5 1) 1 OI Cœ D H#Ǘl AǒJHP`t {tttttttt ttJO:POS O0SEGMENT DATA o 1KHALT:: O:MSG GETLU KO:CLOS O:IO O:OPEN ig C @1LAơ`pDΡ QE I`pDB @D1F @1 Dz DBBc # FEED ME() ttMM#ttttJCONLU MSGLU MSGDV JCONDV FB:SIZ FCTAB JDCTAB LUTAB O:BPTR JO:BLIM O4:WHL O4:BWD JO4:BLL O0SEGMENT DATA o =KO:XX O:DCRE O:DDLE KO:DRWD O:DIN O:DCLS KO:DOPN O:FDOU O:FDIN KFD:RST MF:RST O:MFOU KO:MFIN CR:IO MM:IO KMM:OPN O:XOPN O:XXOU KO:XXIN O:URWD O:UIN KO:UCLS O:UOPN O:LPOU KO:PTOU O:PTIN O:TXOU KO:TXIN O:TYOU O:TYIN ifg fg fg gg2gg2CIg  2 COSISOBI BO"2 LOSCUIUODIgTVtttttttttf2gTXtttttttttPRtttttttttPPtttttttttLPtttttttttCRttttt ttttDFtttttt tttDXt t tttt tttMMtttttttttDUttttttttt2:P 22(i:g :gbgJO:XX O:TRLR O:XXIN JO:XXOU O:URWD O0SEGMENT DATA o KO:IRTN O:RETN ifgIfgg )@6Ag HDTg# ttJO:PTOU O:PTIN O:TXOU JO:TXIN O:TYOU O:TYIN O0SEGMENT  DATA o *KPTPOUT PTRIN TPTOUT KTPTIN TTYOUT TTYIN igC @@ pc # gC @@c # ttgC @@ogC @@c # gC @@dgC @@c # ttttJO:LPOU O0SEGMENT DATA o KLPOUT  igC @@c # tJD:SETU O:FDIN O:FDOU O0SEGMENT DATA o KFD:RST FD:WRU FD:RDU ig C @@p`HB`HAc # gC @sg@`(# tttJO:MFOU O:MFIN O0SEGMENT DATA o KD:SETU MF:RST MF:WRU KMF:RDU ig C @@p`HB`HAc # gC @sttttJO:UIN O0SEGMENT  DATA o KO:LPOU O:IRTN O:RETN MO:BOUT O:BIN ifgXC uu  ܃1F D B܃C C @ăN U@C } yȞqr @܃URs Kj䃀@mC C _r  @j@ -`*@ v@ c  `6D肀@r 肀@H ă)c  C } {}  W _`p@`p@ # _#  r p XDD D D C)t t ܃A   - D D  _6 0w 1 s ܃ D H D L DL   ܅ C@  UBD} Dt L pqD LiL gDDDDltJO:BIN O0SEGMENT DATA o -KO:RETN O:IRTN ig ܃C |  CrC8@ă@X  EC★T@ r@XCrCi@ i `ttJO:BFLS O:BOUT O0SEGMENT DATA o UKO:RETN ig k`Jn 6Cr肘@@@ g C @܃c i# D rDD@UGr DUCD4 DrD  DDDDaBC @ @@8 UJ@. UE@. t r% pc # tJC:NOIO RDDISC GET:SZ JO:UCLS O:XOPN O:UOPN JO:UCRE O:DCLS O:DOPN JO:DRPL O:DCRE C:DISC O0SEGMENT DATA o qKO:FDIR O:SRCH GT:3EX KO:MOVE O:ALOC O:AMAP KDATE:: O:UWR O:URD KO:SEOF O:AUXM FRE:BF KGET:BF IS:DU O:D:RT KGET:DV O:RETN O:TRLR KO:IO GET:FN GET:FC MO:BFLS ig  r)`p U`pJE c qnB) 3 0 xAIĐ .A Ʉ  ҠA) .lA B Ac # `pD{`pCC# g r Drr U `pEc q)B pIЄ @ANĐI+AQtttt t ttt tfngg 1 o@NyN2tLsLq g 1A{_IĄwg g  @6O tABhttt g @6A G@`(OL Bqqim: aNBȆNąR r ԞnkC @I) `pDGc  ž\H@k@I܆ PT@܅mt "I`(+ `A @@ HAk Tj eDICkI`(+  I`( g C @GEC`pB `pFc # SA@ȏ ď@ I6C @Ić\D`p@# gD``JK# ttttttg 1@6܃B AfWg 1/ ALL Dw}t t t tutJO:DRWD O:DDLE O0SEGMENT DATA o KO:RETN ifgfg !tJDATE:: O0SEGMENT DATA o igOM780803164100JGNX:AU O:UWR O:URD JO:AUXM O:DIN O0SEGMENT DATA o KC:DISC ALC:EX GT:3EX KO:IRTN O:RETN iifgXC  JH JJ H  } ܃C  @c n 6Cq 肴@@ g hC @ pDc # g u܇# ܆# p )ttt IIl ܃ `pDn 6D肀@r 肀@QA}  Ē THă`pBBBc #  !SАؐ֍ؐА# g yC @ pCc # g C @ܐ s@ ȓ@@ ȕ@ @ȗ@ c # >O`pFc # c !# ?tJO:POS O0SEGMENT DATA o UKO:DOPN GET:SZ GT:3EX KRDDISC HALT:: O:MSG KGETLU O:CLOS O:IO KO:OPEN ig C @1kE D@ I6B @Ić)`p `pD BAơ`pD ΥQE I`pD B@D1F @1 D zDBBc # FEED ME() ttttttMMBttt tJO:SRCH O0SEGMENT DATA o BKGET:SZ RDDISC ig @AąĆE @VAӀB C̀DʀEǀ FĀGjqK hkk܅\/`x @`x# # Oph@w N # ttJO:FDIR O0SEGMENT DATA o KRDDISC ig IkIďK# `p@# tJO:SEOF O0SEGMENT DATA o kKO:ALOC RD:MAP O:AMAP KGNX:AU O:URD O:UWR KGET:SZ ifg ߀JK ڀ# HՄ@k TD@AąC @E @)EIFÞc  kC @tH㸀@ @ kTc HC @ @+kTc C @ @@+kTc #  F@ EFF@ Jc k܅<#  c # ttttt?ttJRD:MAP O0SEGMENT DATA o KO:URD ig IkIKE# tJO:A MAP O0SEGMENT DATA o !i gJGT:3EX O0SEGMENT DATA o (ig C @D`O CLCI Cc #  c # DkDܑ:# JFRE:BF GET:BF GET:FC O0SEGMENT  DATA o OKO:BLIM O:BPTR FCTAB KFB:SIZ O:RETN ig BFT p BA# g ĄN @b@ӌ `@@B# p tttttg N Q_Ą@b@(@ +k@(pxwjA@ BFB`܅w^\ # JGET:FN O0SEGMENT DATA o ZKO:IO O:ERR ig C @` Hr Tr1A . JTc # QCT rU91  Qc # 1 x,) c # )1 C @`p Z 0 ; @ Fc # Hkk# p # ttJALC:EX O0SEGMENT DATA o FKO:ALOC O:URD O:UWR KGNX:AU O:AMAP RD:MAP ig C @󻀐  `pBCc ē  D`D QjDQ=EF # # IC @`pC Dc #  ~c N Q  # tt?ttttJGETFL: O:ALOC O0SEGMENT DATA o KKO:AMAP ig C @`pQQD @6PD D3c # BĀC DBFc # BC*1Q  GB+ B @ 62 !CDD]DBC  @ *1 :BĀ+ Bqg )1.9# tJTPTOUT TTYOUT TPTIN JTTYIN PTPOUT PTRIN O0SEGMENT DATA o KHALT:: igg # B# A@?6# A`p @XE# B# A@6 @68N@O6# pbg @6@6@@eWg S@6# A@6#  # B# B#   # AN 6AN @/6# A XL# L# L# v@@@Ɵg7Wg œSC@6R0–@@ @ @@ƐH6AHC @@ rA@?c kT:t p TURN ON P UNCH, PRESS INT AT  IDLE TURN OFF PUNCH, PRESS INT JLPOUT O0SEGMENT DATA o <KLP:CTL ig C @´# B# #  AYL자# AYLޞu ¤# B¢# BϠ QP # AYLz  c # TS Qx -M-KItJLP:CTL O0SEGMENT DATA o igJCR:IO O0SEGMENT DATA o {KO:IRTN iiPc ) g ` CC @C A # # O6, ʞ x.žJNK  Ђ䖔Aᐄ ߐަޢ0 A #  t @0@I} # c ) C r r0   ЂA # !81BYT^ ؆Ur@+ P@@+kޚsD@c  C+B. 6Ar>:c )>E "9@9X  C XC  # # Œ `H. 6A.r8 `p@`@# 0 01 !`a @APQpq     123 456789:#@'="&ABCDEFG HI`.<(+|-JKLMNOPQR!$ *);~0/STUVWXYZ,%_>? abcdefghi^jkl mnopqr stuvwx yz\{}[] JFD:RST FD:WRU FD:RDU O0SEGMENT DATA o ii g g nC @n`i`l gH e Ib^ \`@@X QH X QHX QE ML pc # ECA@ @B @d # B# };X# g C @ +nx)I @&'I$gH!dG JMF:CTL MF:CLR MF:IO JMF:RST MF:WRU MF:RDU O0SEGMENT DATA o i g C @# A@6‘# B ˆӈUP W pww wc C @L1| n n # @6cc # g g C @C @I I I I y@6Pc ` p+ pN L L p c # p+sgg# B# A@6<# g # n`# e`9 #  # x`B# b#  # a`@xAlK`pCD H @r# @#  kT# r@# @ @@kT p䄀 :# JMM:IO MM:OPN O0SEGMENT DATA o :KGET:FC O:IRTN O:RETN ifg @6C  ą ttfg ܆܃j HA. 6Ar 6 @ ) @A )) tJO:PAD O:MOVE O0SEGMENT DATA o ig C @`UD@k4c B# gJ QC+T# JHALT:: O0SEGMENT DATA o ig C @„   c # Fӂ# JLENBF1 BOOTF1 O0SEGMENT DATA o (ifg    @0{{ )u1A|sl)n  " }gA `f(gJLENBF2 BOOTF2 O0SEGMENT DATA o ifg  OS:: S YS@A # * @0Pp lipߢ+k ep`jHC C G TqDV+ޱn ޻f)3$  D@K*# B# }¬ X# –@A L螄)"$ C  &Ί$j"؞hq   C @hsn g k t Ihd`abb2QQ ^ Y,Y)VV  Q$QC)D$ O  c # IGEH F` "986z3 20| `nr g# "# $ 6!+ +,(k&lϞ A@17 ! )  . 6A.r8(Z)3fgJCHANNEL:LENBX1 BOOTX1 O0SEGMENT DATA  o =ifg @0)P 1* pI @6<g iIŸI Nc Bc A@6<# c B # ސIhHc rc  ކT#  f=gJLENBX2 BOOTX2 O0SEGMENT DATA o ifg  OS:: S YS* @0Px vip+k p`jHC C G TqM @A# +e ])3$  IDCI¿ ޽ LƺL޷I‡ # B# A@6<# H#  r# ޷T#  # B# ~Ά  @AL螄)"$  C jh qC @z`n xkvsh)@6^B tc # " GF޼zEA@޶| ? `nrg# )D )K# 6 [[%CklϞm :A@17 !MKJ5 ).އ. 6A.r8(ZfgPx vip+k p`jHC C G TqM @A# +e ])3$  IDCI¿ ޽ LƺL޷I‡ # B# A@6<# H#  INED. * ENTRY: JSK A2BIN * ERROR RETURN (I/O OR NON HEX ) * NORMAL RETURN (A=BINARY NUMBER) NAM A2BIN EXTR O:H2B A2BIN EQU $ PUSH :0040 SAVE REGISTERS COPY K,Y INDEX STACK JSK O:H2B READ AND CONVERT BINARY JNE X,A2BIN040 I/O ERROR OR OVERFLOW CLSN A,=CRETURN FINISHED JMP A2BIN050 YES A2BIN030 EQU $ COPY =E:SE,X SYNTAX ERROR A2BIN040 EQU $ COPY X,STACKX(Y) RETURN ERROR CODE POP RSK A2BIN050 EQU $ COPY Q,STACKA(Y) RETURN RESULT IN A IMS STACKRTN(Y)  POP RSK END TITL GETPARM * THIS ROUTINE WILL READ A STRING OF CHARACTERS * FROM THE CI FILE AND STORE THEM IN THE BUFFER * PROVIDED. UP TO 8 CHARACTERS ARE ACCEPTED. CR * OR ',' ARE LEGAL DELIMITERS. THE DELIMITER *  FOUND IN RETURNED IN THE A REGISTER. THE INPUT * BUFFER IS FILLED TO BLANKS BEFORE INPUT. * ENTRY: X= ADDRESS OF INPUT BUFFER * JSK GETPARM * ERROR RETURN (CODE IN X REG) * NORMAL RETURN (DELIMITER IN A REG) NAM GETPARM EXTR GETCHR,O4:BLL GETPARM EQU $ PUSH :0040 SAVE REGS COPY O4:BLL,A GET LOWER END OF WORK AREA CSM X,A COMPARE WITH NEW ENTRY ADDRESS JMP GETPAR07 ERROR IF TABLE LT O4:BLL NOP COPY X,Y BUFFER ADDRESS IN Y COPY =' ',A BLANKS TO A COPY =3,X FOUR WORD BUFFER GETPAR01 EQU $ COPY A,0(X,Y) BLANK BUFFER JNED X,GETPAR01 NEXT WORD XOR A,A CLEAR INPUT REGISTER XOR X,X CLEAR INDEX TO BUFFER GETPAR02 EQU $ JSK GETCHR READ NEXT CHARACTER JMP GETPAR06 ERROR EXIT CLSN A,=',' END OF PARAMETER IF COMMA JMP GETPAR04 NORMAL RETURN CLSN A,=CRETURN END OF PARAMETER IF CR JMP GETPAR04 NORMAL RETURN SBIT BM,S ENTER BYTE MODE COPYB A,0(X,Y) STORE CHARACTER IN BUFFER RBIT BM,S LEAVE BYTE MODE CLSN X,=8 TEST FOR OVER 9 CHARACTERS INPUT JMP GETPAR05 YES, SYNTAX ERROR IJNE X,GETPAR02 NO, GET NEXT CHARACTER GETPAR04 EQU $ COPY K,Y ADDRESS STACK COPY A,STACKA(Y) RETURN DELIMETER FOUND IMS STACKRTN(Y) INCREMENT TO NORMAL RETURN POP RESTORE REGISTERS RSK GETPAR05 EQU $ COPY =E:SE,X SYNTAX ERROR GETPAR06 EQU $ COPY K,Y ADDRESS STACK COPY X,STACKX(Y) ERROR CODE IN X POP RESTORE OTHER REGS RSK GETPAR07 EQU $ COPY =E:SO,X JMP GETPAR06 REPORT SYMBOL TABLE OVERFLOW END TITL EOFMSG * THIS ROUTINE WILL WRITE THE END OF FILE MESSAGE * TO THE LO FILE. THIS MESSAGE CONSISTS OF THE * NEXT STARTING ADDRESS OF THE PROGRAM AND DATA * SEGMENTS, THIS LAST ENTERED EXECUTION ADDRESS, AND * THE COUNT OF UNRESOLVED EXTERNALS. * ENTRY: JSK EOFMSG * ERROR RETURN (ERROR CODE IN X) * NORMAL RETURN (ALL REGISTERS PRESERVED) NAM EOFMSG EXTR O:IO,O:MSG,BLANKS EXTR FINDSYM,B2AH EXTR OL:END EOFMSG EQU $ PUSH :0040 SAVE REGISTERS JSK BLANKS OUTPUT LEADING BLANKS JMP EOFMSG60 ERROR EXIT COPY =PROG,X GET NAME OF PROGRAM SEGMENT JSK SEGMSG OUTPUT ASSOCIATED MESSAGE JNE X,EOFMSG60 ERROR EXIT COPY =DATA,X GET NAME OF DATA SEGMENT JSK SEGMSG JNE X,EOFMSG60 ERROR EXIT COPY =EX,X GET ADDRESS OF TA PREFIX COPY =LO,Q COPY =4,A MESSAGE LENGTH JSK O:MSG OUTPUT PREFIX JNE X,EOFMSG60 COPY ENDADR(Y),Q GET LAST TRANSFER ADDRESS JSK B2AH CONVERT TO ASCII AND OUTPUT JMP EOFMSG60 ERROR EXIT JSK BLANKS SEPARATE WITH BLANKS JMP EOFMSG60 ERROR EXIT COPY =UE,X GET ADDRESS OF PREFIX COPY =LO,Q COPY =4,A MESSAGE LENGTH JSK O:MSG WRITE PREFIX JNE X,EOFMSG60 CHECK ERROR STATUS JSK UECOUNT COUNT UNRESOLVED EXTERNALS JSK B2AH OUTPUT JMP EOFMSG60 ERROR EXIT JSK BLANKS SEPARATE WITH BLANKS JMP EOFMSG60 ERROR EXIT COPY ='(',A COPY =LO,X JSK O:IO OUTPUT LEFT PAREN FOR LAMBDA LIMITS JNE X,EOFMSG60 COPY SYMTABND(Y),Q GET LAMBDA LOW ADDRESS JSK B2AH OUTPUT JMP EOFMSG60 ERROR EXIT COPY ='-',A COPY =LO,X JSK O:IO OUTPUT DASH BETWEEN LIMITS JNE X,EOFM SG60 COPY =OL:END,Q GET TOP OF LAMBDA JSK B2AH OUTPUT JMP EOFMSG60 ERROR EXIT COPY =')',A COPY =LO,X JSK O:IO OUTPUT RIGHT PAREN AFTER LAMBDA LIMITS JNE X,EOFMSG60 COPY =CRETURN,A COPY =LO,X JSK O:IO OUTPUT CR AT END OF LINE JNE X,EOFMSG60 COPY K,Y INDEX STACK IMS STACKRTN(Y) NORMAL RETURN JMP EOFMSG70 EOFMSG60 EQU $ COPY K,Y COPY X,STACKX(Y) EOFMSG70 EQU $ POP RSK RETURN TITL SEGMSG SEGMSG EQU $ COPY X,TEMP01(Y) PREPARE ADDRESS FOR FINDSYM ADD =SYMLNG,X ADDRESS PREFIX MESSAGE COPY =LO,Q COPY =4,A MESSAGE LENGTH JSK O:MSG OUTPUT PREFIX MESSAGE JNE X,SEGMSG20 CHECK IO ERROR JSK FINDSYM FIND SEGMENT ENTRY COPY REFADR(X),Q GET RELOCATION VALUE ADD DEFADR(X),Q ADD SEGMENT LENGTH JSK B2AH OUTPUT NEXT AVAILABLE ADDRESS JMP SEGMSG20 ERROR EXIT JSK BLANKS OUTPUT TRAILING BLANKS JMP SEGMSG20 XOR X,X CLEAR ERROR INDICATOR RSK RETURN SEGMSG20 EQU $ RSK RETURN WITH ERROR STILL IN X * * TITL CONSTANT AREA PROG EQU $ BYTE ' ' WORD 0,0,0 WORD 1%SEGMENT BYTE 'RP= ' DATA EQU $ BYTE 'DATA ' WORD 0,0,0 WORD 1%SEGMENT BYTE 'RD= ' EX EQU $ BYTE 'EX= ' UE EQU $ BYTE 'UE= ' * * TITL UECOUNT RS MASK RESOLVED,SEGMENT,REFER * UECOUNT EQU $ PUSH :0040 COPY SYMCOUNT(Y),Q GET NO. SYMTAB ENTRIES COPY SYMTABEG(Y),X GET TABLE START  XOR Y,Y ZERO UE COUNT UECOUNT1 EQU $ JEQD Q,UECOUNT2 LAST ENTRY? COPY FLAGS(X),A NO, GET FLAGS FROM ENTRY SUB =SYMLNG,X MOVE TO NEXT ENTRY AND =RS,A DON'T COUNT SEGMENTS OR RESOLVED ENTRIES JNE A,UECOUNT1 IJNE Y,UECOUNT1 BUMP COUNT1 AND GO TO NEXT ENTRY UECOUNT2 EQU $ COPY K,X INDEX STACK COPY Y,STACKQ(X) RETURN COUNT IN Q POP RSK END JSK FINDSYM FIND SEGMENT ENTRY COPY REFADR(X),Q GET RELOCATION VALUE ADD DEFADR(X),Q ADD SEGMENT LENGTH JSK B2AH OUTPUT NEXT AVAILABLE ADDRESS JMP SEGMSG20 ER TITL SET DESIRED TCFLAG BITS MACRO MASK P:: SET 1 PX: SET #(?) M:: SET 0 MASK: #1,#2,#3,#4,#5,#6,#7,#8 #(-1) SET M:: ENDM MACRO MASK: IFT P::<=PX: M:: SET 1%#(P::)++M:: P:: SET P::+1 MASK: #1,#2,#3,#4,#5,#6,#7,#8 ENDC ENDM MACRO SPECIFY WORD #(1)%13++#(2) ENDM TITL EQUATES * TEMP CELL DEFINITIONS PC0 EQU 0 SEGMENT PC ARRAY FIRST ELEMENT LINECT EQU 21 ENDTC EQU 22 02 OR 03, LAST EX ADDRESS TYPE CHNHDS EQU 23 CHAIN HEAD POINTERS FOR SYMBOL TYPES RELOC EQU 29 CURRENT RELOCATION BIAS NXTBLK EQU 31 NEXT MEMORY ALLOCATION BLOCK START ADDRESS LOCATION EQU 32 CURRENT PC SYMTABEG EQU 34 SYMBOL TABLE BEG ADR SYMTABND EQU 35 SYMBOL TABLE END ADR SYMCOUNT EQU 36 NUMBER OIF SYMBOLS IN TABLE TYPECODE EQU 37 CURRENT TYPE CODE TCFLAGS EQU 38 CURRENT TYPE CODE FLAGS SYSFLAGS EQU 39 GENERAL SYSTEMS FLAGS DATATC EQU 40 TYPE CODE FOR OUTPUT ASSEMBLY BUFFER DATACT EQU 41 COUNT OF WORDS IN OUTPUT ASSEMBLY BUFFER ENDADR EQU 43 LAST OBTAINED EXECUTION ADR BUFADR EQU 44 ADDRESS OF ASSEMBLY OUTPUT BUFFER STACKP EQU 46 LINKER STACK POINTER ASTACK EQU 47 LINKER ADDRESS STACK TSTACK EQU 52 LINKER TYPE STACK TEMP01 EQU 59 TEMP02 EQU  60 TEMP CELL TEMP03 EQU 61 TEMP CELL TEMP04 EQU 62 TEMP CELL TEMP05 EQU 63  TEMP CELL * TYPE CODE DEFINITIONS TCENDA EQU :02 TCENDR EQU :03 TCORGA EQU :04 TCORGR EQU :05  TCTAB EQU :06 TCTRLW EQU :07 TCRESF EQU :08 TCBRLW EQU :09 TCBGIN EQU :18 TCNULL EQU :40 TCENTP  EQU :4A TCEXTP EQU :4B TCENTS EQU :4C TCEXTS EQU :4D TCCHNP EQU :4E TCSGMT EQU :4F TCINTR EQU  :64 TCZOP EQU :66 TCDENP EQU :67 TCDENS EQU :68 TCLOC EQU :69 TCNCHP EQU :6B TCHCHP EQU :6C TCNOTE EQU :6D TCSGML EQU :6F TCTEXP EQU :74 TCTEXS EQU :75 * TCFLAGS BIT EQUATES SEGMENT EQU 0 CHAIN EQU 1 SEXT EQU 2 EXTR EQU 3 SNAM EQU 4 NAM EQU 5 WDCNT EQU 12 RESOLVED EQU 10 REFER EQU 8 MULTIPLE EQU 7 ABS EQU 6 REL EQU 7 OFFSET EQU 9 FIXED EQU 9 NXTBY EQU 10 NXTWD EQU 11 * SYMBOL TABLE ENTRY EQUATES SYMWORD1 EQU 0 SYMWORD2 EQU 1 SYMWORD3 EQU 2 SYMWORD4 EQU 3 DEFADR EQU 4 REFADR EQU 5 FLAGS EQU 7 INDEX EQU 6 SYMLNG EQU 8 * REFERENCE BLOCK EQUATES RINDX EQU 7 RLINK EQU 0 * SYSTEM GLOBAL FLAGS LOAD EQU 2 ULOAD EQU 3 ZOPFLAG EQU 4 *  BIT MASK EQUATES TYPEMASK MASK SEGMENT,CHAIN,SEXT,EXTR,SNAM,NAM * GENERAL USAGE EQUATES CI EQU 0 BO EQU 5 CO  EQU 1 BI EQU 4 LO EQU 6 CY EQU 0 BM EQU 2 NONE EQU 0 STACKL EQU 0 STACKS EQU 1 STACKA EQU  2 STACKQ EQU 3 STACKX EQU 4 STACKY EQU 5 STACKRTN EQU 6 STACKSZE EQU :80 SIZE OF USER STACK BUFSIZ EQU 255 OUTPUT ASSEMBLY BUFFER LENGTH E:EOF EQU :0001 EOF ERROR CODE E:SE EQU :0020 SYNTAX ERROR CODE E:AE1 EQU :0014 ADDRESS IN LOADER E:AE2 EQU :0018 OUT OF ADDRESS SPACE E:AE3 EQU :0019 ADDRESS IN ROM OR NO MEMORY E:SO EQU :0013 E:TC EQU :8015 TYPE CODE ERROR CODE PARITY EQU :0000 PARITY STANDARDIZATION (7-BIT) CRETURN EQU :0D;PARITY CARRAIGE RETURN LF EQU :0A LINE FEED FF EQU :0C FORM FEED NUMTYPES EQU 6 * O4:BLL EQU 1 O4:BWD EQU 2 O4:LPP EQU 5 O4:WHL EQU 3 END R LENGTH E:EOF EQU :0001 EOF ERROR CODE E:SE EQU :0020 SYNTAX ERRmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmk mkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmk  mkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmk! mkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmk" mkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmk# mkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmk$ mkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmk% mkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmk& mkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmke; 781129125218781129125218781129125218e@781129125218781129125218781129125218e:' 781129125218781129125218781129125218e781129125218781129125218781129125218781129125218781129125218781129125218e3d7811291256507578112912570325 e77811291257075078112912571000 e97811291257140078112912571575  e:R7811291257200078112912572250 (  e<7811291257265078112912572900  e?7811291257330078112912573525  eA7811291257392578112912574175  eC7811291257457578112912574900 eH7811291257530078112912575550 eJ7811291257595078112912580250 eO) :7811291258065078112912580950 eR7811291258137578112912581600 eT'7811291258200078112912582300 eX7811291258270078112912582950 e[#7811291258337578112912583650 e_7811291258405078112912584275 ea7811291258467578112912584925 * ec 7811291258532578112912585650 ej7811291259005078112912590275 el7811291259067578112912590950 e 7603010001417576030100014500 ew7811291259210078112912592325 ey7811291259272578112912592925 ez+ 7811291259332578112912593525 e{7811291259397578112912594250 e<7811291259467578112912594925  e%7811291259532578112912595550 !e97811291259595078112913000275 "e77811291300067578112913000925 #eK7811291300130078112913001525 , $e7811291300192578112913002175 %ew7811291300257578112913002850 &e87811291300325078112913003525 'e ?>7811291300392578112913004825 (e@G7811291300522578112913005425 )eA 7811291300582578112913010300 *eN- )7811291301070078112913011375 +ecd ]7811291301180078112913014550 . / 0 . SL:MAIN L:LINKINDX L:INITINDX L:FINDINDX L:B2AH SL:CKMULT SL:GETBLOCK  SL:OUTSYM SL:HEADER SL:FINDSYM SL:LOADTEST SL:FLUSH SL:STORESYM L:RELOCATE L:READWORD L:GETCHR L:CH2HEX SL:EOFMSG L:A2BIN L:GETPARM SL:DEF L:OUTWORD L:OL:END SL:WTC SL:WREF SL:WDATA SL:WORG !SL:SAVREF "SL:PUSHSTK #SL:POPSTK $SL:LINK %SL:BACKUP &SL:SOURCE 'IOSD OBJ(L:OL:END OBJ)SL: OBJ*SL: BIN+SL: ASM1 JOL:END O0SEGMENT DATA o ifgG7603010002217576030100022225 JOL:ENT O4:ENT O4:BEG O0SEGMENT DATA o KFLUSH CKMULT POPSTK KPUSHSTK SAVREF WORG KWREF WTC WDATA KOUTWORD OUTBYTE EOFMSG KO:MSG GETCHR OUTSYM KA2BIN GETPARM INITINDXKLINKINDXREADBYTEREADWORDKRELOCATESTORESYMLOADTESTKFINDSYM FINDINDXO:OPEN KO:CLOS O:IO O:ERFL KO:CDEV O:CMD ifgfgfg 0 `j p P )?@E5k l bc VI 1A ? +Q@Q{)1A{DnLMFRTUSO2,0@t t*t ,urHU U Dl@E—f  ddbUL6G6E6BU*s1t t I ,Lcć|{ ՟C ,Aџ>Є @6@|@ć{c|dd g@=g@<g A( 1A# )1 IM ,_  AdbULf6F 6D *sVk)tt.t 2t tttttt , m1A  )g1A f e ʟ_Ąef Q@L+vf@6 @6eLJL g@/6Mf@6€y@ 6@U|0tt> z"V) `o>) e ,)ztttt  @  @ @   @J hKdLMDN$BOdfghik&l&^m-tf^uF^o7 H@ ߞkeV ٞ`fX@g m@'g Ƞg@Ǟɞ O6 ƞ`T `` g@O6 Ag?6B- ,g)@|c{ f?T{c|ddtt20.tttt tttt qg@Lgmp`g@O 6@Mgff X@GY@@bK` X]PSfmg X@G`E`@@AT;ttttt @G+A5}` ~ U*}m,6Ȁ ~!"_~ __}~WcS` t )@|c{ f?T: J 2 5)@lg@/6{c|ddt2ttt0 OMEGA LINK (B0) JFINDINDXO0SEGMENT DATA o ifg C @f.ɠ1CD| `pF*`pDc # JFINDSYM O0SEGMENT DATA o %ifg C @db{+*UQ@ ABC G`pE{ {|`pDc # JLOADTESTO0SEGMENT DATA o ifg C @g@/6I@?6E?66B@,gc # JSTORESYMO0SEGMENT DATA o KREADWORDifg C @f{`& % DEGF,4`pF)`pDc # tJSAVREF O0SEGMENT DATA o +KGETBLOCKifg C @Qą @QA |NQĀ @x` C JN1g@YC  NqG`pF`pDc # tJCKMULT O0SEGMENT DATA o ifg C @6C`pF|c # JWREF O0SEGMENT DATA o -KFLUSH OUTWORD OUTBYTE KWDATA ifg C @{1\NKL N1C 6B  N9C { hc`pF`pDc # ttttJWDATA O0SEGMENT DATA o $KFLUSH ifg C @ fo6B  h iMhi l liil`pF`pDc # tJWTC O0SEGMENT DATA o KFLUSH OUTBYTE ifg C @e`pF`pDc # ttJWORG O0SEGMENT DATA o KFLUSH ifg C @go6B  h `l`pFhiv`pDc # tJGETBLOCKO0SEGMENT DATA o ifg C @c   @ *cd`pCF`p)Dc # aJPUSHSTK O0SEGMENT DATA o ifg C @nfn`pFc # JPOPSTK O0SEGMENT DATA o ifg C @n*fn`pBFc # JFLUSH O0SEGMENT DATA o KOUTWORD OUTBYTE ifg C @hNi ih lUE+z`pF`pDc # ttJRELOCATEO0SEGMENT DATA o ifg C @]f@o6I@6B.6I {;VD`pBF`p)Dc # JREADBYTEREADWORDO0SEGMENT DATA o KO:IO ifgfg C @q)`p1FBDc # tJOUTWORD OUTBYTE O0SEGMENT DATA o KO:IO ifgC @fg C @r)1r)1`pF`pDc # tJB2AH O0SEGMENT DATA o KO:IO ifg C @iN2@ 7 )1u`pF`pDc # tJOUTSYM O0SEGMENT DATA o ?KHEADER B2AH BLANKS  KO:IO O:MSG ifg C @I`  1DG`?6 P )1`/6 S)1` 6 M)1`6 C) 1`o6 A)1) 1`pF`pDc # tttttJBLANKS O0SEGMENT DATA o KO:MSG ifg C @ I1`pF`pDc # tJHEADER O0SEGMENT DATA o @KO:MSG ifg C @U6C " I1ǀ U`p F`pDc # OMEGA L INK - UNDEFINED SYMB OLS OMEGA LINK -  DEFINED SYMBOLS +tJINITINDXO0SEGMENT DATA o ifg C @ %,4c # JLINKINDXO0SEGMENT DATA o ifg C @+f`k@B`|@c # JGETCHR O0SEGMENT DATA o 3 KO:BIN O:BOUT O:IO ifg C @`p)1ĄBFc # Dc # tJA2BIN O0SEGMENT DATA o KO:H2B ifg C @`p1 ) Dc # BFc # tJGETPARM O0SEGMENT DATA o 'KGETCHR ifg C @ ` ) 5 % , % ',4`pBFc # ) `pDc # )z tJEOFMSG O0SEGMENT  DATA o }KOL:END B2AH FINDSYM KBLANKS O:MSG O:IO ifg C @11 I 1k枥ߞ I 1ܞ՞ ()1cӞ -) 1̞ ))1 ) 1`pF`pDc # { +I 1Ȅ  %# #  RP= DATA  RD= EX= UE= C  @db`eUE*t pc # tKU_ttatttg C @ ` ) 5 % , % ',4`pBFc # ) `pDc # )z tJEOFMSG O0SEGMENT  DATA o }KOL:END B2AH FINDSYM KBLANKS O:MSG O:IO ifg C @11 I 1k枥ߞ I 1ܞ՞ ()1cӞ -) 1̞ ))1 ) 1`pF`pDc # { +I 1Ȅ  %# #  RP= DATA  RD= EX= UE= C  @db`eUE*t pc # tKU_ttattt-0 `j p P)?@E5k l bc VI 1A ?+Q@Q{)1A{DnLMFRTUSO2,0@Z*p& ,urHU U Dl@E—f ddbUL6G6E6BU*s1TXI ,Lcć|{՟C ,Aџ>Є@6@|@ć{c|ddg@=g@z"V)`o>) e,)zeD @  @ @   @J hKdLMDN$BOdfghik&l&^m-tf^uF^o7^H@ ߞkeVٞ`fX@g m@'g˞Ƞg@Ǟɞ O6ƞ`T``g@O6Ag?6B-,g)@|c{f?T{c|dd20.,7qg@Lgmp`g@O6@MgffX@GY@@bK`X]PSfmgX@G`E`@@AT;,e,@G+A5}` ~U*}m,6Ȁ~!"_~__}~WcS` #)@|c{f?T: J5)@lg@/6{c|dd20 OMEGA LINK (B0) C @f.ɠ1CD|`pF*`pDc # %C @db{+*UQ@ABCG`pE{ {|`pDc # C @g@/6I@?6E?66B@,gc # C @f{`& %DEGF,4`pF)`pDc # )C @Qą @QA|NQĀ @x`C JN1g@YC NqG`pF`pDc # , C @6C`pF|c # 8C @{1\#NKLN1C 6B  N9C4  {hc`pF`pDc # ),ee#C @ fo6B  hiMhi l liil`pF`pDc # C @e`pF`pDc # )C @go6B  h`l`pFhiv`pDc # C @c  @ *cd`pCF`p)Dc # a C @nfn`pFc #  C @n*fn`pBFc # C @hNi ih lUE+z`pF`pDc # ),C @]f@o6I@6B.6I{;VD`pBF`p)Dc # C @q)`p1FBDc # p)C @C @r)1r)1`pF`pDc # p>C @iN2@ 7)1u`pF`pDc # pT:C @I` 1DG`?6 P)1`/6 S)1`6 M)1`6 C)1`o6 A)1) 1`pF`pDc # Z>pC @ I1`pF`pDc # Z;C @U6C " I1ǀ U`pF`pDc # OMEGA LINK - UNDEFINED SYMBOLS OMEGA LINK - DEFINED SYMBOLS Z C @ %,4c # C @+f`k@B`|@c #  C @`p)1ĄBFc # Dc # p C @`p1 ) Dc # BFc # &C @ ` )5 % , %',4`pBFc # ) `pDc # )z DrC @11I 1k枥ߞI 1ܞ՞ ()1cӞ -)1̞ ))1 )1`pF`pDc # {+I 1Ȅ %# # RP= DATA RD= EX= UE= C @db`eUE*t pc #  Z>p<C @`pB)1)1@@JAk`pBXc # ) p ,܀# C @I )    E  N1@q   0`p)DBC\C @) ,ECC @)c # MpQ  pĆDE 1)1 (_I C™ DX3ǔl QǏJ PE;}p,KF>qHCECCsT g1± , `@ , "Ƨ)Y1)TIkтU@VلWHN+kTj@`pF #) 3{CI |C @`pDqM `EBB`piIABc # w)C @ qS1G p `BAC @E A@C @`pJ1) Dr)H)HJKN`pJEc c # @6A sXM m # + T) # w$pPT TYPPTZJC @.)8ˀ`pD81H 'B@ @D.1.1G '7+ D3O :BByB9B )c #  7)# I# **DE **PE **SE EHKpN C @` @UM p@rp1UF p@jk12`pDc # p(,)C @@6 p GC @qB EC @F  `pBBB `pDc # &$ A@+T@ SASO.@qF 1A B1 # # # gCI COSISOBI BOLOSCUIUODITV O8h TX O8h PR #(O8h PP #(O8h LP #2O8h CR O8 DF 9Ew'\RRgDX S_w'\0RRgMM 8 DU`8 P(    I )@6A HDT# C @@ pc # C @@c # kC @@oC @@c # C @@dC @@c # q2C @@c # 9C @@p`HB`HAc # C @s@`(# 5 SC @@p`HB`HAc # C @sJd0fhXC  J*_ u*"܃1F܃ DB܃CC @ăN U@C } ynȞqr@܃URsKj䃀@mC C _r ̄@j@ -`*@ v@c  `6D肀@r肀@H ă)c  C } {} W _`p@`p@# _# r p XDD D D C) U܃A  - D D _6 0w 1 s܃ DH D L DL  ܅ C@ UBD} Dt LpqD LiL gDDDDl2_(܃C | CrC8@ă@X EC★T@r@XCrCi@ i `Sk`Jn 6Cr肘@@@ C @܃c i# DrDD@UGrDUCD4DrD DDDDaBC @ @@8 UJ@. UE@. t r% pc # br)`p U`pJEc qnB) 3 0xAIĐ .AɄ ҠA) .lAB Ac # `pD{`pCC# r Drr U`pEc q)B pIЄ @ANĐI+AQ1wp D 1 o@NyN2tLsLq 1A{_IĄw @6O ABhd"\D @6A G@`(OLBqqim:aNBȆNąR rԞnkC @I)`pDGc ž\H@k@I܆ PT@܅mc "I`(+ `A@@ HAkTj eDICkI`(+ I`( C @GEC`pB`pFc # SA@ȏď@ I6C @Ić\D`p@# D``JK#  Uo $1@6܃B A1/ ALL Dw^q\wR !UOM780803164100\\XC  ninii6} ܃C @c n 6Cq肴@@ hC @ pDc # u܇# ܆# p )~IIl ܃`pDn 6D肀@r肀@QA} ĒTHă`pBBBc # !SАؐ֍ؐА# yC @ pCc # C @ܐs@ȓ@@ȕ@@ȗ@c # >O`pFc # c !# ? "@AąĆE@VAӀBЀC̀DʀE#FGjqKhkk܅\/`x@`x# # Oph@w N # d IkIďK# `p@# qc߀JKڀ# HՄ@kTD@AąC @E@)EIFÞc kC @܅tH㸀@ @kTc HC @@+kTc C @@@+kTc # F@ EFF@Jc k܅<#  c # ?  IkIKE#   (C @D`OCLCICc # c # DkDܑ:# 1 BFT p BA# ĄN @b@ӌ`@@B# p  $N Q_Ą@b@(@+k@(pxwjA@BFB`܅w^\ # XC @` HrTr1A .JTc # QCTrU91 Qc # 1x,) c # )1C @`p Z 0 ; @Fc # Hkk# p # p?C @󻀐 `pBCc ē D`DQjDQ=EF# # IC @`pCDc #  ~c N Q  # ?  C @`pQQFD @6PDD3c # BĀCDBFc # BC*1Q GB+ B @62 !CDD]DBC @ *1 :BĀ+ Bq)1.9# k{6 # B# A@?6# A`p@XE# B# A@6@68N@O6# pܞb@6@6@@eΞWS@6# A@6# # B# B#  # AN 6AN @/6# AXL# L# L# v@@@Ɵ7WœSC@6R0–@@ @@@ƐH6AHC @@rA@?c kT:'$p TURN ON PUNCH, PRESS INT AT IDLE TURN OFF PUNCH, PRESS INT  9C @´# B# # AYL자# AYLޞu¤# B¢# BϠ QP# AYLz c # TS Qxœ-M-KIKKL:c ) ` CC @C A# # O6, ʞx.žJNK Ђ䖔Aᐄߐަޢ0 A # L M@0@I} # c )C r r0  ЂA# !81BYT^ ؆Ur@+P@@+kޚsD@c C+B. 6Ar>:c )>E#"9@9X C XC # # Œ `H. 6A.r8 `p@`@# |{01 !`a@APQpq  123456789:#@'="&ABCDEFGHI`.<(+|-JKLMNOPQR!$*);~0/STUVWXYZ,%_>?abcdefghi^jklmnopqr stuvwxyz\{}[] Y  nC @n`i`l gH e Ib^\`@@X QHX QHX QE ML pc # ECA@@B @d # B# };X#  C @ +nx)I@&'I$gH!dG0 C @# A@6‘# B ˆӈUPIW pwwwc C @L1| nn # @6cc #  C @C @II I Iy@6Pc ` p+ pN L L p c # p+s# B# A@6<# # n`# e`9#  # x`B# b# # a`@xAlK`pCDH @r# @# kT# r@# @@@kT p䄀 :# @6C  ą 1)܆܃j HA. 6Ar6 @ ) @A )) C @`UD@k4c B# J QC+T# ' C @„1  c # Fӂ# <@L1| nn # @6cc #  C @C @II I Iy@6Pc ` p+ pN L L p c  TITL OMEGA LINK *********************************************************** * * O M E G A L I N K * *********************************************************** NAM O4:BEG,O4:ENT,OL:ENT EXTR O:CMD,O:CDEV,O:ERFL,O:IO,O:CLOS,O:OPEN EXTR FINDINDX,B2AH,FINDSYM,LOADTEST,STORESYM EXTR RELOCATE,READWORD,READBYTE EXTR LINKINDX,INITINDX EXTR GETPARM,A2BIN,OUTSYM,GETCHR EXTR O:MSG,EOFMSG EXTR OUTBYTE,OUTWORD EXTR WDATA,WTC,WREF,WORG,SAVREF,PUSHSTK,POPSTK EXTR CKMULT,FLUSH TITL  STARTUP PROCEDURE, INITIALIZE CELLS O4:BEG EQU $ O4:ENT EQU $ OL:ENT EQU $ COPY =:3040,A GET APPROVED STATUS WORD COPY A,S TRANSFER TO S UIS COPY O4:WHL,A GET CURRENT WORK HIGH LIMIT COPY A,Y SAVE VALUE  SUB =TEMP05+1,Y SUBTRARCT NUMBER OF TEMP CELLS SUB =TEMP05+2,A GET AHEAD OF TEMP CELLS COPY  A,K SAVE AS BEGINNING OF USER STACK SUB =STACKSZE,A SUBTRACT STACK SIZE IN WORDS COPY A,L  SAVE AS STACK LOWER LIMIT COPY =TEMP05,X GET NUMBER OF CELLS XOR Q,Q CLEAR REG Q  COPY Q,0(X,Y) CLEAR A TEMP CELL WORD JNED X,$-1 CONTINUE TILL DONE COPY X,ENDADR(Y)7  SAVE -1 AS DEFAULT END ADR SUB =BUFSIZ,A MAKE ROOM FOR ASSEMBLY BUFFER COPY A,BUFADR(Y) STORE IN SCRATCHPAD SUB =SYMLNG,A STEP ONE ENTRY BEYOND STACK COPY A,SYMTABEG(Y) SAVE SYMBOL TABLE START ADR COPY A,SYMTABND(Y) SAVE SYMBOL TABLE END ADR COPY =TCENDA,A INITIALIZE EXEC ADDR TC COPY A,ENDTC(Y) COPY =CO,Q PREPARE TO OUTPUT OPEN MESSAGE COPY =MSGLEN,A COPY =OPENMSG,X JSK O:MSG JEQ X,NXTCOMND CHECK FOR ERROR RETURN JMP ERROR TITL INTERNAL COMMAND PROCESSOR *  THIS ROUTINE WILL PASS CONTROL TO THE SPECIFIED * COMMAND ROUTINE. UNRECOGNIZED COMMANDS OR ILLEGAL * SYNTAX WILL GIVE A **SE AND PROMPT. * ENTRY : Y = TEMP CELLS POINTER * JMP NXTCOMND * EXIT : A = NEXT CHAR IN COMMAND STRING * Q = ZERO * NXTCOMND EQU $ COPY ='?',A SET PROMPT CHARACTER TO '?' JSK O:CMD OUTPUT PROMPT/GET RESPONSE COPY =COMNDLST-2,X GET COMMAND TABLE ADDRESS NXTCOM10 EQU  $ ADD =2,X BUMP SEARCH INDEX COPY 0(X),Q GET A TABLE VALUE JNE Q,NXTCOM20  CONTINUE IF NOT AT TABLE END JMP SYERROR PROCESS SYNTAX ERROR NXTCOM20 EQU $ XOR A,Q  DO THEY MATCH ? JNE Q,NXTCOM10 JUMP IF NOT * COPY 1(X),Q GET COMMAND ROUTNIE ADDRESS  COPY Q,TEMP01(Y) SAVE IT COPY =CI,X SET LUN JSK O:IO GET NEXT CHAR JEQ X,NXTCOM30 JUMP IF NO I/O ERROR JMP ERROR PROCESS I/O ERROR NXTCOM30 EQU $ JMP *TEMP01(Y)  GO TO COMMAND ROUTNIE COMNDLST EQU $ WORD 'D' WORD DCOMMAND WORD 'L' WORD LCOMMAND WORD 'M' WORD MCOMMAND WORD 'R' WORD RCOMMAND WORD 'T' WORD TCOMMAND WORD 'U' WORD UCOMMAND WORD 'S' WORD SCOMMAND WORD 'O' WORD OCOMMAND WORD 0 LPOOL TITL LOAD MAP PROCESSOR * WILL PROCESS LOAD MAP REQUESTS IN FORMAT * M,U OR M,D FOR DEFINED AND UNDEFINED * SYMBOLS RESPECTIVELY MCOMMAND EQU $ CLSN A,=',' COMMA DELIMITER? JMP $+2 YES JMP SYERROR SYNTAX ERROR JSK GETCHR READ NEXT CHARACTER JMP ERROR COPY =-1,Q RESET LINECOUNT COPY Q,LINECT(Y) CLSN A,='U' WANTS UNDEFINED MAP JMP MCOMM10 YES CLSN A,='D' WANTS DEFIED MAP? JMP MCOMM20 YES JMP SYERROR WANTS NEITHER SYNTAX ERROR MCOMM10 EQU $ XOR Q,Q RESET RESOLVED JMP MCOMM30 MCOMM20 EQU $ COPY =1%RESOLVED,Q SET RESOLVED MCOMM30 EQU $ JSK GETCHR READ NEXT JMP ERROR CLSN A,=CRETURN CR DELIMITER JMP $+2 YES JMP SYERROR SYNTAX ERROR COPY Q,TEMP05(Y) SAVE D OR U COPY SYMCOUNT(Y),Q GET SYMBOL COUNT COPY SYMTABEG(Y),X GET FIRST ENTRY ADDRESS MCOMM40 EQU $ JEQD Q,MCOMM60 LAST ENTRY? COPY FLAGS(X),A GET TYPE FLAGS TBIT SEGMENT,A DON'T PRINT SEGMENT ENTRIES JT OV,MCOMM50 TBIT REFER,A DON'T DO FOR REFERENCE BLOCK JT OV,MCOMM50 XOR TEMP05(Y),A COMPARE RESOLVED FLAGS TBIT RESOLVED,A DO THEY DIFFER JT OV,MCOMM50 DON'T PRINT IF YES JSK OUTSYM PRINT SYMBOL JMP ERROR ERROR EXIT MCOMM50 EQU $ SUB =SYMLNG,X MOVE TO NEXT SYMBOL JMP MCOMM40 MCOMM60 EQU $ JMP NXTCOMND LPOOL TITL DEFINE COMMAND PROCESSOR * WIL8 L PROCESS SYMBOL DEFINITION COMMANDS IN THE FORMAT * D,SYMBOL,ADDRESS DCOMMAND EQU $ COPY =1%NAM,Q NAM TYPE FLAG DCOMM010 EQU $ CLSN A,=',' COMMA NEXT? JMP $+2 YES JMP SYERROR SYNTAX ERROR COPY SYMTABND(Y),X GET NEW ENTRY ADDRESS COPY Q,FLAGS(X) INIT TYPE FLAGS XOR A,A CLEAR A COPY A,REFADR(X) ZERO REFERENCE POINTER COPY A,TEMP02(Y) ZERO TEMP COUNT FOR FINDSYM COPY X,TEMP01(Y) ENTRY LOC FOR FINDSYM JSK GETPARM READ SYMBOL JMP ERROR ERROR EXIT CLSN A,=',' COMMA FOLLOWS? JMP $+2 YES JMP SYERROR SYNTAX ERROR JSK A2BIN READ ADDRESS (A REG) JMP ERROR ERROR EXIT JSK FINDSYM FIND OR ADD ENTRY COPY A,DEFADR(X) PUT DEFINITION OR FLAGS(X),Q COMBINE ALL FLAGS TBIT RESOLVED,Q ALREADY RESOLVED JF OV,$+2 SBIT MULTIPLE,Q MULTIPLY DEFINED SBIT RESOLVED,Q SET RESOLVED COPY Q,FLAGS(X) REPLACE COPY TEMP01(Y),A COPY A,SYMTABND(Y) REPLACE COPY TEMP02(Y),A GET TEMP SYMBOL COUNT ADD SYMCOUNT(Y),A ADD PREVIOUS COUNT COPY A,SYMCOUNT(Y) SAVE TOTAL JMP NXTCOMND TITL LIBRARY & UNCONDITIONAL LOAD LCOMMAND EQU $ COPY SYSFLAGS(Y),Q GET FLAG WORD RBIT ULOAD,Q INDICATE LIBRARY LOAD  JMP UCOMM010 CONTINUE UCOMMAND EQU $ COPY SYSFLAGS(Y),Q GET FLAG WORD SBIT ULOAD,Q INDICATE UNCONDITIONAL LOAD UCOMM010 EQU $ COPY Q,SYSFLAGS(Y) SAVE FLAG WORD SUB =',',A IS CHAR A COMMA ? JEQ A,UCOMM030 JUMP IF YES UCOMM020 EQU $ JMP SYERROR PROCESS SYNTAX ERROR UCOMM030 EQU $ COPY =BI,A SET LUN JSK O:CDEV ASSIGN PHYSICAL DEVICE JEQ X,UCOMM050  CONTINUE IF NO ERROR UCOMM040 EQU $ JMP ERROR PROCESS ERROR UCOMM050 EQU $ SUB =CRETURN,A IS TERMINATOR A CR ? JNE A,UCOMM020 ERROR IF NOT COPY =BI,X SET LUN JSK O:OPEN OPEN BI DEVICE JNE X,UCOMM040 JUMP IF ERROR JMP NEXTYPE BEGIN FILE PROCESSING  TITL SPECIFY REL OFFSET SCOMMAND EQU $ COPY =1%SEGMENT,Q SEGMENT TYPE FLAG JMP DCOMM010 PROCESS AS A DEFINE RCOMMAND EQU $ CLSN A,=',' COMMA? JMP $+2 YES JMP SYERROR SYNTAX ERROR JSK A2BIN CONVERT TO BINARY JMP ERROR ERROR EXIT COPY A,NXTBLK(Y) STORE AS NEXT ALLOCATION ADDRESS JMP NXTCOMND TITL UNTHREAD SYMBOL TABLE * THIS ROUTINE WILL STUFF THE DEF ADR INTO THE SYMBOL * REFERANCE CHAIN. AFTER THE SYMBOL CHAIN HAS BEEN * UNTHREADED THE REF ADR IS SET TO ZERO SO THAT IT * WILL BE IGNORED IF SUBSEQUENTG "T" COMMANDS ARE * ISSUED. * ENTRY : REG A = SECOND CHAR OF COMMAND * JMP TCOMMAND * EXIT : REG A = DESTROYED * Q,X,Y = PRESERVED * TCOMMAND EQU  $ SUB =CRETURN,A IS THE NEXT CHAR A CR ? JEQ A,TCOMM010 CONTINUE IF NO ERROR JMP TCERROR PROCESS ERROR TCOMM010 EQU $ COPY SYMCOUNT(Y),Q GET NUMBER OF SYMBOLS IN TABLE COPY SYMTABEG(Y),X GET SYMBOL TABLE ADR TCOMM020 EQU $ JEQD Q,TCOMM060 CHECK FOR LAST ENTRY COPY FLAGS(X),A GET SYMBOL FLAGS COPY A,TCFLAGS(Y) SAVE ABS/REL FLAG TBIT SEGMENT,A SEGMENT ENTRY? JT OV,TCOMM050 JUMP IF YES TBIT REFER,A DON'T DO REFERENCE BLOCK JT O9 V,TCOMM050 JSK WREF OUTPUT ALL REFERENCES TO THIS SYMBOL JMP ERROR COPY =0,A COPY A,REFADR(X) ZERO REFERENCE ADDRESS TCOMM050 EQU $ SUB =SYMLNG,X POINT TO NEXT SYMBOL JMP TCOMM020 CONTINUE TILL DONE TCOMM060 EQU $ JSK FLUSH JMP ERROR COPY ENDTC(Y),A WRITE LAST VALID END TC JSK OUTBYTE JMP ERROR COPY ENDADR(Y),A WRITE TRANSFER ADDRESS JSK OUTWORD JMP ERROR COPY =BO,X  JSK O:CLOS JMP NXTCOMND LPOOL TITL OUTPUT ABSOLUTE BINARY FILE * THIS ROUTINE WILL OUTPUT CORE TO THE BO FILE * IN RESPONSE TO THE COMMAND: O,DEVICE,LOWADR,HIADR * TYPECODES USED WILL BE ACCEPTABLE TO AUTOLOAD. OCOMMAND EQU $ CLSN A,=',' COMMA NEXT DELIMITER? JMP $+2 YES JMP SYERROR NO,SYNTAX ERROR COPY =BO,A SET BO AS FILE TO CONNECT JSK O:CDEV READ AND CONNECT FILE JEQ X,$+2 ANY ERRORS? JMP ERROR CLSN A,=CRETURN NEXT CHARACTER SHOULD BE CR JMP $+2 YES JMP SYERROR COPY =BO,X JSK O:OPEN OPEN FILE BO JEQ X,$+2 JMP ERROR COPY =TCBGIN,A GET START TYPE CODE JSK OUTBYTE WRITE TO BO JMP ERROR * COPY =0,A JSK OUTWORD WRITE A ZERO TO BO JMP ERROR JMP NXTCOMND LPOOL TITL TYPE CODE DISTRIBUTOR *  THIS ROUTINE WILL GET THE NEXT BYTE FROM BI AND PROCESS * IT AS A TYPE CODE. UPON FINDING A MATCH WITH THE TYPE *  CODE TABLE THE LOAD FLAG IS CHECKED. IF THE LOAD FLAG * IS ON, THE NEXT BYTE/WORD IS READ AND CONTROL IS PASSED *  TO THE TC ROUTINE. IF THE LOAD FLAG IS OFF, THE BYTES * ASSOCIATED TO THIS TC ARE SKIPPED. * ENTRY : REG Y = TEMP CELLS POINTER * JMP NEXTYPE * EXIT : REG Y = TEMP CELLS POINTER * REG. A = NEXT BYTE/WORD * TCFLAGS = FLAGS ASSOCIATED WITH THIS TC * NEXTYPE EQU $ JSK READBYTE GET THE TYPE CODE BYTE JMP IOERROR RETURN HERE IF ERROR ENTPRTN EQU $ COPY A,TYPECODE(Y) SAVE INTO TEMP CELL COPY =TCTABLE,X GET TABLE ADDRESS NEXTY010 EQU $ COPY 1(X),Q GET THIS TYPE CODE FLAGWORD COPY Q,TCFLAGS(Y) SAVE INTO TEMP CELL COPY 0(X),Q GET A TABLE ENTRY JNE Q,NEXTY015  JUMP IF NOT AT TABLE END JMP TCERROR OUTPUT TC ERROR NEXTY015 EQU $ XOR A,Q COMPARE WITH TABLE ENTRY CLSN =0,Q DO THEY MATCH ? JMP NEXTY020 YES, PROCESS IT ADD =3,X BUMP TABLE ADR JMP NEXTY010 CONTINUE WITH NEXT ENTRY * FOUND A MATCH IN TC TABLE NEXTY020 EQU $ COPY TCFLAGS(Y),Q GET THIS TYPE CODE FLAGWORD TBIT NXTWD,Q SHOULD WE READ NEXT WORD ?  JF OV,NEXTY030 JUMP AROUND IF NOT JSK READWORD READ NEXT WORD JMP IOERROR RETURN HERE IF ERROR NEXTY030 EQU $ TBIT NXTBY,Q SHOULD WE READ NEXT BYTE ? JF OV,NEXTY040 JUMP AROUND IF NOT JSK READBYTE READ NEXT BYTE JMP IOERROR RETURN HERE IF ERROR NEXTY040 EQU $  COPY TYPECODE(Y),Q GET CURRENT TYPE CODE CLSN =TCENTP,Q IS IT A LIST NAM ? JMP NEXTY080 SKIP LOAD TEST IF YES CLSN =TCBGIN,Q IS IT BEGIN PROG ? JMP NEXTY080 SKIP LOAD TEST IF YES : COPY SYSFLAGS(Y),Q GET GLOBAL FLAG WORD TBIT LOAD,Q IS THE LOAD FLAG ON ? JT OV,NEXTY080 JUMP TO PROCESS TC IF YES * SKIP THIS TYPE CODE RECORD COPY TCFLAGS(Y),Q GET TC FLAGS TBIT FIXED,Q  SKIP IN FIXED FORMAT ? JF OV,NEXTY050 JUMP IF VARIABLE FORMAT COPY 0(X),A GET SKIP COUNT WORD SHIFT A,RO,8 ISOLATE SKIP COUNT NEXTY050 EQU $ TBIT WDCNT,Q IS COUNT SPECIFIED IN WORDS ? JF OV,NEXTY060 JUMP IF NOT SHIFT A,LO,1 DOUBLE COUNT FOR # OF BYTES NEXTY060 EQU $ COPY A,Q SAVE COUNT NEXTY070 EQU $ JEQD Q,NEXTYPE DECREMENT COUNT, JUMP WHEN DONE JSK READBYTE SKIP A BYTE JMP IOERROR RETURN HERE IF ERROR JMP NEXTY070 CONTINUE * JUMP TO TYPE CODE PROCESSOR ROUTINE NEXTY080 EQU $ COPY 2(X),X GET TC PROCESSOR ADDRESS JMP 0(X)  JUMP TO PROCESS TC LPOOL TITL INTERMEDIATE ACCESS INTR EQU $ * PROCESS REFERNCE TO OTHER SEGMENT JSK FINDINDX GET SEGMENT ENTRY JMP TCERROR JSK READWORD GET OFFSET INTO SEGMENT JMP IOERROR ERROR EXIT RBIT CY,S TURN OFF CARRY  ADDC DEFADR(X),A RELOCATE, CHECK FOR OVERFLOW JF CY,INTR10 COPY =E:AE2,X ADDRESSING ERROR JMP ERROR INTR10 EQU $ JSK WDATA OUTPUT RELOCATED VALUE JMP ERROR IMS *LOCATION(Y) INCREMENT PC JSK READWORD GET MASK JMP IOERROR ERROR EXIT JMP NEXTYPE  TITL ERROR PROCESSING ROUTINES SYERROR EQU $ COPY =E:SE,X INDICATE SYNTAX ERROR JMP ERROR TCERROR  EQU $ COPY TYPECODE(Y),A GET TYPE CODE AS OPTIONAL VALUE COPY =E:TC,X IOERROR EQU $ CLSN =E:EOF,X IS IT END OF FILE ? JMP EOF JUMP IF YES ERROR EQU $ JSK O:ERFL OUTPUT THE ERFLOR CODE JMP NXTCOMND EOF EQU $ COPY =BI,X JSK O:CLOS CLOSE BI AT EOF JSK EOFMSG JMP ERROR JMP NXTCOMND LPOOL TITL TYPE CODE TABLE TCTABLE EQU $ WORD TCENDA * END(ABS) BITS MASK NXTWD,FIXED,ABS SPECIFY NONE,BITS WORD ENDA WORD TCENDR * END(REL) BITS MASK NXTWD,FIXED,REL SPECIFY NONE,BITS WORD ENDR WORD TCORGA * ORG(ABS) BITS MASK NXTWD,FIXED,ABS SPECIFY NONE,BITS WORD ORGA WORD TCORGR * ORG(REL) BITS MASK NXTWD,FIXED,REL SPECIFY NONE,BITS WORD ORGR WORD TCTAB * TEXT(ABS) BITS MASK ABS,NXTWD,WDCNT SPECIFY NONE,BITS WORD TAB WORD TCTRLW *TEXT(REL) BITS MASK REL,NXTWD,WDCNT SPECIFY NONE,BITS WORD TRLW WORD 2%8+TCRESF * RESERVE AND FILL BITS MASK NXTWD,FIXED SPECIFY NONE,BITS WORD RESF WORD TCBRLW * TEXT(BYTE REL) BITS MASK NXTWD,FIXED SPECIFY NONE,BITS WORD BRLW WORD TCBGIN *BEGIN BITS MASK NXTWD,FIXED SPECIFY NONE,BITS WORD BGIN WORD TCNULL * NULL BITS MASK SPECIFY NONE,BITS WORD NULL WORD TCENTP * LIST EXT DEF BITS MASK NXTBY,NAM SPECIFY NAM,BITS WORD ENTP WORD TCEXTP * LIST EXT REF BITS MASK NXTBY,EXTR SPECIFY EXTR,BITS WORD EXTP WORD TCENTS * LIST SEC EXT DEF BITS MASK NXTBY,SNAM SPECIFY SNAM,BITS WORD ENTS WORD TCEXTS * LIST SEC EXT REF BITS MASK NXTBY,SEXT SPECIFY SEXT,BITS WORD EXTS WORD TCCHNP * LIST CHAINS BITS MASK NXTBY,CHAIN,ABS SPECIFY CHAIN,BITS WORD CHNP WORD TCSGMT * LIST SEG NAMES BITS MASK NXTBY,SEGMENT SPECIFY SE; GMENT,BITS WORD SGMT WORD 4%8+TCINTR * INTERMEDIATE ACCESS BITS MASK SEGMENT,FIXED,NXTBY SPECIFY SEGMENT,BITS WORD INTR WORD TCZOP * STACK DEFINITION BITS MASK FIXED SPECIFY NONE,BITS WORD ZOP WORD TCDENP * DEF EXTERNAL(PRI) BITS MASK NXTBY,FIXED SPECIFY NAM,BITS WORD DENP WORD TCDENS * DEF EXT(SEC) BITS MASK NXTBY,FIXED SPECIFY SNAM,BITS WORD DENS WORD TCLOC * LOC CNTR BITS MASK NXTBY,FIXED SPECIFY SEGMENT,BITS WORD LOC WORD TCNCHP * CHAIN ELEMENT BITS MASK NXTBY,FIXED SPECIFY CHAIN,BITS  WORD NCHP WORD TCHCHP * CHAIN HEAD BITS MASK NXTBY,FIXED SPECIFY CHAIN,BITS WORD HCHP WORD TCNOTE * NOTE BITS MASK SPECIFY NONE,BITS WORD NOTE WORD TCTEXP * TEXT EXT (PR) BITS MASK NXTBY,FIXED SPECIFY EXTR,BITS WORD TEXP WORD TCTEXS * TEXT EXTERNAL (SEC) BITS MASK NXTBY,FIXED SPECIFY SEXT,BITS WORD TEXS WORD TCSGML * LIST SEG ATTRIBUTES BITS MASK NXTBY SPECIFY SEGMENT,BITS WORD SGML WORD 0 END OF TABLE TITL PROCESS TCENDA (02) & TCENDR (03) ENDA EQU $ ENDR EQU $ COPY =:FFFF,Q CSN A,Q DONT'T STORE FFFF AS TA STORE ONLY LAST GOOD TA JMP ENDA10 JSK RELOCATE RELOCATE END ADR  JMP ERROR RETURN HERE IF ERROR COPY A,ENDADR(Y) SAVE AS ENDING ADR COPY TYPECODE(Y),A SAVE TYPE CODE COPY A,ENDTC(Y) ENDA10 EQU $ JMP NEXTYPE PROCESS NEXT TYPE CODE TITL PROCESS TCORGA (04) & TCORGR (05) ORGA EQU $ ORGR EQU $ JSK RELOCATE RELOCATE DATA WORD JMP ERROR RETURN HERE IF ERROR COPY A,*LOCATION(Y) STORE AS NEW PC COPY TCFLAGS(Y),Q GET ABS/REL FLAG AND =1%ABS,Q ISOLATE COPY SYSFLAGS(Y),X RBIT ABS,X CLEAR OLD ABS/REL OR X,Q COPY Q,SYSFLAGS(Y) RESTORE * JSK WORG WRITE NEW ORG THIS PC JMP ERROR JMP NEXTYPE PROCESS NEXT TYPE CODE TITL PROCESS TCTAB (06) & TCTRLW (07) TAB EQU $ TRLW  EQU $ COPY SYSFLAGS(Y),X LOOK AT SYSTEM FLAGS NEG A,Q TRLW10 EQU $ JSK READWORD GET A DATA WORD JMP IOERROR RETURN HERE IF ERROR JSK RELOCATE RELOCATE DATA WORD JMP ERROR TBIT ZOPFLAG,X WAS TCZOP SPECIFIED? JF OV,TRLW20 JUMP IF NOT JSK PUSHSTK JMP ERROR JMP TRLW30 DON'T STORE DTA WORD TRLW20 EQU $ JSK WDATA WRITE DATA WORD TO BO JMP ERROR IMS *LOCATION(Y) INCREMENT PC TRLW30 EQU $ IJNE Q,TRLW10 CONTINUE JMP NEXTYPE PROCESS NEXT TYPE CODE TITL PROCESS TCRESF (08) RESF EQU $ JSK WTC WRITE TYPE CODE TO BO JMP ERROR JSK OUTWORD WRITE COUNT TO BO JMP ERROR  ADD *LOCATION(Y),A ADD COUNT TO PC COPY A,*LOCATION(Y) UPDATA PC JSK READWORD READ DATA WORD JMP IOERROR JSK OUTWORD WRITE TO BO JMP ERROR JMP NEXTYPE PROCESS NEXT TYPE CODE TITL PROCESS TCBRLW (09) BRLW EQU $  JSK RELOCATE RELOCATE DATA WORD JMP ERROR RETURN HERE IF ERROR COPY SYSFLAGS(Y),Q GET GLOBOL FLAGS TBIT ZOPFLAG,Q WAS TCZOP SPECIFIED ? JF OV,BRLW10 JUMP IF NOT JSK PUSHSTK SAVE ON STACK JMP ERROR JMP BRLW20 DONT STORE DATA WORD BRLW10 EQU $ JSK WTC WRITE TYPE CODE TO BO JMP ERROR JSK OUTWORD WRITE ADDRESS TO BO JMP ERROR BRLW20 EQU $ JMP NEXTYPE PROCESS NEXT TYPE CODE < TITL PROCESS TCBGIN (18) BGIN EQU $ JEQ A,BGIN10 FLAG WORD MUST BE ZERO JMP TCERROR  OUTPUT TC ERROR BGIN10 EQU $ JSK INITINDX ZERO INDEX CHAIN POINTERS COPY SYSFLAGS(Y),A GET GLOBAL FLAGS TBIT ULOAD,A CHECK FOR UNCONDITIONAL LOAD JT OV,BGIN20 RBIT LOAD,A MOVE ULOAD TO LOAD JMP BGIN30 BGIN20 EQU $ SBIT LOAD,A MOVE ULOAD TO LOAD BGIN30 EQU $ COPY A,SYSFLAGS(Y) REPLACE JMP NEXTYPE PROCESS NEXT TYPE CODE TITL PROCESS LIST TYPE CODES EXTP EQU $ ENTS EQU $ EXTS EQU $ CHNP EQU $ SGMT EQU $ SHIFT A,RO,3 CHANGE TO NUMBER OF ENTRIES NEG A,Q NEGATE COUNT FOR INDEX XOR A,A CLEAR REG A COPY A,TEMP02(Y) CLEARY TEMPORARY SYMBOL COUNT COPY SYMTABND(Y),A GET END OF SYM TAB ADR COPY A,TEMP01(Y) SAVE INTO TEMP CELL PROSYM10 EQU $ JSK STORESYM APPEND SYMBOL TO CURRENT TABLE JMP ERROR RETURN HERE IF ERROR JSK FINDSYM FIND SYMBOL IN TABLE COPY TCFLAGS(Y),A GET CURRENT TC FLAGS AND =TYPEMASK,A OR FLAGS(X),A COMBINE FLAGS COPY A,FLAGS(X) RESTORE JSK LINKINDX LINK TO INDEX CHAIN IJNE Q,PROSYM10 BUMP INDEX COUNT COPY TEMP01(Y),A GET TEMP SYMBOL END ADR COPY A,SYMTABND(Y) INCLUDE THESE SUMBOLS IN TABLE  COPY TEMP02(Y),A GET TEMP SYMBOL COUNT ADD SYMCOUNT(Y),A INCLUDE THESE IN TOTAL COUNT COPY A,SYMCOUNT(Y) SAVE TOTAL COUNT PROSYM20 EQU $ JMP NEXTYPE GET NEXT TYPE CODE LPOOL TITL PROCESS TCNULL (40) NULL EQU $ JMP NEXTYPE PROCESS NEXT TYPE CODE TITL PROCESS TCZOP (66) ZOP EQU $ COPY SYSFLAGS(Y),Q GET FLAG WORD SBIT ZOPFLAG,Q INDICATE TCZOP SPECIFIED COPY Q,SYSFLAGS(Y) RESTORE FLAG WORD JMP NEXTYPE PROCESS NEXT TYPE CODE TITL PROCESS TCDENP (67) & TCDENS (68) DENP EQU $ DENS EQU $ JSK FINDINDX FIND SYMBOL (BY INDEX) JMP TCERROR  RETURN HERE IF ERROR COPY *LOCATION(Y),A GET CURRENT PC COPY SYSFLAGS(Y),Q GET ABS/REL FLAGS TBIT ZOPFLAG,Q IS TCZOP SEQUENCE? JF OV,DEN020 RBIT ZOPFLAG,Q RESET ZOP FLAG COPY Q,SYSFLAGS(Y) JSK POPSTK GET PC FROM STACK JMP ERROR COPY TCFLAGS(Y),Q GET ABS REL FROM STACK * DEN020 EQU $ * JSK CKMULT CHECK FOR MULTIPLE DEFINITION JMP DEN030 YES, MULTIPLE DEFINITION COPY A,DEFADR(X) STORE DEFINITION IN SYM TAB COPY FLAGS(X),A GET SYMBOL FLAGS SBIT RESOLVED,A GET RESOLVED FLAG AND =1%ABS,Q ISOLATE ABS/REL OR Q,A INCLUDE W/ SYMBOL FLAGS COPY A,FLAGS(X) RESTORE FLAGS DEN030 EQU $ JMP NEXTYPE PROCESS NEXT TYPE CODE TITL PROCESS TCLOC (69) LOC EQU $ COPY A,Q MOVE INDEX FOR CALCULATION ADD Y,Q ADD SCRATCHPAD ADD =PC0,Q ADD PC BASE COPY Q,LOCATION(Y) STORE PC POINTER JSK FINDINDX GET SYM BY INDEX JMP TCERROR ERROR EXIT COPY DEFADR(X),Q GET RELOCATION VALUE COPY Q,RELOC(Y) PUT IN SCRATCHPAD JMP NEXTYPE PROCESS NEXT TYPE CODE TITL PROCESS TCNCNP (6B) NCHP EQU $ JSK FINDINDX FIND SYMBOL (BY INDEX) JMP TCERROR R= ETURN HERE IF ERROR COPY FLAGS(X),A GET ABS/REL FROM SYMBOL FLAGS COPY A,TCFLAGS(Y) STORE AS CURRENT ABS/REL RBIT ABS,A CLEAR ABS/REL COPY SYSFLAGS(Y),Q GET GLOBAL ABS/REL AND =1%ABS,Q ISOLATE OR Q,A COMBINE GLOBAL ABS/REL WITH SYMBOL FLAGS SBIT RESOLVED,A COPY A,FLAGS(X) RESTORE COPY *LOCATION(Y),A GET PC EXCH A,DEFADR(X) STORE NEW RETRIEVE OLD ADDRESS JSK WDATA WRITE ADDRESS AS CHAIN LINK JMP ERROR IMS *LOCATION(Y) INCREMENT PC JMP NEXTYPE PROCESS NEXT TYPE CODE TITL PROCESS TCNOTE (6D) &TCSGMT (4F) NOTE EQU $ NEG A,Q SAVE COUNT WORD NOTE10 EQU $  JSK READBYTE GET A DATA BYTE JMP IOERROR RETURN HERE IF ERROR IJNE Q,NOTE10 CONTINUE  JMP NEXTYPE PROCESS NEXT TYPE CODE LPOOL TITL PROCESS TCSGML (6F) SGML EQU $  COPY A,Q SETUP VALUE XOR A,A FOR DIVIDE DIV =3,AQ GET SEGMENT COUNT  JEQ A,SGML20 CONTINUE SGML10 EQU $ JMP TCERROR PROCESS TYPE CODE ERROR SGML20 EQU $  COPY A,TEMP03(Y) ZERO INDEX COPY Y,A RA FOR SCRATCH ADD =PC0,A CALCULATE ADDRESS OF FIRST PC COPY A,TEMP04(Y) SAVE SGML30 EQU $ JNED Q,$+2 CHECK FOR LAST SEGMENT LENGTH JMP NEXTYPE DO NEXT TC COPY TEMP03(Y),A GET INDEX JSK FINDINDX GET SYM TABLE BY INDEX JMP TCERROR ERROR EXIT COPY FLAGS(X),A LOOK AT HISTORY FLAGS TBIT OFFSET,A PROCESS DIFFERENT IF OFFSET WAS ENTERED JF OV,SGML40 COPY DEFADR(X),A GET OLD RELOCATION VALUE ADD REFADR(X),A ADD OLD SEGMENT LENGTH COPY A,DEFADR(X) STORE AS NEW RELOCATION BIAS COPY A,*TEMP04(Y) SAVE AS PC JSK READWORD READ NEW SEGMENT LENGTH JMP IOERROR ERROR RETURN COPY A,REFADR(X) STORE IN SYMBOL TABLE JMP SGML50 SGML40 EQU $ COPY NXTBLK(Y),A GET NEXT ALLOCATION ADDRESS COPY A,DEFADR(X) STORE AS RELOCATION BIAS COPY A,*TEMP04(Y) SAVE A PC JSK READWORD GET NEW SEGMENT LENGTH JMP IOERROR ERROR EXIT COPY A,REFADR(X) NEW SEGMENT LENGTH GOES IN SYM TAB ADD NXTBLK(Y),A CALC NEW BLOCK ADDRESS COPY A,NXTBLK(Y) RETURN TO ALLOCATION ADDRESS PARM SGML50 EQU $ IMS TEMP03(Y) NEXT INDEX IMS TEMP04(Y) NEXT PC JSK READBYTE READ STATUS FLAGS JMP IOERROR JMP SGML30 NEXT SEGMENT TITL PROCESS TCTEXP (74) & TCTEXS (75) & TCHCHP (6C) TEXP EQU $ TEXS EQU $ HCHP EQU $ JSK FINDINDX FIND SYMBOL (BY INDEX) JMP TCERROR RETURN HERE IF ERROR JSK SAVREF SAVE REFERENCE TO SYMBOL TABLE JMP ERROR IMS *LOCATION(Y) INCREMENT PC JSK WORG OUTPUT NEW PC JMP ERROR JMP NEXTYPE PROCESS NEXT TYPE CODE LPOOL TITL ENTP PRIMARY INTERNAL ENTP EQU $ SHIFT A,RO,3 CHANGE TO NUMBER OF ENTRIES NEG  A,Q NEGATE COUNT FOR INDEX XOR A,A CLEAR REG A COPY A,TEMP02(Y) CLEARY TEMPORARY SYMBOL COUNT  COPY SYMTABND(Y),A GET END OF SYM TAB ADR COPY A,TEMP01(Y) SAVE INTO TEMP CELL ENTP10 EQU $ JSK STORESYM APPEND SYMBOL TO CURRENT TABLE JMP ERROR RETURN HERE IF ERROR JSK FINDSYM  FIND SYMBOL IN TABLE JSK LOADTEST CHECK FOR FORCED LOAD COPY TCFLAGS(Y),A GET CURRENT TC FLAGS>  AND =TYPEMASK,A OR FLAGS(X),A COMBINE FLAGS COPY A,FLAGS(X) RESTORE JSK LINKINDX LINK TO INDEX CHAIN IJNE Q,ENTP10 BUMP INDEX COUNT JSK READBYTE GET NEXT TC JMP IOERROR ERROR EXIT CLSN A,=TCENTP IS NEXT RECORD ENTP ALSO JMP $+2 YES JMP ENTP05 NO JSK READBYTE GET BYTE COUNT JMP IOERROR ERROR EXIT SHIFT A,RO,3 MAKE NUMBER OF ENTRIES NEG A,Q NEGATIVE LOOP COUNT JMP ENTP10 ENTP05 EQU $ COPY SYSFLAGS(Y),Q GET SYSTEM FLAGS TBIT LOAD,Q IS LOAD FLAG ON ?  JF OV,ENTP20 JUMP IF NOT COPY TEMP01(Y),Q GET TEMP SYMBOL END ADR COPY Q,SYMTABND(Y) INCLUDE THESE SUMBOLS IN TABLE COPY TEMP02(Y),Q GET TEMP SYMBOL COUNT ADD SYMCOUNT(Y),Q INCLUDE THESE IN TOTAL COUNT COPY Q,SYMCOUNT(Y) SAVE TOTAL COUNT ENTP20 EQU $ JMP ENTPRTN GET NEXT TYPE CODE LPOOL TITL MESSAGE AREA OPENMSG EQU $ BYTE LF,' OMEGA LINK (' M:LREV BYTE ') ',LF,CRETURN MSGEND EQU $ MSGLEN EQU MSGEND-OPENMSG*2 END OL:ENT TITL SYMBOL TABLE LOOKUP (INDEX) * THIS ROUTINE WILL LOOK FOR THE SYMBOL TABLE ENTRY *  WITH THE GIVEN INDEX. * AND THE TYPE FLAGS MUST MATCH. * ENTRY: A=INDEX * JSK FINDINDX *  EXIT : X = SYMBOL ADR * NAM FINDINDX FINDINDX EQU $ PUSH :0040 SAVE REGS COPY TCFLAGS(Y),X GET CHAIN INDEX SHIFT X,RO,13 ISOLATE FROM FLAG BITS COPY CHNHDS(X,Y),X GET CHAIN HEAD FOR THIS TYPE FINDIN10 EQU $ JEQ X,FINDIN20 EQU $ END OF CHAIN TOO EARLY? JEQD A,FINDIN30 INDEX SATISFIED? COPY 0(X),X GET NEXT ENTRY JMP FINDIN10 REPEAT FINDIN20 EQU $ COPY =E:TC,X ERROR IN TYPE CODE JMP FINDIN40 FINDIN30 EQU $ COPY K,Y GET STACK POINTER IMS STACKRTN(Y) NORMAL RETURN SUB =INDEX,X POINT TO TOP OF TABLE FINDIN40 EQU $ COPY K,Y COPY X,STACKX(Y) RTN PARAMETER POP RESTORE REGS RSK LPOOL END TITL SYMBOL TABLE LOOKUP (TEXT) * THIS ROUTINE WILL LOOK FOR THE GIVEN SYMBOL IN THE * SYMBOL TABLE. IF NOT FOUND, IT ADDS IT TO THE TABLE, * IF FOUND, THE SYMBOL INDEX IS UPDATED TO THAT OF THE * CURRENT ENTRY. * ENTRY : TEMP01(Y) = INPUT SYMBOL ADR * JSK FINDSYM * EXIT : REG X = DESIRED SYMBOL ADR * NAM FINDSYM CSR MASK CHAIN,SEGMENT,REFER FINDSYM EQU $ PUSH :0040 SAVE REGISTERS COPY SYMCOUNT(Y),Q GET NUMBER OF SYMBOLS IN TABLE COPY SYMTABEG(Y),X GET SYMBOL TABLE START ADDRESS COPY TEMP01(Y),Y GET INPUT SYMBOL ADDRESS  ADD =SYMLNG,X ADJUST ADR FOR NEXT INST FINDS010 EQU $ SUB =SYMLNG,X BUMP TABLE POINTER  JEQD Q,FINDS020 DECREMENT SYMBOL COUNT COPY 0(X),A GET FIRST SYMBOL WORD XOR 0(Y),A DO THEY MATCH ? JNE A,FINDS010 JUMP IF NOT COPY 1(X),A GET SECOND SYMBOL WORD XOR 1(Y),A DO THEY MATCH ? JNE A,FINDS010 JUMP IF NOT COPY 2(X),A GET THIRD SYMBOL WORD  XOR 2(Y),A DO THEY MATCH ? JNE A,FINDS010 JUMP IF NOT COPY 3(X),A GET FOURTH SYMBOL WORD XOR 3(Y),A DO THEY MATCH ? JNE A,FINDS010 JUMP IF NOT COPY FLAGS(X),A GE? T THE SYMBOL FLAGS XOR FLAGS(Y),A COMPARE WITH DESIRED ENTRY FLAGS AND =CSR,A ISOLATE CHAIN AND SEGMENT  JNE A,FINDS010 JUMP IF SYMBOLS NOT SAME TYPE JMP FINDS030 CONTINUE FINDS020 EQU $ COPY K,Y GET STACK POINTER COPY STACKY(Y),Y GET TEMP CELL POINTER COPY TEMP01(Y),A GET TEMP SYMBOL TABLE END ADR COPY A,X X SHOULD CONTAIN NEW ENTRY ADDRESS SUB =SYMLNG,A INCLUDE THIS SYMBOL COPY A,TEMP01(Y) SAVE TEMP END ADR IMS TEMP02(Y) BUMP TEMP SYMBOL COUNT FINDS030 EQU $ COPY K,Y  GET STACK POINTER COPY X,STACKX(Y) SAVE THIS SYMBOLS ADDRESS POP RESTORE REGISTERS  RSK RETURN LPOOL END TITL TEST FOR LOAD * THIS ROUTINE WILL CHECK TO SEE IF THIS MODULE SHOULD * BE LOADED. BOTH TYPE CODE AND COMMAND MODE ARE USED * AS CRITERIA. * ENTRY : REG X = SYMBOL ADDRESS * JSK LOADTEST * EXIT : LOAD BIT OF SYSFLAG IS 0 OR 1 NAM LOADTEST * LOADTEST EQU $ PUSH :0040 SAVE REGISTERS COPY SYSFLAGS(Y),Q GET SYSTEM FLAGS TBIT LOAD,Q IS LOAD FLAG ON ? JT OV,LOADT020 JUMP IF YES TBIT ULOAD,Q IS UNCONDITIONAL LOAD ON ? JT OV,LOADT010 JUMP IF YES COPY FLAGS(X),A GET THE SYMBOLS FLAGS TBIT EXTR,A WAS THEIR AN EXTR ?  JF OV,LOADT020 JUMP IF NOT TBIT RESOLVED,A IS THE EXTR RESOLVED ? JT OV,LOADT020 JUMP IF IT HAS BEEN LOADT010 EQU $ SBIT LOAD,Q SET LOAD FLAG COPY Q,SYSFLAGS(Y) RESTORE SYSTEM FLAGS LOADT020 EQU $ POP RESTORE REGISTERS RSK RETURN END TITL ADD SYMBOL TO TABLE * THIS ROUTINE WILL READ THE GIVEN SYMBOL AND APPEND * IT TO THE CURRENT SYMBOL TABLE. * ENTRY : TEMP01(Y) = NEXT STORAGE ADR * JSK STORESYM * EXIT : ALL ARGUMENTS AND REGISTERS PRESERVED *  NAM STORESYM EXTR READWORD,O4:BLL STORESYM EQU $ PUSH :0040 SAVE REGISTERS COPY TCFLAGS(Y),A GET FLAGS  AND =1%ABS++TYPEMASK,A ISOLATE TYPE FLAGS; ALLOW ABS COPY TEMP01(Y),Y GET DESTINATION ADR COPY O4:BLL,X GET END (LOWER) OF WORD AREA CSM Y,X COMPARE THE ADDRESSES JMP STORE025 NEW SYMBOL ENTRY OUT OF AREA NOP XOR X,X  CLEAR WORD INDEX COPY X,DEFADR(Y) CLEAR DEF ADR WORD COPY X,REFADR(Y) CLEAR REF ADR WORD COPY A,FLAGS(Y) SET FLAG WORD COPY X,INDEX(Y) CLEAR INDEX STORE010 EQU $ CLSN =4,X HAVE WE GOTTEN 4 WORDS ? JMP STORE020 YES, DONE WITH TEXT JSK READWORD READ IN SYMBOL TEXT JMP STORE030 RETURN HERE IF ERROR COPY A,0(X,Y) SAVE WORD INTO SYMBOL TABLE IJNE X,STORE010 BUMP STORAGE INDEX STORE020 EQU $ COPY K,Y GET STACK POINTER IMS STACKRTN(Y) BUMP ADR TO NO ERROR RETURN JMP STORE040 SKIP ERROR PROCESSING STORE025 EQU $ COPY =E:SO,X INDICATE SYMBOL TABLE OVERFLOW STORE030 EQU@  $ COPY K,Y GET STACK POINTER COPY X,STACKX(Y) SAVE ERROR CODE STORE040 EQU $ POP RSK END TITL SAVREF TITL NAM SAVREF * STORE EXTERNAL OR CHAIN REFERENCE SOMEWHERE IN * SYMBOL TABLE. * * ENTRY: REG X CONTAINS ADDRESS OF SYMBOL TABLE ENTRY * JSK SAVREF * ERROR RETURN *  NORMAL RETURN * EXTR GETBLOCK SAVREF EQU $ PUSH :0040 * CHECK FOR FIRST REFERENCE BLOCK, IF NONE EXISTS, * ALLOCATE ONE * COPY REFADR(X),Q GET REFERENCE BLOCK LINK JNE Q,SAV10 IF ZERO JSK GETBLOCK ALLOCATE NEW ONE JMP SAV90 ERROR IF NONE AVAILABLE COPY Q,REFADR(X) PUT NEW ADDRESS IN SYMBOL TABLE * SAV10 EQU $ * * SEARCH FOR THE LAST REFERENCE BLOCK * COPY Q,X INDEX REFERENCE BLOCK COPY RLINK(X),Q GET FUTHER LINK IF ANY JEQ Q,SAV20 LAST ENTRY? JMP SAV10 NO * SAV20 EQU $ * * IF INDEX TO NEXT ENTRY IS ZERO, REFERENCE BLOCK * IS FULL; ALLOCATE NEW BLOCK * COPY RINDX(X),Q GET WORD WITH INDEX SHIFT Q,RO,12 ISOLATE INDEX JNE Q,SAV30 ENTRY FULL JSK GETBLOCK ALLOCATE NEW BLOCK JMP SAV90 NONE AVAILABLE ERROR EXIT COPY Q,RLINK(X) STORE LINK TO NEW BLOCK IN PREVIOUS ONE COPY Q,X INDEX NEW BLOCK JMP SAV20 GET INDEX ASBEFORE * SAV30 EQU $ * * STORE CURRENT LOCATION COUNTER AT POINT INDICATED * BY INDEX, STORE CURRENT ABS/REL FLAG IN INDEX WORD, * UPDATE INDEX, RETURN * COPY *LOCATION(Y),A GET CURRENT PC XNX Q STORE ADDRESS, INDEXING SCHEME WITH QUESTIONABLE MERITS COPY A,0(X) DISPLACEMENT REPLACED WITH CONTENTS OF Q * SUB =1,Q DECREMENT INDEX SHIFT Q,LO,4 MOVE Q TO K4 FIELD * COPY SYSFLAGS(Y),A GET GLOBAL ABS/REL FLAG AND =1%ABS,A ISOLATE ABS/REL BIT SHIFT A,RO,ABS MOVE TO BIT 0 * * SHIFT ABS/REL TO BIT POSITION 'INDEX' * XNX Q EXECUTE LEFT SHIFT WORD :0E01 SHIFT LEFT SKELETON (SHIFT A,LO,?) * OR RINDX(X),A COMBINE WITH OLD FLAGS AND =:FFF,A REMOVE OLD INDEX * SHIFT Q,LO,8 MOVE INDEX TO FINAL POSITION OR Q,A COMBINE INDEX OR ABS/REL FLAGS COPY A,RINDX(X) STORE IN REFERENCE BLOCK * COPY K,Y INDEX STACK IMS STACKRTN(Y) NORMAL RETURN JMP SAV100 * SAV90 EQU $ COPY K,Y INDEX STACK COPY X,STACKX(Y) ERROR CODE TO X * SAV100 EQU $ POP RSK END TITL CKMULT NAM CKMULT * CHECK FOR MULTIPLE DEFINITION, SET MULT FLAG * * ENTRY: REG X CONTAINS SYMBOL TABLE ADDRESS * JSK CKMULT * RETURN IF MULTIPLE DEF * RETURN IF NOT MULTIPLE DEF * CKMULT EQU $ PUSH :0040 COPY FLAGS(X),A GET SYMBOL'S FLAGS TBIT RESOLVED,A ALREADY RESOLVED JT OV,CK010 YES COPY K,Y INDEX STACK IMS STACKRTN(Y) RETURN IF NOT MULTIPLY DEFINED JMP CK020 CK010 EQU $ SBIT MULTIPLE,A SET MULT DEF COPY A,FLAGS(X) RESTORE CK020 EQU $ POP RSK END TITL WREF NAM WREF * ORG ABS OR REL AT EACH ADDRESS STORED IN THE REFERENCE * BLOCK ASSOCIATED WITH EACH CHAIN HEAD OR EXTERNAL. * PUT DATA DEFINED BY THE SYMBOL AT THAT ADDRESS. * ENTRY: REG X CONTAINS ADDRESS OF SYMBOL TABLE ENTRY * TCFLAGS CONTAINS ABS/REL FLAG FOR SYMBOL DEFINITION * * JSK WREF * ERROR RETURN (REG X HAS ERROR CODE) *  NORMAL RETURN * EXTR WDATA,OUTBYTE,OUTWORD,FLUSH WREF EQU $ PUSH :0040 * * STORE DEFINITION ADDRESS IN TEMPA  LOCATION * COPY DEFADR(X),A GET DEFINITION ADDRESS FROM SYM TAB COPY A,TEMP01(Y) STORE TEMP COPY REFADR(X),X LOAD REFERENCE BLOCK ADDRESS * WREF10 EQU $ * * IF ADDRESS IS ZERO, RETURN * JEQ X,WREF80 * * OTHERWISE, LOAD INDEX WORD AND ISOLATE INDEX * COPY RINDX(X),Q SHIFT Q,RO,12 * * IF INDEX IS END OF BLOCK, TRY NEXT REFERENCE BLOCK * WREF20 EQU $ * ADD =1,Q CLSN Q,=RINDX JMP WREF50 * * PROCESS ONE REFERENCE ADDRESS HERE. FIRST * ORG REL OR ABS AT ADDRESS * JSK FLUSH FLUSH OUTPUT BUFFER BEFORE WRITING TO BO JMP WREF90 * COPY RINDX(X),A GET ABS/REL FLAGS SHIFT Q,LO,4 SHIFT INDEX TO K4 FIELD XNX Q TEST BIT 'INDEX' TBIT 0,A INDEX THIS INSTR. WITH REG Q JT OV,WREF40 COPY =TCORGR,A PICK UP ORG REL JMP WREF42 * WREF40 EQU $ COPY =TCORGA,A PICK ORG ABS * WREF42 EQU $ JSK OUTBYTE WRITE TO BO JMP WREF90 ERROR RETURN * * OUTPUT ADDRESS * SHIFT Q,RO,4 SHIFT Q TO D6 FIELD XNX Q LOAD ADDRESS FROM REFERENCE BLOCK 'INDEX' COPY 0(X),A THIS INSTRUCTION INDEXED BY REG Q JSK OUTWORD WRITE TO BO JMP WREF90 ERROR EXIT * * WRITE THE SYMBOL DEFINITION * COPY TEMP01(Y),A GET DEFINITION FROM TEMP JSK WDATA WRITE TO BO JMP WREF90 ERROR EXIT JMP WREF20 * WREF50 EQU $ COPY RLINK(X),X JMP WREF10 * WREF80 EQU $ COPY K,Y INDEX STACK IMS STACKRTN(Y) NORMAL RETURN JMP WREF100 * WREF90 EQU $ COPY K,Y COPY X,STACKX(Y) * WREF100 EQU $ POP RSK END TITL WDATA NAM WDATA EXTR FLUSH * WDATA EQU $ PUSH :0040 COPY A,X SAVE DATA ITEM FOR A WHILE COPY TCFLAGS(Y),A LOAD ABS/REL INFO TBIT ABS,A JT OV,WDATA10 COPY =TCTRLW,A LOAD REL TC JMP WDATA12 * WDATA10 EQU $ COPY =TCTAB,A LOAD ABS TC * WDATA12 EQU $ CSK A,DATATC(Y) THIS TC SAME AS LAST? JMP WDATA15 NO JMP WDATA15 NO COPY DATACT(Y),Q YES,LOAD WORD COUNT CSK Q,=BUFSIZ COMPARE WORD COUNT WITH MAX SIZE JMP WDATA20 LESS THAN MAX NOP GREATER THAN MAX * WDATA15 EQU $ JSK FLUSH EQUAL TO MAX, FLUSH BUFFER JMP WDATA90 COPY A,DATATC(Y) INIT NEW TYPE CODE IMS DATACT(Y) SET COUNT TO 1 COPY =0,A COPY A,*BUFADR(Y) SET TC RECORD WORD COUNT TO 0 * WDATA20 EQU $ COPY X,A RESTORE DATA ITEM IMS *BUFADR(Y) INCREMENT WORD COUNT IN TC RECORD COPY DATACT(Y),X LOAD BUFFER INDEX IMS DATACT(Y) INCREMENT BUFFER INDEX COPY BUFADR(Y),Y INDEX OUTPUT BUFFER COPY A,0(X,Y) STORE DATA ITEM IN BUFFER * COPY K,Y INDEX STACK IMS STACKRTN(Y) NORMAL RETURN JMP WDATA100 * WDATA90 EQU $ COPY K,Y INDEX STACK COPY X,STACKX(Y) RETURN ERROR CODE * WDATA100 EQU $ POP RSK END TITL WTC * * OUTPUT CURRENT TYPE CODE BYTE TO BO * NAM WTC EXTR OUTBYTE,FLUSH * WTC EQU $ PUSH :0040 JSK FLUSH FLUSH ASSEMBLY BUFFER JMP WTC10 COPY TYPECODE(Y),A JSK OUTBYTE WRITE BYTE TO BO JMP WTC10 ERROR RETURN COPY K,Y INDEX STACK IMS STACKRTN(Y) NORMAL RETURN JMP WTC20 * WTC10 EQU $ * COPY K,Y INDEX STACK COPY X,STACKX(Y) ERROR CODE * WTC20 EQU $ POP RSK END TITL WORD NAM WORG * WRITE ORG THE CURRENT PROGRAM COUNTER TO BO * * ENTRY: JSK WORG * ERROR RETURN * NORMAL RETURN * EXTR OUTBYTE,OUTWORD,FLUSH WORG EQU $ PUSH :0040 COPY SYSFLAGS(Y),A TBIT ABS,A JT OV,WORG10 COPY =TCORGR,A JMP WORG20 * WORG10 EQU $ COPY =TCORGA,A * WORG20 EQU $ CSK A,DATATC(Y) COMPARE WITH PREVIOUS TC JMP WORG30 NOT EQ JMP WORG30 NOT EQ * WORG25 EQU $ COPB Y *LOCATION(Y),A GET CURRENT PC COPY A,*BUFADR(Y) PUT IN OUTPUT BUFFER COPY K,Y INDEX STACK IMS STACKRTN(Y) NORMAL RETURN JMP WORG100 WORG30 EQU $ JSK FLUSH FLUSH OUTPUT BUFFER JMP WORG90 COPY A,DATATC(Y) INITIALIZE NEW TYPE CODE IMS DATACT(Y) SET BUFFER COUNT TO 1 JMP WORG25 WORG90 EQU $ COPY K,Y INDEX STACK COPY X,STACKX(Y) WORG100 EQU $ POP RSK END TITL GETBLOCK * * ALLOCATE REFERENCE BLOCK FROM SYMBOL TABLE; INITIALIZE INDEX * AND LINK * NAM GETBLOCK * RINIT SET RINDX-1%12 RINIT SET 1%REFER++RINIT GETBLOCK EQU $ PUSH :0040 * * CHECK NEW TABLE ENTRY FOR LOWER SYMBOL TABLE BOUNDS * COPY SYMTABND(Y),X GET ENTRY ADDRESS COPY O4:BLL,A GET LOW LIMIT CSM X,A COMPARE JMP GET90 JUMP IF OUT OF BOUNDS NOP * * INITIALIZE ENTRY INDEX AND ZERO LINK POINTER * COPY =RINIT,A COPY A,RINDX(X) INITIALIZE INDEX TO LAST ENTRY COPY =0,A COPY A,RLINK(X) ZERO LINK * * RESET SYMBOL TABLE END * COPY X,Q SAVE ADDRESS OF NEW ENTRY SUB =SYMLNG,X MOVE DOWN ONE ENTRY LENGTH COPY X,SYMTABND(Y) REPLACE TABLE END POINTER IMS SYMCOUNT(Y) INCREMENT SYMBOL TABLE ENTRY COUTN * COPY K,Y INDEX STACK COPY Q,STACKQ(Y) RETURN ADDRESS IN Q REG IMS STACKRTN(Y) NORMAL RETURN JMP GET100 * GET90 EQU $ * COPY K,Y INDEX STACK COPY =E:SO,X SYMBOL TABLE OVERFLOW ERROR CODE COPY X,STACKX(Y) * GET100 EQU $ * POP RSK END TITL PUSHSTK NAM PUSHSTK * * PUSH VALUE INTO LINKER STACK. TAKE TYPECODE FLAGS * AND PUSH INTO TYPE STACK. * * ENTRY: REG A CONTAINS VALUE TO PUSH *  JSK PUSHSTK * ERROR RETURN (STACK OVERFLOW) * NORMAL RETURN * PUSHSTK EQU $ PUSH :0040 COPY STACKP(Y),X GET STACK POINTER COPY A,ASTACK(X,Y) STORE VALUE IN ADDRESS STACK COPY TCFLAGS(Y),A GET CURRENT TC CODE FLAGS COPY A,TSTACK(X,Y) STORE IN TYPE STACK IMS STACKP(Y) INCRMENT SP COPY K,Y INDEX STACK IMS STACKRTN(Y) NORMAL RTN POP RSK END TITL POPSTK NAM POPSTK * POP VALUE FROM LINKER STACK INTO REG A. PUT TYPECODE FLAGS * IN CURRENT TYPECODE WORD. * * ENTRY: JSK POPSTS * ERROR RETURN (STACK EMPTY) * NORMAL RERURN * EXIT: REG A CONTAINS VALUE FROM STACK * POPSTK EQU $ PUSH :0040 COPY STACKP(Y),X GET SP SUB =1,X DECREMENT SP COPY TSTACK(X,Y),A GET TYPE CODE FLAGS COPY A,TCFLAGS(Y) COPY ASTACK(X,Y),A GET VALUE FROM ADDRESS STACK COPY X,STACKP(Y) RESTORE SP COPY K,Y COPY A,STACKA(Y) RETURN PARAMETER IMS STACKRTN(Y) NORMAL RETURB POP RSK END TITL FLUSH NAM FLUSH EXTR OUTBYTE,OUTWORD * FLUSH EQU $ PUSH :0040 COPY DATATC(Y),A LOAD PREVIOUS TYPE CODE JEQ A,FLUSH80 EXIT IF NONE * JSK OUTBYTE RITE TO BO JMP FLUSH90 * COPY DATACT(Y),Q LOAD ITEM COUNTER COPY =0,A COPY A,DATACT(Y) ZERO COUNT COPY A,DATATC(Y) ZERO TYPE CODE COPY A,X ZERO INDEX TO BUFFER COPY BUFADR(Y),Y GET BASE ADDRESS * FLUSH10 EQU $ JEQD Q,FLUSH80 CHECK FOR LAST ITEM COPY 0(X,Y),A GET DATA ITEM JSK OUTWORD WRITE TO BO JMP FLUSH90 ADD =1,X JMP FLUSH10 * FLUSH80 EQU $ COPY K,Y INDEX STACK IMS STACKRTN(Y) NORMAL RETURN JMP FLUSH100 * FLUSH90 EQU $ COPY K,Y INDEX STACK COPY X,STACKX(Y) * FLUSH100 EQU $ POP RSK END TITL  RELOCATE DATA WORD * THIS ROUTINE WILL RELOCATE THE WORD IN REGISTER A * ACCORDING TO THE BITS SET IN TCFLAGS. *C  ENTRY : A = DATA WORD * JSK RELOCATE * EXIT : A = RELOCATED WORD * NAM RELOCATE RELOCATE EQU $ PUSH :0040 SAVE REGISTERS COPY RELOC(Y),X GET RELOCATION BIAS COPY TCFLAGS(Y),Q GET THE FLAG WORD TBIT ABS,Q IS IT ABS MODE ? JT OV,RELOCA20 IF YES, DONT CHANGE ADR TBIT REL,Q IS IT REL MODE ? JT OV,RELOCA10 JUMP IF YES, ELSE BYTE REL SHIFT X,LO,1 DOUBLE LOC VALUE JT OV,RELOCA30 JUMP IF INVALID ADR RELOCA10 EQU $ RBIT CY,S INSURE CARRY NOT ON  COPY X,TEMP01(Y) PUT LOC IN MEM FOR ADDC ADDC TEMP01(Y),A ADD LOC TO ADR JT CY,RELOCA30 JUMP IF ADR ERROR RELOCA20 EQU $ COPY K,Y GET STACK POINTER COPY A,STACKA(Y) PUT RELOCATED VALUE INTO A IMS STACKRTN(Y) BUMP PAST ERROR RTN ADR JMP RELOCA40 CONTINUE RELOCA30 EQU $ COPY K,Y GET STACK POINTER COPY =E:AE2,X GET ADDRESSING ERROR CODE COPY X,STACKX(Y) SAVE ERROR CODE RELOCA40 EQU $ POP RESTORE REGISTERS RSK RETURN LPOOL END TITL READ NEXT WORD/BYTE SERVICE * THESE ROUTINES WILL GET THE NEXT WORD OR BYTE FROM THE * BI DEVICE. IN THE CASE OF NEXTBYTE, THE LEFT HALF OF * THE DATA REGISTER IS UNCHANGED. IN THE CASE OF NO ERROR * THE RETURN ADDRESS IS MODIFIED IN THE STACK SO THE RSK * WILL CAUSE CONTROL TO PASS TO THE RSK ADDRESS+1. * ENTRY : REG A = DATA * JSK NEXTBYTE FOR BYTE REQUEST * JSK READWORD FOR WORD REQUEST *  EXIT : REG A = DATA WORD * REG X = ERROR CODE (ONLY IF ERROR) * NAM READWORD NAM READBYTE EXTR O:IO READWORD EQU $ JSK NEXTBYTE GET A BYTE, FALL THROUGH FOR SECOND BYTE JMP NEXTB030 RETURN HERE IF ERROR JMP NEXTBYTE GET A DATA BYTE READBYTE EQU $ XOR A,A INSURE NULL DATA REGISTER NEXTBYTE EQU $ PUSH :0040 SAVE REGISTERS SHIFT A,LO,8 SAVE FIRST BYTE TO FORM WORD  COPY =BI,X SET LUN TO BI FOR I/O JSK O:IO GET THE NEXT DATA BYTE COPY K,Y  GET STACK POINTER JNE X,NEXTB010 JUMP IF I/O ERROR IMS STACKRTN(Y) BUMP ADR TO NO ERROR RETURN COPY A,STACKA(Y) STUFF DATA WORD INTO REG A JMP NEXTB020 CONTINUE NEXTB010 EQU $ COPY X,STACKX(Y) STUFF ERROR CODE INTO REG X NEXTB020 EQU $ POP RESTORE REGISTERS NEXTB030 EQU $ RSK RETURN END TITL OUTWORD, OUTBYTE * THIS ROUTINE WILL OUTPUT ONE BYTE OR WORD TO THE BO * FILE. ENTRY: JSK OUTWORD (REG A CONTAINS WORD TO BE OUTPUT) * ERROR RETURN (ERROR CODE IN X) * NORMAL RETURN (ALL REGS PRESERVED) * NAM OUTBYTE,OUTWORD EXTR O:IO OUTBYTE EQU $ PUSH :0040 JMP OUTW05 OUTWORD EQU $ PUSH :0040 ROTATE A,L,8 OUTPUT LEFT BYTE FIRST COPY =BO,X WRITE TO FILE BO JSK O:IO JNE X,OUTW10 ROTAD TE A,L,8 OUTPUT RIGHT BYTE OUTW05 EQU $ COPY =BO,X JSK O:IO JNE X,OUTW10 COPY K,Y INDEX STACK IMS STACKRTN(Y) NORMAL RETURN JMP OUTW20 OUTW10 EQU $ COPY K,Y INDEX STACK COPY X,STACKX(Y) RETURN ERROR CODE OUTW20 EQU $ POP RSK END TITL CONVERT BINARY TO ASCII HEX * THIS ROUTINE WILL CONVERT THE BINARY VALUE IN REG A * TO ASCII AND OUTPUT IT TO THE LO DEVICE. * ENTRY : REG Q = HEX VALUE * JSK B2AH * EXIT : ALL REGISTERS PRESERVED * NAM B2AH EXTR O:IO B2AH EQU $ PUSH :0040 SAVE REGISTERS COPY =3,Y SET LOOP COUNT B2AH10  EQU $ ROTATE Q,L,4 GET A DIGIT COPY Q,A SAVE ORIGINAL VALUE OF Q AND =:F,A ISOLATE THE DIGIT CSK A,=:A COMPARE IT TO A SUB ='A'-'9'-1,A < ADJUST VALUE, NUMERIC  NOP > ADD ='0'+'A'-'9'-1,A VALUE IS B-F COPY =LO,X SET LUN FOR I/O  JSK O:IO OUTPUT THE CHARACTER JNE X,B2AH20 JUMP IF ERROR JNED Y,B2AH10 DEC COUNT AND CONTINUE COPY K,Y GET STACK POINTER IMS STACKRTN(Y) BUMP ADR TO NO ERROR RETURN  JMP B2AH30 CONTINUE B2AH20 EQU $ COPY K,Y GET STACK POINTER COPY X,STACKX(Y)  STUFF ERROR CODE INTO REG X B2AH30 EQU $ POP RESTORE REGISTERS RSK RETURN END TITL OUTSYM * THIS ROUTINE WILL WRITE ONE LOAD MAP SYMBOL TO * THE LO FILE. THE SYMBOL NAME, DEFINITION ADDRESS * AND INDICATORS FOR PRIMARY AND SECONDARY EXTERNAL * REFERENCE, CHAIN ELEMENT, AND MULTIPLE DEFINITION * ARE PRINTED. * ENTRY: JSK OUTSYM (X REG CONTAINS ADDRESS OF SYMBOL ENTRY) * ERROR RETURN (ERROR CODE IN X) * NORMAL RETURN * NAM OUTSYM EXTR O:MSG,O:IO,BLANKS,B2AH EXTR HEADER OUTSYM EQU $ PUSH :0040 SAVE REGS JSK HEADER JMP OUTSYM60 COPY =LO,Q JSK BLANKS OUTPUT LEADING BLANKS JMP OUTSYM60 ERROR EXIT COPY X,Y SAVE SYMBOL TABLE ADDRESS IN Y COPY =8,A PREPARE TO OUTPUT 8 CHAR SYMBOL JSK O:MSG DO IT JNE X,OUTSYM60 CHECK FOR ERRORS JSK BLANKS FOLLOW WITH BLANKS JMP OUTSYM60 ERROR EXIT COPY DEFADR(Y),Q GET DEFINITION ADDRESS JSK B2AH CONVERRT TO ASCII AND OUTPUT JMP OUTSYM60 ERROR EXIT COPY FLAGS(Y),Y GET HISTORY FLAGS TBIT EXTR,Y IS A PRIMARY EXTERNAL JF OV,OUTSYM20 COPY ='P',A OUTPUT P ON THIS LINE COPY =LO,X JSK O:IO JNE X,OUTSYM60 OUTSYM20 EQU $ TBIT SEXT,Y IS THIS A SECONDARY EXTERNAL JF OV,OUTSYM30 COPY ='S',A PRINT S ON THIS LINE COPY =LO,X JSK O:IO JNE X,OUTSYM60 CHECK FOR ERROR ON RETURN OUTSYM30 EQU $ TBIT MULTIPLE,Y IS SYMBOL MULTIPLY DEFINED? JF OV,OUTSYM40 COPY ='M',A IF SO, OUTPUT M ON THIS LINE COPY =LO,X JSK O:IO JNE X,OUTSYM60 CHECK FOR ERROR ON RETURN OUTSYM40 EQU $ TBIT CHAIN,Y IS THIS A CHAIN ENTRY JF OV,OUTSYM50 COPY ='C',A IF SO OUTPUT C ON THIS LINE COPY =LO,X JSK O:IO JNE X,OUTSYM60 ERROR EXIT OUTSYM50 EQU $ TBIT ABS,Y IS SYMBOL ABSOLUTE JF OV,OUTSYM55 COPY ='A',A COPY =LO,X JSK O:IO JNE X,OUTSYM60 OUTSYM55 EQU $ COPY =LO,X COPY =CRETURN,A JSK O:IO OUTPUT CR TO TERMINATE LINE JE NE X,OUTSYM60 CHECK ERRORS COPY K,Y INDEX STACK IMS STACKRTN(Y) NORMAL RETURN JMP OUTSYM70 OUTSYM60 EQU $ COPY K,Y INDEX STACK COPY X,STACKX(Y) RETURN ERROR CODE OUTSYM70 EQU $ POP RSK END NAM BLANKS EXTR O:MSG BLANKS EQU $ PUSH :0040 COPY =B,X COPY =4,A COPY =LO,Q JSK O:MSG JNE X,BLANKS10 COPY K,Y IMS STACKRTN(Y) JMP BLANKS20 BLANKS10 EQU $ COPY K,Y COPY X,STACKX(Y) BLANKS20 EQU $ POP RSK B BYTE ' ' END TITL HEADER NAM HEADER EXTR O:MSG HEADER EQU $ PUSH :0040 IMS LINECT(Y) BUMP LINE COUNT JMP HEAD80 NOT A NEW PAGE * COPY FLAGS(X),A GET SYMBOL'S FLAGS TBIT RESOLVED,A TEST FOR DEFINED OR UNDEFINED MAP JT OV,HEAD20 COPY =URMSG,X UNDEFINED MAP COPY =URLEN,A MSG LENGTH JMP HEAD30 * HEAD20 EQU $ COPY =RMSG,X DEFINED MAP COPY =RLEN,A MSG LENGTH * HEAD30 EQU $ COPY =LO,Q JSK O:MSG WRITE MSG TO LO JNE X,HEAD90 * COPY O4:LPP,A NEG A,A ADD =3,A COPY A,LINECT(Y) SET NEW LINE COUNT TO MAXLINES-3 * HEAD80 EQU $ COPY K,Y INDEX STACK IMS STACKRTN(Y) NORMAL RETURN JMP HEAD100 * HEAD90 EQU $ COPY K,Y INDEX STACK COPY X,STACKX(Y) ERROR CODE * HEAD100 EQU $ POP RSK TITL URMSG EQU $ BYTE FF,'OMEGA LINK - UNDEFINED SYMBOLS',CRETURN BYTE CRETURN,CRETURN UREND EQU $ URLEN EQU UREND-URMSG*2 * RMSG EQU $ BYTE FF,'OMEGA LINK - DEFINED SYMBOLS',CRETURN BYTE CRETURN,CRETURN REND EQU $ RLEN EQU REND-RMSG*2 END TITL INITIALIZE CHNHDS POINTERS * THIS ROUTINE WILL INITIALIZE ALL INDEX CHAIN HEADS TO * ZERO IN ORDER TO BEGIN REINDEXING AT THE START OF * A NEW MODULE * ENTRY JSK INITNDX NAM INITINDX INITINDX EQU $ PUSH :0040 XOR A,A CLEAR A XOR X,X ZERO INDEX TO CHNHDS INITI010 EQU $ CLSN X,=NUMTYPES CHECK FOR LAST HEAD POINTER JMP INITI020 COPY A,CHNHDS(X,Y) CLEAR POINTER TO ZERO IJNE X,INITI010 NEXT POINTER INITI020 EQU $ POP RSK END TITL LINK INDEX CHAIN * THIS ROUTINE WILL LINK NEW LIST ENTRIES INTO THE * THE PROPER INDEX CHAIN AS DETERMINED BY TCFLAGS * ENTRY X=ADDR OF SYM TAB ENTRY * JSK LINKINDX * NAM LINKINDX LINKINDX EQU $ PUSH :0040 XOR A,A CLEAR A COPY A,INDEX(X) ZERO LAST POINTER ADD =INDEX,X POINT TO INDEX LOCATION IN ENTRY COPY TCFLAGS(Y),A GET INDEX TO CHNHDS SHIFT A,RO,13 ISOLATE FROM FLAG BITS ADD A,Y ADD SCRATCHPAD ADDRESS ADD =CHNHDS,Y ADD START OF POINTERS LINKI010 EQU $ COPY 0(Y),A GET CONTENTS OF POINTER JEQ A,LINKI020 ZERO IS END OF CHAIN COPY A,Y MOVE TO NEXT POINTER JMP LINKI010 LINKI020 EQU $ COPY X,0(Y) POP RSK END TITL GETCHR * THIS ROUTINE WILL READ ONE CHARACTER THROUGH THE * CONSOLE DEVICE. THE CHARACTER IS RETURNED IN THE A * REGISTER. * ENTRY: JSK GETCHR * ERROR RETURN (ERROR CODE IN X) * NORMAL RETURN (INPUT CHARACTER IN A) NAM GETCHR EXTR O:IO LOAD O:BOUT LOAD O:BIN GETCHR EQU $ PUSH :0040 COPY K,Y ADDRESS STACK COPY =CI,X READ FROM CONSOLE JSK O:IO INPUT ONE CHARACTER TO A JNE X,GETCHR01 ERROR? COPY A,STACKA(Y) RETURN CHARACTER IMS STACKRTN(Y) NORMAL RETN POP RESTORE REGISTERS RSK GETCHR01 EQU $ COPY X,STACKX(Y) RETURN ERROR CODE POP RSK END * THIS ROUTINE WILL READ CHARACTERS FROM CI AND * CONVERT TO BINARY. CHARACTERS ARE READ UNTIL * A CR OR NON HEX CHARACTER IS READ. ONLY THE * LAST FOUR CHARACTERS ARE RETAF mkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkG mkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkH mkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkI mkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkJ mkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkK mkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkL mkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmkmk