home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / cpm3 / mformat.lbr / MFORMAT.ZZ0 / MFORMAT.Z80
Encoding:
Text File  |  1987-09-10  |  9.6 KB  |  422 lines

  1.  
  2. ;=======================================================================
  3. ;
  4. ; MEMORY DISK FORMAT PROGRAM FOR CP/M PLUS            29 Aug 87
  5. ; ----------------------------------------            ---------
  6. ; This program is executed from PROFILE.SUB which is itself processed
  7. ;    on a system reset.
  8. ;
  9. ; It looks for a particular directory label on the memory drive.  If
  10. ; one is found then the program assumes the memory drive is formatted
  11. ; and terminates with no further action.  If one is not found then
  12. ; this program formats the memory drive and executes the command tail.
  13. ; Typically, the command tail would invoke some utility to copy files
  14. ; into the memory drive.
  15. ;
  16. ; The idea of all this is to automatically format and load the memory
  17. ; drive on a power up but to leave it alone on a system reset, thereby
  18. ; speeding up the reboot sequence considerably.
  19. ;
  20. ; This program requires CP/M3 and a Z80 but otherwise it is not
  21. ; hardware-dependent.  If your BIOS supports a memory drive then you
  22. ; can probably use this program.  My PROFILE.SUB contains:-
  23. ;
  24. ;        MFORMAT NULU -O MDFILES -E P:*.* -X
  25. ;
  26. ;                Jon Saxton,
  27. ;                TIE-Line RCPM+
  28. ;                Dural, NSW
  29. ;                AUSTRALIA
  30. ;                +61 2 651-1404
  31. ;
  32. ;=======================================================================
  33.  
  34.     ASEG
  35.     .Z80            ; Keep M80 happy, Z80ASM doesn't care
  36.     ORG    0100H
  37.  
  38. BDOS    EQU    5
  39. BS    EQU    8
  40. CR    EQU    13
  41. LF    EQU    10
  42. PUTSTR    EQU    9
  43. CPMVSN    EQU    12
  44. SELDSK    EQU    14
  45. DIR1ST    EQU    17
  46. DIRNXT    EQU    18
  47. SETDMA    EQU    26
  48. GETDPB    EQU    31
  49. CHNPGM    EQU    47
  50. FLUSH    EQU    48
  51. SGSCB    EQU    49
  52. BIOSFN    EQU    50
  53. DIRLBL    EQU    100
  54. RTNCODE    EQU    108
  55. DDMA    EQU    80H
  56.  
  57.     JR    START
  58. MEMDRV:
  59.     DEFB    'P'        ; Change 102h to match your RAM-drive
  60. START:
  61.     LD    DE,GREET
  62.     CALL    PRINT
  63.     LD    C,CPMVSN    ; Ensure we are using CP/M version 3.x
  64.     CALL    BDOS
  65.     CP    30H
  66.     JR    NC,CPM3
  67.     LD    DE,NEED3
  68.     CALL    PRINT
  69.     RST    0
  70. CPM3:
  71.     LD    DE,DDMA
  72.     PUSH    DE
  73.     LD    C,SETDMA
  74.     CALL    BDOS
  75.  
  76.     POP    HL        ; Save command tail
  77.     LD    C,(HL)
  78.     LD    B,0
  79.     INC    BC
  80.     LD    DE,COMMAND
  81.     LDIR
  82.  
  83.     LD    C,SELDSK    ; Select the disk via the BDOS
  84.     LD    A,(MEMDRV)
  85.     SUB    'A'
  86.     LD    E,A
  87.     PUSH    DE
  88.     CALL    BDOS
  89. ;
  90. ; The following bit of code is PROBABLY unnecessary since it is highly
  91. ; unlikely anyone would implement record skewing on a RAM-disk.  However
  92. ; since I did not write your BIOS I'm not taking that chance....
  93. ;
  94.     LD    HL,1        ; Select the disk via the BIOS
  95.     LD    (DEREG),HL
  96.     POP    HL
  97.     LD    A,BIOSSEL
  98.     CALL    BIOS        ; DPH address returned in HL
  99.     LD    E,(HL)        ; Pick up translate table address
  100.     INC    HL
  101.     LD    D,(HL)
  102.     LD    (TTA),DE    ; Save it for RECTRAN
  103. ;
  104. ; Look for a particular directory label.  If we find it then we assume
  105. ; the disk is already formatted and loaded up with files.
  106. ;
  107.     LD    DE,ALLFILES
  108.     LD    C,DIR1ST
  109. FILELU:
  110.     CALL    BDOS        ; Get a directory entry
  111.     CP    0FFH        ; Finished?
  112.     JP    Z,FORMAT    ; Yes but no label so do the format
  113.     LD    HL,DDMA        ; Not yet - build directory entry address
  114.     ADD    A,A
  115.     ADD    A,A
  116.     ADD    A,A
  117.     ADD    A,A
  118.     ADD    A,A        ; Offset = entry number * 32
  119.     ADD    A,L
  120.     LD    L,A
  121. ;;    LD    A,0        ; (unnecessary since offset < 256)
  122. ;;    ADC    A,H
  123. ;;    LD    H,A        ; HL now points at the directory entry
  124.     LD    DE,LABEL    ; Point at target directory label
  125.     LD    B,12        ; Number of bytes to compare
  126.     CALL    STRCMP
  127.     LD    C,DIRNXT
  128.     JR    NZ,FILELU    ; Keep looking if no match
  129. ;
  130. ; We get to here if we found the target directory label
  131. ;
  132.     LD    DE,NOFMT
  133.     CALL    PRINT
  134.     RST    0        ; Exit if directory label found
  135. ;
  136. ;-----------------------------------------------------------------------
  137. ;
  138. ;    This section of code formats the RAMdisk via the BIOS
  139. ;
  140. ;-----------------------------------------------------------------------
  141. ;
  142. PRPT    EQU    0        ; Word: logical records per track
  143. PBRH    EQU    2        ; Byte: block shift factor
  144. PBLM    EQU    3        ; Byte: block mask
  145. PEXM    EQU    4        ; Byte: extent mask
  146. PDRM    EQU    5        ; Word: blocks - 1
  147. POFF    EQU    13        ; Word: reserved tracks
  148. PPRH    EQU    15        ; Byte: physical record shift factor
  149. PPHM    EQU    16        ; Byte: physical record mask
  150.  
  151. BIOSSEL    EQU    9
  152. SETTRK    EQU    10
  153. SETREC    EQU    11
  154. BSDMA    EQU    12
  155. WRITE    EQU    14
  156. RECTRN    EQU    16
  157. SETBNK    EQU    28
  158.  
  159. TPABANK    EQU    1
  160.  
  161. FORMAT:
  162.     LD    C,GETDPB    ; Get disk parameter block address
  163.     CALL    BDOS
  164.     PUSH    HL        ; Put it into an index register for easy
  165.     POP    IY        ; Reference to DPB fields
  166.     LD    HL,RECBUF    ; Initialize the data area
  167.     LD    DE,RECBUF+1
  168.     LD    BC,2048        ; (Most memory drives use 128-byte records
  169.     LDIR            ; So this is probably more than enough)
  170.     LD    L,(IY+PRPT)    ; Calculate number of physical
  171.     LD    H,(IY+PRPT+1)    ;   records per track
  172.     LD    A,(IY+PPRH)
  173.     INC    A
  174. PRHLOOP:
  175.     DEC    A
  176.     JR    Z,PRHEND
  177.     SRL    H
  178.     RR    L
  179.     JR    PRHLOOP
  180. PRHEND:                ; HL now has physical records per track
  181.     LD    (RPT),HL    ; Remember it
  182.     LD    A,(IY+PBRH)    ; Calculate physical records per block
  183.     SUB    (IY+PPRH)    ; A has a "block/record shift factor"
  184.     LD    L,(IY+PDRM)    ; Get number of blocks
  185.     LD    H,(IY+PDRM+1)
  186.     INC    HL
  187.     LD    B,A
  188. DRMLOOP:
  189.     ADD    HL,HL        ; HL ends up with number of physical
  190.     DJNZ    DRMLOOP        ;   records on the disk
  191.     LD    (RPD),HL    ; (This breaks if memory disk is bigger
  192.                 ;   than 8Mb and uses 128-byte records
  193.                 ;   but I doubt if that will be a real
  194.                 ;   problem.)
  195. ;
  196. ; Ready to do the formatting ....
  197. ;
  198.     LD    HL,0        ; Track = record = 0
  199.     LD    (TRACK),HL
  200.     LD    (RECORD),HL
  201.     LD    DE,FMSG        ; Printf("Formatting pseudo-track 0000");
  202.     CALL    PRINT
  203. FMTLOOP:
  204.     LD    HL,(RPD)    ; For (; rpd--;)
  205.     LD    A,H        ; {
  206.     OR    L
  207.     JR    Z,FMTEXIT
  208.     DEC    HL
  209.     LD    (RPD),HL
  210.     LD    HL,(TRACK)    ; SETRK(track);
  211.     LD    A,SETTRK
  212.     CALL    BIOS
  213.     LD    HL,(RECORD)    ; SETREC(RECTRN(record));
  214.     LD    DE,(TTA)
  215.     LD    (DEREG),DE
  216.     LD    A,RECTRN
  217.     CALL    BIOS
  218.     LD    A,SETREC
  219.     CALL    BIOS
  220.     LD    DE,RECBUF    ; SEDDMA(&RECBUF[0]);
  221.     PUSH    DE
  222.     LD    C,SETDMA
  223.     CALL    BDOS
  224.     POP    HL        ; /* Must do it via BIOS as well! */
  225.     LD    A,BSDMA
  226.     CALL    BIOS
  227. ;;    LD    A,TPABANK    ; SETBNK(TPABANK);
  228. ;;    LD    (AREG),A    ; /* BIOS "set DMA" function selects
  229. ;;    LD    A,SETBNK    ; The TPA bank automatically */
  230. ;;    CALL    BIOS
  231.     LD    A,WRITE        ; If (rslt=WRITE())
  232.     LD    HL,1
  233.     CALL    BIOS
  234.     OR    A        ; Printf("Write error ... Code=%02x\n",
  235.     CALL    NZ,FMTERR    ;   rslt);
  236.     LD    HL,(RECORD)    ; If (++record == RPT)
  237.     INC    HL
  238.     LD    (RECORD),HL
  239.     EX    DE,HL
  240.     LD    HL,(RPT)
  241.     OR    A
  242.     SBC    HL,DE
  243.     JR    NZ,FMTLOOP    ; {
  244.     LD    HL,0        ; Record = 0;
  245.     LD    (RECORD),HL
  246.     LD    DE,BACKSP    ; Printf("\b\b\b\b%04x", ++track);
  247.     CALL    PRINT
  248.     LD    HL,(TRACK)
  249.     INC    HL
  250.     LD    (TRACK),HL
  251.     CALL    HEX16        ; }
  252.     JR    FMTLOOP        ; }
  253.  
  254. FMTEXIT:
  255.     LD    C,FLUSH        ; Flush all disk buffers
  256.     LD    E,0        ; (probably not necessary)
  257.     CALL    BDOS
  258.     LD    DE,FMTDONE    ; Say we've finished formatting
  259.     CALL    PRINT
  260.     LD    DE,LABEL    ; Set the directory label
  261.     LD    A,(MEMDRV)
  262.     SUB    '@'
  263.     LD    (DE),A
  264.     XOR    A
  265.     LD    (LABEL+12),A
  266.     LD    C,DIRLBL
  267.     CALL    BDOS
  268.     INC    A        ; Check for error (format must have failed!)
  269.     JR    NZ,EXECCMD
  270.     LD    DE,FMTFAIL    ; Let human know we couldn't set the directory
  271.     CALL    PRINT        ; Label and exit without doing anything further
  272.     RST    0
  273. EXECCMD:
  274.     LD    DE,LBLDONE    ; Say we've set the directory label
  275.     CALL    PRINT
  276.     LD    DE,DDMA        ; Reload the command tail into
  277.     LD    HL,COMMAND    ;   the default DMA buffer at 80h
  278.     LD    C,(HL)        ;   and ensure it is terminated
  279.     LD    B,0        ;   with a zero byte, then chain
  280.     INC    HL        ;   to the command.
  281.     LDIR
  282.     XOR    A
  283.     LD    (DE),A
  284.     LD    C,CHNPGM
  285.     CALL    BDOS        ; Should never return, but ....
  286.  
  287.     RST    0
  288.  
  289. PCHL:
  290.     JP    (HL)
  291. ;
  292. ; Invokes the BIOS via BDOS(50).  Expects function number in A and
  293. ; principal parameter in HL.  Any secondary parameters must have been
  294. ; pre-loaded into the BIOS parameter block.
  295. ;
  296. BIOS:
  297.     LD    (BCREG),HL
  298.     LD    DE,BIOSPB
  299.     LD    (DE),A
  300.     LD    C,BIOSFN
  301.     CALL    BDOS
  302.     RET
  303. ;
  304. ; Compares two strings and sets Z flag if they are equal.  HL and DE
  305. ; point at the strings, B holds the (maximum) number of bytes to compare.
  306. ;
  307. STRCMP:
  308.     LD    A,(DE)
  309.     CP    (HL)
  310.     RET    NZ
  311.     INC    HL
  312.     INC    DE
  313.     DJNZ    STRCMP
  314.     RET
  315. ;
  316. ; Reports an error if the BIOS returns one while writing to the memory
  317. ; drive.
  318. ;
  319. FMTERR:
  320.     PUSH    AF
  321.     LD    DE,ERRMSG
  322.     CALL    PRINT
  323.     POP    AF
  324.     CALL    HEX8
  325.     LD    DE,CRLF
  326.     CALL    PRINT
  327.     RET
  328. ;
  329. ; Hexadecimal display routines
  330. ;
  331. HEX16:
  332.     PUSH    HL
  333.     LD    A,H
  334.     CALL    HEX8
  335.     POP    HL
  336.     LD    A,L
  337. HEX8:
  338.     PUSH    AF
  339.     RRA
  340.     RRA
  341.     RRA
  342.     RRA
  343.     CALL    HEX4
  344.     POP    AF
  345. HEX4:
  346.     AND    15
  347.     ADD    A,90H
  348.     DAA
  349.     ADC    A,40H
  350.     DAA
  351.     LD    E,A
  352.     LD    C,2
  353.     CALL    BDOS
  354.     RET
  355. ;
  356. ; Display a string on the console.  Uses the normal BDOS function.
  357. ;
  358. PRINT:
  359.     LD    C,PUTSTR
  360.     CALL    BDOS
  361.     RET
  362. ;
  363. ;-----------------------------------------------------------------------
  364. ;
  365. ;                Data
  366. ;
  367. ;-----------------------------------------------------------------------
  368. ;
  369. GREET:
  370.     DEFB    'RAM-disk format program by Jonathan Saxton',CR,LF
  371.     DEFB    'TIE-Line RCPM+, AUSTRALIA.  29 August 1987',CR,LF
  372.     DEFB    CR,LF,'$'
  373. FMTFAIL:
  374.     DEFB    'Error in setting directory label.  Probably indicates a',CR,LF
  375.     DEFB    'problem during the formatting phase which may not have',CR,LF
  376.     DEFB    'shown up as a write error.  Program terminated.$'
  377. NOFMT:
  378.     DEFB    'RAM-disk is already formatted$'
  379. NEED3:
  380.     DEFB    'This program only runs under CP/M version 3.x$'
  381. FMSG:
  382.     DEFB    'Formatting pseudo-track 0000$'
  383. BACKSP:
  384.     DEFB    BS,BS,BS,BS,'$'
  385. ERRMSG:
  386.     DEFB    'Write error during format.  Code=$'
  387. CRLF:
  388.     DEFB    CR,LF,'$'
  389. FMTDONE:
  390.     DEFB    CR,LF,'RAM-disk formatted',CR,LF,'$'
  391. LBLDONE:
  392.     DEFB    'Directory label set',CR,LF,LF,'$'
  393. RPT:
  394.     DEFS    2        ; (Physical) records per track
  395. RPD:
  396.     DEFS    2        ; (Physical) records per disk
  397. TRACK:
  398.     DEFS    2        ; Current track number
  399. RECORD:
  400.     DEFS    2        ; Current record number
  401. TTA:
  402.     DEFS    2        ; Translate table address (probably zero)
  403. LABEL:
  404.     DEFB    20H,'RAMDISK JRS' ; Directory label FCB
  405.     DEFW    0,0,0,0,0,0,0,0,0,0,0,0
  406. ALLFILES:
  407.     DEFB    '????????????'    ; FCB to match all files
  408.     DEFW    0,0,0,0,0,0,0,0,0,0,0,0
  409.  
  410. BIOSPB:                ; BIOS parameter block
  411.     DEFS    1        ; Function number
  412. AREG:    DEFS    1        ; A register
  413. BCREG:    DEFS    2        ; BC register
  414. DEREG:    DEFS    2        ; DE register
  415.     DEFS    2        ; HL register
  416. COMMAND:
  417.     DEFS    256        ; Storage for command tail
  418. RECBUF:
  419.     DEFB    0E5H        ; Format pattern
  420.  
  421.     END    START
  422.