*.Last mod - 4/8/95 19:55 .globl GETPRC,SUCIDE,PRCSLP,PRCLSP .globl process_exist,EXISTP .globl XFERPROC .globl KILL,KILALL,KIL1C,KILALLN .globl RAND,ACTIVE,FREE,PRCSTR .globl snd_play1,snd_play,SNDSND .globl SFREE,SPRCSTR,GETSPRC,GETPRC_INSERT ;Process data structure *STRUCT PROC PLINK .set 0 ;UHL 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 400h ;PROCESS STACK DATA PRCSIZ .set 600h ;END OF DATA STRUCTURE *ENDSTRUCT SPSDATA .set 1080h ;SUPER-PROCESS STACK DATA SPRCSIZ .set 1380h ;SUPER-PROCESS END OF STRUCT SNPROC .SET 7 ;# of super-procs ;NPROC .SET 100 ;# processes NPROC .SET 150 ;# processes *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: .endm *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: .endm *INCREMENT LOCATION *A14 DESTROYED, 'A' REGISTER TYPE INSTRUCTIONS ONLY INCW .macro P1 MOVE :P1:,A14 INC A14 MOVE A14,:P1: .endm *DECREMENT WORD *A14 DESTROYED, 'A' REGISTER TYPE INSTRUCTIONS ONLY DECW .macro P1 MOVE :P1:,A14 DEC A14 MOVE A14,:P1: .endm *INCREMENT MEMORY * INCM ADDR,FIELD SIZE *A14 DESTROYED INCM .macro P1,P2 MOVE :P1:,A14,:P2: INC A14 MOVE A14,:P1:,:P2: .endm *DECREMENT MEMORY * DECM ADDR,FIELD SIZE *A14 DESTROYED DECM .macro P1,P2 MOVE :P1:,A14,:P2: DEC A14 MOVE A14,:P1:,:P2: .endm *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: .endm *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: .endm *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: .endm *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: .endm *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: .endm *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: .endm *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: .endm *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: .endm *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: .endm *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: .endm *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: .endm *SET THE Z BIT * SETZ * STATUS BITS: * N Unaffected * C Unaffected * Z 1 * V Unaffected * NOTE: A14 IS CLEARED SETZ .macro CLR A14 .endm *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 .endm *PROCESS SLEEP CONSTANT *A=Sleep time 1-7fff *RET ADDR ON STACK SLEEP .macro A movi :A:,a0 calla PRCSLP .endm SLEEPK .macro A movk :A:,a0 calla PRCSLP .endm *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 .endm *PROCESS LOOP SLEEP *s=Sleep time, a=*Wakeup addr SLOOP .macro s,a .if :s: < 33 movk :s:,a0 .else movi :s:,a0 .endif movi :a:,a7,L jauc PRCLSP .endm *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 .endm *PROCESS CREATION MACRO *P1=ID-->A1, P2=PC-->A7 CREATE .macro p1,p2 movi :p1:,a1 movi :p2:,a7,L calla GETPRC .endm *PROCESS CREATION MACRO *A=PC-->A7 CREATE0 .macro A clr a1 movi :A:,a7,L calla GETPRC .endm SCREATE .macro p1,p2 movi :p1:,a1 movi :p2:,a7,L calla GETSPRC .endm *KILL PROCESS(ES) *P1=ID-->A0,P2=MASK-->A1 KILLIT .macro P1,P2 MOVI :P1:,A0 MOVI :P2:,A1 CALLA KILALL .endm *CALL IT QUITS DIE .macro jauc SUCIDE .endm *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: .endm *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: .endm *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 .endm *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: .endm *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: .endm LOCKUP .macro trap 29 .endm