mirror of
https://github.com/PDP-10/its.git
synced 2026-03-07 19:40:48 +00:00
4144 lines
91 KiB
Plaintext
Executable File
4144 lines
91 KiB
Plaintext
Executable File
;-*-MIDAS-*-
|
||
TITLE Carpet and Hali
|
||
|
||
Ifndef Halip, Halip==0 ;Hali is Carpet over a TTY line.
|
||
Define Haly
|
||
ifn Halip,termin
|
||
Define Haln
|
||
ife Halip,termin
|
||
|
||
IFNDEF 45P,45P==0 ;1 FOR 11-45 MAP SIMULATION.
|
||
DEFINE 45Y
|
||
IFN 45P,TERMIN
|
||
DEFINE 45N
|
||
IFE 45P,TERMIN
|
||
|
||
;DEFINE ACCUMULATORS
|
||
|
||
A=1
|
||
B=2
|
||
C=3
|
||
D=4
|
||
SF=5
|
||
DO=6 ;IF POSITIVE, VIRT. ADDRESS OF OPEN LOC.
|
||
DL=7 ;HOLDS %Q OR ARG.
|
||
T0=10 ;HOLDS LAST CHAR, EXCEPT IN INSN PRINTING.
|
||
T1=11 ;TEMP FOR INST HANDLERS
|
||
T2=12 ;USED BY ADDRESS COMPUTATION RTNS.
|
||
T3=13
|
||
DLEN=14 ;HOLDS LENGTH OF %Q OR ARG IN WORDS.
|
||
T5=15 ;EXTREMELY TEMPORARY.
|
||
T6=16 ; " " " " .
|
||
P=17
|
||
|
||
.XCREF A,B,C,P ;While hacking Hali, want full cref.
|
||
|
||
45Y 45STTM==144000 ;MASK OF MODE AND REG SET.
|
||
45Y 45CMOD==160200 ;BP TO CURRENT MODE
|
||
45Y 45MODM==140000 ;MASK OF CURRENT MODE
|
||
45Y 45PMOD==140200 ;BP TO PREVIOUS MODE.
|
||
45Y 45REGB==4000 ;REGISTER SET SPECIFIER BIT
|
||
PRI==50300 ;PRIORITY (BYTE POINTER)
|
||
TF==20
|
||
NF==10
|
||
ZF==4
|
||
VF==2
|
||
CF==1
|
||
|
||
;I/O CHANNELS
|
||
|
||
TYIC==1
|
||
TYOC==2
|
||
LOADCH==3
|
||
LPTC==4
|
||
UTIC==5
|
||
DMPCH==6
|
||
Haly Httyoc==7 ;Channels for communicating with Hali 11
|
||
Haly Httyic==10
|
||
ERRC==11
|
||
|
||
IF1 EXPUNGE %GO ;BIT TYPEOUT MASK FOR GRAPHICS OPS! WE DON'T NEED IT.
|
||
|
||
;MISCELLANEOUS CONSTANTS
|
||
|
||
MAPMSK==574377776000 ;$<MAPMSK>T; IN DDT TYPES OUT 10-11 INTERFACE MAP ENTRY
|
||
Haln DFLT11==1 ;DEFAULT PDP-11
|
||
NBPTS==7 ;NUMBER OF BREAK POINTS
|
||
SNB==400000 ;SIGN BIT
|
||
Haly Haltty==44 ;Default Hali TTY
|
||
|
||
if1 .kill %pc ;I hate to do this... ? suffers.
|
||
if1 .bind %pc ;Will this work?
|
||
;UUO DEFINITIONS
|
||
|
||
SYMTYP=1000,,
|
||
ADRTYP=2000,,
|
||
OPENL=3000,,
|
||
6TYPE=4000,,
|
||
BLKFLS=5000,,
|
||
TTOI=6000,,
|
||
TTOA=7000,, ;ASCIZ STRING TYPEOUT
|
||
ERROR=10000,,
|
||
11PUT=11000,,0
|
||
11GET=12000,,0
|
||
11send=13000,,
|
||
11receive=14000,,
|
||
UUOMAX==14
|
||
|
||
;SOME DEFINITIONS TO MAKE THE CODE OBSCURE
|
||
|
||
ARGERR=ERROR [ASCIZ/ARG/]
|
||
CALL=PUSHJ P,
|
||
RETURN==POPJ P,
|
||
RET=RETURN
|
||
SAVE=PUSH P,
|
||
REST=POP P,
|
||
CRF=TTOA [ASCIZ /
|
||
/]
|
||
|
||
.XCREF CALL,RET,RETURN
|
||
|
||
TRPPTL==100 ;-1)*4=MAX TRAP FOR TRAP PRINT VECTOR
|
||
PDLSIZ==200 ;PDL SIZE
|
||
|
||
45Y SEGBP==140300 ;BP TO SEGMENT # FIELD IN WORD #.
|
||
|
||
IF1 EXPUNGE APR
|
||
|
||
;MEMORY ALLOCATION
|
||
|
||
;0 START OF SIMULATOR, ENDS WITH SYM TAB THAT EXPANDS UPWARD
|
||
Haln PDP11=300000 ;SIMULATED PDP11 MEMORY 1 WORD/WORD
|
||
|
||
45N MAXK==28.
|
||
45N MAXCOR==100000
|
||
45N MAXBYT==200000
|
||
45Y MAXK==124.
|
||
45Y MAXCOR==400000
|
||
45Y MAXBYT==1,,
|
||
|
||
;SYMBOL CONVENTIONS
|
||
|
||
;C!COM: ROUTINE FOR : COMMAND COM
|
||
;CS!COM: ROUTINE FOR ; COMMAND COM
|
||
;5/29/73 PROGRAMMING THE PDP-10 TO PDP-11 INTERFACE
|
||
|
||
COMMENT $
|
||
|
||
THE INTERFACE LETS THE PDP-10 PROGRAMMER DIRECTLY ACCESS THE MEMORIES
|
||
OF UP TO EIGHT PDP-11'S. PDP-10 PAGES ARE MAPPED INTO SEGMENTS OF
|
||
VARIABLE SIZE IN THE PDP-11'S MEMORY. THE PDP-10 PAGE MAP IS ALSO
|
||
DIRECTLY ADDRESSABLE IN MEMORY (IT CURRENTLY LIVES IN LOCATIONS
|
||
776000-776377)**. THERE IS ONE ENTRY IN THE MAP FOR EACH PDP-10 PAGE.
|
||
** SEE ALSO BELOW
|
||
|
||
PAGE TABLE ENTRY:
|
||
4.9 VALID
|
||
4.8 WRITE ENABLE
|
||
4.3-4.7 (5 BITS) NOT USED (0)
|
||
3.9-4.2 (3 BITS) PDP-11 NUMBER
|
||
2.2-3.8 (16 BITS) RELOCATION
|
||
ORIGIN OF SEGMENT OF IN PDP-11 ADDRESS SPACE
|
||
PDP-11 ADDRESS=4*RELOCATION
|
||
1.1-2.1 (10 BITS) PROTECTION (PDP-11 PROTECTION=4*PROTECTION
|
||
IF PROTECTION=0 THEN ONLY ONE 16 BIT WORD IS ACCESSIBLE)
|
||
|
||
|
|
||
|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|
|
||
0 1 2 7 10 26 |
|
||
|1|1| 5 | 3 | 16 | 10 |
|
||
|_|_|_________|_____|_______________________________|___________________|
|
||
| | | | | |
|
||
| | | | | |----------->protection
|
||
| | | | |
|
||
| | | | |------------------------------------->relocation
|
||
| | | |
|
||
| | | |-------------------------------------------------------->PDP-11 #
|
||
| | |
|
||
| | |---------------------------------------------------------------->not used
|
||
| |
|
||
| |---------------------------------------------------------------------->write enable
|
||
|
|
||
|------------------------------------------------------------------------>entry valid
|
||
; PDP-10/PDP-11 INTERFACE CONTINUED
|
||
|
||
WRITE REFERENCE FORMAT:
|
||
3.3-4.9 (16 BITS) WORD 0, LOW ORDER WORD
|
||
1.5-3.2 (16 BITS) WORD 1, HIGH ORDER WORD
|
||
1.4 DON'T WRITE WORD 0
|
||
1.3 DON'T WRITE WORD 1
|
||
1.1-1.2 (2 BITS) NOT USED
|
||
|
||
|
|
||
|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|
|
||
0 16 323334 |
|
||
| 16 | 16 |1|1| 2 |
|
||
|_______________________________|_______________________________|_|_|___|
|
||
| | | | |
|
||
| | | | |--->not used
|
||
| | | |
|
||
| | | |------>inhibit odd
|
||
| | |
|
||
| | |-------->inhibit even
|
||
| |
|
||
| |------------------------->odd word
|
||
|
|
||
|--------------------------------------------------------->even word
|
||
|
||
READ REFERENCE FORMAT:
|
||
3.3-4.9 (16 BITS) WORD 0, LOW ORDER WORD
|
||
1.5-3.2 (16 BITS) WORD 1, HIGH ORDER WORD
|
||
1.1-1.4 (4 BITS) 0
|
||
|
||
|
|
||
|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|
|
||
0 16 32 |
|
||
| 16 | 16 | 4 |
|
||
|_______________________________|_______________________________|_______|
|
||
| | |
|
||
| | |----->0
|
||
| |
|
||
| |------------------------->odd word
|
||
|
|
||
|--------------------------------------------------------->even word
|
||
|
||
NOTE -- SPLIT CYCLES WILL DO THE RIGHT THING; HENCE, ILDB AND IDPB WORK.
|
||
CAUTION -- WHEN USING BYTE INSTRUCTIONS, A 16 BIT BYTE SIZE IS
|
||
RECCOMMENDED. SUCCESSIVE INCREMENTS OF BYTE POINTERS WITH AN 8 BIT BYTE
|
||
SIZE DO NOT ADDRESS CONSECUTIVE BYTES IN THE PDP-11!
|
||
|
||
ITS SYSTEM CALL TO PUT 11 MAP ENTRY IN YOUR 10 MAP:
|
||
.CALL [SETZ
|
||
SIXBIT /T11MP/
|
||
10PGNO ;PTR TO 10 PG NO
|
||
SETZ PGENT] ;PTR TO ENTRY (FORMAT ABOVE)
|
||
10PGNO: PDP-10 PAGE #
|
||
PGENT: <<ACCESS>_34.>+<<PDP-11 #>_26.>+<<PDP-11 ADDRESS/4>_10.>+<<SEGMENT SIZE (BYTES>/4>
|
||
FOR ABOVE 10 ADDRESSES 6000-7777 ARE MAPPED INTO
|
||
11 ADDRESSES 10000-17776. BOTH READ AND WRITE ARE ENABLED.
|
||
$
|
||
|
||
COMMENT $
|
||
|
||
How Hali works.
|
||
|
||
The PDP-11 is connected to the PDP-10 by a TTY line. On this TTY line, Hali
|
||
reads and writes using the formats described below. The TTY line is assumed
|
||
dedicated to operating Hali: in Building 38, we have a multiplexed TTY arrangement,
|
||
so this does not mean running many lines to the 11. Since the TTY is
|
||
dedicated, no escape sequence is defined. If it is desired to run Hali
|
||
on a non-dedicated TTY line, insert code (conditionalized) at ????.
|
||
|
||
A full word on the 11 is 16 bits. The 10 can send 8-bit chunks, but
|
||
can only receive 7 bits at a time. This is a pain. In any case,
|
||
words are send as two 8-bit bytes, low byte first, but must be
|
||
received as three bytes, the first five bits, the second five bits,
|
||
and the last six bits (is this random enough?).
|
||
|
||
|
||
Commands to 11: (* means not implemented on 11 or Hali end)
|
||
|
||
Read
|
||
Send: 1 address
|
||
Reply: c(address)
|
||
|
||
Write
|
||
Send: 2 address <what to write>
|
||
Reply: <old contents>
|
||
|
||
Ifset* ;Useful?
|
||
Send: 3 address <what to write>
|
||
<what was expected to be there before writing>
|
||
Reply: <0 if not executed; 1 if executed> <old contents>
|
||
|
||
Stop*
|
||
Send: 4
|
||
Reply: <PC stopped at>
|
||
Effect: listens only to this line; turns off interrupts
|
||
|
||
Continue*
|
||
Send: 5
|
||
Effect: undoes Stop
|
||
|
||
Single step*
|
||
Send: 6
|
||
Effect: ^N
|
||
|
||
Dump registers (i.e. get from 11)*
|
||
Send: 7
|
||
Reply: <c(reg) for each register, including %ps, i.e. 0,...7,%ps>
|
||
|
||
Load registers (i.e. send to 11)*
|
||
Send: 10 then c(reg) for each register, as above. PC, SP, and PS are saved.
|
||
Effect: Tells 11 what registers should be when it continues or one-proceeds.
|
||
$
|
||
define Byteo
|
||
.iot Httyoc,[%tdqot] ;Quote possible 200-characters
|
||
.iot Httyoc,termin
|
||
|
||
define Bytei
|
||
.iot Httyic,termin
|
||
|
||
hl.read==201
|
||
hl.write==202
|
||
hl.ifset==203
|
||
hl.stop==204
|
||
hl.continue==205
|
||
hl.sstep==206
|
||
hl.dmpreg==207
|
||
hl.ldreg==210
|
||
|
||
Comment $
|
||
11 to Hali
|
||
|
||
The 11 may say to Hali:
|
||
|
||
I hit a breakpoint
|
||
|
||
Some sort of error happened
|
||
|
||
$
|
||
|
||
ABEG: LOC 41
|
||
JSR UUOH
|
||
JSR TSINT
|
||
|
||
DEFINE CONC A,B
|
||
A!B!TERMIN
|
||
|
||
DEFINE TSOPEN A,B
|
||
.OPEN A,B
|
||
OPENL B
|
||
TERMIN
|
||
|
||
DEFINE SYSCAL A,B
|
||
.CALL [SETZ ? SIXBIT/A/ ? B ((SETZ))]
|
||
.VALUE
|
||
TERMIN
|
||
|
||
DEFINE SYSCL A,B
|
||
.CALL [SETZ ? SIXBIT/A/ ? B ((SETZ))]
|
||
TERMIN
|
||
|
||
DEFINE INSIRP A,B
|
||
IRPS INSIR1,,[B]
|
||
A,INSIR1
|
||
TERMIN TERMIN
|
||
|
||
IOCNUM==0 ;GET CONTROL ON IOC ERRORS
|
||
DEFINE IOCGET X
|
||
IF2 [IOCLOC==.
|
||
LOC IOCTAB+IOCNUM
|
||
IOCLOC
|
||
X
|
||
LOC IOCLOC]
|
||
IOCNUM==IOCNUM+2
|
||
TERMIN
|
||
|
||
DEFINE CSLWRD A
|
||
JSP D, CSLR!A
|
||
TERMIN ;LOAD 1 WORD FROM LOADCH INTO A (T2, T3, T5).
|
||
|
||
Define Upper x
|
||
cain x,177 ;Don't want to affect rubout
|
||
jrst .+3
|
||
trne x,100 ;Change character to upper case
|
||
trz x,40
|
||
termin
|
||
|
||
LOC ABEG
|
||
|
||
BEG: SETZM DDTPDP ;DDTPDP=0 MEANS NORMAL NOT IN DDT
|
||
;DDTPDP>0 NOT IN DDT BUT FAKE OUT MTRAP ETC.
|
||
;DDTPDP<0 IN DDT (SAVE PDL PNT HAS NEG COUNT IN LH)
|
||
SETOM DINITF ;WILL BE 1ST CALL TO DDT SOON.
|
||
MOVE P,[-PDLSIZ,,PDL]
|
||
SKIPN XUNAME
|
||
.SUSET [.Rxuname,,XUNAME]
|
||
SETZM LPTFLG
|
||
PUSHJ P,MERRV
|
||
.OPEN TYOC,TYOF
|
||
.VALUE ;IF NO TYPEOUT.
|
||
MOVE A, [-BSUSL,,BSUST]
|
||
.SUSET A ;SET UP INTERRUPTS
|
||
.OPEN TYIC,TYIF
|
||
TTOA [ASCIZ /
|
||
TYPE IN FAILS/]
|
||
.STATUS TYIC,A
|
||
ANDI A,77
|
||
CAIN A,2
|
||
SETOM GETTY ;SET GETTY TO -1 IF GRAPHICS TTY.
|
||
.CALL TTYGT
|
||
.VALUE
|
||
TLZ A,2000
|
||
MOVEM A,TTYM1A ;SET UP ORDINARY TTYSET,
|
||
TLO A,2000
|
||
MOVEM A,TTYMAA ;ACTIVATE-ON-NEXT-CHAR TTYSET.
|
||
Haln 6TYPE [.FNAM1/]
|
||
Haly 6type [sixbit /hali/]
|
||
TTOA [ASCIZ / /]
|
||
6TYPE [.FNAM2]
|
||
Haln MOVEI A,DFLT11 ;# OF DEFAULT PDP11
|
||
Haln PUSHJ P,GET11P ;GET 11 PAGES INTO MAP
|
||
Haly movei a,Haltty
|
||
Haly pushj p,Httyopen ;Open Hali TTY
|
||
45Y CALL AI45
|
||
CRF
|
||
.OPEN UTIC,INITFI ;Init file on default directory?
|
||
CAIA
|
||
JRST DOINIT
|
||
.CALL [ SETZ ;How about on Xuname directory?
|
||
SIXBIT /OPEN/
|
||
1000,,UTIC
|
||
[SIXBIT /DSK/]
|
||
XUNAME
|
||
Haln [SIXBIT /.CARP./]
|
||
Haly [sixbit /.HALI./] ;Who knows? Maybe someone wants both.
|
||
SETZ [SIXBIT /(INIT)/]]
|
||
JRST BEG2
|
||
DOINIT: TTOA [ASCIZ /INIT
|
||
!/]
|
||
SETOM FILINF
|
||
JRST DDT
|
||
|
||
BEG2: TTOI "!
|
||
JRST DDT
|
||
|
||
INITFI: Haln SIXBIT / DSK.CARP.(INIT)/
|
||
Haly Sixbit / dsk.hali.(init)/
|
||
FILINF: 0
|
||
|
||
Haln[ ;non-Hali only.
|
||
|
||
;GETS 11 PAGES INTO MAP
|
||
;CALL WITH # OF PDP11 IN A
|
||
|
||
GET11P: MOVEM A,CUR11 ;SAVE 11#
|
||
LSH A,26. ;MOVE # TO CORRECT FIELD
|
||
MOVE C,A
|
||
PUSH P,A
|
||
MOVEI A,<PDP11_-10.> ;PAGE # OF ORIGIN OF PDP-11 MEMORY
|
||
MOVEI B,16 ;# PAGES TO 28K PDP-11 WORDS
|
||
MOVEM B,KCOUNT
|
||
ADD C,[<3_34.>\1777]
|
||
PUSHJ P,G11P1
|
||
MOVEI A,<<760000_-2>+PDP11>_-10.
|
||
MOVEI B,2 ;GET 4K PDP-11 WORDS FOR IO REGISTERS
|
||
POP P,C ;111 #
|
||
ADD C,[<3_34.>\<<760000_-2>_10.>\1777]
|
||
G11P1: .CALL [ SETZ
|
||
SIXBIT /T11MP/
|
||
A
|
||
SETZ C]
|
||
.VALUE
|
||
ADD C,[2000_10.]
|
||
ADDI A,1
|
||
SOJG B,G11P1
|
||
POPJ P,
|
||
] ;end Haln
|
||
|
||
CUR11: 0 ;# OF CURRENT PDP11
|
||
|
||
Haly[ ;for Hali
|
||
|
||
;; Opens Hali TTY
|
||
|
||
Httyopen: movem a,cur11 ;Which TTY?
|
||
skipe debugp
|
||
jrst dbgtty
|
||
idivi a,8. ;Convert to Sixbit
|
||
addi a,'0
|
||
lsh a,6
|
||
addi a,(b)'0 ;Now have Sixbit in A
|
||
addi a,<'T>_12. ;Txx
|
||
hrli a,.uii ;image input
|
||
.open Httyic,a
|
||
.value [asciz /:Can't open Hali TTY for input./]
|
||
hrli a,%tjsio+.uio ;Now for output TTY, also superimage
|
||
.open Httyoc,a
|
||
.value [asciz /:Can't open Hali TTY for output./]
|
||
popj p,
|
||
|
||
dbgtty: .open Httyic,[ .uii,,'clo ? 'debugg ? 'haliii]
|
||
.value
|
||
.open Httyoc,[ .uio,,'clo ? 'debugg ? 'halioo]
|
||
.value
|
||
popj p,
|
||
|
||
] ;end of Haly
|
||
|
||
CPPRI: TLNN SF,NUMFND ;SELECT PROCESSOR LEVEL USED BY BPT S, ETC
|
||
JRST CPPRI1 ;TYPE CURRENT
|
||
MOVEM T5,BPTLVL
|
||
POPJ P,
|
||
|
||
CPPRI1: MOVE B,BPTLVL
|
||
PUSHJ P,OCTP
|
||
JRST CPPRI2
|
||
|
||
;DDT ROUTINE TO SELECT 11 # or TTY # for Hali
|
||
; arg:SELECT selects 11 #arg
|
||
CSELEC: TLNN SF,NUMFND
|
||
JRST CSELE1 ;NO ARGUMENT
|
||
MOVE A,T5 ;ARGUMENT
|
||
Haln PUSHJ P,GET11P
|
||
Haly pushj p,Httyopen
|
||
RETURN
|
||
;if no arg, type currently selected 11
|
||
CSELE1: Haln TTOA [ASCIZ /Using 11 #/]
|
||
Haly ttoa [asciz /Using as Hali TTY T/]
|
||
MOVE T5,CUR11 ;PICK UP 11 #
|
||
TLO SF,DNUMM ;MAKE SURE TO PRINT AS #
|
||
SYMTYP T5
|
||
CPPRI2: CRF
|
||
RETURN
|
||
|
||
|
||
;HERE TO SET SIZE OF PDP-11 MEMORY, TAKES # 1K BLOCKS IN DECIMAL
|
||
|
||
CCORE: TLNN SF,NUMFND ;ARGUMENT?
|
||
JRST CCORE1 ;NOPE
|
||
MOVE D,T5 ;# PDP-11 WORDS IN K
|
||
CAILE D,124. ;MAKE SURE ITS LEGAL
|
||
ERROR [ASCIZ /CORE -- ILLEGAL ARGUMENT/]
|
||
LSH D,10. ;FUDGE, FUDGE
|
||
PUSH P,T1
|
||
JRST SETSZ3
|
||
|
||
CCORE1: HRRZ T5,%CORE
|
||
LSH T5,-11.
|
||
TLO SF,DNUMM+DDECM
|
||
SYMTYP T5
|
||
TTOA [ASCIZ /K CORE/]
|
||
CRF
|
||
POPJ P,
|
||
|
||
;ROUTINE TO FIND SIZE OF PDP-11 MEMORY
|
||
|
||
SETSIZ: PUSH P,D
|
||
PUSH P,T1
|
||
HRRZ D,%CORE ;HAS CORE SIZE BEEN SPECIFIED BEFORE?
|
||
JUMPN D,[ LSH D,-1 ;YES
|
||
JRST SETSZ3]
|
||
Haln[ MOVEI T5,177777
|
||
PUSH P,NOMINS
|
||
MOVSI T1,(JFCL)
|
||
MOVEM T1,NOMINS
|
||
ADDI D,1 ;TEST 2ND WORD OF PAGE, NOT 1ST,
|
||
SETSZ1: 11GET T1,(D) ;BECAUSE PEOPLE LIKE TO PUT 11 IN LOOP IN LOCATION 0.
|
||
11PUT T5,(D)
|
||
11GET T6,(D)
|
||
11PUT T1,(D)
|
||
CAIGE D,<160000>_-1
|
||
CAME T5,T6
|
||
JRST SETSZ2 ;THAT'S THE SIZE
|
||
ADDI D,10000 ;PDP-11 MEMORY COMES IN 4K WORD CHUNKS
|
||
JRST SETSZ1
|
||
|
||
SETSZ2: POP P,NOMINS
|
||
TRZ D,7777
|
||
]
|
||
Haly Error [asciz /I can't guess the core size. Please specify it./]
|
||
SETSZ3: MOVEM D,MEMSIZ
|
||
LSH D,1
|
||
HRRM D,%CORE ;# BYTES IN CORE
|
||
LSH D,-12. ;PDP-10 CORE BLOCKS
|
||
MOVEM D,KCOUNT
|
||
POP P,T1
|
||
POP P,D
|
||
POPJ P,
|
||
|
||
;INTERRUPT HANDLER
|
||
|
||
TSINT: 0
|
||
0
|
||
PUSH P,A
|
||
PUSH P,B
|
||
PUSH P,C
|
||
PUSH P,40
|
||
PUSH P,UUOH
|
||
SETZM INTINS
|
||
SKIPGE DEBUGP
|
||
.SUSET [.RJPC,,INTJPC]
|
||
SKIPL A,TSINT
|
||
JRST OTHERI ;FIRST WORD INT
|
||
Haly[
|
||
trnn a,1_Httyic
|
||
jrst tsint1
|
||
.value ;11 wants to signal some condition.
|
||
;;; ?????
|
||
]
|
||
tsint1: TRNN A,1_TYIC
|
||
JRST BADINT ;SECOND WORD BUT NOT VALID CHANNEL
|
||
MOVEI A,TYIC
|
||
.ITYIC A,
|
||
JRST TSINTX
|
||
AOSN ICTLQF
|
||
JRST TSINT2
|
||
CAIN A,^Q
|
||
JRST TSINTQ
|
||
CAIE A,^W
|
||
CAIN A,^S
|
||
JRST TSILNT
|
||
CAIN A,^V
|
||
SETOM TYOFLG
|
||
CAIN A,^B
|
||
JRST TSINTB
|
||
CAIN A,^E
|
||
JRST TSINTE
|
||
CAIN A,^G
|
||
JRST TSQUIT
|
||
TSINT2: SKIPGE DDTPDP
|
||
JRST TSINTX
|
||
CALL TSINNS ;STOP SLEEPING, PC INTO A.
|
||
JRST TSINTX
|
||
|
||
TSINNS: HRRZ A,TSINT+1
|
||
.VALUE; CAIN A,IWAITS ;DON'T RETURN TO .SLEEP .
|
||
AOS TSINT+1
|
||
RETURN
|
||
|
||
TSQUIT: SKIPGE DDTPDP ;IF INSIDE DDT,
|
||
.DISMI [DERR] ;RETURN TO MAIN LOOP RIGHT AWAY.
|
||
AOS A,QUITF
|
||
CAIL A,2
|
||
.DISMI [QUIT] ;3 ^G'S - STOP IMMEDIATELY.
|
||
TTOA [ASCIZ/
|
||
^G /]
|
||
CAIE A,1
|
||
JRST TSINTX
|
||
TSILNT: SETZM TYOFLG
|
||
PUSHJ P,TRESET
|
||
JRST TSINTX
|
||
|
||
TSINTQ: SETOM ICTLQF
|
||
JRST TSINTX
|
||
|
||
TRESET: .RESET TYOC,
|
||
SKIPE LPTFLG
|
||
.RESET LPTC,
|
||
RETURN
|
||
|
||
QUIT: SAVE TSINT+1 ;DDT WILL RETURN TO INTERRUPTED SIMULATION.
|
||
SAVE [DDT] ;RSTALL WILL RETURN TO DDT.
|
||
PUSHJ P,MERRV
|
||
TTOA [ASCIZ/
|
||
^GSUPER-QUIT! /]
|
||
POPJ P,
|
||
|
||
QUITF: -1
|
||
ICTLQF: 0
|
||
|
||
OTHERI: TRNE A,200000
|
||
TTOA [ASCIZ /
|
||
PDL OVERFLOW/]
|
||
TRNE A,400
|
||
JRST OTHIOC ;IOC INT
|
||
TRNN A,20000
|
||
JRST BADINT
|
||
MOVSI A,600000 ;NON-EX MEM
|
||
MOVEM A,NXMCLB
|
||
HRRZ A,TSINT+1
|
||
CAIL A,SYMTAB
|
||
TTOA [ASCIZ/
|
||
NXM OUTSIDE PROGRAM AREA/]
|
||
SKIPA A,-1(A)
|
||
NXMX2: MOVE A,(A)
|
||
HRRI A,@A
|
||
; TRNN A,400000 ;THIS TEST FOULS UP ON BYTE INSNS.
|
||
; TRNN A,300000
|
||
; TTOA [ASCIZ/
|
||
;NXM OUTSIDE VIRT. MEM/]
|
||
AND A,[777740,,-1]
|
||
TLC A,(XCT)
|
||
TLNN A,777000
|
||
JRST NXMX2 ;XCT, GO DOWN CHAIN
|
||
TLC A,(XCT)
|
||
HRRI A,NXMCLB
|
||
JRST NXMXIT
|
||
|
||
OTHIO4: MOVE A,1(A)
|
||
NXMXIT: MOVEM A,INTINS
|
||
TSINTX: POP P,UUOH
|
||
POP P,40
|
||
POP P,C
|
||
POP P,B
|
||
POP P,A
|
||
SKIPN INTINS
|
||
.DISMI TSINT+1
|
||
AOS TSINT+1 ;TAKE CARE OF SKIPPING INSNS.
|
||
XCT INTINS
|
||
SOS TSINT+1
|
||
.DISMI TSINT+1
|
||
|
||
OTHIOC: HRRZ C,TSINT+1
|
||
MOVEI A,IOCTAB
|
||
OTHIO2: CAMN C,(A)
|
||
JRST OTHIO4
|
||
ADDI A,2
|
||
CAIE A,IOCEND
|
||
JRST OTHIO2
|
||
TTOA [ASCIZ /
|
||
IOC ERROR IN /]
|
||
SOS TSINT+1 ;RETURN TO THE .IOT .
|
||
JRST BADINU
|
||
|
||
NXMCLB: 0 ;MAY BE CLOBBERED
|
||
INTJPC: 0
|
||
INTINS: 0
|
||
|
||
BSUST: .SMASK,,[220400]
|
||
.SPICL,,[-1]
|
||
.SMSK2,,[1_TYIC]
|
||
BSUSL==3
|
||
|
||
TYIF: 4,,SIXBIT / TTY/
|
||
TYOF: 21,,SIXBIT / TTY/
|
||
XUNAME: 0
|
||
|
||
BADINT: PUSHJ P,MERRV
|
||
TTOA [ASCIZ /
|
||
BAD INTERRUPT IN
|
||
INT: /]
|
||
MOVE B,TSINT
|
||
PUSHJ P,FOCTP
|
||
BADINU: REST UUOH ;RESTORE EVERYTHING SAVED.
|
||
REST 40
|
||
REST C
|
||
REST B
|
||
REST A
|
||
.VALUE [ASCIZ*INTJPC/ *]
|
||
.DISMI TSINT+1 ;STOP BEFORE NEXT INSN.
|
||
|
||
LPTFIL: 1,,SIXBIT / LPT/
|
||
SIXBIT /WALL PAPER/
|
||
|
||
;UUO HANDLER
|
||
UUOH: 0
|
||
PUSH P,A
|
||
PUSH P,B
|
||
PUSH P,C
|
||
PUSH P,40 ;4O MUST BE NEXT TO LAST PUSHED
|
||
PUSH P,UUOH ;UUOH MUST BE LAST PUSHED
|
||
HRRZ A,40
|
||
LDB C,[331100,,40]
|
||
SKIPE C ;JUMP WILL CLOBBER JPC
|
||
CAILE C,UUOMAX
|
||
SKIPA
|
||
JRST @UUODIS-1(C)
|
||
.SUSET [.RJPC,,20] ;What the hell? 20??
|
||
.suset [.rjpc,,uuojpc']
|
||
PUSHJ P,MERRV
|
||
TTOA [ASCIZ /
|
||
ILLEGAL UUO IN
|
||
.JPC/]
|
||
REST UUOH
|
||
REST 40
|
||
REST C
|
||
REST B
|
||
REST A
|
||
SOS UUOH ;POINT TO UUO.
|
||
.VALUE [ASCIZ*20/*]
|
||
JRST @UUOH ;STOP BEFORE THE UUO.
|
||
|
||
UUODIS: XSYMTY
|
||
XADRTY
|
||
UOPENL
|
||
U6TYPE
|
||
UBLKFL
|
||
UTTOI
|
||
UTTOA
|
||
UERROR
|
||
U11PUT
|
||
U11GET
|
||
haly u11send
|
||
haly u11receive
|
||
;11 MEMORY ACCESS ROUTINES
|
||
Haln[
|
||
;RESTORES REGISTERS FOR EXIT ROUTINE
|
||
|
||
PUTREG: PUSH P,A
|
||
11GET T5,BPTVEC/2
|
||
JUMPE T5,POPAJ
|
||
LSH T5,-1
|
||
11GET T6,-3(T5)
|
||
JUMPE T6,POPAJ
|
||
LSH T6,-1
|
||
MOVEI A,10
|
||
ADD T6,A
|
||
PUTR1: MOVE T5,R0(A)
|
||
11PUT T5,(T6)
|
||
SUBI T6,1
|
||
SOJGE A,PUTR1
|
||
JRST POPAJ
|
||
|
||
;GETS REGISTERS INTO PDP-10 MEMORY
|
||
|
||
GETREG: PUSH P,A
|
||
SETOM R0
|
||
MOVE A,[R0,,R1]
|
||
BLT A,R7
|
||
11GET T5,BPTVEC/2 ;PDP11 BPT VECTOR
|
||
JUMPE T5,POPAJ
|
||
LSH T5,-1 ;WORD ADDRESS
|
||
11GET T6,-3(T5) ;POINTS TO ACS
|
||
JUMPE T6,POPAJ
|
||
LSH T6,-1
|
||
MOVEM T6,11REGS ;LEAVE AN EASY HANDLE
|
||
MOVEI A,10 ;GET ALL REGISTERS AND PS
|
||
ADD T6,A
|
||
GETR1: 11GET T5,(T6)
|
||
MOVEM T5,R0(A)
|
||
SUBI T6,1
|
||
SOJGE A,GETR1
|
||
POPAJ: POP P,A
|
||
POPJ P,
|
||
] ;end Haln
|
||
|
||
Haly[
|
||
Putreg: push p,a
|
||
push p,b
|
||
Byteo [hl.dmpreg]
|
||
move t5,[-10,,r0] ;Note that PS follows regs.
|
||
putrg1: move a,(t5)
|
||
pushj p,send
|
||
aobjn t5,putrg1
|
||
popabj: pop p,b
|
||
popaj: pop p,a
|
||
popj p,
|
||
|
||
getreg: push p,a
|
||
push p,b
|
||
byteo [hl.ldreg]
|
||
move t5,[-10,,r0]
|
||
getrg1: pushj p,receive
|
||
movem a,(t5)
|
||
aobjn t5,getrg1
|
||
jrst popabj
|
||
] ;end Haly
|
||
|
||
|
||
Haln[ ;; Specific to Carpet
|
||
|
||
;UUO ACTION ROUTINES
|
||
|
||
U11PGC: MOVE A,NOMINS ;SETUP ROUTINE FOR U11GET AND U11PUT
|
||
MOVEM A,NOMAT ;ASSUME CHECK READ WILL REVEAL SAME DATA AS WRITE
|
||
MOVEI A,50.
|
||
MOVEM A,NOMTRY ;TRIES ON THIS DEPOSIT
|
||
LDB A,[270400,,40] ;AC FIELD OF UUO
|
||
MOVEI B,@40 ;EFFECTIVE ADDRESS
|
||
CAIG A,C ;DOESNT WORK FOR AC S A B AND C
|
||
.VALUE
|
||
LDB C,[000100,,B] ;BYTE TO PICK IN WORD
|
||
LSH B,-1 ;TEN WORD ADDRESS
|
||
TRC B,160000_-2 ;LOOK FOR DEVICE REGISTERS
|
||
TRCN B,160000_-2
|
||
PUSHJ P,[ TRO B,760000_-2 ;ADDRESS IS IN IO AREA
|
||
PUSH P,[JFCL]
|
||
POP P,NOMAT ;READ AFTER WRITE NOT NECESSARILY YIELD SAME
|
||
POPJ P,]
|
||
MOVEM B,11ADR'
|
||
MOVEI B,PDP11(B)
|
||
EXCH B,11ADR
|
||
POPJ P,
|
||
|
||
U11GET: PUSHJ P,U11PGC
|
||
LDB C,U11PGB(C)
|
||
MOVEM C,(A)
|
||
JRST UUOXIT
|
||
|
||
U11PUT: PUSHJ P,U11PGC
|
||
MOVE A,(A)
|
||
NOMAT2: PUSH P,A
|
||
LSH A,4 ;LOW 4 BITS NOT USED
|
||
SKIPN C
|
||
LSH A,16.
|
||
TRO A,10 ;SELECT 11 WORD TO NOT WRITE
|
||
SKIPN C
|
||
TRC A,14
|
||
MOVEM A,PDP11(B) ;DONT USE DPB SINCE THAT DOES READ PAUSE WRITE
|
||
POP P,A ;WHICH MIGHT AFFECT OTHER WORD IF ITS AN IO REG
|
||
PUSH P,B
|
||
LDB B,U11PGB(C)
|
||
ANDI A,177777
|
||
CAIE B,(A)
|
||
XCT NOMAT
|
||
POP P,B
|
||
JRST UUOXIT
|
||
|
||
NOMAT: .VALUE ;XCT THIS INSTRUCTION WHEN 11 INTERFACE LOSES
|
||
NOMINS: JRST NOMAT1 ; OR .VALUE OR JFCL
|
||
|
||
NOMAT1: SOSGE NOMTRY
|
||
.VALUE ;50 TRIES DIDNT WIN EITHER
|
||
POP P,B
|
||
PUSH P,A
|
||
MOVEI A,2
|
||
.SLEEP A, ;LET 10-11 INTERFACE "REST"
|
||
POP P,A
|
||
AOS NOMATC
|
||
JRST NOMAT2
|
||
|
||
NOMTRY: 0 ;COUNT OF TRIES REMAINING ON THIS DEPOSIT
|
||
NOMATC: 0 ;COUNT OF TIMES 10-11 INTERFACE LOST
|
||
|
||
U11PGB: 242000,,PDP11(B)
|
||
042000,,PDP11(B)
|
||
|
||
] ;End of non-Hali
|
||
|
||
Haly[ ;; Hali-only stuff
|
||
|
||
|
||
byte0==001000 ;11
|
||
byte1==101000 ;11
|
||
part1==130500 ;The three bytes received from the 11.
|
||
part2==060500 ; See the description of the Hali format.
|
||
part3==000600
|
||
|
||
acfield==270400 ;on 10
|
||
|
||
Define 11go
|
||
byteo [hl.continue]
|
||
termin
|
||
|
||
adrsnd: movei a,@40 ;Get address wanted
|
||
;drop through to--
|
||
send: ldb b,[byte0,,a]
|
||
Byteo b
|
||
ldb b,[byte1,,a]
|
||
Byteo b
|
||
popj p,
|
||
|
||
receive: setz a,
|
||
Bytei b
|
||
dpb b,[part1,,a]
|
||
Bytei b
|
||
dpb b,[part2,,a]
|
||
Bytei b
|
||
dpb b,[part3,,a]
|
||
popj p,
|
||
|
||
u11get: Byteo [hl.read] ;Go through read sequence
|
||
pushj p,adrsnd
|
||
pushj p,receive
|
||
ldb b,[acfield,,40] ;Where to put result
|
||
caig b,3 ;Can't be a, b, or c.
|
||
.value [asciz /:U11get loses on ac a, b, or c.
|
||
/]
|
||
movem a,(b) ;Store
|
||
jrst uuoxit
|
||
|
||
|
||
u11put: Byteo [hl.write]
|
||
pushj p,adrsnd ;Address to write to
|
||
ldb b,[acfield,,40]
|
||
move a,(b) ;What to write
|
||
pushj p,send
|
||
pushj p,receive ;ignore result
|
||
jrst uuoxit
|
||
|
||
] ;end Haly
|
||
|
||
UTTOA: LDB B,[270400,,40] ;SKIP BY C(AC FIELD)
|
||
ADDM B,(P)
|
||
HRLI A,440700
|
||
SAVE MCTLVF
|
||
MES2: ILDB B,A
|
||
CAIG B,^F
|
||
XCT MESTAB(B)
|
||
CAIN B,^K
|
||
JRST MCTLK ;DECP
|
||
CAIN B,^V
|
||
JRST MCTLV
|
||
TTOI (B)
|
||
JRST MES2
|
||
|
||
MCTLV: SETOM MCTLVF
|
||
JRST MES2
|
||
|
||
MESTAB: JRST MESXIT ;^@
|
||
JRST MFOCTP ;^A
|
||
JRST OPPNT ;^B
|
||
JFCL ;^C
|
||
JRST MCTLD ;SYMTYP
|
||
JRST MCTLE
|
||
JRST MCTLF ;ADRTYP
|
||
|
||
MERRV: SETOM TYOFLG
|
||
RETURN
|
||
|
||
MCTLVF: 0 ;FORCE TTY OUTPUT FOR ERROR MESSAGES
|
||
|
||
MESXIT: REST MCTLVF
|
||
JRST UUOXIT
|
||
|
||
MFOCTP: PUSHJ P,UGQUAN
|
||
PUSHJ P,FOCTP
|
||
JRST MES2
|
||
|
||
FOCTP: LSHC B,-43 ;FULL WORD OCTAL PRINT
|
||
LSH C,-1
|
||
DIVI B,8
|
||
HRLM C,(P)
|
||
SKIPE B
|
||
PUSHJ P,FOCTP
|
||
HLRZ C,(P)
|
||
TTOI "0(C)
|
||
RETURN
|
||
|
||
UGQUAN: ILDB B,A ;GET QUANTITY
|
||
CAIL B,"8
|
||
JRST UGQUA2
|
||
HRRZ B,R0-"0(B)
|
||
RETURN
|
||
|
||
UGQUA2: CAIE B,"A
|
||
SKIPA B,QT
|
||
MOVE B,QA
|
||
RETURN
|
||
|
||
OPPNT: PUSH P,[MES2]
|
||
SKIPL DDTPDP
|
||
AOS DDTPDP
|
||
SKIPL DDTPDP
|
||
HRLZ SF,%TMODE
|
||
SKIPGE DL,OPC
|
||
JRST OPPNT1
|
||
LSH DL,1
|
||
PUSHJ P,DPINSN
|
||
SKIPA
|
||
OPPNT1: TTOA [ASCIZ/--DDT--/]
|
||
SKIPL DDTPDP
|
||
SOS DDTPDP
|
||
POPJ P,
|
||
|
||
MCTLF: SKIPA C,[ADRTYP QD]
|
||
MCTLD: MOVE C,[SYMTYP QD]
|
||
PUSHJ P,UGQUAN
|
||
MOVEM B,QD
|
||
PUSH P,[MES2]
|
||
SKIPL DDTPDP
|
||
HRLZ SF,%TMODE
|
||
XCT C
|
||
POPJ P,
|
||
|
||
MCTLE: .VALUE ;FATAL ERROR
|
||
SKIPGE DDTPDP
|
||
.DISMI [DERR]
|
||
.DISMI [BEG]
|
||
|
||
MCTLK: PUSHJ P,UGQUAN
|
||
PUSHJ P,DECP
|
||
JRST MES2
|
||
|
||
OCTP: SKIPA C,[8]
|
||
DECP: MOVEI C,10.
|
||
HRRM C,ANYP
|
||
ANYP: IDIVI B,.
|
||
HRLM C,(P)
|
||
SKIPE B
|
||
PUSHJ P,ANYP
|
||
HLRZ B,(P)
|
||
TTOI "0(B)
|
||
CPOPJ: RETURN
|
||
|
||
UBLKFL: HRRZ B,(P) ;FLUSH QUEUE BLOCKS
|
||
ADD B,[<222200,,>-1]
|
||
UBLKF2: ILDB A,B
|
||
TLNE B,770000
|
||
AOS (P)
|
||
JUMPE A,UUOXIT
|
||
JRST UBLKF2
|
||
|
||
UTTOI: SKIPE MCTLVF
|
||
JRST UTTOI1
|
||
SKIPE TYOFLG
|
||
UTTOI1: .IOT TYOC,A ;THE ONLY TYPE OUT IOT
|
||
SKIPE LPTFLG
|
||
.IOT LPTC,A
|
||
UUOXIT: POP P,UUOH
|
||
POP P,40
|
||
POP P,C
|
||
POP P,B
|
||
POP P,A
|
||
JRST 2,@UUOH
|
||
|
||
U6TYPE: MOVE B,@40
|
||
MOVE A,[440600,,B]
|
||
U6TYP2: ILDB C,A
|
||
JUMPE C,UUOXIT
|
||
TTOI 40(C)
|
||
JRST U6TYP2
|
||
|
||
UOPENL: .SUSET [.RBCHN,,C] ;OPENL UUO, GET # OF CHANNEL.
|
||
CAIE C,LPTC
|
||
JRST UOPNL1
|
||
SETZM LPTCNT
|
||
SETZM LPTFLG
|
||
UOPNL1: DPB C,[270400,,OPNLX1]
|
||
DPB C,[270400,,OPNLX2]
|
||
OPNLX1: .STATUS .,OPLERR
|
||
HLR C,(A)
|
||
CAIE C,4^5 ;NEW SYSTEM CALL OPEN, DON'T GET DEV NAME.
|
||
TRNE C,1
|
||
JRST UOPNL3 ;OUTPUT LOST
|
||
.SUSET [.RSNAME,,LSNAME]
|
||
.SUSET [.SSNAME,,[SIXBIT /PDP11/]]
|
||
OPNLX2: .OPEN .,(A)
|
||
JRST UOPNL2
|
||
.SUSET [.SSNAME,,LSNAME]
|
||
JRST UUOXIT
|
||
|
||
UOPNL2: .SUSET [.SSNAME,,LSNAME]
|
||
UOPNL3: .OPEN ERRC,ERRFIL
|
||
JRST .-1
|
||
PUSHJ P,MERRV
|
||
UOPNL4: .IOT ERRC,B
|
||
CAIE B,14
|
||
CAIN B,3
|
||
JRST UOPNL6
|
||
TTOI (B)
|
||
JRST UOPNL4
|
||
|
||
UOPNL6: CAIN C,4^5
|
||
JRST DERR
|
||
HRLZ B,(A)
|
||
6TYPE B
|
||
JRST DERR
|
||
|
||
ERRFIL: (SIXBIT /ERR/)
|
||
3
|
||
OPLERR: .
|
||
|
||
LSNAME: 0 ;LAST SYSTEM NAME
|
||
|
||
;IN DDT, PRINTS MESSAGE & CAUSES ERROR, DOESN'T RETURN.
|
||
;OUTSIDE DDT, PRINTS MESSAGE, CAUSES DDT TO BE CALLED, RETURNS.
|
||
UERROR: PUSHJ P,MERRV ;TURN ON TTY FOR ERROR MSG.
|
||
SKIPN DEBUGP
|
||
JRST UERRO1
|
||
TTOA [ASCIZ/
|
||
10PC: /]
|
||
MOVE B,(P) ;IF DEBUGGING,
|
||
PUSHJ P,FOCTP ;PRINT ADDR AFTER ERROR UUO.
|
||
CRF
|
||
UERRO1: SKIPGE DDTPDP
|
||
TTOA [ASCIZ/ /]
|
||
TTOA (A)
|
||
SKIPL DDTPDP
|
||
.VALUE
|
||
JRST DERR
|
||
IFN 0,[
|
||
LDB B,[270400+P,,-1]
|
||
JUMPE B,UUOXIT ;AC FIELD 0 - NO POPJS.
|
||
MOVNI B,-POP14J(B)
|
||
HRRM B,(P) ;EXIT TO RTN TO POPJ SEVERAL TIMES.
|
||
JRST UUOXIT
|
||
|
||
REPEAT 14.,REST POP14J
|
||
RETURN
|
||
POP14J: 0 ;EXCESS WDS ON PDL THROWN AWAY HERE.
|
||
]
|
||
|
||
TYI1: .IOT TYIC,T0
|
||
Upper t0
|
||
CAIN T0,^Q
|
||
JRST TYI4
|
||
CAIE T0,177
|
||
CAIGE T0,140
|
||
SKIPA
|
||
SUBI T0,40
|
||
CAIE T0,^E
|
||
CAIN T0,^V
|
||
JRST TYI1
|
||
CAIE T0,^B
|
||
CAIN T0,^W
|
||
JRST TYI1
|
||
CAIE T0,^S
|
||
RETURN
|
||
SETOM TYOFLG
|
||
JRST TYI1
|
||
|
||
TYI4: .IOT TYIC,T0
|
||
Upper t0
|
||
RETURN
|
||
|
||
TSINTB: SAVE [TSINTX]
|
||
DGLNCB: SKIPN LPTFLG
|
||
PUSHJ P,OPNLPT
|
||
SETOM LPTFLG
|
||
RETURN
|
||
|
||
TSINTE: SAVE [TSINTX]
|
||
DGLNCE: SKIPN LPTFLG
|
||
RETURN
|
||
SETZM LPTFLG
|
||
SOSGE LPTCNT
|
||
.CLOSE LPTC,
|
||
RETURN
|
||
|
||
CWALLP: MOVEI A,LPTFIL ;^B TO FILE
|
||
PUSHJ P,DGFIL
|
||
PUSHJ P,OPNLPU
|
||
SKIPE LPTFLG
|
||
RETURN
|
||
SETOM LPTFLG
|
||
AOS LPTCNT
|
||
RETURN
|
||
|
||
OPNLPT: AOS C,LPTCNT
|
||
SOJN C,CPOPJ
|
||
OPNLPU: .OPEN LPTC,LPTFIL
|
||
JRST .+2
|
||
RETURN
|
||
TSOPEN LPTC,TPLFIL
|
||
TTOA [ASCIZ /USING TPL/]
|
||
RETURN
|
||
|
||
TPLFIL: SIXBIT / !TPLWALL PAPER/
|
||
BLKGET: PUSH P,T1 ;GET CORE BLOCK
|
||
PUSH P,T0
|
||
MOVE T1,@-2(P)
|
||
MOVEI T1,@T1
|
||
LSH T1,-1
|
||
TRZ T1,777
|
||
IOR T1,[4000,,400000]
|
||
MOVEM T1,QA
|
||
.CBLK T1,
|
||
TTOA [ASCIZ /
|
||
BLKGET CBLK FAILED
|
||
A/]
|
||
HLLZ T0,@-2(P)
|
||
JUMPGE T0,POT0A1 ;ALLOW NEG FROBS TO SET TO NXM
|
||
LSH T1,1
|
||
MOVEM T0,(T1)
|
||
HRLS T1
|
||
AOS T1
|
||
HLRZ T0,T1
|
||
BLT T1,1777(T0)
|
||
POT0A1: POP P,T0
|
||
POT1J1: POP P,T1
|
||
AOS (P)
|
||
RETURN
|
||
|
||
BLKZAP: PUSH P,T1 ;FLUSH CORE BLOCK
|
||
MOVE T1,@-1(P)
|
||
MOVEI T1,@T1
|
||
LSH T1,-1
|
||
ANDI T1,377000
|
||
MOVEM T1,QA
|
||
.CBLK T1,
|
||
TTOA [ASCIZ /
|
||
BLKZAP CBLK FAILED
|
||
A/]
|
||
JRST POT1J1
|
||
;FLAGS IN SFLAGS, LEFT HAND SIDE
|
||
|
||
DBYTM==200000 ;REGISTER OPEN IN BYTE MODE.
|
||
DEXCM==100000 ;IN DON'T PRINT CONTENTS MODE.
|
||
DINSM==40000 ;PRINT AS INSTRUCTION.
|
||
DSYMM==20000 ;PRINT NUMBERS, ADDRESSES SYMBOLICALLY.
|
||
DASCM==10000 ;PRINT NUMBERS AS ASCII.
|
||
DNUMM==4000 ;PRINT NUMBERS NUMERICALLY. ABOVE DSYMM.
|
||
DDECM==2000 ;WHEN PRINTING NUMERICALLY, USE BASE 10. .
|
||
DREGM==1000 ;PRINT REGISTER NUMS NUMERICALLY.
|
||
DDSKM==400 ;OPEN NEXT LOC AS DISK ADDR.
|
||
NUMFND==200 ;SET AT ENTRY TO COMMAND IF HAS ARG.
|
||
DSEMFL==100 ;IF SET, RUBBING-OUT SHOULD BE STOPPED BY NON-DIGITS.
|
||
CSSFLG==40 ;SET DURING ;S -- CAUSES INPUT FROM LOADCH.
|
||
D1CHAR==20 ;RE-READ THE CHAR IN T0, IN NEXT GETCHR.
|
||
BYTOPN==10 ;CURRENTLY OPEN LOC. IS BYTE.
|
||
DSKOPN==4 ;CURRENTLY OPEN LOC. IS IN DISK.
|
||
|
||
DMODES==DBYTM+DEXCM+DINSM+DSYMM+DASCM+DNUMM+DDECM+DREGM+DDSKM
|
||
|
||
JRSTF==JRST 2,0
|
||
IF2 CDDT==CALL DDT ;USED FROM HACTRN WITH $X.
|
||
IF2 GETCHR==CALL DGCHR ;NEXT INPUT CHAR, IN DDT.
|
||
|
||
;FLAG IN AC CONTAINING ADDRESS (IN DDT)
|
||
REGBIT==1 ;INDICATES ADDR. IS REGISTER NUM.
|
||
.5KBIT==400000 ;INDICATES .5KILLED SYMBOL .
|
||
XREGTY: TLNE SF,DREGM
|
||
JRST XREGT1
|
||
SKIPN XSYMTA
|
||
TLNN SF,DNUMM
|
||
TLNN SF,DSYMM
|
||
JRST XREGT1 ;IF SHOULDN'T PRINT SYMBOL.
|
||
HRLI B,1 ;TYPE-CODE FOR REG. SYM.
|
||
HRRZ A,SYMEND
|
||
XREGT0: CAME B,1(A) ;IF THIS STE'S VALUE IS REG. TO TYPE,
|
||
JRST XREGT5
|
||
6TYPE (A) ;PRINT NAME OF SYMBOL.
|
||
JRST UUOXIT
|
||
XREGT5: SUBI A,2
|
||
CAIE A,SYMDRG ;NO NEED TO CHECK INSNS AND %1...%7 .
|
||
JRST XREGT0
|
||
XREGT1: SKIPN XREGTF ;NO SYMBOL, PRINT NUMERICALLY.
|
||
TTOI "% ;INDICATE IS REG. UNLESS TOLD NO NEED TO.
|
||
|
||
XNUMTY: ANDI B,-1
|
||
MOVEI C,DECP
|
||
TLNN SF,DDECM ;IF DECIMAL, CALL DECP,
|
||
MOVEI C,OCTP
|
||
PUSHJ P,(C) ;CALL PRINT RTN.
|
||
TLNE SF,DDECM ;IN DECIMAL MODE, PRINT ".".
|
||
TTOI ".
|
||
JRST UUOXIT
|
||
|
||
XASCTY: CAILE B,377 ;1 CHAR?
|
||
JRST XASCT1 ;NO, 2.
|
||
TTOI "' ;1.
|
||
TTOI (B) ;PRINT IT.
|
||
JRST UUOXIT
|
||
XASCT1: TTOI "" ;2 CHARS.
|
||
TTOI (B) ;PRINT 1ST (LOW) CHAR.
|
||
LSH B,-10
|
||
JRST XASCT1-2
|
||
|
||
XREGTF: 0 ;IF #0, OK TO OMIT % WHEN PRINTING REG. VAL.
|
||
XSYMTA: 0
|
||
;PRINT AN ADDRESS SYMBOLICALLY:
|
||
XADRTY: SETOM XSYMTA ;INDICATE ADRTYP.
|
||
JRST .+2
|
||
|
||
;PRINT NUMBER IN CURRENT MODE.
|
||
XSYMTY: SETZM XSYMTA
|
||
MOVE B,(A) ;WORD TO PRINT.
|
||
45N TRZ B,600000
|
||
TLNE B,REGBIT ;IF REGISTER NUM, SPECIAL HANDLING
|
||
JRST XREGTY
|
||
SKIPE XSYMTA ;IF NOT PRINTING ADDRESS TO OPEN,
|
||
JRST XSYMT3
|
||
TLNE SF,DNUMM ;CHECK FOR NUMERIC AND ASCII MODES.
|
||
JRST XNUMTY
|
||
TLNE SF,DASCM
|
||
JRST XASCTY
|
||
XSYMT3: TLNN SF,DSYMM ;IF NOT IN SYMBOLIC MODE,
|
||
JRST XNUMTY ;PRINT NUMERICALLY.
|
||
ANDI B,-1
|
||
PUSH P,DO
|
||
PUSH P,D ;NAME OF BEST SYMBOL SO FAR.
|
||
PUSH P,SF ;VALUE OF BEST SYMBOL SO FAR.
|
||
SETZ D, ;NO SYMBOL FOUND.
|
||
SETO SF, ;BEST SYMBOL'S VALUE IS -1.
|
||
HRRZ C,SYMEND
|
||
XSYMT0: SKIPL DO,1(C) ;ONLY NON-.5KILLED NORMAL SYMBOLS O.K.
|
||
TLNE DO,-1
|
||
JRST XSYMT1
|
||
CAIG DO,(B) ;ACCEPTABLE ONLY IF <= NUM. TO BE PRINTED.
|
||
CAIL SF,(DO) ;CLOSER THAN BEST SO FAR?
|
||
JRST XSYMT1
|
||
MOVE D,(C) ;YES, REPLACE BEST SO FAR'S NAME, VALUE.
|
||
MOVEI SF,(DO)
|
||
XSYMT1: SUBI C,2 ;SEARCH TABLE BACKWARDS TO GET USER
|
||
CAIL C,SYMDRG ;SYMBOLS BEFORE PREDEFINED ONES.
|
||
JRST XSYMT0
|
||
JUMPE D,XSYMT2 ;IF NO SUITABLE SYMBOL, PRINT NUMERICALLY.
|
||
SUBM B,SF ;SF HAS OFFSET OF VALUE FROM SYMBOL.
|
||
CAIL SF,200 ;TOO FAR AWAY => PRINT NUMERICALLY.
|
||
JRST XSYMT2
|
||
MOVEI B,(SF) ;ELSE THE # TO PRINT IS THE OFFSET.
|
||
6TYPE D
|
||
JUMPE B,XSYMT4 ;IFF OFFSET, --
|
||
TTOI "+
|
||
XSYMT2: TLO B,200000 ;NO SYMBOL- MAKE SURE TYPE ADDR. EVEN IF 0.
|
||
XSYMT4: POP P,SF
|
||
POP P,D
|
||
POP P,DO
|
||
JUMPE B,UUOXIT
|
||
JRST XNUMTY ;PRINT OFFSET IF ANY.
|
||
|
||
;GET NEXT INPUT CHAR. OUT OF LINE BUFER.
|
||
;IF BUFFER EMPTY, READ+ECHO UNTIL BREAK CHAR.
|
||
DGCHR1: PUSHJ P,DGLIN ;READ & ECHO LINE.
|
||
DGCHR: TLZE SF,D1CHAR ;IF SET, REREAD CHAR. IN T0.
|
||
RETURN
|
||
SETZM DGLCQF
|
||
DGCHR0: SKIPE FILINF ;IF :XFILING,
|
||
JRST DGCHRF ;READ FROM UTIC.
|
||
SOSGE DGLCNT ;COUNT CHARS. IN BUFFER.
|
||
JRST DGCHR1 ;IF NONE LEFT, GET NEW LINE.
|
||
ILDB T0,DGLPTR ;GET NEXT CHAR.
|
||
DGCHR2: CAIN T0,^Q ;IF CHAR IS ^Q,
|
||
SKIPE DGLCQF ;NOTQQUOTED BY PREV. ^Q,
|
||
RETURN
|
||
SETOM DGLCQF ;INDICATE NEXT CHAR IS QUOTED,
|
||
JRST DGCHR0 ;READ IT.
|
||
|
||
DGCHCS:
|
||
DGCHRF: .IOT UTIC,T0
|
||
MOVEI T0,(T0)
|
||
CAIN T0,^L
|
||
JRST DGCHRF ;IGNORE FORM FEEDS
|
||
CAIN T0,^C ;IF EOF, GO BACK TO TTY.
|
||
JRST DGCHCC
|
||
TTOI (T0) ;ECHO.
|
||
CAIE T0,^J
|
||
JRST .+3
|
||
SKIPE DGCHRC ;FLUSH LF'S AFTER CR'S IN FILES.
|
||
JRST DGCHRF
|
||
SETZM DGCHRC
|
||
CAIN T0,^M
|
||
SETOM DGCHRC ;INDICATE HAD CR AS LAST CHAR.
|
||
SKIPE DGLCQF ;IF CHAR NOT ^Q-QUOTED,
|
||
JRST DGCHR2
|
||
IRPC CHAR,,BEWVS
|
||
CAIN T0,^CHAR ;CHECK FOR IO CTL CHARS
|
||
JRST DGCHC!CHAR
|
||
TERMIN
|
||
JRST DGCHR2
|
||
|
||
DGCHCB: CALL DGLNCB ;OPEN LPT.
|
||
JRST DGCHCS
|
||
DGCHCE: CALL DGLNCE ;END OUTPUT TO LPT.
|
||
JRST DGCHCS
|
||
DGCHCV: SETOM TYOFLG ;TURN ON TTY OUTPUT.
|
||
JRST DGCHCS
|
||
DGCHCW: SETZM TYOFLG ;TURN IT OFF.
|
||
CALL TRESET
|
||
JRST DGCHCS
|
||
DGCHCC: .CLOSE UTIC, ;ON EOF, CLOSE FILE,
|
||
SETZM FILINF
|
||
JRST DGCHR ;AND GO BACK TO TTY.
|
||
|
||
ETODON:
|
||
POP1J: SUB P,[1,,1]
|
||
RETURN
|
||
;READ FROM TTY UP TILL ACTIVATION NECESSARY,
|
||
;PROCESSING RUBOUTS UNTIL THEN.
|
||
;WHEN DONE, RETURN WITH DGLCNT=NUM CHARS,
|
||
;DGLPTR=B.P. TO CHARS.
|
||
DGLIN: PUSH P,T1
|
||
SETZM DGLRCT
|
||
MOVE T1,[440700,,DGLBUF] ;INITIAL B.P.
|
||
MOVEM T1,DGLPTR ;USED TO STORE CHARS.
|
||
MOVE T1,DGLINF
|
||
MOVEM T1,DGLINS
|
||
DGLRB0: SETZM DGLCNT ;RE-INIT. AFTER RUBOUT, THEN RE-READ.
|
||
SETZM DGLNQC
|
||
SETZM DGLCQF ;1ST CHAR NOT ^Q'D.
|
||
TLZ SF,DSEMFL
|
||
SETZM DGLALF
|
||
.CALL TTYM1
|
||
.VALUE
|
||
|
||
DGLIN1: SETZM DGLCQF ;NORMALLY, CHAR NOT ^Q-QUOTED.
|
||
DGLIN0: SKIPN DGLRCT ;IF CHARS LEFT BEFORE RUBOUT,
|
||
JRST DGLIN2
|
||
ILDB T0,DGLRBP ;RE-READ THEM.
|
||
SOSG DGLRCT ;IF THE LAST CHAR LEFT
|
||
SKIPE DGLCQF ;IS AN UN-^Q-QUOTED ^Q,
|
||
JRST DGLIN3
|
||
CAIE T0,^Q ;IT HAD QUOTED THE CHAR RUBBED OUT,
|
||
JRST DGLIN3
|
||
TTOI ^Q ;SO RUB OUT THE ^Q, TOO.
|
||
|
||
DGLIN2: TLNE SF,DSEMFL ;IF AFTER A ';',
|
||
.CALL TTYMA ;ACTIVATE ON EACH CHARACTER.
|
||
JFCL
|
||
.IOT TYIC,T0 ;ELSE, READ NEW CHAR.
|
||
Upper t0
|
||
|
||
;NOW DECIDE WHAT TO DO WITH THE CHAR. JUST READ.
|
||
DGLIN3: SKIPE DGLCQF ;UNLESS CHAR WAS ^Q-QUOTED,
|
||
JRST DGLIT5
|
||
CAIN T0,^Q ;PROCESS ^Q,
|
||
JRST DGLCTQ
|
||
CAIN T0,177 ;RUBOUT SPECIALLY.
|
||
JRST DGLRUB
|
||
DGLIT5: SKIPE DGLNQC ;NEXT THREE TESTED EVEN IF ^Q-QUOTED:
|
||
JRST DGLQTD ;IF QUOTED BY ' OR ".
|
||
SKIPE DGLALF
|
||
JRST DGLAL1 ;IF AFFECTED BY PREV. ALTMODE.
|
||
TLNE SF,DSEMFL
|
||
JRST DGLSM1 ;IF AFTER UNQUOTED ";".
|
||
CAILE T0,"Z
|
||
JRST DGLIT6
|
||
SKIPN DGLCQF
|
||
CAIL T0,"A ;ELSE DON'T BOTHER TESTING
|
||
JRST DGLREG ;ALPHABETIC CHARS, ^Q-QUOTED CHARS.
|
||
DGLIT6: SKIPE DGLINF
|
||
JRST DGLIT2 ;IN LINE MODE ^M IS ONLY BREAK CHAR.
|
||
;NORMAL BREAK CHARS:
|
||
CAIE T0,"[
|
||
CAIN T0,"]
|
||
JRST DGLBK
|
||
CAIN T0,^]
|
||
JRST DGLBK
|
||
IRP C1,,[^L,^N,"/,"=,"_]C2,,[^\,^P,^I,^J,"^]
|
||
CAIE T0,C1
|
||
CAIN T0,C2
|
||
JRST DGLBK
|
||
TERMIN
|
||
CAIN T0,"'
|
||
JRST DGLQUO ;QUOTES NEXT CHAR.
|
||
CAIN T0,""
|
||
JRST DGL2Q ;QUOTES 2 CHARS.
|
||
CAIN T0,":
|
||
JRST DGLCOL ;ENTERS LINE MODE TO READ COMMAND.
|
||
CAMN T0,SEMICL
|
||
JRST DGLSEM ;READS NUMBER, THEN LETTER.
|
||
CAMN T0,ALTMOD
|
||
JRST DGLALT ;QUOTES ALL CHARS EXCEPT ALTMODE.
|
||
DGLIT2: CAIN T0,^M
|
||
JRST DGLBK
|
||
|
||
;THESE CHARS ARE TESTED FOR IN ALL STATES
|
||
;EXCEPT WHEN ^Q-QUOTED.
|
||
DGLIT3: SKIPN DGLCQF
|
||
JRST DGLIT4 ;IGNORE IF ^Q QUOTED.
|
||
CAIN T0,^S
|
||
JRST DGLCTS ;^S TURNS OUTPUT BACK ON WHEN READ.
|
||
CAIE T0,^B
|
||
CAIN T0,^E
|
||
JRST DGLIN1 ;^B, ^E, ^W, ^V SIGNIF. ONLY AT
|
||
CAIE T0,^V ;INTERRUPT LEVEL,
|
||
CAIN T0,^W ;IGNORED HERE.
|
||
JRST DGLIN1
|
||
DGLIT4: TLNE SF,DSEMFL ;AFTER A ";", ALL NORMAL CHARS
|
||
JRST DGLBK ;ARE BREAK CHARS.
|
||
SETZM DGLALF
|
||
JRST DGLREG
|
||
;ROUTINES TO HANDLE VARIOUS TYPES OF CHARS.
|
||
|
||
DGL2Q: AOS DGLNQC ;INSERT, QUOTE NEXT 2 CHARS.
|
||
DGLQUO: AOSA DGLNQC ;QUOTE ONLY 1 CHAR.
|
||
DGLQTD: SOS DGLNQC ;THIS CHAR IS QUOTED.
|
||
DGLREG: SETZM DGLCQF ;TURN OFF AFTER OTHER THAN ^Q.
|
||
SKIPA
|
||
DGLCTQ: SETOM DGLCQF ;^Q - INDICATE NEXT CHAR ^Q-QUOTED.
|
||
AOS DGLCNT
|
||
IDPB T0,DGLPTR
|
||
JRST DGLIN0
|
||
|
||
; ^S - TURN ON TYPOUT, PASS IT BY.
|
||
DGLCTS: SETOM TYOFLG
|
||
JRST DGLIN1
|
||
|
||
;BREAK CHAR - INSERT AND EXIT.
|
||
DGLBK: AOS DGLCNT
|
||
IDPB T0,DGLPTR
|
||
MOVE T1,[440700,,DGLBUF]
|
||
MOVEM T1,DGLPTR ;SET UP PTR FOR UNPACKING.
|
||
SETZM DGLINF
|
||
DGLINX: POP P,T1
|
||
RETURN
|
||
|
||
; ";" - ALL EXCEPT DIGITS, " ", "." ARE BREAK CHARS.
|
||
DGLSEM: TLO SF,DSEMFL
|
||
JRST DGLREG ;INSERT THE ";".
|
||
|
||
|
||
DGLSM1: CAIN T0,"-
|
||
JRST DGLREG
|
||
CAIE T0,"
|
||
CAIN T0,".
|
||
JRST DGLREG
|
||
CAIL T0,"0
|
||
CAILE T0,"9
|
||
JRST DGLIT3 ;NON-DIGIT, IGNORE OR BREAK.
|
||
JRST DGLREG
|
||
|
||
DGLCOL: SETOM DGLINF ;":" - READ UNTIL CR.
|
||
JRST DGLREG
|
||
;COME HERE IF CHAR AFFECTED BY PREVIOUS ALTMODE.
|
||
DGLAL1: CAIN T0,"-
|
||
JRST DGLALT ;- SIGN DOESN'T END TYPEOUT MODE CMD.
|
||
CAME T0,ALTMOD
|
||
JRST DGLIT3
|
||
DGLALT: SETOM DGLALF
|
||
JRST DGLREG
|
||
|
||
;COME HERE TO HANDLE RUBOUT.
|
||
DGLRUB: SOSGE T1,DGLCNT ;NUM. CHARS NOT RUBBED.
|
||
JRST DERR ;IF NO CHAR TO RUB.
|
||
MOVEM T1,DGLRCT ;RE-READ THOSE CHARS.
|
||
LDB T0,DGLPTR
|
||
; TTOI (T0) ;ECHO RUBBED CHAR. ;? Works without.
|
||
MOVE T1,[440700,,DGLBUF]
|
||
MOVEM T1,DGLRBP ;PTR FOR RE-READING.
|
||
MOVEM T1,DGLPTR
|
||
MOVE T1,DGLINS ;RESTORE INITIAL DGLINF.
|
||
MOVEM T1,DGLINF
|
||
JRST DGLRB0
|
||
|
||
DGLNQC: 0 ;NUM. OF NEXT CHARS TO QUOTE.
|
||
DGLRBP: 0 ;B.P. FOR RE-READING AFTER RUBOUT.
|
||
DGLRCT: 0 ;NUM. CHARS TO RE-READ.
|
||
DGLCNT: 0 ;NUM. CHARS READ.
|
||
DGLPTR: 0 ;B.P. FOR STORING CHARS READ.
|
||
DGLINF: 0 ;IF SET, READ UNTIL CR.
|
||
DGLINS: 0 ;SAVES INITIAL VALUE OF DGLINF.
|
||
DGLALF: 0 ;SET AFTER ALTMODE.
|
||
DGCHRC: 0 ;NONZERO IF FILINF AND LAST CHAR WAS CR.
|
||
DGLCQF: 0 ;CONTROL Q FLAG
|
||
|
||
DGLBUF: BLOCK 60 ;RUBOUT PROCESSING AND I-O BUFFER.
|
||
;DDT ENTRY
|
||
|
||
DEFINE $NB N
|
||
SIXBIT /$!N!B>>/
|
||
TERMIN
|
||
|
||
DDT: SETZM DDONXT ; ;N STOPS AFTER THIS INSN.
|
||
PUSHJ P,MERRV ;TURN ON TTY OUTPUT.
|
||
MOVEM P,DDTPDP ;SAVE P FOR RESTORATION ON ERROR.
|
||
PUSHJ P,GETREG
|
||
MOVE DL,R7
|
||
HRRM DL,%PC
|
||
HRRZ DL,OPC
|
||
LSH DL,1
|
||
SKIPL DL
|
||
HRRM DL,%OPC ;SET UNLESS HAVE JUST LEFT DDT.
|
||
HRLZ SF,%TMODE
|
||
SKIPE DINITF
|
||
JRST DDT3 ;DON'T PRINT INSN ON STARTING PDP11.
|
||
HRRZ DL,R7
|
||
MOVEI T5,TF ;CHECK FOR TRACE TRAP
|
||
TDNE T5,PS
|
||
JRST [ ttoa [asciz /Trace>> /]
|
||
ANDCAM T5,PS ;CLEAR TRACE FLAG
|
||
JRST DDT1A]
|
||
MOVEI T1,-2(DL) ;TYPE OUT BREAK POINT NAME
|
||
MOVE DL,T1 ;BACKUP, POINTS TO BREAK POINT
|
||
MOVEM DL,R7
|
||
HRRM DL,%PC
|
||
LSH T1,-1
|
||
JSP D,SRCBPT ;SEARCH FOR THAT BREAK POINT
|
||
6TYPE [ SIXBIT /BPT>>/
|
||
REPEAT NBPTS,$NB \.RPCNT+1
|
||
](T3)
|
||
DDT1A: TLO SF,NUMFND ;CAUSE . TO BE SET BY DARG.
|
||
CALL DPINSN ;PRINT DL AND INSN THERE.
|
||
HRRM DLEN,%IL ;SAVE LENGTH, FOR ;N'S SAKE.
|
||
HRROI DO,(DO) ;DON'T ALLOW ACCIDENTAL CHANGES.
|
||
TTOA SPACES
|
||
DDT2: SETZM FILINF
|
||
.CLOSE UTIC,
|
||
DDT3: SETZM DINITF ;THAT FLAG SET 1ST TIME ONLY.
|
||
.RESET TYIC,
|
||
SETOM DGVLVL
|
||
SETOM QUITF
|
||
JRST DLOOP
|
||
|
||
;PASS SPACES.
|
||
|
||
GPASST: GETCHR
|
||
PASSPS: CAIN T0,"
|
||
JRST GPASST
|
||
RETURN
|
||
|
||
SPACES: ASCIZ/ /
|
||
;COME HERE FOR NEXT COMMAND.
|
||
DLOOP:
|
||
Haln[ SKIPE NOMATC
|
||
JRST [ TTOA [ASCIZ /10-11 LOSSES /]
|
||
MOVE B,NOMATC
|
||
PUSHJ P,FOCTP
|
||
CLEARM NOMATC
|
||
JRST .+1]
|
||
] ;end Haln
|
||
TLZ SF,DMODES ;RESTORE TEMPORARY MODES.
|
||
TLO SF,@%TMODE
|
||
DLOOP1: MOVE T6,DL
|
||
TLO T6,.5KBIT
|
||
MOVEM T6,%Q ;SET %Q FROM DL, .5KILLED.
|
||
HRRM DLEN,%L ;SAVE LENGTH IN CASE ERROR.
|
||
DLOOP2: CALL DGVAL ;TRY TO GET A NUMERIC VALUE.
|
||
SKIPN DGVALP ;IF HAD ARG,
|
||
JRST DLOOP3
|
||
SETZM S%OLFL ;STOP UPDATING LENGTH OF WHAT'S OPEN
|
||
TLO SF,NUMFND ;TELL COMMAND ABOUT ARG
|
||
SKIPA DL,T2 ;SET %Q TO ARG.
|
||
DLOOP3: HRRZ DLEN,%L ;ELSE RESTORE LENGTH.
|
||
JSP T1,DDECOD ;JUMP ACCORDING TO FIRST CHAR. AFTER NUM.
|
||
"/,,CSLASH
|
||
"[,,CLB
|
||
"],,CRB
|
||
^I,,CTAB
|
||
^J,,CLF
|
||
^K,,CCTLK
|
||
^M,,CCR
|
||
"^,,CUPAR
|
||
"=,,CEQ
|
||
";,,CSEM
|
||
",,CALT
|
||
"_,,CBACK
|
||
">,,CGT
|
||
":,,CCOL
|
||
^N,,CCN
|
||
^P,,CSP
|
||
^L,,CFORMF
|
||
" ,,DLOOP1
|
||
DERR ;IF NOT FOUND.
|
||
|
||
;LOOK IN TABLE AT (T1) FOR ENTRY WITH LH=(T0),
|
||
;THEN JRST TO @RH OF ENTRY.
|
||
DDECOD: HLRZ T5,(T1) ;LH, FOR COMPARISON.
|
||
HRRZ T6,(T1) ;RH FOR JUMP.
|
||
CAIN T0,(T5) ;FOUND ENTRY?
|
||
JRST (T6) ;YES, GO THERE.
|
||
JUMPE T5,(T6) ;IF LH IS 0, GO THERE ANYWAY(END OF TABLE).
|
||
AOJA T1,DDECOD ;TRY NEXT ENTRY.
|
||
;READ A CHAR, PASS SPACES, READ A VALUE.
|
||
DGVGCH: GETCHR
|
||
|
||
;PASS SPACES AND READ IN A VALUE.
|
||
DGVPSP: PUSHJ P,PASSPS
|
||
|
||
;READ IN A VALUE WHOSE 1ST CHAR HAS BEEN READ ALREADY.
|
||
DGV1CH: TLO SF,D1CHAR
|
||
|
||
;GET A VALUE, AND PUT IT IN T2. SET NUMFND IF VALUE AVAILABLE.
|
||
;T0 CONTAINS CHAR. FOLLOWING VALUE, OR 1ST CHAR, AT EXIT.
|
||
;SETS T1 .
|
||
DGVAL: SETZ T1, ;START ON LEVEL 0.
|
||
AOSE DGVLVL ;IF OUTERMOST CALL TO DGVAL,
|
||
JRST .+4
|
||
MOVE T5,[004400,,DRNEXT]
|
||
MOVEM T5,DRNEXT ;SET UP B.P. FOR EXTRA WDS,
|
||
MOVEI DLEN,2 ;INITIALIZE LENGTH.
|
||
|
||
PUSH P,DGVRGP
|
||
SETZM DGVRGP ;AS YET, THIS VALUE ISN'T A REGISTER NUM.
|
||
PUSH P,[DGVXIT]
|
||
DGVAL0: HLRZ T1,T1 ;PUT LEVEL IN RH.
|
||
SETZM DGVALP
|
||
PUSHJ P,DGVCAL ;TRY TO GET VALUE ON NEXT LEVEL.
|
||
SKIPN DGVALP ;IF CAN'T, RETURN NO VALUE.
|
||
RETURN
|
||
DGVAL1: HRRZ T5,DGVT2(T1) ;ADDR. OF OP TABLE FOR THIS LEVEL.
|
||
HRRZ T6,(T5) ;SEARCH FOR ENTRY WITH RH=NEXT CHAR.
|
||
CAIN T0,(T6)
|
||
JRST DGVAL2 ;FOUND.
|
||
SKIPE (T5) ;0 MARKS END OF TABLE.
|
||
AOJA T5,.-4 ;TRY NEXT ENTRY.
|
||
RETURN
|
||
|
||
DGVAL2: HLL T2,(T5) ;SAVE OPERATION TYPE NO.
|
||
PUSH P,T2 ;AND LAST VALUE.
|
||
PUSHJ P,DGVCAL ;TRY TO GET VALUE ON NEXT LEVEL.
|
||
REST T5 ;GET 1ST ARG, OP. NUM.
|
||
HLRZ T6,T5 ;GET OP. NUM.
|
||
SKIPE DGVALP ;IF NO 2ND ARG,
|
||
JRST DGVAL3
|
||
JUMPG T6,DERR ;ERROR UNLESS OP. IS " ",
|
||
HRRZ T2,T5 ;IN WHICH CASE RETURN 1ST ARG.
|
||
RETURN
|
||
DGVAL3: HRREI T2,(T2) ;GOT 2ND ARG - EXTEND SIGNS OF ARGS,
|
||
HRREI T5,(T5)
|
||
XCT DGVT3(T6) ;PERFORM OPERATION.
|
||
JRST DGVAL1 ;LOOK FOR ANOTHER OP.
|
||
|
||
DGVCAL: PUSH P,T1 ;SAVE LEVEL NO.
|
||
MOVE T1,DGVT1(T1) ;GET NEXT LEVEL NO., ADDR. TO CALL.
|
||
PUSHJ P,(T1) ;GET VALUE ON NEXT LEVEL.
|
||
POP P,T1 ;RESTORE LEVEL NO.
|
||
RETURN
|
||
DGVT1: 1,,DGVAL0 ;FROM LEVEL 0, CALL SELF ON LEVEL 1.
|
||
2,,DGVAL0
|
||
3,,DGVAL0
|
||
4,,DGTRM
|
||
DGVAL ;DGTRM CALLS BACK ON LEVEL 3.
|
||
|
||
DGVT2: DGVL0T ;LEVEL 0 OP. TABLE.
|
||
DGVL1T ;LEVEL 1 OP. TABLE.
|
||
DGVL2T
|
||
DGVL3T
|
||
DGVL4T
|
||
|
||
DGVL0T: 0,," ;SPACE - LOW PRIOR. ADDITION.
|
||
0
|
||
DGVL1T: 5,,"& ;LOGICAL OPS. LOWEST IN PRIOR.
|
||
6,,"\
|
||
8,,"#
|
||
0
|
||
DGVL2T: 3,,"+
|
||
4,,"-
|
||
0
|
||
DGVL3T: 1,,"* ;MULT., DIV. SEPARATE TERMS.
|
||
2,,"!
|
||
0
|
||
DGVL4T: 7,,", ;ANGLE-BRACKETS CONTAIN ORDINARY EXPRESSIONS
|
||
0 ;SEPARATED BY COMMAS.
|
||
|
||
DGVT3: ADDM T5,T2 ;SPACE - MUST HAVE CODE 0.
|
||
IMULI T2,(T5) ;1ST INSNS OF OPERATIONS.
|
||
IDIVM T5,T2
|
||
ADD T2,T5
|
||
SUBM T5,T2
|
||
ANDM T5,T2
|
||
IORM T5,T2
|
||
PUSHJ P,DGVCOM
|
||
XORM T5,T2
|
||
|
||
DGVCOM: SKIPE DGVLVL ;IF WITHIN INNER BRACKETS,
|
||
JRST DGVCO2 ;THROW AWAY EXTRA WORD.
|
||
CAILE DLEN,10. ;CAN'T HAVE MORE THAN 5 EXTRA WDS.
|
||
ERROR [ASCIZ/> 6 WORDS/]
|
||
IDPB T2,DRNEXT ;2ND VALUE IS EXTRA WORD.
|
||
MOVE T2,T5
|
||
AOJ DLEN,
|
||
AOJA DLEN,CPOPJ
|
||
|
||
DGVCO2: MOVE T2,T5
|
||
RETURN
|
||
|
||
DGVXIT: SOS DGVLVL
|
||
HRLI T2,.5KBIT ;SINCE MUST .5KILL %P.
|
||
SKIPE DGVRGP ;IF THIS IS TO BE A REGISTER NUM.,
|
||
TLO T2,REGBIT ;SAY SO IN THE VALUE.
|
||
MOVEM T2,%P
|
||
POP P,DGVRGP
|
||
POPJ P, ;NOT AN OP. FOR THIS LEVEL, RETURN.
|
||
;GET A TERM, INTO T2. CLEAR NUMFND IF CAN'T GET ONE, SET IF CAN.
|
||
DGTRM: PUSHJ P,DGNUM ;TRY TO GET NUMBER.
|
||
SKIPE DGVALP ;IF FOUND, RETURN IT.
|
||
RETURN
|
||
PUSHJ P,DGSYM ;OTHERWISE, TRY TO GET SYMBOL.
|
||
JUMPE T2,DGTRM1 ;IF NO SYMBOL, TRY OTHER THINGS.
|
||
PUSHJ P,DLKSYM ;LOOK UP SYMBOL.
|
||
JUMPE T5,[ERROR [ASCIZ/U/]] ;UNDEFINED.
|
||
LDB T2,[220400+T5,,1]
|
||
JRST @.+1(T2) ;INDEX ON SYMBOL TYPE.
|
||
|
||
DGTRM2 ;ORDINARY SYMBOL.
|
||
DGVREG ;REGISTER SYMBOL.
|
||
DR2AR ;2-OP INSN.
|
||
DR2AR ;1-OP INSN.
|
||
DRJSR ;JSR.
|
||
DRJSR ;RTS.
|
||
DRDBR ;BRANCH INSN.
|
||
DREMT
|
||
DRSFL
|
||
DGTSER
|
||
[ERROR [ASCIZ/U/]]
|
||
DRSPEC ;SOB, MARK, SPL.
|
||
DRASH ;MUL, DIV, ASH, ASHC.
|
||
REPEAT 3,DGTSER
|
||
|
||
;JRST THRU STE TO HERE TO GET VALUE OF REGISTER SYMBOL.
|
||
DGVREG: SETOM DGVRGP
|
||
|
||
;JRST HERE FOR NORMMAL SYMBOL.
|
||
DGTRM2: AOS DGVALP
|
||
HRRE T2,1(T5)
|
||
RETURN
|
||
|
||
DGTSER: CRF
|
||
6TYPE (T5)
|
||
MOVE T5,1(T5)
|
||
MOVEM T5,QA
|
||
ERROR [ASCIZ/ HAS IMPOSSIBLE STE! - A/]
|
||
;COME HERE TO CHECK FOR UNARY +,-.
|
||
DGTRM1: CAIE T0,"- ;FOR MINUS SIGN,
|
||
JRST DGTRM3
|
||
PUSHJ P,DGTRM ;GET A TERM AND NEGATE IT.
|
||
MOVN T2,T2
|
||
RETURN
|
||
DGTRM3: CAIN T0,"+ ;FOR + SIGN, START OVER.
|
||
JRST DGTRM
|
||
CAIE T0,"' ;'''' MEANS ASCII CHAR INPUT.
|
||
JRST DGTRM4
|
||
GETCHR
|
||
MOVEI T2,(T0)
|
||
DGTRM6: GETCHR ;GET CHAR AFTER TERM.
|
||
DGVRET: AOS DGVALP
|
||
RETURN
|
||
|
||
DGTRM4: CAIE T0,"" ;2 ASCII CHARS INPUT.
|
||
JRST DGTRM5
|
||
GETCHR
|
||
MOVEI T2,(T0)
|
||
GETCHR
|
||
LSH T0,10 ;2ND CCHAR INTO HIGH BYTE
|
||
ADD T2,T0
|
||
JRST DGTRM6
|
||
DGTRM5: CAIE T0,"< ;OPEN BRACKET?
|
||
POPJ P, ;NO, R |