1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-29 13:21:11 +00:00

Import RZ;FACTOR 26 source.

Differences from AI's TS FACTOR:

- KL10 define to put the TEST inner loop code at 100 rather than in the
  registers -- ";;KL10 RUNS SLOWER IN ACS".

- Lookup table for commands, including uppercase and lowercase.

- A new "quit" command.

- Mixed-case messages.

- System calls modernised a bit; .CALL /OPEN/ rather than .SUSET/.OPEN,
  and not opening the TTY in DDT mode.
This commit is contained in:
Adam Sampson
2018-04-10 00:57:34 +01:00
committed by Adam Sampson
parent d1b101b3eb
commit 6984267e18
2 changed files with 172 additions and 58 deletions

View File

@@ -1,289 +0,0 @@
;Factor integers using trial division -*-MIDAS-*-
;This was reconstructed in 2018 from AI:SYS1;TS FACTOR, dated 1977-09-27.
TITLE FACTOR
Z=0
A=1
B=2
C=3
D=4
E=5
DV=5
P=6
.MLLIT==1
TYIC==1
TYOC==2
INFOC==3
PDLL=100
LOC 7
TEST: TRC .+1,6
INCR: ADDI DV,2
RETEST: MOVE Z,C
MOVE B,D
IDIV Z,DV
DIV A,DV
CAMLE DV,A
JUMPE Z,PRIME
JUMPN B,TEST
JRST FOUND
LOC 100
G0: MOVE P,[-PDLL,,PDL]
.OPEN TYIC,[10,,(SIXBIT /TTY/)] ;Open in "DDT mode" (don't echo CR etc.)
.VALUE 0
.OPEN TYOC,[1,,(SIXBIT /TTY/)]
.VALUE 0
DECIMA: MOVEI C,10.
RADSET: MOVEM C,RADX'
RESET: PUSHJ P,PROMPT
ZBC: SETZB B,C
LOOP: PUSHJ P,TYI
CAIN A,177 ;RUBOUT
JRST RESET
CAIN A,"R
JRST RADSET
CAIN A,"D
JRST DECIMA
CAIE A,":
CAIN A,"*
JRST TIMES
CAIN A,"?
JRST INFO
CAIN A,"C
JRST CLIST
CAIN A,"Q
JRST QUERY
CAIN A,"N
JRST LOAD
CAIE A,";
CAIN A,"+
JRST PLUS
CAIN A,"-
JRST MINUS
CAIN A,"L
JRST LARGE
CAIN A,"F
JRST FACTOR
CAIN A,40 ;space
JRST STM2
CAIN A,"/
JRST DIVIDE
CAIN A,"^
JRST POWER
CAIN A,"=
JRST EQUAL
CAIL A,"0
CAILE A,"9
JRST HUH ;Not recognised
IMUL B,RADX
MUL C,RADX
ADDI D,-"0(A)
TLZE D,400000
AOS C
ADD B,C
MOVE C,D
JRST LOOP
INFO: PUSHJ P,INFOPN
.IOT INFOC,1
JUMPLE A,RESET
.IOT TYOC,1
JRST INFO+1
INFOPN: .SUSET [.SSNAM,,[SIXBIT/.INFO./]]
.OPEN INFOC,[.UAI,,'DSK ? SIXBIT/FACTOR/ ? SIXBIT/ORDER/]
JRST INFLOS
POPJ P,
INFLOS: SUB P,[1,,1]
MOVE B,[440700,,[ASCIZ \CAN'T OPEN INFO FILE\]]
JRST Q3
QUERY: PUSHJ P,INFOPN
.IOT TYIC,2
CAIL 2,"0
CAILE 2,"9
JRST Q0
MOVE 2,[440700,,[ASCIZ/ DIGIT/]]
JRST Q3
Q0: .IOT INFOC,1
JUMPL A,Q1
CAIE 1,12 ;LINE FEED
JRST Q0
.IOT INFOC,1
CAME 1,2
JRST Q0
.IOT INFOC,1
JUMPL 1,Q1
CAIE 1,11 ;TAB
JRST Q0
JRST .+2
Q2: .IOT INFOC,1
.IOT TYOC,1
CAIE 1,12 ;LINE FEED?
JRST Q2
.IOT INFOC,1
CAIN 1,11 ;TAB?
JRST Q2+1
JRST RESET
CLIST: SKIPA 2,[440700,,[ASCIZ 7 RD:*;+-/^NLF =QC?7]]
Q1: MOVE 2,[440700,,[ASCIZ/ IGNORED/]]
Q3: ILDB 1,2
JUMPE 1,RESET
.IOT 2,1
JRST .-3
LOAD: MOVE B,M1
MOVE C,M2
JRST LOOP
POWER: MOVEI Z,-1(C)
MOVE A,M2
SETZ B,
MOVE C,A
POW1: IMUL B,A
MUL C,A
ADD B,C
MOVE C,D
SOJG Z,POW1
JRST STM2
DIVIDE: MOVE A,C
MOVE B,M1
MOVE D,M2
IDIV B,A
DIV C,A
JRST STM2
TIMES: IMUL B,M2
MOVE A,C
IMUL A,M1
MUL C,M2
ADD B,C
ADD B,A
TLZ B,400000
MOVEM D,M2
MOVEM B,M1
JRST ZBC
MINUS: MOVNS C
ADD C,[SETZ]
AOS B
MOVNS B
PLUS: ADD C,M2
ADD B,M1
TLZE C,400000
AOS B
STM2: PUSHJ P,STM
JRST ZBC
LARGE: MOVE B,L1'
MOVE C,L2'
JRST STM2
STM: MOVEM B,M1'
MOVEM C,M2'
POPJ P,
EQUAL: MOVE A,M1
MOVE B,M2
PUSHJ P,SPRAB
JRST RESET
FACTOR: SKIPN C
SKIPE B
PUSHJ P,STM
MOVE D,M1
MOVE DV,M2
TEST2: JUMPN D,.+3
CAIG DV,3
JRST SPRIME
TRNE DV,1
JRST ODD
ASHC D,-1
MOVEI B,2
PRB: SETZM A
PUSHJ P,SPRAB
JRST TEST2
ODD: MOVE A,D
MOVE C,DV
IDIVI A,3
DIVI B,3
JUMPN C,NO3
MOVE D,A
MOVE DV,B
MOVEI B,3
JRST PRB
NO3: MOVE C,D
MOVE D,DV
MOVEI DV,5
HRRI INCR,4
JRST RETEST
FOUND: MOVE D,A
SETZM A
MOVE B,DV
PUSHJ P,SPRAB
MOVE C,Z
JRST RETEST
SPRIME: MOVE C,D
MOVE D,DV
PRIME: MOVEM C,L1
MOVEM D,L2
MOVE A,C
MOVE B,D
PUSHJ P,SPRAB
JRST RESET
SPRAB: PUSHJ P,SPACE
PRAB: MOVE C,B
IDIVI A,10.
DIVI B,10.
HRLM C,(P)
SKIPN B
SKIPE A
PUSHJ P,PRAB
HLRZ A,(P)
ADDI A,"0
JRST TYO
SPACE: PUSH P,A
MOVEI A,40
PUSHJ P,TYO
POP P,A
POPJ P,
HUH: MOVEI A,"?
PUSHJ P,TYO
JRST LOOP
PROMPT: PUSHJ P,CR
MOVEI A,"#
PUSHJ P,TYO
CR: MOVEI A,15
PUSHJ P,TYO
MOVEI A,12
TYO: .IOT TYOC,A
POPJ P,
TYI: .IOT TYIC,A
POPJ P,
PDL: BLOCK PDLL+1
VARIABLES
CONSTANTS
END G0