ASMB,L,C,Z
*&HFBAS 
* 
* NOTE:  THIS MODULE MUST BE ASSEMBLED WITHOUT THE Z OPTION FOR SYSTEM USE
* 
* 
*                TO FIX BUG IN GETOP, FIX TEST
* EDITED  780914 TO MODIFY TSTSI FOR NEW TN FMT, LOOP BUG (SIBFP) 
*                TO TEST FOR POS15 IN ACCOP 
* EDITED  781209 TO ADD DIPLAY ALL, PORT MODE OPTS
*                TO SET WRDS TO WDOUT IN SWSTR
*                TO USE FIXFG,FLTFG,  NOT SKNF1 
* EDITED  790117 TO CHECK FOR PRIV. MODE IN TSTMN 
* 
* LAST CODE CHANGE  790117 1145  CC 
* 
      NAM HFBAS     790121 2345  REV 1913  CC 
* 
* THIS MODULE CONTAINS THE BULK OF THE HFP TESTS, TST00-TST09, AND TST15. 
* MOST OF THE TIME IN THE DIAGNOSTIC IS SPENT HERE AND
* IN FPPSW, WHERE THE SOFTWARE ANSWERS ARE COMPUTED.
* HFAUX CONTAINS AUXILARY ROUTINES FOR ERRORS, INITIALIZATION, ETC. 
* 
* THE ONLY ROUTINES ENTERED FROM EXERNALS ARE THE TESTS THEMSELVES. 
* HFAUX REFERENCES LOCATIONS IN SOME ROUTINES FOR SETTING LOOPS, ETC..
* ALSO, MOST GLOBAL VARIABLES ARE DECLARED HERE (ONES REFERENCED
* BY MORE THAN ONE MODULE).  MANY OF THE VARIABLES AND CONSTANTS
* ARE CONDITIONALLY PUT ON THE BASE PAGE FOR SPEED (Z COMPL). 
* THE N OPTION IS NOT USED EXCEPT FOR DEBUGGING.
* 
      SKP 
* 
* GLOBAL DEFINITIONS
* 
* 
* 
* 
      ENT ACLPS,ACOD1,ACOD2 
      ENT ACOD3,ACOD4,ACOD5,ACOD6,ACOD7 
      ENT ACOD8,ACOP1,ACOP2,ACOP3,ACOP4 
      ENT ACOP5,ACOP6,ACOP7,ACOP8,ACOPI 
      ENT ACOPZ,ANS13,ANS1O,ANS23 
      ENT ANS2O,ANSO,ANSW,ANSW1,ANSW2 
      ENT ANSWZ,AOVFL,ARSLT,ARST0,ARST1 
      ENT ARST2,ARST3,ARSTE 
      ENT BIT0,DBIT0,ECODE
      ENT EOVFL,ERCNT,ERSLT,ERST0,ERST1 
      ENT ERST2,ERST3,ERSTE,EVNOD 
      ENT FIXFG,FLTFG 
      ENT HIWRD,HWCNT 
      ENT IC,ICEN,INBUF 
      ENT INBUZ,INDCT,INSTR 
      ENT IS,IST,LOWRD
      ENT LPCNT,NOPND,NRSLT 
      ENT ODAD1,ODAD2 
      ENT OEILP,OND13,OND23,ONDUP 
      ENT OPND1,OPND2,OPNDN 
      ENT OPNNL,OPSEL,OTINS,OTN13,OTN23 
      ENT OTND1,OTND2,OWRDS,PASSF 
      ENT PASSL 
      ENT RSLT1,RSLT2 
      ENT RSLT3,RSLTZ,RST13,RST1O 
      ENT RST23,RST2O,RST33,RST3O 
      ENT STDAM 
      ENT STKP
      ENT STSTN,TECNT 
      ENT TRYN,TSTLP
      ENT WDFLG,WDIN,WDIN2,WDOU2,WDOUT
      ENT WRDS
* 
      SKP 
* 
* 
*S
* 
* 
      IFZ           IF ABS VERSION, PUT ON BASE PAGE
      ORB 
      XIF 
* 
* 
IC    OCT 0         CONFIGURATION WORD
IS    OCT 0         SWITCH REG. OPTS WORD 
IST   OCT 0         SUBTEST WORD
STDAM OCT 0         STD TEST MASK WORD
PASSL OCT 0         LOGICAL PASS COUNT
PASSF OCT 0         PASS FLAG- SHORT/LONG 
ERCNT OCT 0         NUMBER OF ERRORS TOTAL
LOWRD OCT 1         LOW #WORDS-1 FOR ASMDXTC
HIWRD OCT 5         HIGH #WORDS FOR ASMDXTC 
HWCNT OCT 0         PSEUDO OPN COUNT ASMDXTC
      OCT 0 
      OCT 0 
OPNNL OCT 0         LOGICAL OPN# ASMDXT 
OPNDN OCT 0         OPND IDENTIFIER 
      OCT 0         FREE
      OCT 0         FREE
* 
* ERROR INFO **** 
* 
* 
OTINS BSS 1 
OTN13 BSS 5 
OTN23 BSS 5 
ERST3 BSS 1 
ERST2 BSS 1 
ERST1 BSS 1 
ERST0 BSS 1 
ERSTE BSS 1 
EOVFL BSS 1 
ARST3 BSS 1 
ARST2 BSS 1 
ARST1 BSS 1 
ARST0 BSS 1 
ARSTE BSS 1 
AOVFL BSS 1 
* 
* 
* 
* 
* 
* 
* 
DBIT0 DEF BIT0
      OCT 0         FOR BASIC TEST-- TSTN=-1
BIT0  OCT 1 
      OCT 2 
      OCT 4 
      OCT 10
      OCT 20
      OCT 40
      OCT 100 
      OCT 200 
      OCT 400 
      OCT 1000
      OCT 2000
      OCT 4000
      OCT 10000 
      OCT 20000 
      OCT 40000 
      OCT 100000
* 
* 
* 
* 
WDFLG OCT 17        4 BITS FOR 2,3,4,5 WORD OPERATIONS
* 
ICEN  BSS 1         FLAG SET IF IC BIT 0 HAS BEEN SET 
* 
* 
* 
* 
* VARIABLES 
* 
* 
OWRDS BSS 1          #WORDS OPNDS TRUNCATED TO
WRDS  BSS 1         #WORDS OF INSTRUCTION EXECUTED
WDIN  BSS 1 
WDIN2 BSS 1 
WDOUT BSS 1 
WDOU2 BSS 1 
LPCNT BSS 1         USED AS COUNT OF SUB LOOPS IN ASMDXT
TSTLP BSS 1         PARM FOR TEST LOOPS, IE FIX,FLT,SIS 
OEILP BSS 1         PARM FOR SETTING OVFL,EXT,INDS IN TESTS 
*                   BIT0=OVFL, BIT1=EXT, BIT2 2,3=INDS
INDCT BSS 1         NUMBER OF IND LEVELS USED IN SOME TESTS (TSTDI) 
* 
NOPND BSS 1         #OPNDS FOR MACRO
NRSLT BSS 1         #RSLTS FOR MACRO
* 
* 
* 
* 
* 
* 
* 
OPND1 DEF OND13 
OPND2 DEF OND23 
OND13 BSS 5 
OND23 BSS 5 
      BSS 20        EXTRA BUFFER SPACE
* 
ANSW  DEF *+1 
      BSS 5 
ANSO  BSS 1 
ANSWZ DEF ANSW1 
ANSW1 DEF ANS13 
ANSW2 DEF ANS23 
ANS13 BSS 5 
ANS1O BSS 1 
ANS23 BSS 5 
ANS2O BSS 1 
* 
RSLTZ DEF RSLT1 
RSLT1 DEF RST13     HFP RESULTS 
RSLT2 DEF RST23 
RSLT3 DEF RST33 
RST13 BSS 5 
RST1O BSS 1 
RST23 BSS 5 
RST2O BSS 1 
RST33 BSS 5 
RST3O BSS 1 
* 
* 
OTND1 DEF OTN13 
OTND2 DEF OTN23 
ERSLT DEF ERST3 
ARSLT DEF ARST3 
* 
ODAD1 BSS 1         ADDR OF 1ST OPND, WRDLP...
ODAD2 BSS 1         ADDR OF 2ND OPND, WRDLP...
* 
* 
* 
TRYN  BSS 1         # OF HFP OPN-- 0=DIR.,1=IND.,2=BIT 7
ECODE DEC -1        OCTAL ERROR CODE (6 BITS) 
ACLPS BSS 1         #LOOPS IN ACC OPNS
TECNT BSS 1         COUNT OF ERRORS IN TEST 
* 
* 
ONDUP DEC 5         OPND INCREMENT
INSTR BSS 1 
* 
* 
* 
EVNOD BSS 1         USED FOR WHICH OP FROM GETOP
* 
FIXFG BSS 1         FLAG FOR FIX TYPE OPN 
FLTFG BSS 1         FLAG FOR FLT TYPE OPN 
* 
STSTN BSS 1         SUBTEST IN TEST 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
INBUZ DEF *+1       INPUT BUFFER
INBUF BSS 4 
* 
* 
* ACC. TEST DATA & POINTERS 
* 
* 
OPSEL BSS 1 
STKP  BSS 1 
* 
ACOPI BSS 1         INDEX POINTER 
ACOPZ DEF ACOP1     BASE ADDR 
ACOP1 DEF ACOD1 
ACOP2 DEF ACOD2 
ACOP3 DEF ACOD3 
ACOP4 DEF ACOD4 
ACOP5 DEF ACOD5 
ACOP6 DEF ACOD6 
ACOP7 DEF ACOD7 
ACOP8 DEF ACOD8 
* 
ACOD1 BSS 5 
ACOD2 BSS 5 
ACOD3 BSS 5 
ACOD4 BSS 5 
ACOD5 BSS 5 
ACOD6 BSS 5 
ACOD7 BSS 5 
ACOD8 BSS 5 
* 
* 
* 
      IFZ           IF ABS VERSION, RESTORE TO CURR. PAGE 
      ORR 
      XIF 
* 
      SKP 
* 
A     EQU 0 
B     EQU 1 
* 
* 
      SKP 
      ENT A.D21,A.D22,A.D23,A.D31,A.D32 
      ENT A.D33,ACBT7,ACCCP,ACELP 
      ENT CLANS,CLRST,CPAN1 
      ENT CPAN2,CPAN3 
      ENT FIX21,FIX22 
      ENT FIX23,FIX31,FIX32,FIX33 
      ENT FLT21,FLT22,FLT23,FLT31,FLT32 
      ENT FLT33 
      ENT STDCP,STELP,SWBF1 
      ENT TST00,TST01,TST02 
      ENT TST03,TST04,TST05,TST06,TST07 
      ENT TST08,TST15 
* 
      IFN 
      EXT $LIBR,$LIBX 
      XIF 
* 
      EXT ACBLD 
      EXT ACPRT,ADDOP,ASCNV,COM5,CWCHK
      EXT DISPB,DIVOP,DNPUX,EXPCK,FIXOP 
      EXT FLTOP,MPYOP,MSGC,MSGD 
      EXT MSGI,MSGIN,OPDIN,PAK5,PORTB 
      EXT RANF,RND5,SKNCW,STINI 
      EXT STSTE,SUBOP,TINIT,TRNC5,TSTN
      EXT UNPK5,WRANS 
      SUP 
* 
      SKP 
* MIC INSTRUCTIONS
* 
      MIC ADD,105000B,0 
      MIC SBB,105020B,0 
      MIC MPB,105040B,0 
      MIC DVB,105060B,0 
      MIC FXS,105100B,0 
      MIC XDB,105104B,0 
      MIC TSB,105120B,0 
      MIC TDB,105124B,0 
* 
      MIC XPD,105005B,0 
      MIC STK,105007B,0 
      MIC RST,105006B,0 
* 
* 
* 
* 
* 
* 
* 
      SKP 
*S
* 
      IFZ           IF ABS, ON BASE PAGE
      ORB 
      XIF 
* 
* CONSTANTS 
* 
NEG1  DEC -1
NEG2  DEC -2
NEG5  DEC -5
NEG15 DEC -15 
NG513 DEC -513
POS0  DEC 0 
POS1  DEC 1 
POS2  DEC 2 
POS3  DEC 3 
POS4  DEC 4 
POS5  DEC 5 
POS6  DEC 6 
POS7  DEC 7 
POS8  DEC 8 
POS10 DEC 10
POS12 DEC 12
POS15 DEC 15
POS64 DEC 64
PS128 DEC 128 
PS256 DEC 256 
PS512 DEC 512 
* 
UPBYT OCT 177400
* 
ZERO  DEF BUF0
BUF0  OCT 0,0,0,0,0,0,0,0 
* 
* 
* 
* 
* 
* VARIABLES 
* 
ACBFP BSS 1 
BUFP  BSS 1 
EXPNT BSS 1 
FCTNT BSS 1         TEMP FOR USE IN ACCOP, ETC
INTWD BSS 1 
ODFLG BSS 1 
ODSEL BSS 1 
OPADR BSS 1 
OPBAS ADD 
OPCOD BSS 1 
TPSEL BSS 1 
* 
* 
* 
* 
* 
* 
* SUBROUTINE DEFS 
DEFSW DEF *+1,I 
ZDDOP DEF ADDOP+0 
ZUBOP DEF SUBOP+0 
ZPYOP DEF MPYOP+0 
ZIVOP DEF DIVOP+0 
* 
* 
      IFZ           RETURN TO CURR. PAGE
      ORR 
      XIF 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
PTNST BSS 1         PATTERN START ADDRESS BASE
PTNAD DEF PTN00 
PTNSB DEF PTN04 
PTNMD DEF PTN08 
PTNFT DEF PTN08 
PTN00 DEF PON13 
      DEF PON23 
      DEF PON23 
      DEF PON13 
* 
      DEF NON13 
      DEF NON23 
      DEF NON23 
      DEF NON13 
* 
      DEF PON13 
      DEF NON23 
      DEF NON23 
      DEF PON13 
* 
      DEF NON13 
      DEF PON23 
      DEF PON23 
      DEF NON13 
* 
PTN04 DEF PON13 
      DEF PON23 
      DEF NON23 
      DEF NON13 
* 
      DEF NON13 
      DEF NON23 
      DEF PON23 
      DEF PON13 
* 
      DEF PON13 
      DEF NON23 
      DEF PON23 
      DEF NON13 
* 
      DEF NON13 
      DEF PON23 
      DEF NON23 
      DEF PON13 
* 
* 
PTN08 DEF PON13 
      DEF PON23 
      DEF NON13 
      DEF NON23 
* 
      DEF PON23 
      DEF PON13 
      DEF NON23 
      DEF NON13 
* 
      DEF PON13 
      DEF NON23 
      DEF NON13 
      DEF PON23 
* 
      DEF PON23 
      DEF NON13 
      DEF NON23 
      DEF PON13 
* 
PTN12 DEF PON13 
      DEF PON23 
      DEF PON13 
      DEF PON23 
* 
* 
* 
* 
POND1 DEF PON13 
POND2 DEF PON23 
NOND1 DEF NON13 
NOND2 DEF NON23 
PON13 BSS 5 
PON23 BSS 5 
NON13 BSS 5 
NON23 BSS 5 
* 
* 
* 
* 
* 
* 
BFBGM EQU * 
      OCT 77777,100000,77777,100000,0 
      OCT 77600,77600,77600,77600,0 
      OCT 74170,74170,74170,74170,0 
      OCT 63146,64146,63146,63146,0 
      OCT 70707,16161,43434,70707,0 
      OCT 76037,03701,170174,17476,0
      OCT 44444,111111,22222,44444,0
      OCT 52525,52525,52525,52525,0 
      OCT 42104,42104,42104,42104,0 
      OCT 73567,73567,73567,73567,0 
      OCT 66666,155555,133333,66666,0 
      OCT 77401,175007,170037,140177,0
      OCT 61430,143061,106143,14306,0 
      OCT 60606,14141,103030,60606,0
      OCT 74747,117171,163636,74747,0 
BFBGR EQU * 
BFBGE EQU * 
      OCT 76340,140403,176170,35700,0 
      OCT 41437,37701,161603,57200,0
BFNDE EQU * 
      OCT 40000,377,177777,177777,0 
      OCT 100000,377,177777,177777,0
BFNDR EQU * 
      OCT 41020,102041,4102,10204,0 
      OCT 75736,173675,167573,157367,0
      OCT 0,0,0,0,0 
      OCT 77777,177777,177777,177777,0
      OCT 137777,177777,177777,177777,0 
      OCT 40100,40100,40100,40100,0 
      OCT 77577,77577,77577,77577,0 
* 
      OCT 70160,70160,70160,70160,0 
      OCT 76174,76174,76174,76174,0 
* 
      OCT 52525,63146,70707,40404,0 
      OCT 40001,40001,40001,40001,0 
BFNDM EQU * 
* 
BFBGO OCT 40000,377,177777,177777,177              1/2 * 2**127 
      OCT 40000,377,177777,177777,176 
      OCT 40000,7,77,777,177600                     3 
      OCT 40000,377,177777,177777,177601
      OCT 100000,5,25,525,177                       5/8 * 2**14 
      OCT 100000,377,177777,177777,176
      OCT 100000,13,57,731,177600 
      OCT 100000,377,177777,177777,177601 
      OCT 77777,177777,177777,177777,177
      OCT 77777,177777,177777,177777,176
      OCT 137777,177777,177777,177777,177 
      OCT 137777,177777,177777,177777,176 
      OCT 77777,177777,177777,177777,177600 
      OCT 77777,177777,177777,177777,177601 
      OCT 137777,177777,177777,177777,177600
      OCT 137777,177777,177777,177777,177601
* 
      OCT 40000,123,357,246,0 
      OCT 40000,377,177777,177777,1 
      OCT 77777,177777,177777,177777,0
      OCT 100000,351,715,34726,0
      OCT 137777,177777,177777,177777,0 
      OCT 137777,177777,177777,177777,1 
* 
      OCT 40000,370,37037,3073,177000                     1/2 
      OCT 40000,54,3627,77035,777 
      OCT 100000,377,7760,170000,777
      OCT 100000,53,7751,2357,177000
      OCT 77777,177777,177777,177777,777
      OCT 137777,177777,177777,177777,777 
      OCT 137777,177777,177777,177777,177000
BFNDO OCT 77777,177777,177777,177777,177000 
* 
* 
* 
* 
BUF1A OCT 105000    N WORD FPOPN
      DEC 2 
      DEF ACOD1+0 
      DEC 2 
      DEF ACOD2+0 
      OCT 0 
      DEC 0 
      DEF 0 
* 
BUF1B OCT 105110    FIXS,ACC
      DEC 0 
      DEF 0 
      DEC 0 
      DEF 0 
      OCT 0 
      DEC 0 
      DEF 0 
* 
BUF1C OCT 105130    FLTS,ACC
      DEC 0 
      DEF 0 
      DEC 0 
      DEF 0 
      OCT 0 
      DEC 2 
      DEF RST13+0 
* 
BUF1D OCT 105010    FPOPN, ACC1 
      DEC 0 
      DEF 0 
      DEC 2 
      DEF ACOD3+0 
      OCT 0 
      DEC 0 
      DEF 0 
* 
BUF1E OCT 105004    FPOPN, ACC2 
      DEC 2 
      DEF ACOD4+0 
      DEC 0 
      DEF 0 
      OCT 0 
      DEC 2 
      DEF RST13+0 
* 
BUF1F OCT 105014    FPOPN, ACC,ACC
      DEC 0 
      DEF 0 
      DEC 0 
      DEF 0 
      OCT 0 
      DEC 2 
      DEF RST13+0 
* 
BUF2B OCT 105114    FIXD,ACC
      DEC 0 
      DEF 0 
      DEC 0 
      DEF 0 
      OCT 0 
      DEC 0 
      DEF 0 
* 
BUF2C OCT 105134    FLTD,ACC
      DEC 0 
      DEF 0 
      DEC 0 
      DEF 0 
      OCT 0 
      DEC 0 
      DEF 0 
* 
BUF3B OCT 105100    FIXS
      DEC 2 
      DEF ACOD3+0 
      DEC 0 
      DEF 0 
      OCT 0 
      DEC 1 
      DEF ACOD5+0 
* 
BUF4B OCT 105104    FIXD
      DEC 2 
      DEF ACOD3+0 
      DEC 0 
      DEF 0 
      OCT 0 
      DEC 2 
      DEF ACOD5+0 
* 
BUF5C OCT 105120    FLTS
      DEC 1 
      DEF ACOD5+0 
      OCT 0,0,0,0,0 
* 
BUF6C OCT 105124    FLTD
      DEC 2 
      DEF ACOD5+0 
      OCT 0,0,0,0,0 
* 
* 
* 
BACB1 OCT 105000    2 WORD ADD 0+0
      DEC 2 
      DEF BUF0+0
      DEC 2 
      DEF BUF0+0
      OCT 0 
      DEC 2 
      DEF RST13+0 
* 
* 
BACH1 OCT 105000    HANG THE BOX-- NO OPNDS 
      OCT 0,0,0,0,0,0,0 
* 
BACH2 OCT 105021    HANG-- SEND 1 OPND
      DEC 3 
      DEF ACOD1+0 
      OCT 0,0,0,0,0 
* 
BACH3 OCT 105062    HANG IT, 6 OUT OF 8 WORDS 
      DEC 4 
      DEF ACOD1+0 
      DEC 2 
      DEF ACOD1+0 
      OCT 0,0,0 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
MSGE  ASC 3, EXP /
MSGR  ASC 3, RND /
MSGO  ASC 3, OVF /
MSGM  ASC 3, MIX /
* 
* 
* 
* 
* 
* 
* 
* 
      SKP 
* 
* ADD TEST ROUTINE
* 
TST04 EQU * 
* 
* ROUTINE TO TEST HFP ADD OPERATIONS
* 
*STSTAD 
TSTAD NOP 
      JSB TINIT     SET PARMS, ETC. FOR TEST, CALL CWCNF
      LDA ADDBS     GET BASE OPCODE 
      STA OPCOD 
      LDA ZDDOP     SET UP SW ROUTINE ADDR
      STA OPADR 
      LDA PTNAD     SET UP PATTERN START POINT
      STA PTNST 
* 
      JSB MSGI      "ADD" 
      DEF MSGAD 
* 
      JSB TSTAS     GO TO COMMON ADD,SUB TEST SECTION 
      JMP TSTAD,I   RETURN
* 
*LTSTAD 
MSGAD ASC 6,ADD  TEST / 
ADDBS ADD           ADD BASE
*ETSTAD 
* 
* 
*STSTSB 
TST05 EQU * 
TSTSB NOP           ROUTINE TO TEST SUBTRACT OPERATIONS 
      JSB TINIT     INIT PARMS, CALL CWCNF
      LDA SUBBS     GET OPCODE BASE 
      STA OPCOD 
      LDA ZUBOP     SET UP SW ROUTINE ADDRESS 
      STA OPADR 
      LDA PTNSB     SET UP PATTERN START POINT
      STA PTNST 
* 
      JSB MSGI      "SUB" 
      DEF MSGSB 
* 
      JSB TSTAS     GO TO COMMON TEST ROUTINE FOR ADD, SUB
      JMP TSTSB,I 
* 
*LTSTSB 
* 
MSGSB ASC 6,SUB  TEST / 
SUBBS SBB           SUB BASE
* 
*ETSTSB 
* 
* 
*S
TSTAS NOP           ADD,SUB TEST ROUTINE
* 
* 
      JSB STSTE     ELSE EXECUTE SUBTESTS, BASED ON IST 
      OCT 10        SHORT PASS TESTS
      DEF TSTEA,I 
      DEF TSTRA,I 
      DEF TSTOA,I 
      DEF TSTMA 
      JMP TSTAS,I   THATS ALL 
*E
* 
* 
* TEST EXPONENTS-- ADD 2 NUMBERS WITH SAME EXP, EXP: -512,511 
* 
*S
TSTEA NOP 
      JSB MSGD
      DEF MSGE
      LDA POS1
      JSB STINI+0 
      LDA POS2      ONLY OPNDS TRUNC TO 2 WORDS 
      STA OWRDS+0 
      LDA NG513     LOW EXP-1 
      STA EXPNT 
ODEAR CLA,CLE       RESET GETOP 
      JSB GETOP 
      DEF BFBGE 
      DEF BFNDE 
ODEAL CLA,INA       GET OPND
      JSB GETOP 
      JMP ODEAR     IF OUT OF OPNDS, START OVER 
      LDA EXPNT     SET EXPS
      INA 
      STA EXPNT 
      CPA PS512     OUT OF RANGE, DONE
      JMP TSTEA,I   NEXT TEST 
      STA OND13+4   PT EXPS IN PLACE
      STA OND23+4 
      JSB WIEXA     TEST THE HW 
      JMP ODEAL     BACK FOR ANOTHER
*E
* 
* 
* TEST FOR CORRECT ROUNDING-- EXP DIFFERENCE FROM 1 TO 64 
* 
*STSTRA 
TSTRA NOP 
      JSB MSGD
      DEF MSGR
      LDA POS2
      JSB STINI+0     INIT SUB FUNCTION 
      LDA POS2      SET OWRDS 
      STA OWRDS+0 
      LDA NEG32     SET BASE EXP. 
      STA EXPNT 
ODRAR CLA,CLE 
      JSB GETOP     RESET GETOP 
      DEF BFBGR 
      DEF BFNDR 
ODRAL CLA,INA       GET OPNDS 
      JSB GETOP 
      JMP ODRAR     START OVER WITH OPNDS 
      LDA EXPNT     NEW BASE
      CPA PS480     IF OUT OF RANGE, NEXT TEST
      JMP TSTRA,I   NEXT TEST 
      ADA POS64 
      STA EXPNT 
      LDA NEG64     RESET EXP OFFSET
      STA EXPOF 
XORAL LDA EXPOF     SET EPXS
      ARS 
      ADA EXPNT 
      STA OND13+4 
      LDA EXPOF 
      CMA,INA 
      ADA OND13+4 
      STA OND23+4 
      JSB WIEXA     TEST HW 
      LDA OND13+4   NOW WITH COMPLEMENTED EXPS
      CMA 
      STA OND13+4 
      LDA OND23+4 
      CMA 
      STA OND23+4 
      JSB WIEXA     TEST
      ISZ EXPOF     NEXT OFFSET 
      JMP XORAL 
      JMP ODRAL     IF=0, GET NEXT OPNDS, EXP BASE
* 
*LTSTRA 
* 
NEG64 DEC -64 
NEG32 DEC -32 
PS480 DEC 480 
EXPOF BSS 1 
* 
*ETSTRA 
* 
* 
* TEST OVERFLOW RANGES, ADD/SUB 
* 
*S
TSTOA NOP 
      JSB MSGD
      DEF MSGO
      LDA POS3
      JSB STINI+0 
      LDA POS2
      STA OWRDS+0 
      CLA,CLE       RESET GETOP 
      JSB GETOP 
      DEF BFBGO 
      DEF BFNDO 
ODOAL CLA,INA       GET NEXT OPND PAIR
      JSB GETOP 
      JMP TSTOA,I   NEXT TEST 
      JSB WIEXA     TEST HW 
      JMP ODOAL 
*E
* 
* 
* 
* 
*S
TSTMA NOP 
      JSB MSGD
      DEF MSGM
      LDA POS4
      JSB STINI+0 
      LDA POS1      #STARTING # OF OPND WORDS-1, FOR TRUNC. 
      STA OWRDS+0 
* 
BWMAL LDA OWRDS+0   TEST #WORDS IN OPNDS
      CPA POS5      IF=MAX, DONE LOOPING
      JMP TSTMA,I   DONE WITH TEST
      INA 
      STA OWRDS+0   #WORDS OPERANDS TRUNCATED TO
      STA WRDS+0    #WORDS FOR OPERATION
      ISZ LPCNT+0 
      CLA,CCE       CLEAR OPND BUFFER POINTERS,INDEX MODE 
      JSB GETOP 
      DEF BFBGM 
      DEF BFNDM 
ODMAL CLA,INA       GET NEXT BASE OPNDS 
      JSB GETOP 
      JMP BWMAL     IF NO MORE OPNDS, INC OPND WORD COUNT 
* 
      LDB OPND1+0   MIX IT UP 
      JSB OPMIX 
      ISZ EVNOD+0 
      LDB OPND2+0 
      JSB OPMIX     THE 2ND ONE TOO 
      ISZ EVNOD+0 
      JSB WIEXA     LOOP FROM OWRDS TO 5, EXEC., CMPR 
      JMP ODMAL     GET NEXT OPNDS
*E
* 
* 
*S
WIEXA NOP           ROUTINE TO LOOP FROM OWRDS TO 5, COMP & CMPR ANS. 
      ISZ OPNDN+0 
      LDA OWRDS+0   TRUNCATE OPNDS TO CORRECT # WORDS 
      LDB OPND1+0 
      CBX 
      JSB TRNC5+0 
      LDA OWRDS+0 
      LDB OPND2+0 
      CBY 
      JSB TRNC5+0 
      JSB ODTST+0   TEST OPNDS FOO RANGE, SET ODFLG 
      JMP WIEXA,I   IF 5 WORD OVFL, NO GO 
      LDA OPND1+0   MOVE OPNDS INTO WORKING BUFFER
      LDB POND1 
      CBX           SET X,Y TO OPND ADDRS 
      LDY POND2 
      MVW POS10 
      LDB ANSW+0
      JSB OPADR,I   COMPUTE S/W ANSWER IN ANSW
      LDB PTNST     RUN 1ST PATTERN 
      JSB WRDLP     TEST WITH DIFFERENT WORD LENGTHS
      LDB ANSW+0    COMPLEMENT ANSWER 
      JSB COM5+0
      LDB PTNST     2ND PATTERN 
      ADB POS4
      JSB WRDLP     RUN AGAIN 
      LDA OPND1+0   RESTORE OPNDS 
      LDB POND1+0 
      CBX           SET X,Y TO OPND ADDRS 
      LDY POND2 
      MVW POS10 
      LDB POND2     COMPLIMENT 2ND OPND=> X-Y 
      JSB COM5+0
      LDB ANSW+0    PUT ANSWER IN ANSW
      JSB OPADR,I   CALCULATE 1ST OPND- 2ND OPND
      LDB PTNST      PATTERN 3
      ADB POS8
      JSB WRDLP 
      LDB ANSW+0    COMPLEMENT RESULT 
      JSB COM5+0
      LDB PTNST     PATTERN 4 
      ADB POS12 
      JSB WRDLP 
      JMP WIEXA,I 
*E
* 
* 
      SKP 
* ROUTINE TO TEST HFP MPY OPERATIONS
* 
* 
*STSTMP 
TST06 EQU * 
TSTMP NOP 
      JSB TINIT     SET PARMS, CALL CWCNF 
      LDA MPYBS 
      STA OPCOD 
      LDA ZPYOP     SET UP SW ROUTINE ADDR
      STA OPADR 
      LDA PTNMD     SET UP PATTERN START POINT
      STA PTNST 
* 
      JSB MSGI      "MPY" 
      DEF MSGMP 
* 
      JSB STSTE     LONG PASS-- USE IST FOR SUBTEST SELECTION 
      OCT 4         SHORT PASS SUBTESTS 
      DEF TSTEM,I   EXPONENT
      DEF TSTOM,I   OVFL
      DEF TSTMM     MIXED 
      JMP TSTMP,I 
* 
* 
*LTSTMP 
* 
MSGMP ASC 6,MPY  TEST / 
MPYBS MPB           MPY BASE
* 
*LTSTMP 
* 
*ETSTMP 
* 
* 
* EXPONENT MULTIPLY TEST
* 
*S
TSTEM NOP 
      JSB MSGD
      DEF MSGE
      LDA POS1
      JSB STINI+0 
      CLA 
      STA EXPNT 
      LDA POS2      SET OPND WORDS
      STA OWRDS+0 
ODEMR CLA,CLE 
      JSB GETOP     RESET POINTERS
      DEF BFBGE 
      DEF BFNDE 
ODEML CLA,INA 
      JSB GETOP     GET OPND PAIR 
      JMP ODEMR 
      LDA EXPNT     INC EXP 
      INA 
      STA EXPNT 
      CPA PS256     CHECK FOR DONE
      JMP TSTEM,I 
      STA OND13+4   PUT EXP IN OPNDS
      STA OND23+4 
      JSB WIEXM     TEST HW 
      ISZ OND23+4   TRY IT AGAIN WITH 2ND OP INCED
      NOP 
      JSB WIEXM     TEST IT 
      LDA OND13+4   COMLEMENT 1ST OPND
      CMA 
      STA OND13+4 
      JSB WIEXM     TEST
      LDA OND23+4   COMPL 2ND OPND
      CMA 
      STA OND23+4 
      JSB WIEXM 
      ISZ OND23+4   INC 2ND OP
      NOP 
      JSB WIEXM     TEST
      JMP ODEML     BACK FOR THE NEXT BASE
*E
* 
* OVERFLOW MULTIPLY TEST
* 
*S
TSTOM NOP 
      LDA POS2
      JSB STINI+0 
      JSB MSGD
      DEF MSGO
      LDA POS2      SET OWRDS 
      STA OWRDS+0 
      CLA,CLE       CLEAR GETOP 
      JSB GETOP 
      DEF BFBGO 
      DEF BFNDO 
ODOML CLA,INA       GET OPND PAIR 
      JSB GETOP 
      JMP TSTOM,I   NEXT TEST 
      JSB WIEXM     TEST HW 
      JMP ODOML     TRY NEXT PAIR 
* 
* 
* 
* 
* MIXED MULTIPLY TEST 
* 
TSTMM NOP 
      JSB MSGD      DIAG. INFO
      DEF MSGM
      LDA POS3
      JSB STINI+0 
      LDA POS1      # OPERAND WORDS-1 
      STA OWRDS+0 
* 
BWMML LDA OWRDS+0   TEST #WORDS IN OPNDS
      CPA POS5      IF=MAX, DONE LOOPING
      JMP TSTMM,I   NEXT TEST 
      INA 
      STA OWRDS+0   #WORDS OPERANDS TRUNCATED TO
      STA WRDS+0    #WORDS FOR OPERATION
      ISZ LPCNT+0 
      CLA,CCE       CLEAR OPND BUFFER POINTERS
      JSB GETOP 
      DEF BFBGM 
      DEF BFNDM 
ODMML CLA,INA       GET NEXT BASE OPNDS 
      JSB GETOP 
      JMP BWMML     IF NO MORE OPNDS, INC OPND WORD COUNT 
      LDB OPND1+0   MIX IT UP 
      JSB OPMIX 
      ISZ EVNOD+0   2ND OPND
      LDB OPND2+0 
      JSB OPMIX 
      ISZ EVNOD+0 
      JSB WIEXM     RUN THROUGH WORDS, ETC. 
      JMP ODMML     GET NEXT OPNDS
*E
* 
*S
WIEXM NOP 
      ISZ OPNDN+0 
      LDA OWRDS+0   TRUNCATE OPNDS TO CORRECT # WORDS 
      LDB OPND1+0 
      JSB TRNC5+0 
      LDA OWRDS+0 
      LDB OPND2+0 
      JSB TRNC5+0 
      JSB ODTST     TEST OPNDS FOR RANGE
      JMP WIEXM,I    5WD OVFLW, NO GO 
      LDA OPND1+0   MOVE OPNDS INTO WORKING BUFFER
      LDB POND1 
      CBX           SET X,Y TO OPND ADDRS 
      LDY POND2 
      MVW POS10 
      LDB ANSW+0
      JSB OPADR,I   COMPUTE S/W ANSWER IN ANSW
      LDB PTNST     RUN 1ST PATTERN 
      JSB WRDLP     TEST WITH DIFFERENT WORD LENGTHS
      LDB PTNST     2ND PATTERN 
      ADB POS4
      JSB WRDLP     RUN AGAIN 
      LDB ANSW+0    COMPLEMENT ANSWER 
      JSB COM5+0
      LDB PTNST      PATTERN 3
      ADB POS8
      JSB WRDLP 
      LDB PTNST     PATTERN 4 
      ADB POS12 
      JSB WRDLP 
      JMP WIEXM,I 
*E
* 
* 
* ROUTINE TO TEST HFP DIV OPERATIONS
* 
* 
*S
TST07 EQU * 
* 
TSTDV NOP 
      JSB TINIT     SET PARMS, CALL CWCNF 
      LDA DIVBS 
      STA OPCOD 
      LDA ZIVOP     SET UP SW ROUTINE ADDR
      STA OPADR 
      LDA PTNMD     SET UP PATTERN START POINT
      STA PTNST 
* 
      JSB MSGI      "DIV" 
      DEF MSGDV 
* 
* 
      JSB STSTE     LONG PASS- EXECUTE SUBTESTS PER IST 
      OCT 4         SHORT PASS SUBTESTS 
      DEF TSTED,I   EXP 
      DEF TSTOD,I   OVFL
      DEF TSTMD     MIXED 
      JMP TSTDV,I 
* 
* 
*LTSTDV 
* 
MSGDV ASC 6,DIV  TEST / 
DIVBS DVB           DIV BASE
* 
*LTSTDV 
* 
*ETSTDV 
* 
* 
* EXPONENT DIVIDE TEST
* 
*S
TSTED NOP 
      LDA POS1
      JSB STINI+0 
      JSB MSGD
      DEF MSGE
      CLA 
      STA EXPNT 
      LDA POS2      SET OPND WORDS
      STA OWRDS+0 
ODEDR CLA,CLE 
      JSB GETOP     RESET POINTERS
      DEF BFBGE 
      DEF BFNDE 
ODEDL CLA,INA 
      JSB GETOP     GET OPND PAIR 
      JMP ODEDR 
      LDA EXPNT     INC EXP 
      INA 
      STA EXPNT 
      CPA PS256     CHECK FOR DONE
      JMP TSTED,I 
      STA OND13+4   PUT EXP IN OPNDS
      STA OND23+4 
      JSB WIEXD     TEST HW 
      ISZ OND23+4   TRY IT AGAIN WITH 2ND OP INCED
      NOP 
      JSB WIEXD     TEST IT 
      LDA OND13+4   COMLEMENT 1ST OPND
      CMA 
      STA OND13+4 
      JSB WIEXD     TEST
      LDA OND23+4   COMPL 2ND OPND
      CMA 
      STA OND23+4 
      JSB WIEXD 
      ISZ OND23+4   INC 2ND OP
      NOP 
      JSB WIEXD     TEST
      JMP ODEDL     BACK FOR THE NEXT BASE
*E
* 
* OVERFLOW DIVIDE TEST
* 
*S
TSTOD NOP 
      LDA POS2
      JSB STINI+0 
      JSB MSGD
      DEF MSGO
      LDA POS2
      STA OWRDS+0 
      CLA,CLE       CLEAR GETOP 
      JSB GETOP 
      DEF BFBGO 
      DEF BFNDO 
ODODL CLA,INA       GET OPND PAIR 
      JSB GETOP 
      JMP TSTOD,I   NEXT TEST 
      JSB WIEXD     TEST HW 
      JMP ODODL     TRY NEXT PAIR 
*E
* 
* 
* 
* MIXED DIVIDE TEST 
* 
*S
TSTMD NOP 
      JSB MSGD
      DEF MSGM
      LDA POS3
      JSB STINI+0 
      LDA POS1      # OPERAND WORDS-1 
      STA OWRDS+0 
* 
BWMDL LDA OWRDS+0   TEST #WORDS IN OPNDS
      CPA POS5      IF=MAX, DONE LOOPING
      JMP TSTMD,I   NEXT TEST 
      INA 
      STA OWRDS+0   #WORDS OPERANDS TRUNCATED TO
      STA WRDS+0    #WORDS FOR OPERATION
      ISZ LPCNT+0 
      CLA,CCE       CLEAR OPND BUFFER POINTERS
      JSB GETOP 
      DEF BFBGM 
      DEF BFNDM 
ODMDL CLA,INA       GET NEXT BASE OPNDS 
      JSB GETOP 
      JMP BWMDL     IF NO MORE OPNDS, INC OPND WORD COUNT 
      LDB OPND1+0   MIX UP OPNDS
      JSB OPMIX 
      ISZ EVNOD+0 
      LDB OPND2+0 
      JSB OPMIX 
      ISZ EVNOD+0 
* 
      JSB WIEXD     TEST HW 
      JMP ODMDL     LOOP AGAIN
*E
* 
*S
WIEXD NOP           DIVIDE WORD INC+TEST ROUTINE
      ISZ OPNDN+0 
      LDA OWRDS+0   TRUNCATE OPNDS TO CORRECT # WORDS 
      LDB OPND1+0 
      JSB TRNC5+0 
      LDA OWRDS+0 
      LDB OPND2+0 
      JSB TRNC5+0 
      JSB ODTST     TEST OPND RANGES
      JMP WIEXD,I   5WD OVFLW, NO GO
      LDA OPND1+0   MOVE OPNDS INTO WORKING BUFFER
      LDB POND1 
      CBX           SET X,Y TO OPND ADDRS 
      LDY POND2 
      MVW POS10 
      LDB ANSW+0
      JSB OPADR,I   COMPUTE S/W ANSWER IN ANSW
      LDB PTNST     RUN 1ST PATTERN 
      JSB WRDLP     TEST WITH DIFFERENT WORD LENGTHS
      LDB ANSW+0    COMPLEMENT ANSWER 
      JSB COM5+0
      LDB PTNST     2ND PATTERN 
      ADB POS8
      JSB WRDLP     RUN AGAIN 
      LDA OPND1+0   RESTORE OPNDS 
      LDB POND1 
      CBY           THIS TIME ITS Y/X 
      LDX POND2 
      MVW POS10 
      LDB ANSW+0    COMPUTE ANSWER
      JSB OPADR,I 
      LDB PTNST      PATTERN 3
      ADB POS4
      JSB WRDLP 
      LDB ANSW+0    COMPLEMENT ANSWER 
      JSB COM5+0
      LDB PTNST     PATTERN 4 
      ADB POS12 
      JSB WRDLP 
      JMP WIEXD,I   DONE
*E
* 
* 
      SKP 
* 
* 
* ROUTINES TO TEST HFP FIX SINGLE AND DOUBLE OPERATIONS 
* S/D SELECTED BY INTWD=0 OR 1
* 
*S
TST00 EQU * 
TSTXS NOP           FIXS
      JSB MSGI      "FIXS TEST" 
      DEF MSGXS 
      CLA           INTWD=0 
      LDB FXSBS     B=BASE OPCODE 
      JSB TSTFX     GO TO COMMON SECTION
      JMP TSTXS,I   DONE
* 
FXSBS FXS           FIXS BASE 
MSGXS ASC 6,FIXS TEST / 
* 
* 
*S
TST01 EQU * 
TSTXD NOP           FIXD
      JSB MSGI      "FIXD TEST" 
      DEF MSGXD 
      CLA,INA       A=INTWD 
      LDB FXDBS     B=INSTR BASE
      JSB TSTFX     COMMON ROUTINE
      JMP TSTXD,I   DONE
* 
FXDBS XDB           FIXD BASE 
MSGXD ASC 6,FIXD TEST / 
* 
* 
*S
TSTFX NOP 
      STA INTWD     INTWD=0 OR 1 FOR S/D
      STB OPCOD     SAVE OPCODE 
      JSB TINIT     SET PARMS, CALL CWCNF 
*     LDA ZIXOP     SET UP SW ROUTINE ADDR
*     STA OPADR 
* 
      LDA PTNAD     SET UP PATTERN START POINT
      STA PTNST 
* 
* 
* 
      JSB STSTE     LONG PASS- USE IST
      OCT 2         SHOT PASS SUBTEST 
      DEF TSTEX,I   EXP 
      DEF TSTMX     MIX 
      JMP TSTFX,I 
* 
*E
* 
* EXPONENT FIX TEST  (OVERFLOW TOO) 
* 
*S
TSTEX NOP 
      JSB MSGD
      DEF MSGE
      LDA POS1
      JSB STINI+0 
      LDA POS2      ONLY OPNDS TRUNC TO 2 WORDS 
      STA OWRDS+0 
      LDA NG513     LOW EXP-1 
      STA EXPNT 
ODEXR CLA,CLE       RESET GETOP 
      JSB GETOP 
      DEF BFBGE 
      DEF BFNDE 
ODEXL CLA,INA       GET OPND
      JSB GETOP 
      JMP ODEXR     IF OUT OF OPNDS, START OVER 
      LDA EXPNT     SET EXPS
      INA 
      STA EXPNT 
      CPA PS512     OUT OF RANGE, DONE
      JMP TSTEX,I   NEX TEST
      STA OND13+4   PT EXPS IN PLACE
      STA OND23+4 
      JSB WIEXX     TEST THE HW 
      JMP ODEXL     BACK FOR ANOTHER
*E
* 
* 
* MIXED FIX TEST
* 
*S
TSTMX NOP 
      JSB MSGD      "FIX MIX" 
      DEF MSGM
      LDA POS2
      JSB STINI+0 
      LDA NEG15     SET LOOP CNT
      STA TSTLP+0 
FXMLP LDA POS1      # OPERAND WORDS-1 
      STA OWRDS+0 
* 
BWMXL LDA OWRDS+0   TEST #WORDS IN OPNDS
      CPA POS5      IF=MAX, DONE LOOPING
      JMP TSDMX     DONE? 
      INA 
      STA OWRDS+0   #WORDS OPERANDS TRUNCATED TO
      STA WRDS+0    #WORDS FOR OPERATION
      ISZ LPCNT+0 
      CLA,CCE       CLEAR OPND BUFFER POINTERS
      JSB GETOP 
      DEF BFBGM 
      DEF BFNDM 
ODMXL CLA,INA       GET NEXT BASE OPNDS 
      JSB GETOP 
      JMP BWMXL     IF NO MORE OPNDS, INC OPND WORD COUNT 
      LDB OPND1+0   MIX UP OPND 
      JSB OPMIX 
* 
      LDB OPND1+0   ADJUST EXP. 
      JSB OPRED 
* 
* 
      JSB WIEXX 
      JMP ODMXL 
* 
TSDMX ISZ TSTLP+0   DONE LOOPING? 
      JMP FXMLP     NO
      JMP TSTMX,I   YES 
*E
* 
* 
*S
WIEXX NOP 
      ISZ OPNDN+0 
      LDA OWRDS+0   TRUNCATE OPNDS TO CORRECT # WORDS 
      LDB OPND1+0 
      JSB TRNC5+0 
      JSB ODTST     TEST OPNDS FOR RANGE
      JMP WIEXX,I   5 WORD OVFL, NO GO
      LDA OPND1+0   MAKE 2ND OPND=1ST 
      LDB OPND2+0 
      MVW POS5
      LDA OPND1+0   MOVE 1ST OPND INTO ANSWER BUFFER
      LDB ANSW+0
      MVW POS5
      LDA INTWD 
      LDB ANSW+0
      JSB FIXOP+0   COMPUTE S/W ANSWER IN ANSW
      LDA POS0      TEST OVERFLOW 
      SOC 
      LDA POS1
      STA ANSO+0
      LDB PTNST     RUN 1ST PATTERN 
      JSB WRDLP     TEST WITH DIFFERENT WORD LENGTHS
* 
      LDA OPND1+0   RELOAD OPERAND
      LDB ANSW+0
      MVW POS5
      LDB ANSW+0
      JSB COM5+0    COMPLEMENT OPERAND
      LDA INTWD 
      JSB FIXOP+0   COMPUTE ANSWER
      LDA POS0      TEST OVERFLOW 
      SOC 
      LDA POS1
      STA ANSO+0
      LDB PTNST     2ND PATTERN 
      ADB POS4
      JSB WRDLP     RUN AGAIN 
      JMP WIEXX,I 
*E
* 
* 
* 
      SKP 
* 
* 
* ROUTINES TO TEST HFP FLOAT SINGLE AND DOUBLE OPERATIONS 
* S/D SELECTED BY INTWD 
* 
* 
*S
TST02 EQU * 
TSTTS NOP           FLTS
      JSB MSGI      "FLTS TEST" 
      DEF MSGTS 
      CLA           A=INTWD 
      LDB FTSBS     B=OPCODE BASE 
      JSB TSTFT     COMMON SECTION
      JMP TSTTS,I 
* 
FTSBS TSB           FLTS 2 WD 
MSGTS ASC 6,FLTS TEST / 
* 
* 
TST03 EQU * 
TSTTD NOP           FLTD
      JSB MSGI      "FLTD TEST" 
      DEF MSGTD 
      CLA,INA       A=INTWD 
      LDB FTDBS      B=OPCODE BASE
      JSB TSTFT     COMMON SECTION
      JMP TSTTD,I 
* 
FTDBS TDB           FLTD BASE 
MSGTD ASC 6,FLTD TEST / 
* 
* 
* 
TSTFT NOP 
      STA INTWD 
      STB OPCOD 
      JSB TINIT     SET PARMS, CALL CWCNF 
* 
      JSB STSTE     LONG PASS- USE IST
      OCT 2         SHORT PASS SUBTEST
      DEF TSTET,I 
      DEF TSTMT 
      JMP TSTFT,I 
* 
* 
*E
* 
* 
* EXPONENT FLOAT TESTS ( INTEGER RANGE) 
* 
*STSTET 
TSTET NOP 
      LDA POS1
      JSB STINI+0 
      JSB MSGD
      DEF MSGE
      LDA POS2      ONLY OPNDS TRUNC TO 2 WORDS 
      STA OWRDS+0 
      LDA NEG1      LOW EXP-1 
      STA EXPNT 
ODETR CLA,CLE       RESET GETOP 
      JSB GETOP 
      DEF BFBGE 
      DEF BFNDE 
ODETL CLA,INA       GET OPND
      JSB GETOP 
      JMP ODETR     IF OUT OF OPNDS, START OVER 
      LDA EXPNT     SET EXPS
      INA 
      STA EXPNT 
      CPA POS33     OUT OF RANGE, DONE
      JMP TSTET,I   NEXT TEST 
      STA OND13+4   PT EXPS IN PLACE
      STA OND23+4 
      JSB WIEXT     TEST THE HW 
      JMP ODETL     BACK FOR ANOTHER
* 
*LTSTET 
* 
POS33 DEC 33
* 
*ETSTET 
* 
* 
* MIXED FLOAT TEST
* 
*S
TSTMT NOP 
* 
      LDA NEG15     LOOP 5 TIMES
      STA TSTLP+0 
      JSB MSGD      "FLT MIX" 
      DEF MSGM
      LDA POS2
      JSB STINI+0 
FTMLP LDA POS1      # OPERAND WORDS-1 
      STA OWRDS+0 
* 
BWMTL LDA OWRDS+0   TEST #WORDS IN OPNDS
      CPA POS5      IF=MAX, DONE LOOPING
      JMP TSDMT     DONE? 
      INA 
      STA OWRDS+0   #WORDS OPERANDS TRUNCATED TO
      STA WRDS+0    #WORDS FOR OPERATION
      ISZ LPCNT+0 
      CLA,CCE       CLEAR OPND BUFFER POINTERS
      JSB GETOP 
      DEF BFBGM 
      DEF BFNDM 
ODMTL CLA,INA       GET NEXT BASE OPNDS 
      JSB GETOP 
      JMP BWMTL     IF NO MORE OPNDS, INC OPND WORD COUNT 
      LDB OPND1+0   MIX UP OPND 
      JSB OPMIX 
* 
      LDB OPND1+0   ADJ. EXP
      JSB OPRED 
* 
* 
* 
      JSB WIEXT     TEST HW 
      JMP ODMTL     NEXT OPNDS
* 
TSDMT ISZ TSTLP+0   CHECK FOR DONE LOOPING
      JMP FTMLP     NO
      JMP TSTMT,I   DONE
*E
* 
* 
* 
* 
* 
*S
WIEXT NOP 
      ISZ OPNDN+0 
      LDA OWRDS+0   TRUNCATE OPNDS TO CORRECT # WORDS 
      LDB OPND1+0 
      JSB TRNC5+0 
      JSB ODTST     TEST OPNDS FOR RANGE
      JMP WIEXT,I   5WD OVFL, NO GO 
      LDA OPND1+0   MAKE 2NDOP=1ST
      LDB OPND2+0 
      MVW POS5
      LDA INTWD     FIX OPERAND 
      LDB OPND1+0 
      JSB FIXOP+0 
      LDA OPND1+0   MOVE 1ST OPND INTO ANSWER BUFFER
      LDB ANSW+0
      MVW POS5
      LDA INTWD 
      LDB ANSW+0
      JSB FLTOP+0   COMPUTE S/W ANSWER IN ANSW
      LDA POS0      RESET  OVERFLOW 
      STA ANSO+0
      LDB PTNFT     RUN 1ST PATTERN 
      JSB WRDLP     TEST WITH DIFFERENT WORD LENGTHS
* 
      LDB OPND2+0   USE 2ND OPERAND, COMPLEMENT 
      LDA OWRDS+0   TRUNCATE
      JSB TRNC5+0 
      JSB COM5+0    COMPLEMENT
      LDA INTWD     FIX 
      JSB FIXOP+0 
      LDA OPND2+0   MOVE TO ANSWER BUFFER 
      LDB ANSW+0
      MVW POS5
      LDB ANSW+0
      LDA INTWD 
      JSB FLTOP+0 
      LDA POS0      TEST OVERFLOW 
      STA ANSO+0
      LDB PTNFT     2ND PATTERN 
      ADB POS1
      JSB WRDLP     RUN AGAIN 
      JMP WIEXT,I   DONE
* 
* 
* 
* 
TST08 EQU * 
*ROUTITI TO TEST ACCUMULATOR O ORATIONS S  HFP
* 
*MODIFIES A,B,X,Y,E 
* 
*STSTAC 
TSTAC NOP 
      JSB TINIT     SET PARMS, CALL CWCNF 
* 
      JSB MSGI      "ACC" 
      DEF MSGAC 
* 
* 
      JSB STSTE     EXECUTE SUBTEST 
      OCT 1         SHORT PASS SUBTEST
      DEF STACC 
      JMP TSTAC,I   DONE
* 
* 
MSGAC ASC 6,ACC  TEST / 
* 
* 
      SKP 
* 
*S
STACC NOP 
      LDA ACLPS+0 
      STA ACCNT 
* 
TACLP EQU * 
      JSB ACWRD     SET UP INSTRUCTIONS WITH # WORDS
      DEF ACBF1 
      JSB CHSEL     GET ODSEL,OPSEL 
* 
      JSB ACCOP     COMPUTE S/W & H/W, AND COMPARE
      DEF *+8 
ACBF1 DEF BUF1A     ACC=A OP B
      DEF BUF1B     ACC=FIXS(ACC) 
      DEF BUF1C     RSLT=FLTS(ACC)
      DEF BUF1D     ACC=ACC OP B
      DEF BUF1E     RSLT=A OP ACC 
      DEF BUF1F     RSLT=ACC OP ACC 
      DEF BUF0+0
* 
* 
      IFN           IF SYSTEM TURN OFF INTERRUPTS 
      JSB $LIBR 
      NOP 
      XIF 
* 
      STK           HANG THE BOX
      DEF *+2 
      DEF BACH1 
      RST 
* 
      IFN           TURN INTERRUPTS BACK ON 
      JSB $LIBX 
      DEF *+1 
      DEF *+1 
      XIF 
* 
* 
* 
* 
      JSB ACWRD     SET UP INSTRUCTIONS WITH #WORDS 
      DEF ACBF2 
      JSB CHSEL     CHANGE OPSEL, ODSEL 
* 
      JSB ACCOP     AGAIN WITH DOUBLE INTGERS 
      DEF *+8 
ACBF2 DEF BUF1A     ACC=A OP B
      DEF BUF2B     ACC=FIXD(ACC) 
      DEF BUF2C     ACC=FLTD(ACC) 
      DEF BUF1D     ACC=ACC OP B
      DEF BUF1E     RSLT=A OP ACC 
      DEF BUF1F     RSLT=ACC OP ACC 
      DEF BUF0+0
* 
      JSB ACWRD 
      DEF ACBF3 
      JSB CHSEL 
      JSB ACCOP 
      DEF *+6 
ACBF3 DEF BUF1A     ACC= A OP B 
      DEF BUF3B     ACC=FIXS(A) 
      DEF BUF1C     RSLT=FLTS(ACC)
      DEF BUF1E     RSLT=A OP ACC 
      DEF BUF0+0
* 
* 
      IFN           IF SYSTEM TURN OFF INTERRUPTS 
      JSB $LIBR 
      NOP 
      XIF 
* 
      STK           HANG THE BOX
      DEF *+2 
      DEF BACH2 
      RST 
* 
      IFN           TURN INTERRUPTS BACK ON 
      JSB $LIBX 
      DEF *+1 
      DEF *+1 
      XIF 
* 
* 
* 
* 
      JSB ACWRD 
      DEF ACBF4 
      JSB CHSEL 
      JSB ACCOP 
      DEF *+6 
ACBF4 DEF BUF1A     ACC=A OP B
      DEF BUF4B     RSLT=FIXD(A)
      DEF BUF2C     ACC=FLTD(ACC) 
      DEF BUF1E     RSLT=A OP ACC 
      DEF BUF0+0
* 
      JSB ACWRD 
      DEF ACBF5 
      JSB CHSEL 
      JSB ACCOP 
      DEF *+6 
ACBF5 DEF BUF3B     RSLT=FIXS(A)
      DEF BUF1A     ACC= A OP B 
      DEF BUF5C     ACC=FLTS(RSLT)
      DEF BUF1E     RSLT=A OP ACC 
      DEF BUF0+0
* 
* 
      IFN           IF SYSTEM TURN OFF INTERRUPTS 
      JSB $LIBR 
      NOP 
      XIF 
* 
      STK           HANG THE BOX
      DEF *+2 
      DEF BACH3 
      RST 
* 
      IFN           TURN INTERRUPTS BACK ON 
      JSB $LIBX 
      DEF *+1 
      DEF *+1 
      XIF 
* 
* 
* 
* 
      JSB ACWRD 
      DEF ACBF6 
      JSB CHSEL 
      JSB ACCOP 
      DEF *+6 
ACBF6 DEF BUF4B     RSLT=FIXD(A)
      DEF BUF1A     ACC=A OP B
      DEF BUF6C     ACC=FLTD(RSLT)
      DEF BUF1E     RSLT=A OP ACC 
      DEF BUF0+0
* 
      JSB ACWRD 
      DEF ACBF7 
      JSB CHSEL 
      JSB ACCOP 
      DEF *+6 
ACBF7 DEF BUF4B     RSLT=FIXD(A)
      DEF BUF2C     ACC=FLTD(ACC) 
      DEF BUF1B     ACC=FIXS(ACC) 
      DEF BUF1C     RSLT=FLTS(ACC)
      DEF BUF0+0
* 
      ISZ ACCNT     TEST FOR COOKING TIME 
      JMP TACLP     STILL KICKING 
      JMP STACC,I   WELL DONE 
* 
*LSTACC 
* 
ACCNT BSS 1         LOOP COUNTER
* 
* 
*ESTACC 
* 
* 
* 
* 
      SKP 
* 
*ROUTINE TO SET # OF FP WORDS TO 2,3,4 OR 5 
*A REG=#WORDS, E=1 FOR BIT 7 TYPE 
*DEF TO  ADDR OF 1ST BUF. ADDR FOLLOWS JSB
* 
* 
*S
ACWRD NOP 
      JSB RANF+0    GET WRDS
      LDA B 
      AND POS3
      ADA POS2
      STA WRDS+0
      CLA           SET EFLAG-- BIT7OP
      BLF 
      SSB,SLB 
      INA 
ACBT7 RSS           IF IC SAYS NO BIT7 OPNS, ALWAYS CLEAR EFLAG 
      CLA 
      STA EFLAG 
      LDB ACWRD,I   SAVE POINTER TO BUFFERS IN ACBFP
      STB ACBFP 
      ISZ ACWRD     SET UP RETURN ADDR
* 
ACWDL LDB ACBFP,I   GET INSTRUCTION 
      LDA B,I 
      SZA,RSS       IF=0, RETURN
      JMP ACWRD,I 
      RAR,RAR       GET OPCODE
      RAR,RAR 
      AND POS7
      STA FCTNT     SAVE
      LDA EFLAG     SET E TO FLAG FOR BIT 7 
      ERA 
      LDA B,I       GET INSTR AGAIN 
      AND NB710     MASK OF #WORDS, BIT7
      SEZ           IF E SET, OR IN BIT7
      IOR PS128 
      ADA WRDS+0    NOW SET # FP WORDS
      ADA NEG2
      STA B,I       PUT BACK
      ADB POS1      #WORDS IN 1ST OPND
      LDA FCTNT     IF FLOAT, GO ON 
      CPA POS5
      JMP ACWD2     INC POINTER AND SET UP #RESULT WORDS
      LDA B,I       #WORDS IN 1ST OPND
      SZA,RSS       IF 0, TEST 2ND OPND 
      JMP ACWD2 
      LDA WRDS+0    ELSE REPLACE WITH NEW VALUE 
      STA B,I 
ACWD2 ADB POS2      #WORDS IN 2ND OPND
      LDA B,I 
      SZA,RSS       IF=0, GO ON TO RESULT 
      JMP ACWDR 
      LDA WRDS+0
      STA B,I       ELSE REPLACE
ACWDR LDA FCTNT     IF FIX, DON'T CHANGE
      CPA POS4
      JMP ACWDI     INC AND LOOP
      ADB POS2      #RESULT INSTR 
      STB ACWP2 
      JSB RANF+0    GET #RSLT WORDS 
      LDA B 
      AND POS3
      STA ACWP1 
      LDB ACWP2     GET #RESULT WORDS 
      INB 
      LDA B,I 
      SZA,RSS       IF=0, RETURN
      JMP ACWDI 
      LDA ACWP1     GET #WORDS
      ADA POS2
      STA B,I 
      LDA ACWP1     FORM RSLT INSTR 
      ADA OPBAS 
      LDB ACWP1     B=#RSLT WORDS 
      ADB POS2
      CPB WRDS+0    IF SAME AS #WORDS, DONT SET RSLT INSTR
      CLA 
      STA ACWP2,I   STORE RSLT INSTR
ACWDI ISZ ACBFP     INC BUFFER POINTER
      JMP ACWDL 
* 
* 
ACWP1 BSS 1 
ACWP2 BSS 1 
EFLAG BSS 1 
NB710 OCT 177574
* 
* 
* 
* 
*ROUTINE TO SELECT ODSEL, OPSEL 4 BITS
* 
*S
CHSEL NOP 
      JSB RANF+0    GET ODSEL 
      STB ODSEL 
      JSB RANF+0
      STB OPSEL+0 
      JMP CHSEL,I 
* 
* 
* 
      SKP 
* 
* MANUAL ENTRY TEST 
* ALLOWS PROGRAMMABLE TESTING OF ADD,SUB,MPY,DIV,FIX, AND FLT 
* OPERATIONS, IN ACCUMULATOR MODE.
* 
*STSTMN 
TST15 EQU * 
TSTMN NOP 
      LDA IC        CHECK FOR PRIV. MODE
      SLA,RSS       IF BIT0=0, NO GO
      JMP TSTMN,I   JUST RETURN 
* 
      JSB TINIT     SET PARMS, CALL CWCNF 
      JSB MSGC,I    PRINT TEST MESSAGE
      DEF MAMSG 
* 
      JSB STSTE     EXECUTE ONLY SUBTEST
      OCT -1        ALL SUBTESTS SHORT PASS 
      DEF STMAN 
      JMP TSTMN,I   DONE
* 
MAMSG ASC 10,MANUAL ENTRY TEST  / 
* 
*S
STMAN NOP 
MNTLP LDA MBUFZ     SET UP POINTERS FOR INSTR BUFFERS 
      ADA NEG1      ALWAYS INC FIRST
      STA BUFP      POINTS TO INSTR BUFR
      CLA           CLEAR OPERAND,RESULT POINTERS 
      STA ACOPI+0   OPND PTR
      STA RSLTI     RESULT POINTER
MNILP ISZ BUFP      LOOP FOR EACH OPERATION 
      LDA BUFP,I    SET UP PTR INTO OPN BUFR
      STA STKP+0
      CPA MBUF8     IF LAST BUFFER, FORCE END 
      JMP MNIND 
      JSB MSGIN     SEND MSG, GET INPUT 
      DEF MAINS     "OPCODE: "
      LDB INBUF+0   CHECK 1ST CHAR
      CPB ASCE      IF=E, DONE
      JMP MNEND 
      CPB ASCG      IF="G", START EXECUTION 
      JMP MNINC 
      CPB ASCR      IF=R, REST IS SAME AS LAST TIME 
      JMP MNLIN 
      JSB ASCNV+0   CONVERT TO OCTAL IN A REG 
      STA STKP+0,I  PUT IN BUFFER 
      ISZ STKP+0    INC POINTER 
      JSB MSGC,I    SEND "OPND 1" 
      DEF MAOD1 
      JSB OPDIN+0   GET 1ST OPND
      JSB MSGC,I    SEND "OPND 2" 
      DEF MAOD2 
      JSB OPDIN+0   GET OPND 2
* 
      JSB MSGIN     SEND & GET #
      DEF MARIN     "RSLT OPCODE" 
      JSB ASCNV+0   CONV TO OCTAL 
      STA STKP+0,I  PUT IN BUFFER 
      ISZ STKP+0
      JSB MSGIN     SEND & GET #
      DEF MARST     "#RSLT WORDS" 
      JSB ASCNV+0   CONVERT TO OCTAL IN A REG 
      STA STKP+0,I  PUT IN BUFFER 
      ISZ STKP+0
      SZA,RSS       IF=0, GET NEXT INSTR
      JMP MNILP 
      LDA RSLTI     GET RSLT ADDR 
      AND POS1      ONLY 2
      ADA RSLTZ+0   BASE ADDR 
      LDA A,I 
      STA STKP+0,I  PUT IN BUFFER 
      ISZ RSLTI 
      JMP MNILP     GET NEXT INSTR
* 
MNINC LDA BUFP,I    1ST BUFFER, ASSUME REPEAT 
      CPA MBUF1 
      JMP MNLIN     YES, TREAT AS "R" 
MNIND CLA           PUT INSTR=0 IN BUFFER 
      STA STKP+0,I
MNLIN JSB MSGIN     SEND AND GET # LOOPS
      DEF MALPS     "LOOP? "
      LDA INBUF+0   IF="Y", YES 
      CPA ASCY
      JMP MNSLP     IF SO, SET FOR LOOPING
      JSB ASCNV+0   GET OCTAL #LOOPS
      SZA,RSS       IF=0 OR NOT#, 1 TIME
MN1LP CLA,INA       ONE LOOP
      CMA,INA 
      STA MNCNT     -#LOOPS 
MNELP CLA           SET #WRDS TO 0
      STA WRDS+0
      STA TECNT+0   CLEAR ERROR CNT 
      JSB ACCOP     EXECUTE OPERATIONS, COMPARE & REPORT
      DEF *+9 
      DEF MBF11 
      DEF MBF12 
      DEF MBF13 
      DEF MBF14 
      DEF MBF15 
      DEF MBF16 
      DEF MBF17 
      DEF MBF18 
* 
      ISZ MNCNT     TEST #LOOPS 
      JMP MNELP     NO DONE YET 
* 
      LDA TECNT+0   IF NO ERRORS, PRINT BUFFERS, IF LEGAL 
      SZA 
      JMP MNTLP     READY FOR NEXT SET OF OPNS
* 
      JSB ACBLD+0   LOAD ACC. BUFFERS 
      JSB ACPRT+0 
* 
      JMP MNTLP     GO BACK FOR MORE
* 
MNSLP CLA           SET ACCOP TO LOOP MODE
      STA ACELP 
      LDA IC+0      SET CW BIT 12 
      IOR BIT12 
      STA IC+0
      JMP MN1LP 
* 
MNEND NOP 
*     IFN           IF IN SYSTEM, GET INPUT 
      JSB DNPUX+0 
      DEF *+1 
*     XIF 
      JMP STMAN,I 
* 
*LSTMAN 
BIT12 OCT 10000 
* 
MAINS ASC 6,OPCODE:  _ /
MAOD1 ASC 5,1ST OPND /
MAOD2 ASC 5,2ND OPND /
MARIN ASC 8,RSLT OPCODE: _ /
MARST ASC 6,NRSLTS:  _ /
MALPS ASC 5,LOOP?: _ /
* 
ASCE  ASC 1,E 
ASCG  ASC 1,G 
ASCR  ASC 1,R 
ASCY  ASC 1,Y 
RSLTI BSS 1         INDEX POINTER 
MNCNT BSS 1 
MBUFZ DEF MBUF1     BASE ADDR OF MANUAL ENTRY INSTR. BUFFERS
MBUF1 DEF MBF11 
MBUF2 DEF MBF12 
MBUF3 DEF MBF13 
MBUF4 DEF MBF14 
MBUF5 DEF MBF15 
MBUF6 DEF MBF16 
MBUF7 DEF MBF17 
MBUF8 DEF MBF18 
* 
MBF11 BSS 8         MAN. ENTRY INSTR BUFS 
MBF12 BSS 8 
MBF13 BSS 8 
MBF14 BSS 8 
MBF15 BSS 8 
MBF16 BSS 8 
MBF17 BSS 8 
MBF18 BSS 8 
* 
*ESTMAN 
* 
* 
      SKP 
* 
* 
*ROUTINE TO PROCESS ACC. OPNS, FOR TSTAC
* 
* CALLING SEQ:   JSB ACCOP
*                DEF * + #BUFFERS + 1 
*                DEF BUFFER1
*                DEF BUFFER2
*                ...
* 
*WHERE BUFFER1, ETC. ARE THE BUFFERS OF OPERATIONS TO EXECUTE 
* 
*S
ACCOP NOP 
      ISZ OPNDN+0   INC OPND IDENT
* 
      LDA ACCOP     BET #BUFFERS
      STA ACBFP     SAVE POINTER
      CMA 
      ADA ACCOP,I   #BUFFERS = END ADDR-START ADDR-1
      CMA,INA       WANT NEG. COMPL 
      STA NBUFS 
      LDA HWBUF     SET UP BUFFER POINTERS
      STA HWBFP 
      LDA SWBUF 
      STA SWBFP 
* 
      LDA ACCOP     SET UP POINTER TO 1ST BUFFER
      ADA POS1      SKIP OVER DEF TO RETURN 
      STA BUFP1     SAVE
      LDA ACCOP,I   SET UP RETURN ADDRESS 
      STA ACCOP 
* 
* 
      LDA WRDS+0    CHECK IF WRDS IS A VALID NUMBER 
      SZA,RSS       IF=0, OK
      JMP ACCLP 
      ADA DBIT0+0 
      ADA NEG2
      LDA A,I 
      AND WDFLG+0   IF THIS BIT IN MASK WORD SET, OK
      SZA,RSS 
      JMP ACCOP,I   IF NOT, RETURN
* 
* 
ACCLP ISZ ACBFP     TRANSFER 1ST BUFFER ADDR TO HWSTK CALL, SWSTK CALL
      LDA ACBFP,I 
      STA HWBFP,I 
      STA SWBFP,I 
      ISZ HWBFP 
      ISZ SWBFP 
      ISZ NBUFS     IF #BUFS LEFT=0, DONE 
      JMP ACCLP 
* 
      LDA TSTN+0    TEST FOR MAN. ENTRY TEST
      CPA POS15     IF SO, DON'T CONFIGURE
      JMP ACCSW 
* 
      LDB BUFP1     B=ADDR OF 1ST BUFFER
      JSB ACOND     SET UP OPERANDS 
      LDB BUFP1     B=ADDR OF 1ST BUFFER
      JSB ACOPN     SET UP OPERATIONS 
* 
ACCSW JSB CLANS       CLEAR ANSWER BUFFER 
      JSB CLRST     CLEAR RESULT BUFFER 
      JSB SWSTK     COMPUTE RESULT IN S.W 
      DEF ACCSE 
SWBF1 BSS 12
ACCSE NOP           ERROR RETURN
* 
      LDA RSLT1+0   MOVE RESULT TO ANSW1
      LDB ANSW1+0 
      MVW POS5
ACCHW JSB CLRST     CLEAR RESULT AGAIN
* 
HWSTK STK           COMPUTE H-W RESULT
      DEF ACCHE 
HWBF1 BSS 12
ACCHE JMP ACHNG     ERROR RETURN
      SOC           CHECK FOR OVERFLOW
ACSOV ISZ RST1O+0   SET OVFLW BUF 
* 
      LDA WRDS+0    IF 5 WORDS, CHOP OFF LOW BYTE OF LAST WORD
      CPA POS5
      JMP *+2 
      JMP ACCPR 
      LDA RST13+3 
      AND UPBYT 
      STA RST13+3 
* 
ACCPR JSB ACMPR     COMPARE RESULTS, REPORT ERRORS
ACELP RSS           NORMALLY RETURN 
      JMP ACSTT     IF IN LOOP MODE, CHECK CW 
* 
      JMP ACCOP,I 
ACSTT JSB CWCHK+0   TEST CW AND CHANGE PARMS IF NECESSARY 
      JMP ACCHW     REPEAT LAST OPERATION 
* 
ACHNG LDA NEG1      BOX HUNG, RETURN HUNG COND. 
      STA RST13+0 
      JMP ACSOV     SET OVERFLOW
* 
BUFP1 BSS 1         USED AS POINTER TO 1ST BUFFER FOR ACC. OPNS 
HWBUF DEF HWBF1 
SWBUF DEF SWBF1 
HWBFP BSS 1 
SWBFP BSS 1 
NBUFS BSS 1 
* 
* 
      SKP 
* 
* ROUTINE TO SET UP ACC. OPERANDS IN BUFFERS
* 
* ON ENTRY  B=ADDR OF 1ST BUFFER
* OPND ADDR INDEX SPECIFIED BY 4 BITS IN ODSEL
* THE MOST SIG. BITS ARE USED FIRST, ETC. 
* 
*SACOND 
ACOND NOP 
      LDA ODSEL     SET UP OPERAND INDEX
      STA TPSEL 
      STB ACBFP     SAVE BUF POINTER
ACODL LDB ACBFP,I   GET #WORDS IN 1ST OPND
      ADB POS1
      LDA B,I 
      SZA,RSS       IF=0, TEST 2ND OPND 
      JMP ACODB 
      STA WRDS+0    SET #WORDS FOR PACK 
      LDA TPSEL     GET ADDR OF OPERAND 
      ALF           GET NEXT 4 BITS 
      STA TPSEL     SAVE ROTATED FORM 
      AND POS15     ONLY 4 BIT ADDR 
      MPY POS5      5 WORDS/OPND
      ADA BMBGN     START ADDR
      LDB ACBFP,I   B=ADDR OF ACC. OPND 
      ADB POS2
      LDB B,I 
      CBX           SAVE OPERAND ADDRESS
      MVW POS5      TRANSFER OPERAND
* 
      ADB NEG5      B=OPND ADDR 
      JSB OPMIX     MAKE ADJUSTMENTS TO EXPONENT & MANTISSA 
      CXB           RESTORE OPERAND ADDR
      LDA WRDS+0
      JSB PAK5+0    PACK UP OPERAND 
* 
ACODB LDB ACBFP,I   GET #WORDS IN 2ND OPND
      ADB POS3
      LDA B,I 
      SZA,RSS       IF=O, TEST NEXT INSTR 
      JMP ACTIN 
      STA WRDS+0
      LDA TPSEL 
      ALF           GET NEXT OPND 
      STA TPSEL     SAVE
      AND POS15 
      MPY POS5
      ADA BMBGN 
      LDB ACBFP,I   B=ADDR OF ACC. OPND 
      ADB POS4
      LDB B,I 
      CBY           SAVE OPERAND ADDR 
      MVW POS5
      ADB NEG5      B=OPND ADDR 
      JSB OPMIX     MAKE MANT, EXP ADJUSTMENTS
      CYB           RESTORE OPERAND ADDR
      LDA WRDS+0
      JSB PAK5+0
* 
ACTIN ISZ ACBFP     GET NEXT BUFFER ADDR
      LDB ACBFP,I 
      LDB B,I       GET INSTR 
      SZB           IF=0, DONE
      JMP ACODL     LOOP AGAIN
      JMP ACOND,I 
* 
*LACOND 
* 
BMBGN DEF BFBGM 
*EACOND 
* 
* 
      SKP 
* ROUTINE TO SET UP INSTRS IN ACC BUFFERS 
* 
* ON ENTRY, B =ADDR OF 1ST BUFFER 
* 
* OPSEL DETERMINES THE INSTR. USED FOR SUCCESSIVE OPERATIONS
* TOP 2 BITS FOR 1ST OPN, ETC.
* 
* 
*SACOPN 
ACOPN NOP 
      STB ACBFP     SAVE BUFFER POINTER 
      LDA OPSEL+0   SET UP OPCODE SELECTION BUFFER
      STA TPSEL     SAVE IT 
ACOPL LDB ACBFP,I   GET INSTR. BASE 
      LDA B,I 
      SZA,RSS       IF INSTR=0, DONE
      JMP ACOPN,I 
      AND POS64     IF BIT 6 SET, NOT ADD,SUB,MPY,DIV -- DON'T CHANGE 
      SZA           IF NOT, GO ON 
      JMP ACOUP     INC POINTER, LOOP 
      LDA B,I       GET INSTR LESS OPCODE 
      AND NBT64 
      STA B,I       REPLACE 
      LDA TPSEL     GET OPCODE #
      ALF           GET NEXT TWO BITS 
      STA TPSEL     SAVE
      AND POS3
      ALF           MOVE TO BITS 4-6
      IOR B,I       OR INTO INSTR 
      STA B,I       NEW INSTRUCTION 
ACOUP ISZ ACBFP     INC BUFFER POINTER
      JMP ACOPL     GO FOR NEXT INSTR 
* 
*LACOPN 
* 
NBT64 OCT 177617
* 
*EACOPN 
* 
      SKP 
* ROUTINES TO CLEAR OUT RESULT AND ANSWER BUFFERS 
* 
* 
*S
CLANS NOP 
      LDA ZERO      OPERAND WITH ALL ZEROS
      LDB ANSW1+0 
      MVW POS6
      LDA ZERO
      LDB ANSW2+0 
      MVW POS6
      JMP CLANS,I   DONE
* 
* 
*S
CLRST NOP 
      CLA           CLEAR ALL RESULT BUFFERS
      STA RST13+0 
      STA RST13+1 
      STA RST13+2 
      STA RST13+3 
      STA RST13+4 
      STA RST13+5 
      STA RST23+0 
      STA RST23+1 
      STA RST23+2 
      STA RST23+3 
      STA RST23+4 
      STA RST23+5 
      STA RST33+0 
      STA RST33+1 
      STA RST33+2 
      STA RST33+3 
      STA RST33+4 
      STA RST33+5 
      JMP CLRST,I 
* 
* 
* 
      SKP 
* ROUTINE TO COMPARE RESULTS FROM HFP & S/W  FOR ACC. OPERATIONS
* HFP RESULT IN RSLT1, S/W ANSWER IN ANSW1
* REPORTS ERRORS IF FOUND 
* ON RETURN, E CLEAR IF NO ERROR, E SET IF ERROR
* 
*S
ACMPR NOP 
ACCCP RSS           NORMALLY EXECUTE
      JMP ACCSP     UNLESS SPECIAL CONF.
      LDA ANS1O+0   CHECK OVERFLOWS 
      CPA RST1O+0 
      JMP *+2       =, CHECK FOR SET, OR OPERANDS 
      JMP ACMER     ERROR 
      CLE           CLEAR E IN CASE CORRECT RESULT
      CPA POS1      IF OVFLW=SET, IGNORE RESULT 
      JMP ACMPR,I   OVERFLOW, DON'T TEST #S, JUST RETURN
      LDA ANSW1+0   COMPARE RESULT AND ANSWER 
      LDB RSLT1+0 
      CMW WDOUT+0 
      JMP ACMPR,I   OK, RETURN
      JMP ACMER     ELSE ERROR
      JMP ACMER 
* 
ACMER LDA WRDS+0    SET UP ECODE
      ADA NEG2      =#WORDS-2 
      STA ECODE+0 
      LDA POS0      GO TO ERROR ROUTINE, 1ST TRY
      STA TRYN+0
      JSB WRANS+0 
      CCE           SET E FOR ERROR RETURN
      JMP ACMPR,I   GO HOME 
* 
ACCSP JSB SKNCW+0   TEST FOR DISPLAY ALL OPNS 
      DEF DISPB+0 
      JMP ACMER     IF SO, TREAT AS ERROR 
      JMP ACMPR,I   ELSE DONE, IE NO REPORT 
* 
* 
* 
      SKP 
*S
* 
* 
* ROUTINE TO PROCESS STACK OF OPERATIONS IN S/W, AS HFPSTK
* 
* CALLING SEQUENCE:  JSB SWSTK
*                    DEF ERROR RETURN 
*                    DEF BUFFER 1 
*                    DEF BUFFER 2 
*                    .
*                    .
*                    .
*                    ERROR RETURN 
*                    NORMAL RETURN
* 
* BUFFER FORMAT:     HFP INSTRUCTION
*                    # WORDS IN 1ST OPND
*                    ADDRESS OF 1ST OPND
*                    # WORDS IN 2ND OPND
*                    ADDRESS OF 2ND OPND
*                    RESULT INSTRUCTION 
*                    # WORDS IN RESULT
*                    RESULT ADDRESS 
* 
SWSTK NOP 
      LDA SWSTK     SET UP BUFFER POINTER 
      STA BUFP
      LDA POS0      CLEAR OVERFLOW FLAG 
      STA ANS1O+0 
SWSLP ISZ BUFP      GET 1ST BUFFER ADDRESS
      LDA BUFP,I    AND PUT IN STKP 
      STA STKP+0
      LDA STKP+0,I  GET HFP INSTRUCTION 
      STA INSTR+0 
      SZA,RSS       IF INSTR=0, DONE
      JMP SWSEN 
      RAR,RAR       SHIFT RIGHT FOR OPCODE
      STA INTWD     BIT0=S/D FLAG IN FIX,FLOAT
      RAR,RAR       OPCODE IN BITS 2-0
      AND POS7      MASK OFF GARBAGE
      STA FCTNT 
      LDA INSTR+0   GET #WORDS IN FP OPERANDS 
      AND POS3      ONLY BITS 1,0 
      ADA POS2      ADD 2 
      STA WRDS+0    SAVE
      LDA ANSW1+0   IN CASE OF ACC OPN
      LDB OPND1+0   LOAD LAST RESULT IN OPERANDS
      CBX           SET UP X FOR OPND ADDR
      MVW POS5
      LDA ANSW1+0 
      LDB OPND2+0 
      CBY           SET UP Y FOR OPND ADDR
      MVW POS5
      LDB OPND1+0   GET 1ST OPERAND 
      JSB SWSOP 
      LDB OPND2+0   GET 2ND OPERAND 
      JSB SWSOP 
      LDA FCTNT     TEST FOR TYPE-- FIX,FLOAT 
      CPA POS4
      JMP SWSFX     IF FIX, GO THERE
      CPA POS5      TET FOR FLOAT 
      JMP SWSFT 
* 
SWSTD LDA WRDS+0    ADD,SUB,MPY OR DIV
      STA WDIN+0    SET WDIN
*     LDB OPND1+0   TRUNCATE 1ST OPERAND
*     JSB TRNC5+0 
*     LDA WRDS+0
*     LDB OPND2+0   SAME FOR 2ND OPERAND
*     JSB TRNC5+0 
      LDA FCTNT     GET S/W OPN ADDR
      ADA DEFSW 
      LDB ANSW1+0 
      JSB A,I       GET S/W ANSWER
      LDA WRDS+0    ROUND ANSWER
      LDB ANSW1+0 
      JSB RND5+0
      CLE           CHECK FOR EXPONENT OVERFLOW 
      LDA INSTR+0 
      AND PS128     IF BIT 7 SET, SET E 
      CPA PS128 
      CCE 
      JSB EXPCK+0 
      LDA ANS1O+0   IF OVERFLOW, SET FLAG 
      SOC 
      LDA POS1
SWSTO STA ANS1O+0 
      ISZ STKP+0    GET RESULT INSTR
      LDA STKP+0,I
      SZA,RSS       IF=0, GET ORIG. INSTR 
      LDA INSTR+0 
      AND POS3      GET # WORDS IN RESULT 
      ADA POS2
      STA WDOUT+0 
*     JSB TRNC5+0   TRUNCATE ANSWER 
SWSTR ISZ STKP+0    STORE RESULT IF NECESSARY 
      LDA STKP+0,I
      SZA,RSS       IF #RSLT WORDS=0, NO SAVE 
      JMP SWSLP 
      ISZ STKP+0
      LDA ANSW1+0 
      LDB STKP+0,I
      MVW POS5
      LDA FCTNT     IF FIX, THATS ALL 
      CPA POS4
      JMP SWSLP 
      LDA WDOUT+0   PACK UP RETURNED RESULT 
      STA WRDS+0    SET WRDS TO WDOUT 
      LDB STKP+0,I
      JSB PAK5+0
      JMP SWSLP       GET NEXT INSTR
* 
* 
SWSFX LDA OPND1+0   PUT OPERAND IN ANSW1
      LDB ANSW1+0 
      MVW POS5
      LDA WRDS+0    TRUNCATE OPERAND
      STA WDIN+0
      LDB ANSW1+0 
*     JSB TRNC5+0 
      LDA INTWD     SET UP INTWD
      AND POS1
      STA INTWD 
      STA WDOUT+0   SET UP WDOUT
      ISZ WDOUT+0 
      JSB FIXOP+0   GET INTEGER 
      LDA ANS1O+0 
      SOC           SET FLAG IF OVERFLOW
      LDA POS1
      STA ANS1O+0 
      ISZ STKP+0    ADVANCE POINTER 
      JMP SWSTR     TEST & SAVE RESULT
* 
* 
SWSFT LDA OPND1+0   MOVE OPERAND TO ANSW1 
      LDB ANSW1+0 
      MVW POS5
      LDA INTWD     SET INTWD, WDIN 
      AND POS1
      STA INTWD 
      STA WDIN+0
      ISZ WDIN+0
      LDB ANSW1+0 
      JSB FLTOP+0   GET FP #
      LDA WRDS+0
      JSB TRNC5+0   TRUNC. RESULT 
      LDA ANS1O+0   DON'T CHANGE OVERFLOW 
      JMP SWSTO     SAVE & HANDLE OVERFLOW,RESULT 
* 
* 
SWSEN LDA SWSTK,I   JUMP OVER ERROR RETURN
      ADA POS1
      JMP A,I       RETURN TO CALLER
* 
* 
*SSWSOP 
SWSOP NOP           PUT OPERAND IN LOCS AT B REG IF #WORDS>0
      ISZ STKP+0    GET # WORDS 
      LDA STKP+0,I
      ISZ STKP+0    POINT TO ADDR 
      SZA,RSS       IF #WORDS=0, GO HOME
      JMP SWSOP,I 
      LDA STKP+0,I  ELSE MOVE IN BUFFER 
      MVW POS5      B HAS ADDRESS 
      LDA FCTNT     IF FLOAT, THATS ALL 
      CPA POS5
      JMP SWSOP,I 
      LDA WRDS+0    ELSE UNPACK # 
      ADB NEG5
      JSB UNPK5+0 
      JMP SWSOP,I   DONE! 
* 
* 
* 
* 
* 
* 
* 
      SKP 
* 
* ROUTINE TO TEST 5 WORD UNPACKED OPERANDS FOR RANGE
* SETS ODFLG BASED ON THE MOST RESTRICTIVE OPERAND AS FOLLOWS 
*      ODFLG= 0  NO RESTRICTIONS, STD OR 5 WORD FORMAT
*             1  STD. OPERAND CANNOT BE COMPLEMENTED  (5 WORD CAN)
*             2  STD. OPERAND OVERFLOW, 5 WORD O.K. 
*             3  STD. OVERFLOW, 5 WORD CANNOT BE COMPLEMENTED 
*             4  STD. AND 5 WORD OVERFLOW 
* 
* STD. OVERFLOW: EXP.>127  OR <-128 
* 5 WD OVERFLOW: EXP.>512 OR <-512
* NO COMPLIMENT: EXPONENT= MAX POS & OPERAND= -1
*             OR           MAX NEG            1/2 
* 
* OPERAND ADDRESSES IN X,Y
* RESULT RETURNED IN ODFLG, IF=4, NO SKIP  OTHERWISE 1 INSTR SKIPPED
* A,B,E MODIFIED
* 
*SODTST 
ODTST NOP 
      LDB OPND1+0   CHECK 1ST OPND FOR RANGE
      JSB ODCHK 
      STA ODFLS     SAVE ODFLG
      LDB OPND2+0   CHECK 2ND OPND
      JSB ODCHK 
      LDB ODFLS 
      CMB,INB       PUT HIGHER OF 2 VALUES IN ODFLG 
      ADB ODFLG 
      SSB 
      LDA ODFLS 
      STA ODFLG 
      CPA POS4      IF 5 WORD OVERFLOW, NO SKIP 
      JMP ODTST,I 
      ISZ ODTST     IF NOT TOTALLY FATAL, SKIP INSTR
      JMP ODTST,I 
* 
ODFLS BSS 1 
*EODTST 
* 
      SKP 
* 
* ROUTINE TO TEST AN OPERAND FOR RANGE
* B=ADDR OF OPND, RETURN WITH VALUE IN A REG. AND ODFLG 
* 
*SODCHK 
ODCHK NOP 
      CLA           CLEAR ODFLG 
      STA ODFLG 
      ADB POS4      A=EXPONENT
      LDA B,I 
      SSA,RSS       IF POS, A=-EXP
      CMA 
      ADA PS127     TEST FOR EXP<127 AND >-128
      SSA,RSS 
      JMP ODCEX     IF SO, DONE 
      INA,SZA,RSS   TEST FOR EXP=127,-128 
      JMP ODLMT     IF SO, TEST MANTISSA
      ISZ ODFLG     ELSE ODFLG>=2, TEST FOR 5 WRD CASE
      ISZ ODFLG 
      ADA PS383     127+1+383=511  = 5 WD EXP. TEST 
      SSA,RSS       TEST FOR EXP<511 AND >-512
      JMP ODCEX     IF SO, DONE 
      INA,SZA,RSS   ELSE TEST IF=511 OR -512
      JMP ODLMT     IF SO, TEST MANTISSA
      LDA POS4      ELSE 5 WD OVERFLOW
      STA ODFLG     PUT VALUE IN FLAG 
      JMP ODCEX 
ODLMT ADB NEG4      TEST MANT FOR = 1/2 OR -1 
      LDA B,I       A=MOST SIG WORD OF MANT 
      CPA BIT14     TEST FOR 1/2
      JMP ODCH0     IF SO TEST OTHER WORDS=0
      CPA BIT15     TEST FOR -1 
      JMP ODCH0     IF SO TEST OTHER WORDS=0
      JMP ODCEX     IF NOT, DONE
ODCH0 INB           ADDR OF 2ND WORD
      LDA B,I 
      SZA 
      JMP ODCEX     IF NOT=0, DONE
      INB           TEST 3RD WORD 
      LDA B,I 
      SZA 
      JMP ODCEX 
      INB           TEST 4TH WORD 
      LDA B,I 
      SZA,RSS 
      ISZ ODFLG     IF ALL WERE=0, INCREMENT ODFLG
ODCEX LDA ODFLG     A REG. = RETURN VALUE 
      JMP ODCHK,I   DONE
* 
*LODCHK 
NEG4  DEC -4
PS383 DEC 383 
PS127 DEC 127 
BIT14 OCT 40000 
BIT15 OCT 100000
*EODCHK 
* 
* 
      SKP 
* 
* 
* ROUTINE TO LOOP FROM OWRDS TO 5, TESTING HFP
* ON ENTRY, B=ADDR OF 1ST OF 2 PAIRS OF OPERANDS TO EXECUTE (SAME RESULT) 
* A,B,X,Y,E MODIFIED
* 
*SWRDLP 
WRDLP NOP 
      STB OPNDS+0   SAVE ADDR OF OPND PAIRS 
      LDA OWRDS+0   SET START # WORDS 
      LDB WDFLG+0   =#WRDS>=OPWRDS
      CPA POS2      IF=2, READY 
      JMP IWDLP 
      BRS           IF=3, START THERE 
      CPA POS3
      JMP IWDLP 
      BRS 
      CPA POS4
      JMP IWDLP 
      BRS 
IWDLP STB WDFLL     SAVE ROTATED WDFLG
      STA WRDS+0
      STA WDIN+0    SET #INPUT AND OUTPUT WORDS TO SAME 
      STA WDIN2+0 
      STA WDOUT+0 
      SLB,RSS       IF LSB=0, DONT TEST ON THIS #WORDS
      JMP WRDUP 
      ADA NEG2      FORM INSTRUCTION
      ADA OPCOD 
      STA INSTR+0 
      JSB SWOPN     ROUND,TRUNC & PACK S/W ANSWER 
      JSB HWOND     SET POND1,NOND1,POND2,NOND2 
      LDA OPNDS,I   ODAD1,2 = ADDRS OF 1ST OPNDS
      STA ODAD1+0 
      LDA OPNDS     GET NEXT ONE
      ADA POS1
      LDA A,I 
      STA ODAD2+0 
      JSB HWTST     GET & COMPARE HFP RESULTS 
      LDA OPNDS     GET NEXT PAIR OF OPNDS
      ADA POS2
      LDA A,I 
      STA ODAD1+0 
      LDA OPNDS 
      ADA POS3
      LDA A,I 
      STA ODAD2+0 
      JSB HWTST     GET & COMPARE HFP RESULTS 
WRDUP LDB WDFLL     GET NEXT WORD FLAG
      BRS 
      LDA WRDS+0    A=#WRDS 
      INA           INC FOR NEXT TIME 
      SZB           IF=0, NO MORE LOOPS 
      JMP IWDLP     ELSE TRY AGAIN
      JMP WRDLP,I   IF SO, DONE-- RETURN
* 
*LWRDLP 
* 
OPNDS BSS 1         OPERAND PAIRS STORAGE VAR.
WDFLL BSS 1 
*EWRDLP 
* 
* 
      SKP 
*ROUTINE TO ROUND, CHECK, AND PACK SW ANSWERS 
* WITH BIT 7 =0,1 
*GENERAL ANSWER IN ANSW 
*ANSWERS RETURNED IN ANSW1,ANSW2
*A,B,E LOST 
* 
*S
SWOPN NOP 
* 
      CLA,INA       TEST FOR FIX,FLOAT
      CPA FIXFG 
      JMP SWFIX     YES, FIS
      CPA FLTFG 
      JMP SWFLT 
* 
      LDA ANSW+0    MOVE GEN. ANS INTO WORKING BUFFER 
      LDB ANSW1+0 
      MVW POS5
      LDB ANSW1+0   STD. ANSWER 
      LDA WRDS+0    ROUND ANSWER TO # OF WORDS
      JSB RND5+0
      LDA ANSW1+0   MOVE ANSWER TO ANSW2 ALSO 
      LDB ANSW2+0 
      MVW POS5
      LDA WRDS+0    CHECK FOR OVERFLOW-- BIT 7=0
      LDB ANSW1+0 
      CLE           FOR BIT 7=0 
      JSB EXPCK+0 
      CLA           TEST OVERFLOW 
      SOC 
      INA 
      STA ANS1O+0 
      LDA WRDS+0    PACK ANSW1
      JSB PAK5+0
* 
      LDA WRDS+0    CHECK FOR OVERFLOW-- BIT 7=1
      LDB ANSW2+0 
      CCE           FOR BIT 7=1 
      JSB EXPCK+0 
      CLA           TEST FOR OVERFLOW 
      SOC 
      INA 
      STA ANS2O+0 
      LDA WRDS+0    PACK ANSW2
      JSB PAK5+0
      JMP SWOPN,I   DONE
* 
* 
* 
SWFIX DLD ANSW+1    PUT ANSWER IN ANSW1,2 
      DST ANS13+0 
      DST ANS23+0 
      LDA ANSO+0    SAVE OVERFLOW 
      STA ANS1O+0 
      STA ANS2O+0 
      JMP SWOPN,I   ALL DONE
* 
* 
* 
SWFLT LDA ANSW+0    MOVE ANSWER INTO WORKING BUFFER 
      LDB ANSW1+0 
      MVW POS5
      LDB ANSW1+0   PACK ANSWER 
      LDA WRDS+0
      JSB PAK5+0
      LDA ANSW1+0   PUT SAME IN ANSW2 
      LDB ANSW2+0 
      MVW WDOUT+0 
      LDA POS0      CLEAR OVERFLOW REGS 
      STA ANS1O+0 
      STA ANS2O+0 
      JMP SWOPN,I   DONE! 
* 
      SKP 
* 
* ROUTINE TO SET UP OPERANDS FOR HFP CALCULATIONS-- + AND - 
* MODIFIES A,B,E
* 
*S
HWOND NOP 
      LDA OPND1+0   MOVE POS. OPNDS INTO WORKING BUFFER 
      LDB POND1 
      MVW POS10 
      LDA OPND1+0   MOVE POS OPNDS INTO NEG. OPND BUFFER
      LDB NOND1 
      MVW POS10 
* 
      LDA FLTFG     IF FLOAT, THATS ALL 
      SZA 
      JMP HWOND,I 
* 
      LDB POND1     TRUNC & PACK 1ST OPND 
      LDA WRDS+0
      JSB PAK5+0
* 
      LDA WRDS+0    SAME FOR 2ND OPND 
      LDB POND2 
      JSB PAK5+0
* 
      LDB NOND1     COMPLEMENT 1ST OPND 
      JSB COM5+0
      LDA WRDS+0    NOW PACK
      JSB PAK5+0
* 
      LDB NOND2     COMPLEMENT 2ND OPND 
      JSB COM5+0
      LDA WRDS+0    PACK IT 
      JSB PAK5+0
      JMP HWOND,I   DONE
* 
      SKP 
* 
* ROUTINE TO GET HFP RESULTS & COMPARE WITH S/W 
* 
* MODIFIES A,B,E
* 
*ROUTINE TO TEST OPERANDS AND EXECUTE H/W TESTS AND COMPARISIONS
* 
* 
*S
HWTST NOP 
      ISZ OPNNL+0   LOGICAL # OF OPERATION
      JMP *+1 
      LDA ODFLG     TEST FOR SUITABLE OPERANDS
      CLE,SZA,RSS 
      JMP HWTGO     IF OK, GO ON
      CPA POS2      IF=2, CHECK FOR 5 WORDS 
      JMP HWTS5 
      CPA POS4      IF=4, NO CHANCE 
      JMP HWTST,I 
      LDA ODAD1+0   CHECK 1ST OPND FOR ADDR OF NON-COMPL. OPND
      JSB POTST     SET E IF NON COMPL. OPND
      LDA ODAD2+0   CHECK 2ND ADDR
      JSB POTST 
      LDA ODFLG     TEST FOR TYPE 3 
      CPA POS3
      JMP HWTT3     IF SO TEST FOR NON COMPL AND 5 WD 
      SEZ           TYPE 2, TEST FOR NON COMPL
      JMP HWTS5     COMPL OPND, TEST FOR 5 WORDS
      JMP HWTGO     NON COMPL OPNDS, OK 
* 
HWTT3 SEZ           TYPE 3, MUST MEET BOTH TESTS
      JMP HWTST,I   YOU LOSE
HWTS5 LDA WRDS+0    TEST #WORDS=5 
      CPA POS5
      JMP HWTGO     OK, EXECUTE 
      JMP HWTST,I   SORRY, NO GO
* 
HWTGO JSB HWOPN     GET HFP RESULTS 
      JSB CPANS     COMPARE TO S/W -- REPORT ERRORS 
STELP RSS           NORMALLY RETURN 
      JMP HWSTT     IF LOOP MODE, TEST CW 
      JMP HWTST,I 
HWSTT JSB CWCHK+0   TEST CW, SET PARMS
      JMP HWTGO     REPEAT LAST INSTRUCTION (GROUP OF 3)
* 
* 
* 
* 
* 
* ROUTINE TO TEST IF OPND IS AT PON13 OR PON23 (NON COMPL. FORM)
* A=ADDR OF OPND,   SET E ON RETURN IF FAILS TEST 
* 
*S
POTST NOP           ROUTINE TO TEST ADDR OF OPND FOR = PON13,PON23
      CPA POND1     TEST IF 1ST NON COMPL OPND
      JMP POTST,I   IF=, OK-- RETURN
      CPA POND2     IF NOT 1ST, CHECK FOR 2ND 
      JMP POTST,I   RETURN IF=
      CCE           ELSE SET E, RETURN
      JMP POTST,I 
* 
* 
* 
* 
      SKP 
* 
* 
* 
*ROUTINE TO COMPARE RESULTS FROM HFP WITH S/W 
*HFP RESULTS IN RSLT1,RSLT2,RSLT3 
* S/W RESULTS IN ANSW1,ANSW2,ANSW3
*CALLS ERROR ROUTINE IN CASE OF DISCREPANCY 
* 
*S
CPANS NOP 
STDCP RSS           NORMALLY COMPARE, UNLESS
      JMP CPASP     SPECIAL CONF. 
CPAN1 RSS           NORMALLY TEST, UNLESS CW BIT 6 SET
      JMP CPAN2 
      LDA ANSW1+0   CHECK DIRECT/1ST RESULT 
      LDB RSLT1+0 
      CMW WDOUT+0 
      JMP CPOV1     IF=, COMPARE OVERFLOW 
      NOP           ERROR 
      JMP WRAN1     ERROR 
CPOV1 LDA ANS1O+0   CHECK OVERFLOW
      CPA RST1O+0 
      JMP CPAN2     IF=, OK-- GO ON 
WRAN1 CLA           ELSE GO TO ERROR ROUTINE, 1ST TRY 
      JSB WRANS 
* 
CPAN2 RSS           NORMALLY TEST, UNLESS CW BIT 7 SET
      JMP CPAN3 
      LDA ANSW1+0     CHECK INDIRECT/2ND RESULT 
      LDB RSLT2+0 
      CMW WDOUT+0 
      JMP CPOV2     IF=, CHECK OVFLW
      NOP 
      JMP WRAN2     ERROR 
CPOV2 LDA ANS1O+0   CHECK OVFLW 
      CPA RST2O+0 
      JMP CPAN3     IF=, CHECK NEXT RESULT
WRAN2 CLA,INA       ERROR-- GO TO ERROR ROUTINE-- 2ND TRY 
      JSB WRANS 
* 
CPAN3 RSS           NORMALLY TEST, UNLESS CW BIT 8 SET
      JMP CPANS,I   IF SO, RETURN 
      LDA ANSW2+0   BIT 7 ANSWER
      LDB RSLT3+0 
      CMW WDOUT+0 
      JMP CPOV3     IF=, CHECK OVERFLOW 
      NOP 
      JMP WRAN3     ERROR 
CPOV3 LDA ANS2O+0   CHJECK OVERFLOW 
      CPA RST3O+0 
      JMP CPANS,I   IF=, DONE 
WRAN3 LDA POS2      ERROR-- 3RD RESULT
      JSB WRANS 
      JMP CPANS,I   DONE
* 
CPASP JSB SKNCW+0   CHECK FOR PORT TEST MODE
      DEF PORTB+0 
      JMP CPAPT     IF SO, FUDGE POINTERS,... 
      JSB SKNCW+0   TEST FOR DISPLAY ALL OPNS 
      DEF DISPB+0 
      JMP CPADP     IF SO, CALL WRANS 3 TIMES 
      JMP CPANS,I   ELSE DONE.
CPADP CLA           1ST TRY 
      JSB WRANS 
      LDA POS1      2ND TRY 
      JSB WRANS 
      LDA POS2
      JSB WRANS     3RD TRY 
      JMP CPANS,I   DONE
* 
CPAPT LDA WDIN+0    SET WDOUT= MIN(WDIN,WDOUT)
      LDB WDOUT+0 
      CMB,INB 
      ADB A 
      SSB 
      STA WDOUT+0 
      LDA ODAD1+0   SET UP ANSW1,ANSW2=OPND1
      LDB ANSW1+0 
      MVW WDOUT+0 
      LDA ODAD1+0 
      LDB ANSW2+0 
      MVW WDOUT+0 
      CLA           SET EXPECTED OVFLS
      STA ANS1O+0 
      STA ANS2O+0 
      JSB SKNCW+0   TEST FOR PRINT ALL
      DEF DISPB+0 
      JMP CPADP     IF SO, DO 
      JMP CPAN1     ELSE NORMAL CHECK 
* 
* 
* 
* 
      SKP 
* 
*ROUTINE TO SEND OPNDS TO HFP, GET RESULTS, FOR DIRECT, INDIRECT, BIT 7 
*OPND ADDRS IN ODAD1,2   B=INSTRUCTION
*RESULT RETURNED IN RSLT1, RSLT2, RSLT3 
*A,B,E DESTROYED! 
* 
*SHWOPN 
HWOPN NOP 
      ISZ HWCNT+2 
      JMP HWCLR 
      ISZ HWCNT+1 
      JMP HWCLR 
      ISZ HWCNT+0 
      NOP 
HWCLR NOP           NORMALLY DON'T CLEAR BUFFERS
      JSB CLRST     CLEAR OUT RESULTS 
      LDB INSTR+0   B=OPCODE
      CLA,INA       TEST FOR FIX,FLOAT
      CPA FIXFG 
      JMP HFIX      FIX OPERATION 
      CPA FLTFG 
      JMP HFLT      FLOAT OPERATION 
* 
      LDA ODAD1+0 
      STA I341+2    ADD,SUB,MPY OR DIV-- SAVE OPND ADDRESSES
      LDA ODAD2+0 
      STA I341+3
      LDA WRDS+0    TEST FOR 2,5 WORDS
      CPA POS2
      JMP ASMD2     2 WORD OPN
* 
      STB I341      3,4 WORD OPN     PUT INSTR IN PLACE 
      STB I342
      ADB POS0      SET BIT 7 
      STB I343
* 
A.D31 RSS           NORMALLY EXECUTE, UNLESS CW BIT 6 SET 
      JMP A.D32 
I341  NOP           STD 3,4 WORDS, DIRECT 
      DEF RST13+0   RESULT ADDR 
      NOP           1ST OPND
      NOP           2ND OPND
      SOC           IF OVERFLOW, SET WORD=1 
      ISZ RST1O+0 
* 
A.D32 RSS           NORMALLY EXECUTE, UNLESS CW BIT 7 SET 
      JMP A.D33 
I342  NOP           3,4 WORDS, INDIRECT 
      DEF RSLT2+0,I RESULT
      DEF I341+2,I  1ST OPND
      DEF I341+3,I  2ND OPND
      SOC           TEST OVERFLOW 
      ISZ RST2O+0   SET WORD IF OVERFLOW
* 
A.D33 RSS           NORMALLY EXECUTE, UNLESS CW BIT 8 SET 
      JMP HWOCH     IF SO, TEST FOR 5 WORDS 
HFP71 XPD           SPECIAL BIT 7 MACRO 
I343  NOP           3,4 WORDS  INDIRECT, BIT 7 SET
      DEF RSLT3+0,I RESULT
      DEF I342+2,I  1ST OPND
      DEF I342+3,I  2ND OPND
      SOC           TEST OVERFLOW 
      ISZ RST3O+0 
HWOCH LDA WRDS+0    IF 5 WORDS, CHOP OFF LAST 8 BITS
      CPA POS5
      JMP *+2 
      JMP HWOPN,I   RETURN NOW
      LDA RST13+3 
      AND UPBYT 
      STA RST13+3 
      LDA RST23+3 
      AND UPBYT 
      STA RST23+3 
      LDA RST33+3 
      AND UPBYT 
      STA RST33+3 
      JMP HWOPN,I   GO HOME 
* 
* 
* 
ASMD2 STB IN21      2 WORD OPN,  SET UP INSTRUCTIONS
      STB IN22
      ADB POS0      SET BIT 7 
      STB IN23
      LDA ODAD2+0 
      STA IN21+1    SET UP OPND 2 
* 
A.D21 RSS           NORM EXECUTE
      JMP A.D22 
      DLD I341+2,I  GET 1ST OPND IN A,B 
IN21  NOP           2 WORD INSTR,  DIRECT 
      NOP           DEF TO 2ND OPND 
      DST RST13+0   PUT RESULT IN BUFFER
      SOC           TEST OVERFLOW 
      ISZ RST1O+0 
* 
A.D22 RSS           NORM EXECUTE
      JMP A.D23 
      DLD I341+2,I  GET 1ST OPND IN A,B 
IN22  NOP           2 WORD OPN, INDIRECT
      DEF IN21+1,I  2ND OPND
      DST RST23+0   SAVE RESULT 
      SOC           TEST OVERFLOW 
      ISZ RST2O+0 
* 
A.D23 RSS           NORM EXECUTE
      JMP HWOPN,I   ELSE RETURN 
      DLD I341+2,I  GET 1ST OPND
HFP72 XPD           SPECIAL BIT 7 MACRO 
IN23  NOP           2 WORD OPN, INDIRECT, BIT 7 SET 
      DEF IN22+1,I  2ND OPND
      DST RST33+0   SAVE RESULT 
      SOC           TEST OVERFLOW 
      ISZ RST3O+0 
      JMP HWOPN,I 
* 
* 
* 
HFIX  LDA ODAD1+0   SAVE 1ST OPND 
      STA X341+1
      LDA INTWD     SET WDOUT 
      ADA POS1
      STA WDOUT+0 
      LDA WRDS+0    TEST FOR 2,5 WORDS
      CPA POS2
      JMP HFIX2     FIX AND FLOAT 2 WORD
      STB X341      SET UP INSTRS 
      STB X342
      ADB POS0      SET BIT 7 FOR 3RD OPN 
      STB X343
* 
      CLB           CLEAR B FOR SINGLE FIX
* 
FIX31 RSS           NORM EXECUTE
      JMP FIX32 
X341  NOP           3,4 WORD DIRECT FIXS, FIXD
      NOP           DEF TO OPND 
      STA RST13+0   STORE RESULT
      STB RST13+1 
      SOC           TEST OVERFLOW 
      ISZ RST1O+0 
* 
FIX32 RSS           NORM EXECUTE
      JMP FIX33 
X342  NOP           3,4 WORD FIX INDIRECT 
      DEF X341+1,I  OPND
      STA RST23+0   SAVE RESULT 
      STB RST23+1 
      SOC           TEST OVERFLOW 
      ISZ RST2O+0 
* 
FIX33 RSS           NORM EXECUTE
      JMP HWOPN,I   RETURN
X343  NOP           3,4 WORD FIX, INDIRECT, BIT 7 SET 
      DEF X342+1,I  OPND
      STA RST33+0   SAVE RESULT 
      STB RST33+1 
      SOC           TEST OVERFLOW 
      ISZ RST3O+0 
      JMP HWOPN,I   DONE
* 
* 
HFIX2 STB FX21      SET UP INSTRS 
      STB FX22
      ADB POS0
      STB FX23
* 
FIX21 RSS           NORM EXEC.
      JMP FIX22 
      DLD X341+1,I  GET OPND
FX21  NOP           2 WORD FIX,FLOAT S-D
      STA RST13+0   STORE RESULT
      STB RST13+1 
      SOC           TEST OVERFLOW 
      ISZ RST1O+0 
* 
FIX22 RSS           NORM EXEC.
      JMP FIX23 
      DLD X341+1,I  SAME THING AGAIN (NO IND. POSSIBLE) 
FX22  NOP           2 WORD FIX,FLOAT S-D
      STA RST23+0   STORE RESULT
      STB RST23+1 
      SOC           TEST OVERFLOW 
      ISZ RST2O+0 
* 
FIX23 RSS           NORM. EXEC. 
      JMP HWOPN,I   RETURN
      DLD X341+1,I  SET BIT 7 THIS TIME 
FX23  NOP           INSTR 
      STA RST33+0   STORE RESULT
      STB RST33+1 
*     LDB INTWD 
*     SZB,RSS 
*     STA RST33+0 
      SOC           TEST OVERFLOW 
      ISZ RST3O+0 
      JMP HWOPN,I 
* 
* 
HFLT  LDA ODAD1+0   SAVE OPND ADDR
      STA X341+1
      LDA INTWD     SET UP WDIN 
      ADA POS1
      STA WDIN+0
      LDA WRDS+0    TEST FOR 2,5 WORDS
      CPA POS2
      JMP HFLT2 
* 
      STB T341      SET UP INSTRS 
      STB T342
      ADB POS0
      STB T343
      DLD X341+1,I
* 
FLT31 RSS           NORM EXEC 
      JMP FLT32 
T341  NOP           3,4 WORD  DIRECT FLOAT S-D
      DEF RST13+0   RESULT
      SOC           TEST OVERFLOW 
      ISZ RST1O+0 
* 
FLT32 RSS           NORM EXEC 
      JMP FLT33 
T342  NOP           3,4 WORD INDIRECT FLOAT S-D 
      DEF RST23+0   RESULT
      SOC           TEST OVERFLOW 
      ISZ RST2O+0 
* 
FLT33 RSS           NORM EXEC 
      JMP HWOCH     TEST FOR 5 WORDS
T343  NOP           3,4 WORD INDIRECT, BIT 7 SET
      DEF RST33+0   RESULT
      SOC           TEST OVERFLOW 
      ISZ RST3O+0 
      JMP HWOCH     TEST FOR 5 WORDS-- CHOP OFF RESULT
* 
HFLT2 STB FT21      SET UP INSTRUCTIONS 
      STB FT22
      STB FT23
      DLD X341+1,I  IF DOUBLE B=1ST WORD
* 
FLT21 RSS           NORM EXECUTE
      JMP FLT22 
FT21  NOP           FLOAT S-D 
      DST RST13+0   SAVE RESULT 
      SOC           TEST FOR OVERFLOW 
      ISZ RST1O+0 
* 
FLT22 RSS           NORM EXECUTE
      JMP FLT23 
      DLD X341+1,I  GET OPND
FT22  NOP 
      DST RST23+0   SAVE 2ND RESULT 
      SOC           TEST OVERFLOW 
      ISZ RST2O+0 
* 
FLT23 RSS           NORM EXECUTE
      JMP HWOPN,I   RETURN
      DLD X341+1,I  GET OPND
FT23  NOP 
      DST RST33+0   SAVE 3RD RESULT 
      SOC           TEST OVERFLOW 
      ISZ RST3O+0 
      JMP HWOPN,I   DONE! 
* 
*EHWOPN 
* 
* 
* 
      SKP 
* 
* ROUTINE TO RETRIEVE 2 OPNDS FROM THE DATA BUFFER
* XR,YR   ARE SET TO OPND ADDRESSES,
* ON ENTRY, AR=0 FOR RESET, -1 FOR CURRENT OPNDS, 1 FOR NEXT OPND 
*           ALSO, TWO PARMS PASSED, DEF BFBGN, DEF BFEND= BUF LIMITS
* 
* 
*SGETOP 
GETOP NOP 
      SZA,RSS       IF A=0, RESET POINTERS
      JMP RESET 
      SSA           IF A<0,  RETURN CURRENT OPNDS 
      JMP RTNOP 
NXTOP LDA INXF
      SLA,RSS       IF FLAG=0, USE INDEXED FORMAT 
      JMP INXOP 
      CLA,INA       IF FIX OR FLOAT, BYPASS PTR2
      CPA FIXFG 
      JMP INCP1 
      CPA FLTFG 
      JMP INCP1 
      LDA PTR2      ADVANCE PTR2 TO NEXT OPND 
      ADA ONDUP+0   IE FORWARD BY ONDUP 
      STA PTR2
      CMA,INA       IF PTR2>BFEND, RESET PTR2 AND ADVANCE PTR1
      ADA BFEND 
      SSA,RSS 
      JMP INCNT     ELSE GET OPERAND
INCP1 LDA PTR1      ADVANCE PTR1
      ADA ONDUP+0 
GPBEX STA PTR1
      STA PTR2      PTR2=PTR1 
      CMA,INA       IF PTR1>BFEND, RETURN WITHOUT SKIP
      ADA BFEND      AND WITHOUT OPND 
      SSA 
      JMP GETOP,I     RETURN W/O SKIP, ALSO YESET,I GPCNT...
INCNT ISZ GPCNT 
RTNOP LDA PTR1      PUT 1ST OPND IN OPND1 
      LDB OPND1+0 
      CBX           XR= OPND1 ADDR
MWP1  MVW POS5
      LDA PTR2      PUT 2ND OPND IN OPND2 
      LDB OPND2+0 
      CBY           YR=OPND2 ADDR 
MWP2  MVW POS5
      ISZ GETOP     NORMAL EXIT WITH SKIP 
      JMP GETOP,I   LAND HO, MATES
* 
* THIS SECTION RETURNS INDEXED OPERANDS 
* 
INXOP LDA GPTR      GET INDEXES TO OPERANDS 
      ADA GPCNT 
      LDA A,I 
      SSA           IF INDEX<0, DONE WITH THIS PART 
      JMP RSET2       SET UP FOR ALL COMB TEST
      STA INXP      SAVE INDEX WORD 
      AND LWBYT     A=INDEX OF 2ND OPND IN TABLE
      LDB A         MPY INDEX BY 5 TO GET OFFSET
      ALS,ALS 
      ADA B 
      ADA BFBGN     FORM PTR2 
      STA PTR2
      LDA INXP      HIGH BYTE HAS 1ST OPND ADDR 
      ALF,ALF 
      AND LWBYT 
      LDB A         MPY INDEX BY 5 TO GET OFFSET
      ALS,ALS 
      ADA B 
      ADA BFBGN     FORM PTR1 
      STA PTR1
      JMP INCNT     INC COUNT AND PUT OPNDS IN OPND1 & 2
* 
*INITIALIZATION SECTION 
* 
RESET CLA           CLEAR COUNTER 
      STA GPCNT 
      STA INXF      =0 FOR INDEXED OPNS, 1 FOR EXHAUSTIVE 
* 
      LDA GETOP,I   GET OPND BUFFER LIMITS
      STA BFBGN 
      ISZ GETOP 
      LDA GETOP,I 
      STA BFEND 
      ISZ GETOP 
* 
      LDA INXBF     SET UP INDEX POINTER
      ADA TSTN+0    ADD IN TEST#
      LDA A,I       GET ADDR OF BUFFER FOR CURRENT OPERATION
      SEZ,RSS       IF E=0, NO INDEXING 
      LDA ONES
      STA GPTR
      JMP GETOP,I   THATS ALL FOR NOW 
RSET2 LDA BFBGN     SET PTR1 TO BFBGN,
      ISZ INXF      SET UP FOR EXHAUSTIVE TEST
      JMP GPBEX     SET PTR1, PTR2 TO BFBGN, GET  OPNDS 
* 
*LGETOP 
* 
LWBYT OCT 377 
INXF  BSS 1 
INXP  BSS 1 
PTR1  BSS 1 
PTR2  BSS 1 
GPCNT BSS 1 
BFBGN BSS 1 
BFEND BSS 1 
GPTR  BSS 1 
ONES  DEF NEG1
INXBF DEF *+1 
      DEF FIXBF 
      DEF FIXBF 
      DEF FLTBF 
      DEF FLTBF 
      DEF ADDBF 
      DEF SUBBF 
      DEF MPYBF 
      DEF DIVBF 
* 
FLTBF EQU * 
FIXBF EQU * 
SUBBF EQU * 
MPYBF EQU * 
DIVBF EQU * 
ADDBF BYT 1,1 
      BYT 3,3 
      OCT 177777
* 
*EGETOP 
* 
* 
* 
* ROUTINE TO ADJUST STANDARD OPERANDS, BOTH MANTISSA AND EXPONENT 
* USES PASS COUNT, WDCNT
* 
* ON ENTRY BREG=ADDR OF OPERAND 
* 
* MODIFIES A,B,E
* 
*SOPMIX 
OPMIX NOP 
      LDA B,I       IF MANT=0, DON'T CHANGE IT
      SZA,RSS 
      JMP OPMIX,I 
      ADB POS4      FORM EXP. ADDR
      STB OPMPT     SAVE IT 
      LDA EVNOD+0   IF ODD, USE LAST OPNDS BASE 
      SLA 
      JMP OPMBS 
* 
      JSB RANF+0    GET FP #, A=EXP, B=MANT 
      STA BASSV     SAVE IT 
      JSB RANF+0    ANOTHER 
      ADA BASSV 
      STA BASSV 
OPMBS JSB RANF+0    AGAIN 
      ADA BASSV     -45=<A<=0 
      CMA,INA       FORM OFFSET 
      AND POS15 
      ADA XPIDX 
      LDA A,I       GET BASE EXP. 
      STA OPMXP     SAVE
      JSB RANF+0    GET EXP. ADJ. 
      ADA OPMXP     + OR - EXP IN A 
      STA OPMPT,I   SAVE IT 
      LDA EVNOD+0   IF 2ND OPND, USE 1ST OPND'S B IF SLB NOT SET
      SLA 
      SLB 
      STB SGNSV 
      LDA OPMPT,I   COMP EXP? 
      LDB SGNSV     ONLY IF 2 BITS SET
      BLF 
      SSB,SLB 
      CMA 
      STA OPMPT,I 
      JMP OPMIX,I   DONE
* 
*LOPMIX 
* 
OPMPT BSS 1 
OPMXP BSS 1 
BASSV BSS 1         EXP BASE SAVE FOR OPMIX 
SGNSV BSS 1         EXP SIGN SAVE FOR OPMIX 
XPIDX DEF *+1       INDEX TO EXPONENT OFFSETS 
      DEC 0 
      DEC 8 
      DEC 16
      DEC 24
      DEC 32
      DEC 40
      DEC 48
      DEC 56
      DEC 72
      DEC 88
      DEC 120 
      DEC 150 
      DEC 200 
      DEC 300 
      DEC 400 
      DEC 514 
* 
*EOPMIX 
* 
* 
* ROUTINE TO REDUCE EXPS FOR FIX-FLT
* ON ENTRY, B=ADDR OF OPND
* 
*SOPRED 
OPRED NOP 
      LDA B,I       IF=0, RETN
      SZA,RSS 
      JMP OPRED,I 
      ADB POS4
      LDA B,I 
      AND POS63 
      STA B,I 
      JMP OPRED,I 
* 
*LOPRED 
* 
POS63 DEC 63
*EOPRED 
* 
* 
      END 
                                                                                                                                                                                                                                                          