home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug060.arc / CPM#005.LBR / U3.ASM < prev    next >
Assembly Source File  |  1979-12-31  |  13KB  |  539 lines

  1. ; U3 - CP/M PLUS UTILITY FOR RECOVERING ERASED FILES AND FOR
  2. ; CHANGING THE USER AREA OF A FILE. This program is based on
  3. ; UNERASE.COM in the public domain. It has been modified to
  4. ; work with CP/M 3.0 and later, to change the user area of a
  5. ; file, and to accept ambiguous files names. It currently
  6. ; works with sector sizes of 128, 256 512 and 1024 bytes. It
  7. ; is placed in the public domain by Advanced Logic Systems for
  8. ; public use. Advanced Logic Systems makes no warrantee on the
  9. ; operation or use of this program or its applicability for any
  10. ; given application.
  11.  
  12. ; U3 DOES NOT DOES NOT WORK WITH VERSIONS OF CP/M PRIOR TO CP/M 3.0
  13.  
  14. ; The U3 command line takes the form:
  15. ;
  16. ;        U3 [d:]afn.aft [user area]
  17. ;
  18. ; If no user area is specified U3 recoverers all erased files on
  19. ; drive d: (or the default if d: is not specified) matching
  20. ; afn.aft and places them is the current user area. If a user area
  21. ; is specified U3 moves all files in the current user area on
  22. ; drive d: (or the default if d: is not specified) matching
  23. ; afn.aft to the specified user area.
  24.  
  25. ; Versions 1.01 and 1.02 of U3 were prepared by R. Saeks from
  26. ; Gale Wolfenbarger's code for version 1.00. Comments regarding
  27. ; these revisions may be passed to the author by leaving a
  28. ; message on either the
  29. ;
  30. ;        Mesilla Valley RCP/M | (505)-524-6920
  31. ; or the
  32. ;      Lost Dutchman's Gold Mine RCP/M | (602)-848-6708
  33.  
  34. ;    HISTORY
  35.  
  36. ;12/24/84    REVISED CODE TO PERMIT U3 TO BE USED TO EITHER
  37. ;Ver. 1.02    RECOVER AN ERASED FILE OR CHANGE THE USER AREA
  38. ;        OF A FILE. ADDED AMBIGUOUS FILE SPECIFICATIONS
  39. ;        REVISED CODE TO WORK ON DISKS WITH
  40. ;        MORE THAN ONE DIRECTORY TRACK. MOVED CPM 3.0
  41. ;        VERSION CHECK CODE TO BEGINNING OF CODE AND
  42. ;        CORRECTED ERROR TEST IN NODEF. - R. SAEKS
  43.  
  44. ;06/16/84       REVISED TO WORK WITH 1024 BYTE SECTORS AND TO PLACE
  45. ;Ver. 1.01      RECOVERED FILES IN CURRENTLY LOGGED USER AREA.
  46. ;               - R. SAEKS
  47.  
  48. ;12/29/83    FIRST PASS AT DISASSEMBLY OF UNERASE.COM AND MODIFICATIONS
  49. ;Ver. 1.00    TO MAKE IT COMPATIBLE WITH CP/M PLUS
  50. ;        I ALSO DID A SELECT DISK IN DSKPRM SO THAT IF YOU TRY TO 
  51. ;        RECOVER A FILE FROM A DISK THAT IS A DIFFERENT FORMAT FROM
  52. ;        THE ONE THAT YOU ARE CURRENTLY LOGGED ON TO, ITS GETS THE 
  53. ;        RIGHT DPH.  AT THE SAME TIME I CHANGED THE SIZE OF THE AREA
  54. ;        WHERE THE NUMBER OF RESERVED SYSTEM TRACKS IS KEPT.  THIS 
  55. ;        ALLOWS THE NUMBER OF RESERVED TRACKS TO BE GREATER THAN 256.
  56. ;        - GALE WOLFENBARGER
  57.  
  58. ;    ADDRESSES
  59.  
  60. BDOS:    EQU    05H        ;BDOS VECTOR ADDRESS
  61. WRMBOOT:EQU    00H        ;WARM BOOT VECTOR ADDRESS
  62. DEFFCB: EQU    5CH        ;ADDRESS OF THE DEFAULT FCB
  63. DEFFCB2:EQU    6CH        ;ADDRESS OF THE SECOND DEFAULT FCB
  64.  
  65. ;    BDOS FUNCTIONS
  66.  
  67. DIRCALL:EQU    32H        ;CPM 3.0 DIRECT BIOS CALL
  68. DRESET: EQU    0DH        ;RESET DISK SYSTEM
  69. GETCUR: EQU    19H        ;GET CURRENTLY LOGGED IN DISK
  70. GETUSR: EQU     20H             ;GET CURRENT USER
  71. CONIN:    EQU    01H        ;GET A CHARACTER FROM THE CONSOLE
  72. CONOUT: EQU    02H        ;PRINT A CHARACTER TO THE CONSOLE
  73. SETDMA: EQU    1AH        ;SET DMA FUNCTION
  74. GETVER: EQU    0CH        ;GET CPM VERSION #
  75. GETPARM:EQU    1FH        ;GET ADDRESS OF DISK PARAMETERS
  76. PRINT:    EQU    09H        ;PRINT STRING TO CONSOLE
  77.  
  78. ;    ASCII CHARACTERS
  79.  
  80. CR:    EQU    0DH        ;CARRIAGE RETURN
  81. LF:    EQU    0AH        ;LINE FEED
  82.  
  83. ;    I USED MACROS FROM Z80.LIB TO IMPLEMENT SOME Z80 COMMANDS
  84. ;    BECAUSE MAC.COM AND Z80.LIB COME WITH CP/M PLUS.
  85. ;    IF YOU ARE USING ASM.COM OR NOT USING A Z80 PROCESSOR
  86. ;    YOU WILL HAVE TO USE EQUATES OR INSERT INLINE CODE FOR THE
  87. ;    Z80 MACROS - gw
  88.  
  89.     MACLIB    Z80
  90.  
  91.     ORG    100H
  92.  
  93.     JMP    START    
  94.     DB    'U3 ver 1.02'
  95.     DB    'FOR CPM 3.0'
  96.     DB    '12/29/83 - gw'
  97.     DB      'Rev 06/16/84, 12/24/84 - rs'
  98.  
  99.     ORG    200H
  100. START:         
  101.     LXI    SP,START    
  102.     CALL    SETUP
  103.     CALL    RDDIR
  104.     CALL    FINISH    
  105.     JMP    WRMBOOT 
  106. SETUP:
  107.     CALL    CKVERS        ;CHECK FOR CPM 3.0 OR LATER
  108.     CALL    CKNAME        ;CHECK FOR VALID FILE NAME 
  109.     CALL    SETSRCDST    ;SET SOURCE AND DESTINATION USERS
  110.     CALL    SETBIOS     ;COPY BIOS JUMP VECTOR
  111.     RET
  112. RDDIR:         
  113.     CALL    GETDIR        ;READ A DIRECTORY SECTOR
  114.     RZ            ;END OR READ ERROR
  115.     CALL    CKENT        ;CHECK ENTRIES FOR FILE
  116.     JMP    RDDIR    
  117. FINISH:
  118.     MVI    C,DRESET    ;RESET DISK SYSTEM
  119.     CALL    BDOS    
  120.     LDA    NOREC        ;GET NUMBER of DIR FOUND
  121.     ORA    A
  122.     JZ    NOTFND        ;NON FOUND
  123.     LDA    SRCUSR
  124.     CPI    0E5H
  125.     JZ    RECOVMSG
  126.     LXI    D,CHGMSG
  127.     JMP    PRINTMSG
  128. RECOVMSG:
  129.     LXI    D,RECMSG
  130. PRINTMSG:
  131.     CALL    PRTMSG        ;PRINT SUCCESS MESSAGE
  132.     RET
  133. NOTFND:
  134.     LXI    D,FILERR
  135.     CALL    PRTMSG    
  136.     RET
  137. CKVERS:
  138.     MVI    C,GETVER    ;GET CPM VERSION #
  139.     CALL    BDOS    
  140.     CPI    30H        ;IS IT 3.0 OR GREATER
  141.     JC    ONLY30        ;THIS VERSION FOR CPM 3.0 AND LATER
  142.     RET
  143. CKNAME:  
  144.     LDA    DEFFCB        ;GET DRIVE FOR FILE
  145.     ORA    A        ;USE DEFAULT?
  146.     JNZ    NODEF        ;NO CONVERT TO FCB FORMAT
  147.     MVI    C,GETCUR    ;GET CURRENT DISK
  148.     CALL    BDOS    
  149.     INR    A        ;SET UP FOR DECREMENT
  150. NODEF:         
  151.     DCR    A        ;CONVERT TO FCB FORMAT
  152.     STA    DEFFCB        ;SAVE IT
  153.     LDA    DEFFCB+1    ;CHECK FOR NO FILE
  154.     CPI    ' '+1
  155.     RNC            ;RETURN IF OK
  156.     LXI    D,NAMERR    ;PRINT FILE ERROR
  157.     CALL    PRTMSG    
  158.     JMP    WRMBOOT     ;GIVE UP
  159.  
  160. SETSRCDST:
  161.         MVI     C,GETUSR        ;GET USER #
  162.         MVI     E,0FFH          ;GET USER FLAG
  163.         CALL    BDOS
  164.         STA     CURUSR          ;SAVE USER #
  165.     LXI    H,DEFFCB2+1    ;POINT TO 1ST DESTINATION CHAR.
  166.     MVI    A,' '
  167.     CMP    M
  168.     JZ    UNERASE        ;UNERASE IF NO DEST. USER #
  169.     MVI    B,'0'
  170.     MOV    C,M
  171.     INX    H
  172.     CMP    M
  173.     JZ    CHGUSR        ;SINGLE DIGIT ASCII USER # IN BC
  174.     MOV    B,C
  175.     MOV    C,M
  176.     INX    H
  177.     CMP    M
  178.     JNZ    USRERROR    ;TWO DIGIT ASCII USER # IN BC IF ZERO
  179. CHGUSR:
  180.     MVI    D,0        ;INITIAL VALUE FOR HIGH DIGIT
  181.     MVI    A,'0'
  182.     CMP    B
  183.     JZ    CHGUSR1        ;OK IF HIGH DIGIT IS '0'
  184.     INR    A        ;A = '1'
  185.     CMP    B
  186.     JNZ    USRERROR    ;ERROR IF HIGH DIGIT NOT '0' OR '1'
  187.     MVI    D,10        ;VALUE FOR HIGH DIGIT IF '1'
  188. CHGUSR1:
  189.     MVI    A,'0'-1
  190.     CMP    C
  191.     JNC    USRERROR    ;ERROR IF LOW DIGIT < '0'
  192.     MVI    A,'9'
  193.     CMP    C
  194.     JC    USRERROR    ;ERROR IF LOW DIGIT > 9
  195.     MOV    A,C
  196.     SBI    '0'        ;MAKE LOW DIGIT HEX
  197.     ADD    D
  198.     CPI    16
  199.     JNC    USRERROR    ;ERROR IF USER # > 15
  200.     STA    DSTUSR        ;DEST. USER # IN HEX
  201.     LDA    CURUSR
  202.     STA    SRCUSR        ;SOURCE USER # IS CURRENT USER #
  203.     RET
  204. UNERASE:
  205.     LDA    CURUSR        ;PLACE FILE IN CURRENT USER
  206.     STA    DSTUSR
  207.     MVI    A,0E5H        ;E5H = ERASED FILE "USER #"
  208.     STA    SRCUSR
  209.     RET    
  210. USRERROR:
  211.     LXI    D,USRERR
  212.     CALL    PRTMSG
  213.     JMP    WRMBOOT
  214.  
  215. SETBIOS:            ;SET UP LOCAL BIOS JUMP VECTOR
  216.     LXI    B,LOCDMA    ;GET DEFAULT DMA ADDRESS
  217.     SBCD    BCREG
  218.     MVI    A,12        ;SET DMA TO DEFAULT
  219.     STA    FUNC
  220.     CALL    CALLBIOS
  221.     CALL    DSKPRM        ;GET DISK PARAMETERS FROM BDOS 
  222.     LDA    DEFFCB        ;SELECT DRIVE
  223.     MOV    C,A
  224.     MVI    B,0
  225.     MOV    E,B
  226.     SBCD    BCREG        ;BIOS SELDSK FUNCTION
  227.     SDED    DEREG
  228.     MVI    A,9        ;SELDSK
  229.     STA    FUNC
  230.     CALL    CALLBIOS
  231.     MOV    A,H
  232.     ORA    L        ;CHECK FOR DRIVE ERROR
  233.     JZ    NODRV        ;GO REPORT IT
  234.     MOV    E,M        ;GET DPH ADDRESS
  235.     INX    H
  236.     MOV    D,M
  237.     XCHG
  238.     SHLD    DPHADD        ;SAVE ADDRESS TO DPH
  239.     RET
  240. DSKPRM:      
  241.     LDA    DEFFCB
  242.     MOV    E,A
  243.     MVI    C,14        ;SELECT DISK
  244.     CALL    BDOS
  245.     MVI    C,GETPARM    ;GET ADDRESS OF DISK PARMS
  246.     CALL    BDOS
  247.     MOV    E,M        ;GET LOGICAL SPT
  248.     INX    H
  249.     MOV    D,M
  250.     SDED    SPT
  251.     LXI    D,6        ;OFFSET TO DRM (# OF DIRECTORY ENTRIES)
  252.     DAD    D        ;ADD OFFSET
  253.     MOV    E,M        ;GET DRM
  254.     INX    H
  255.     MOV    D,M
  256.     PUSH    D
  257.     PUSH    H
  258.     LXI    D,7        ;POINT TO PSH
  259.     DAD    D
  260.     MOV    A,M        ;GET IT
  261.     STA    PSH        ;SAVE IT
  262.     POP    H
  263.     POP    D
  264.     XCHG
  265.     INX    H        ;ADD 1 FOR TOTAL DIRECTORY ENTRIES
  266.     LDA    PSH
  267.     CPI    3        ;1024 BYTE SECTORS
  268.     CZ    PSH1024
  269.     LDA    PSH
  270.     CPI    2        ;512 BYTE SECTORS
  271.     CZ    PSH512
  272.     LDA    PSH
  273.     CPI    1        ;256 BYTE SECTORS
  274.     CZ    PSH256
  275.     LDA    PSH
  276.     ORA    A        ;128 BYTE SECTORS
  277.     CZ    PSH128    
  278.     MOV    A,L        ;SAVE # OF DIRECTORY SECTORS
  279.     STA    DIRSECTS    
  280.     LHLD    SPT        ;LOGICAL SECTORS PER TRACK    
  281.     LDA    PSH
  282.     CPI    3        ;1024 BYTE SECTORS
  283.     CZ    DIV8
  284.     LDA    PSH
  285.     CPI    2        ;512 BYTE SECTORS
  286.     CZ    DIV4
  287.     LDA    PSH
  288.     CPI    1        ;256 BYTE SECTORS
  289.     CZ    DIV2
  290.     MOV    A,L        ;PHSPT = SPT FOR 128 BYTE SECTORS
  291.     STA    PHSPT        ;PHYSICAL SECTORS PER TRACK
  292.     LXI    H,5        ;ADD OFFSET TO NUMBER OF RESERVED TRACKS
  293.     DAD    D
  294.     MOV    E,M        ;GET NUMBER OF RESERVED TRACKS
  295.     INX    H
  296.     MOV    D,M
  297.     SDED    RESTKS        ;SAVE RESERVED TRACKS FOR LATER
  298.     RET
  299. ONLY30:
  300.     LXI    D,ERR30     ;PRINT MESSAGE FOR CPM PLUS ONLY
  301.     CALL    PRTMSG
  302.     JMP    WRMBOOT
  303. GETDIR:      
  304.     LDA    DIRSECTS    ;GET # OF DIRECTORY SECTORS
  305.     ORA    A
  306.     RZ            ;RETURN IF NONE
  307.     CALL    PHSECTRK    ;COMPUTE CURRENT PHYSICAL SECTOR AND TRACK
  308.     LBCD    RESTKS        ;GET NUMBER OF RESERVED TRACKS IN BC
  309.     MVI    H,0        ;GET PHYSICAL TRACK NUMBER IN HL
  310.     LDA    PHTRK
  311.     MOV    L,A
  312.     DAD    B        ;DIRECTORY TRACK IN HL
  313.     SHLD    BCREG        ;SET TRACK TO DIRECTORY
  314.     MVI    A,10        ;SETTRK
  315.     STA    FUNC
  316.     CALL    CALLBIOS
  317.     LDA    PHSECT        ;GET CURRENT PHYSICAL SECTOR
  318.     MOV    C,A
  319.     CALL    TRNSEC        ;TRANSLATE SECTOR IF NECESSARY
  320.     MVI    B,0
  321.     SBCD    BCREG        ;POINT TO CURRENT SECTOR
  322.     MVI    A,11        ;SETSEC
  323.     STA    FUNC
  324.     CALL    CALLBIOS
  325.     MVI    A,13        ;READ SECTOR OF DIRECTORY
  326.     STA    FUNC
  327.     CALL    CALLBIOS
  328.     ANI    1
  329.     XRI    1
  330.     RET
  331. CKENT:         
  332.     XRA    A        ;ZERO FLAG
  333.     STA    RECFLG
  334.     LDA    DVD        ;GET NUMBER OF DIRECTORY ENTRIES PER SECTOR
  335.     MOV    B,A
  336.     LXI    H,LOCDMA
  337. CKNXT:
  338.     LDA    SRCUSR
  339.     MOV    D,A        ;SOURCE USER # IN D
  340.     MOV    A,M        ;GET BYTE
  341.     CMP    D        ;CHECK FOR SOURCE USER #
  342.     JNZ    GETNXT        ;NOPE SKIP
  343.     PUSH    H
  344.     CALL    CKFIL        ;YES CHECK FOR RECOVERY
  345.     POP    H
  346. RECENT:      
  347.     JNZ    GETNXT
  348.         LDA     DSTUSR
  349.     MOV    M,A        ;RECOVER/CHANGE THE ENTRY
  350.     MVI    A,0FH        ;SET RECOVERED FLAG
  351.     STA    RECFLG
  352.     LDA    NOREC        ;INCREMENT NUMBER OF RECORDS FOUND
  353.     INR    A
  354.     STA    NOREC    
  355. GETNXT:      
  356.     LXI    D,32        ;ADVANCE TO NEXT ENTRY
  357.     DAD    D
  358.     DCR    B        ;DECREMENT COUNTER
  359.     JNZ    CKNXT
  360.     LDA    RECFLG        ;CHECK FOR RECOVERED/CHANGED ENTRY
  361.     ORA    A
  362.     JZ    LOOP        ;NOPE CONTINUE LOOP
  363.                 ;WRITE SECTOR BACK TO DISK IF FILE REC/CHG
  364.     CALL    PHSECTRK    ;COMPUTE CURRENT PHYSICAL SECTOR AND TRACK
  365.     LBCD    RESTKS        ;GET NUMBER OF RESERVED TRACKS IN BC
  366.     MVI    H,0        ;GET PHYSICAL TRACK NUMBER IN HL
  367.     LDA    PHTRK
  368.     MOV    L,A
  369.     DAD    B        ;DIRECTORY TRACK IN HL
  370.     SHLD    BCREG        ;SET TRACK TO DIRECTORY
  371.     MVI    A,10        ;SETTRK
  372.     STA    FUNC
  373.     CALL    CALLBIOS
  374.     LDA    PHSECT        ;GET CURRENT PHYSICAL SECTOR
  375.     MOV    C,A
  376.     CALL    TRNSEC        ;TRANSLATE SECTOR
  377.     MVI    B,0
  378.     SBCD    BCREG        ;POINT TO CURRENT SECTOR
  379.     MVI    A,11        ;SETSEC
  380.     STA    FUNC
  381.     CALL    CALLBIOS
  382.     LXI    B,1        ;NONE DEFERRED WRITE
  383.     SBCD    BCREG
  384.     MVI    A,14        ;WRITE
  385.     STA    FUNC
  386.     CALL    CALLBIOS    ;UPDATE DIRECTORY
  387.     ORA    A        ;CHECK FOR WRITE ERROR
  388.     JNZ    WRTERROR    ;REPORT ERROR
  389. LOOP:
  390.     LDA    DIRSECTS    ;DECREMENT DIRECTORY SECTORS
  391.     DCR    A
  392.     STA    DIRSECTS
  393.     LDA    SECTOR        ;INCREMENT SECTOR
  394.     INR    A
  395.     STA    SECTOR    
  396.     RET
  397. CKFIL:
  398.     INX    H        ;CHECK DELETED ENTRY FOR RECOVERY
  399.     LXI    D,DEFFCB+1    ;POINT AT FILE TO BE RECOVERED
  400.     XCHG
  401.     MVI    C,11        ;LOOK AT 11 CHARACTERS
  402. CMPFIL:
  403.     MVI    A,'?'        ;CHECK TO SEE IF SPEC IS AMBIGUOUS
  404.     CMP    M
  405.     JZ    NXTCHR
  406.     LDAX    D        ;GET CHARACTER IN NAME
  407.     ANI    7FH        ;TURN OFF HIGH BIT
  408.     CMP    M        ;ARE THEY EQUAL?
  409.     RNZ            ;NOPE GO GET ANOTHER ENTRY
  410. NXTCHR:
  411.     INX    D        ;YES, CONTINUE
  412.     INX    H
  413.     DCR    C
  414.     JNZ    CMPFIL
  415.     RET
  416. PSH1024:
  417.     MVI    A,32        ;SET NUMBER OF DIRECTORY ENTRIES PER SECTOR
  418.     STA    DVD
  419.     JMP    DIV32
  420. PSH512:
  421.     MVI    A,16        ;SET NUMBER OF DIRECTORY ENTRIES PER SECTOR
  422.     STA    DVD
  423.     JMP    DIV16
  424. PSH256:
  425.     MVI    A,8        ;SET NUMBER OF DIRECTORY ENTRIES PER SECTOR
  426.     STA    DVD
  427.     JMP    DIV8
  428. PSH128:
  429.     MVI    A,4        ;SET NUMBER OF DIRECTORY ENTRIES PER SECTOR
  430.     STA    DVD
  431.     JMP    DIV4
  432.  
  433. DIV32:                ;DIVIDE HL BY 32
  434.     CALL    DIV2
  435. DIV16:                ;DIVIDE HL BY 32
  436.     CALL    DIV2
  437. DIV8:                ;DIVIDE HL BY 32
  438.     CALL    DIV2
  439. DIV4:                ;DIVIDE HL BY 32
  440.     CALL    DIV2
  441. DIV2:                ;DIVIDE HL BY 2 ROUTINE
  442.     XRA    A        ;CLEAR CARRY
  443.     MOV    A,H        ;GET HIGH ORDER BYTE
  444.     RAR            ;SHIFT RIGHT FOR A DIVIDE BY 2
  445.     MOV    H,A
  446.     MOV    A,L        ;GET LOW ORDER BYTE
  447.     RAR            ;SHIFT RIGHT FOR A DIVIDE BY 2
  448.     MOV    L,A
  449.     RET
  450.  
  451. PHSECTRK:
  452.     MVI    C,0        ;SET PHTRK TO 0
  453.     LDA    PHSPT
  454.     MOV    B,A        ;PHYS SPT IN B
  455.     LDA    SECTOR        ;LOGICAL DIRECTORY SECTOR
  456. CKPHTRK:
  457.     CMP    B        ;COMPUTE PHSECT = SECTORS MOD PHSPT
  458.     JC    STSECTRK    ;AND PHTRK = (SECTORS - PHSECT)/PHSPT
  459.     SUB    B
  460.     INR    C
  461.     JMP    CKPHTRK
  462. STSECTRK:
  463.     STA    PHSECT
  464.     MOV    A,C
  465.     STA    PHTRK
  466.     RET
  467.  
  468. PRTMSG:      
  469.     MVI    C,PRINT     ;PRINT STRING TO CONSOLE
  470.     JMP    BDOS    
  471. NODRV:                ;PRINT DRIVE ERROR MESSAGE
  472.     LXI    D,DRVERR
  473.     CALL    PRTMSG    
  474.     JMP    WRMBOOT 
  475. WRTERROR:            ;PRINT WRITE ERROR MESSAGE
  476.     LXI    D,WRTERR
  477.     CALL    PRTMSG    
  478.     JMP    WRMBOOT 
  479. TRNSEC:      
  480.     LHLD    DPHADD        ;GET TRANSLATE TABLE ADDRESS
  481.     XCHG
  482.     SBCD    BCREG
  483.     SDED    DEREG
  484.     MVI    A,16        ;SECTRAN
  485.     STA    FUNC
  486.     CALL    CALLBIOS
  487.     MOV    C,L
  488.     RET
  489. CALLBIOS:            ;CPM 3.0 DIRECT BIOS CALL
  490.     MVI    C,DIRCALL
  491.     LXI    D,FUN50
  492.     CALL    BDOS
  493.     RET
  494. FUN50:
  495. FUNC:    DS    1
  496. AREG:    DS    1
  497. BCREG:    DS    2
  498. DEREG:    DS    2
  499. HLREG:    DS    2
  500.  
  501. DPHADD:
  502.     DS    2
  503. DIRSECTS:
  504.     DS    1
  505. RESTKS: DS    2
  506. SECTOR: DB    0
  507. NOREC:    DB    0
  508. RECFLG: DB    0
  509. PSH:    DS    1
  510. DVD:    DB    0
  511. CURUSR: DS      1
  512. SPT:    DS    2
  513. PHSPT:    DS    1
  514. PHSECT:    DS    1
  515. PHTRK:    DS    1
  516. SRCUSR:    DS    1
  517. DSTUSR:    DS    1
  518. WRTERR:      
  519.     DB    CR,LF,'Error occurred during disk Write - ABORT$'
  520. DRVERR:      
  521.     DB    CR,LF,'Specified an illegal disk drive - ABORT$'
  522. RECMSG:      
  523.     DB    CR,LF,'File recovered.$'
  524. CHGMSG:
  525.     DB    CR,LF,'File user area changed.$'
  526. NAMERR:      
  527.     DB    CR,LF,'No File Name specified - ABORT$'
  528. FILERR:      
  529.     DB    CR,LF,'File NOT found$'
  530. USRERR:
  531.     DB    CR,LF,'Invalid User Number - ABORT$'
  532. ERR30:
  533.     DB    CR,LF,'THIS VERSION OF U3 ONLY WORKS'
  534.     DB    CR,LF,'FOR CPM 3.0 OR LATER',CR,LF,'$'
  535. LOCDMA:
  536.     DS    1024        ;LOCAL DMA BUFFER
  537.  
  538.     END
  539.