mirror of
https://github.com/PDP-10/its.git
synced 2026-03-28 19:02:00 +00:00
This is .INSRTed in Imlac assembly language source files to reconfigure MIDAS for use as an Imlac assembler.
610 lines
14 KiB
Plaintext
610 lines
14 KiB
Plaintext
TITLE IMLAC DEFS
|
||
|
||
; DEFINITIONS CONDITIONALIZED ON SYMBOLS "PDS4" AND "MAXADR"
|
||
.LSTOFF
|
||
|
||
IFN 0,[ ; defines this as a symbol file to @ program
|
||
.AUXIL
|
||
]
|
||
DEFINE SUBTTL ARG
|
||
TERMIN
|
||
SUBTTL MIDAS MODIFICATIONS
|
||
.MLLIT==1
|
||
|
||
; expung MIDAS duplicate symbols
|
||
EXPUNG XOR AND IOR ADD SUB TSN PUSH POP CALL CLEAR
|
||
|
||
; set up IMLAC 16 bit formats (LAST 4 ARE REDUNDANT)
|
||
.FORMA 24,001300200000 ; A B OPCODE ADDRESS
|
||
.FORMA 25,001300201701 ; A B C USED WITH A=INDIR. BIT
|
||
.FORMA 27,001010100000 ; A B,C A IGNORED
|
||
.FORMA 32,000010100000 ; A,,
|
||
.FORMA 33,001000001010 ; A,,B
|
||
.FORMA 34,001010100000 ; A,B
|
||
|
||
; Required symbo definitions
|
||
IFNDEF PDS4,PDS4=0 ; Imlac PDS-4 instruction set
|
||
IFNDEF MOUSE,MOUSE=0
|
||
IFNDEF MAXADR,MAXADR=17777
|
||
IFNDEF MUDDLE,MUDDLE=0
|
||
IFNDEF AIKBD,AIKBD=0 ; A.I. type kbd in use
|
||
IFNDEF .ADDR.,.ADDR.=0 ; 8K display addressing mod in use
|
||
IFNDEF CSIZE,CSIZE=22.
|
||
|
||
; special IMLAC END statement
|
||
EQUALS ...END END
|
||
EXPUNG END
|
||
|
||
DEFINE PAGECK A,B
|
||
IF2 [ PRINTC %!A!B
|
||
%]
|
||
TERMIN
|
||
|
||
DEFINE END ARG
|
||
IFSN ARG,,[
|
||
VARIAB
|
||
CONSTA
|
||
...ZZZ==.
|
||
LOC MAXADR-64
|
||
I JMP .+1
|
||
ARG
|
||
LOC ...ZZZ
|
||
]
|
||
EQUALS END ...END
|
||
EXPUNG ...END
|
||
END
|
||
TERMIN
|
||
|
||
; miscellaneous definitions. Note PDS4 should be defined
|
||
I=1 ; USED FOR INDIRECTION SYNTAX (E.G. I DAC FOO)
|
||
MINUS1=177777 ; 16-bit minus 1 for masking etc.
|
||
|
||
SUBTTL IMLAC INTERRUPT BITS
|
||
; interrupt bits
|
||
IFE PDS4,[ ; PDS-1 CODES
|
||
PEN==1 ; light pen
|
||
REF==2 ; display refresh
|
||
MPV==4 ; memory protect violation
|
||
TTI==10 ; tty in
|
||
KBD==20 ; keyboard
|
||
TTO==40 ; tty out
|
||
MSE==100 ; joystick, mouse, or trackball
|
||
]
|
||
.ELSE,[ ; PDS-4 FIRST INTERUPT WORD BITS
|
||
KBD==100000 ; KEYBOARD (#1)
|
||
TTYR==40000 ; TTY RECEIVE
|
||
TTYX==20000 ; TTY SEND (XMIT)
|
||
PTP==10000 ; PT PUNCH
|
||
PRT==4000 ; PRINTER (VERSATEC?)
|
||
FKB1==2000 ; FUNCTION KEYBOARD #1
|
||
FKB2==1000 ; FUNCTION KEYBOARD #2
|
||
PTR==400 ; PT READER
|
||
PEN==200 ; LIGHT PEN
|
||
TKAR==100 ; SECOND TTY INTERFACE RECEIVE
|
||
TKAX==40 ; SECOND TTY INTERFACE SEND (XMIT)
|
||
IN16==20 ; 16-BIT PARALLEL INTERFACE, INPUT
|
||
OUT16==10 ; 16-BIT PARALLEL INTERFACE, OUTPUT
|
||
INTR4==4 ; BIT-4 INTERUPT (NOT USED OR SPECIAL)
|
||
SYNC==2 ? REF==SYNC ; 40 CYCLE SYNC
|
||
DHLTI==1 ; DISPLAY HALT INTERUPT
|
||
|
||
; SECOND INTERUPT WORD BITS
|
||
|
||
KBD2==100000 ; SECOND KEYBOARD (A.I. TYPE?)
|
||
INTR1==40000 ;INTR. BIT 40000 N.U. OR SPECIAL
|
||
INTR2==20000 ;INTR. BIT 20000 N.U. OR SPECIAL
|
||
MPV==10000 ; MEMORY PROTECTION VIOLATION
|
||
MSE==4000 ; GRAPHIC MOUSE BUTTON
|
||
JYST==2000 ; JOYSTICK OR TRACKBALL
|
||
MT==1000 ; MAGNETIC TAPE
|
||
INTR7==400 ; INTR. BIT 400 N. U. OR SPECIAL
|
||
TBL==200 ; GRAPHIC TABLET
|
||
INTR9==100 ; INTR. BIT 100 N. U. OR SPECIAL
|
||
HCY==20 ; HARD COPY OR STORAGE TUBE
|
||
INTR12==10 ; INTR. BIT 20 N.U. OR SPECIAL
|
||
INTR13==4 ; INTR. BIT 10 N.U. OR SPECIAL
|
||
CLK==2 ; PROGRAMMABLE CLOCK
|
||
FLTP==1 ; FLOATING PT. PROCESSOR
|
||
|
||
; SECOND LEVEL INTERUPTS ARE NOT GIVEN SINCE THEY ARE
|
||
; USED WITH DMA DEVICES (DISC, MOBY MAG TAPE, ETC.)
|
||
]
|
||
|
||
SUBTTL IMLAC OP CODES
|
||
; instructions
|
||
|
||
; operate instructions
|
||
|
||
; manipulative
|
||
HLT=000000 ; halt
|
||
OPR=100000 ; operate class
|
||
NOP=100000 ; no-operation
|
||
CLA=100001 ; clear ac
|
||
CMA=100002 ; complement ac
|
||
STA=100003 ; set ac to all ones
|
||
IAC=100004 ; increment ac
|
||
COA=100005 ; load ac with one
|
||
CIA=100006 ; complement and increment ac
|
||
CLL=100010 ; clear link
|
||
CAL=100011 ; clear ac and link
|
||
CML=100020 ; complement link
|
||
STL=100030 ; set link
|
||
ODA=100040 ; or data switches
|
||
LDA=100041 ; read data switches
|
||
|
||
; conditionals (skip if ...)
|
||
ASZ=002001 ; ac zero
|
||
ASN=102001 ; ac non-zero
|
||
ASP=002002 ; ac positive
|
||
ASM=102002 ; ac negative
|
||
LSZ=002004 ; link zero
|
||
LSN=102004 ; link non-zero
|
||
DSF=002010 ; display on
|
||
DSN=102010 ; display off
|
||
KSF=002020 ; keyboard has character
|
||
KSN=102020 ; keyboard doesn't have char
|
||
RSF=002040 ; tty has input
|
||
RSN=102040 ; tty has no input
|
||
TSF=002100 ; tty done sending
|
||
TSN=102100 ; tty not done sending
|
||
SSF=002200 ; 40 cyc sync on
|
||
SSN=102200 ; 40 cyc sync not on
|
||
HSF=002400 ; ptr has data
|
||
HSN=102400 ; ptr has no data
|
||
|
||
; shift and rotate
|
||
RAL=003000 ; rotate ac and link left
|
||
RAR=003020 ; rotate ac and link right
|
||
SAL=003040 ; shift ac and link left
|
||
SAR=003060 ; shift ac and link right
|
||
|
||
; AUGMENTED CONTROL TRANSFER (ACT) INSTRUCTIONS
|
||
; ACT-1 INSTRUCTIONS (SINGLE MEMORY CYCLE)
|
||
IFE PDS4, DON=003100 ; turn on display
|
||
IFN PDS4,[
|
||
SWAP=003000 ; SWAP HALVES OF AC
|
||
RDPC=003004 ; READ DP PC
|
||
RDAX=003005 ; READ DP X AC
|
||
RDAY=003006 ; READ DP Y AC
|
||
|
||
SBL=003010 ; SET BYTE LEFT
|
||
SBR=003011 ; SET BYTE RIGHT
|
||
|
||
TAC=003024 ; TEST AC (SINGLE OR DOUBLE SKIP)
|
||
DEA=003025 ; DECREMENT AC
|
||
DACS=003030 ; DEPOSIT AC INTO STACK PTR N
|
||
LACS=003032 ; LOAD STACK PTR N INTO AC
|
||
POPD=003050 ; POP D-STACK INTO DISPLAY PC
|
||
PUSHD=003051 ; PUSH DISPLAY PC ON D-STACK
|
||
LAMP=003052 ; GIVE 150 MS FLASH OF KEYBOARD LAMP
|
||
|
||
; ACT-2 INSTRUCTIONS (2 MEMORY CYCLES)
|
||
|
||
PUSH=103000 ; PUSH AC ONTO STACK N
|
||
PUSHA=103002 ; PUSH PC ONTO STACK N
|
||
POP=103004 ; POP STACK N INTO AC
|
||
POPA=103006 ; POP STACK N INTO PC
|
||
LIAC=103010 ; LOAD AC VIA ADDRESS IN AC
|
||
|
||
; EXACT INSTRUCTIONS (OP CODE = 101000) USED WITH EXT. DEVICES
|
||
]
|
||
|
||
; processor orders
|
||
LAW=004000 ; load ac with
|
||
LWC=104000 ; load ac with complement of
|
||
JMP=010000 ; jump to
|
||
SAD=014000 ; SKIP IF AC AND MEMORY DIFF.
|
||
DAC=020000 ; deposit ac in memory
|
||
XAM=024000 ; exchange ac and memory
|
||
ISZ=030000 ; increment and skip if zero
|
||
JMS=034000 ; jump to subroutine
|
||
DCM=040000 ; decrement memory
|
||
AND=044000 ; and ac with memory
|
||
IOR=050000 ; inclusive or ac with memory
|
||
XOR=054000 ; exclusive or ac with memory
|
||
LAC=060000 ; load ac from memory
|
||
ADD=064000 ; add memory to ac
|
||
SUB=070000 ; subtract memory from ac
|
||
SAM=074000 ; skip if ac and memory same
|
||
|
||
; INPUT-OUTPUT TRANSFER (iot) instructions
|
||
IOT=001000 ; iot
|
||
IFE PDS4,[
|
||
DLZ=001001 ; load dpc with zero
|
||
DLA=001003 ; load dpc with ac
|
||
]
|
||
.ELSE,[ DLA=001001 ; LOAD DPC WITH AC
|
||
DON=001002 ; TURN DP ON
|
||
DLN=001003 ; DLA & DON
|
||
]
|
||
TSC=001004 ; CLEAR TABLET STATUS
|
||
CTB=001011 ; clear tty break
|
||
DOF=001012 ; turn off display
|
||
CSC=001014 ; cassette skip clock
|
||
KRB=001021 ; keyboard read
|
||
KCF=001022 ; keyboard clear flag
|
||
KRC=001023 ; keyboard read and clear flag
|
||
CSD=001024 ; cassette skip data
|
||
RRB=001031 ; tty read
|
||
RCF=001032 ; clear tty read flag
|
||
RRC=001033 ; tty read and clear flag
|
||
CWB=001034 ; cassette write bit
|
||
TPR=001041 ; tty print
|
||
TCF=001042 ; clear tty flag
|
||
TPC=001043 ; tty print and clear
|
||
TSK=001044 ; TABLET SKIP
|
||
HRB=001051 ; read ptr
|
||
HOF=001052 ; turn off ptr
|
||
TRX=001054 ; READ TABLET X COORD.
|
||
HON=001061 ; turn on ptr
|
||
STB=001062 ; set tty break
|
||
TRY=001064 ; READ TABLET Y COORD.
|
||
SCF=001071 ; clear 40 cyc sync
|
||
IOS=001072 ; iot sync
|
||
TRZ=001074 ; READ TABLET Z COORD.
|
||
RDI=001101 ? RI1=RDI ; read interrupt status WORD #1
|
||
RI2=001102 ; READ INTERRUPT STATUS WORD #2
|
||
HCS=001104 ; START HARD COPY
|
||
MPS=001111 ; SET MEM. PROTECT BIT = AC(1)
|
||
MPC=001112 ; CLEAR MEM. PROTECT STATUS
|
||
ARM=001141 ? AR1=ARM ; arm interrupt WORD #1 PER AC
|
||
AR2=001142 ; ARM INTERRUPT WORD #2 PER AC
|
||
CON=001144 ; cassette on
|
||
COF=001154 ; cassette off
|
||
IOF=001161 ; turn off interrupt system (1)
|
||
ION=001162 ; turn on interrupt system (1)
|
||
LTF=001164 ; LOAD TRANS. FORMAT TO PSA
|
||
LSS=001261 ; LOAD XMIT SPEED INTO PSA
|
||
LSR=001262 ; LOAD REC. SPEED INTO PSA
|
||
PPC=001271 ; punch and clear punch flag
|
||
PSF=001274 ; skip if punch ready
|
||
DCF=001304 ? DHC=DCF ; clear display refresh flag (DHLT)
|
||
|
||
; special DMCG imlac installation iot's
|
||
|
||
IFN MOUSE,[
|
||
MRB=001701 ; or last mouse position into ac
|
||
MRC=001703 ; or mouse co-ordinates into ac
|
||
MCF=001702 ; make new reading of mouse position
|
||
MSW=001731 ; read mouse and keyset switches
|
||
]
|
||
|
||
IFE PDS4,BEL=001711 ; ring bell
|
||
.ELSE,BEL=001321
|
||
|
||
|
||
|
||
SUBTTL IMLAC DISPLAY PROCESSOR OPCODES AND GRAPHICS MACROS
|
||
; display instructions
|
||
|
||
DHLT=000000 ; halt display
|
||
DHVH=002000 ; high voltage sync halt
|
||
DOPR=004000 ; display operate class
|
||
DNOP=004000 ; display no operation
|
||
DADR=004001 ; enter 8k display address mode
|
||
DDSP=004020 ; display single point
|
||
DRJM=004040 ; return from display subroutine
|
||
DDYM=004100 ; decrement y msb
|
||
DDXM=004200 ; decrement x msb
|
||
DIYM=004400 ; increment y msb
|
||
DIXM=005000 ; increment x msb
|
||
DHVC=006000 ; high voltage sync
|
||
DHVS=006004 ; combination of DHVC and DSTS
|
||
|
||
DEIM=030000 ; enter increment mode
|
||
|
||
.DSTS==4004 ; SET SCALE
|
||
.DSTB==4010 ; SET BLOCK
|
||
.DLXA==010000 ; load x ac
|
||
.DLYA==020000 ; load y ac
|
||
.DJMS==050000 ; display subroutine jump
|
||
.DJMP==060000 ; display jump
|
||
|
||
IRP .DOP,,[DLXA,DLYA,DJMS,DJMP]
|
||
DEFINE .DOP (.DARG)
|
||
.!.DOP!\<<.DARG>&7777>\<<<.DARG>_3>&100000&<<.ADDR.>_15.>> TERMIN
|
||
TERMIN
|
||
|
||
DVIC=077720 ; DISPLAY VARIABLE INTENSITY
|
||
; MAX INTENSITY = 17 = 15.
|
||
|
||
; suppressed grid
|
||
DSGR=077770
|
||
DGR=077770 ; suppressed grid
|
||
DGX=077770 ; exit from suppressed grid mode
|
||
DGD=077771 ; suppressed grid dim
|
||
DGDR=077773 ; suppressed grid dim and return
|
||
DGB=077775 ; suppressed grid bright
|
||
DGBR=077777 ; suppressed grid bright and return
|
||
|
||
; DISPLAY SET SCALE AND SET BLOCK MACROS
|
||
|
||
IRP .DOP,,[DSTS,DSTB]
|
||
DEFINE .DOP (ARG)
|
||
..DST==.!.DOP!\<<ARG>&3> ? IFG <ARG>-3,[..DST==..DST\2000] ? ..DST TERMIN
|
||
TERMIN
|
||
|
||
|
||
; special hacks for SVM (INC) mode bytes
|
||
|
||
INC==0 ;DUMMY FOR OP CODE FIELD
|
||
E==60 ; ENTER SVM
|
||
N==111 ; ESCAPE SVM, SET X AND Y LSB'S -> 0
|
||
X=140 ; EXIT SVM, RJMP
|
||
R==151 ; X, ALSO X LSB -> 0
|
||
F==171 ; R, ALSO INCR. X MSB
|
||
P==200 ; SVM NOP
|
||
T==100 ; ESCAPE SVM
|
||
|
||
;DEFINE SYMBOLS LIKE B3M2==336
|
||
|
||
IRPC BD,,[BD]H,,[32]
|
||
IRP XINC,,[0,1,2,3,M1,M2,M3]TINC,,[0,1,2,3,5,6,7]
|
||
IRP YINC,,[0,1,2,3,M1,M2,M3]UINC,,[0,1,2,3,5,6,7]
|
||
BD!!XINC!!YINC==H!!TINC!!UINC
|
||
TERMIN
|
||
TERMIN
|
||
TERMIN
|
||
;DISPLAY VECTOR MACROS FOR THE PDS-4
|
||
|
||
IFN PDS4,[
|
||
|
||
;LONG VECTOR TYPE BIT CODES
|
||
|
||
B==1 ? D==0 ;BEAM ON OR "DIM"=OFF
|
||
DOT==2 ;DOTTED LINE
|
||
DASH==4
|
||
DD==DOT\DASH ;DOTTED & DASHED LINE
|
||
.DLV==40000 ;DISPLAY LONG VECTOR OP CODE
|
||
LVSIGN==2000 ;LONG VECTOR SIGN BIT
|
||
LVYGTX==4000 ;LONG VECTOR Y > X BIT
|
||
|
||
;DISPLAY LONG VECTOR MACRO
|
||
|
||
DEFINE DLV TYPE,XARG,YARG
|
||
IRP C,,[X,Y]ARG,,[XARG,YARG]
|
||
IFL ARG,[ ..M!C==-ARG&1777
|
||
..S!C==LVSIGN]
|
||
.ELSE [ ..M!C==ARG&1777
|
||
..S!C==0]
|
||
TERMIN
|
||
IFL ..MX-..MY,[
|
||
.DLV\..SY\..MY
|
||
<TYPE_12.>\LVYGTX\..SX\..MX]
|
||
.ELSE [ .DLV\..SX\..MX
|
||
..TEMP==<TYPE_12.>\..SY\..MY
|
||
IFE ..TEMP,[LVSIGN]
|
||
.ELSE [..TEMP]]
|
||
TERMIN
|
||
|
||
;DISPLAY LONG VECTOR & RETURN JUMP
|
||
;(JUST TURNS ON R BIT IN 2ND WORD OF INSTRUCTION)
|
||
|
||
DEFINE DLVR TYPE,XARG,YARG
|
||
DLV <TYPE+10>,XARG,YARG
|
||
TERMIN
|
||
|
||
; MEDIUM VECTOR MODE MACROS
|
||
|
||
.MVM==44000 ;ENTER MED. VECTOR MODE OP CODE
|
||
MVYGTX==200 ;MED. VECTOR Y > X BIT
|
||
MVSIGN==100 ;MED. VECTOR SIGN BIT
|
||
|
||
;ENTER MEDIUM VECTOR MODE
|
||
|
||
DEFINE MVM TYPE,SCALE
|
||
.MVM\<TYPE_4>\SCALE
|
||
TERMIN
|
||
|
||
;MEDIUM VECTOR BYTE DESCRIPTOR
|
||
;EXIT NONNULL INDICATES EXIT FROM MED. VECTOR MODE
|
||
|
||
DEFINE MV XARG,YARG,EXIT
|
||
IFSN EXIT,,XIT==100000 ? .ELSE XIT==0
|
||
IRP C,,[X,Y]ARG,,[XARG,YARG]
|
||
IFL ARG,[ ..M!C==-ARG&77
|
||
..S!C==MVSIGN]
|
||
.ELSE [ ..M!C==ARG&77
|
||
..S!C==0]
|
||
TERMIN
|
||
IFL ..MX-..MY,XIT\<<..SY\..MY>_8.>\MVYGTX\..SX\..MX
|
||
.ELSE XIT\<<..SX\..MX>_8.>\..SY\..MY
|
||
TERMIN
|
||
|
||
;DISPLAY ADD RELATIVE MACROS (DARX, DARY)
|
||
|
||
.DAR==076000 ;DISPLAY ADD RELATIVE OP CODE
|
||
|
||
IRP C,,[X,Y]N,,[0,400]
|
||
DEFINE DAR!C DIST
|
||
IFL DIST,[..SDIST==200 ? ..DIST==-DIST&177]
|
||
.ELSE [..SDIST==0 ? ..DIST==DIST&177]
|
||
.DAR\N\..SDIST\..DIST
|
||
TERMIN
|
||
TERMIN
|
||
|
||
;OTHER DISPLAY OP CODES FOR THE PDS-4
|
||
|
||
.DCAM=077621 ;DISPLAY ENTER COMPACT ADDRESS MODE
|
||
; BASE IS ADDRESS OF DISPATCH TABLE FOR DCAM
|
||
DEFINE DCAM BASE
|
||
.DCAM
|
||
BASE&MAXADR
|
||
TERMIN
|
||
|
||
DBLI=077622 ;DISPLAY BLINK, CALL WITH ARG "B" FOR BLINK
|
||
DROR=077640 ;DISPLAY ROTATE/REFLECT CHAR
|
||
DROT=077640 ; DISPLAY ROTATE (NO REFLECTION)
|
||
DROF=077642 ; DISPLAY ROTATE AND REFLECT
|
||
ROR=10 ; ROT 90 DEG. RIGHT
|
||
ROL=4 ; ROT 90 DEG. LEFT
|
||
ROZ=0 ; RESET ROT TO 0 DEG.
|
||
RON=14 ; NO ROTATION CHANGE
|
||
;E.G. DROF ROR ;ROTATE RIGHT 90 DEG. AND REFLECT ABOUT Y AXIS
|
||
|
||
; SUPPRESSED GRID AUTO INCREMENT MODE MACRO
|
||
|
||
.DASG=077660 ; OP CODE
|
||
|
||
IRP .DOP,,[DASG,DASGN]N,,[10,0]
|
||
DEFINE .DOP DIST
|
||
IFL DIST,[..SDIST==4 ? ..DIST==-DIST&3]
|
||
.ELSE [..SDIST==0 ? ..DIST=DIST&3]
|
||
.DASG\N\..SDIST\..DIST
|
||
TERMIN
|
||
TERMIN
|
||
|
||
; POINT PLOT MODE OPTION
|
||
|
||
EPPM=016000 ; ENTER POINT PLOT MODE
|
||
PPM==0 ; POINT PLOT BYTE
|
||
XIT==115
|
||
D0==200
|
||
D1==201
|
||
D2==202
|
||
D3==203
|
||
B0==330
|
||
B1==331
|
||
B2==332
|
||
B3==333
|
||
|
||
DEFINE PPMSTR
|
||
INC E,P
|
||
INC P,115
|
||
TERMIN
|
||
|
||
DEFINE PPMCR
|
||
PPM D0,XIT
|
||
INC P,P
|
||
INC DM31,114
|
||
TERMIN
|
||
|
||
DEFINE PPMXIT
|
||
PPM D0,XIT
|
||
INC D0M3,D0M3
|
||
INC D0M3,D0M3
|
||
INC D0M3,D0M1
|
||
INC F,P
|
||
TERMIN
|
||
]
|
||
; long vector mode macro FOR THE PDS-1
|
||
|
||
IFE PDS4,[
|
||
; DLV B|D|X,<x-increment>,<y-increment>
|
||
|
||
; where B -> bright beam
|
||
; D -> dim beam (beam off)
|
||
; X -> dotted beam (dotted line)
|
||
|
||
; and where x and y are < 10000
|
||
|
||
DEFINE DLV BXD,XX,YY
|
||
|
||
..MX=XX
|
||
..MY=YY
|
||
W2=0
|
||
W3=0
|
||
|
||
IFSE BXD,B,[W2=2_12.]
|
||
IFSE BXD,X,[W2=6_12.]
|
||
|
||
IFL ..MX,[
|
||
..MX=-..MX
|
||
W3=W3\<4_12.>]
|
||
|
||
IFL ..MY,[
|
||
..MY=-..MY
|
||
W3=W3\<2_12.>]
|
||
|
||
..DXY=..MX-..MY
|
||
|
||
IFL ..DXY,[
|
||
W3=W3\<1_12.>
|
||
|
||
<4_12.>\<7777&..DXY>
|
||
<W2\<7777&..MY>>
|
||
<W3\<7777&..MX>>]
|
||
|
||
IFGE ..DXY,[
|
||
..DXY=-..DXY
|
||
<<4_12.>\<7777&..DXY>>
|
||
<W2\<7777&..MX>>
|
||
<W3\<7777&..MY>>]
|
||
|
||
TERMIN
|
||
]
|
||
|
||
SUBTTL MISC MACROS
|
||
; IMASCI [This is a string.]
|
||
; produces 9 imlac words
|
||
; each word:
|
||
; |0xxxxxxx|0xxxxxxx|
|
||
; so each character is actually 8-bits.
|
||
; It ends with a word whose second char is 0 or a full word of 0
|
||
|
||
DEFINE IMASCI STG
|
||
|
||
CNT1=0 ; temporaries
|
||
CCNT==0
|
||
CWRD==0
|
||
|
||
; loop through characters in string
|
||
IRPC C,,[STG]
|
||
IFE CNT1,[
|
||
CWRD=="C_8. ; first character left shifts 8 bits
|
||
CCNT==1]
|
||
IFN CNT1,[
|
||
CWRD\"C ; second character ORed in left shifted 1 bit
|
||
CCNT==0]
|
||
CNT1==CCNT
|
||
TERMIN
|
||
|
||
IFE CCNT,0 ; if last word has two chars, make 0 word
|
||
IFN CCNT,CWRD ; if last word has character, put it out
|
||
|
||
TERMIN
|
||
|
||
; DTXT macro
|
||
; creates subroutine calls to subroutines with
|
||
; standard names Dxxx where xxx is ascii code of letter
|
||
DEFINE ASCJMS ASC,\L
|
||
L=.LENGTH /ASC/
|
||
IFE <L-1>, DJMS D00!ASC
|
||
IFE <L-2>, DJMS D0!ASC
|
||
IFE <L-3>, DJMS D!ASC
|
||
TERMIN
|
||
|
||
DEFINE DTXT QQ
|
||
IRPC Q,,[QQ]
|
||
ASCJMS \"Q
|
||
TERMIN
|
||
; END OF DTXT MACRO
|
||
TERMIN
|
||
|
||
; DNAME macro. Equivalent to DTXT of FNAM1.FNAM2
|
||
|
||
DEFINE DNAME
|
||
DSIXBT .FNAM1
|
||
DTXT [.]
|
||
DSIXBT .FNAM2
|
||
; END OF DNAME MACRO
|
||
TERMIN
|
||
|
||
DEFINE DSIXBT ..VER
|
||
IRP ..SFT,,[-30.,-24.,-18.,-12.,-6,0]
|
||
Q=40+<..VER_..SFT>&77
|
||
IFN <Q-40>, ASCJMS \Q
|
||
TERMIN
|
||
TERMIN
|
||
|
||
; CALL macro
|
||
DEFINE CALL ROUT,ARGS
|
||
JMS ROUT
|
||
IRP ARG,,[ARGS]
|
||
ARG
|
||
TERMIN
|
||
; END OF CALL MACRO
|
||
TERMIN
|
||
|
||
; "END OF IMDEFS"
|
||
.LSTON |