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