IMD 1.16: 30/08/2008 23:49:54 84-94200-00 a500 f20000 carbug utility source maintenance diskette  l MGG@IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIICARTOSMA182051913201420820519132014 820519132014VF20000 VOLCARBUG UTILITY SOURCE MAINTENANCE DISKETTE (94200-00-A500)   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIl MGG@C#~zSCRATCH SCRATCH VOLCARTOSOS4 OS4iHYYCIF1@3<XX5<N  VOL rNOS4 MF182051814010704820519131833 820519131833OF20000 VOLCARBUG UTILITY SOURCE MAINTENANCE DISKETTE (94200-00-A500)      M@ TITL CARTOS SYSTEM DEBUG - CARBUG.ASM (94200-10-A500) ************************************************* * * C A R B U G - - - CARTOS SYSTEM DEBUG * ************************************************* * * REV A000 - ORIGINAL REVISION. MODIFICATION OF * OS4 DEBUG TO INCLUDE MEMORY MANAGEMENT * UNIT (MMU) MANIPULATION, AND VIRTUAL *  MEMORY USAGE. * 4/95 INSTRUCTIONS ADDED TO ENABLE MAP * DEBUGGING (COPYU). * BREAKPOINT NOW USES STRAP INSTEAD OF JST *0 * OWEN FITZIMONS AND DAN O'GARA JUNE 24 1980 * * REV A100 - CHANGE BREAKPOINT TO UTRAP * DAN O'GARA JULY 17 1980 * * * REV A200 - INITIALIZATION PROBLEM FIXED. *  - CARBUG NOW ALLOWS CONTEXT POINTER TO BE CHANGED. * - CARBUG WILL RETRIEVE AND RESTORE REGISTERS TO *  WHATEVER LOCATION THE CONTEXT POINTER POINTS TO. * IF CONTEXT POINTER IS ZERO, CARBUG RETRIEVES AND *  RESTORES CONTEXT FROM STACK. ALL REGISTERS ARE * INITIALLY SET TO ZERO EXCEPT STATUS, WHICH IS *  SET TO :0040, AND K REGISTER, :FFFF, AND, OF COURSE, * P REGISTER. * OWEN FITZSIMONS - OC TOBER 12,1980. * * REV A300 - TEST USER MAP ON SET BREAKPOINT AND ON RETURN FROM * BREAKPOINT TO DETERMINE IF A 'COPYU' OR A 'COPY' SHOULD * BE USED IN SETTING/RESTORING BREAKPOINTS. * * CHANGE TRAP HANDLERS AND BUS MONITOR TO USE SAVE CONTEXT. * DANIEL O'GARA - JUNE 26, 1981 * * REV A400 - SET SPECIAL MEMORY TRAP ON ENTRY TO CARBUG, RESET ON EXIT * TO PROTECT FROM UNINSTALLED MEMORY TRAPS. * DAN O'GARA - JULY 31, 1981 * * REV A500 - TEST USER MAP ON BUS MONITOR BREAK WITH THE DESIRED MAP. * CONTINUE IF MAP DOES NOT MATCH. (USEFUL ON INTERRUPT OF * BUS MONITOR ONLY). * IF LP SELECTED FOR OUTPUT, COMMENTS ARE ALSO LISTED. * DO'G - AUGUST 1, 1981 ************************************************ MACHINE :100  NAM CARBUG NAM DBG4:LP NAM DBG4:CNT * USER MAY SUPPLY DESIRED DIO ADDRESS & CHANNEL # IN THE *  FOLLOWING ORDER IN THE 'Q' REGISTER * BIT 4-7 --> DIO ADDRESS * BIT 1-3 --> CHANNEL NO * BIT 0 --> 0 ******  SEXT G:0,G:1,G:2,G:3,G:4,G:5 SEXT G:6,G:7,G:8,G:9,G:A,G:B SEXT G:C,G:D,G:E,G:F,G:G,G:H SEXT G:I,G:J,G:K,G:L,G:M,G:N SEXT G:O,G:P,G:Q,G:R,G:S,G:T SEXT G:U,G:V,G:W,G:X,G:Y,G:Z MACRO RTN JMP *#1 ENDM * REV: EQU 'A500' PROMCH EQU '*' PROM CHARACTER BELL EQU :7 BELL CHAR TOF EQU :C  TOP OF FORM CR EQU :D CARRIAGE RETURN LF EQU :A LINE FEED BLANK EQU :20 BLANK CHAR ARROW  EQU :5F BACK ARROW CHAR EQUAL EQU '=' LLNTH EQU 40 PERMISSIBLE LENGTH FOR LIST BRKPT EQU 0 BREAK POINT RETURN ADDRESS READMAPS EQU 6 READ MMU MAPS, FUNCTION CODE READSTAT EQU 5 READ MMU STATUS, FUNCTION CODE LOADDMA EQU 7 LOAD DMA # FUNCTION CODE LOADUSER EQU 6 LOAD USER # FUNCTION CODE LOADSTAT EQU 5 LOAD MMU STATUS FUNCTION CODE USERMAP EQU 10 BIT IN -S- IF ON ==> IN USER MAP TITL SHARABLE DEBUG: SYSTEM DEBUG: REL CARBUG EQU $ STDIOD JST BASE USRIOD JST OPTION OPTIONAL ENTRY FOR NON-STANDARD IOD BASE ENT SELP A,BMADDR%3+1 . BM IMS BASE BASE HAS 'BASE' ADDRESS JST LOADCTX LOAD INITIAL CONTEXT BASE1 JST SAVE SAVE USER REGISTERS  JMP HEADNG DO DEBUG HEADING ****** * * -- SUB-ROUTINE AND WORD CELL OFFSET FROM BASE PROGRAM -- * * SUB-ROUTINES * TDBG EQU $-BASE WORD DBG-BASE DBG ABSOLUTE OFFSET FROM BASE PROG TERROR EQU $-BASE  WORD ERROR-BASE ERROR ABSOLUTE OFFSET FROM BASE PROG TRTN6 EQU $-BASE WORD RTN6-BASE TDMPRS EQU  $-BASE WORD DMPRS-BASE DMPRS ABSOLUTE OFFSET FROM BASE PROG TMMUDMP EQU $-BASE WORD MMUDMP-BASE  MMUDMP ABSOLUTE OFFSET FROM BASE PROG TRREG EQU $-BASE WORD RREG-BASE RREG ABSOLUTE OFFSET FROM BASE PROG TGREG EQU $-BASE WORD GREG-BASE GREG ABSOLUTE OFFSET FROM BASE PROG TINSP EQU $-BASE   WORD INSP-BASE INSP ABSOLUTE OFFSET FROM BASE PROG TCOMMA EQU $-BASE WORD COMMA-BASE COMMA ABSOLUTE OFFSET FROM BASE PROG TSPACE EQU $-BASE WORD SPACE-BASE SPACE ABSOLUTE OFFSET FROM BASE PROG TLIST EQU $-BASE WORD LIST-BASE LIST ABSOLUTE OFFSET FROM BASE PROG TFILLP EQU $-BASE WORD FILLP-BASE FILLP ABSOLUTE OFFSET FROM BASE PROG TSRCH EQU $-BASE WORD SRCH-BASE SRCH ABSOLUTE OFFSET FROM BASE PROG TCOPYP EQU $-BASE WORD COPYP-BASE COPYP ABSOLUTE OFFSET FROM BASE PROG TCRLF EQU $-BASE WORD CRLF-BASE CRLF ABSOLUTE OFFSET FROM BASE PROG TRKB EQU $-BASE WORD RKB-BASE  RKB ABSOLUTE OFFSET FROM BASE PROG TTYP EQU $-BASE WORD TYP-BASE TYP ABSOLUTE OFFSET FROM BASE PROG THEX EQU $-BASE WORD HEX-BASE HEX ABSOLUTE OFFSET FROM BASE PROG TUNSAV EQU $-BASE WORD UNSAVE-BASE UNSAVE ABSOLUTE OFFSET FROM BASE PROG TINP EQU $-BASE WORD INP-BASE INP ABSOLUTE OFFSET FROM BASE PROG TCHKR EQU $-BASE WORD CHKR-BASE CHKR ABSOLUTE OFFSET FROM BASE PROG TCHKG EQU $-BASE WORD CHKG-BASE CHKG ABSOLUTE OFFSET FROM BASE PROG TTYPCR EQU $-BASE WORD TYPCRT-BASE TPADDR EQU $-BASE WORD PADDR-BASE TSHEX EQU $-BASE WORD SHEX-BASE TGSZ EQU $-BASE WORD  GSZ-BASE TTRAP EQU $-BASE WORD TRAP-BASE TSAVE EQU $-BASE WORD SAVE-BASE TCINTS EQU $-BASE  WORD CINTS-BASE TUITS EQU $-BASE WORD UITS-BASE TMETS EQU $-BASE WORD METS-BASE TNETS EQU $-BASE WORD NETS-BASE TSETS EQU $-BASE WORD SETS-BASE TAETS EQU $-BASE WORD AETS-BASE TETEST EQU  $-BASE WORD ETEST-BASE TTYPLP EQU $-BASE WORD TYPLP-BASE TZTRNG EQU $-BASE WORD ZTRING-BASE  Z ABSOLUTE OFFSET FROM BASE PROG TMCMD EQU $-BASE BM WORD MCMD-BASE BM TINPP EQU $-BASE BM  WORD INPP20-BASE . BM * * WORD CELLS * TPFLG EQU $-BASE WORD PFLG-BASE PFLG ABSOLUTE OFFSET FROM BASE PROG TADDR EQU $-BASE WORD ADDR-BASE ADDR ABSOLUTE OFFSET FROM BASE PROG TVALU EQU $-BASE WORD VALU-BASE VALU ABSOLUTE OFFSET FROM BASE PROG TLASTS EQU $-BASE WORD LASTSN-BASE LASTSN ABSOLUTE OFFSET FROM BASE PROG TTEST EQU $-BASE WORD TEST-BASE  TEST ABSOLUTE OFFSET FROM BASE PROG TWSIZE EQU $-BASE WORD WSIZE-BASE WSIZE ABSOLUTE OFFSET FROM BASE PROG TSTORE EQU $-BASE WORD STORE-BASE STORE ABSOLUTE OFFSET FROM BASE PROG TSIZE EQU $-BASE  WORD SIZE-BASE SIZE ABSOLUTE OFFSET FROM BASE PROG TKIND EQU $-BASE WORD KIND-BASE KIND ABSOLUTE OFFSET FROM BASE PROG TEXIT EQU $-BASE WORD EXIT-BASE EXIT ABSOLUTE OFFSET FROM BASE PROG TMAP S EQU $-BASE WORD MAPS-BASE MAPS ABSOLUTE OFFSET FROM BASE PROG TMMUSTAT EQU $-BASE WORD MMUSTAT-BASE MMUSTAT ABSOLUTE OFFSET FROM BASE TDIOTY EQU $-BASE WORD DIOTY-BASE DIO ADDRESS KEEPER TCMND EQU $-BASE WORD CMND-BASE TLNCNT EQU $-BASE WORD LNCNT-BASE LINE COUNT KEEPER TDIOFG EQU $-BASE WORD DIOFLG-BASE 'T' OR 'P' OR 'B' FLAG KEEPER TLPCNT EQU $-BASE WORD LPCNT-BASE LINES/PAGE ON LP TSR EQU $-BASE WORD SR-BASE TITL ******** * * -- HEADING -- * ******** HEADNG EQU $  COPY ='T',A COPY A,*TDIOFG(X,Y) FLAG TO PRINT ON TTY/CRT JST HDNG1 HDNG2 COPY ='(',A (  JST *TTYP(X,Y) COPY =':',A : JST *TTYP(X,Y) COPY BASE,A  HEX ADDRESS ADD HBASE,A JST *THEX(X,Y) CONVERT 'A' INTO 4 HEX DIGITS COPY  ='-',A - JST *TTYP(X,Y) COPY =':',A : JST *TTYP(X,Y) COPY HLENTH,A DBG LENGTH ADD X,A DBG END ADDRESS SUB =1,A ADD HBASE,A JST  *THEX(X,Y) COPY =')',A ) JST *TTYP(X,Y) PRINT ) COPY =BELL,A JST *TTYP(X,Y) RING BELL COPY X,A 'A' = BASE ADDRESS ADD HBASE,A 'A' = HEADNG ADDRESS COPY A,*TEXIT(X,Y) INITIALIZE EXIT JMP *TRTN6(X,Y) CLEAR ANY BREAK POINTS HBASE WORD STDIOD-BASE HLENTH WORD TAIL-CARBUG TITL OPTION ENT COPY A,BASE SAVE 'A' COPY OPTION,A EXCH A,BASE ESTABLISH BASE ADDRESS & RESTORE 'A' JST SAVE  GO PRESERVE USER ENVIORMENT COPY Q,*TDIOTY(X,Y) UPDATE DIO ADD JMP HEADNG DO HEADING TITL * * THIS ROUTINE SETS UP THE INITIAL CONTEXT * UPON ENTRY TO CARBUG SO THAT THE CONTEXT * POINTER IS INITIALIZED TO CARBUG'S CONTEXT SAVE AREA* * LOADCTX ENT COPY CTXB,A ADDRESS OF CONTEXT AREA COPY BASE,X X HAS 'BASE' ADDRESS COPY X,Y ADD A,X X POINTS TO CP AREA COPY X,CPLOC INITIALIZE CPLOC  COPY X,5(X) INITIALIZE X REGISTER LOCATION COPY INITP,A A HAS INITIAL PROGRAM COUNTER ADD Y,A A HAS BASE1 ABSOLUTE ADDRESS COPY A,0(X) STORE PC COUNTER IN CP AREA COPY INITS,A GET NEW STATUS WORD COPY A,2(X) STORE NEW S REGISTER COPY INITK,A GET NEW K REGISTER COPY A,7(X) PUT IN CONTEXT AREA COPY INITL,A GET NEW L REGISTER COPY A,1(X) PUT IN CP AREA LCNTX 0(X) LOAD CONTEXT NOTE PC IS WRONG RTN LOADCTX RETURN * * INITP WORD BASE1-BASE INITS WORD :0040 XA ON AND USER OFF CTXB WORD CTXA-BASE CTXA RES 9,0 INITL WORD :0000 INITK WORD :FFFF INITIAL K REGISTER TITL ****** * * -- SAVE -- * - ALL THE USER HARDWARE REGIS TERS, CONSOLE WORD REGISTER AND * CONSOLE SENSE SWITCH ARE SAVED IN TEMPORARY REGISTERS. * - ALL THE BITS IN 'S' ARE SET TO ZERO EXCEPT 'XA' BIT, WHICH * IS NOT ALTERED * ****** SAVE ENT EXIT ADDRESS SAVED SIN 12  PROTECT 12 INSTRUCTIONS JEQ X,STKCNTX IF X ZERO THEN CONTEXT ON STACK COPY 3(X),A COPY A,AR  COPY 4(X),A COPY A,QR COPY 5(X),A COPY A,XR COPY 6(X),A COPY A,YR COPY 2(X),A COPY A,SR COPY 1(X),A COPY A,LR COPY 7(X),A COPY A,KR COPY 0(X),A COPY A,EXIT COPY X,CPLOC SAVE CONTEXT POINTER JMP CNTSAVE AND CONTINUE TO SAVE STKCNTX EQU $ GET CONTEXT FROM STACK POP A GET P REGISTER COPY A,EXIT POP A  COPY A,SR POP A COPY A,AR POP A COPY A,QR POP A COPY A,XR POP A COPY A,YR COPY K,A COPY A,KR SAVE OFF K REGISTER FOR LATER COPY =0,A ZERO OUT CPLOC COPY A,CPLOC FOR LATER CHECK COPY L,A COPY A,LR CNTSAVE EQU $ COPY =:0040,A TURN XA BIT COPY A,S EXCEPT 'XA' ALL BITS = 0 IN 4,A GET CONSOLE WORD REGISTER COPY A,CDR JT SS,SAVE11 IF SENSE SWITCH TRUS, SAVE 1 COPY =0,A  ELSE STORE 0 IN TEMP. SSW REGISTER JMP SAVE22 ELSE SAVE 0 IN TEMPORARY SSW REG SAVE11 COPY =1,A SAVE22 COPY A,SSWR COPY BASE,X COPY X,Y X + Y HAVE BASE PROG ADDRESS RTN SAVE  BACK TO CALLER CPLOC WORD 0 LPOOL ****** * * -- UNSAVE -- * RESTORE ALL USER HARDWARE REGISTERS * ****** UNSAVE ENT COPY CPLOC,X JEQ X,STKLOAD IF CONTEXT POINTER IS ZERO, GET OFF STACK COPY EXIT,A COPY A,0(X) COPY QR,A COPY A,4(X) COPY XR,A COPY A,5(X) COPY AR,A COPY A,3(X) COPY SR,A COPY A,2(X) COPY LR,A COPY A,1(X)  COPY YR,A COPY A,6(X) COPY KR,A COPY A,7(X) JMP CRDCH STKLOAD EQU $  COPY KR,A GET OLD STACK AND RESTORE COPY A,K COPY YR,A PUSH A COPY XR,A  PUSH A COPY QR,A PUSH A COPY AR,A PUSH A COPY SR,A PUSH A COPY EXIT,A PUSH A COPY LR,A COPY A,L CRDCH EQU $ COPY CDR,A  SELP A,4 SIN 5 SIN 3 RTN UNSAVE TITL HDNG1 ENT JST *TCRLF(X,Y) NEW LINE COPY ='C',A C JST *TTYP(X,Y) COPY ='A',A A JST *TTYP(X,Y) COPY  ='R',A R JST *TTYP(X,Y) COPY ='B',A B JST *TTYP(X,Y) COPY ='U',A  U JST *TTYP(X,Y) COPY ='G',A G JST *TTYP(X,Y) COPY =BLANK,A  JST *TTYP(X,Y) COPY =REV:%-24,A JST *TTYP(X,Y) COPY =REV:%-16&:FF,A JST *TTYP(X,Y) COPY =REV:%-8&:FF,A JST *TTYP(X,Y) COPY =REV:&:FF,A JST *TTYP(X,Y) COPY =BLANK,A JST *TTYP(X,Y) RTN HDNG1  TITL * WORD CELLS * EXIT WORD 0 TEMPORARY SAVE 'P' AR WORD 0 TEMPORARY SAVE 'A' QR WORD 0 TEMPORARY SAVE 'Q' XR WORD 0 TEMPORARY SAVE 'X' YR WORD 0  TEMPORARY SAVE 'Y' KR WORD 0 TEMPORARY SAVE 'K' LR WORD 0 TEMPORARY SAVE 'L' SR WORD 0 TEMPORARY SAVE 'S' CDR WORD 0 TEMPORARY SAVE CONSOLE WORD REGISTER SSWR WORD 0 TEMPORARY SAVE SENSE SWITCH * * MMU REGISTERS * MAPS WORD 0  MMU DMA AND USER MAP NUMBERS MMUSTAT WORD 0 MMU STATUS * * GENERAL REGISTERS 0 - 9, A - Z * G0 EQU $ START OF GENERAL REGISTER AREA WORD G:0,G:1,G:2,G:3,G:4,G:5 WORD G:6,G:7,G:8,G:9,G:A,G:B WORD G:C,G:D,G:E,G:F,G:G,G:H WORD G:I,G:J,G:K,G:L,G:M,G:N WORD G:O,G:P,G:Q,G:R,G:S,G:T WORD G:U,G:V,G:W,G:X,G:Y,G:Z TITL KIND WORD 0 TYPE OF REGISTER DUMP ****** * * -- DMPRS -- DUMP REGISTERS * ****** DMPRS ENT JST *TCRLF(X,Y) NEW LINE COPY =BELL,A ISSUE BELL CODE JST *TTYP(X,Y) COPY KIND,A FETCH TYPE OF REGISTER DUMP JST *TTYP(X,Y) JST SPACE  PRINT A BLANK JST SPACE PRINT A BLANK COPY ='P',A 'P' REGISTER JST  TYP:EQ ISSUE P = COPY *TEXIT(X,Y),A FETCH ADDRESS JST *TPADDR(X,Y) COPY ='A',A JST TYP:EQ ISSUE A= COPY AR,A 'A' VALUE JST *TSHEX(X,Y) DO HEX ROUTINE FOLLOWED BY A SPACE COPY ='Q',A JST TYP:EQ ISSUE Q= COPY QR,A JST *TSHEX(X,Y) DO HEX ROUTINE FOLLOWED BY A SPACE COPY ='X',A JST TYP:EQ ISSUE X= COPY XR,A JST *TSHEX(X,Y) DO HEX ROUTINE FOLLOWED BY A SPACE COPY ='Y',A JST TYP:EQ  ISSUE Y= COPY YR,A JST *THEX(X,Y) PRINT 'Y' JST *TCRLF(X,Y) JST SPACE  PRINT A BLANK JST SPACE PRINT A BLANK JST SPACE PRINT A BLANK COPY ='K',A JST TYP:EQ ISSUE K= COPY KR,A JST *TSHEX(X,Y) DO HEX ROUTINE FOLLOWED BY A SPACE COPY ='L',A JST TYP:EQ ISSUE L= COPY LR,A JST *TSHEX(X,Y)  DO HEX ROUTINE FOLLOWED BY A SPACE COPY ='S',A JST TYP:EQ ISSUE S= COPY SR,A JST *TSHEX(X,Y) DO HEX ROUTINE FOLLOWED BY A SPACE COPY ='D',A JST TYP:EQ ISSUE D=  COPY CDR,A JST *TSHEX(X,Y) DO HEX ROUTINE FOLLOWED BY A SPACE COPY ='C',A JST TYP:EQ  ISSUE C= COPY SSWR,A JST *THEX(X,Y) PRINT SENSE SWITCH RTN DMPRS  BACK TO CALLER TITL ***** * * -- MMUDMP -- * DUMP MMU REGISTERS * ***** MMUDMP ENT JST *TCRLF(X,Y)  ISSUE NEW LINE COPY =BELL,A RING HIS BELL JST *TTYP(X,Y) JST SPACE JST  SPACE JST SPACE COPY ='D',A PRINT DMA MAP NUMBER JST TYP:EQ 'D=' COPY MAPS,A GET BOTH MAP NUMBERS AND =:00F0,A MASK TO DMA ONLY SHIFT A,RO,4  GET INTO PRINT POSITION JST *TSHEX(X,Y) PRINT IT COPY ='U',A PRINT USER MAP NUMBER  JST TYP:EQ 'U=' COPY MAPS,A AND =:000F,A MASK TO USER MAP ONLY JST *TSHEX(X,Y) PRINT IT COPY MMUSTAT,Q GET MMU STATUS COPY ='A',A 'A=' TABEL ACCESS ENABLE BIT JST MMUSUB PRINT IT OUT COPY ='T',A 'T=' TRANSLATION ENABEL BIT JST MMUSUB PRINT IT OUT COPY ='C',A 'C=' CACHE ENABLE BIT JST TYP:EQ COPY =0,A SHIFT Q,RO,2 SKIP OVER 'DONT CARE' BIT JF OV,$+2 BIT SET? COPY =1,A YES JST *THEX(X,Y) NO, PRINT IT  JST *TCRLF(X,Y) NEXT LINE JST SPACE SPACE OVER JST SPACE JST SPACE COPY ='R',A  'R=' RESTRICTED CACHE HITS ENABLE BIT JST MMUSUB COPY ='H',A 'H=' CACHE HIT INDICATOR BIT JST MMUSUB COPY ='P',A 'P=' CACHE PARITY ERROR BIT JST MMUSUB COPY ='L',A 'L=' ERROR LIGHT INDICATOR BIT JST MMUSUB RTN MMUDMP ALL DONE TITL ***** * * -- MMUSUB -- * COMMON STUFF FOR MMUDMP * ***** MMUSUB ENT JST TYP:EQ PRINT 'LETTER=' COPY =0,A SHIFT Q,RO,1 SHIFT STATUS BIT INTO OVERFLOW JF OV,$+2 OV SET? COPY =1,A YES JST *TSHEX(X,Y) NO, PRINT IT RTN MMUSUB  RETURN TITL ****** * * -- TYP:EQ -- * PUBLISH CONTENTS OF 'A' REGISTER FOLLOWED BY '=' * ****** TYP:EQ ENT JST *TTYP(X,Y) PUBLISH CHARACTER FROM 'A' COPY ='=',A EQUAL SIGN JST *TTYP(X,Y)  PUBLISH EQUAL SIGN RTN TYP:EQ BACK TO CALLER ******* * * -- SPACE -- * ******* SPACE ENT  COPY =BLANK,A JST *TTYP(X,Y) RTN SPACE TITL CPNEW EQU $ WORD :0040 WORD :FFFF  JMP *RTNPT JMP TO BREAK POINT RETURN HANDLER CPNWA WORD CPNEW-BASE CPNWB WORD :00A2 CPNWC WORD :00A3 CPNWD WORD :5C35 SAVE CONTEXT INSTR. SKELETON RTNPT WORD RTN ****** * -- DBG -- * EXIT: ADDR -- 1ST PARAMETER * SIZE -- INDEX TO G OR R REGISTER * KEY -- COMMAND ID * TEST -- TERMINATOR *  LASTSN -- LAST SPECIAL TERMINATOR ****** DBG EQU $ JST TRAPX SET INTERNAL MEMORY TRAP COPY CPNWA,A ADD X,A GET LOCATION OF CONTEXT AREA COPY A,*CPNWC SET UP TRAP COPY CPNWD,A SET UP USER  TRAP LOCATION WITH SCNTX INST. COPY A,*CPNWB . FOR RETURN FROM BREAKPOINT COPY =0,A COPY A,CMND  INITIALIZE COMMAND KEEPER JST *TCRLF(X,Y) NEW LINE COPY =PROMCH,A GET PROM CHARACTER JST *TTYPCR(X,Y) JST *TRKB(X,Y) READ COMMAND ID COPY A,CMND SAVE FUNCTION ID CLSN ='Y',A IS IT SINGLE STEP ? /JPL15NOV78 JMP NEXT YES, PROCESS IT  /JPL15NOV78 CLSN ='Q',A IS IT STEP BACK ? JMP NEXT YES, DO IT CLSN  =BLANK,A BLANK=COMMENT MODE JMP COM DO COMMENT CLSN ='A',A DEVICE ASSIGNMENT? JMP DEVICE CLSN ='T',A TRAP INTERCEPT? JMP *TTRAP(X,Y) CLSN ='G',A  GENERAL REGISTER JMP $+2 YES,GO CALCULATE REGISTER INDEX JMP DBGR ELSE CHECK IF HARDWARE REGISTER JST *TRKB(X,Y) READ ANOTHER CHARACTER. G-REG NO. JST *TCHKG(X,Y) DEVELOP INDEX TO G-REG COPY A,SIZE SAVE INDEX IN 'SIZE' JMP DBG1 DBGR CLSN ='R',A  IS IT HARDWARE REGISTER? JMP $+2 YES, GO DEVELOP INDEX JMP DBGDV GO CHECK FOR DUMP/VERIFY/LOADER JST *TRKB(X,Y) READ R-REG NO CLSN =CR,A JUST R COMMAND? JMP ALLR YES, GO DUMP ALL R-REGISTERS JST *TCHKR(X,Y) GET R-REG INDEX COPY Q,SIZE  SAVE INDEX TO R-REG JMP DBG1 DBGDV EQU $ CLSN ='P',A MMU COMMAND P JMP $+2 JMP DBGDV1 NO IN READMAPS,A YES, GET MAP VALUES COPY A,*TMAPS(X,Y) IN  READSTAT,A GET STATUS COPY A,*TMMUSTAT(X,Y) JST *TRKB(X,Y) GET NEXT CHARACTER CLSN ='M',A MAP/PAGE PM JMP PMCOM JMP TO PM COMMAND CLSN =CR,A JMP ALLP P ONLY, DUMP ALL VALUES JST *TCHKR(X,Y) CHECK INDEX TO P VALUES COPY Q,SIZE SAVE INDEX DBGDV1 EQU $ CLSN ='M',A BM JMP *TMCMD(X,Y) IF BUS MONITOR COMMAND... BM DBG1 JST *TINP(X,Y) GET 1ST PARAMETER COPY Q,ADDR SAVE 1ST PARAMETER COPY CMND,Q GET FUNCTION ID COMMAND CLSN ='B',Q NEXT JMP BRK BREAK-POINT B CLSN ='C',Q JMP *TCOPYP(X,Y) COPY C CLSN ='F',Q JMP *TFILLP(X,Y) FILL  F CLSN ='L',Q JMP *TLIST(X,Y) LIST L CLSN ='S',Q JMP *TSRCH(X,Y)  SEARCH S CLSN ='J',Q JMP JMPP JUMP J CLSN ='I',Q JMP  *TINSP(X,Y) INSPECT I CLSN ='G',Q JMP *TGREG(X,Y) G-REG G CLSN ='R',Q JMP *TRREG(X,Y) R-REG R CLSN ='Z',Q JMP *TZTRNG(X,Y) CHAN Z   CLSN ='P',Q JMP *TRREG(X,Y) MMU-REG P JMP *TERROR(X,Y) ELSE ERROR ALLR COPY =BLANK,A COPY A,*TKIND(X,Y) JST *TDMPRS(X,Y) DO REGISTER DUMP JMP DBG  BACK TO DBG ALLP JST *TMMUDMP(X,Y) DO MMU DUMP JMP DBG BACK TO DEBUG ADDR WORD 0  1ST PARM KEEPER SIZE WORD 0 G + R REGISTER INDEX KEEPER CMND WORD 0 COMMAND ID KEEPER TRNT WORD RTN-BASE RETURN ADDRESS OFFSET FROM BASE SAVE2 WORD 0 TEMP CELL LPOOL TITL ****** * * -- A -- DEVICE ASSIGNMENT COMMAND * * ALX X = T(TTY), P(PRINTER), B(BOTH) -- LIST OUTPUT DEVICE * ****** DEVICE EQU $ JST *TRKB(X,Y) READ 2ND CHAR COPY A,SAVE2 SAVE IT JST *TRKB(X,Y) READ 3RD CHAR COPY A,ADDR SAVE 3RD PARMT/P/B JST *TRKB(X,Y) READ CR  CLSN =CR,A JMP $+2 JMP *TERROR(X,Y) NO CR ERROR COPY SAVE2,A GET 2ND PARM P/L CLSN ='L',A LIST OPTION JMP $+2 JMP *TERROR(X,Y) ERROR IF NOT 'P' OR 'L'  COPY ADDR,A GET 3RD PARM T/P/B CLSN ='T',A TTY/CRT OPTION? JMP DEV2 CLSN ='P',A PRINTER OPTION? JMP DEV1 CLSN ='B',A BOTH DESIRED? JMP DEV1 JMP *TERROR(X,Y) ERROR IF NOT T/P/B DEV1 COPY *TLPCNT(X,Y),A OUTPUT DEVICE IS EITHER LP OR  COPY A,*TLNCNT(X,Y) BOTH CRT/LP. DO A TOP FOR LP COPY ='P',A COPY A,*TDIOFG(X,Y) COPY =TOF,A DO TOP OF FORM JST *TTYP(X,Y) DO TOP OF FORM DEV2 COPY ADDR,A COPY A,*TDIOFG(X,Y)  SAVE OUTPUT DEVICE DESIRED ENDAS JMP *TDBG(X,Y) BACK TO DBG TITL * -- COM -- * COMMENT MODE COM JST *TRKB(X,Y) FETCH A CHARACTER CLSN =CR,A END OF COMMENT? JMP $+3 YES , BACK TO CARUG JST *TTYP(X,Y) PRINT TO LP JMP COM CONTINUE COMMENT MODE JST *TTYP(X,Y) PRINT TO LP JMP *TDBG(X,Y) YES, BACK TO DBG ****** * * -- J COMMAND -- JUMP FUNCTION * JMPP EQU $ COPY *TPFLG(X,Y),Q ANY INPUT JEQ Q,JMPP1 IF NO EXIT INPUT USE OLD ONE  COPY ADDR,A GET 1ST PARM - JUMP LOCATION COPY A,*TEXIT(X,Y) USER RETURN ADD COPY *TTEST(X,Y),A GET LAST CHARACTER CLSN =',',A MORE PARAMETERS? JMP BRK YES, GO DO BREAK POINT JMPP1 EQU $ COPY *TTEST(X,Y),A GET LAST TERMINATOR CLSN =',',A PARM MUST NOT ENT WITH COMMA JMP ERROR JST *TCRLF(X,Y) NEW LINE * ITERATION COUNT BP EXITS THROUGH HERE  / JMPP2 EQU $ / JST RSTRIT RESTORE MEMORY TRAP FROM INTERNAL WORKINGS IN READMAPS,A GET THE CURRENT MAP NUMBERS AND =:F,A SLIM DOWN TO USER ONLY  COPY A,CURRUSER SAVE IT COPY Y,X REFRESH 'X' WITH BASE ADR / COPY BMMRBS,A .  BM TBIT 15,A BM AND H3FFF,A  . BM COPY A,BMMRBS . BM COPY =0,A . BM JF OV,$+2  BM COPY BMON,A BM COPY A,BMCONT  BM COPY BMVEC,A SET BM COPY A,*H96 UP  BM COPY BMVEC+1,A INTERRUPT BM COPY A,*H97  VECTOR. BM COPY *TEXIT(X,Y),A COPY A,INLINE SAVE FOR BUS MONITOR LIST MOREBM JST *TUNSAV(X,Y) RE-STORE USER ENVIORMENT BMCONT NOP TURN ON BUSMON (SET SKIP COUNT ON BOARD TO 3) LCNTX 0(X) LOAD CONTEXT AND AWAY 3 H97 WORD :97 H96 WORD :96 INLINE WORD 0 USER INLINE -P- ADDRESS CURRUSER WORD 0 CURRENT USER MAP ****** * -- ERROR -- * ERROR FORMAT ERROR COPY =ARROW,A JST  *TTYPCR(X,Y) JMP RTN6X GO FIX BREAK POINTS ALLRX JMP ALLR OUT OF RANGE LINK *  .TO MAINTAIN BINARY RELOCATABILITY * BMON SELP A,BMADDR%3+0 BM BMMRBS WORD 0 SAVE FOR THE MONITOR BITS. BM BMVEC WORD :5C35 SAVE CONTEXT WORD RTNBM  . BM H3FFF WORD :3FFF . BM CTAB  WORD CTXB BASA WORD BASE CTAA WORD CTXA TITL ****** * * -- BRK -- BREAK POINT COMMAND * * FORMAT OF COMMAND IS : * BAAAA[;CCCC][,AAAA][;CCCC][,AAAA][;CCCC][,AAAA][;CCCC] * WHERE B=COMMAND , AAAA=ADDRESS , CCCC=ITERATION COUNT * ****** BRK EQU $ ADD SVTBL1,X ADD OFFSET TO BASE COPY X,SVTBL BREAK POINT TABLE REAL ADDRESS COPY Y,X RESTORE 'X' COPY *TCMND(X,Y),A GET COMMAND ID CLSN ='J',A WAS COMMAND A 'J' JMP BRK2 YUP! GO DO REGULAR BREAK POINT CLSN ='B',A IS IT A NORMAL BP COMMAND ? /JPL15NOV78 JMP BRK1 YES, PROCESS NORMAL BP /JPL15NOV78  COPY *TEXIT(X,Y),Q GET CURRENT P-REG /JPL15NOV78 CLSN ='Y',A IS IT STEP FORWARD ONE?  ADD =1,Q GET NEXT LOC AS BP ADDRESS /JPL15NOV78 CLSN ='Q',A IS IT STEP BACK ONE? SUB =1,Q YES,GET CURRENT LOC-1 AS BP ADD JMP BRK3 PUT IT IN BP TABLE  /JPL15NOV78 BRK1 EQU $ /JPL15NOV78 COPY PFLG,A ANY PARAMETER JEQ A,BRK7 COPY *TADDR(X,Y),Q GET 1ST PARAMETER FOR 'B' COMMAND JMP BRK2+1   DO BREAK POINT BRK2 JST *TINP(X,Y) FETCH NEXT PARAMETER COPY BRKCNT,A # OF BREAKPOINTS CURRENTLY CLSN =4,A MORE THAN 4 JMP ERROR ERROR BRK3 EQU $  /JPL15NOV78 IMS BRKCNT COUNT BREAKPOINTS COPY Q,X GET ADDRESS OF BREAK-POINT IN -X- COPY SR,A GET USERS -S- TBIT USERMAP,A TEST IF IN USER MAP JF OV,RTN7X JUMP IF NOT USER MAP COPYU 0(X),A ELSE ITS A USER MAP, USER COPYU IMS SVTBL GET USER INSTRUCTION AND BUMP COUNTER COPY A,*SVTBL SAVE USER INSTRUCTION COPY UTRAP0,A GET CARBUG USERTRAP INSTRUCTION COPYU A,0(X) STUFF IT IN THE DESIRED LOCATION JMP RTN7Y SKIP OVER NON-USER MAP STUFF RTN7X EQU $ COPY 0(X),A GET USER INSTRUCTION IMS SVTBL COPY A,*SVTBL SAVE USER INSTRUCTION COPY UTRAP0,A SUBSTITUTE UTRAP AT REQUESTED BREAKPOINT COPY A,0(X) RTN7Y EQU $ IMS SVTBL COPY X,*SVTBL SAVE INSTRUCTION ADDRESS COPY Y,X RESTORE X WITH Y COPY *TTEST(X,Y),A FETCH TERMINATOR  XOR Q,Q CLEAR ITERATION COUNT /JPL11NOV78 CLSN =';',A IS ITERATION COUNT GIVEN /JPL11NOV78 JMP BRK4 YES, PROCESS IT /JPL11NOV78 JMP BRK5 JUMP IF NO ITERATION COUNT /JPL11NOV78 RTN6X JMP RTN6 LINK TO MAINTAIN BIN. RELOCATABILITY BRK4 EQU $  /JPL11NOV78 JST *TINP(X,Y) GET ITERATION COUNT /JPL11NOV78 JGT Q,$+2 SKIP IF COUNT > 0 /JPL11NOV78 XOR Q,Q INDICATE NO COUNT SPECIFIED /JPL11NOV78  SHIFT Q,LO,1 DOUBLE COUNT /JPL11NOV78 NEG Q,Q NEGATE IT FOR INDEX /JPL11NOV78 BRK5 EQU $ /JPL11NOV78 IMS SVTBL BUMP TABLE ADDRESS /JPL11NOV78 COPY Q,*SVTBL SAVE ITERATION COUNT /JPL11NOV78 COPY =1,A  GET FLAG /JPL11NOV78 JNE Q,$+2 SKIP IF COUNT NOT SPECIFIED /JPL11NOV78 XOR  A,A CLEAR FLAG IF NOT /JPL11NOV78 IMS SVTBL BUMP TABLE ADDRESS /JPL11NOV78 COPY A,*SVTBL SAVE BREAKPOINT FLAG /JPL11NOV78 COPY *TTEST(X,Y),A GET THE TERMINATOR CHARACTER /JPL11NOV78 CLSN =',',A ANOTHER PARAMETER ? /JPL11NOV78 JMP BRK2 PROCESS NEXT PARAMETER /JPL11NOV78 JMP JMPP1 IF NO MORE, GO BACK TO USER /JPL11NOV78 BRK6 JMP ALLRX  DO R-REGISTER DUMP & BACK TO DBG BRK7 EQU $ JMP *TERROR(X,Y) NO PARAMETERS, ERROR * * WORD SECTION * PFLG WORD 0 INPUT PARM FLAG BRKCNT WORD 0 BREAK POINT COUNT KEEPER SVTBL1 WORD SVBRK-BASE-1 SVTBL WORD 0 * BP QUEUE : 0=INSTRUCTION,1=ADDRESS,2=COUNT,3=FLAG SVBRK RES 4*4,0  BREAK POINT QUEUE UTRAP0 UTRAP A,0 BREAK POINT INSTRUCTION JMPP2X JMP JMPP2 TO MAINTAIN BIN. RELOCATABILITY LPOOL TITL ****** * * -- RTN -- RETURN FROM BREAK POINT * * ****** TEMP WORD 0 MASK WORD 0 RTNADD WORD 0 RTN EQU $ SIN 7 . BM SELP A,BMADDR%3+1 .  BM JST SAVE DMS *TEXIT(X,Y) MOVE P COUNTER BACK ONE COPY A,RTNADD COPY BRKCNT,A FETCH BREAK POINT COUNT JNE A,RTN2 RTN1 COPY ='D',A FLAG AS DUMMY BREAK POINT COPY Y,X REFERESH 'X' WITH BASE ADD COPY A,*TKIND(X,Y) JMP RTN4 RTN2 NEG A,A -BREAK POINT COUNT COPY A,MASK SET INTERROGATION COUNTER COPY *TEXIT(X,Y),A FETCH RETURN ADDRESS COPY SVTBL,X BREAK POINT SAVE QUEUE ADDRESS SUB =4,X  ADJUST BP TABLE ADDRESS /JPL11NOV78 RTN3 EQU $ /JPL11NOV78 CSK A,2(X) COMPARE WITH TABLE ENTRY /JPL11NOV78 NOP JMP RTN5 BUMP INDEX REGISTER * FOUND BREAKPOINT IN TABLE COPY 3(X),A GET ITERATION COUNT /JPL11NOV78 JEQ A,RTN3A JUMP IF NO ITERATION COUNT /JPL11NOV78 * IT'S AN ITERATION COUNT BREAKPOINT COPY 4(X),Q GET BREAKPOINT FLAG /JPL11NOV78 COPY Q,TEMP SAVE BREAKPOINT FLAG /JPL11NOV78 COPY X,Q SAVE TABLE INDEX /JPL11NOV78 COPY SR,A SEE IF USER IS IN USER MAP TBIT USERMAP,A JT OV,RTN3X JUMP IF USER MAP COPY 1(X),A GET USER INSTRUCTION /JPL11NOV78 COPY 2(X),X GET LOCATION /JPL11NOV78 EXCH A,0(X) SWAP INSTRUCTION/JST *0 /JPL11NOV78 ADD TEMP,X GET PRIOR/NEXT INSTRUCTION /JPL11NOV78 EXCH A,0(X) PLACE BREAKPOINT THERE /JPL11NOV78 JMP RTN3Y SKIP USER MAP STUFF RTN3X EQU $ COPY 1(X),A  GET USER INSTRUCTION COPY 2(X),X GET LOCATION COPYU A,0(X) STUFF IT IN BREAKPOINT LOCATION ADD TEMP,X GET NEXT TRAP COPYU 0(X),A GET THE USER INSTRUCTION EXCH A,UTRAP0  GET THE UTRAP AND SAVE THE INSTRUCTION COPYU A,0(X) STUFF THE UTRAP EXCH UTRAP0,A RETURN UTRAP, GET USER INSTRUCTION RTN3Y EQU $ EXCH Q,X SWAP TABLE ADDRESS/LOCATION /JPL11NOV78 COPY  A,1(X) SAVE THIS INSTRUCTION /JPL11NOV78 COPY Q,2(X) SAVE IT'S LOCATION /JPL11NOV78 COPY TEMP,A GET BREAKPOINT FLAG /JPL11NOV78 NEG A,A POINT TO NEXT/PRIOR  /JPL11NOV78 COPY A,4(X) RESTORE BREAKPOINT FLAG /JPL11NOV78 IMS 3(X) BUMP ITERATION COUNT /JPL11NOV78 NOP COUNT NOT DONE, RETURN /JPL11NOV78 JMP JMPP2X   DONE, RETURN, STOP NEXT TIME /JPL11NOV78 RTN3A EQU $ /JPL11NOV78  COPY ='B',A REAL BREAK POINT COPY Y,X REFERESH 'X' WITH BASE ADD COPY A,*TKIND(X,Y) RTN4 EQU $ JST *TDMPRS(X,Y) DO REGISTER DUMP COPY *TKIND(X,Y),A CLSN ='D',A  IF DUMMY BRK POINT, THEN BUMP TO IMS *TEXIT(X,Y) NEXT EXECUTABLE LOCATION JMP RTN6  RESTORE ANY OUTSTANDING BRK POINTS RTN5 SUB =4,X BUMP INDEX TO BRK POIN TABLE IMS MASK  BUMP COUNTER JMP RTN3 JMP RTN1 RTN6 EQU $ COPY BRKCNT,A # OF BREAK POINTS  JNE A,$+3 COPY Y,X JMP *TDBG(X,Y) IF BRKCNT = 0, BACK TO DBG COPY SVTBL,X  CURRENT SAVE TABLE ADDRESS SUB =4,X UPDATE TABLE ADDRESS COPY X,SVTBL AND PUT IT BACK COPY 1(X),A GET USER INSTRUCTION COPY 2(X),X GET USER INST. ADDRESS COPY SR,Q SEE IF USER MAP TBIT USERMAP,Q JF OV,RTNDOG JUMP IF NOT USER MAP COPYU A,0(X) STORE INST. AT PROPER ADDRESS JMP RTN6Y RTNDOG EQU $ COPY A,0(X) STORE INSTRUCTION AT BREAKPOINT RTN6Y EQU $ COPY BRKCNT,A ONE BRK POINT RESTORED SUB =1,A COPY  A,BRKCNT JMP RTN6 GO PROCESS REST OF THE BRK POINTS SPACE 2 ******  BM * BM * --- RTNBM --- RETURN FROM BUS MONITOR BREAKPOINT. BM * BM ****** BM RTNBM EQU $ ENTER FROM BUS MONITOR BREAKPOINT.  BM COMMENT VIA A SAVE CONTEXT WORD :0040 -S- WORD :FFFF -K- SIN 7 .  BM SELP A,BMADDR%3+1 . BM JST SAVE PRESERVE CURRENT ENVIORNMENT. BM COPY Y,X REFRESH X. BM  IN READMAPS,A GET MAPS AND =:F,A LOSE THE DMA MAP NUMBER SUB CURRUSER,A SEE IF IT MATCHS THE ONE WANT JEQ A,$+2 JUMP IF IT MATCHES JMP MOREBM ELSE, CONTINUE COPY *TEXIT(X,Y),A GET -P- COPY A,RTNADD COPY ='M',A MARK AS BUS MONITOR ENTRY. BM COPY A,*TKIND(X,Y) . BM COPY SR,A SET THE USER BM OR =:100,A INTERRUPT ENABLE BM COPY A,SR BIT. BM  COPY BMMRBS,A SET THE BM SBIT 14,A BUS MONITOR ENTRY.  BM COPY A,BMMRBS FLAG. BM JMP RTN4 .   BM LPOOL TITL ****** * -- TRAP -- * INTERCEPTS PROCESSOR TRAP * INTERCEPTABLE TRAPS ARE; * -CONSOLE INTERRUPT(C) * -UNIMPLEMENTED INSTRUCTION TRAP(I) * -UNINSTALLED MEMORY TRAP(U) * -CHAR/NUM EXCEPTION TRAP(N) * -STACK EXCEPTION TRAP(S) * -ARITHMETIC ERROR TRAP(A) TRAP EQU $ JST *TRKB(X,Y)  INPUT SECOND CHARACTER CLSN =CR,A CARRIAGE RETURN? JMP TRAP2 YES RESTORE ALL TRAPS TRPT CLSN ='T',A 'T'? JMP $+2 YES GO SEE IF CR JMP TRPC NO SEE IF 'C'  JST *TRKB(X,Y) INPUT NEXT CHARACTER CLSN =CR,A CARRIAGE RETURN? JMP SETT YES GO SET INTCPT TAGS JMP *TERROR(X,Y) NO ERROR TRPC CLSN ='C',A 'C'? JMP $+2 YES GO SET INTERCEPT TAG JMP TRPI NO SEE IF 'I' IMS TC SET TC=1 JMP TRAP1  GO GET NEXT CHARACTER TRPI CLSN ='I',A 'I'? JMP $+2 YES GO SET INTERCPT TAG JMP TRPM NO GO SEE IF 'U' IMS TI SET TI=1 JMP TRAP1 GO GET NEXT CHARACTER TRPM CLSN ='U',A 'U'? JMP $+2 YES GO SET INTERCEPT TAG JMP TRPN NO SEE IF 'N' IMS TM SET TM=1 JMP TRAP1 GO GET NEXT CHARACTER TRPN CLSN ='N',A 'N'?  JMP $+2 YES GO SET INTERCEPT TAG JMP TRPS NO SEE IF 'S' IMS TN  SET TN=1 JMP TRAP1 GO GET NEXT CHARACTER TRPS CLSN ='S',A 'S'? JMP $+2 YES GO SET INTERCEPT TAG JMP TRPA NO SEE IF 'A' IMS TS SET TS=1 JMP TRAP1 GO GET NEXT CHARACTER TRPA CLSN ='A',A 'A'? JMP $+2 YES GO SET INTERCEPT TAG  JMP ERR NO NONE OF ABOVE IMS TA SET TA=1 JMP TRAP1 GO GET NEXT CHARACTER SETT EQU $ IMS TC SET TC=1 IMS TI SET TI=1 IMS TM SET TM=1 IMS TN SET TN=1 IMS TS SET TS=1 IMS TA SET TA=1  JMP TRAP2 DO TRAP INTERCEPTIONS TRAP1 EQU $ JST *TRKB(X,Y) INPUT NEXT CHARACTER CLSN =CR,A CARRIAGE RETURN? JMP TRAP2 YES GO DO TRAP INTERCEPTION CLSN =',',A COMMA?  JMP $+2 YES JMP ERR NO ERROR JST *TRKB(X,Y) INPUT NEXT CHARACTER  JMP TRPC SEE IF 'C' ERR JST RESETT RESET ALL INTERCEPT TAGS JMP *TERROR(X,Y) ERROR EXIT TRAP2 EQU $ JST TRAPC DO CONSOLE INT TRAP INTERCEPT JST TRAPI DO UNIMP INST TRAP INTERCEPT JST TRAPM DO MEM ERROR TRAP INTERCEPT JST TRAPN DO CHA/NUM ERROR TRAP INTERCEPT JST TRAPS DO STACK ERROR TRAP INTERCEPT JST TRAPA DO ARITH ERROR TRAP INTERCEPT   JST RESETT RESET ALL INTERCEPT TAGS COPY Y,YREG SAVE OFFSET VALUE JMP *TDBG(X,Y) BACK TO DEBUG LPOOL * TRAPC ENT COPY TC,A GET INTERCEPT TAG COPY CONSOLE,Q JEQ A,TRAPC2 GO RESTORE TRAP IF 0 JEQ Q,TRAPC1 SET NOT REQUIRED IF 0 COPY SAVECTX,A FETCH SAVE CONTEXT EXCH A,*CIN COPY A,CINTB COPY TCINTS(Y),Q GET INTCPT SERVICE ADDRESS ADD X,Q EXCH Q,*CIN+1 COPY Q,CINTB+1 COPY =0,A COPY A,CONSOLE SET INTERCEPT FLAG TRAPC1 COPY *TSR(X,Y),A RBIT 2,A DISABLE BYTE MODE SBIT 4,A ENABLE CONSOLE INT SBIT 8,A ENABLE INT COPY A,*TSR(X,Y) STORE BACK SREG RTN TRAPC TRAPC2 JNE Q,TRAPC3  INTERCEPT NOT SET IF NOT 0 COPY CINTB,A FETCH ORIGINAL CONTENTS COPY A,*CIN RESTORE IN TRAP LOC COPY CINTB+1,A COPY A,*CIN+1 IMS CONSOLE RESET INTERCEPT FLAG TRAPC3 COPY *TSR(X,Y),A RBIT 4,A DISABLE CINT COPY A,*TSR(X,Y) STORE BACK SREG RTN TRAPC CONSOLE ENT JST SAVE SAVE USERS ENVIRONMENT COPY YREG,Y RESTORE OFFSETS COPY Y,X COPY =0,A  SET INTERCEPT FLAG COPY A,CONSOLE OUT A,1 TURN OFF CINT SW COPY ='C',A  JMP TSRTN TRAPI ENT COPY TI,A GET INTERCEPT TAG COPY UNIMPLEM,Q GET INTERCEPT FLAG JEQ A,TRAPI2 GO RESTORE TRAP IF 0 JEQ Q,TRAPI1 SET NOT REQUIRED IF 0 COPY SAVECTX,A GET SAVE CONTEXT CODE EXCH A,*UIT SWAP CONTENTS AT TRAP LOC + 2 COPY A,UITB SAVE ORIGINAL COPY TUITS(Y),Q GET INTCPT SERVICE ADDRESS ADD X,Q EXCH Q,*UIT+1 SWAP CONTENTS AT TRAP LOC +3 COPY Q,UITB+1 CONTENTS TRAPI1 COPY =0,A COPY A,UNIMPLEM SET INTERCEPT FLAG  RTN TRAPI TRAPI2 JNE Q,TRAPI3 RESTORE NOT REQUIRED IF NOT 0 COPY UITB,A FETCH ORIGINAL CONTENTS COPY A,*UIT RESTROE IN TRAP LOC COPY UITB+1,Q COPY Q,*UIT+1 RESTORE IN TRAP LOC IMS UNIMPLEM RESET INTERCEPT FLAG TRAPI3 RTN TRAPI UNIMPLEM ENT JST SETIF SET INTERCEPT FLAG COPY :84,A SAVE USERS PROGRAM LOC @ TRAP TIME COPY A,*TEXIT(X,Y) COPY ='I',A  JMP TSRTN TRAPX ENT COPY IT,A SEE IF WE ALREADY SET THE TRAP JNE A,NOTRAP JUMP IF WE HAVE  IMS IT OTHERWISE SET THE TRAP COPY JSTIT,A GET THE JST INSTRUCTION FOR THE TRAP EXCH A,*XET GET CURRENT CONTENTS OF THE TRAP COPY A,XETB SAVE IT, AND PUT THE JST IN ITS PLACE COPY =INTERNAL,Q GET TRAP HANDLER ROUTINE EXCH Q,*XET+1 STUFF IT IN PLACE COPY Q,XETB+1 SAVE CURRENT CONTENTS COPY Y,YREG SAVE -Y- NOTRAP RTN TRAPX RETURN TO CALLER RSTRIT ENT COPY IT,A GET TRAP FLAG JEQ A,DOGIT NO N EED TO RESTORE COPY XETB,AQ RESTORE TRAP TO ORIGINAL CONFIGURATION COPY AQ,*XET COPY =0,A  COPY A,IT ZERO INTERNAL FLAG DOGIT RTN RSTRIT RETURN LPOOL TRAPM ENT COPY TM,A GET INTERCEPT TAG COPY UINSTLED,Q GET INTERCEPT FLAG JEQ A,TRAPM2 GO RESTORE TRAP IF 0 JEQ Q,TRAPM1 SET NOT REQUIRED IF 0 COPY SAVECTX,A GET SAVE CONTEXT CODE EXCH A,*MET SWAP CONTENTS AT TRAP LOC + 2 COPY A,METB SAVE ORIGINAL COPY TMETS(Y),Q GET INTCPT SERVICE ADDRESS  ADD X,Q EXCH Q,*MET+1 SWAP CONTENTS AT TRAP LOC + 3 COPY Q,METB+1 CONTENTS TRAPM1 COPY =0,A COPY A,UINSTLED SET INTERCEPT FLAG RTN TRAPM TRAPM2 JNE Q,TRAPM3 RESTORE NOT REQUIRED IF NOT 0 COPY METB,A FETCH ORIGINAL CONTENTS COPY A,*MET RESTORE IN TRAP LOC COPY METB+1,Q COPY Q,*MET+1 RESTORE IN TRAP LOC IMS UINSTLED SET INTERCEPT FLAG TRAPM3 RTN TRAPM CIN WORD :94,:95 CONSOLE INT. LOC. AND +1 CINTB WORD 0,0 UIT WORD :86,:87 UNIMP INST TRAP LOC + 2 AND + 3 UITB WORD 0,0 MET WORD :8A,:8B MEM ERROR TRAP LOC + 2 AND + 3 METB WORD 0,0 XET WORD :8A,:8B MEM ERROR TRAP LOC + 2 AND + 3 XETB WORD 0,0 NET WORD :9A,:9B CHA/NUM ERROR TRAP LOC + 2 AND + 3 NETB WORD 0,0 SET WORD :9E,:9F STACK ERROR TRAP LOC +2 AND +3 SETB WORD 0,0 AET WORD :AA,:AB ARITH ERROR TRAP LOC + 2 AND + 3 AETB WORD 0,0 SAVECTX WORD :5C35 SAVE CONTEXT INSTRUCTION CODE JSTIT JST *$+1 IT WORD 0 INTERNAL TRAP SET FLAG UINSTLED ENT JST SETIF IN 7,A GET USER PROGRAM COUNTER FROM MMU COPY A,*TEXIT(X,Y) AT TRAP TIME COPY ='U',A TSRTN EQU $ COPY A,*TKIND(X,Y) STORE TYPE OF REG DUMP JST *TDMPRS(X,Y) DISPLAY REGISTERS JMP *TRTN6(X,Y) RETURN TO DEBUG RESETT ENT COPY =0,A RESET INTERCEPT TAGS COPY A,TC COPY A,TI COPY A,TM COPY A,TN COPY A,TS COPY A,TA RTN RESETT SETIF ENT JST SAVE SAVE USERS ENVIRONMENT COPY SETIF,A SET INTERCEPT FLAG SUB =2,A COPY A,SETIF COPY =0,A COPY A,*SETIF IMS SETIF BUMP FOR RETURN IMS SETIF COPY YREG,X RESTORE OFFSETS COPY YREG,Y  RTN SETIF TRAPN ENT COPY TN,A GET INTCPT TAG COPY NUMERIC,Q GET INTERCEPT FLAG JEQ A,TRAPN2 GO RESTORE TRAP IF 0 JEQ Q,TRAPN1 SET NOT REQUIRED IF 0 COPY SAVECTX,A GET SAVE CONTEXT CODE EXCH A,*NET SWAP CONTENTS AT TRAP LOC + 2 COPY A,NETB SAVE ORIGINAL COPY TNETS(Y),Q GET INTCPT SERVICE ADDRESS ADD X,Q EXCH Q,*NET+1 SWAP CONTENTS AT TRAP LOC + 3 COPY Q,NETB+1 CONTENTS TRAPN1 COPY =0,A COPY A,NUMERIC SET INTERCEPT FLAG   RTN TRAPN TRAPN2 JNE Q,TRAPN3 RESTORE NOT REQUIRED IF NOT 0 COPY NETB,A FETCH ORIGINAL CONTENTS COPY A,*NET RESTORE IN TRAP LOC COPY NETB+1,A COPY Q,*NET+1 RESTORE IN TRAP LOC IMS NUMERIC SET INTERCEPT FLAG TRAPN3 RTN TRAPN NUMERIC ENT JST SETIF COPY :98,A SAVE USERS P COUNTER @ TRAP TIME COPY A,*TEXIT(X,Y) COPY ='N',A TSTRTN2 JMP TSRTN TRAPS  ENT COPY TS,A GET INTERCEPT TAG COPY STACK,Q GET INTERCEPT FLAG JEQ A,TRAPS2  GO RESTORE TRAP IF 0 JEQ Q,TRAPS1 SET NOT REQUIRED IF 0 COPY SAVECTX,A GET SAVE CONTEXT CODE EXCH A,*SET SWAP CONTENTS AT TRAP LOC + 2 COPY A,SETB SAVE ORIGINAL COPY TSETS(Y),Q GET INTCPT SERVICE ADDRESS ADD X,Q EXCH Q,*SET+1 SWAP CONTENTS AT TRAP LOC + 3 COPY Q,SETB+1 CONTENTS TRAPS1 COPY =0,A COPY A,STACK SET INTERCEPT FLAG RTN TRAPS TRAPS2  JNE Q,TRAPS3 RESTORE NOT REQUIRED IF NOT 0 COPY SETB,A FETCH ORIGINAL CONTENTS COPY A,*SET  RESTORE IN TRAP LOC COPY SETB+1,Q COPY Q,*SET+1 RESTORE IN TRAP LOC IMS STACK  SET INTERCEPT FLAG TRAPS3 RTN TRAPS STACK ENT JST SETIF COPY :9C,A SAVE USER P COUNTER @ TRAP TIME COPY A,*TEXIT(X,Y) COPY ='S',A JMP TSRTN TRAPA ENT COPY TA,A GET INTERCEPT TAG COPY ARITHMET,Q GET INTERCEPT FLAG JEQ A,TRAPA2 GO RESTORE TRAP IF 0  JEQ Q,TRAPA1 SET NOT REQUIRED IF 0 COPY SAVECTX,A GET SAVE CONTEXT CODE EXCH A,*AET  SWAP CONTENTS AT TRAP LOC + 2 COPY A,AETB SAVE ORIGINAL COPY TAETS(Y),Q GET INTCPT SERVICE ADDRESS ADD X,Q EXCH Q,*AET+1 SWAP CONTENTS AT TRAP LOC + 3 COPY Q,AETB+1 CONTENTS TRAPA1 COPY =0,A COPY A,ARITHMET SET INTERCEPT FLAG RTN TRAPA TRAPA2 JNE Q,TRAPA3 RESTORE NOT REQUIRED IF NOT 0 COPY AETB,A FETCH ORIGINAL CONTENTS COPY A,*AET RESTORE AT TRAP LOC  COPY AETB+1,Q COPY Q,*AET+1 RESTORE IN TRAP LOC IMS ARITHMET SET INTERCEPT FLAG TRAPA3 RTN TRAPA ARITHMET ENT JST SETIF COPY :A8,A SAVE USER P COUNTER @ TRAP TIME COPY A,*TEXIT(X,Y) COPY ='A',A JMP TSRTN LPOOL * * * SAVE CONTEXT AREAS * CINTS EQU $ WORD :0040 -S- WORD :FFFF -K- JST CONSOLE TRAP HANDLER ROUTINE UITS EQU $ WORD :0040 -S- WORD :FFFF -K-  JST UNIMPLEM TRAP HANDLER ROUTINE METS EQU $ WORD :0040 -S- WORD :FFFF -K- JST UINSTLED TRAP HANDLER ROUTINE NETS EQU $ WORD :0040 -S- WORD :FFFF -K- JST NUMERIC TRAP HANDLER ROUTINE SETS EQU $ WORD :0040 -S- WORD :FFFF -K- JST STACK TRAP HANDLER ROUTINE AETS EQU $ WORD :0040 -S- WORD :FFFF  -K- JST ARITHMET TRAP HANDLER ROUTINE TC WORD 0 INTCPT TAG 0=RESTORE 1=SET TI WORD 0  INTCPT TAG 0=RESTORE 1=SET TM WORD 0 INTCPT TAG 0=RESTORE 1=SET TN WORD 0 INTCPT TAG 0=RESTORE 1=SET TS WORD 0 INTCPT TAG 0=RESTORE 1=SET TA WORD 0 INTCPT TAG 0=RESTORE 1=SET YREG WORD 0 INTERNAL ENT INTERNAL TRAP HANDLER COPY ='X',A 'X' TYPE OF DUMP COPY YREG,X GET THE YREG COPY A,*TKIND(X,Y) JST *TDMPRS(X,Y) DUMP THE REGISTERS JMP *TDBG(X,Y) GO BACK TO CARBUG TITL ****** * * -- RREG -- * -- DISPLAY AND CHANGE OF REGISTERS -- * ****** RREG EQU $ COPY *TCMND(X,Y),A MMU REGISTERS ? CLSN ='P',A JMP PREG YES JST *TCOMMA(X,Y) ERROR IF , IN INPUT COPY =EXIT-BASE,A RREGG COPY *TSIZE(X,Y),Q ADD X,A ADD Q,A DESIRED REGISTER ADDRESS COPY A,SIZER SAVE IT COPY *TPFLG(X,Y),A GET 'PFLG' CONTENTS JNE A,RREG1 IF VALUE SUPPLIED, GO CHANGE REGISTER JST *TCRLF(X,Y) NEW LINE COPY *SIZER,A  GET DESIRED REG CONTENTS JST *TSHEX(X,Y) DO HEX ROUTINE FOLLOWED BY A SPACE RREG5 EQU $ JST  *TINP(X,Y) GET NEXT PARM-- CHANGE JST *TCOMMA(X,Y) ERROR IF , COPY *TPFLG(X,Y),A GET PARM ENTERED FLAG RREG1 JEQ A,RREG2 IF NO CHANGE, IT MAY BE / OR X COPY *TVALU(X,Y),A GET CHANGE  COPY A,*SIZER CHANGE THE DESIRED REGISTER JMP *TDBG(X,Y) START AGAIN IN DBG RREG2 COPY *TLASTS(X,Y),A FETCH LAST TERMINATOR CLSN =0,A ANY SPECIAL TERMINATOR? JMP *TDBG(X,Y)  NO SPECIAL TERMINATOR, BACK TO DBG CLSN ='/',A LAST TERMINATOR MUST BE JMP RREG3  / OR X CLSN ='X',A JMP $+2 JMP *TERROR(X,Y) ELSE ERROR COPY *SIZER,A  GET DESIRED REG CONTENTS SHIFT A,LO,1 MULTIPLY BY 2 JMP RREG4 RREG3 COPY *SIZER,A SHIFT A,RO,1 DIVIDE BY 2 RREG4 JST *TCRLF(X,Y) NEW LINE JST *TSHEX(X,Y) DO HEX ROUTINE FOLLOWED BY A SPACE JMP RREG5 GET ANOTHER PARM SIZER WORD 0 ****** * * -- DISPLAY AND CHANGE OF GENERAL REGISTERS -- * GREG EQU $ COPY =G0-BASE,A G-REG ABSOLUTE OFFSET JMP RREGG GO PERFORM 'G' FUNCTION LPOOL TITL ***** * * -- DISPLAY AND CHANGE OF MMU REGISTERS -- * * PREG EQU $  JST *TCOMMA(X,Y) COMMA IS ILLEGAL HERE COPY =MAPS-BASE,Q GET LOCATION OF MMU VALUES COPY *TSIZE(X,Y),A GET INDEX CSK A,=1 ARE WE DEALING WITH MAPS? JMP $+2 YES ADD =1,Q  POINT TO NEXT WORD (STATUS) ADD X,Q ADJUST ADDRES COPY Q,SIZER SAVE ADDRESS  COPY *TPFLG(X,Y),A GET PARAMETER FLAG JNE A,PREG1 JMP IF A VALUE IS APPENDED JST *TCRLF(X,Y)   ELSE, GO TO NEXT LINE COPY *SIZER,A GET VALUE COPY *TSIZE(X,Y),Q GET INDEX CSK Q,=1  DMA, USER OR STATUS?? JMP $+3 USER JMP STATUS STATUS JMP DMA DMA  AND =:000F,A SLIM DOWN TO LOWER 4 BITS JST *TSHEX(X,Y) PRINT IT JMP PREG5 CONTINUE * DMA SHIFT A,RO,4 SLIM DOWN TO DMA # JMP $-4 DO IT JMP PREG5 CONTINUE * STATUS SUB =2,Q  ADJUST TO STATUS BIT INDEX OF STATUS WORD SHIFT Q,L,4 SHIFT FOR XNX XNX Q TBIT 0,A  XFER DESIRED BIT TO OV COPY =0,A JF OV,$+2 OV SET? COPY =1,A YES PRINT 'STATUS' = 0001  JST *TSHEX(X,Y) NO, PRINT 'STATUS' = 0000 * PREG5 EQU $ JST *TINP(X,Y) GET NEXT PARAMETER JST *TCOMMA(X,Y) COMMA ILLEGAL COPY *TPFLG(X,Y),A GET PARAMETER FLAG JEQ A,PREG21 JMP IF NO MORE PARAMETERS PREG1 COPY *TVALU(X,Y),A GET PARAMETER AND =:000F,A GET PERMISSIBLE VALUES COPY *TSIZE(X,Y),Q GET INDEX CSK Q,=1 JMP USER2 USER JMP STATUS2 STATUS COPY *SIZER,Q DMA AND =:000F,Q GET RID OF OLD DMA# SHIFT A,L,4 PUT NEW DMA# IN POSITON OR Q,A JMP PREG2  GO AWAY * USER2 COPY *SIZER,Q GET PRESENT VALUE AND =:00F0,Q GET RID OF OLD USER # ADD Q,A  PUT NEW ONE IN JMP PREG2 * STATUS2 SUB =2,Q ADJUST TO BIT 0 OF STATUS WORD SHIFT Q,L,4 SHIFT FOR XNX AND =:0001,A ONLY ONE BIT IS ALLOWED FOR INPUT CLSN =1,A SET OR RESET ? THAT IS THE QUESTION JMP SETBIT JMP IF WE ARE TO SET A BIT COPY *SIZER,A GET STATUS WORD XNX Q RBIT 0,A TURN OFF REQUESTED BIT JMP PREG2 * SETBIT COPY *SIZER,A GET STATUS WORD XNX Q SBIT 0,A  TURN ON REQUESTED BIT PREG2 COPY A,*SIZER REPLACE WORD PREG21 COPY *TLASTS(X,Y),A ANY MORE INPUT IS AN ERROR  CLSN =0,A JMP PREGRTN GO AWAY JMP *TERROR(X,Y) ERROR RETRUN PREGRTN COPY *TMAPS(X,Y),A OUT A,LOADUSER LOAD USER # INTO MMU SHIFT A,RO,4 LOAD DMA # INTO MMU OUT A,LOADDMA COPY *TMMUSTAT(X,Y),A OUT A,LOADSTAT LOAD STATUS INTO MMU JMP *TDBG(X,Y) GO TO DEBUG (IF POSSIBLE) LPOOL TITL *************** * * * -- PM COMMAND PROCESSING -- * * **************** * GET MAP NUMBER AND PAGE NUMBER * * PMCOM EQU $ JST *TINP(X,Y) INPUT FIRST PARAMETER (MAP #) CLSN =',',A MUST BE DELIMITED BY A COMMA JMP $+2 JMP *TERROR(X,Y) ELSE ITS AN ERROR COPY *TVALU(X,Y),A GET MAP # AND =:000F,A ALLOW :0-:F COPY A,MAPNUM SAVE IT AWAY JST *TINP(X,Y) GET NEXT PARAMETER (PAGE # OR 'L') COPY *TLASTS(X,Y),A GET LAST INPUT CLSN ='L',A LIST ALL PAGES OF MAP COMMAND? JMP PMMAP YES, DONT SET PAGE NUMBER COPY *TVALU(X,Y),A GET PAGE # AND =:003F,A ALLOW 0-63 PAGE NUMBER JMP PMMPAGE   SPACE 1 PMMAP EQU $ COPY =0,A PMMPAGE COPY A,PAGENUM SAVE PAGE NUMBER * * -- GET MAP ENTRY -- * *  IN READSTAT,Q GET MMU STATUS COPY Q,*TMMUSTAT(X,Y) SAVE IN STATUS WORD OR =1,Q  SET TABLE ACCESS ON OUT Q,LOADSTAT AND UPDATE IN CONTROL REGISTER COPY STADDR,A  FC00 IS START OF MAP COPY MAPNUM,Q GET CURRENT MAP NUMBER MAPLOP JEQ Q,DOPAGE IF LOOP END THEN ADD PAGE NUMBER ADD MAPINC,A MOVE POINTER TO NEXT MAP LOCATION SUB =1,Q  DECREMENT MAP NUMBER JMP MAPLOP AND LOOP DOPAGE ADD PAGENUM,A NOW A HAS MAP ENTRY ADDRESS  COPY A,*TADDR(X,Y) SAVE IN CASE ITS A 'L' COMMAND COPY *TLASTS(X,Y),Q GET LAST INPUT CLSN ='L',Q LIST MAP CONTENTS? JMP *TLIST(X,Y) YES, LIST OUT A MAP OF PAGES * * * * --GET MAP ENTRY AND PUT IN DACP0 AND DACP1-- * * * COPY =0,Q COPY Q,DACP1 COPY Q,DACP1+1 INITIALIZE MAP ENTRY SAVE AREA COPY Q,DACP1+2 COPY Q,DACP1+3 COPY Q,DACP0 COPY Q,DACP0+1 COPY Q,DACP0+2 COPY Q,DACP0+3 COPY A,CURPAGE SAVE MAP ENTRY ADDRESS COPY A,TEMPAGE COPY *TEMPAGE,A MAP ENTRY NOW IN A COPY A,SAVENTRY PUT IN STORAGE AND DMASK,A GET DIRTY BIT COPY A,DACP1 AND PUT IN WORKING AREA COPY  SAVENTRY,A GET ENTRY AGAIN AND AMASK,A AND GET ACCESS BIT COPY A,DACP1+1 AND PUT IN WORKING STORAGE COPY SAVENTRY,A GET ENTRY AGAIN AND MMASK,A AND GET ACCESS MODE BITS  COPY A,DACP1+2 AND PUT IN WORKING STORAGE COPY SAVENTRY,A GET ENTRY AGAIN AND  PMASK,A GET PHYSICAL PAGE NUMBER COPY A,DACP1+3 AND PUT IN WORKING STORAGE * * --PROCESS PARAMETERS, IF ANY-- * COPY *TTEST(X,Y),A GET LAST CHAR CLSN =CR,A IF CARRIAGE RETURN  JMP DISPALL THEN DISPLAY ALL PARAMS CLSN =',',A ELSE MUST BE COMMA JMP $+2  IF NOT THEN ERROR JMP *TERROR(X,Y) * * * --PROCESS FIRST PARAMETER-- * FIRST PARAMETER PROCESSING DIFFERS FROM OTHERS IN THAT * A SINGLY LISTED PARAMETER CAN BE CHANGED ALA INSPECT/MODIFY * * JST *TRKB(X,Y)  GET PARAM COPY A,CURPARM SAVE FOR OTHER ROUTINES JST CHKVDPR SEE IF D,A,M,P  JST *TRKB(X,Y) IF SO GET NEXT CHAR CLSN =CR,A IF CARRIAGE RETURN THEN JMP SINGPARM INSPECT/MODIFY PARAMETER CLSN =',',A ELSE IF COMMA THEN JMP NEWPARM GET NEXT PARAMETER IN LIST JST CHK ELSE MUST BE A HEX VALUE COPY A,Q START TO BUILD VALUE NECHAR COPY Q,QTEMPB TEMP SAVE VALUE NWCHAR JST *TRKB(X,Y) GET NEXT CHAR COPY QTE MPB,Q RESTORE VALUE CLSN =CR,A IF CR THEN VALUE IS FINISHED JMP CHNGVAL1 GO AND CHANGE VALUE CLSN =',',A IF COMMA THEN VLAUE IS FINISHED JMP CHNGVAL1 BUT THERE ARE MORE PARAMETERS JST CHK ELSE MUST BE HEX VALUE SHIFT Q,LO,4 SHIFT Q FOR NEXT HEX VALUE OR A,Q Q HAS UPDATED VALUE JMP NECHAR GET NEXT CHAR QTEMPB WORD 0 TEMP SAVE VALUE TITL * * * --CHANGE VALUE 1 CHECKS FOR VALID RANGE FOR * CURRENT PARAMETER,CHANGES PARAMETER IN * WORKING STORAGE,THEN EITHER EXITS THROUFH * DISPLAY ROUTINE OR GOES TO NEXT PARAMETER-- * * CHNGVAL1 COPY A,ATEMPA SAVE DELIMITER JST VALCHK CHECK FOR VALID RANGE FOR CURPARM JST NEWVAL CHANGE VALUE IN WORKING STORAGE COPY ATEMPA,A GET DELIMITER CLSN =CR,A IF CARRIAGE RETURN JMP DISPARM THEN DISPLAY AND RESTORE ENTRY JMP NEWPARM  ELSE MUST BE MORE PARAMETERS CURPARM WORD 0 ATEMPA WORD 0 TITL * * --DISPALL SETS ALL PARAMETERS TO CHANGED AND GOES TO DISPLAY-- * * DISPALL COPY =1,Q COPY Q,DACP0 COPY Q,DACP0+1 COPY Q,DACP0+2 COPY Q,DACP0+3 JMP DISPARM TEMPAGE WORD 0 LPOOL TITL * * --SINGPARM(SINGLE PARAMETER) OUTPUTS PARAMETER VALUE * AND CHANGES VALUE DEPENDING ON USER INPUT, THEN * BYPASSES DISPLAY PARAMETERS, RESTORES ENTRY THEN EXITS * * SINGPARM JST *TCRLF(X,Y) NEW LINE JST *TSPACE(X,Y) SPACE OVER ONE COPY CURPARM,A NEW LINE AND GET PARAMETER JST *TTYPCR(X,Y) PRINT IT COPY ='=',A AND EQUAL SIGN JST *TTYPCR(X,Y) COPY CURPARM,A GET NEW PARAMETER AGAIN CLSN ='D',A JMP DSING CLSN ='A',A JMP ASING CLSN ='M',A JMP MSING GET APPROPRIATE PARAMETER COPY DACP1+3,A WE KNOW IT IS PHYSICAL PAGE SINGVAL JST *TSHEX(X,Y) OUTPUT PARAMETER VALUE JST *TRKB(X,Y) GET NEXT CHARACTER CLSN =CR,A IF IT IS CARRIAGE RETRUN JMP *TDBG(X,Y) DON'T CHANGE ENTRY JUST GO BACK JST CHK ELSE GET HEX VALUE COPY A,Q STORE IN Q NUCHAR COPY Q,QTEMPA SAVE VALUE NYCHAR JST *TRKB(X,Y) GET NEXT CHAR COPY QTEMPA,Q RESTORE VALUE CLSN =CR,A IF IT IS CARRIAGE RETURN JMP CHNGVAL2 WE MUST BE DONE JST CHK ELSE MUST BE MORE VALUE SHIFT Q,LO,4 BUILD HEX VALUE OR A,Q INTO Q JMP NUCHAR AND CONTINUE QTEMPA WORD 0 TEMP VALUE SAVE * * CHNGVAL2 JST VALCHK DO RANGE CHECK FOR PARAMETER  JST NEWVAL IF OK CHANGE VALUE IN WORKING STORAGE JMP ENDDIS BYPASS DISPLAY, RESTORE AND  RETURN * * DSING COPY DACP1,A GET DIRTY BIT SHIFT A,RO,15 ADJUST FOR PRINT ROUTINE  JMP SINGVAL ASING COPY DACP1+1,A GET ACCESSED BIT SHIFT A,RO,14 ADJUST FOR PRINT ROUTINE  JMP SINGVAL AND CONTINUE MSING COPY DACP1+2,A GET MODE BITS SHIFT A,RO,12 ADJSUT FOR PRINT ROUTINE JMP SINGVAL AND CONTINUE TITL * * * --CHKVDPR(CHECK FOR VALID PARAMETER) CHECKS TO SEE IF * PARAMETER IS ONE OF D,A,M,P. IF IT IS, ROUTINE THEN * MARKS PARAMETER RECIEVED FLAG IN DACP0 AREA FOR *  DISPLAY PARAMETER ROUTINE'S USE-- * CHKVDPR ENT COPY =1,Q SET FOR NAMED VALUE COPY CURPARM,A  GET PARAMETER CLSN ='D',A JMP DSET IF D SET DIRTY BIT USED CLSN ='A',A JMP  ASET IF A SET ACCESS BIT USED CLSN ='M',A JMP MSET IF M SET MODE BITS USED CLSN ='P',A JMP PSET IF P SET PHYSICAL PAGE USED JMP *TERROR(X,Y) ELSE INVALID PARAMETER AND ERROR * DSET COPY Q,DACP0 RTN CHKVDPR ASET COPY Q,DACP0+1 RTN CHKVDPR MSET COPY Q,DACP0+2 RTN CHKVDPR PSET COPY Q,DACP0+3 RTN CHKVDPR TITL * * * * --VALCHK(VALUE CHECK) ENSURES THAT VALUE ENTERED BY USER * IS VALID FOR CURRENT PARAMETER-- * * VALCHK ENT COPY CURPARM,A CLSN ='P',A JMP PAGEPARM CLSN ='M',A JMP MODEPARM CSK Q,=1 JMP CHECZERO  JMP *TERROR(X,Y) RTN VALCHK * CHECZERO CSK Q,=0 JMP *TERROR(X,Y) JMP *TERROR(X,Y) RTN VALCHK * MODEPARM COPY =4,A CSK Q,A JMP MODECONT JMP *TERROR(X,Y) JMP *TERROR(X,Y) MODECONT COPY =0,A CSK Q,A JMP *TERROR(X,Y) NOP  RTN VALCHK * PAGEPARM COPY =0,A CSK Q,A JMP *TERROR(X,Y) JMP PAGECONT RTN VALCHK PAGECONT COPY PMASK,A CSK Q,A RTN VALCHK JMP *TERROR(X,Y) RTN  VALCHK TITL * * --NEWVAL(NEW VALUE) CHANGES THE VALUE OF THE CURRENT * PARAMETER IN CURPARM TO THE CURRENT VALUE IN Q * REGISTER IN APPROPRIATE WORD IN DACP1 WORKING STORAGE-- * * NEWVAL ENT COPY CURPARM,A CLSN ='D',A JMP DIRBIT CLSN ='A',A JMP ACCBIT CLSN ='M',A JMP MODEBIT * ELSE PAGE VALUE COPY Q,DACP1+3 RTN NEWVAL ACCBIT SHIFT Q,L,14 COPY Q,DACP1+1  RTN NEWVAL DIRBIT SHIFT Q,L,15 COPY Q,DACP1 RTN NEWVAL MODEBIT SHIFT Q,L,12 COPY  Q,DACP1+2 RTN NEWVAL TITL * * --NEWPARM(NEW PARAMETER) GETS NEXT PARAMETER, * EXITS ON CARRIAGE RETURN,LOOPS ON A COMMA, * AND CHANGES VALUE IF THERE IS ONE(USES NWCHAR IN * PROCESS FIRST PARAMETER ROUTINE__ * * NEWPARM EQU $ JST *TRKB(X,Y) COPY A,CURPARM SAVE NEW PARAMETER JST CHKVDPR V ALIDATE NEW PARAMETER JST *TRKB(X,Y) GET NEXT CHARACTER CLSN =CR,A IF CARRIAGE RETURN  JMP DISPARM DISPLAY VALUES AND EXIT CLSN =',',A IF COMMA,MERELY MARK JMP NEWPARM  PARAMETER AND LOOP JST CHK ELSE GET HEX VALUE COPY A,Q BUILD VALUE IN Q  JMP NECHAR AND GET VALUE AS IN FIRST LPOOL TITL * * --DISPARM(DISPLAY PARAMETERS) IS EXIT ROUTINE. IT GOES * THROUGH DACP0 AREA TO SEE WHICH PARAMETERS HAVE BEEN * USED IN THE COMMAND. IT THEN DISPLAYS THOSE WHICH *  HAVE. ENTRY ENDDIS IS USED BY SINGPARM ROUTINE. * ENDDIS RESTORES ENTRY IN MAP AND EXITS TO DEBUG-- * * DISPARM EQU $  JST *TCRLF(X,Y) NEW LINE COPY =' ',A JST *TTYPCR(X,Y) COPY DACP0,A JEQ A,CHKDAC1 IF DIRTY NOT USED,CHECK ON ACCESS JMP DDIS ELSE DISPLAY DDIS CHKDAC1 COPY DACP0+1,A SEE IF ACCESS BIT WAS USED JEQ A,CHKDAC2 IF NOT CHECK MODE BITS JMP ADIS ELSE DISPLAY ACCESS BIT CHKDAC2 COPY DACP0+2,A SEE IF MODE BITS WERE USED JEQ A,CHKDAC3 IF NOT CHECK PHYSICAL PAGE NUMBER JMP MDIS ELSE DISPLAY MODE BITS CHKDAC3 COPY DACP0+3,A JEQ A,ENDDIS IF DONE RESTORE ENTRY AND EXIT COPY ='P',A ELSE PRINT PHYSICAL PAGE NUMBER JST *TTYPCR(X,Y) COPY ='=',A JST *TTYPCR(X,Y) COPY DACP1+3,A JST *TSHEX(X,Y) GET PHYSICAL PAGE NUMBER AND PRINT  JMP ENDDIS AND EXIT DDIS COPY ='D',A PRINT D AND DIRTY BIT VALUE JST *TTYPCR(X,Y)  COPY ='=',A JST *TTYPCR(X,Y) COPY DACP1,A SHIFT A,RO,15 JST *TSHEX(X,Y) JMP CHKDAC1 ADIS COPY ='A',A PRINT A AND ACCESS BIT VALUE JST *TTYPCR(X,Y) COPY ='=',A JST *TTYPCR(X,Y) COPY DACP1+1,A SHIFT A,RO,14 JST *TSHEX(X,Y)  JMP CHKDAC2 MDIS COPY ='M',A PRINT M AND ACCESS BIT VALUE JST *TTYPCR(X,Y) COPY ='=',A JST *TTYPCR(X,Y) COPY DACP1+2,A SHIFT A,RO,12 JST *TSHEX(X,Y) JMP CHKDAC3 ENDDIS COPY DACP1,Q RESTORE MAP ENTRY BY ORING OR DACP1+1,Q WORKING STORAGE VALUES  OR DACP1+2,Q TOGETHER OR DACP1+3,Q AND PUT BACK IN MAP COPY Q,*CURPAGE COPY  *TMMUSTAT(X,Y),Q OUT Q,5 AND RESTORE MMU CONTROL REGISTER JMP *TDBG(X,Y) AND BACK TO DEBUG MAPINC WORD :0040 STADDR WORD :FC00 PAGENUM WORD 0 MAPNUM WORD 0 DACP0 WORD 0 WORD 0 WORD 0 WORD 0 DACP1 WORD 0 WORD 0 WORD 0 WORD 0 CURPAGE WORD 0 SAVENTRY WORD 0 DMASK WORD :8000 AMASK WORD :4000 MMASK WORD :3000 PMASK WORD :0FFF TITL ****** * * -- INSP-- I * * INSPECTION & MODIFICATION OF MEMORY LOCATION * ****** INSP EQU $ INSP1 JST *TCRLF(X,Y) NEW LINE   COPY *TADDR(X,Y),A GET 1ST PARM (MEM TO BE MODIFIED) COPY A,ADDRI SAVE IT COPY A,Q  JST *TPADDR(X,Y) PUBLISH ADDRESS COPY ADDRI,X COPYU 0(X),A GET CONTENTS OF MEM LOC  COPY Y,X JST *TSHEX(X,Y) DO HEX ROUTINE FOLLOWED BY A SPACE INSP3 EQU $ JST *TINP(X,Y)  FETCH NEXT PARAMETER COPY *TPFLG(X,Y),A GET PFLG JEQ A,INSP2 ANY PARAMETER(CHANGE)?  COPY A,*TSTORE(X,Y) FLAG MEMORY CHANGE COPY ADDRI,X COPY Q,A PUT CHANGE VALUE INTO -A- COPYU A,0(X) COPY Y,X INSP2 EQU $ COPY *TTEST(X,Y),A GET TERMINATOR CLSN =',',A IS IT A 8 JMP MORE YES- GO GET NEXT CHANGE COPY ADDRI,Q REFERESH 'Q' COPY *TLASTS(X,Y),A FETCH TERMINATOR JEQ A,DBGRTN NO SPECIAL TERMINATOR,THEN GO TO DBG  CLSN ='+',A INCREMENT? JMP INCR CLSN ='-',A DECREMENT JMP DECR  CLSN ='*',A INDIRECT JMP INDI CLSN ='X',A X2 JMP MULT CLSN ='/',A DIV BY 2 JMP DIV JMP *TERROR(X,Y) ELSE ERROR INCR ADD =2,Q DECR SUB =1,Q  COPY Q,ADDRI SAVE NEW ADDRESS COPY Q,*TADDR(X,Y) RESTORE NEW ADDRESS JMP INSP1  START AGAIN INDI COPY ADDRI,X COPYU 0(X),A COPY Y,X INDI1 COPY A,*TADDR(X,Y) JMP INSP1 MULT COPY ADDRI,X COPYU 0(X),A COPY Y,X SHIFT A,LO,1 MULTIPLY BY 2 JMP INDI1 DIV COPY ADDRI,X COPYU 0(X),A COPY Y,X SHIFT A,RO,1 DIVIDE BY 2 JMP INDI1 MORE IMS ADDRI NEXT LOCATION JMP INSP3 DO IT AGAIN DBGRTN EQU $ JMP *TDBG(X,Y) BACK TO DBG ADDRI WORD 0 ****** * * -- COMMA -- * COMMA ENT CLSN =',',A JMP *TERROR(X,Y) RTN COMMA TITL ****** * * -- LIST -- * * LISTING CONSECUTIVE MEMORY LOCATIONS * * LIST EQU $  COPY *TCMND(X,Y),Q LIST A MAP OPTION? CLSN ='P',Q JMP PRN0 YES JST GSZ NO,GET SIZE CLSN =CR,A CR JMP PRN JST *TINP(X,Y) INPUT ASCII CODE OPTION JST *TCOMMA(X,Y) ERROR IF TERMINATOR IS , CLSN =:A,Q ASCII OPTION 'A' JMP $+2 JMP *TERROR(X,Y) COPY Q,ATEMP JMP PRN PRN0 EQU $ COPY =64,A COPY A,WSIZE SET UP MAP SIZE FOR PRINT PRN EQU $ COPY *TDIOFG(X,Y),A GET DESIRED OUTPUT MEDIA FLAG CLSN ='P',A IS IT LP OUTPUT JMP $+2 JMP PRN11 COPY *TLPCNT(X,Y),A LINES/PAGE COPY A,*TLNCNT(X,Y) COPY =TOF,A JST *TTYPLP(X,Y) DO TOP OF FORM PRN11 EQU $ JST *TCRLF(X,Y) NEW LINE COPY  *TADDR(X,Y),A GET 1ST PARAMETER COPY A,SVWORD SAVE IT PRN1 EQU $ JST *TPADDR(X,Y)   COPY =-8,A COPY A,SKIPCN COPY A,PRNTCT 8 WORDS/LINE COPY *TLASTS(X,Y),A GET LAST INPUT CLSN ='L',A LIST MAP COMMAND? JMP PRN2MAP DO LIST W/O COPYU COMMAND (TABLE ACCESS IS ON) PRN2 COPY SVWORD,X GET CONTENTS COPYU 0(X),A COPY Y,X RESTORE X WITH Y JST  *TSHEX(X,Y) DO HEX ROUTINE FOLLOWED BY A SPACE JST *TETEST(X,Y) NEXT FUNCTION IF DONE IMS PRNTCT JMP PRN2 COPY ATEMP,A CLSN =:A,A CHECK FOR ASCII OPTION JST ASCPR YES, GO OUTPUT ASCII CODE COPY SVWORD,A LATEST ADDRESS JST *TCRLF(X,Y) NEW LINE JMP PRN1 PRN2MAP COPY SVWORD,X GET CONTENTS COPY 0(X),A DONT USE COPYU IF LISTING MAP COPY Y,X  RESTORE X WITH Y JST *TSHEX(X,Y) DO HEX ROUTINE FOLLOWED BY A SPACE JST *TETEST(X,Y)  NEXT FUNCTION IF DONE IMS PRNTCT JMP PRN2MAP COPY SVWORD,A LATEST ADDRESS JST  *TCRLF(X,Y) NEW LINE JMP PRN1 ASCPR ENT COPY PRNTCT,A FETCH NUMBER OF HEX DUMPED COPY A,TABCN SAVE TAB CONSTANT SUB SKIPCN,A -(-ELEMENTS PER LINE) NEG A,A -ELEMENTS TO PUBLISH IN ASCII DUMP JEQ A,PRN7 DUMP COMPLETED, DO NEW LINE COPY A,PRNTCT CALCULATE HEAD OF ASCII ADD SVWORD,A COPY A,SVWORD REFRESH WORD ADDRESS COPY TABCN,A FETCH TAB CONSTANT  JEQ A,PRN5 NO TAB NEEDED PRN4 COPY =-5,A ESTABLISH SPACE COUNTER COPY A,SPACN JST  *TSPACE(X,Y) OUTPUT A SPACE IMS SPACN BUMP SPACE COUNTER JMP $-2 CONTINUE UNTIL SPACED OUT IMS TABCN BUMP TAB COUNTER JMP PRN4 CONTINUE TAB PRN5 COPY =-3,A ISSUE SPACES BETWEEN HEX & ASCII COPY A,SPACN JST *TSPACE(X,Y) OUTPUT A SPACE IMS SPACN JMP  $-2 PRN6 COPY SVWORD,X GET DATUM ADDRESS COPYU 0(X),A COPY Y,X SHIFT A,RO,8 POSITION HIGH ORDER BYTE SUB =:7E,A SUBTRACT UPPER BOUNDARY OF ASCII SET JGT A,PRN61 ADD =:7E,A  SUB =:20,A TEST FOR LOWER BOUND OF ASCII SET JLT A,PRN61 ADD =:20,A JMP $+2 PRN61  COPY =:2E,A INVALID ASCII CODE ISSUE SPACE JST *TTYP(X,Y) PUBLISH ON SPECIFIED I/O COPY *SVWORD,A FETCH DATUM ONCE MORE COPY SVWORD,X COPYU 0(X),A COPY Y,X RESTORE X WITH Y AND =:FF,A MASK TO LOW ORDER BYTE SUB =:7E,A TEST OFR UPPER BOUND OF ASCII SET JGT A,PRN62 TEST FOR VALID ASCII ISSUE SPACE IF NOT ADD =:7E,A ADD BACK TO ITS VALUE SUB =:20,A  TEST FOR LOWER BOUND OF ASCII SET JLT A,PRN62 ADD =:20,A JMP $+2 PRN62 EQU $ COPY =:2E,A INVALID ASCII CODE ISSUE SPACE JST *TTYP(X,Y) PUBLISH ASCII IMS SVWORD BUMP MEMORY  ADDRES TO NEXT DATUM NOP IMS PRNTCT BUMP WORDS/LINE COUNTER JMP PRN6 CONTINUE ASCII CUMP PRN7 RTN ASCPR END OF THIS LINE RETURN * * WORD AREA * WSIZE WORD 0 PRNTCT WORD 0 ATEMP WORD 0 SKIPCN WORD 0 SPACN WORD 0 TABCN WORD 0 QSAVE WORD 0 TITL ****** * * -- GSZ -- * * GET AND CHECK SIZE/2ND PARAMETER FOR LIST,SEARCH,FILL8 COPY * RETURN: WSIZE = WORD SIZE (ENDING ADD - STARTING ADD) * 'A' = TERMINATOR ****** GSZ ENT CLSN =',',A JMP $+2 PARAMETERS MUST BE SAPARATED BY , JMP *TERROR(X,Y) ELSE ERROR JST *TINP(X,Y) GET 2ND PARAMETER COPY A,WSIZE SAVE TERM CHAR  COPY Q,A GET 2ND PARAM IN AR COPY *TADDR(X,Y),Q GET FIRST PARAM IN QR CSM A,Q 2ND PARAM SHD BE >= 1ST JMP GSZ1 PROBLEM - 2ND < 1ST NOP SUB Q,A GET ACTUAL LENGTH IN AR ADD =1,A GSZ3 EXCH WSIZE,A A=TERMN,WSIZE=SIZE RTN GSZ EXIT GSZ1 COPY *TCMND(X,Y),Q LOOK AT COMMAND CLSN ='L',Q IF LIST 2ND MAY BE OK JMP $+2 GSZ2 JMP *TERROR(X,Y)  NO, ITS AN ERROR JLE A,GSZ2 CANT BE 0 OR NEG CSK A,=LLNTH MUST BE 1-LLNTH JMP GSZ3 OK JMP GSZ2 ERROR JMP GSZ3 OK SVWORD WORD 0 1ST PARAMETER KEEPER TITL ****** * * -- ETEST -- * * TEST FOR END OF PRINT/SRCH/COPY/FILL * INCREMENT STARTING ADD, DECREMENT WORD SIZE. (Q=WORDSIZE) ****** ETEST ENT COPY WSIZE,Q GET WORD COUNT IMS SVWORD BUMP ADDRESS BY 1 NOP IN CASE OF A ZERO SUB =1,Q DECREMENT WORD COUNT JEQ Q,$+3 ALL DONE, BACK TO DBG COPY Q,WSIZE RESTORE WORD COUNT LEFT RTN ETEST  ELSE RETURN COPY *TCMND(X,Y),A GET COMMAND ID CLSN ='L',A WAS LAST CMND 'L' JMP  ERTNT CLSN ='S',A OR WAS IT 'S' JMP ERTNJ CLSN ='P',A MAP COMMAND? JMP ERTNP YES JMP ERTN ERTNJ COPY *TDIOFG(X,Y),A GET OUTPUT FLAG CLSN ='T',A TTY OUTPUT JMP ERTN GO BACK JST *TCRLF(X,Y) DO EXTRA CRLF JMP ERTN GO BACK ERTNT IMS PRNTCT NOP COPY ATEMP,A HAS ASCII ASKED CLSN =:A,A JST ASCPR  FINISH UP ASCII DUMP COPY =0,A CLEAR ATEMP COPY A,ATEMP JMP ERTNJ ERTNP COPY *TMMUSTAT(X,Y),Q RESTORE MAP STATUS BEFORE LEAVING OUT Q,LOADSTAT JMP ERTNJ FINISH UP ERTN JMP *TDBG(X,Y) BACK TO NEXT FUNCTION TITL ****** * * -- FILLP -- * * FILLING MEMORY WITH A CONSTANT VALUE * * ****** FILLP EQU $ JST GET2 GET 2ND,3RD & 4TH PARM COPY A,*TSTORE(X,Y) PUT * TO FLAG THIS COMMAND COPY *TADDR(X,Y),A IN 6,X GET USER MAP NUMBER AND =:000F,X  GET MAP NUMBER ONLY JNE X,FIL2 IF NOT SYSTEM MAP JUMP COPY Y,X AROUND RANGE CHECK JST SINKCK CHECK DEBUG NOT BEING CHANGED FIL2 COPY Y,X RESTORE AGAIN COPY A,SVWORD 1ST PARM COPY KEY,A FIL1 COPY SVWORD,X COPYU A,0(X) FILL A WORD COPY Y,X RESTORE X WITH Y JST ETEST CHECK FOR END ADD KEY1,A ADD INCREMENT/DECREMENT CONSTANT JMP FIL1 LOOP TITL ****** * * -- GET2 -- * * GET 2ND, 3RD & 4TH PARAMETER. * KEY -- FILLER CONSTANT/3RD PARM-START ADD FOR COPY COMMAND * KEY1 -- INCREMENT/DECREMENT CONSTANT OR MASK(FOR SEARCH) * ****** GET2 ENT COPY =0,Q COPY Q,KEY1 INITIALIZE INCREMENT/DECREMENT KEEPER  JST GSZ GET 2ND PARM & SIZE TO BE FILLED CLSN =',',A THERE MUST BE A , FOR 3RD PARM  JMP $+2 JMP *TERROR(X,Y) ERROR IF NO 3RD PARM JST *TINP(X,Y) GET 3RD PARM COPY Q,KEY SAVE FILL VALUE CLSN =',',A IS THERE A 4TH PARM? JMP $+2 JMP  GOGET2 NO,GO BACK TO CALLER COPY A,NOMACH FLAG 4TH PARAMETER JST *TINP(X,Y)  YES, GET 4TH PARM COPY Q,KEY1 SAVE INCREMENT/DECREMENT COUNT GOGET2 RTN GET2 BACK TO CALLER KEY WORD 0 FILLER KEEPER KEY1 WORD 0 INCREMENT/DECREMENT CONSTANT KEEPER TITL ****** * * -- SRCH -- * * SEARCH MEMORY * ****** SRCH EQU $ COPY =0,Q COPY Q,NOMACH  INITIALIZE JST GET2 GET 2ND, 3RD & 4TH PARM CLSN =',',A IS THERE A 5TH PARM  JMP SRCH00 YES GET 5TH PARM COPY =0,A EXCH A,NOMACH CLSN =',',A CHECK IF THERE WAS A 4TH PARM JMP SRCH55 COPY =-1,Q COPY Q,KEY1 MASK OF :FFFF JMP SRCH11 NO, GO START SRCH SRCH55 EQU $ COPY KEY1,A GET LAST PARM CSK A,=0 NOP JMP SRCH11 COPY =-1,Q MASK OF :FFFF COPY Q,KEY1 ZERO MASK COPY *TLASTS(X,Y),A CLSN ='-',A MUST BE '-' JMP $+2 JMP *TERROR(X,Y) ELSE ERROR  COPY A,NOMACH SAVE '-' JMP SRCH11 START SEARCH SRCH00 EQU $ JST *TINP(X,Y) GET 5TH PARM COPY *TLASTS(X,Y),A GET LAST TERMINATOR CLSN ='-',A JMP $+2 JMP  *TERROR(X,Y) ILLEGAL PARM COPY A,NOMACH A NO-MACH SEARCH SRCH11 EQU $ COPY *TADDR(X,Y),A COPY A,SVWORD GET 1ST PARM SRCH22 COPY SVWORD,X FETCH WORD ADDRESS IN X COPYU 0(X),A FETCH A WORD COPY Y,X RESTORE X WITH Y REGISTER XOR KEY,A COMPARE TO MATCH VALUE AND KEY1,A MASK IT JNE A,SRCH33 NO MATCH, CHECK IF NO MATCH DESIRED   COPY NOMACH,A JEQ A,FOUNDS MATCH FOUND, GO PRINT JMP SRCH44 SRCH33 COPY NOMACH,A  CLSN ='-',A JMP FOUNDS SRCH44 JST ETEST DO NEXT FUNCTION IF DONE, ELSE JMP SRCH22  LOOP FOUNDS JST *TCRLF(X,Y) NEW LINE COPY SVWORD,A GET MATCH ADDRESS JST *TPADDR(X,Y) COPY SVWORD,X GET MATCH ADDRESS COPYU 0(X),A GET MATCH VALUE COPY Y,X  RESTORE X WITH Y JST *THEX(X,Y) PRINT MATCH VALUE JMP SRCH44 NOMACH WORD 0  MATCH - NO MATCH KEEPER TITL ****** * * -- SINKCK -- * * CHECK TO ENSURE DBG AREA IS NOT BEING MODIFIED * * ****** SINKCK ENT COPY SINKV1,Q CALCUATE END OF DEBUG ADD X,Q INTO Q REG CSM A,Q IS START OF WORD>END OF DBG? JMP SINK1 NO, CHECK FURTHER RTN SINKCK YES,OK JMP SINK2 OVERLAP ERROR SINK1 COPY X,Q CALCULATE START OF DBG SUB SINKV2,Q ADD *TWSIZE(X,Y),A CALCULATE END OF WORD SUB =1,A CSM A,Q IS END OF WORDLAST G-REG? JMP ADR2 NO, DONT BOTHER NOP YES,REPLACE WORKING G-REG COPY A,ADRT2 WITH ONE NEARER TO ACTUAL. COPY Q,ADRT3 SAVE CURRENT G-REG NUMBER ADR2 EQU $ COPY Y,X RESTORE X IMS ADRT4 BUMP POINTER ADD =1,Q  BUMP REGISTER NO. CLSN =36,Q DONE WITH ALL REGISTERS? JMP $+2 YES  JMP ADR1 ND LOOP COPY ADRT3,A ADD =1,A JEQ A,ADR4 NO APPLICABLE G-REG FOUND COPY ='=',A JST *TTYP(X,Y) COPY ACTUAL,A CALCULATE G-REG OFFSET SUB ADRT2,A  JST *THEX(X,Y) COPY ='G',A TYPE 'G' JST *TTYP(X,Y) COPY ADRT3,A R EGISTER # FCONV EQU $ CONVERT & PRINT G-REG # SUB =10,A CONVERT TO ASCII JLT A,$+2 ADD =7,A ADD ='9'+1,A JST *TTYP(X,Y) JMP ADR4 ADR4 EQU $ COPY =BLANK,A JST *TTYP(X,Y) RTN PADDR BACK TO CALLER * ACTUAL EQU CV01 ADRT2 EQU SVCV01 ADRT3 EQU CV02 ADRT4 EQU CV03 LPOOL TITL ******* * -- SHEX -- DO HEX FOLLOWED BY A SPACE ******* SHEX ENT  JST HEX COPY =' ',A JST TYP RTN SHEX ****** * -- HEX -- * TYPE 'A' AS 4 HEXADECIMAL DIGITS ****** * HEX ENT COPY A,ASV SAVE 'A' SHIFT A,RO,12 IST DIGIT JST  CONV GO PRINT SHIFT A,RO,8 2ND DIGIT JST CONV GO PRINT SHIFT A,RO,4 3RD DIGIT JST CONV GO PRINT JST CONV GO PRINT RBIT 1,S RTN HEX BACK TO CALLER CONV ENT AND =:F,A MASK IT OFF SUB =10,A CONVERT TO HEX JLT A,$+2 JMP IF 0 THRU 9 ADD =7,A ELSE MAKE A THRU F ADD ='9'+1,A ADD ASCII OFFSET JST TYP TYPE DIGIT COPY ASV,A  REFERESH 'A' RTN CONV LOOP ASV WORD 0 SAVE 'A' FOR HEX ROUTINE TITL ****** * * -- RKB -- INPUT CHARACTER * 'A' RETURNS WITH READ CHARACTER * STANDARD I/O DISTRIBUTER ADDRESS = :F *  CHANNEL ADDRESS = :4 * LSB = 1 FOR CONTROL TRANSFER FUNCTION * 0 WORD TRANSFER FUNCTION ****** RKB ENT COPY DIOTY,Q GET INPUT DEVIE ADD 8 CHANNEL # COPY S,X COPY X,SAVES  RBIT 8,S COPY D100,X RESET TTY CODE COPY D8618,A START,ECHO,NO INTERUPT COMMAND  XNX Q OUT A,1 OUTPUT INITIALIZE CONTROL FUNCTION XNX Q IN 1,A  INPUT TTY STATUS CONTROL FUNCTION SHIFT A,RO,4 SHIFT WORD RADY BIT IN OV JF OV,$-3  LOOP TILL WORD IS AVAILABLE (1 CHAR) XNX Q IN 0,A GET A CHARACTER XNX Q  OUT X,1 RESET TTY CONTROL FUNCTION AND =:7F,A AND OFF BIT 7 CSK A,='Z'+:20  ALLOW LOWER CASE INPUT CSK A,='A'+:20 JMP RKB1 NOP SUB =:20,A RKB1 EQU $ COPY SAVES,X COPY X,S REFRESH 'S' COPY Y,X REFRESH 'X' WITH BASE ADDRESS RTN  RKB BACK TO CALLER D100 WORD :100 RESET COMMAND WORD D8618 WORD :8618 START,ECHO SAVES WORD 0 TITL ****** * -- TYPCRT -- OUTPUT A CHARACTER FROM A REG * STANDARD IOD ADD = :F,CH ADD = 4 *  LSB = 1 FOR CONTROL 0 FOR WORD TRANSFER * MOD BITS OF COMMAND WORD: * BIT 1 -- SELECT OUTPUT(1), SELECT INPUT(0) *  3 -- ECHO INCOMING WORD * 4 -- BRANCH ADDRESS * 9 -- BEGIN BRANCH * 10-- LOAD MODE FIELD BITS  INTO MODE REG * 15-- DISABLE DMA ****** TYPCRT ENT COPY DIOTY,Q GET DIO ADDRESS 8 CHANNEL #  COPY A,*TVALU(X,Y) SAVE VALUE TO BE PRINTED COPY D8612,X START,REQUEST TO SEND,NO INTERRUPT  XNX Q OUT X,1 INITIALIZE XNX Q OUT A,0 SEND A CHARACTER  COPY D100,X RESET CODE XNX Q IN 1,A INPUT TTY STATUS WORD SHIFT A,RO,5 SHIFT TRANSMITTER BIT IN OV JT OV,$-3 LOOP TILL CHARACTER IS TRANSMITTED XNX  Q IN 1,A INPUT STATUS AGAIN SHIFT A,RO,5 JF OV,$-3 LOOP TILL TTY/CRT IS READY TO RECEIVE XNX Q OUT X,1 RESET PICO COPY Y,X REFRESH 'X' WITH BASE ADDRESS COPY *TVALU(X,Y),A RESTORE VALUE TO BE PRINTED RTN TYPCRT BACK TO CALLER D8612 WORD :8612 DIOTY WORD :F8 TTY/CRT DIO ADD=:F8, CHANNEL # = 4 TITL ***** * * -- TYP -- OUT PUT PRINT CONTROL ROUTINE * 'A' IS DESTROYED AT RETURN * 'Q', 'X', & 'Y' ARE NOT DESTROYED * ****** TYP ENT COPY Q,INPTEM SAVE 'Q' COPY S,Q COPY Q,SAVES SAVE 'S' COPY *TCMND(X,Y),Q GET COMMAND ID CLSN ='A',Q DEVICE ASSIGNEMT? JMP TYPALL CLSN ='L',Q IS IT LIST? JMP TYPALL YES-CHECK IF LP OPTION SELECTED CLSN ='S',Q IS IT SEARCH? JMP  TYPALL YES-CHECK IF LP OPTION SELECTED CLSN ='Z',Q IS IT Z-STRING? JMP TYPALL  YES-CHECK IF LP OPTION SELECTED CLSN ='M',Q IS IT BUS MONITOR? BM JMP TYPALL YES-CHECK IF LP OPTION SELECTED BM CLSN ='P',Q IS IT MAP COMMAND? JMP TYPALMAP YES-CHECK IF LP OPTION SELECTED CLSN =BLANK,Q COMMENT MODE? JMP TYPCOM PRINT IT JMP TYPSTD TYPALMAP EQU $ COPY *TLASTS(X,Y),Q IS THIS A 'PM' OR 'PMXXX,L' COMMAND CLSN ='L',Q JMP $+2 ITS A 'PMXXXX,L' COMMAND, SO CONTINUE JMP TYPSTD ITS A 'PM' COMMAND SO DONT LIST TO COMMENT LP NOHOW! TYPALL EQU $ COPY DIOFLG,Q GET DESIRED OUTPUT MODIA FLAG CLSN ='T',Q IS IT TTY/CRT? JMP TYPSTD CLSN ='P',Q OR LP OUTPUT?  JMP TYPOPT CLSN ='B',Q MUST BE BOTH JMP $+2 JMP *TERROR(X,Y) ELSE,ERROR  JST TYPCRT DO CRT OUTPUT JMP TYPOPT DO LP OUTPUT TYPCOM EQU $ COMMENT MODE COPY DIOFLG,Q TV OR LP CLSN ='T',Q JMP ENDTYP TV, ITS ALREADY ECHOED JMP TYPOPT ITS LP OR BOTH, SO DO THE LP DIOFLG WORD 0 OUTPUT OPTION KEEPER LNCNT WORD 0 RUNNING COUNT OF LINESPRINTED DBG4:CNT EQU $ TO SHOW ON LOAD MAP LPCNT WORD -39 DEFAULT LP LINES/PAGE DIOLP EQU  :7F LP DIO ADD = :F, CHANNEL # = 7 TYPSTD JST TYPCRT DO CRT JMP ENDTYP TYPOPT CLSN =LF,A LINE FEED? JMP $+2 YUP! GO CHECK LINE COUNT JMP DOLP NOP! DO PRINT LP IMS LNCNT INCREMENT LINES PRINTED JMP TYNAM COPY =TOF,A DO TOP OF FORM JST TYPLP DO TOF COPY *TLPCNT(X,Y),Q LINES/PAGE COPY Q,LNCNT  JMP $+2 GET OUT DOLP JST TYPLP PRINT A CHARACTER ENDTYP COPY SAVES,Q COPY Q,S RESTORE 'S' COPY INPTEM,Q RESTORE 'Q' RTN TYP BACK TO CALLER DBG4:LP EQU $ TYNAM JST TYPLP NO-OP THIS LOC. IF AUTO-LF LP JMP ENDTYP TITL ****** * * -- TYPLP -- OUTPUT 'A' TO DIO LINE PRINTER * ****** TYPLP ENT COPY A,Q SAVE 'A' OUT A,DIOLP%1 OUTPUT CHARACTER TO PICO COPY D8610,A START DONT INTERRUPT OUT A,DIOLP%1;1 TELL PICO OUT A,DIOLP%1;1 COPY D100,X RESET INSTRUCTION TYPLP1 IN DIOLP%1;1,A GET STATUS FROM LP  SHIFT A,RO,1 BUSY BIT TO OV JT OV,$-2 IF BUSY WAIT FOR IT OUT X,DIOLP%1;1  RESET LP PICO SHIFT X,RO,1 WASTE SOME TIME JNE X,$-1 COPY Y,X REFRESH 'X' COPY Q,A RESTORE 'A' RTN TYPLP BACK TO CALLER D8610 WORD :8610 TITL VALU WORD 0 PARMANENT PARM VALUE KEEPER LASTSN WORD 0 LAST SPECIAL TERMINATOR KEEPER TEST WORD 0 LAST TERMINATOR KEEPER INPTEM WORD 0 ****** * * -- INP -- INPUT A PARAMETER * * EXIT= 'Q' = 'VALU' = PARAMETER VALUE * 'TEST'= CURRENT TERMINATOR (, OR CR) * 'LASTSN' = NEXT TO LAST SPECIAL TERMINATOR (+-*X/) * 'A' = LAST TERMINATOR (, OR CR OR ;) ****** INPP27 WORD 0  BM INPP20 ENT BM COPY INPP20,Q  BM COPY Q,INP BM COPY =1,Q  BM JMP INP+2 BM INP ENT COPY =0,Q BM COPY Q,INPP27  BM COPY =0,Q INITIALIZE COPY Q,VALU FINAL NEW VALUE KEEPER COPY Q,LASTSN SPECIAL TERMINATOR KEEPER (+-*X/) COPY Q,TEST LAST TERMINATOR KEEPER (, OR CR)  COPY Q,*TPFLG(X,Y) PARAMETER RECIEVED FLAG COPY Q,INPTEM WORKING PARAMETER VALUE INPP1 JST  *TRKB(X,Y) GET A CHARACTER CLSN ='R',A USER HARDWARE REGISTER? JMP INPP4 CLSN  =BLANK,A BLANK CHAR? JMP INPP9 CLSN ='G',A G-REGISTER? JMP INPP3   PROCESS GENERAL REGISTER CLSN ='L',A LIST MAP PARAMETER? JMP INPPA PROCESS CLSN =',',A , JMP INPP5 PROCESS CLSN =';',A ; /  JMP INPP5 PROCESS / CLSN ='+',A + JMP INPP5 PROCESS CLSN ='-',A - JMP INPP5 PROCESS CLSN =CR,A VALID TERMINATOR JMP INPP5 CLSN ='*',A * - GO PROCESS JMP INPP5 CLSN ='/',A  / JMP INPP5 CLSN ='X',A X JMP INPP5 COPY INPP27,Q  BM JEQ Q,INPP21 IF NOT INPP ENTRY... BM CLSN ='=',A  BM JMP INPP5 IF '='... BM CLSN ='<',A BM JMP INPP5 IF '<'... BM  CLSN ='>',A BM JMP INPP5 IF '>'...  BM CLSN =':',A BM JMP INPP5 IF ':'...  BM INPP21 JST CHK BM EXCH A,INPTEM  BUILD HEX VALUE SHIFT A,LO,4 SHIFT 4 LEFT INPP2 ADD INPTEM,A ADD VALUE COPY A,INPTEM SAVE CURRENT VALUE IMS *TPFLG(X,Y) PARAMETER ENTERED COPY =0,Q COPY Q,LASTSN  JMP INPP1 INPP6 IMS *TPFLG(X,Y) FLAG PARM RECEIVED INPP5 CLSN =CR,A JMP $+2 COPY A,LASTSN EXCH A,TEST GET LAST SIGN (+-)& SAVE NEW COPY INPTEM,Q GET CURRENT WORKING PARM VALUE CLSN ='-',A NEGATE? NEG Q,Q YES, NEGATE THE VALUE COPY Q,A  ADD VALU,A ADD IN OLD VALUE COPY A,VALU UPDATE PERMANENT VALUE COPY A,Q  SAVE IT ALSO COPY =0,A COPY A,INPTEM NO CURRENT VALUE COPY TEST,A GET CURRENT TERMINATOR CLSN ='+',A IS IT PLUS? JMP INPP1 YES,GO GET MORE WORD CLSN ='-',A MAY BE IT IS MINUS JMP INPP1 YES,GET MORE WORD CLSN ='*',A  IF IT IS * OR JMP INPP8 CLSN ='/',A / OR JMP INPP8 CLSN ='X',A X THEN NEXT MUST BE CR JMP INPP8 RTN INP END OF EXPRESSION, RETURN  LPOOL * EVALUATE G-REGISTERS INPP3 JST *TRKB(X,Y) GET G-REGISTER NUMBER JST CHKG DEVELOP G REGISTER INDEX ADD A,X ADD BASE ADD TO INDEX ADD GBASE,X ADD G:0-BASE OFFSET COPY 0(X),A GET REGISTER VALUE COPY Y,X REFRESH 'X' TO BASE ADD JMP !  INPP2 * * EVALUATE HARDWARE R-REGISTERS INPP4 JST *TRKB(X,Y) GET R-REG NUMBER JST CHKR ADD Q,X ADD BASE ADD ABASE,X ADD AR-BASE OFSET COPY 0(X),A GET REGISTER VALUE COPY Y,X REFRESH 'X' TO BASE ADD JMP INPP2 INPP8 COPY A,LASTSN JST *TRKB(X,Y) READ LAST CHARECTER(MUST BE CR) COPY A,TEST CR CLSN =CR,A AFTER SPECIAL TERMINATOR, IT RTN INP MUST BE CR ELSE ERROR JMP *TERROR(X,Y) ERROR INPP9 COPY ='+',A COPY A,LASTSN MAP BLANK TO + JST *TRKB(X,Y) READ LAST CHA(MUST BE CR) CLSN =CR,A JMP INPP5 DO ALL ADJUSTMENT JMP *TERROR(X,Y) AFTER BLANK CR MUST BE LAST CHAR INPPA  COPY A,LASTSN SAVE 'L' AWAY JST *TRKB(X,Y) GET NEXT KEYBOARD INPUT CLSN =CR,A BEST BE A CARRIAGE RETURN JMP INPP5 ALL OK JMP *TERROR(X,Y) ELSE ITS AN ERROR GBASE WORD G0-BASE ABS OFFSET OF GENERAL REG FROM BASE ABASE WORD EXIT-BASE LPOOL TITL ****** * * -- CHKR -- * * CALCULATES INDEX OF THE USER AND MMU REGISTERS * ENTER: * 'A' = REGISTER * EXIT: 'Q' = INDEX * ****** CHKR ENT COPY A,CHKG  SAVE 'A'=REG NAME COPY *TCMND(X,Y),Q MMU COMMAND? SUB ='P',Q JEQ Q,$+2 YES JMP  GORPH NO ADD =10,X YES, ADJUST POINTERS COPY =MMUEND-MMUTBL,Q JMP $+2 GORPH EQU $ USER REGISTERS COPY =CHREND-CTABL,Q ADJUST POINTERS COPY Q,TABLN ADD CHARAD,X e820519132014820519132014820519132905e@820519132014820519132014820519132904" e820519132014820519132014820519132014e820519132014820519132014820519132014820519132014820519132014820519132014eK@8205191324578205191327208205191331143ei8205191327218205191327288205191331343# $ % & ' ( ) * + . CARBUG ASMCARBUG LBR,  GET CHAR TABLE PTR COPY =0,Q CHKR1 EQU $ COPY 0(X),A GET A CHARACTER CSK A,CHKG COMPARE WITH REG NAME NOP JMP $+2 JMP CHKR2 GOT IT ADD =1,X  NEXT CHARACTER INDEX ADD =1,Q INCREMENT INDEX CSK Q,TABLN FOUND? JMP CHKR1 LOOP NOP JMP CHKRER ERROR, NO TFOUNT CHKR2 EQU $ COPY Y,X  REFERESH 'X' COPY *TCMND(X,Y),A MMU COMMAND SUB ='P',A JEQ A,$+2 JMP SNITZ NO  CSK Q,=4 ADJUST MMU STATUS INDEX FOR 'DONT CARE' BIT JMP $+3 NOP ADD =1,Q SNITZ EQU $ RTN CHKR GO BACK TO CALLER CHKRER COPY Y,X JMP *TERROR(X,Y) ILLEGAL REGISTER CHARAD WORD CTABL-BASE CTABL WORD 'P','A','Q','X','Y' WORD 'K','L','S','D','C' CHREND EQU $ MMUTBL WORD 'U','D','A','T','C' WORD 'R','H','P','L' MMUEND EQU $ TABLN WORD 0 TITL ****** * * -- CHKG -- * DEVELOP G-REGISTER INDEX * ENTER 'A' = ASCII DIGIT * EXIT 'A' = INDEX * ****** CHKG ENT CSK A,='Z' >Z? JMP $+2 NO JMP *TERROR(X,Y) NOT 0-9, A-Z ERROR CSK A,='A' JMP CHKG1A NOT A-Z, MAY BE 0-9 NOP AND =:001F,A MASK OUT UNDESIRED BITS ADD =9,A +9 FOR 10 THRU 36 VALUE OF A-Z JMP CHKG2A GOT INDEX, GET OUT NOW CHKG1A CSK A,='9' 9 OR LESS?  JMP $+2 YES JMP *TERROR(X,Y) NOT 0-9, ILLEGAL DIGIT CSK A,='0' JMP *TERROR(X,Y) NOT 0-9, ILLEGAL DIGIT NOP AND =:000F,A MASK OUT UNDESIRED DIGIT CHKG2A RTN CHKG  GOT IT, BACK TO CALLER TITL ****** * * -- CHK -- * CONVERT ASCII CHARACTER (0-9,A-F)ONLY) TO HEX, IF NOT IN * RANGE OF HEX,GO TO ERROR ROUTINE FOR ILLEGAL CHARACTER * ENTER 'A' = ASCII CHARACTER * EXIT 'A' = HEX DIGIT * ****** CHK ENT SUB ='9'+1,A TEST FOR DECIMAL DIGIT JGE A,CHK2 NOT DECIMAL DIGIT  ADD =10,A GOT DECIMAL JGE A,CHK3 CHK1 JMP *TERROR(X,Y) NOT A NEXADECIMAL DIGIT CHK2 SUB =13,A -13 JGE A,CHK1 NOT A THRU F ADD =6,A +6 JLT A,CHK1 NOT A THRU F ADD =10,A +10 FOR VALUES 10 THRU 15 CHK3 JMP *CHK  BACK TO CALLER TITL ******* * -- Z -- * PARM 1 - HEAD LINK WORD ADDRESS * PARM 2 - # OF WORDS PER LINK LIST * PARM 3 - LINK OFFSET * LINK WORD POINTS TO THE NEXT LINK WORD, SO START OF THE NEXT * LINK LIST WILL BE LINK WORD-LINK OFFSET(3RD PARM). * ******* ZTRING EQU $ CLSN =',',A 2ND PARM? # OF WORDS/LINK JMP $+2 JMP ZT1 NO, USE LAST VALUES JST *TINP(X,Y) YES, GET 2ND PARM COPY Q,ZP1  SAVE # OF WORDS/LINK CLSN =',',A 3RD PARM? LINK OFFSET JMP $+2 JMP ZT1 -  NO, USE LAST VALUE JST *TINP(X,Y) GET 3RD PARM-LINK OFFSET COPY Q,ZP2 SAVE LINK OFFSET JST *TCOMMA(X,Y) ERROR IF , IS TERMINATOR ZT1 JST *TCRLF(X,Y) NEW LINE COPY ZP1,Q GET # OF WORDS/LINK COPY *TADDR(X,Y),A GET HEAD LINK WORD ADDRESS COPY A,ZP0  SAVE START ADDRESS ZT2 EQU $ COPY *TSR(X,Y),A GET THE USERS -S- REGISTER COPY A,ZEPPO SAVE IT COPY ZP0,X GET A LINKED WORD TBIT USERMAP,A TEST IF USER MAP JF OV,ZIT JUMP IF NOT A USER MAP COPYU 0(X),A ELSE IT'S A USER MAP, USE COPYU TO GET FROM USER SPACE JMP $+2 ZIT COPY 0(X),A GET FROM USER SPACE COPY Y,X RESTORE X WITH Y JST *TSHEX(X,Y) PRINT IT IMS ZP0 NEXT WORD SUB =1,Q DECREMENT WORD COUNT JNE Q,ZT2 NOT DONE YET? COPY ZP0,A SUB ZP1,A BACK TO BEGINING ADD ZP2,A + LINK OFFSET  COPY A,X COPY ZEPPO,A GET THE -S- REGISTER TBIT USERMAP,A CHECK IF USER MAP JF OV,$+3 JUMP IF NOT A USER MAP COPYU 0(X),A GET ADDRESS OF NEXT CHAIN MEMBER JMP $+2 COPY 0(X),A COPY  Y,X REFERESH 'X' COPY A,*TADDR(X,Y) NEW LINK LIST ADDRESS JNE A,ZT1 START AGAIN COPY *TDIOFG(X,Y),A GET OUTPUT FLAG CLSN ='T',A TTY OUTPUT JMP $+2 JST  *TCRLF(X,Y) DO EXTRA CRLF JMP *TDBG(X,Y) ALL DONE * ZP0 WORD 0 LINK ADDRESS KEEPER ZP1 WORD :A # OF WORDS/LINK KEEPER ZP2 WORD 0 LINK OFFSET KEEPER ZEPPO WORD 0 USER -S- REGISTER ZERROR JMP *TERROR(X,Y) # OF WORDS < 1 TITL  BM ****** BM *  BM * --- M--- M COMMAND HEADER. BM *  BM ******  BM SPACE 2 BM MCMD EQU $  BM JST *TRKB(X,Y) GET THE SECOND COMMAND CHARACTER. BM CLSN ='M',A  BM JMP MMCMD IF 'M'... BM CLSN ='L',A BM JMP MLCMD IF 'L'... BM  CLSN ='C',A BM JMP MCCMD IF 'C'...  BM JMP *TERROR(X,Y) ELSE ERROR... BM SPACE 2  BM C3BIT EQU 6 =C3 ENABLE BIT. BM C2BIT EQU 5 =C2 E. NABLE BIT. BM C1BIT EQU 4 =C1 ENABLE BIT. BM ANDBIT EQU 7  C1<=X<=C2 ENABLE BIT. BM ORBIT EQU 8 XC2 ENABLE. BM MDMASK  EQU :0008 . BM MEMASK EQU :0200 .  BM MIMASK EQU :0400 . BM MRMASK EQU :0002 .  BM MWMASK EQU :0001 . BM MDBIT EQU 3 MONITOR ALL DMA ENABLE BIT. BM MEBIT EQU 9 RESET WHEN MATCH ENABLE BIT. BM MIBIT EQU 10  INTERRUPT WHEN MATCH ENABLE BIT. BM MRBIT EQU 1 MONITOR NON-DMA READS ENABLE BIT. BM MWBIT  EQU 0 MONITOR NON-WORD WRITES ENABLE BIT. BM BMADDR EQU :16 BUS MONITOR INTERRUPT ADDRESS.  BM FBIT EQU 7 INSTRUCTION FETCH INDICATOR. BM IBIT EQU 4 INTERRUPT REQUEST INDICATOR. BM DBIT EQU 0 DMA ACCESS INDICATOR. BM RWBIT EQU 3 READ/WRITE INDICATOR. BM X1OP WORD 0 BM X1 WORD 0  BM X2OP WORD 0 BM X2 WORD :FFFF BM X3OP WORD 0  BM X3 WORD 0 BM TITL  BM MLSKIP WORD 77 . BM MLXLOC WORD 0 X LOCATION. BM MLYLOC WORD 0 Y LOCATION. BM MLCSKP WORD 0  SKIP COUNT. BM MLCENT WORD 0 ENTRIES. BM MLCTMS WORD 0 TIMES TO DISPLAY ENTRIES. BM ******  BM * BM * --- ML --- LIST BUS MONITOR FIFO.  BM * BM ******  BM SPACE 1 BM MLCMD COPY =1,A . BM COPY A,MLXLOC . BM  COPY =80,Q COMPUTE THE BM COPY Q,MLSKIP BOTTOM FENCE  BM COPY Q,MLYLOC AND THE TOP FENCE. BM MLC51 IN BMADDR%3+0,A .  BM JNE A,$+2 . BM COPY Q,MLSKIP THE BOTTOM FENCE. BM SUB INLINE,A INLINE HOLDS MAINLINE ENTRY ADDRESS JNE A,$+2 /  . COPY Q,MLYLOC TOP FENCE. BM SUB =1,Q SCAN FOR  BM JGT Q,MLC51 AND TRY IT AGAIN. BM COPY BMMRBS,A .  BM TBIT 14,A . BM JF OV,$+2  COPY Q,MLSKIP IF ENTRY THROUGH BUS MONITOR. BM COPY MLYLOC,Q NORMALIZE  BM SUB MLSKIP,Q THE TOP BM JEQ Q,MLC52+1 COPY Q,MLYLOC LOCATION. BM COPY =80,Q . BM  TBIT 14,A NORMALIZE BM JT OV,MLC52 THE  BM SUB MLSKIP,Q BOTTOM LOCATION. BM MLC52 COPY Q,MLSKIP  BM SPACE 1 BM *  BM * PARSE THE USER'S COMMAND LINE. BM *  BM JST *TINP(X,Y) GET A COMMAND CHARACTER. BM  CLSN =CR,A . BM JMP MLC20 IF 'CR', THEN DEFAULT...  BM COPY Q,MLXLOC SET THE LOWER LIMIT. BM JST *TINP(X,Y) GET THE SECOND PARAMETER. BM CLSN =CR,A . BM JMP MLC21  BM MLC22 JMP *TERROR(X,Y) IF NOT TERMINATED WITH A 'CR'... BM MLC20 CLSN =:F8,Q . BM JMP MLC27 IF 'ML*' COMMAND... BM  JNE Q,MLC21 IF TWO OPERANDS... BM COPY MLSKIP,Q IF ONE OPERAND THEN SET DEFAULT. BM MLC21 COPY Q,MLYLOC SET THE TOP LOCATION. BM MLC27 EQU $ .  BM SPACE 1 BM *  BM * CALCULATE FIFO MOVEMENT FOR THE START. BM *  BM COPY MLSKIP,A CALCULATE THE BM  SUB MLYLOC,A NUMBER OF FIFO ENTRIES BM JLT A,MLC22 TO SKIP.  BM MLC23 COPY A,MLCSKP BM COPY MLYLOC,A CALCULATE  BM SUB MLXLOC,A THE NUMBER BM ADD =1,A OF ENTRIES TO BM JLE A,MLC22 PROCESS. BM COPY A,MLCENT . BM SPACE 1 BM * 0  BM * SKIP THE APPROPRIATE NUMBER OF ENTRIES.  BM * BM COPY MLCSKP,Q  BM MLC25 JLE Q,MLC24 IF DONE SKIPPING... BM IN BMADDR%3+1,A SKIP AN ENTRY. BM SUB =1,Q BM JMP MLC25  BM SPACE 1 BM *  BM * OUTPUT TRANSLATED FIFO ENTRIES.  BM * BM COPY *TDIOFG(X,Y),A GET DESIRED OUTPUT MEDIA FLAGG BM JMP $+2 . BM JMP MLC24 .  BM CLSN ='P',A IS IT LP OUTPUT BM COPY *TLPCNT(X,Y),A LINES/PAGE BM COPY A,LNCNT .  BM COPY =TOF,A . BM JST *TTYPLP(X,Y) DO TOP OF FORM  BM MLC24 COPY MLCENT,A . BM NEG A,A . BM COPY A,MLCTMS . BM JST *TCRLF(X,Y) DO A CARRIAGE RETURN TO START. BM MLC26 IN BMADDR%3+2,A . BM  JEQ A,MLC290 IF FROM LOCATION 0... BM SUB =STDIOD,A .  BM JLT A,MLC291 IF BELOW DEBUG... BM SUB =TAIL-STDIOD,A  BM JGT A,MLC291 IF ABOVE DEBUG... BM MLC290 JMP MLC38 . BM MLC291 IN BMADDR%3+3,A . BM TBIT FBIT,A BM JT OV,MLC30 IF INSTRUCTION FETCH... BM  TBIT IBIT,A BM JT OV,MLC31 IF INTERRUPT...  BM TBIT DBIT,A BM JT OV,MLC32 IF DMA ACCESS... BM JMP MLC36 IF ANYTHING ELSE... BM MLC292 WORD -5 .  BM LPOOL * BM MLC30 COPY ='F',A FOR AN INSTRUCTION FETCH. BM JMP MLC33  BM MLC31 COPY ='I',A BM JMP MLC33  BM MLC32 COPY ='D',A BM MLC33 JST *TCRLF(X,Y) . 1  BM JST *TTYP(X,Y) . BM COPY =-5,A . BM COPY A,MLC292 BM *  BM MLC36 IMS MLC292 .  BM JMP MLC360 . BM JST *TCRLF(X,Y) .  BM COPY =BLANK,A . JST *TTYP(X,Y) . JMP MLC33+2 .  BM MLC360 COPY =BLANK,A PAD WITH JST *TTYP(X,Y) A BLANK.  BM IN BMADDR%3+2,A . BM JST *TPADDR(X,Y) .  BM IN BMADDR%3+3,A GET THE STATUS BM COPY A,Q  BM SHIFT A,RO,4 BM JST CONV OUTPUT FIRST CHARACTER... BM COPY Q,A . BM  JST CONV ...AND THEN THE SECOND. BM *  BM TBIT RWBIT,Q BM COPY ='R',A .  BM JT OV,MLC35 . BM COPY ='W',A OTHERWISE ITS A WRITE. BM MLC35 JST *TTYP(X,Y) . BM COPY =BLANK,A AND A BM JST *TTYP(X,Y) FINAL BLANK. BM MLC38 IN BMADDR%3+1,A BUMP FIFO. BM IMS MLCTMS .  BM JMP MLC26 DO ANOTHER ENTRY. BM *  BM * RE-ALLIGN THE FIFO AND EXIT. BM *  BM COPY MLCENT,Q BM ADD MLCSKP,Q BM SUB =80,Q BM  JGT Q,$-1 BM SUB =1,Q  BM MLC41 ADD =1,Q RECIRCULATE THE BM JGE Q,MLC40 FIFO TO ITS  BM IN BMADDR%3+1,A ORIGINAL POSITION. JMP MLC41 MLC40 JST *TCRLF(X,Y) DO ANOTHER CRLF SPACE 1 JMP *TDBG(X,Y) GO AWAY SPACE 2  BM LPOOL TITL BM MMC70 WORD 0  TEMP STORAGE. BM MMC71 WORD 0 TEMP. BM ****** 2  BM *  BM * --- MM --- SET BUS MONITOR MODE BITS. BM *  BM ****** BM SPACE 1  BM MMCMD COPY BMMRBS,A CLEAR THE BM AND =:79F0,A MONITOR BITS BM COPY A,MMC70 AND PUT INTO TEMP STORAGE. BM  JST *TRKB(X,Y) . BM CLSN =CR,A .  BM JMP MMC23 . BM JMP MMC24 .  BM MMC20 JST *TRKB(X,Y) GET A CHARACTER BM MMC24 COPY A,MMC71 HOLD CHARACTER IN TEMP. BM JST *TRKB(X,Y) GET THE TERMINATOR. BM COPY MMC71,Q RESTORE THE CHARACTER. BM EXCH MMC70,A SAVE THE TERMINATOR. BM CLSN ='D',Q . BM OR =MDMASK+:8000,A IF MONITOR ALL DMA...  BM CLSN ='E',Q . BM OR =MEMASK+:8000,A IF RESET WHEN MATCH... BM CLSN ='I',Q . BM OR =MIMASK+:8000,A IF MONITOR INTERRUPTS... BM CLSN ='R',Q . BM OR =MRMASK+:8000,A IF MONITOR NON-DMA READS... BM CLSN ='W',Q . BM OR =MWMASK+:8000,A IF MONITOR NON-DMA WRITES... BM JLT A,$+2 .  BM JMP *TERROR(X,Y) . BM AND =:7FFF,A .  BM * BM EXCH MMC70,A  BM CLSN =',',A . BM JMP MMC20  TRY FOR ANOTHER PARAMETER... BM * BM MMC23 COPY MMC70,A . BM COPY A,BMMRBS  BM OUT A,BMADDR%3+4 OUTPUT MODE CONTROL. BM MMC22 COPY BMMRBS,A SET THE 'ON'  BM SBIT 15,A BUS MONITOR BM COPY A,BMMRBS FLAG.  BM * BM JMP *TDBG(X,Y) BY ! BM SPACE 4 *  BM * PERMANENT STORAGE FOR THE MONITOR REGISTERS. BM * 3  BM SPACE 1 BM X1OPP WORD 0 .  BM X2OPP WORD 0 . BM X3OPP WORD 0  . BM X1P WORD 0 . BM X2P  WORD 0 . BM X3P WORD 0 .  BM TITL BM ******  BM * BM * --- MC --- SET BUS MONITOR CONTROL PARAMETERS. BM * BM ******  BM MCCMD JST MPARSE PARSE A USER COMMAND. BM  JMP MCC42 . BM *  BM * SET THE PERMANENT MODE BITS. BM *  BM COPY X1,A . BM COPY A,X1P .  BM COPY X2,A . BM COPY A,X2P . BM COPY X3,A . BM  COPY A,X3P . BM *  BM * CALCULATE A COMMAND WORD. BM *  BM COPY BMMRBS,A CLEAR COMPARE BITS. BM AND =:FE0F,A .  BM COPY X3OP,Q PROCESS THE C3 PARAMETER. BM COPY Q,X3OPP SET THE PERMANENT X3OP. BM JEQ Q,$+2 IF NO C3 PARAMETER... BM  SBIT C3BIT,A . BM COPY X2OP,Q PROCESS THE C2 PARAMETER.  BM COPY Q,X2OPP SET THE PERMANEMT X2OP. BM CLSN ='=',Q .  BM SBIT C2BIT,A . BM CLSN ='>',Q .  BM SBIT ORBIT,A . BM CLSN =':',Q . BM SBIT ANDBIT,A . BM  COPY X1OP,Q PROCESS THE C1 PARAMETER. BM COPY Q,X1OPP SET THE PERMANENT X3OP.  BM CLSN ='<',Q . BM SBIT ORBIT,A .  BM CLSN ='=',Q . BM SBIT C1BIT,A . 4  BM COPY A,BMMRBS . BM OUT A,BMADDR%3+4 OUTPUT THE CONDITION CODES. BM MCC42 EQU $ . BM  COPY X1P,A OUTPUT BM OUT A,BMADDR%3+1 THE  BM COPY X2P,A CX BM OUT A,BMADDR%3+2 PARAMETERS.  BM COPY X3P,A . BM OUT A,BMADDR%3+3 .  BM JMP MMC22 GO SET THE 'ON' BUS MONITOR BIT. BM TITL  BM MPRS20 WORD 0 TEMP BM MPRS70 WORD 0 ZERO. BM MPRS74 WORD -4 .  BM * BM * PARSE THE 'MC' COMMAND USER LINE.  BM * BM SPACE 1  BM MPARSE ENT . BM COPY =:FFFF,Q . BM COPY Q,X2 . BM  JST *TINPP(X,Y) . BM CLSN =CR,A COMPARE FOR NO PARAMETERS.  BM MPRS23 JMP MPRS26 . BM *  BM EXCH MPRS70,A . BM COPY A,X1 ZERO BM COPY A,X1OP THE BM COPY A,X2OP LOCATIONS. BM COPY A,X3 . BM  COPY A,X3OP . BM EXCH MPRS70,A .  BM * BM EXCH MPRS74,A .  BM COPY A,MPRS20 SET LIMIT COUNT TO -4. BM EXCH MPRS74,A .  BM JMP MPRS22 . BM *  BM MPRS21 CLSN =CR,A . BM  JMP MPRS24 . BM JST *TINPP(X,Y) .  BM MPRS22 CLSN ='=',A IF '='... BM JMP MPRS30 .  BM CLSN ='<',A IF '<'... BM JMP MPRS40 .  BM CLSN ='>',A IF '>'... BM JMP MPRS505  . BM CLSN =':',A IF ':'... BM  JMP MPRS60 . BM JMP *TERROR(X,Y) .  BM MPRS24 IMS MPARSE . BM RTN MPARSE .  BM JMP *TERROR(X,Y) OTHERWISE... BM LPOOL MPRS26 JST *TCRLF(X,Y) . BM COPY ='C',A . BM  JST *TTYP(X,Y) . BM COPY ='1',A .  BM JST *TTYP(X,Y) . BM COPY ='=',A .  BM JST *TTYP(X,Y) . BM COPY X1P,A .  BM JST *TSHEX(X,Y) PRINT THE C1 REGISTER. BM COPY ='C',A  . BM JST *TTYP(X,Y) . BM COPY ='2',A . BM JST *TTYP(X,Y) .  BM COPY ='=',A . BM JST *TTYP(X,Y) .  BM COPY X2P,A . BM JST *TSHEX(X,Y) PRINT THE C2 REGISTER. BM COPY ='C',A . BM JST *TTYP(X,Y) . BM COPY ='3',A . BM JST *TTYP(X,Y) . BM COPY ='=',A .  BM JST *TTYP(X,Y) . BM COPY X3P,A .  BM JST *TSHEX(X,Y) PRINT THE C3 REGISTER. BM COPY ='M',A .  BM JST *TTYP(X,Y) . BM COPY ='=',A  . BM JST *TTYP(X,Y) . BM COPY BMMRBS,A . BM AND =:3FFF,A AND OUT THE FLAG BITS. BM JST *TSHEX(X,Y) PRINT THE MODE REGISTER. BM JST *TCRLF(X,Y) .  BM JMP MPRS24+1 . BM TITL  BM * BM * MC - PROCESS A '='. BM * BM  SPACE 1 BM MPRS30 IMS MPRS20 6  BM JMP $+2 BM JMP *TERROR(X,Y) IF TOO MANY PARAMETERS... BM JST *TINP(X,Y) GET THE PARAMETER. BM COPY A,MPRS35 SAVE THE TERMINATOR. BM COPY ='=',A . BM EXCH X3OP,A BM JEQ A,MPRS31 IF X3OP WAS BLANK... BM  EXCH X2OP,A . BM JEQ A,MPRS32 IF X2OP WAS BLANK...  BM EXCH X2OP,A BM EXCH X1OP,A  BM JEQ A,MPRS33 IF X1OP WAS BLANK... BM JMP *TERROR(X,Y) WHAT, ALL ARE FULL ! ERROR. BM MPRS31 COPY Q,X3 BM JMP MPRS34  BM MPRS32 COPY Q,X2 BM JMP MPRS34 BM MPRS33 COPY Q,X1  BM MPRS34 COPY MPRS35,A RESTORE THE TERMINATOR. BM JMP MPRS21 BY !  BM MPRS35 WORD 0 TEMPORARY TERMINATOR STORAGE. BM SPACE 2  BM * BM * MC - PROCESS A '<'. BM * BM SPACE 1 BM MPRS40 IMS MPRS20  BM JMP $+2 BM MPRS42 JMP *TERROR(X,Y) ERROR.  BM EXCH X1OP,A . BM JNE A,MPRS42 IF X2OP WAS NOT BLANK... BM MPRS41 JST *TINP(X,Y) GET THE PARAMETER. BM COPY Q,X1  . BM JMP MPRS21 BY ! BM SPACE 2 BM * BM * MC - PROCESS A '>'. BM *  BM SPACE 1 BM MPRS50 IMS MPRS20  BM JMP $+2 BM JMP *TERROR(X,Y) IF TOO MANY PARAMETERS... BM EXCH X2OP,A . BM JNE A,MPRS42 IF X1OP WAS NOT BLANK... BM MPRS51 JST *TINP(X,Y) . BM COPY Q,X2 . BM JMP MPRS21 BY ! 7  BM SPACE 2 BM *  BM * MC - PROCESS A ':'. BM *  BM SPACE 1 BM MPRS60 IMS  MPRS20 BM JMP $+2 BM MPRS62 JMP *TERROR(X,Y) BM EXCH X2OP,A  BM JNE A,MPRS62 IF POSITION WAS FULL... BM EXCH X1,Q  BM JNE Q,MPRS62 IF X1 WAS FULL... BM IMS MPRS20  BM JMP $+2 BM JMP  *TERROR(X,Y) BM JST *TINP(X,Y) GET THE SECOND PARAMETER. BM  COPY Q,X2 BM COPY A,X1OP MAKE X1OP NON-ZERO.  BM JMP MPRS21 BY ! BM LPOOL OPTIONS +:20 OBJNOTE 'CARBUG (A500)' OPTIONS -:20 TAIL EQU $ END CARBUG  BM JST *TSHEX(X,Y) PRINT THE C1 REGISTER. BM COPY ='C',A  . BM JST *TTYP(X,Y) . BM JDBG4:CNTDBG4:LP CARBUG O0SEGMENTBLANK DEBUG: o  MG:Z G:Y G:X MG:W G:V G:U MG:T G:S G:R MG:Q G:P G:O MG:N G:M G:L MG:K G:J G:I MG:H G:G G:F MG:E  G:D G:C MG:B G:A G:9 MG:8 G:7 G:6 MG:5 G:4 G:3 MG:2 G:1 G:0 im MACRO (F002) ig  }߾\8 m-  $ H}K4 d '     D> 7   T ( : 9 - :ւ"  )   " } \ ` ͤ b\En@x   1R 񦟞 p P @0B  ݣ` M        q1Q p  PO/W C A R B U G A 5 0 0 ֟e u#u"u!u uuuuuuuuuuuuuuuuuuu u u u u uuuuuuuuu  ւz־ Pށ AڂA Qւ> X҂; Y΂8׽ԾϾξ KƂ1 L‚. S+ D( C%ןK ־ D9 U  A T C N6  Ծ R H P L U N 6 ޟx = ֟{ ֟|@\5 ܂y"yyv ѽ *ܽ Y Q A T G սۆ R  Ʋ P M ƣ MƞŸLB LCLFLLLSLJLI8  LGLRLZLP˝ +ʞ)jC ՆwՆq ǂp Lǂh T P Bǁ P ւZƽ  {֝QEN , , Կ `  6\E _ܞ"\5?yz ¦ ` J B YK Q Jpق ^ޫ @ 6\%ާ\ޡ ޝ `@E ; RA@EN@Aޏǎ Qފ ,T7 og}6y\  D `pU* ]e@ ^6F ]\W\%N\L H ĂO܃D B ` D*ASI# ` !*/@6\ m@o ` A M쇅N]Wc T C ߴ I߰ U߬ Nߩ Sߥ A ߡߙߙߙߚߚߚ ,՞SǾ焝 3Hd  p›PQIӓb@" -LlQł ބMb T ` z C J“KQG c@" qQłԇ ށj I  ݂ۓɆ“'t FG@G< ̟v(<0   KQG d@"Ӕƕ qQłŽ Njޠj  \5   Uɝ  w } { yxw t “KQGZMNe @"JK qQłEBDAށ j \… NL “KQG >56f@"23 qQł- *,)ށj @ S0  “KQG"g@"  qQłށj $ A @@ @@'@@@ Y X| ɝƁ P΂"B ƽԃ޽ٽ΁C / Xǃ Խޞi]+ ȁ K@"o ٽԃkMޞ9 {JN0C  6 ޽ٽ \MMX0G HXBJN0 ?C  ;C 8 ǁ 9 ,ǁ ف L? A YBQCJ|υLL Iǿʇʆ ȗȇŗƇ—ć ,ǽՆ  ,@Ɗˆ , N1@u뿒  IdžǑǑǑ  % 8R ԽςU =܂Q D A M_޽ ƿQ@ƈ† JN1@ w݃?jFٞgD d I+ D A M P +r5p4n3l  P MMǟvMǝǟr @ ǝ @ h @  Ǟc@ `ǟ^ D A MvNߟsN۟p NڟmՇ4 ,x@   ܂AAA_ P =܂ޞ D =܂ ޞi A =܂ٽޞd M =܂ޞ_Ǐ B@ @0ԁ @ݢ\% `޽فE@ \ ` ,¤a + - * X /KJƔY \% `T\% `y\% ` tނQ ,ǟ| LP ٽL 垂 @ P ԁ Նҁ L\% ` ɞy Ԟl߀ ` ޽޼yؽԞb  pΆ͂Gެ}ޫ yޥ}\% `y E ~  .փ\% ` E ~  .ޣރ aI , ǽنs@FC kq LL (w{u ^ |JQBYx L S P TԞKJ  FsBpƾ!8 1 ` `TR\ `Pz  IƎ1 ,ǽƇ , ƂpIƴk ,  ,Htr H9 m -džف -dž \% `ZZÂF -rԂ ݢ \% `מv  ’@"Fz@ Ό  F Ǎ l  *!81_ ` ƨ\%\ `ޡޞJQ šƙ\%@\%K ލގ `JQ ` % מr F  B * ւ8o  _ ]\"ZIXM  K P&M&II  `HKL$kB N =ւ; ; Gւ8   :֞  ֟L ̟{  y9u    :w ³ 0 C C 96C C " z a ࢅ0 `e  •C "C tC I6< C I6C " `j  @0cLALLLSLZ LMLPL LL LTLPLBǾGƒLTg پ> x s00@—Fg z @" 6= ". 1 `@p  ~ƂI IwIqqq p R G L , ; + - * / XWQH = < > : K1IHICT  >>> -@A@76@ 6 4 +C -A * / X1  վ  ` Rվ B `KՆ   + Gdž B   JQA+ I I ƭ I+Kw ` AMK^ ` PAQXYKLSDC UDATCRHPL Z A 9 0 n C F =  t ,ƪ , Ʀν¢6 \% `ޔJQ  6\% ` T ԝ ǽ M L CM yIPvwr qJR86ijgQFg IP6Aa` ]  LQTURSRPN NLRJ| P @?D A6QO6Q6Qc \  F I DԽ kj ֞x  @9@@? R6A W  BËˋJR>JKSB|ԝ ; : A{ Նv trLDLELILRLW ǖd ,ka$"  ņy xÆwpQAlýkL= \L>L:|öbL<L=L ^]\Q  HǞ wq qno = < > :ba 2 4 6 5 3 1c y C 1 =ւ C 2 =ւ C 3 = M =փT޽ԞH& ن =FFEFCCE =:7& 5-Ǔ,& Ǔ$Q߇ǽ? m CARBUG (A500) G:S G:R MG:Q G:P G:O MG:N G:M G:L MG:K G:J G:I MG:H G:G G:F MG:E  G:D G:C MG:B G:A G:9 MG:8 G:7 G:6 MG:5 G:4 G:3 MG:2 G:1 G:0 im MACRO (F002) ig  }߾\8 m-  $ H}K4 d '     D> 7   T ( : 9 - :ւ"  )   " } \ ` ͤ b\En@x   1R 񦟞 p P @0B  ݣ` M        q1Q p  PO/W C A R B U G A 5 0 0 ֟e u#u": u!u uuuuuuuuuuuuuuuuuuu u u u u uuuuuuuuu  ւz־ Pށ AڂA Qւ> X҂; Y΂8׽ԾϾξ KƂ1 L‚. S+ D( C%ןK ־ D9 U  A T C N6  Ծ R H P L U N 6 ޟx = ֟{ ֟|@\5 ܂y"yyv ѽ *ܽ Y Q A T G սۆ R  Ʋ P M ƣ MƞŸLB LCLFLLLSLJLI LGLRLZLP˝ +ʞ)jC ՆwՆq ǂp Lǂh T P Bǁ P ւZƽ  {֝QEN , , Կ `  6\E _ܞ"\5?yz ¦ ` J B YK Q Jpق ^ޫ @ 6\%ާ\ޡ ޝ `@E ; RA@EN@Aޏǎ Qފ ,T7 og}6y\  D `pU* ]e@ ^6F ]\W\%N\L H ĂO܃D B ` D*ASI# ` !*/@6\ m@o ` A M쇅N]Wc T C ߴ I߰ U߬ Nߩ Sߥ A ߡߙߙߙߚߚߚ ,՞SǾ焝 3Hd  p›PQIӓb@" -LlQł ބMb T ` z C J“KQG c@" qQłԇ ށj I  ݂ۓɆ“'t FG@G< ̟v(<0   KQG d@"Ӕƕ qQłŽ Njޠj  \5   Uɝ  w } { yxw t “KQGZMNe @"JK qQłEBDAށ j \… NL “KQG >56f@"23 qQł- *,)ށj @ S0  “KQG"g@"  qQłށj $ A @@ @@'@@@ Y X| ɝƁ P΂"B ƽԃ޽ٽ΁C / Xǃ Խޞi]+ ȁ K@"o ٽԃkMޞ9 {JN0C  6 ޽ٽ \MMX0G HXBJN0 ?C  ;C 8 ǁ 9 ,ǁ ف L? A YBQCJ|υLL Iǿʇʆ ȗȇŗƇ—ć ,ǽՆ  ,@Ɗˆ , N1@u뿒  IdžǑǑǑ  % 8R ԽςU =܂Q D A M_޽ ƿQ@ƈ† JN1@ w݃?jFٞgD d I+ D A M P +r5p4n3l  P MMǟvMǝǟr @ ǝ @ h @  Ǟc@ `ǟ^ D A MvNߟsN۟p NڟmՇ4 ,x@   ܂AAA_ P =܂ޞ D =܂ ޞi A =܂ٽޞd M =܂ޞ_Ǐ B@ @0ԁ @ݢ\% `޽فE@ \ ` ,¤a + - * X /KJƔY \% `T\% `y\% ` tނQ ,ǟ|;  LP ٽL 垂 @ P ԁ Նҁ L\% ` ɞy Ԟl߀ ` ޽޼yؽԞb  pΆ͂Gެ}ޫ yޥ}\% `y E ~  .փ\% ` E ~  .ޣރ aI , ǽنs@FC kq LL (w{u ^ |JQBYx L S P TԞKJ  FsBpƾ!8 1 ` `TR\ `Pz  IƎ1 ,ǽƇ , ƂpIƴk ,  ,Htr Hm -džف -dž \% `ZZÂF -rԂ ݢ \% `מv  ’@"Fz@ Ό  F Ǎ l  *!81_ ` ƨ\%\ `ޡޞJQ šƙ\%@\%K ލގ `JQ ` % מr F  B * ւ8o  _ ]\"ZIXM  K P&M&II  `HKL$kB N =ւ; ; Gւ8   :֞  ֟L ̟{  y9u    :w ³ 0 C C 96C C " z a ࢅ0 `e  •C "C tC I6< C I6C " `j  @0cLALLLSLZ LMLPL LL LTLPLBǾGƒLTg پ> x s00@—Fg z @" 6= ". 1 `@p  ~ƂI IwIqqq p R G L , ; + - * / XWQH = < > : K1IHICT  >>> -@A@76@ 6 4 +C -A * / X1  վ  ` Rվ B `KՆ   + Gdž B   JQA+ I I ƭ I+Kw ` AMK^ ` PAQXYKLSDC UDATCRHPL Z A 9 0 n C F =  t ,ƪ , Ʀν¢6 \% `ޔJQ  6\% ` T ԝ ǽ M L CM yIPvwr qJR86ijgQFg IP6Aa` ]  LQTURSRPN NLRJ| P @?D A6QO6Q6Qc \  F I DԽ kj ֞x  @9@@? R6A W  BËˋJR>JKSB|ԝ ; : A{ Նv trLDLELILRLW ǖd ,ka$"  ņy xÆwpQAlýkL= \L>L:|öbL<L=L ^]\Q  HǞ wq qno = < > :ba 2 4 6 5 3 1c y C 1 =ւ C 2 =ւ C 3 = M =փT޽ԞH& ن =FFEFCCE =:7& 5-Ǔ,& Ǔ$Q߇ǽ? m CARBUG (A500) Նv trLDLELILRLW ǖd ,ka$"  ņy xÆwpQAlýkL= \L>L:|öbL<L=L ^]\Q  HǞ wq qno = < > :ba 2 4 6 5 3 1c y C 1 =ւ C 2 =ւ C 3 = M =փT޽ԞH& ن =FFEFCCE =:7& 5-Ǔ,& Ǔ$Q߇ǽ? m CARBUG (A< IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII= IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII> IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII? IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIA IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIB IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIC IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIID IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIE IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIF IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIH IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIK IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIL IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIICARTOSMA182051913201420820519132014 820519132014VF20000 VOLCARBUG UTILITY SOURCE MAINTENANCE DISKETTE (94200-00-A500)