FPE MACRO D1013 20-SEP-77 12:27 TABLE OF CONTENTS 1- 2 1. INTRODUCTION TO FPE 6- 245 1.1 MACRO CALLS AND DEFINITIONS 7- 290 1.2 SYMBOL DEFINITIONS 8- 316 2. INITIALIZATION CODE 9- 362 3. STATISTICS GATHERED 10- 420 4. SYSTEM RETURN CODE 11- 448 5. ISR TABLES 12- 470 6. START OF ISR ROUTINE 13- 562 7. SINGLE AND DOUBLE OPERAND ROUTINES 13- 563 7.1 ABSF,NEGF,LDFPS,TSTF,LDF,STFPS,STST,CLRF 14- 699 7.2 MULF 15- 845 7.3 MULD 16-1060 7.4 MODF,MODD 17-1230 7.5 SUBF,ADDF 18-1414 7.6 ADDD 19-1638 7.7 CMPF,STF,DIVF 20-1815 7.8 DIVD 21-1974 7.9 STEXP,STCFI 22-2113 7.10 STCFD,LDCDF,LDEXP,LDCIF 23-2328 8. GET ADDRESS OR NUMBERS FROM TASK FPE MACRO D1013 20-SEP-77 12:27 PAGE 1 1 .TITLE FPE 2 .SBTTL 1. INTRODUCTION TO FPE 3 ;+ 4 ; 5 ; F P E . . . 6 ; 7 ; PURPOSE: EMULATE FLOATING POINT HARDWARE ON PDP-11'S WITHOUT IT 8 ; 9 ; INTERFACE: DURING INITIALIZATION, THIS PROGRAM CONNECTS TO THE 10 ; ILLEGAL INSTRUCTION TRAP. ALL SUBSEQUENT ENTRIES TO 11 ; THIS EMULATOR ARE MADE VIA THAT TRAP. 12 ; 13 ; LANGUAGE: MACRO-11 14 ; 15 ; RESTRICTIONS: THIS VERSION RUNS UNDER RSX-11D ONLY 16 ; 17 ; REFERENCES: PDP11/45 PROCESSOR HANDBOOK, FP11 FLOATING-POINT 18 ; PROCESSOR MAINTENANCE MANUAL, RSX11-SIG 19 ; NEWSLETTER, VOL. 5, NO. 5, PAGE 74. 20 ; 21 ;- 22 ; REVISIONS: 23 ; 17-AUG-77 MARSHALL LONG WRITTEN 24 ;+ 25 ; 1.0.1 ABOUT FPE 26 ; 27 ; FPE CONSISTS OF THREE FAIRLY DISTINCT PARTS: 28 ; 29 ; (1) CODE TO STEAL/RETURN THE ILLEGAL INSTRUCTION TRAP 30 ; FROM THE SYSTEM.(SECTIONS 2. AND 4.) 31 ; THIS PART OF THE PROGRAM IS RESPONSIBLE FOR ROUTING THE 32 ; ILLEGAL INSTRUCTION TRAP TO FPE.IT IS NORMALLY EXECUTED 33 ; ONLY ONCE WHEN THE EMULATOR IS INSTALLED INTO THE 34 ; SYSTEM. WHEN FPE IS RUN, THIS CODE IS EXECUTED AND 35 ; THE EMULATOR SUSPENDS. ALL SUBSEQUENT ENTRIES TO 36 ; FPE ARE MADE VIA THE ILLEGAL INSTRUCTION TRAP 37 ; (VECTOR LOACTION 10). THE TRAP IS STOLEN FROM THE 38 ; SYSTEM BY FIRST MAKING IT SEEM LIKE THE VECTOR IS NOT 39 ; IN USE, THEN CONNECTING TO THE INTERRUPT.THE PROCEDURE 40 ; IS DESCRIBED IN DETAIL IN RSX11-SIG NEWSLETTER, 41 ; VOL. 5, NO. 5, PAGE 74. 42 ; IF FPE IS RESUMED, THE ILLEGAL INSTRUCTION TRAP IS 43 ; RETURNED TO THE SYSTEM AND FPE EXITS. TO REMOVE 44 ; THE EMULATOR FROM THE SYSTEM: 45 ; MCR>HEL [10,10] 46 ; MCR>RES FPE... 47 ; MCR>UNF FPE... 48 ; MCR>REM FPE... FPE MACRO D1013 20-SEP-77 12:27 PAGE 2 1. INTRODUCTION TO FPE 50 ; (2) CODE TO CRACK THE FLOATING POINT INSTRUCTIONS AND 51 ; FETCH THE NECESSARY OPERANDS.(SECTIONS 6. AND 8.) 52 ; AFTER FPE HAS BEEN RUN ONCE, AN ILLEGAL INSTRUCTION 53 ; CAUSES CONTROL TO BE TRANSFERRED TO FPE'S INTERRUPT 54 ; SERVICE ROUTINE (ISR). THE FAULTING INSTRUCTION AND 55 ; PROCESSOR MODE ARE EXAMINED. IF THE INSTRUCTION IS 56 ; NOT FLOATING POINT OR THE MODE IS NOT USER, THE TRAP 57 ; IS FORWORDED TO THE SYSTEM FOR USUAL PROCESSING. * 58 ; IF THE INSTRUCTION IS FLOATING POINT IN USER MODE, 59 ; THE EMULATOR DECIDES WHICH INSTRUCTION IT IS AND 60 ; JUMPS TO THE APPROPRIATE FLOATING POINT INSTRUCTION 61 ; ROUTINE. AFTER SOME INITIALIZATION, THE "GET" 62 ; SUBROUTINE IS CALLED WHICH FETCHES THE NECESSARY 63 ; OPERANDS. 64 ; * AN EXCEPTION TO THIS IS THE "STST" INSTRUCTION 65 ; WHICH MAY BE EXECUTED IN KERNEL MODE. 66 ; 67 ; (3) THE FLOATING POINT INSTRUCTION SUBROUTINES. 68 ; (SECTIONS 6. AND 7.) 69 ; THESE ROUTINES DO THE ACTUAL FLOATING POINT OPERATIONS. 70 ; EACH F.P. TASK HAS 25. WORDS IN ITS HEADER THAT ARE 71 ; NORMALLY USED AS A SAVE AREA FOR THE HARDWARE F.P. 72 ; REGISTERS AND STATUS WORD. (1 1-WORD F.P. STATUS AND 73 ; 6 4-WORD F.P. ACCUMULATORS). WHEN FLOATING POINT 74 ; HARDWARE IS PRESENT, THE REGISTERS AND STATUS ARE 75 ; SAVED UPON CONTEXT SWITCHING. THE EMULATOR HOWEVER, 76 ; USES EACH TASK'S F.P. SAVE AREA AS THAT TASK'S F.P. 77 ; ACCUMULATORS SO AT ALL TIMES, EACH F.P. TASK HAS ITS 78 ; OWN COMPLETE SET OF FLOATING POINT REGISTERS. 79 ; 80 ; 1.0.2 CONDITIONAL ASSEMBLY PARAMETERS 81 ; 82 ; THERE ARE THREE CONDITIONAL ASSEMBLY PARAMETERS IN SECTION 83 ; 1.2 OF FPE.MAC. THEY ARE AS FOLLOWS: 84 ; 85 ; (1) CHECKH -- DEFINING THIS SYMBOL ALLOWS THE EMULATOR TO 86 ; BE TESTED ON A MACHINE THAT HAS FLOATING POINT HARDWARE. 87 ; THIS IS DONE AT THE ASSEMBLY LANGUAGE LEVEL BY WRITING 88 ; TEST PROGRAMS THAT HAVE ACTUAL ILLEGAL INSTRUCTIONS 89 ; FOLLOWED BY FLOATING POINT INSTRUCTIONS. FOR EXAMPLE, 90 ; FPI=100 ; ILLEGAL INSTRUCTION 91 ; GO: FPI ; CAUSE TRAP TO FPE... 92 ; LDF NUM,F1 ; TEST LDF INSTRUCTION 93 ; FPI ; ANOTHER TRAP TO FPE... 94 ; STF F1,NUM ; TEST STF 95 ; BR GO ; PUT IN ODT BREAKPOINT HERE 96 ; NUM: 40200,177777 97 ; .END GO 98 ; TO PERFORM THE SAME OPERATIONS USING THE ACTUAL 99 ; HARDWARE,SIMPLY DEFINE FPI AS A NOP (FPI=240). 100 ; THIS FEATURE IS FOR CHECKOUT ONLY AND THEREFORE, CHECKH 101 ; IS NOT DEFINED IN THE WORKING VERSION. 102 ; FPE MACRO D1013 20-SEP-77 12:27 PAGE 3 1. INTRODUCTION TO FPE 104 ; (2) STAT -- DEFINING THIS SYMBOL WILL CAUSE FPE TO RECORD THE 105 ; NUMBER AND KIND OF FLOATING POINT INSTRUCTIONS EXECUTED 106 ; AS WELL AS INFORMATION ABOUT ADDRESSING MODES AND 107 ; FLOATING POINT EXCEPTION CONDITIONS. THIS IS DONE BY 108 ; SIMPLY INCREMENTING THE APPROPRIATE TWO WORD COUNTERS 109 ; FOR EACH INSTRUCTION EXECUTED.(THE FIRST WORD IS HIGH 110 ; ORDER). WHEN THIS OPTION IS INCLUDED, THE TWO-WORD 111 ; COUNTERS ARE LOCATED NEAR THE BEGINNING OF FPE. 112 ; TO EXAMINE THE STATISTICS GATHERED, THE OPEN COMMAND 113 ; IS USED: 114 ; MCR>HEL [10,10] 115 ; MCR>OPE 334/TASK=FPE... 116 ; 000334/XXXXXX (CARRIAGE RETURN) 117 ; 000336/YYYYYY (CARRIAGE RETURN) 118 ; . 119 ; . 120 ; . 121 ; . 122 ; 000650/ZZZZZZ (ALTMODE) 123 ; FOR THE MEANING OF EACH OF THE STATISTICS WORDS, REFER TO 124 ; SECTION 3. OF FPE.MAC. NOTICE THAT THE TASK ADDRESSES 125 ; DIFFER FROM THE LISTING ADDRESSES BY 100 OCTAL. (THIS 126 ; IS BECUASE OF FPE'S STACK AREA). 127 ; INCLUSION OF THIS FEATURE MAKES FPE OCCUPY MORE CORE AND 128 ; RUN SOMEWHAT SLOWER. THEREFORE, STAT IS NOT DEFINED IN 129 ; THE WORKING VERSION (NO STATISTICS GATHERED). 130 ; 131 ; (3) MODFHW -- DURING THE DEVELOPMENT OF FPE IT WAS 132 ; DISCOVERED THAT THE FLOATING POINT HARDWARE WOULD 133 ; NOT INTERRUPT FOR AN OVERFLOW IN THE MODF/MODD 134 ; INSTRUCTIONS. (SEE PDP11/45 PROCESSOR HANDBOOK 135 ; FOR A DESCRIPTION OF THESE INSTRUCTIONS). IN 136 ; SOME CASES, THIS FEATURE COULD BE UNDESIRABLE. 137 ; FOR THIS REASON, THE FOLLOWING CHOICE IS MADE AVAILABLE: 138 ; 139 ; DEFINE MODFHW -- THE EMULATOR WILL BEHAVE LIKE 140 ; THE HARDWARE. AN OVERFLOW WILL NOT CAUSE A FLOATING 141 ; POINT EXCEPTION. 142 ; 143 ; UNDEFINE MODFHW -- AN OVERFLOW IN MODF/MODD WILL 144 ; CAUSE A FLOATING POINT EXCEPTION AST IF THE 145 ; INTERRUPT ON OVERFLOW BIT IS SET IN THE F.P. 146 ; STATUS WORD. 147 ; 148 ; NOTE: THIS ONLY AFFECTS THE MODD/MODF INSTRUCTIONS 149 ; 150 ; IN THE WORKING VERSION OF FPE, MODFHW IS DEFINED. FPE MACRO D1013 20-SEP-77 12:27 PAGE 4 1. INTRODUCTION TO FPE 152 ; 1.0.3 INSTALLING FPE 153 ; SUPPOSE FPE.MAC IS LOACTED ON "DEV:[UIC]". THE FOLLOWING 154 ; PROCEDURE IS USED TO INSTALL FPE. 155 ; 156 ; (1) IN ORDER TO RUN FPE PROPERLY, THE SYSTEM MUST HAVE 157 ; BEEN BUILT AS A FLOATING POINT SYSTEM. I.E., "FP" 158 ; MUST BE PRESENT IN THE "PDP11" LINE OF THE SYSGEN 159 ; PHASE ONE COMMAND LINE. 160 ; 161 ; (2) LOGON UNDER A PRIVILEGED UIC. 162 ; (E.G., MCR>HEL [10,10]) 163 ; 164 ; (3) IF YOU WISH TO CHANGE ANY OF THE ASSEMBLY OPTIONS 165 ; (E.G., IF THE STATISTICS OPTION IS DESIRED), EDIT 166 ; FPE.MAC ON DEV:[UIC] AND DEFINE/UNDEFINE THE APPROPRIATE 167 ; SYMBOLS. 168 ; 169 ; (4) ASSEMBLE THE PROGRAM: 170 ; MCR>MAC DEV:[UIC]FPE=DEV:[UIC]FPE 171 ; 172 ; (5) TASK BUILD FPE: 173 ; MCR>TKB 174 ; TKB>DEV:[UIC]FPE/PR/-AB/-FP/-CP/FX=DEV:[UIC]FPE,SY:[1,1]EXEC.STB 175 ; TKB>/ 176 ; ENTER OPTIONS: 177 ; TKB>UNITS=0 178 ; TKB>STACK=32 179 ; TKB>TASK=FPE... 180 ; TKB>// 181 ; MCR> 182 ; 183 ; (6) REBOOT THE SYSTEM AND MAKE SURE NO OTHER TASKS ARE 184 ; INITIATED DURING THE REMAINDER OF THE INSTALATION PROCESS. 185 ; 186 ; (7) INSTALL,FIX AND RUN FPE: 187 ; MCR>INS DEV:[UIC]FPE/PRI=70/TASK=FPE... 188 ; MCR>FIX FPE... 189 ; MCR>RUN FPE... 190 ; MCR> 191 ; 192 ; (8) DISABLE THE FLOATING POINT CONTEXT SWITCHING: 193 ; MCR>OPE NNNNNN/KNL 194 ; NNNNNN/001010 240$ 195 ; MCR>OPE MMMMMM/KNL 196 ; MMMMMM/001025 240$ 197 ; MCR> 198 ; 199 ; "$" ABOVE REPRESENTS THE ALT MODE OR ESCAPE KEY 200 ; 201 ; THE VALUES OF NNNNNN AND MMMMMM DEPEND ON THE OPERATING SYSTEM 202 ; FOR RSX-11D V6A: 203 ; NNNNNN=007232 204 ; MMMMMM=007342 205 ; FOR RSX11-D V6.2: 206 ; NNNNNN=011766 207 ; MMMMMM=012076 FPE MACRO D1013 20-SEP-77 12:27 PAGE 5 1. INTRODUCTION TO FPE 209 ; 210 ; (9) SAVE THE SYSTEM 211 ; THE PROCEDURE DEPENDS UPON THE OPERATING SYSTEM AS WELL 212 ; AS SYSTEM CONFIGURATION. 213 ; 214 ; FOR RSX-11D V6A: 215 ; 216 ; MCR>DMO SY: 217 ; MCR>(CARRIAGE RETURN) 218 ; SAV 219 ; ;(DATE AND INITIALS) 220 ; MOU SY:/OVR 221 ; (MOUNT ANY OTHER DEVICES DESIRED) 222 ; TIM 223 ; (TYPE CONTROL C) 224 ; 225 ; FOR RSX-11D V6.2 226 ; 227 ; MCR>DMO SY: 228 ; MCR>TER /NOCCF 229 ; MCR>(CARRIAGE RETURN) 230 ; SAV 231 ; ;(DATE AND INITIALS) 232 ; MOU SY:/OVR 233 ; @STARTUP 234 ; (TYPE CONTROL C) 235 ; 236 ; NOTE THAT THE COMMANDS BETWEEN "MCR>(CARRIAGE RETURN)" 237 ; AND "(TYPE CONTROL C)" ARE NOT ECHOED ON THE TERMINAL. 238 ; THEY ARE NOT ACTUALLY INITIATED UNTIL THE CONTROL C IS 239 ; TYPED. 240 ; 241 ; 242 ; THE SYSTEM SHOULD NOW RESTART 243 ;- FPE MACRO D1013 20-SEP-77 12:27 PAGE 6 1.1 MACRO CALLS AND DEFINITIONS 245 .SBTTL 1.1 MACRO CALLS AND DEFINITIONS 246 ; 247 ; MACRO CALLS AND DEFINITIONS 248 ; 249 .MCALL PUSH,POP,CALL,EXIT$S,SPND$S 250 ; 251 .MACRO IFERR ARG 252 BR .+4 ; CONTINUE IF NO ERROR 253 .WORD ARG+ASF3 ; ADDRESS OF ERROR ROUTINE 254 .ENDM 255 ; 256 .MACRO MOVTU ARG1,ARG2 257 PUSH ARG1 258 MTPI ARG2 259 IFERR ODAD1 ; CHECK FOR LEGAL ADDRESSES 260 .ENDM 261 ; 262 .MACRO CLRWRD NUM,REG ; CLEAR NUM WORDS 263 ; REG = (RN) 264 .REPT NUM-1 ; AUTO INC. NUM-1 TIMES 265 CLR REG+ 266 .ENDR 267 CLR REG 268 .ENDM 269 ; 270 .MACRO SINC ARG ; INCREMENT STATISTICS IF STAT DEFINED 271 .IF DF STAT 272 ADD #1,ARG'C+2 273 ADC ARG'C 274 .ENDC 275 .ENDM 276 ; 277 .MACRO TSTOVF ?A,?B 278 BVS A ; TEST FOR OVERFLOW ON ROUND 279 BCC B 280 A: CALL TOVER 281 B: 282 .ENDM 283 ; 284 .MACRO TRKTST ARG1,ARG2 ; TEST TO SEE IF TRUNCATE BIT SET 285 BIT #40,ARG1 ; IS THE TRUNCATE BIT SET? 286 BNE ARG2 ; IF SO, SKIP PAST ROUNDING 287 .ENDM 288 ; FPE MACRO D1013 20-SEP-77 12:27 PAGE 7 1.2 SYMBOL DEFINITIONS 290 .SBTTL 1.2 SYMBOL DEFINITIONS 291 ; 292 000040 PRIOR=40 293 000006 PCOFF=6 ; PCOFFSET=2*N+2 (N=#OF REGISTERS SAVED) 294 000020 PCOFF2=2*7+2 295 172346 PAR3K=172346 296 172344 PAR2K=172344 297 172304 PDR2K=172304 298 040000 ASF2=40000 299 060000 ASF3=60000 300 177776 PSW=177776 301 ;CHECKH=0 ; DEFINE THIS TO CHECK EMULATOR ON 302 ; AN 11 WITH FP HARDWARE 303 ; (FOLLOW RESERVED INSTR. W/ FP INSTR.) 304 ;STAT=0 ; DEFINE THIS TO GENERATE STATISTICS 305 000000 MODFHW=0 ; DEFINE THIS TO EMULATE QUESTIONABLE HARDWARE 306 ; 307 ; NOTE: THE FLOATING POINT HARDWARE WILL NOT INTERRUPT FOR 308 ; AN OVERFLOW ENCOUNTERED IN THE MODF/MODD INSTRUCTIONS. 309 ; IF AN OVERFLOW HAS OCCURED, THE INTEGER WILL BE < 1 310 ; SINCE THE EXPONENT IS OFF BY 400 OCTAL. DEFINING MODFHW 311 ; EMULATES THIS STRANGE BEHAVIOR. IF IT IS NOT DEFINED, 312 ; AN OVERFLOW WILL CAUSE AN AST AS IN OTHER INSTRUCTIONS 313 ; (ASSUMING THE INTERRUPT ON OVERFLOW BIT IS SET). 314 ; FPE MACRO D1013 20-SEP-77 12:27 PAGE 8 2. INITIALIZATION CODE 316 .SBTTL 2. INITIALIZATION CODE 317 ; 318 000000 016700 000000G INIT: MOV .CRTSK,R0 ; 319 000004 016001 000000G MOV A.TD(R0),R1 ; OUR STD ADR 320 000010 CALL ..PENP ; GET A NODE FROM THE POOL 321 000014 103501 BCS NONODE ; (ASSUMING THERE IS ONE) 322 000016 012700 000010 MOV #10,R0 ; ADDR OF RESERVED INSTR. TRAP 323 000022 PUSH @#PSW ; SAVE CURRENT STATUS 324 000026 012737 144140 177776 MOV #144140,@#PSW ;; PREVIOUS MODE=KERNEL 325 000034 006520 MFPI (R0)+ ;; PUT SYSTEM TRAP PC ON STACK 326 000036 006510 MFPI (R0) ;; PUT SYSTEM TRAP PS ON STACK 327 000040 POP SYSPS ;; SAVE SYSTEM PS 328 000044 010167 000236 MOV R1,NODADR ;; SAVE NODE ADDRESS 329 000050 062701 000006 ADD #6,R1 ;; CODE WILL START @ BYTE 6 330 000054 010167 000224 MOV R1,SYSTP ;; REMEMBER WHERE TO PICKUP SYSTEM TRAP 331 000060 012704 000226' MOV #CODE,R4 ;; PREPARE TO PUT IN CODE 332 000064 012421 MOV (R4)+,(R1)+ ;; 333 000066 012421 MOV (R4)+,(R1)+ ;; PUT CODE IN THE NODE 334 000070 012421 MOV (R4)+,(R1)+ ;; 335 000072 POP (R1)+ ;; PUT IN PC OF SYSTEM TRAP 336 000074 PUSH #.EMINT ;; ..CINT NEEDS THIS 337 000100 006640 MTPI -(R0) ;; TEMP PC SAVED 338 000102 012701 000514' MOV #FPISR,R1 ;; FP INTERRUPT SERVICE ADR 339 000106 005002 CLR R2 ;; BASE 340 000110 012703 000040 MOV #PRIOR,R3 ;; ESTABLISH PRIORITY 341 000114 CALL ..CINT ;; CONNECT TO INTERRUPT 342 000120 103435 BCS POPDUN ;; NO GOOD 343 000122 CALL ..ENB0 ;; ENABLE TASK SWITCHING 344 000126 SPND$S ; SUSPEND EXECUTION 345 000134 PUSH @#PSW ; PUT THINGS BACK 346 000140 012737 144140 177776 MOV #144140,@#PSW ;; NO TASK SWITCHING 347 000146 012700 000010 MOV #10,R0 ;; TRAP VECTOR ADR 348 000152 CALL ..DINT ;; DISCONNECT INTERRUPT 349 000156 016701 000124 MOV NODADR,R1 ;; GIVE BACK THE NODE 350 000162 PUSH 14(R1) ;; GET SYSTEM PC 351 000166 006620 MTPI (R0)+ ;; 352 000170 PUSH SYSPS ;; 353 000174 006610 MTPI (R0) ;; OLD PS BACK 354 000176 CALL ..ENB0 ;; ENABLE TASK SWITCHING 355 000202 CALL ..RNTP ; RETURN NODE TO POOL 356 000206 EXIT$S 357 000214 POPDUN: CALL ..ENB0 ;; 358 000220 NONODE: EXIT$S ; GIVE UP IF GOING GETS ROUGH 359 000226 CODE: POP @#PAR3K 360 000232 000137 JMP @(PC)+ FPE MACRO D1013 20-SEP-77 12:27 PAGE 9 3. STATISTICS GATHERED 362 .SBTTL 3. STATISTICS GATHERED 363 .IF DF STAT 364 INSTR: 0 ; LAST INSTRUCTION PROCESSED 365 TOTALC: 0,0 ; TOTAL NUMBER OF TIMES ISR WAS ENTERED 366 LDFPSC: 0,0 ; # LDFPS 367 STFPSC: 0,0 ; # STFPS 368 CLRFC: 0,0 ; # CLRF + # CLRD 369 STSTC: 0,0 ; # STST 370 TSTFC: 0,0 ; # TSTF + #TSTD 371 ABSFC: 0,0 ; # ABSF + # ABSD 372 NEGFC: 0,0 ; # NEGF + # NEGD 373 MULFC: 0,0 ; # MULF + # MULD 374 MULDC: 0,0 ; # MULD 375 MODFC: 0,0 ; # MODF + # MODD 376 ADDFC: 0,0 ; # ADDF + # ADDD 377 ADDDC: 0,0 ; # ADDD 378 LDFC: 0,0 ; # LDF + # LDD 379 SUBFC: 0,0 ; # SUBF + # SUBD 380 CMPFC: 0,0 ; # CMPF + # CMPD 381 STFC: 0,0 ; # STF + # STD 382 DIVFC: 0,0 ; # DIVF + # DIVD 383 DIVDC: 0,0 ; # DIVD 384 STEXPC: 0,0 ; # STEXP 385 STCFIC: 0,0 ; # STCFI + # STCFL + # STCDI + # STCDL 386 STCFDC: 0,0 ; # STCFD + # STCDF 387 LDEXPC: 0,0 ; # LDEXP 388 LDCIFC: 0,0 ; # LDCIF + # LDCLF + # LDCID + # LDCLD 389 LDCDFC: 0,0 ; # LDCDF + # LDCFD 390 SETIC: 0,0 ; # SETI 391 SETLC: 0,0 ; # SETL 392 SETFC: 0,0 ; # SETF 393 SETDC: 0,0 ; # SETD 394 CFCCC: 0,0 ; # CFCC 395 Z0OPC: 0,0 ; # NO OPERAND INSTRUCTIONS 396 Z1OPC: 0,0 ; # ONE OPERAND INSTRUCTIONS 397 Z2OPC: 0,0 ; # TWO OPERAND INSTRUCTIONS 398 MODE0C: 0,0 ; ADDRESSING MODES USED IN ONE AND TWO OPERAND INSTR. 399 MODE1C: 0,0 400 MODE2C: 0,0 401 MODE3C: 0,0 402 MODE4C: 0,0 403 MODE5C: 0,0 404 MODE6C: 0,0 405 MODE7C: 0,0 406 LONGC: 0,0 ; LONG MODE ( DOUBLE ) 407 SHORTC: 0,0 ; SHORT MODE ( FLOATING ) 408 ; THE FLOATING/DOUBLE BIT IS TESTED ONLY ON ONE AND 409 ; TWO OPERAND INSTRUCTIONS 410 FPEC: 0,0 ; FP EXCEPTIONS THAT CAUSED AN AST -- INTERRUPT ENABLED 411 TFPEC: 0,0 ; TOTAL # OF FPE'S FOUND 412 UNDERC: 0,0 ; # OF UNDERFLOW CONDITIONS 413 OVERC: 0,0 ; # OF OVERFLOW CONDITIONS 414 FDZC: 0,0 ; # OF DIVIDE BY ZERO CONDITIONS 415 ICEC: 0,0 ; # OF INTEGER CONVERSION ERRORS 416 UNDVC: 0,0 ; # OF UNDEFINED VARIABLES (MINUS ZERO) 417 FOPCEC: 0,0 ; # OF OP CODE ERRORS 418 .ENDC FPE MACRO D1013 20-SEP-77 12:27 PAGE 10 4. SYSTEM RETURN CODE 420 .SBTTL 4. SYSTEM RETURN CODE 421 000234 016601 000006 SPCASE: MOV PCOFF(SP),R1 ; GET THE PC 422 000240 006541 MFPI -(R1) ; PUT INSTR. THAT CALLED ON STACK 423 000242 POP R1 ; R1 HAS THE INSTRUCTION 424 .IF NDF CHECKH 425 000244 010100 MOV R1,R0 ; COPY INSTR 426 .IIF DF STAT MOV R1,INSTR 427 000246 042700 000077 BIC #77,R0 ; CLEAR OUT ADDRESSING 428 000252 022700 170300 CMP #170300,R0 ; SEE IF STST WAS EXCICUTED IN KERNEL 429 000256 001004 BNE POPOUT ; IF IT WASN'T QUIT 430 .ENDC 431 .IF DF CHECKH 432 BIT #^C075077,R1 ; USE AN 11/40 FP INSTR. TO FAULT 433 BNE POPOUT ; IF NOT THAT, GIVE UP 434 BIC #177700,R1 ; MAKE IT AN STST 435 BIS #170300,R1 ; LEAVE DEST ALONE 436 .ENDC 437 000260 012700 060314' MOV #FAKFPS+ASF3,R0 ; SETUP A FAKE FPSW ADDRESS 438 000264 000167 000324 JMP NOTNO ; GO PROCESS 439 000270 POPOUT: POP R1 ; RETURN REGISTERS BEFORE QUITING 440 000272 POP R0 441 000274 112737 SYSRTN: MOVB (PC)+,@(PC)+ ; GIVE SYSTEM THE EXPECTED STATUS 442 000276 000000 SYSPS: 0 443 000300 177776 PSW 444 000302 000137 JMP @(PC)+ ; GO TO SYSTEM RETURN NODE 445 000304 000000 SYSTP: 0 446 000306 000000 NODADR: 0 FPE MACRO D1013 20-SEP-77 12:27 PAGE 11 5. ISR TABLES 448 .SBTTL 5. ISR TABLES 449 000310 000000 FPXCOD: 0 ; FLOATING POINT EXCEPTION CODE 450 000312 000000 FXM: 0 451 000314 100000 FAKFPS: 100000 ; FAKE FLOATING POINT STATUS 452 ; 453 000316 061160' 061360' 061414' OPERA: LDFPSX+ASF3,STFPSX+ASF3,STSTX+ASF3,CLRFX+ASF3,TSTFX+ASF3 000324 061476' 061202' 454 000330 061044' 061112' ABSFX+ASF3,NEGFX+ASF3 455 000334 061662' 061660' 061656' MULFX+ASF3,MULFX1+ASF3,MULFX2+ASF3,MULFX3+ASF3 000342 061654' 456 000344 063412' 063410' 063406' MODFX+ASF3,MODFX1+ASF3,MODFX2+ASF3,MODFX3+ASF3 000352 063404' 457 000354 064450' 064446' 064444' ADDFX+ASF3,ADDFX1+ASF3,ADDFX2+ASF3,ADDFX3+ASF3 000362 064442' 458 000364 061216' 061214' 061212' LDFX+ASF3,LDFX1+ASF3,LDFX2+ASF3,LDFX3+ASF3 000372 061210' 459 000374 064340' 064336' 064334' SUBFX+ASF3,SUBFX1+ASF3,SUBFX2+ASF3,SUBFX3+ASF3 000402 064332' 460 000404 066346' 066344' 066342' CMPFX+ASF3,CMPFX1+ASF3,CMPFX2+ASF3,CMPFX3+ASF3 000412 066340' 461 000414 066502' 066500' 066476' STFX+ASF3,STFX1+ASF3,STFX2+ASF3,STFX3+ASF3 000422 066474' 462 000424 066572' 066570' 066566' DIVFX+ASF3,DIVFX1+ASF3,DIVFX2+ASF3,DIVFX3+ASF3 000432 066564' 463 000434 070112' 070110' 070106' STEXPX+ASF3,STEXP1+ASF3,STEXP2+ASF3,STEXP3+ASF3 000442 070104' 464 000444 070242' 070240' 070236' STCFIX+ASF3,STCFI1+ASF3,STCFI2+ASF3,STCFI3+ASF3 000452 070234' 465 000454 070672' 070670' 070666' STCFDX+ASF3,STCFD1+ASF3,STCFD2+ASF3,STCFD3+ASF3 000462 070664' 466 000464 071374' 071372' 071370' LDEXPX+ASF3,LDEXP1+ASF3,LDEXP2+ASF3,LDEXP3+ASF3 000472 071366' 467 000474 071466' 071464' 071462' LDCIFX+ASF3,LDCIF1+ASF3,LDCIF2+ASF3,LDCIF3+ASF3 000502 071460' 468 000504 071224' 071222' 071220' LDCDFX+ASF3,LDCDF1+ASF3,LDCDF2+ASF3,LDCDF3+ASF3 000512 071216' FPE MACRO D1013 20-SEP-77 12:27 PAGE 12 6. START OF ISR ROUTINE 470 .SBTTL 6. START OF ISR ROUTINE 471 000514 FPISR: SINC TOTAL ; STATISTICS 472 000514 PUSH R0 ; SAVE REGISTERS 473 000516 PUSH R1 474 000520 032737 030000 177776 BIT #30000,@#PSW ; CHECK MODE 475 000526 001642 BEQ SPCASE ; GENERALLY THIS ISN'T ACCEPTABLE - GO CHECK 476 000530 013700 000000G MOV @#.CRTSK,R0 ; POINTER TO ATL NODE OF CURRENT TASK 477 000534 016037 000000G 172344 MOV A.HA(R0),@#PAR2K ; SET RELOCATION 478 000542 012737 002006 172304 MOV #2006,@#PDR2K ; READ/WRITE IN 5 BLOCKS 479 000550 013700 040000G MOV @#H.CR1+ASF2,R0 ; R0 HAS POINTER TO FP SAVE AREA 480 000554 001645 BEQ POPOUT ; GIVE IT TO THE SYSTEM IF NO FP AREA 481 000556 062700 160000 ADD #ASF2-ASF3,R0 ; CORRECT R0 EXPLICITLY FOR ASF2 MAP 482 000562 016601 000006 MOV PCOFF(SP),R1 ; R1 HAS CURRENT PC 483 .IF NDF CHECKH 484 000566 006541 MFPI -(R1) ; GET FAULTING INSTRUCTION 485 000570 010127 MOV R1,(PC)+ ; SAVE PC OF INSTRUCTION 486 000572 000000 PCSAVE: 0 ; NEXT INSTRUCTION LOCATION 487 .ENDC 488 .IF DF CHECKH ; FOLLOW RESERVED INSTR. WITH A FP INSTR. 489 MOV R1,(PC)+ ; SAVE PC OF INSTRUCTION 490 PCSAVE: 0 ; NEXT INSTRUCTION LOCATION 491 MFPI (R1)+ ; GET FP INSTR. 492 MOV R1,PCOFF+2(SP) ; FUDGE UP PC 493 .ENDC 494 000574 POP R1 ; R1 HAS THE INSTR. THAT CALLED 495 .IIF DF STAT MOV R1,INSTR ; SAVE INSTRUCTION 496 000576 002234 BGE POPOUT ; FP INSTR.S ARE AT LEAST NEGATIVE 497 000600 022701 170000 CMP #170000,R1 ; ALSO LESS THAN THIS 498 000604 003231 BGT POPOUT ; GIVE BACK TO SYSTEM 499 000606 032701 007700 BIT #7700,R1 ; IS THIS A NO OPERAND INSTR.? 500 000612 001424 BEQ NO ; NO IT'S GOT NO OPERAND 501 000614 NOTNO: 502 000614 PUSH R2 ; SAVE ANOTHER REGISTER 503 000616 PUSH R3 504 000620 PUSH R4 505 000622 PUSH R5 506 000624 006506 MFPI SP 507 000626 010102 MOV R1,R2 ; COPY INSTR. 508 000630 005067 011144 CLR NMB ; FOR USE IN GET SUBROUTINE 509 000634 012703 000200 MOV #200,R3 ; MOST COMMON FPSR MASK 510 000640 012705 000010 MOV #10,R5 511 000644 010004 MOV R0,R4 ; POINT TO FP SAVE AREA 512 000646 042701 170077 BIC #170077,R1 ; PICK DISTINGUISHING PART OF INSTR. 513 000652 072127 177773 ASH #-5,R1 ; SHIFT IT SO IT BECOMES AN OFFSET 514 000656 062701 060316' ADD #OPERA+ASF3,R1 ; NOW A REAL ADDRESS 515 000662 000151 JMP @-(R1) ; GO TO THE PROPER ROUTINE 516 000664 NO: SINC Z0OP ; STATS 517 000664 105301 DECB R1 ; DECODE NO OPERAND INSTRUCTIONS 518 000666 002014 BGE NO1 ; BRANCH IF NOT CFCC 519 000670 011001 CFCCX: MOV (R0),R1 ; GET CONTENTS OF FPSR 520 000672 SINC CFCC ; STATS 521 000672 042701 177760 BIC #177760,R1 ; MASK ALL BUT LOW 4 BITS 522 000676 042766 000017 000010 BIC #17,PCOFF+2(SP) ; CLEAR OUT PRESENT STATUS 523 000704 050166 000010 BIS R1,PCOFF+2(SP) ; SET THE BITS IN TASKS PSW 524 000710 FPEXIT: POP R1 ; RETURN REGISTERS 525 000712 POP R0 526 000714 000137 000000G JMP @#..INTX FPE MACRO D1013 20-SEP-77 12:27 PAGE 12-1 6. START OF ISR ROUTINE 527 000720 001003 NO1: BNE NO2 ; BRANCH IF NOT SETF 528 000722 042710 000200 SETFX: BIC #200,(R0) ; CLEAR FD BIT IN FPSR 529 000726 SINC SETF ; STATS 530 000726 000770 BR FPEXIT 531 000730 122701 000010 NO2: CMPB #10,R1 ; 532 000734 003405 BLE NO3 ; IT IS NOT SETI 533 000736 105301 DECB R1 ; MAKE SURE THIS IS SETI 534 000740 001020 BNE ILLIN ; BRANCH IF ILLEGAL INSTRUCTION 535 000742 042710 000100 SETIX: BIC #100,(R0) ; CLEAR FL BIT IN FPSR 536 000746 SINC SETI ; STATISTICS 537 000746 000760 BR FPEXIT ; DONE 538 000750 002406 NO3: BLT SETLX ; BRANCH IF SETL 539 000752 052710 000200 SETDX: BIS #200,(R0) ; SET FD BIT IN FPSR 540 000756 SINC SETD ; STATS 541 000756 POP R1 ; RETURN REGISTERS 542 000760 POP R0 543 000762 000137 000000G JMP @#..INTX 544 000766 120127 000011 SETLX: CMPB R1,#11 ; MAKE SURE THIS IS SETL 545 000772 001003 BNE ILLIN ; BRANCH IF ILLEGAL INSTRUCTION 546 000774 052710 000100 BIS #100,(R0) ; SET FL BIT IN FPSR 547 001000 SINC SETL ; STATS 548 001000 000743 BR FPEXIT ; DONE 549 001002 ILLIN: SINC UNDV ; STATS 550 001002 SINC TFPE 551 001002 052710 100000 BIS #100000,(R0) ; SET ERROR BIT 552 001006 012767 000002 177274 MOV #2,FPXCOD ; SET EXCEPTION CODE 553 001014 032710 040000 BIT #40000,(R0) ; IS INHIBIT INTERRUPT SET? 554 001020 001333 BNE FPEXIT ; IF SO JUST EXIT QUIETLY 555 001022 SINC FPE ; STATS 556 001022 013766 000244 000004 MOV @#244,4(SP) ; SETUP TO GO AST 557 001030 POP R1 558 001032 POP R0 559 001034 012737 034340 177776 MOV #34340,@#PSW 560 001042 000136 JMP @(SP)+ ; GO FPE MACRO D1013 20-SEP-77 12:27 PAGE 13 7. SINGLE AND DOUBLE OPERAND ROUTINES 562 .SBTTL 7. SINGLE AND DOUBLE OPERAND ROUTINES 563 .SBTTL 7.1 ABSF,NEGF,LDFPS,TSTF,LDF,STFPS,STST,CLRF 564 ;---------------------------------------------------------------- 565 001044 ABSFX: 566 001044 SINC Z1OP 567 001044 SINC ABSF ; STATS 568 001044 005267 010730 INC NMB ; WANT AN ADDRESS 569 001050 CALL GET ; GET IT 570 001054 103411 BCS ABSFY ; MODE 0 571 001056 006511 MFPI (R1) ; GET FIRST NUMBER 572 001060 IFERR ODAD1 ; CHECK FOR LEGAL ADDRESSES 573 001064 042716 100000 BIC #100000,(SP) ; MAKE SURE IT IS POSITIVE 574 001070 011667 010666 MOV (SP),NUMB ; WILL WANT TO SET CONDITION CODES 575 001074 006611 MTPI (R1) ; PUT ABS VALUE BACK 576 001076 000471 BR TSTFY ; SET CONDITION CODES 577 001100 042711 100000 ABSFY: BIC #100000,(R1) ; MAKE POSITIVE 578 001104 011167 010652 MOV (R1),NUMB ; SAVE ABS VALUE 579 001110 000464 BR TSTFY 580 ;---------------------------------------------------------------- 581 001112 NEGFX: 582 001112 SINC Z1OP 583 001112 SINC NEGF ; STATS 584 001112 005267 010662 INC NMB ; WANT AN ADDRESS 585 001116 CALL GET ; 586 001122 103411 BCS NEGFZ ; GO DO MODE 0 587 001124 006511 MFPI (R1) ; GET NUMBER 588 001126 IFERR ODAD1 ; CHECK FOR LEGAL ADDRESSES 589 001132 062716 100000 ADD #100000,(SP) ; DO NEGATE 590 001136 011667 010620 MOV (SP),NUMB ; SAVE RESULT 591 001142 006611 MTPI (R1) ; PUT BACK IN USER TASK 592 001144 000446 BR TSTFY ; SET CONDITION CODES 593 001146 NEGFZ: 594 001146 062711 100000 ADD #100000,(R1) ; DO NEGATE 595 001152 011167 010604 MOV (R1),NUMB ; 596 001156 000441 BR TSTFY ; GO SET CODES 597 ;---------------------------------------------------------------- 598 001160 LDFPSX: 599 001160 SINC Z1OP 600 001160 SINC LDFPS ; STATS 601 001160 012705 000002 MOV #2,R5 ; MAX AUTOINCREMENT IS 2 602 001164 CALL GETX ; GET IT 603 001170 016710 010566 MOV NUMB,(R0) ; SAVE STATUS 604 001174 103047 BCC FPEX2 ; DONE IF NOT MODE 0 605 001176 011410 MOV (R4),(R0) ; GET NUMBER FROM A RESISTER ON THE STACK 606 001200 000445 BR FPEX2 607 ;---------------------------------------------------------------- 608 001202 TSTFX: 609 001202 SINC Z1OP 610 001202 SINC TSTF ; STATS 611 001202 CALL GET 612 001206 000425 BR TSTFY 613 ;---------------------------------------------------------------- 614 001210 060504 LDFX3: ADD R5,R4 615 001212 060504 LDFX2: ADD R5,R4 616 001214 060504 LDFX1: ADD R5,R4 617 001216 005724 LDFX: TST (R4)+ ; AC0 618 001220 SINC Z2OP FPE MACRO D1013 20-SEP-77 12:27 PAGE 13-1 7.1 ABSF,NEGF,LDFPS,TSTF,LDF,STFPS,STST,CLRF 619 001220 SINC LDF ; STATS 620 001220 010467 010552 MOV R4,TMP3 ; SAVE POINTER TO AC 621 001224 CALL GET 622 001230 016702 010542 MOV TMP3,R2 ; GET AC ADDRESS 623 001234 032710 000200 BIT #200,(R0) ; SINGLE OR DOUBLE 624 001240 001036 BNE LDDX ; BRANCH ON DOUBLE 625 001242 005062 000002 CLR 2(R2) ; CLEAR OUT REGISTER 626 001246 012703 071762' MOV #NUMB+ASF3,R3 ; GET ADDRESS OF NUMBERS 627 001252 012322 LDFY: MOV (R3)+,(R2)+ ; LOAD THE NUMBERS 628 001254 005367 010512 DEC TMP1 629 001260 003374 BGT LDFY ; 630 001262 042710 000017 TSTFY: BIC #17,(R0) ; CLEAR OUT CURRENT CONDITION CODES 631 001266 032767 077600 010466 TSTFY2: BIT #77600,NUMB ; CHECK FOR ZERO IN EXPONENT --> 0 FRAC 632 001274 001002 BNE 10$ ; NOT ZERO 633 001276 052710 000004 BIS #4,(R0) ; SET ZERO INDICATOR 634 001302 005767 010454 10$: TST NUMB ; NOW IS IT NEGATIVE? 635 001306 002002 BGE FPEX2 ; NO 636 001310 052710 000010 BIS #10,(R0) ; SET NEGATIVE BIT 637 001314 FPEX2: 638 001314 006606 MTPI SP ; 639 001316 POP R5 640 001320 POP R4 641 001322 POP R3 642 001324 POP R2 643 001326 POP R1 ; RETURN REGISTERS 644 001330 POP R0 645 001332 000137 000000G JMP @#..INTX ; RETURN TO USER 646 001336 LDDX: CLRWRD 4,(R2) ; CLEAR OUT THE FAC 647 001346 016702 010424 MOV TMP3,R2 ; GET THE TOP OF FAC AGAIN 648 001352 012703 071762' MOV #NUMB+ASF3,R3 ; POINT TO NUMBER 649 001356 000735 BR LDFY ; GO LOAD 650 ;---------------------------------------------------------------- 651 001360 STFPSX: 652 001360 SINC Z1OP 653 001360 SINC STFPS ; STATS 654 001360 012705 000002 MOV #2,R5 ; WANT ONLY AN ADDRESS 655 001364 005267 010410 INC NMB ; WANT AN ADDRESS 656 001370 CALL GETX ; GET THE ADDRESS 657 001374 103405 BCS STFPSY ; MODE 0 IS DIFFERENT 658 001376 MOVTU (R0),(R1) ; STORE STATUS IN USER AREA 659 001406 000742 BR FPEX2 ; DONE 660 001410 011014 STFPSY: MOV (R0),(R4) ; PUT IT IN A REGISTER 661 001412 000740 BR FPEX2 ; DONE 662 ;---------------------------------------------------------------- 663 001414 STSTX: 664 001414 SINC Z1OP 665 001414 SINC STST ; STATS 666 001414 012703 177777 MOV #-1,R3 ; NO PARTICULAR BIT TO TEST 667 001420 006205 ASR R5 ; AUTO INC. BY 4 ALWAYS 668 001422 005267 010352 INC NMB ; WANT AN ADDRESS 669 001426 CALL GET ; GET ADDRESS 670 001432 103416 BCS STSTY ; BRANCH IF MODE 0 671 001434 MOVTU FPXCOD,(R1)+ ; PUT FEC IN USER AREA 672 001446 005367 010320 DEC TMP1 ; WANT FEA ALSO? 673 001452 001720 BEQ FPEX2 ; EVIDENTLY NOT 674 001454 MOVTU PCSAVE,(R1) ; YES - PUT IT IN USER AREA +2 675 001466 000712 BR FPEX2 ; LEAVE FPE MACRO D1013 20-SEP-77 12:27 PAGE 13-2 7.1 ABSF,NEGF,LDFPS,TSTF,LDF,STFPS,STST,CLRF 676 001470 016714 176614 STSTY: MOV FPXCOD,(R4) ; PUT FEC IN A REGISTER 677 001474 000707 BR FPEX2 ; AND LEAVE 678 ;---------------------------------------------------------------- 679 001476 CLRFX: 680 001476 SINC Z1OP 681 001476 SINC CLRF ; STATS 682 001476 042710 000017 BIC #17,(R0) ; CLEAR OUT CONDITION CODES 683 001502 052710 000004 BIS #4,(R0) ; SET ZERO CONDITION CODE 684 001506 005267 010266 INC NMB ; WANT AN ADDRESS 685 001512 CALL GET 686 001516 103410 BCS CLRFZ ; MODE 0 PROCESSING 687 001520 005046 CLRFY: CLR -(SP) ; ALL OTHER MODES PROCESSED 688 001522 006621 MTPI (R1)+ ; PUT THE ZERO IN 689 001524 IFERR ODAD1 ; CHECK FOR LEGAL ADDRESSES 690 001530 005367 010236 DEC TMP1 ; DECREMENT THE WORD COUNT 691 001534 003371 BGT CLRFY ; CONTINUE TILL FINISHED 692 001536 000666 BR FPEX2 ; DONE 693 001540 005021 CLRFZ: CLR (R1)+ ; PUT THE ZERO IN THE HEADER 694 001542 005367 010224 DEC TMP1 695 001546 003374 BGT CLRFZ ; CONTINUE TILL DONE 696 001550 000661 BR FPEX2 ; FINISHED 697 ;---------------------------------------------------------------- FPE MACRO D1013 20-SEP-77 12:27 PAGE 14 7.2 MULF 699 .SBTTL 7.2 MULF 700 ;---------------------------------------------------------------- 701 001552 010467 010220 MULGET: MOV R4,TMP3 ; SAVE POINTER TO AC 702 001556 CALL GET ; GET THE NUMBER 703 001562 PUSH R0 ; SAVE FPSW POINTER 704 001564 016700 010206 MOV TMP3,R0 ; SETUP POINTER TO FAC 705 001570 012701 071762' MOV #NUMB+ASF3,R1 ; SETUP POINTER TO FSRC 706 001574 032776 000200 000000 BIT #200,@(SP) ; CHECK MODE 707 001602 001453 BEQ MULF ; BRANCH IF SINGLE PRECISION 708 001604 005067 002520 CLR MODFLG ; THIS IS MULD NOT MODF OR MODD 709 001610 000167 000540 JMP MULDX ; GO DO DOUBLE 710 001614 MULDM0: SINC LONG ; STATS 711 001614 012701 071762' MOV #NUMB+ASF3,R1 ; MUST COPY THE FSRC TO SCRATCH AREA 712 001620 012221 MOV (R2)+,(R1)+ ; MOVE IT 713 001622 012221 MOV (R2)+,(R1)+ 714 001624 012221 MOV (R2)+,(R1)+ 715 001626 011211 MOV (R2),(R1) ; DONE 716 001630 PUSH R0 ; SAVE POINTER 717 001632 010400 MOV R4,R0 ; POINT TO FAC WITH R0 718 001634 010467 010136 MOV R4,TMP3 ; SAVE POINTER TO AC 719 001640 012701 071762' MOV #NUMB+ASF3,R1 ; R1 POINTS TO BEGINNING OF FSRC 720 001644 005067 002460 CLR MODFLG 721 001650 000167 000500 JMP MULDX ; GO DO DOUBLE MULTIPLY 722 001654 060504 MULFX3: ADD R5,R4 ; PROPER AC 723 001656 060504 MULFX2: ADD R5,R4 ; PROPER AC 724 001660 060504 MULFX1: ADD R5,R4 ; PROPER AC 725 001662 005724 MULFX: TST (R4)+ ; AC0 726 001664 SINC Z2OP 727 001664 SINC MULF ; STATS 728 001664 005067 176422 CLR FXM ; CLEAR FPE FLAG 729 001670 032702 000070 BIT #70,R2 ; CHECK FOR MODE0 730 001674 001326 BNE MULGET ; IF NOT MODE 0 ,DO REGULAR THINGS 731 001676 SINC MODE0 ; STATS 732 001676 042702 077770 BIC #77770,R2 ; CLEAR ALL BUT REGISTER AND MSB 733 001702 006302 ASL R2 ; SHIFT TO MAKE AN OFFSET 734 001704 006102 ROL R2 ; PUT IN CARRY TO ADD 2 735 001706 006302 ASL R2 ; SHIFT IS DONE 736 001710 060002 ADD R0,R2 ; R2 HAS THE POINTER TO FSRC 737 001712 032710 000200 BIT #200,(R0) ; FLOATING OR DOUBLE? 738 001716 001336 BNE MULDM0 ; BRANCH IF DOUBLE 739 001720 SINC SHORT ; STATS 740 001720 010201 MOV R2,R1 ; R1 POINTS TO FSRC 741 001722 PUSH R0 ; SAVE POINTER 742 001724 010400 MOV R4,R0 ; POINT TO FAC WITH R0 743 001726 010467 010044 MOV R4,TMP3 ; SAVE POINTER TO AC 744 001732 012004 MULF: MOV (R0)+,R4 ; HIGH ORDER FAC 745 001734 011005 MOV (R0),R5 ; LOW ORDER FAC 746 001736 073427 000001 ASHC #1,R4 ; GET THE SIGN OUT 747 001742 006146 ROL -(SP) ; SAVE IT ON THE STACK 748 001744 PUSH R4 ; WANT EXPONENT ON THE STACK 749 001746 105016 CLRB (SP) ; CLEAR OUT FRACTION 750 001750 000316 SWAB (SP) ; PUT IT IN THE LOW ORDER BYTE 751 001752 001541 BEQ MULZRO ; ANSWER IS ZERO 752 001754 073427 000007 ASHC #7,R4 ; LEFT JUSTIFY THE FAC 753 001760 PUSH R5 ; SAVE LOW ORDER FAC ON STACK 754 001762 052704 100000 BIS #100000,R4 ; PUT IN HIDDEN BIT 755 001766 PUSH R4 ; SAVE HIGH ORDER FAC ON STACK FPE MACRO D1013 20-SEP-77 12:27 PAGE 14-1 7.2 MULF 756 001770 012102 MOV (R1)+,R2 ; GET HI ORDER FSRC 757 001772 011103 MOV (R1),R3 ; LOW ORDER FSRC 758 001774 073227 000001 ASHC #1,R2 ; SHIFT OUT SIGN 759 002000 005566 000006 ADC 6(SP) ; STORE FINAL SIGN 760 002004 010201 MOV R2,R1 ; GET THE EXP OF FSRC 761 002006 105001 CLRB R1 ; GET RID OF FRACTION 762 002010 000301 SWAB R1 ; RIGHT JUSTIFY 763 002012 001520 BEQ MULZR2 ; ANSWER IS ZERO 764 002014 060166 000004 ADD R1,4(SP) ; STORE THE SUM OF THE EXPONENTS 765 002020 073227 000007 ASHC #7,R2 ; LEFT JUSTIFY THE FSRC 766 002024 052702 100000 BIS #100000,R2 ; PUT IN HIDDEN BIT 767 002030 005010 CLR (R0) ; CLEAR PLACE IN FAC FOR ANSWER 768 002032 005040 CLR -(R0) ; 769 002034 005703 TST R3 ; TEST LOW ORDER FSRC 770 002036 001407 BEQ MULA2Z ; BRANCH IF ZERO 771 002040 070403 MUL R3,R4 ; GET HI(FAC)*LO(FSRC) 772 002042 060304 ADD R3,R4 ; ADD LO(FSRC) TO HI WORD OF RESULT 773 ; THIS MUST BE DONE SINCE HI(FAC) 774 ; IS REALLY POSITIVE EVEN THOUGH IT 775 ; APPEARS NEGATIVE TO THE MUL INSTR. 776 002044 005703 TST R3 ; WAS LO(FSRC) INTERPRETED AS MINUS? 777 002046 100001 BPL MULA2P ; IF NOT O.K. 778 002050 061604 ADD (SP),R4 ; IF SO, CORRECT FOR IT BY ADDING 779 ; HI(FAC) TO HIGH WORD OF MULTIPLICATION 780 002052 010460 000002 MULA2P: MOV R4,2(R0) ; PUT IN HI(FAC)*LO(FSRC) 781 002056 016604 000002 MULA2Z: MOV 2(SP),R4 ; PUT LO(FAC) IN R4 782 002062 001412 BEQ MULB2Z ; BRANCH IF ZERO 783 002064 070402 MUL R2,R4 ; GET HI(FSRC)*LO(FAC) 784 002066 066604 000002 ADD 2(SP),R4 ; ADD LO(FAC) SINCE HI(FSRC)REALLY + 785 002072 005766 000002 TST 2(SP) ; SEE IF LO(FSRC) WAS MISTAKEN FOR NEGATIVE 786 002076 100001 BPL MULB2P ; NO -- NO PROBLEM 787 002100 060204 ADD R2,R4 ; PUT IN CORRECTION 788 002102 060460 000002 MULB2P: ADD R4,2(R0) ; ADD IN HI(FSRC)*LO(FAC) 789 002106 005510 ADC (R0) ; THERE MAY BE A CARRY 790 002110 010204 MULB2Z: MOV R2,R4 ; NOW GET HI(FAC)*HI(FSRC) 791 002112 060210 ADD R2,(R0) ; ADD HI(FSRC) TO RESULT 792 002114 070416 MUL (SP),R4 ; MULT. HI(FAC)*HI(FSRC) 793 002116 062620 ADD (SP)+,(R0)+ ; ADD HI(FAC) TO RESULT 794 002120 060510 ADD R5,(R0) ; PUT IN LOW ORDER 795 002122 005540 ADC -(R0) ; INCLUDE CARRY 796 002124 060410 ADD R4,(R0) ; PUT IN HIGH ORDER 797 002126 005726 TST (SP)+ ; POP LO (FAC) 798 002130 POP R4 ; GET EXPONENT 799 002132 006160 000002 ROL 2(R0) ; GET RID OF NORMAL BIT 800 002136 006120 ROL (R0)+ ; 801 002140 103404 BCS MULNRM ; BRANCH IF IT WAS FOUND 802 002142 006110 ROL (R0) ; SHIFT AGAIN 803 002144 006160 177776 ROL -2(R0) ; MUST HAVE IT NOW 804 002150 005304 DEC R4 ; ADJUST EXPONENT 805 002152 162704 000200 MULNRM: SUB #200,R4 ; GET RID OF EXTRA EXCESS 128. 806 002156 003002 BGT MULNU ; BRANCH ON NO UNDERFLOW 807 002160 CALL UNDER ; HANDLE UNDERFLOW 808 002164 022704 000377 MULNU: CMP #377,R4 ; CHECK FOR OVERFLOW 809 002170 002002 BGE MULOK ; BRANCH IF NO OVERFLOW 810 002172 CALL OVER ; PROCESS OVERFLOW 811 002176 105010 MULOK: CLRB (R0) ; SHIFT THE THING RIGHT 812 002200 156010 177776 BISB -2(R0),(R0) ; MOVE BYTES FPE MACRO D1013 20-SEP-77 12:27 PAGE 14-2 7.2 MULF 813 002204 000310 SWAB (R0) ; PROPER ORDER 814 002206 005740 TST -(R0) ; POINT TO FIRST WORD 815 002210 105010 CLRB (R0) ; ROOM FOR EXPONENT 816 002212 150410 BISB R4,(R0) ; EXPONENT IN 817 002214 000310 SWAB (R0) ; EXPONENT ON THE LEFT 818 002216 006026 ROR (SP)+ ; PUT SIGN IN CARRY 819 002220 006020 ROR (R0)+ ; PUT THE SIGN IN 820 002222 006010 ROR (R0) ; 821 002224 TRKTST @(SP),10$ ; CHECK TRUNCATE BIT 822 002234 005510 ADC (R0) ; ROUND 823 002236 005540 ADC -(R0) ; 824 002240 TSTOVF ; CHECK FOR OVERFLOW 825 002250 000167 002552 10$: JMP ADDOUT ; GO FINISH 826 002254 022626 MULZR2: CMP (SP)+,(SP)+ ; SET STACK PROPERLY 827 002256 022626 MULZRO: CMP (SP)+,(SP)+ ; DONE 828 002260 005010 CLR (R0) ; SET TO ZERO 829 002262 005040 CLR -(R0) ; FAC = 0 NOW 830 002264 000167 002536 JMP ADDOUT 831 002270 012767 000010 176012 OVER: MOV #10,FPXCOD ; PUT IN FEC 832 002276 042776 000017 000004 BIC #17,@4(SP) ; CLEAR OUT CC'S 833 002304 052776 000002 000004 BIS #2,@4(SP) ; SET V BIT 834 002312 012767 001000 175772 MOV #1000,FXM ; SET FPSW MASK 835 002320 SINC OVER ; STATS 836 002320 000207 RETURN ; CONTINUE WITH REGULAR PROCESSING 837 002322 012767 000010 175760 TOVER: MOV #10,FPXCOD ; PUT IN FEC 838 002330 042776 000017 000002 BIC #17,@2(SP) ; THIS ROUTINE HAS DIFFERENT STACK FROM 839 002336 052776 000002 000002 BIS #2,@2(SP) ; THE OVER SUBROUTINE 840 002344 012767 001000 175740 MOV #1000,FXM ; SET FPSW MASK 841 002352 SINC OVER ; STATS 842 002352 000207 RETURN ; CONTINUE WITH REGULAR PROCESSING 843 ;---------------------------------------------------------------- FPE MACRO D1013 20-SEP-77 12:27 PAGE 15 7.3 MULD 845 .SBTTL 7.3 MULD 846 ;---------------------------------------------------------------- 847 002354 MULDX: 848 002354 SINC MULD ; STATS 849 002354 006310 MULDX1: ASL (R0) ; SHIFT LEFT FAC 850 002356 006146 ROL -(SP) ; SAVE SIGN ON STACK 851 002360 005046 CLR -(SP) ; MAKE ROOM FOR THE EXPONENT 852 002362 116016 000001 MOVB 1(R0),(SP) ; SAVE EXPONENT 853 002366 001426 BEQ MULDZR ; BRANCH IF ANSWER IS ZERO 854 002370 000310 SWAB (R0) ; WISH TO LEFT JUSTIFY THE FAC 855 002372 000261 SEC ; 856 002374 006020 ROR (R0)+ ; PUT IN HIDDEN BIT 857 002376 116060 000001 177776 MOVB 1(R0),-2(R0) ; SHIFT LEFT 1 BYTE TO JUSTIFY 858 002404 000320 SWAB (R0)+ ; PROPER ORDER 859 002406 116060 000001 177776 MOVB 1(R0),-2(R0) ; 860 002414 000320 SWAB (R0)+ ; 861 002416 116060 000001 177776 MOVB 1(R0),-2(R0) ; 862 002424 000310 SWAB (R0) ; DONE 863 002426 105010 CLRB (R0) ; CLEAR OUT LOWEST BYTE 864 002430 006311 ASL (R1) ; SHIFT LEFT FSRC 865 002432 005566 000002 ADC 2(SP) ; GET SIGN OF RESULT 866 002436 105761 000001 TSTB 1(R1) ; IS THE FSRC = 0? 867 002442 001030 BNE MULDNZ ; BRANCH IF NOT 868 002444 022626 MULDZR: CMP (SP)+,(SP)+ ; CLEAR STACK OF UNWANTED ITEMS 869 002446 016700 007324 MOV TMP3,R0 ; GET ADDRESS OF FAC 870 002452 005020 CLR (R0)+ ; CLEAR FAC 871 002454 005020 CLR (R0)+ 872 002456 005020 CLR (R0)+ 873 002460 005020 CLR (R0)+ ; DONE 874 002462 005767 001642 TST MODFLG ; THIS COULD BE A MOD INSTR. 875 002466 001002 BNE 10$ ; BRANCH IF IT IS 876 002470 000167 002332 JMP ADDOUT ; ELSE GO FINISH 877 002474 016701 007276 10$: MOV TMP3,R1 ; FAC ADDRESS 878 002500 161601 SUB (SP),R1 ; MUST CHECK FOR EVEN FAC 879 002502 032701 000010 BIT #10,R1 ; IS IT ODD? 880 002506 001004 BNE 20$ ; IF IT IS ODD, WE ARE DONE 881 002510 CLRWRD 4,(R0) ; IF EVEN, CLEAR THE INTEGER REGISTER 882 002520 000167 002302 20$: JMP ADDOUT ; GO FINISH 883 002524 005002 MULDNZ: CLR R2 ; R2!R3!R4!R5 WILL ACCUMULATE ANSWER 884 002526 005003 CLR R3 ; GET THE HIGH ORDER READY 885 002530 005004 CLR R4 ; USE R4 FOR SOME TEMP STUFF 886 002532 156104 000001 BISB 1(R1),R4 ; GET EXPONENT 887 002536 060416 ADD R4,(SP) ; GET THE SUM OF THE EXPONENTS 888 002540 112761 000001 000001 MOVB #1,1(R1) ; PUT IN NORMALIZE BIT 889 002546 006011 ROR (R1) ; THERE 890 002550 000321 SWAB (R1)+ ; LEFT JUSTIFY THE FSRC 891 002552 116161 000001 177776 MOVB 1(R1),-2(R1) ; SHIFT LEFT ONE BYTE 892 002560 000321 SWAB (R1)+ ; PROPER ORDER 893 002562 116161 000001 177776 MOVB 1(R1),-2(R1) ; 894 002570 000321 SWAB (R1)+ ; 895 002572 116161 000001 177776 MOVB 1(R1),-2(R1) ; 896 002600 000311 SWAB (R1) ; DONE 897 002602 105011 CLRB (R1) ; CLEAR OUT LOW BYTE 898 002604 162700 000006 SUB #6,R0 ; POINT BACK TO THE TOP OF FAC 899 002610 PUSH (R0)+ ; FAC1 900 002612 PUSH (R1) ; FSRC4 901 002614 CALL MULT ; GO MULTIPLY -- RETURN RESULT TO STACK FPE MACRO D1013 20-SEP-77 12:27 PAGE 15-1 7.3 MULD 902 002620 POP R4 ; RESULT TO LOW HALF OF 4 WORD ACCUMULATOR 903 002622 POP R5 ; 904 002624 PUSH (R0)+ ; FAC2 905 002626 PUSH -(R1) ; FSRC3 906 002630 CALL MULT ; FAC2*FSRC3 907 002634 062604 ADD (SP)+,R4 ; ADD TO LOW HALF 908 002636 005503 ADC R3 909 002640 062605 ADD (SP)+,R5 910 002642 005504 ADC R4 ; MAY HAVE CARRY 911 002644 005503 ADC R3 ; 912 002646 PUSH (R0)+ ; FAC3 913 002650 PUSH -(R1) ; FSRC2 914 002652 CALL MULT ; FAC3*FSRC2 915 002656 062604 ADD (SP)+,R4 ; ADD IN 916 002660 005503 ADC R3 917 002662 062605 ADD (SP)+,R5 918 002664 005504 ADC R4 919 002666 005503 ADC R3 920 002670 PUSH (R0) ; FAC4 921 002672 PUSH -(R1) ; FSRC1 922 002674 CALL MULT ; FAC4*FSRC1 923 002700 062604 ADD (SP)+,R4 ; ADD IN 924 002702 005503 ADC R3 925 002704 062605 ADD (SP)+,R5 926 002706 005504 ADC R4 927 002710 005503 ADC R3 928 002712 010405 MOV R4,R5 ; DIVIDE BY 2**16 929 002714 010304 MOV R3,R4 930 002716 005003 CLR R3 ; DONE 931 002720 PUSH -(R0) ; FAC3 932 002722 PUSH (R1)+ ; FSRC1 933 002724 CALL MULT ; FAC3*FSRC1 934 002730 062604 ADD (SP)+,R4 935 002732 005503 ADC R3 936 002734 062605 ADD (SP)+,R5 937 002736 005504 ADC R4 938 002740 005503 ADC R3 939 002742 PUSH -(R0) ; FAC2 940 002744 PUSH (R1)+ ; FSRC2 941 002746 CALL MULT ; FAC2*FSRC2 942 002752 062604 ADD (SP)+,R4 943 002754 005503 ADC R3 944 002756 062605 ADD (SP)+,R5 945 002760 005504 ADC R4 946 002762 005503 ADC R3 947 002764 PUSH -(R0) ; FAC1 948 002766 PUSH (R1) ; FSRC3 949 002770 CALL MULT ; FAC1*FSRC3 950 002774 062604 ADD (SP)+,R4 951 002776 005503 ADC R3 952 003000 062605 ADD (SP)+,R5 953 003002 005504 ADC R4 954 003004 005503 ADC R3 955 003006 PUSH (R0)+ ; FAC1 956 003010 PUSH -(R1) ; FSRC2 957 003012 CALL MULT ; FAC1*FSRC2 958 003016 062603 ADD (SP)+,R3 FPE MACRO D1013 20-SEP-77 12:27 PAGE 15-2 7.3 MULD 959 003020 005502 ADC R2 960 003022 062604 ADD (SP)+,R4 961 003024 005503 ADC R3 962 003026 005502 ADC R2 ; ADDING TO MIDDLE 2 WORDS NOW 963 003030 PUSH (R0) ; FAC2 964 003032 PUSH -(R1) ; FSRC1 965 003034 CALL MULT ; FAC2*FSRC1 966 003040 062603 ADD (SP)+,R3 967 003042 005502 ADC R2 968 003044 062604 ADD (SP)+,R4 969 003046 005503 ADC R3 970 003050 005502 ADC R2 971 003052 PUSH -(R0) ; FAC1 972 003054 PUSH (R1) ; FSRC1 973 003056 CALL MULT ; FAC1*FSRC1 974 003062 062602 ADD (SP)+,R2 ; HIGHEST WORD 975 003064 062603 ADD (SP)+,R3 976 003066 005502 ADC R2 ; FRACTION MULTIPLICATION DONE 977 003070 POP R1 ; PUT SUM OF EXPONENTS IN R1 978 003072 006305 ASL R5 ; SHIFT OUT NORMAL BIT 979 003074 006104 ROL R4 980 003076 006103 ROL R3 981 003100 006102 ROL R2 ; DONE 982 003102 103405 BCS MULDNM ; BRANCH IF FOUND 983 003104 006305 ASL R5 984 003106 006104 ROL R4 985 003110 006103 ROL R3 986 003112 006102 ROL R2 ; DONE 987 003114 005301 DEC R1 ; ADJUST EXPONENT 988 003116 005767 001206 MULDNM: TST MODFLG ; IS THIS MULD OR MODF/MODD? 989 003122 001402 BEQ MULD ; BRANCH IF MULD INSTRUCTION 990 003124 000167 000324 JMP MODFY ; GO DO MOD INSTRUCTION 991 003130 162701 000200 MULD: SUB #200,R1 ; GET RID OF EXTRA EXCESS 128. 992 003134 003002 BGT MULDNU ; BRANCH ON NO UNDERFLOW 993 003136 CALL UNDER ; SET UNDERFLOW FLAGS 994 003142 022701 000377 MULDNU: CMP #377,R1 995 003146 002002 BGE MULDOK ; BRANCH ON NO OVERFLOW 996 003150 CALL OVER ; SET OVERFLOW 997 003154 MULDOK: CALL MULDMD ; GO SHIFT RIGHT AND INSERT EXPONENT 998 003160 TSTOVF ; CHECK FOR OVERFLOW 999 003170 010220 MULDOT: MOV R2,(R0)+ ; SAVE THE ANSWER IN THE FAC 1000 003172 010320 MOV R3,(R0)+ 1001 003174 010420 MOV R4,(R0)+ 1002 003176 010510 MOV R5,(R0) 1003 003200 000167 001622 JMP ADDOUT 1004 003204 MULT: PUSH R4 ; SAVE REGISTERS 1005 003206 PUSH R5 1006 003210 005046 CLR -(SP) ; CLEAR HIGH PRODUCT 1007 003212 016604 000010 MOV 10(SP),R4 ; MULTIPLICAND 1008 003216 001431 BEQ MZ ; BRANCH IF 0 1009 003220 003005 BGT MPLUS ; BRANCH IF PLUS 1010 003222 005766 000012 TST 12(SP) ; TEST MULTIPLIER 1011 003226 001425 BEQ MZ ; 0 1012 003230 003010 BGT MNEG1 ; + 1013 003232 000406 BR MNEG 1014 003234 005766 000012 MPLUS: TST 12(SP) ; TEST MULTIPLIER 1015 003240 001420 BEQ MZ FPE MACRO D1013 20-SEP-77 12:27 PAGE 15-3 7.3 MULD 1016 003242 003005 BGT MLTQ 1017 003244 060416 ADD R4,(SP) ; CORRECTION 1018 003246 000403 BR MLTQ 1019 003250 060416 MNEG: ADD R4,(SP) ; 1020 003252 066616 000012 MNEG1: ADD 12(SP),(SP) ; 1021 003256 070466 000012 MLTQ: MUL 12(SP),R4 ; GET PRODUCT 1022 003262 062604 MDONE: ADD (SP)+,R4 ; ADD HIGH ORDER PARTS 1023 003264 010466 000006 MOV R4,6(SP) ; RETURN ANSWER ON STACK 1024 003270 010566 000010 MOV R5,10(SP) ; 1025 003274 POP R5 ; RETURN REGISTERS 1026 003276 POP R4 1027 003300 000207 RETURN 1028 003302 005004 MZ: CLR R4 ; ZERO 1029 003304 005005 CLR R5 1030 003306 000765 BR MDONE 1031 003310 MULDMD: 1032 003310 105005 CLRB R5 ; SHIFT EVERYTHING RIGHT 1033 003312 150405 BISB R4,R5 ; 1034 003314 000305 SWAB R5 1035 003316 105004 CLRB R4 1036 003320 150304 BISB R3,R4 1037 003322 000304 SWAB R4 1038 003324 105003 CLRB R3 1039 003326 150203 BISB R2,R3 1040 003330 000303 SWAB R3 1041 003332 105002 CLRB R2 1042 003334 150102 BISB R1,R2 ; PUT THE EXPONENT IN 1043 003336 000302 SWAB R2 ; PROPER ORDER 1044 003340 006066 000002 ROR 2(SP) ; GET THE SIGN 1045 003344 012616 MOV (SP)+,(SP) ; SET RETURN 1046 003346 006002 ROR R2 ; PUT IT IN 1047 003350 006003 ROR R3 1048 003352 006004 ROR R4 1049 003354 006005 ROR R5 1050 003356 TRKTST @2(SP),10$ ; CHECK TRUNCATE -- BRANCH IF SET 1051 003366 005505 ADC R5 ; ROUND IT 1052 003370 005504 ADC R4 1053 003372 005503 ADC R3 1054 003374 005502 ADC R2 ; DONE 1055 003376 000207 RETURN 1056 003400 000241 10$: CLC 1057 003402 000207 RETURN ; RETURN 1058 ;---------------------------------------------------------------- FPE MACRO D1013 20-SEP-77 12:27 PAGE 16 7.4 MODF,MODD 1060 .SBTTL 7.4 MODF,MODD 1061 ;---------------------------------------------------------------- 1062 003404 060504 MODFX3: ADD R5,R4 ; PROPER AC 1063 003406 060504 MODFX2: ADD R5,R4 ; PROPER AC 1064 003410 060504 MODFX1: ADD R5,R4 ; PROPER AC 1065 003412 005724 MODFX: TST (R4)+ ; AC0 1066 003414 SINC Z2OP 1067 003414 SINC MODF ; STATS 1068 003414 012767 000001 000706 MOV #1,MODFLG ; SET MOD INSTRUCTION FLAG 1069 003422 005067 174664 CLR FXM ; INITIALIZE FPSW MASK 1070 003426 010467 006344 MOV R4,TMP3 ; SAVE POINTER TO AC 1071 003432 CALL GET 1072 003436 PUSH R0 ; SAVE FPSW POINTER 1073 003440 016700 006332 MOV TMP3,R0 ; POINT TO FAC 1074 003444 012701 071762' MOV #NUMB+ASF3,R1 ; POINT TO FSRC 1075 003450 000167 176700 JMP MULDX1 ; GO MULTIPLY 1076 ; 1077 003454 MODFY: 1078 003454 012767 000073 006312 MOV #59.,TMP2 ; SET THE NUMBER OF PRODUCT BITS 1079 003462 042705 000037 BIC #37,R5 ; GET RID OF EXTRA PRECISION LIKE HARD. 1080 003466 032776 000200 000002 BIT #200,@2(SP) ; CHECK FLOATING OR DOUBLE 1081 003474 001004 BNE MODD ; BRANCH IF DOUBLE 1082 003476 005005 CLR R5 ; SINGLE PRECISION KEEPS 48. BITS 1083 003500 012767 000060 006266 MOV #48.,TMP2 ; SET THE NUMBER OF PRODUCT BITS TO 48. 1084 003506 162701 000200 MODD: SUB #200,R1 ; GET RID OF EXTRA EXCESS 128. 1085 003512 003002 BGT MODNU ; BRANCH ON NO UNDERFLOW 1086 003514 CALL UNDER ; SET UNDERFLOW 1087 003520 MODNU: 1088 .IF NDF MODFHW 1089 CMP #377,R1 ; CHECK FOR OVERFLOW 1090 BGE MODNO ; BRANCH ON NO OVERFLOW 1091 CALL OVER ; SET OVERFLOW 1092 .ENDC 1093 003520 162701 000200 MODNO: SUB #200,R1 ; GET THE MINIMUM SHIFT COUNT 1094 003524 003026 BGT MODFZ ; BRANCH IF THERE IS SHIFTING TO DO 1095 003526 062701 000200 ADD #200,R1 ; RESTORE EXPONENT 1096 003532 CALL MULDMD ; NO SHIFT NEEDED 1097 003536 161600 SUB (SP),R0 ; CHECK FOR EVEN/ODD FAC 1098 003540 032700 000010 BIT #10,R0 ; 1099 003544 001010 BNE MODDUN ; BRANCH IF ODD REGISTER 1100 003546 016700 006224 MOV TMP3,R0 ; GET ADDRESS OF FAC BACK 1101 003552 062700 000010 ADD #10,R0 ; GET ADDRESS OF FAC+1 (FAC IS EVEN HERE) 1102 003556 CLRWRD 4,(R0) ; CLEAR THE INTEGER REGISTER 1103 003566 016700 006204 MODDUN: MOV TMP3,R0 ; R0 HAS ADDRESS OF FAC 1104 003572 CALL MODSAV ; SAVE THE FRACTION 1105 003576 000167 001224 JMP ADDOUT ; GO FONISH 1106 003602 020167 006166 MODFZ: CMP R1,TMP2 ; HOW BIG IS THE INTEGER? 1107 003606 003431 BLE MODSHF ; SHIFT IF NOT TOO BIG 1108 003610 CLRWRD 4,(R0) ; OTHERWISE ZERO THE FRACTION REGISTER 1109 003620 062701 000200 ADD #200,R1 ; RESET EXPONENT 1110 003624 016700 006146 MOV TMP3,R0 ; CHECK FOR EVEN/ODD FAC 1111 003630 166600 000002 SUB 2(SP),R0 1112 003634 032700 000010 BIT #10,R0 1113 003640 001402 BEQ MODINT ; BRANCH IF EVEN FAC 1114 003642 000167 001156 JMP ADOUT ; FINISHED IF ODD FAC 1115 003646 MODINT: CALL MULDMD ; ASSEMBLE THE INTEGER 1116 .IIF NDF MODFHW TSTOVF ; THERE MAY BE OVERFLOW ON ROUND FPE MACRO D1013 20-SEP-77 12:27 PAGE 16-1 7.4 MODF,MODD 1117 003652 016700 006120 MOV TMP3,R0 ; FAC 1118 003656 062700 000010 ADD #10,R0 ; FAC+1 1119 003662 CALL MODSAV ; SAVE INTEGER 1120 003666 000167 001134 JMP ADDOUT ; GO FINISH 1121 003672 MODSHF: PUSH R1 ; SAVE SHIFT COUNT 1122 003674 166600 000004 SUB 4(SP),R0 ; IS THE FAC EVEN OR ODD? 1123 003700 032700 000010 BIT #10,R0 1124 003704 001021 BNE MODSH ; GO SHIFT IF ODD 1125 003706 016700 006064 MOV TMP3,R0 ; MUST SAVE THE FRACTION 1126 003712 062700 000010 ADD #10,R0 ; POINT TO FAC+1 1127 003716 010220 MOV R2,(R0)+ ; SAVE THE FRACTION IN FAC+1 1128 003720 010320 MOV R3,(R0)+ 1129 003722 010420 MOV R4,(R0)+ 1130 003724 010510 MOV R5,(R0) ; DONE 1131 003726 010167 002404 MOV R1,EFAC ; SAVE THE SHIFT COUNT 1132 003732 016667 000002 002374 MOV 2(SP),EFSRC ; SAVE A COPY OF THE SIGN 1133 003740 016700 006032 MOV TMP3,R0 ; POINT TO FAC AGAIN 1134 003744 005367 000360 DEC MODFLG ; FLAG EVEN FAC PROCESSING 1135 003750 020127 000020 MODSH: CMP R1,#16. ; CAN WORDS BE SHIFTED? 1136 003754 003407 BLE MODSS ; NO 1137 003756 010302 MOV R3,R2 ; SHIFT WORDS 1138 003760 010403 MOV R4,R3 1139 003762 010504 MOV R5,R4 1140 003764 005005 CLR R5 ; CLEAR OUT BOTTOM WORD 1141 003766 162701 000020 SUB #16.,R1 ; ADJUST SHIFT COUNT 1142 003772 000766 BR MODSH 1143 003774 020127 000010 MODSS: CMP R1,#8. ; SHIFT BY BYTE? 1144 004000 003415 BLE MODSS1 ; NO 1145 004002 000302 SWAB R2 ; SHIFT LEFT ONE BYTE 1146 004004 105002 CLRB R2 1147 004006 000303 SWAB R3 1148 004010 150302 BISB R3,R2 1149 004012 105003 CLRB R3 1150 004014 000304 SWAB R4 1151 004016 150403 BISB R4,R3 1152 004020 105004 CLRB R4 1153 004022 000305 SWAB R5 1154 004024 150504 BISB R5,R4 1155 004026 105005 CLRB R5 ; CLEAR OUT BOTTOM BYTE 1156 004030 162701 000010 SUB #8.,R1 ; ADJUST SHIFT COUNT 1157 004034 006305 MODSS1: ASL R5 ; SHIFT LEFT 1158 004036 006104 ROL R4 1159 004040 006103 ROL R3 1160 004042 006102 ROL R2 ; DONE 1161 004044 005301 DEC R1 ; CHANGE COUNT 1162 004046 003340 BGT MODSH ; SHIFT TILL PAST THE INTEGER 1163 004050 103412 BCS MODSHD ; DONE SHIFTING IF NORMAL BIT FOUND 1164 004052 005216 MODSH1: INC (SP) ; BUMP SHIFT COUNT 1165 004054 021667 005714 CMP (SP),TMP2 ; ANY NEED TO LOOK FURTHER FOR NORMAL BIT? 1166 004060 003076 BGT MODZEX ; NO, THERE IS NO FRACTION 1167 004062 005301 DEC R1 1168 004064 006305 ASL R5 1169 004066 006104 ROL R4 1170 004070 006103 ROL R3 1171 004072 006102 ROL R2 1172 004074 103366 BCC MODSH1 ; KEEP LOOKING FOR NORMAL 1173 004076 005726 MODSHD: TST (SP)+ ; RESET STACK FPE MACRO D1013 20-SEP-77 12:27 PAGE 16-2 7.4 MODF,MODD 1174 004100 062701 000200 ADD #200,R1 ; PUT IN EXCESS 128. 1175 004104 MODCF: CALL MULDMD ; GO PUT EXPONENT AND FRACTION TOGETHER 1176 004110 005767 000214 TST MODFLG ; EVEN OR ODD FAC? 1177 004114 001224 BNE MODDUN ; BRANCH ON ODD -- JUST SAVE FRACTION 1178 004116 CALL MODSAV ; FIRST, SAVE THE FRACTION 1179 004122 016700 005650 MOV TMP3,R0 ; GET ADDRES OF FAC 1180 004126 062700 000010 ADD #10,R0 ; FAC+1 1181 004132 016701 002200 MOV EFAC,R1 ; SHIFT COUNT 1182 004136 012704 000004 MOV #4,R4 ; SETUP WORD COUNTER 1183 004142 162701 000002 SUB #2,R1 ; ADJUST SHIFT COUNT 1184 004146 002420 BLT MODZIF ; BRANCH IF THE INTEGER IS 1 1185 004150 012705 077777 MOV #77777,R5 ; SETUP THE SHIFT MASK 1186 004154 020127 000016 MODIC: CMP R1,#14. ; DETERMINE WHICH WORD NEEDS BITS MASKED 1187 004160 003406 BLE MODSHM ; R1 LESS MEANS MASK IN THIS WORD 1188 004162 005720 TST (R0)+ ; BYPASS THIS WORD 1189 004164 005304 DEC R4 ; DECREMENT WORD COUNT 1190 004166 162701 000020 SUB #16.,R1 ; ADJUST SHIFT COUNT 1191 004172 002406 BLT MODZIF ; BRANCH IF ENTIRE WORD TO BE ZEROED 1192 004174 000767 BR MODIC ; NEXT WORD 1193 004176 005401 MODSHM: NEG R1 ; SHIFT RIGHT 1194 004200 072501 ASH R1,R5 ; SHIFT THE MASK RIGHT 1195 004202 040520 BIC R5,(R0)+ ; CLEAR OUT FRACTION BITS 1196 004204 005304 DEC R4 ; REDUCE WORD COUNT 1197 004206 001403 BEQ MODZD ; BRANCH DONE 1198 004210 005020 MODZIF: CLR (R0)+ ; CLEAR REMAINING FRACTION BITS 1199 004212 005304 DEC R4 ; DECREMENT WORD COUNT 1200 004214 001375 BNE MODZIF ; ZERO UNTIL DONE 1201 004216 016701 002114 MODZD: MOV EFAC,R1 ; GET THE EXPONENT 1202 004222 062701 000200 ADD #200,R1 ; EXCESS 128. BACK 1203 004226 014005 MOV -(R0),R5 ; PUT THE INTEGER FRACTION IN REGISTERS 1204 004230 014004 MOV -(R0),R4 1205 004232 014003 MOV -(R0),R3 1206 004234 014002 MOV -(R0),R2 ; DONE 1207 004236 PUSH EFSRC ; SIGN TO STACK 1208 004242 CALL MULDMD ; ASSEMBLE THE INTEGER 1209 004246 CALL MODSAV ; SAVE THE INTEGER 1210 004252 000167 000550 JMP ADDOUT ; GO FINISH 1211 004256 005726 MODZEX: TST (SP)+ ; RESET STACK 1212 004260 005001 CLR R1 1213 004262 005016 CLR (SP) ; SET THE SIGN TO ZERO 1214 004264 000707 BR MODCF ; GO ASSEMBLE FRACTION 1215 004266 010220 MODSAV: MOV R2,(R0)+ ; SAVE THE FRACTION OR INTEGER 1216 004270 010320 MOV R3,(R0)+ 1217 004272 032776 000200 000002 BIT #200,@2(SP) ; **** RIGHT IN SPIRIT ONLY 1218 004300 001403 BEQ 10$ ; **** 1219 004302 010420 MOV R4,(R0)+ 1220 004304 010510 MOV R5,(R0) ; SAVED 1221 004306 000207 RETURN 1222 004310 10$: TRKTST @2(SP),20$ 1223 004320 006104 ROL R4 1224 004322 005540 ADC -(R0) 1225 004324 005540 ADC -(R0) 1226 004326 000207 20$: RETURN ; GO FINISH UP 1227 004330 000000 MODFLG: 0 1228 ;---------------------------------------------------------------- FPE MACRO D1013 20-SEP-77 12:27 PAGE 17 7.5 SUBF,ADDF 1230 .SBTTL 7.5 SUBF,ADDF 1231 ;---------------------------------------------------------------- 1232 004332 060504 SUBFX3: ADD R5,R4 ; PROPER AC 1233 004334 060504 SUBFX2: ADD R5,R4 ; PROPER AC 1234 004336 060504 SUBFX1: ADD R5,R4 ; PROPER AC 1235 004340 005724 SUBFX: TST (R4)+ ; AC0 1236 004342 SINC Z2OP 1237 004342 SINC SUBF ; STATS 1238 004342 005067 173744 CLR FXM ; CLEAR FPE FLAG 1239 004346 010467 005424 MOV R4,TMP3 ; SAVE POINTER TO AC 1240 004352 CALL GET ; 1241 004356 062767 100000 005376 ADD #100000,NUMB ; CHANGE SIGN OF FSRC 1242 004364 000404 BR ADSUBE ; GO ADD 1243 ;------------------------------------------------------------------ 1244 004366 010467 005404 ADDGET: MOV R4,TMP3 ; SAVE POINTER TO AC 1245 004372 CALL GET ; GET IT 1246 004376 016705 005374 ADSUBE: MOV TMP3,R5 ; ADDRESS OF FAC 1247 004402 PUSH R0 ; SAVE FPSW POINTER 1248 004404 005046 CLR -(SP) ; SAVE SIGNS ON STACK 1249 004406 012704 071764' MOV #NUMB+ASF3+2,R4 ; POINT TO SECOND WORD OF FSRC 1250 004412 032710 000200 BIT #200,(R0) ; CHECK FOR DOUBLE 1251 004416 001444 BEQ ADDF ; BRANCH IF FLOATING 1252 004420 022424 CMP (R4)+,(R4)+ ; POINT TO BOTTOM OF DOUBLE FSRC 1253 004422 000167 000646 JMP ADDDX ; GO DO DOUBLE ADD 1254 004426 ADDDM0: SINC LONG ; STATS 1255 004426 012224 MOV (R2)+,(R4)+ ; SAVE THE FSRC IN SCRATCH AREA 1256 004430 012224 MOV (R2)+,(R4)+ 1257 004432 012224 MOV (R2)+,(R4)+ 1258 004434 011214 MOV (R2),(R4) 1259 004436 000167 000632 JMP ADDDX ; GO ADD 1260 004442 060504 ADDFX3: ADD R5,R4 ; PROPER AC 1261 004444 060504 ADDFX2: ADD R5,R4 ; PROPER AC 1262 004446 060504 ADDFX1: ADD R5,R4 ; PROPER AC 1263 004450 005724 ADDFX: TST (R4)+ ; AC0 1264 004452 SINC Z2OP 1265 004452 SINC ADDF ; STATS 1266 004452 005067 173634 CLR FXM ; FPE FLAG CLEARED 1267 004456 032702 000070 BIT #70,R2 ; CHECK FOR MODE 0 1268 004462 001341 BNE ADDGET ; BRANCH IF NOT MODE0 1269 004464 SINC MODE0 ; STATS 1270 004464 042702 077770 BIC #77770,R2 ; CLEAR ALL BIT REGISTER AND MSB 1271 004470 006302 ASL R2 ; SHIFT TO GET AN OFFSET 1272 004472 006102 ROL R2 ; PUT IN ACRRY TO ADD 2 1273 004474 006302 ASL R2 1274 004476 060002 ADD R0,R2 ; NOW HAVE THE FSRC POINTER 1275 004500 010405 MOV R4,R5 ; NEW POINTER TO FAC 1276 004502 010467 005270 MOV R4,TMP3 ; SAVE POINTER TO AC 1277 004506 012704 071762' MOV #NUMB+ASF3,R4 ; SAVE THE FSRC IN SCRATCH 1278 004512 PUSH R0 ; SAVE FPSW POINTER 1279 004514 005046 CLR -(SP) ; SAVE SIGNS ON STACK 1280 004516 032710 000200 BIT #200,(R0) ; CHECK FOR FLOATING OR DOUBLE 1281 004522 001341 BNE ADDDM0 ; BRANCH ON DOUBLE 1282 004524 SINC SHORT ; STATS 1283 004524 012224 MOV (R2)+,(R4)+ 1284 004526 011214 MOV (R2),(R4) 1285 004530 005002 ADDF: CLR R2 ; CLEAR PLACE FOR EXPONENTS 1286 004532 005003 CLR R3 ; FPE MACRO D1013 20-SEP-77 12:27 PAGE 17-1 7.5 SUBF,ADDF 1287 004534 006314 ASL (R4) ; SHIFT FSRC 1288 004536 006144 ROL -(R4) ; 1289 004540 156403 000001 BISB 1(R4),R3 ; R3 HAS EXP. OF FSRC 1290 004544 001527 BEQ ADOUT ; FSRC=0 MEANS WE'RE FINISHED 1291 004546 106116 ROLB (SP) ; NO SUCH LUCK -- SAVE THE SIGN 1292 004550 006365 000002 ASL 2(R5) ; SHIFT FAC 1293 004554 006115 ROL (R5) ; 1294 004556 156502 000001 BISB 1(R5),R2 ; R2 HAS EXP. OF FAC 1295 004562 001007 BNE ADA2NZ ; IF NOT ZERO GO CONTINUE 1296 004564 106016 RORB (SP) ; RECREATE FSRC 1297 004566 006014 ROR (R4) ; 1298 004570 006064 000002 ROR 2(R4) ; HAVE IT AGAIN 1299 004574 012425 MOV (R4)+,(R5)+ ; MOVE FSRC TO FAC SINCE THAT IS ANSWER 1300 004576 011415 MOV (R4),(R5) ; 1301 004600 000511 BR ADOUT ; ALL DONE 1302 004602 106166 000001 ADA2NZ: ROLB 1(SP) ; SAVE SIGN OF FAC IN HIGH BYTE OF STACK 1303 004606 112764 000001 000001 MOVB #1,1(R4) ; PUT IN HIDDEN BIT AND CLEAR OUT EXP. 1304 004614 112765 000001 000001 MOVB #1,1(R5) ; IN BOTH FSRC AND FAC 1305 004622 160302 SUB R3,R2 ; SUBTRACT EXP.S -- R2/EFAC-EFSRC 1306 004624 003007 BGT ADEXPA ; BRANCH IF FAC HAS BIG EXPONENT 1307 004626 011500 MOV (R5),R0 ; FAC HAS LITTLE EXP. -- MOV FRAC TO REGS. 1308 004630 016501 000002 MOV 2(R5),R1 ; R0!R1 HAS THE FRAC OF THE 1309 ; NUMBER WITH THE SMALLEST MAGNITUDE 1310 004634 012415 MOV (R4)+,(R5) ; MOVE LARGE MAGNITUDE NUMBER TO FAC 1311 004636 011465 000002 MOV (R4),2(R5) ; DONE 1312 004642 000405 BR ADECHK ; GO CHECK SIGNS 1313 004644 060203 ADEXPA: ADD R2,R3 ; R3 CONTAINS LARGEST EXP. 1314 004646 012400 MOV (R4)+,R0 1315 004650 011401 MOV (R4),R1 ; R0!R1 HAS FRAC OF SMALLEST NUMBER (ABS) 1316 004652 005402 NEG R2 ; R2 IS TO BE RIGHT SHIFT AMOUNT 1317 004654 000316 SWAB (SP) ; SIGN OF BIG NUMBER ON THE RIGHT 1318 004656 126616 000001 ADECHK: CMPB 1(SP),(SP) ; SIGNS EQUAL? 1319 004662 001405 BEQ 10$ ; BRANCH IF SO 1320 004664 005401 NEG R1 ; NEGATE 1321 004666 005500 ADC R0 1322 004670 005400 NEG R0 1323 004672 005067 005076 CLR TMP2 ; CARRY SAVER 1324 004676 005702 10$: TST R2 ; SHIFT AMOUNT 1325 004700 001406 BEQ ADSHTD ; NONE NEEDED ---> BRANCH 1326 004702 022702 177747 CMP #-25.,R2 ; IS IT WORTH IT TO SHIFT? 1327 004706 003020 BGT ADNRMD ; NO -- ANSWER IS THE BIG NUMBER 1328 004710 073002 ASHC R2,R0 ; DO THE SHIFT 1329 004712 006067 005056 ROR TMP2 ; SAVE THE CARRY 1330 004716 060025 ADSHTD: ADD R0,(R5)+ ; ADD THINGS UP 1331 004720 060115 ADD R1,(R5) 1332 004722 005545 ADC -(R5) ; DONE 1333 004724 126616 000001 CMPB 1(SP),(SP) ; COMPARE SIGNS 1334 004730 001114 BNE ADSUB ; IF NOT SAME GO CLEAN UP 1335 004732 031527 001000 BIT (R5),#1000 ; WAS THERE A CARRY PAST NORMAL BIT? 1336 004736 001404 BEQ ADNRMD ; BRANCH IF NOT 1337 004740 006215 ASR (R5) ; SHIFT RIGHT 1338 004742 006065 000002 ROR 2(R5) ; 1339 004746 005203 INC R3 ; BUMP EXPONENT 1340 004750 032703 177400 ADNRMD: BIT #177400,R3 ; TEST FOR OVERFLOW 1341 004754 001402 BEQ ADOK ; BRANCH ON NO OVERFLOW 1342 004756 CALL OVER ; HANDLE OVERFLOW 1343 004762 110365 000001 ADOK: MOVB R3,1(R5) ; PUT EXP IN FAC FPE MACRO D1013 20-SEP-77 12:27 PAGE 17-2 7.5 SUBF,ADDF 1344 004766 006016 ROR (SP) ; PUT IN SIGN OF BIG NUMBER 1345 004770 006025 ROR (R5)+ ; PUT SIGN IN FAC 1346 004772 006015 ROR (R5) ; 1347 004774 TRKTST @2(SP),ADOUT ; CHECK TRUNCATE -- BRANCH IF SET 1348 005004 005515 ADC (R5) ; 1349 005006 005545 ADC -(R5) ; 1350 005010 102002 BVC ADNOV ; CHECK FOR OVERFLOW 1351 005012 CALL OVER ; 1352 005016 103002 ADNOV: BCC ADOUT 1353 005020 CALL OVER ; 1354 005024 005726 ADOUT: TST (SP)+ ; RESET STACK 1355 005026 ADDOUT: POP R0 ; RETURN FPSW POINTER 1356 005030 017767 004742 004724 MOV @TMP3,NUMB ; GET READY FOR C.C. TEST 1357 005036 005767 173250 TST FXM ; WAS THERE AN FPE? 1358 005042 001002 BNE 10$ ; INVESTIGATE FURTHER IF THERE WAS 1359 005044 000167 174212 JMP TSTFY ; IF NOT, LEAVE 1360 005050 10$: SINC TFPE ; STATS 1361 005050 036710 173236 BIT FXM,(R0) ; WAS THE INTERRUPT ENABLED? 1362 005054 001422 BEQ ADOUT2 ; BRANCH IF NOT 1363 005056 052710 100000 BIS #100000,(R0) ; INTERRUPT BIT WAS SET 1364 005062 032710 040000 ADDDIV: BIT #40000,(R0) ; WAS THE INHIBIT INTERRUPT BIT SET? 1365 005066 001033 BNE ADOUT3 ; YES -- LEAVE 1366 005070 005767 004666 TST NUMB ; SET N AND Z BITS AS APPROPRIATE 1367 005074 002002 BGE 10$ ; NOT NEGATIVE 1368 005076 052710 000010 BIS #10,(R0) ; SET N 1369 005102 001002 10$: BNE 20$ ; NOT ZERO 1370 005104 052710 000004 BIS #4,(R0) ; SET Z 1371 005110 013766 000244 000016 20$: MOV @#244,16(SP) ; PUT ADDRESS ON TOP OF KPAR3 1372 005116 SINC FPE ; STATS 1373 005116 000167 005340 JMP FPEOUT ; GO INTERRUPT 1374 005122 022767 000012 173160 ADOUT2: CMP #12,FPXCOD ; WAS THERE AN UNDERFLOW? 1375 005130 001012 BNE ADOUT3 ; BRANCH IF NOT 1376 005132 016701 004640 MOV TMP3,R1 ; GET FAC ADDRESS 1377 005136 CLRWRD 4,(R1) ; CLEAR THE FAC 1378 005146 042710 000017 BIC #17,(R0) ; CLEAR CC'S 1379 005152 005067 004604 CLR NUMB 1380 005156 000167 174104 ADOUT3: JMP TSTFY2 ; GO SET C.CS WITHOUT CLEARING 1381 005162 005715 ADSUB: TST (R5) ; TEST SIGN OF RESULT 1382 005164 003006 BGT ADBIT9 ; IF POSITIVE SIGN IS OK 1383 005166 001416 BEQ ADZTST ; CHECK FOR ZERO RESULT 1384 005170 005465 000002 NEG 2(R5) ; GET ABSOLUTE VALUE 1385 005174 005515 ADC (R5) ; 1386 005176 005415 NEG (R5) ; 1387 005200 000316 SWAB (SP) ; SWITCH SIGNS 1388 005202 032527 000400 ADBIT9: BIT (R5)+,#400 ; CHECK FOR NORMAL BIT 1389 005206 001021 BNE ADUTST ; BRANCH IF FOUND 1390 005210 005303 DEC R3 ; DECREASE EXPONENT 1391 005212 006367 004556 ASL TMP2 ; GET CARRY 1392 005216 006115 ROL (R5) ; DOUBLE FRACTION 1393 005220 006145 ROL -(R5) ; 1394 005222 000767 BR ADBIT9 ; CHECK FOR NORM BIT AGAIN 1395 005224 005725 ADZTST: TST (R5)+ ; POINT TO SECOND WORD 1396 005226 005715 TST (R5) ; CHECK FOR ZERO HERE 1397 005230 001416 BEQ ADZERO ; IT'S ZERO ALRIGHT 1398 005232 000315 SWAB (R5) ; SAVE NORMALIZE SOME TIME 1399 005234 151565 177776 BISB (R5),-2(R5) ; MOVE BITS TO THE LEFT 1400 005240 105015 CLRB (R5) ; FPE MACRO D1013 20-SEP-77 12:27 PAGE 17-3 7.5 SUBF,ADDF 1401 005242 005745 TST -(R5) ; POINT TO TOP OF FAC 1402 005244 162703 000010 SUB #10,R3 ; ADJUST THE EXPONENT 1403 005250 000754 BR ADBIT9 ; 1404 005252 005745 ADUTST: TST -(R5) ; BUMP POINTER 1405 005254 005703 TST R3 ; UNDERFLOW OCCUR? 1406 005256 003234 BGT ADNRMD ; NO -- GO FINISH UP 1407 005260 CALL UNDER ; UNDERFLOW FLAGS SET 1408 005264 000636 BR ADOK ; CONTINUE PROCESSING 1409 005266 005025 ADZERO: CLR (R5)+ ; PUT IN ZERO 1410 005270 005015 CLR (R5) ; 1411 005272 000654 BR ADOUT ; DONE 1412 ;---------------------------------------------------------------- FPE MACRO D1013 20-SEP-77 12:27 PAGE 18 7.6 ADDD 1414 .SBTTL 7.6 ADDD 1415 ;---------------------------------------------------------------- 1416 005274 ADDDX: 1417 005274 SINC ADDD ; STATS 1418 005274 005067 001034 CLR EFSRC ; CLEAR OUT EXPONENTS 1419 005300 005067 001032 CLR EFAC ; 1420 005304 006314 ASL (R4) ; SHIFT FSRC 1421 005306 006144 ROL -(R4) ; 1422 005310 006144 ROL -(R4) ; 1423 005312 006144 ROL -(R4) ; 1424 005314 156467 000001 001012 BISB 1(R4),EFSRC ; GET EXPONENT OF FSRC 1425 005322 001426 BEQ ADDA1Z ; IF 0 ARE ESSENTIALLY DONE 1426 005324 106116 ROLB (SP) ; SAVE SIGN 1427 005326 062705 000006 ADD #6,R5 ; POINT TO BOTTOM OF FAC 1428 005332 006315 ASL (R5) ; SHIFT FAC 1429 005334 006145 ROL -(R5) ; 1430 005336 006145 ROL -(R5) ; 1431 005340 006145 ROL -(R5) ; 1432 005342 156567 000001 000766 BISB 1(R5),EFAC ; SAVE EXPONENT OF FAC 1433 005350 001015 BNE ADD2NZ ; BRANCH IF NOT 0 1434 005352 106016 RORB (SP) ; RECONSTRUCT THE FSRC 1435 005354 006024 ROR (R4)+ ; 1436 005356 006024 ROR (R4)+ ; 1437 005360 006024 ROR (R4)+ ; 1438 005362 006014 ROR (R4) ; 1439 005364 062705 000006 ADD #6,R5 ; POINT TO BOTTOM OF FAC 1440 005370 011415 MOV (R4),(R5) ; MOVE FSRC TO FAC 1441 005372 014445 MOV -(R4),-(R5) ; 1442 005374 014445 MOV -(R4),-(R5) ; 1443 005376 014445 MOV -(R4),-(R5) ; 1444 005400 005726 ADDA1Z: TST (SP)+ ; GET RID OF SIGNS 1445 005402 000611 .IIF NDF STAT BR ADDOUT ; GO FINISH 1446 .IIF DF STAT JMP ADDOUT 1447 005404 106166 000001 ADD2NZ: ROLB 1(SP) ; SAVE SIGN OF FAC 1448 005410 112764 000001 000001 MOVB #1,1(R4) ; PUT IN HIDDEN BIT AND CLEAR OUT EXP. 1449 005416 112765 000001 000001 MOVB #1,1(R5) ; 1450 005424 166767 000704 000704 SUB EFSRC,EFAC ; SUBTRACT EXPONENTS 1451 005432 003015 BGT ADDEXA ; BRANCH IF EFAC IS LARGEST 1452 005434 012500 MOV (R5)+,R0 ; MOVE SMALLER # INTO REGISTERS 1453 005436 012501 MOV (R5)+,R1 ; (IT IS FAC IN THIS CASE) 1454 005440 012502 MOV (R5)+,R2 ; BY SMALLER, I MEAN SMALLER ABSOLUTE VALUE 1455 005442 011503 MOV (R5),R3 ; 1456 005444 062704 000006 ADD #6,R4 ; POINT TO BOTTOM OF FSRC 1457 005450 011415 MOV (R4),(R5) ; MOVE FSRC TO FAC 1458 005452 014445 MOV -(R4),-(R5) ; 1459 005454 014445 MOV -(R4),-(R5) ; 1460 005456 014445 MOV -(R4),-(R5) ; 1461 005460 016704 000650 MOV EFSRC,R4 ; R4 HAS THE LARGEST EXPONENT 1462 005464 000413 BR ADDSCK ; GO CHECK SIGN 1463 005466 012400 ADDEXA: MOV (R4)+,R0 ; MOV FSRC TO REGISTERS 1464 005470 012401 MOV (R4)+,R1 ; NOTE THAT IT IS THE SMALLER NUMBER 1465 005472 012402 MOV (R4)+,R2 ; 1466 005474 011403 MOV (R4),R3 ; 1467 005476 016704 000634 MOV EFAC,R4 ; R4 HAS THE LARGEST EXPONENT 1468 005502 066704 000626 ADD EFSRC,R4 ; ADD WHAT WAS TAKEN AWAY 1469 005506 000316 SWAB (SP) ; SWITCH SIGNS 1470 005510 005467 000622 NEG EFAC ; MAKE ROTATE COUNT NEGATIVE FPE MACRO D1013 20-SEP-77 12:27 PAGE 18-1 7.6 ADDD 1471 005514 126616 000001 ADDSCK: CMPB 1(SP),(SP) ; CHECK FOR SAME SIGNS 1472 005520 001414 BEQ ADDECK ; 1473 005522 005403 NEG R3 ; NEGATE SMALL NUMBER 1474 005524 005502 ADC R2 ; 1475 005526 005501 ADC R1 1476 005530 005500 ADC R0 1477 005532 005402 NEG R2 1478 005534 005501 ADC R1 1479 005536 005500 ADC R0 1480 005540 005401 NEG R1 1481 005542 005500 ADC R0 1482 005544 005400 NEG R0 ; DONE 1483 005546 005067 004222 CLR TMP2 ; CARRY HOLDER 1484 005552 005767 000560 ADDECK: TST EFAC ; TEST SHIFT COUNT 1485 005556 001501 BEQ ADDSHD ; IF 0 SKIP ALL THE SHIFT BUSINESS 1486 005560 022767 177707 000550 CMP #-57.,EFAC ; IS THE SMALL NUMBER JUST TOO SMALL? 1487 005566 003411 BLE ADDSHT ; NO -- GO SHIFT 1488 005570 110465 000001 MOVB R4,1(R5) ; RECONSTRUCT LARGE NUMBER 1489 005574 006026 ROR (SP)+ ; GET SIGN 1490 005576 006025 ROR (R5)+ ; 1491 005600 006025 ROR (R5)+ 1492 005602 006025 ROR (R5)+ 1493 005604 006015 ROR (R5) ; DONE 1494 005606 000167 177214 JMP ADDOUT ; GO FINISH UP 1495 005612 022767 177770 000516 ADDSHT: CMP #-8.,EFAC ; SEE HOW MANY BITS ARE TO BE SHIFTED 1496 005620 003451 BLE ADDSR8 ; BRANCH IF NOT MORE THAN 1/2 WORD 1497 005622 005700 TST R0 ; CONTINUE HERE IF MORE THAN THAT 1498 005624 006746 SXT -(SP) ; PUT THE SIGN EXTENSION ON THE STACK 1499 005626 022767 177760 000502 ADDSH1: CMP #-16.,EFAC ; ONE WORD? 1500 005634 002416 BLT ADDS16 ; BRANCH IF NOT MORE THAN 1 WORD TO SHIFT 1501 005636 010367 004132 MOV R3,TMP2 ; SAVE THE LOW ORDER WORD (CARRY INFO) 1502 005642 010203 MOV R2,R3 ; SHIFT ONE WORD AT A TIME 1503 005644 010102 MOV R1,R2 1504 005646 010001 MOV R0,R1 1505 005650 011600 MOV (SP),R0 ; INSERT SIGN EXTEND 1506 005652 062767 000020 000456 ADD #16.,EFAC ; UPDATE THE EXPONENT 1507 005660 001362 BNE ADDSH1 ; GO TRY TO DO IT AGAIN 1508 005662 005726 TST (SP)+ ; IF 0, SHIFTING IS ALL DONE 1509 005664 006367 004104 ASL TMP2 ; SET CARRY BIT RIGHT 1510 005670 000434 BR ADDSHD ; HENCE BEHAVE THAT WAY 1511 005672 022767 177775 000436 ADDS16: CMP #-3,EFAC ; HOW MANY TO SHIFT NOW? 1512 005700 003420 BLE ADDS8A ; BRANCH IF NOT MORE THAN 3 1513 005702 010516 MOV R5,(SP) ; SAVE R5 OVER TOP OF SIGN EXTEND 1514 005704 PUSH R4 ; SAVE EXPONENT 1515 005706 PUSH EFAC ; PUT SHIFT AMOUNT ON STACK 1516 005712 010104 MOV R1,R4 ; SAVE R1 1517 005714 073016 ASHC (SP),R0 ; SHIFT HIGH ORDER 1518 005716 010205 MOV R2,R5 ; SAVE R2 1519 005720 073416 ASHC (SP),R4 ; SHIFT DOUBLE REG. 1520 005722 010204 MOV R2,R4 ; 1521 005724 010502 MOV R5,R2 ; R2 DONE 1522 005726 010305 MOV R3,R5 ; SET UP LOW ORDER 1523 005730 073426 ASHC (SP)+,R4 ; DO LOW ORDER 1524 005732 010503 MOV R5,R3 ; 1525 005734 POP R4 ; RETURN EXPONENT 1526 005736 POP R5 ; RETURN POINTER TO FAC 1527 005740 000410 BR ADDSHD ; DONE WITH SHIFT FPE MACRO D1013 20-SEP-77 12:27 PAGE 18-2 7.6 ADDD 1528 005742 005726 ADDS8A: TST (SP)+ ; GET STACK RIGHT 1529 005744 006200 ADDSR8: ASR R0 ; SHIFT RIGHT UNTIL FINISHED 1530 005746 006001 ROR R1 ; 1531 005750 006002 ROR R2 1532 005752 006003 ROR R3 ; 1533 005754 005267 000356 INC EFAC ; SHIFT COUNTER INCEMENTED 1534 005760 002771 BLT ADDSR8 ; 1535 005762 006067 004006 ADDSHD: ROR TMP2 ; SAVE THE CARRY BIT 1536 005766 062705 000006 ADD #6,R5 ; POINT TO BOTTOM OF FAC 1537 005772 061503 ADD (R5),R3 ; DO THE ADDITION 1538 005774 005502 ADC R2 1539 005776 005501 ADC R1 1540 006000 005500 ADC R0 1541 006002 064502 ADD -(R5),R2 1542 006004 005501 ADC R1 1543 006006 005500 ADC R0 1544 006010 064501 ADD -(R5),R1 1545 006012 005500 ADC R0 1546 006014 064500 ADD -(R5),R0 ; ADDITION IS DONE 1547 006016 126616 000001 CMPB 1(SP),(SP) ; CHECK FOR SAME SIGNS 1548 006022 001044 BNE ADDSUB ; GO FIXUP SUBTRACT 1549 006024 032700 001000 BIT #1000,R0 ; WAS THERE CARRY INTO EXP PART 1550 006030 001405 BEQ ADDNRD ; BRANCH IF NOT 1551 006032 006200 ASR R0 ; SHIFT RIGHT 1552 006034 006001 ROR R1 1553 006036 006002 ROR R2 1554 006040 006003 ROR R3 1555 006042 005204 INC R4 ; ADJUST THE EXPONENT 1556 006044 000304 ADDNRD: SWAB R4 ; MOVE EXPONENT TO HIGH BYTE 1557 006046 001402 BEQ ADDNFL ; BRANCH IF NO OVERFLOWN EXPONENT 1558 006050 CALL OVER 1559 006054 150004 ADDNFL: BISB R0,R4 ; R4 NOW HAS FIRST WORD 1560 006056 006026 ROR (SP)+ ; GET THE SIGN 1561 006060 006004 ROR R4 ; PUT THE SIGN IN 1562 006062 006001 ROR R1 1563 006064 006002 ROR R2 1564 006066 006003 ROR R3 1565 006070 TRKTST @(SP),ADDPUT ; CHECK TRUNCATE -- BRANCH IF SET 1566 006100 005503 ADC R3 ; ROUND IT 1567 006102 005502 ADC R2 1568 006104 005501 ADC R1 1569 006106 005504 ADC R4 ; ROUNDING DONE 1570 006110 TSTOVF ; CHECK FOR OVERFLOW 1571 006120 010425 ADDPUT: MOV R4,(R5)+ ; PUT THE ANSWER IN THE FAC 1572 006122 010125 MOV R1,(R5)+ ; 1573 006124 010225 MOV R2,(R5)+ 1574 006126 010315 MOV R3,(R5) 1575 006130 000167 176672 JMP ADDOUT ; GO CHECK FOR ERRORS,INTERRUPTS,C.C'S 1576 006134 005700 ADDSUB: TST R0 ; CHECK SIGN OF RESULT 1577 006136 003015 BGT ADDBT9 ; POSITIVE IS O.K. 1578 006140 001427 BEQ ADDZT ; CHECK FOR ZERO 1579 006142 005403 NEG R3 ; IT IS NEGATIVE -- TAKE ABS. VALUE 1580 006144 005502 ADC R2 1581 006146 005501 ADC R1 1582 006150 005500 ADC R0 1583 006152 005402 NEG R2 1584 006154 005501 ADC R1 FPE MACRO D1013 20-SEP-77 12:27 PAGE 18-3 7.6 ADDD 1585 006156 005500 ADC R0 1586 006160 005401 NEG R1 1587 006162 005500 ADC R0 1588 006164 000316 SWAB (SP) ; SWITCH SIGN 1589 006166 005400 NEG R0 1590 006170 001413 BEQ ADDZT ; CHECK FOR ZERO 1591 006172 030027 000400 ADDBT9: BIT R0,#400 ; CHECK FOR NORMAL BIT 1592 006176 001046 BNE ADDUT ; GO CHECK FOR UNDERFLOW WHEN FOUND 1593 006200 005304 DEC R4 ; REDUCE EXPONENT 1594 006202 006367 003566 ASL TMP2 ; ROLL BACK CARRY INFO 1595 006206 006103 ROL R3 ; DOUBLE FRACTION 1596 006210 006102 ROL R2 1597 006212 006101 ROL R1 1598 006214 006100 ROL R0 1599 006216 000765 BR ADDBT9 ; GO LOOK FOR NORMAL BIT AGAIN 1600 006220 162704 000010 ADDZT: SUB #8.,R4 ; REDUCE EXPONENT 1601 006224 005701 TST R1 ; 1602 006226 001020 BNE ADDZT1 ;BRANCH IF ONLY R0=0 1603 006230 162704 000020 SUB #16.,R4 ; REDUCE EXPONENT AGAIN 1604 006234 010201 MOV R2,R1 ; 1605 006236 001012 BNE ADDZT2 ; BRANCH IF R2 NOT 0 1606 006240 162704 000020 SUB #16.,R4 ; 1607 006244 005703 TST R3 ; TEST LAST WORD 1608 006246 001427 BEQ ADDZRO ; IT IS ZERO 1609 006250 150301 BISB R3,R1 ; MOVE BYTES TO R0,R1 1610 006252 000301 SWAB R1 1611 006254 000303 SWAB R3 ; 1612 006256 150300 BISB R3,R0 ; 1613 006260 005003 CLR R3 ; MAKE ALL OTHERS 0 1614 006262 000743 BR ADDBT9 ; 1615 006264 010302 ADDZT2: MOV R3,R2 ; 1616 006266 005003 CLR R3 ; 1617 006270 000301 ADDZT1: SWAB R1 ; 1618 006272 150100 BISB R1,R0 ; MOVE ALL BYTES LEFT 1619 006274 105001 CLRB R1 ; 1620 006276 000302 SWAB R2 1621 006300 150201 BISB R2,R1 ; 1622 006302 105002 CLRB R2 1623 006304 000303 SWAB R3 1624 006306 150302 BISB R3,R2 1625 006310 105003 CLRB R3 1626 006312 000727 BR ADDBT9 ; 1627 006314 005704 ADDUT: TST R4 ; WAS THERE UNDERFLOW? 1628 006316 003252 BGT ADDNRD ; BRANCH IF NOT 1629 006320 CALL UNDER ; UNDERFLOW 1630 006324 000653 BR ADDNFL ; CONTINUE 1631 006326 005016 ADDZRO: CLR (SP) ; SET SIGN PLUS 1632 006330 005004 CLR R4 ; CLEAR EXPONENT 1633 006332 000650 BR ADDNFL 1634 006334 000000 EFSRC: 0 1635 006336 000000 EFAC: 0 1636 ;---------------------------------------------------------------- FPE MACRO D1013 20-SEP-77 12:27 PAGE 19 7.7 CMPF,STF,DIVF 1638 .SBTTL 7.7 CMPF,STF,DIVF 1639 ;---------------------------------------------------------------- 1640 006340 060504 CMPFX3: ADD R5,R4 ; PROPER AC 1641 006342 060504 CMPFX2: ADD R5,R4 ; PROPER AC 1642 006344 060504 CMPFX1: ADD R5,R4 ; PROPER AC 1643 006346 005724 CMPFX: TST (R4)+ ; AC0 1644 006350 SINC Z2OP 1645 006350 SINC CMPF ; STATS 1646 006350 010467 003422 MOV R4,TMP3 ; SAVE POINTER TO AC 1647 006354 CALL GET ; GET THE NUMBER 1648 006360 016704 003412 MOV TMP3,R4 ; ADDRES OF FAC 1649 006364 012705 071762' MOV #NUMB+ASF3,R5 ; ADDRESS OF (FDEST) 1650 006370 011703 MOV (PC),R3 ; 00XXXX...XXXX01 1651 006372 012501 MOV (R5)+,R1 ; GET HIGH ORDER OF FIRST 1652 006374 002004 BGE CMPPOS ; BRANCH IF FIRST NUMBER + 1653 006376 006303 ASL R3 ; REMEMBER FIRST NUMBER - 1654 006400 012402 MOV (R4)+,R2 ; GET HIGH ORDEROF SECOND 1655 006402 002403 BLT CMPSAM ; BRANCH IF BOTH ARE SAME 1656 006404 000420 BR CMPNEG ; RESULT IS NEGATIVE 1657 006406 012402 CMPPOS: MOV (R4)+,R2 ; GET HIGH ORDER OF SECOND 1658 006410 002417 BLT CMPPLS ; RESULT IS + 1659 006412 020102 CMPSAM: CMP R1,R2 ; COMPARE HIGH ORDERS 1660 006414 001012 BNE CMPOUT ; NOT EQUAL 1661 006416 022524 CMP (R5)+,(R4)+ ; NEXT WORD 1662 006420 001010 BNE CMPOUT ; 1663 006422 032710 000200 BIT #200,(R0) ; CONTINUE COMPARING? 1664 006426 001404 BEQ CMPCLR ; NO -- THE FLOATING NUMBERS ARE EQUAL 1665 006430 022524 CMP (R5)+,(R4)+ ; THIRD WORD 1666 006432 001003 BNE CMPOUT 1667 006434 021514 CMP (R5),(R4) ; LAST 1668 006436 001001 BNE CMPOUT 1669 006440 005003 CMPCLR: CLR R3 ; FLAG AS EQUAL 1670 006442 006003 CMPOUT: ROR R3 ; SAVE C AND TEST SECOND ARG - 1671 006444 103401 BCS CMPPLS ; SET + 1672 006446 005403 CMPNEG: NEG R3 ; REVERSE C BIT 1673 006450 005703 CMPPLS: TST R3 ; SET CONDITION CODES 1674 006452 013702 177776 MOV @#PSW,R2 ; COPY THEM 1675 006456 042702 177760 BIC #^C17,R2 ; CLEAR ALL BUT CONDITION CODES 1676 006462 042710 000017 BIC #17,(R0) ; CLEAR CURRENT C.C'S OUT 1677 006466 050210 BIS R2,(R0) ; SET NEW ONES 1678 006470 000167 172620 JMP FPEX2 ; ALL DONE 1679 ;---------------------------------------------------------------- 1680 006474 060504 STFX3: ADD R5,R4 ; PROPER AC 1681 006476 060504 STFX2: ADD R5,R4 ; PROPER AC 1682 006500 060504 STFX1: ADD R5,R4 ; PROPER AC 1683 006502 005724 STFX: TST (R4)+ ; AC0 1684 006504 SINC Z2OP 1685 006504 SINC STF ; STATS 1686 006504 005267 003270 INC NMB ; WANT AN ADDRESS 1687 006510 010467 003262 MOV R4,TMP3 ; SAVE POINTER TO AC 1688 006514 CALL GET ; 1689 006520 016702 003252 MOV TMP3,R2 ; AC ADDRESS 1690 006524 103411 BCS STFZ ; BRANCH IF MODE 0 1691 006526 STFY: MOVTU (R2)+,(R1)+ ; PUT NUMBER IN TASK AREA 1692 006536 005367 003230 DEC TMP1 ; CHECK DONE 1693 006542 003371 BGT STFY 1694 006544 000167 172544 JMP FPEX2 ; ALL DONE FPE MACRO D1013 20-SEP-77 12:27 PAGE 19-1 7.7 CMPF,STF,DIVF 1695 006550 012221 STFZ: MOV (R2)+,(R1)+ ; MOVE WITHIN HEADER 1696 006552 005367 003214 DEC TMP1 1697 006556 003374 BGT STFZ ; DONE? 1698 006560 000167 172530 JMP FPEX2 ; YES 1699 ;---------------------------------------------------------------- 1700 006564 060504 DIVFX3: ADD R5,R4 ; PROPER AC 1701 006566 060504 DIVFX2: ADD R5,R4 ; PROPER AC 1702 006570 060504 DIVFX1: ADD R5,R4 ; PROPER AC 1703 006572 005724 DIVFX: TST (R4)+ ; AC0 1704 006574 SINC Z2OP 1705 006574 SINC DIVF ; STATS 1706 006574 005067 171512 CLR FXM ; CLEAR FPSW MASK 1707 006600 010467 003172 MOV R4,TMP3 ; SAVE POINTER TO AC 1708 006604 CALL GET ; GET IT 1709 006610 PUSH R0 ; SAVE THE FPSW POINTER 1710 006612 032710 000200 BIT #200,(R0) ; TEST MODE 1711 006616 001402 BEQ DIVF ; BRANCH IF SINGLE 1712 006620 000167 000440 JMP DIVDX ; GO DO DOUBLE DIVIDE 1713 006624 012703 071762' DIVF: MOV #NUMB+ASF3,R3 ; POINT TO FSRC (DENOMINATOR) 1714 006630 016702 003142 MOV TMP3,R2 ; POINT TO NUMERATOR (FAC) 1715 006634 005046 CLR -(SP) ; MAKE ROOM FOR THE SIGN 1716 006636 006313 ASL (R3) ; GET SIGN OF DENOMINATOR 1717 006640 006116 ROL (SP) ; SAVE IT 1718 006642 005046 CLR -(SP) ; ROOM FOR THE EXPONENT 1719 006644 156316 000001 BISB 1(R3),(SP) ; PUT EXPONENT ON STACK 1720 006650 001544 BEQ DIVCHK ; BRANCH ON DIVIDE BY 0 1721 006652 005416 NEG (SP) ; NEGATE THE EXPONENT 1722 006654 000313 SWAB (R3) ; LEFT JUSTIFY THE DENOMINATOR 1723 006656 000261 SEC ; PUT IN THE NORMAL BIT 1724 006660 006023 ROR (R3)+ ; 1725 006662 116363 000001 177776 MOVB 1(R3),-2(R3) ; MOVE LEFT 1726 006670 000313 SWAB (R3) ; 1727 006672 105013 CLRB (R3) ; CLEAR OUT BOTTOM BYTE 1728 006674 005000 CLR R0 ; R0!R1 WILL HOLD NUMERATOR FRACTION 1729 006676 005001 CLR R1 ; 1730 006700 006312 ASL (R2) ; SHIFT NUMERATOR LEFT 1731 006702 005566 000002 ADC 2(SP) ; GET FINAL SIGN 1732 006706 156201 000001 BISB 1(R2),R1 ; GET EXPONENT OF NUMERATOR 1733 006712 001516 BEQ DIVZRO ; BRANCH IF ANSWER IS ZERO 1734 006714 060116 ADD R1,(SP) ; GET SUM OF EXPONENTS 1735 006716 005001 CLR R1 ; RESET R1 1736 006720 151200 BISB (R2),R0 ; MOVE NUMERATOR FRACTION TO REGS. 1737 006722 000300 SWAB R0 ; (LEFT JUSTIFIED) 1738 006724 000261 SEC ; NORMAL BIT 1739 006726 006000 ROR R0 ; IN 1740 006730 156200 000003 BISB 3(R2),R0 ; SECOND BYTE IN 1741 006734 156201 000002 BISB 2(R2),R1 ; THIRD AND LAST BYTE IN 1742 006740 000301 SWAB R1 ; PROPER ORDER 1743 006742 006000 ROR R0 ; MAKE SURE NUMERATOR AND DENOM. PLUS 1744 006744 006001 ROR R1 ; 1745 006746 006043 ROR -(R3) ; 1746 006750 006063 000002 ROR 2(R3) ; DONE 1747 006754 020023 CMP R0,(R3)+ ; COMPARE HI NUMER. AND DENOM. 1748 006756 103403 BCS DIVDHI ; BRANCH IF DENOM. BIGGER 1749 006760 006000 ROR R0 ; DIVIDE NUMERATOR BY 2 1750 006762 006001 ROR R1 ; SO THAT IT IS LESS THAN DENOM. 1751 006764 005216 INC (SP) ; ADJUST EXPONENT FPE MACRO D1013 20-SEP-77 12:27 PAGE 19-2 7.7 CMPF,STF,DIVF 1752 006766 000241 DIVDHI: CLC ; CLEAR FOR ROTATES 1753 006770 006013 ROR (R3) ; MAKE LOW HALF OF DENOM PLUS 1754 006772 005743 TST -(R3) ; POINT TO FIRST WORD 1755 006774 006000 ROR R0 ; SCALE THE NUMERATOR FOR DIVIDE 1756 006776 006001 ROR R1 1757 007000 010004 MOV R0,R4 ; NUMERATOR TO DIVIDEND 1758 007002 010105 MOV R1,R5 ; 1759 007004 071423 DIV (R3)+,R4 ; DIVIDE 1760 007006 010501 MOV R5,R1 ; SAVE REMAINDER 1761 007010 010400 MOV R4,R0 ; SAVE QUOTIENT 1762 007012 070413 MUL (R3),R4 ; GET Q*LO(DENOM) 1763 007014 006201 ASR R1 ; SCALE REMAINDER 1764 007016 160104 SUB R1,R4 ; Q*D-R 1765 007020 073427 177777 ASHC #-1,R4 ; SCALE 1766 007024 071443 DIV -(R3),R4 ; (Q*D-R)/C 1767 007026 005404 NEG R4 ; 1768 007030 073427 177762 ASHC #-14.,R4 ; UNSCALE 1769 007034 060004 ADD R0,R4 ; 1770 007036 073427 000001 DIVNBT: ASHC #1,R4 ; 1771 007042 100402 BMI DIVNB ; BRANCH FOR NORMAL BIT 1772 007044 005316 DEC (SP) ; ADJUST EXPONENT 1773 007046 000773 BR DIVNBT ; KEEP LOOKING 1774 007050 073427 177771 DIVNB: ASHC #-7,R4 ; ALIGN FRACTION 1775 007054 010412 MOV R4,(R2) ; SAVE HI ORDER ANSWER 1776 007056 012604 MOV (SP)+,R4 ; GET EXPONENT 1777 007060 062704 000200 ADD #200,R4 ; PUT IN EXCESS 128. 1778 007064 003002 BGT DIVNU ; BRANCH ON NO UNDERFLOW 1779 007066 CALL UNDER ; HANDLE UNDERFLOW 1780 007072 022704 000377 DIVNU: CMP #377,R4 ; HOW ABOUT OVERFLOW? 1781 007076 002002 BGE DIVOK ; BRANCH IF NO OVERFLOW 1782 007100 CALL OVER ; HANDLE OVERFLOW 1783 007104 110462 000001 DIVOK: MOVB R4,1(R2) ; PUT EXPONENT IN 1784 007110 006026 ROR (SP)+ ; GET SIGN 1785 007112 006022 ROR (R2)+ ; SAVE IT 1786 007114 006005 ROR R5 ; 1787 007116 010512 MOV R5,(R2) ; SAVE THE SECOND WORD 1788 007120 TRKTST @(SP),10$ ; CHECK TRUNCATE - BRANCH IF SET 1789 007130 005512 ADC (R2) ; ROUND 1790 007132 005542 ADC -(R2) ; 1791 007134 TSTOVF ; TEST FOR OVERFLOW 1792 007144 000167 175656 10$: JMP ADDOUT 1793 007150 022626 DIVZRO: CMP (SP)+,(SP)+ ; GET RID OF SIGN AND EXPONENT 1794 007152 CLRWRD 2,(R2) ; FORCE TO EXACTLY ZERO 1795 007156 000167 175644 JMP ADDOUT ; GO FINISH AND EXIT 1796 007162 012767 000004 171120 DIVCHK: MOV #4,FPXCOD ; SET FEC 1797 007170 SINC FDZ ; STATS 1798 007170 SINC TFPE ; 1799 007170 022626 CMP (SP)+,(SP)+ ; GET RID OF EXPONENT AND SIGN 1800 007172 042776 000017 000000 BIC #17,@(SP) ; CLEAR OUT CC'S 1801 007200 052776 100004 000000 BIS #100004,@(SP) ; SET Z BIT 1802 007206 POP R0 ; RESTORE R0 1803 007210 017767 002562 002544 MOV @TMP3,NUMB ; PLACE THIS FOR STATUS CHECK 1804 007216 000167 175640 JMP ADDDIV ; LEAVE 1805 007222 012767 000012 171060 UNDER: MOV #12,FPXCOD ; SET FEC 1806 007230 012767 002000 171054 MOV #2000,FXM ; SET MASK 1807 007236 042776 000017 000004 BIC #17,@4(SP) ; CLEAR OUT OLD CC'S 1808 007244 SINC UNDER ; STATS FPE MACRO D1013 20-SEP-77 12:27 PAGE 19-3 7.7 CMPF,STF,DIVF 1809 007244 000207 RETURN 1810 007246 022626 DIVDZR: CMP (SP)+,(SP)+ ; GET RID OF SIGN AND EXPONENT 1811 007250 CLRWRD 4,(R4) ; SET TO ZERO 1812 007260 000167 175542 JMP ADDOUT ; DONE 1813 ;--------------------------------------------------------------- FPE MACRO D1013 20-SEP-77 12:27 PAGE 20 7.8 DIVD 1815 .SBTTL 7.8 DIVD 1816 ;---------------------------------------------------------------- 1817 007264 DIVDX: 1818 007264 SINC DIVD ; STATS 1819 007264 016704 002506 MOV TMP3,R4 ; POINTER TO FAC (NUMERATOR) 1820 007270 012705 071762' MOV #NUMB+ASF3,R5 ; POINTER OT FSRC (DENOMINATOR 1821 007274 005000 CLR R0 ; R0!R1!R2!R3 TO CONTAIN NUM. FRACTION 1822 007276 005001 CLR R1 1823 007300 005002 CLR R2 1824 007302 005003 CLR R3 1825 007304 006315 ASL (R5) ; SHIFT LEFT DENOMINATOR 1826 007306 006146 ROL -(SP) ; SAVE SIGN 1827 007310 005046 CLR -(SP) ; MAKE ROOM FOR EXPONENT 1828 007312 156516 000001 BISB 1(R5),(SP) ; SAVE EXPONENT 1829 007316 001721 BEQ DIVCHK ; BRANCH ON DIVIDE BY ZERO 1830 007320 005416 NEG (SP) ; NEGATE EXPONENT 1831 007322 000315 SWAB (R5) ; LEFT JUSTIFY DENOMINATOR 1832 007324 000261 SEC ; PUT IN HIDDEN BIT 1833 007326 006025 ROR (R5)+ ; IN 1834 007330 116565 000001 177776 MOVB 1(R5),-2(R5) ; SHIFT LEFT 1835 007336 000325 SWAB (R5)+ ; 1836 007340 116565 000001 177776 MOVB 1(R5),-2(R5) 1837 007346 000325 SWAB (R5)+ 1838 007350 116565 000001 177776 MOVB 1(R5),-2(R5) 1839 007356 000315 SWAB (R5) ; DONE 1840 007360 105015 CLRB (R5) ; CLEAR LOW BYTE 1841 007362 162705 000006 SUB #6,R5 ; POINT TO TOP OF FSRC 1842 007366 006314 ASL (R4) ; SHIFT NUMERATOR 1843 007370 005566 000002 ADC 2(SP) ; GET FINAL SIGN 1844 007374 156403 000001 BISB 1(R4),R3 ; GET EXPONENT OF NUMERATOR 1845 007400 001722 BEQ DIVDZR ; BRANCH IF ANSWER IS ZERO 1846 007402 060316 ADD R3,(SP) ; ADD EXPONENTS 1847 007404 005003 CLR R3 ; 1848 007406 151400 BISB (R4),R0 ; LEFT JUSTIFY NUMERATOR TO REGISTERS 1849 007410 000300 SWAB R0 ; 1850 007412 000261 SEC ; PUT IN NORMAL BIT 1851 007414 006000 ROR R0 1852 007416 156400 000003 BISB 3(R4),R0 1853 007422 156401 000002 BISB 2(R4),R1 1854 007426 000301 SWAB R1 1855 007430 156401 000005 BISB 5(R4),R1 1856 007434 156402 000004 BISB 4(R4),R2 1857 007440 000302 SWAB R2 1858 007442 156402 000007 BISB 7(R4),R2 1859 007446 156403 000006 BISB 6(R4),R3 1860 007452 000303 SWAB R3 ; DONE 1861 007454 CLRWRD 3,(R4) ; CLEAR FAC TO PREPARE FOR ANSWER 1862 007462 024444 CMP -(R4),-(R4) ; POINT BACK TO TOP OF FAC 1863 007464 020025 CMP R0,(R5)+ ; COMPARE NUMERATOR AND DENOMINATOR 1864 007466 101014 BHI DIVDDL ; BRANCH IF DENOM IS SMALLER 1865 007470 103420 BLO DIVDDH ; BRANCH IF DENOM IS LARGER 1866 007472 020125 CMP R1,(R5)+ ; TEST NEXT WORD 1867 007474 101011 BHI DIVDDL ; BRANCH DEN LO 1868 007476 103415 BLO DIVDDH ; BRANCH DEN HI 1869 007500 020225 CMP R2,(R5)+ ; COMPARE NEXT 1870 007502 101006 BHI DIVDDL ; BRANCH DEN LO 1871 007504 103412 BLO DIVDDH ; BRANCH DEN HI FPE MACRO D1013 20-SEP-77 12:27 PAGE 20-1 7.8 DIVD 1872 007506 020315 CMP R3,(R5) ; LAST WORD 1873 007510 101003 BHI DIVDDL ; BRANCH DEN LO 1874 007512 001007 BNE DIVDDH ; BRANCH DEN HI 1875 007514 005216 INC (SP) ; INCREMENT EXPONENT 1876 007516 000443 BR DIVDF1 ; SAME 1877 007520 006000 DIVDDL: ROR R0 ; DIVIDE NUMERATOR BY 2 1878 007522 006001 ROR R1 ; WANT NUMER < DENOM 1879 007524 006002 ROR R2 1880 007526 006003 ROR R3 1881 007530 005216 INC (SP) ; ADD TO EXPONENT 1882 007532 DIVDDH: PUSH #9. ; DO FIRST 9 QUOTIENT BITS 1883 007536 CALL DIV ; GET PARTIAL QUOTIENT 1884 007542 111614 MOVB (SP),(R4) ; SAVE ALL BUT NORMAL BIT IN FAC 1885 007544 005726 TST (SP)+ ; MOVE PAST QUOTIENT 1886 007546 005726 TST (SP)+ ; DONE YET? 1887 007550 001026 BNE DIVDF1 ; BRANCH IF SO 1888 007552 PUSH #16. ; GET NEXT WORD OF QUOTIENT 1889 007556 CALL DIV 1890 007562 005724 TST (R4)+ ; POINT TO SECOND WORD OF FAC 1891 007564 POP (R4)+ ; STORE SECOND WORD OF QUOTIENT 1892 007566 005726 TST (SP)+ ; DONE YET? 1893 007570 001016 BNE DIVDF1 ; BRANCH IF SO 1894 007572 PUSH #16. ; GET NEXT WORD 1895 007576 CALL DIV 1896 007602 POP (R4)+ ; SAVE IN FAC 1897 007604 005726 TST (SP)+ ; DONE YET? 1898 007606 001007 BNE DIVDF1 ; YES 1899 007610 PUSH #16. ; LAST WORD 1900 007614 CALL DIV 1901 007620 POP R3 ; LAST WORD TO R3 1902 007622 005726 TST (SP)+ ; POP THE STACK 1903 007624 000401 BR DIVDFL 1904 007626 005003 DIVDF1: CLR R3 ; EMPTY LAST WORD 1905 007630 DIVDFL: POP R2 ; GET EXPONENT 1906 007632 016704 002140 MOV TMP3,R4 ; POINT TO TOP OF FAC 1907 007636 062702 000200 ADD #200,R2 ; PUT EXCESS 128. INTO EXPONENT 1908 007642 003002 BGT DIVDNU ; BRANCH IF NO UNDERFLOW 1909 007644 CALL UNDER ; SET UNDERFLOW 1910 007650 022702 000377 DIVDNU: CMP #377,R2 ; CHECK FOR OVERFLOW 1911 007654 002002 BGE DIVDOK ; BRANCH IF NO OVERFLOW 1912 007656 CALL OVER ; SET OVERFLOW FLAGS 1913 007662 110264 000001 DIVDOK: MOVB R2,1(R4) ; PUT EXPONENT IN 1914 007666 006026 ROR (SP)+ ; GET SIGN 1915 007670 006024 ROR (R4)+ ; SAVE IT 1916 007672 006024 ROR (R4)+ 1917 007674 006024 ROR (R4)+ 1918 007676 010314 MOV R3,(R4) ; R3 HAS BOTTOM WORD OF ANSWER 1919 007700 006014 ROR (R4) 1920 007702 TRKTST @(SP),10$ ; CHECK TRUNCATE - BRANCH IF SET 1921 007712 005514 ADC (R4) ; ROUND 1922 007714 005544 ADC -(R4) 1923 007716 005544 ADC -(R4) 1924 007720 005544 ADC -(R4) 1925 007722 TSTOVF ; CHECK FOR OVERFLOW 1926 007732 000167 175070 10$: JMP ADDOUT ; GO FINISH 1927 007736 011646 DIV: MOV (SP),-(SP) ; COPY RETURN ADDRESS 1928 007740 PUSH R4 ; SAVE FAC POINTER FPE MACRO D1013 20-SEP-77 12:27 PAGE 20-2 7.8 DIVD 1929 007742 012705 071762' DIV1: MOV #NUMB+ASF3,R5 ; SET POINTER TO DENOMINATOR 1930 007746 006304 ASL R4 ; SHIFT LEFT QUOTIENT 1931 007750 006303 ASL R3 ; SHIFT LEFT NUMERATOR 1932 007752 006102 ROL R2 1933 007754 006101 ROL R1 1934 007756 006100 ROL R0 ; DONE 1935 007760 103414 BCS GO ; ALWAYS GOES FIRST TIME 1936 007762 022500 CMP (R5)+,R0 ; COMPARE DENOM AND NUMER 1937 007764 101027 BHI NOGO ; BRANCH IF DIVISOR LARGER 1938 007766 103411 BLO GO ; BRANCH IF DIVISOR SMALLER 1939 007770 022501 CMP (R5)+,R1 ; COMPARE LOW ORDERS SIMILARLY 1940 007772 101024 BHI NOGO 1941 007774 103406 BLO GO 1942 007776 022502 CMP (R5)+,R2 1943 010000 101021 BHI NOGO 1944 010002 103403 BLO GO 1945 010004 021503 CMP (R5),R3 1946 010006 101016 BHI NOGO 1947 010010 001424 BEQ NEQD ; BRANCH IF NUMER=DENOM 1948 010012 012705 071770' GO: MOV #NUMB+ASF3+6,R5 ; POINT TO BOTTOM OF FAC 1949 010016 161503 SUB (R5),R3 ; NUMER=NUMER-DENOM 1950 010020 005602 SBC R2 1951 010022 005601 SBC R1 1952 010024 005600 SBC R0 1953 010026 164502 SUB -(R5),R2 1954 010030 005601 SBC R1 1955 010032 005600 SBC R0 1956 010034 164501 SUB -(R5),R1 1957 010036 005600 SBC R0 1958 010040 164500 SUB -(R5),R0 ; DONE WITH SUBTRACTION 1959 010042 005204 INC R4 ; SET A BIT IN THE QUOTIENT 1960 010044 005366 000006 NOGO: DEC 6(SP) ; DECREMENT COUNT 1961 010050 003334 BGT DIV1 ; REPEAT PROCESS TILL DONE 1962 010052 010466 000004 ALLDUN: MOV R4,4(SP) ; PUT QUOTIENT ON STACK 1963 010056 POP R4 ; RETURN ORIGINAL R4 1964 010060 000207 RETURN ; 1965 010062 005204 NEQD: INC R4 ; INSERT LAST 1 BIT IN QUOTIENT 1966 010064 000401 BR EQ1 1967 010066 006304 EQ2: ASL R4 ; FINISH OUT QUOTIENT WITH 0'S 1968 010070 005366 000006 EQ1: DEC 6(SP) ; DECREMENT COUNTER 1969 010074 003374 BGT EQ2 ; FINISHED? 1970 010076 005266 000006 INC 6(SP) ; SET NO MORE NUMERATOR FLAG 1971 010102 000763 BR ALLDUN ; GO BACK 1972 ;--------------------------------------------------------------- FPE MACRO D1013 20-SEP-77 12:27 PAGE 21 7.9 STEXP,STCFI 1974 .SBTTL 7.9 STEXP,STCFI 1975 ;---------------------------------------------------------------- 1976 010104 060504 STEXP3: ADD R5,R4 ; PROPER AC 1977 010106 060504 STEXP2: ADD R5,R4 ; PROPER AC 1978 010110 060504 STEXP1: ADD R5,R4 ; PROPER AC 1979 010112 005724 STEXPX: TST (R4)+ ; AC0 1980 010114 SINC Z2OP 1981 010114 SINC STEXP ; STATS 1982 010114 011403 MOV (R4),R3 ; GET THE FIRST WORD OF THE # IN THE AC 1983 010116 072327 177771 ASH #-7,R3 ; RIGHT JUSTIFY THE EXPONENT 1984 010122 042703 177400 BIC #177400,R3 ; MAKE SURE THERE IS JUST THE EXPONENT 1985 010126 162703 000200 SUB #200,R3 ; NOT EXCESS 200 ANYMORE 1986 010132 010367 001640 MOV R3,TMP3 ; SAVE THE EXPONENT 1987 010136 012705 000002 MOV #2,R5 ; SET FLAG FOR GETADDRESS ROUTINE 1988 010142 005267 001632 INC NMB ; WANT AN ADDRESS 1989 010146 CALL GETX ; GET THE ADDRESS 1990 010152 103406 BCS STEXPY ; MODE 0 BRANCH 1991 010154 MOVTU TMP3,(R1) ; PUT EXPONENT IN TASK 1992 010166 000402 BR .+6 1993 010170 016714 001602 STEXPY: MOV TMP3,(R4) ; SAVE EXPONENT IN A GENERAL REGISTER 1994 010174 005767 001576 TST TMP3 ; SET CONDTION CODES 1995 010200 013702 177776 MOV @#PSW,R2 ; GET PSW 1996 010204 042702 177760 STETST: BIC #177760,R2 ; CLEAR ALL BUT CONDITION CODES 1997 010210 042710 000017 BIC #17,(R0) ; CLEAR ONLY CONDITION CODES IN FPSW 1998 010214 050210 BIS R2,(R0) ; PUT THE CODES IN FPSW 1999 010216 042766 000017 000022 BIC #17,PCOFF2+2(SP) ; 2000 010224 050266 000022 BIS R2,PCOFF2+2(SP) ; SAVE THE CONDITON CODES IN USER PSW 2001 010230 000167 171060 JMP FPEX2 ; DONE 2002 ;--------------------------------------------------------------- 2003 010234 060504 STCFI3: ADD R5,R4 ; PROPER AC 2004 010236 060504 STCFI2: ADD R5,R4 ; PROPER AC 2005 010240 060504 STCFI1: ADD R5,R4 ; PROPER AC 2006 010242 005724 STCFIX: TST (R4)+ ; AC0 2007 010244 SINC Z2OP 2008 010244 SINC STCFI ; STATS 2009 010244 005067 170042 CLR FXM ; CLEAR FE FLAG 2010 010250 PUSH R2 ; SAVE THE DESTINATION FIELD 2011 010252 010405 MOV R4,R5 ; GET ADDRESS OF FAC 2012 010254 012501 MOV (R5)+,R1 ; FIRST WORD FROM FAC 2013 010256 012502 MOV (R5)+,R2 ; SECOND 2014 010260 012503 MOV (R5)+,R3 ; THIRD 2015 010262 105003 CLRB R3 ; DON'T NEED THIS LEAST SIGNIFICANT BYTE 2016 010264 150203 BISB R2,R3 ; MOVE BYTE 3 DOWN 2017 010266 105002 CLRB R2 ; CLEAR WHERE BYTE 3 WAS 2018 010270 150102 BISB R1,R2 ; MOVE BYTE 1 DOWN 2019 010272 052702 000200 BIS #200,R2 ; MAKE SURE HIDDEN BIT IS THERE 2020 010276 000302 SWAB R2 ; R1/ BYTE1:BYTE2 2021 010300 000303 SWAB R3 ; R2/BYTE3:BYTE4 2022 010302 006101 ROL R1 ; ROLL SIGN OUT 2023 010304 006104 ROL R4 ; SAVE IT IN R4 2024 010306 105001 CLRB R1 ; GET RID OF FRACTION 2025 010310 000301 SWAB R1 ; R1/ EXPONENT 2026 010312 162701 000237 SUB #237,R1 ; MAKE EXP A SHIFT COUNT 2027 010316 003140 BGT STCK ; PROBABLE OVERFLOW -- GO CHECK 2028 010320 000241 CLC ; CLEAR CARRY 2029 010322 006002 ROR R2 ; MAKE POSITIVE 2030 010324 006003 ROR R3 ; (SINCE MOST SIG. BIT IS ROLLED RIGHT) FPE MACRO D1013 20-SEP-77 12:27 PAGE 21-1 7.9 STEXP,STCFI 2031 010326 022701 177741 CMP #-37,R1 ; IS THIS A NUMBER LESS THAN ONE? 2032 010332 002147 BGE STZERO ; YES -- GO SET IT TO 0 2033 010334 073201 ASHC R1,R2 ; GET THE NUMBER IN R2 & R3 2034 010336 032710 000100 BIT #100,(R0) ; IS THIS INTEGER OR LONG MODE? 2035 010342 001114 BNE STLONG ; BRANCH ON LONG 2036 010344 005702 TST R2 ; THIS MUST BE ZERO FOR INTEGER 2037 010346 001134 BNE STOVER ; HANDEL OVERFLOW 2038 010350 005403 NEG R3 ; THIS SHOULD BE NEGATIVE 2039 010352 100132 BPL STOVER ; IF NOT, OVERFLOW 2040 010354 102003 BVC STISGN ; IF NOT 100000, BRANCH 2041 010356 006004 ROR R4 ; 100000 IS LEAGL OR NOT DEPENDING ON SGN 2042 010360 103127 BCC STOVER ; IF IT WAS POSITIVE IT IS AN OVERFLOW 2043 010362 000403 BR STIPUT ; GO PUT IT IN 2044 010364 006004 STISGN: ROR R4 ; GET APPROPRIATE SIGN FOR OTHER CASES 2045 010366 103401 BCS .+4 ; LEAVE IT NEGATIVE 2046 010370 005403 NEG R3 ; MAKE IT POSITIVE 2047 010372 010367 001364 STIPUT: MOV R3,NUMB ; SAVE THE INTEGER 2048 010376 POP R2 ; RESTORE THE DESTINATION 2049 010400 012705 000004 MOV #4,R5 ; SET MAX. AUTO INC. 2050 010404 005267 001370 INC NMB ; WANT AN ADDRESS 2051 010410 012703 000100 MOV #100,R3 ; TEST LONG OR INTEGER 2052 010414 CALL GET ; GET THE ADDRESS 2053 010420 103462 BCS STMZ ; GO DO MODE 0 2054 010422 012702 071762' MOV #NUMB+ASF3,R2 ; ADDRESS OF NUMBER(S) 2055 010426 016705 001340 MOV TMP1,R5 ; SAVE THE WORD COUNT FOR LATER 2056 010432 STP: MOVTU (R2)+,(R1)+ ; PUT NUMBER IN USER AREA 2057 010442 077505 SOB R5,STP ; DONE YET? 2058 010444 005767 001312 STCTS: TST NUMB ; SET CONDITION CODES FOR RETURN 2059 010450 013702 177776 MOV @#PSW,R2 ; SAVE THEM IN R2 2060 010454 005367 001312 DEC TMP1 ; ONE WORD O OR TWO? 2061 010460 001405 BEQ STCEC ; BRANCH IF ONE 2062 010462 005767 001276 TST NUMB+2 ; IF TWO, MAKE SURE ENTIRE THING IS 0 2063 010466 001402 BEQ STCEC ; BEFORE SETTING THE Z BIT 2064 010470 042702 000004 BIC #4,R2 ; -- HERE CLEAR THE Z BIT SINCE WORD 2 2065 ; IS NOT ZERO 2066 010474 005767 167612 STCEC: TST FXM ; WAS A CONVERSION ERROR ENCOUNTERED? 2067 010500 001641 BEQ STETST ; NO -- GO SET CONDITION CODES & QUIT 2068 010502 005202 INC R2 ; SET CARRY 2069 010504 032710 000400 BIT #400,(R0) ; DO WE INTERRUPT ON THIS CONDITION? 2070 010510 001635 BEQ STETST ; NO -- JUST HAVE THE CARRY SET 2071 010512 032710 040000 BIT #40000,(R0) ; IS INHIBIT INTERRUPT BIT SET? 2072 010516 001232 BNE STETST ; YES -- LEAVE 2073 010520 042702 177760 BIC #177760,R2 ; CLEAR ALL BUT CC'S 2074 010524 042766 000017 000022 BIC #17,PCOFF2+2(SP) 2075 010532 050266 000022 BIS R2,PCOFF2+2(SP) ; SET CC'S IN PSW 2076 010536 052710 100000 FPE: BIS #100000,(R0) ; FLAG ERROR IN FPSW 2077 010542 042702 177760 BIC #177760,R2 ; PUT CONDITION CODES IN FPSW 2078 010546 042710 000017 BIC #17,(R0) ; CLEAR OUT OLD ONES 2079 010552 050210 BIS R2,(R0) ; THERE NOW 2080 010554 013766 000244 000016 MOV @#244,16(SP) ; COVER KPAR3 WITH ADDRESS 2081 010562 SINC FPE ; STATS 2082 010562 000167 001674 JMP FPEOUT ; GO SET UP SO SYSTEM CAN MAKE AN AST 2083 010566 016714 001170 STMZ: MOV NUMB,(R4) ; PUT NUMBER IN USER REGISTER 2084 010572 000724 BR STCTS ; * 2085 010574 006004 STLONG: ROR R4 ; GET THE SIGN 2086 010576 103003 BCC STLPUT ; BRANCH IF POSITIVE 2087 010600 005403 NEG R3 ; MAKE THE DOUBLE WORD NEGATIVE FPE MACRO D1013 20-SEP-77 12:27 PAGE 21-2 7.9 STEXP,STCFI 2088 010602 005502 ADC R2 ; 2089 010604 005402 NEG R2 ; DONE 2090 010606 010267 001150 STLPUT: MOV R2,NUMB ; SAVE THE LONG INTEGER 2091 010612 010367 001146 MOV R3,NUMB+2 ; LOW ORDER IS SECOND 2092 010616 000667 BR STIPUT+4 ; GO GET ADDRESS 2093 ; 2094 010620 005301 STCK: DEC R1 ; IS THIS THE DOUBLE WORD MAX. NEGATIVE? 2095 010622 001006 BNE STOVER ; NO WAY 2096 010624 005402 NEG R2 ; IF SO, THIS MUST BE 100000 2097 010626 102004 BVC STOVER ; BRANCH IF NOT 2098 010630 005703 TST R3 ; THIS WOULD NEED TO BE 0 2099 010632 001002 BNE STOVER ; BRANCH IF NOT 2100 010634 006004 ROR R4 ; LAST REQUIREMENT IS SIGN BE NEGATIVE 2101 010636 103763 BCS STLPUT ; HOORAY -- IT IS -- GO PUT IT IN 2102 ; 2103 010640 STOVER: 2104 010640 012767 000006 167442 MOV #6,FPXCOD ; PUT IN THE FEC 2105 010646 SINC ICE ; STATS 2106 010646 SINC TFPE ; 2107 010646 005267 167440 INC FXM ; SET OVERFLOW FLAG 2108 010652 005067 001104 STZERO: CLR NUMB ; PUT ZEROS IN 2109 010656 005067 001102 CLR NUMB+2 ; BOTH WORDS 2110 010662 000645 BR STIPUT+4 ; GO GET ADDRESS AND STUFF 2111 ;--------------------------------------------------------------- FPE MACRO D1013 20-SEP-77 12:27 PAGE 22 7.10 STCFD,LDCDF,LDEXP,LDCIF 2113 .SBTTL 7.10 STCFD,LDCDF,LDEXP,LDCIF 2114 ;---------------------------------------------------------------- 2115 010664 060504 STCFD3: ADD R5,R4 ; PROPER AC 2116 010666 060504 STCFD2: ADD R5,R4 ; PROPER AC 2117 010670 060504 STCFD1: ADD R5,R4 ; PROPER AC 2118 010672 005724 STCFDX: TST (R4)+ ; AC0 2119 010674 010467 001076 MOV R4,TMP3 ; SAVE POINTER TO AC 2120 010700 SINC Z2OP 2121 010700 SINC STCFD ; STATS 2122 010700 030310 BIT R3,(R0) ; IS CURRENT MODE DOUBLE OR FLOAT 2123 010702 001040 BNE STCDFX ; CONVERT FROM DOUBLE TO FLOATING 2124 010704 006305 ASL R5 ; A.I. BY 10 2125 010706 005267 001066 INC NMB ; WANT AN ADDRESS 2126 010712 CALL GET ; GET THE ADDRESS 2127 010716 016702 001054 MOV TMP3,R2 ; GET ADDRESS OF FAC 2128 010722 103422 BCS STCFDY ; BRANCH ON MODE 0 2129 010724 MOVTU (R2)+,(R1)+ ; PUT THE NUMBER IN USER AREA 2130 010734 MOVTU (R2)+,(R1)+ ; SECOND WORD 2131 010744 005046 CLR -(SP) ; FILL WITH ZEROES 2132 010746 006621 MTPI (R1)+ ; 2133 010750 IFERR ODAD1 ; CHECK FOR LEGAL ADDRESSES 2134 010754 005046 CLR -(SP) ; LAST WORD 2135 010756 006611 MTPI (R1) ; DONE 2136 010760 IFERR ODAD1 ; CHECK FOR LEGAL ADDRESSES 2137 010764 000167 170272 JMP TSTFY ; GO SET CONDITION CODES 2138 010770 012221 STCFDY: MOV (R2)+,(R1)+ ; MOVE FAC TO FAC IN MODE 0 2139 010772 012221 MOV (R2)+,(R1)+ ; 2140 010774 CLRWRD 2,(R1) ; FILL WITH ZEROES 2141 011000 000167 170256 STCFDZ: JMP TSTFY 2142 ; 2143 011004 STCDFX: 2144 011004 005067 167302 CLR FXM ; CLEAR FPE FLAG 2145 011010 010405 MOV R4,R5 ; GET FAC ADDRESS 2146 011012 TRKTST (R0),STCDFY ; TEST TRUNCATE - BRANCH IF SET 2147 011020 006165 000004 ROL 4(R5) ; ROUND 2148 011024 005565 000002 ADC 2(R5) ; 2149 011030 005515 ADC (R5) ; ROUNDING COMPLETE 2150 011032 103450 BCS STCDFV ; BRANCH ON OVERFLOW 2151 011034 102447 BVS STCDFV ; 2152 011036 012705 000004 STCDFY: MOV #4,R5 ; GET THE ADDRESS 2153 011042 005267 000732 INC NMB ; WANT AN ADDRESS 2154 011046 CALL GET 2155 011052 016702 000720 MOV TMP3,R2 ; GET FAC ADDRESS AGAIN 2156 011056 103452 BCS STCDFZ ; BRANCH IF MODE IS 0 2157 011060 MOVTU (R2)+,(R1)+ ; MOVE NUMBER TO USER 2158 011070 MOVTU (R2),(R1) ; 2159 011100 005767 167206 STCDFB: TST FXM ; WAS THERE AN EXCEPTION? 2160 011104 001002 BNE .+6 ; BRACHH IF SO 2161 011106 000167 170150 JMP TSTFY ; GO SET CONDITION CODES -- 2162 011112 032710 001000 BIT #1000,(R0) ; INTERRUPT? 2163 011116 001414 BEQ STCDFO ; IF NOT LEAVE 2164 011120 032710 040000 BIT #40000,(R0) ; INHIBIT ALL INTERRUPTS SET? 2165 011124 001011 BNE STCDFO ; IF SO, DON'T INTERRUPT 2166 011126 012702 000006 MOV #6,R2 ; SET ZERO CONDITION CODE 2167 011132 005777 000640 TST @TMP3 ; SEE ABOUT SETTING NEGATIVE 2168 011136 002002 BGE 10$ 2169 011140 012702 000016 MOV #16,R2 FPE MACRO D1013 20-SEP-77 12:27 PAGE 22-1 7.10 STCFD,LDCDF,LDEXP,LDCIF 2170 011144 000167 177366 10$: JMP FPE 2171 011150 000167 170112 STCDFO: JMP TSTFY2 ; LEAVE V BIT SET 2172 011154 005267 167132 STCDFV: INC FXM ; SET FEC FLAG 2173 011160 062715 100000 ADD #100000,(R5) ; PUT SIGN RIGHT 2174 011164 042710 000017 BIC #17,(R0) ; CLEAR CONDITION CODES 2175 011170 052710 000002 BIS #2,(R0) ; AND SET V 2176 011174 012767 000010 167106 MOV #10,FPXCOD ; SET UP THE RIGHT FEC 2177 011202 000715 BR STCDFY ; CONTINUE NORMAL PROCESS 2178 011204 012221 STCDFZ: MOV (R2)+,(R1)+ ; MOVE FAC TO FAC 2179 011206 011221 MOV (R2),(R1)+ ; DONE 2180 011210 CLRWRD 2,(R1) ; CLEAR OUT REMAINDER OF FAC 2181 011214 000731 BR STCDFB 2182 ;--------------------------------------------------------------- 2183 011216 060504 LDCDF3: ADD R5,R4 ; PROPER AC 2184 011220 060504 LDCDF2: ADD R5,R4 ; PROPER AC 2185 011222 060504 LDCDF1: ADD R5,R4 ; PROPER AC 2186 011224 005724 LDCDFX: TST (R4)+ ; AC0 2187 011226 010467 000544 MOV R4,TMP3 ; SAVE POINTER TO AC 2188 011232 SINC Z2OP 2189 011232 SINC LDCDF ; STATS 2190 011232 030310 BIT R3,(R0) ; TEST MODE 2191 011234 001044 BNE LDCFDX ; BRANCH IF MODE IS DOUBLE 2192 011236 006305 ASL R5 ; INCREMENT REGISTERS BY 20/2 2193 011240 CALL GET ; GO GET NUMBER 2194 011244 012705 071762' MOV #NUMB+ASF3,R5 ; R5 HAS ADDRESS OF NUMBER 2195 011250 005067 167036 CLR FXM ; CLEAR FPE FLAG 2196 011254 TRKTST (R0),LDCDFY ; IF TRNK SET, DON'T ROUND 2197 011262 006165 000004 ROL 4(R5) ; ROUND 2198 011266 005565 000002 ADC 2(R5) ; 2199 011272 005515 ADC (R5) ; 2200 011274 103410 BCS LDCDFV ; BRANCH ON OVERFLOW 2201 011276 102407 BVS LDCDFV ; 2202 011300 016702 000472 LDCDFY: MOV TMP3,R2 ; R2 HAS ADDRESS OF FAC 2203 011304 012522 MOV (R5)+,(R2)+ ; MOV THE WORD IN 2204 011306 011522 MOV (R5),(R2)+ ; SECOND ONE 2205 011310 CLRWRD 2,(R2) ; CLEAR OUT THE REST OF THE REGISTER 2206 011314 000671 BR STCDFB ; GO FINISH 2207 011316 005267 166770 LDCDFV: INC FXM ; SET THE FPE FLAG 2208 011322 012767 000010 166760 MOV #10,FPXCOD ; PUT IN FEC 2209 011330 042710 000017 BIC #17,(R0) ; CLEAR OUT CONDITION CODES 2210 011334 052710 000002 BIS #2,(R0) ; SET THE V BIT 2211 011340 062715 100000 ADD #100000,(R5) ; GET THE SIGN RIGHT 2212 011344 000755 BR LDCDFY ; CONTINUE WITH REGULAR PROCESSING 2213 011346 006205 LDCFDX: ASR R5 ; INCREMENT BY 4 2214 011350 CALL GET ; GET THE NUMBER 2215 011354 012702 071762' MOV #NUMB+ASF3,R2 ; GET ADDRESS OF NUMBER 2216 011360 016701 000412 MOV TMP3,R1 ; ADDRESS OF FAC 2217 011364 000601 .IIF NDF STAT BR STCFDY ; GO FINISH 2218 .IIF DF STAT JMP STCFDY 2219 ;--------------------------------------------------------------- 2220 011366 060504 LDEXP3: ADD R5,R4 ; PROPER AC 2221 011370 060504 LDEXP2: ADD R5,R4 ; PROPER AC 2222 011372 060504 LDEXP1: ADD R5,R4 ; PROPER AC 2223 011374 005724 LDEXPX: TST (R4)+ ; AC0 2224 011376 SINC Z2OP 2225 011376 SINC LDEXP ; STATS 2226 011376 012705 000002 MOV #2,R5 ; NEED ONE NUMBER FPE MACRO D1013 20-SEP-77 12:27 PAGE 22-2 7.10 STCFD,LDCDF,LDEXP,LDCIF 2227 011402 010467 000370 MOV R4,TMP3 ; SAVE POINTER TO AC 2228 011406 CALL GETX ; GET IT 2229 011412 016703 000344 MOV NUMB,R3 ; R3 HAS THE NUMBER 2230 011416 103001 BCC .+4 ; ASSUMING IT WAS NOT MODE 0 2231 011420 011403 MOV (R4),R3 ; IF MODE 0, R3 GETS THE NUMBER HERE 2232 011422 062703 000200 ADD #200,R3 ; CHANGE TO EXCESS 200 NOTATION 2233 011426 072327 000007 ASH #7,R3 ; SHIFT IT TO PROPER POSITION 2234 011432 042703 100177 BIC #100177,R3 ; CLEAR OUT ANY EXTRAS 2235 011436 016705 000334 MOV TMP3,R5 ; R5 HAS ADDRESS OF AC 2236 011442 042715 077600 BIC #077600,(R5) ; CLEAR OUT ANY EXISTING EXPONENT 2237 011446 050315 BIS R3,(R5) ; PUT THE NUW ONE IN 2238 011450 011567 000306 MOV (R5),NUMB ; PREPARE TO SET CONDITION CODES 2239 011454 000167 167602 JMP TSTFY ; GO DO IT 2240 ;--------------------------------------------------------------- 2241 011460 060504 LDCIF3: ADD R5,R4 ; PROPER AC 2242 011462 060504 LDCIF2: ADD R5,R4 ; PROPER AC 2243 011464 060504 LDCIF1: ADD R5,R4 ; PROPER AC 2244 011466 005724 LDCIFX: TST (R4)+ ; AC0 2245 011470 SINC Z2OP 2246 011470 SINC LDCIF ; STATS 2247 011470 006203 ASR R3 ; CHECK INTEGER OR LONG BIT IN FPSW 2248 011472 006205 ASR R5 ; MAX AUTO INCREMENT IS 4 2249 011474 010467 000276 MOV R4,TMP3 ; SAVE POINTER TO AC 2250 011500 CALL GET ; 2251 011504 016705 000266 MOV TMP3,R5 ; R5 HAS FAC ADDRESS 2252 011510 011402 MOV (R4),R2 ; PUT NUMBER IN R2 (MODE 0) 2253 011512 103402 BCS 10$ ; WAS IT RIGHT -- IF SO BRANCH 2254 011514 016702 000242 MOV NUMB,R2 ; PUT NON MODE 0 NUMBER IN 2255 011520 032710 000100 10$: BIT #100,(R0) ; INTEGER OR LONG MODE? 2256 011524 001037 BNE LDCLF ; BRANCH IF LONG 2257 011526 005702 TST R2 ; CLEAR CARRY BIT 2258 011530 003002 BGT LDPOS ; BRANCH IF NUMBER IS POSITIVE 2259 011532 001424 BEQ LDZERO ; BRANCH IF NUMBER IS 0 2260 011534 005402 NEG R2 ; NUMBER IS NEGATIVE -- MAKE IT POSITIVE 2261 011536 006104 LDPOS: ROL R4 ; SAVE THE SIGN IN R4 2262 011540 012703 000221 MOV #221,R3 ; R3 HAS MAX EXPONENT 2263 011544 006302 LDNORM: ASL R2 ; NORMALIZE THE INTEGER 2264 011546 005303 DEC R3 ; SUBTRACT ONE FROM EXP. FOR EACH SHIFT 2265 011550 103375 BCC LDNORM ; KEEP SHIFTING UNTIL FINISHED 2266 011552 005065 000002 CLR 2(R5) ; CLEAR OUT SECOND WORD 2267 011556 110265 000003 MOVB R2,3(R5) ; SAVE THE LOW ORDER FRACTION 2268 011562 105002 CLRB R2 ; CLEAR OUT LOW ORDER FRACTION 2269 011564 150302 BISB R3,R2 ; PUT IN EXPONENT 2270 011566 000302 SWAB R2 ; PUT EXPONENT ON RIGHT SIDE OF R2 2271 011570 006004 ROR R4 ; LOAD SIGN INTO CARRY BIT 2272 011572 006002 ROR R2 ; PUT THE SIGN IN 2273 011574 010225 MOV R2,(R5)+ ; STORE FIRST WORD 2274 011576 006015 ROR (R5) ; SHIFT CARRY TO SECOND WORD 2275 011600 005725 TST (R5)+ ; POINT TO NEXT WORD 2276 011602 000402 BR .+6 ; CLEAR OUT REMAINING 2277 011604 LDZERO: CLRWRD 4,(R5) ; CLEAR IT 2278 011614 010267 000142 MOV R2,NUMB ; WANT TO SET CONDITION CODES 2279 011620 000167 167436 JMP TSTFY ; GO DO IT 2280 011624 LDCLF: 2281 011624 103406 BCS LD027 ; CLEAR SECOND WORD IF MODE 0 2282 011626 005367 000140 DEC TMP1 ; TMP1 IS WORD COUNT 2283 011632 001403 BEQ LD027 ; CLEAR SECOND WORD IF IMMEDIATE MODE FPE MACRO D1013 20-SEP-77 12:27 PAGE 22-3 7.10 STCFD,LDCDF,LDEXP,LDCIF 2284 011634 016703 000124 MOV NUMB+2,R3 ; SECOND WORD IS FROM USER FOR ALL OTHERS 2285 011640 000401 BR .+4 ; CONTINUE 2286 011642 005003 LD027: CLR R3 ; SECOND WORD IS CLEARED 2287 011644 005702 TST R2 ; DECIDE THE SIGN 2288 011646 003005 BGT LDCPOS ; POSITIVE 2289 011650 001441 BEQ LDC0 ; UPPER HALF IS ZERO -- GO TEST LOWER 2290 011652 005403 NEG R3 ; MAKE A NEGATIVE NUMBER POSITIVE 2291 011654 005502 ADC R2 ; 2292 011656 005402 NEG R2 ; 2293 011660 000261 SEC ; SET FOR SIGN 2294 011662 006146 LDCPOS: ROL -(SP) ; SAVE SIGN ON THE STACK 2295 011664 012704 000241 MOV #241,R4 ; SET MAX EXPONENT 2296 011670 005304 LDCNRM: DEC R4 ; DECREMENT EXPONENT FOR EACH SHIFT 2297 011672 006303 ASL R3 ; LOW ORDER 2298 011674 006102 ROL R2 ; HIGH ORDER 2299 011676 103374 BCC LDCNRM ; SHIFT UNTIL NORMALIZED 2300 011700 005065 000004 CLR 4(R5) ; MAKE ROOM FOR RESULTS 2301 011704 110365 000005 MOVB R3,5(R5) ; PUT IN LEAST SIGNIFICANT PART 2302 011710 105003 CLRB R3 ; MAKE ROOM 2303 011712 150203 BISB R2,R3 ; SECOND MOST SIGNIFICANT PART 2304 011714 105002 CLRB R2 ; MAKE ROOM 2305 011716 150402 BISB R4,R2 ; PUT IN EXPONENT 2306 011720 000302 SWAB R2 ; NOW PUT THINGS IN PROPER ORDER 2307 011722 000303 SWAB R3 ; SAME HERE 2308 011724 006026 ROR (SP)+ ; PUT SIGN IN CARRY BIT 2309 011726 006002 ROR R2 ; SHIFT EVERYTHING ONE TO PUT IN SIGN 2310 011730 006003 ROR R3 ; 2311 011732 006065 000004 ROR 4(R5) ; ALL DONE 2312 011736 010225 MOV R2,(R5)+ ; PUT IN FIRST WORD 2313 011740 010325 MOV R3,(R5)+ ; PUT IN SECOND WORD 2314 011742 032710 000200 BIT #200,(R0) ; WANT DOUBLE OR FLOATING? 2315 011746 001720 BEQ LDZERO+4 ; FOR FIX, ERASE THE LEAST SIGNIFICANT 2316 011750 005725 TST (R5)+ ; POINT TO LAST WORD OF FAC 2317 011752 000717 BR LDZERO+6 ; CLEAR LAST WORD OF FAC FOR DOUBLE 2318 011754 005703 LDC0: TST R3 ; IS THE WHOLE THING ZERO? 2319 011756 001712 BEQ LDZERO ; YES -- GO ZERO THE FAC 2320 011760 000740 BR LDCPOS ; NO -- IT'S JUST A SMALL NUMBER 2321 ; 2322 011762 NUMB: .BLKW 4 2323 011772 000000 TMP1: 0 2324 011774 000000 TMP2: 0 2325 011776 000000 TMP3: 0 2326 012000 000000 NMB: 0 FPE MACRO D1013 20-SEP-77 12:27 PAGE 23 8. GET ADDRESS OR NUMBERS FROM TASK 2328 .SBTTL 8. GET ADDRESS OR NUMBERS FROM TASK 2329 ; THE UNIVERSAL SOURCE/DESTINATION GETTER 2330 ; 2331 ; IT'S PORPOSE IS TO GET THE NUMBER OR ADDRESS THAT IS NEEDED 2332 ; BY THE FLOATING POINT ROUTINES. 2333 ; 2334 ; R2 HAS A COPY OF THE INSTRUCTION 2335 ; R3 HAS THE FPSW MASK (SHORT OR LONG MODE REAL OR INTEGER) 2336 ; R5 IS THE MAXIMUM POSSIBLE AUTOINCREMENT COUNT 2337 ; 2338 012002 GET: 2339 012002 030310 BIT R3,(R0) ; TEST APPROPRIATE BIT IN FPSR 2340 012004 001001 BNE GETX ; IT SHOULD BE MAX 2341 012006 006205 ASR R5 ; TOO BIG -- DIVIDE BY 2 2342 012010 GETX: 2343 .IF DF STAT ; STATISTICS 2344 BIT #200,(R0) 2345 BNE LSL 2346 SINC SHORT 2347 BR GETT 2348 LSL: SINC LONG 2349 GETT: 2350 .ENDC 2351 012010 010567 177756 MOV R5,TMP1 ; SAVE COUNT 2352 012014 006267 177752 ASR TMP1 ; MAKE IT A WORD COUNT 2353 012020 010203 MOV R2,R3 ; BREAK SRC/DST APART 2354 012022 042702 177770 BIC #177770,R2 ; R2 HAS THE REGISTER 2355 012026 010604 MOV SP,R4 ; COPY THE STACK POINTER FOR LATER USE 2356 012030 005724 TST (R4)+ ; ADD TWO SINCE WITHIN A SUBROUTINE 2357 012032 010267 177736 MOV R2,TMP2 ; SAVE A COPY OF REG. # 2358 012036 022702 000007 CMP #7,R2 ; PC ADDRESSING TAKES SPECIAL CARE 2359 012042 001426 BEQ PCADRM ; 2360 012044 005402 NEG R2 ; ALL REGS ARE ON THE STACK 2361 012046 062702 000006 ADD #6,R2 ; COMPUTE THE OFFSET TO THEM 2362 012052 006302 ASL R2 ; 2363 012054 060204 ADD R2,R4 ; NOW R4 POINTS TO THE SELECTED REG. 2364 012056 042703 177707 HAVREG: BIC #177707,R3 ; R3 HAS THE MODE 2365 012062 001424 BEQ MODE0 ; BRANCH IF MODE0 2366 012064 011401 MOV (R4),R1 ; NOW FOR ALL CASES, R1 HAS THE REGISTER 2367 ; CONTENTS AND R4 HAS THE POINTER TO 2368 ; THAT REGISTER (STORED ON CURRENT STACK) 2369 ; 2370 ; NOW MODE CONSIDERATIONS 2371 012066 006203 ASR R3 ; MAKE THE MODE AN OFFSET 2372 012070 006203 ASR R3 ; 2373 012072 062703 072102' ADD #MODAD+ASF3+2,R3 ; GET ADDRESS TO JMP TO 2374 012076 000153 JMP @-(R3) ; GO TO PROPER MODE HANDLING ROUTINE 2375 012100 072134' 072324' 072406' MODAD: MODE0+ASF3,MODE1+ASF3,MODE2+ASF3,MODE3+ASF3 012106 072370' 2376 012110 072444' 072422' 072300' MODE4+ASF3,MODE5+ASF3,MODE6+ASF3,MODE7+ASF3 012116 072242' 2377 ; 2378 012120 012705 000002 PCADRM: MOV #2,R5 ; SET MAX INCREMENT AT 2 2379 012124 005402 NEG R2 ; SET REGISTER=PC FLAG 2380 012126 062704 000020 ADD #PCOFF2,R4 ; R4 POINTS TO PC 2381 012132 000751 BR HAVREG 2382 ; FPE MACRO D1013 20-SEP-77 12:27 PAGE 23-1 8. GET ADDRESS OR NUMBERS FROM TASK 2383 012134 MODE0: SINC MODE0 ; STATS 2384 012134 016701 177634 MOV TMP2,R1 ; GET REGISTER NUMBER 2385 012140 006301 ASL R1 ; NEED AN OFFSET 2386 012142 006301 ASL R1 2387 012144 006301 ASL R1 2388 012146 060001 ADD R0,R1 ; NOW HAVE THE ADDRESS 2389 012150 005721 TST (R1)+ ; SKIP PAST STATUS 2390 012152 005767 177622 TST NMB ; ADDRESS OR NUMBER 2391 012156 001027 BNE M0 2392 012160 012703 071762' MOV #NUMB+ASF3,R3 ; PUT IN NUMB 2393 012164 060507 ADD R5,PC ; BRANCH TO PROPER PLACE 2394 012166 000240 NOP 2395 012170 000410 BR 10$ 2396 012172 000415 BR 20$ 2397 012174 000240 NOP 2398 012176 012123 MOV (R1)+,(R3)+ 2399 012200 012123 MOV (R1)+,(R3)+ 2400 012202 012123 MOV (R1)+,(R3)+ 2401 012204 011113 MOV (R1),(R3) 2402 012206 000261 SEC 2403 012210 000207 RETURN 2404 012212 011123 10$: MOV (R1),(R3)+ 2405 012214 005023 CLR (R3)+ 2406 012216 005023 CLR (R3)+ 2407 012220 005013 CLR (R3) 2408 012222 000261 SEC 2409 012224 000207 RETURN 2410 012226 012123 20$: MOV (R1)+,(R3)+ 2411 012230 011123 MOV (R1),(R3)+ 2412 012232 005023 CLR (R3)+ 2413 012234 005013 CLR (R3) 2414 012236 000261 M0: SEC ; LET THE CALLER KNOW THIS IS MODE 0 2415 012240 000207 RETURN 2416 012242 MODE7: SINC MODE7 ; STATS 2417 012242 006576 000022 MFPI @PCOFF2+2(SP) ; GET OFFSET 2418 012246 062601 ADD (SP)+,R1 ; POP STACK TO GET FINAL ADDRESS 2419 012250 062766 000002 000022 ADD #2,PCOFF2+2(SP) ; INCREMENT PC 2420 012256 005702 TST R2 ; IF REGISTER IS PC -- TAKE CARE 2421 012260 002002 BGE M7C 2422 012262 062701 000002 ADD #2,R1 ; THIS WAS CHANGED IN INSTR DECODING 2423 012266 006511 M7C: MFPI (R1) ; MODE 7 -- GET OTHER ADDRESS 2424 012270 IFERR ODAD1 ; ODD ADDRESS OR SEGMENT ERROR CATCHER 2425 012274 POP R1 ; GOT IT 2426 012276 000412 BR NORA 2427 012300 MODE6: SINC MODE6 ; STATS 2428 012300 006576 000022 MFPI @PCOFF2+2(SP) ; GET OFFSET 2429 012304 062601 ADD (SP)+,R1 ; POP STACK TO GET FINAL ADDRESS 2430 012306 062766 000002 000022 ADD #2,PCOFF2+2(SP) ; INCREMENT PC 2431 012314 005702 TST R2 ; IF REGISTER IS PC -- TAKE CARE 2432 012316 002002 BGE NORA 2433 012320 062701 000002 ADD #2,R1 ; THIS WAS CHANGED IN INSTR DECODING 2434 .IIF DF STAT BR NORA 2435 012324 MODE1: SINC MODE1 ; STATS 2436 012324 005767 177450 NORA: TST NMB ; WANT A NUMBER OR ADDRESS? 2437 012330 001016 BNE NONUM ; GO GET NUMBER 2438 012332 012703 071764' GETNUM: MOV #NUMB+2+ASF3,R3 ; CLEAR OUT NUMB 2439 012336 CLRWRD 3,(R3) FPE MACRO D1013 20-SEP-77 12:27 PAGE 23-2 8. GET ADDRESS OR NUMBERS FROM TASK 2440 012344 012703 071762' MOV #NUMB+ASF3,R3 ; STORE THE NUMBERS 2441 012350 016705 177416 MOV TMP1,R5 ; WORD COUNT 2442 012354 006521 PUTNUM: MFPI (R1)+ ; GET THE NUMBERS 2443 012356 IFERR ODAD1 ; CHECK FOR LEGAL ADDRESS 2444 012362 POP (R3)+ ; 2445 012364 077505 SOB R5,PUTNUM ; STORE AS MANY AS NEEDED ON THE STACK 2446 012366 000207 NONUM: RETURN ; YES 2447 012370 MODE3: SINC MODE3 ; STATS 2448 012370 006511 MFPI (R1) ; GET OTHER ADDRESS 2449 012372 IFERR ODAD1 ; RECOVER FROM ODD ADR OR SEGMENT FAULT 2450 012376 POP R1 ; THIS IS SECOND ONE 2451 012400 062714 000002 ADD #2,(R4) ; UPDATE REGISTER 2452 012404 000747 BR NORA ; 2453 012406 MODE2: SINC MODE2 ; STATS 2454 012406 060514 ADD R5,(R4) ; UPDATE REGISTER 2455 012410 010567 177356 MOV R5,TMP1 ; UPDATE WORD COUNT IN CASE IT IS MODE7 2456 012414 006267 177352 ASR TMP1 ; BYTES TO WORDS 2457 012420 000741 BR NORA ; 2458 012422 MODE5: SINC MODE5 ; STATS 2459 012422 162714 000002 SUB #2,(R4) ; UPDATE REGISTER 2460 012426 162701 000002 SUB #2,R1 ; UPDATE ADDRESS 2461 012432 006511 MFPI (R1) ; GET FIRST ADDRESS 2462 012434 IFERR ODAD1 ; IN CASE OF ERROR 2463 012440 POP R1 ; GET SECOND ADDRESS 2464 012442 000730 BR NORA ; 2465 012444 MODE4: SINC MODE4 ; STATS 2466 012444 160514 SUB R5,(R4) ; UPDATE THE REGISTER 2467 012446 160501 SUB R5,R1 ; ADDRESS CHANGES TOO 2468 012450 000725 BR NORA ; GO FINISH 2469 012452 ODDADR: 2470 012452 ODAD1: 2471 012452 013766 000004 000020 MOV @#4,20(SP) ; SET UP ADDRESS (WIPE OUT KPAR3) 2472 012460 005726 TST (SP)+ ; FORGET ABOUT EVER RETURNING 2473 012462 006606 FPEOUT: MTPI SP ; GIVE THE USER HIS REGISTERS BACK 2474 012464 POP R5 2475 012466 POP R4 2476 012470 POP R3 2477 012472 POP R2 2478 012474 POP R1 2479 012476 POP R0 2480 012500 012737 034340 177776 MOV #34340,@#PSW ; 2481 012506 000136 JMP @(SP)+ 2482 000000' .END INIT FPE MACRO D1013 20-SEP-77 12:27 PAGE 23-3 SYMBOL TABLE ABSFX 001044R CLRFZ 001540R LDCDF1 011222R MODSHD 004076R OPERA 000316R ABSFY 001100R CMPCLR 006440R LDCDF2 011220R MODSHF 003672R OVER 002270R ADA2NZ 004602R CMPFX 006346R LDCDF3 011216R MODSHM 004176R PAR2K = 172344 ADBIT9 005202R CMPFX1 006344R LDCFDX 011346R MODSH1 004052R PAR3K = 172346 ADDA1Z 005400R CMPFX2 006342R LDCIFX 011466R MODSS 003774R PCADRM 012120R ADDBT9 006172R CMPFX3 006340R LDCIF1 011464R MODSS1 004034R PCOFF = 000006 ADDDIV 005062R CMPNEG 006446R LDCIF2 011462R MODZD 004216R PCOFF2= 000020 ADDDM0 004426R CMPOUT 006442R LDCIF3 011460R MODZEX 004256R PCSAVE 000572R ADDDX 005274R CMPPLS 006450R LDCLF 011624R MODZIF 004210R PDR2K = 172304 ADDECK 005552R CMPPOS 006406R LDCNRM 011670R MPLUS 003234R POPDUN 000214R ADDEXA 005466R CMPSAM 006412R LDCPOS 011662R MULA2P 002052R POPOUT 000270R ADDF 004530R CODE 000226R LDC0 011754R MULA2Z 002056R PRIOR = 000040 ADDFX 004450R DIV 007736R LDDX 001336R MULB2P 002102R PSW = 177776 ADDFX1 004446R DIVCHK 007162R LDEXPX 011374R MULB2Z 002110R PUTNUM 012354R ADDFX2 004444R DIVDDH 007532R LDEXP1 011372R MULD 003130R SETDX 000752R ADDFX3 004442R DIVDDL 007520R LDEXP2 011370R MULDMD 003310R SETFX 000722R ADDGET 004366R DIVDFL 007630R LDEXP3 011366R MULDM0 001614R SETIX 000742R ADDNFL 006054R DIVDF1 007626R LDFPSX 001160R MULDNM 003116R SETLX 000766R ADDNRD 006044R DIVDHI 006766R LDFX 001216R MULDNU 003142R SPCASE 000234R ADDOUT 005026R DIVDNU 007650R LDFX1 001214R MULDNZ 002524R STCDFB 011100R ADDPUT 006120R DIVDOK 007662R LDFX2 001212R MULDOK 003154R STCDFO 011150R ADDSCK 005514R DIVDX 007264R LDFX3 001210R MULDOT 003170R STCDFV 011154R ADDSHD 005762R DIVDZR 007246R LDFY 001252R MULDX 002354R STCDFX 011004R ADDSHT 005612R DIVF 006624R LDNORM 011544R MULDX1 002354R STCDFY 011036R ADDSH1 005626R DIVFX 006572R LDPOS 011536R MULDZR 002444R STCDFZ 011204R ADDSR8 005744R DIVFX1 006570R LDZERO 011604R MULF 001732R STCEC 010474R ADDSUB 006134R DIVFX2 006566R LD027 011642R MULFX 001662R STCFDX 010672R ADDS16 005672R DIVFX3 006564R MDONE 003262R MULFX1 001660R STCFDY 010770R ADDS8A 005742R DIVNB 007050R MLTQ 003256R MULFX2 001656R STCFDZ 011000R ADDUT 006314R DIVNBT 007036R MNEG 003250R MULFX3 001654R STCFD1 010670R ADDZRO 006326R DIVNU 007072R MNEG1 003252R MULGET 001552R STCFD2 010666R ADDZT 006220R DIVOK 007104R MODAD 012100R MULNRM 002152R STCFD3 010664R ADDZT1 006270R DIVZRO 007150R MODCF 004104R MULNU 002164R STCFIX 010242R ADDZT2 006264R DIV1 007742R MODD 003506R MULOK 002176R STCFI1 010240R ADD2NZ 005404R EFAC 006336R MODDUN 003566R MULT 003204R STCFI2 010236R ADECHK 004656R EFSRC 006334R MODE0 012134R MULZRO 002256R STCFI3 010234R ADEXPA 004644R EQ1 010070R MODE1 012324R MULZR2 002254R STCK 010620R ADNOV 005016R EQ2 010066R MODE2 012406R MZ 003302R STCTS 010444R ADNRMD 004750R FAKFPS 000314R MODE3 012370R M0 012236R STETST 010204R ADOK 004762R FPE 010536R MODE4 012444R M7C 012266R STEXPX 010112R ADOUT 005024R FPEOUT 012462R MODE5 012422R NEGFX 001112R STEXPY 010170R ADOUT2 005122R FPEXIT 000710R MODE6 012300R NEGFZ 001146R STEXP1 010110R ADOUT3 005156R FPEX2 001314R MODE7 012242R NEQD 010062R STEXP2 010106R ADSHTD 004716R FPISR 000514R MODFHW= 000000 NMB 012000R STEXP3 010104R ADSUB 005162R FPXCOD 000310R MODFLG 004330R NO 000664R STFPSX 001360R ADSUBE 004376R FXM 000312R MODFX 003412R NODADR 000306R STFPSY 001410R ADUTST 005252R GET 012002R MODFX1 003410R NOGO 010044R STFX 006502R ADZERO 005266R GETNUM 012332R MODFX2 003406R NONODE 000220R STFX1 006500R ADZTST 005224R GETX 012010R MODFX3 003404R NONUM 012366R STFX2 006476R ALLDUN 010052R GO 010012R MODFY 003454R NORA 012324R STFX3 006474R ASF2 = 040000 HAVREG 012056R MODFZ 003602R NOTNO 000614R STFY 006526R ASF3 = 060000 H.CR1 = ****** GX MODIC 004154R NO1 000720R STFZ 006550R A.HA = ****** GX ILLIN 001002R MODINT 003646R NO2 000730R STIPUT 010372R A.TD = ****** GX INIT 000000R MODNO 003520R NO3 000750R STISGN 010364R CFCCX 000670R LDCDFV 011316R MODNU 003520R NUMB 011762R STLONG 010574R CLRFX 001476R LDCDFX 011224R MODSAV 004266R ODAD1 012452R STLPUT 010606R CLRFY 001520R LDCDFY 011300R MODSH 003750R ODDADR 012452R STMZ 010566R FPE MACRO D1013 20-SEP-77 12:27 PAGE 23-4 SYMBOL TABLE STOVER 010640R SUBFX1 004336R TMP1 011772R TSTFY2 001266R ..DINT= ****** GX STP 010432R SUBFX2 004334R TMP2 011774R UNDER 007222R ..ENB0= ****** GX STSTX 001414R SUBFX3 004332R TMP3 011776R $$$T3 = 000001 ..INTX= ****** GX STSTY 001470R SYSPS 000276R TOVER 002322R .CRTSK= ****** GX ..PENP= ****** GX STZERO 010652R SYSRTN 000274R TSTFX 001202R .EMINT= ****** GX ..RNTP= ****** GX SUBFX 004340R SYSTP 000304R TSTFY 001262R ..CINT= ****** GX . ABS. 000000 000 012510 001 ERRORS DETECTED: 0 VIRTUAL MEMORY USED: 2929 WORDS ( 12 PAGES) DYNAMIC MEMORY: 11961 WORDS ( 46 PAGES) ELAPSED TIME: 00:02:09 DP1:[11,211]FPE,[211,211]FPE/-SP=DP1:[311,211]FPE