1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-03-01 01:19:17 +00:00
Files
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

295 lines
10 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
TITLE KASER - KL10 MODULE TO SUPPORT KA10 LONG FLOATING POINT SIMULATION - V016
SUBTTL J.M. FLEMMING/JMF TS 10 SEP 85
SEARCH F,S
$RELOC
$HIGH
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED
; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION
; 1973,1974,1975,1976,1977,1978,1979,1980,1982,1984,1986,1988.
;ALL RIGHTS RESERVED.
.CPYRT<1973,1988>
XP VKASER,016
; PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP
ENTRY KASER ;LOAD KASER IF LIBRARY SEARCH
KASER::
SUBTTL COMCON - INTERFACE TO SET UUO/COMMAND
;HERE TO SET/CLEAR/READ WHETHER KA10 LONG FLOATING POINT SIMULATION IS IN AFFECT
SETFPS::CAIG T2,1 ;SET OR CLEAR?
JRST SETFP1 ;YES, GO SET OR CLEAR THE BIT
MOVSI T2,(JS.FPS) ;READ, GET SIMULATION ON BIT
TDNN T2,JBTST2##(J) ;SIMULATION ENABLED?
TDZA T1,T1 ;NO
MOVEI T1,1 ;YES
JRST STOTC1## ;TELL THE PROGRAM WHETHER FP SIMULATION IS ON OR OFF
;HERE FROM THE SET COMMAND TO SET/CLEAR FLOATING POINT SIMULATION
SETFPC::MOVE T1,[-1,,[SIXBIT /POINT/]] ;IF USER TYPED FLOATING POINT,
PUSHJ P,TXTARG## ; SKIP THE "POINT"
JFCL ;DON'T REQUIRE IT
PUSHJ P,CTEXT1## ;READ NEXT ARG
JUMPE T2,SETFP2 ;EOL MEANS ON
MOVE T1,[-1,,[SIXBIT /NO/]] ;ON OR OFF?
PUSHJ P,FNDNAM## ;SEE IF THE USER IS TURNING SIMULATION OFF
SETFP2: TROA T2,1 ;USER WANTS SIMULATION
SETZ T2, ;USER DOESN'T
SETFP1: MOVSI T1,(JS.FPS) ;KA10 LONG FLOATING POINT SIMULATION BIT
ANDCAM T1,JBTST2##(J) ;SET OR CLEAR THE BIT
TRNE T2,1
IORM T1,JBTST2##(J)
JRST CPOPJ1## ;OK RETURN
SUBTTL ERRCON - INTERFACE TO ILLEGAL (UNIMPLEMENTED) INSTRUCTIONS
;DISPATCH TO KA10 LONG FLOATING POINT SIMULATION ROUTINE, UFA(130),
;DFN(131), FADL(141), FSBL(151), FMPL(161), FDVL(171).
KALFPS::LDB T1,[POINT 9,M,8] ;GET MUUO OPCODE
CAIGE T1,132 ;UFA OR DFN?
TRZA T1,110 ;YES, TRANSLATE TO 20,21
LSH T1,-3 ;NO, FADL, ETC. TRANSLATE TO 14-17
IFN FTRSP,<
AOS .CPFAD##-14(T1) ;COUNT THE NUMBER OF SIMULATIONS OF
; THIS INSTRUCTION
>
PUSHJ P,@FLONGD-14(T1) ;DISPATCH TO SIMULATION ROUTINE
PJRST USRXIT## ;EXIT TO THE USER
FLONGD: SFADL
SFSBL
SFMPL
SFDVL
SUFA
SDFN
;SIMULATION ROUTINES FOR LONG-MODE FLOATING POINT ARITHMETIC
; (KA10-STYLE DOUBLE PRECISION)
SDFN: PUSHJ P,SAVE3##
PUSHJ P,GTARGS
LSHC T2,11 ;EXPONENT TO T2 (ISN'T CHANGED)
SETCM T1,T1 ;ONE'S COMPLEMENT THE HIGH WORD
MOVN T3,T3 ;TWO'S COMPLEMENT THE LOW WORD.
SKIPN T3 ;SKIP UNLESS LOW WORD IS ZERO
ADDI T1,1 ;TWO'S COMPLEMENT THE HIGH WORD
LSHC T2,-11 ;RESTORE OLD BITS 0-8
EXCTXU <MOVEM T1,0(P1)> ;HIGH PART TO AC
MOVE T1,T3 ;LOW PART
PJRST PUTWDU## ;LOW PART TO E
;SUBROUTINE FOR ARGUMENT FETCH AND PREPARATION (EXTRACT EXPONENT, SIGN EXTEND)
GTARGS: LDB P1,PUUOAC## ;GET AC FIELD OF INSTR
PUSHJ P,GETWDU## ;GET (E)
MOVE T3,T1 ;TO T3
EXCTUX <MOVE T1,(P1)>;GET AC ARG
SETZB T2,T4 ;CLEAR LOW PARTS
POPJ P,
SFLGET: PUSHJ P,GETWDU## ;FETCH C(E)
MOVE T2,T1 ;TO T2
LDB P1,PUUOAC## ;GET AC FIELD OF INSTR
EXCTUX <MOVE P3,(P1)> ;FETCH C(AC)
SFLGT2: LDB P2,[POINT 9,P3,8] ;EXPONENT AND SIGN OF C(AC)
LDB T1,[POINT 9,T2,8] ;EXPONENT AND SIGN OF C(E)
TRNE P2,400
XORI P2,777 ;ONES COMPLEMENT OF NEGATIVE EXPONENT
TRNE T1,400
XORI T1,777
SKIPL P3 ;SKIP IF C(AC) ARE NEGATIVE
TLZA P3,777000 ;POSITIVE. EXTEND SIGN BIT
TLO P3,777000 ;NEGATIVE. EXTEND SIGN
SKIPL T2 ;SKIP IF C(E) ARE NEGATIVE
TLZA T2,777000 ;POSITIVE. EXTEND SIGN BIT
TLO T2,777000 ;NEGATIVE. EXTEND SIGN
POPJ P,
;SUBROUTINE FOR ADD/SUBTRACT TYPE OPERATIONS. DENORMALIZE SMALLER ARGUMENT
SFAT3A: CAML P2,T1 ;DECIDE WHICH EXPONENT IS LARGER
JRST SFAT3B ;AND DO PRENORMALIZE (DENORMALIZE)
EXCH P2,T1 ;INTERCHANGE OPERANDS
EXCH P3,T2 ;SMALLER OPERAND INTO T1/T2/T3=0
SFAT3B: SUB T1,P2 ;T1=SHIFT FACTOR (0 OR NEGATIVE)
MOVEI T3,0 ;FOR PEOPLE WHO WANT DOUBLE LENGTH
CAMGE T1,[-100] ;ARE WE GOING TO LOSE ALL SIGNIFIGANCE?
TDZA T2,T2 ;YES. T2=0 SKIP THE SHIFT
ASHC T2,(T1)
TRZ T3,177 ;KA10 MAKES A 54 BIT RESULT
ADD T2,P3 ;DOUBLE LENGTH RESULT TO T2/T3
SKIPL T2 ;POSITIVE OR NEGATIVE RESULT
SKIPA P3,[TLNN T2,1000]
MOVE P3,[TLNE T2,1000]
XCT P3 ;SKIP IF ADD OVERFLOWED
JRST SFAT3C ;NO OVERFLOW
ASHC T2,-1 ;ADD PRODUCED AN HIGH ORDER BIT.
ADDI P2,1 ;SHIFT RESULT DOWN AND BUMP EXPONENT
SFAT3C: TLZ T3,400000 ;CLEAR SIGN BIT IN LOW WORD (SET BY ASHC)
POPJ P,
SUFA: PUSHJ P,SAVE3##
PUSHJ P,SFLGET ;FETCH AND SETUP ARGUMENTS
PUSHJ P,SFAT3A ;PRENORMALIZE AND DO THE ADD.
CAIG P2,377 ;DID EXPONENT OVERFLOW?
JRST SUFA1 ;NO.
MOVSI P3,440200 ;SET AROV, FOV, AND TRAP1
IORM P3,.JDAT+JOBPD1## ;STORE WHERE THEY'LL BE RESTORED.
SUFA1: SKIPN T2 ;SKIP IF RESULT NON ZERO.
JUMPE T3,STORA1 ;HIGH PART IS 0. RETURN 0 IF LOW PART IS 0
DPB P2,[POINT 8,T2,8] ;STORE EXPONENT
SKIPGE T2 ;SKIP IF RESULT IS POSITIVE
TLC T2,377000 ;ONES COMPLEMENT TO EXPONENT
MOVE T3,T2 ;COPY RESULT TO T3 FOR STORA1
JRST STORA1
SFADL: PUSHJ P,SAVE3##
PUSHJ P,SFLGET ;FETCH AND PREPARE ARGUMENTS
JRST SFADL0
SFSBL: PUSHJ P,SAVE3##
PUSHJ P,SFLGET ;FETCH AND PREPARE ARGUMENTS
MOVN T2,T2 ;NEGATE C(E)
SFADL0: PUSHJ P,SFAT3A ;PRENORMALIZE AND DO ADD
;POSTNORMALIZE. P2= EXPONENT, T2--T3 ARE FRACTION
SFLNRM: SKIPN T2 ;P2=EXPONENT. T2--T3 ARE FRACTION
JUMPE T3,SFLSTR ;JUMP IF RESULT IS ZERO. STORE RESULT
SKIPL T2 ;POSTNORMALIZE BY SHIFTING LEFT
SKIPA T1,[TLNE T2,400];SKIP IF POSITIVE NUMBER IS UNNORMALIZED
MOVE T1,[TLNN T2,400];SKIP IF NEGATIVE NUMBER IS UNNORMALIZED
TDNE T2,[777,,-1] ;SKIP IF NO SIGNIFICANCE
JRST SFLNR2
ASHC T2,-1 ;GET THAT BIT BACK
ADDI P2,1
SFLNR2: XCT T1 ;SKIP IF UNNORMALIZED
JRST SFLNR3 ;NORMALIZE COMPLETE
ASHC T2,1 ;SHIFT TO NORMALIZE
SOJA P2,SFLNR2 ;DECREMENT EXPONENT. LOOP UNTIL DONE
;HERE WE KNOW THAT THE RESULT IS DEFINITELY NON-ZERO. BUT THE ABOVE
; LOOP WILL GO TOO FAR IF THE NUMBER IS NEGATIVE AND HAS JUST ONE
; SIGNIFICANT BIT. THIS CODE DOWN TO SFLNR9 PUTS IT BACK.
SFLNR3: TDNE T2,[777,,-1] ;DID WE ASHC THE SIGNIFICANT BIT TOO FAR?
JRST SFLNR9 ;NO, WE'RE OK.
JOV SFLNR7 ;DID WE LOSE A BIT IN THE EXPONENT?
ASHC T2,-1 ;SHIFT BACK (CASE OF NEGATIVE EXPONENT)
JRST SFLNR8
SFLNR7: ASHC T2,-1 ;SHIFT BACK (CASE OF POSITIVE EXPONENT)
TLZ T2,200000 ; (REQUIRES ZEROING THIS BIT)
SFLNR8: AOS P2 ;FIX THE EXPONENT AS STORED IN P2
SFLNR9: TLZ T3,400000 ;CLEAR SIGN BIT OF LOW WORD
LSH T3,-10 ;LEAVE ROOM IN LOW WORD FOR EXPONENT
CAIGE P2,400 ;SKIP IF OVERFLOW
JUMPGE P2,SFLNR6 ;JUMP UNLESS UNDERFLOW
MOVSI T1,440200 ;AROV, FOV, TRAP 1
CAIL P2,433 ;DOES EXPONENT EXCEED 128+27?
JRST SFLNR4 ;YES. STORE ZERO IN LOW WORD
JUMPG P2,SFLNR5
TRNE P2,200 ;SOMETIMES THE KA10 FORGETS AN UNDERFLOW
TLO T1,100 ;SET FLOATING UNDERFLOW TOO.
SFLNR4: MOVEI T3,0 ;AND CLEAR LOW WORD.
SFLNR5: IORM T1,.JDAT+JOBPD1## ;STORE FLAGS FOR USER.
SFLNR6: HRREI P3,-33(P2) ;COMPUTE EXPONENT OF LOW PART
SKIPGE P3
MOVEI T3,0 ;ZERO LOW PART, IF EXPONENT TOO SMALL
ANDI P2,377 ;TRUNCATE EXPONENT
SKIPE T3 ;SKIP IF LOW FRACTION IS ZERO
DPB P3,[POINT 9,T3,8] ;STORE LOW EXPONENT. CLEAR SIGN BIT.
ROT P2,-11 ;SHIFT EXPONENT TO RIGHT PLACE
XOR T2,P2 ;ONES COMPLEMENT OF EXP, IF NEGATIVE
SFLSTR: EXCTUX <MOVEM T2,(P1)> ;STORE DOUBLEWORD RESULT IN C(AC)
STORA1: ADDI P1,1 ;AND IN C(AC+1 MOD 20)
ANDI P1,17
EXCTXU <MOVEM T3,(P1)>
POPJ P,
SFMPL: PUSHJ P,SAVE3##
PUSHJ P,SFLGET ;FETCH AND PREPARE ARGUMENTS
MUL T2,P3 ;DOUBLE WORD PRODUCT TO T2/T3
ADD P2,T1 ;P2=EXPONENT OF RESULT
SUBI P2,200 ;ACCOUNT FOR EXCESS 200 IN EXPONENTS
ASHC T2,10 ;RESULT OF MULTIPLY IS TOO FAR RIGHT BY 8
;PLACES (NOT 9 SINCE BIT 0 OF T3 IS SIGN)
TLZ T3,400000 ;FLUSH SIGNBIT
JRST SFLNRM ;DO POSTNORMALIZE
SFDVL: PUSHJ P,SAVE3##
LDB P1,PUUOAC## ;GET AC FIELD OF INSTR
EXCTUX <MOVE T2,(P1)> ;FETCH C(AC)
MOVEI T3,1(P1)
ANDI T3,17
EXCTUX <MOVE T3,(T3)> ;FETCH C(AC+1)
SKIPN T2 ;IF DIVIDING ZERO
JUMPE T3,SFLSTR ; WITHOUT FURTHER ADO, STORE ZERO
PUSHJ P,GETWDU## ;FETCH C(E).
MOVE P3,T1 ;TO P3
LSH T3,10 ;FLUSH EXPONENT FROM LOW WORD
TLZ T3,400000 ;FLUSH SIGNBIT FROM LOW WORD
PUSHJ P,SFLGT2 ;SETUP EXPONENTS, ETC
MOVEI T4,0 ;ASSUME BOTH ARGUMENTS ARE POSITIVE
JUMPGE T2,SFDVL2 ;JUMP IF DIVIDEND IS POSITIVE
SETCA T2, ;DIVIDEND IS NEGATIVE. TAKE TWOS COMPLEMENT
MOVN T3,T3 ;OF THE DOUBLE WORD (THIS SHOULD BE DMOVN
SKIPN T3 ;EXCEPT, WE HAVE TO RUN THIS ON THE KA10 TO
ADDI T2,1 ;VERIFY IT).
MOVSI T4,600000 ;QUOTIENT AND REMAINDER ARE NEGATIVE
SFDVL2: JUMPGE P3,SFDVL3 ;JUMP IF DIVISOR IS POSITIVE
MOVN P3,P3
TLC T4,400000 ;COMPLEMENT SIGN OF QUOTIENT
SFDVL3: CAMGE T2,P3 ;IS QUOTIENT GREATER THAN 1.0?
JRST SFDVL4 ;NO.
ASHC T2,-1 ;YES. TRY A 1 BIT SHIFT
CAML T2,P3 ;DID THAT FIX IT?
JRST SFDVLX ;NO. WE HAVE A NO-DIVIDE CONDITION
ADDI T1,1 ;ADJUST EXPONENT OF DIVIDEND
SFDVL4: TLNN P3,1000 ;ONLY CRETINS DIVIDE BY "SETZ"
JRST SFDVL6
LSH P3,-1 ;BUT TO KEEP THEM HAPPY...
ADDI P2,1
SFDVL6: SUBM T1,P2 ;P2=EXPONENT OF QUOTIENT
ADDI P2,200 ;MAKE EXPONENT INTO EXCESS 200.
LSH P3,10 ;SCALE DIVISOR TO ALLOW ONLY 27 DIVIDE STEPS
DIV T2,P3 ;T2=QUOTIENT, T3=REMAINDER
JUMPE T2,SFDVL9 ;IF QUOTIENT IS ZERO, DON'T NORMALIZE
TLNN T2,1000 ;SAME REMARK ABOUT CRETINS
JRST SFDVL8
ASHC T2,-1 ;KA, KI, AND THE KL DON'T AGREE ON WHAT
ADDI P2,1 ; THE ANSWER SHOULD BE BUT THIS GIVES KI RESULTS
SFDVL8: TLNE T2,400 ;NOW, NORMALIZE THE QUOTIENT
JRST SFDVL9
LSH T2,1 ;BEFORE COMPUTING OVERFLOW CONDITION
SOJA P2,SFDVL8
SFDVL9: CAIGE P2,400 ;OVERFLOW?
JUMPGE P2,SFDVL7 ;NO. JUMP UNLESS UNDERFLOW
MOVSI P3,440200 ;AROV, FOV, TRAP 1
JUMPGE P2,SFDVL5
TRNE P2,200 ;SOMETIMES THE KA10 FORGETS FXU
TLO P3,100 ;FXU
SFDVL5: IORM P3,.JDAT+JOBPD1##
ANDI P2,377
SFDVL7: SKIPE T2 ;AVOID STORING EXPONENT IN A ZERO FRACTION
DPB P2,[POINT 9,T2,8] ;STUFF EXPONENT
TLNE T4,400000 ;SHOULD QUOTIENT BE NEGATIVE?
MOVN T2,T2 ;YES.
SUBI T1,33 ;CALCULATE EXPONENT OF REMAINDER
SKIPGE T1 ;IF UNDERFLOW, SET REMAINDER TO ZERO
MOVEI T3,0
JUMPE T3,SFLSTR ;IF ZERO REMAINDER, STORE ZERO
LSH T3,-10 ;MAKE ROOM FOR EXPONENT
DPB T1,[POINT 8,T3,8] ;STUFF EXPONENT
TLNE T4,200000 ;SHOULD WE NEGATE REMAINDER?
MOVN T3,T3
JRST SFLSTR ;STORE AC, AC+1
SFDVLX: MOVSI T3,440240 ;AROV, FOV, NO DIVIDE, TRAP1
IORM T3,.JDAT+JOBPD1##
POPJ P,
END