Trailing-Edge
-
PDP-10 Archives
-
klad_sources
-
klad.sources/dfkcbt.mac
There are no other files named dfkcbt.mac in the archive.
;*MAINDEC-10-DFKCB
MCNVER=0
DECVER=1
XLIST
DEFINE NAME (MCNVER,DECVER),<
TITLE DFKCB DECSYSTEM KL10 ADVANCED INSTRUCTION DIAGNOSTIC #2, VER MCNVER,DECVER
>
LIST
LALL
NAME \MCNVER,\DECVER
LOC 137
MCNVER,,DECVER
;*COPYRIGHT 1979
;*DIGITAL EQUIPMENT CORPORATION
;*MARLBORO, MASS.
;*JOHN R. KIRCHOFF
SEARCH MONSYM
NOSYM
IF2,<PRINTX [STARTING PASS 2]>
SUBTTL ASSEMBLY TIME PARAMETERS
; **********************************************************************
;*ACCUMULATOR DEFINITIONS
; **********************************************************************
AC1=1 ;AC,AC+1,AC+2,AC+3 - CONTAIN OPERANDS USED
; BY DADD,DSUB,DMUL,DDIV
CNT=11 ;COUNT AC
SCR0=12 ;SCRATCH ACS USED IN THE ADDL ERROR PRINT
SCR1=SCR0+1 ; ROUTINE
SCR2=SCR0+2
SCR3=SCR0+3
; **********************************************************************
;*BEGIN PARAMETERS
; **********************************************************************
SADR1=STARTA
SADR2=STARTA
SADR3=START
SADR4=SRTDDT
SADR5=STARTA
SADR6=PHALT
SADR7=HALT BEGIN
SADR8=HALT BEGIN
SADR9=HALT BEGIN
SADR10=HALT BEGIN
SADR11=HALT BEGIN
ITERAT=10
PAREA1=0
PAREA2=0
PAREA3=SIXBIT/DFKCB/
PAREA4=SIXBIT/LST/
PAREA5=0
PAREA6=0
KL10==1
KL10P0==1
PGMEND==1
EXCASB==1
USRASB==1
DEBUG==30
SUBTTL MACROS
; **********************************************************************
;*PCSAVE - GET AND SAVE PC
; **********************************************************************
DEFINE PCSAVE<
JSR .+1 ;STORE PC
FLAGL=. ;LOCATION OF PC
0 ;PC
>
; **********************************************************************
;*TFLAG - TEST PC FLAGS SET BY THE PRIOR DADD/DSUB
; **********************************************************************
DEFINE TFLAG (FLGGS,TT,ADDR<APRINT>,LOC<LOC>)<
MOVE SCR1,FLAGL ;GET FLAGS
MOVE SCR2,FLGGS ;SCR2 - CORRECT FLAGS
SKIPN USER ;EXEC MODE ?
TLZ SCR2,AROV ;YES, NO AROV FLAG IN EXEC ON KL10
XOR SCR1,SCR2 ;SET ALL MATCHING BITS TO 0
TLNE SCR1,740000 ;TEST IF MATCH CORRECTLY
ERROR (LOC,13,SCR2,FLAGL,,
TEST 'TT' - PC FLAGS INCORRECT (LEFT 4 BITS),ADDR)
>
; **********************************************************************
;*MULT - PERFORM DMUL AND TEST RESULTS
; **********************************************************************
DEFINE MULT (T,A1<0>,A2<0>,E1<0>,E2<0>,R1<0>,R2<0>,R3<0>,R4<0>,%BEGIN)<
; --- MULTIPLICAND = (A1,A2)
; --- MULTIPLIER === (E1,E2)
; --- RESULT ======= (R1,R2,R3,R4)
%BEGIN: MOVE AC1,[[EXP A1,A2,E1,E2,R1,R2,R3,R4],,MCAND]
BLT AC1,MRES+3 ;SET UP OPERANDS FOR SUBROUTINE
GO MSUBR ;GO DO TEST
ERROR (%BEGIN,14,SCR1,SCR2,,
TEST 'T' - RESULT CALCULATED INCORRECTLY,MPRINT)
>
; **********************************************************************
;*MULTF - PERFORM DMUL AND TEST RESULTS & PC FLAGS
; **********************************************************************
DEFINE MULTF (T,A1<0>,A2<0>,E1<0>,E2<0>,R1<0>,R2<0>,R3<0>,R4<0>,%BEGIN,%TSTPC)<
; --- MULTIPLICAND = (A1,A2)
; --- MULTIPLIER === (E1,E2)
; --- RESULT ======= (R1,R2,R3,R4)
%BEGIN: MOVE AC1,[[EXP A1,A2,E1,E2,R1,R2,R3,R4],,MCAND]
BLT AC1,MRES+3 ;SET UP OPERANDS FOR SUBROUTINE
GO MSUBR ;GO DO TEST
ERROR (%BEGIN,14,SCR1,SCR2,,
TEST 'T' - RESULT CALCULATED INCORRECTLY,MPRINT)
%TSTPC: MOVE SCR2,MFLOC ;GET PC - TO TEST PC FLAGS
TLZE SCR2,AROV ;CALC OK PC (NO - AROV) & TEST
ERROR (%BEGIN,13,SCR2,MFLOC,,
TEST 'T' - PC FLAGS INCORRECT - BITS 0 TO 4,MPRINT)
>
; **********************************************************************
;*PDIV - PERFORM DDIV AND TEST RESULTS
; **********************************************************************
DEFINE PDIV (T,A1,A2,A3,A4,E1,E2,R1<0>,R2<0>,R3<0>,R4<0>,%BEGIN)<
; --- DIVIDEND == (A1,A2,A3,A4)
; --- DIVISOR === (E1,E2)
; --- QUOTIENT == (R1,R2)
; --- REMAINDER = (R3,R4)
%BEGIN: MOVE AC1,[[EXP A1,A2,A3,A4,E1,E2,R1,R2,R3,R4],,PDEND]
BLT AC1,PRES+3 ;SET UP OPERANDS
GO PSUBR ;GO DO TEST
ERROR (%BEGIN,14,SCR1,SCR2,,
TEST 'T' - QUOTIENT/REMAINDER INCORRECT,DPRINT)
>
; **********************************************************************
;*PDIVF - PERFORM DDIV AND TEST RESULTS & PC FLAGS
; **********************************************************************
DEFINE PDIVF (T,A1,A2,A3,A4,E1,E2,R1<0>,R2<0>,R3<0>,R4<0>,%BEGIN,%TSTPC)<
; --- DIVIDEND == (A1,A2,A3,A4)
; --- DIVISOR === (E1,E2)
; --- QUOTIENT == (R1,R2)
; --- REMAINDER = (R3,R4)
%BEGIN: MOVE AC1,[[EXP A1,A2,A3,A4,E1,E2,R1,R2,R3,R4],,PDEND]
BLT AC1,PRES+3 ;SET UP OPERANDS
GO PSUBR ;GO DO TEST
ERROR (%BEGIN,14,SCR1,SCR2,,
TEST 'T' - QUOTIENT/REMAINDER INCORRECT,DPRINT)
%TSTPC: MOVE SCR2,PFLOC ;GET PC
TLZE SCR2,AROV+DCK ;CALC OK PC (NO - OV/DIV) & TEST
ERROR (%BEGIN,13,SCR2,PFLOC,,
TEST 'T' - PC FLAGS INCORRECT - BITS 0 & 12,DPRINT)
>
; **********************************************************************
;*ODIV - PERFORM DDIV AND TEST RESULTS & PC FLAGS
;* (HANDLES OVERFLOW/NO DIVIDE CONDITIONS)
; **********************************************************************
DEFINE ODIV (A1,A2,A3,A4,E1,E2,%BEGIN,%TSTPC)<
; --- DIVIDEND == (A1,A2,A3,A4)
; --- DIVISOR === (E1,E2)
; --- QUOTIENT/REMAINDER - NOT CALCULATED (DIVIDEND UNCHANGED)
%BEGIN: MOVE AC1,[[EXP A1,A2,A3,A4,E1,E2],,ODEND]
BLT AC1,ORES-1 ;SET UP OPERANDS
GO OSUBR ;GO DO TEST
ERROR (%BEGIN,14,SCR1,SCR2,,
TEST G - DIVIDEND CHANGED ON OV/NODIV,DPRINT)
%TSTPC: MOVE SCR2,OFLOC ;GET PC
IOR SCR2,[AROV+DCK,,0] ;CALC CORRECT PC (OV/NO DIV)
SKIPN USER ;EXEC MODE ?
TLZ SCR2,AROV ;YES, NO AROV FLAG IN EXEC ON KL10
CAME SCR2,OFLOC ;PC CORRECT?
ERROR (%BEGIN,13,SCR2,OFLOC,,
TEST G - PC FLAGS INCORRECT - BITS 0&12,DPRINT)
>
; **********************************************************************
;*CHECKA - CHECK RESULTS OF A DADD & DO ERROR HANDLING
;* (RESULT 'R1' IS PASSED AS THE OCTAL DATA ITSELF)
; **********************************************************************
DEFINE CHECKA (LOC,T,R1< 0>,R2< 0>,%ERROR,%END)<
SETZ SCR1, ;POINTER TO WHICH WORD IN ERROR
CAME AC1,[R1] ;IS LEFT HALF OF RESULT CORRECT?
JRST %ERROR ;NO - GO TO ERROR HANDLING
MOVEI SCR1,1 ;YES, POINTER TO RIGHT HALF
CAMN AC1+1,[R2] ;IS RIGHT HALF CORRECT?
JRST %END+1 ;YES - DONT DO ERROR HANDLING
; EXCEPT FOR ERLOOP
%ERROR: MOVE SCR2,AC1(SCR1) ;GET ACTUAL WORD OF RESULT
MOVE SCR1,[EXP R1,R2](SCR1) ;GET CORRECT RESULT
%END: ERROR (LOC,14,SCR1,SCR2,,
TEST 'T' - RESULT IS INCORRECT,APRINT)
>
; **********************************************************************
;*CHECKS - CHECK RESULTS OF A DSUB & DO ERROR HANDLING
;* (RESULT 'R1' IS PASSED AS THE OCTAL DATA ITSELF)
; **********************************************************************
DEFINE CHECKS (LOC,T,R1< 0>,R2< 0>,%ERROR,%END)<
SETZ SCR1, ;POINTER TO WHICH WORD IN ERROR
CAME AC1,[R1] ;IS LEFT HALF OF RESULT CORRECT?
JRST %ERROR ;NO - GO TO ERROR HANDLING
MOVEI SCR1,1 ;YES, POINTER TO RIGHT HALF
CAMN AC1+1,[R2] ;IS RIGHT HALF CORRECT?
JRST %END+1 ;YES - DONT DO ERROR HANDLING
; EXCEPT FOR ERLOOP
%ERROR: MOVE SCR2,AC1(SCR1) ;GET ACTUAL WORD OF RESULT
MOVE SCR1,[EXP R1,R2](SCR1) ;GET CORRECT RESULT
%END: ERROR (LOC,14,SCR1,SCR2,,
TEST 'T' - RESULT IS INCORRECT,SPRINT)
>
; **********************************************************************
;*CHECKB - CHECK RESULTS OF A DADD & DO ERROR HANDLING
;* (RESULT 'R1' IS PASSED AS THE ADDRESS OF THE DATA)
; **********************************************************************
DEFINE CHECKB (LOC,T,R1,%ERROR,%END)<
SETZ SCR1, ;POINTER TO WHICH WORD IN ERROR
CAME AC1,R1 ;IS LEFT HALF OF RESULT CORRECT?
JRST %ERROR ;NO - GO TO ERROR HANDLING
MOVEI SCR1,1 ;YES, POINTER TO RIGHT HALF
CAMN AC1+1,R1+1 ;IS RIGHT HALF CORRECT?
JRST %END+1 ;YES - DONT DO ERROR HANDLING
; EXCEPT FOR ERLOOP
%ERROR: MOVE SCR2,AC1(SCR1) ;GET ACTUAL WORD OF RESULT
MOVE SCR1,R1(SCR1) ;GET CORRECT WORD OF RESULT
%END: ERROR (LOC,14,SCR1,SCR2,,
TEST 'T' - RESULT IS INCORRECT,APRINT)
>
; **********************************************************************
;*CHECKT - CHECK RESULTS OF A DSUB & DO ERROR HANDLING
;* (RESULT 'R1' IS PASSED AS THE ADDRESS OF THE DATA)
; **********************************************************************
DEFINE CHECKT (LOC,T,R1,%ERROR,%END)<
SETZ SCR1, ;POINTER TO WHICH WORD IN ERROR
CAME AC1,R1 ;IS LEFT HALF OF RESULT CORRECT?
JRST %ERROR ;NO - GO TO ERROR HANDLING
MOVEI SCR1,1 ;YES, POINTER TO RIGHT HALF
CAMN AC1+1,R1+1 ;IS RIGHT HALF CORRECT?
JRST %END+1 ;YES - DONT DO ERROR HANDLING
; EXCEPT FOR ERLOOP
%ERROR: MOVE SCR2,AC1(SCR1) ;GET ACTUAL WORD OF RESULT
MOVE SCR1,R1(SCR1) ;GET CORRECT WORD OF RESULT
%END: ERROR (LOC,14,SCR1,SCR2,,
TEST 'T' - RESULT IS INCORRECT,SPRINT)
>