DataMuseum.dk

Presents historical artifacts from the history of:

Philips Data Systems

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Philips Data Systems

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦5858b7043⟧

    Length: 17430 (0x4416)
    Notes: pts_type(SC)
    Names: »FUNCTN.SC«

Derivation

└─⟦2a21e4bb5⟧ Bits:30009691 Philips computer tape "600408"
    └─⟦this⟧ »BDKAPP/FUNCTN.SC« 
└─⟦71472ef1e⟧ Bits:30009661 Philips computer tape "600103"
    └─⟦this⟧ »BDKAPP/FUNCTN.SC« 

PTS(SC)

	IDENT  FUNCTN 	REL=7.2  DATE=77-09-09
			UPDATE   #0   77-09-09 
* 
******************************************* 
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
*   FUNCTN = TOSS FUNCTIONS 
* 
* 
*   LEVEL     #2  77-09-09
* 
*   RELEASE   #7  77-09-09
* 
******************************************* 
* 
* 
*   THIS MODULE CONTAINS TOSS FUNCTIONS.
*   THESE ARE : 
* 
*   T:ADD(C)	DECIMAL ADDITION 
* 
*   T:SUB(C)	DECIMAL SUBTRACTION
* 
*   T:CMP(C)	COMPARISON 
* 
*   T:CPA(C)        ABSOLUTE COMPARISON 
* 
*   T:MOV(C)	MOVE 
* 
* 
*   T:MOV CONTAINS THE FOLLOWING ROUTINES : 
* 
*   PCK  	PACK FROM ASCII TO BCD
* 
*   UPK  	UNPACK FROM BCD TO ASCII
* 
*   MVC  	MOV TO ASCII/BCD FROM ASCII/BCD 
* 
* 
	EJECT
* 
* 
* 
*   TOSS FUNCTIONS ARE CALLED BY FOLLOWING SEQUENCE : 
* 
*	CF	A14,LABEL
*	BYTE	EL1,EL2
* 
*   LABEL =	ENTRYPOINT IN CALLED FUNCTION 
*        	(T:ADD,T:SUB,T:CMP,T:MOV) 
* 
*   EL1   =	ELEMENT ADDRESS OF RESULT OPERAND(FIRST OPERAND)
* 
*   EL2   =	ELEMENT ADDRESS OF SECOND OPERAND 
* 
* 
	EJECT
* 
* 
************
* ENTRIES: *
************
* 
	ENTRY	T:ADD	DECIMAL ADDITION 
	ENTRY	T:ADDC 
	ENTRY	T:SUB	DECIMAL SUBTRACTION
	ENTRY	T:SUBC 
	ENTRY	T:CMP	COMPARISON 
	ENTRY	T:CMPC 
	ENTRY	T:CPA	COMPARE ABSOLUTE 
	ENTRY	T:CPAC 
	ENTRY	T:MOV	MOVE 
	ENTRY	T:MOVC 
	ENTRY	T:OPA,T:OP1
	ENTRY	T:OPS
	ENTRY	RETMMM 
	ENTRY	M:ADD,M:SUB,M:CMP,M:CPA
	ENTRY	M:MOV,M:OPA,M:OPS
* 
* 
* 
OVERLY	EQU	0
* 
*************************************************** 
* WORKING AREAS USED BY THE DIFFERENT SUBROUTINES * 
*************************************************** 
* 
T:OP1	EQU	* 
	DATA	0	LENGTH 2-COMPLEMENTED 
* 
* 
T:OP2	DATA	0	LENGTH 2-COMPLEMENTED
* 
* 
	EJECT
* 
* SUBTRACTION AND ADDITION
* 
*************** 
* SUBTRACTION * 
*************** 
M:SUB	EQU	* 
	IFT	OVERLY=1 
	LDK	A2,/80 
	XRS	A2,2,A14 
	RF	T:SUB 
	XIF
T:SUBC	ADKL	A13,1 
T:SUB	LDK	A2,6	INDICATE SUBTRACTION 
	RF	ADD050
* 
************
* ADDITION *
************
M:ADD	EQU	* 
	IFT	OVERLY=1 
	LDK	A2,/80 
	XRS	A2,2,A14 
	RF	T:ADD 
	XIF
T:ADDC	ADKL	A13,1 
T:ADD	LDK	A2,0	INDICATE ADDITION
ADD050	EQU	*
	SC	A2,SAVE+1	SAVE INDICATOR
	ST	A13,ARG1	SAVE A13 
	LD*	A7,4,A14	GET ARGUMENT
	ST	A7,ARG	STORE ARGUMENT FOR COMP
	IFT	OVERLY=0 
	CF	A14,T:CPA	COMPARE ABSOLUTE
	XIF
	IFT	OVERLY=1 
	CF	A14,M:CPA 
	XIF
ARG	DATA	0	ARGUMENT 
	LDKL	A13,0 
ARG1	EQU	*-2
	LDR	A2,A7	COPY RESULT INDICATOR
	CF	A14,GETOPS	GET ELEMENT PARAMETERS 
	LDR	A1,A2	COPY RESULT INDICATOR
	LDR	A9,A6	GET POINTER TO OP1 
SAVE	LDK	A2,0	RESTORE A2
* 
	LDK	A5,0	CLEAR A5
	LDK	A3,0	CLEAR A3
	LCR	A5,A9	GET 1:ST BYTE OP1
	LCR	A3,A10	GET 1:ST BYTE OP2 
	LDR	A4,A5	COPY A5
	LDR	A6,A3	COPY A3
	ANK	A5,/F	GET SIGN OP1 
	LDR	A7,A5	GET SIGN TO A7 
	ANK	A3,/F	GET SIGN OP2 
	ANK	A6,/F0	MASK OUT 1:ST DIGIT OP2 
	SUK	A6,/F0 
	RF(Z)	ADD060	JUMP IF BLANK 
	ADK	A6,/F0	RESTORE DIGIT 
ADD060	ANK	A4,/F0	MASK OUT 1:ST DIGIT OP1 
	SUK	A4,/F0 
	RF(Z)	ADD070	JUMP IF BLANK 
	ADK	A4,/F0	RESTORE DIGIT 
ADD070	EQU	*
	XRR	A5,A3	EXCLUSIVE OR WITH SIGNS
	XRR	A2,A5	EXCLUSIVE OR WITH SIGNS AND INDICATOR
	RF(Z)	ADD078	JUMP IF EQUAL SIGNS 
	NGR	A4,A4	NEGATE A4
	XRR	A2,A1	EXVLUSIVE OR WITH COMP. RESULT 
	SRC	A2,2	SHIFT BIT 14 TO SIGN
	RF(P)	ADD076	JUMP IF OP2 ABSOLUTE GREATER THAN OP1 
	NGR	A6,A6	NEGATE A6
	NGR	A4,A4	NEGATE A4
	LDR	A1,A2
	SLL	A1,1 
	RF(N)	ADD078	JUMP IF OP1 ABSOLUTE GREATER THAN OP2 
	LDK	A7,/B	LOAD PLUS SIGN 
	RF	ADD078
ADD076	XRK	A7,6	INVERT SIGN 
ADD078	LDK	A1,0	CLEAR CARRY 
* 
************************
* ADDITION/SUBTRACTION *
************************
* 
ADDSUB	EQU	*
	ADR	A4,A1	ADD CARRY
	LDK	A1,1	INDICATE CARRY
	ADR	A4,A6	ADD CARRY AND LEFT DIGITS
	RF(N)	ADD200	JUMP IF NEGATIVE
	SUK	A4,/A0 
	RF(NN)	ADD100	JUMP IF CARRY
	LDK	A1,0	NO CARRY
ADD080	ADK	A4,/A0	RESTORE DIGIT 
ADD100	ADR	A7,A4	GET BOTH DIGITS TO A7
ADD105	SCR	A7,A9	STORE 2 DIGITS 
	SUKL	A9,1	DECREMENT POINTER OP1
	SUKL	A10,1	DECREMENT POINTER OP2 
	IM	T:OP1 	INCREMENT INDEX
	RF(NN)	RETMMM
* 
ADD150	LCR	A4,A9	A4=BYTE OP1
	LDK	A6,0	CLEAR A6
	IM	T:OP2	INCREMENT INDEX FOR OP2 
	RF(NN)	ADD160	JUMP IF END OF ELEMENT 
	LCR	A6,A10	A6=BYTE OP2 
ADD160	LDR	A7,A4	COPY A4
	ANK	A7,/F	GET RIGHT DIGIT
	SUK	A7,/F
	RF(Z)	*+4	JUMP IF BLANK
	ADK	A7,/F	RESTORE DIGIT
	ANK	A4,/F0	GET LEFT DIGIT
	SUK	A4,/F0 
	RF(Z)	*+4	JUMP IF BLANK
	ADK	A4,/F0	RESTORE DIGIT 
	LDR	A5,A6	COPY A6
	ANK	A6,/F0	GET LEFT DIGIT
	SUK	A6,/F0 
	RF(Z)	*+4	JUMP IF BLANK
	ADK	A6,/F0	RESTORE DIGIT 
	ANK	A5,/F	GET RIGHT DIGIT
	SUK	A5,/F
	RF(Z)	*+4	JUMP IF BLANK
	ADK	A5,/F	RESTORE DIGIT
	LDR	A2,A2	 
	RF(Z)	ADD170	JUMP IF ADD 
	RF(N)	ADD165	JUMP IF OP2 NOT GREATER THAN OP1
	NGR	A4,A4	NEGATE A4
	NGR	A7,A7	NEGATE A7
	RF	ADD170
ADD165	NGR	A5,A5	NEGATE A5
	NGR	A6,A6	NEGATE A6
* 
ADD170	ADR	A7,A1	ADD WITH CARRY 
	LDK	A1,/10	INDICATE CARRY
	ADR	A7,A5	ADD CARRY AND RIGHT DIGITS 
	RF(N)	ADD220	JUMP IF NEGATIVE
	SUK	A7,/A
	RB(NN)	ADDSUB	JUMP IF CARRY
	LDK	A1,0	NO CARRY
ADD180	ADK	A7,/A	RESTORE DIGIT
	RB	ADDSUB
* 
ADD200	NGR	A1,A1	NEGATE CARRY 
	RB	ADD080
* 
ADD220	NGR	A1,A1	NEGATE CARRY 
	RB	ADD180
* 
	EJECT
* 
* 
* GET ELEMENT PARAMETERS
* 
* INPUT:  A7=M,N IN RIGHT BYTE
* OUTPUT: A6=SIGN ADDRESS 
*         A5=ADDRESS WITHIN DISCRIPTION BLOCK 
*         A4=USED 
*         A1=ELEMENT LENGTH IN BYTES 2-COMPLEMENTED 
*************************************************** 
* 
M:OPA	EQU	* 
	IFT	OVERLY=1 
	LDK	A1,/80 
	XRS	A1,2,A14 
	XIF
T:OPA	LDR	A4,A7 
	LDR	A5,A7
	ANK	A5,/F0	A5=Z * 16 
	SRL	A5,2	Z * 4 
	ADR	A5,A13	DISPLACEMENT ADDRESS
	LD	A6,2,A5	BASE ADDRESS
	LDR*	A5,A5	GET ADDRESS TO DB 
	ANK	A4,/F	MASK OUT N 
	SLL	A4,1	N * 2 
	ADR	A5,A4	ADDRESS WITHIN DB
	LDR*	A1,A5	
	ANKL	A1,/FFF	MASK OUT DISPLACEMENT 
	ADR	A6,A1	ELEMENT ADDRESS
	SUK	A6,1	ELEMENT ADDRESS RIGHTMOST 
	LDR	A4,A4
	RF(Z)	OPA100	JUMP IF N=0 
	LD	A4,-2,A5	GET DISPLACEMENT FOR N-1 
	ANKL	A4,/FFF	MASK OUT DISPLACEMENT 
OPA100	SUR	A1,A4	GET LENGTH 
	NGR	A1,A1	NEGATE LENGTH
	RF	RETMMM
	EJECT
******************************************************* 
* GET ELEMENT PARAMETERS FOR 2 OPERANDS 
* AND ADJUST RETURN ADDRESS ON STACK
* 
* INPUT : A7     =OP1,OP2 
* OUTPUT: T:OP1  = NEG LENGTH OF OP1
*         T:OP2  =NEG LENGTH OF OP2 
*         A1     =NEG LENGTH OP1
*         A3     =PACKING FORM OP2
*         A5     =DESCRIPTOR ADDRESS OP1
*         A6     =POINTER OP1 
*         A10    =POINTER OP2 
* 
******************************************************* 
* 
GETOPS	EQU	*
	LD*	A7,8,A14	GET ARGUMENT
	LDK	A1,2 
	ADS	A1,8,A14	ADJUST RETURN ADDRESS 
M:OPS	EQU	* 
	IFT	OVERLY=1 
	LDK	A1,/80 
	XRS	A1,2,A14 
	XIF
T:OPS	EQU	* 
	LDR	A1,A13	COPY A13
	ANKL	A13,/FFFE	MASK AWAY CONSTANT INDICATION 
	ST	A13,ARG2	SAVE A13 
	SRC	A1,1 
	RF(NN)	GET010	JUMP IF NOT TCA COMMON 
	LD	A13,-2,A13	GET ADDRESS TO TCACOM
GET010	EQU	*
	IFT	OVERLY=0 
	CF	A14,T:OPA	GET PARAMETERS FOR OP2
	XIF
	IFT	OVERLY=1 
	CF	A14,M:OPA	PARAMETERS FOR OP2
	XIF
	LDKL	A13,0 
ARG2	EQU	*-2
	LDR	A10,A6	A10=POINTER OP2 
	ST	A1,T:OP2	STORE NEG LENGTH OP2 
	LDR*	A3,A5	GET PACKING FORM IN BIT 0 
	ECR	A7,A7	CHANGE BYTES 
	IFT	OVERLY=0 
	CF	A14,T:OPA	GET PARAMETERS FOR OP1
	XIF
	IFT	OVERLY=1 
	CF	A14,M:OPA 
	XIF
	ST	A1,T:OP1 	STORE NEG LENGTH OP1
	IFT	OVERLY=0 
RETMMM	RTN	A14
	XIF
	IFT	OVERLY=1 
RETMMM	STR	A1,A14 
	LD	A1,2,A14
	ANK	A1,/80 
	RF(E)	RETMMF 
	LDR*	A1,A14
	DATA	/C0FF 
RETMMF	LDR*	A1,A14
	RTN	A14
	XIF
	EJECT
* 
* MOVE
* 
********************************
* 
M:MOV	EQU	* 
	IFT	OVERLY=1 
	LDK	A1,/80 
	XRS	A1,2,A14 
	RF	T:MOV 
	XIF
T:MOVC	ADKL	A13,1 
* 
T:MOV	EQU	* 
	CF	A14,GETOPS	GET ELEMENT PARAMETERS 
	LDR	A4,A1	A4=LENGTH 2-COMPLEMENTED 
	LD	A2,T:OP2	GET LENGTH OF OP2 2-COMPL. 
	LDR	A7,A10	GET POINTER OP2 
	XRR*	A3,A5 
	RF(NN)	MVC	JUMP IF EQUAL PACKING FORM
	LDR*	A3,A5	GET PACKING FORM FOR OP1
	RF(N)	UPK	JUMP IF ASCII
	EJECT
* 
* PACK
*********** 
* 
PCK	LDK	A1,/B	LOAD PLUS SIGN
PCK040	LDK	A3,/F0	LOAD BLANK AND ZERO 
	ADK	A2,1	INCREMENT INDEX 
	RF(P)	PCK050	JUMP IF END OF ELEMENT
	LCR	A3,A7	GET BYTE FROM OP2
	SUK	A3,/30 
	RF(NN)	PCK045	JUMP IF NOT SPACE
	LDK	A3,/F	LOAD BLANK 
PCK045	SLL	A3,4	SHIFT TO LEFT POSITION
PCK050	ADR	A1,A3	GET 2 DIGITS IN THE RIGHT BYTE 
	SCR	A1,A6	STORE BYTE IN OP1
	ADK	A4,1	STEP UP INDEX 
	RB(NN)	RETMMM
	SUK	A6,1	DECREMENT POINTER OP1 
	SUK	A7,1	DECREMENT POINTER OP2 
	LDK	A1,/F	LOAD BLANK 
	ADK	A2,1	INCREMENT INDEX FOR OP2 
	RB(P)	PCK040	JUMP IF END OF ELEMENT
	LCR	A1,A7	GET BYTE FROM OP2
	SUK	A1,/30 
	RF(NN)	PCK060	JUMP IF NOT SPACE
	LDK	A1,/F	LOAD BLANK 
PCK060	SUK	A7,1	DECREMENT POINTER FOR OP2 
	RB	PCK040
	EJECT
* 
* MOVE CHARACTER BY CHARACTER 
***************************** 
* 
MVC	EQU	* 
	LDK	A3,0	LOAD HEX ZERO 
MVC020	EQU	*
	LDR*	A5,A5	GET PACKING FORM
	RF(N)	MVC050	JUMP IF ASCII 
	LDK	A3,/FF	LOAD BLANKS 
MVC050	LDR	A1,A3	GET FILLER TO A1 
	ADK	A2,1	INCREMENT INDEX FOR OP2 
	RF(P)	MVC100	JUMP IF END OF ELEMENT
	LCR	A1,A7	GET BYTE FROM OP2
MVC100	SCR	A1,A6	STORE BYTE IN OP1
	SUK	A7,1	DECREMENT POINTER OP2 
	SUK	A6,1	DECREMENT POINTER OP1 
	ADK	A4,1	STEP UP INDEX 
	RB(N)	MVC050	JUMP IF NOT FINISHED
RETUR	RB	RETMMM 
	EJECT
* 
* UNPACK
************
* 
UPK	LDK	A1,0	CLEAR A1 
	LDR	A2,A2
	RF(NN)	UPK070	JUMP IF END OF OP2 
	LCR	A1,A7	GET BCD-DIGITS 
	SRL	A1,4	SHIFT OUT SIGN
	SUK	A1,/F
	RF(Z)	UPK060	JUMP IF BLANK 
	ADK	A1,/1F 
UPK060	ADK	A1,/20	MAKE ASCII DIGIT OR BLANK 
UPK070	SCR	A1,A6	STORE ASCII
	SUK	A6,1	DECREMENT POINTER OP1 
	SUK	A7,1	DECREMENT POINTER OP2 
	ADK	A4,1	INCREMENT INDEX 
	RB(NN)	RETUR	JUMP IF FINISHED
	LDK	A1,0	CLEAR A1
	ADK	A2,1	INCREMENT INDEX FOR OP2 
	RF(NN)	UPK110	JUMP IF END OF ELEMENT 
	LCR	A1,A7	GET DIGITS FROM OP2
	ANK	A1,/F	GET RIGHT DIGIT
	SUK	A1,/F
	RF(Z)	UPK100	JUMP IF BLANK 
	ADK	A1,/1F 
UPK100	ADK	A1,/20	MAKE ASCII DIGIT OR BLANK 
UPK110	SCR	A1,A6	STORE ASCII
	SUK	A6,1	DECREMENT POINTER OP1 
	ADK	A4,1	INCREMENT INDEX 
	RB(N)	UPK	JUMP IF NOT FINISHED 
	RB	RETMMM
* 
	EJECT
* 
* COMPARISON OF 2 BCD ELEMENTS
************************************* 
* 
M:CPA	EQU	* 

	IFT	OVERLY=1 
	LDK	A1,/80 
	XRS	A1,2,A14 
	RF	T:CPA 
	XIF
T:CPAC	ADKL	A13,1 
T:CPA	EQU	*	ABSOLUTE COMPARISON 
	LDR	A9,A14	INDICATE ABS. COMP
	RF	COMP
* 
M:CMP	EQU	* 
	IFT	OVERLY=1 
	LDK	A1,/80 
	XRS	A1,2,A14 
	RF	T:CMP 
	XIF
T:CMPC	ADKL	A13,1 
T:CMP	EQU	*	COMP. INCLUSIVE SIGNS 
	SUR	A9,A9	INDICATE NORMAL COMP 
COMP	LDKL	A8,/EC08	A8=CWR A4,A2 
	CF	A14,GETOPS	GET ELEMENT PARAMETERS 
	LDK	A7,0	INDICATE EQUAL
	LCR	A4,A6	GET 1:ST BYTE FROM OP1 
	LCR	A2,A10	GET 1:ST BYTE FROM OP2
	LDR	A3,A4	COPY A4
	LDR	A5,A2	COPY A2
	ANK	A3,/F	GET SIGN OP1 
	ANK	A5,/F	GET SIGN OP2 
	ANK	A4,/F0	GET LEFT DIGIT
	ANK	A2,/F0	GET LEFT DIGIT
	LDR	A9,A9
	RF(NZ)	CMP100	JUMP IF ABSOLUTE COMPARISON
	SUR	A3,A5
	RF(N)	CMP150	JUMP IF OP1 GT OP2
	RF(P)	CMP160	JUMP IF OP1 LT OP2
	SUK	A5,/B
	RF(Z)	CMP100	JUMP IF PLUS SIGNS
	LDKL	A8,/EA10	A8=CWR A2,A4 
CMP100	SUK	A4,/FF 
	RF(Z)	CMP110	JUMP IF 2 BLANKS
	ADK	A4,/F
	RF(NN)	CMP110	JUMP IF 1 BLANK (LEFTMOST) 
	ADK	A4,/F0	RESTORE DIGITS
CMP110	SUK	A2,/FF 
	RF(Z)	CMP120	JUMP IF 2 BLANKS
	ADK	A2,/F
	RF(NN)	CMP120	JUMP IF 1 BLANK (LEFTMOST) 
	ADK	A2,/F0	RESTORE DIGITS
CMP120	EXR	A8	COMPARE 
	RF(G)	CMP140	JUMP IF GREATER 
	RF(E)	CMP130	JUMP IF EQUAL 
	LDK	A7,2	INDICATE LESS 
CMP130	SUK	A6,1	DECREMENT POINTER 
	SUKL	A10,1	DECREMENT POINTER 
	ADK	A1,1	INCREMENT INDEX 
	RF(NN)	CMP170
	LCR	A4,A6	GET BYTE FROM OP 1 
	LDK	A2,0 
	IM	T:OP2	INCREMENT INDEX 
	RB(NN)	CMP100	JUMP IF END OF ELEMENT 
	LCR	A2,A10	GET BYTE FROM OP2 
	RB	CMP100
* 
* GREATER THAN
****************
* 
CMP140	LDK	A7,1	INDICATE GREATER THAN 
	RB	CMP130
* 
* OP1 + AND OP2 - 
***************** 
* 
CMP150	LDK	A7,1	INDICATE GREATER THAN 
	RF	CMP170
* 
* OP1 - AND OP2 + 
******************
* 
CMP160	LDK	A7,2	INDICATE LESS THAN
CMP170	LC	A6,2,A14	PSW
	ANK	A6,/FC 
	ORR	A6,A7
	SC	A6,2,A14	PSW COND UPD 
	RB	RETUR 
* 
	END

Full view