pdp9sim.hal
1 $BEGIN PDP-9 SIMULATOR FOR 7502
2 /MANIPULATES OPERANDS DIRECTLY ON VIDEO SCREEN
3 /18-BIT OPERANDS ARE 11 CHAR SEQUENCES
4 / -- 6 OCTAL DIGITS WITH SPACES BETWEEN DIGITS
5 /OCTAL DIGITS ARE SYMBOLS '0' : '7' IN ISO
6 /HENCE LOW-ORDER 3 BITS ARE 0 : 7
7 /THE LINK IS A SINGLE CHAR - '0' OR '1'
8 /
9 /THE REGISTERS SHOWN ON SCREEN ARE:
10 / L AC PC MB
11 /THE ADDRESS OF AN OPERAND IS THE ADDRESS OF
12 /THE LEFTMOST (MOST SIGNIFICANT) DIGIT
13
14 JUMP START /INITIAL ENTRY
15
16 $TEMP R2,R3
17 $DEF TEMP=R2
18 $DEF AC=R4, MB=R5, LOC=R6, I=R7 /AV,MB,LOC,I IN SAME GROUP
19 $DEF L=R8, POS=R9, OP=R10, J=R11 /POS,J IN SAME GROUP
20 $DEF SKIP=R12, PC=R13, MODE=R14 /*PC IS PDP9 PC*
21 $DEF SYM=R12 /*SKIP & SYM SAME REG*
22 $DEF DBASE=MB+80+79
23
24 $MACRO P A,B,C
25 A-64<<5+B-64<<5+C-64
26 $END
27
28 P '@','D','A'
29 P '@','G','O'
30 OP0:P 'C','A','L'
31 P 'D','A','C'
32 P 'J','M','S'
33 P 'D','Z','M'
34 P 'L','A','C'
35 P 'X','O','R'
36 P 'A','D','D'
37 P 'T','A','D'
38 P 'X','C','T'
39 P 'I','S','Z'
40 P 'A','N','D'
41 P 'S','A','D'
42 P 'J','M','P'
43 P 'E','A','E'
44 P 'I','O','T'
45 P 'O','P','R'
46 P 'L','A','W'
47 P 'S','Z','L'; X'0300'
48 P 'S','P','A'; X'0240'
49 P 'S','N','A'; X'0280'
50 P 'S','K','P'; X'0200'
51 P 'S','N','L'; X'0100'
52 P 'S','M','A'; X'0040'
53 P 'S','Z','A'; X'0080'
54 P 'S','T','L'; X'0802'
55 P 'R','C','L'; X'0808'
56 P 'R','C','R'; X'0810'
57 P 'C','L','L'; X'0800'
58 P 'C','L','A'; X'1000'
59 P 'C','M','L'; X'0002'
60 P 'C','M','A'; X'0001'
61 P 'R','T','L'; X'0408'
62 P 'R','T','R'; X'0410'
63 P 'R','A','L'; X'0008'
64 P 'R','A','R'; X'0010'
65 P 'O','A','S'; X'0004'
66 P 'H','L','T'; X'0020'
1 P 'N','O','P'; X'0000'
2 0
3
4 $DEF LTEMP=*
5 $LOC X'4000'
6 /VIDEO SCREEN (80 CHAR LINES)
7 $DEF V40=*+26, VPC=*+400+2, VMB=*+640+2
8 $DEF VL=*+1120+1, VAC=VL+4
9 80$' '
10 80$' '
11 40$' '
12 ' PDP-9 SIMULATOR '
13 40$' '
14 ' '
15 40$' '
16 ' Simulates PDP-9 instructions, '
17 40$' '
18 ' excluding CAL, EAE and IOT, '
19 40$' '
20 ' with core addresses limited '
21 40$' '
22 ' to the range 40 - 67. '
23 40$' '
24 ' Store values are entered '
25 40$' '
26 ' using standard mnemonics '
27 40$' '
28 ' and/or octal numerals. '
29 40$' '
30 ' '
31 40$' '
32 ' SPACEBAR: enter store values '
33 40$' '
34 ' DA xx: define address xx '
35 40$' '
36 ' GO xx: start at xx '
37 40$' '
38 ' '
39 40$' '
40 ' To control program use blue keys '
41 40$' '
42 ' DOT: single step '
43 40$' '
44 ' DASH: single inst '
45 40$' '
46 ' 0-9: run (0 slowest 9 fastest) '
47
48 $LOC VPC-80
49 'P C'
50 $LOC VMB-80
51 'M B'
52 $LOC VL-80
53 'L A C'
54
55 $LOC X'70'
56 z: '0 0 0 0 0 0' /SCREEN FORM OF ZERO
57
58 $LOC LTEMP
59
60 $MACRO CALL ROUTINE
61 DUMP NP,R15,1; JUMP ROUTINE
62 $END
63
64 $DEF OUT=W(*)
65 NP = NP-1
66 TEMP = NP
1 REC TEMP,R15,1
2
3 GETSYM:
4 READSYM SYM
5 SYM = SYM-32 IF SYM >= 96
6 JUMP OUT
7
8 PTEXT:
9 CYCLE
10 W(NP) = W(NP)&X'3FFF'+1 /INCREMENT RETURN AD
11 R3 = W(W(NP)+1)>>8
12 PRINT R3 IF R3 # 0
13 R3 = W(W(NP)+1)&255
14 JUMP OUT IF R3 = 0
15 PRINT R3
16 REPEAT
17
18 GETTAG: /READ AND PACK MNEMONIC
19 OP = 0
20 WHILE SYM >= 'A' AND SYM <= 'Z'
21 OP = OP<<5+SYM-64
22 CALL GETSYM
23 REPEAT
24 JUMP OUT
25
26 $MACRO MARK D,V /MARK SCREEN AD OF DEST
27 R2=V; R3=10; MODS OR,D,R3
28 $END
29
30 $MACRO UNMARK D
31 R2=127; R3=10; MODS AND,D,R3
32 $END
33
34 $MACRO SHOW N /DISPLAY NTH MNEMONIC
35 R3=N; CALL SHOWR
36 $END
37 $TEMP R2
38 SHOWR:
39 R3 = OP0(R3)
40 W(POS) = R3>>10&31+64
41 W(POS+1) = R3>>5&31+64
42 W(POS+2) = R3&31+64
43 POS = POS+3
44 JUMP OUT
45 $TEMP R2,R3
46
47 PAUSE:
48 CYCLE
49 J = KSYM
50 JUMP OUT IF J = ' '
51 J = KBITS(5)
52 JUMP PAUS5 IF J # 0
53 REPEAT IF MODE <= 0 OR TIMER # 0
54 TIMER = MODE
55 JUMP OUT
56 PAUS5:
57 CYCLE
58 REPEAT IF KBITS(5) # 0
59 IF J&6 # 0 /DOT,DASH
60 MODE = -1 /DOT: SINGLE STEP
61 MODE = 0 IF J&2 = 0 /DASH: SINGLE INST
62 ELSE
63 MODE = J>>6
64 TIMER = MODE
65 FINISH
66 J = 0
1 JUMP OUT
2
3 STPAUSE:
4 W(LOC-1) = J; W(LOC+11) = J
5 CALL PAUSE
6 W(LOC-1) = ' '; W(LOC+11) = ' '
7 JUMP OUT
8
9 $MACRO INC D /INCREMENT DEST BY 1
10 POS=D; CALL INCR
11 $END
12 INCR:
13 J = 10; I = 1
14 WHILE W(POS+J) = '7'
15 W(POS+J) = '0'
16 J = J-2
17 JUMP OUT IF J < 0 /(I SET)
18 REPEAT
19 W(POS+J) = W(POS+J)+1
20 I = 0
21 JUMP OUT
22
23 $MACRO LOAD D,S /LOAD DEST WITH SOURCE
24 R2=10; MOVE S,D,R2
25 $END
26
27 $MACRO CLEAR D /SET DEST TO 'ZERO'
28 R3=#Z; R2=10; MOVE R3,D,R2
29 $END
30
31 $MACRO LOCATE S /SET LOC FROM SOURCE
32 POS=S; CALL LOCATR
33 $END
34 LOCATR:
35 LOC = 0
36 JUMP OUT IF W(POS+2)!W(POS+4)!W(POS+6) # '0'
37 J = W(POS+8)-'6'
38 JUMP OUT IF J > 0
39 J = J+2
40 JUMP OUT IF J < 0
41 J = J<<3+W(POS+10)-'0' /0:27
42 LOC = (J<<2+J)<<4+#V40 /J*80+V40
43 JUMP OUT
44
45 /INITIAL ENTRY
46 START:
47 VLIM = VBASE+20
48 VPOS = VLIM
49 PC = VPC; MB = VMB
50 L = VL; AC = VAC
51 CLEAR PC; CLEAR MB
52 W(L) = '0'; CLEAR AC
53 LOC = V40; I = '4'; J = '0'
54 CYCLE
55 W(LOC-6) = I; W(LOC-4) = J
56 CLEAR LOC
57 LOC = LOC+80
58 J = J+1
59 IF J = '8'
60 J = '0'
61 I = I+1
62 FINISH
63 REPEAT IF I # '7'
64
65 /COMMAND STAGE
66 COMMAND:
1 POS = DBASE /INST MNEMONIC DISPLAY
2 I = POS+1; J = 17 /CLEAR GARBAGE
3 MOVE I,POS,J
4 NEXT:
5 LOCATE PC
6 IF LOC = 0
7 CLEAR PC; W(PC+8) = '4' /SET 40
8 LOC = V40
9 FINISH
10 CLEAR MB
11 MARK LOC,CURSOR
12 CYCLE
13 CALL GETSYM
14 REPEAT IF SYM = ' '
15 UNMARK LOC
16 PRINT NL /TO CLEAR REPORT AREA
17 JUMP BUMP IF SYM = NL
18 CALL GETTAG
19 IF OP # 0
20 POS = #OP0; J = -2 /LOOKUP INST MNEMONIC
21 WHILE W(POS+J) # OP
22 J = J+1
23 JUMP GROUP IF J = 17
24 REPEAT
25 OP = J<<1
26 OP = OP-1 IF OP = 32 /LAW
27 IF OP < 26 AND SYM = '*' /MEM-REF & INDIRECT
28 OP = OP+1
29 CALL GETSYM
30 FINISH
31 WHILE SYM = ' '
32 GET GETSYM
33 REPEAT
34 FINISH
35 WHILE SYM >= '0' AND SYM <= '7'
36 POS = MB+12; I = MB+10 /SHIFT UP MB
37 J = -10
38 MOVE POS,I,J
39 W(I) = SYM /APPEND NEW DIGIT
40 CALL GETSYM
41 REPEAT
42 JUMP SETOP
43 GROUP:
44 J = 0 /ACCUMULATE OPR
45 CYCLE
46 POS = #OP0(17) /START OF OPR MNEMONICS
47 WHILE W(POS) # OP
48 JUMP ER1 IF W(POS) = 0
49 POS = POS+2
50 REPEAT
51 J = J!W(POS+1) /MNEMONIC VALUE
52 OP = 0;
53 IF SYM = '!'
54 CALL GETSYM
55 CALL GETTAG
56 FINISH
57 REPEAT IF OP # 0
58 I = 10
59 CYCLE
60 W(MB+I) = J&7+'0'
61 J = J/8; I = I-2
62 REPEAT IF I # 0
63 OP = 30
64 SETOP:
65 JUMP ER5 IF SYM # NL
66 JUMP SPECIAL IF OP < 0
1 IF OP > 0
2 JUMP ER3 IF W(MB+2)&6 # 0
3 JUMP ER3 IF W(MB) # 0
4 W(MB) = OP/4+'0'
5 OP = (OP&3)<<1
6 W(MB+2) = W(MB+2)+OP
7 FINISH
8 LOAD LOC,MB
9 BUMP:
10 INC PC
11 JUMP NEXT
12
13 SPECIAL:
14 LOAD PC,MB IF W(MB+8) # '0'
15 JUMP NEXT IF OP = -4 /DEFINE ADDRESS
16 JUMP GO
17 ER1:CALL PTEXT; B '*UNKNOWN MNEMONIC',NL,0
18 JUMP ER4
19 ER3:CALL PTEXT; B '*INVALID ADDRESS',NL,0
20 ER4:WHILE SYM # NL
21 CALL GETSYM
22 REPEAT
23 JUMP NEXT
24 ER5:CALL PTEXT; B '* ?',0
25 WHILE SYM # NL
26 PRINT SYM
27 CALL GETSYM
28 REPEAT
29 JUMP NEXT
30
31 /EXECUTION STAGE
32 OPERR:
33 CALL PTEXT; B '*ILLEGAL OPCODE',NL,0
34 POS = SKIP
35 JUMP ER9
36 ADERR:
37 CALL PTEXT; B '*ILLEGAL ADDRESS',NL,0
38 MARK POS,CURSOR
39 ER9:MODE = 0
40 CALL PAUSE
41 UNMARK POS
42 UNMARK SKIP IF SKIP # 0
43 SKIP = 0
44 PRINT NL
45 JUMP COMMAND IF J = ' '
46 IF POS = PC
47 CLEAR PC; W(PC+8) = '4'
48 FINISH
49 JUMP EXEC
50 GO:
51 MODE = 0; SKIP = 0
52 EXEC:
53 INC PC IF SKIP # 0
54 LOCATE PC
55 SKIP = LOC; JUMP ADERR IF SKIP = 0
56 INC PC
57 XXCT:
58 SKIP = LOC
59 POS = DBASE /INST MNEMONIC DISPLAY
60 I = POS+1; J = 17 /CLEAR LAST
61 MOVE I,POS,J
62 LOAD MB,LOC /INSTRUCTION FETCH
63 MARK SKIP,CURSOR
64 OP = (W(MB)&7)<<1 /EXTRACT OP-CODE
65 OP = OP+1 IF W(MB+2)&4 # 0
66 I = W(MB+2)&2 /INDIRECT BIT
1 JUMP XOPR IF OP = 15 /TREAT OPR INDEPENDENTLY
2 SHOW OP /DISPLAY MNEMONIC
3 W(POS) = '*' IF I # 0 /INDIRECT
4 CALL PAUSE
5 IF J = ' '
6 UNMARK SKIP
7 JUMP COMMAND
8 FINISH
9 JUMP OPERR IF OP=0 OR OP=13 OR OP=14 /CAL,EAE,IOT ->
10 W(MB) = '0' /CLEAR TOP 5 BITS
11 W(MB+2) = W(MB+2)&1
12 LOCATE MB
13 JUMP ADERR IF LOC = 0
14 IF I # 0 /INDIRECT
15 IF MODE # 0
16 J = '*'
17 CALL STPAUSE
18 FINISH
19 LOAD MB,LOC
20 LOCATE MB
21 JUMP ADERR IF LOC = 0
22 FINISH
23 IF MODE # 0 AND OP # 12
24 J = 2
25 CALL STPAUSE
26 FINISH
27 UNMARK SKIP
28 SKIP = 0
29 R15 = R15+OP /SWITCH ON OP-CODE
30 JUMP W(*); JUMP XDAC; JUMP XJMS; JUMP XDZM
31 JUMP XLAC; JUMP XXOR; JUMP XADD; JUMP XTAD
32 JUMP XXCT; JUMP XISZ; JUMP XAND; JUMP XSAD
33 XJMP:
34 LOAD PC,MB
35 JUMP EXEC
36 XLAC:
37 LOAD AC,LOC
38 JUMP EXEC
39 XDAC:
40 LOAD LOAD,AC
41 JUMP EXEC
42 XDZM:
43 CLEAR LOC
44 JUMP EXEC
45 XISZ:
46 INC LOC; SKIP = I
47 JUMP EXEC
48 XJMS:
49 LOAD LOC,PC
50 W(LOC) = '4' IF W(L) # 0 /LINK TO SIGN
51 INC MB; LOAD PC,MB
52 JUMP EXEC
53 XADD:
54 POS = W(AC) /SAVE MS DIGIT
55 XTAD:
56 I = 10; J = 0
57 CYCLE
58 J = W(AC+I)+W(LOC+I)+J
59 W(AC+I) = J&7+'0'
60 J = J>>3&1
61 I = I-2
62 REPEAT IF I >= 0
63 IF OP = 7 /TAD
64 W(L) = W(L)\7
65 ELSE /ADD
66 INC AC IF J # 0 /END-AROUND CARRY
1 W(L) = '1' IF (W(LOC)\POS)&4 = 0 AND (W(AC)\POS)&4 # 0
2 FINISH
3 JUMP EXEC
4 XXOR:
5 I = 10
6 CYCLE
7 W(AC+I) = W(AC+I)\W(LOC+I)+'0'
8 I = I-2
9 REPEAT IF I >= 0
10 JUMP EXEC
11 XAND:
12 I = 10
13 CYCLE
14 W(AC+I) = W(AC+I)&W(LOC+I)
15 I = I-2
16 REPEAT IF I >= 0
17 JUMP EXEC
18 XSAD:
19 I = 12
20 CYCLE
21 I = I-2
22 JUMP EXEC IF I < 0
23 REPEAT IF W(AC+I) = W(LOC+I)
24 SKIP = 1
25 JUMP EXEC
26 XOPR:
27 JUMP XLAW IF I # 0
28 OP = W(MB+2)&1 /ACCUMULATE SUB-BITS
29 I = 4
30 CYCLE
31 OP = OP<<3+W(MB+I)-'0'
32 I = I+2
33 REPEAT IF I # 12
34 J = 0; I = #OP0(17)
35 CYCLE
36 IF \OP&W(I+1) = 0 AND \J&W(I+1) # 0
37 J = J!W(I+1)
38 SHOW I-#OP0
39 IF J # OP
40 W(POS) = '!'
41 POS = POS+1
42 J = OP IF POS >= DBASE+15
43 FINISH
44 FINISH
45 I = I+2
46 REPEAT IF W(I) # 0
47 CALL PAUSE
48 UNMARK SKIP; SKIP = 0
49 JUMP COMMAND IF J = ' '
50 J = OP/64 /HIGH-ORDER 7 BITS
51 IF J&4 # 0 /SNL,SZL
52 SKIP = 1 IF W(L) = '1'
53 FINISH
54 IF J&1 # 0 /SMA,SPA
55 SKIP = 1 IF W(AC)&64 # 0
56 FINISH
57 IF J&2 # 0 /SZA,SNA
58 R2 = '0'; R3 = 10
59 TEST 2,AC,R3 /REG < STORE
60 SKIP = 1 /(SINGLE INST)
61 FINISH
62 SKIP = SKIP\1 IF J&8 # 0 /INVERT
63 IF J&X'20' # 0 /CLL
64 W(L) = '0'
65 FINISH
66 IF J&X'40' # 0 /CLA
1 CLEAR AC
2 FINISH
3 IF OP&2 # 0 /CML
4 W(L) = W(L)\1
5 FINISH
6 IF OP&1 # 0 /CMA
7 I = 10
8 CYCLE
9 W(AC+I) = W(AC+I)\7
10 I = I-2
11 REPEAT IF I >= 0
12 FINISH
13 MODE = 0 IF OP&X'20' # 0 /HLT
14 IF OP&8 # 0 /RAL,RTL
15 OP = J&X'10' /'ROTATE 2' BIT
16 CYCLE
17 I = 10; J = W(L)&1
18 CYCLE
19 J = W(AC+I)<<1+J
20 W(AC+I) = J&7+'0'
21 J = J>>3&1
22 I = I-2
23 REPEAT IF I >= 0
24 W(L) = J+'0'
25 OP = OP-X'10'
26 REPEAT IF OP = 0
27 ELSE IF OP&X'10' # 0 /RAR,RTR
28 OP = J&X'10'
29 CYCLE
30 I = 0; J = W(L)
31 CYCLE
32 J = ((J&1)<<3)+(W(AC+I)&7)
33 W(AC+I) = J/2+'0'
34 I = I+2
35 REPEAT IF I # 12
36 W(L) = J&1+'0'
37 OP = OP-X'10'
38 REPEAT IF OP = 0
39 FINISH
40 JUMP EXEC
41 XLAW:
42 SHOW 16
43 CALL PAUSE
44 UNMARK SKIP; SKIP = 0
45 JUMP COMMAND IF J = ' '
46 LOAD AC,MB
47 JUMP EXEC
48
49 $END
50 $END