1
0
mirror of https://github.com/PDP-10/its.git synced 2026-03-02 18:04:38 +00:00
Files
PDP-10.its/src/mini/ifmac.mac
2022-03-12 16:09:44 +01:00

260 lines
4.6 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
.NLIST
;IN ORDER TO USE THESE MACROS, INCLUDE THIS FILE AS THE FIRST
;FILE OF YOUR ASSEMBLY.
;THIS MACRO IS USED BY THE OTHERS
.MACRO EVAL A,B,C,D,E,F,G,H
A'B'C'D'E'F'G'H
.ENDM
;THESE MACROS IMPLEMENT THE IF THEN ELSE CONSTRUCT,
;LOOPING CONSTRUCTS, AND A CASE CONSTRUCT
;FIRST WE HAVE:
; CONDITION CODES SET
; IF COND
; STATEMENTS TO EXECUTE
; ELSE
; STATEMENTS TO EXECUTE
; ENDF
;IN THE ABOVE, 'COND' IS THE MNEMONIC FOR A BRANCH INSTRUCTION
;MINUS THE B FOR EXAMPLE EQ, PL, OR LOS.
;THE ELSE MAY BE OMMITTED.
.MACRO IF COND
EVAL BN,COND,< >,ZI,\ZUNF
EVAL ZIB,\ZUNF,<:>
ZISP=ZISP+1
EVAL ZIS,\ZISP,=,ZUNF
ZUNF=ZUNF+1
.ENDM
.MACRO ELSE
EVAL ZT,=,ZIS,\ZISP
EVAL BR,< >,ZI,\ZUNF
EVAL ZI,\ZT,<:>
EVAL ZIS,\ZISP,=,ZUNF
ZUNF=ZUNF+1
.ENDM
.MACRO ENDF
EVAL ZT=ZIS,\ZISP
EVAL ZI,\ZT,<:>
ZISP=ZISP-1
.ENDM
;TO EXTEND THE POWER OF THE IF MACRO, TWO OTHER MACROS ARE
;INTRODUCED TO ALLOW COMPLEX LOGICAL EXPRESSIONS TO BE
;EVALUATED.
; CONDITION CODES SET
; OR COND
;OR PRODUCES A BCOND INTO THE NEXT IF TO BE OPEND
; CONDITION CODES SET
; AND COND
;AND PRODUCES A BNCOND TO THE END (OR ELSE) OF THE ENCLOSING IF
;AS AN EXAMPLE TO EVALUATE (A OR B) AND C YOU USE
; OR A
; IF B
; AND C
.MACRO OR COND
EVAL B,COND,< >,ZIB,\ZUNF
.ENDM
.MACRO AND COND
EVAL ZT,=,ZIS,\ZISP
EVAL BN,COND,< >,ZI,\ZT
.ENDM
;HERE WE HAVE A LOOPING CONSTRUCT:
; LOOP
; STATEMENTS TO EXECUTE
; CONDITION CODES SET
; WHILE COND
;CONTROLE BRANCHS BACK TO THE LOOP, IF COND IS TRUE.
;IN ADDITION COND MAY HAVE THE FORM 'SOB,REG' IN WHICH CASE
;A SOB LOOP IS SET UP.
.MACRO LOOP
ZUNL=ZUNL+1
ZLSP=ZLSP+1
EVAL ZLS,\ZLSP,=ZUNL
EVAL ZLB,\ZUNL,<:>
.ENDM
.MACRO WHILE COND,REG
EVAL ZT=ZLS,\ZLSP
.IF IDN,<COND>,<SOB>
EVAL SOB,< >,REG,<,>,ZLB,\ZT
.IFF
EVAL B,COND,< >,ZLB,\ZT
.ENDC
EVAL ZL,\ZT,<:>
ZLSP=ZLSP-1
.ENDM
;HERE WE HAVE A MORE FLEXABLE LOOPING CONSTRUCT:
; LOOP
; STATEMENTS TO EXECUTE
; CONDITION CODES SET
; UNTIL COND
; STATEMENTS TO EXECUTE
; ENDL
;NOW CONTROLE ESCAPES THE LOOP AT UNTIL WHEN COND IS TRUE.
;THERE MAY BE MORE THAN ONE UNTIL IN THE LOOP ALLOWING
;ALTERNATE ESCAPE CRITEREA.
.MACRO UNTIL COND
EVAL ZT=ZLS,\ZLSP
EVAL B,COND,< >,ZL,\ZT
.ENDM
.MACRO ENDL LONG
.IF IDN,<LONG>,<J>
EVAL ZT=ZLS,\ZLSP
EVAL JMP,< >,ZLB,\ZT
EVAL ZL,\ZT,<:>
ZLSP=ZLSP-1
.IFF
WHILE R
.ENDC
.ENDM
;NOW TO ADD MORE FLEXIBLE CONTROL OF EXECUTION WE ADD TWO
;MORE CONSTRUCTS THAT MAY APPEAR WITHIN A LOOP
; ENDOF NUM
; OUTOF NUM
;NUM IS THE NUMBER OF LEVELS, 0 MEANS THE CURRENT LOOP
;ENDOF BRANCHS BACK TO THE BIGINNING, AND OUTOF EXITS FROM
;THE SPECIFIED LOOP.
.MACRO ENDOF NUM
ZT=0
.IIF NB,<NUM>,ZT=NUM
ZT=ZLSP-ZT
EVAL ZT=ZLS,\ZT
EVAL BR,< >,ZLB,\ZT
.ENDM
.MACRO OUTOF NUM
ZT=0
.IIF NB,<NUM>,ZT=NUM
ZT=ZLSP-ZT
EVAL ZT=ZLS,\ZT
EVAL BR,< >,ZL,\ZT
.ENDM
;FINALLY WE HAVE A CASE CONSTRUCT
; REG FILLED WITH EVEN CHOICE INTEGER 0 2 4 6 ...
; CASET REG,NUM
; CASE 1
; STATEMENTS
; CASE 2
; STATEMENTS
; .
; .
; .
; CASE NUM
; STATEMENTS
; ENDC
;NUM IS THE NUMBER OF CASES, THE CASES CAN ACCURE IN ANY ORDER
;THE STATEMENTS THAT ARE EXECUTED FOR CASE N, ARE THOSE
;FROM THE CASE N STATEMENT TO THE NEXT CASE, OR ENDC STATEMENT
.MACRO CASET REG,NUM
ADD REG,PC
ZUNC=ZUNC+1
ZCSP=ZCSP+1
EVAL ZCS,\ZCSP,=,ZUNC
ZT=0
.REPT NUM
ZT=ZT+1
EVAL BR,< >,ZC,\ZUNC,\ZT
.ENDM
.ENDM
.MACRO CASE NUM,LONG
EVAL ZT,=,ZCS,\ZCSP
.IF IDN,<LONG>,<J>
EVAL JMP,< >,ZC,\ZT,0
.IFF
EVAL BR,< >,ZC,\ZT,0
.ENDC
EVAL ZC,\ZT,NUM,<:>
.ENDM
.MACRO ENDC
EVAL ZT=ZCS,\ZCSP
EVAL ZC,\ZT,0,<:>
ZCSP=ZCSP-1
.ENDM
;THESE CLUMBSY MACROS ALLOW THE NEGATION OF THE CONDITION
;NEEDED FOR IF.
.MACRO BNR LAB
ZT=ZT ;NOP IT DOESN'T SEEM TO WORK WITH NO STATEMENTS.
.ENDM
.MACRO BNEQ LAB
BNE LAB
.ENDM
.MACRO BNNE LAB
BEQ LAB
.ENDM
.MACRO BNPL LAB
BMI LAB
.ENDM
.MACRO BNMI LAB
BPL LAB
.ENDM
.MACRO BNVC LAB
BVS LAB
.ENDM
.MACRO BNVS LAB
BVC LAB
.ENDM
.MACRO BNCC LAB
BCS LAB
.ENDM
.MACRO BNCS LAB
BCC LAB
.ENDM
.MACRO BNGE LAB
BLT LAB
.ENDM
.MACRO BNLT LAB
BGE LAB
.ENDM
.MACRO BNGT LAB
BLE LAB
.ENDM
.MACRO BNLE LAB
BGT LAB
.ENDM
.MACRO BNHI LAB
BLOS LAB
.ENDM
.MACRO BNLOS LAB
BHI LAB
.ENDM
.MACRO BNHIS LAB
BLO LAB
.ENDM
.MACRO BNLO LAB
BHIS LAB
.ENDM
;THIS POSITION INDEPENDENTLY LOADS THE ADDRESS LAB INTO REG.
.MACRO LA LAB,REG
MOV PC,REG
ADD #LAB-.,REG
.ENDM
;THESE INITIALIZE THE REGESTER NAMES, AND CERTAIN SYMBOLS USED
;BY THE ABOVE MACROS.
;UNIQUE NAME GENERATORS
ZUNF=0
ZUNL=0
ZUNC=0
;STACK PTRS
ZISP=0
ZLSP=0
ZCSP=0
;STACKS
;ZISXXX
;ZLSXXX
;ZCSXXX
;GENERATED LABELS
;ZIBXXX
;ZIXXX
;ZLBXXX
;ZLXXX
;ZCXXXN
R0=%0
R1=%1
R2=%2
R3=%3
R4=%4
R5=%5
R6=%6
R7=%7
SP=%6
PC=%7
PSW=177776
SWR=177570
.LIST