home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol226 / backmw27.mac < prev    next >
Encoding:
Text File  |  1986-02-13  |  13.8 KB  |  1,047 lines

  1. ;BACKMW.MAC v2.70 as of 07/25/84
  2. ; (c) ESKAY Software Service
  3. ; S. Kluger
  4. ;
  5. ; See BACKMW.DOC for info
  6. ;
  7. ; The existence of this file proves that backups are
  8. ; a requirement -- BACKMW is back from the dead,
  9. ; thanks to RESOURCE!
  10. ;
  11. cr    equ    0dh
  12. lf    equ    0ah
  13. tbuff    equ    80h
  14. ;
  15. .request syslib        ;make that SYSLIB3!!
  16. ;
  17. ; SYSLIB externals
  18. ;
  19.     extrn    print,pstr,cin,cout,bbline,condin,phl5dc,padc
  20.     extrn    madc,f$mopen,f$open,f$read,f$write,bdos,bios
  21.     extrn    initfcb,crcclr,crcupd,crcdone,codend,eval10
  22.     extrn    f$delete,f$close,fname,divhd,mulhd,comphd
  23.     extrn    mhl5dc,phl4hc,crlf,capine
  24. ;
  25. ; Start of program
  26. ;
  27. BEGIN:    JMP    HOPOVR
  28. ;
  29. HIDRV:    DB    'E'        ;hard disk high drive
  30. FLOPPY:    DB    'F'        ;floppy drive
  31. CRCDRV:    DB    'F'        ;crc file drive
  32. HDCYL:    DW    306        ;number of cylinders
  33. SECPT:    DW    432        ;432 sectors/cylinder
  34. ;
  35. HOPOVR:    LXI    SP,STACK
  36.     CALL    PRINT
  37.     DB    CR,LF,'BACKMW v2.70 as of 07-25-84 (c) S. Kluger'
  38.     DB    CR,LF,0
  39.     MVI    C,12
  40.     CALL    BDOS
  41.     MOV    A,H
  42.     ORA    A
  43.     JNZ    NOMPM
  44.     MOV    A,L
  45.     CPI    23H
  46.     MVI    A,0FFH
  47.     JNC    CPM3
  48.     INR    A
  49. CPM3:    STA    CPMPL
  50.     CALL    CODEND
  51.     SHLD    CRCBUF
  52. MENU:    xra    a
  53.     sta    recf
  54.     sta    crcrf
  55.     LHLD    HDCYL
  56.     LXI    D,32
  57.     CALL    DIVHD
  58.     INX    H
  59.     MOV    H,L
  60.     MVI    L,0
  61.     XCHG
  62.     CALL    CODEND
  63.     DAD    D
  64.     SHLD    DBUFF
  65. rstrt:    CALL    PRINT
  66.     DB    CR,LF,LF
  67.     DB    'Select function:',CR,LF,LF
  68.     DB    'T  -  TOTAL backup of hard disk',CR,LF
  69.     DB    'I  -  INCREMENTAL backup of hard disk',CR,LF
  70.     DB    'C  -  CONFIGURATION changes',CR,LF
  71.     DB    'R  -  RESTART',CR,LF
  72.     DB    'Q  -  QUIT to CP/M',CR,LF,LF
  73.     DB    'Your choice : ',0
  74.     CALL    CAPINE
  75.     CPI    'T'
  76.     JZ    TOTAL
  77.     CPI    'I'
  78.     JZ    INCREM
  79.     CPI    'C'
  80.     JZ    CONFIG
  81.     CPI    'R'
  82.     JZ    RESTRT
  83.     CPI    'Q'
  84.     JZ    0
  85.     CALL    PRINT
  86.     DB    CR,LF,7
  87.     DB    'ERROR - invalid selection',CR,LF,LF,0
  88.     JMP    MENU
  89. ;
  90. ; restart - set CRC-file-read flag true, then go back to menu
  91. ;
  92. restrt:    mvi    a,1
  93.     sta    crcrf
  94.     call    print
  95.     db    cr,lf,lf
  96.     db    '*** restarted ***',cr,lf,0
  97.     jmp    rstrt
  98. ;
  99. ; display and edit configuration
  100. ;
  101. CONFIG:    CALL    PRINT
  102.     DB    CR,LF,LF,LF
  103.     DB    'CURRENT CONFIGURATION:',CR,LF,LF
  104.     DB    'High hard drive      : ',0
  105.     LDA    HIDRV
  106.     CALL    COUT
  107.     CALL    PRINT
  108.     DB    ':',CR,LF
  109.     DB    'Floppy backup drive  : ',0
  110.     LDA    FLOPPY
  111.     CALL    COUT
  112.     CALL    PRINT
  113.     DB    ':',CR,LF
  114.     DB    'CRC file drive       : ',0
  115.     LDA    CRCDRV
  116.     CALL    COUT
  117.     CALL    PRINT
  118.     DB    ':',CR,LF
  119.     DB    'Number of CYLINDERS  : ',0
  120.     LHLD    HDCYL
  121.     CALL    PHL5DC
  122.     CALL    PRINT
  123.     DB    CR,LF
  124.     DB    'Number of SECTORS/CYL: ',0
  125.     LHLD    SECPT
  126.     CALL    PHL5DC
  127.     CALL    PRINT
  128.     DB    CR,LF,LF
  129.     DB    'CHANGE? (H,F,C,T,S,Q,?) ',0
  130.     CALL    CAPINE
  131.     CPI    'H'
  132.     JZ    HDRV
  133.     CPI    'F'
  134.     JZ    FDRV
  135.     CPI    'C'
  136.     JZ    CDRV
  137.     CPI    'T'
  138.     JZ    CYLS
  139.     CPI    'S'
  140.     JZ    SECS
  141.     CPI    'Q'
  142.     JZ    QCFG
  143.     CALL    PRINT
  144.     DB    CR,LF,LF,LF
  145.     DB    'H = set hard drive letter',CR,LF
  146.     DB    'F = set floppy drive letter',CR,LF
  147.     DB    'C = set CRC file drive letter',CR,LF
  148.     DB    'T = set number of cylinders (tracks)',CR,LF
  149.     DB    'S = set number of sectors per cylinder',CR,LF
  150.     DB    'Q = return to main menu',0
  151.     JMP    CONFIG
  152. ;
  153. SECS:    CALL    PRINT
  154.     DB    CR,LF
  155.     DB    9,'Enter number of sectors per cylinder : ',0
  156.     CALL    GETDEC
  157.     SHLD    SECPT
  158.     JMP    CONFIG
  159. ;
  160. CYLS:    CALL    PRINT
  161.     DB    CR,LF
  162.     DB    9,'Enter number of cylinders (tracks) : ',0
  163.     CALL    GETDEC
  164.     SHLD    HDCYL
  165.     JMP    CONFIG
  166. ;
  167. CDRV:    CALL    PRINT
  168.     DB    CR,LF
  169.     DB    9,'Enter drive to write BACKMW.CRC to : ',0
  170.     CALL    GETDR
  171.     STA    CRCDRV
  172.     JMP    CONFIG
  173. ;
  174. FDRV:    CALL    PRINT
  175.     DB    CR,LF
  176.     DB    9,'Enter floppy drive letter : ',0
  177.     CALL    GETDR
  178.     STA    FLOPPY
  179.     JMP    CONFIG
  180. ;
  181. HDRV:    CALL    PRINT
  182.     DB    CR,LF
  183.     DB    9,'Enter highest hard disk drive : ',0
  184.     CALL    GETDR
  185.     STA    HIDRV
  186.     JMP    CONFIG
  187. ;
  188. ;  get drive letter
  189. ;
  190. GETDR:    MVI    A,1
  191.     CALL    BBLINE
  192.     ORA    A
  193.     JZ    EXF
  194.     MOV    A,M
  195.     CPI    'A'
  196.     JC    EXF
  197.     CPI    'Q'
  198.     RC
  199. EXF:    POP    H
  200.     JMP    CONFIG
  201. ;
  202. ; get decimal value < 1000
  203. ;
  204. GETDEC:    CALL    BBLINE
  205.     CPI    4
  206.     JNC    EXF
  207.     CALL    eval10
  208.     XCHG
  209.     MOV    A,H
  210.     ORA    L
  211.     JZ    EXF
  212.     RET
  213. ;
  214. FSE:    CALL    PRINT
  215.     DB    CR,LF,7
  216.     DB    'File error - try again',0
  217. QCFG:    CALL    PRINT
  218.     DB    CR,LF,LF
  219.     DB    'END OF CONFIGURATION. SAVE TO DISK? ',0
  220.     MVI    A,1
  221.     CALL    BBLINE
  222.     MOV    A,M
  223.     CPI    'Y'
  224.     JNZ    MENU
  225.     CALL    PRINT
  226.     DB    'Enter full filespec including drive letter > ',0
  227.     MVI    A,1
  228.     CALL    BBLINE
  229.     LXI    D,TFCB
  230.     CALL    INITFCB
  231.     CALL    FNAME
  232.     JZ    FSE
  233.     MOV    A,B
  234.     STAX    D
  235.     CALL    F$MOPEN
  236.     LXI    D,100H
  237. WRL:    CALL    CODEND
  238.     MOV    A,H
  239.     CMP    D
  240.     JNZ    WCNT
  241.     MOV    A,L
  242.     CMP    E
  243.     JZ    WEND
  244. WCNT:    LXI    H,TBUFF
  245. MLP:    LDAX    D
  246.     MOV    M,A
  247.     INX    D
  248.     INR    L
  249.     JNZ    MLP
  250.     PUSH    D
  251.     LXI    D,TFCB
  252.     CALL    F$WRITE
  253.     ORA    A
  254.     POP    D
  255.     JZ    WRL
  256.     CALL    PRINT
  257.     DB    CR,LF,7
  258.     DB    'Disk write error - aborted',CR,LF,0
  259.     LXI    D,TFCB
  260.     CALL    F$DELETE
  261.     JMP    MENU
  262. ;
  263. WEND:    LXI    D,TFCB
  264.     CALL    F$CLOSE
  265.     JMP    MENU
  266. ;
  267. ; total hard disk backup
  268. ;
  269. TOTAL:    CALL    PRINT
  270.     DB    CR,LF,LF,LF
  271.     DB    'You have selected TOTAL hard disk backup. In order to',CR,LF
  272.     DB    'perform total backup you must supply a sufficient',CR,LF
  273.     DB    'number of blank, formatted floppy disks. All disks',CR,LF
  274.     DB    'must be of the same format!',CR,LF
  275.     DB    'Please enter your floppy size in k bytes : ',0
  276.     CALL    BBLINE
  277.     ORA    A
  278.     JZ    MENU
  279.     CALL    eval10
  280.     MOV    A,D
  281.     ORA    A
  282.     JNZ    FSOK
  283.     CALL    PRINT
  284.     DB    CR,LF,LF,7
  285.     DB    '*** NOTE ***',CR,LF,LF
  286.     DB    'You have selected a floppy size of less than 256k.',CR,LF
  287.     DB    'The number of floppies necessary for backup will',CR,LF
  288.     DB    'be very large and it would be better if you could use',CR,LF
  289.     DB    'something bigger.',CR,LF
  290.     DB    'Please hit a "Y" to continue with backup,',CR,LF
  291.     DB    'or anything else to re-specify floppy size : ',0
  292.     CALL    CAPINE
  293.     CPI    'Y'
  294.     JNZ    TOTAL
  295. FSOK:    XCHG
  296.     SHLD    FLOPK
  297.     CALL    PRINT
  298.     DB    CR,LF,LF,'With a floppy size of ',0
  299.     CALL    PHL5DC
  300.     CALL    PRINT
  301.     DB    'k, you need',0
  302.     LHLD    SECPT
  303.     LXI    D,8
  304.     CALL    DIVHD
  305.     PUSH    H
  306.     XCHG
  307.     LHLD    HDCYL
  308.     CALL    MULHD
  309.     XTHL
  310.     PUSH    H
  311.     XCHG
  312.     LHLD    FLOPK
  313.     CALL    DIVHD
  314.     MOV    A,L
  315.     STA    CYLPF
  316.     XCHG
  317.     POP    H
  318.     CALL    MULHD
  319.     XCHG
  320.     POP    H
  321.     CALL    DIVHD
  322.     INX    H
  323.     MOV    A,L
  324.     STA    FLPYS
  325.     CALL    PADC
  326.     CALL    PRINT
  327.     DB    ' floppies!',CR,LF,LF,0
  328.     CALL    GETID
  329.     MVI    A,1
  330.     STA    FLPNUM
  331.     STA    CCFL
  332.     LXI    H,0
  333.     SHLD    CURCYL
  334.     CALL    INSFLP
  335. ;
  336. ; This is the total backup loop, which is
  337. ; executed <flpys> times.
  338. ;
  339. TOTLP:    CALL    RCURCY
  340.     LHLD    HDCYL
  341.     XCHG
  342.     LHLD    CURCYL
  343.     INX    H
  344.     SHLD    CURCYL
  345.     CALL    COMPHD
  346.     JNZ    TOTLP
  347.     CALL    WRCRCF
  348.     CALL    PRINT
  349.     DB    CR,LF,LF
  350.     DB    'TOTAL BACKUP COMPLETED',CR,LF,0
  351.     JMP    MENU
  352. ;
  353. ; get the ID field (date)
  354. ;
  355. GETID:    CALL    PRINT
  356.     DB    CR,LF
  357.     DB    'Please enter 8-char disk ID or <RET> to abort : ',0
  358.     MVI    A,1
  359.     CALL    BBLINE
  360.     CPI    8
  361.     JNZ    MENU
  362.     LXI    D,DATE
  363.     CALL    MOV8
  364.     LXI    D,CYLFCB+1
  365.     CALL    MOV8
  366.     LXI    D,CRCFCB+1
  367.     JMP    MOV8
  368. ;
  369. ; incremental backup/restore
  370. ;
  371. INCREM:    XRA    A
  372.     STA    dirctn
  373.     inr    a
  374.     sta    recf
  375.     CALL    PRINT
  376.     DB    CR,LF,LF
  377.     DB    'Incremental backup/restore. Select option:',CR,LF
  378.     DB    'B = backup  (HD -> FLOPPY)',CR,LF
  379.     DB    'R = restore (FLOPPY -> HD)',CR,LF,LF
  380.     DB    'Choice (RET to exit) ? ',0
  381.     CALL    CAPINE
  382.     CPI    'B'
  383.     JZ    BAC
  384.     CPI    'R'
  385.     JNZ    MENU
  386.     MVI    A,1
  387.     STA    DIRCTN
  388. BAC:    CALL    GETID
  389.     lda    crcrf
  390.     ora    a
  391.     CZ    RDCRCF
  392.     CALL    CODEND
  393.     SHLD    CRCBUF
  394. scno:    call    print
  395.     db    cr,lf,lf
  396.     db    'Enter cylinder number to start at : ',0
  397.     call    bbline
  398.     call    eval10
  399.     lhld    hdcyl
  400.     dcx    h
  401.     call    comphd
  402.     jnc    sco
  403.     call    print
  404.     db    cr,lf,7
  405.     db    'ERROR - cylinder too high. Must be <= ',0
  406.     call    phl5dc
  407.     jmp    scno
  408. ;
  409. sco:    call    print
  410.     db    cr,lf,lf,0
  411.     lxi    h,0
  412.     mvi    b,8        ;8 bytes in CRC record
  413. ccrcl:    dad    d
  414.     dcr    b
  415.     jnz    ccrcl
  416.     push    d
  417.     xchg
  418.     lhld    crcbuf
  419.     dad    d
  420.     pop    d
  421.     shld    crcbuf
  422.     xchg
  423.     SHLD    CURCYL
  424.     SHLD    TEMP3
  425. NEXTCY:    LXI    H,1
  426.     SHLD    CURSEC
  427.     call    condin
  428.     cpi    3
  429.     jz    wrcrcf
  430. noab:    CALL    CRCK
  431.     PUSH    H
  432.     lxi    d,0eaf8h    ;EAF8 = all E5s (blank)
  433.     call    comphd
  434.     jnz    noe5
  435.     call    print
  436.     db    '. Blank -- skipping.',cr,lf,0
  437.     LHLD    CRCBUF
  438.     inx    h
  439.     inx    h
  440.     inx    h
  441.     MOV    M,E
  442.     INX    H
  443.     MOV    M,D
  444.     LXI    D,4
  445.     DAD    D
  446.     SHLD    CRCBUF
  447.     jmp    contcr
  448. ;
  449. noe5:    LHLD    CRCBUF
  450.     INX    H
  451.     INX    H
  452.     INX    H
  453.     MOV    E,M
  454.     INX    H
  455.     MOV    D,M
  456.     POP    H
  457.     CALL    COMPHD
  458.     JZ    SAMEC
  459.     CALL    PRINT
  460.     DB    ' OLD = ',0
  461.     XCHG
  462.     CALL    PHL4HC
  463.     CALL    PRINT
  464.     DB    '. Now recopying...',CR,LF,0
  465.     LHLD    CRCBUF
  466.     INX    H
  467.     INX    H
  468.     MOV    A,M
  469.     inx    h
  470.     SHLD    CRCBUF
  471.     LXI    D,DSKNO
  472.     CALL    MADC
  473.     STA    FLPNUM
  474. RQFLP:    MVI    C,0DH
  475.     CALL    BDOS
  476.     LXI    D,DSKFCB
  477.     CALL    INITFCB
  478.     LDA    FLOPPY
  479.     SUI    '@'
  480.     STAX    D
  481.     CALL    F$OPEN
  482.     JZ    FLISIN
  483.     CALL    PRINT
  484.     DB    CR,LF,'Insert floppy number',0
  485.     LDA    FLPNUM
  486.     CALL    PADC
  487.     CALL    PRINT
  488.     DB    ' and press RETURN',CR,LF,0
  489.     CALL    BBLINE
  490.     JMP    RQFLP
  491. ;
  492. FLISIN:    CALL    CYLTOF
  493.     LXI    D,CYLFCB
  494.     CALL    INITFCB
  495.     LDA    FLOPPY
  496.     SUI    '@'
  497.     STAX    D
  498.     CALL    F$OPEN
  499.     JNZ    RQFLP
  500.     LDA    dirctn
  501.     ORA    A
  502.     JZ    HDTOF
  503.     LXI    H,1
  504.     SHLD    CURSEC
  505.     CALL    CRLF
  506.     CALL    WCURCY
  507.     lxi    d,5
  508.     JMP    ADVCRC
  509. ;
  510. HDTOF:    CALL    RCURCY
  511.     MVI    A,1
  512.     STA    TEMP3
  513.     JMP    CONTCR
  514. ;
  515. SAMEC:    CALL    PRINT
  516.     DB    ' unchanged',CR,LF,0
  517.     LXI    D,8
  518. ADVCRC:    LHLD    CRCBUF
  519.     DAD    D
  520.     SHLD    CRCBUF
  521. CONTCR:    LHLD    HDCYL
  522.     XCHG
  523.     LHLD    CURCYL
  524.     INX    H
  525.     SHLD    CURCYL
  526.     CALL    COMPHD
  527.     JNZ    NEXTCY
  528.     call    print
  529.     db    cr,lf,7
  530.     db    '*** INCREMENTAL B/R COMPLETED ***',cr,lf,0
  531.     LDA    TEMP3
  532.     ORA    A
  533.     JZ    MENU
  534.     lda    dirctn
  535.     cpi    1
  536.     cnz    wrcrcf
  537.     JMP    MENU
  538. ;
  539. WCURCY:    LHLD    DBUFF
  540.     SHLD    BUFFER
  541.     XRA    A
  542.     STA    INBUF
  543. LP16K:    LXI    D,CYLFCB
  544.     CALL    F$READ
  545.     ORA    A
  546.     JNZ    PURGE
  547.     LXI    D,TBUFF
  548.     LHLD    BUFFER
  549. WCYM:    LDAX    D
  550.     MOV    M,A
  551.     INX    H
  552.     INR    E
  553.     JNZ    WCYM
  554.     SHLD    BUFFER
  555.     LDA    INBUF
  556.     INR    A
  557.     STA    INBUF
  558.     CPI    80H
  559.     JNZ    LP16K
  560.     CALL    PURGE
  561.     JMP    WCURCY
  562. ;
  563. PURGE:    LHLD    DBUFF
  564.     SHLD    BUFFER
  565. PURGEB:    LHLD    BUFFER
  566.     LXI    D,TBUFF
  567. PURGL:    MOV    A,M
  568.     STAX    D
  569.     INX    H
  570.     INR    E
  571.     JNZ    PURGL
  572.     SHLD    BUFFER
  573.     CALL    PRINT
  574.     DB    CR,'Now writing cylinder  #',0
  575.     LHLD    CURCYL
  576.     CALL    PHL5DC
  577.     CALL    PRINT
  578.     DB    ' sector #',0
  579.     LHLD    CURSEC
  580.     CALL    PHL5DC
  581.     MVI    A,1
  582.     CALL    BIOSIO
  583.     LHLD    CURSEC
  584.     INX    H
  585.     SHLD    CURSEC
  586.     LDA    INBUF
  587.     DCR    A
  588.     STA    INBUF
  589.     JNZ    PURGEB
  590.     RET
  591. ;
  592. RCURCY:    LXI    H,1
  593.     SHLD    CURSEC
  594.     CALL    CRCCLR
  595.     lda    recf        ;recovery?
  596.     ora    a
  597.     CZ    GETCFL
  598.     LHLD    DBUFF
  599.     SHLD    BUFFER
  600.     XRA    A
  601.     STA    INBUF
  602. CCCY1:    CALL    PRINT
  603.     DB    CR,'Now reading cylinder  #',0
  604.     LHLD    CURCYL
  605.     CALL    PHL5DC
  606.     CALL    PRINT
  607.     DB    '  sector #',0
  608.     LHLD    CURSEC
  609.     CALL    PHL5DC
  610.     XRA    A
  611.     CALL    BIOSIO
  612.     LHLD    BUFFER
  613.     LXI    D,TBUFF
  614.     PUSH    D
  615. CRCLP:    LDAX    D
  616.     CALL    CRCUPD
  617.     INR    E
  618.     JNZ    CRCLP
  619.     POP    D
  620. FILLB:    LDAX    D
  621.     MOV    M,A
  622.     INX    H
  623.     INR    E
  624.     JNZ    FILLB
  625.     SHLD    BUFFER
  626.     LDA    INBUF
  627.     INR    A
  628.     STA    INBUF
  629.     CPI    80H
  630.     CZ    FLUSHB
  631.     LHLD    SECPT
  632.     XCHG
  633.     LHLD    CURSEC
  634.     INX    H
  635.     SHLD    CURSEC
  636.     DCX    H
  637.     CALL    COMPHD
  638.     JNZ    CCCY1
  639.     CALL    FLUSHB
  640.     LXI    D,CYLFCB
  641.     CALL    F$CLOSE
  642.     CALL    CRCDONE
  643.     CALL    PRINT
  644.     DB    ' - CRC = ',0
  645.     CALL    PHL4HC
  646.     CALL    CRLF
  647.     XCHG
  648.     LHLD    CRCBUF
  649.     MOV    M,E
  650.     INX    H
  651.     MOV    M,D
  652.     LXI    D,4
  653.     DAD    D
  654.     SHLD    CRCBUF
  655.     RET
  656. ;
  657. FLUSHB:    CALL    FLUSHQ
  658. FLUSH1:    LDA    INBUF
  659.     ORA    A
  660.     JZ    FLUSHQ
  661.     DCR    A
  662.     STA    INBUF
  663.     LHLD    BUFFER
  664.     LXI    D,TBUFF
  665. FLSHL:    MOV    A,M
  666.     STAX    D
  667.     INX    H
  668.     INR    E
  669.     JNZ    FLSHL
  670.     SHLD    BUFFER
  671.     LXI    D,CYLFCB
  672.     CALL    F$WRITE
  673.     ORA    A
  674.     JZ    FLUSH1
  675.     JMP    WRERR
  676. ;
  677. FLUSHQ:    LHLD    DBUFF
  678.     SHLD    BUFFER
  679.     RET
  680. ;
  681. BIOSIO:    ORA    A
  682.     MVI    A,0DH
  683.     JZ    BIORD
  684.     INR    A
  685. BIORD:    STA    RWOPER
  686.     LDA    HIDRV
  687.     SUI    'A'
  688.     MOV    C,A
  689.     MVI    E,1
  690.     MVI    A,9
  691.     CALL    BIOSC
  692.     LHLD    CURCYL
  693.     MOV    B,H
  694.     MOV    C,L
  695.     MVI    A,10
  696.     CALL    BIOSC
  697.     LHLD    CURSEC
  698.     MOV    B,H
  699.     MOV    C,L
  700.     MVI    A,11
  701.     CALL    BIOSC
  702.     LXI    B,TBUFF
  703.     MVI    A,12
  704.     CALL    BIOSC
  705.     MVI    A,0
  706. RWOPER    EQU    $-1
  707.     CALL    BIOSC
  708.     ORA    A
  709.     RZ
  710.     CALL    PRINT
  711.     DB    CR,LF,LF,7,7
  712.     DB    'BIOS ERR ON R/W - ABORTED',CR,LF,0
  713.     RST    0
  714. ;
  715. INSFLP:    CALL    PRINT
  716.     DB    CR,LF,7
  717.     DB    'Insert BLANK floppy number',0
  718.     CALL    PADC
  719.     CALL    PRINT
  720.     DB    ' and press RETURN',CR,LF,0
  721.     CALL    BBLINE
  722.     MVI    C,0DH
  723.     CALL    BDOS
  724.     LDA    FLPNUM
  725.     LXI    D,DSKNO
  726.     CALL    MADC
  727.     LXI    D,DSKFCB
  728.     CALL    INITFCB
  729.     LDA    FLOPPY
  730.     SUI    '@'
  731.     STAX    D
  732.     CALL    F$MOPEN
  733.     JMP    F$CLOSE
  734. ;
  735. WRCRCF:    CALL    CODEND
  736.     SHLD    CRCBUF
  737.     CALL    GETCD
  738.     LXI    D,CRCFCB
  739.     CALL    INITFCB
  740.     LDA    CRCDRV
  741.     SUI    '@'
  742.     STAX    D
  743.     CALL    F$MOPEN
  744.     LHLD    HDCYL
  745.     LXI    D,10H
  746.     CALL    DIVHD
  747.     MOV    B,H
  748.     MOV    C,L
  749.     INX    B
  750. WCRCL:    PUSH    B
  751.     LHLD    CRCBUF
  752.     LXI    D,TBUFF
  753. WC1:    MOV    A,M
  754.     STAX    D
  755.     INX    H
  756.     INR    E
  757.     JNZ    WC1
  758.     SHLD    CRCBUF
  759.     LXI    D,CRCFCB
  760.     CALL    F$WRITE
  761.     ORA    A
  762.     JNZ    WRERR
  763.     POP    B
  764.     DCX    B
  765.     MOV    A,B
  766.     ORA    C
  767.     JNZ    WCRCL
  768.     CALL    F$CLOSE
  769.     JMP    MENU
  770. ;
  771. BDOSER:    CALL    PRINT
  772.     DB    CR,LF,LF,7,7
  773.     DB    '*** PERMANENT BDOS ERROR - ABORTING ***',CR,LF
  774.     DB    '*** SAVING CRC FILE TO DRIVE A: ***',CR,LF,0
  775.     MVI    A,'A'
  776.     STA    CRCDRV
  777.     JMP    WRCRCF
  778. ;
  779. WRERR:    CALL    PRINT
  780.     DB    CR,LF,LF,7,7
  781.     DB    'WRITE',0
  782.     JMP    ERRDSP
  783. ;
  784. RDERR:    CALL    PRINT
  785.     DB    CR,LF,LF,7,7
  786.     DB    'READ',0
  787.     JMP    ERRDSP
  788. ;
  789. MAKERR:    CALL    PRINT
  790.     DB    CR,LF,LF,7,7
  791.     DB    'MAKE',0
  792.     JMP    ERRDSP
  793. ;
  794. OPNERR:    CALL    PRINT
  795.     DB    CR,LF,LF,7,7
  796.     DB    'OPEN',0
  797. ERRDSP:    CALL    PRINT
  798.     DB    ' FATAL ERROR in file ',0
  799.     MVI    B,8
  800.     INX    D
  801. ERRLP1:    LDAX    D
  802.     ORA    A
  803.     CNZ    COUT
  804.     INX    D
  805.     DCR    B
  806.     JNZ    ERRLP1
  807.     MVI    B,3
  808.     MVI    A,'.'
  809.     CALL    COUT
  810. ERRLP2:    LDAX    D
  811.     ORA    A
  812.     CNZ    COUT
  813.     INX    D
  814.     DCR    B
  815.     JNZ    ERRLP2
  816.     CALL    PRINT
  817.     DB    ' - ABORTED.',CR,LF,0
  818.     JMP    MENU
  819. ;
  820. NOMPM:    CALL    PRINT
  821.     DB    CR,LF,7
  822.     DB    'Unable to run under MP/M',cr,lf,0
  823.     RST    0
  824. ;
  825. RDCRCF:    CALL    CODEND
  826.     SHLD    CRCBUF
  827.     CALL    GETCD
  828.     LXI    D,CRCFCB
  829.     CALL    INITFCB
  830.     LDA    CRCDRV
  831.     SUI    '@'
  832.     STAX    D
  833.     CALL    F$OPEN
  834.     JNZ    RDCRCF
  835.     LHLD    HDCYL
  836.     LXI    D,10H
  837.     CALL    DIVHD
  838.     MOV    B,H
  839.     MOV    C,L
  840.     INX    B
  841. RCRCL:    PUSH    B
  842.     LXI    D,CRCFCB
  843.     CALL    F$READ
  844.     ORA    A
  845.     JNZ    RDERR
  846.     LHLD    CRCBUF
  847.     LXI    D,TBUFF
  848. RC1:    LDAX    D
  849.     MOV    M,A
  850.     INX    H
  851.     INR    E
  852.     JNZ    RC1
  853.     SHLD    CRCBUF
  854.     POP    B
  855.     DCX    B
  856.     MOV    A,B
  857.     ORA    C
  858.     JNZ    RCRCL
  859.     JMP    F$CLOSE
  860. ;
  861. MOV8:    PUSH    H
  862.     MVI    B,8
  863. M8L:    MOV    A,M
  864.     STAX    D
  865.     INX    H
  866.     INX    D
  867.     DCR    B
  868.     JNZ    M8L
  869.     POP    H
  870.     RET
  871. ;
  872. GETCD:    CALL    PRINT
  873.     DB    CR,LF,LF,7
  874.     DB    'Insert disk with file ',0
  875.     LXI    H,DATE
  876.     CALL    PSTR
  877.     CALL    PRINT
  878.     DB    '.crc in drive ',0
  879.     LDA    CRCDRV
  880.     CALL    COUT
  881.     CALL    PRINT
  882.     DB    ':, then press RETURN',CR,LF,0
  883.     CALL    BBLINE
  884.     MVI    C,0DH
  885.     JMP    BDOS
  886. ;
  887. GETCFL:    LDA    CCFL
  888.     DCR    A
  889.     MOV    B,A
  890.     LDA    CYLPF
  891.     CMP    B
  892.     JNZ    NONW
  893.     MVI    A,1
  894.     STA    CCFL
  895.     LDA    FLPNUM
  896.     INR    A
  897.     STA    FLPNUM
  898.     CALL    INSFLP
  899. NONW:    LDA    CCFL
  900.     INR    A
  901.     STA    CCFL
  902.     CALL    CYLTOF
  903.     LXI    D,CYLFCB
  904.     CALL    INITFCB
  905.     LDA    FLOPPY
  906.     SUI    '@'
  907.     STAX    D
  908.     CALL    F$MOPEN
  909.     ORA    A
  910.     JNZ    MAKERR
  911.     LHLD    CURCYL
  912.     XCHG
  913.     LHLD    CRCBUF
  914.     MOV    M,E
  915.     INX    H
  916.     MOV    M,D
  917.     INX    H
  918.     LDA    FLPNUM
  919.     MOV    M,A
  920.     INX    H
  921.     SHLD    CRCBUF
  922.     RET
  923. ;
  924. CYLTOF:    LHLD    CURCYL
  925.     LXI    D,TBUFF
  926.     CALL    MHL5DC
  927.     LXI    H,TBUFF+2
  928.     LXI    D,CYLNO
  929.     MVI    B,3
  930. ML1:    MOV    A,M
  931.     STAX    D
  932.     INX    D
  933.     INX    H
  934.     DCR    B
  935.     JNZ    ML1
  936.     RET
  937. ;
  938. ; crc check a cylinder
  939. ;
  940. CRCK:    CALL    CRCCLR
  941.     CALL    PRINT
  942.     DB    'CRC checking cylinder #',0
  943.     LHLD    CURCYL
  944.     CALL    PHL5DC
  945.     LXI    H,1
  946.     SHLD    TEMP1
  947.     LDA    HIDRV
  948.     SUI    'A'
  949.     MOV    C,A
  950.     MVI    E,1
  951.     MVI    A,9
  952.     CALL    BIOSC
  953.     LHLD    CURCYL
  954.     MOV    B,H
  955.     MOV    C,L
  956.     MVI    A,10
  957.     CALL    BIOSC
  958.     LXI    B,TBUFF
  959.     MVI    A,12
  960.     CALL    BIOSC
  961. CRCL1:    LHLD    TEMP1
  962.     MOV    B,H
  963.     MOV    C,L
  964.     MVI    A,11
  965.     CALL    BIOSC
  966.     MVI    A,13
  967.     CALL    BIOSC
  968.     LXI    H,TBUFF
  969. CRLP:    MOV    A,M
  970.     CALL    CRCUPD
  971.     INR    L
  972.     JNZ    CRLP
  973.     call    condin
  974.     cpi    3
  975.     jz    wrcrcf
  976.     LHLD    SECPT
  977.     XCHG
  978.     LHLD    TEMP1
  979.     INX    H
  980.     SHLD    TEMP1
  981.     DCX    H
  982.     CALL    COMPHD
  983.     JNZ    CRCL1
  984.     CALL    CRCDONE
  985.     SHLD    TEMP2
  986.     CALL    PRINT
  987.     DB    '  CRC = ',0
  988.     CALL    PHL4HC
  989.     RET
  990. ;
  991. ; BIOS call dispatcher
  992. ;
  993. BIOSC:    LXI    H,CPMPL
  994.     INR    M
  995.     JZ    CPLUS
  996.     DCR    M
  997.     JMP    BIOS
  998. ;
  999. CPLUS:    DCR    M
  1000.     STA    BIOSPB
  1001.     MOV    H,B
  1002.     MOV    L,C
  1003.     SHLD    BCREG
  1004.     XCHG
  1005.     SHLD    DEREG
  1006.     MVI    C,50
  1007.     LXI    D,BIOSPB
  1008.     JMP    BDOS
  1009. ;
  1010. BIOSPB:    DB    0
  1011.     DB    0
  1012. BCREG:    DW    0
  1013. DEREG:    DW    0
  1014.     DW    0
  1015. ;
  1016. DATE:    DB    '00/00/00',0
  1017. TEMP1:    DW    0
  1018. TEMP2:    DW    0
  1019. TEMP3:    DW    0
  1020. crcrf:    db    0        ;crc restart flag
  1021. CPMPL:    DB    0
  1022. dirctn:    DB    0
  1023. CRCBUF:    DW    0
  1024. FLOPK:    DW    0
  1025. CYLPF:    DB    0
  1026. FLPYS:    DB    0
  1027. FLPNUM:    DB    0
  1028. CCFL:    DB    0
  1029. CURCYL:    DW    0
  1030. CURSEC:    DW    0
  1031. RECF:    DB    0        ;increm/norm flag
  1032. DBUFF:    DW    0
  1033. INBUF:    DB    0
  1034. BUFFER:    DW    0
  1035. DSKFCB:    DB    0,'-disk no'
  1036. DSKNO:    DB    '000'
  1037.     DS    24
  1038. CRCFCB:    DB    0,'00/00/00crc'
  1039.     DS    24
  1040. TFCB:    DS    36
  1041. CYLFCB:    DB    0,'00/00/00'
  1042. CYLNO:    DB    '000'
  1043.     DS    24
  1044.     DS    40
  1045. STACK    EQU    $
  1046.     END
  1047.