File: DMPSI1.PA of Disk: Disks/Build-2007/Build-11-03-07
(Source file text) 

/SI43 DISK DUMP Program
/
/ This program will send a Disk image out the console port.
/ The format of the data sent is 0xff (0377) or 0xfd if read error
/ followed by 128 word  of data for each block.
/ After the last block a 0xfe (0376) is sent
/ with a two byte checksum, low 8 bits first then upper 4.
/ The words in a block are sent as three bytes for each 2 words.
/ Like this:
/   +--------------------+
/   ! byte1     ! byte2h !
/   +--------------------+
/   ! byte2l !  byte 3   !
/   +--------------------+
/
/   1 = low 8 bits first word
/   2 = upper 4 bits first and lower 4 bits second
/   3 = upper 8 bits second word
/
/ The program (PC) receiving the data should be started before this program
/
/ To run start at 0200.
/    SR 11 should be drive, only 0 and 1 supported without reassembling
/    SR 6-8 should be maximum memory field in computer, needs 8k minimum
/ The receiving program should be running first.
/ At normal exit hitting cont will restart the program
/
/ Should halt at finish (177) with number of recoverable errors in AC
/ The current block being read will be displayed in the AC
/ while running.
/
/ If a unrecoverable error occurs the program will halt with the error in
/ the AC.  Hit continue to dump more or comment out hlt.
/ The PC program will print out the bad location if an error occurs
/

        *100
RETRY,  7775            /RETRY UP TO 3 TIMES
NUMBLK, 6260            /TOTAL NUMBER OF BLOCKS ON DISK
BLKFLD, 17              /15 256 WORD BLOCKS PRESERVES OS8
                        /WRAPPING PAST END OF LAST FIELD DOESN'T WORK
ERRCN2, 0               /COUNTING ERRORS
RDSIZE, 0               /NUMBER BLOCKS PER READ
CBLOCK, 0               /CURRENT DECTAPE BLOCK TO XFER
BLOCK,  0               /USED BY ERROR ROUTINE
CHKSM,  0
READST, 0
LOC,    0
LEN,    0
BCNT,   0               /BLOCKS TO SEND TO PC
REASON, 0
TEMP,   0

C10,    10
C17,    17
C200,   200
C400,   400



        *176
MEMERR, RDF             /SIGNAL MEMORY ERROR!!!
FINISH, HLT             /NORMAL GOOD HALT OR SELERR
START,  CDF 0
        CAF
        CLA CLL OSR     /GET DRIVE
        AND (7          /8 UNITS
        TAD JMSI
        DCA DRVSEL
        DCA ERRCN2
        TAD BLKFLD
        DCA RDSIZE      /TOTAL NUMBER OF BLOCKS IN ONE GO = BATCH
        DCA CBLOCK      /START WITH BLOCK 0
        DCA CHKSM

DUMPLP, CLA
        TAD RDSIZE
        TAD CBLOCK      /(TOTAL - BATCH) - CURRENT
        CIA
        TAD NUMBLK      /MORE BLOCKS LEFT THAN BATCH?
        SMA             /NO, NUMBER OF BLOCKS LEFT
        CLA             /YES, ONLY BATCH SIZE
        TAD RDSIZE
        SNA             /ANY MORE BLOCKS?
        JMP DONE        /NO, DO FINISH STUFF
        BSW
        CLL RAL         /TO 128 PAGES
        TAD C10         /IN FIELD 1
        DCA ARGSZ       /TO NUMBER OF BLOCKS REQUEST
        TAD CBLOCK      /TO CURRENT BLOCK TO START WITH
        DCA ARGBK
        TAD DRVSEL
        JMS I DRVSEL
ARGSZ,  3610            /READ IN FIELD 1
        0               /FROM POS 0
ARGBK,  0
        JMP ERRRET      /SOME DUST ON THE DISK?
        TAD (377        /ALL BLOCKS GOOD
        DCA READST      /Send data, each block starts with FF
        CLA CLL         / then 2 12 bit words in 3 bytes
        DCA LOC         / ERRRET DUPLICATES SOME OF THIS
        TAD BLKFLD
        CIA
        DCA BCNT        /SET UP COUNTER OF NUMBER OF BLOCKS XFERRED
OUTBL1, JMS I (OUTBLK   /SEND A BLOCK
        ISZ CBLOCK      /NEXT BLOCK
        ISZ BCNT        /BATCH XFERRED?
        JMP OUTBL1      /NO
        TAD CBLOCK
        DCA BLOCK
        JMP DUMPLP      /GO READ NEXT BATCH

JMSI,   DK0
DRVSEL, DK0

DONE,   CLA             / Send FE and -checksum of all words
        TAD (376
        JMS I (PUN
        TAD CHKSM       / Send checksum in two bytes, low bits first
        CIA
        JMS I (PUN
        TAD CHKSM
        CIA
        RTR
        RTR
        RTR
        RTR
        AND C17
        JMS I (PUN
        TAD ERRCN2      / Leave AC with # of errors
        JMP FINISH

ERRRET, SZA
        JMP NOSEL
        CLA CMA
        JMP FINISH      /SELECT ERROR WITH AC = 7777
NOSEL,  DCA REASON      /ERROR CODE
        HLT             /SEND GOOD BLOCKS READ WITH GOOD BLOCK FLAG
        DCA LOC
        TAD CBLOCK
        CIA
        TAD BLOCK       /Get - number good blocks read
        CIA             /Last was bad
        SNA
        JMP FSTBAD      /First block is bad, no good to send
        DCA BCNT
        TAD (377
        DCA READST
OUTBL2, JMS I (OUTBLK   /Send good blocks
        ISZ CBLOCK
        ISZ BCNT
        JMP OUTBL2
FSTBAD, TAD REASON
        RAL
        SZA CLA         /WAS IT CHECKSUM ERROR?
        CLA CMA         /SEND 374 FOR CHECKSUM ERROR
        TAD (375        /NOW SEND BAD BLOCK (TIMING ERROR)
        DCA READST
        JMS I (OUTBLK
        ISZ CBLOCK
        ISZ ERRCN2
        CDF 0
        JMP DUMPLP      /And read from here on

        PAGE
OUTBLK, 0               /Send a block of data out serial port
        CLA
        CDF 10
        TAD C400
        DCA LEN         /COUNT FOR ONE BLOCK
        TAD READST      /Send good/bad flag
        JMS PUN
OUT,    CLA CLL
        TAD I LOC
        TAD CHKSM       / Keep checksum of all words sent
        DCA CHKSM
        TAD I LOC       / Send 2 words as 3 bytes
        CLL RTR         / WvdM: Left 8 Bits first
        RTR             / WvdM:
        JMS PUN
        CLA CLL
        TAD I LOC
        AND C17
        CLL RTL         / WvdM: Low 4 Bits to high byte 2
        RTL             / WvdM
        DCA TEMP
        ISZ LOC
        ISZ LEN         /END IF BUFFER?
        SKP             /NO
        JMP ENDBK       /YES
        TAD I LOC
        TAD CHKSM
        DCA CHKSM
        TAD I LOC
        CLL RTL
        RTL
        RAL             / New: High 4 bits to low byte 2
        AND C17         /
        TAD TEMP
        JMS PUN
        CLA CLL
        TAD I LOC
        JMS PUN
        ISZ LOC
        ISZ LEN
        JMP OUT
        JMP EXITBK
ENDBK,  TAD TEMP        /SEND LAST PART OF WORD
        JMS PUN
EXITBK, CDF 0
        JMP I OUTBLK

PUN,    0               / Send byte out serial port
        PLS             / Punch for testing with emulator
/       TLS2            / Send out console
        CLA CLL
        TAD CBLOCK
        PSF
/       TSF2            /Wait until character sent
        JMP .-1
        CLA
        JMP I PUN

        PAGE

/SYS.IND. M43 NONSYS HANDLER
/
/
/
/
/
/COPYRIGHT  (C)  1980   BY WVDMARK, ZURICH
/
/
/
/
/WVDM, ZURICH, 1-SEP-80
/
/
/OS/8 V3 NON-SYS HANDLER FOR MOD 43

/ORIGIN:/SYSTEM INDUSTRIES, INC.
        /535 DEL REY AVENUE
        /SUNNYVALE, CALIFORNIA  94086

/THIS HANDLER WILL SUPPORT TWO
/SERIES 43 DISK DRIVE ON PORT 0 & 1
/OF A 3040 DISK CONTROLLER
/RK(A-B)0 AND RK(A-B)2 RESIDE ON THE
/FIXED PLATTERS
/RK(A-B)1 AND RK(A-B)3 ARE ON THE
/REMOVABLE PLATTERS
/RAL 6/74
/WVDM 9/74
/NEW DATE: 1-SEP-80

                VERSION="N&77
DCODE=50                        /CONTROLLER DEVICE CODE

DSDD=10^DCODE+6001
DLCR=10^DCODE+6002
DCSR=10^DCODE+6004
DSDE=10^DCODE+6011
DLSR=10^DCODE+6012
DSRR=10^DCODE+6013
DLTR=10^DCODE+6014
DWCA=10^DCODE+6017

DOFF=146^40
UNIT0=0^10
UNIT1=1^10
PLATTER=1^2
FTEMP=DKTR1
DKERCT=DK0
DKWD1=DKNO
BSW=7002

DKE,    0               /DON'T MOVE!!!
DKHLP,  DLCR            /SET CONTROLLER BREAK FIELD
        DCSR            /CLEAR STATUS
        JMS DKTR1       /GET POINTER
DKTR1,  0               //ALSO USED AS TEMP BUFF
        TAD DKTR1
        TAD (DKWCT-DKTR1
        DWCA
        CLA CLL
        TAD (DLTR
        DCA DKIOU       /SET UP FOR READ
        TAD DKWD1
        SPA
        ISZ DKIOU       /CHANGE TO WRITE
        BSW
        AND (7000       /GET DATA BUFFER FIELD
        DCA FTEMP
DKST2,  HLT             /GET CONTROL TABLE ENTRY
        DCA DKWCT+3
        TAD DKWCT+3
        AND (10
        TAD FTEMP
        DLCR            /EMA + UNIT
        CLA CLL
        TAD DKWCT+2
        AND (17
        DLSR            /OUTPUT SECTOR ADDRESS
        CLL CLA
        TAD DKWCT+2
        AND MIN20
        TAD DKWCT+3
        RTR;RTR         /13 BIT WORD
DKIOU,  HLT             /OUTPUT TRACK ADDRESS AND PLATTER
        CLL CLA
        DSDD
        JMP .-1         /WAIT FOR DISK TO FINISH
DKTAD,  TAD DK7600
        KRS             /CHK. FOR ^C
        TAD (-7603
        SNA CLA
        KSF
        JMP DCTL1
DKCDI,  CIF CDF 0
        JMP I DK7600
DCTL1,  DSDE            /WAS THERE A DISK ERROR?
        JMP DKNORM      /NO, GO EXIT
        ISZ DKERCT
        JMP DKHLP
        CLL CML
        JMP DKERR       /AVOID EXIT FIXER
DKNO,  0
DKWCT,  0
        0
        0
        0

/THIS IS REAL ENTRY CHAIN


DK0,    VERSION
        ISZ DKNO
        ISZ DKNO
        ISZ DKNO
        ISZ DKNO
        ISZ DKNO
        ISZ DKNO
        ISZ DKNO

DK7600, 7600            /CLEAR AC
        TAD DKNO
        CMA
        TAD DKTAD
        DCA DKST1
        TAD DKST1
        TAD (DKOFFS-DK0
        DCA DKST2
        CLA CLL CML RTR /=2000+TAD=DCA
        TAD DKST1
        DCA DKOUT       /SET UP ENTRY RESTORE
DKST1,  HLT             /GET CALLER ADDRESS
        DCA DKE         /PUT IT IN A CANONICAL LOCATION
        RDF             /FIND OUT CALLER'S FIELD
        TAD DKCDI
        DCA DKFLD       /FIX UP EXIT FOR FIELD CHANGING
        TAD I DKE       /
        DCA DKWD1
        ISZ DKE
        TAD I DKE
        DCA DKWCT+1     /SAVE CORE ADDRESS
        ISZ DKE
        TAD I DKE       /BLK #
        DCA DKWCT+2     /PICK UP ALL THE ARGUMENTS
        ISZ DKE         /PARTIALLY FIX THE EXIT
/STILL MORE INITIALIZATION TO DO

        TAD DKWD1
        AND DK3700
        CLL RAL
        DCA DKWCT       /GENERATE WORD COUNT FOR DATA X-FER
        TAD MIN20       /THIS SEEMS QUITE LARGE
        DCA DKERCT      /FOR ERROR COUNT
        TAD DKWCT+2
        TAD LGLBLK      /CHECK FOR LAST LEGAL BLK
        SZL CLA
        JMP DKERR       /FATAL:LINK ON
        JMP DKHLP       /GO DO REAL WORK


DKNORM, CLA CLL
        ISZ DKE         /EXIT CONTROL - NORMAL EXIT
DKERR,  TAD (ISZ DKNO
DKOUT,  HLT             /RESET ENTRY ISZ
        DCA DKNO
        CLA RAR
DKFLD,  HLT             /CHANGE BACK TO CALLERS FIELD
        JMP I DKE       /EXIT

DK3700, 3700
MIN20,  -20
LGLBLK, -6260           /- LENGTH OF RK COMPATIBLE DISK

/EQUATION FOR DKOFFS IS:
/       TRACK OFFSET*40+PLATTER BIT*2+UNIT BIT*10
/       PLATTER BIT IS 1 FOR REMOVABLE PLATTER, 0 FOR FIXED
/       UNIT BIT IS 0 FOR UNIT 0, 1 FOR UNIT 1
/       \OOO\OOO\OHU\0P0\

DKOFFS, UNIT0                   /RKA0
        UNIT0+DOFF              /RKB0

        UNIT0+PLATTER           /RKA1
        UNIT0+PLATTER+DOFF      /RKB1

        UNIT1                   /RKA2
        UNIT1+DOFF              /RKB2

        UNIT1+PLATTER           /RKA3
        UNIT1+PLATTER+DOFF      /RKB3

        PAGE

        $$$$