Metropoli BBS
VIEWER: surak.s MODE: TEXT (ASCII)
xROMID 810
xTITLE SURAK :System&User Rpl Algorithms Kernel
xCONFIG KERNELCnfg
EXTERNAL xKERNEL
EXTERNAL xNEWPROCESS
EXTERNAL xTRANSFER
EXTERNAL xTERMINATE
EXTERNAL InsertCall
EXTERNAL InitRSTK
EXTERNAL PopRSTK
EXTERNAL PushRSTK
EXTERNAL InitTempEnv
EXTERNAL PopTempEnv
EXTERNAL PushTempEnv
EXTERNAL StopKernel

DEFINE RROLL PTR 14F2A

LABEL KERNELCnfg
::
 #32A
 XEQSETLIB
;

ASSEMBLE
	CON(1)  8
RPL
xNAME KERNEL
::
 CKN
 NULL{}
 DUP
 NULL::
 >TCOMP
 >TCOMP
 ONEONE
 NULL{}
 DUPONE
 >TCOMP
 '
 {
  LAM ProcList
  LAM ActiveProc
  LAM TimeRef
  LAM TempEnvList
  LAM PIDList
 }
 BIND
 ZERO_DO
 xNEWPROCESS
 LOOP
 InitRSTK
 InitTempEnv
 LAM TempEnvList
 PopTempEnv
 DUPUNROT
 >TCOMP
 '
 LAM TempEnvList
 STO
 PushTempEnv
 BEGIN
 ONE
 LAM PIDList
 LAM ActiveProc
 #1+DUP
 LAM PIDList
 LENCOMP
 ::
  #>case
  ::
   DROP
   TWO
  ;
 ;
 DUP'
 LAM ActiveProc
 STO
 NTHCOMDDUP
 #0=ITE
 2DROP
 ::
  xTRANSFER
 ;
 LAM PIDList
 INNERCOMP
 ONE_DO
 #+
 LOOP
 #1=
 UNTIL
 StopKernel
;

ASSEMBLE
	CON(1)  8
RPL
xNAME NEWPROCESS
::
 CK1&Dispatch
 EIGHT
 ::
  NULL{}
  SWAP
  >TCOMP
  NULL::
  >TCOMP
  LAM ProcList
  SWAP
  >TCOMP
  '
  LAM ProcList
  STO
  InitTempEnv
  LAM TempEnvList
  PopTempEnv
  >TCOMP
  '
  LAM TempEnvList
  STO
  LAM PIDList
  DUPLENCOMP
  #1+DUP
  UNROT
  >TCOMP
  '
  LAM PIDList
  STO
  ONESWAP
  '
  ::
   SysTime
   LAM TimeRef
   bit-
   HXS 3 003
   HXS>=HXS
   %0<>
  ;
  InsertCall
 ;
 SIX
 ::
  SAFE@_HERE
  NcaseSIZEERR
  COLA
  xNEWPROCESS
 ;
;

ASSEMBLE
	CON(1)  8
RPL
xNAME TRANSFER
::
 CK2
 ::
  DUPTYPEBINT?
  OVER
  TYPEBINT?
  ANDNOTcase
  ::
   $ "Error:\nInvalid Process Index"
   DO$EXIT
  ;
  LAM ProcList
  LENCOMP
  #1+
  2DUP
  #<
  4PICK
  ROT
  #<
  ANDNOTcase
  ::
   $ "Error:\nUndefined Process"
   DO$EXIT
  ;
 ;
 SysTime
 '
 LAM TimeRef
 STO
 PopTempEnv
 3PICK
 LAM TempEnvList
 PUTLIST
 '
 LAM TempEnvList
 STO
 LAM TempEnvList
 OVER
 NTHCOMPDROP
 PushTempEnv
 '
 {
  LAM Origen
  LAM Destino
 }
 BIND
 PopRSTK
 {}N
 LAM Origen
 LAM ProcList
 PUTLIST
 DUP'
 LAM ProcList
 STO
 LAM Destino
 NTHCOMPDROP
 INNERCOMP
 PushRSTK
 ABND
;

ASSEMBLE
	CON(1)  8
RPL
xNAME TERMINATE
::
 CK0
 ZERO
 LAM ActiveProc
 LAM PIDList
 PUTLIST
 '
 LAM PIDList
 STO
 NULL{}
 NULL::
 >TCOMP
 LAM ActiveProc
 LAM ProcList
 PUTLIST
 '
 LAM ProcList
 STO
 LAM ActiveProc
 ONE
 xTRANSFER
;

NULLNAME InsertCall
::
 ZEROZERO
 '
 {
  LAM Origen
  LAM Destino
  LAM Condicion
  LAM RDepth
  LAM LMeta
 }
 BIND
 '
 LAM ProcList
 SAFE@_HERE
 NcaseSIZEERR
 LAM Condicion
 LAM Destino
 >TCOMP
 LAM Origen
 >TCOMP
 '
 ROT
 >TCOMP
 '
 case
 >TCOMP
 '
 xTRANSFER
 >TCOMP
 '
 2DROP
 >TCOMP
 '
 LAM Condicion
 STO
 LAM Destino
 NTHCOMPDROP
 INNERCOMP
 DUP
 '
 LAM RDepth
 STO
 ZERO_DO
 DUPNULLCOMP?
 ?SKIP
 ::
  INNERCOMP
  DUP
  '
  LAM LMeta
  STO
  ZERO_DO
  LAM LMeta
  ROLL
  DUP'
  {
   BEGIN
   AGAIN
   LOOP
   x<<
   x>>
   xNEXT
  }
  matchob?
  ITE
  ::
   LAM Condicion
   SWAP
   LAM LMeta
   #1+
   '
   LAM LMeta
   STO
  ;
  DROP
  LOOP
  LAM LMeta
  ::N
 ;
 ISTOP@
 ROLL
 LOOP
 LAM RDepth
 {}N
 LAM Destino
 LAM ProcList
 PUTLIST
 '
 LAM ProcList
 STO
 ABND
;

NULLNAME InitRSTK
::
 NULL::
 >R
 RSWAP
;

NULLNAME PopRSTK
::
 ZERO
 1LAMBIND
 BEGIN
 THREE
 PTR 14F2A
 R>
 1GETLAM
 #1+
 1PUTLAM
 DUPNULLCOMP?
 UNTIL
 1GETABND
;

NULLNAME PushRSTK
::
 ZERO_DO
 >R
 THREE
 DUP
 PTR 14F2A
 PTR 14F2A
 LOOP
;

NULLNAME InitTempEnv
::
 ZERO
 '
 {
  LAM StopTempEnv
 }
 BIND
;

NULLNAME PopTempEnv
::
 ZERO
 BEGIN
 ::
  NULL{}
  DUP
  TEN
  BEGIN
  GETLAMPAIR
  NOT
  WHILE
  ::
   4ROLLSWAP
   >HCOMP
   UNROT
   4ROLLSWAP
   >HCOMP
   UNROT
   TEN
   #+
  ;
  REPEAT
  DROP
  ABND
  ROT#1+
 ;
 UNROTDUP
 '
 {
  LAM StopTempEnv
 }
 EQUAL
 4ROLLSWAP
 UNTIL
 #2*
 {}N
;

NULLNAME PushTempEnv
::
 INNERCOMP
 #2/
 ZERO_DO
 SWAPINCOMP
 #1+ROLL
 BIND
 LOOP
;

NULLNAME StopKernel
::
 PopRSTK
 NDROP
 PopTempEnv
 DROP
 ABND
 $ "Kernel Terminated"
 FlashMsg
;
[ RETURN TO DIRECTORY ]