1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-16 08:24:38 +00:00
PDP-10.its/src/mudsys/create.40
Adam Sampson a81db26a7a Rename to ITS conventions.
MIDAS and Muddle source get version numbers (as in the 1973 Muddle
source); the build files don't.
2018-04-25 09:32:25 +01:00

376 lines
7.6 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

TITLE PROCESS-HACKER FOR MUDDLE
RELOCATABLE
.INSRT MUDDLE >
.GLOBAL ICR,NAPT,IGVAL,CHKARG,RESFUN,RETPROC,SWAP,MAINPR,PROCHK,NOTRES
.GLOBAL PSTAT,LSTRES,TOPLEV,MAINPR,1STEPR,INCONS
.GLOBAL TBINIT,APLQ,PVSTOR,SPSTOR
MFUNCTION PROCESS,SUBR
ENTRY 1
GETYP A,(AB) ;GET TYPE OF ARG
;MUST BE SOME APPLIABLE TYPE
PUSHJ P,APLQ
JRST NAPT ;NO, ERROR - NON-APPLIABLE TYPE
OKFUN:
MOVEI A,TPLNT/2 ;SMALL STACK PARAMETERS
MOVEI B,PLNT/2
PUSHJ P,ICR ;CREATE A NEW PROCESS
MOVE C,TPSTO+1(B) ;GET ITS SRTACK
PUSH C,[TENTRY,,TOPLEV]
PUSH C,[1,,0] ;TIME
PUSH C,[0]
PUSH C,SPSTO(B)
PUSH C,PSTO+1(B)
MOVE D,C
ADD D,[3,,3]
PUSH C,D ;SAVED STACK POINTER
PUSH C,[SUICID]
MOVEM C,TPSTO+1(B) ;STORE NEW TP
HRRI D,1(C) ;MAKE A TB
HRLI D,400002 ;WITH A TIME
MOVEM D,TBINIT+1(B)
MOVEM D,TBSTO+1(B) ;SAVE ALSO FOR SIMULATED START
MOVE C,(AB) ;STORE ARG
MOVEM C,RESFUN(B) ;INTO PV
MOVE C,1(AB)
MOVEM C,RESFUN+1(B)
MOVEI 0,RUNABL
MOVEM 0,PSTAT+1(B)
JRST FINIS
REPEAT 0,[
MFUNCTION RETPROC,SUBR
; WHO KNOWS WHAT THIS SHOULD REALLY DO
;PROBABLY, JUST AN EXIT
;FOR NOW, PRINT OUT AN ERROR MESSAGE
ERRUUO EQUOTE ATTEMPT-TO-RETURN-OUT-OF-PROCESS
MFUNCTION RESUME,FSUBR
;RESUME IS CALLED WITH TWO ARGS
;THE FIRST IS A PROCESS FORM OF THE PROCESS TO BE RESUMED
;THE SECOND IS A FUNCTION TO BE CALLED WHEN THIS PROCESS
; (THE PARENT) IS ITSELF RESUMED
;IF THE FUNCTION IS NOT GIVEN SOME STANDARD FUNCTION IS
;PLUGGED IN
;
; NOTE - TYPE AND NUMBER OF ARGS CHECKS MUST BE ADDED TO BOTH RESUME AND CREATE
ENTRY 1
HRRZ C,@1(AB) ;GET CDR ADDRESS
JUMPE C,NOFUN ;IF NO SECOND ARG, SUPPLY STANDARD
HLLZ A,(C) ;GET CDR TYPE
CAME A,$TATOM ;ATOMIC?
JRST RES2 ;NO, MUST EVAL TO GET FUNCTION
MOVE B,1(C) ;YES
PUSHJ P,IGVAL ;TRY TO GET GLOBAL VALUE
CAMN A,$TUNBOUND ;GLOBALLY UNBOUND?
JRST LFUN ;YES, TRY FOR LOCAL VALUE
RES1: MOVE PVP,PVSTOR+1
MOVEM A,RESFUN(PVP) ;STORE IN THIS PROCESS
MOVEM B,RESFUN+1(PVP)
HRRZ C,1(AB) ;GET CAR ADDRESS
PUSH TP,(C) ;PUSH PROCESS FORM
PUSH TP,1(C)
JSP E,CHKARG ;CHECK FOR DEFERED TYPE
;INSERT CHECKS FOR PROCESS FORM
MCALL 1,EVAL ;EVAL PROCESS FORM WHICH WILL SWITCH
; PROCESSES
JRST FINIS
RES2: PUSH TP,(C) ;PUSH FUNCTION ARG
PUSH TP,1(C)
JSP E,CHKARG ;CHECK FOR DEFERED
MCALL 1,EVAL ;EVAL TO GET FUNCTION
JRST RES1
LFUN: HRRZ C,1(AB) ;GET CDR ADDRESS
PUSH TP,(C)
PUSH TP,1(C)
MCALL 1,VALUE ;GET LOCAL VALUE OF ATOM FOR FUNCTION
JRST RES1
NOFUN: MOVSI A,TUNBOUND ;MAKE RESUME FUNCTION UNBOUND
JRST RES1
]
; PROCHK - SETUP LAST RESUMER SLOT
PROCHK: MOVE PVP,PVSTOR+1
CAME B,MAINPR ; MAIN PROCESS?
MOVEM PVP,LSTRES+1(B)
POPJ P,
; THIS FUNCTION RESUMES A PROCESS, CALLED WITH ONE OR TWO ARGS
; THE FIRST IS A VALUE TO RETURN TO THE OTHER PROCESS OR PASS TO ITS
; RESFUN
; THE SECOND IS THE PROCESS TO RESUME (IF NOT SUPPLIED, USE THE LSTRES)
MFUNCTION RESUME,SUBR
ENTRY
JUMPGE AB,TFA
CAMGE AB,[-4,,0]
JRST TMA
CAMGE AB,[-2,,0]
JRST CHPROC ; VALIDITY CHECK ON PROC
MOVE PVP,PVSTOR+1
SKIPN B,LSTRES+1(PVP) ; ANY RESUMERS?
JRST NORES ; NO, COMPLAIN
GOTPRO: MOVE C,AB
CAMN B,PVSTOR+1 ; DO THEY DIFFER?
JRST RETARG
MOVE A,PSTAT+1(B) ; CHECK STATE
CAIE A,RUNABL ; MUST BE RUNABL
CAIN A,RESMBL ; OR RESUMABLE
JRST RESUM1
NOTRES:
NOTRUN: ERRUUO EQUOTE PROCESS-NOT-RUNABLE-OR-RESUMABLE
RESUM1: PUSHJ P,PROCHK ; FIX LISTS UP
MOVEI A,RESMBL ; GET NEW STATE
MOVE D,B ; FOR SWAP
STRTN: JSP C,SWAP ; SWAP THEM
MOVEM A,PSTAT+1(E) ; CLOBBER OTHER STATE
MOVE PVP,PVSTOR+1
MOVE A,PSTAT+1(PVP) ; DECIDE HOW TO PROCEED
MOVEI 0,RUNING
MOVEM 0,PSTAT+1(PVP) ; NEW STATE
MOVE C,ABSTO+1(E) ; OLD ARGS
CAIE A,RESMBL
JRST DORUN ; THEY DO RUN RUN, THEY DO RUN RUN
RETARG: MOVE A,(C)
MOVE B,1(C) ; RETURN
JRST FINIS
DORUN: PUSH TP,RESFUN(PVP)
PUSH TP,RESFUN+1(PVP)
PUSH TP,(C)
PUSH TP,1(C)
MCALL 2,APPLY
PUSH TP,A ; CALL SUICIDE WITH THESE ARGS
PUSH TP,B
MCALL 1,SUICID ; IF IT RETURNS, KILL IT
JRST FINIS
CHPROC: GETYP A,2(AB)
CAIE A,TPVP
JRST WTYP2
MOVE B,3(AB)
JRST GOTPRO
NORES: ERRUUO EQUOTE NO-PROCESS-TO-RESUME
; FUNCTION TO CAUSE PROCESSES TO SELF DESTRUCT
MFUNCTION SUICIDE,SUBR
ENTRY
JUMPGE AB,TFA
HLRE A,AB
ASH A,-1 ; DIV BY 2
AOJE A,NOPROC ; NO PROCESS GIVEN
AOJL A,TMA
GETYP A,2(AB) ; MAKE SURE OF PROCESS
CAIE A,TPVP
JRST WTYP2
MOVE C,3(AB)
JRST SUIC2
NOPROC: MOVE PVP,PVSTOR+1
SKIPN C,LSTRES+1(PVP)
MOVE C,MAINPR ; IF NOT DEFAULT TO MAIN
SUIC2: CAMN C,PVP ; DONT SUICIDE TO SELF
JRST SUSELF
MOVE B,PSTAT+1(C)
CAIE B,RUNABL
CAIN B,RESMBL
JRST .+2
JRST NOTRUN
MOVE B,C
PUSHJ P,PROCHK
MOVE D,B ; RESTORE NEWPROCESS
MOVEI A,DEAD
JRST STRTN
SUSELF: ERRUUO EQUOTE ATTEMPT-TO-SUICIDE-TO-SELF
MFUNCTION RESER,SUBR,RESUMER
ENTRY
MOVE B,PVSTOR+1
JUMPGE AB,GTLAST
CAMGE AB,[-2,,0]
JRST TMA
GETYP A,(AB) ; CHECK FOR PROCESS
CAIE A,TPVP
JRST WTYP1
MOVE B,1(AB) ; GET PROCESS
GTLAST: MOVSI A,TFALSE ; ASSUME NONE
SKIPN B,LSTRES+1(B) ; GET IT IF IT EXISTS
JRST FINIS
MOVSI A,TPVP ; GET TYPE
JRST FINIS
; FUNCTION TO PUT AN EVAL CALL ON ANOTHER PROCESSES STACK
MFUNCTION BREAKSEQ,SUBR,BREAK-SEQ
ENTRY 2
GETYP A,2(AB) ; 2D ARG MUST BE PROCESS
CAIE A,TPVP
JRST WTYP2
MOVE B,3(AB) ; GET PROCESS
CAMN B,PVSTOR+1 ; SKIP IF NOT ME
JRST BREAKM
MOVE A,PSTAT+1(B) ; CHECK STATE
CAIE A,RESMBL ; BEST BE RESUMEABLE
JRST NOTRUN
MOVE C,TBSTO+1(B) ; GET SAVE ACS TO BUILD UP A DUMMY FRAME
MOVE D,TPSTO+1(B) ; STACK POINTER
MOVE E,SPSTO+1(B) ; FIX UP OLD FRAME
MOVEM E,SPSAV(C)
MOVEI E,CALLEV ; FUNNY PC
MOVEM E,PCSAV(C)
MOVE E,PSTO+1(B) ; SET UP P,PP AND TP SAVES
MOVEM E,PSAV(C)
PUSH D,[0] ; ALLOCATES SOME SLOTS
PUSH D,[0]
PUSH D,(AB) ; NOW THAT WHIC IS TO BE EVALLED
PUSH D,1(AB)
MOVEM D,TPSAV(C)
HRRI E,-1(D) ; BUILD UP ARG POINTER
HRLI E,-2
PUSH D,[TENTRY,,BREAKE]
PUSH D,C ; OLD TB
PUSH D,E ; NEW ARG POINTER
REPEAT 4,PUSH D,[0] ; OTHER SLOTS
MOVEM D,TPSTO+1(B)
MOVEI C,(D) ; BUILD NEW AB
AOBJN C,.+1
MOVEM C,TBSTO+1(B) ; STORE IT
MOVE A,2(AB) ; RETURN PROCESS
MOVE B,3(AB)
JRST FINIS
MQUOTE BREAKER
BREAKE:
CALLEV: MOVEM A,-3(TP) ; HERE TO EVAL THE GOODIE (SAVE REAL RESULT)
MOVEM B,-2(TP)
MCALL 1,EVAL
POP TP,B
POP TP,A
JRST FINIS
BREAKM: ERRUUO EQUOTE ATTEMPT-TO-BREAK-OWN-SEQUENCE
; FUNCTION TOP PUT PROCESS IN 1 STEP MODE
MFUNCTION 1STEP,SUBR
PUSHJ P,1PROC
MOVE PVP,PVSTOR+1
MOVEM PVP,1STEPR+1(B) ; CLOBBER TARGET PROCESS
JRST FINIS
; FUNCTION TO UNDO ABOVE
MFUNCTION %%FREE,SUBR,FREE-RUN
PUSHJ P,1PROC
MOVE PVP,PVSTOR+1
CAME PVP,1STEPR+1(B)
JRST FNDBND
SETZM 1STEPR+1(B)
JRST FINIS
FNDBND: SKIPE 1STEPR+1(B) ; DOES IT HAVE ANY 1STEPPER?
JRST NOTMIN ; YES, COMPLAIN
MOVE D,B ; COPY PROCESS
ADD D,[1STEPR,,1STEPR] ; POINTER FOR SEARCH
HRRZ C,SPSTO+1(B) ; GET THIS BINDING STACK
FNDLP: GETYP 0,(C) ; IS THIS A TBVL?
CAIN 0,TBVL
CAME D,1(C) ; SKIP IF THIS IS SAVED 1STEP SLOT
JRST FNDNXT
SKIPN 3(C) ; IS IT SAVING A REAL 1STEPPER?
JRST FNDNXT
MOVE PVP,PVSTOR+1
CAME PVP,3(C) ; IS IT ME?
JRST NOTMIN
SETZM 3(C) ; CLEAR OUT SAVED 1STEPPER
JRST FINIS
FNDNXT: HRRZ C,(C) ; NEXT BINDING
JUMPN C,FNDLP
NOTMIN: MOVE C,$TCHSTR
MOVE D,CHQUOTE NOT-YOUR-1STEPEE
PUSHJ P,INCONS
MOVSI A,TFALSE
JRST FINIS
1PROC: ENTRY 1
GETYP A,(AB)
CAIE A,TPVP
JRST WTYP1
MOVE B,1(AB)
MOVE A,(AB)
POPJ P,
; FUNCTION TO RETRUN THE MAIN PROCESS
MFUNCTION MAIN%%,SUBR,MAIN
ENTRY 0
MOVE B,MAINPR
MAIN1: MOVSI A,TPVP
JRST FINIS
; FUNCTION TO RETURN THE CURRENT PROCESS
MFUNCTION ME,SUBR
ENTRY 0
MOVE B,PVSTOR+1
JRST MAIN1
; FUNCTION TO RETURN THE STATE OF A PROCESS
MFUNCTION STATE,SUBR
ENTRY 1
GETYP A,(AB)
CAIE A,TPVP
JRST WTYP1
MOVE A,1(AB) ; GET PROCESS
MOVE A,PSTAT+1(A)
MOVE B,@STATES(A) ; GET STATE
MOVSI A,TATOM
JRST FINIS
STATES:
IRP A,,[ILLEGAL,RUNABLE,RESUMABLE,RUNNING,DEAD,BLOCKED]
MQUOTE A
TERMIN
END