home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / utils / dskutl / eset.aqm / ESET.ASM
Assembly Source File  |  1985-02-09  |  19KB  |  795 lines

  1. ;+----------------------------------------------------------------------+
  2. ;|                                                                      |
  3. ;|                            ESET.ASM                                  |
  4. ;|     Public Domain - 1984   Konrad Roeder, Albuquerque, NM            |
  5. ;|                                                                      |
  6. ;+----------------------------------------------------------------------+
  7. ;
  8. ;
  9. ; Revision Log:
  10. ;
  11.     7/16/84    V1.0    release to AMPRO-1
  12. ;
  13. ; Purpose:
  14. ;
  15. ; ESET allows any one of the four possible drives A, B, C, and D,
  16. ; to read a foreign format.  The emulated foreign drive is called
  17. ; "E" when it is used with the foreign format and by its regular
  18. ; name when it is used with the normal format of the machine.
  19. ;
  20. ; ESET changes the specifications of the "E" drive in four areas:
  21. ;    1 - Disk Drive Select Byte
  22. ;    2 - Type Byte
  23. ;    3 - Disk Parameter Block
  24. ;    4 - Skew Table
  25. ;
  26. ; The following is a description of those data structures:
  27. ;
  28. ; DISK DRIVE SELECT BYTE
  29. ; Tells the system which drive is aliased to the foreign format "E"
  30. ;    00 - A    01 - B    02 - C    03 - D
  31. ;
  32. ; TYPE BYTE
  33. ;
  34. ;
  35. ;    bit 7      density: 0=single; 1=double
  36. ;    bit 6      double sided media if = 1
  37. ;    bit 5      double sided mode:
  38. ;                1 = continuous sector numbers (first
  39. ;                    sector on side one = last sector
  40. ;                    on side 0 + 1).
  41. ;                    both tracks are treated as a 
  42. ;                    single track with twice as many
  43. ;                    sectors.
  44. ;                0 = same sectors on both sides
  45. ;                    (normal method)
  46. ;    bit 4      reserved 
  47. ;    bits 3-2  00 = 1k allocation blocks
  48. ;          01 = 2k allocation blocks
  49. ;          10 = not used
  50. ;          11 = not used
  51. ;    bits 1-0  00 = 128 byte sectors
  52. ;          01 = 256 byte sectors
  53. ;          10 = 512 byte sectors
  54. ;          11 = 1024 byte sectors 
  55. ;
  56. ;
  57. ; DISK PARAMETER BLOCK
  58. ; The disk parameter block tells the system about how the data
  59. ; is arranged on the disk.  The DPB has ten entries:
  60. ;    SPT    Sectors Per Track        (word)
  61. ;    BSH    Block SHift            (byte)
  62. ;    BLM    BLock Mask            (byte)
  63. ;    EXM    EXtent Mask            (byte)
  64. ;    DSM    Directory Size Minus one    (word)
  65. ;    DRM    DiRectory entries Minus one    (word)
  66. ;    AL0    directory group ALlocation 0    (byte)
  67. ;    AL1    directory group ALlocation 1    (byte)
  68. ;    CKS    ChecK Size            (word)
  69. ;    OFF    OFFset (# reserved tracks)    (word)
  70. ;
  71. ; SKEW TABLE
  72. ; The skew table translates between logical and physical sector
  73. ; numbers.  On some systems the sectors are not contiguously
  74. ; arranged so that access times can be improved.
  75. ;
  76. *********************************************************************
  77. CR:    EQU    0DH        ;carrige return 
  78. LF:    EQU    0AH        ;line feed
  79. ESC:    EQU    01BH        ;escape
  80. CAPS:    EQU    05FH        ;upper case
  81. FF:    EQU    0CH        ;form feed
  82. ETX:    EQU    3        ;^c
  83.  
  84.     ORG    0100H        ;base of tpa
  85. BEGIN:    JMP    START        ;leave room for copyright
  86.     ;
  87.     DB    ' MULTIDSK Vers 1.4 Copyright (c) 1984'
  88.     DB    ' AMPRO Computers, Inc. '
  89.     ;
  90. START:    LXI    H,0        ;zero out h&l
  91.     DAD    SP        ;add sp to hl
  92.     SHLD    OLDSP        ;save it
  93.     LXI    SP,STACK     ;set up new stack    
  94.     ;
  95.     ;ckdrv loads the default drive and compares it
  96.     ;against the e drive which isn't allowed.  prints
  97.     ;error message if true.
  98.     ;
  99. CKDRV:    LDA    4        ;get default drive
  100.     CPI    4        ;is it drive "e"?
  101.     JZ    WRGDRV        ;get ready to quit if it is
  102.     ;
  103.     ;eaddr gets the location of eparm in the bios.
  104.     ;
  105. EADDR:    LHLD    1        ;get warm boot vector
  106.     MVI    L,36H        ;getedsk offset
  107.     LXI    D,BIORET     ;point to bios return point
  108.     PUSH    D        ;save d
  109.     PCHL            ;return with dpb addr
  110.     ;
  111.     ;bioret returns with the bios location of eparm
  112.     ;and saves it for use later.
  113.     ;
  114. BIORET: DCX    H        ;back up to type byte location
  115.     SHLD    ADDR        ;save location
  116.     ;
  117.     ;print the signon message.
  118.     ;
  119. SIGN:    LXI    D,SIGNON     ;point to sign on message
  120.     CALL    OUTPUT        ;
  121.     ;
  122.     ;getdrv checks which drive is selected as the "e" drive.
  123.     ;
  124. GETDRV:    CALL    CONIN        ;get drive selection
  125.     CPI    ESC        ;esc?
  126.     JZ    DONE        ;endit
  127.     CPI    ETX        ;^c?
  128.     JZ    DONE        ;
  129.     ANI    CAPS        ;force upper case
  130.     CPI    'A'        ;a?
  131.     JZ    PTMAIN        ;
  132.     CPI    'B'        ;b?
  133.     JZ    PTMAIN        ;
  134.     CPI    'C'        ;c?
  135.     JZ    PTMAIN        ;
  136.     CPI    'D'        ;d?
  137.     JZ    PTMAIN        ;
  138.     JMP    GETDRV        ;do it until you get it right!
  139.     ;
  140.     ;
  141.     ; ptmain is the section that builds the type byte
  142.     ;
  143. PTMAIN: STA    DRSEL+7        ;store drive in signoff message
  144.     SUI    41H        ;ascii -> hex
  145.     STA    DRIVE        ;save drive selected
  146.     XRA    A        ;clear type byte
  147.     STA    TYPE
  148.     LXI    D,SELFMT
  149.     CALL     OUTPUT        ;print the format selection
  150. GETFMT:    CALL    CONIN        ;get the format selection
  151.     CPI    ESC        ;esc?
  152.     JZ    PTMAIN        ;start over
  153.     CPI    ETX        ;ctrl-c?
  154.     JZ    DONE
  155.     ANI    CAPS        ;force caps
  156.     CPI    'A'        ;a?
  157.     JZ    FMTA
  158.     CPI    'B'        ;b?
  159.     JZ    FMTB
  160.     CPI    'C'        ;c?
  161.     JZ    FMTC
  162.     CPI    'D'        ;d?
  163.     JZ    FMTD
  164.     JMP    GETFMT        ;back until its ok
  165. FMTA:    JMP    PTALL        ;sssd = 00xxxxxx (no change)
  166. FMTB:    LDA    TYPE        ;ssdd = 10xxxxxx
  167.     ORI    80H
  168.     STA    TYPE
  169.     JMP    PTALL
  170. FMTC:    LDA    TYPE        ;dssd = 01xxxxxx
  171.     ORI    40H
  172.     STA    TYPE
  173.     JMP     PTSEC
  174. FMTD:    LDA    TYPE        ;dsdd = 11xxxxxx
  175.     ORI    0C0H
  176.     STA    TYPE
  177.     JMP    PTSEC
  178. PTSEC:    LXI    D,SELSEC
  179.     CALL    OUTPUT
  180. GETSEC:    CALL    CONIN        ;get sector numbering
  181.     CPI    ESC        ;esc?
  182.     JZ    PTMAIN
  183.     CPI    ETX        ;ctrl-c?
  184.     JZ    DONE
  185.     ANI    CAPS
  186.     CPI    'A'        ;a?
  187.     JZ    SECA
  188.     CPI    'B'        ;b?
  189.     JZ    SECB
  190.     JMP    GETSEC
  191.     ;
  192. SECA:    LDA    TYPE        ; continuous xx1xxxxx
  193.     ORI    20H
  194.     STA    TYPE
  195.     JMP    PTALL
  196. SECB:    JMP    PTALL        ; same       xx0xxxxx (no change)
  197.     ;
  198. PTALL:    LXI    D,SELALL
  199.     CALL    OUTPUT
  200. GETALL:    CALL    CONIN        ; get allocation block size
  201.     CPI    ESC        ;esc?
  202.     JZ    PTMAIN        ; if so -- start over
  203.     CPI    ETX        ;ctrl-c?
  204.     JZ    DONE        ; if so -- bye
  205.     ANI    CAPS        ; convert to caps
  206.     CPI    'A'        ;a?
  207.     JZ    ALLA
  208.     CPI    'B'        ;b?
  209.     JZ    ALLB
  210.     JMP    GETALL
  211. ALLA:    JMP    PTBPS        ; 1k xxxx00xx 
  212. ALLB:    LDA    TYPE        ; 2k xxxx01xx
  213.     ORI    04H
  214.     STA    TYPE
  215. PTBPS:    LXI    D,SELBPS    ; get bytes per sector memu
  216.     CALL     OUTPUT
  217. GETBPS:    CALL    CONIN        ; get bps
  218.     CPI    ESC        ;esc?
  219.     JZ    PTMAIN        ; if so -- start over
  220.     CPI    ETX        ;ctrl-c?
  221.     JZ    DONE        ; if so -- bye
  222.     ANI    CAPS        ; caps to caps
  223.     CPI    'A'        ;a?
  224.     JZ    BPSA
  225.     CPI    'B'        ;b?
  226.     JZ    BPSB
  227.     CPI    'C'        ;c?
  228.     JZ    BPSC
  229.     CPI    'D'        ;d?
  230.     JZ    BPSD
  231.     JMP    GETBPS
  232. BPSA    JMP    FCMAIN        ; 128 bps xxxxxx00
  233. BPSB    LDA    TYPE        ; 256 bps xxxxxx01
  234.     ORI    01H
  235.     STA    TYPE
  236.     JMP    FCMAIN
  237. BPSC    LDA    TYPE        ; 512 bps xxxxxx10
  238.     ORI    02H
  239.     STA    TYPE
  240.     JMP    FCMAIN
  241. BPSD    LDA    TYPE        ;1024 bps xxxxxx11
  242.     ORI    03H
  243.     STA    TYPE
  244. FCMAIN:    LXI    D,SELSPT    ;sectors per track   (word)
  245.     CALL    OUTPUT
  246.     CALL    DBIN
  247.     SHLD    DPB        ;store in dpb & dpb + 1
  248.     LXI    D,SELBSH    ;block shift         (byte)
  249.     CALL    OUTPUT
  250.     CALL    DBIN
  251.     MOV    A,L        ;store in dpb+2
  252.     STA    DPB+2
  253.     LXI    D,SELBLM    ;block mask          (byte)
  254.     CALL    OUTPUT
  255.     CALL    DBIN
  256.     MOV    A,L        ;store in dpb+3
  257.     STA    DPB+3
  258.     LXI    D,SELEXM    ;extent mask         (byte)
  259.     CALL    OUTPUT
  260.     CALL    DBIN
  261.     MOV    A,L        ;store in dpb+4
  262.     STA    DPB+4
  263.     LXI    D,SELDSM    ;disk size - 1       (word)
  264.     CALL    OUTPUT
  265.     CALL    DBIN
  266.     SHLD    DPB+5
  267.     LXI    D,SELDRM    ;# directories - 1   (word)
  268.     CALL    OUTPUT
  269.     CALL    DBIN
  270.     SHLD    DPB+7
  271.     LXI    D,SELAL0    ;allocation 0        (byte)
  272.     CALL    OUTPUT
  273.     CALL    DBIN
  274.     MOV    A,L
  275.     STA    DPB+9
  276.     LXI    D,SELAL1    ;allocation 1        (byte)
  277.     CALL    OUTPUT
  278.     CALL    DBIN
  279.     MOV    A,L
  280.     STA    DPB+10
  281.     LXI    D,SELCKS    ;dir check size      (word)
  282.     CALL    OUTPUT
  283.     CALL    DBIN
  284.     SHLD    DPB+11
  285.     LXI    D,SELOFF    ;reserved tracks     (word)
  286.     CALL    OUTPUT
  287.     CALL    DBIN
  288.     SHLD    DPB+13
  289.     LXI    D,SELOK
  290.     CALL     OUTPUT
  291. GETOK:    CALL    CONIN
  292.     CPI    ETX
  293.     JZ    DONE
  294.     ANI    CAPS
  295.     CPI    'Y'
  296.     JZ    PTSKW
  297.     CPI    'N'
  298.     JZ    FCMAIN
  299.     JMP    GETOK
  300. PTSKW:    LXI    D,SELSKW
  301.     CALL    OUTPUT
  302. GETSKW:    CALL    CONIN
  303.     CPI    ESC        ;esc?
  304.     JZ    PTSKW
  305.     CPI    ETX        ;ctrl-c?
  306.     JZ    DONE
  307.     ANI    CAPS
  308.     CPI    'A'
  309.     JZ    SKWWA
  310.     CPI    'B'
  311.     JZ    SKWWB
  312.     CPI    'C'
  313.     JZ    SKWWC
  314.     CPI    'D'
  315.     JZ    SKWWD
  316.     CPI    'E'
  317.     JZ    SKWWE
  318.     CPI    'F'
  319.     JZ    SKWWF
  320.     CPI    'G'
  321.     JZ    SKWWG
  322.     CPI    'H'
  323.     JZ    SKWWH
  324.     CPI    'I'
  325.     JZ    SKWWI
  326.     CPI    'J'
  327.     JZ    SKWWJ
  328.     CPI    'K'
  329.     JZ    SKWWK
  330.     CPI    'L'
  331.     JZ    SKWWL
  332.     CPI    'M'
  333.     JZ    SKWWM
  334.     CPI    'N'
  335.     JZ    SKWWN
  336.     CPI    'O'
  337.     JZ    SKWWO
  338.     CPI    'P'
  339.     JZ    SKWWP
  340.     CPI    'Z'
  341.     JZ    MKSKW
  342.     JMP    GETSKW
  343. SKWWA:    LXI    D,SKWA
  344.     JMP    SKWFIN
  345. SKWWB:    LXI    D,SKWB
  346.     JMP    SKWFIN
  347. SKWWC:    LXI    D,SKWC
  348.     JMP    SKWFIN
  349. SKWWD:    LXI    D,SKWD
  350.     JMP    SKWFIN
  351. SKWWE:    LXI    D,SKWE
  352.     JMP    SKWFIN
  353. SKWWF:    LXI    D,SKWF
  354.     JMP    SKWFIN
  355. SKWWG:    LXI    D,SKWG
  356.     JMP    SKWFIN
  357. SKWWH:    LXI    D,SKWH
  358.     JMP    SKWFIN
  359. SKWWI:    LXI    D,SKWI
  360.     JMP    SKWFIN
  361. SKWWJ:    LXI    D,SKWJ
  362.     JMP    SKWFIN
  363. SKWWK:    LXI    D,SKWK
  364.     JMP    SKWFIN
  365. SKWWL:    LXI    D,SKWL
  366.     JMP    SKWFIN
  367. SKWWM:    LXI    D,SKWM
  368.     JMP    SKWFIN
  369. SKWWN:    LXI    D,SKWN
  370.     JMP    SKWFIN
  371. SKWWO:    LXI    D,SKWO
  372.     JMP    SKWFIN
  373. SKWWP:    LXI    D,SKWP
  374.     JMP    SKWFIN
  375. MKSKW:    LXI    D,MKMSG        ;did not find the skew table,
  376.                 ;so we will build one!
  377.     CALL    OUTPUT
  378.     LXI    H,SKW        ;hl will point at the temp buffer
  379.     MVI    B,20        ;b will count out twenty entries
  380. MKSKW1:    PUSH    B        ;save b for now
  381.     PUSH    H        ;hl too
  382.     LXI    D,PROMPT    ;print the prompt
  383.     CALL    OUTPUT
  384.     CALL    DBIN        ;get a value in decimal -> hl
  385.     MOV    A,L
  386.     POP    H        ;get the address it goes into
  387.     MOV    M,A        ;and move it there
  388.     INX    H
  389.     POP    B
  390.     DCR    B        ;count down
  391.     JNZ    MKSKW1        ;not done yet - go again
  392.     LXI    D,SKWOK        ;ask 'em if its ok
  393.     CALL    OUTPUT
  394. GETSOK:    CALL    CONIN        ;get their answer
  395.     CPI    ETX        ;ctrl-c?
  396.     JZ    DONE        ;end it
  397.     ANI    CAPS        ;convert to caps
  398.     CPI    'Y'        ;y?
  399.     JZ    LDDPB
  400.     CPI    'N'        ;n?
  401.     JZ    MKSKW
  402.     JMP    GETSOK        ;someday they may type y or n!
  403.     ;
  404. SKWFIN:    LXI    H,SKW
  405.     MVI    B,20
  406.     CALL    LOOP    ;move the appropriate skew table in the
  407.             ;temporary buffer area
  408.     ;
  409.     ;
  410.     ;
  411.     ; move the temporary buffer area into bios
  412.     ;
  413. LDDPB:    LHLD    ADDR    ;get bios pointer back
  414.     MVI    B,37    ;number of bytes to move (1+15+1+20)
  415.     LXI    D,TYPE    ;point to the temporary dpb
  416.     CALL    LOOP
  417. ;
  418. ; clean up
  419. ;
  420.     LXI    D,SGNOFF
  421.     CALL    OUTPUT
  422.     LHLD    OLDSP
  423.     SPHL        ;put the old stack back into use
  424.     JMP    0H    ;go to bios reset address
  425.     ;
  426.     ;
  427.     ;
  428.  
  429.     ;conin gets a character from the console through bios and
  430.     ;puts it in the accumulator.
  431.     ;
  432. CONIN:    MVI    A,9        ; bios call avoids echo to console
  433.     LHLD    1
  434.     MOV    L,A
  435.     PCHL
  436.     ;
  437.     ;
  438.     ;conout gets a single character from the accumulator and
  439.     ;sends it to the console through bios
  440.     ;
  441. CONOUT: MOV    C,A
  442.     MVI    A,12
  443.     LHLD    1
  444.     MOV    L,A
  445.     PCHL
  446.     ;
  447.      ;
  448.     ;output sends the message pointed to by de to the screen.
  449.     ;
  450. OUTPUT:    MVI    C,9        ;print string function
  451.     CALL    5        ;bdos
  452.     RET            ;
  453.     ;
  454.     ;
  455.     ; dbin ascii decimal to 16 bits in hl
  456.     ;
  457. DBIN:    PUSH    D        ;save registers
  458.     LXI    H,0        ;clear hl
  459. DBIN2:    PUSH    H        ;save hl
  460.     CALL    CONIN
  461.     POP    H
  462.     CPI    ETX        ;ctrl-c?
  463.     JZ    ABORT
  464.     CPI    CR        ;return?
  465.     JZ    DBIN3
  466.     PUSH    H
  467.     CALL    CONOUT
  468.     POP    H
  469.     SUI    '0'        ;convert this digit to binary
  470.     JC    DBIN4        ; <0
  471.     CPI    10
  472.     JNC    ERRDB        ; >10
  473.     MOV    D,H        ; hl -> de
  474.     MOV    E,L
  475.     DAD    H        ; *2
  476.     DAD    H        ; *4
  477.     DAD    D        ; *5
  478.     DAD    H        ; *10
  479.     MOV    E,A        ; new byte -> de
  480.     MOV    D,0
  481.     DAD    D        ; de + hl -> hl
  482.     JMP    DBIN2        ; next
  483. DBIN4:    CPI    (' '-'0') AND 0FFH
  484.     JNZ    ERRDB        ;not blank
  485. DBIN3:    POP    D        ;restore
  486.     RET
  487. ERRDB:    LXI    D,DBERR
  488.     CALL    OUTPUT
  489.     POP    D
  490.     JMP    DBIN        ;try again
  491. ABORT:    POP    D
  492.     JMP    DONE
  493. DBERR:    DB    CR,LF,' unrecognizable digit on input -- try again :$'
  494.     ;
  495.     ;
  496.     ;loop moves data from an address pointed to by de
  497.     ;                  to an address pointed to by hl
  498.     ;           for b bytes.
  499.     ;
  500. LOOP:    LDAX    D        
  501.     MOV    M,A
  502.     INX    D
  503.     INX    H
  504.     DCR    B
  505.     JNZ    LOOP    ;loop until done
  506.     RET
  507.     ;
  508.     ;
  509.     ;
  510.     ;
  511.     ;the signon message...
  512.     ;
  513. SIGNON:    DB    CR,LF
  514.     DB    FF
  515.     DB    0,0,0,0,0,0,0,0,0,0
  516.     DB    LF
  517.     DB    0,0,0,0,0,0,0,0,0,0
  518.     DB    LF
  519.     DB    0,0,0,0,0,0,0,0,0,0
  520.     DB    LF
  521.     DB    0,0,0,0,0,0,0,0,0,0
  522.     DB    LF
  523.     DB    0,0,0,0,0,0,0,0,0,0
  524.     DB    LF
  525.     DB    0,0,0,0,0,0,0,0,0,0
  526.     DB    LF
  527.     DB    0,0,0,0,0,0,0,0,0,0
  528.     DB    LF
  529.     DB    0,0,0,0,0,0,0,0,0,0
  530.     DB    LF
  531.     DB    0,0,0,0,0,0,0,0,0,0
  532.     DB    LF
  533.     DB    0,0,0,0,0,0,0,0,0,0
  534.     DB    LF
  535.     DB    0,0,0,0,0,0,0,0,0,0
  536.     DB    LF
  537.     DB    0,0,0,0,0,0,0,0,0,0
  538.     DB    LF
  539.     DB    0,0,0,0,0,0,0,0,0,0
  540.     DB    0,0,0,0,0,0,0,0,0,0
  541.     DB    LF
  542.     DB    LF
  543.     DB    ' ESET prepares your AMPRO system to read, write, '
  544.     DB    'diskettes formatted for',CR,LF,' many other'
  545.     DB    ' computers not supported by MULTIDSK '
  546.     DB    CR,LF
  547.     DB    0,0,0,0,0,0,0,0,0,0
  548.     DB    LF
  549.     DB    0,0,0,0,0,0,0,0,0,0
  550.     DB    LF
  551.     DB    0,0,0,0,0,0,0,0,0,0
  552.     DB    LF
  553.     DB    0,0,0,0,0,0,0,0,0,0
  554.     DB    LF
  555.     DB    0,0,0,0,0,0,0,0,0,0
  556.     DB    LF
  557.     DB    0,0,0,0,0,0,0,0,0,0
  558.     DB    LF
  559.     DB    ' Which drive do you wish to use as the "E" drive? '
  560.     DB    '(A,B,C or D) $'
  561.     ;
  562. SELFMT:    DB    CR,LF
  563.     DB    FF
  564.     DB    0,0,0,0,0,0,0,0,0,0
  565.     DB    LF
  566.     DB    0,0,0,0,0,0,0,0,0,0
  567.     DB    LF
  568.     DB    0,0,0,0,0,0,0,0,0,0
  569.     DB    LF
  570.     DB    0,0,0,0,0,0,0,0,0,0
  571.     DB    'Defining TYPE byte for drive "E" ',CR,LF
  572.     DB    0,0,0,0,0,0,0,0,0,0,LF
  573.     DB    0,0,0,0,0,0,0,0,0,0,LF
  574.     DB    ' A) single sided, single density ',CR,LF
  575.     DB    0,0,0,0,0,0,0,0,0,0
  576.     DB    ' B) single sided, double density ',CR,LF
  577.     DB    0,0,0,0,0,0,0,0,0,0
  578.     DB    ' C) double sided, single density ',CR,LF
  579.     DB    0,0,0,0,0,0,0,0,0,0
  580.     DB    ' D) double sided, double density ',CR,LF
  581.     DB    0,0,0,0,0,0,0,0,0,0
  582.     DB    LF
  583.     DB    0,0,0,0,0,0,0,0,0,0
  584.     DB    ' Select a FORMAT or <ESC> to start over:$'
  585. SELSEC:    DB    CR,LF
  586.     DB    FF
  587.     DB    0,0,0,0,0,0,0,0,0,0
  588.     DB    LF
  589.     DB    0,0,0,0,0,0,0,0,0,0
  590.     DB    LF
  591.     DB    0,0,0,0,0,0,0,0,0,0
  592.     DB    LF
  593.     DB    0,0,0,0,0,0,0,0,0,0
  594.     DB    ' A) Continuous sector numbers -- ',CR,LF
  595.     DB    0,0,0,0,0,0,0,0,0,0
  596.     DB    '    first sector on side 1 = last sector on side 0 + 1'
  597.     DB    CR,LF,0,0,0,0,0,0,0,0,0
  598.     DB    LF,0,0,0,0,0,0,0,0,0
  599.     DB    ' B) Same sector numbers on both sides',CR,LF
  600.     DB    0,0,0,0,0,0,0,0,0,0
  601.     DB    '    (normal method)',CR,LF
  602.     DB    0,0,0,0,0,0,0,0,0,0
  603.     DB    LF,0,0,0,0,0,0,0,0,0
  604.     DB    ' Select the way sectors are numbered ',CR,LF
  605.     DB    0,0,0,0,0,0,0,0,0,0
  606.     DB    ' or <ESC> to start over:$'
  607. SELALL:    DB    CR,LF
  608.     DB    FF
  609.     DB    0,0,0,0,0,0,0,0,0,0,LF
  610.     DB    0,0,0,0,0,0,0,0,0,0,LF
  611.     DB    0,0,0,0,0,0,0,0,0,0,LF
  612.     DB    0,0,0,0,0,0,0,0,0,0,LF
  613.     DB    ' A) 1k allocation blocks ',CR,LF
  614.     DB    0,0,0,0,0,0,0,0,0,0
  615.     DB    ' B) 2k allocation blocks ',CR,LF
  616.     DB    0,0,0,0,0,0,0,0,0,0,LF
  617.     DB    ' Select the size of the allocation blocks',CR,LF
  618.     DB    ' or type <ESC> to start over:$'
  619. SELBPS:    DB    CR,LF
  620.     DB    FF
  621.     DB    0,0,0,0,0,0,0,0,0,0,LF
  622.     DB    0,0,0,0,0,0,0,0,0,0,LF
  623.     DB    0,0,0,0,0,0,0,0,0,0,LF
  624.     DB    0,0,0,0,0,0,0,0,0,0,LF
  625.     DB    ' A)  128 byte sectors ',CR,LF
  626.     DB    0,0,0,0,0,0,0,0,0,0
  627.     DB    ' B)  256 byte sectors ',CR,LF
  628.     DB    0,0,0,0,0,0,0,0,0,0
  629.     DB    ' C)  512 byte sectors ',CR,LF
  630.     DB    0,0,0,0,0,0,0,0,0,0
  631.     DB    ' D) 1024 byte sectors ',CR,LF
  632.     DB    0,0,0,0,0,0,0,0,0,0,LF
  633.     DB    ' Select the sector size or <ESC> to start over:$'
  634. SELSPT:    DB    CR,LF
  635.     DB    FF
  636.     DB    0,0,0,0,0,0,0,0,0,0,LF
  637.     DB    0,0,0,0,0,0,0,0,0,0,LF
  638.     DB    0,0,0,0,0,0,0,0,0,0,LF
  639.     DB    0,0,0,0,0,0,0,0,0,0,LF
  640.     DB    ' Defining Disk Parameter Block for drive "E"',CR,LF
  641.     DB    0,0,0,0,0,0,0,0,0,0,LF
  642.     DB    0,0,0,0,0,0,0,0,0,0,LF
  643.     DB    0,0,0,0,0,0,0,0,0,0,LF
  644.     DB    0,0,0,0,0,0,0,0,0,0,LF
  645.     DB    0,0,0,0,0,0,0,0,0,0,LF
  646.     DB    ' # of logical sectors per track (SPT):$'
  647. SELBSH:    DB    CR,LF
  648.     DB    ' block shift factor             (BSH):$'
  649. SELBLM:    DB    CR,LF
  650.     DB    ' block mask                     (BLM):$'
  651. SELEXM:    DB    CR,LF
  652.     DB    ' extent mask / DB alloc. size   (EXM):$'
  653. SELDSM:    DB    CR,LF
  654.     DB    ' maximum data block number - 1  (DSM):$'
  655. SELDRM:    DB    CR,LF
  656.     DB    ' maximum directory entries - 1  (DRM):$'
  657. SELAL0:    DB    CR,LF
  658.     DB    ' directory group allocation 0   (AL0):$'
  659. SELAL1:    DB    CR,LF
  660.     DB    ' directory group allocation 1   (AL1):$'
  661. SELCKS:    DB    CR,LF
  662.     DB    ' check size                     (CKS):$'
  663. SELOFF:    DB    CR,LF
  664.     DB    ' number of reserved tracks      (OFF):$'
  665. SELOK:    DB    CR,LF
  666.     DB    0,0,0,0,0,0,0,0,0,0,LF
  667.     DB    0,0,0,0,0,0,0,0,0,0,LF
  668.     DB    ' Are all entries in the dpb ok? $'
  669. SELSKW:    DB    CR,LF
  670.     DB    FF
  671.     DB    0,0,0,0,0,0,0,0,0,0,LF
  672.     DB    0,0,0,0,0,0,0,0,0,0,LF
  673.     DB    0,0,0,0,0,0,0,0,0,0,LF
  674.     DB    0,0,0,0,0,0,0,0,0,0,LF
  675.     DB    0,0,0,0,0,0,0,0,0,0,LF
  676.     DB    0,0,0,0,0,0,0,0,0,0
  677.     DB    ' A) 1,2,3,4,5 ',LF,CR
  678.     DB    0,0,0,0,0,0,0,0,0,0
  679.     DB    ' B) 1,3,5,2,4 ',LF,CR
  680.     DB    0,0,0,0,0,0,0,0,0,0
  681.     DB    ' C) 1,4,2,5,3 ',LF,CR
  682.     DB    0,0,0,0,0,0,0,0,0,0
  683.     DB    ' D) 1,2,3,4,5,6,7,8 ',LF,CR
  684.     DB    0,0,0,0,0,0,0,0,0,0
  685.     DB    ' E) 1,2,3,4,5,6,7,8,9 ',LF,CR
  686.     DB    0,0,0,0,0,0,0,0,0,0
  687.     DB    ' F) 1,3,5,7,9,2,4,6,8 ',LF,CR
  688.     DB    0,0,0,0,0,0,0,0,0,0
  689.     DB    ' G) 1,4,7,2,5,8,3,6,9 ',LF,CR
  690.     DB    0,0,0,0,0,0,0,0,0,0
  691.     DB    ' H) 1,2,3,4,5,6,7,8,9,10 ',LF,CR
  692.     DB    0,0,0,0,0,0,0,0,0,0
  693.     DB    ' I) 1,3,5,7,9,2,4,6,8,10 ',LF,CR
  694.     DB    0,0,0,0,0,0,0,0,0,0
  695.     DB    ' J) 0,1,2,3,4,5,6,7,8,9 ',LF,CR
  696.     DB    0,0,0,0,0,0,0,0,0,0
  697.     DB    ' K) 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 ',LF,CR
  698.     DB    0,0,0,0,0,0,0,0,0,0
  699.     DB    ' L) 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 '
  700.     DB    LF,CR,0,0,0,0,0,0,0,0,0,0
  701.     DB    ' M) 1,3,5,7,9,11,13,15,17,2,4,6,8,10,12,14,16,18 '
  702.     DB    LF,CR,0,0,0,0,0,0,0,0,0,0
  703.     DB    ' N) 1,5,9,13,17,3,7,11,15,2,6,10,14,18,4,8,12,16 '
  704.     DB    LF,CR,0,0,0,0,0,0,0,0,0,0
  705.     DB    ' O) 1,6,11,16,3,8,13,18,5,10,15,2,7,12,17,4,9,14 '
  706.     DB    LF,CR,0,0,0,0,0,0,0,0,0,0
  707.     DB    ' P) 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 '
  708.     DB    LF,CR,0,0,0,0,0,0,0,0,0,0
  709.     DB    ' Z) none of the above ',LF,CR
  710.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0
  711.     DB    LF,CR,0,0,0,0,0,0,0,0,0,0
  712.     DB    ' Select a skew table :$'
  713.  
  714.  
  715. MKMSG:    DB    FF,'Enter the skew table -- enter zeros for '
  716.     DB    'the extra bytes ',CR,LF
  717.     DB    '$'
  718. PROMPT:    DB    CR,LF,' skw:$'
  719. SKWOK:    DB    CR,LF,LF,' Are the skew table entries ok?$'
  720.     ;ending message...
  721.     ;
  722. SGNOFF:    DB    CR,LF
  723.     DB    FF
  724.     DB    0,0,0,0,0,0,0,0,0,0
  725. DRSEL:    DB    LF,'Drive # is now the new format drive when you '
  726.     DB    'call it "E" .',CR,LF,'$'
  727.     ;
  728.     ;
  729.     ;wrgdrv loads the wrong drive error message, prints
  730.     ;it and exits to cp/m. 
  731.     ;
  732. WRGDRV:    LXI    D,ERROR        ;load error message
  733.     CALL    OUTPUT        ;bdos
  734. DONE:    LHLD    OLDSP        ;get stack back
  735.     SPHL            ;put it in sp
  736.     RET            ;return to zcpr3
  737.     ;
  738. ERROR:    DB    7,CR,LF
  739.     DB    0,0,0,0,0,0,0,0,0,0
  740.     DB    LF,'Wrong drive selected.',CR,LF
  741.     DB    'MULTIDSK can only be run from drive A, B, C, or D.'
  742.     DB    CR,LF
  743.     DB    0,0,0,0,0,0,0,0,0,0
  744.     DB    LF,'$'
  745.     ;  
  746.     ;
  747. SKWA:    DB     1, 2, 3, 4, 5, 0, 0, 0, 0, 0
  748.     DB     0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  749. SKWB:    DB     1, 3, 5, 2, 4, 0, 0, 0, 0, 0
  750.     DB     0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  751. SKWC:    DB     1, 4, 2, 5, 3, 0, 0, 0, 0, 0
  752.     DB     0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  753. SKWD:    DB     1, 2, 3, 4, 5, 6, 7, 8, 0, 0
  754.     DB       0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  755. SKWE:    DB     1, 2, 3, 4, 5, 6, 7, 8, 9, 0
  756.     DB     0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  757. SKWF:    DB     1, 3, 5, 7, 9, 2, 4, 6, 8, 0
  758.     DB     0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  759. SKWG:    DB     1, 4, 7, 2, 5, 8, 3, 6, 9, 0
  760.     DB     0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  761. SKWH:    DB     1, 2, 3, 4, 5, 6, 7, 8, 9,10
  762.     DB     0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  763. SKWI    DB     1, 3, 5, 7, 9, 2, 4, 6, 8,10
  764.     DB     0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  765. SKWJ    DB     0, 1, 2, 3, 4, 5, 6, 7, 8, 9
  766.     DB     0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  767. SKWK    DB     1, 2, 3, 4, 5, 6, 7, 8, 9,10
  768.     DB    11,12,13,14,15,16, 0, 0, 0, 0
  769. SKWL    DB     1, 2, 3, 4, 5, 6, 7, 8, 9,10
  770.     DB    11,12,13,14,15,16,17,18, 0, 0
  771. SKWM    DB     1, 3, 5, 7, 9,11,13,15,17, 2
  772.     DB     4, 6, 8,10,12,14,16,18, 0, 0
  773. SKWN    DB     1, 5, 9,13,17, 3, 7,11,15, 2
  774.     DB     6,10,14,18, 4, 8,12,16, 0, 0
  775. SKWO    DB     1, 6,11,16, 3, 8,13,18, 5,10
  776.     DB    15, 2, 7,12,17, 4, 9,14, 0, 0
  777. SKWP    DB     0, 1, 2, 3, 4, 5, 6, 7, 8, 9
  778.     DB    10,11,12,13,14,15,16,17, 0, 0
  779.     ;
  780.     ;
  781. TYPE:    DS    1        ;type byte
  782. DPB:    DS    15        ;disk parameter block
  783. DRIVE:    DS    1        ;drive selection
  784. SKW:    DS    32        ;skew table
  785. ADDR:    DS    2        ;"e" drive parms adr.
  786. OLDSP:    DS    2        ;room for old stack pointer
  787.     ; 
  788.     DS    010H        ;16 level stack
  789. STACK:    
  790.     ;
  791.     ;
  792.     END    BEGIN
  793.  
  794.