IMD 1.16: 30/08/2008 21:18:51 84-94400-01 a100 f40001 debug maintenance diskette    @0|)wwЀЀtQql)  " }gA `_ M@IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 MF182042218165304820422181653 8204221816537F40001 VOLDEBUGC MAINT. DISKETTE 84-94400-01 (A100)850)   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII_ M@iGyy GGG`HZ@ b G`^Y e IQ BBp@;:9 :7P@ G:پN 8!0. * C'xC# b# }B @0DAJL w+™ЀЀΖQA1"   i ž} š} @EEFF)DEۄF8 џ} ԟ} ̟} * `jUBBI,v BI, # @ G9H@pܾrCHC C GTq` Lg"gEXC P+s=胾P+c fQN p $Rxnj  ޔniZ ތ⊞ } }HGž Ÿ@ALS)"$ C k20j.h( +$`%ꂜ\1 !M' y %'+os慾)sY ed|{ @8 o O m J K i gN )V% t%sLn`"E F. F„ D>) =`;nrgy w"G,{Kq1 A&}E*`(t@% ;c  765y342(.OS:: SYS"iwvc Bc A@6<# Ic B# gIjHc r TITL CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) * * INCLUDE USERCOMMON.MAC * INCLUDE IOB.MAC * INCLUDE X:COMMON.MAC * INCLUDE X:IOERR.MAC * OLDOPS OPTIONS +4 INCLUDE USERCOMMON.MAC INCLUDE IOB.MAC INCLUDE X:COMMON.MAC INCLUDE X:IOERR.MAC OPTIONS OLDOPS TITL . * CARTOS ENVIRONMENT DEBUG * * THIS DEBUG IS USED IN A PROTECTED CARTOS * ENVRIONMENT. THIS DEBUG USES STANDARD CARTOS * I/O CALLS (I:IO) WITH LOGICAL UNITS TV (CRT) * AND LP (LINE PRINTER). DEBUGC DOES NOT USE * ANY PRIVILEGED INSTRUCTIONS (I/O, ETC.) AND * DOES NOT DISABLE INTERRUPTS FOR EXTENDED PERIODS * OF TIME * * REVISION HISTORY * * A000 - ORIGINAL CONVERSION FROM DEBUG4 * USES SINGLE CHARACTER UNFORMATTED I/O. * * A001 - CONVERTED TO USE BUFFERED FORMATTED I/O. * * A100 - NOW GENERATES CR LF BEFORE PRINTING TITLE. * ANY I/O ERROR OTHER THAT EOF, TIMEOUT, TV CLASS ERRORS * OR LP CLASS ERRORS ARE GENERATED AS EXCEPTIONS. * 15/JAN/82 ACS. * *************************** * MACHINE :100 4/95 (FOR CEA'S) NAM DEBUGC NAM DBGC:LP NAM DBGC:TV NOTEMAC MACRO OBJNOTE 'DEBUGC - REV. A100' ENDM 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 'A002' PROMCH EQU '*' PROM CHARACTER BELL EQU :7 BELL CHAR CR EQU :D CARRIAGE RETURN BLANK EQU :20 BLANK CHAR LLNTH EQU 40 PERMISSIBLE LENGTH FOR LIST BRKPT EQU 0  BREAK POINT RETURN ADDRESS TITL SHARABLE DEBUG: SYSTEM DEBUG: REL DEBUGC JMP DEBUGC2 RTN ENT BREAKPOINT RETURN ENTRY JST SAVE PRESERVE REGISTERS COPY RTN,A SAVE RETURN ADDRESS JMPE RTNB PROCESS RETURN FROM BREAKPOINT ****** * * -- SUB-ROUTINE AND WORD CELL OFFSET FROM BASE PROGRAM -- * * SUB-ROUTINES * BASE EQU $ * 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 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 TPADDR EQU $-BASE WORD PADDR-BASE TSHEX EQU $-BASE  WORD SHEX-BASE TETEST EQU $-BASE WORD ETEST-BASE TZTRNG EQU $-BASE WORD ZTRING-BASE Z ABSOLUTE OFFSET FROM BASE PROG * * 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 TCMND EQU $-BASE WORD CMND-BASE TDIOFG EQU $-BASE WORD DIOFLG-BASE 'T' OR 'P' OR 'B' FLAG KEEPER TITL ******** * * -- DEBUGC2 -- * ******** * DEBUGC2 EQU $ JST SAVE SAVE USER ENVIORMENT COPY ='T',A COPY A,*TDIOFG(X,Y) FLAG TO PRINT ON TTY/CRT JST HDNG1 COPY ='(',A ( JST *TTYP(X,Y) COPY =':',A  : JST *TTYP(X,Y) CEA DEBUGC,A JST *THEX(X,Y) CONVERT 'A' INTO 4 HEX DIGITS COPY ='-',A - JST *TTYP(X,Y) COPY =':',A : JST *TTYP(X,Y) CEA TAIL,A END ADDRESS SUB =1,A JST *THEX(X,Y) COPY =')',A )  JST *TTYP(X,Y) PRINT ) COPY =BELL,A JST *TTYP(X,Y) RING BELL CEA DEBUGC,A COPY A,*TEXIT(X,Y) INITIALIZE EXIT JMP *TRTN6(X,Y) CLEAR ANY BREAK POINTS NOTEMAC TITL ****** * * -- SAVE -- * - ALL THE USER HARDWARE REGISTERS, 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 3 UNTIL BYTE MODE IS CLEARED COPY A,AR COPY S,A GET S REGISTER COPY A,SR AND SAVE IT SBIT 6,S XA ON RBIT 2,S BYTE MODE OFF COPY Y,YR COPY X,XR COPY Q,QR COPY K,A COPY A,KR  COPY L,A COPY A,LR CEA BASE,X COPY X,Y X + Y HAVE BASE PROG ADDRESS RTN SAVE BACK TO CALLER TITL ****** * * -- UNSAVE -- * RESTORE ALL USER HARDWARE REGISTERS * ****** UNSAVE ENT COPY QR,Q RESTORE 'Q' COPY XR,X 'X' COPY YR,Y  'Y' COPY KR,A COPY A,K RESTORE 'K' COPY LR,A COPY A,L  'L' COPY SR,A COPY A,S 'S' SIN 3 COPY AR,A  RTN UNSAVE RETURN TO CALLER TITL HDNG1 ENT JST *TCRLF(X,Y) NEW LINE COPY =' ',A  JST *TTYP(X,Y) JST *TCRLF(X,Y) NEW LINE COPY ='D',A D JST *TTYP(X,Y) COPY ='E',A E 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 ='C',A C  JST *TTYP(X,Y) COPY =BLANK,A JST *TTYP(X,Y) COPY =REV:%-24,A JST *TTYP(X,Y) COPY =R EV:%-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' * * 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 RTN DMPRS  BACK TO CALLER 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 ****** * -- DBG -- * EXIT: ADDR - - 1ST PARAMETER * SIZE -- INDEX TO G OR R REGISTER * KEY -- COMMAND ID * TEST -- TERMINATOR * LASTSN -- LAST SPECIAL TERMINATOR ****** DBG EQU $ COPY TRNT,A ADD X,A BREAK POINT RETURN ADDRESS COPY A,BRKPT STUFF IT AT '0' COPY =0,A COPY A,CMND  INITIALIZE COMMAND KEEPER DBG3 JST *TCRLF(X,Y) NEW LINE COPY =PROMCH,A GET PROM CHARACTER JST *TTYP(X,Y) JST *TRKB(X,Y) READ COMMAND ID CLSN A,=CR NULL LINE? JMP DBG3 YES COPY A,CMND  SAVE FUNCTION ID CLSN ='Y',A IS IT SINGLE STEP ? JMP NEXT YES, PROCESS IT  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 ='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 DBG1  CHECK FOR OTHER COMMANDS 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 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 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 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 TITL ****** * * -- A -- DEVICE ASSIGNMENT COMMAND * * ALX X = T(TTY), P(PRINTER), B(BOTH) -- LIST OUTPUT DEVICE * APX X = T(TTY), H(HSPT) -- PUNCH OUTPUT DEVICE * ****** S AVE2 WORD 0 * 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 '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 EQU $ COPY ='P',A COPY A,*TDIOFG(X,Y) DEV2 COPY ADDR,A COPY A,*TDIOFG(X,Y) SAVE OUTPUT DEVICE DESIRED JMP DBG BACK TO ACCEPT COMMAND  TITL * -- COM -- * COMMENT MODE COM JST *TRKB(X,Y) FETCH A CHARACTER CLSN =CR,A  END OF COMMENT? JMP *TDBG(X,Y) YES, BACK TO DBG JMP COM CONTINUE COMMENT MODE ****** * * -- 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 $ /  COPY Y,X REFRESH 'X' WITH BASE ADR / COPY *TEXIT(X,Y),A GET RETURN ADD COPY A,INLINE  JST *TUNSAV(X,Y) RE-STORE USER ENVIORMENT JMP *INLINE GO TO USER PROGRAM INLINE WORD 0  EXIT ADD KEEPER (IN LINE 'P') ****** * -- ERROR -- * ERROR FORMAT ERROR EQU $ COPY =BLANK,A JST *TTYP(X,Y) COPY ='?',A JST *TTYP(X,Y) JST *TCRLF(X,Y) JMP RTN6X GO FIX BREAK POINTS ALLRX  JMP ALLR OUT OF RANGE LINK 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 ? JMP BRK1 YES, PROCESS NORMAL BP COPY *TEXIT(X,Y),Q GET CURRENT P-REG   CLSN ='Y',A IS IT STEP FORWARD ONE? ADD =1,Q GET NEXT LOC AS BP ADDRESS 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 BRK1 EQU $ 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 $ IMS BRKCNT COUNT BREAKPOINTS  COPY Q,X 'X' HAS NEW PARAMETER VALUE COPY JST0,A JST *0 CODE IN 'A' EXCH 0(X),A STORE JST AT USER & SAVE USER INST IMS SVTBL COPY A,*SVTBL SAVE USER INSTRUCTION  IMS SVTBL COPY X,*SVTBL SAVE USER INSTRUCTION ADDRESS COPY Y,X RESTORE X TO BASE ADDRESS COPY *TTEST(X,Y),A FETCH TERMINATOR XOR Q,Q CLEAR ITERATION COUNT CLSN =';',A IS ITERATION COUNT GIVEN JMP BRK4 YES, PROCESS IT JMP BRK5 JUMP IF NO ITERATION COUNT RTN6X JMP RTN6 LINK TO MAINTAIN BIN. RELOCATABILITY BRK4 EQU $ JST *TINP(X,Y) GET ITERATION COUNT JGT Q,$+2 SKIP IF COUNT > 0 XOR Q,Q INDICATE NO COUNT SPECIFIED SHIFT Q,LO,1 DOUBLE COUNT NEG Q,Q NEGATE IT FOR INDEX BRK5 EQU $ IMS  SVTBL BUMP TABLE ADDRESS COPY Q,*SVTBL SAVE ITERATION COUNT COPY =1,A GET FLAG  JNE Q,$+2 SKIP IF COUNT NOT SPECIFIED XOR A,A CLEAR FLAG IF NOT IMS SVTBL  BUMP TABLE ADDRESS COPY A,*SVTBL SAVE BREAKPOINT FLAG COPY *TTEST(X,Y),A GET THE TERMINATOR CHARACTER CLSN =',',A ANOTHER PARAMETER ? JMP BRK2 PROCESS NEXT PARAMETER JMP JMPP1 IF NO MORE, GO BACK TO USER 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 JST0 JST *BRKPT BREAK POINT INSTRUCTION JMPP2X JMP JMPP2 TO MAINTAIN BIN. RELOCATABILITY TITL ****** * * -- RTNB -- RETURN FROM BREAK POINT * * ****** TEMP WORD 0 MASK WORD 0 RTNADD WORD 0 RTNB EQU $ A=RETURN ADDRESS SUB =1,A DECREMENT TO BREAK POINT ADDRESS COPY A,*TEXIT(X,Y) SET UP USER PROGRAM ENTRY ADDRESS 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 RTN3 EQU $ CSK A,2(X) COMPARE WITH TABLE ENTRY NOP JMP RTN5 BUMP INDEX REGISTER * FOUND BREAKPOINT IN TABLE COPY 3(X),A GET ITERATION COUNT JEQ A,RTN3A  JUMP IF NO ITERATION COUNT * IT'S AN ITERATION COUNT BREAKPOINT COPY 4(X),A GET BREAKPOINT FLAG  COPY A,TEMP SAVE BREAKPOINT FLAG COPY X,A SAVE TABLE INDEX COPY 1(X),Q GET USER INSTRUCTION COPY 2(X),X GET LOCATION EXCH Q,0(X) SWAP INSTRUCTION/JST *0 ADD  TEMP,X GET PRIOR/NEXT INSTRUCTION EXCH Q,0(X) PLACE BREAKPOINT THERE EXCH A,X SWAP TABLE ADDRESS/LOCATION COPY Q,1(X) SAVE THIS INSTRUCTION COPY A,2(X) SAVE IT'S LOCATION  COPY TEMP,Q GET BREAKPOINT FLAG NEG Q,Q POINT TO NEXT/PRIOR COPY Q,4(X) RESTORE BREAKPOINT FLAG IMS 3(X) BUMP ITERATION COUNT NOP COUNT NOT DONE, RETURN  JMP JMPP2X DONE, RETURN, STOP NEXT TIME RTN3A EQU $ 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 A,0(X) STORE INST. AT PROPER ADDRESS COPY BRKCNT,A ONE BRK POINT RESTORED SUB =1,A COPY A,BRKCNT JMP RTN6 GO PROCESS REST OF THE BRK POINTS TITL ****** * * -- RREG -- * -- DISPLAY AND CHANGE OF REGISTERS -- * ****** RREG EQU $ 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 CEA SR,Q COMPUTE ADDRESS OF S REGISTER SAVE CSK Q,SIZER ARE WE GOING TO CHANGE THE S REGISTER? NOP JMP RREG6 NO, GO CHANGE IT COPY *SIZER,Q GET OLD S REGISTER XOR Q,A FIND WHICH BITS NEED CHANGING AND SMASK,A DON'T CHANGE UNUSED BITS TBIT 11,S ARE WE IN PROTECT MODE JF OV,$+2 NO AND =:27,A YES, ONLY XA, BM, OV, AND CY CAN BE CHANGED XOR Q,A MAKE NEW S REGISTER RREG6 EQU $ 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 * SMASK WORD :FD77 NON-RESERVED STATUS REGISTER BITS 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 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,A  FETCH CONTENTS OF MEM 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 Q,*ADDRI MODIFY MEMORY 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 *TE  RROR(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,A INDIRECT INDI1 COPY A,*TADDR(X,Y) PUT NEW ADD BACK JMP INSP1 START AGAIN MULT COPY *ADDRI,A  SHIFT A,LO,1 MULTIPLY BY 2 JMP INDI1 DIV COPY *ADDRI,A 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 $ JST GSZ 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 PRN EQU $ COPY *TDIOFG(X,Y),A GET DESIRED OUTPUT MEDIA FLAG CLSN ='P',A IS IT LP OUTPUT JMP $+2 JMP PRN11 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 PRN2 COPY *SVWORD,A GET CONTENTS 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 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,A GET DATUM ADDRESS 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 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 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 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 $+2 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 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 JST SINKCK MAKE SURE FILL IS NOT IN DBG AREA COPY A,SVWORD 1ST PARM COPY KEY,A FIL1 COPY A,*SVWORD FILL A WORD 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,A FETCH A WORD 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,A GET MATCH VALUE  JST *THEX(X,Y) AND PRINT IT 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 REGISTER # 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 TITL ****** * * -- RKB -- INPUT CHARACTER *  FROM LOGICAL UNIT 'TV' * 'A' RETURNS WITH READ CHARACTER ****** RKB ENT COPY Y,SAVEY SAVE Y REGISTER CEA INBUF,Y COMPUTE INPUT BUFFER ADDRESS COPY TVLUN,X GET TV LUN COPY BCOUNT,A GET CURRENT BYTE COUNT JEQ A,RKB10 GO IF BUFFER EMPTY * COPY RWMODE,Q GET READ/WRITE MODE JEQ Q,RKB20 IF READ, GET NEXT BYTE COPY A,0(Y) SET PROMPT BYTE COUNT * * THIS IS TEMP UNTIL READ WITH PROMPT WORKS * COPY WRWPFC,Q GET WRITE PROMPT FUNCTION CODE ADD =1,Y Y=OUTBUF JST DOIO WRITE PROMPT SUB =1,Y Y=INBUF * RKB10 EQU $ COPY =INSIZE,A INPUT BUFFER SIZE COPY REFAFC,Q FORMATTED ASCII READ FUNCTION CODE COPY TVLUN,X GET TV LUN JST DOIO A=BCT, Q=FC, X=LUN, Y=BUF COPY =CR,A END OF LINE SBIT 2,S BYTEMODE COPYB A,0(X,Y) PUT CR AT END OF INPUT RBIT 2,S WORDMODE ADD =1,X NEW ACTUAL COUNT COPY X,BCOUNT SET BUFFER COUNT COPY =0,A COPY A,RWMODE SET MODE TO READ COPY A,BINDEX R ESET BUFFER INDEX * RKB20 EQU $ GET NEXT BYTE FROM INPUT BUFFER COPY BINDEX,X GET BUFFER INDEX SBIT 2,S BYTEMODE COPYB 0(X,Y),A GET NEXT BYTE RBIT 2,S WORDMODE IMS BINDEX COPY BCOUNT,Q DECREMENT BCOUNT SUB =1,Q COPY Q,BCOUNT * COPY SAVEY,Y RESTORE Y COPY Y,X RESTORE X RTN RKB * IOB IOB: 'TV',RE: INPUT/OUTPUT BLOCK BINDEX WORD 0 BUFFER INDEX BCOUNT WORD 0 BUFFER BYTE COUNT SAVEY WORD 0 SAVE Y HERE SAVEQ WORD 0 SAVE Q HERE RWMODE WORD 0 MODE, 0=READ, 1=WRITE REFAFC WORD RE:%4++FA:++ER: READ, FORMATTED ASCII WRWPFC WORD WR:%4+WP:+ER: WRITE PROMPT FORMATTED WRFAFC WORD WR:%4++FA:++ER: WRITE, FORMATTED ASCII * TITL ****** * * -- DOIO -- DO THE INPUT OR OUTPUT TO CARTOS * * ENTER: A = REQUESTED BYTE COUNT * Q = FUNCTION CODE * X = LOGICAL UNIT * Y = BUFFER ADDRESS * * EXIT: X = ACTUAL COUNT * A,Q,Y NOT DESTROYED * ****** * DOIO ENT COPY A,IOB+IO:BCT BYTE COUNT COPY Q,IOB+IO:FC FUNCTION CODE COPY X,IOB+IO:LUN LOGICAL UNIT COPY Y,IOB+IO:BUF BUFFER ADDRESS CEA IOB,X COMPUTE ADDRESS OF IOB I:IO 0(X) DO THE I/O ABNORMAL JMP IOERROR IF ERROR COPY IOB+IO:ACT,X RETURN ACTUAL COPY IOB+IO:FC,Q RESTORE Q COPY IOB+IO:BCT,A RESTORE A RTN DOIO * IOERROR EQU $ PROCESS I/O ERROR COPY IOB+IO:ST,A GET I/O COMPLETION STATUS JGT A,RESTART GO IF EOF SUB TIMOERR,A CHECK FOR TIMEOUT JEQ A,RESTART YES, RESTART COPY IOB+IO:ST,Q GET STATUS AGAIN AND CMASK,Q MASK TO CLASS ONLY COPY Q,A SUB TVCLASS,A CHECK FOR TV CLASS JEQ A,RESTART YES, RESTART COPY Q,A SUB LPCLASS,A CHECK FOR LP CLASS JEQ A,RESTART YES, RESTART * * IF ANY OTHER ERROR, GENERATE EXCEPTION * COPY IOB+IO:ST,A GET ERROR STATUS R:UEX ABNORMAL POINT TO ABNORMAL RETURN * RESTART EQU $ RESTART DEBUGC CEA BASE,Y RESTORE Y COPY Y,X RESTORE X COPY =0,A COPY A,BCOUNT CLEAR BYTE COUNT COPY A,BINDEX AND INDEX JMP *TDBG(X,Y) RESTART NEW COMMAND 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 * ***** * * -- TYP -- OUT PUT PRINT CONTROL ROUTINE * 'A' IS DESTROYED AT RETURN * 'Q', 'X', & 'Y' ARE NOT DESTROYED * ****** DBGC:TV EQU $ TVLUN WORD 'TV' DBGC:LP EQU $ LPLUN WORD 'LP' * TYP ENT COPY Q,SAVEQ SAVE Q REG COPY Y,SAVEY SAVE Y REG COPY =1,X SET RWMODE TO WRITE AND EXCH X,RWMODE GET THE OLD MODE JNE X,TYP10 GO IF IT WAS  ALREADY WRITE MODE COPY X,BCOUNT IF IT WAS READ, CLEAR READ BUFFER * TYP10 EQU $ CEA OUTBUF,Y COMPUTE ADDRESS OF OUTPUT BUFFER COPY BCOUNT,X GET CURRENT BYTE COUNT * CLSN A,=CR END OF LINE? JMP TYP40 YES CSK X,=OUTSIZE END OF OUTPUT BUFFER JMP $+2 NOT YET JMP TYP50 YES, TRASH CHARACTER AND EXIT * TYP30 EQU $ STORE BYTE IN BUFFER SBIT 2,S BYTEMODE COPY A,0(X,Y) PUT BYTE RBIT 2,S WORDMODE IMS BCOUNT BUMP BYTE COUNT JMP TYP50 DONE * TYP40 EQU $ WRITE THE BUFFER COPY BCOUNT,A BYTE COUNT COPY WRFAFC,Q WRITE, FORMATTED ASCII FUNCTION CODE * COPYE CMND,X GET COMMAND CLSN X,='L' IF NOT L, S, OR Z COMMAND JMP TYPOPT CLSN X,='S' JMP TYPOPT CLSN X,='Z' JMP TYPOPT JMP TVONLY THEN WRITE TO TV ONLY * TYPOPT EQU $ CHECK OUTPUT OPTIONS COPY DIOFLG,X GET OUTPUT FLAG CLSN X,='T' TV ONLY JMP TVONLY CLSN X,='P' LP ONLY JMP LPONLY * COPY TVLUN,X GET TV LUN JST DOIO WRITE TO TV, A=BCT, Q=FC, X=LUN, Y=BUF * LPONLY EQU $ COPY LPLUN,X GET LP LUN JST DOIO WRITE TO LP, A=BCT, Q=FC, X=LUN, Y=BUF JMP TYP45 * TVONLY EQU $ COPY TVLUN,X GET TV LUN JST DOIO WRITE TO TV, A=BCT, Q=FC, X=LUN, Y=BUF * TYP45 EQU $ COPY =0,A COPY A,BCOUNT CLEAR BYTE COUNT * TYP50 EQU $ EXIT COPY SAVEY,Y RESTORE Y COPY Y,X RESTORE X COPY SAVEQ,Q RESTORE Q RTN TYP * * MASKS FOR I/O ERROR HANDLING * CMASK WORD :FF80 CLASS MASK WORD TIMOERR WORD X:IOTOUT TIME OUT ERROR TVCLASS WORD CMASK:TV+X:ERRORM LPCLASS WORD CMASK:LP+X:ERRORM * TITL DIOFLG WORD 0 OUTPUT OPTION KEEPER 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 ;) ****** INP ENT 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 =',',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 JST CHK 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 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 * 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 GBASE WORD G0-BASE ABS OFFSET OF GENERAL REG FROM BASE ABASE WORD EXIT-BASE TITL ****** * * -- CHKR -- * * CALCULATES INDEX OF THE USER REGISTER * ENTER: *  'A' = REGISTER * EXIT: 'Q' = INDEX * ****** CHKR ENT COPY A,CHKG SAVE 'A'=REG NAME ADD CHARAD,X 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 CLSN =CTABLN,Q   EVER FOUND? JMP CHKRER JMP CHKR1 LOOP CHKR2 EQU $ COPY Y,X REFERESH 'X' 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' CTABLN EQU $-CTABL 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 COPY *ZP0,A GET A LINKED WORD 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 B EGINING ADD ZP2,A + LINK OFFSET COPY A,X 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 ZERROR JMP *TERROR(X,Y)  # OF WORDS < 1 TITL * * INPUT AND OUTPUT BUFFERS * INBUF RES 1 INPUT BUFFER OUTBUF RES 40 OUTPUT BUFFER INSIZE EQU $-INBUF-1*2 OUTSIZE EQU $-OUTBUF*2 TAIL END 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  DEBUGC.JCL 84-94400-70 A100 JCL TO CREATE DEBUGC.OBJ USE RENAME TO CREATE DEBUGC.LBR //CO BK=DEBUGC.ASM MACRO DEBUGC(L=) 820422181653820422181653820422181653JDBGC:TV DBGC:LP DEBUGC O0SEGMENTBLANK DEBUG: o EMG: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  Â}R HL=eR VnRST m }!Q T ( :˽ - : ) mDEBUGC - REV. A100  /0e'湦Ƶp P'` n «⫂p P0/s Ͻ D E B U G C A 0 0 2  bu#u"u!u uuuuuuuuuuuuuuuuuuu u u u u uuuuuuuuu  ςzϾ P AE QB X? Y<н; K5 L2 S/֟S  =ϟ{ ϟ|"  *Ͻ z Y Q  A GνԆ R Ɲƚ›LBLC LFLLLSLJLILG LRLZ؝ ÞA Ά}Άw v Ln T P B P d# |QE[ , , `ↂџ ?Ͻ͞B ` J B YK QJf ڞ҂ cޡ @ޟ ޝ `@E ;۽RA@E N@Aޏǎ Qފ ,^:I & |d D ` ឞs]*Q h ЀcЀ ā^ @AĄ܃X B `Á D *P_U7 `5*3 - +r }"B ƽֽ̓ҽǁOG ÙE6'E / X  ͽ֞]w Ṕچ @ՃֽҁBǢ , ž[ + - * X / KJƎڞ^ڞ[ { xނZ ,| ҽL ʁ P ́چ߽ڽֽ޺ {  ҽ͞q  kȆǂGާ}ަ yޠ}y E ~   .σ E ~  .ޢރfN  ,҆t@F C lqLL ( w{u _|JQB[y L S T͞O N  Js߁ھ_ ]]| IƎ> , Ƈ ,ƂpI ưk , ,Htr Hm - -چ('\\ F -t͂Ճ x ’@"Fz@ Ό F ߝ l; #߁چ.bƝ ޙޖJQ!’ ފދJQ %ς u U ςP x q on "l IjM K b&_& [[ `ZKL$kT  N =ςMM GςJ   :Ϟ ϟL gm G¬QR@«kj P¥羦 %'+ %'ސJƎ `Z TV @@@ p njn'6hdd qeNLa@G@DY> g ` US {  y9u     :wgTVg LP 75)510g-  -P%'$"'' ,L,S,Z,T,P YXT ` O  Iyyyx R G , ; + - * / X_1]\I W` RRR -@A@K J@ JH +O -M * / X?  `Y B `R-Ά, , +& N} I +KL v `p `PAQXYKLSD C Z A 9 0n C F =  t ,Ɲ ,ƙǽ•چ ޏJQ ` T͝ B,Z,T,P YXT ` O  Iyyyx R G , ; + - * / X_1]\I W` RRR -@A@K J@ JH +O -M * / X?1PAGE 0001 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:50:34.25 SI = DH00.DEBUGC.ASM SO = DH00.DEBUGC.OBJ LO = DH00.DEBUGC.LST 0002 * 0003 * INCLUDE USERCOMMON.MAC  0004 * INCLUDE IOB.MAC 0005 * INCLUDE X:COMMON.MAC 0006 * INCLUDE X:IOERR.MAC  0007 * 18C3 18C7 0008 OLDOPS OPTIONS +4 1PAGE 0002 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:50:52.50 . SI = DH00.DEBUGC.ASM SO = DH00.DEBUGC.OBJ LO = DH00.DEBUGC.LST 0015 * CARTOS ENVIRONMENT DEBUG 0016 * 0017 * THIS DEBUG IS USED IN A PROTECTED CARTOS  0018 * ENVRIONMENT. THIS DEBUG USES STANDARD CARTOS 0019 * I/O CALLS (I:IO) WITH LOGICAL UNITS TV (CRT) 0020 * AND LP (LINE PRINTER). DEBUGC DOES NOT USE 0021 * ANY PRIVILEGED INSTRUCTIONS (I/O, ETC.) AND 0022 * DOES NOT DISABLE INTERRUPTS FOR EXTENDED PERIODS 0023 * OF TIME  0024 * 0025 * REVISION HISTORY 0026 * 0027 * A000 - ORIGINAL CONVERSION FROM DEBUG4 0028 * USES SINGLE CHARACTER UNFORMATTED I/O. 0029 *  0030 * A001 - CONVERTED TO USE BUFFERED FORMATTED I/O. 0031 * 0032 * A100 - NOW GENER ATES CR LF BEFORE PRINTING TITLE. 0033 * ANY I/O ERROR OTHER THAT EOF, TIMEOUT, TV CLASS ERRORS  0034 * OR LP CLASS ERRORS ARE GENERATED AS EXCEPTIONS. 0035 * 15/JAN/82 ACS.  0036 * 0037 *************************** 0038 * 0004 0100 0039 MACHINE :100 4/95 (FOR CEA'S) 0000 0040 NAM DEBUGC 0421 0041 NAM DBGC:LP 0420 0042 NAM DBGC:TV 0043 NOTEMAC MACRO 0044 OBJNOTE 'DEBUGC - REV. A100' 0045 ENDM 0046 SEXT G:0,G:1,G:2,G:3,G:4,G:5 0047 SEXT G:6,G:7,G:8,G:9,G:A,G:B 0048 SEXT G:C,G:D,G:E,G:F,G:G,G:H 0049 SEXT G:I,G:J,G:K,G:L,G:M,G:N 0050 SEXT G:O,G:P,G:Q,G:R,G:S,G:T 1PAGE 0003 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:50:53.25 .  0051 SEXT G:U,G:V,G:W,G:X,G:Y,G:Z 0052 MACRO RTN 0053 JMP *#1 0054 ENDM 0055 * 41303032 0056 REV: EQU 'A002'  0000002A 0057 PROMCH EQU '*' PROM CHARACTER 00000007 0058 BELL EQU :7 BELL CHAR 0000000D 0059 CR EQU :D CARRIAGE RETURN 00000020 0060 BLANK EQU :20 BLANK CHAR 00000028 0061 LLNTH EQU 40 PERMISSIBLE LENGTH FOR LIST 00000000 0062 BRKPT EQU 0 BREAK POINT RETURN ADDRESS 1PAGE 0004 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:50:53.75 . 0064 SHARABLE DEBUG: 8000 0065 SYSTEM 0000 0002 0066 DEBUG: REL 0000 9EAA 002B 0067 DEBUGC JMP DEBUGC2 0001 0E0D 0068 RTN ENT BREAKPOINT RETURN ENTRY 0002 BEC3 0046 0069 JST SAVE PRESERVE REGISTERS 0003 827D 0001 0070  COPY RTN,A SAVE RETURN ADDRESS 0004 078D 0071 JMPE RTNB PROCESS RETURN FROM BREAKPOINT 0005 01A9 01AF 0072 ****** 0073 * 0074 * -- SUB-ROUTINE AND WORD CELL OFFSET FROM BASE PROGRAM -- 0075 * 0076 * SUB-ROUTINES 0077 *  00000006 0078 BASE EQU $ 0079 * 00000000 0080 TDBG EQU $-BASE 0006 00E0  0081 WORD DBG-BASE DBG ABSOLUTE OFFSET FROM BASE PROG 00000001 0082 TERROR EQU $-BASE 0007 0152 0083 WORD ERROR-BASE ERROR ABSOLUTE OFFSET FROM BASE PROG 00000002 0084 TRTN6 EQU  $-BASE 0008 01D9 0085 WORD RTN6-BASE 00000003 0086 TDMPRS EQU $-BASE 0009 00AA 0087 WORD DMPRS-BASE DMPRS ABSOLUTE OFFSET FROM BASE PROG 00000004 0088 TRREG EQU $-BASE 000A  01E7 0089 WORD RREG-BASE RREG ABSOLUTE OFFSET FROM BASE PROG 00000005 0090 TGREG EQU $-BASE 000B 0217 0091 WORD GREG-BASE GREG ABSOLUTE OFFSET FROM BASE PROG 00000006 0092 TINSP EQU $-BASE 000C 0219 0093 WORD INSP-BASE INSP ABSOLUTE OFFSET FROM BASE PROG 00000007  0094 TCOMMA EQU $-BASE 000D 0248 0095 WORD COMMA-BASE COMMA ABSOLUTE OFFSET FROM BASE PROG  00000008 0096 TSPACE EQU $-BASE 000E 00DC 0097 WORD SPACE-BASE SPACE ABSOLUTE OFFSET FROM BASE PROG 00000009 0098 TLIST EQU $-BASE 1PAGE 0005 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:50:54.50 . 000F 024C 0099 WORD LIST-BASE LIST ABSOLUTE OFFSET FROM BASE PROG 0000000A 0100 TFILLP EQU $-BASE 0010 02D7 0101 WORD FILLP-BASE FILLP ABSOLUTE OFFSET FROM BASE PROG 0000000B 0102 TSRCH EQU $-BASE 0011 02F3 0103 WORD SRCH-BASE SRCH ABSOLUTE OFFSET FROM BASE PROG 0000000C 0104 TCOPYP EQU $-BASE 0012 033D 0105 WORD COPYP-BASE COPYP ABSOLUTE OFFSET FROM BASE PROG 0000000D 0106 TCRLF EQU $-BASE 0013 0365 0107 WORD  CRLF-BASE CRLF ABSOLUTE OFFSET FROM BASE PROG 0000000E 0108 TRKB EQU $-BASE 0014 03A2 0109  WORD RKB-BASE RKB ABSOLUTE OFFSET FROM BASE PROG 0000000F 0110 TTYP EQU $-BASE 0015 041C  0111 WORD TYP-BASE TYP ABSOLUTE OFFSET FROM BASE PROG 00000010 0112 THEX EQU $-BASE 0016 0405 0113 WORD HEX-BASE HEX ABSOLUTE OFFSET FROM BASE PROG 00000011 0114 TUNSAV EQU $-BASE 0017 0052 0115 WORD UNSAVE-BASE UNSAVE ABSOLUTE OFFSET FROM BASE PROG 00000012 0116 TINP EQU $-BASE 0018 0456 0117 WORD INP-BASE INP ABSOLUTE OFFSET FROM BASE PROG 00000013 0118 TCHKR EQU $-BASE 0019 04B3 0119 WORD CHKR-BASE CHKR ABSOLUTE OFFSET FROM BASE PROG 00000014 0120 TCHKG EQU $-BASE 001A 04D0 0121 WORD CHKG-BASE CHKG ABSOLUTE OFFSET FROM BASE PROG 00000015 0122 TPADDR EQU $-BASE 001B 036E 0123 WORD PADDR-BASE 00000016 0124 TSHEX EQU $-BASE 001C 0400 0125 WORD SHEX-BASE 00000017 0126 TETEST EQU  $-BASE 001D 02BC 0127 WORD ETEST-BASE 00000018 0128 TZTRNG EQU $-BASE 001E 04EE 0129 WORD ZTRING-BASE Z ABSOLUTE OFFSET FROM BASE PROG 0130 * 0131 * WORD CELLS 0132 * 00000019 0133 TPFLG EQU $-BASE 001F 0190 0134 WORD PFLG-BASE PFLG ABSOLUTE OFFSET FROM BASE PROG 1PAGE 0006 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:50:55.50 . 0000001A 0135 TADDR EQU $-BASE 0020 011F 0136 WORD ADDR-BASE   ADDR ABSOLUTE OFFSET FROM BASE PROG 0000001B 0137 TVALU EQU $-BASE 0021 0452 0138 WORD VALU-BASE VALU ABSOLUTE OFFSET FROM BASE PROG 0000001C 0139 TLASTS EQU $-BASE 0022 0453 0140  WORD LASTSN-BASE LASTSN ABSOLUTE OFFSET FROM BASE PROG 0000001D 0141 TTEST EQU $-BASE 0023 0454  0142 WORD TEST-BASE TEST ABSOLUTE OFFSET FROM BASE PROG 0000001E 0143 TWSIZE EQU $-BASE 0024 029D 0144 WORD WSIZE-BASE WSIZE ABSOLUTE OFFSET FROM BASE PROG 0000001F 0145 TSTORE EQU  $-BASE 0025 036D 0146 WORD STORE-BASE STORE ABSOLUTE OFFSET FROM BASE PROG 00000020 0147 TSIZE EQU $-BASE 0026 0120 0148 WORD SIZE-BASE SIZE ABSOLUTE OFFSET FROM BASE PROG 00000021 0149 TKIND EQU $-BASE 0027 00A9 0150 WORD KIND-BASE KIND ABSOLUTE OFFSET FROM BASE PROG 00000022 0151 TEXIT EQU $-BASE 0028 007D 0152 WORD EXIT-BASE EXIT ABSOLUTE OFFSET FROM BASE PROG 00000023 0153 TCMND EQU $-BASE 0029 0121 0154 WORD CMND-BASE 00000024 0155 TDIOFG EQU $-BASE 002A 0451 0156 WORD DIOFLG-BASE 'T' OR 'P' OR 'B' FLAG KEEPER 1PAGE 0007 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:50:56.25 . 0158 ******** 0159 * 0160 * -- DEBUGC2 -- 0161 * 0162 ******** 0163 * 0000002B 0164 DEBUGC2 EQU $ 002B BE9A 0046 0165 JST SAVE SAVE USER ENVIORMENT 002C 0954 0166 COPY ='T',A 002D 85E4 0024 0167 COPY A,*TDIOFG(X,Y) FLAG TO PRINT ON TTY/CRT 002E BEB6 0065 0168 JST HDNG1 002F 0928 0169 COPY ='(',A ( 0030 BDCF 000F 0170 JST *TTYP(X,Y) 0031 093A 0171 COPY =':',A : 0032 BDCF 000F 0172  JST *TTYP(X,Y) 0033 0784 0173 CEA DEBUGC,A 0034 FFCB 0000 0035 BDD0 0010 0174 JST *THEX(X,Y) CONVERT 'A' INTO 4 HEX DIGITS 0036 092D 0175 COPY ='-',A - 0037 BDCF 000F 0176 JST *TTYP(X,Y) 0038 093A 0177 COPY =':',A : 0039 BDCF 000F 0178 JST  *TTYP(X,Y) 003A 0784 0179 CEA TAIL,A END ADDRESS 003B 0506 0542 003C 0AFF 0180 SUB =1,A 003D BDD0 0010 0181 JST *THEX(X,Y) 003E 0929 0182 COPY =')',A ) 003F BDCF 000F 0183 JST *TTYP(X,Y) PRINT ) 0040 0907 0184 COPY =BELL,A 0041 BDCF 000F 0185  JST *TTYP(X,Y) RING BELL 0042 0784 0186 CEA DEBUGC,A 0043 FFBC 0000 0044 85E2 0022 0187 COPY A,*TEXIT(X,Y) INITIALIZE EXIT 0045 9DC2 0002 0188 JMP *TRTN6(X,Y) CLEAR ANY BREAK POINTS 0030 NOTEMAC 1PAGE 0008 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04 /22 14:50:57.00 . 0191 ****** 0192 * 0193 * -- SAVE --  0194 * - ALL THE USER HARDWARE REGISTERS, CONSOLE WORD REGISTER AND 0195 * CONSOLE SENSE SWITCH ARE SAVED IN TEMPORARY REGISTERS. 0196 * - ALL THE BITS IN 'S' ARE SET TO ZERO EXCEPT 'XA' BIT, WHICH  0197 * IS NOT ALTERED 0198 * 0199 ****** 0046 0E0D 0200 SAVE ENT EXIT ADDRESS SAVED 0047 0E2F 0201 SIN 3 UNTIL BYTE MODE IS CLEARED 0048 86BB 0084 0202 COPY A,AR 0049 0030 0203 COPY S,A GET S REGISTER 004A 86BF 008A  0204 COPY A,SR AND SAVE IT 004B 0E65 0205 SBIT 6,S XA ON 004C 0E27  0206 RBIT 2,S BYTE MODE OFF 004D E6B9 0087 0207 COPY Y,YR 004E A6B7 0086 0208  COPY X,XR 004F C6B5 0085 0209 COPY Q,QR 0050 0070 0210 COPY K,A 0051 86B6 0088 0211 COPY A,KR 0052 0050 0212 COPY L,A 0053 86B5 0089 0213 COPY A,LR 0054 2784  0214 CEA BASE,X 0055 FFB0 0006 0056 6020 0215 COPY X,Y X + Y HAVE BASE PROG ADDRESS 0057 9F6E 0046 0216 RTN SAVE BACK TO CALLER 1PAGE 0009 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:50:57.75 . 0218 ****** 0219 *  0220 * -- UNSAVE -- 0221 * RESTORE ALL USER HARDWARE REGISTERS 0222 *  0223 ****** 0058 0E0D 0224 UNSAVE ENT 0059 C2AB 0085 0225 COPY QR,Q RESTORE 'Q' 005A A2AB 0086 0226 COPY XR,X 'X' 005B E2AB 0087 0227 COPY YR,Y 'Y' 005C 82AB 0088 0228 COPY KR,A 005D 7000 0229 COPY A,K RESTORE 'K' 005E 82AA 0089 0230  COPY LR,A 005F 5000 0231 COPY A,L 'L' 0060 82A9 008A 0232 COPY SR,A 0061 3000 0233 COPY A,S 'S' 0062 0E2F 0234 SIN 3 0063 82A0 0084 0235 COPY AR,A 0064 9F73 0058 0236 RTN UNSAVE RETURN TO CALLER 1PAGE 0010 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:50:58.00 . 0065 0E0D 0238 HDNG1 ENT 0066 BDCD 000D 0239  JST *TCRLF(X,Y) NEW LINE 0067 0920 0240 COPY =' ',A 0068 BDCF 000F 0241 JST *TTYP(X,Y) 0069 BDCD 000D 0242 JST *TCRLF(X,Y) NEW LINE 006A 0944 0243 COPY ='D',A  D 006B BDCF 000F 0244 JST *TTYP(X,Y) 006C 0945 0245 COPY ='E',A E 006D BDCF 000F  0246 JST *TTYP(X,Y) 006E 0942 0247 COPY ='B',A B 006F BDCF 000F 0248 JST *TTYP(X,Y) 0070 0955 0249 COPY ='U',A U 0071 BDCF 000F 0250 JST *TTYP(X,Y) 0 072 0947 0251 COPY ='G',A G 0073 BDCF 000F 0252 JST *TTYP(X,Y) 0074 0943 0253 COPY ='C',A C 0075 BDCF 000F 0254 JST *TTYP(X,Y) 0076 0920 0255 COPY  =BLANK,A 0077 BDCF 000F 0256 JST *TTYP(X,Y) 0078 0941 0257 COPY =REV:%-24,A 0079 BDCF 000F 0258 JST *TTYP(X,Y) 007A 0930 0259 COPY =REV:%-16&:FF,A 007B BDCF 000F 0260 JST *TTYP(X,Y) 007C 0930 0261 COPY =REV:%-8&:FF,A 007D BDCF 000F 0262 JST *TTYP(X,Y)  007E 0932 0263 COPY =REV:&:FF,A 007F BDCF 000F 0264 JST *TTYP(X,Y) 0080 0920 0265  COPY =BLANK,A 0081 BDCF 000F 0266 JST *TTYP(X,Y) 0082 9F62 0065 0267 RTN HDNG1 1PAGE 0011 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:50:58.75 . 0269  * WORD CELLS 0270 * 0083 0000 0271 EXIT WORD 0 TEMPORARY SAVE 'P' 0084 0000 0272 AR WORD 0 TEMPORARY SAVE 'A' 0085 0000 0273 QR WORD 0 TEMPORARY SAVE 'Q' 0086 0000 0274 XR WORD 0 TEMPORARY SAVE 'X' 0087 0000 0275 YR WORD 0  TEMPORARY SAVE 'Y' 0088 0000 0276 KR WORD 0 TEMPORARY SAVE 'K' 0089 0000 0277 LR WORD 0 TEMPORARY SAVE 'L' 008A 0000 0278 SR WORD 0 TEMPORARY SAVE 'S'  0279 * 0280 * GENERAL REGISTERS 0 - 9, A - Z 0281 * 0000008B 0282 G0 EQU $ START OF GENERAL REGISTER AREA 008B 0023 0283 WORD G:0,G:1,G:2,G:3,G:4,G:5 008C 0022 008D 0021 008E 0020 008F 001F 0090 001E 0091 001D 0284 WORD G:6,G:7,G:8,G:9,G:A,G:B 0092 001C 0093 001B 0094 001A 0095 0019 0096 0018 0097 0017 0285 WORD G:C,G:D,G:E,G:F,G:G,G:H 0098 0016 0099 0015 009A 0014 009B 0013 009C 0012 009D 0011 0286 WORD G:I,G:J,G:K,G:L,G:M,G:N 009E 0010 009F 000F 00A0 000E 1PAGE 0012 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:50:59.50 . 00A1 000D 00A2 000C 00A3 000B 0287 WORD G:O,G:P,G:Q,G:R,G:S,G:T 00A4 000A 00A5 0009 00A6 0008 00A7 0007 00A8 0006 00A9 0005 0288 WORD G:U,G:V,G:W,G:X,G:Y,G:Z 00AA 0004 00AB 0003 00AC 0002 00AD 0001 00AE 0000 1PAGE 0013 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:50:59.75 . 00AF 0000 0290  KIND WORD 0 TYPE OF REGISTER DUMP 0291 ****** 0292 * 0293 * -- DMPRS -- DUMP REGISTERS 0294 * 0295 ****** 00B0 0E0D 0296 DMPRS ENT 00B1 BDCD 000D 0297 JST *TCRLF(X,Y) NEW LINE 00B2 0907 0298 COPY =BELL,A ISSUE BELL CODE 00B3 BDCF 000F 0299 JST *TTYP(X,Y) 00B4 827A 00AF 0300 COPY KIND,A FETCH TYPE O F REGISTER DUMP 00B5 BDCF 000F 0301 JST *TTYP(X,Y) 00B6 BEAB 00E2 0302 JST SPACE PRINT A BLANK 00B7 BEAA 00E2 0303 JST SPACE PRINT A BLANK 00B8 0950 0304 COPY ='P',A  'P' REGISTER 00B9 BEA3 00DD 0305 JST TYP:EQ ISSUE P = 00BA 81E2 0022 0306 COPY *TEXIT(X,Y),A FETCH ADDRESS 00BB BDD5 0015 0307 JST *TPADDR(X,Y) 00BC 0941 0308 COPY ='A',A 00BD BE9F 00DD 0309 JST TYP:EQ ISSUE A= 00BE 8245 0084 0310 COPY AR,A 'A' VALUE 00BF BDD6 0016 0311 JST *TSHEX(X,Y) DO HEX ROUTINE FOLLOWED BY A SPACE 00C0 0951 0312 COPY  ='Q',A 00C1 BE9B 00DD 0313 JST TYP:EQ ISSUE Q= 00C2 8242 0085 0314 COPY QR,A 00C3 BDD6 0016 0315 JST *TSHEX(X,Y) DO HEX ROUTINE FOLLOWED BY A SPACE 00C4 0958 0316 COPY ='X',A 00C5 BE97 00DD 0317 JST TYP:EQ ISSUE X= 00C6 823F 0086 0318 COPY XR,A 00C7 BDD6 0016 0319 JST *TSHEX(X,Y) DO HEX ROUTINE FOLLOWED BY A SPACE 00C8 0959 0320 COPY ='Y',A 00C9 BE93 00DD 0321 JST TYP:EQ ISSUE Y= 00CA 823C 0087 0322 COPY YR,A 00CB BDD0 0010 0323  JST *THEX(X,Y) PRINT 'Y' 00CC BDCD 000D 0324 JST *TCRLF(X,Y) 00CD BE94 00E2 0325 JST SPACE PRINT A BLANK 1PAGE 0014 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:00.50 . 00CE BE93 00E2 0326 JST SPACE PRINT A BLANK 00CF BE92 00E2 0327 JST SPACE PRINT A BLANK 00D0 094B 0328 COPY ='K',A 00D1 BE8B 00DD 0329 JST TYP:EQ ISSUE K= 00D2 8235 0088 0330 COPY KR,A 00D3 BDD6 0016 0331 JST *TSHEX(X,Y) DO HEX ROUTINE FOLLOWED BY A SPACE 00D4 094C 0332 COPY ='L',A 00D5 BE87 00DD 0333 JST TYP:EQ ISSUE L=  00D6 8232 0089 0334 COPY LR,A 00D7 BDD6 0016 0335 JST *TSHEX(X,Y) DO HEX ROUTINE FOLLOWED BY A SPACE 00D8 0953 0336 COPY ='S',A 00D9 BE83 00DD 0337 JST TYP:EQ ISSUE S= 00DA 822F 008A 0338 COPY SR,A 00DB BDD6 0016 0339 JST *TSHEX(X,Y) DO HEX ROUTINE FOLLOWED BY A SPACE  00DC 9F53 00B0 0340 RTN DMPRS BACK TO CALLER 1PAGE 0015 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:01.00 . 0342 ****** 0343 * 0344 * -- TYP:EQ -- 0345 * PUBLISH CONTENTS OF 'A' REGISTER FOLLOWED BY '=' 0346 *  0347 ****** 00DD 0E0D 0348 TYP:EQ ENT 00DE BDCF 000F 0349 JST *TTYP(X,Y) PUBLISH CHARACTER FROM 'A' 00DF 093D 0350 COPY ='=',A EQUAL SIGN 00E0 BDCF 000F 0351 JST *TTYP(X,Y) PUBLISH EQUAL SIGN 00E1 9F7B 00DD 0352 RTN TYP:EQ BACK TO CALLER 0353 *******   0354 * 0355 * -- SPACE -- 0356 * 0357 ******* 00E2 0E0D 0358 SPACE ENT 00E3 0920 0359 COPY =BLANK,A 00E4 BDCF 000F 0360 JST *TTYP(X,Y) 00E5 9F7C 00E2 0361 RTN SPACE 1PAGE 0016 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:01.50 . 0363 ****** 0364 * -- DBG -- 0365 *  EXIT: ADDR -- 1ST PARAMETER 0366 * SIZE -- INDEX TO G OR R REGISTER 0367 *  KEY -- COMMAND ID 0368 * TEST -- TERMINATOR 0369 * LASTSN -- LAST SPECIAL TERMINATOR 0370 ****** 000000E6 0371 DBG EQU $ 00E6 82C1 0128 0372  COPY TRNT,A 00E7 0022 0373 ADD X,A BREAK POINT RETURN ADDRESS 00E8 8400 0000 0374  COPY A,BRKPT STUFF IT AT '0' 00E9 0900 0375 COPY =0,A 00EA 86BC 0127 0376 COPY A,CMND INITIALIZE COMMAND KEEPER 00EB BDCD 000D 0377 DBG3 JST *TCRLF(X,Y) NEW LINE 00EC 092A 0378 COPY =PROMCH,A GET PROM CHARACTER 00ED BDCF 000F 0379 JST *TTYP(X,Y) 00EE BDCE 000E 0380 JST *TRKB(X,Y) READ COMMAND ID 00EF 0C0D 0381 CLSN A,=CR NULL LINE? 00F0 9E7A 00EB 0382 JMP DBG3 YES 00F1 86B5 0127 0383 COPY A,CMND SAVE FUNCTION ID 00F2 0C59 0384 CLSN ='Y',A IS IT SINGLE STEP ? 00F3 9E99 010D 0385 JMP NEXT YES, PROCESS IT 00F4 0C51 0386 CLSN ='Q',A IS IT STEP BACK ? 00F5 9E97 010D 0387 JMP NEXT YES, DO IT 00F6 0C20 0388 CLSN =BLANK,A BLANK=COMMENT MODE 00F7 9ECB 0143 0389 JMP COM DO COMMENT 00F8 0C41 0390 CLSN ='A',A DEVICE ASSIGNMENT? 00F9 9EB0 012A 0391 JMP DEVICE 00FA 0C47 0392 CLSN ='G',A GENERAL REGISTER 00FB 9E81 00FD 0393  JMP $+2 YES,GO CALCULATE REGISTER INDEX 00FC 9E84 0101 0394 JMP DBGR ELSE CHECK IF HARDWARE REGISTER 00FD BDCE 000E 0395 JST *TRKB(X,Y) READ ANOTHER CHARACTER. G-REG NO. 00FE BDD4 0014 0396  JST *TCHKG(X,Y) DEVELOP INDEX TO G-REG 00FF 86A6 0126 0397 COPY A,SIZE SAVE INDEX IN 'SIZE' 0100 9E88 0109 0398 JMP DBG1 1PAGE 0017 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100)  1982/04/22 14:51:02.50 . 0101 0C52 0399 DBGR CLSN ='R',A IS IT HARDWARE REGISTER? 0102 9E81 0104 0400 JMP $+2 YES, GO DEVELOP INDEX 0103 9E85 0109 0401 JMP DBG1 CHECK FOR OTHER COMMANDS 0104 BDCE 000E 0402 JST *TRKB(X,Y) READ R-REG NO 0105 0C0D 0403 CLSN =CR,A  JUST R COMMAND? 0106 9E9A 0121 0404 JMP ALLR YES, GO DUMP ALL R-REGISTERS 0107 BDD3 0013 0405  JST *TCHKR(X,Y) GET R-REG INDEX 0108 C69D 0126 0406 COPY Q,SIZE SAVE INDEX TO R-REG 0109 BDD2 0012 0407 DBG1 JST *TINP(X,Y) GET 1ST PARAMETER 010A C69A 0125 0408 COPY Q,ADDR SAVE 1ST PARAMETER 010B C29B 0127 0409 COPY CMND,Q GET FUNCTION ID COMMAND 010C 4C42 0410 CLSN ='B',Q 010D 9ED1 015F 0411 NEXT JMP BRK BREAK-POINT B 010E 4C43 0412 CLSN  ='C',Q 010F 9DCC 000C 0413 JMP *TCOPYP(X,Y) COPY C 0110 4C46 0414 CLSN ='F',Q  0111 9DCA 000A 0415 JMP *TFILLP(X,Y) FILL F 0112 4C4C 0416 CLSN ='L',Q 0113 9DC9 0009 0417 JMP *TLIST(X,Y) LIST L 0114 4C53 0418 CLSN ='S',Q 0115 9DCB 000B  0419 JMP *TSRCH(X,Y) SEARCH S 0116 4C4A 0420 CLSN ='J',Q 0117 9EAF 0147 0421  JMP JMPP JUMP J 0118 4C49 0422 CLSN ='I',Q 0119 9DC6 0006 0423 JMP *TINSP(X,Y) INSPECT I 011A 4C47 0424 CLSN ='G',Q 011B 9DC5 0005 0425 JMP  *TGREG(X,Y) G-REG G 011C 4C52 0426 CLSN ='R',Q 011D 9DC4 0004 0427 JMP *TRREG(X,Y) R-REG R 011E 4C5A 0428 CLSN ='Z',Q 011F 9DD8 0018 0429 JMP *TZTRNG(X,Y) CHAN Z 0120 9DC1 0001 0430 JMP *TERROR(X,Y) ELSE ERROR 0121 0920 0431 ALLR COPY =BLANK,A 0122 85E1 0021 0432 COPY A,*TKIND(X,Y) 0123 BDC3 0003 0433 JST *TDMPRS(X,Y) DO REGISTER DUMP 0124 9E41 00E6 0434 JMP DBG BACK TO DBG 1PAGE 0018 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:03.50 . 0125 0000 0435 ADDR WORD 0 1ST PARM KEEPER 0126 0000 0436 SIZE WORD 0 G + R REGISTER INDEX KEEPER 0127 0000 0437 CMND WORD 0  COMMAND ID KEEPER 0128 FFFB 0438 TRNT WORD RTN-BASE RETURN ADDRESS OFFSET FROM BASE 1PAGE 0019 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:03.75 . 0440 ******  0441 * 0442 * -- A -- DEVICE ASSIGNMENT COMMAND 0443 * 0444 * ALX X = T(TTY), P(PRINTER), B(BOTH) -- LIST OUTPUT DEVICE 0445 * APX X = T(TTY), H(HSPT) -- PUNCH OUTPUT DEVICE 0446 * 0447 ****** 0129 0000 0448 SAVE2 WORD 0  0449 * 0000012A 0450 DEVICE EQU $ 012A BDCE 000E 0451 JST *TRKB(X,Y) READ 2ND CHAR 012B 867D 0129 0452 COPY A,SAVE2 SAVE IT 012C BDCE 000E 0453 JST *TRKB(X,Y) READ 3RD CHAR 012D 8677 0125 0454 COPY A,ADDR SAVE 3RD PARMT/P/B 012E BDCE 000E 0455 JST *TRKB(X,Y)  READ CR 012F 0C0D 0456 CLSN =CR,A 0130 9E81 0132 0457 JMP $+2 0131 9DC1 0001 0458   JMP *TERROR(X,Y) NO CR ERROR 0132 8276 0129 0459 COPY SAVE2,A GET 2ND PARM P/L 0133 0C4C  0460 CLSN ='L',A LIST OPTION 0134 9E81 0136 0461 JMP $+2 0135 9DC1 0001 0462  JMP *TERROR(X,Y) ERROR IF NOT 'L' 0136 826E 0125 0463 COPY ADDR,A GET 3RD PARM T/P/B 0137 0C54  0464 CLSN ='T',A TTY/CRT OPTION? 0138 9E87 0140 0465 JMP DEV2 0139 0C50 0466  CLSN ='P',A PRINTER OPTION? 013A 9E83 013E 0467 JMP DEV1 013B 0C42 0468 CLSN ='B',A BOTH DESIRED? 013C 9E81 013E 0469 JMP DEV1 013D 9DC1 0001 0470 JMP *TERROR(X,Y) ERROR IF NOT T/P/B 0000013E 0471 DEV1 EQU $ 013E 0950 0472 COPY ='P',A 013F 85E4 0024 0473 COPY A,*TDIOFG(X,Y) 0140 8264 0125 0474 DEV2 COPY ADDR,A 0141 85E4 0024 0475 COPY A,*TDIOFG(X,Y) SAVE OUTPUT DEVICE DESIRED 1PAGE 0020 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:04.50 . 0142 9E23 00E6 0476 JMP DBG BACK TO ACCEPT COMMAND 1PAGE 0021 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:04.50 . 0478 * -- COM --  0479 * COMMENT MODE 0143 BDCE 000E 0480 COM JST *TRKB(X,Y) FETCH A CHARACTER 0144 0C0D  0481 CLSN =CR,A END OF COMMENT? 0145 9DC0 0000 0482 JMP *TDBG(X,Y) YES, BACK TO DBG 0146 9E7C 0143 0483 JMP COM CONTINUE COMMENT MODE 0484 ****** 0485 * 0486 * -- J COMMAND -- JUMP FUNCTION 0487 * 00000147 0488 JMPP EQU  $ 0147 C1D9 0019 0489 COPY *TPFLG(X,Y),Q ANY INPUT 0148 5145 014E 0490 JEQ Q,JMPP1 IF NO EXIT INPUT USE OLD ONE 0149 825B 0125 0491 COPY ADDR,A GET 1ST PARM - JUMP LOCATION 014A 85E2 0022 0492 COPY A,*TEXIT(X,Y) USER RETURN ADD 014B 81DD 001D 0493 COPY *TTEST(X,Y),A GET LAST CHARACTER  014C 0C2C 0494 CLSN =',',A MORE PARAMETERS? 014D 9E91 015F 0495 JMP BRK YES, GO DO BREAK POINT 0000014E 0496 JMPP1 EQU $ 014E 81DD 001D 0497 COPY *TTEST(X,Y),A GET LAST TERMINATOR 014F 0C2C 0498 CLSN =',',A PARM MUST NOT ENT WITH COMMA 0150 9E87 0158 0499 JMP ERROR 0151 BDCD 000D 0500 JST *TCRLF(X,Y) NEW LINE 0501 * ITERATION COUNT BP EXITS THROUGH HERE / 00000152 0502 JMPP2 EQU $ / 0152 2060 0503 COPY Y,X REFRESH 'X' WITH BASE ADR / 0153 81E2 0022 0504 COPY *TEXIT(X,Y),A GET RETURN ADD 0154 8682 0157 0505 COPY A,INLINE 0155 BDD1 0011 0506 JST *TUNSAV(X,Y) RE-STORE USER ENVIORMENT 0156 9F80 0157 0507 JMP *INLINE GO TO USER PROGRAM 0157 0000 0508 INLINE WORD 0 EXI T ADD KEEPER (IN LINE 'P') 0509 ****** 0510 * -- ERROR -- 0511 * ERROR FORMAT 00000158 0512 ERROR EQU $ 0158 0920 0513 COPY =BLANK,A 1PAGE 0022 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:05.50 . 0159 BDCF 000F 0514 JST *TTYP(X,Y) 015A 093F 0515 COPY ='?',A 015B BDCF 000F 0516 JST *TTYP(X,Y) 015C BDCD 000D 0517 JST *TCRLF(X,Y) 015D 9EA5 0183 0518 JMP RTN6X GO FIX BREAK POINTS 015E 9E42 0121 0519 ALLRX JMP ALLR OUT OF RANGE LINK 1PAGE 0023 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:05.75 . 0521 ****** 0522 * 0523 * -- BRK -- BREAK POINT COMMAND 0524 * 0525 * FORMAT OF COMMAND IS : 0526 *  BAAAA[;CCCC][,AAAA][;CCCC][,AAAA][;CCCC][,AAAA][;CCCC] 0527 * WHERE B=COMMAND , AAAA=ADDRESS , CCCC=ITERATION COUNT 0528 * 0529 ****** 0000015F 0530 BRK EQU $ 015F AAB8 0198 0531 ADD SVTBL1,X ADD OFFSET TO BASE 0160 A6B8 0199 0532 COPY X,SVTBL BREAK POINT TABLE REAL ADDRESS 0161 2060 0533 COPY Y,X RESTORE 'X' 0162 81E3 0023 0534 COPY *TCMND(X,Y),A GET COMMAND ID 0163 0C4A 0535 CLSN ='J',A WAS COMMAND A 'J' 0164 9E8C 0171 0536  JMP BRK2 YUP! GO DO REGULAR BREAK POINT 0165 0C42 0537 CLSN ='B',A IS IT A NORMAL BP COMMAND ? 0166 9E86 016D 0538 JMP BRK1 YES, PROCESS NORMAL BP 0167 C1E2 0022 0539 COPY  *TEXIT(X,Y),Q GET CURRENT P-REG 0168 0C59 0540 CLSN ='Y',A IS IT STEP FORWARD ONE? 0169 4B01  0541 ADD =1,Q GET NEXT LOC AS BP ADDRESS 016A 0C51 0542 CLSN ='Q',A IS IT STEP BACK ONE? 016B 4AFF 0543 SUB =1,Q YES,GET CURRENT LOC-1 AS BP ADD 016C 9E88 0175 0544  JMP BRK3 PUT IT IN BP TABLE 0000016D 0545 BRK1 EQU $ 016D 82A8 0196 0546 COPY PFLG,A ANY PARAMETER 016E 1166 0195 0547 JEQ A,BRK7 016F C1DA 001A 0548 COPY *TADDR(X,Y),Q GET 1ST PARAMETER FOR 'B' COMMAND 0170 9E81 0172 0549 JMP BRK2+1 DO BREAK POINT 0171 BDD2 0012  0550 BRK2 JST *TINP(X,Y) FETCH NEXT PARAMETER 0172 82A4 0197 0551 COPY BRKCNT,A # OF BREAKPOINTS CURRENTLY 0173 0C04 0552 CLSN =4,A MORE THAN 4 0174 9E63 0158 0553 JMP ERROR  ERROR 00000175 0554 BRK3 EQU $ 0175 DEA1 0197 0555 IMS BRKCNT COUNT BREAKPOINTS 0176 2040 0556 COPY Q,X 'X' HAS NEW PARAMETER VALUE 1PAGE 0024 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:06.75 . 0177 82B2 01AA 0557 COPY JST0,A JST *0 C ODE IN 'A' 0178 9080 0000 0558 EXCH 0(X),A STORE JST AT USER & SAVE USER INST 0179 DE9F 0199 0559  IMS SVTBL 017A 879E 0199 0560 COPY A,*SVTBL SAVE USER INSTRUCTION 017B DE9D 0199 0561  IMS SVTBL 017C A79C 0199 0562 COPY X,*SVTBL SAVE USER INSTRUCTION ADDRESS 017D 2060 0563  COPY Y,X RESTORE X TO BASE ADDRESS 017E 81DD 001D 0564 COPY *TTEST(X,Y),A FETCH TERMINATOR 017F 4045 0565 XOR Q,Q CLEAR ITERATION COUNT 0180 0C3B 0566 CLSN =';',A  IS ITERATION COUNT GIVEN 0181 9E82 0184 0567 JMP BRK4 YES, PROCESS IT 0182 9E86 0189 0568  JMP BRK5 JUMP IF NO ITERATION COUNT 0183 9EDB 01DF 0569 RTN6X JMP RTN6 LINK TO MAINTAIN BIN. RELOCATABILITY 00000184 0570 BRK4 EQU $ 0184 BDD2 0012 0571 JST *TINP(X,Y) GET ITERATION COUNT 0185 5241 0187 0572 JGT Q,$+2 SKIP IF COUNT > 0 0186 4045 0573 XOR Q,Q  INDICATE NO COUNT SPECIFIED 0187 4E01 0574 SHIFT Q,LO,1 DOUBLE COUNT 0188 4041 0575  NEG Q,Q NEGATE IT FOR INDEX 00000189 0576 BRK5 EQU $ 0189 DE8F 0199 0577 IMS  SVTBL BUMP TABLE ADDRESS 018A C78E 0199 0578 COPY Q,*SVTBL SAVE ITERATION COUNT 018B 0901  0579 COPY =1,A GET FLAG 018C 51C1 018E 0580 JNE Q,$+2 SKIP IF COUNT NOT SPECIFIED 018D 0005 0581 XOR A,A CLEAR FLAG IF NOT 018E DE8A 0199 0582 IMS SVTBL  BUMP TABLE ADDRESS 018F 8789 0199 0583 COPY A,*SVTBL SAVE BREAKPOINT FLAG 0190 81DD 001D 0584  COPY *TTEST(X,Y),A GET THE TERMINATOR CHARACTER 0191 0C2C 0585 CLSN =',',A ANOTHER PARAMETER ? 0192 9E5E 0171 0586 JMP BRK2 PROCESS NEXT PARAMETER 0193 9E3A 014E 0587 JMP JMPP1 IF NO MORE, GO BACK TO USER 0194 9E49 015E 0588 JMP ALLRX DO R-REGISTER DUMP & BACK TO DBG  00000195 0589 BRK7 EQU $ 0195 9DC1 0001 0590 JMP *TERROR(X,Y) NO PARAMETERS, ERROR  0591 * 0592 * WORD SECTION 1PAGE 0025 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:08.00 . 0593 * 0196 0000 0594 PFLG WORD 0 INPUT PARM FLAG 0197 0000 0595 BRKCNT WORD 0 BREAK POINT COUNT KEEPER 0198 0193 0596 SVTBL1 WORD SVBRK-BASE-1 0199 0000 0597 SVTBL WORD 0 0598 * BP QUEUE : 0=INSTRUCTION,1=ADDRESS,2=COUNT,3=FLAG 019A 0000 0599 SVBRK RES 4*4,0 BREAK POINT QUEUE 01AA BD00 0000 0600 JST0 JST *BRKPT  BREAK POINT INSTRUCTION 01AB 9E26 0152 0601 JMPP2X JMP JMPP2 TO MAINTAIN BIN. RELOCATABILITY 1PAGE 0026 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:08.25 . 0603 ******   0604 * 0605 * -- RTNB -- RETURN FROM BREAK POINT 0606 * 0607 * 0608 ****** 01AC 0000 0609 TEMP WORD 0 01AD 0000 0610 MASK WORD 0 01AE 0000 0611 RTNADD WORD 0 000001AF 0612 RTNB EQU $ A=RETURN ADDRESS 01AF 0AFF 0613 SUB =1,A DECREMENT TO BREAK POINT ADDRESS 01B0 85E2 0022 0614 COPY A,*TEXIT(X,Y) SET UP USER PROGRAM ENTRY ADDRESS 01B1 867C 01AE 0615 COPY A,RTNADD 01B2 8264 0197 0616 COPY BRKCNT,A FETCH BREAK POINT COUNT 01B3 11C4 01B8 0617 JNE A,RTN2 01B4 0944 0618 RTN1 COPY ='D',A  FLAG AS DUMMY BREAK POINT 01B5 2060 0619 COPY Y,X REFERESH 'X' WITH BASE ADD 01B6 85E1 0021 0620 COPY A,*TKIND(X,Y) 01B7 9E9E 01D6 0621 JMP RTN4 01B8 0001 0622 RTN2 NEG  A,A -BREAK POINT COUNT 01B9 8673 01AD 0623 COPY A,MASK SET INTERROGATION COUNTER 01BA 81E2 0022 0624 COPY *TEXIT(X,Y),A FETCH RETURN ADDRESS 01BB A25D 0199 0625 COPY SVTBL,X BREAK POINT SAVE QUEUE ADDRESS 01BC 2AFC 0626 SUB =4,X ADJUST BP TABLE ADDRESS 000001BD 0627 RTN3  EQU $ 01BD B882 0002 0628 CSK A,2(X) COMPARE WITH TABLE ENTRY 01BE 0000 0629 NOP 01BF 9E9B 01DB 0630 JMP RTN5 BUMP INDEX REGISTER 0631 * FOUND BREAKPOINT IN TABLE 01C0 8083 0003 0632 COPY 3(X),A GET ITERATION COUNT 01C1 1151 01D3 0633 JEQ A,RTN3A JUMP IF NO ITERATION COUNT 0634 * IT'S AN ITERATION COUNT BREAKPOINT 01C2 8084 0004 0635  COPY 4(X),A GET BREAKPOINT FLAG 01C3 8668 01AC 0636 COPY A,TEMP SAVE BREAKPOINT FLAG 01C4 0020 0637 COPY X,A SAVE TABLE INDEX 01C5 C081 0001 0638 COPY 1(X),Q GET USER INSTRUCTION 1PAGE 0027 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:09.25 . 01C6 A082 0002 0639 COPY 2(X),X GET LOCATION 01C7 D080 0000 0640 EXCH Q,0(X) SWAP INSTRUCTION/JST *0 01C8 AA63 01AC 0641 ADD TEMP,X GET PRIOR/NEXT INSTRUCTION 01C9 D080 0000 0642  EXCH Q,0(X) PLACE BREAKPOINT THERE 01CA 2008 0643 EXCH A,X SWAP TABLE ADDRESS/LOCATION 01CB C481 0001 0644 COPY Q,1(X) SAVE THIS INSTRUCTION 01CC 8482 0002 0645 COPY A,2(X) SAVE IT'S LOCATION 01CD C25E 01AC 0646 COPY TEMP,Q GET BREAKPOINT FLAG 01CE 4041 0647  NEG Q,Q POINT TO NEXT/PRIOR 01CF C484 0004 0648 COPY Q,4(X) RESTORE BREAKPOINT FLAG 01D0 DC83 0003 0649 IMS 3(X) BUMP ITERATION COUNT 01D1 0000 0650 NOP  COUNT NOT DONE, RETURN 01D2 9E58 01AB 0651 JMP JMPP2X DONE, RETURN, STOP NEXT TIME 000001D3  0652 RTN3A EQU $ 01D3 0942 0653 COPY ='B',A REAL BREAK POINT 01D4 2060 0654  COPY Y,X REFERESH 'X' WITH BASE ADD 01D5 85E1 0021 0655 COPY A,*TKIND(X,Y) 000001D6 0656 RTN4 EQU $ 01D6 BDC3 0003 0657 JST *TDMPRS(X,Y) DO REGISTER DUMP 01D7 81E1 0021 0658 COPY *TKIND(X,Y),A 01D8 0C44 0659 CLSN ='D',A IF DUMMY BRK POINT, THEN BUMP TO 01D9 DDE2 0022 0660 IMS *TEXIT(X,Y) NEXT EXECUTABLE LOCATION 01DA 9E84 01DF 0661 JMP RTN6 RESTORE ANY OUTSTANDING BRK POINTS 01DB 2AFC 0662 RTN5 SUB =4,X BUMP INDEX TO BRK POIN TABLE 01DC DE50 01AD 0663 IMS MASK BUMP COUNTER 01DD 9E5F 01BD 0664 JMP RTN3 01DE 9E55 01B4 0665 JMP RTN1 000001DF 0666 RTN6 EQU $ 01DF 8237 0197 0667 COPY BRKCNT,A # OF BREAK POINTS 01E0 11C2 01E3 0668 JNE A,$+3 01E1 2060 0669 COPY Y,X 01E2 9DC0 0000 0670 JMP  *TDBG(X,Y) IF BRKCNT = 0, BACK TO DBG 01E3 A235 0199 0671 COPY SVTBL,X CURRENT SAVE TABLE ADDRESS 01E4 2AFC 0672 SUB =4,X UPDATE TABLE ADDRESS 01E5 A633 0199 0673 COPY X,SVTBL  AND PUT IT BACK 01E6 8081 0001 0674 COPY 1(X),A GET USER INSTRUCTION 1PAGE 0028 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:10.25 . 01E7 A082 0002 0675 COPY 2(X),X  GET USER INST. ADDRESS 01E8 8480 0000 0676 COPY A,0(X) STORE INST. AT PROPER ADDRESS 01E9 822D 0197 0677 COPY BRKCNT,A ONE BRK POINT RESTORED 01EA 0AFF 0678 SUB =1,A 01EB 862B 0197 0679  COPY A,BRKCNT 01EC 9E72 01DF 0680 JMP RTN6 GO PROCESS REST OF THE BRK POINTS 1PAGE 0029  MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:10.50 . 0682 ******  0683 * 0684 * -- RREG -- 0685 * -- DISPLAY AND CHANGE OF REGISTERS -- 0686 * 0687 ****** 000001ED 0688 RREG EQU $ 01ED BDC7 0007 0689  JST *TCOMMA(X,Y) ERROR IF , IN INPUT 01EE 097D 0690 COPY =EXIT-BASE,A 01EF C1E0 0020 0691 RREGG COPY *TSIZE(X,Y),Q 01F0 0022 0692 ADD X,A 01F1 0042 0693 ADD Q,A DESIRED REGISTER ADDRESS 01F2 86A9 021C 0694 COPY A,SIZER SAVE IT 01F3 81D9 0019 0695 COPY  *TPFLG(X,Y),A GET 'PFLG' CONTENTS 01F4 11C6 01FB 0696 JNE A,RREG1 IF VALUE SUPPLIED, GO CHANGE REGISTER  01F5 BDCD 000D 0697 JST *TCRLF(X,Y) NEW LINE 01F6 83A5 021C 0698 COPY *SIZER,A GET DESIRED REG CONTENTS 01F7 BDD6 0016 0699 JST *TSHEX(X,Y) DO HEX ROUTINE FOLLOWED BY A SPACE 000001F8 0700  RREG5 EQU $ 01F8 BDD2 0012 0701 JST *TINP(X,Y) GET NEXT PARM-- CHANGE 01F9 BDC7 0007 0702 !  JST *TCOMMA(X,Y) ERROR IF , 01FA 81D9 0019 0703 COPY *TPFLG(X,Y),A GET PARM ENTERED FLAG 01FB 114F 020B 0704 RREG1 JEQ A,RREG2 IF NO CHANGE, IT MAY BE / OR X 01FC 81DB 001B 0705 COPY *TVALU(X,Y),A GET CHANGE 01FD 4784 0706 CEA SR,Q COMPUTE ADDRESS OF S REGISTER SAVE 01FE FE8B 008A 01FF FA9C 021C 0707 CSK Q,SIZER ARE WE GOING TO CHANGE THE S REGISTER? 0200 0000 0708 NOP 0201 9E87 0209 0709 JMP RREG6 NO, GO CHANGE IT 0202 C399 021C 0710 COPY *SIZER,Q GET OLD S REGISTER 0203 0045 0711 XOR Q,A FIND WHICH BITS NEED CHANGING 0204 9696 021B 0712 AND SMASK,A DON'T CHANGE UNUSED BITS 0205 0EB4 0713 TBIT 11,S ARE WE IN PROTECT MODE 0206 36C1 0208 0714 JF OV,$+2 NO 0207 1827 0715 AND =:27,A YES, ONLY XA, BM, OV, AND CY CAN BE CHANGED 0208 0045 0716 XOR Q,A MAKE NEW S REGISTER 1PAGE 0030 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:11.50 . 00000209 0717 RREG6 EQU $ 0209 8792 021C 0718 COPY A,*SIZER CHANGE THE DESIRED REGISTER 020A 9DC0 0000 0719 JMP *TDBG(X,Y) START AGAIN IN DBG 020B 81DC 001C 0720 RREG2 COPY *TLASTS(X,Y),A FETCH LAST TERMINATOR 020C 0C00 0721  CLSN =0,A ANY SPECIAL TERMINATOR? 020D 9DC0 0000 0722 JMP *TDBG(X,Y) NO SPECIAL TERMINATOR, BACK TO DBG 020E 0C2F 0723 CLSN ='/',A LAST TERMINATOR MUST BE 020F 9E86 0216 0724 JMP RREG3 / OR X 0210 0C58 0725 CLSN ='X',A 0211 9E81 0213 0726 JMP $+2 0212 9DC1 0001 0727 JMP *TERROR(X,Y) ELSE ERROR 0213 8388 021C 0728 COPY *SIZER,A GET DESIRED REG CONTENTS 0214 0E01 0729 SHIFT A,LO,1 MULTIPLY BY 2 0215 9E82 0218 0730 JMP RREG4 0216 8385 021C 0731 RREG3 COPY *SIZER,A 0217 0E09 0732 SHIFT A,RO,1 DIVIDE BY 2 0218 BDCD 000D 0733 RREG4 JST *TCRLF(X,Y) NEW LINE 0219 BDD6 0016 0734 JST *TSHEX(X,Y) DO HEX ROUTINE FOLLOWED BY A SPACE 021A 9E5D 01F8 0735 JMP RREG5 GET ANOTHER PARM 0736 * 021B FD77 0737 SMASK WORD :FD77 NON-RESERVED STATUS REGISTER BITS 021C 0000 0738 SIZER WORD 0  0739 ****** 0740 * 0741 * -- DISPLAY AND CHANGE OF GENERAL REGISTERS --  0742 * 0000021D 0743 GREG EQU $ 021D 0985 0744 COPY =G0-BASE,A G-REG ABSOLUTE OFFSET 021E 9E50 01EF 0745 JMP RREGG GO PERFORM 'G' FUNCTION 1PAGE 0031 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:12.25 . 0747 ****** 0748 *  0749 * -- INSP-- I 0750 * 0751 * INSPECTION & MODIFICATION OF MEMORY LOCA" TION 0752 * 0753 ****** 0000021F 0754 INSP EQU $ 021F BDCD 000D 0755 INSP1 JST *TCRLF(X,Y) NEW LINE 0220 81DA 001A 0756 COPY *TADDR(X,Y),A GET 1ST PARM (MEM TO BE MODIFIED)  0221 86AB 024D 0757 COPY A,ADDRI SAVE IT 0222 4000 0758 COPY A,Q 0223 BDD5 0015 0759 JST *TPADDR(X,Y) PUBLISH ADDRESS 0224 83A8 024D 0760 COPY *ADDRI,A FETCH CONTENTS OF MEM  0225 BDD6 0016 0761 JST *TSHEX(X,Y) DO HEX ROUTINE FOLLOWED BY A SPACE 00000226 0762 INSP3 EQU  $ 0226 BDD2 0012 0763 JST *TINP(X,Y) FETCH NEXT PARAMETER 0227 81D9 0019 0764 COPY *TPFLG(X,Y),A GET PFLG 0228 1142 022B 0765 JEQ A,INSP2 ANY PARAMETER(CHANGE)? 0229 85DF 001F 0766 COPY A,*TSTORE(X,Y) FLAG MEMORY CHANGE 022A C7A2 024D 0767 COPY Q,*ADDRI MODIFY MEMORY 0000022B 0768 INSP2 EQU $ 022B 81DD 001D 0769 COPY *TTEST(X,Y),A GET TERMINATOR 022C 0C2C 0770 CLSN =',',A IS IT A 8 022D 9E9C 024A 0771 JMP MORE YES- GO GET NEXT CHANGE 022E C29E 024D  0772 COPY ADDRI,Q REFERESH 'Q' 022F 81DC 001C 0773 COPY *TLASTS(X,Y),A FETCH TERMINATOR 0230 115B 024C 0774 JEQ A,DBGRTN NO SPECIAL TERMINATOR,THEN GO TO DBG 0231 0C2B 0775 CLSN  ='+',A INCREMENT? 0232 9E89 023C 0776 JMP INCR 0233 0C2D 0777 CLSN ='-',A DECREMENT 0234 9E88 023D 0778 JMP DECR 0235 0C2A 0779 CLSN ='*',A INDIRECT 0236 9E8A 0241 0780 JMP INDI 0237 0C58 0781 CLSN ='X',A X2 0238 9E8B 0244 0782 JMP MULT 1PAGE 0032 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:13.25 . 0239 0C2F 0783 CLSN ='/',A DIV BY 2 023A 9E8C 0247 0784 JMP DIV 023B 9DC1 0001 0785  JMP *TERROR(X,Y) ELSE ERROR 023C 4B02 0786 INCR ADD =2,Q 023D 4AFF 0787 DECR SUB =1,Q 023E C68E 024D 0788 COPY Q,ADDRI SAVE NEW ADDRESS 023F C5DA 001A 0789 COPY Q,*TADDR(X,Y) RESTORE NEW ADDRESS 0240 9E5E 021F 0790 JMP INSP1 START AGAIN 0241 838B 024D 0791 INDI COPY  *ADDRI,A INDIRECT 0242 85DA 001A 0792 INDI1 COPY A,*TADDR(X,Y) PUT NEW ADD BACK 0243 9E5B 021F 0793  JMP INSP1 START AGAIN 0244 8388 024D 0794 MULT COPY *ADDRI,A 0245 0E01 0795 SHIFT  A,LO,1 MULTIPLY BY 2 0246 9E7B 0242 0796 JMP INDI1 0247 8385 024D 0797 DIV COPY *ADDRI,A 0248 0E09 0798 SHIFT A,RO,1 DIVIDE BY 2 0249 9E78 0242 0799 JMP INDI1 024A DE82 024D IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII# IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII$ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII?e820422181653820422181653820422181838e6820422181653820422181653820422181837e820422181653820422181653820422181653e% 820422181653820422181653820422181653820422181653820422181653820422181653es$8204221817542582042218182275820422181822dew8204221818390082042218184300820422181843dex &8204221819177582042218192325820422181923d ed s8204221819390082042218202875820422182028d& ' ( . DEBUGC ASMDEBUGC JCLDEBUGC LBR DEBUGC LST 0800 MORE IMS ADDRI NEXT LOCATION 024B 9E5A 0226 0801 JMP INSP3 DO IT AGAIN 0000024C 0802 DBGRTN EQU $ 024C 9DC0 0000 0803 JMP *TDBG(X,Y) BACK TO DBG 024D 0000 0804 ADDRI WORD 0 0805 ****** 0806 * 0807 * -- COMMA --  0808 * 024E 0E0D 0809 COMMA ENT 024F 0C2C 0810 CLSN =',',A 0250 9DC1 0001 0811 JMP *TERROR(X,Y) 0251 9F7C 024E 0812 RTN COMMA 1PAGE 0033 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:14.00 . 0814 ****** 0815 * 0816 * )  -- LIST -- 0817 * 0818 * LISTING CONSECUTIVE MEMORY LOCATIONS 0819  * 0820 * 00000252 0821 LIST EQU $ 0252 BED6 02A9 0822 JST GSZ GET SIZE 0253 0C0D 0823 CLSN =CR,A CR 0254 9E86 025B 0824 JMP PRN 0255 BDD2 0012 0825 JST *TINP(X,Y) INPUT ASCII CODE OPTION 0256 BDC7 0007 0826 JST *TCOMMA(X,Y) ERROR IF TERMINATOR IS , 0257 4C0A 0827 CLSN =:A,Q ASCII OPTION 'A' 0258 9E81 025A 0828  JMP $+2 0259 9DC1 0001 0829 JMP *TERROR(X,Y) 025A C6CA 02A5 0830 COPY Q,ATEMP 0000025B 0831 PRN EQU $ 025B 81E4 0024 0832 COPY *TDIOFG(X,Y),A GET DESIRED OUTPUT MEDIA FLAG 025C 0C50 0833 CLSN ='P',A IS IT LP OUTPUT 025D 9E81 025F 0834 JMP $+2 025E 9E80 025F 0835 JMP PRN11 0000025F 0836 PRN11 EQU $ 025F BDCD 000D 0837 JST *TCRLF(X,Y) NEW LINE 0260 81DA 001A 0838 COPY *TADDR(X,Y),A GET 1ST PARAMETER 0261 86DF 02C1 0839 COPY A,SVWORD SAVE IT 00000262 0840 PRN1 EQU $ 0262 BDD5 0015 0841 JST *TPADDR(X,Y) 0263 08F8  0842 COPY =-8,A 0264 86C1 02A6 0843 COPY A,SKIPCN 0265 86BE 02A4 0844 COPY A,PRNTCT 8 WORDS/LINE 0266 83DA 02C1 0845 PRN2 COPY *SVWORD,A GET CONTENTS 0267 BDD6 0016 0846 JST  *TSHEX(X,Y) DO HEX ROUTINE FOLLOWED BY A SPACE 0268 BDD7 0017 0847 JST *TETEST(X,Y) NEXT FUNCTION IF DONE  0269 DEBA 02A4 0848 IMS PRNTCT 026A 9E7B 0266 0849 JMP PRN2 1PAGE 0034 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:14.75 . 026B 82B9 02A5 0850 COPY ATEMP,A 026C 0C0A 0851 CLSN =:A,A CHECK FOR ASCII OPTION 026D BE83 0271 0852 JST ASCPR YES, GO OUTPUT ASCII CODE 026E 82D2 02C1 0853 COPY SVWORD,A LATEST ADDRESS 026F BDCD 000D 0854 JST *TCRLF(X,Y) NEW LINE 0270 9E71 0262 0855 JMP PRN1 0271 0E0D 0856 ASCPR ENT 0272 82B1 02A4 0857 COPY PRNTCT,A FETCH NUMBER OF HEX DUMPED 0273 86B4 02A8 0858 COPY A,TABCN SAVE TAB CONSTANT 0274 8EB1 02A6 0859 SUB SKIPCN,A -(-ELEMENTS PER LINE) 0275 0001 0860 NEG  A,A -ELEMENTS TO PUBLISH IN ASCII DUMP 0276 116B 02A2 0861 JEQ A,PRN7 DUMP COMPLETED, DO NEW LINE 0277 86AC 02A4 0862 COPY A,PRNTCT CALCULATE HEAD OF ASCII 0278 8AC8 02C1 0863 ADD SVWORD,A 0279 86C7 02C1 0864 COPY A,SVWORD REFRESH WORD ADDRESS 027A 82AD 02A8 0865 COPY TABCN,A FETCH TAB CONSTANT 027B 1147 0283 0866 JEQ A,PRN5 NO TAB NEEDED 027C 08FB 0867 PRN4  COPY =-5,A ESTABLISH SPACE COUNTER 027D 86A9 02A7 0868 COPY A,SPACN 027E BDC8 0008 0869 *  JST *TSPACE(X,Y) OUTPUT A SPACE 027F DEA7 02A7 0870 IMS SPACN BUMP SPACE COUNTER 0280 9E7D 027E 0871 JMP $-2 CONTINUE UNTIL SPACED OUT 0281 DEA6 02A8 0872 IMS TABCN BUMP TAB COUNTER 0282 9E79 027C 0873 JMP PRN4 CONTINUE TAB 0283 08FD 0874 PRN5 COPY =-3,A  ISSUE SPACES BETWEEN HEX & ASCII 0284 86A2 02A7 0875 COPY A,SPACN 0285 BDC8 0008 0876 JST  *TSPACE(X,Y) OUTPUT A SPACE 0286 DEA0 02A7 0877 IMS SPACN 0287 9E7D 0285 0878 JMP $-2 0288 83B8 02C1 0879 PRN6 COPY *SVWORD,A GET DATUM ADDRESS 0289 0E79 0880 SHIFT A,RO,8 POSITION HIGH ORDER BYTE 028A 0A82 0881 SUB =:7E,A SUBTRACT UPPER BOUNDARY OF ASCII SET 028B 1245 0291  0882 JGT A,PRN61 028C 0B7E 0883 ADD =:7E,A 028D 0AE0 0884 SUB =:20,A TEST FOR LOWER BOUND OF ASCII SET 028E 13C2 0291 0885 JLT A,PRN61 1PAGE 0035 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:15.75 . 028F 0B20 0886 ADD =:20,A 0290 9E81 0292 0887 JMP $+2 0291 092E 0888 PRN61 COPY =:2E,A INVALID ASCII CODE ISSUE SPACE 0292 BDCF 000F 0889 JST *TTYP(X,Y) PUBLISH ON SPECIFIED I/O 0293 83AD 02C1 0890 COPY *SVWORD,A  FETCH DATUM ONCE MORE 0294 18FF 0891 AND =:FF,A MASK TO LOW ORDER BYTE 0295 0A82 0892  SUB =:7E,A TEST OFR UPPER BOUND OF ASCII SET 0296 1245 029C 0893 JGT A,PRN62 TEST FOR VALID ASCII ISSUE SPACE IF NOT 0297 0B7E 0894 ADD =:7E,A ADD BACK TO ITS VALUE 0298 0AE0 0895  SUB =:20,A TEST FOR LOWER BOUND OF ASCII SET 0299 13C2 029C 0896 JLT A,PRN62 029A 0B20  0897 ADD =:20,A 029B 9E81 029D 0898 JMP $+2 0000029C 0899 PRN62 EQU $ 029C 092E 0900 COPY =:2E,A INVALID ASCII CODE ISSUE SPACE 029D BDCF 000F 0901 JST *TTYP(X,Y) PUBLISH ASCII 029E DEA2 02C1 0902 IMS SVWORD BUMP MEMORY ADDRES TO NEXT DATUM 029F 0000 0903 NOP 02A0 DE83 02A4 0904 IMS PRNTCT BUMP WORDS/LINE COUNTER 02A1 9E66 0288 0905  JMP PRN6 CONTINUE ASCII CUMP 02A2 9F4E 0271 0906 PRN7 RTN ASCPR END OF THIS LINE RETURN  0907 * 0908 * WORD AREA 0909 * 02A3 0000 0910 WSIZE WORD 0 02A4 0000 0911 PRNTCT WORD 0 02A5 0000 0912 ATEMP WORD 0 02A6 0000 0913 SKIPCN WORD 0 02A7 0000 0914 SPACN WORD 0 02A8 0000 0915 TABCN WORD 0 1PAGE 0036 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:16.50 . 0917 ****** 0918 *  0919 * -- GSZ -- 0920 * 0921 * GET AND CHECK SIZE/2ND PARAMETER FOR LI+ ST,SEARCH,FILL8 COPY 0922 * RETURN: WSIZE = WORD SIZE (ENDING ADD - STARTING ADD) 0923 * 'A' = TERMINATOR 0924 ****** 02A9 0E0D 0925 GSZ ENT 02AA 0C2C 0926  CLSN =',',A 02AB 9E81 02AD 0927 JMP $+2 PARAMETERS MUST BE SAPARATED BY , 02AC 9DC1 0001 0928 JMP *TERROR(X,Y) ELSE ERROR 02AD BDD2 0012 0929 JST *TINP(X,Y) GET 2ND PARAMETER 02AE 8674 02A3 0930 COPY A,WSIZE SAVE TERM CHAR 02AF 0040 0931 COPY Q,A GET 2ND PARAM IN AR 02B0 C1DA 001A 0932 COPY *TADDR(X,Y),Q GET FIRST PARAM IN QR 02B1 0046 0933 CSM A,Q 2ND PARAM SHD BE >= 1ST 02B2 9E85 02B8 0934 JMP GSZ1 PROBLEM - 2ND < 1ST 02B3 0000  0935 NOP 02B4 0043 0936 SUB Q,A GET ACTUAL LENGTH IN AR 02B5 0B01 0937  ADD =1,A 02B6 926C 02A3 0938 GSZ3 EXCH WSIZE,A A=TERMN,WSIZE=SIZE 02B7 9F71 02A9 0939 RTN  GSZ EXIT 02B8 C1E3 0023 0940 GSZ1 COPY *TCMND(X,Y),Q LOOK AT COMMAND 02B9 4C4C 0941 CLSN ='L',Q IF LIST 2ND MAY BE OK 02BA 9E81 02BC 0942 JMP $+2 02BB 9DC1 0001 0943 GSZ2 JMP  *TERROR(X,Y) NO, ITS AN ERROR 02BC 12BE 02BB 0944 JLE A,GSZ2 CANT BE 0 OR NEG 02BD 0D28 0945  CSK A,=LLNTH MUST BE 1-LLNTH 02BE 9E77 02B6 0946 JMP GSZ3 OK 02BF 9E7B 02BB 0947  JMP GSZ2 ERROR 02C0 9E75 02B6 0948 JMP GSZ3 OK 02C1 0000 0949 SVWORD WORD 0 1ST PARAMETER KEEPER 1PAGE 0037 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:17.50 . 0951 ****** 0952 * 0953 * -- ETEST --  0954 * 0955 * TEST FOR END OF PRINT/SRCH/COPY/FILL 0956 * INCREMENT STARTING ADD, DECREMENT WORD SIZE. (Q=WORDSIZE) 0957 ****** 02C2 0E0D 0958 ETEST ENT 02C3 C25F 02A3 0959 COPY WSIZE,Q GET WORD COUNT 02C4 DE7C 02C1 0960 IMS SVWORD BUMP ADDRESS BY 1 02C5 4AFF 0961 SUB =1,Q DECREMENT WORD COUNT 02C6 5142 02C9 0962 JEQ Q,$+3 ALL DONE, BACK TO DBG 02C7 C65B 02A3 0963 COPY Q,WSIZE RESTORE WORD COUNT LEFT 02C8 9F79 02C2 0964  RTN ETEST ELSE RETURN 02C9 81E3 0023 0965 COPY *TCMND(X,Y),A GET COMMAND ID 02CA 0C4C 0966 CLSN ='L',A WAS LAST CMND 'L' 02CB 9E88 02D4 0967 JMP ERTNT 02CC 0C53 0968  CLSN ='S',A OR WAS IT 'S' 02CD 9E81 02CF 0969 JMP $+2 02CE 9E8D 02DC 0970 JMP  ERTN 02CF 81E4 0024 0971 ERTNJ COPY *TDIOFG(X,Y),A GET OUTPUT FLAG 02D0 0C54 0972 CLSN ='T',A  TTY OUTPUT 02D1 9E8A 02DC 0973 JMP ERTN GO BACK 02D2 BDCD 000D 0974 JST *TCRLF(X, ,Y) DO EXTRA CRLF 02D3 9E88 02DC 0975 JMP ERTN GO BACK 02D4 DE4F 02A4 0976 ERTNT IMS PRNTCT 02D5 0000 0977 NOP 02D6 824E 02A5 0978 COPY ATEMP,A HAS ASCII ASKED 02D7 0C0A 0979 CLSN =:A,A 02D8 BE18 0271 0980 JST ASCPR FINISH UP ASCII DUMP 02D9 0900 0981  COPY =0,A CLEAR ATEMP 02DA 864A 02A5 0982 COPY A,ATEMP 02DB 9E73 02CF 0983 JMP ERTNJ 02DC 9DC0 0000 0984 ERTN JMP *TDBG(X,Y) BACK TO NEXT FUNCTION 1PAGE 0038 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:18.75 . 0986 ****** 0987 *  0988 * -- FILLP -- 0989 * 0990 * FILLING MEMORY WITH A CONSTANT VALUE 0991 * 0992 * 0993 ****** 000002DD 0994 FILLP EQU $ 02DD BE89 02E7 0995 JST GET2 GET 2ND,3RD & 4TH PARM 02DE 85DF 001F 0996 COPY A,*TSTORE(X,Y) PUT * TO FLAG THIS COMMAND 02DF 81DA 001A 0997 COPY *TADDR(X,Y),A 02E0 BECB 032C 0998 JST SINKCK MAKE SURE FILL IS NOT IN DBG AREA 02E1 865F 02C1 0999 COPY A,SVWORD 1ST PARM 02E2 8294 02F7 1000 COPY KEY,A 02E3 875D 02C1 1001 FIL1 COPY A,*SVWORD FILL A WORD 02E4 BE5D 02C2 1002 JST ETEST CHECK FOR END 02E5 8A92 02F8 1003 ADD KEY1,A ADD INCREMENT/DECREMENT CONSTANT 02E6 9E7C 02E3 1004 JMP FIL1 LOOP 1PAGE 0039 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:19.25 . 1006 ****** 1007 * 1008 * -- GET2 -- 1009 * 1010 * GET 2ND, 3RD & 4TH PARAMETER. 1011 * KEY -- FILLER CONSTANT/3RD PARM-START ADD FOR COPY COMMAND 1012 * KEY1 -- INCREMENT/DECREMENT CONSTANT OR MASK(FOR SEARCH) 1013 * 1014 ****** 02E7 0E0D 1015 GET2 ENT 02E8 4900 1016  COPY =0,Q 02E9 C68E 02F8 1017 COPY Q,KEY1 INITIALIZE INCREMENT/DECREMENT KEEPER 02EA BE3E 02A9 1018 JST GSZ GET 2ND PARM & SIZE TO BE FILLED 02EB 0C2C 1019 CLSN =',',A THERE MUST BE A , FOR 3RD PARM 02EC 9E81 02EE 1020 JMP $+2 02ED 9DC1 0001 1021 JMP *TERROR(X,Y) ERROR IF NO 3RD PARM 02EE BDD2 0012 1022 JST *TINP(X,Y) GET 3RD PARM 02EF C687 02F7 1023 COPY  Q,KEY SAVE FILL VALUE 02F0 0C2C 1024 CLSN =',',A IS THERE A 4TH PARM? 02F1 9E81 02F3 1025 JMP $+2 02F2 9E83 02F6 1026 JMP GOGET2 NO,GO BACK TO CALLER 02F3 86B7 032B 1027  COPY A,NOMACH FLAG 4TH PARAMETER 02F4 BDD2 0012 1028 JST *TINP(X,Y) YES, GET 4TH PARM 02F5 C682 02F8 1029 COPY Q,KEY1 SAVE INCREMENT/DECREMENT COUNT 02F6 9F70 02E7 1030 GOGET2 RTN GET2 -  BACK TO CALLER 02F7 0000 1031 KEY WORD 0 FILLER KEEPER 02F8 0000 1032 KEY1 WORD  0 INCREMENT/DECREMENT CONSTANT KEEPER 1PAGE 0040 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:20.00 . 1034 ****** 1035 * 1036 * -- SRCH --  1037 * 1038 * SEARCH MEMORY 1039 * 1040 ******  000002F9 1041 SRCH EQU $ 02F9 4900 1042 COPY =0,Q 02FA C6B0 032B 1043 COPY Q,NOMACH INITIALIZE 02FB BE6B 02E7 1044 JST GET2 GET 2ND, 3RD & 4TH PARM 02FC 0C2C 1045  CLSN =',',A IS THERE A 5TH PARM 02FD 9E93 0311 1046 JMP SRCH00 YES GET 5TH PARM 02FE 0900 1047 COPY =0,A 02FF 92AB 032B 1048 EXCH A,NOMACH 0300 0C2C 1049 CLSN  =',',A CHECK IF THERE WAS A 4TH PARM 0301 9E83 0305 1050 JMP SRCH55 0302 48FF 1051 COPY =-1,Q 0303 C674 02F8 1052 COPY Q,KEY1 MASK OF :FFFF 0304 9E92 0317 1053 JMP SRCH11 NO, GO START SRCH 00000305 1054 SRCH55 EQU $ 0305 8272 02F8 1055 COPY KEY1,A GET LAST PARM 0306 0D00 1056 CSK A,=0 0307 0000 1057 NOP 0308 9E8E 0317 1058 JMP  SRCH11 0309 48FF 1059 COPY =-1,Q MASK OF :FFFF 030A C66D 02F8 1060 COPY Q,KEY1 ZERO MASK 030B 81DC 001C 1061 COPY *TLASTS(X,Y),A 030C 0C2D 1062 CLSN ='-',A  MUST BE '-' 030D 9E81 030F 1063 JMP $+2 030E 9DC1 0001 1064 JMP *TERROR(X,Y) ELSE ERROR 030F 869B 032B 1065 COPY A,NOMACH SAVE '-' 0310 9E86 0317 1066 JMP SRCH11 START SEARCH  00000311 1067 SRCH00 EQU $ 0311 BDD2 0012 1068 JST *TINP(X,Y) GET 5TH PARM 0312 81DC 001C 1069 COPY *TLASTS(X,Y),A GET LAST TERMINATOR 1PAGE 0041 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:20.75 . 0313 0C2D 1070 CLSN ='-',A 0314 9E81 0316 1071 JMP $+2 0315 9DC1 0001 1072 JMP *TERROR(X,Y) ILLEGAL PARM 0316 8694 032B 1073 COPY A,NOMACH A NO-MACH SEARCH 00000317 1074 SRCH11 EQU $ 0317 81DA 001A 1075 COPY *TADDR(X,Y),A 0318 8628 02C1 1076 COPY A,SVWORD GET 1ST PARM 0319 8327 02C1 1077 SRCH22 COPY *SVWORD,A FETCH A WORD 031A 9A5C 02F7 1078 XOR KEY,A COMPARE TO MATCH VALUE 031B 965C 02F8 1079 AND KEY1,A MASK IT 031C 11C3 0320 1080 JNE A,SRCH33 NO MATCH, CHECK IF NO MATCH DESIRED 031D 828D 032B 1081  COPY NOMACH,A 031E 1146 0325 1082 JEQ A,FOUNDS MATCH FOUND, GO PRINT 031F 9E83 0323 1083  JMP SRCH44 0320 828A 032B 1084 SRCH33 COPY NOMACH,A 0321 0C2D 1085 CLSN ='-',A 0322 9E82 03. 25 1086 JMP FOUNDS 0323 BE1E 02C2 1087 SRCH44 JST ETEST DO NEXT FUNCTION IF DONE, ELSE 0324 9E74 0319 1088 JMP SRCH22 LOOP 0325 BDCD 000D 1089 FOUNDS JST *TCRLF(X,Y) NEW LINE 0326 821A 02C1 1090 COPY SVWORD,A GET MATCH ADDRESS 0327 BDD5 0015 1091 JST *TPADDR(X,Y) 0328 8318 02C1 1092 COPY *SVWORD,A GET MATCH VALUE 0329 BDD0 0010 1093 JST *THEX(X,Y) AND PRINT IT 032A 9E78 0323 1094 JMP SRCH44 032B 0000 1095 NOMACH WORD 0 MATCH - NO MATCH KEEPER 1PAGE 0042 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:21.50 . 1097  ****** 1098 * 1099 * -- SINKCK -- 1100 * 1101 *  CHECK TO ENSURE DBG AREA IS NOT BEING MODIFIED 1102 * 1103 * 1104 ****** 032C 0E0D 1105 SINKCK ENT 032D C292 0340 1106 COPY SINKV1,Q CALCUATE END OF DEBUG 032E 4022  1107 ADD X,Q INTO Q REG 032F 0046 1108 CSM A,Q IS START OF WORD>END OF DBG? 0330 9E82 0333 1109 JMP SINK1 NO, CHECK FURTHER 0331 9F7A 032C 1110 RTN SINKCK YES,OK 0332 9E87 033A 1111 JMP SINK2 OVERLAP ERROR 0333 4020 1112 SINK1 COPY X,Q CALCULATE START OF DBG 0334 CE8C 0341 1113 SUB SINKV2,Q 0335 89DE 001E 1114 ADD *TWSIZE(X,Y),A CALCULATE END OF WORD 0336 0AFF 1115 SUB =1,A 0337 0046 1116 CSM A,Q  IS END OF WORDLAST G-REG? 038A 9E83 038E 1224 JMP ADR2 NO, DONT BOTHER 038B 0000  1225 NOP YES,REPLACE WORKING G-REG 038C 865B 0368 1226 COPY A,ADRT2 WITH ONE NEARER TO ACTUAL. 038D C65B 0369 1227 COPY Q,ADRT3 SAVE CURRENT G-REG NUMBER 0000038E 1228 ADR2 EQU $ 038E 2060 1229 COPY Y,X RESTORE X 038F DE5A 036A 1230 IMS ADRT4 BUMP POINTER 0390 4B01 1231 ADD =1,Q BUMP REGISTER NO. 0391 4C24 1232 CLSN =36,Q DONE WITH ALL REGISTERS? 0392 9E81 0394 1233 JMP $+2 YES 1PAGE 0047 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:24.75 . 0393 9E6B 037F 1234 JMP ADR1 ND LOOP 0394 8254 0369 1235 COPY ADRT3,A 0395 0B01 1236 ADD =1,A 0396 114E 03A5 1237 JEQ A,ADR4 NO APPLICABLE G-REG FOUND 0397 093D 1238 COPY ='=',A 0398 BDCF 000F 1239 JST *TTYP(X,Y) 0399 824D 0367 1240 COPY ACTUAL,A CALCULATE G-REG OFFSET 039A 8E4D 0368 1241 SUB ADRT2,A 039B BDD0 0010 1242 JST *THEX(X,Y) 039C 0947 1243 COPY ='G',A TYPE 'G' 039D BDCF 000F 1244 JST *TTYP(X,Y) 039E 824A 0369 1245 COPY ADRT3,A REGISTER # 039F 0AF6 1246 SUB =10,A CONVERT TO ASCII 03A0 13C1 03A2 1247 JLT  A,$+2 03A1 0B07 1248 ADD =7,A 03A2 0B3A 1249 ADD ='9'+1,A 03A3 BDCF 000F 1250  JST *TTYP(X,Y) 03A4 9E80 03A5 1251 JMP ADR4 000003A5 1252 ADR4 EQU $ 03A5 0921 0 1253 COPY =BLANK,A 03A6 BDCF 000F 1254 JST *TTYP(X,Y) 03A7 9F4C 0374 1255 RTN PADDR BACK TO CALLER 1256 * 00000367 1257 ACTUAL EQU CV01 00000368 1258  ADRT2 EQU SVCV01 00000369 1259 ADRT3 EQU CV02 0000036A 1260 ADRT4 EQU CV03 1PAGE 0048 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:25.50 . 1262 ******  1263 * 1264 * -- RKB -- INPUT CHARACTER 1265 * FROM LOGICAL UNIT 'TV' 1266 * 'A' RETURNS WITH READ CHARACTER 1267 ****** 03A8 0E0D 1268 RKB ENT 03A9 E6B0 03DA 1269 COPY Y,SAVEY SAVE Y REGISTER 03AA 6784 1270 CEA INBUF,Y COMPUTE INPUT BUFFER ADDRESS 03AB 016D 0519 03AC A2F3 0420 1271 COPY TVLUN,X GET TV LUN 03AD 82AB 03D9 1272 COPY BCOUNT,A GET CURRENT BYTE COUNT 03AE 1147 03B6 1273 JEQ A,RKB10  GO IF BUFFER EMPTY 1274 * 03AF C2AC 03DC 1275 COPY RWMODE,Q GET READ/WRITE MODE 03B0 5152 03C3 1276 JEQ Q,RKB20 IF READ, GET NEXT BYTE 03B1 8440 0000 1277 COPY A,0(Y) SET PROMPT BYTE COUNT 1278 * 1279 * THIS IS TEMP UNTIL READ WITH PROMPT WORKS  1280 * 03B2 C2AB 03DE 1281 COPY WRWPFC,Q GET WRITE PROMPT FUNCTION CODE 03B3 6B01 1282 ADD =1,Y Y=OUTBUF 03B4 BEAB 03E0 1283 JST DOIO WRITE PROMPT 03B5 6AFF 1284  SUB =1,Y Y=INBUF 1285 * 000003B6 1286 RKB10 EQU $ 03B6 0950 1287  COPY =INSIZE,A INPUT BUFFER SIZE 03B7 C2A5 03DD 1288 COPY REFAFC,Q FORMATTED ASCII READ FUNCTION CODE 03B8 A2E7 0420 1289 COPY TVLUN,X GET TV LUN 03B9 BEA6 03E0 1290 JST DOIO  A=BCT, Q=FC, X=LUN, Y=BUF 03BA 090D 1291 COPY =CR,A END OF LINE 03BB 0E25 1292 SBIT 2,S BYTEMODE 03BC 84C0 0000 1293 COPYB A,0(X,Y) PUT CR AT END OF INPUT 03BD 0E27 1294 RBIT 2,S WORDMODE 03BE 2B01 1295 ADD =1,X NEW ACTUAL COUNT 03BF A699 03D9 1296 COPY X,BCOUNT SET BUFFER COUNT 1PAGE 0049 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:26.25 . 03C0 0900 1297 COPY =0,A 03C1 869A 03DC 1298 COPY A,RWMODE SET MODE TO READ 03C2 8695 03D8 1299 COPY A,BINDEX RESET BUFFER INDEX 1300 * 000003C3 1301 RKB20 EQU $ GET NEXT BYTE FROM INPUT BUFFER 03C3 A294 03D8 1302 COPY  BINDEX,X GET BUFFER INDEX 03C4 0E25 1303 SBIT 2,S BYTEMODE 03C5 80C0 0000 1304  COPYB 0(X,Y),A GET NEXT BYTE 03C6 0E27 1305 RBIT 2,S WORDMODE 03C7 DE90 03D8 1306 2  IMS BINDEX 03C8 C290 03D9 1307 COPY BCOUNT,Q DECREMENT BCOUNT 03C9 4AFF 1308 SUB =1,Q 03CA C68E 03D9 1309 COPY Q,BCOUNT 1310 * 03CB E28E 03DA 1311 COPY SAVEY,Y RESTORE Y 03CC 2060 1312 COPY Y,X RESTORE X 03CD 9F5A 03A8 1313 RTN  RKB 1314 * 03CE 0000 1315 IOB IOB: 'TV',RE: INPUT/OUTPUT BLOCK 03CE 5456 1315+  03CF 0000 1315+ 03D0 0000 1315+ 03D1 0000 1315+ 03D2 0000 1315+ 03D3 0000 1315+ 03D6 0000  1315+ 03D7 AB11 1315+ 03D8 0000 1316 BINDEX WORD 0 BUFFER INDEX 03D9 0000 1317 BCOUNT WORD 0 BUFFER BYTE COUNT 03DA 0000 1318 SAVEY WORD 0 SAVE Y HERE 03DB 0000  1319 SAVEQ WORD 0 SAVE Q HERE 03DC 0000 1320 RWMODE WORD 0 MODE, 0=READ, 1=WRITE 03DD 4001 1321 REFAFC WORD RE:%4++FA:++ER: READ, FORMATTED ASCII 03DE 4012 1322 WRWPFC WORD WR:%4+WP:+ER: WRITE PROMPT FORMATTED 03DF 4011 1323 WRFAFC WORD WR:%4++FA:++ER: WRITE, FORMATTED ASCII 1324 * 1PAGE 0050 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:28.25 .  1326 ****** 1327 * 1328 * -- DOIO -- DO THE INPUT OR OUTPUT TO CARTOS  1329 * 1330 * ENTER: A = REQUESTED BYTE COUNT 1331 * Q = FUNCTION CODE  1332 * X = LOGICAL UNIT 1333 * Y = BUFFER ADDRESS 1334 *  1335 * EXIT: X = ACTUAL COUNT 1336 * A,Q,Y NOT DESTROYED 1337 *  1338 ****** 1339 * 03E0 0E0D 1340 DOIO ENT 03E1 8670 03D2 1341 COPY A,IOB+IO:BCT BYTE COUNT 03E2 C66E 03D1 1342 COPY Q,IOB+IO:FC FUNCTION CODE 03E3 A66A 03CE 1343 COPY X,IOB+IO:LUN LOGICAL UNIT 03E4 E66E 03D3 1344 COPY Y,IOB+IO:BUF BUFFER ADDRESS 03E5 2784 1345 CEA IOB,X COMPUTE ADDRESS OF IOB 03E6 FFE7 03CE 03E7 1A36 1346 I:IO 0(X) DO THE I/O 03E8 0001 03E9 0000 1346+ 03EA 9E84 03EF 1347 ABNORMAL JMP IOERROR IF ERROR 03EB A268 03D4 1348 COPY IOB+IO:ACT,X RETURN ACTUAL 03EC C264 03D1 1349 COPY IOB+IO:FC,Q RESTORE Q 03ED 8264 03D2 1350  COPY IOB+IO:BCT,A RESTORE A 03EE 9F71 03E0 1351 RTN DOIO 1352 * 000003EF 1353 IOERROR EQU $ PROCESS I/O ERROR 03EF 8265 03D5 1354 COPY IOB+IO:ST,A GET I/O COMPLETION STATUS 03F0 124E 03FF 1355 JGT A,RESTART GO IF EOF 03F1 8EE2 0454 1356 SUB TIMOERR,A CHECK FOR TIMEOUT 03F2 114C 03FF 1357 JEQ A,RESTART YES, RESTART 03F3 C261 03D5 1358 COPY IOB+IO:ST,Q GET STATUS AGAIN 1PAGE 0051 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:23 9.25 . 03F4 D6DE 0453 1359 AND CMASK,Q MASK TO CLASS ONLY 03F5 0040 1360 COPY Q,A 03F6 8EDE 0455 1361 SUB TVCLASS,A CHECK FOR TV CLASS 03F7 1147 03FF 1362 JEQ A,RESTART  YES, RESTART 03F8 0040 1363 COPY Q,A 03F9 8EDC 0456 1364 SUB LPCLASS,A CHECK FOR LP CLASS 03FA 1144 03FF 1365 JEQ A,RESTART YES, RESTART 1366 * 1367 * IF ANY OTHER ERROR, GENERATE EXCEPTION 1368 * 03FB 8259 03D5 1369 COPY IOB+IO:ST,A GET ERROR STATUS 03FC 1A3E 1370 R:UEX ABNORMAL POINT TO ABNORMAL RETURN 03FD 0000 03FE 03EA 1370+  1371 * 000003FF 1372 RESTART EQU $ RESTART DEBUGC 03FF 6784 1373 CEA BASE,Y RESTORE Y 0400 FC05 0006 0401 2060 1374 COPY Y,X RESTORE X 0402 0900 1375  COPY =0,A 0403 8655 03D9 1376 COPY A,BCOUNT CLEAR BYTE COUNT 0404 8653 03D8 1377 COPY A,BINDEX AND INDEX 0405 9DC0 0000 1378 JMP *TDBG(X,Y) RESTART NEW COMMAND 1PAGE 0052 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:30.00 . 1380 *******  1381 * -- SHEX -- DO HEX FOLLOWED BY A SPACE 1382 ******* 0406 0E0D 1383 SHEX ENT 0407 BE83 040B 1384 JST HEX 0408 0920 1385 COPY =' ',A 0409 BE98 0422 1386 JST  TYP 040A 9F7B 0406 1387 RTN SHEX 1388 ****** 1389 * -- HEX --  1390 * TYPE 'A' AS 4 HEXADECIMAL DIGITS 1391 ****** 1392 * 040B 0E0D 1393 HEX ENT 040C 8692 041F 1394 COPY A,ASV SAVE 'A' 040D 0EB9 1395 SHIFT A,RO,12 IST DIGIT 040E BE87 0416 1396 JST CONV GO PRINT 040F 0E79 1397 SHIFT A,RO,8 2ND DIGIT 0410 BE85 0416 1398 JST CONV GO PRINT 0411 0E39 1399 SHIFT A,RO,4 3RD DIGIT 0412 BE83 0416 1400 JST CONV GO PRINT 0413 BE82 0416 1401 JST CONV GO PRINT 0414 0E17 1402 RBIT 1,S 0415 9F75 040B 1403 RTN HEX BACK TO CALLER 0416 0E0D 1404 CONV ENT 0417 180F 1405 AND =:F,A MASK IT OFF 0418 0AF6  1406 SUB =10,A CONVERT TO HEX 0419 13C1 041B 1407 JLT A,$+2 JMP IF 0 THRU 9 041A 0B07 1408 ADD =7,A ELSE MAKE A THRU F 041B 0B3A 1409 ADD ='9'+1,A ADD ASCII OFFSET 041C BE85 0422 1410 JST TYP TYPE DIGIT 041D 8281 041F 1411 COPY ASV,A  REFERESH 'A' 041E 9F77 0416 1412 RTN CONV LOOP 041F 0000 1413 ASV WORD 0  SAVE 'A' FOR HEX ROUTINE 1PAGE 0053 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:54 1:30.75 . 1415 * 1416 ***** 1417 * 1418 * -- TYP -- OUT PUT PRINT CONTROL ROUTINE 1419 * 'A' IS DESTROYED AT RETURN 1420 * 'Q', 'X', & 'Y' ARE NOT DESTROYED 1421 * 1422 ****** 00000420 1423 DBGC:TV EQU $ 0420 5456 1424 TVLUN WORD 'TV' 00000421 1425 DBGC:LP EQU $ 0421 4C50 1426 LPLUN WORD 'LP' 1427 * 0422 0E0D 1428 TYP ENT 0423 C637 03DB 1429 COPY Q,SAVEQ SAVE Q REG 0424 E635 03DA 1430 COPY Y,SAVEY SAVE Y REG 0425 2901 1431 COPY =1,X SET RWMODE TO WRITE AND 0426 B235 03DC 1432 EXCH X,RWMODE GET THE OLD MODE 0427 31C1 0429 1433 JNE  X,TYP10 GO IF IT WAS ALREADY WRITE MODE 0428 A630 03D9 1434 COPY X,BCOUNT IF IT WAS READ, CLEAR READ BUFFER 1435 * 00000429 1436 TYP10 EQU $ 0429 6784 1437 CEA OUTBUF,Y COMPUTE ADDRESS OF OUTPUT BUFFER 042A 00EF 051A 042B A22D 03D9 1438 COPY BCOUNT,X GET CURRENT BYTE COUNT 1439 * 042C 0C0D 1440 CLSN A,=CR END OF LINE? 042D 9E88 0436 1441  JMP TYP40 YES 042E 2D50 1442 CSK X,=OUTSIZE END OF OUTPUT BUFFER 042F 9E81 0431 1443  JMP $+2 NOT YET 0430 9E9E 044F 1444 JMP TYP50 YES, TRASH CHARACTER AND EXIT  1445 * 00000431 1446 TYP30 EQU $ STORE BYTE IN BUFFER 0431 0E25 1447  SBIT 2,S BYTEMODE 0432 84C0 0000 1448 COPY A,0(X,Y) PUT BYTE 0433 0E27 1449  RBIT 2,S WORDMODE 1PAGE 0054 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:31.50 . 0434 DE24 03D9 1450 IMS BCOUNT BUMP BYTE COUNT 0435 9E99 044F 1451 JMP TYP50 DONE 1452 * 00000436 1453 TYP40 EQU $ WRITE THE BUFFER 0436 8222 03D9 1454 COPY BCOUNT,A BYTE COUNT 0437 C227 03DF 1455 COPY WRFAFC,Q WRITE, FORMATTED ASCII FUNCTION CODE 1456 * 0438 2788 1457 COPYE CMND,X GET COMMAND 0439 FCED 0127 043A 2C4C 1458 CLSN X,='L' IF NOT L, S, OR Z COMMAND 043B 9E85 0441 1459 JMP TYPOPT 043C 2C53 1460 CLSN X,='S' 043D 9E83 0441 1461 JMP TYPOPT 043E 2C5A 1462 CLSN X,='Z' 043F 9E81 0441 1463 JMP TYPOPT 0440 9E8A 044B 1464 JMP TVONLY THEN WRITE TO TV ONLY 1465 * 00000441 1466 TYPOPT EQU $ CHECK OUTPUT OPTIONS 0441 A295 0457 1467 COPY DIOFLG,X GET OUTPUT FLAG 0442 2C54 1468 CLSN X,='T' TV ONLY 0443 9E87 044B 1469 JMP TVONLY 0444 2C50 1470 CLSN X,='P' LP ONLY 0445 9E82 0448 1471 5  JMP LPONLY 1472 * 0446 A259 0420 1473 COPY TVLUN,X GET TV LUN 0447 BE18 03E0 1474 JST DOIO WRITE TO TV, A=BCT, Q=FC, X=LUN, Y=BUF 1475 * 00000448 1476 LPONLY EQU $ 0448 A258 0421 1477 COPY LPLUN,X GET LP LUN 0449 BE16 03E0 1478 JST DOIO WRITE TO LP, A=BCT, Q=FC, X=LUN, Y=BUF 044A 9E82 044D 1479 JMP TYP45 1480 * 0000044B 1481 TVONLY EQU $ 044B A254 0420 1482 COPY TVLUN,X GET TV LUN 044C BE13 03E0 1483  JST DOIO WRITE TO TV, A=BCT, Q=FC, X=LUN, Y=BUF 1484 * 1PAGE 0055 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:32.25 . 0000044D 1485 TYP45 EQU $ 044D 0900  1486 COPY =0,A 044E 860A 03D9 1487 COPY A,BCOUNT CLEAR BYTE COUNT 1488  * 0000044F 1489 TYP50 EQU $ EXIT 044F E20A 03DA 1490 COPY SAVEY,Y RESTORE Y  0450 2060 1491 COPY Y,X RESTORE X 0451 C209 03DB 1492 COPY SAVEQ,Q RESTORE Q 0452 9F4F 0422 1493 RTN TYP 1494 * 1495 * MASKS FOR I/O ERROR HANDLING  1496 * 0453 FF80 1497 CMASK WORD :FF80 CLASS MASK WORD 0454 8003 1498 TIMOERR WORD X:IOTOUT TIME OUT ERROR 0455 8300 1499 TVCLASS WORD CMASK:TV+X:ERRORM 0456 8380 1500 LPCLASS WORD CMASK:LP+X:ERRORM 1501 * 1PAGE 0056 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:32.75 . 0457 0000 1503 DIOFLG WORD 0 OUTPUT OPTION KEEPER 0458 0000 1504 VALU WORD 0 PARMANENT PARM VALUE KEEPER 0459 0000 1505 LASTSN WORD 0 LAST SPECIAL TERMINATOR KEEPER 045A 0000 1506 TEST WORD 0 LAST TERMINATOR KEEPER 045B 0000 1507 INPTEM  WORD 0 1508 ****** 1509 * 1510 * -- INP -- INPUT A PARAMETER  1511 * 1512 * EXIT= 'Q' = 'VALU' = PARAMETER VALUE 1513 * 'TEST'= CURRENT TERMINATOR (, OR CR) 1514 * 'LASTSN' = NEXT TO LAST SPECIAL TERMINATOR (+-*X/)  1515 * 'A' = LAST TERMINATOR (, OR CR OR ;) 1516 ****** 045C 0E0D 1517 INP  ENT 045D 4900 1518 COPY =0,Q INITIALIZE 045E C679 0458 1519 COPY Q,VALU FINAL NEW VALUE KEEPER 045F C679 0459 1520 COPY Q,LASTSN SPECIAL TERMINATOR KEEPER (+-*X/) 0460 C679 045A 1521 COPY Q,TEST LAST TERMINATOR KEEPER (, OR CR) 0461 C5D9 0019 1522 COPY Q,*TPFLG(X,Y) PARAMETER RECIEVED FLAG 0462 C678 045B 1523 COPY Q,INPTEM WORKING PARAMETER VALUE 0463 BDCE 000E 1524 INPP1 JST *TRKB(X,Y) GET A CHARACTER 0464 0C52 1525 CLSN ='R',A USER HARDWARE REGISTER? 04656  9EBE 04A4 1526 JMP INPP4 0466 0C20 1527 CLSN =BLANK,A BLANK CHAR? 0467 9EC9 04B1 1528 JMP INPP9 0468 0C47 1529 CLSN ='G',A G-REGISTER? 0469 9EB3 049D 1530 JMP INPP3 PROCESS GENERAL REGISTER 046A 0C2C 1531 CLSN =',',A , 046B 9E98 0484 1532  JMP INPP5 PROCESS 046C 0C3B 1533 CLSN =';',A ; / 046D 9E96 0484 1534 JMP INPP5 PROCESS / 046E 0C2B 1535 CLSN ='+',A + 046F 9E94 0484 1536 JMP INPP5 PROCESS 0470 0C2D 1537 CLSN ='-',A  - 0471 9E92 0484 1538 JMP INPP5 PROCESS 1PAGE 0057 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:33.75 . 0472 0C0D 1539 CLSN =CR,A VALID TERMINATOR 0473 9E90 0484 1540 JMP INPP5 0474 0C2A 1541 CLSN ='*',A * - GO PROCESS 0475 9E8E 0484 1542 JMP INPP5 0476 0C2F 1543 CLSN ='/',A / 0477 9E8C 0484 1544 JMP INPP5 0478 0C58 1545 CLSN ='X',A X 0479 9E8A 0484 1546 JMP INPP5 047A BEED 04E8 1547 JST CHK 047B 925F 045B 1548 EXCH A,INPTEM BUILD HEX VALUE 047C 0E31 1549  SHIFT A,LO,4 SHIFT 4 LEFT 047D 8A5D 045B 1550 INPP2 ADD INPTEM,A ADD VALUE 047E 865C 045B 1551  COPY A,INPTEM SAVE CURRENT VALUE 047F DDD9 0019 1552 IMS *TPFLG(X,Y) PARAMETER ENTERED 0480 4900 1553 COPY =0,Q 0481 C657 0459 1554 COPY Q,LASTSN 0482 9E60 0463 1555 JMP  INPP1 0483 DDD9 0019 1556 IMS *TPFLG(X,Y) FLAG PARM RECEIVED 0484 0C0D 1557 INPP5 CLSN =CR,A 0485 9E81 0487 1558 JMP $+2 0486 8652 0459 1559 COPY A,LASTSN 0487 9252 045A 1560  EXCH A,TEST GET LAST SIGN (+-)& SAVE NEW 0488 C252 045B 1561 COPY INPTEM,Q GET CURRENT WORKING PARM VALUE 0489 0C2D 1562 CLSN ='-',A NEGATE? 048A 4041 1563 NEG Q,Q  YES, NEGATE THE VALUE 048B 0040 1564 COPY Q,A 048C 8A4B 0458 1565 ADD VALU,A ADD IN OLD VALUE 048D 864A 0458 1566 COPY A,VALU UPDATE PERMANENT VALUE 048E 4000 1567 COPY  A,Q SAVE IT ALSO 048F 0900 1568 COPY =0,A 0490 864A 045B 1569 COPY A,INPTEM  NO CURRENT VALUE 0491 8248 045A 1570 COPY TEST,A GET CURRENT TERMINATOR 0492 0C2B 1571  CLSN ='+',A IS IT PLUS? 0493 9E4F 0463 1572 JMP INPP1 YES,GO GET MORE WORD 0494 0C2D  1573 CLSN ='-',A MAY BE IT IS MINUS 0495 9E4D 0463 1574 JMP INPP1 YES,GET MORE WORD 1PAGE 0058 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:34.75 . 0496 0C2A 7  1575 CLSN ='*',A IF IT IS * OR 0497 9E93 04AB 1576 JMP INPP8 0498 0C2F 1577  CLSN ='/',A / OR 0499 9E91 04AB 1578 JMP INPP8 049A 0C58 1579 CLSN ='X',A X THEN NEXT MUST BE CR 049B 9E8F 04AB 1580 JMP INPP8 049C 9F3F 045C 1581 RTN INP  END OF EXPRESSION, RETURN 1582 * EVALUATE G-REGISTERS 049D BDCE 000E 1583 INPP3 JST *TRKB(X,Y) GET G-REGISTER NUMBER 049E BEB7 04D6 1584 JST CHKG DEVELOP G REGISTER INDEX 049F 2002  1585 ADD A,X ADD BASE ADD TO INDEX 04A0 AA96 04B7 1586 ADD GBASE,X ADD G:0-BASE OFFSET 04A1 8080 0000 1587 COPY 0(X),A GET REGISTER VALUE 04A2 2060 1588 COPY Y,X  REFRESH 'X' TO BASE ADD 04A3 9E59 047D 1589 JMP INPP2 1590 * 1591 * EVALUATE HARDWARE R-REGISTERS 04A4 BDCE 000E 1592 INPP4 JST *TRKB(X,Y) GET R-REG NUMBER 04A5 BE93 04B9 1593 JST CHKR 04A6 2042 1594 ADD Q,X ADD BASE 04A7 AA90 04B8 1595 ADD  ABASE,X ADD AR-BASE OFSET 04A8 8080 0000 1596 COPY 0(X),A GET REGISTER VALUE 04A9 2060 1597 COPY Y,X REFRESH 'X' TO BASE ADD 04AA 9E52 047D 1598 JMP INPP2 04AB 862D 0459 1599 INPP8 COPY A,LASTSN 04AC BDCE 000E 1600 JST *TRKB(X,Y) READ LAST CHARECTER(MUST BE CR) 04AD 862C 045A 1601 COPY A,TEST CR 04AE 0C0D 1602 CLSN =CR,A AFTER SPECIAL TERMINATOR, IT 04AF 9F2C 045C 1603 RTN INP MUST BE CR ELSE ERROR 04B0 9DC1 0001 1604 JMP *TERROR(X,Y) ERROR 04B1 092B 1605 INPP9 COPY ='+',A 04B2 8626 0459 1606 COPY A,LASTSN MAP BLANK TO + 04B3 BDCE 000E 1607 JST *TRKB(X,Y) READ LAST CHA(MUST BE CR) 04B4 0C0D 1608 CLSN =CR,A 04B5 9E4E 0484 1609 JMP INPP5 DO ALL ADJUSTMENT 04B6 9DC1 0001 1610 JMP *TERROR(X,Y) AFTER BLANK CR MUST BE LAST CHAR 1PAGE 0059 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:35.75 . 04B7 0085 1611 GBASE WORD G0-BASE ABS OFFSET OF GENERAL REG FROM BASE 04B8 007D 1612 ABASE WORD EXIT-BASE 1PAGE 0060 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:35.75 . 1614 ****** 1615 * 1616 * -- CHKR -- 1617 * 1618 * CALCULATES INDEX OF THE USER REGISTER 1619 * ENTER: 1620 * 'A' = REGISTER 1621 * EXIT: 'Q' = INDEX 1622 * 1623 ****** 04B9 0E0D 1624 CHKR ENT 04BA 869B 04D6 1625 COPY A,CHKG SAVE 'A'=REG NAME 04BB AA8F 04CB 1626 ADD CHARAD,X GET CHAR TABLE PTR 04BC 4900 1627 COPY =0,Q 000004BD 16288  CHKR1 EQU $ 04BD 8080 0000 1629 COPY 0(X),A GET A CHARACTER 04BE BA97 04D6 1630 CSK A,CHKG COMPARE WITH REG NAME 04BF 0000 1631 NOP 04C0 9E81 04C2 1632 JMP $+2 04C1 9E85 04C7 1633 JMP CHKR2 GOT IT 04C2 2B01 1634 ADD =1,X NEXT CHARACTER INDEX 04C3 4B01 1635 ADD =1,Q INCREMENT INDEX 04C4 4C0A 1636 CLSN =CTABLN,Q  EVER FOUND? 04C5 9E83 04C9 1637 JMP CHKRER 04C6 9E76 04BD 1638 JMP CHKR1 LOOP  000004C7 1639 CHKR2 EQU $ 04C7 2060 1640 COPY Y,X REFERESH 'X' 04C8 9F70 04B9 1641  RTN CHKR GO BACK TO CALLER 04C9 2060 1642 CHKRER COPY Y,X 04CA 9DC1 0001 1643 JMP *TERROR(X,Y) ILLEGAL REGISTER 04CB 04C6 1644 CHARAD WORD CTABL-BASE 04CC 0050 1645 CTABL WORD 'P','A','Q','X','Y' 04CD 0041 04CE 0051 04CF 0058 04D0 0059 1PAGE 0061 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:36.50 . 04D1 004B 1646 WORD 'K','L','S','D','C' 04D2 004C 04D3 0053 04D4 0044 04D5 0043 0000000A 1647 CTABLN EQU $-CTABL 1PAGE 0062 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:36.75 . 1649 ****** 1650 * 1651 * -- CHKG -- 1652 * DEVELOP G-REGISTER INDEX 1653 * ENTER 'A' = ASCII DIGIT 1654 * EXIT 'A' = INDEX 1655 * 1656 ****** 04D6 0E0D 1657 CHKG ENT 04D7 0D5A 1658 CSK A,='Z' >Z? 04D8 9E81 04DA 1659 JMP $+2 NO 04D9 9DC1 0001 1660 JMP *TERROR(X,Y) NOT 0-9, A-Z ERROR 04DA 0D41 1661 CSK A,='A' 04DB 9E84 04E0 1662 JMP CHKG1A NOT A-Z, MAY BE 0-9 04DC 0000 1663 NOP 04DD 181F 1664 AND =:001F,A MASK OUT UNDESIRED BITS 04DE 0B09 1665 ADD =9,A +9 FOR 10 THRU 36 VALUE OF A-Z 04DF 9E87 04E7 1666 JMP CHKG2A GOT INDEX, GET OUT NOW 04E0 0D39 1667 CHKG1A CSK A,='9' 9 OR LESS? 04E1 9E81 04E3 1668 JMP $+2 YES 04E2 9DC1 0001 1669 JMP  *TERROR(X,Y) NOT 0-9, ILLEGAL DIGIT 04E3 0D30 1670 CSK A,='0' 04E4 9DC1 0001 1671 JMP  *TERROR(X,Y) NOT 0-9, ILLEGAL DIGIT 04E5 0000 1672 NOP 04E6 180F 1673 AND =:000F,A  MASK OUT UNDESIRED DIGIT 04E7 9F6E 04D6 1674 CHKG2A RTN CHKG GOT IT, BACK TO CALLER 1PAGE 0063 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:37.25 . 1676 ******  1677 * 1678 * -- CHK -- 1679 * CONVERT ASCII CHARACTER (0-9,A-F)ONLY) TO HEX, IF NOT IN 1680 * RANGE OF HEX,GO TO ERROR ROUTINE FOR ILLEGAL CHARACTER 1681 * EN9 TER 'A' = ASCII CHARACTER 1682 * EXIT 'A' = HEX DIGIT 1683 * 1684 ****** 04E8 0E0D 1685 CHK ENT 04E9 0AC6 1686 SUB ='9'+1,A TEST FOR DECIMAL DIGIT 04EA 1343 04EE 1687 JGE A,CHK2 NOT DECIMAL DIGIT 04EB 0B0A 1688 ADD =10,A GOT DECIMAL 04EC 1346 04F3 1689 JGE A,CHK3 04ED 9DC1 0001 1690 CHK1 JMP *TERROR(X,Y) NOT A NEXADECIMAL DIGIT 04EE 0AF3 1691 CHK2 SUB =13,A -13 04EF 133D 04ED 1692 JGE A,CHK1 NOT A THRU F 04F0 0B06 1693 ADD =6,A +6 04F1 13BB 04ED 1694 JLT A,CHK1 NOT A THRU F 04F2 0B0A 1695 ADD =10,A +10 FOR VALUES 10 THRU 15 04F3 9F74 04E8 1696 CHK3 JMP *CHK  BACK TO CALLER 1PAGE 0064 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:37.75 .  1698 ******* 1699 * -- Z -- 1700 * PARM 1 - HEAD LINK WORD ADDRESS 1701 * PARM 2 - # OF WORDS PER LINK LIST 1702 * PARM 3 - LINK OFFSET  1703 * LINK WORD POINTS TO THE NEXT LINK WORD, SO START OF THE NEXT 1704 * LINK LIST WILL BE LINK WORD-LINK OFFSET(3RD PARM). 1705 * 1706 ******* 000004F4 1707 ZTRING EQU  $ 04F4 0C2C 1708 CLSN =',',A 2ND PARM? # OF WORDS/LINK 04F5 9E81 04F7 1709 JMP  $+2 04F6 9E88 04FF 1710 JMP ZT1 NO, USE LAST VALUES 04F7 BDD2 0012 1711 JST *TINP(X,Y) YES, GET 2ND PARM 04F8 C69D 0516 1712 COPY Q,ZP1 SAVE # OF WORDS/LINK 04F9 0C2C 1713  CLSN =',',A 3RD PARM? LINK OFFSET 04FA 9E81 04FC 1714 JMP $+2 04FB 9E83 04FF 1715 JMP ZT1 NO, USE LAST VALUE 04FC BDD2 0012 1716 JST *TINP(X,Y) GET 3RD PARM-LINK OFFSET 04FD C699 0517 1717 COPY Q,ZP2 SAVE LINK OFFSET 04FE BDC7 0007 1718 JST *TCOMMA(X,Y) ERROR IF , IS TERMINATOR 04FF BDCD 000D 1719 ZT1 JST *TCRLF(X,Y) NEW LINE 0500 C295 0516 1720 COPY ZP1,Q  GET # OF WORDS/LINK 0501 81DA 001A 1721 COPY *TADDR(X,Y),A GET HEAD LINK WORD ADDRESS 0502 8692 0515 1722 COPY A,ZP0 SAVE START ADDRESS 0503 8391 0515 1723 ZT2 COPY *ZP0,A GET A LINKED WORD 0504 BDD6 0016 1724 JST *TSHEX(X,Y) PRINT IT 0505 DE8F 0515 1725 IMS ZP0 NEXT WORD 0506 4AFF 1726 SUB =1,Q DECREMENT WORD COUNT 0507 51BB 0503 1727 JNE Q,ZT2  NOT DONE YET? 0508 828C 0515 1728 COPY ZP0,A 0509 8E8C 0516 1729 SUB ZP1,A BACK TO BEGINING 050A 8A8C 0517 1730 ADD ZP2,A + LINK OFFSET 050B 2000 1731 COPY A,X 050C 8080 0000 1732 COPY 0(X),A 050D 2060 1733 COPY Y,X REFERESH 'X' 1PAGE 0065 MAC: RO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:38.75 . 050E 85DA 001A 1734 COPY A,*TADDR(X,Y) NEW LINK LIST ADDRESS 050F 11AF 04FF 1735 JNE A,ZT1 START AGAIN 0510 81E4 0024 1736 COPY *TDIOFG(X,Y),A GET OUTPUT FLAG 0511 0C54 1737 CLSN ='T',A TTY OUTPUT 0512 9E81 0514 1738 JMP $+2 0513 BDCD 000D 1739 JST *TCRLF(X,Y) DO EXTRA CRLF 0514 9DC0 0000 1740  JMP *TDBG(X,Y) ALL DONE 1741 * 0515 0000 1742 ZP0 WORD 0 LINK ADDRESS KEEPER 0516 000A 1743 ZP1 WORD :A # OF WORDS/LINK KEEPER 0517 0000 1744 ZP2 WORD  0 LINK OFFSET KEEPER 0518 9DC1 0001 1745 ZERROR JMP *TERROR(X,Y) # OF WORDS < 1 1PAGE 0066 MACRO (F002) CARTOS USER DEBUG - DEBUGC.ASM - 84-94400-20 (A100) 1982/04/22 14:51:39.25 . 1747 * 1748 * INPUT AND OUTPUT BUFFERS 1749 * 0519 1750 INBUF RES 1 INPUT BUFFER 051A 1751 OUTBUF RES 40 OUTPUT BUFFER 00000050 1752 INSIZE EQU $-INBUF-1*2 00000050 1753 OUTSIZE EQU $-OUTBUF*2 0542 0543 0544 1754 TAIL END 0000 ERRORS (0000/0000) 0000 WARNINGS (0000/0000) .ASM - 84-94400-20 (A100) 1982/04/22 14:51:39.25 . 1747 * IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII; IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII< IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII= IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII> IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII? IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIA IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIB IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIC IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIID IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIE IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIF IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIH IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIK IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIL IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII