423 lines
7.5 KiB
Plaintext
423 lines
7.5 KiB
Plaintext
*******************
|
||
*MASTER EQUATE FILE
|
||
*******************
|
||
*
|
||
*GLOBAL VARIABLES
|
||
*
|
||
.GLOBL KILALL,GETPRC,KILL,PINIT,SUCIDE,PRCSLP,PRCDSP,PRCLSP,EXISTP
|
||
.GLOBL RAND,TIMER,OVERLOAD,ACTIVE,FREE,PRCSTR
|
||
.GLOBL SNDRES,SNDRESP,ONESND,SNDLD,SNDSND,CKSNDPRI,QSNDRST
|
||
.GLOBL GETA11,GETA10,GETA9,GETA8,XFERPROC
|
||
.GLOBL PUTA11,PUTA10,PUTA9,PUTA8,PUTA7
|
||
|
||
*
|
||
* PROCESS DATA STRUCTURE
|
||
* NOTE: MAKE SURE THIS IS EVENLY DIVISIBLE BY 32
|
||
*
|
||
*STRUCT PROC
|
||
PLINK .SET 0 ;LINK TO NEXT 32 BITS
|
||
PROCID .SET 20H ;UHW PROCESS ID 16 BITS
|
||
PTIME .SET 30H ;UHW SLEEP TIME X 16MSEC 16 BITS
|
||
PSPTR .SET 40H ;UHL PROCESS STACK POINTER 32 BITS
|
||
PA11 .SET 60H ;UHL REGISTERS SAVED
|
||
PA10 .SET 80H ;UHL
|
||
PA9 .SET 0A0H ;UHL
|
||
PA8 .SET 0C0H ;UHL
|
||
PWAKE .SET 0E0H ;UHL
|
||
PDATA .SET 100H ;PROCESS DATA STORE
|
||
PSDATA .SET 2A0H ;PROCESS STACK DATA (PC, A8-A11)
|
||
PRCSIZ .SET 5A0H ;END OF DATA STRUCTURE
|
||
*ENDSTRUCT
|
||
|
||
NPROC .SET 240 ;NUMBER OF PROCESSES ;168 ;198
|
||
|
||
|
||
*
|
||
*GSP MACROS
|
||
*
|
||
*
|
||
*SUBTRACT REGISTER FROM MEMORY
|
||
* SUBRM REG,ADDR,FIELD SIZE
|
||
*A14 DESTROYED, 'A' REGISTER TYPE INSTRUCTIONS ONLY
|
||
*
|
||
SUBRM $MACRO P1,P2,P3
|
||
MOVE :P2:,A14,:P3:
|
||
SUB :P1:,A14
|
||
MOVE A14,:P2:,:P3:
|
||
$END
|
||
*
|
||
*ADD REGISTER TO MEMORY
|
||
* ADDRM REG,ADDR,FIELD SIZE
|
||
*A14 DESTROYED, 'A' REGISTER TYPE INSTRUCTIONS ONLY
|
||
*
|
||
ADDRM $MACRO P1,P2,P3
|
||
MOVE :P2:,A14,:P3:
|
||
ADD :P1:,A14
|
||
MOVE A14,:P2:,:P3:
|
||
$END
|
||
|
||
*INCREMENT LOCATION
|
||
*A14 DESTROYED, 'A' REGISTER TYPE INSTRUCTIONS ONLY
|
||
**
|
||
INCW $MACRO P1
|
||
MOVE :P1:,A14
|
||
INC A14
|
||
MOVE A14,:P1:
|
||
$END
|
||
|
||
*
|
||
*DECREMENT WORD
|
||
*A14 DESTROYED, 'A' REGISTER TYPE INSTRUCTIONS ONLY
|
||
**
|
||
DECW $MACRO P1
|
||
MOVE :P1:,A14
|
||
DEC A14
|
||
MOVE A14,:P1:
|
||
$END
|
||
|
||
*
|
||
*INCREMENT MEMORY
|
||
* INCM ADDR,FIELD SIZE
|
||
*A14 DESTROYED
|
||
**
|
||
INCM $MACRO P1,P2
|
||
MOVE :P1:,A14,:P2:
|
||
INC A14
|
||
MOVE A14,:P1:,:P2:
|
||
$END
|
||
|
||
*
|
||
*DECREMENT MEMORY
|
||
* DECM ADDR,FIELD SIZE
|
||
*A14 DESTROYED
|
||
**
|
||
DECM $MACRO P1,P2
|
||
MOVE :P1:,A14,:P2:
|
||
DEC A14
|
||
MOVE A14,:P1:,:P2:
|
||
$END
|
||
|
||
*
|
||
*SUBTRACT MEMORY
|
||
* SUBM ADDR,REG,FIELD SIZE
|
||
*SUBTRACTS ADDRESS FROM REGISTER
|
||
*A14 DESTROYED, 'A' REGISTER TYPE INSTRUCTIONS ONLY
|
||
*
|
||
SUBM $MACRO P1,P2,P3
|
||
MOVE :P1:,A14,:P3:
|
||
SUB A14,:P2:
|
||
$END
|
||
*
|
||
*ADD MEMORY
|
||
* ADDM ADDR,REG,FIELD SIZE
|
||
*ADDS ADDRESS FROM REGISTER
|
||
*A14 DESTROYED, 'A' REGISTER TYPE INSTRUCTIONS ONLY
|
||
*
|
||
ADDM $MACRO P1,P2,P3
|
||
MOVE :P1:,A14,:P3:
|
||
ADD A14,:P2:
|
||
$END
|
||
*
|
||
*NEGATE MEMORY
|
||
* NEGM ADDR,FIELD SIZE
|
||
*NEGATES ADDRESS CONTENTS
|
||
*A14 DESTROYED, 'A' REGISTER TYPE INSTRUCTIONS ONLY
|
||
*
|
||
NEGM $MACRO P1,P2
|
||
MOVE :P1:,A14,:P2:
|
||
NEG A14
|
||
MOVE A14,:P1:,:P2:
|
||
$END
|
||
*
|
||
*COMPARE MEMORY
|
||
* CMPM ADDR,REG,FIELD SIZE
|
||
*COMPARES ADDRESS TO REGISTER
|
||
*A14 DESTROYED, 'A' REGISTER TYPE INSTRUCTIONS ONLY
|
||
*
|
||
CMPM $MACRO P1,P2,P3
|
||
MOVE :P1:,A14,:P3:
|
||
CMP A14,:P2:
|
||
$END
|
||
*
|
||
*CLEAR MEMORY
|
||
* CLRM ADDR,FIELD SIZE
|
||
*CLEARS ADDRESS CONTENTS
|
||
*A14 DESTROYED, 'A' REGISTER TYPE INSTRUCTIONS ONLY
|
||
*
|
||
CLRM $MACRO P1,P2
|
||
CLR A14
|
||
MOVE A14,:P1:,:P2:
|
||
$END
|
||
*
|
||
*COMPLEMENT MEMORY
|
||
* COMM ADDR,FIELD SIZE
|
||
*COMPLEMENTS ADDRESS CONTENTS
|
||
*A14 DESTROYED, 'A' REGISTER TYPE INSTRUCTIONS ONLY
|
||
*
|
||
COMM $MACRO P1,P2
|
||
MOVE :P1:,A14,:P2:
|
||
NOT A14
|
||
MOVE A14,:P1:,:P2:
|
||
$END
|
||
*
|
||
*SHIFT LEFT MEMORY
|
||
* SLLM SHIFT COUNT,ADDR,FIELD SIZE
|
||
*SHIFTS ADDRESS CONTENTS
|
||
*A14 DESTROYED, 'A' REGISTER TYPE INSTRUCTIONS ONLY
|
||
*
|
||
SLLM $MACRO P1,P2,P3
|
||
MOVE :P2:,A14,:P3:
|
||
SLL :P1:,A14
|
||
MOVE A14,:P2:,:P3:
|
||
$END
|
||
*
|
||
*SHIFT RIGHT ARITHMETIC MEMORY
|
||
* SRAM SHIFT COUNT,ADDR,FIELD SIZE
|
||
*SHIFTS ADDRESS CONTENTS
|
||
*A14 DESTROYED, 'A' REGISTER TYPE INSTRUCTIONS ONLY
|
||
*
|
||
SRAM $MACRO P1,P2,P3
|
||
MOVE :P2:,A14,:P3:
|
||
SEXT A14,:P3:
|
||
SRA :P1:,A14
|
||
MOVE A14,:P2:,:P3:
|
||
$END
|
||
*
|
||
*SHIFT RIGHT LOGICAL MEMORY
|
||
* SRLM SHIFT COUNT,ADDR,FIELD SIZE
|
||
*SHIFTS ADDRESS CONTENTS
|
||
*A14 DESTROYED, 'A' REGISTER TYPE INSTRUCTIONS ONLY
|
||
*
|
||
SRLM $MACRO P1,P2,P3
|
||
MOVE :P2:,A14,:P3:
|
||
ZEXT A14,:P3:
|
||
SRL :P1:,A14
|
||
MOVE A14,:P2:,:P3:
|
||
$END
|
||
|
||
*
|
||
*BIT SET
|
||
* BSET BIT# 0-31(KONSTANT OR REGISTER),REGISTER TO SET BIT IN
|
||
* NOTE: A14 IS DESTROYED, 'A' FILE REGISTERS ONLY
|
||
*
|
||
BSET $MACRO P1,R1
|
||
MOVK 1,A14
|
||
SLL :P1:,A14
|
||
OR A14,:R1:
|
||
$END
|
||
|
||
*
|
||
*BIT CLR
|
||
* BCLR BIT# 0-31(KONSTANT OR REGISTER),REGISTER TO CLR BIT IN
|
||
* NOTE: A14 IS DESTROYED, 'A' FILE REGISTERS ONLY
|
||
*
|
||
BCLR $MACRO P1,R1
|
||
MOVK 1,A14
|
||
SLL :P1:,A14
|
||
ANDN A14,:R1:
|
||
$END
|
||
|
||
*
|
||
*SET THE Z BIT
|
||
* SETZ
|
||
* STATUS BITS:
|
||
* N Unaffected
|
||
* C Unaffected
|
||
* Z 1
|
||
* V Unaffected
|
||
* NOTE: A14 IS CLEARED
|
||
*
|
||
SETZ $MACRO
|
||
CLR A14
|
||
$END
|
||
|
||
*
|
||
*CLR THE Z BIT
|
||
* CLRZ
|
||
* STATUS BITS:
|
||
* N Unaffected
|
||
* C Unaffected
|
||
* Z 0
|
||
* V Unaffected
|
||
* NOTE: A14 IS SET TO 1
|
||
*
|
||
CLRZ $MACRO
|
||
CLR A14
|
||
NOT A14
|
||
$END
|
||
|
||
*
|
||
*PROCESS SLEEP CONSTANT
|
||
*P1=SLEEP TIME CONSTANT 1-FFFF LOADED INTO A0
|
||
*RET ADDR ON STACK
|
||
*
|
||
SLEEP $MACRO P1
|
||
$IF P1 < 33
|
||
MOVK :P1:,A0
|
||
$ELSE
|
||
MOVI :P1:,A0
|
||
$ENDIF
|
||
CALLA PRCSLP
|
||
$END
|
||
*
|
||
*PROCESS SLEEP REGISTER
|
||
*REG1=REGISTER THAT CONTAINS SLEEP TIME 1-FFFF LOADED INTO A0
|
||
*RET ADDR ON STACK
|
||
*
|
||
SLEEPR $MACRO REG1
|
||
MOVE :REG1:,A0
|
||
CALLA PRCSLP
|
||
$END
|
||
|
||
*
|
||
*PROCESS LOOP SLEEP
|
||
*P1=SLEEP TIME -->A0, P2 =WAKEUP ADDR-->A7
|
||
*
|
||
SLOOP $MACRO P1,P2
|
||
$IF P1 < 33
|
||
MOVK :P1:,A0
|
||
$ELSE
|
||
MOVI :P1:,A0
|
||
$ENDIF
|
||
MOVI :P2:,A7,L
|
||
JAUC PRCLSP
|
||
$END
|
||
|
||
*
|
||
*PROCESS LOOP SLEEP REGISTER
|
||
*P1=REGISTER CONTAINING SLEEP TIME 1-FFFF, P2 =WAKEUP ADDR-->A7
|
||
*
|
||
SLOOPR $MACRO P1,P2
|
||
MOVE :P1:,A0
|
||
MOVI :P2:,A7,L
|
||
JAUC PRCLSP
|
||
$END
|
||
|
||
*
|
||
*PROCESS CREATION MACRO
|
||
*P1=ID-->A1, P2=PC-->A7
|
||
*
|
||
CREATE $MACRO P1,P2
|
||
MOVI :P1:,A1
|
||
MOVI :P2:,A7,L
|
||
CALLA GETPRC
|
||
$END
|
||
|
||
*
|
||
*KILL PROCESS(ES)
|
||
*P1=ID-->A0,P2=MASK-->A1
|
||
*
|
||
KILLIT $MACRO P1,P2
|
||
MOVI :P1:,A0
|
||
MOVI :P2:,A1
|
||
CALLA KILALL
|
||
$END
|
||
|
||
*
|
||
*CALL IT QUITS
|
||
*
|
||
DIE $MACRO
|
||
JAUC SUCIDE
|
||
$END
|
||
*
|
||
*PROCESS JUMP SUBROUTINE
|
||
*P1=ADDRESS OF SLEEPING PROCESS
|
||
*A7 IS USED FOR PC STORAGE
|
||
*
|
||
JSRP $MACRO P1
|
||
GETPC A7
|
||
ADDI 060h,A7
|
||
MOVE A7,-*A12,L ;PUSH RET ADDR
|
||
JAUC :P1:
|
||
$END
|
||
|
||
*
|
||
*PROCESS JUMP SUBROUTINE ON REGISTER
|
||
*R1=REGISTER CONTAINING ADDRESS OF SLEEPING PROCESS
|
||
*A7 IS USED FOR PC STORAGE
|
||
*
|
||
JSRPR $MACRO R1
|
||
GETPC A7
|
||
ADDI 040h,A7
|
||
MOVE A7,-*A12,L ;PUSH RET ADDR
|
||
JUMP :R1:
|
||
$END
|
||
|
||
*
|
||
*RETURN FROM SLEEPING SUBROUTINE
|
||
*A7 IS USED FOR PC STORAGE
|
||
*STATUS REGISTER IS NOT AFFECTED
|
||
*
|
||
RETP $MACRO
|
||
MMFM A12,A7 ;PULL RETURN ADDR, W/O ZAPPING STAT
|
||
EXGPC A7
|
||
$END
|
||
|
||
*FIND MATCHING PROCESS(ES), BRANCH IF ONE WAS FOUND
|
||
*P1=ID-->A0,P2=MASK-->A1,P3=BRANCH LABEL
|
||
MATCHP $MACRO P1,P2,P3
|
||
MOVI :P1:,A0
|
||
MOVI :P2:,A1
|
||
CALLA EXISTP
|
||
JANZ :P3:
|
||
$END
|
||
|
||
*FIND MATCHING PROCESS(ES), BRANCH IF NONE WERE FOUND
|
||
*P1=ID-->A0,P2=MASK-->A1,P3=BRANCH LABEL
|
||
NOMATCHP $MACRO P1,P2,P3
|
||
MOVI :P1:,A0
|
||
MOVI :P2:,A1
|
||
CALLA EXISTP
|
||
JAZ :P3:
|
||
$END
|
||
|
||
*PUSH REGISTER(S) ONTO THE STACK
|
||
*USAGE: ONE OPERAND -> PUSH OP 2 OR MORE OPS -> PUSH (OP1,OP2,...,OPN)
|
||
PUSH $MACRO REG
|
||
MOVE :REG:,-*SP,1
|
||
$END
|
||
|
||
*PULL REGISTER(S) OFF OF THE STACK
|
||
*USAGE: ONE REGISTER -> PULL REG 2 OR MORE REGS -> PULL (REG1,REG2,...,REGN)
|
||
PULL $MACRO REG
|
||
MMFM SP,:REG:
|
||
$END
|
||
|
||
*PUSH REGISTER ONTO THE PROCESS STACK
|
||
*USAGE: ONE OPERAND -> PUSH REG
|
||
PUSHP $MACRO REG
|
||
MOVE :REG:,-*A12,L
|
||
$END
|
||
|
||
*PULL REGISTER(S) OFF OF THE PROCESS STACK
|
||
*USAGE: ONE REGISTER -> PULL REG
|
||
PULLP $MACRO REG
|
||
MMFM A12,:REG:
|
||
$END
|
||
|
||
*PUSH LOW WORD OF REGISTER ON TO STACK
|
||
*ONE REGISTER ONLY!
|
||
*USAGE: PUSHW REG
|
||
PUSHW $MACRO REG
|
||
MOVE :REG:,-*SP,0
|
||
$END
|
||
|
||
*PULL LOW WORD OF REGISTER OFF OF STACK
|
||
*ONE REGISTER ONLY!
|
||
*USAGE: PULLW REG
|
||
PULLW $MACRO REG
|
||
MOVE *SP+,:REG:,0
|
||
$END
|
||
|
||
*NULL LONG WORD
|
||
LONGNULL:$MACRO
|
||
.LONG 0
|
||
$END
|
||
*
|
||
*LOCKUP MACRO
|
||
*
|
||
LOCKUP $MACRO
|
||
DINT
|
||
JRUC $
|
||
$END
|
||
|