ASMB,R,L,C
      HED CDGN [#DUMP] - GENNED IN DUMP TO CART 
      NAM #DUMP,1 24999-16310 REV.2024 800116 
      EXT EXEC
      EXT $MRMP     POINTER TO MEM RES MAP
* 
*     "CDGN" - (KNOWN AS #DUMP) - A "STANDALONE" PROGRAM THAT 
*     DUMPS A CRASHED SYSTEM TO CARTRIDGE TAPE.  IT RESIDES IN THE
*     MEMORY RESIDENT AREA, BUT REQUIRES NO RTE SERVICES. 
* 
*     THE PROGRAM DUMPS 32K OF MEMORY, THE DRIVER PARTITIONS AND THE
*     FOUR SYSTEM MAPS, FOLLOWED BY THE CONTENTS OF THE SYSTEM AND
*     USER ADDRESS SPACES.  NOTE THAT THE DUMP ORDER IS: THE FIRST 32K, 
*     THE MAPS, THE NEXT 16K, AND THE PAGES OF THE SYSTEM AND USER
*     ADDRESS SPACES THAT ARE NOT IN THE FIRST 32K OF THE DRIVER PARTITIONS.
* 
*     THE END OF THE DRIVER PARTITIONS IS FOUND BY EXAMINING C(C($MRMP)), 
*     WHICH CONTAINS THE PAGE ADDRESS OF THE FIRST PAGE AFTER 
*     THE END OF THE DIRVER PARTITIONS.  IF C(C($MRMP)) IS LESS THAN 32,
*     THEN NO DRIVER PARTITIONS ARE DUMPED (THEY ARE ALL IN THE FIRST 32K). 
*     IF C(C($MRMP)) IS BETWEEN 32 AND 64, THEN THAT VALUE LESS 32 IS USED. 
*     IF C(C($MRMP)) IS OVER 64, PAGES 32 - 47 ARE DUMPED AS DRIVER PARTITIONS
* 
*     BLOCKS IN THE SYSTEM AND USER MAPS THAT ARE IN THE FIRST 32K OR THE 
*     DRIVER PARTITIONS ARE NOT DUMPED TWICE. 
* 
*     A HALT 42 INDICATES A NONRECOVERABLE WRITE ERROR.  BY HITTING 
*     RUN YOU CAN TRY AGAIN.
*     A HALT 70 INDICATES A PAUSE TO CHANGE TAPES 
*         (AFTER THE MAPS, AFTER THE DRIVERS, AND AFTER THE SYSTEM A.S.)
*     A HALT 77 INDICATES A NORMAL COMPLETION.
*         (AFTER THE USER ADDRESS SPACE)
* 
*     TO RUN -- SET THE P REGISTER TO THE ADDRESS OF \DUMP IN THE 
*     SYSTEM (THIS IS GENNED IN).  SET THE S REGISTER TO THE SELECT 
*     CODE OF THE 26XX TERMINAL.  THE DUMP WILL BE TO THE LEFT CTU. 
*     NOTE THAT THE PROGRAM IS ALREADY LOADED INTO MEMORY, AND NO 
*     BOOT LOAD IS NECESSARY. 
* 
*     THIS PROGRAM IS PART OF THE CRASH DUMP ANALYSIS PACKAGE 
* 
*     JEF  01/16/80 
* 
* 
A     EQU 0 
B     EQU 1 
SC    EQU 25B 
* 
*     IF USER RUNS WITH "RU,#DUMP", JUST DO A TERMINATION 
*     TO PROTECT HIM
* 
#DUMP JSB EXEC      TERMINATE PROGRAM 
      DEF *+2 
      DEF D6
* 
*     CONFIGURE 
* 
INIT  EQU * 
CDGN  STA DADDR     SAVE \DUMP ADDRESS
      LIA 1         LOAD DISPLAY REG INTO A REG 
      ADA SFS1      BUILD INST SFS SC 
      STA FIX1
      ADA LIA2      BUILD INST LIA SC 
      STA FIX3
      ADA OTA3      BUILD INST OTA SC 
      STA FIX4
      ADA STC4      BUILD INST STC SC,C 
      STA FIX5
      STA FIX2
***** 
* 
*     MAIN ROUTINE
* 
***** 
* 
*     FIGURE OUT HOW MANY PHYSICAL PAGES TO DUMP -
*       IF $MRMP IS BETWEEN 32 AND 63, USE THAT; IF IT IS LESS
*       THAN 32, USE 32; OTHERWISE USE 48K. 
* 
* 
      LDA $MRMP,I     LOAD MR BASE PAGE ADDR
      AND B1777       MASK OUT PROTECT BITS 
      LDB A 
      STA TMP         & SAVE
      ADA M32 
      SSA             >= 32?
      LDB D32         NO - USE 32 
      LDA TMP 
      ADA M64         SUBTRACT 64 
      SSA,RSS         MR BP >= 64?
      LDB D48         YES - SET DUMP LIMIT TO 48K 
      STB DLIM            SAVE
      CLB             SET 
      STB CPAGE           CURRENT PAGE NUMBER 
* 
*     WRITE PAGES TO THE CART - THE MAPS ARE WRITTEN AFTER
*     THE FIRST 32K.  PAUSE AFTER THE MAPS ARE WRITTEN AND AFTER
*     WE ARE DONE DUMPING PHYSICAL MEMORY.
* 
PH    JSB POUT        PUT OUT PAGE
      ISZ CPAGE       BUMP PAGE # 
      LDB CPAGE 
      CPB D32         IS PAGE 32 NEXT?
      JSB MAPS        YES - WRITE MAPS
      CPB DLIM        LAST PAGE?
      RSS 
      JMP PH          NO - DO MORE
      JSB EOF         PUT AN EOF ON THE CART
      HLT 70B         LET THE USER CHANGE CARTS 
* 
*     DUMP THE CONTENTS OF THE SYSTEM AND USER MAPS 
*     DO NOT DUMP PAGES THAT ALREADY HAVE BEEN DUMPED 
*     IN THE FIRST 32K OR THE DRIVER PARTITIONS 
* 
      LDA B2000       INIT
      STA MADDR           LOOP
WL    LDA MADDR,I     GET PAGE #
      AND B1777       MASK OUT READ/WRITE PROTECT 
      STA TMP         HOLD
      CMA,INA         CHECK 
      ADA DLIM            IF PAGE HAS TO
      CMA,SSA,INA,SZA         BE DUMPED 
      JMP NEXT        NO - PAGE WAS ALREADY DUMPED
      LDB TMP         YES - WRITE 
      JSB POUT            PAGE
NEXT  ISZ MADDR       BUMP PAGE 
      LDA MADDR           NUMBER
      CPA B2040       ARE WE THROUGH THE SYSTEM MAP?
      JMP HPAUS           YES - WRITE AN EOF AND PAUSE
      CPA B2100       ARE WE ALL DONE?
      RSS 
      JMP WL          NO - CONTINUE 
      JSB EOF         WRITE AN EOF ON THE TAPE
STOP  HLT 77B         WE'RE DONE
      JMP STOP            (EVEN IF THEY HIT RUN AGAIN)
* 
HPAUS JSB EOF         WRITE AN EOF ON THE TAPE
      HLT 70B         PAUSE 
      JMP WL          CONTINUE WITH MAPS
* 
*     SUBROUTINE TO WRITE AN EOF ON THE CART
* 
EOF   DEF *-*         ENTRY POINT 
      LDB ESC 
      JSB OTWD
      LDB P5
      JSB OTWD
      LDA C 
      JSB OTBYT 
      JMP EOF,I       RETURN
* 
*     MAPS RETRIEVES THE SYSTEM MAP FROM \DUMP
*     IN THE FIRST 32K AND THEN WRITES ALL FOUR MAPS
*     TO THE CART.
* 
MAPS  NOP 
      LDA D2          MAP 
      CAX                 PHYS PAGES 1+2
      LDA D1                  AS
      LDB A                       SYS PAGES 
      XMS                         1+2 
      LDA BADDR       SAVE
      USA                 MAPS
      PAA 
      PBA 
      LDA D32         SET PHYS PAGES 0 - 31 
      CAX                 AS USER MAP 
      CLB 
      XMS 
      LDA D32         MOVE
      CAX                 32 WORDS
      LDA DADDR               FROM \DUMP
      LDB B2000                   TO PAGE 1 
      MWF                         (SYS MAP) 
      LDB D1          WRITE 
      JSB MSETM         -SET MAP- 
      LDB B2000           MAPS
      JSB WRIT
      HLT 70B         PAUSE TO CHANGE CARTS 
      LDB CPAGE       RESTORE VALUE 
      JMP MAPS,I      RETURN
* 
*     POUT WRITES A PAGE OF MEMORY TO THE TAPE/CART 
*     THE B REGISTER HAS THE PAGE NUMBER
* 
POUT  NOP 
      JSB MSETM       SET MAP 
      LDB B4000       INIT
      STB DPAD            ADDR
PCONT JSB WRIT        WRITE 128 WORDS 
      LDB DPAD        INCR DUMP ADDR
      ADB B200            BY 128
      STB DPAD
      CPB B6000       DONE? 
      JMP POUT,I      YES - RETURN
      JMP PCONT 
* 
*     MSET SETS THE MAP REGISTER SPECIFIED BY WPAG
*     TO THE PAGE SPECIFIED BY THE B REGISTER 
* 
MSETM NOP 
      LDA D1          MAP 
      CAX                 THE PAGE SPECIFIED
      LDA WPAG                TO WPAG 
      XMS 
      JMP MSETM,I     RETURN
* 
*     WRIT WRITES 128 BYTES FROM THE ADDRESS SPECIFIED
*     BY THE A REGISTER (MAPPING MUST ALREADY BE DONE)
* 
WRIT  NOP 
      STB ADR         SAVE PARM 
* 
*     PUT OUT ESCAPE SEQUENCE 
* 
ESCQ  LDA EPTR      RESET POINTER 
      STA *+1 
ESLP  LDB ESC       GET A WORD OF THE ESC SEQ 
      ISZ *-1       MOVE TO NEXT WORD 
      JSB OTWD      OUTPUT CURRENT WORD 
      CPB EOT       IS IT END OF ESC SEQ? 
      RSS           YES-GO WAIT FOR ACK 
      JMP ESLP      NO-DO NEXT ESC SEQ WORD 
* 
*     ACKNOWLEDGE 
* 
WACK  LDA ENQ       SEND ENQ
      JSB OTBYT 
      JSB INBYT     GET ACK 
      CPA ACK       IS IT ACK?
      CLE,RSS       YES-SKIP
      JMP WACK      NO-LOOP 
* 
* 
*     OUTPUT RECORDS
* 
* 
      LDA M128      GET COUNTER #WDS/REC
      STA TMP 
OTLP  LDB ADR,I     O.W. GET IT OUT OF SYS MAP
      JSB OTWD      WRITE THE WORD
      ISZ ADR       GET THE NEXT ADDRESS
      ISZ TMP       DONE WITH REC?
      JMP OTLP      NO-DO NEXT WORD 
      LDA DC1       YES-SEND DC1
      JSB OTBYT 
      JSB INBYT     GET TAPE STATUS 
      CPA S         S-SUCCESS? (F-FAIL) 
      JMP *+3       YES-SKIP
      HLT 42B       NO-HALT 
      JMP INIT      2ND CHANCE TO RUN 
      JSB INBYT     WAIT FOR CR 
      JMP WRIT,I    RETURN
* 
*     OUTPUT ONE WORD 
* 
OTWD  NOP           OUTPUT ONE WORD TO CTU
      CCE           START WITH UPPER HALF 
      LDA B         PUT DATA IN A REG 
      ALF,ALF       PUT IN LOWER POSITION 
      AND B377      MASK OUT UPPER HALF 
      JSB OTBYT     OUTPUT BYTE 
      SEZ,RSS       SECOND HALF WRITTEN?
      JMP OTWD,I    YES-RETURN
      LDA B         N0-PUT DATA IN A REG
      CLE           SET LOWER HALF FLAG 
      JMP OTWD+4    WRITE IT
* 
*     INPUT ONE BYTE
* 
INBYT NOP           INPUT ONE BYTE
      JSB SETUP     FIX UP I O INTERFACE CARD 
      LDA RCV       PUT IN RECEIVE MODE 
      JSB OUT 
FIX2  STC SC,C      DO IT 
FIX3  LIA SC        PUT THE BYTE INTO A-REG 
      SSA,RSS       VALID?
      JMP *-2       NO. GET ANOTHER.
      AND B377      MASK OUT UPPER HALF 
      JMP INBYT,I   RETURN
* 
*     OUTPUT ONE BYTE 
* 
OTBYT NOP           OUTPUT ONE BYTE 
      STA OVAL      SAVE VALUE TO SEND
      JSB SETUP     FIX UP I O INTERFACE CARD 
      LDA XMIT      PUT IN TRANSMIT MODE
      JSB OUT 
      LDA OVAL      GET VALUE TO SEND 
      JSB OUT       SEND THE BYTE 
FIX5  STC SC,C      PUT CARD IN DATA MODE 
FIX1  SFS SC        IS I/O DONE?
      JMP *-1       NO-WAIT 
      JMP OTBYT,I   RETURN
* 
*     DO ONE OTA
* 
OUT   NOP 
FIX4  OTA SC
      JMP OUT,I 
* 
*     SET UP THE INTERFACE CARD 
* 
SETUP NOP 
      LDA MSET      MASTER RESET
      JSB OUT 
      LDA CHMD      PUT IN CHAR MODE
      JSB OUT 
      LDA FRAM      CHAR FRAME CONTROL
      JSB OUT 
      JMP SETUP,I   RETURN
* 
* 
* 
SFS1  OCT 102300    TO BUILD SFS COMMAND
LIA2  OCT 000200    TO BUILD LIA COMMAND
OTA3  OCT 000100    TO BUILD OTA COMMAND
STC4  OCT 001100    TO BUILD STC,C COMMAND
* 
* 
M128  DEC -128
B377  OCT 377 
* 
OVAL  NOP 
ADR   NOP 
M32   DEC -32 
M64   DEC -64 
D48   DEC 48
DLIM  DEF *-*         NUMBER OF PHYSICAL PAGES TO DUMP
CPAGE DEF *-*         PAGE BEING DUMPED 
B2000 OCT 2000
TMP   DEF *-* 
B1777 OCT 1777
MADDR DEF *-*         ADDRESS WITHIN MAP TABLE
B2040 OCT 2040        ADDRESS OF 33RD PAGE IN MAP TABLE 
B2100 OCT 2100        ADDRESS OF 65TH PAGE IN MAP TABLE 
D1    DEC 1 
D2    DEC 2 
D6    DEC 6 
D32   DEC 32
DADDR DEF *-*         ADDRESS OF ENTRY POINT
BADDR OCT 102040      FOR DUMPING MAPS TO 2040
B4000 OCT 4000
B200  OCT 200 
B6000 OCT 6000
DPAD  DEF *-*         ADDRESS OF NEXT RECORD TO WRITE 
WPAG  DEF 2           MAP REGISTER # TO USE FOR I/O 
* 
* 
MSET  OCT 150077    MASTER RESET
FRAM  OCT 30003     CHAR FRAME CONTROL
RCV   OCT 40340     PUT IN RECEIVE MODE 
XMIT  OCT 40740     PUT IN TRANSMIT MODE
CHMD  OCT 10040     PUT IN CHAR MODE
* 
* 
EPTR  LDB ESC 
* 
* 
ESC   OCT 015446    ASCII "ESC" "&" 
      OCT 070061    ASCII LOWER CASE "P" "1"
      OCT 062062    ASCII LOWER CASE "D" "2"
      OCT 032466    ASCII "5" "6" 
EOT   OCT 053421    ASCII UPPER CASE "W" "DC1"
P5    OCT 070065    ASCII LOWER CASE "P" "5"
C     OCT 000103    ASCII UPPER CASE "C"
ENQ   OCT 000005    ASCII "ENQ" 
ACK   OCT 000006    ASCII "ACK" 
DC1   OCT 000021    ASCII DEVICE CONTROL 1
S     OCT 000123    ASCII UPPER CASE "S"
* 
* 
      END #DUMP 
                                                                                                                                                                                                