Trailing-Edge
-
PDP-10 Archives
-
decus_20tap2_198111
-
decus/20-0027/driver.mac
There are 2 other files named driver.mac in the archive. Click here to see a list.
00100 TITLE DRIVER FOR THE PDP8 SIMULATOR VERSION #2 SEPT. 1 '69
00200 SUBTTL DAVE MCCLURE JULY/9/69
00300
00400 EXTERNAL DOOR,INI,S,C,L,DP,E,SS,.JBDDT,STARTT,IF,IBR
00500 EXTERNAL FETCHY,STOREY,PRINT,FCLOSE,SR,IFSW,DFSW,DFF,EXIT
00600
00700 IFE INLINE,<EXTERNAL CORE
00800 IFE PACK,<EXTERNAL FETPNT>>
00900
01000 GO: MOVEI AC0,GO1
01100 MOVEM AC0,DOOR ;SET RETURN ADDRESS
01200 JRST INI ;INITIALIZE LOTS OF STUFF
01300 GO1: SIZE=<MEMSIZ-^D4096>/^D4096
01400 IFE SIZE, <OUTSTR [ASCIZ /You have a 4K simulated PDP/]
01500 RIMADR=7756>
01600 SIZE=SIZE-1
01700 IFE SIZE,<OUTSTR [ASCIZ /You have aN 8K simulated PDP/]
01800 RIMADR=117756>
01900 SIZE=SIZE-1
02000 IFE SIZE,<OUTSTR [ASCIZ /You have a 12K simulated PDP/]
02100 RIMADR=227756>
02200 SIZE=SIZE-1
02300 IFE SIZE,<OUTSTR [ASCIZ /You have a 16K simulated PDP/]
02400 RIMADR=33756>
02500 SIZE=SIZE-1
02600 IFE SIZE,<OUTSTR [ASCIZ /You have a 20K simulated PDP/]
02700 RIMADR=447756>
02800 SIZE=SIZE-1
02900 IFE SIZE,<OUTSTR [ASCIZ /You have a 24K simulated PDP/]
03000 RIMADR=557756>
03100 SIZE=SIZE-1
03200 IFE SIZE,<OUTSTR [ASCIZ /You have a 28K simulated PDP/]
03300 RIMADR=667756>
03400 SIZE=SIZE-1
03500 IFE SIZE,<OUTSTR [ASCIZ /You have a 32K simulated PDP/]
03600 RIMADR=777756>
03700 PURGE SIZE
03800 IFE PDP8,<OUTSTR [ASCIZ /-8/]>
03900 IFE PDP8I,<OUTSTR [ASCIZ /8I/]>
04000 IFE PDP8S,<OUTSTR [ASCIZ /8S/]>
04100 IFE PDP8L,<OUTSTR [ASCIZ /8L/]>
04200 IFE INLINE,<OUTSTR [ASCIZ /(inline version)/]>
04300 IFN INLINE,<OUTSTR [ASCIZ /(subroutine version)/]>
04400 IFE PACK,<OUTSTR [ASCIZ / with a packed memory.
04500
04600 /]>
04700 IFN PACK,<OUTSTR [ASCIZ / with an unpacked memory.
04800
04900 /]>
05000 IFE ESTOP,<OUTSTR [ASCIZ /stop on illegal instructions
05100 /]>
05200 IFN ESTOP,<OUTSTR [ASCIZ /noop illegal instructions
05300 /]>
05400 IFE <DDF32-1>,<OUTSTR [ASCIZ /1 DF32 disk
05500 /]>
05600 IFE <DDF32-2>,<OUTSTR [ASCIZ /2 DF32 disks
05700 /]>
05800 IFE <DDF32-3>,<OUTSTR [ASCIZ /3 DF32 disks
05900 /]>
06000 IFE <DDF32-4>,<OUTSTR [ASCIZ /4 DF32 disks
06100 /]>
06200 IFE DRM08,<OUTSTR [ASCIZ /RM08
06300 /]>
06400 IFE DCS680,<OUTSTR [ASCIZ /680/
06500 /]>
06600 IFE PLOTER,<OUTSTR [ASCIZ /PLOTTER
06700 /]>
06800 MOVEI AC0,GO3
06900 MOVEM AC0,DOOR ;SET RETURN ADDRESS
07000
07100 ENTRY OPR,DRDATA,ALPHA,SIXOUT
07200
07300 ;GET A COMMAND - DECODE IT AND DISPATCH TO PROPER ROUTINES
07400 OPR: CLRBFI ;DELETE TYPE AHEAD
07500 SETOM AC0 ;LOAD -1
07600 GETLIN AC0 ;GET CHARACTERISTIC OF THIS LINE
07700 TLZ AC0,6 ;SET TO FULL DUPLEX NORMAL MODE
07800 SETLIN AC0 ;EFFECT CHANGES
07900 OUTSTR [ASCIZ /
08000 */]
08100 SETZM LASTC# ;ENABLE COMMAND INPUT
08200 PUSHJ PDP,SIXIN ;GET A COMMAND
08300 HLRZS AC1 ;REDUCE TO AT MOST 3 CHARACTERS
08400 COM: MOVSI AC3,CLIST-ENDC ;ESTABLISH COUNTER
08500 HLRZ AC4,CLIST(AC3) ;LOAD COMMAND TO COMPARE
08600 CAIE AC1,(AC4) ;ARE THEY THE SAME?
08700 AOBJN AC3,.-2 ;N0 - TRY ANOTHER?
08800 MOVEI AC3,(AC3) ;ZERO LEFT HALF OF AC3
08900 HRRZ AC0,CLIST(AC3) ;LOAD DISPATCH ADDRESS
09000 CAIGE AC3,LL ;IS THIS A CONSOL COMMAND?
09100 JRST LEAVE ;YES SO CLEAN UP AREA BEFORE LEAVING
09200 JRST (AC0)
09300
09400 ;PUT NEXT CHARACTER IN AC2 IF ALPHABETIC SKIP RETURN
09500 ; IF NOT ALPHABETIC NONSKIP RETURN
09600 ;TO CALL PUSHJ PDP,ALPHA
09700 ALPHA: MOVE AC2,LASTC
09800 CAIE AC2,12 ;WAS IT A LINE FEED
09900 INCHWL AC2 ;NO SO ITS OK TO READ ANOTHER
10000 MOVEM AC2,LASTC ;NOTE LAST CHARACTER
10100 CAIL AC2,101
10200 AOS (PDP)
10300 CAILE AC2,132
10400 SOS (PDP)
10500 POPJ PDP,
10600
10700 MOVE AC2,LASTC ;NOTE LAST CHARACTER
10800 CAIE AC2,12 ;WAS IT A LINE FEED?
10900 INCHWL AC2 ;NO SO GET NEXT CHARACTER
11000 MOVEM AC2,LASTC ;REMEMBER WHAT WAS LAST CHARACTER
11100 NUMER: CAIL AC2,60 ;LESS THAN ASCII 0?
11200 AOS (PDP) ;NO SO PERHAPS A SKIP
11300 CAILE AC2,67 ;LESS THAN ASCII 7?
11400 SOS (PDP) ;NO SO CHANGE SKIP TO NONSKIP
11500 POPJ PDP,
11600
11700 ;GET AN OCTAL NUMBER FROM TTY, LOAD IN AC1 AND RETURN
11800 ;IF AN ERROR OCCURES (8 OR 9) "EH!"
11900 OCTAL: SETZ AC1,
12000 MOVEI AC3,^D11 ;LOAD COUNTER FOR # OF DIGITS
12100 OCT1: PUSHJ PDP,NUMER-4 ;GET NUMBER
12200 JRST OCT2 ;NONNUMERIC
12300 ROT AC2,-3 ;LEFT JUSTIFY
12400 ROTC AC1,3 ;SAVE JUST ACQUIRED LSD
12500 SOJGE AC3,OCT1 ;CAN WE ACCEPT MORE?
12600 JRST EH ;NO
12700 OCT2: CAIE AC2,70 ;ASCII "8"
12800 CAIN AC2,71 ;ASCII "9"
12900 JRST EH ;YES
13000 CAIN AC2,32(AC3) ;LEADING BLANK?
13100 JRST OCT1 ;YES
13200 POPJ PDP, ;LEAVE
13300
13400 DDT: HRRZ AC0,.JBDDT ;LOAD EXIT WITH DDT START
13500 JUMPE AC0,EH ;IF NO DDT THEM MOAN
13600
13700 LEAVE: PUSHJ PDP,ALPHA ;GET NEXT CHARACTER
13800 CAIE AC2,12 ;WAS IT A LINE FEED
13900 JRST .-2 ;NO
14000 JRST (AC0) ;END OF LINE SO DISPATCH
14100
14200 RIM: MOVEI AC1,RIMADR ;LOAD ADDRES OF RIM LOADER
14300 JRST ST+1
14400
14500 BIN: MOVEI AC1,MEMSIZ-1 ;LOAD STARTING ADDRESS OF BINARY LOADER
14600 MOVEI AC0,3777 ;TELL LOADER TO USE HIGH SPEED READER
14700 MOVEM AC0,SR
14800 JRST ST+1 ;START THE BINARY LOADER
14900
15000 EXTERNAL RDATA,PDATA,KDATA,TDATA
15100 ZIP: OUTSTR [ASCIZ /READER/]
15200 MOVE AC2,RDATA ;LOAD THE READER TIME CONSTANT
15300 PUSHJ PDP,ZIP1
15400 MOVEM AC1,RDATA ;STORE NEW TIME CONSTANT
15500 OUTSTR [ASCIZ /PUNCH/]
15600 MOVE AC2,PDATA
15700 PUSHJ PDP,ZIP1
15800 MOVEM AC1,PDATA
15900 OUTSTR [ASCIZ /KEYBOARD/]
16000 MOVE AC2,KDATA
16100 PUSHJ PDP,ZIP1
16200 MOVEM AC1,KDATA
16300 OUTSTR [ASCIZ /TELEPRINTER/]
16400 MOVE AC2,TDATA
16500 PUSHJ PDP,ZIP1
16600 MOVEM AC1,TDATA
16700 IFE PLOTER,<
16800 OUTSTR [ASCIZ /PLOTTER/]
16900 MOVE AC2,PLDATA
17000 PUSHJ PDP,ZIP1
17100 MOVEM AC1,PLDATA>
17200 JRST REOPR ;GET ANOTHER CONSOLE COMMAND
17300 ZIP1: OUTSTR [ASCIZ / speed was /]
17400 MOVE AC1,[^D4000000] ;LOAD 4,000,000 QUARTER MICROSEC.
17500 IDIV AC1,AC2 ;GET CPS
17600 MOVEI AC2,^D12 ;LOAD DIGIT COUNTER
17700 SOJE AC2,EH ;ARE THERE ANY DIGITS LEFT
17800 LSH AC1,3 ;SHIFT OFF MOST SIGNIFICANT ZERO
17900 TLNN AC1,700000 ;LEADING DIGIT A ZERO?
18000 JRST .-3
18100 PUSHJ PDP,OCTP+2 ;TYPE TIME CONSTANT
18200 OUTSTR [ASCIZ /cps, change to /]
18300 SETZM LASTC ;ENABLE INPUT
18400 PUSHJ PDP,OCTAL ;GET A NEW TIME CONSTANT
18500 CAIG AC1, ;IS THE NUMBER 0 OR NEGATIVE?
18600 JRST OCT3 ;YES SO SKIP OUT
18700 MOVE AC2,[^D4000000] ;LOAD 1 SECOND
18800 IDIV AC2,AC1 ;GET TIME CONSTANT
18900 MOVE AC1,AC2 ;PUT AC2 WHERE LEAVING WON'T KILL IT
19000 CAIG AC1, ;ISCONSTANT 0 OR NEGATIVE
19100 OCT3: AOS (PDP) ;YES
19200 POP PDP,AC0
19300 JRST LEAVE
19400
19500
19600 ;TYPE OUT FILE NAMES AND MODIFY IF REQUESTED
19700 EXTERNAL RCDATA,PCDATA,PRCDAT
19800 FIL: OUTSTR [ASCIZ /READER/]
19900 MOVEI FDB,RCDATA ;LOAD FDB WITH READER DATA BLOCK ADD
20000 JSP AC0,FILE ;WORK WITH IT
20100 OUTSTR [ASCIZ /PUNCH/]
20200 MOVEI FDB,PCDATA ;LOAD FDB WITH PUNCH DATA BLOCK ADD
20300 JSP AC0,FILE ;MASSAGE IT
20400 OUTSTR [ASCIZ /PRINTER/]
20500 MOVEI FDB,PRCDATA
20600 JSP AC0,FILE
20700 IFE PLOTER,<EXTERNAL PLCDAT,PLDATA
20800 OUTSTR [ASCIZ /PLOTTER/]
20900 MOVEI FDB,PLCDAT
21000 JSP AC0,FILE>
21100 IFN DDF32,<EXTERNAL DCDATA
21200 OUTSTR [ASCIZ /DF32/]
21300 MOVEI FDB,DCDATA
21400 JSP AC0,FILE>
21500 JRST REOPR ;RETURN TO COMMAND LEVEL
21600 ;TYPE DEV:FILE.EXT AND REQUEST MODIFICATIONS
21700 ;CALL: LOAD FDB JSP AC0,FILE
21800 FILE: OUTCHR [11] ;TAB
21900 MOVE AC1,CDNAM(FDB) ;LOAD DEVICE NAME
22000 PUSHJ PDP,SIXOUT ;TYPE IT
22100 OUTCHR [72] ;":"
22200 MOVE AC1,@CDIR(FDB) ;FILE NAME
22300 PUSHJ PDP,SIXOUT ;TYPE IT
22400 MOVE AC1,CDIR(FDB) ;LOAD ADDRESS OF ENTER BLOCK
22500 HLLZ AC1,1(AC1) ;GET FILE EXTENSION
22600 OUTCHR [56] ;"."
22700 PUSHJ PDP,SIXOUT ;TYPE IT
22800 OUTSTR [ASCIZ / modify this with /]
22900 SETZM LASTC ;ENABLE INPUT
23000 PUSHJ PDP,SIXIN ;GET DEVICE NAME
23100 PUSH PDP,AC1 ;SAVE INPUT WORD FOR CLOSING TEST
23200 CAIE AC2,72 ;":"?
23300 JRST FNME ;NO TRY FOR A FILE NAME INSTEAD
23400 MOVEM AC1,CDNAM(FDB) ;SAVE DEVICE NAME
23500 PUSHJ PDP,SIXIN ;GET FILE EXTENSION
23600 FNME: CAIE AC1,0 ;FILE NAME?
23700 MOVEM AC1,@CDIR(FDB) ;YES SO SAVE
23800 PUSHJ PDP,SIXIN ;GET EXTENSION
23900 MOVE AC2,CDIR(FDB) ;ADDRESS OF ENTER BLOCK
24000 CAIE AC1,0 ;FILE EXTENSION HERE?
24100 HLLZM AC1,1(AC2) ;YES SO SAVE IT
24200 POP PDP,AC2
24300 CAME AC1,AC2 ;DEVICE NAME AND EXTENSION SAME?
24400 JSP SRR,FCLOSE ;NO - SOMETHING CHANGED,CLOSE
24500 JRST LEAVE
24600
24700 ;TYPE SIXBIT CONTENTS OF AC1, UP TO 6 CHARS, STOP ON A BLANK
24800 ;DOESN'T USE AC0
24900 ;CALL LOAD AC1 PUSHJ PDP,SIXOUT
25000 SIXOUT: MOVE AC2,[POINT 6,AC1] ;BYTE POINTER TO GET CHARS
25100 MOVEI AC4,6 ;WATCH FOR MAX COUNT
25200 ILDB AC3,AC2 ;GET NEXT CHAR
25300 JUMPE AC3,POP ;EXIT ON BLANK
25400 ADDI AC3,40 ;CONVERT TO ASCII
25500 OUTCHR AC3 ;TYPE
25600 SOJG AC4,.-4
25700 POP: POPJ PDP,
25800
25900
26000
26100 ;PUT NEXT ALPHABETIC WORD FROM TTY IN AC1 AS LEFT JUSTIFIED SIXBIT.
26200 ;IF WORD IS MORE THAN SIX CHARACTERS SLUFF OFF TRAILING EXCESS.
26300 ;LEAVE THE DELIMITER IN AC2 AND LASTC.
26400 SIXIN: MOVEI AC3,6 ;LOAD A COUNTER FOR NUMBER OF CHARACTERS
26500 PUSHJ PDP,ALPHA ;GET NEXT ALPHA CHAR
26600 JRST .+2 ;NOT ALPHA PERHAPS DIGIT?
26700 JRST .+3 ;ALPHABETIC SO CONTINUE
26800 PUSHJ PDP,NUMER ;TEST FOR NUMERIC
26900 JRST S2 ;NOT NUMMERIC EITHER
27000 SUBI AC2,40 ;CONVERT TO SIXBIT
27100 ROT AC2,-6 ;LEFT JUSTIFY CHAR IN AC2
27200 LSHC AC1,6 ;PUT NEW CHAR IN AC1
27300 SOJG AC3,SIXIN+1 ;GET NEXT CHAR AND CONTINUE
27400 PUSHJ PDP,ALPHA ;TOO MANY CHARACTERS!
27500 JRST .+2 ;FINALLY A DELIMITER
27600 JRST .-2 ;STILL MORE TO SLUFF
27700 S2: CAIN AC2,32(AC3) ;PERHAPS A LEADING BLANK?
27800 JRST SIXIN ;PROBABLY SO TRY AGAIN
27900 CAIN AC3, ;IS SIXBIT WORD LEFT JUSTIFIED
28000 POPJ PDP, ;AC1 FULLY JUSTIFIED SO RETURN
28100 LSH AC1,6 ;SHIFT ONE MORE POSITION
28200 SOJA AC3,.-3 ;MODIFY CHAR COUNT AND PROCEED
28300
28400
28500 SW: PUSHJ PDP,OCTAL ;GET AN OCTAL NUMBER IN AC1
28600 MOVE AC0,AC1
28700 ANDI AC0,7777 ;REDUCE TO 12 BITS
28800 MOVEM AC0,SR ;LOAD SWITCH REGISTER
28900 PUSH PDP,AC1
29000 ANDI AC1,70000 ;MASK OUT SR AND DFF
29100 MOVEM AC1,IFSW ;STORE IFSW
29200 POP PDP,AC1
29300 ANDI AC1,700000 ;MASK OUT IF AND SR
29400 LSH AC1,-3 ;POSITION
29500 MOVEM AC1,DFSW ;STORE DFSW
29600 JRST REOPR ;GET ANOTHER COMMAND AND CONTINUE
29700
29800 ST: PUSHJ PDP,OCTAL ;GET AN OCTAL NUMBER
29900 MOVE PC,AC1 ;LOAD PC
30000 ANDI PC,7777 ;REMOVE DFF AND IF IF PRESENT
30100 PUSH PDP,AC1 ;SAVE AC1
30200 ANDI AC1,70000 ;MASK OFF PC AND DFF
30300 MOVEM AC1,IF ;AND SAVE IF
30400 MOVEM AC1,IBR ;AND SAVE IBR
30500 POP PDP,AC1 ;RESTORE AC1
30600 ANDI AC1,700000 ;MASK OFF IF AND PC
30700 LSH AC1,-3 ;POSITION FOR DFF
30800 MOVEM AC1,DFF ;AND SAVE DFF
30900 MOVEI AC0,S ;PREPARE TO LEAVE
31000 JRST LEAVE
31100
31200 DDD: PUSHJ PDP,PCSAVE ;SAVE PC
31300 PUSHJ PDP,OCTAL ;GET FIRST ADDRESS
31400 ANDI AC1,77777 ;REMOVE DFF IF PRESENT
31500 MOVE PC,AC1 ;LOAD PC
31600 TRZ PC,770000 ;AND MASK OFF IF
31700 TRZ AC1,707777 ;MASK OFF DFF AND PC
31800 MOVEM AC1,IF ;AND STORE IF
31900 D1: PUSHJ PDP,OCTAL ;GET A DATA WORD
32000 CAIN AC3,^D11 ;WERE ANY DIGITS PICKED UP?
32100 JRST PCREST ;NO SO RESTORE PC AND EXIT
32200 CAIN AC2,72 ;LAST CHAR A":"?
32300 JRST DDD+2 ;YES WE PICKED UP AN ADDRESS
32400 MOVE MB,AC1 ;SO LOAD MEMORY BUFFER
32500 ANDI MB,7777 ;AND MASK OFF EXTRA BITS
32600 MOVE MA,PC ;LOAD ADDRESS FOR THE DATA
32700 PUSHJ PDP,STOREY
32800 AOS PC ;INCREMENT MEMORY ADDRESS
32900 TRZ PC,10000 ;TEST FOR PC CARRYOUT
33000 JRST D1 ;GET ANOTHER DATA WORD
33100
33200 ;PRINT WORD(12 BITS) IN AC0
33300 PWORD: PUSH PDP,AC0 ;PRESERVE AC0
33400 MOVE AC1,AC4 ;LOAD WORD NUMBER
33500 IDIVI AC1,30
33600 SKIPN AC2 ;DIVISIBLE BY 30?
33700 PUSHJ PDP,LINEN ;YES SO A NEW LINE
33800 MOVEI AC1,40 ;LOAD A BLANK
33900 ANDI AC2,7 ;LEAVE RESIDUE MODULO 8
34000 JUMPN AC2,.+3 ;DIVISIBLE BY 8?
34100 PUSHJ PDP,PRINT
34200 PUSHJ PDP,PRINT
34300 PUSHJ PDP,PRINT
34400 POP PDP,AC0 ;RESTORE AC0
34500 PWRD: ROT AC0,-^D12 ;LEFT JUSTIFY
34600 MOVEI AC2,4 ;DIGIT COUNTER
34700 HRRI AC1,6
34800 ROTC AC0,3 ;SHIFT IN MSD AND CONVERT TO ASCII
34900 PUSHJ PDP,PRINT
35000 SOJG AC2,.-3
35100 POPJ PDP,
35200
35300 CARRET: MOVEI AC1,15 ;CARRIAGE RETURN
35400 PUSHJ PDP,PRINT
35500 MOVEI AC1,12 ;LINE FEED
35600 PUSHJ PDP,PRINT
35700 POPJ PDP, ;RETURN
35800
35900 LINEN: PUSHJ PDP,CARRET ;CARRIAGE RETURN LINE FEED
36000 TRNN AC4,37 ;EXTRA CARRIAGE RETURN FOR LEGIBILITY?
36100 PUSHJ PDP,CARRET ;YES
36200 SKIPE AC1,IF
36300 ORI AC1,600000 ;CONVERT TO ASCII NUMBER
36400 IORI AC1,400000 ;CONVERT TO ASCII OR BLANK
36500 LSH AC1,-^D12 ;RIGHT JUSTIFY
36600 PUSHJ PDP,PRINT
36700 MOVE AC0,AC4
36800 PUSHJ PDP,PWRD ;PRINT LSD'S OF ADDRESS
36900 MOVE AC0,AC4
37000 IDIVI AC0,30
37100 MOVE AC0,AC1 ;SAVE REMAINDER
37200 IMULI AC0,5 ;CALCULATE NUMBER OF WORDS TO SKIP
37300 IDIVI AC1,10 ;DIVIDE BY 8
37400 LSH AC2,1 ;MULTIPLY QUOTIENT BY 2
37500 ADD AC0,AC2 ;ADD 2SPACE/ GROUP OF 8WORDS SKIPED
37600 MOVEI AC1,40
37700 SOJL AC0,.+3
37800 PUSHJ PDP,PRINT
37900 JRST .-2
38000 POPJ PDP,
38100
38200 PCSAVE: MOVE AC0,PC ;LOAD PC
38300 OR AC0,IF ;SAVE THE INSTRUCTION FIELD
38400 ROT AC0,-3
38500 OR AC0,DFF ;SAVE DFF ALSO
38600 ROT AC0,-^D12 ;SHIFT DFF TO LS BITS
38700 MOVEM AC0,REM ;SAVE PC
38800 POPJ PDP,
38900
39000 IFN DDF32,<
39100 ;READ THE FIRST BLOCK OF THE DISK INTO THE TOP PAGE OF CORE
39200 BOOT: SETZM IF
39300 MOVSI AC4,-7
39400 LOAD0: HLR MA,LOADL(AC4)
39500 HRR MB,LOADL(AC4)
39600 PUSHJ PDP,STOREY
39700 AOBJN AC4,LOAD0
39800 MOVEI AC1,200 ;STARTING ADDRESS
39900 JRST ST+1
40000
40100 LOADL: XWD 200,6603
40200 XWD 201,6622
40300 XWD 202,5201
40400 XWD 203,5604
40500 XWD 204,7600
40600 XWD 7750,7576
40700 XWD 7751,7576>
40800
40900 DUMP: MOVE AC0,FLAGS ;LOAD FLAGS TO PRINT
41000 MOVEI AC2,6 ;6 DIGITS PER HALF WORD
41100 PUSHJ PDP,PWRD+2
41200 MOVEI AC2,6
41300 PUSHJ PDP,PWRD+2
41400 MOVEI AC1,11 ;TAB
41500 PUSHJ PDP,PRINT
41600 MOVE AC0,DFF ;LOAD THE DATA FIELD
41700 LSH AC0,3
41800 IORI AC0,IF ;ADD INSTRUCTION FIELD
41900 OR AC0,PC ;ADD PC
42000 MOVEI AC2,6
42100 PUSHJ PDP,PWRD+2
42200 MOVEI AC1,11 ;TAB
42300 PUSHJ PDP,PRINT
42400 MOVE AC0,AC ;LOAD THE AC AND LINK
42500 MOVEI AC2,5
42600 PUSHJ PDP,PWRD+2
42700 PUSHJ PDP,CARRET
42800 SETZM AC4
42900 PUSHJ PDP,PCSAVE
43000 DMP3: PUSHJ PDP,DASHC
43100 JRST DMP1 ;NOT INPUT NUMBERS
43200 PUSHJ PDP,CARRET
43300 DMP2: AOS AC1,AC4 ;INCREMENT ADDRESS
43400 IDIVI AC1,30 ;DIVISIBLE BY 30?
43500 CAIE AC1,0
43600 PUSHJ PDP,LINEN ;YES SO START A NEW LINE
43700 SOS AC4 ;CORRECT AC4
43800 PUSHJ PDP,GET ;GET FIRST NUMBER
43900 DMP0: MOVE AC0,MB
44000 PUSHJ PDP,PWORD ;TYPE THIS LOCATION
44100 CAML AC4,DASH ;UNFINISHED N-M?
44200 JRST DMP3 ;NO
44300 PUSHJ PDP,GET
44400 JRST DMP0
44500 DMP1: JUMPE AC4,DALL
44600 MOVEI FDB,PRCDAT
44700 JSP SRR,FCLOSE ;DUMP BUFFERS
44800 PCREST: PUSHJ PDP,REST1
44900 JRST REOPR
45000 REST1: MOVE AC0,REM
45100 DPB AC0,[POINT 3,DFF,23] ;RESTORE DFF
45200 ROT AC0,3
45300 DPB AC0,[POINT 3,IF,23] ;RESTORE IF
45400 HLRZ PC,AC0 ;RESTORE PC
45500 LSH PC,-6
45600 POPJ PDP,
45700
45800 DALL: SETOM AC4
45900 MOVEI AC0,MEMSIZ-1
46000 MOVEM AC0,DASH
46100 JRST DMP2
46200
46300 DASHC: SETZM DASH#
46400 PUSHJ PDP,OCTAL
46500 CAIN AC3,^D11 ;ANY DIGITS PRESENTED?
46600 POPJ PDP, ;NO SO SIMPLE POP RETURN
46700 ANDI AC1,77777 ;REDUCE TO 5OCTAL DIGITS
46800 SOS AC1
46900 MOVEM AC1,AC4 ;SET LOCATION TO EXAMINE OR DUMP
47000 ANDI AC1,70000 ;LEAVE ONLY IF
47100 MOVEM AC1,IF ;LOAD IF
47200 CAIE AC2,55 ;"-" AS IN N-M
47300 JRST SPOP ;NO
47400 PUSHJ PDP,OCTAL
47500 ANDI AC1,77777 ;BE SURE WE HAVE ONLY 5 OCTAL DIGITS
47600 CAIL AC1,MEMSIZ ;TOO LARGE?
47700 MOVEI AC1,MEMSIZ-1 ;YES SO SET TO MAX CORE
47800 MOVEM AC1,DASH ;SAVE N FROM M-N
47900 SPOP: AOS (PDP)
48000 POPJ PDP,
48100
48200 GET: AOS AC4 ;INCREMENT CURRENT ADDRESS
48300 LDB MA,[POINT 12,AC4,35] ;LOAD 4 LSD'S IN MA
48400 LDB AC1,[POINT 3,AC4,23] ;LOAD IF
48500 LSH AC1,^D12
48600 MOVEM AC1,IF
48700 PUSHJ PDP,FETCHY ;GET CORE LOCATION
48800 POPJ PDP, ;DONE SO EXIT
48900
49000 EX: PUSHJ PDP,PCSAVE
49100 PUSHJ PDP,DASHC
49200 JRST PCREST ;NOTHING TENDERED SO EXIT
49300 PUSHJ PDP,GET ;GET CONTENTS OF LOCATION
49400 SKIPE AC1,IF ;IS IF 0?
49500 IORI AC1,200000 ;CONVERT TO A ASCII NUMBER
49600 IORI AC1,400000 ;CONVERT TO ASCII
49700 LSH AC1,-^D12 ;RIGHT JUSTIFY THE CHARACTER
49800 OUTCHR AC1 ;PRINT A BLANK OR A NUMBER
49900 MOVE AC1,AC4 ;LOAD THE CURRENT ADDRESS
50000 PUSHJ PDP,OCTP ;TYPE 4 LSD'S
50100 MOVE AC1,MB ;LOAD MEMORY CONTENTS TO TYPE
50200 PUSHJ PDP,REG ;TYPE THEM
50300 CAML AC4,DASH ;UNFINISHED N-M?
50400 JRST EX+1 ;NO
50500 JRST EX+3 ;YES
50600
50700 P: PUSHJ PDP,OCTAL ;GET AN OCTAL NUMBER
50800 PUSH PDP,AC1
50900 MOVE PC,AC1 ;LOAD PC
51000 ANDI PC,7777 ;MASK OUT DF AND IF
51100 ANDI AC1,70000 ;MASK TO LEAVE IF
51200 MOVEM AC1,IF ;LOAD IF
51300 MOVEM AC1,IBR ;LOAD INSTRUCTION BRANCH REGISTER
51400 POP PDP,AC1
51500 ANDI AC1,700000 ;MASK OUT IF AND SR
51600 LSH AC1,-3 ;POSITION
51700 MOVEM AC1,DFF
51800 JRST REOPR
51900
52000 ;RETURN HERE WHENEVER LEAVING THE PDP8
52100 ;DIAGNOS CAUSE OF EXIT AND ANNOUNCE SAME OR SOURCE OF EXIT
52200 GO3: OUTSTR [ASCIZ /
52300
52400 /]
52500 HLLI AC0, ;CLEAR STATUS FLAGS FROM SAVED PC
52600 MOVSI AC1,ELIST-ENDL ;COUNTER AND INDEX
52700 DIA: HLRZ AC2,ELIST(AC1)
52800 CAIE AC0,(AC2) ;ERROR SOURCE?
52900 DIA2: AOBJN AC1,DIA ;NO
53000 MOVE AC2,ELIST(AC1)
53100 OUTSTR (AC2) ;PRINT DIAGNOSTIC
53200 JRST @DLIST(AC1) ;DISPATCH TO SPECIAL ROUTINE
53300
53400 LIST0: OUTSTR [ASCIZ / SOURCE /]
53500 LSHC AC0,-^D15 ;PUT ERROR SOURCE ADDRES IN AC1
53600 MOVEI AC2,5 ;COUNTER
53700 PUSHJ PDP,OCTP+2
53800
53900 LIST: OUTSTR [ASCIZ /
54000 FLAGS /]
54100 MOVE AC1,FLAGS ;LOAD THE FLAGS IN AC1
54200 PUSHJ PDP,WORDP ;TYPE IT
54300 OUTSTR [ASCIZ /
54400 PC /]
54500 MOVE AC1,DFF ;LOAD DATA FIELD
54600 LSH AC1,^D17 ;POSITION DFF FOR TYPING
54700 TLO AC1,301000 ;CONVERT TO ASCII
54800 OUTSTR AC1
54900 MOVE AC1,IF ;LOAD INSTRUCTION FIELD IN AC1
55000 LSH AC1,-^D12 ;POSITION FOR TYPING
55100 ORI AC1,60 ;CONVERT TO ASCII
55200 OUTCHR AC1
55300 MOVE AC1,PC
55400 PUSHJ PDP,REG
55500 OUTSTR [ASCIZ /AC /]
55600 TRNE AC,10000 ;IS LINK 1
55700 OUTCHR [61] ;YES
55800 MOVE AC1,AC
55900 PUSHJ PDP,REG
56000 OUTSTR [ASCIZ /MA/]
56100 MOVE AC1,MA
56200 PUSHJ PDP,REG
56300 OUTSTR [ASCIZ /MB/]
56400 MOVE AC1,MB
56500 PUSHJ PDP,REG
56600 IFN DDF32,<EXTERNAL DMA
56700 OUTSTR [ASCIZ /DMA /]
56800 HRLZ AC1,DMA
56900 MOVEI AC2,6
57000 PUSHJ PDP,OCTP+2
57100 OUTSTR [ASCIZ /
57200 /]>
57300 OUTSTR [ASCIZ /MQ/]
57400 MOVE AC1,MQ
57500 PUSHJ PDP,REG
57600 OUTSTR [ASCIZ /IR/]
57700 MOVE AC1,IR
57800 PUSHJ PDP,REG
57900 OUTSTR [ASCIZ /SR /]
58000 MOVE AC1,DFSW ;LOAD DATA FIELD SWITCHES
58100 LSH AC1,^D17 ;POSITION FOR CONVERSION TO ASCII
58200 TLO AC1,301000 ;AND ADDITION OF A BLANK
58300 OUTSTR AC1
58400 MOVE AC1,IFSW ;LOAD INSTRUCTION SWITCHES
58500 LSH AC1,-^D12 ;POSITION
58600 ORI AC1,60 ;CONVERT TO ASCII
58700 OUTCHR AC1
58800 MOVE AC1,SR
58900 PUSHJ PDP,REG
59000 SKIPN TIME ;WAS THE MACHINE RUNNING?
59100 JRST OPR
59200 PUSHJ PDP,TIM ;TYPE RUNNING TIME
59300
59400 RUNT: OUTSTR [ASCIZ /RUNNING TIME /]
59500 SETZB AC0,AC3
59600 CALLI AC0,27 ;GET RUNNING TIME FOR JOB
59700 SUB AC0,STARTT ;EXTRACT TIME FOR PREVIOUS JOB STEPS
59800 MOVEI AC2,9 ;LOAD COUNTER
59900 IDIVI AC0,^D10 ;FIND LSD
60000 OR AC3,AC1 ;SAVE LSD
60100 ROT AC3,-4 ;PRESERVE LSD
60200 SOJG AC2,.-3 ;MORE DIGITS?
60300 MOVEI AC1,9 ;LOAD COUNTER
60400 TLNE AC3,740000 ;IS MSD NONZERO?
60500 JRST .+5 ;YES
60600 LSH AC3,4 ;NO SO REMOVE MSD
60700 SOS AC1 ;AND FORGET IT
60800 CAIE AC1,4 ;CAN MORE BE FORGOTTEN?
60900 JRST .-5 ;YES
61000 MOVEI AC2,3 ;PREPARE TO RECEIVE DECIMEL DIGIT
61100 ROTC AC2,4 ;SHIFT IN DIGIT AND CONVER TO ASCII
61200 OUTCHR AC2 ;TYPE IT
61300 CAIN AC1,4 ;READY FOR A "."
61400 OUTCHR [56]
61500 CAIN AC1,7 ;READY FOR A ","
61600 OUTCHR [54]
61700 SOJG AC1,.-7 ;DONE?
61800 OUTSTR [ASCIZ / SECONDS
61900
62000 /]
62100
62200 JRST OPR
62300
62400 TIM: OUTSTR [ASCIZ /
62500 SIMULATED RUNTIME /]
62600 MOVE AC0,TIME ;LOAD TIME
62700 IDIVI AC0,4 ;CONVERT TO MICROSECONDS
62800 MOVEM AC1,REM# ;SAVE FRACTIONAL MICROSECONDS
62900 MOVEI AC2,9 ;LOAD COUNTER
63000 SETZ AC3, ;CONVERT TO DECIMEL
63100 IDIVI AC0,^D10 ;FIND LEAST SIGNIFICANT DIGIT
63200 OR AC3,AC1 ;SAVE LSD
63300 ROT AC3,-4 ;PRESERVE LAST DIGIT ENTERED
63400 SOJG AC2,.-3 ;DONE?
63500 MOVEI AC1,9 ;LOAD COUNTER
63600 TLNE AC3,740000 ;LEADING DIGIT 0
63700 JRST .+7 ;NO
63800 LSH AC3,4 ;THEN GET RID OF IT
63900 SOS AC1 ;AND FORGET IT
64000 TLNE AC3,740000 ;NEXT DIGIT 0?
64100 JRST .+3 ;NO
64200 LSH AC3,4 ;DESTROY
64300 SOS AC1 ;AND FORGET
64400 MOVEI AC2,3 ;READY TO ROTATE IN ASCII
64500 ROTC AC2,4 ;PUT MSD IN AC2
64600 OUTCHR AC2 ;TYPE
64700 CAIN AC1,7 ;NEED "."
64800 OUTCHR [56] ;YES
64900 CAIN AC1,4 ;PERHAPS A ","
65000 OUTCHR [54] ;YES
65100 SOJG AC1,.-7 ;DONE?
65200 MOVE AC1,REM ;RESTORE FRACTIONAL MICROSECONDS
65300 CAIN AC1,1
65400 OUTSTR [ASCIZ /,25/]
65500 CAIN AC1,2
65600 OUTSTR [ASCIZ /,5/]
65700 CAIN AC1,3
65800 OUTSTR [ASCIZ /,75/]
65900 OUTSTR [ASCIZ / SECONDS
66000
66100 /] ;YES
66200 POPJ PDP,
66300
66400 REG: OUTCHR [11] ;TAB
66500 PUSHJ PDP,OCTP
66600 OUTSTR [ASCIZ /
66700 /]
66800 POPJ PDP,
66900
67000 OCTP: ROT AC1,^D24 ;LEFT JUSTIFY REGISTER
67100 MOVEI AC2,4 ;COUNTER
67200 MOVEI AC0,6 ;SET UP AC0 TO ROTATE IN ASCII OCTAL DIGIT
67300 ROTC AC0,3 ;PUT MSD IN AC0
67400 OUTCHR AC0 ;TYPE
67500 SOJG AC2,.-3 ;DONE?
67600 POPJ PDP, ;SO RETURN
67700
67800 EXTERNAL TIME,IOINI,TC,NTIME,NXIOT,EAE,OPR2
67900 ;LIST OF ERROR SOURCES AND MESSAGES TO TYPE
68000 DEFINE EXWD (A,B) <
68100 XWD A,B
68200 EXTERNAL A>
68300 ELIST: IFE ESTOP,<
68400 EXTERNAL INSFET
68500 XWD INSFET+2,[ASCIZ /CYCLING IN MEMORY/]
68600 XWD EAE+1,[ASCIZ /EAE INSTRUCTION/]
68700 XWD NXIOT+1,[ASCIZ /UNRECOGNIZABLE IOT/]
68800 EXWD OPR2,[ASCIZ /ROTATE BOTH RIGHT AND LEFT?/]>
68900 EXWD EFLG3,[ASCIZ /EFLG3/]
69000 EXWD EFLG4,[ASCIZ /EFLG4/]
69100 EXWD EFLG5,[ASCIZ /EFLG5/]
69200 EXWD EFLG6,[ASCIZ /EFLG6/]
69300 EXWD EFLG7,[ASCIZ /EFLG7/]
69400 EXWD EFLG8,[ASCIZ /END OF FILE ON PTR/]
69500 IFE DRM08,<EXWD EFLG9,[ASCIZ /DISK/]
69600 EXWD DMOUT0,[ASCIZ /DMOUT0/]
69700 EXWD EFLG10,[ASCIZ /EFLG10 DSIK/]>
69800 EXWD TIME,[ASCIZ /EXIT/]
69900 EXWD IOINI,[ASCIZ /IOINI/]
70000 EXWD TC,[ASCIZ /PDP8 HALTED/]
70100 ENDL: XWD ,[ASCIZ /UNRECOGNIZABLE EXIT/]
70200
70300 IFE ESTOP,<
70400 IOT: OUTCHR [11] ;TAB
70500 MOVE AC1,MB ;LOAD FOR TYPING
70600 PUSHJ PDP,OCTP ;TYPE
70700 OUTSTR [ASCIZ / PC /]
70800 MOVE AC1,PC
70900 OR AC1,IF ;ADD INSTRUCTION FIELD
71000 ROT AC1,-^D15 ;LEFT JUSTIFY
71100 SUBI AC1,1 ;CALCULATE CORRECT PC
71200 MOVEI AC2,5 ;COUNT
71300 PUSHJ PDP,OCTP+2 ;TYPE
71400 OUTSTR [ASCIZ /
71500 /] ;CR&LF
71600 POP PDP,AC0 ;CLEAR OUT PD LIST
71700 JRST OPR ;GET ORDERS>
71800
71900 DLIST: IFE ESTOP,<EXP OPR,IOT,IOT,OPR>
72000 EXP ECF,ECD,ECD,ECF,ECD
72100 EXP OPR
72200 IFE DRM08,<ECF,ECD,OPR>
72300 EXP OPR,OPR,OPR,LIST0
72400
72500 ECF: OUTSTR [ASCIZ / CFSTAT /]
72600 JRST .+2 ;SKIP
72700
72800 ECD: OUTSTR [ASCIZ / CDSTAT /]
72900 MOVE AC1,AC3
73000 PUSHJ PDP,WORDP
73100 JRST OPR
73200
73300 WORDP: MOVEI AC2,6 ;LOAD COUNTER
73400 PUSHJ PDP,OCTP+2 ;TYPE LEFT HALF
73500 OUTCHR [40] ;SEPERATE HALFWORDS
73600 MOVEI AC2,6 ;COUNTER FOR THE RIGHT HALF
73700 JRST OCTP+2 ;TYPE RIGHT HALF
73800
73900
74000 INT: SETZ AC0,
74100 PUSHJ PDP,OCTAL
74200 CAIE AC2,46 ;"&"
74300 JRST .+3
74400 MOVE AC0,TIME
74500 JRST INT+1 ;NOW GET A NUMEBER TO ADD
74600 LSH AC1,2 ;MULTIPLY BY 4
74700 ADD AC0,AC1
74800 MOVEM AC0,DRDATA+1 ;SET TIME TO INTERRUPT
74900 CAMGE AC0,NTIME
75000 MOVEM AC0,NTIME
75100 JRST REOPR
75200 INT1: POP PDP,AC0
75300 HRLOI AC0,377777
75400 MOVEM AC0,DRDATA+1 ;REPAIR TIME TO INTERRUPT NEXT
75500 TLO FLAGS,RUN ;REPAIR RUN FLAG
75600 OUTSTR [ASCIZ /
75700
75800 BREAK POINT/]
75900 SETZM RUNTIM
76000 JRST LIST
76100 DRDATA: 4*^D1000000
76200 377777777777 ;SET TO MAXIMUM TIME
76300 XWD RUN,
76400 INT1
76500
76600 EH: OUTSTR [ASCIZ /EH?
76700 /] ;ERROR SO COMPLAIN
76800 REOPR: MOVEI AC0,OPR ;GET ANOTHER COMMAND AFTER
76900 JRST LEAVE ;WIPING CURRENT LINE
77000
77100
77200
77300 DEFINE DISPATCH (X)< <SIXBIT /X/>!<X>>
77400 CLIST: DISPATCH BIN
77500 DISPATCH C
77600 DISPATCH DDT
77700 DISPATCH E
77800 <SIXBIT /DIS/>!<LIST>
77900 DISPATCH DP
78000 <SIXBIT /EXI/>!<EXIT>
78100 DISPATCH FIL
78200 DISPATCH L
78300 DISPATCH RIM
78400 DISPATCH S
78500 DISPATCH SS
78600 DISPATCH ZIP
78700
78800 LL=.-CLIST
78900
79000 <SIXBIT /D/>!<DDD>
79100 <SIXBIT /DUM/>!<DUMP>
79200 DISPATCH EX
79300 DISPATCH INT
79400 IFN DDF32,<<SIXBIT /BOO/>!<BOOT>>
79500 <SIXBIT /PC/>!<P>
79600 DISPATCH ST
79700 <SIXBIT /SR/>!<SW>
79800 ENDC: EXP EH ;ENTRY FOR ERRORS
79900
80000 END GO