FILE
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