1
0
mirror of https://github.com/PDP-10/its.git synced 2026-02-13 11:34:04 +00:00

Add IMDEFS for assembling Imlac programs.

This is .INSRTed in Imlac assembly language source files to
reconfigure MIDAS for use as an Imlac assembler.
This commit is contained in:
Lars Brinkhoff
2018-06-30 21:26:21 +02:00
parent 71675f0b9a
commit 8c9f4c3c3c
2 changed files with 611 additions and 1 deletions

View File

@@ -10,7 +10,7 @@ SRC = system syseng sysen1 sysen2 sysen3 sysnet kshack dragon channa \
spcwar rwg libmax rat z emaxim rz maxtul aljabr cffk das ell ellen \
jim jm jpg macrak maxdoc maxsrc mrg munfas paulw reh rlb rlb% share \
tensor transl wgd zz graphs lmlib pratt quux scheme gsb ejs mudsys \
draw wl taa tj6 budd sharem ucode rvb kldcp math as
draw wl taa tj6 budd sharem ucode rvb kldcp math as imsrc
DOC = info _info_ sysdoc sysnet syshst kshack _teco_ emacs emacs1 c kcc \
chprog sail draw wl pc tj6 share _glpr_ _xgpr_ inquir mudman system \
xfont maxout ucode moon acount alan channa fonts games graphs humor \

610
src/imsrc/imdefs.40 Normal file
View File

@@ -0,0 +1,610 @@
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