File: DEMO of Disk: Disks/PDP8-Net/multos8
(Source file text) 

	FILE	<P A G E 8   D E M O> 
	TITLE	PAGE8 DEMONSTRATION PROGRAM RUN
/
/	THIS PROGRAM SHOWS A LARGE NUMBER OF FEATURES IN PAGE8
/	IT OBVIOUSLY DOES NOT RUN (!) BUT IS WORTH STUDYING IN SOME DETAIL
/
/	NOTE THAT IN PAGE8, CONSTANTS ARE DECIMAL AND A LEADING ZERO SIGNIFIES
/	AN OCTAL CONSTANT. HOWEVER, A SINGLE 'RADIX 8' DIRECTIVE AT THE START
/	OF THE PROGRAM WILL FORCE ALL THOSE CONSTANTS TO BE OCTAL (AS IN PAL8)
/
	ORG	0200
	AS	84,-1		GENERATE 84 WORD BLOCK FILLED WITH -1
THIS:IS:A:VERY:LONG:SYMBOL:BUT:QUITE:LEGAL:IN:PAGE8 NOP
	DC	THIS:IS:A:VERY:LONG:SYMBOL:BUT:QUITE:LEGAL:IN:PAGE7	(OOPS)
  JMP THIS:IS:A:VERY:LONG:SYMBOL:BUT:QUITE:LEGAL:IN:PAGE8  GOT IT!
SKIP	SMA SZA SZL CLA		FLAGS INCORRECT OPERATING GROUPING
	DC	-1024/3		PERFORMS SIGNED ARITHMETIC
	DC	-5.LT.3		AND SIGNED RELATIONAL OPERATIONS
	DC	(-5.XO.04000).LT.(3.XO.04000) SHOWS HOW TO DO UNSIGNED COMPARE
	DC	11,011,B'11',X'11',"11,'1   ALL KINDS OF CONSTANTS
/
/	NORMALLY, CONSTANTS HAVE 'DC' IN OPERATION CODE FIELD, HOWEVER,
/	PAL8 FREE FORM (NO OPERATION CODE) IS PERMITTED AS SHOWN BELOW:
/
	4
	5*39.XO.-1
TAGX	07777.AN.037		THIS IS THE NORMAL SYNTAX IN PAGE8
/
TAGY,	07777&037		/ BUT WE CAN MAKE IT LOOK LIKE PAL8 IF WE WISH
/
*	ASTERISK IS ALSO PERMITTED TO START A COMMENT LINE
/
	ORG	0372
	TAD	=5		CURRENT PAGE LITERALS
	JMP	*+5		NOTE ADDRESS RECALCULATION PERFORMED BY PAGE8
TAG	NOP
	JMP	TAG-1		IN BOTH DIRECTIONS OF COURSE
	TAD	TEMP		FIELD ADDRESSING ERROR HERE
	CDF	%TEMP		SYMBOLIC FIELD ADDRESSING
	TAD	TEMP		STILL WON'T WORK
	TADI	=TEMP		THIS IS THE CORRECT FORM
	AFIELD	7		TELL PAGE8 WHERE DATA FIELD IS NOW
	TAD	TAG-2		NOW THIS IS ILLEGAL
	AFIELD	%*		SET IT BACK AGAIN
	TAD	TAG-2		NOW THIS IS LEGAL AGAIN
	RADIX	4		NOT TOO USEFUL(!) BUT ALLOWED
	DC	211131		A QUARTERNARY (?) CONSTANT
	RADIX	D'10'		(THIS IS WHY THERE ARE TYPED DECIMAL CONSTANTS)
/
	JMP	2F		LOCAL SYMBOLS HERE
	TAD	2F
2H	DC	4		NOTE REFERENCE COUNT OF 3 POSTED
	TAD	2B		(BACKWARDS REFERENCE)
	PART			PARTITION LOCAL SYMBOLS
	TAD	2B		GENERATES 'U' ERROR BECAUSE OF PARTITION
/
	LOAD	0600		START A RELOCATED CODE SECTION
	DC	TEMP		NOTE '*' SIGNIFIES RELOCATED ADDRESSES
	NOP
	ORG	*		RESET LOCATION NOW
/
	TAD	#TEMP		PAGE ZERO LITERAL
/
	CIF	%TEMP		ONE WAY TO CROSS FIELDS
	JMPI	=TEMP
	JMPX	TEMP		ANOTHER WAY TO DO THE SAME THING
	CIF	%TEMP		ERROR FLAGGED ON NEXT STATEMENT BECAUSE OF
	NOP			POTENTIAL PAGE BREAK PROBLEM (WE COULD GET
	JMPI	=TEMP		A PAGE BREAK AFTER THE NOP!
	TITLE	DEMONSTRATION OF EQU/SET, DSEC
	DSEC
	JMP	TAG		PAGING LINKS AND
	TAD	=4		LITERALS ARE NOW FORCED THROUGH PAGE 0
	ISEC	0			NOTE THAT NO PAGE ALIGNMENT OCCURS
	LISTC			ALLOW CONDITIONAL CODE TO LIST
/
	AIF	2+2.EQ.3+1,.TRUE SHOULD BE TRUE AND WE WILL BRANCH
	NOP			LISTED (BECAUSE OF LISTC)
	GROPE			NO 'O' ERROR BECAUSE IT MIGHT BE A MACRO
.TRUE	ANOP			WHOSE DEFINITION WAS ALSO CONDITIONALIZED OUT
/
TEMP2	EQU	4		NORMAL WAY TO EQUATE SYMBOLS
TEMP2	EQU	5		CAN'T REDEFINE A SYMBOL DEFINED WITH EQU
TEMP2	SET	6		ALSO ILLEGAL IF FIRST DEFINED WITH EQU
/
TEMP3	SET	9		BUT IF IT IS DEFINED WITH SET
TEMP3	SET	2		WE ARE PERMITTED TO REDEFINE IT
TEMP3	EQU	4		AS LONG AS WE ALWAYS USE SET AND NOT EQU
/
LABEL	QUT	5,01234		WE CAN EQUATE TO 15 BIT ADDRESS
	DC	%LABEL		AND REFERENCE THE FIELD ADDRESS OF THAT SYMBOL
/
	TITLE	DEMONSTRATION OF PAGE BREAK PROTECTION
	ORG	0771
	NOP
	TEXT	/PAGE8 DOESN'T BREAK TEXT STRINGS/
	ORG	01171
	NOP
	DC	1,2,3,4,5,6,7,8,9 AND DOESN'T BREAK CONSTANT LISTS
	ORG	01371
	NOP
	JMSX	LABEL,1,2,3,4,5,6    OR IN-LINE SUBROUTINE CALLS
	TITLE	DEMONSTRATION OF RUN-TIME '&' OPERATOR
/	NOW GENERATE A TEXT STRING THAT CONTAINS THE DATE ON WHICH
/	THIS PROGRAM WAS ASSEMBLED (USES & FEATURE)
/
DATE	QUT	1,07666			EQUATE TO OS/8 DATE WORD ADDRESS
MONTH	EQU	(&DATE.AN.07400).RS.8   THIS IS THE BINARY MONTH
DAY	EQU	(&DATE.AN.0370).RS.3    AND THIS IS THE BINARY DAY
/
	TEXT	'PROGRAM ASSEMBLED ON: '
	BYTE	(MONTH/10)+"@0,(MONTH.MO.10)+"@0
	BYTE	"@/,DAY/10+"@0
	BYTE	DAY.MO.10+"@0,"@/
	BYTE	"@7,(&DATE.AN.7)+"@0
	DC	0
/
/	ANOTHER EXAMPLE OF & FEATURE. CREATE A RUN-TIME OPTION (/Z) TO CANCEL
/	THE EFFECT OF EJECT STATEMENTS (TO COMPRESS LISTINGS)
/
SWITCH	QUT	1,07645		POINT AT DECODER SWITCHES
	AIF	(&SWITCH.AN.02000).EQ.0,.NOZ   BRANCH IF /Z NOT SET
/
/	(WE USED /Z TO ASSEMBLE THIS PROGRAM SO WE WILL GET HERE)
/
	ALIGN
	UNLINK	EJECT		REMOVE EJECT DEFINITION
	MACRO
	EJECT			; REDEFINE EJECT AS A MACRO
	ANOP			; THAT DOESN'T DO ANYTHING
	MSKIP			; ALLOW SKIP OF COURSE TO PRECEDE
	MEND
.NOZED	ANOP
/
	EJECT			NOTE THAT EJECT CARD JUST LOOKS LIKE A COMMENT
	LINK	EJECT		NOW RESTORE 'EJECT' TO PAGE8 OP CODE TABLES
	AIF	(*.XO.04000).LT.(01000.XO.04000),.OK  WE CAN DO OUR OWN CHECKS
	ERROR:   PROGRAM HAS GONE ABOVE LOCATION 1000
.OK	ANOP
	TITLE	DEMONSTRATION OF SUBROUTINES/COROUTINES IN PAGE8
/	SUBROUTINE EXAMPLES
/
OCTAL	SUB			NORMAL ENTRY
	NOP
	RET	OCTAL		NORMAL ON-PAGE RETURN
	ALIGN
	RET	OCTAL		NORMAL OFF-PAGE RETURN
	INC	OCTAL		WATCH!: THIS SUBROUTINE MUST HAVE MORE THAN 1
	RET	OCTAL		EXIT POINT BECAUSE OF DESTRUCTIVE REFERENCE
/
	JMS	OCTAL		ERROR POSTED BECAUSE OF UNPROTECTED CALL
	JMP	GOOD		(WE COULD GET A PAGE BREAK AFTER THE JMS
	JMP	BAD
/
	ROOM	4		BUT IF WE PROTECT IT PROPERLY
	JMS	OCTAL		WE DON'T GET THE ERROR
GOOD	JMP	GOOD
BAD	JMP	BAD
/
DECMAL	SUB	*+4		WE CAN FILL SECOND LOCATION WITH WHAT WE LIKE
	INCI	DECMAL		DESTRUCTIVE REFERENCES INVOLVING DECMAL
	INC	DECMAL+1
	DCAI	DECMAL		BUT NONE OF THEM ACTUALLY AFFECT THE RETURN
	RET	DECMAL		POINT ADDRESS
	JMS	DECMAL		NO ERROR POSTED (PAGE8 IS QUITE SMART!)
/
/	COROUTINES ARE VERY CONVENIENT IN PAGE8. THIS IS WHAT THEY LOOK LIKE
/
ENTRY	SUB			ENTRY TO ONE COROUTINE
EXIT	SUB	START		EXIT HAS INITIAL COROUTINE LINKAGE
	RET	ENTRY		RETURN FROM THIS COROUTINE
/
START	NOP			MAIN LINE CODE IN THIS COROUTINE
	JMS	EXIT		CALL OTHER COROUTINE
	NOP
	JMS	EXIT		CALL OTHER COROUTINE
	JMP	START
	TITLE	DEMONSTRATION OF SEMANTIC AND SYNTACTIC ERROR DETECTION
	ORG	UNDEFINED	NOTE PHASE ERROR PROTECTION ON ILLEGAL REF.
UNDEFINED EQU	05000		PAGE8 RECOGNIZES THE ERROR IN ALL PASSES
/
/
	DC	((((4+3)*-(7+1)+9.LT.3))  BALANCE OF PARENTHESES IS CHECKED
	DCA	=TEMP		A FEW SEMANTIC ODDITIES ARE ALSO FLAGGED
	DCAI	=TEMP		THIS OF COURSE IS REASONABLE
	JMP	=TEMP		BUT THIS ISN'T
	JMP	-TEMP		AND THIS IS CLEARLY WRONG
	TAD	-TEMP		AS IS THIS
	TAD	=-TEMP		BUT THIS IS FINE
/
	DC	3564		WARNS THAT INTERNALLY, THIS IS A NEGATIVE #
	JMPI	*+4		WARNS THAT WE MAY GET 'A' ERROR ON LATER
/				ASSEMBLIES IF PAGE BREAKS BADLY
/
	TAD	460		GENERATES ERROR BECAUSE WE PROBABLY WANTED--
	TAD	=460		A LITERAL
	TAD	$460		IF WE REALLY WANTED IT (SHAME) WE CAN DO IT
	JMP	BUMP+2		ALSO HANDLES PREMATURELY BREAKING PAGES
	TAD	TAG,4		ALSO CHECKS FOR SUPERFLOUS
SYTR	QUT	6		AND MISSING FIELDS
BUMP	DC	01291		AND ALWAYS CHECKS FOR LEGAL DIGITS IN RADIX
	ALIGN
	NOCREF			CANCEL CREF ACCUMULATION
	DC	DECMAL,TEMP,TAG THESE REFERENCES ARE NOT IN THE CREF LIST
	CREF			BACK ON AGAIN
/
	AIF	?SYMB,.DEFINED	IS SYMBOL DEFINED IN PRIOR STATEMENT?
	NOP
	NOTE: SYMB IS NOT DEFINED AND THERE IS NO PHASE ERROR
.DEFINED ANOP
SYMB	EQU	1		NOW WE DEFINE THE SYMBOL
	AIF	?SYMB,.OK	BUT IT IS NOW
	NOP
	ERROR: ASSEMBLER ERROR IF WE GET ERROR STARS HERE!!!
.OK	ANOP
	TITLE	DEMONSTRATION OF PROGRAM SECTIONING
	FIELD	2
	ORG	0200
/
TEMP	DC	0
	JMS	DECMAL		SEMANTIC ERROR BECAUSE OF CROSS FIELD REF
	JMSX	DECMAL		THIS IS LEGAL
	JMSI	=DECMAL		LEGAL (PAGE8 WILL NOT CHECK FOR PRECEDING CIF)
	ALIGN
	FIELD	1		CAN'T GO BACKWARDS IN AN AREA
	ISEC	1		BUT WE CAN SWITCH ISEC AREAS
	FIELD	1		AND IT IS NOW LEGAL TO GO "BACK"
	ORG	02000
	DC	4		MAINTAINS SEPARATE LOCATION COUNTERS
	ISEC	0		(AND PAGE MAP TABLES)
	DC	3
	ISEC	1
	DC	5
	ISEC	0
	NOP
$SYMBOL	EQU	4		SYMBOL IS MARKED AS GLOBAL
	DC	SYMBOL		DOLLAR ONLY APPEARS ON DEFINITION POINT
	EJECT
	FIELD	3
/
/	WE CAN EVEN 'RESERVE' OBJECT GAPS WHICH WILL BE SKIPPED OVER DURING
/	AUTOMATIC PAGING.
/
	GAP	3,0600,256	SKIP 256 WORDS AT LOCATION 600 IN FIELD 3
/
	ORG	0370
	FREE	4		FORCE AT LEAST 4 FREE LOCATIONS ON EACH
	NOP			PAGE HERE
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	FREE	0		RESTORE OPTIMAL PACKING DENSITY NOW
	ORG	0574
	NOP
	NOP
	NOP			(NOW AT 1200 BECAUSE OF 'GAP' DIRECTIVE ABOVE)
	NOP
	NOP
	NOP
	TITLE	DEMONSTRATION OF MACRO PROCESSOR
/
/	FOLLOWING MACRO DEMONSTRATES A NESTED MACRO, AND A BACKWARDS ASSEMBLY
/	TRANSFER. IT SETS UP A TABLE OF 10 WORDS AS HEX DIGITS IN WHICH
/	EACH DIGIT IS ONE GREATER THAN THE PREVIOUS DIGIT, VIZ. X'012', X'345'
/	X'678', X'9AB', X'CDE', X'F01' ETC. THIS MACRO ALSO DEMONSTRATES
/	GENERATION OF NUMERIC STRINGS FROM SYMBOLIC ARGUMENTS (\ OPERATOR)
/
	MACRO
	.TABLE
:L	SET	0			; INITIALIZE LOOP COUNTER
.LOOP	.HEX	\:L,\:L+1,\:L+2		; GENERATE HEX NUMBER
:L	SET	:L+3			; ADVANCE COUNTER
	AIF	:L.LT.30,.LOOP		; LOOP BACK IF MORE TO GO
	MEND
/
/	THIS MACRO TAKES THREE ARGUMENTS AND GENERATES A 3, HEX DIGIT WORD
/
	MACRO
	.HEX	<ONE><TWO><THREE>	; THREE ARGUMENTS ARE THE DIGITS
	LISTM				; LIST THE ARGUMENTS
	DC	((<ONE>&X'F').LS.8)+((<TWO>&X'F').LS.4)+(<THREE>&X'F')
	NOLISTM				; MACRO EXPANSION LISTING OFF
	MEND
/
/	NOW CALL THE MACRO TO GENERATE THE TABLE
/
	.TABLE
	EJECT
/
/	FOLLOWING MACRO DEMONSTRATES SYNTHESIS OF SYMBOLS FROM NUMERIC 
/	ARGUMENTS AND SHOWS THE CHARACTER SCANNING DIRECTIVE ('MSCAN')
/	MACRO GENERATES A DISPATCH TABLE BASED ON FIRST TWO LETTERS OF ARGUMENT
/
	MACRO
	.DISPAT	<ARG>			; ARGUMENT IS THE TEXT STRING
:A	MSCAN	0,<ARG>			; SCAN OFF FIRST CHAR IN ARGUMENT
:B	MSCAN	1,<ARG>			; SCAN OFF 2ND CHAR IN ARGUMENT
!	DC	-"[:A[:B		; GENERATE MINUS 6-BIT ASCII VALUE
	JMP	COM:[:A[:B		; GENERATE JUMP TO ROUTINE ADDRESS
	MEND
/
	.DISPAT	OPEN A NEW FILE
	.DISPAT	CLOSE EXISTING FILE
	.DISPAT RETURN TO MONITOR
/
COM:OP	HLT			THESE ARE THE THREE ROUTINES THAT
COM:CL	HLT			WILL BE CALLED BY THE ABOVE MACROS
COM:RE	HLT
/
	TITLE	DEMONSTRATION OF TOTAL PHASE ERROR PROTECTION
	FIELD	4
/
/	ONE FINAL AMUSING NOTE ON FORWARD REFERENCE ERROR CHECKING
/	THE FOLLOWING PAL8 CODE GENERATES DIFFERENT CODE AND DEFINITIONS
/	ON EACH OF THE THREE PASSES!! WITHOUT FLAGGING ANY ERRORS
/
/	*200
/	ZBLOCK	T
/	T=.
/
/	ON PASS 1, T HAS A VALUE OF 200
/	ON PASS 2, T HAS A VALUE OF 400
/	ON PASS 3, T HAS A VALUE OF 600  !!!
/
/	THIS PARTICULAR EXAMPLE IS NOT LIKELY (!) BUT INCORRECT HANDLING
/	OF ZBLOCK BY PAL8 CAN CAUSE HORRENDOUS ERRORS ON QUITE LEGITIMATE
/	CODE
/
/	THE PARALLEL PAGE8 CODE IS:
/
	ORG	0200
	AS	T		FORWARD REFERENCE IS KICKED OUT OF COURSE
T	EQU	*		AND WE DON'T EVEN GET A PHASE ERROR