1
0
mirror of https://github.com/PDP-10/its.git synced 2026-03-28 19:02:00 +00:00
Files
PDP-10.its/src/imsrc/imdefs.40
Lars Brinkhoff 8c9f4c3c3c Add IMDEFS for assembling Imlac programs.
This is .INSRTed in Imlac assembly language source files to
reconfigure MIDAS for use as an Imlac assembler.
2018-07-02 10:20:51 +02:00

610 lines
14 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.
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