diff --git a/Makefile b/Makefile index 6a25985b..01f5f467 100644 --- a/Makefile +++ b/Makefile @@ -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 \ diff --git a/src/imsrc/imdefs.40 b/src/imsrc/imdefs.40 new file mode 100644 index 00000000..b9e9a949 --- /dev/null +++ b/src/imsrc/imdefs.40 @@ -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!\<&3> ? IFG -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 + \LVYGTX\..SX\..MX] +.ELSE [ .DLV\..SX\..MX + ..TEMP==\..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 ,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\\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,, + +; 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> + > + >] + + IFGE ..DXY,[ + ..DXY=-..DXY + <<4_12.>\<7777&..DXY>> + > + >] + +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 , DJMS D00!ASC + IFE , DJMS D0!ASC + IFE , 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 , 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 \ No newline at end of file