home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol018 / 2411dump.asm < prev    next >
Assembly Source File  |  1984-04-29  |  18KB  |  722 lines

  1. ;                       2411DUMP.ASM  Ver.1.0
  2. ;                             as of
  3. ;                        August 28, 1980
  4. ; iCOM Model 2411 'Micro Floppy' Disk Dump/Edit Utility
  5. ;
  6. ; Kelly Smith
  7. ; 1.0 To dump selected tracks and sectors;
  8. ;      *TRACK 3 SECTOR 7<cr>
  9. ;      *TRACK 5 SECTOR 3-9<cr>
  10. ;      *TRACK 6<cr> (Dump all 18 sectors of track 6)
  11. ; 2.0 To dump the group allocations by track and sector;
  12. ;      *GROUP 0<cr> (Dump the group allocation for the directory)
  13. ; 3.0 To dump the group alloaction "bit" map
  14. ;      *MAP<cr>
  15. ; 4.0 To verify (read all tracks, all sectors for errors)
  16. ;      *VERIFY<cr>
  17. ;  Note,  that the words VERIFY, MAP, GROUP, TRACK, and SECTOR 
  18. ; may be abreviated as shown in the following examples:
  19. ;      *G 4<cr>
  20. ;      or,
  21. ;      *T 7 S 3-4<cr>
  22. ;      or,
  23. ;      *S 2-9 T 14<cr>
  24. ;      or,
  25. ;      *M<cr>
  26. ;      or,
  27. ;      *V<cr>
  28. ;  Also, the format is quite free. Spaces are usually ignored, 
  29. ; and  ae only required after the words TRACK and SECTOR (or T 
  30. ; and S).  In addition,  all the commands may be specified  at 
  31. ; the  CP/M  command level after the disk "A>" or  "B>"  etc., 
  32. ; prompt as shown in the following example:
  33. ;      A>2411DUMP T 0 S 18<cr>
  34. ;
  35. ;  A  limited  disk editing feature is also included to  allow 
  36. ; "hot patching" of the selected diskette.  Any single  sector 
  37. ; on a diskette may be modified (edited), by requesting a dump 
  38. ; of  the  track  and sector followed by the  word  EDIT.  For 
  39. ; example:
  40. ;      A>2411DUMP T 1 S 3 EDIT<cr>
  41. ;  The  requested  sector  on  the  specified  track  will  be 
  42. ; displayed,  followed by the edit prompt "Edit -".  Enter the 
  43. ; "address" of the byte within that sector to be modified, and 
  44. ; the  program  will  respond by  typing  back  the  "address" 
  45. ; entered  and the present content of that address.  To change 
  46. ; the contents of that address,  enter a two digit hexadecimal 
  47. ; value followed by a carriage return.  The program will  then 
  48. ; display the next sequential address and its content. To stop 
  49. ; enetering data,  type a "." followed by carriage return, and 
  50. ; the  program  will  redisplay  the the  sector  showing  the 
  51. ; modifications.  Note  also,  that  typeing only  a  carriage 
  52. ; return  omits  any modification of the  currently  displayed 
  53. ; address,  and merely advances to the next address.  At  this 
  54. ; point,  you  have  not actually modified the sector  on  the 
  55. ; diskette,   only   the  "memory  image"...when  editing   is 
  56. ; completed,  you  may  write the "memory image" back  to  the 
  57. ; sector by typeing WRITE<cr>.  Additionally, you can stop the 
  58. ; editing  of  the sector by typeing STOP<cr>,  and  terminate 
  59. ; without writing the diskette.
  60. ;  All edit entries must be made in hexadecimal (entering non-
  61. ; hexadecimal  characters  will result in an  error  message), 
  62. ; with the permissable range of 0000 to 007F (larger address's 
  63. ; will  give an error message).
  64. ;  An  additional  feature of the program,  is the ability  to 
  65. ; VERIFY  (read all tracks and sectors for errors) a  diskette 
  66. ; as shown in the following example:
  67. ;      A>2411DUMP B:VERIFY<cr>
  68. ;      or,
  69. ;      A>2411DUMP V<cr>
  70. ;      or,
  71. ;      *V<cr>
  72. ;  Finally,  as with other CP/M utiliies,  the display may  be 
  73. ; started  and  stopped while scrolling with Control-S  (as  a 
  74. ; "toggle"),  and  Control-C will return you to the "*" prompt 
  75. ; (if already at the "*" prompt, you will return to CP/M).
  76. ;                          Notes
  77. ;  The  program  must  be assembled  with  Digital  Research's 
  78. ; macro-assembler MAC, and a macro library file MFMACRO.LIB.
  79. ;  This  program  is  PUBLIC DOMAIN,   and  as  such  is  for 
  80. ; distribution to all users whether public or private.
  81. ;                               Best regards,
  82. ;                               
  83. ;                               Kelly Smith, CP/M-NET (tm)
  84. ;                               805-527-9321 (Modem, 300 Baud)
  85. ;                               805-527-0518 (Verbal)
  86. ;
  87. ;
  88. ;
  89. ;
  90. $+PRINT
  91.  
  92.     MACLIB    MFMACRO        ;INCLUDE MICRO-FLOPPY MACRO LIBRARY
  93.  
  94.     ORG    100H        ;SET PROG START
  95.  
  96.     LXI    H,0
  97.     DAD    SP        ;GET STACK POINTER
  98.     SHLD    OLDSTK
  99.     LXI    SP,NEWSTK    ;SET UP NEW STACK
  100.     DISKIO    ?DRIVE        ;GET CURRENTLY LOGGED DRIVE NO
  101.     STA    NEWDRV        ;ALSO SAVE IN NEW DRIVE NO
  102.     LDA    81H        ;CONSOLE INPUT ALREADY HERE ?
  103.     ORA    A
  104.     JZ    SIGNON        ;BUFFER EMPTY, INPUT FROM CONSOLE
  105.     LDA    80H        ;GET NO OF CHAR INPUT
  106.     ORI    80H        ;ADD 128
  107.     MOV    L,A        ;TO L
  108.     XRA    A        ;ZERO
  109.     MOV    H,A        ;HL CONTAINS ADDR OF END OF BUFFER
  110. ZBFF:    INR    L
  111.     JZ    START        ;REMAINDER OF BUFFER ZEROED
  112.     MOV    M,A
  113.     JMP    ZBFF        ;LOOP
  114. SIGNON:    PRINT    <CR,LF,'Disk Dump Utility for iCom Micro-Floppy, Ver.1.0',CR,LF>
  115. NEWIN:    PRINT    <CR,LF,'*'>
  116.     MVI    A,0FFH        ;SET SWITCH TO RETURN HERE AGAIN
  117.     STA    INFLAG
  118.     LXI    SP,NEWSTK    ;RESET STACK POINTER
  119.     XRA    A
  120.     STA    VALFLG        ;RESET VALIDATION ERROR FLAG
  121.     LXI    H,0
  122.     SHLD    LINE        ;SET LINE COUNT TO ZERO
  123.     FILL    80H,0FFH    ;ZERO INPUT BUFFER
  124.     INPUT    80H        ;READ FILE NAME
  125. ;
  126. ;  SELECT DISK DRIVE AND SET UP FILE CONTROL BLOCK
  127. ;
  128. START:    FILL    FCB,FCB+32    ;ZERO FILE CONTROL BLOCK
  129.     MATCH    82H,'A:'    ;DRIVE A
  130.     JZ    ADISK
  131.     MATCH    82H,'B:'    ;DRIVE B
  132.     JZ    BDISK
  133.     JMP    GETNAM        ;NO DRIVE SPECIFIED
  134. ADISK:    XRA    A
  135.     STA    NEWDRV        ;SELECT DRIVE A
  136.     JMP    DOWN
  137. BDISK:    MVI    A,1
  138.     STA    NEWDRV        ;SELECT DRIVE B
  139. DOWN:    MOVE    82H,80H,40H    ;SHIFT BUFFER DOWN TWO BYTES
  140. ;
  141. ;  SEARCH FOR DIRECT READ OF TRACK AND SECTOR OR VALIDATE
  142. ;
  143. GETNAM:    INSTR    82H,40H,'VERIFY'
  144.     JC    VERIFY        ;VERIFY DISK
  145.     INSTR    82H,40H,'V'
  146.     JC    VERIFY        ;VERIFY DISK
  147.     INSTR    82H,40H,'GROUP'
  148.     JC    GROUP        ;DISPLAY CPM 8 SECTOR GROUP
  149.     INSTR    82H,40H,'G '    ;SEARCH FOR 'G'
  150.     JC    GROUP        ;DISPLAY GROUP
  151.     INSTR    82H,40H,'MAP'    ;ALLOCATION MAP
  152.     JC    MAP        ;DISPLAY GROUP ALLOCATION MAP
  153.     INSTR    82H,40H,'M'    ;ALLOCATION MAP
  154.     JC    MAP        ;DISPLAY GROUP ALLOCATION MAP
  155.     INSTR    82H,40H,'TRACK'    ;SEARCH FOR TRACK
  156.     JC    TRK1
  157.     INSTR    82H,40H,'T '    ;SEARCH FOR 'T'
  158.     JNC    FILNAM        ;NO TRACK GO TO READ FILE
  159. TRK1:    SCAN            ;FIND AND CONVERT NUMBER
  160.     DECIN
  161.     JC    INERR        ;INPUT ERROR ON CARRY
  162.     STA    TRACK        ;SAVE TRACK NO
  163.     INSTR    82H,40H,'SECTOR'    ;SEARCH FOR SECTOR
  164.     JC    SEC1
  165.     INSTR    82H,40H,'S '    ;TRY 'S'
  166.     JNC    WHLTRK        ;DUMP ENTIRE TRACK
  167. SEC1:    SCAN    
  168.     DECIN
  169.     JC    INERR        ;INPUT ERROR ON CARRY
  170.     STA    BSEC        ;BEGINNING SECTOR
  171.     STA    ESEC        ;SAVE IN END SECTOR ALSO
  172.     XCHG            ;SET BUFFER POINTER FOR SCAN
  173.     SHLD    IPOINT        ;SAVE BUFFER POINTER FOR EDIT
  174.     INSTR    ,40H,'-'    ;SEARCH FOR '-'
  175.     JNC    EDIT        ;CHECK FOR EDITION OF SECTOR
  176.     SCAN
  177.     DECIN            ;SCAN AND CONVERT ANOTHER NO
  178.     JC    INERR        ;ERROR IF CARRY SET
  179.     STA    ESEC        ;SAVE IN END SECTOR
  180.     LXI    H,BSEC        ;POINTS TO BSEC
  181.     CMP    M        ;COMPARE BEGIN AND END
  182.     JP    DOREAD        ;OK IF END>=BEGIN
  183.     MOV    B,A        ;OTHERWISE
  184.     MOV    A,M        ;SWITCH THEM
  185.     STA    ESEC
  186.     MOV    M,B
  187. DOREAD:    CALL    RDISK0        ;READ DIRECT
  188.     JMP    ENDFIL        ;BACK FOR MORE INPUT
  189. EDIT:    LHLD    IPOINT        ;RESET BUFFER POINTER
  190.     INSTR    ,40H,'EDIT'    ;CHECK EDIT FUNCTION
  191.     JNC    DOREAD        ;GO TO DISPLAY SECTOR
  192.     CALL    RDISK0        ;DISPLAY SECTOR
  193. EDIT1:    PRINT    <CR,LF,'Edit - '>
  194.     FILL    INBUF,INBUF+9
  195.     INPUT    INBUF,6        ;INPUT MAXIMUM 6 CHAR
  196.     INSTR    INBUF,8,'WRITE'    ;WRITE EDITED SECTOR ON DISK?
  197.     JC    WRTDSK        ;WRITE BUFFER BACK ON DISK
  198.     INSTR    INBUF,8,'STOP'    ;STOP EDITING WITHOUT WRITING?
  199.     JC    ENDFIL        ;EXIT
  200.     HEXIN    INBUF+2        ;CONV ASCII TO HEX
  201.     JNC    CKLIM        ;IF NO ERROR, CHECK ADDR
  202.     LDAX    D        ;GET ASCII CHAR
  203.     CPI    '.'        ;CHECK FOR EXIT CHAR
  204.     JZ    EDIT3        ;BACK FOR MORE EDITING
  205.     JMP    ADERR        ;ADDRESS ERROR
  206. CKLIM:    LXI    D,0080H        ;CHECK ADDR LIMIT
  207.     CPHL
  208.     JP    ADERR        ;ADDRESS ERROR
  209.     SHLD    IPOINT        ;SAVE ADDRESS
  210.     PRINT    CRLF,$
  211. PTX:    HEXOUT    IPOINT+1
  212.     HEXOUT    IPOINT        ;ECHO THE ADDRESS
  213.     PRINT    SPACE,$
  214.     LHLD    IPOINT        ;ECHO PRESENT CONTENTS
  215.     LXI    D,0080H
  216.     DAD    D        ;COMPUTE MEMORY ADDR
  217.     MOV    A,M        ;GET BYTE FROM MEMORY
  218.     HEXOUT
  219.     PRINT    SPACE,$
  220.     FILL    INBUF,INBUF+5    ;ZERO INPUT BUFFER
  221.     INPUT    INBUF,4        ;INPUT 4 CHAR MAX
  222.     HEXIN    INBUF+2        ;CONVERT
  223.     JNC    EDIT2        ;HEX CHAR
  224.     LDAX    D        ;GET ASCII CHAR
  225.     CPI    '.'        ;PERIOD ENDS INPUT
  226.     JZ    EDIT3        ;BACK FOR MORE EDITING
  227.     JMP    HEXERR        ;ERROR NOT HEX CHAR
  228. EDIT2:    LDA    INBUF+1        ;LOAD NO OF CHAR TYPED
  229.     ORA    A
  230.     JZ    EDITX        ;NO REPLACEMENT IF JUST CR
  231.     MOV    A,L        ;CONVERTED CHAR BACK TO A
  232.     LHLD    IPOINT        ;LOAD MEMORY BUFFER POINTER
  233.     LXI    D,0080H        ;OFFSET
  234.     DAD    D        ;CALC MEMORY ADDR
  235.     MOV    M,A        ;STORE NEW INPUT TO MEMORY
  236. EDITX:    PRINT    CRLF,$
  237.     LDA    IPOINT        ;LEAST SIGNIFICANT HALF OF ADDR
  238.     INR    A        ;INCR BY ONE
  239.     ANI    7FH        ;COUNT MOD 128
  240.     STA    IPOINT
  241.     JMP    PTX        ;INPUT MORE DATA
  242. EDIT3:    LXI    H,0
  243.     SHLD    LINE        ;RESET LINE NO TO ZERO
  244.     CALL    PRTSEC        ;PRINT BUFFER WITH HEADING
  245.     JMP    EDIT1        ;BACK FOR ADDITIONAL EDITING
  246. WRTDSK:    CALLBIOS DWRITE        ;WRITE BUFFER BACK ON DISK
  247.     JMP ENDFIL        ;EXIT
  248. ;
  249. ;  READ TRACK AND SECTOR DIRECT
  250. ;
  251. RDISK0:    CALL    FIXB
  252. RDISK:    SETSEC    BSEC        ;SET SECTOR
  253.     JC    BADSEC        ;WRONG SECTOR NO
  254. TRK2:    SETTRK    TRACK        ;SET TRACK
  255.     JC    BADTRK        ;WRONG TRACK NO
  256.     LDA    NEWDRV
  257.     MOV    E,A
  258.     DISKIO    LOGIN            ;SELECT NEW DRIVE IF SPECIFIED
  259.     CALLBIOS DREAD        ;READ TRACK AND SECTOR
  260. ;
  261. ;  PRINT DRIVE, TRACK AND SECTOR HEADING
  262. ;
  263. PRTSEC:    LDA    NEWDRV        ;NEW DRIVE NO
  264.     ORA    A
  265.     JNZ    PRNB        ;PRINT DRIVE B
  266.     PRINT    <CR,LF,'               Drive A -'>
  267. PRNTRK:    PRINT    ' Track '
  268.     LXI    H,0
  269.     LDA    TRACK
  270.     MOV    L,A
  271.     DECOUT
  272.     PRINT    '  Sector '
  273.     LXI    H,0
  274.     LDA    BSEC
  275.     MOV    L,A
  276.     DECOUT
  277.     PRINT    CRLF,$
  278.     CALL    PRTBUF        ;PRINT IT
  279.     LXI    H,BSEC        ;ADDR OF SECTOR NUMBER
  280.     LDA    ESEC        ;END SECTOR NUMBER
  281.     CMP    M        ;COMPARE THEM
  282.     RZ            ;EXIT IF THEY ARE EQUAL
  283.     INR    M        ;INCR BSEC
  284.     JMP    RDISK
  285. PRNB:    PRINT    <CR,LF,'               Drive B -'>
  286.     JMP    PRNTRK        ;PRINT TRACK AND SECTOR
  287. ;
  288. ;  DUMP ENTIRE TRACK IF NO SECTOR INPUT
  289. ;
  290. WHLTRK:    MVI    A,1        ;BEGIN SECTOR
  291.     STA    BSEC
  292.     MVI    A,18        ;DO 18 SECTORS
  293. ESECEND:STA    ESEC
  294.     CALL    RDISK0        ;TO READ DISK
  295.     JMP    ENDFIL        ;BACK FOR MORE INPUT
  296. ;
  297. ;  FILL IN FCB FOR NAMED FILE
  298. ;
  299. FILNAM:    FILFCB    FCB,82H    ;FILL IN FCB NAME FROM INPUT BUFFER
  300.     JC    NAMERR        ;ERROR IN FILE NAME
  301.     MATCH    FCB+9,'COM'    ;TEST FOR COM FILE
  302.     JNZ    SELDR
  303.     LXI    H,100H    
  304.     SHLD    LINE        ;SET LINE NO. TO 100
  305. SELDR:    LDA    NEWDRV        ;SELECT NEW DRIVE
  306.     MOV    E,A
  307.     DISKIO    LOGIN
  308.     DISKIO    OPEN,FCB    ;0PEN FILE
  309.     CPI    255        ;CHECK FILE PRESENT
  310.     JZ    OPNERR        ;EXIT IF ERROR
  311. RDFILE:    DISKIO    READ,FCB    ;READ A BLOCK
  312.     ORA    A        ;ZERO INDICATES SUCESSFUL READ
  313.     JNZ    ENDFIL        ;1 INDICATES EOF
  314.     CALL    PRTBUF        ;DO PRINT SUBROUTINE
  315.     JMP    RDFILE        ;BACK FOR NEXT BLOCK
  316. ENDFIL:    LDA    INFLAG        ;SEE WHERE TO GO
  317.     ORA    A
  318.     JZ    MONITOR
  319.     JMP    NEWIN
  320. ;
  321. ;
  322. ;  PRTBUF - PRINT BUFFER IN HEX AND ASCII
  323. ;
  324. PRTBUF:    MVI    B,8        ;8 LINES
  325.     LXI    H,80H        ;INITIAL BUFFER POINTER
  326.     SHLD    IPOINT        ;STORAGE FOR POINTER
  327. BPRN:    LHLD    IPOINT        ;LOAD POINTER
  328.     MVI    C,16        ;CHAR PER LINE
  329.     LDA    LINE+1        ;LINE NUMBER
  330.     SAVE    B,H
  331.     HEXOUT
  332.     LDA    LINE        ;SECOND TWO DIGITS
  333.     HEXOUT
  334.     PRINT    '  '
  335.     RESTORE    H,B
  336. PLOOP:    MOV    A,M        ;GET A BYTE
  337.     SAVE    B,H
  338.     HEXOUT
  339.     PRINT    SPACE,$
  340.     RESTORE    H,B
  341.     INX    H        ;INCR MEMORY POINTER
  342.     MOV    A,C
  343.     CPI    9        ;CHECK 8 CHAR
  344.     JNZ    DECC        ;SKIP IF NOT
  345.     SAVE    B,H
  346.     PRINT    SPACE,$
  347.     RESTORE    H,B
  348. DECC:    DCR    C        ;DECR CHAR COUNT
  349.     JNZ    PLOOP        ;PRINT SOME MORE
  350.     SAVE    B
  351.     PRINT    SPACE,$
  352.     RESTORE    B
  353.     LHLD    IPOINT        ;RESET POINTER FOR ASCII
  354.     MVI    C,10H        ;RESET CHAR COUNT
  355. PLOOP1:    MOV    A,M        ;GET A BYTE
  356.     ANI    7FH        ;MASK OFF HIGH BIT
  357.     CPI    7FH        ;DELETE CODE
  358.     JZ    PERIOD        ;PRINT PERIOD FOR DELETE
  359.     CPI    20H        ;TEST FOR CONTROL CHAR
  360.     JP    SKIPX        ;SKIP SUBSTITUTION
  361. PERIOD:    MVI    A,2EH        ;ASCII PERIOD
  362. SKIPX:    SAVE    B,H
  363.     CHAROUT            ;PRINT IT SAVE REGS
  364.     RESTORE    H,B
  365.     INX    H        ;INCR MEMORY POINTER
  366.     MOV    A,C
  367.     CPI    9        ;CHECK 8 CHAR
  368.     JNZ    DECC2
  369.     SAVE    B,H
  370.     PRINT    SPACE,$
  371.     RESTORE    H,B
  372. DECC2:    DCR    C        ;DECR CHAR COUNT
  373.     JNZ    PLOOP1        ;PRINT SOME MORE
  374.     SAVE    B
  375.     PRINT    CRLF,$        ;CARRIAGE RETURN
  376.     CALL    PRNCON        ;PRINT CONTROL?
  377.     POP    B
  378.     INDEX    LINE,16        ;INCR LINE NO BY 16
  379.     DCR    B        ;DECR    LINE COUNT
  380.     RZ            ;RETURN IF LINE COUNT ZERO
  381.     INDEX    IPOINT,16    ;INCR POINTER BY 16
  382.     JMP    BPRN        ;LOOP BACK
  383. ;
  384. ;    THIS SECTIONS VERIFIES A DISK FOR BAD SECTORS
  385. ;
  386. VERIFY:    MVI    A,1        ;START WITH SECTOR 1
  387.     STA    SNUM
  388.     XRA    A        ;START WITH TRACK 0
  389.     STA    TNUM
  390.     LDA    NEWDRV        ;SELECT NEW DRIVE
  391.     MOV    E,A
  392.     DISKIO    LOGIN
  393. RS0:    SETTRK    TNUM
  394.     JC    BADTRK
  395. RS1:    SETSEC    SNUM
  396.     JC    BADSEC
  397.     CALLBIOS DREAD
  398.     ORA    A
  399.     CNZ    VALERR        ;ERROR IF NOT ZERO
  400.     CALL    PRNCON        ;ESCAPE ON CONTROL C
  401.     LDA    SNUM        ;SECTOR NO
  402.     ADI    5        ;INCR BY 5
  403.     STA    SNUM        ;STORE IT BACK
  404.     SBI    19        ;CALC SECTOR MOD 18
  405. RS3:    JM    RS1        ;SECTOR OK IF MINUS
  406.     INR    A        ;SECTOR MOD 18
  407.     STA    SNUM        ;STORE IT BACK
  408.     CPI    1        ;ARE WE BACK TO ONE YET
  409.     JNZ    RS1        ;READ SOME MORE
  410.     LDA    TNUM        ;TRACK NUMBER
  411.     INR    A        ;INCR BY ONE
  412.     CPI    35        ;CHECK LIMIT
  413.     JZ    VALOUT        ;TO EXIT
  414.     STA    TNUM        ;STORE BACK TRACK NO
  415.     JMP    RS0        ;BACK TO READ ROUTINE
  416. VALOUT:    LDA    VALFLG        ;CHECK ERROR FLAG
  417.     ORA    A
  418.     JNZ    ENDFIL
  419.     PRINT    <CR,LF,'Succesfully Verified'>
  420.     LDA    NEWDRV
  421.     ORA    A
  422.     JNZ    VAL2
  423.     PRINT    ' Drive A'
  424.     JMP    ENDFIL
  425. VAL2:    PRINT    ' Drive B'
  426.     JMP    ENDFIL
  427. VALERR:    PRINT    <CR,LF,'Error, Track '>
  428.     LDA    TNUM
  429.     LXI    H,0
  430.     MOV    L,A
  431.     DECOUT
  432.     PRINT    ' Sector '
  433.     LXI    H,0
  434.     LDA    SNUM
  435.     MOV    L,A
  436.     DECOUT
  437.     PRINT    CRLF,$
  438.     MVI    A,-1
  439.     STA    VALFLG        ;SET ERROR FLAG
  440.     RET
  441. ;
  442. ;  PRINT CONTROL AND ESCAPE
  443. ;
  444. PRNCON:    MVI    C,11
  445.     CALL    5
  446.     ANI    1
  447.     RZ            ;RETURN
  448.     CHARIN            ;READ CONSOLE
  449.     CPI    3        ;TEST FOR CONTROL C
  450.     JZ    ENDFIL        ;EXIT IF CONTROL C
  451.     RET
  452. ;
  453. ;    THIS SECTION DISPLAYS A CPM GROUP OF 8 SECTORS
  454. ;
  455. GROUP:    SCAN            ;GET THE GROUP NO
  456.     DECIN            ;CONVERT TO BINARY
  457.     JC    INERR        ;INPUT ERROR IF CARRY SET
  458.     STA    G        ;SAVE GROUP NO
  459.     ADI    13        ;CHECK LEGAL RANGE
  460.     JC    BADGRP
  461.     XRA    A
  462.     STA    S        ;SET SECTOR COUNT TO 0
  463.     CALL    FIXB        ;RESTORE DRIVE B IF SELECTED
  464. GRP1:    CALL    GRPTS        ;CONVERT TO TRACK AND SECTOR
  465.     CALL    RDISK        ;PRINT THE SECTOR
  466.     LDA    S        ;CHECK SECTOR COUNT
  467.     INR    A
  468.     STA    S        ;INCR S BY 1
  469.     CPI    8        ;CHECK LIMIT
  470.     JNZ    GRP1        ;PRINT ANOTHER SECTOR
  471.     JMP    ENDFIL        ;BACK FOR MORE INPUT
  472. ;
  473. ;   GRPTS  CONVERT CPM GROUP AND SECTOR NUMBER TO TRK AND SEC
  474. ;
  475. GRPTS:    MVI    H,0        ;ZERO H
  476.     LDA    G        ;GROUP NO
  477.     MOV    L,A        ;TO L
  478.     MOV    D,H        ;ZERO    D
  479.     DAD    H
  480.     DAD    H
  481.     DAD    H
  482.     DAD    H        ;SHIFT LEFT 4
  483.     LDA    S        ;GET SECTOR NO
  484.     MOV    E,A        ;TO DE
  485.     DAD    D        ;HL HAS G*16+S
  486.     LXI    D,-18        ;18 SECTORS, DIVISOR
  487.     MVI    A,2        ;CONTAINS DIVIDEND
  488. DIV:    DAD    D        ;SUB 18
  489.     INR    A
  490.     JC    DIV        ;LOOP TILL MINUS
  491.     LXI    D,TABLE+18    ;INDEX INTO TABLE
  492.     DAD    D
  493.     STA    TRACK        ;STORE TRACK NO
  494.     MOV    A,M        ;GET SECTOR NO
  495.     STA    BSEC        ;SAVE IN BEGINNING SECTOR
  496.     STA    ESEC        ;SAVE IN END SECTOR TOO
  497.     RET
  498. $+PRINT
  499. ;
  500. ;    THIS ROUTINE DISPLAYS THE DISK SECTOR ALLOCATION MAP
  501. ;
  502. MAP:    LDA    NEWDRV
  503.     MOV    E,A
  504.     DISKIO    LOGIN        ;LOG IN SELECTED DRIVE
  505.     DISKIO    ?ALLOC        ;GET POINTER TO ALLOCATION MAP
  506.     MOV    H,B
  507.     MOV    L,A        ;TO HL
  508.     SHLD    IPOINT        ;SAVE MAP POINTER
  509.     LXI    H,0        ;ZERO HL
  510.     SHLD    G        ;ZERO COUNT OF UNUSED GROUPS
  511.     PRINT    <CR,LF,LF,'             Group Allocation Map, Drive -'>
  512.     LDA    NEWDRV        ;LOGGED DRIVE
  513.     ORA    A
  514.     JNZ    DRB        ;DRIVE B
  515.     PRINT    <' A',CR,LF,LF>
  516.     JMP    MAP1
  517. DRB:    PRINT    <' B',CR,LF,LF>
  518. MAP1:    LHLD    IPOINT        ;POINTER TO DISK ALLOCATION MAP
  519.     MVI    D,8        ;NO OF LINES
  520. MAP2:    MVI    C,4        ;WORDS PER LINE
  521. MAPX:    SAVE
  522.     PRINT    '            '
  523.     RESTORE
  524. MAP3:    MVI    B,8        ;BITS PER WORD
  525.     MOV    A,M        ;GET A BYTE FROM ALLOC MAP
  526. MAP4:    RAL            ;SHIFT LEFT THRU CARRY
  527.     SAVE    B,D,H,PSW
  528.     JC    MAP5        ;PRINT A ONE
  529.     PRINT    '0'        ;PRINT A ZERO
  530.     LDA    G        ;UNUSED GROUPS
  531.     INR    A        ;ADD 1
  532.     STA    G        ;STORE IT BACK
  533.     JMP    MAP6
  534. MAP5:    PRINT    '1'        ;PRINT A ONE
  535. MAP6:    RESTORE    PSW,H,D,B
  536.     SAVE    PSW        ;SAVE BIT MAP BYTE
  537.     MOV    A,B        ;BIT COUNT
  538.     CPI    7
  539.     JNZ    MAPY
  540.     MOV    A,C        ;WORD COUNT
  541.     CPI    2
  542.     JNZ    MAPY
  543.     MOV    A,D        ;LINE COUNT
  544.     CPI    1
  545.     JNZ    MAPY
  546.     RESTORE    PSW
  547.     JMP    MAP7        ;TO PRINT UNUSED GROUPS
  548. MAPY:    RESTORE    PSW
  549.     DCR    B        ;DCR BIT COUNT
  550.     JNZ    MAP4        ;PRINT MORE BITS
  551.     DCR    C        ;DECR WORD COUNT
  552.     INX    H        ;INCR ALLOC MAP POINTER
  553.     JNZ    MAP3
  554.     SAVE
  555.     PRINT    CRLF,$
  556.     RESTORE
  557.     DCR    D        ;DECR LINE COUNT
  558.     JMP    MAP2
  559. MAP7:    PRINT    <CR,LF,LF,'          '>
  560.     DECOUT    G        ;PRINT NO OF UNUSED SECTORS
  561.     PRINT    <' Groups remaining on disk, out of 243',CR,LF>
  562.     JMP    ENDFIL        ;EXIT
  563. ;
  564. ;
  565. ;    THIS ROUTINE RESTORES DRIVE B
  566. ;
  567. FIXB:    LDA    NEWDRV        ;CHECK DRIVE NO
  568.     ORA    A
  569.     RZ            ;RETURN IF DRIVE A
  570.     LDA    NEWDRV        ;SELECT DRIVE B
  571.     MOV    E,A
  572.     DISKIO    LOGIN
  573.     XRA    A
  574.     STA    TNUM        ;SELECT TRACK ZERO
  575.     INR    A        ;SELECT SECTOR 1
  576.     STA    SNUM
  577.     SETSEC    SNUM
  578.     SETTRK    TNUM
  579.     CALLBIOS DHOME        ;HOME DRIVES
  580.     CALLBIOS DREAD        ;READ TRACK ZERO DIRECT
  581.     RET
  582. ;
  583. ;  ERROR AND EXIT ROUTINES
  584. ;
  585. ;
  586. INERR:    PRINT    <CR,LF,'Input Error'>
  587.     JMP    ENDFIL
  588. ;
  589. BADSEC:    PRINT    <CR,LF,'Incorrect Sector Number'>
  590.     JMP    ENDFIL
  591. ;
  592. BADTRK:    PRINT    <CR,LF,'Incorrect Track Number'>
  593.     JMP    ENDFIL
  594. ;
  595. BADGRP:    PRINT    <CR,LF,'Incorrect Group Number, greater than 243'>
  596.     JMP    ENDFIL
  597. ;
  598. OPNERR:    LDA    NEWDRV        ;CURRENT DRIVE NO
  599.     ORA    A
  600.     JNZ    OPNER1
  601.     PRINT    <CR,LF,'No file by that name on Drive A'>
  602.     JMP    ENDFIL
  603. OPNER1:    PRINT    <CR,LF,'No file by that name on Drive B'>
  604.     JMP    ENDFIL
  605. ;
  606. RDERR:    PRINT    <CR,LF,'Disk Read Error'>
  607.     JMP    MONITOR
  608. NAMERR:    PRINT    <CR,LF,'Error in File Name'>
  609.     JMP    ENDFIL
  610. ;
  611. ADERR:    PRINT    <CR,LF,LF,'Address Error'>
  612.     JMP    EDIT1        ;ADDRESS ERROR ON EDIT
  613. ;
  614. HEXERR:    PRINT    <CR,LF,'  Error, enter Hexadecimal Values Only',CR,LF>
  615.     JMP    PTX
  616. ;
  617. MONITOR: PRINT    CRLF,$
  618.     LDA    DRVNO        ;RESTORE LOGGED DRIVE NO
  619.     MOV    E,A
  620.     DISKIO    LOGIN
  621.     LHLD    OLDSTK
  622.     SPHL            ;RESET OLD STACK POINTER
  623.     RET
  624. ;
  625. ;
  626. ;   DATA ALLOCATIONS
  627. ;
  628. FCB    EQU    5CH        ;FILE CONTROL BLOCK
  629. SPACE:    DB    ' $'        ;ASCII SPACE
  630. CRLF:    DB    0DH,0AH,24H    ;ASCII CR LF
  631. I:    DW    0        ;PSEUDO INDEX REGISTER
  632. LINE:    DW    0        ;LINE NUMBER FOR LISTING
  633. IPOINT:    DW    00        ;VARIABLE BUFFER POINTER
  634. INBUF:    DS    10        ;USED AS CONSOLE INPUT BUFFER
  635. LASTIN:    DB    0        ;LAST CONSOLE INPUT CHAR
  636. INFLAG:    DB    0        ;FLAG, RET FOR MORE CONSOLE INPUT
  637. DRVNO:    DB    0        ;STORAGE FOR ORIGINALLY LOGGED DRIVE
  638. NEWDRV:    DB    0        ;STORAGE FOR NEW DRIVE NO
  639. TRACK:    DB    0        ;SELECTED TRACK
  640. BSEC:    DB    0        ;SELECTED BEGINNING SECTOR
  641. ESEC:    DB    0        ;SELECTED ENDING SECTOR
  642. TNUM:    DB    0        ;TRACK NO FOR VALIDATE
  643. SNUM:    DB    0        ;SECTOR NO FOR VALIDATE
  644. VALFLG:    DB    0        ;VALIDATION ERROR FLAG
  645. G:    DB    0        ;CPM GROUP NO
  646. S:    DB    0        ;SECTOR NO WITHIN GROUP G
  647. COUNT:    DB    0        ;COUNT OF DIRECTORY ENTRIES
  648. OLDSTK:    DW    0        ;STORAGE FOR OLD STACK POINTER
  649. ENDSTK:    DS    24        ;STORAGE FOR NEW STACK
  650. NEWSTK:    DW    0        ;NEW STACK
  651. INB:    DW    0        ;STORES POINTER TO INPUT BUFFER AREA
  652. OUTB:    DW    0        ;STORES POINTER TO DIRECTORY BUFFER AREA
  653. TABLE:    DB    01
  654.     DB    05
  655.     DB    09
  656.     DB    13
  657.     DB    17
  658.     DB    04
  659.     DB    08
  660.     DB    12
  661.     DB    16
  662.     DB    03
  663.     DB    07
  664.     DB    11
  665.     DB    15
  666.     DB    02
  667.     DB    06
  668.     DB    10
  669.     DB    14
  670.     DB    18
  671. PDIR    DW    0        ;POINTER TABLE TO DIRECTORY (64 ENTRIES MAX)
  672. DIRBUF:    EQU    PDIR+130    ;START OF AREA USED TO STORE AND SORT DIRECTORY
  673.     END
  674.