TITLE SIMFCL PROGRAM TO MEASURE THE EXCERCISE OF LOCATIONS OF FCL331.MAC SUBTTL PARAMETERS, DEFINITIONS AND INITIALIZATION. ;A CODE TABLE IS FILLED WITH JSR INSTRUCTIONS. ;THAT TABLE IS THEN USED FOR THE SIMULATION, BY EXECUTING EACH JSR ;IN TURN. ;THE JSR IS REPLACED BY REAL CODE IF: ; 1. THE CODE IS FETCHED, AND ; 2. THE INSTRUCTION IS NOT A PC-SENSITIVE ONE, AND ; 3. IT DOES NOT REFERENCE A VARIABLE HIGH SEGMENT LOCATION. ;THE JSR IS REPLACED BY A SIMULATION INSTRUCTION IF: ; 1. THE ABOVE CONDITIONS HOLD, AND ; 2. IT IS A LUUO OR A JUMP INSTRUCTION. CA==13 ;CUSTOMER ACCUMULATOR. DEFINE HALT (A) < JRST [ OUTSTR [ASCIZ " ?A "] JRST 4,. ] >;END DEFINE HALT (A) BTYPE==1B1 ;THIS IS A BYTE INSTRUCTION OR XCT. STYPE==1B2 ;TTCALL ONLY. MTYPE==1B3 ;THIS INSTRUCTION WILL REFERENCE MEMORY. DTYPE==1B4 ;THIS INSTRUCTION WILL REFERENCE MEM+1 LTYPE==1B5 ;THIS INSTRUCTION HAS A 4-WORD ARGUMENT BLOCK. JTYPE==1B6 ;THIS INSTRUCTION MAY JUMP. PTYPE==1B7 ;THIS INSTRUCTION IS PC-SENSITIVE. ILLTYPE==1B8 ;ILLEGAL INSTRUCTION IF EFFECTIVE ADDRESS IS IN HISEG. COD: BLOCK 4000 ;THE JSR TABLE. USE: BLOCK 4000 ;BIT TABLE OF USAGE.; AN IMAGE OF 400000-404000. OPTAB: ;TABLE OF BITS ILLUSTRATING OP CODES. REPEAT 40, ;LUUO'S MTYPE ;CALL PTYPE!ILLTYPE ;INIT NOTE: THIS IS IMPERFECT! REPEAT 5, ;UUO'S 42-46 ILLTYPE ;CALLI NOTE: THIS IS IMPERFECT! MTYPE!DTYPE!ILLTYPE ;OPEN NOTE: THIS IS IMPERFECT! STYPE ;TTCALL REPEAT 3, ;UUO'S 52-54 MTYPE!DTYPE!LTYPE ;RENAME ILLTYPE ;IN ILLTYPE ;OUT Z ;SETSTS Z ;STATO MTYPE ;GETSTS Z ;STATZ Z ;INBUF Z ;OUTBUF ILLTYPE ;INPUT ILLTYPE ;OUTPUT Z ;CLOSE Z ;RELEASE Z ;MTAPE MTYPE!ILLTYPE ;UGETF Z ;USETI Z ;USETO MTYPE!DTYPE!LTYPE ;LOOKUP MTYPE!DTYPE!LTYPE ;ENTER ILLTYPE ;UJEN REPEAT 7, ;UNDEFINED UUO'S. REPEAT 4, ;DFAD ETC REPEAT 4, ;UNDEFINED DTYPE!MTYPE ;DMOVE DTYPE!MTYPE ;DMOVN MTYPE ;FIX ILLTYP DTYPE!MTYPE DTYPE!MTYPE REPEAT 4, ;FIXR ETC Z MTYPE ;IBP REPEAT 4, ;BYTE POINTERS REPEAT 4,< REPEAT 5, Z MTYPE MTYPE >;END REPEAT 4 ;FLOATING POINT. REPEAT 8,< MTYPE Z MTYPE MTYPE >;END REPEAT 8 ;MOVES, FIXED POINT MUL,DIV. Z Z Z JTYPE Z Z Z ILLTYPE MTYPE ;EXCH ILLTYPE!MTYPE ;BLT JTYPE JTYPE JTYPE JTYPE BTYPE!MTYPE ;XCT ILLTYPE ;MAP JTYPE!PTYPE ;PUSHJ MTYPE MTYPE Z REPEAT 3, ;JSR,JSP,JSA JTYPE REPEAT 2,< MTYPE Z MTYPE MTYPE >;END REPEAT 2 ;ADD,SUB REPEAT 8, REPEAT 8, REPEAT 3,< REPEAT 8, REPEAT 8, >;END REPEAT 3 ;JUMP,SKIP,AOJ,AOS,SOJ,SOS REPEAT 3,< Z Z MTYPE MTYPE REPEAT 4,< MTYPE Z MTYPE MTYPE >;END REPEAT 4 ;AND,ANDCA,SETM,ANDCM >;END REPEAT 3 ;RIGHT UP TO ORCBB Z Z MTYPE MTYPE REPEAT 20,< MTYPE Z MTYPE MTYPE >;END REPEAT 20 ;HALF WORDS. REPEAT 4,< REPEAT 8, REPEAT 8, >;END REPEAT 4 ;TEST INSTRUCTIONS. REPEAT 100, TTCTAB: ;TABLE OF BITS FOR TTCALL UUO. REPEAT 3, ;INCHRW,OUTCHR,INCHRS STYPE!MTYPE ;OUTSTR REPEAT 4, ;INCHWL,INCHSL,GETLCH,SETLCH REPEAT 5, ;RESCAN,CLRBFI,CLRBFO,SKPINC,SKPINL MTYPE ;IONEOU REPEAT 2, ;RESERVED FOR EXPANSION. BEGIN: RESET MOVE CA,41 ;MODIFY THE UUO TRAP LOCATION. SUBI CA,400000 ADDI CA,COD ;GO TO THE SIMULATED HANDLER. MOVEM CA,41 MOVEI CA,STRP.H ;PRE-SET TO HANDLE OUR OWN TRAPS. MOVEM CA,.JBAPR## MOVE CA,[JSR DECODE] MOVEM CA,COD ;SET TO FILL SIMULATION SPACE WITH TRAPS. MOVE CA,[XWD COD,COD+1] BLT CA,COD+3777 ;FILL HIGH SEGMENT WITH TRAPS. SKIPA CA,.+1 ;PICK UP ENTRY TO SIMULATOR JRST COD+10 ;CORRESPONDS TO ONCE IMAGE. MOVEM CA,FNEWEX## ;GO THERE WHEN DONE FNEWGO. JRST FNEWGO## ;GO AND FIND FOCAL.SHR ;ROUTINE TO RETURN EITHER: ;1. THE NUMBER OF REFERENCES IN THE USAGE TABLE [FNEW(-1)], OR ;2. THE POSSIBLE SCORE, [CALLED BY FNEW(0)], OR ;3. THE RELATIVE LOCATION OF THE NEXT UNREFERENCED LOCATION AFTER ; THE ONE GIVEN BY THE ARGUMENT [POSITIVE ARGUMENT]. FNEW:: HLRZ 0,400000+.JBHRN## ;GET SIZE OF HIGH SEGMENT. SUBI 0,10 ;SUBTRACT VESTIGIAL JOB DATA AREA. SKIPN 1,@0(16) ;WAS THE ARGUMENT ZERO? JRST FNEW2 ;YES. JUMPL 1,FNEW1 ;REQUIRE NEXT RELATIVE LOCATION? FIXR 1,1 ;OBTAIN FIXED-POINT ANSWER. ANDI 1,7777 ;YES. RESTRICT ARGUMENT TO 4K WORDS. SKIPGE USE+1(1) ;HAS THE NEXT LOCATION BEEN REFERENCED? AOJA 1,.-1 ;YES. MOVE 0,1 AOJA 0,FNEW2 ;POINT TO THE NEXT RELATIVE LOCATION. FNEW1: MOVE 1,[-4000,,USE] SETZM 0 ;COUNT IN HERE. SKIPE (1) AOS 0 AOBJN 1,.-2 FNEW2: FSC 0,233 ;FLOAT THE ANSWER. SETZM 1 ;MAKE IT DOUBLE-PRECISION. POPJ 17, ;RETURN. SUBTTL INSTRUCTION SIMULATOR SECTION 1: EFFECTIVE ADDRESS CALCULATION. DECODE: 0 ;COME HERE FROM SIMULATION SPACE. MOVE CA,DECODE ;SAVE PC OF TRAP. SUBI CA,COD ADDI CA,400000 ;POINT TO THE HIGH SEGMENT. MOVEM CA,SIMPC1 ;SAVE THE SIMULATION OF THE PC. MOVEM CA,SIMPC SOS CA,SIMPC ;POINT TO THE INSTRUCTION BEING SIMULATED. SOS USE-400000(CA) ;MARK THE USAGE. MOVE CA,@SIMPC ;GET THE INSTRUCTION BEING SIMULATED. MOVEM CA,LASTEF ;SAVE FOR JRSTF FLAGS. TLZ CA,777740 ;CLEAR SPACE FOR THE TYPE BITS. MOVEM CA,EFFADD ;SAVE FOR THE EFFECTIVE ADDRESS CALCULATION. LDB CA,PSIMOP ;GET OP CODE. HLLZ CA,OPTAB(CA) ;GET NATURE OF THE OPCODE. IORB CA,EFFADD ;GET EFFECTIVE ADDRESS IN CA. SETZM VARIAB ;MARK EFFECTIVE ADDRESS FIXED. MOREFF: LDB CA,[POINT 4,EFFADD,17] ;GET INDEX FIELD. JUMPE CA,EFF1 ;SKIP ALL THIS IF NO INDEX FIELD. HLLOS VARIAB ;MARK VARIABLE EFFECTIVE ADDRESS. HRR CA,(CA) ;GET CONTENTS OF INDEX REGISTER. ADD CA,EFFADD ;COMPUTE EFFECTIVE ADDRESS. HRRM CA,EFFADD ;SAVE RESULT. EFF1: MOVE CA,EFFADD TLZ CA,17 ;CLEAR INDEX FIELD. TLZN CA,20 ;INDIRECT BIT ON? TLZE CA,(BTYPE) ;NO. BYTE POINTER? SKIPA JRST MARK ;NO. COMPUTATION IS COMPLETE. MOVEM CA,EFFADD ;SAVE THE BTYPE BIT. TRNN CA,400000 ;YES. INDIRECT A HIGH SEGMENT ADDRESS? HLLOS VARIAB ;NO. THAT MEANS EFF ADD IS VARIABLE. TRNN CA,400000 ;YES. INDIRECT A HIGH SEGMENT ADDRESS? JRST EFF3 ;NO. SKIPE VARIAB ;IS EFF ADD VARIABLE? SETOM VARIAB ;YES. VARIABLE HIGH SEGMENT ADDRESS. SOS USE-400000(CA) ;MARK USAGE. EFF3: MOVE CA,(CA) ;GET NEW CODE. MOVEM CA,LASTEF ;SAVE FOR JRSTF FLAGS. DPB CA,[POINT 23,EFFADD,35] ;SAVE NEXT ADDRESS. JRST MOREFF ;LOOP FOR MORE EFFECTIVE ADDRESS CALCULATION. SUBTTL INSTRUCTION SIMULATOR SECTION 2: MARK THE DATA FETCH REFERENCES. ;AT THIS STAGE CA CONTAINS ... ;BIT 0 0 UNUSED ;BITS 2-8 STYPE,MTYPE,DTYPE,LTYPE,JTYPE,PTYPE,ILLTYPE ;BITS 9-12 0 UNUSED ;BITS 13-17 0 ;BITS 18-35 EFF ADD OF SIMULATED INSTR. OR BYTE PTR IF ANY. MARK: TLZN CA,(STYPE) ;TTCALL? JRST MARK2 ;NO. MOVEM CA,EFFADD ;STORE WITH ZERO I AND X FIELDS. LDB CA,PSOPAC ;GET OP CODE AND AC. HLLZ CA,TTCTAB-1220(CA) ;GET NEW NATURE. HRR CA,EFFADD ;PRESERVE ADDRESS. IORB CA,EFFADD ;SAVE IT. TLZE CA,(STYPE) ;OUTSTR? TRNN CA,400000 ;IS EFFECTIVE ADDRESS IN LO SEG? JRST MARK2 ;NO. HRLI CA,(POINT 7,,) ;MAKE A BYTE POINTER. MOVEM CA,BYTADD ;SAVE THE POINTER. MARK1: IBP BYTADD ;POINT TO NEXT BYTE. MOVE CA,BYTADD ;GET THE BYTE POINTER. SOS USE-400000(CA) ;FLAG THE REFERENCE. LDB CA,BYTADD ;GET THE NEXT BYTE. JUMPN CA,MARK1 ;LOOP UNTIL NUL BYTE. MOVE CA,EFFADD MARK2: MOVEM CA,EFFADD TRNN CA,400000 ;IS EFFECTIVE ADDRESS IN LO SEG? JRST CRESIM ;IGNORE MTYPE IF LO SEG EFFECTIVE ADDR. TLNE CA,(ILLTYPE) HALT ILLEGAL INSTRUCTION. TLNN CA,(MTYPE) ;WILL IT REFERENCE MEMORY? JRST CRESIM ;NO. SOS USE-400000(CA) ;MARK MEMORY REFERENCE. SKIPE VARIAB ;EFF ADD VARIABLE? SETOM VARIAB ;YES. AND REFERENCING HIGH SEGMENT. TLNE CA,(DTYPE) ;DOUBLE PRECISION? SOS USE-400000+1(CA) ;MARK E+1. TLNE CA,(LTYPE) ;LOOKUP ENTER OR RENAME? SOS USE-400000+2(CA) ;MARK E+2 TLNE CA,(LTYPE) ;LOOKUP ENTER OR RENAME? SOS USE-400000+3(CA) ;ASSUME SHORT LOOKUP. SUBTTL INSTRUCTION SIMULATOR SECTION 3: CREATE THE SIMULATION INSTRUCTION. CRESIM: MOVE CA,@SIMPC ;GET THE INSTRUCTION WE'RE SIMULATING. MOVEM CA,SIMINSTR ;SAVE AS INSTRUCTION TO BE EXECUTED. MOVE CA,EFFADD ;GET SOME FLAG BITS. TLNN CA,(JTYPE) ;IS THIS A JUMP INSTRUCTION? JRST CRSIM1 ;NO. ; LDB CA,PSOPAC ;PICK OP CODE AND AC OF SIMULATED INSTR. ; CAIN CA,_-27 ;IS IT JFCL 0? ; JRST CRSIM1 ;YES. ; MOVE CA,EFFADD ; TRZN CA,400000 ;JUMP TO LOW SEGMENT? ; HALT JUMP TO LOW SEGMENT. TRZE CA,400000 ;JUMP TO LOW SEGMENT? ADDI CA,COD HLL CA,SIMINSTR ;GET REST OF THE INSTRUCTION. TLZ CA,37 ;REMOVE H AND X FIELDS. MOVEM CA,SIMINSTR ;SAVE. SKIPE VARIAB ;JUMP TO VARIABLE ADDRESS? SETOM VARIAB ;YES. SIMULATE EVERY TIME. TLC CA,(JRSTF) ;CHECK AGAINST JRSTF. TLNE CA,777777 ;IS IT JRSTF? JRST CRSIM1 ;NO. HLL CA,LASTEF ;YES. GET FLAGS. JRSTF @CA ;RESTORE FLAGS AND JUMP. CRSIM1: TLNE CA,(MTYPE) ;IS THIS A MEMORY REFERENCE INSTRUCTION? TRNE CA,777600 ;YES. LOW SEGMENT JOB DATA AREA? JRST CRSIM3 ;NO. HRRZS CA ;GET THE ACTUAL MEMORY REFERENCE. CAIE CA,.JBREN## ;IS IT REFERENCING .JBREN? CAIN CA,.JBSA## ; OR .JBSA? JRST CRSIM2 ;YES. CAIE CA,.JBAPR## ;IS IT A SET-UP? JRST CRSIM3 ;NO. MOVEI CA,SIMAPR ;YES. MAKE IT USE A DIFFERENT LOCATION. DPB CA,PINS22 ;CHANGE THE SIMULATION IN ACCORDANCE. JRST CRSIM3 CRSIM2: ;HERE IF THE INSTRUCTION REFERENCES .JBSA OR .JBREN. MOVE CA,SIMINSTR ;GET THE INSTRUCTION. TLC CA,500000 ;CHECK IF IT'S A HALF-WORD INSTRUCTION TLNE CA,700000 ;IS IT? HALT NON-HALF-WORD INSTRUCTION REFERENCES .JBSA OR .JBREN TLNE CA,040000 ;IS IT STORING IN RIGHT HALF? TLNN CA,002000 ;IS IT STORING IN EFFECTIVE ADDRESS? JRST CRSIM3 ;NO. TLNN CA,004000 ;FROM RIGHT HALF? TLNE CA,001000 ;YES. M-MODE? HALT ILLEGAL STORE INTO .JBSA OR .JBREN LDB CA,PSIMAC ;O.K. GET THE SIMULATED ACCUMULATOR. HRL CA,(CA) ;GET THE DATA. JUMPGE CA,.-3 ;ENSURE WE KNOW WHAT WE'RE DOING. ADD CA,[XWD COD-400000,0] HLRM CA,(CA) ;STORE THE DATA. CRSIM3: LDB CA,PSIMOP ;GET THE OP CODE. CAIG CA,37 JRST XLUUO CAIN CA,_-33 JRST XCALLI CAIN CA,_-33 JRST XPUSHJ CAIN CA,_-33 JRST XPOPJ CAIN CA,_-33 JRST XJSP HLL CA,OPTAB(CA) ;GET NATURE OF OP CODE. TLNE CA,(BTYPE) ;IS IT A BYTE INSTRUCTION? SETOM VARIAB ;THERE IS ONE THAT SWITCHES EFF ADD FROM LO TO HI SEG. TLNN CA,(PTYPE) ;PC-SENSITIVE INSTRUCTION? JRST SIMUL ;NO. HALT SIMULATION FAILS ON UNEXPECTED PC-SENSITIVE INSTR. XLUUO: HLRO CA,@SIMPC ;GET THE INDIRECT BIT OF THE UUO ITSELF. TRNN CA,(@) ;IS THE INDIRECT BIT ON? SETZB CA,VARIAB ;NO. NO NEED TO CONTINUE SIMULATION. MOVE CA,SIMPC ;GET THE ADDRESS OF THE ACTUAL UUO. HRLI CA,(JRST) ;PREPARE TO EXECUTE THE UUO FROM THE HIGH SEG MOVEM CA,SIMINSTR JRST SIMUL XCALLI: HRRZ CA,EFFADD ;GET THE NUMBER OF THE CALLI. CAIG CA,115 ;IGNORE ALL CALLI'S LESS THAN TRMOP. JRST SIMUL LDB CA,PSIMAC ;GET THE SIMULATED INSTRUCTION'S AC. MOVE CA,(CA) ;GET THE CONTENTS OF THAT AC. TRZN CA,400000 ;DOES IT POINT TO THE HIGH SEGMENT? JRST SIMUL ;NO. TLC CA,777777 ;MAKE THE LENGTH NEGATIVE. SOS USE(CA) ;MARK A DATA REFERENCE. AOBJN CA,.-1 JRST SIMUL SUBTTL INSTRUCTION SIMULATOR SECTION 4: STORE THE SIMINSTR AND DO IT. SIMUL: SKIPGE VARIAB ;NO. VARIABLE HIGH SEGMENT REFERENCE? JRST SIMUL4 ;YES. CAREFUL SIMULATION NEEDED. SOS DECODE ;POINT TO THE SPOT IN CODE TABLE. MOVE CA,SIMINSTR ;YES. GET MODIFIED INSTRUCTION. MOVEM CA,@DECODE JRST @DECODE SIMUL4: XCT SIMINSTR JRST @DECODE ;THEN CONTINUE. AOS DECODE ;UNLESS THE INSTRUCTION SKIPPED. JRST @DECODE XPOPJ: HLRZ CA,SIMINSTR ;GET INSTR BEING SIMULATED. CAIE CA,(POPJ 17,) ;PRESUMABLY FOCAL ALWAYS USES 17. HALT POPJ WITH NON-STANDARD ARGUMENT. MOVE CA,[JRST DOPOPJ] MOVEM CA,SIMINSTRUCTION JRST SIMUL ;STORE A SHORT CUT. DOPOPJ: POP 17,CA ;REMOVE ONE FROM THE STACK. TRZE CA,400000 ;RELATIVE TO BEGINNING OF CODE. ADDI CA,COD ;SIMULATED CODE. JRST (CA) XPUSHJ: MOVE CA,SIMINSTR ;GET INSTR BEING SIMULATED. TLC CA,(^!) JRST XJRST XJSP: MOVE CA,SIMINSTR ;GET INSTR BEING SIMULATED. TLC CA,(^!) XJRST: TLZ CA,37 ;REMOVE I AND X FIELDS. HRRI CA,SIMPC1 ;POINT TO THE CURRENT SIMULATED PC. XCT CA JRST @SIMINSTRUCTION STRP.H: HRRE CA,.JBTPC## ;WHERE DID THE TRAP COME FROM? CAIG CA,COD+4000 ;ABOVE SIMULATED CODE? CAIG CA,COD ;NO. BELOW SIMULATED CODE? JRST STRPH1 ;YES. AVOID SIMULATION. SUBI CA,COD-400000 ;NO. PRETEND THAT WE DID. HRRM CA,.JBTPC## ;PUT A SIMULATION THERE. STRPH1: SKIPN CA,SIMAPR HALT A TRAP OCCURRED WITHOUT .JBAPR SET UP TRZE CA,400000 ;DID HE THINK IT WAS THE HIGH SEGMENT? ADDI CA,COD ;YES. THAT'S O.K. LET HIM THINK THAT. JRST @CA PINS22: POINT 23,SIMINS,35 ;COVER I X AND E FIELDS. PSIMOP: POINT 9,@SIMPC,8 ;THE OP CODE OF THE SIMULATED INSTRUCTION. PSIMAC: POINT 4,@SIMPC,12 ;THE AC OF THE SIMULATED INSTRUCTION. PSOPAC: POINT 13,@SIMPC,12 ;THE OP CODE AND AC OF THE SIMULATED INSTR. VARIAB: BLOCK 1 ;ZERO MEANS EFFECTIVE ADDRESS IS CONSTANT. LASTEF: BLOCK 1 ;THE LAST ADDRESS REFERENCED DURING EFF ADD CALC. EFFADD: BLOCK 1 ;BUILD EFFECTIVE ADDRESS OF THE SIMULATED INSTR. ;BITS 0-12 SHOW THE TYPE OF INSTRUCTION. BYTADD: BLOCK 1 ;TEMPORARY STORAGE. SIMAPR: BLOCK 1 ;PLACE TO SIMULATE CONTENTS OF .JBAPR ;NON-ZERO MEANS EFF ADD IS VARIABLE. ;NEGATIVE MEANS A VARIABLE HIGH SEG REFERENCE IS INVOLVED. SIMPC: BLOCK 1 ;POINT TO THE INSTRUCTION BEING SIMULATED. SIMPC1: BLOCK 1 ;POINT TO THE INSTRUCTION AFTER THE ONE BEING SIMULATED. SIMINS: BLOCK 1 ;MAKE THE INSTRUCTION WHICH WE SIMULATE. END BEGIN