File SUBS.SB (8k SABR macro assembler source file)

Directory of image this file is from
This file as a plain text file

/SUBS : FORTRAN SUBSCRIPT ROUTINE
/
/	SUBS^ IS EQUIVALENT TO THE STANDARD 'SUBSC' ROUTINE
/	IN ADDITION IT CHECKS FOR SUBSCRIPTS IN RANGE.
/
/	GEORGE GONZALEZ	2-JUL-78
/
/	27-JUL-81 JVE	ADDED SPACE TO 'SUB' ERR MSG TEXT
/	20-MAR-82 JVE	ALLOW MULTI-DIM ARRAYS TO BE > 2047 WORDS
/			SO ERROR MESSAGE PRINTS CORRECTLY.
/
/	INDIVIDUAL SUBSCRIPTS MUST BE  0 < I < 2048
/	FINAL INDEX MUST BE IN ARRAY.
/	ARRAY SIZE PASSED IN WORD 7 OF CALLER'S FIELD.
/
////
	ENTRY	SUBS^

	OPDEF	TADI	1400
	OPDEF	DCAI	3400
	OPDEF	JMPI	5400

	LAP


/ THE FOLLOWING CAN BE USED FOR DOUBLY OR SINGLY
/ SUBSCRIPTED ARRAYS.  ON ENTRY THE AC SHOULD BE
/ NEGATIVE FOR FLOATING POINT VARIABLES.  THIS MAY
/ BE ANY NEGATIVE NUMBER FOR SINGLY SUBSCRIPTED
/ VARIABLES, AND MUST BE THE FIRST DIMENSION FOR
/ DOUBLY SUBSCRIPTED VARIABLES.  SOME EXAMPLES
/ FOLLOW:	(TO LOAD THE I,JTH ELEMENT OF AN FP ARRAY)

/	TAD	(-M		/DIMENSIONS ARE M BY N
/	CALL 3,SUBS^
/	ARG J
/	ARG I
/	ARG ARRAY
/	LOC		/MUST BE A DUMMY VARIABLE
/	CALL 1,IFAD
/	ARG LOC

/ TO LOAD THE JTH ELEMENT OF AN INTEGER ARRAY:

/	CALL 2,SUBS^
/	ARG J
/	ARG INTARR
/	LOC		/STILL A DUMMY VARIABLE
/	TAD	I LOC


S1,	BLOCK	1		/ADDR OF 1ST SUBS^
S2,	BLOCK	1		/ADDR OF 2ND SUBS^
A,	BLOCK	2		/ADDR OF ARRAY
R,	BLOCK	1		/ADDR FOR RESULT
TM,	0
FL,	0		/DOUBLE SUBS^ FLAG
N,	0		/DIMENSION -- NEGATIVE IF FLOATING
AC,	0
MQ,	0
CTR,	0
DIV,	0
MAX,	0		/MAXIMUM SUBSCRIPT

SUBERR,	TEXT	'SUB '	/ERROR
SUBS^,	BLOCK	2	/ENTRY
	DCA	N		/SAVE THE DIMENSION
	TAD	N
	SPA		/... ALSO ABS VALUE
	CMA
	DCA	MQ

	CLA CLL CMA RAL /HOW MANY ARGS?
	TAD	SUBS^#
	DCA	10
	TAD	SUBS^
	DCA	SUB1

SUB1,	NOP		/REPLACED BY CDF
	TADI	(7	/GET MAX
	DCA	MAX
	TADI	10
	AND	(200
	SNA CLA		/DOUBLE SUBSCRIPTS?
	JMP	SB0

	TADI	10		/YES, GET SECOND ARG
	DCA	SB2
	TADI	10
	DCA	S2

	STA
SB0,	DCA	FL		/SET DBL SUBS^ FLAG
	TADI	10	/GET FIRST SUBS^
	DCA	SB1C
	TADI	10
	DCA	S1

	TADI	10	/GET ARRAY BASE
	DCA	A
	TADI	10
	DCA	A#

	TAD	SUBS^
	DCA	SUB2

	TADI	10	/GET RETURN ADDRESS
	DCA	R
	TAD	10
	IAC
	DCA	SUBS^#

	DCA	TM
	ISZ	FL		/DBL SUBSCRIPTING?
	JMP	SB1

	STL STA		/YES
SB2,	NOP		/CDF TO FIELD OF 2ND SUBSCRIPT
	TADI	S2
	SPA
	JMP	ERR	/BAD SECOND SUBSCRIPT

	SNA
	JMP	NOMULT	/NO MULT IF = 1

	DCA	DIV
	TAD	(-14
	DCA	CTR

BACK,
	SZL SPA		/SZL .AND. SPA (SKIP IF NO OVERFLOW)
	JMP	ERR	/TWO-DIM SUBSCRIPT OVERFLOW
	CLL RAL
	DCA	AC
	TAD	MQ
	CLL RAL
	DCA	MQ
	SZL
	TAD	DIV
	CLL
	TAD	AC
	ISZ	CTR
	JMP	BACK

	SZL		/SKIP IF NO OVERFLOW
	JMP	ERR	/TWO-DIM SUBSCRIPT OVERFLOW

NOMULT,	DCA	TM

SB1,	STL STA
SB1C,	HLT		/CDF FIRST SUBSCRIPT
	TADI	S1
	SPA
	JMP	ERR	/BAD FIRST SUBSCRIPT

	TAD	TM
	SZL
	JMP	ERR	/TWO-DIM SUBSCRIPT OVERFLOW
	DCA	TM

SUB2,	NOP		/REPLACED BY CDF
	TAD	A	/SET CDF OF ARRAY
	DCAI	R
	INC R

	TAD	TM
	STL CMA
	TAD	MAX
	SZL CLA
	JMP	ERR	/SUBSCRIPT LARGER THAN ARRAY SIZE

	TAD	N
	SPA CLA		/FIXED OR FLOATING
	TAD	TM
	CLL RAL
	TAD	TM
	TAD	A#
	DCAI	R	/SET ARRAY ADDRESS

	STL CLA RTL	/FAST 'RETRN SUBS^'
	TAD	SUBS^
	DCA	SUB3
SUB3,	NOP		/REPLACED BY 'CDF CIF'
	JMPI	SUBS^#

ERR,	CLA
	CALL	1,ERROR
	ARG	SUBERR

	END



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search