*COMDECK PIRAM
         NAM   PIRAM
* 
****************************************
*                                      *
*             P I R A M                *
*                                      *
*  WRITE  MICRO-CODE TO CONTROL MEMORY *
*                                      *
****************************************
* 
         EXT   MF8K 
         EXT     PILMT                                                   CC4
         EXT     LKCYC                                                   CC4
         EXT     LKLEV                                                   CC4
         EXT     LKVER                                                   CC4
         EXT     J1CORE                                                  CC4
          ENT    J2CORE                                                  CC4
         ENT     CCPCYC                                                  CC4
         ENT     CCPLEV                                                  CC4
         ENT     CCPVER                                                  CC4
         ENT   PIRAM
         ENT     PIEX 
         ENT   IDLE 
* 
* 
CCPVER   ADC     LKVER        CCP VERSION NUMBER                         CC4
CCPLEV   ADC     LKLEV        CCP PSR LEVEL NUMBER                       CC4
CCPCYC   ADC     LKCYC        CCP VARIANT NUMBER                         CC4
SIACCP   ADC     CCPLEV                                                  CC4
J2CORE    NUM    0                                                       CC4
SIRFE    NUM     $01FD        SET REGISTER FE                            CC4
SIZLOC   NUM     $C000                                                   CC4
NSUM     EQU   NSUM($5FF*4+2) ADDRESS TO STORE -CHECKSUM
SIEF1    NUM     $603         LOAD FILE 1 REGISTER                       CC4
R1SAVE   NUM   0             LOC TO SAVE INITIAL VALUE OF R1
R2SAVE   NUM   0             LOC TO SAVE INITIAL VALUE OF R2
ISAVE    NUM   0             LOC TO SAVE INITIAL V1 
MASK     NUM   $4FFF     12 BIT ADDRESS + U/L BIT AS IN MICROCODE 
MASK2    NUM   $1FFF     12 BIT ADDRESS + U/L BIT AS L.O. BIT 
K4000    NUM   $4000         CONSTANT TO SHIFT
MFBASE   NUM   0         SAVE ADDRESS OF SELECTED LOAD FILE 
         EJT
PIRAM    NOP   0
         RTJ   SIZEMM    DETERMINE IF 8K RAM IS PRESENT 
         SAZ   SIZE4K 
* 
* * * 8K MICRO-MEMORY AVAILABLE 
* 
SIZE8K   LDA   =XMF8K    PICK UP ADDRESS OF 8K FIRMWARE 
         JMP*  SETUP
* 
* * * 4K MICRO-MEMORY AVAILABLE 
* 
SIZE4K ENA  9 
       JMP* (PIRAM) 
SETUP    STA*  MFBASE    STORE ADDRESS OF SELECTED LOAD FILE
         RTJ*  LOADMM    LOAD FIRMWARE TO MICRO-MEMORY
         RTJ*  CHECKSUM  CHECKSUM IT AS DURING DUMP 
         RTJ*  LOADMM    LOAD IT AGAIN, BUT WITH ZERO CHECKSUM
         RTJ*  CLRMEM    CLEAR MEM PARITY ERRORS
       ENA  0 
         JMP*  (PIRAM)   EXIT 
         SPC   3
* 
* * * LOAD MICRO-MEMORY 
* 
LOADMM   NOP   0
         LDA*  MFBASE    POINT I TO SELECTED LOAD FILE
         STA-  I
*                                                                        CC4
NEXT     LDA-  1,I           LAST HALF OF FIRST JUMP INTO A 
         SAN   DONEXT-*-1    TEST FOR ZERO WHICH IS AT END
         JMP*  (LOADMM)  EXIT 
DONEXT   AND*  MASK      KEEP RIGHT 12 BITS AND U/L BIT 
         ADD*  K4000         CARRY WILL SHIFT UPPER/LOWER TO BIT 2**15
         ALS   1             DOUBLE AND PUT UPPER/LOWER IN 2**0 
         AND*  MASK2     ADDRESS IS NOW IN RIGHT 13 BITS
         XFA   1             PUT INTO R1
         TCA   Q             PUN NEGATIVE VALUE INTO Q
         ALS   1             MAKE INTO A 16 BIT WORD COUNT
         ADD*  MFBASE    ADD BASE ADDRESS OF IMAGE
         XFA   2             PUT VALUE INTO R2
         LDA-  3,I           GET END MICRO ADDRESS
         AND*  MASK 
         ADD*  K4000         32-BIT MICRO ADDRESS WITH UPPER/LOWER
         ALS   1             DOUBLE AND PUT UPPER/LOWER IN 2**0 
         AND*  MASK2     ADDRESS IS NOW IN RIGHT 13 BITS
         AAQ   Q             SUBTRACT START FROM END. GIVES COUNT-1 
         INQ   1             CORRECT COUNT. 
         LMM
         LDA-  I             INCREASE I TO POINT TO NEXT JUMP PAIR
         INA   4
         STA-  I
         JMP*  NEXT 
         EJT
* 
* * * CHECKSUM MICRO-MEMORY AND STORE -RESULT INTO IMAGE
* 
MMADR    EQU   MMADR($7F0)
MMADR2   EQU   MMADR2(MMADR+MMADR)
         SPC   3
CHECKSUM NOP   0
         LR1   =XMMADR2  MICRO-MEM ADDRESS INTO WHICH TO LOAD 
         LR2   =XMMSEQ   ADDRESS OF LOAD FILE 
         LDQ*  MMSEQ-1   NO OF 32-BIT WORDS TO LOAD 
         LMM   0         LOAD CHECKSUM ROUTINE
* 
* * * EXECUTE IT
* 
         LDQ   =XMMADR   MICRO-MEM ADDRESS TO EXECUTE 
         EMS   Q         DO IT
* 
* * * STORE -CHECKSUM INTO IMAGE TO MAKE CHECKSUM = 0 
* 
         TCA   A         NEGATE CHECKSUM
         LDQ*  MFBASE    POINT Q TO SELECTED LOAD FILE
         STA+  NSUM,Q    STORE -CHECKSUM
         JMP*  (CHECKSUM) EXIT
*CALL MMCKSUM 
         EJT
*                                                                        CC4
* * * DETERMINE UPPER LIMIT OF MEMORY                                    CC4
*                                                                        CC4
SIPAGE   EQU   SIPAGE($20) NUMBER OF PAGE REGISTERS 
SIZSC    NUM   $8000     START OF CORE ZERO 
SITPAGE  NUM   $C000     PAGE NUMBER AND BANK 
SIPSIZ   NUM   $7FF      NUMBER OF WORDS LESS ONE IN A PAGE 
SISETP   NUM   0
         SPC   3
CLRMEM   NOP   0
         LDA*  SIACCP    ADDRESS OF LEVEL NUMBER
          LDQ*   SIRFE        REGISTER SET FOR FE                        CC4
          LR3*   SIEF1                                                   CC4
          EMS    3            SET REGISTER FE TO MF LEVEL                CC4
          LDA    J1CORE       SKIP SIZING AND CORE CLEAR IF              CC4
         SAZ     PIRAMA       - ALREADY DONE (2552 MUXSIDE)              CC4
         JMP*    PIRAM6                                                  CC4
PIRAMA   ENA     SIPAGE-1     HIGHEST PAGE REGISTER                      CC4
         XFA     1                                                       CC4
*                                                                        CC4
PIRAM2   XF1     A            NEXT PAGE REGISTER                         CC4
         ALS     11                                                      CC4
         STA*    SISETP       PAGE NUMBER (BANK 0)                       CC4
         XF1     A            PAGE VALUE                                 CC4
         ORA*    SISETP                                                  CC4
         WPR     A                                                       CC4
         D1P     *-PIRAM2     REPEAT FOR ALL REGISTERS                   CC4
*                                                                        CC4
         PM0     0            SET PAGE MODE ZERO                         CC4
*                                                                        CC4
         RTJ     PILMT        GET UPPER MEMORY LIMIT                     CC4
*                                                                        CC4
* * * ZERO OUT UNUSED MEMORY                                             CC4
*                                                                        CC4
         ENQ     1                                                       CC4
         LDA     J1CORE,Q                                                CC4
         SBA*    SIZSC        ADDRESS TO BEGIN CLEARING CORE             CC4
         XFA     Q                                                       CC4
         INQ     1            NUMBER OF WORDS TO ZERO                    CC4
         ENA     0                                                       CC4
PIRAM3   STA     (SIZSC),Q                                               CC4
         DQP     *-PIRAM3     LOOP UNTIL DONE                            CC4
*                                                                        CC4
         LDA     J1CORE       CHECK IF PAGED PROCESSOR                   CC4
         INA     -SIPAGE                                                 CC4
         SAM     PIRAM6       SKIP IF 65K OR LESS                        CC4
*                                                                        CC4
* * * ZERO OUT UPPER PAGES (ABOVE 65K)                                   CC4
*                                                                        CC4
         XFA     1            NUMBER OF PAGES TO CLEAR                   CC4
PIRAM4   XF1     A            NEXT PAGE TO CLEAR                         CC4
         INA     SIPAGE                                                  CC4
         ORA*    SITPAGE                                                 CC4
         WPR     A            POINT TO PAGE                              CC4
         LDQ*    SIPSIZ       SIZE OF PAGE                               CC4
         ENA     0                                                       CC4
PIRAM5   STA     (SIZLOC),Q   ZERO THIS PAGE                             CC4
         DQP     *-PIRAM5     SKIP IF PAGE NOT CLEARED                   CC4
*                                                                        CC4
         D1P     *-PIRAM4     SKIP IF ALL PAGES NOT CLEARED              CC4
*                                                                        CC4
         APM     0            ABSOLUTE PAGE MODE                         CC4
*                                                                        CC4
PIRAM6   JMP*  (CLRMEM)  EXIT 
         EJT
* 
* * * ROUTINE TO DETERMINE MICRO-MEMORY SIZE
* 
SIZEMM   NOP   0
         LDQ*  MICRO-1   NUMBER OF 32-BIT INSTRUCTIONS TO LOAD
         LR1   =N$800    MICRO-MEMORY ADDRESS TO LOAD INTO
         LR2   =XMICRO   ADDRESS OF MICROCODE IMAGE 
         LMM   0         LOAD MICRO ROUTINE 
         LDQ   =N$400 
         EMS   Q         EXECUTE IT TO SIZE MICRO-MEMORY
         JMP*  (SIZEMM) 
* 
*        THE FOLLOWING MICROCODE SEQUENCE IS USED TO SIZE MICRO-MEMORY. 
*        IT IS LOADED INTO RAM AT $400 AND DETERMINES IF THE 8K RAM 
*        IS AVAILABLE BY WRITING AND READING-BACK A LOCATION ABOVE
*        THE LIMIT OF THE 4K RAM.  WHEN A NON-EXISTANT RAM
*        LOCATION IS READ, IT WILL APPEAR TO CONTAIN $FFFFFFFF. 
* 
         NUM   11        LENGTH OF MICRO ROUTINE
* 
*                                LOC    F    A  B    D   S  C       MT
*                                       ORG  400X 
MICRO    NUM   $D8D8,$00FD *  SIZEMM                     K=MMSIZE 
         NUM   $D8D8,$3018 *                             N=18X
         NUM   $54CA,$2900 *         B       N,K   MMU            U 
         NUM   $0000,$0000 * $ UNUSED LOWER 
         NUM   $54E0,$2800 * +       B       MMU                  U 
         NUM   $0000,$0000 * $ UNUSED LOWER 
         NUM   $52C8,$E000 * +       EOR  X  N,K                  ZL
         NUM   $0000,$0000 * $ UNUSED LOWER 
         NUM   $58DD,$2000 * +       ZERO         A               U 
         NUM   $54D5,$200F * -       B       BG   A      15 
         NUM   $9F1C,$503E * +       A    A       F1     UINTRTN JL 
* 
         EJT
* 
* * *    LOCAL NPU EXIT - SEND IDLE COUPLER STATUS TO HOST
* 
PIEX     NOP     0
         LDQ   =N$648         PRIMARY COUPLER ADDRESS 
         LDA*  IDLE           STATUS WORD 
         SIO                  NOTIFY PRIMARY HOST 
         LDQ   =N$6C8         SECOND COUPLER ADDRESS
         LDA*  IDLE           STATUS WORD 
         SIO                  NOTIFY SECOND HOST IF PRESENT 
         NOP   0
         JMP*  *-1           WAIT FOR NPU TO BE LOADED
IDLE     NUM   1
         END
