home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol073 / dd6.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  26.1 KB  |  1,121 lines

  1. ;****************************************************************
  2. ;*                                *
  3. ;*            CP/M FILE DUMP UTILITY            *
  4. ;*             DUAL DENSITY VERSION            *
  5. ;*                                *
  6. ;****************************************************************
  7. ;
  8. ;    History :    Originally published through CPMUG as
  9. ;            version 1.2 by Sam SINGER
  10. ;            
  11. ;            Updated to version 1.3 through CPMUG
  12. ;            by Sam SINGER
  13. ;
  14. ;            Updated to version 1.4 by Dave Hatch
  15. ;            and published by GED
  16. ;
  17. ;    FEB 1,1980    Revised and extended to version 1.5
  18. ;            for double density with static density
  19. ;            allocation (two sector sizes) for CP/M
  20. ;            1.4 by Bill Bolton and published by 80AT
  21. ;
  22. ;    JULY 11,1980    Revised and extended to version 2.0
  23. ;            for double density with dynamic density
  24. ;            allocation (four sector sizes) for CP/M
  25. ;            2.2 by Bill Bolton and published by 80AT
  26. ;
  27. ;    JULY 23,1980    Minor bugs exterminated and version updated
  28. ;            to 2.1
  29. ;
  30. ;    AUGUST 26,1980    Sector translation for all disk operations
  31. ;            and reserved track offset in block dump
  32. ;            routine added, version updated to 2.2
  33. ;    OCT 23,1980    Bugs in the DIR and GRP2 routines which
  34. ;            showed up when tried on an Morrow HDCA-3
  35. ;            were eliminated. Conditional assembly for
  36. ;            hard disk added. Flag for sector display
  37. ;            header and track 0 added.
  38. ;
  39. ;    FEB 10, 1981    Macro library changed to MACRO3 and DJORG
  40. ;            equate added for easier DJ2D address change,
  41. ;            version updated to 2.3A
  42. ;    
  43. ;    FEB 11, 1981    Two sided status check changed to direct
  44. ;            check on 1791 controller as Model DJ2Ds
  45. ;            do not return a side bit in the disk status
  46. ;            firmware call. Version updated to 2.4
  47. ;
  48. ;    NOV 25, 1981    Modified for use with Godbout Disk 1 and
  49. ;            Morrow HDCA-3 controller, all track number
  50. ;            references changed to 16 bit values. Version
  51. ;            updated to 2.5
  52. ;
  53. ;            --- DDH ---
  54. ;
  55.     TITLE    'Disk 1 + HDCA-3 Disk Dump DDH Ver 2.5'
  56. ;
  57. TRUE    EQU    0FFH
  58. FALSE    EQU    0
  59. ;
  60. HARD    EQU    TRUE        ;TRUE FOR MORROW HARD DISK
  61. FIRST    EQU    TRUE        ;TRUE FOR MORROW HARD DISK A,B,C
  62.                 ; & FLOPPY DISKS D,E,F,G
  63.                 ; FALSE FOR FLOPPY DISKS A,B,C,D
  64.                 ; & MORROW HARD DISK E,F,G
  65. ;
  66. FCB    EQU    0005CH        ;CP/M FILE CONTROL BLOCK LOC.
  67. WBOOT    EQU    00000H        ;CP/M WARM BOOT ENTRY LOC.
  68. BDOS    EQU    00005H        ;CP/M BDOS ENTRY LOC.
  69. ST$OFFSET EQU    01EH        ;Offset to set track routine in BIOS
  70. ;
  71.     MACLIB    MACRO3        ;INCLUDE MACRO LIBRARY
  72. ;
  73.     ORG    100H        ;SET PROG START
  74. ;
  75. BEGIN:
  76.     LXI    H,0
  77.     DAD    SP        ;GET STACK POINTER
  78.     SHLD    OLDSTK
  79.     LXI    SP,NEWSTK    ;SET UP NEW STACK
  80.     DISKIO    ?DRIVE        ;GET CURRENTLY LOGGED DRIVE NO
  81.     STA    DRVNO        ;SAVE FOR EXIT
  82.     STA    NEWDRV        ;ALSO SAVE IN NEW DRIVE NO
  83.     MVI    C,12        ;FIRST, CHECK VERSION NUMBER
  84.     CALL    BDOS
  85.     MOV    A,L        ;A <--- VERSION NO.
  86.     CPI    20H        ;VERSION 2.0 OR LATER?
  87.     JC    VERSION$ERROR    ;NO, ERROR MESSAGE
  88.     CALL    DISKDATA    ;GET DISK PARAMETERS
  89.     LDA    81H        ;CONSOLE INPUT ALREADY HERE ?
  90.     ORA    A
  91.     JZ    SIGNON        ;BUFFER EMPTY, INPUT FROM CONSOLE
  92.     LDA    80H        ;GET NO OF CHAR INPUT
  93.     ORI    80H        ;ADD 128
  94.     MOV    L,A        ;TO L
  95.     XRA    A        ;ZERO
  96.     MOV    H,A        ;HL CONTAINS ADDR OF END OF BUFFER
  97. ZBFF:
  98.     INR    L
  99.     JZ    START        ;REMAINDER OF BUFFER ZEROED
  100.     MOV    M,A
  101.     JMP    ZBFF        ;LOOP
  102. SIGNON:
  103.     PRINT    <CR,LF,'CP/M Disk Dump Utility VERS 2.5',CR,LF,LF>
  104.     PRINT    <'Copyright (C) 1978 By Sam   Singer',CR,LF>
  105.     PRINT    <'Copyright (C) 1980 By Bill  Bolton',CR,LF,LF>
  106.     PRINT    <'For Godbout Disk 1 Controller',CR,LF>
  107.  
  108.     IF    HARD
  109.     PRINT    <'and Morrow HDCA-3 Hard Disk Controller',CR,LF>
  110.     ENDIF
  111.  
  112.     IF    HARD AND FIRST
  113.     PRINT    <'Hard Disk Logical Drives A,B,C',CR,LF>
  114.     PRINT    <'Floppy Drives D,E,F,G',CR,LF>
  115.     ELSE
  116.     PRINT    <'Floppy Drives A,B,C,D,',CR,LF>
  117.     ENDIF
  118.  
  119.     IF    HARD AND NOT FIRST
  120.     PRINT    <'Hard Disk Logical Drives E,F,G',CR,LF>
  121.     ENDIF
  122.  
  123. NEWIN:
  124.     PRINT    <CR,LF,'*'>
  125.     MVI    A,0FFH        ;SET SWITCH TO RETURN HERE AGAIN
  126.     STA    INFLAG
  127.     LXI    SP,NEWSTK    ;RESET STACK POINTER
  128.     LXI    H,0
  129.     SHLD    LINE        ;SET LINE COUNT TO ZERO
  130.     FILL    80H,0FFH    ;ZERO INPUT BUFFER
  131.     INPUT    80H        ;READ FILE NAME
  132. ;
  133. ;  SELECT DISK DRIVE AND SET UP FILE CONTROL BLOCK
  134. ;
  135. START:
  136.     FILL    FCB,FCB+32    ;ZERO FILE CONTROL BLOCK
  137.     MATCH    82H,'A:'    ;DRIVE A
  138.     JZ    ADISK
  139.     MATCH    82H,'B:'    ;DRIVE B
  140.     JZ    BDISK
  141.     MATCH    82H,'C:'    ;DRIVE C
  142.     JZ    CDISK
  143.     MATCH    82H,'D:'    ;DRIVE D
  144.     JZ    DDISK
  145.     MATCH    82H,'E:'    ;DRIVE E
  146.     JZ    EDISK
  147.     MATCH    82H,'F:'    ;DRIVE F
  148.     JZ    FDISK
  149.     MATCH    82H,'G:'    ;DRIVE G
  150.     JZ    GDISK 
  151.     JMP    GETNAM        ;NO DRIVE SPECIFIED
  152. ;
  153. ADISK:
  154.     XRA    A        ;SELECT DRIVE A
  155.     JMP    SETDRV
  156. ;
  157. BDISK:
  158.     MVI    A,1        ;SELECT DRIVE B
  159.     JMP    SETDRV
  160. ;
  161. CDISK:
  162.     MVI    A,2        ;SELECT DRIVE C
  163.     JMP    SETDRV
  164. ;
  165. DDISK:
  166.     MVI    A,3        ;SELECT DRIVE D
  167.     JMP    SETDRV
  168. ;
  169. EDISK:
  170.     MVI    A,4        ;SELECT DRIVE E
  171.     JMP    SETDRV
  172. ;
  173. FDISK:
  174.     MVI    A,5        ;SELECT DRIVE F
  175.     JMP    SETDRV
  176. ;
  177. GDISK:
  178.     MVI    A,6        ;SELECT DRIVE G
  179. SETDRV:
  180.     STA    NEWDRV        ;STORE THE SELECTED DRIVE
  181.     CALL    DISKDATA    ;GET DISK PARAMETERS
  182.     MOVE    82H,80H,40H    ;SHIFT BUFFER DOWN TWO BYTES
  183. ;
  184. ;  SEARCH FOR DIRECT READ OF TRACK AND SECTOR OR VALIDATE
  185. ;
  186. GETNAM:
  187.     INSTR    82H,40H,'GROUP'
  188.     JC    GROUP        ;DISPLAY CPM ALLOCATION GROUP
  189.     INSTR    82H,40H,'G '    ;SEARCH FOR 'G'
  190.     JC    GROUP        ;DISPLAY GROUP
  191.     INSTR    82H,40H,'MAP'    ;ALLOCATION MAP
  192.     JC    MAP        ;DISPLAY GROUP ALLOCATION MAP
  193.     INSTR    82H,40H,'DIR'    ;DIRECTORY REQUEST
  194.     JC    DIR        ;DISPLAY DIRECTORY
  195.     INSTR    82H,40H,'TRACK'    ;SEARCH FOR TRACK
  196.     JC    TRK1
  197.     INSTR    82H,40H,'T '    ;SEARCH FOR 'T'
  198.     JNC    FILNAM        ;NO TRACK GO TO READ FILE
  199. TRK1:
  200.     SCAN            ;FIND AND CONVERT NUMBER
  201.     DECIN
  202.     JC    INERR        ;INPUT ERROR ON CARRY
  203.     LXI    D,0
  204.     SHLD    TRACK        ;SAVE TRACK NO.
  205.     CPHL            ;TRACK 0?
  206.     JNZ    SECSCH        ;NO, CONTINUE
  207.     LDA    HARD$D        ;ON HARD DISK?
  208.     ORA    A
  209.     JNZ    SECSCH        ;YES, TRACK 0 SAME AS OTHERS
  210.     MVI    A,TRUE        ;NO, SET A FLAG
  211.     STA    TK0FLAG        ;  FOR TRACK 0
  212. SECSCH:
  213.     INSTR    82H,40H,'SECTOR';SEARCH FOR SECTOR
  214.     JC    SEC1
  215.     INSTR    82H,40H,'S '    ;TRY 'S'
  216.     JNC    WHLTRK        ;DUMP ENTIRE TRACK
  217. SEC1:
  218.     SCAN    
  219.     DECIN
  220.     JC    INERR        ;INPUT ERROR ON CARRY
  221.     SHLD    BSEC        ;BEGINNING SECTOR
  222.     SHLD    ESEC        ;SAVE IN END SECTOR ALSO
  223.     XCHG            ;SET BUFFER POINTER FOR SCAN
  224.     SHLD    IPOINT        ;SAVE BUFFER POINTER FOR EDIT
  225.     INSTR    ,40H,'-'    ;SEARCH FOR '-'
  226.     JNC    EDIT        ;CHECK FOR EDIT OF SECTOR
  227.     SCAN
  228.     DECIN            ;SCAN AND CONVERT ANOTHER NO
  229.     JC    INERR        ;ERROR IF CARRY SET
  230.     SHLD    ESEC        ;SAVE IN END SECTOR
  231.     PUSH    H
  232.     LHLD    BSEC
  233.     XCHG            ;DE <--- START SECTOR NO.
  234.     POP    H        ;HL <--- END SECTOR NO.
  235.     CPHL            ;COMPARE BEGIN AND END
  236.     JP    DOREAD        ;OK IF END>=BEGIN
  237.     SHLD    BSEC        ;OTHERWISE SWITCH THEM
  238.     XCHG            ;HL <--- NEW END SECTOR
  239.     SHLD    ESEC
  240. DOREAD:
  241.     CALL    RDISK        ;READ DIRECT
  242.     JMP    ENDFIL        ;BACK FOR MORE INPUT
  243. ;
  244. EDIT:
  245.     LHLD    IPOINT        ;RESET BUFFER POINTER
  246.     INSTR    ,40H,'EDIT'    ;CHECK EDIT FUNCTION
  247.     JNC    DOREAD        ;GO TO DISPLAY SECTOR
  248.     CALL    RDISK        ;DISPLAY SECTOR
  249. EDIT1:
  250.     PRINT    <CR,LF,'EDIT - '>
  251.     FILL    INBUF,INBUF+9
  252.     INPUT    INBUF,6        ;INPUT MAXIMUM 6 CHAR
  253.     INSTR    INBUF,8,'WRITE'    ;WRITE EDITED SECTOR ON DISK?
  254.     JC    WRTDSK        ;WRITE BUFFER BACK ON DISK
  255.     INSTR    INBUF,8,'STOP'    ;STOP EDITING WITHOUT WRITING?
  256.     JC    ENDFIL        ;EXIT
  257.     HEXIN    INBUF+2        ;CONV ASCII TO HEX
  258.     JNC    CKLIM        ;IF NO ERROR, CHECK ADDR
  259.     LDAX    D        ;GET ASCII CHAR
  260.     CPI    '.'        ;CHECK FOR EXIT CHAR
  261.     JZ    EDIT3        ;BACK FOR MORE EDITING
  262.     JMP    ADERR        ;ADDRESS ERROR
  263. CKLIM:
  264.     LXI    D,0080H        ;CHECK ADDR LIMIT
  265.     CPHL
  266.     JP    ADERR        ;ADDRESS ERROR
  267.     SHLD    IPOINT        ;SAVE ADDRESS
  268.     PRINT    CRLF,$
  269. PTX:
  270.     HEXOUT    IPOINT+1
  271.     HEXOUT    IPOINT        ;ECHO THE ADDRESS
  272.     PRINT    SPACE,$
  273.     LHLD    IPOINT        ;ECHO PRESENT CONTENTS
  274.     LXI    D,080H
  275.     DAD    D        ;COMPUTE MEMORY ADDR
  276.     MOV    A,M        ;GET BYTE FROM MEMORY
  277.     HEXOUT
  278.     PRINT    SPACE,$
  279.     FILL    INBUF,INBUF+5    ;ZERO INPUT BUFFER
  280.     INPUT    INBUF,4        ;INPUT 4 CHAR MAX
  281.     HEXIN    INBUF+2        ;CONVERT
  282.     JNC    EDIT2        ;HEX CHAR
  283.     LDAX    D        ;GET ASCII CHAR
  284.     CPI    '.'        ;PERIOD ENDS INPUT
  285.     JZ    EDIT3        ;BACK FOR MORE EDITING
  286.     JMP    HEXERR        ;ERROR NOT HEX CHAR
  287. EDIT2:
  288.     LDA    INBUF+1        ;LOAD NO OF CHAR TYPED
  289.     ORA    A
  290.     JZ    EDITX        ;NO REPLACEMENT IF JUST CR
  291.     MOV    A,L        ;CONVERTED CHAR BACK TO A
  292.     LHLD    IPOINT        ;LOAD MEMORY BUFFER POINTER
  293.     LXI    D,080H        ;OFFSET
  294.     DAD    D        ;CALC MEMORY ADDR
  295.     MOV    M,A        ;STORE NEW INPUT TO MEMORY
  296. EDITX:
  297.     PRINT    CRLF,$
  298.     LDA    IPOINT        ;LEAST SIGNIFICANT HALF OF ADDR
  299.     INR    A        ;INCR BY ONE
  300.     ANI    7FH        ;COUNT MOD 128
  301.     STA    IPOINT
  302.     JMP    PTX        ;INPUT MORE DATA
  303. EDIT3:
  304.     LXI    H,0
  305.     SHLD    LINE        ;RESET LINE NO TO ZERO
  306.     CALL    PRTSEC        ;PRINT BUFFER WITH HEADING
  307.     JMP    EDIT1        ;BACK FOR ADDITIONAL EDITING
  308. ;
  309. WRTDSK:
  310.     LDA    TK0FLAG        ;ON TRACK 0 ?
  311.     ORA    A
  312. ;    JNZ    WRITE$0        ;YES, NEEDS SPECIAL TREATMENT
  313.     CALLBIOS DWRITE        ;WRITE BUFFER BACK ON DISK
  314.     JMP    ENDFIL        ;EXIT
  315. ;
  316. WRITE$0:
  317.     JMP    ENDFIL
  318. ;
  319. ;  READ TRACK AND SECTOR DIRECT
  320. ;
  321. RDISK:
  322.     CALL    SETUP
  323. RDISK1:
  324.     LDED    BSEC        ;GET NEXT SECTOR TO READ
  325.     LDA    HARD$D        
  326.     ORA    A        ;HARD DISK?
  327.     JNZ    RDISK2        ;TRACK 0 SAME AS OTHERS
  328.     LDA    TK0$FLAG
  329.     ORA    A        ;TRACK 0 NEEDS SPECIAL TREATMENT
  330.     JNZ    READ$0
  331. RDISK2:
  332.     LHLD    SPT        ;GET SECTORS/TRACK FROM DPB
  333.     SHLD    SPT$ERR
  334.     CPHL            ;SECTOR NO. > SPT?
  335.     JC    GO$ON        ;YES, ERROR
  336.     MOV    A,D
  337.     ORA    E        ;SECTOR 0?
  338.     JZ    BADSEC        ;YES, NOT ALLOWED
  339.     LHLD    BSEC        ;NO, GET SECTOR NO.
  340.     DCR    L        ;ADJUST FOR SECTRAN
  341.     PUSH    H
  342.     POP    B        ;BC <--- SECTOR NUMBER
  343.     LHLD    XLT        ;GET SECTOR TABLE ADDRESS
  344. RDISK3:
  345.     XCHG            ;PUT INTO DE
  346.     CALLBIOS DSECTRAN    ;GET THE PHYSICAL SECTOR
  347.     ORA    A        ;RESET CARRY
  348.     PUSH    H
  349.     POP    B        ;BC <--- SECTOR TO READ
  350.     CALLBIOS DSETSEC
  351. GO$ON:
  352.     JC    BADSEC        ;WRONG SECTOR NO
  353. TRK2:
  354.     LHLD    TRACK        ;GET TRACK NO.
  355.     PUSH    H
  356.     POP    B
  357.     LXI    H,TRK$RET
  358.     PUSH    H        ;RETURN ADDRESS ONTO STACK
  359.     LHLD    WBOOT+1
  360.     MVI    L,ST$OFFSET
  361.     PCHL            ;WERE OFF TO SEE THE WIZARD
  362. TRK$RET:
  363.     JC    BADTRK        ;WRONG TRACK NO
  364.     CALLBIOS DREAD        ;READ TRACK AND SECTOR
  365.     JMP    PRTSEC
  366. ;
  367. READ$0:
  368.     LXI    H,26    ;SINGLE DENSITY SECTORS PER TRACK
  369.     SHLD    SPT$ERR
  370.     CPHL        ;SECTOR NO. TOO BIG?
  371.     JC    GO$ON    ;YES, ERROR
  372.     MOV    A,D
  373.     ORA    E    ;SECTOR 0?
  374.     JZ    BADSEC    ;YES, NOT ALLOWED
  375.     LHLD    BSEC    ;NO, GET SECTOR NUMBER
  376.     DCR    L
  377.     PUSH    H
  378.     POP    B    ;BC <--- SECTOR NUMBER
  379.     LXI    H,XLT$SD ;TRANSLATE TABLE
  380.     JMP    RDISK3
  381. ;
  382. ;  PRINT DRIVE, TRACK AND SECTOR HEADING
  383. ;
  384. PRTSEC:
  385.     LDA    NEWDRV        ;NEW DRIVE NO
  386.     ADI    41H        ;ADD ASCII OFFSET
  387.     PUSH    PSW
  388.     PRINT    <CR,LF,'      Drive '>
  389.     POP    PSW
  390.     MOV    E,A
  391.     MVI    C,2
  392.     CALL    BDOS
  393.     PRINT    HEADER,$
  394.     PRINT    '- Track '
  395.     LHLD    TRACK
  396.     DECOUT
  397.     PRINT    '  Logical Sector '
  398.     LXI    H,0
  399.     LHLD    BSEC
  400.     DECOUT
  401.     PRINT    '  Dump Count '
  402.     LHLD    DCOUNT
  403.     INX    H
  404.     SHLD    DCOUNT
  405.     DECOUT
  406.     PRINT    CRLF,$
  407.     PRINT    CRLF,$
  408.     CALL    PRTBUF        ;PRINT IT
  409.     LDA    LINE+1        ;GET HI BYTE OF HEX ADDRESS
  410.     ORA    A        ;IF NOT 0
  411.     JNZ    SECOMP        ;DONT ZERO LINE COUNT
  412.     LXI    H,0
  413.     SHLD    LINE        ;RESET HEX ADDRESS COUNT
  414. SECOMP:
  415.     LHLD    ESEC        ;END SECTOR NUMBER
  416.     XCHG            ;DE <--- END SECTOR
  417.     LHLD    BSEC        ;SECTOR JUST READ
  418.     CPHL            ;COMPARE THEM
  419.     RZ            ;EXIT IF THEY ARE EQUAL
  420.     INX    H        ;BUMP TO NEXT SECTOR
  421.     SHLD    BSEC
  422.     JMP    RDISK1
  423. ;
  424. ;  DUMP ENTIRE TRACK IF NO SECTOR INPUT
  425. ;
  426. WHLTRK:
  427.     LXI    H,1        ;BEGIN SECTOR
  428.     SHLD    BSEC        ;SAVE IT FOR THIS DUMP
  429.     LDA    TK0FLAG
  430.     ORA    A        ;ON FLOPPY TRACK 0?
  431.     LXI    H,26        ;FLOPPY TRACK 0 ALWAYS HAS 26 SECTORS
  432.     JNZ    ENDSEC        ;YES, SAVE IT IMMEDIATELY
  433.     LHLD    SPT        ;NO, HIGHEST SECTOR NO. FROM DPB
  434. ENDSEC:
  435.     SHLD    ESEC        ;SAVE IT FOR THIS DUMP
  436.     JMP    DOREAD        ;GO READ IT
  437. ;
  438. ;  FILL IN FCB FOR NAMED FILE
  439. ;
  440. FILNAM:
  441.     MVI    A,TRUE
  442.     STA    FDFLAG        ;SET FILE DUMP FLAG
  443.     FILFCB    FCB,82H        ;FILL IN FCB NAME FROM INPUT BUFFER
  444.     JC    NAMERR        ;ERROR IN FILE NAME
  445.     MATCH    FCB+9,'COM'    ;TEST FOR COM FILE
  446.     JNZ    SELDR
  447.     LXI    H,100H    
  448.     SHLD    LINE        ;SET LINE NO. TO 100
  449. SELDR:
  450.     LDA    NEWDRV        ;SELECT NEW DRIVE
  451.     MOV    E,A
  452.     DISKIO    LOGIN
  453. FILSER:
  454.     DISKIO    SEARCH,FCB    ;LOOK FOR FILE
  455.     ORA    A        ;FOUND IT?
  456.     PUSH    PSW        ;SAVE BDOS RETURN INFO
  457.     LDA    EXFLAG        ;GET EXTENT COUNT
  458.     ORA    A        ;1ST EXTENT?
  459.     JZ    ERR1        ;YES, CHECK FOR FILE NOT FOUND
  460.     POP    PSW        ;RESTORE BDOS RETURN INFO
  461.     JM    ENDFIL        ;IF NOT FOUND, BACK FOR MORE INPUT
  462.     JMP    RDFILE        ;        
  463. ;
  464. ERR1:
  465.     POP    PSW        ;RESTORE BDOS RETURN INFO
  466.     JM    OPNERR        ;IF NOT FOUND, TELL THE USER
  467. RDFILE:
  468.     RRC
  469.     RRC
  470.     RRC            ;SAME AS 5 'ADD A' INSTRUCTIONS
  471.     ANI    60H        ;MASK THE BITS OF INTEREST
  472.     ADI    80H        ;ADD BASE ADDRESS OF BUFFER
  473.     ADI    0CH        ;ADD OFFSET TO EXTENT NO.
  474.     PUSH    PSW
  475.     FILL    DIRBUF,DIRBUF+21,00    ;INITIALISE BUFFER
  476.     POP    PSW
  477.     MOV    L,A
  478.     MVI    H,0        ;SET UP SOURCE ADDRESS
  479.     LXI    D,DIRBUF    ;SET UP DESTINATION ADDRESS
  480.     MVI    C,20        ;SET UP COUNT
  481.     MVI    B,0        ;DITTO
  482.     MOVE            ;DO THE MOVE
  483.     LXI    H,RCOUNT    ;POINT TO RECORD COUNT
  484.     MOV    A,M        ;GET RECORD COUNT
  485.     CPI    128        ;POSSIBLY ANOTHER EXTENT?
  486.     JNZ    NOEXT        ;NO, DUMP THE GROUPS
  487.     LDA    EXFLAG        ;YES, GET EXTENT COUNT
  488.     INR    A        ;ADD 1 TO IT
  489.     STA    EXFLAG        ;SAVE IT
  490. NOEXT:
  491.     PUSH    H        ;TEMP SAVE H
  492.     LHLD    DSM        ;GET DSM VALUE
  493.     LXI    D,0FF00H    ;SET NO. BYTES / GROUP
  494.     DAD    D        ;IF > 255 THEN TWO BYTES
  495.     POP    H
  496.     JC    TWO$BYTE
  497. ONE$BYTE:
  498.     INX    H        ;BUMP TO NEXT GROUP NO.
  499.     PUSH    H
  500.     MOV    A,M        ;GET THE NEXT GROUP NO.
  501.     CPI    00        ;DONE LAST GROUP?
  502.     JZ    QUIT        ;YES, CHECK FOR MORE EXTENTS
  503.     MVI    H,0
  504.     MOV    L,A        ;GROUP NO. IN HL
  505.     CALL    GROUPS        ;DISPLAY THE SECTORS
  506.     POP    H
  507.     JMP    ONE$BYTE
  508. ;
  509. TWO$BYTE:
  510.     MVI    A,8        ;GROUP POSITIONS/DIR ENTRY 
  511.     STA    P$COUNT
  512. LOOP2:
  513.     INX    H        ;POINT TO NEXT GROUP NO.
  514.     MOV    A,M        ;GET LOW BYTE
  515.     INX    H
  516.     PUSH    H        ;SAVE POINTER
  517.     MOV    H,M        ;GET HI BYTE
  518.     MOV    L,A        ;FORM GROUP NUMBER
  519.     DJZ    QUIT        ;QUIT IF EMPTY GROUP POSITION
  520.     CALL    GROUPS        ;DISPLAY THE SECTORS
  521.     LDA    P$COUNT        ;CHECK IF LAST GROUP NO.
  522.     DCR    A
  523.     JZ    QUIT        ;YES, CHECK FOR NEXT EXTENT
  524.     STA    P$COUNT        ;SAVE FOR NEXT LOOP CHECK
  525.     POP    H
  526.     JMP    LOOP2
  527. ;
  528. QUIT:
  529.     POP    H        ;KEEP STACK CLEAN
  530.     XRA    A
  531.     STA    SCOUNT        ;RESET SECTOR COUNT
  532.     LXI    H,FCB+12    ;POINT TO EXTENT NO. IN FCB
  533.     LDA    EXFLAG        ;GET NEXT EXTENT NO.
  534.     CMP    M        ;ARE THEY EQUAL
  535.     JZ    ENDFIL        ;YES, NO MORE EXTENTS SO EXIT
  536.     MOV    M,A        ;NO, STUFF NEXT EXTENT NUMBER
  537.     JMP    FILSER        ;LOOK FOR NEXT EXTENT
  538. ;    
  539. ENDFIL:
  540.     XRA    A
  541.     STA    TK0FLAG        ;RESET TRACK 0 FLAG
  542.     STA    EXFLAG        ;RESET EXTENT COUNT
  543.     STA    FDFLAG        ;RESET FILE DUMP FLAG
  544.     STA    SCOUNT        ;RESET SECTORS DONE COUNT
  545.     STA    DCOUNT        ;RESET DUMP COUNT LOW BYTE
  546.     STA    DCOUNT+1    ;  "    "     "   HI  BYTE
  547.     LDA    INFLAG        ;SEE WHERE TO GO
  548.     ORA    A
  549.     JZ    MONITOR
  550.     JMP    NEWIN
  551. ;
  552. ;
  553. ;  PRTBUF - PRINT BUFFER IN HEX AND ASCII
  554. ;
  555. PRTBUF:
  556.     MVI    B,8        ;8 LINES
  557.     LXI    H,080H        ;INITIAL BUFFER POINTER
  558.     SHLD    IPOINT        ;STORAGE FOR POINTER
  559. BPRN:
  560.     LHLD    IPOINT        ;LOAD POINTER
  561.     MVI    C,16        ;CHAR PER LINE
  562.     SAVE    B,H        ;PROTECT B,H DURING PRINT CALLS
  563.     LDA    LINE+1        ;GET HIGH BYTE OF HEX ADDR
  564.     ORA    A        ;IS IT 00?
  565.     JZ    SIMPLE        ;YES, PAD 1ST TWO POSITIONS
  566.     HEXOUT    LINE+1        ;PRINT HIGH BYTE OF HEX ADDR
  567.     JMP    LOWBYT
  568. SIMPLE:
  569.     PRINT    '  '        ;PRINT SPACES INSTEAD OF,
  570. LOWBYT:
  571.     HEXOUT    LINE        ;PRINT LOW BYTE OF ADDRESS
  572.     PRINT    ' : '
  573.     RESTORE    H,B
  574. PLOOP:
  575.     MOV    A,M        ;GET A BYTE
  576.     SAVE    B,H
  577.     HEXOUT
  578.     PRINT    SPACE,$
  579.     RESTORE    H,B
  580.     INX    H        ;INCR MEMORY POINTER
  581.     DCR    C        ;DECR CHARACTER COUNT
  582.     JZ    SKIP        ;DONE 16 YET?
  583.     MOV    A,C        ;NO, SO CONTINUE
  584.     ANI    3        ;TIME FOR SPACE MARKER?
  585.     JNZ    PLOOP        ;NO, PRINT SOME MORE
  586.     SAVE    B,H
  587.     PRINT    SPACE,$        ;YES, PRINT SPACE MARKER
  588.     RESTORE    H,B
  589.     JMP    PLOOP        ;PRINT SOME MORE
  590. SKIP:
  591.     SAVE    B
  592.     PRINT    SPACE,$
  593.     RESTORE    B
  594.     LHLD    IPOINT        ;RESET POINTER FOR ASCII
  595.     MVI    C,10H        ;RESET CHAR COUNT
  596. PLOOP1:
  597.     MOV    A,M        ;GET A BYTE
  598.     ANI    7FH        ;MASK OFF HIGH BIT
  599.     CPI    7FH        ;DELETE CODE
  600.     JZ    PERIOD        ;PRINT PERIOD FOR DELETE
  601.     CPI    20H        ;TEST FOR CONTROL CHAR
  602.     JP    SKIPX        ;SKIP SUBSTITUTION
  603. PERIOD:
  604.     MVI    A,2EH        ;ASCII PERIOD
  605. SKIPX:
  606.     SAVE    B,H
  607.     CHAROUT            ;PRINT IT SAVE REGS
  608.     RESTORE    H,B
  609.     INX    H        ;INCR MEMORY POINTER
  610.     MOV    A,C
  611.     CPI    9        ;CHECK 8 CHAR
  612.     JNZ    DECC2
  613.     SAVE    B,H
  614.     PRINT    SPACE,$
  615.     RESTORE    H,B
  616. DECC2:
  617.     DCR    C        ;DECR CHAR COUNT
  618.     JNZ    PLOOP1        ;PRINT SOME MORE
  619.     SAVE    B
  620.     PRINT    CRLF,$        ;CARRIAGE RETURN
  621.     CALL    PRNCON        ;PRINT CONTROL?
  622.     POP    B
  623.     INDEX    LINE,16        ;INCR LINE NO BY 16
  624.     DCR    B        ;DECR    LINE COUNT
  625.     RZ            ;RETURN IF LINE COUNT ZERO
  626.     INDEX    IPOINT,16    ;INCR POINTER BY 16
  627.     JMP    BPRN        ;LOOP BACK
  628. ;
  629. ;  PRINT CONTROL AND ESCAPE
  630. ;
  631. PRNCON:
  632.     MVI    C,11
  633.     CALL    5
  634.     ANI    1
  635.     RZ            ;RETURN
  636.     CHARIN            ;READ CONSOLE
  637.     CPI    3        ;TEST FOR CONTROL C
  638.     JZ    ENDFIL        ;EXIT IF CONTROL C
  639.     CPI    ' '        ;TEST FOR SPACE
  640.     JZ    ENDFIL        ;ABORT FUNCTION
  641.     RET
  642. ;
  643. ;    THIS SECTION DISPLAYS A CPM ALLOCATION GROUP
  644. ;
  645. GROUP:
  646.     SCAN            ;GET THE GROUP NO
  647.     DECIN            ;CONVERT TO BINARY
  648.     JC    INERR        ;INPUT ERROR IF CARRY SET
  649.     CALL    GROUPS        ;DO THIS GROUP
  650.     JMP    ENDFIL        ;EXIT
  651. ;
  652. GROUPS:
  653.     SHLD    G        ;SAVE GROUP NO
  654.     XCHG            ;DE <--- GROUP NO.
  655.     LHLD    DSM        ;GET MAX GROUP NO.
  656.     CPHL            ;GROUP NO. TOO BIG?
  657.     JC    BADGRP        ;YES, ERROR MESSAGE
  658.     LXI    H,0        ;NO
  659.     SHLD    S        ;SET SECTOR COUNT TO 0
  660. GRP1:
  661.     CALL    GRPTS        ;CONVERT TO TRACK AND SECTOR
  662.     LHLD    TRACK        ;GET LAST TRACK ACCESSED
  663.     LDED    NEW$TRACK    ;GET NEXT TRACK TO ACCESS
  664.     CPHL            ;SAME TRACK ?
  665.     XCHG
  666.     SHLD    TRACK        ;STORE TRACK NO.
  667.     CNZ    SETUP        ;NO, SET UP THE DRIVE
  668.     CALL    RDISK1        ;PRINT THE SECTOR
  669.     LDA    FDFLAG        ;FILE DUMP IN PROGRESS?
  670.     ORA    A
  671.     JZ    GRP2        ;NO, CONTINUE
  672.     LDA    SCOUNT        ;GET SECTORS DONE COUNT
  673.     INR    A
  674.     STA    SCOUNT        ;SAVE IT AGAIN
  675.     LXI    H,RCOUNT
  676.     CMP    M        ;HAVE WE DONE ALL THE SECTORS
  677.     RZ            ;YES, RETURN
  678. GRP2:
  679.     LXI    H,BLM        ;POINT TO (SECTORS/BLOCK)-1
  680.     MOV    L,M        ;GET (SECTORS/BLOCK)-1
  681.     MVI    H,0
  682.     XCHG            ;DE <---      "      "
  683.     LHLD    S        ;GET SECTOR COUNT
  684.     CPHL            ;DONE LAST SECTOR IN BLOCK?
  685.     RZ            ;YES
  686.     INX    H        ;NO, BUMP SECTOR COUNT
  687.     SHLD    S        ;SAVE IT
  688.     JMP    GRP1        ;PRINT ANOTHER SECTOR
  689. ;
  690. ;   GRPTS  CONVERT CPM GROUP AND SECTOR NUMBER TO TRK AND SEC
  691. ;
  692. GRPTS:
  693.     LHLD    SPT
  694.     XCHG            ;DE <--- SECTORS/TRACK
  695.     LXI    H,0
  696.     DSUB            ;FORM DIVISOR
  697.     SHLD    DIVISOR        ;SAVE IT
  698.     LHLD    G        ;GET GROUP NO.
  699.     LDA    BSH        ;GET BLOCK SHIFT FACTOR
  700. SHIFT$LOOP:
  701.     DAD    H        ;SHIFT LEFT ONE
  702.     DCR    A        ;ENOUGH SHIFTS ?
  703.     JNZ    SHIFT$LOOP    ;NO DO IT AGAIN
  704.     PUSH    H        ;TEMP SAVE HL
  705.     LHLD    S        ;GET SECTOR NO.
  706.     XCHG            ;DE <--- "   "
  707.     POP    H
  708.     DAD    D        ;HL NOW HAS G*(BLOCK SIZE)+S
  709.     PUSH    H        ;TEMP SAVE HL
  710.     LHLD    DIVISOR
  711.     XCHG            ;DE <--- DIVISOR
  712.     LHLD    OFF        ;GET NO. OF RESERVED TRACKS
  713.     PUSH    H
  714.     POP    B        ;BC <--- NO. OF RESERVED TRACKS
  715.     POP    H        ;HL <--- DIVIDEND
  716.     DCX    B        ;ADJUST FOR LOOP ENTRY
  717. DIVIDE:
  718.     DAD    D        ;SUBTRACT DIVISOR
  719.     INX    B        ;ADJUST TRACK NO.
  720.     JC    DIVIDE        ;LOOP TILL MINUS
  721.     PUSH    H
  722.     PUSH    B
  723.     POP    H
  724.     SHLD    NEW$TRACK    ;STORE TRACK NO.
  725.     LHLD    SPT        ;INDEX INTO TABLE
  726.     XCHG            ;DE <--- INDEX
  727.     POP    H
  728. STORE:
  729.     DAD    D        ;FORM LOGICAL SECTOR NUMBER
  730.     INR    L        ;ADJUST FOR SECTRAN LATER
  731.     SHLD    BSEC        ;SAVE IN BEGINNING SECTOR
  732.     SHLD    ESEC        ;SAVE IN END SECTOR TOO
  733.     RET
  734. ;
  735. ;    THIS ROUTINE DISPLAYS THE DISK SECTOR ALLOCATION MAP
  736. ;
  737. MAP:
  738.     LDA    NEWDRV
  739.     MOV    E,A
  740.     DISKIO    LOGIN        ;LOG IN SELECTED DRIVE
  741.     DISKIO    ?ALLOC        ;GET POINTER TO ALLOCATION MAP
  742.     MOV    H,B
  743.     MOV    L,A        ;HL <--- POINTER TO MAP
  744.     SHLD    IPOINT        ;SAVE IT
  745.     LXI    H,0
  746.     SHLD    G        ;ZERO COUNT OF UNUSED GROUPS
  747.     PRINT    <CR,LF,LF,'                          '>
  748.     PRINT    <'GROUP ALLOCATION MAP - DRIVE '>
  749.     LDA    NEWDRV        ;NEW DRIVE NO
  750.     ADI    41H        ;ADD ASCII OFFSET
  751.     MOV    E,A
  752.     MVI    C,2
  753.     CALL    BDOS
  754.     PRINT    <CR,LF,LF>
  755.     XRA    A
  756.     LHLD    DSM        ;GET NO. BLOCKS (GROUPS)
  757.     INX    H
  758.     SHLD    MAP$COUNT    ;SAVE FOR BLOCKS+1
  759.     LXI    D,-48        ;48 BITS MAPPED/LINE
  760. MAP1:
  761.     DAD    D        ;SUBTRACT A LINE
  762.     INR    A        ;BUMP LINE COUNT
  763.     JC    MAP1
  764.     MOV    D,A        ;D <--- NO. LINE TO DISPLAY
  765.     LHLD    IPOINT        ;POINTER TO DISK ALLOCATION MAP
  766. MAP2:
  767.     MVI    C,6        ;WORDS PER LINE
  768. MAPX:
  769.     SAVE
  770.     PRINT    '                '
  771.     RESTORE
  772. MAP3:
  773.     MVI    B,8        ;BITS PER WORD
  774.     MOV    A,M        ;GET A BYTE FROM ALLOC MAP
  775. MAP4:
  776.     RAL            ;SHIFT LEFT THRU CARRY
  777.     SAVE    B,D,H,PSW
  778.     JC    MAP5        ;PRINT A ONE
  779.     PRINT    '0'        ;PRINT A ZERO
  780.     LHLD    G        ;UNUSED GROUPS
  781.     INX    H        ;ADD 1
  782.     SHLD    G        ;STORE IT BACK
  783.     JMP    MAP6
  784. MAP5:
  785.     PRINT    '1'        ;PRINT A ONE
  786. MAP6:
  787.     RESTORE    PSW,H,D,B
  788.     SAVE    PSW,H        ;SAVE BIT MAP BYTE
  789.     LHLD    MAP$COUNT    ;GET BYTES REMAINING
  790.     DCX    H        
  791.     SHLD    MAP$COUNT    ;SAVE NEW BYTES LEFT
  792.     DJZ    FINISHED    ;QUIT IF DONE
  793.     MOV    A,B        ;BIT COUNT
  794.     CPI    1        ;LAST BIT OF BYTE?
  795.     JZ    BITS        ;YES
  796.     DCR    B
  797.     RESTORE H,PSW
  798.     JMP    MAP4
  799. ;
  800. BITS:
  801.     RESTORE H
  802.     MOV    A,C        ;GET WORD COUNT
  803.     CPI    1        ;LAST WORD OF LINE?
  804.     JZ    NEW$LINE    ;YES
  805.     DCR    C        ;ADJUST WORD COUNT
  806.     INX    H        ;BUMP POINTER TO NEXT BYTE        
  807.     RESTORE PSW
  808.     JMP    MAP3
  809. ;
  810. NEW$LINE:
  811.     INX    H        ;BUMP BYTE POINTER
  812.     SAVE    
  813.     PRINT    CRLF,$        ;NEXT LINE ON SCREEN
  814.     RESTORE 
  815.     RESTORE PSW
  816.     JMP    MAP2
  817. ;
  818. FINISHED:
  819.     RESTORE PSW
  820.     PRINT    <CR,LF,LF,'                      '>
  821.     DECOUT    G        ;PRINT NO OF UNUSED BLOCKS/GROUPS
  822.     PRINT    <' GROUPS REMAINING ON DISK OUT OF '>
  823.     DECOUT    DSM        ;PRINT MAX NUMBER OF BLOCKS/GROUPS
  824.     PRINT    <CR,LF>
  825.     JMP    ENDFIL        ;EXIT
  826. ;
  827. ;    THIS ROUTINE DUMPS THE DIRECTORY GROUPS
  828. ;
  829. DIR:
  830.     LXI    D,0FFFFH    ;SET UP DE
  831.     LDA    AL0        ;GET FIRST DIR ALLOC MAP
  832. DIR$TEST:
  833.     RAL            ;IS BIT SET?
  834.     JNC    DIR$DUMP2    ;NO, DUMP THE DIRECTORY
  835.     INX    D        ;YES, BUMP BLOCK COUNT
  836.     PUSH    PSW
  837.     MVI    A,8        ;NO. OF BITS IN A BYTE
  838.     CMP    E        ;DONE 8 BITS?
  839.     JZ    NEXT$BYTE    ;YES, TTEST AL1
  840.     MVI    A,16        ;MAX NO. OF BITS
  841.     CMP    E        ;DONE 16 BITS?
  842.     JZ    DIR$DUMP1    ;YES, DUMP DIRECTORY    
  843.     POP    PSW 
  844.     JMP    DIR$TEST    ;TEST NEXT BIT
  845. ;
  846. NEXT$BYTE:
  847.     POP    PSW        ;KEEP STACK STRAIGHT
  848.     LDA    AL1        ;GET AL1
  849.     JMP    DIR$TEST    ;GO TEST IT
  850. ;
  851. DIR$DUMP1:
  852.     POP    PSW        ;KEEP STACK STRAIGHT
  853. DIR$DUMP2:
  854.     LXI    H,0        ;START WITH GROUP 0
  855. DIR$LOOP:
  856.     SAVE    H,D
  857.     CALL    GROUPS        ;DO THE DUMP
  858.     RESTORE D,H
  859.     CPHL            ;DONE ALL THE DIR GROUPS?
  860.     INX    H        ;BUMP GROUP NO.
  861.     JNZ    DIR$LOOP    ;YES, NO DO IT AGAIN
  862.     JMP    ENDFIL        ;EXIT
  863. ;
  864. SETUP:
  865.     LDA    NEWDRV
  866.     MOV    E,A
  867.     DISKIO    LOGIN        ;SELECT NEW DRIVE (IF REQUESTED)
  868.     CALLBIOS DHOME        ;HOME SELECTED DRIVE
  869.     RET
  870. ;
  871. ;    FIND THE SECTOR SIZE AND NUMBER OF SIDES OF THE MEDIA
  872. ;
  873. DISKDATA:
  874.     CALL    SETUP        ;LOG DRIVE INTO BDOS
  875.     LDA    NEWDRV        ;GET DRIVE NO.
  876.  
  877.     IF    HARD AND FIRST
  878.     CPI    3        ;HARD DISK?
  879.     JNC    FLOPPY        ;NO
  880.     MVI    A,TRUE        ;SET A FLAG
  881.     STA    HARD$D
  882.     JMP    NEXT
  883.     ENDIF
  884.  
  885.     IF    HARD AND NOT FIRST
  886.     CPI    2        ;HARD DISK?
  887.     JC    FLOPPY        ;NO
  888.     MVI    A,TRUE        ;SET A FLAG
  889.     STA    HARD$D
  890.     JMP    NEXT
  891.     ENDIF
  892.     
  893. FLOPPY:
  894.     XRA    A
  895.     STA    HARD$D    
  896. NEXT:
  897.     LXI    B,NEWSTK    ;END OF THIS PROGRAM
  898.     CALLBIOS DSETDMA
  899.     LDA    NEWDRV        ;NOW GET THE
  900.     MOV    C,A        ;  XLT LOCATION
  901.     CALLBIOS DSELDSK    ;SELECT THE DRIVE
  902.     MOV    A,M        ;GET XLT ADDR LO BYTE
  903.     INX    H        ;POINT TO XLT HI BYTE
  904.     MOV    H,M        ;GET XLT ADDR HI BYTE
  905.     MOV    L,A        ;FORM ADDRESS
  906.     SHLD    XLT        ;SAVE XLT ADDRESS
  907.     MVI    C,1        ;SET TO TRACK OTHER THAN 0
  908.     CALLBIOS DSETTRK    ;DO IT
  909.     MVI    C,1
  910.     CALLBIOS DSETSEC    ;SET THE SECTOR
  911.     CALLBIOS DREAD        ;READ THE DISK
  912.     MVI    C,31        ;GET DISK PARAMETER BLOCK
  913.     CALL    BDOS        ;HL POINTS TO BIOS DPB ON RETURN
  914.     SHLD    DPB$ADDR    ;SAVE DPB ADDRESS
  915.     LXI    D,DPB        ;POINT TO PROGRAM DPB STORAGE AREA
  916.     LXI    B,15        ;LENGTH TO MOVE
  917.     MOVE            ;COPY DPB FROM BIOS
  918.     LDA    HARD$D
  919.     ORA    A        ;ON HARD DISK?
  920.     CALL    HARDWARE    ;NO, HARDWARE SPECIFIC ROUTINE
  921.     LXI    B,0080H        ;RESET DMA ADRESS
  922.     CALLBIOS DSETDMA
  923.     RET
  924. ;
  925. ;
  926. ;****************************************************************
  927. ;*                                *
  928. ;*    HARDWARE                        *
  929. ;*                                *
  930. ;*    This is routine has to be provided by the user        *
  931. ;*    to suit their disk controller hardware. It must        *
  932. ;*    set up the display header to suit the types        *
  933. ;*    of drive you are using. This is up to you        *
  934. ;*    but I would suggest something informative        *
  935. ;*    about the disk format, i.e. single/double        *
  936. ;*    sided, single/double density, sector size        *
  937. ;*    etc. as in the DJ2D example below.            *
  938. ;*                                *
  939. ;****************************************************************
  940. ;
  941. HARDWARE:
  942.     LXI    H,HEAD$HARD    ;POINTER TO HEADER FOR HARD DISK
  943.     JNZ    MOVER        ;DISPLAY ONLY IF HARD FLAG SET
  944.     LHLD    DPB$ADDR    ;GET DPB START
  945.     DCX    H        ;GODBOUT HAS DISK TYPE BEFORE XLT
  946.     MOV    A,M        ;A <---- DISK TYPE    
  947.     LXI    H,HEAD$TABLE
  948.     RAL            ;MULTIPLY DISK TYPE BY 2
  949.     MVI    D,0
  950.     MOV    E,A        ;DE <---- OFFSET INTO TABLE
  951.     DAD    D        ;HL <---- POINTS TO HEADER ADDRESS
  952.     CONTENTS        ;HL <---- POINTS TO HEADER
  953. MOVER:
  954.     LXI    D,HEADER    ;BUFFER FOR DISPLAY HEADER
  955.     LXI    B,14        ;LENGTH OF MESSAGE
  956.     MOVE            ;MOVE IT
  957.     RET
  958. ;
  959. HEAD$TABLE:
  960.     DW    HEAD$128S
  961.     DW    HEAD$128D
  962.     DW    HEAD$256S
  963.     DW    HEAD$256D
  964.     DW    HEAD$512S
  965.     DW    HEAD$512D
  966.     DW    HEAD$1024S
  967.     DW    HEAD$1024D
  968. ;
  969. HEAD$128S:
  970.     DB    ' : 1S/1D/128  '
  971. ;
  972. HEAD$256S:
  973.     DB    ' : 1S/2D/256  '
  974. ;
  975. HEAD$512S:
  976.     DB    ' : 1S/2D/512  '
  977. ;
  978. HEAD$1024S:
  979.     DB    ' : 1S/2D/1024 '
  980. ;
  981. HEAD$128D:
  982.     DB    ' : 2S/1D/128  '
  983. ;
  984. HEAD$256D:
  985.     DB    ' : 2S/2D/256  '
  986. ;
  987. HEAD$512D
  988.     DB    ' : 2S/2D/512  '
  989. ;
  990. HEAD$1024D:
  991.     DB    ' : 2S/2D/1024 '
  992. ;
  993. HEAD$HARD:
  994.     DB    ' : Hard Disk  '
  995. ;
  996. ;  ERROR AND EXIT ROUTINES
  997. ;
  998. ;
  999. INERR:
  1000.     PRINT    <CR,LF,'INPUT ERROR'>
  1001.     JMP    ENDFIL
  1002. ;
  1003. BADSEC:
  1004.     PRINT    <CR,LF,'INCORRECT SECTOR NUMBER, 0 OR GREATER THAN '>
  1005.     DECOUT    SPT$ERR
  1006.     JMP    ENDFIL
  1007. ;
  1008. BADTRK:
  1009.     PRINT    <CR,LF,'INCORRECT TRACK NUMBER'>
  1010.     JMP    ENDFIL
  1011. ;
  1012. BADGRP:
  1013.     PRINT    <CR,LF,'INCORRECT GROUP NUMBER, GREATER THAN '>
  1014.     DECOUT    DSM
  1015.     RET
  1016. ;
  1017. OPNERR:
  1018.     PRINT    <CR,LF,'NO FILE BY THAT NAME ON DRIVE '>
  1019.     LDA    NEWDRV        ;NEW DRIVE NO
  1020.     ADI    41H        ;ADD ASCII OFFSET
  1021.     MOV    E,A
  1022.     MVI    C,2
  1023.     CALL    BDOS
  1024.     JMP    ENDFIL
  1025. ;
  1026. RDERR:
  1027.     PRINT    <CR,LF,'DISK READ ERROR'>
  1028.     JMP    MONITOR
  1029. ;
  1030. NAMERR:
  1031.     PRINT    <CR,LF,'ERROR IN FILE NAME'>
  1032.     JMP    ENDFIL
  1033. ;
  1034. ADERR:
  1035.     PRINT    <CR,LF,LF,'ADDRESS ERROR'>
  1036.     JMP    EDIT1        ;ADDRESS ERROR ON EDIT
  1037. ;
  1038. HEXERR:
  1039.     PRINT    <CR,LF,'  ERROR - HEX INPUT ONLY',CR,LF>
  1040.     JMP    PTX
  1041. ;
  1042. VERSION$ERROR:
  1043.     PRINT    <'Sorry, you need CP/M version 2.0 or later',CR,LF>
  1044.     PRINT    <'to run this disk dump program'>
  1045. ;
  1046. MONITOR:
  1047.     PRINT    CRLF,$
  1048.     LDA    DRVNO        ;RESTORE LOGGED DRIVE NO
  1049.     MOV    E,A
  1050.     DISKIO    LOGIN
  1051.     LHLD    OLDSTK
  1052.     SPHL            ;RESET OLD STACK POINTER
  1053.     RET
  1054. ;
  1055. ;
  1056. ;   DATA ALLOCATIONS
  1057. ;
  1058. SPACE:    DB    ' $'        ;ASCII SPACE
  1059. CRLF:    DB    0DH,0AH,24H    ;ASCII CR LF
  1060. XLT:    DW    00        ;SECTOR TRANSLATE TABLE ADDDR
  1061. DIVISOR:DW    00        ;USED IN GROUP CALCS
  1062. SEC$INDEX:DW    00        ;DITTO
  1063. I:    DW    00        ;PSEUDO INDEX REGISTER
  1064. LINE:    DW    00        ;LINE NUMBER FOR LISTING
  1065. IPOINT:    DW    00        ;VARIABLE BUFFER POINTER
  1066. LASTIN:    DB    0        ;LAST CONSOLE INPUT CHAR
  1067. INFLAG:    DB    0        ;FLAG, RET FOR MORE CONSOLE INPUT
  1068. DRVNO:    DB    0        ;STORAGE FOR ORIGINALLY LOGGED DRIVE
  1069. NEWDRV:    DB    0        ;STORAGE FOR NEW DRIVE NO
  1070. TK0FLAG:DB    0        ;DRIVE ON TRACK 0
  1071. HARD$D:    DB    0        ;HARD DISK FLAG
  1072. TRACK:    DW    0        ;SELECTED TRACK
  1073. NEW$TRACK:DW    0        ;NEXT TRACK TO ACCESS
  1074. BSEC:    DW    00        ;SELECTED BEGINNING SECTOR
  1075. ESEC:    DW    00        ;SELECTED ENDING SECTOR
  1076. DCOUNT:    DW    00        ;SECTORS DUMPED COUNT
  1077. SCOUNT:    DB    0        ;SECTORS DUMPED IN CURRENT EXTENT
  1078. P$COUNT:DB    0        ;GROUPS DONE COUNT
  1079. G:    DW    00        ;CPM GROUP NO
  1080. S:    DW    00        ;SECTOR NO WITHIN GROUP G
  1081. MAP$COUNT:DW    00        ;GROUPS REMAINING TO MAP
  1082. OLDSTK:    DW    00        ;STORAGE FOR OLD STACK POINTER
  1083. INB:    DW    00        ;STORES POINTER TO INPUT BUFFER AREA
  1084. OUTB:    DW    00        ;STORES POINTER TO DIRECTORY BUFFER AREA
  1085. FDFLAG:    DB    0        ;FILE DUMP IN PROGRESS FLAG
  1086. EXFLAG:    DB    0        ;EXTENT CHECK FLAG AND COUNT
  1087. SPT$ERR:DW    0        ;MAX SECTOR NO. FOR BADSEC ERROR
  1088. ;
  1089. DPB$ADDR:
  1090.     DW    0        ;START OF DPB IN BIOS
  1091. DPB:                ;START OF DISK PARAMETER BLOCK
  1092. SPT:    DW    00        ;TOTAL NUMBER OF SECTORS/TRACK
  1093. BSH:    DB    0        ;DATA ALLOC BLOCK SHIFT FACTOR
  1094. BLM:    DB    0        ;CP/M DOCUMENTATION STRIKES AGAIN
  1095. EXM:    DB    0        ;EXTENT MASK
  1096. DSM:    DW    00        ;MAXIMUM DATA BLLOCK (GROUP) NUMBER
  1097. DRM:    DW    00        ;TOTAL NO. OF DIRECTORY ENTRIES
  1098. AL0:    DB    0        ;BIT MAP OF THE NO. OF BLOCKS (GROUPS)
  1099. AL1:    DB    0        ;  RESERVED FOR THE DIRECTORY
  1100. CKS:    DW    00        ;DIRECTORY CHECK VECTOR
  1101. OFF:    DW    00        ;NUMBER OF RESERVED TRACKS
  1102. ;
  1103. HEADER:    DS    14        ;DISPLAY HEADER MESSAGE BUFFER
  1104.     DB    '$'
  1105. ;
  1106. INBUF:    DS    10        ;USED AS CONSOLE INPUT BUFFER
  1107. DIRBUF:    DS    03        ;BUFFER FOR FILE GROUP ALLOCATION INFO
  1108. RCOUNT:    DS    01        ;NO. OF RECORDS IN CURRENT EXTENT
  1109. ALLOC:    DS    18        ;GROUP ALLOCATION TABLE    
  1110. ;
  1111. XLT$SD:
  1112.     DB    00,06,12,18,24,04,10,16,22,02,08,14,20
  1113.     DB    01,07,13,19,25,05,11,17,23,03,09,15,21
  1114. ;
  1115. ENDSTK:    DS    64        ;STACK SPACE ALLOCATION
  1116. NEWSTK:                ;SP LOAD POINT
  1117.  
  1118.     END    BEGIN
  1119.  
  1120.