1
0
mirror of https://github.com/PDP-10/its.git synced 2026-03-28 10:52:52 +00:00

HLOGO - "Hal hack" version of 11LOGO.

This commit is contained in:
Lars Brinkhoff
2022-11-22 23:13:25 +01:00
parent bd5c2b6b00
commit af40b429ae
6 changed files with 460 additions and 0 deletions

View File

@@ -1668,6 +1668,10 @@ respond "*" ":cwd nlogo\r"
respond "*" ":palx slogo_@slogo\r"
expect ":KILL"
# HLOGO, "Hal hack" 11LOGO.
respond "*" ":palx hlogo_@hlogo\r"
expect ":KILL"
# TORTIS
respond "*" ":midas;324 radia;_tortis\r"
expect ":KILL"

View File

@@ -1610,6 +1610,10 @@ nlogo/gtfun.89 197910181535.11
nlogo/iggl.1 197711221847.09
nlogo/impure.77 197911252329.15
nlogo/init.56 197911252329.05
nlogo/halflg.4 197708101330.52
nlogo/halhac.86 197808011606.05
nlogo/halvar.7 197608170406.56
nlogo/hlogo.cmd 197807281845.57
nlogo/logoch.497 197808071946.48
nlogo/pure.96 197911252329.09
nlogo/sitss.3 197911252126.36

3
src/nlogo/halflg.4 Executable file
View File

@@ -0,0 +1,3 @@
HALFLG==1
HAL1==0

428
src/nlogo/halhac.86 Executable file
View File

@@ -0,0 +1,428 @@
.IFZ HAL1
;ORBIT HACK--CALL WITH THE NAME OF ARRAY OF DATA
;THE FORMAT FOR THE DATA IS
;NUMBER OF ATTRACTIVE SOURCES
;NUMBER OF INTEGRATION STEPS PER CALL (<50)
;DT
;OBJECT XPOS
; YPOS
; ZPOS
; XVEL
; YVEL
; ZVEL
; XFORCE
; YFORCE
; ZFORCE
; MINIMUM LEGAL RADIUS
;GRAV SOURCE XPOS
; YPOS
; ZPOS
; DIST FROM OBJECT
; FIELD CONSTANT
;THIS LAST BLOCK REPEATED FOR EACH SOURCE
;THE ROUTINE UPDATES THE VARIABLES
H.DT==0
H.XP==H.DT+4
H.YP==H.XP+4
H.ZP==H.YP+4
H.XV==H.ZP+4
H.YV==H.XV+4
H.ZV==H.YV+4
H.XF==H.ZV+4
H.YF==H.XF+4
H.ZF==H.YF+4
H.MINR==H.ZF+4
H.S1==H.MINR+4
HALHACK: SPOPS A
JSR PC,AMAKE5 ;B NOW POINTS TO ARRAY HEADER
MOV B,C
CMP (C)+,(C)+
CMP (C)+,#150001 ;TYPE=FLOATING #DIMS=1
BEQ .+4
ERROR+BAT
CMP (C)+,(C)+
MOV (C)+,A ;ARRAY SIZE
ADD #8.,C ;C NOW POINTS TO 1ST DATA WORD
LDCFD (C)+,FA
LDCFD (C)+,FB
SETI
STCFI FA,D ;#OF ATTRACTORS
STCFI FB,B ;#OF INTEGRATION STEPS
SETL
TST B ;POSITIVE?
BGT .+4
ERROR+DOR
CMP B,#50. ;NOT TOO BIG (PIGGY)
BLE .+4
ERROR+DOR
MUL #5,D
ADD #H.S1/4,D ;SIZE ARRAY SHOULD BE
ADD #2,D
CMP A,D
BGE .+4
ERROR+ROB ;ARRAY TOO SMALL
SUB #3,D
ASL D
ASL D
ADD C,D ;POINTS TO LAST DATA WORD
MOV C,A
ADD #H.S1,A ;POINTS TO XPOS OF FIRST BODY
PUSH A
SPUSH D
;A NOW POINTS TO XPOS OF FIRST BODY
;B HAS NUMBER OF STEPS PER CALL
;C POINTS TO DT
;D POINTS TO CONSTANT FOR LAST BODY
;NOW COMPUTE THE FORCE ON THE OBJECT
SETF
HALOP: MOV (P),D
MOV 2(P),A
HALOP1: LDF H.XP(C),FB ;POSITION OF OBJECT
LDF H.YP(C),FC
LDF H.ZP(C),FA
SUBF (A)+,FB ;DX
SUBF (A)+,FC ;DY
SUBF (A)+,FA ;DZ
STF FA,FE
STF FC,FD
MULF FD,FD ;DY^2
STF FB,FA
MULF FA,FA ;DX^2
ADDF FD,FA
FPUSH FB
LDF FE,FB
MULF FB,FB
STF FB,FE ;DZ^2
ADDF FE,FA
FPOP FB
JSR PC,HALSQ ;GET SQRT OF FA INTO FD
STF FD,(A)+ ;RADIAL DISTANCE FROM SOURCE
CMPF H.MINR(C),FD ;IS RADIUS LESS THAN 10?
CFCC
BGT HALERR
MULF FD,FA
LDF (A)+,FD ;FIELD CONSTANT
DIVF FA,FD ;K/(R*R^2)
MULF FD,FB ;FX=(ABOVE)*DX
MULF FD,FC ;FY
LDF FE,FA
MULF FD,FA ;FZ
ADDF H.XF(C),FB
STF FB,H.XF(C) ;INCREMENT FORCE-X
ADDF H.YF(C),FC ;FORCE-Y
STF FC,H.YF(C)
ADDF H.ZF(C),FA
STF FA,H.ZF(C)
CMP A,D
BLO HALOP1 ;MORE FORCES?
;NOW DO THE INTEGRATION
MOV C,E
LDF (C),FB ;DT
ADD #8.,C ;POINT TO DO Z COORD FIRST
HALOP2: LDF H.XF(C),FA
MULF FB,FA ;FORCE*DT
ADDF H.XV(C),FA ;V_V+A
STF FA,H.XV(C)
MULF FB,FA ;V*DT
ADDF H.XP(C),FA ;X_X+V*DT
STF FA,H.XP(C)
CMP C,E
BEQ HALOP3
SUB #4,C ;NOW DO Y AND X COORDINATES
BR HALOP2
HALOP3: MOV E,C ;RESTORE POINTER TO DT
CLRF H.XF(C) ;CLEAR THE FORCES
CLRF H.YF(C)
CLRF H.ZF(C)
SUB #1,B
BEQ HALOP4
JMP HALOP
HALOP4: SETD
CMP (P)+,(P)+ ;FIX THE STACK
SEZ
RTS PC
HALERR: SETD
ERROR+RTB
;SQUARE ROOT ROUTINE RETURN ROOT OF FA IN FD
HALSQ: JSR PC,PPUSHT
STF FB,-(P) ;SAVE FB
STF FA,FD
DIVF #40400,FD ;START ITER AT A/2
HALSQ1: STF FD,FB
STF FA,FD
DIVF FB,FD ;A/B
ADDF FB,FD
DIVF #40400,FD ;(B+A/B)/2
SUBF FD,FB
ABSF FB ;ERROR
DIVF FA,FB
CMPF #34000,FB ;ERR LESS THAN 2^(-15) ?
CFCC
BLT HALSQ1
LDF (P)+,FB ;
RTS PC
.ENDC
.IFZ HAL1-1
;ORBIT HACK FOR ORBITS IN VELOCITY SPACE
;CALL TO UPDATE VX,VY,UX,UY,R,A,T BASED ON OLD VALUES AND ZX,ZY,L,U
;ALSO SUPPLY EITHER DA OR DT
;IF DT IS NON-ZERO WILL COMPUTE BASED ON DT
;IF DT IS ZERO COMPUTE BASED ON DA (BUT ADJUST VALUE OF DA TO BE
;NOT SO BIG AS TO GIVE LARGE ERROR
;ARGUMENT TO THIS PRIMITIVE IS A FLOATING POINT ONE-DIMENSIONAL ARRAY
;VALUES IN THE ARRAY ARE, IN ORDER
;DT,DA,T,A,X,Y,R,UX,UY,U,ZX,ZY,VX,VY,L
H.DT=0
H.DA=H.DT+4
H.T=H.DA+4
H.A=H.T+4
H.X=H.A+4
H.Y=H.X+4
H.R=H.Y+4
H.UX=H.R+4
H.UY=H.UX+4
H.U=H.UY+4
H.ZX=H.U+4
H.ZY=H.ZX+4
H.VX=H.ZY+4
H.VY=H.VX+4
H.L=H.VY+4
H.ASIZE=15.
;MAIN LOOP
HALHAC: JSR PC,H.IN ;CHECK ARRAY TYPE AND SET UP C TO POINT TO 1ST WORD
SETF ;SET FPP TO FLOATING (NON-DOUBLE)
JSR PC,H.CDA ;STICK DA IN TEMP
H.HK1: JSR PC,H.COM ;COMPUTE R,A SIN A, COS A
LDF H.DT(C),FD ;SEE IF DT=0
TSTF FD
CFCC
BNE H.HK2
JSR PC,H.ER ;DT=0, CHECK ERROR
BEQ H.HK1 ;NO GOOD. GO BACK
JSR PC,H.CT ;COMPUTE T BASED ON R, L AND DA
BR H.HK3
H.HK2: LDF H.T(C),FC ;DT NON-ZERO, ADD TO OLD T TO GET NEW T
ADDF FD,FC
H.HK3: JSR PC,H.ALL ;STORE ALL THE VALUES
SETD ;RESTORE DOUBLE PRECISION
SEZ ;SIGNAL NOT OUTPUTTING
RTS PC
;INIT C TO POINT TO FIRST DATA WORD
H.IN: SPOPS A
JSR PC,AMAKE5 ;B NOW POINTS TO ARRAY HEADER
MOV B,C
CMP (C)+,(C)+
CMP (C)+,#150001 ;TYPE=FLOATING #DIMS=1
BEQ .+4
ERROR+BAT
CMP (C)+,(C)+
MOV (C)+,A ;ARRAY SIZE
CMP A,#H.ASIZE
BEQ .+4
ERROR+BAT
RTS PC
;COMPUTE DA AND STORE IT IN TEMP
;CALLED WITH C POINTING TO BEGINNING OF ARRAY
;IF DT=0 THEN DA=DA*(SGN L)
;OTHERWISE DA=L*DT/R**2
H.CDA: LDF H.DT(C),FA
TSTF FA
CFCC ;IS DT=0?
BNE H.CDA1
LDF H.DA(C),FA ;DT=0
LDF H.L(C),FB ;L
TSTF FB
CFCC
BGT H.CDAR
NEGF FA ;IF L<0 NEGATE DA
BR H.CDAR
H.CDA1: LDF H.L(C),FB ;COMPUTE DA FOR DT NOT EQUAL TO 0
MULF FB,FA ;L*DT
LDF H.R(C),FB ;R
MULF FB,FB ;SQUARE IT
DIVF FB,FA ;L*DT/R**2
H.CDAR: STF FA,TEMP
RTS PC
;COMPUTE A AND R
;LEAVE A IN FA, R IN FB
;SIN A IN TEMP+4
;COS A IN TEMP+10
;A=OLD A + DA
;R=L/(U-ZX*COS A - ZY*SIN A)
H.COM: LDF H.A(C),FB ;PREVIOUS A
LDF TEMP,FA ;DA
ADDF FB,FA
JSR PC,H.M360 ;REDUCE IT MOD 360
FPUSH FA
SPUSH C
FPUSH FA
SETD ;SIN ROUTINE NEEDS DOUBLE PRECISION
JSR PC,SINDEG
STCDF FA,TEMP+4
SETF ;RESTORE FOR THE POP
FPOP FA
SETD
JSR PC,COSDEG
STCDF FA,TEMP+10
SETF
POP C
LDF H.ZX(C),FB ;X COMPONENT OF Z VECTOR
MULF FA,FB ;ZX*COS A
LDF TEMP+4,FC ;SIN A
LDF H.ZY(C),FA
MULF FA,FC ;ZY*SIN A
ADDF FC,FB ;ZY*SIN A + ZX*COS A
LDF H.U(C),FA ;LENGTH OF U VECTOR
SUBF FB,FA ;U - (ABOVE)
LDF H.L(C),FB
DIVF FA,FB ;AND THAT'S R
FPOP FA ;A
RTS PC
H.M360: LDF #42264,FB ;REDUCE A MOD 360
H.M31: TSTF FA ;IS IT NEGATIVE?
CFCC
BGE H.M32
ADDF FB,FA
BR H.M31
H.M32: CMPF FA,FB ;IS IT BIGGER THAN 360?
CFCC
BLT H.M3R
SUBF FB,FA
BR H.M32
H.M3R: RTS PC
;COMPUTE THE ERROR TERM
;ENTER WITH A IN FA, R IN FB AND PRESERVE THESE
;ERROR TERM IS (ABS (R-OLD R)) + (ABS DA*R)/67
;IF E>10 SET DA TO DA/1.1 AND SIGNAL TO REDO COMPUTATION
;IF E<6 SET DA TO DA*1.1 AND REDO COMPUTATION
;TO REDO COMPUTATION SET Z BIT ON LEAVING
H.ER: FPUSH FA
FPUSH FB
LDF H.R(C),FC ;OLD R
SUBF FB,FC
ABSF FC ;ABS (R -OLDR)
LDF TEMP,FD ;DA
MULF FB,FD
ABSF FD ;ABS(R*DA)
DIVF #41606,FD ;ABOVE/67
ADDF FC,FD ;THE ERROR TERM
CMPF #41040,FD ;COMPARE WITH 10
CFCC
BGT H.ER1 ;10>ERROR
LDF H.1.1,FA ;TOO BIG--DIVIDE BY 1.1
LDF TEMP,FB
DIVF FA,FB
STF FB,TEMP
BR H.ERL
H.ER1:CMPF #40700,FD ;COMPARE WITH 6
CFCC
BLT H.ERW ;6<ERROR
LDF H.1.1,FA ;TOO SMALL--MULTIPLY BY 1.1
LDF TEMP,FB
MULF FA,FB
STF FB,TEMP
H.ERL: FPOP FB
FPOP FA
SEZ ;REDO COMPUTATION
RTS PC
H.ERW: FPOP FB ;DON'T REDO COMPUTATION
FPOP FA
CLZ
RTS PC ;COMPUTE DT = R**2 * DA/L
;COMPUTE T=T+DT AND LEAVE ANSWER IN FC
H.CT: FPUSH FB ;SAVE R
MULF FB,FB ;R**2
LDF TEMP,FC
MULF FB,FC ;R**2 * DA
LDF H.L(C),FB
DIVF FB,FC ;DT
LDF H.T(C),FB ;OLD T
ADDF FB,FC ;NEW T
FPOP FB
RTS PC
;SET ARRAY VARIABLES
;FA HAS A, FB HAS R, FC HAS T
;TEMP+4 HAS SIN A
;TEMP+10 HAS COS A
H.ALL: STF FA,H.A(C)
STF FB,H.R(C)
STF FC,H.T(C)
LDF H.U(C),FA
LDF TEMP+4,FB
MULF FA,FB ;U*SIN A
NEGF FB
STF FB,H.UY(C) ;UY=-U*SIN A
LDF TEMP+10,FC
MULF FA,FC
NEGF FC
STF FC,H.UX(C) ;UX=-U*COS A
LDF H.ZX(C),FA
ADDF FC,FA ;VX=UX+ZX
STF FA,H.VX(C)
LDF H.ZY(C),FA
ADDF FB,FA ;VY=UY+ZY
STF FA,H.VY(C)
LDF H.R(C),FC
LDF TEMP+4,FA
MULF FC,FA
NEGF FA
STF FA,H.X(C) ;X=-R SIN A
LDF TEMP+10,FA
MULF FC,FA
STF FA,H.Y(C) ;Y=R COS A
RTS PC
.ENDC

19
src/nlogo/halvar.7 Executable file
View File

@@ -0,0 +1,19 @@
;VARIABLES FOR STRESS MACHINE
.IFZ HAL1-2
X1: .WORD 0,0
X2: .WORD 0,0
Y1: .WORD 0,0
Y2: .WORD 0,0
VERTA: .WORD 0 ;POINTER TO 1ST VERTEX
RODA: 0 ;PTR TO 1ST ROD
QA: 0
QLEN: 0
QPTR: 0
UPQPTR: 0
LVERTA: 0
ITERA: 0 ;NUMBER OF ITERATIONS
CONTRL: 0 ;PTR TO CONTROL ARRAY
.ENDC

2
src/nlogo/hlogo.cmd Executable file
View File

@@ -0,0 +1,2 @@
/H/H/ENLOGO;HALFLG,COMMON,SITSS,IGGL,INIT,IMPURE,PURE,EVAL,STORAG,DISPLAY,GTFUN,FILING,CONTRO