total-carnage/MPROC.ASM

456 lines
8.9 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

**************************************************************
* GSP MULTI-PROCESSING SYSTEM
*
* Software: Eugene P Jarvis
* Initiated: 1988?
*
* Modified: Shawn Liptak, 7/?/91 -New KILL stuff
* Shawn Liptak, 8/12/91 -KOP code
* Shawn Liptak, 10/27/91 -Shawn.hdr
*
* COPYRIGHT (C) 1992 WILLIAMS ELECTRONICS GAMES, INC.
*
*.Last mod - 1/8/92 20:22
**************************************************************
.FILE 'MPROC.ASM'
.TITLE "GSP MULTI-PROCESSING SYSTEM"
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
* FILES REQUIRED FOR ASSEMBLY
.INCLUDE \VIDEO\SYS\GSP.INC ;GSP ASSEMBLER EQUATES
.INCLUDE \VIDEO\SYS\SYS.INC ;ZUNIT SYSTEM EQUATES
.INCLUDE \VIDEO\SYS\MACROS.HDR ;MACROS
.INCLUDE MPROC.EQU
.INCLUDE DISP.EQU
.include "shawn.hdr" ;My macros
* SET UP FIXED PARAMETERS AT THE BEGINNING OF SCRATCHPAD
.REF L_TIMER ;AUDIT
.SECT "FIXED"
ACTIVE .LONG 0
FREE .LONG 0
*GLOBAL PROCESS VARIABLES
.BSS TIMER,16 ;IRQ TIMER 16 MSEC.
.BSS TIMETEMP,16 ;LAST TIMER VALUE
.BSS OVERLOAD,16 ;OVERLOAD CHECKER
.BSS PRCSTR,NPROC*PRCSIZ ;PROCESS STORE ALLOCATION
*MULTI-PROCESSING PROGRAM
.TEXT ;STORE IN PROGRAM ROM
********************************
*PROCESS DISPATCH
PRCDSP
MOVI ACTIVE,A13,L ;LONG WORD INIT SCAN PROCESS LIST
PRCWTSRT
CALLA YZSORT ;SORT DISPLAY LIST
MOVE @TIMER,A0
JREQ PRCWTSRT ;BR = WAIT FOR TIMING FROM INTERRUPT, SORT
MOVE A0,@TIMETEMP ;SAVE
SLL 1,A0
MOVE @OVERLOAD,A1,W
ADD A0,A1
SRL 1,A1
MOVE A1,@OVERLOAD,W
CALLA L_TIMER ;linky timer
CLR A0
MOVE A0,@TIMER
JRUC PRCD1
********************************
*PROCESS SLEEP
*TOS IS WAKEUP ADDR ,A0 = SLEEP TIME
PRCSLP
move *SP+,A7,L ;CALLING PC->A7
.if DEBUG
; .ref WSPEED
; move @WSPEED,a1
; jrge wspdok
; LOCKUP
; EINT
;wspdok
.endif
PRCLSP move A13,A1
addi PDATA,A1
mmtm A1,A7,A8,A9,A10,A11,A12 ;wakeup, regs, stack ptr
move A0,-*A1 ;sleep
.if DEBUG
MOVE A13,A0
ADDI PSDATA,A0
CMP A0,A12
JRLT $ ;Stick on Stack overflow
ADDI PRCSIZ-PSDATA,A0
CMP A0,A12
JRGT $ ;Stick on Stack underflow
.endif
PRCD1
************************************
* MOVE @TIMETEMP,A1,W ;GET THE LAST TIMER VALUE
************************************
PRCD1A
MOVE *A13,A13,L
JREQ PRCDX ;NULL LIST, EXIT
MOVE *A13(PTIME),A0 ;GET COUNT
**************************************************************************
* SUB A1,A0
**************************************************************************
DEC A0 ;DECREMENT COUNT
MOVE A0,*A13(PTIME) ;PUT IT BACK
JRGT PRCD1A ;NOT READY, LOOP FOR NEXT
*PROCESS IS READY FOR DISPATCH
PRCD2 move A13,A1
addi >40,A1
mmfm A1,A7,A8,A9,A10,A11,A12 ;wake, regs, stack ptr
jump A7 ;fire off proc
*DONE WITH THE SCAN
PRCDX RETS
********************************
*PROCESS SUICIDE
SUCIDE
MOVI ACTIVE,A1,L
SUCLP MOVE A1,A2 ;SAVE PREVIOUS
MOVE *A1,A1,L
jrz sucerr
CMP A1,A13 ;CHECK FOR MATCH TO CURRENT PROCESS
JRNE SUCLP ;NOT FOUND KEEP LOOKING
MOVE *A1,*A2,L ;LINK AROUND IN ACTIVE LIST
MOVE @FREE,A0,L ;GET FREE POINTER
MOVE A0,*A1,L ;LINK INTO FREE LIST AT START
MOVE A1,@FREE,L
MOVE A2,A13 ;SET CURRENT PROCESS TO PREVIOUS
JRUC PRCD1 ;CONTINUE WITH DISPATCH
sucerr
.if DEBUG ;this is for DEBUG only
LOCKUP
EINT
.ELSE
CALLERR 5,0
.endif
JRUC PRCDSP ;RESOLVE?
********************************
*PROCESS LIST INITIALIZE
*A13 RETURNED POINTING TO ACTIVE LIST (CRPROC)
PINIT
MMTM SP,A0,A1,A2,A3 ;SAVE REG
MOVI NPROC,A3,W ;# OF PROCESSES TO INIT
CLR A0
MOVE A0,@ACTIVE,L ;NULL ACTIVE LIST
MOVI PRCSTR,A1,L
MOVE A1,@FREE,L ;SETUP FREE LIST
PINITL
MOVE A1,A2
ADDI PRCSIZ,A1,W
MOVE A1,*A2,L ;LINK EM UP
DSJS A3,PINITL ;CONTINUE FOR NPROC
MOVE A0,*A2,L ;ZERO LAST LINK
MOVI ACTIVE,A13,L ;INIT CURRENT PROCESS
MMFM SP,A0,A1,A2,A3 ;RESTORE REGS
RETS
********************************
*KILL PROCESS
*A0 POINTS TO PROCESS TO KILL
*IF PROCESS NOT PRESENT, CAUSES ERROR
*TO KILL YOURSELF SUCIDE MUST BE USED,
*IF YOU ATTEMPT TO KILL YOURSELF IT WILL JUST RETURN
KILL
CMP A0,A13 ;KILLING YOURSELF?
JREQ KILLXXX ;BR = YES, JUST ESCAPE
PUSH a1,a2
; .IF DEBUG
;HULKPID .EQU 142
; MOVE *A0(PROCID),A1
; CMPI HULKPID,A1
; JRNZ KL2
; LOCKUP
; EINT
;KL2
; .ENDIF
MOVI ACTIVE,A1,L
KILLP MOVE A1,A2 ;SAVE PREVIOUS
MOVE *A1,A1,L
JRZ killerr
CMP A1,A0
JRNE KILLP ;NOT FOUND KEEP LOOKING
MOVE *A0,*A2,L ;LINK AROUND IN ACTIVE LIST
MOVE @FREE,A1,L ;LINK INTO FREE LIST AT START
MOVE A1,*A0,L
MOVE A0,@FREE,L
KILLX PULL a1,a2
KILLXXX RETS
killerr
.IF DEBUG
LOCKUP
EINT
.ELSE
CALLERR 6,2
.ENDIF
JRUC KILLX
********************************
* CREATE A PROCESS
* A1=ID,A7=PC,A8,A9,A10,A11 Passed parameters
* A13=*Current process
* Rets: A0=*Created process (Flags invalid!)
GETPRC
PUSH a2,a12
MOVE @FREE,A0,L
JREQ NONELFT ;NONE AVAILABLE
MOVE *A0,A2,L
MOVE A2,@FREE,L ;REMOVE FROM FREE LIST
MOVE *A13,*A0,L ;LINK INTO ACTIVE LIST AFTER CURRENT PROCESS
MOVE A0,*A13,L ;CRPROC>>NEW PROC
JRUC XFERPRC0
NONELFT
.IF DEBUG
LOCKUP
EINT
.ELSE
CALLERR 4,2
.ENDIF
JRUC GETPX
********************************
* XFERPROC - TRANSFER CONTROL OF AN EXISTING PROCESS
* A0= PTR OF PROCESS TO BE XFER'D
* A1= NEW I.D.
* A7= WAKE UP
* A8-A11= PASSED TO THE XFER'D PROC
XFERPROC
PUSH a2,a12
XFERPRC0
cmpi >ffc00000,a7 ;ffe for 256K
jrlo procwakeerr ;Error?
move a0,a2
addi PDATA,a2
move A0,A12 ;RESET PROCESS STACK POINTER
addi PRCSIZ,A12
mmtm a2,a7,a8,a9,a10,a11,a12 ;Stuff wake, regs, p stack ptr
movk 1,A12
move A12,-*A2 ;WAKE UP AS SOON AS POSSIBLE
move A1,-*A2 ;ID
GETPX PULL a2,a12
rets ;Flags are trashed!!!
procwakeerr
.IF DEBUG
LOCKUP
EINT
.ELSE
CALLERR 7,2
.ENDIF
JRUC GETPX
********************************
* KILL A CLASS OF PROCESSES (Old, for compatibility)
* A0=PROCID (16 BITS) ,A1=MASK (16 BITS, bits to keep)
* WILL NOT KILL CALLING PROCESS (A13)
KILALL PUSH a0,a1,a2,a3,a4
not a1
jruc kilan
********************************
* Kill one class of processes
KIL1C ;A0=PROCID, A1=Trashed
clr a1
********************************
* Kill a class of processes
KILALLN ;A0=PROCID, A1=!Mask (Bits to remove)
PUSH a0,a1,a2,a3,a4
kilan andn a1,a0 ;Form match
MOVI ACTIVE,A2,L
KILALP MOVE A2,A3 ;SAVE PREVIOUS
MOVE *A2,A2,L ;GET NEXT
JREQ KILALX ;ALL DONE
MOVE *A2(PROCID),A4
andn a1,a4 ;Can dont care bits
CMP A0,A4 ;MATCH?
JRNE KILALP ;NO
CMP A2,A13 ;CURRENT PROCESS?
JREQ KILALP ;YES DONT KILL
MOVE *A2,*A3,L ;LINK AROUND IN ACTIVE LIST
MOVE @FREE,A4,L ;LINK INTO FREE LIST AT START
MOVE A4,*A2,L
MOVE A2,@FREE,L ;POINT FREE TO CELL
MOVE A3,A2
JRUC KILALP ;KILL THE REST
KILALX PULL a0,a1,a2,a3,a4
RETS
********************************
* Knock out one class of processes
KOP_1C ;A0=PROCID, A2=Time to add
clr a1
********************************
* Knock out a class of processes
KOP_ALL ;A0=PROCID, A1=!Mask (Bits to remove), A2=Time to add
PUSH a3,a4
andn a1,a0 ;Form match
movi ACTIVE,a3,L
koplp move *a3,a3,L ;Get next
jrz kopx ;End?
move *a3(PROCID),a4
andn a1,a4 ;Mask
cmp a0,a4
jrnz koplp ;No match?
move *a3(PTIME),a4 ;Add sleep
add a2,a4
move a4,*a3(PTIME)
jruc koplp
kopx PULL a3,a4
rets
********************************
*CHECK TO SEE IF PROCESS IN A0 EXISTS
*RETURNS:
* Z BIT SET = NO MATCH, A0 = 0
* Z BIT CLR = MATCH, A0 = PTR TO PROCESS
PEXIST
PUSH a2
MOVI ACTIVE,A2,L
ISOBP MOVE *A2,A2,L ;GET NEXT
JREQ ISOBX ;ALL DONE
CMP A0,A2 ;PROC?
JRNE ISOBP ;NO
MOVE A0,A0 ;CLR Z BIT
ISOBX MMFM SP,A2
RETS
********************************
*FIND IF AT LEAST ONE PROCESS, OTHER THAN CALLING PROCESS,
*EXISTS.
*A0=PROCID (16 BITS) ,A1=MASK (16 BITS)
*MASK BITS OF ZERO ARE DONT CARES
*RETURNS:
* Z BIT SET = NO MATCH, A0 = 0
* Z BIT CLR = MATCH, A0 = PTR TO PROCESS
EXISTP
PUSH a1,a2,a4
SEXT A0
AND A1,A0 ;FORM MATCH
MOVI ACTIVE,A2,L
EXNXT
MOVE *A2,A2,L ;GET NEXT
JREQ EXSC ;ALL DONE
MOVE *A2(PROCID),A4
AND A1,A4 ;CAN DONT CARE BITS
CMP A0,A4 ;MATCH?
JRNE EXNXT ;NO
CMP A2,A13 ;CURRENT PROCESS?
JREQ EXNXT ;YES, THEN WE DON'T CARE
EXSC
MOVE A2,A0
PULL a1,a2,a4
RETS
********************************
* GET A PRESERVED REGISTER FROM A SLEEPING PROCESS
* A0=*SLEEPER
GETA11 move *A0(PA11),A11,L
RETS
GETA10 move *A0(PA10),A10,L
RETS
GETA9 move *A0(PA9),A9,L
RETS
GETREGS
move *A0(PA11),A11,L
move *A0(PA10),A10,L
move *A0(PA9),A9,L
GETA8 move *A0(PA8),A8,L
RETS
GETWAKE move *A0(PWAKE),A7,L
RETS
PUTA11 move A11,*A0(PA11),L
RETS
PUTA10 move A10,*A0(PA10),L
RETS
PUTA9 move A9,*A0(PA9),L
RETS
PUTREGS
move A11,*A0(PA11),L
move A10,*A0(PA10),L
move A9,*A0(PA9),L
PUTA8 move A8,*A0(PA8),L
RETS
PUTA7
PUTWAKE move A7,*A0(PWAKE),L
RETS
.END