home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / ZCPR2 / UNERA.AQM / UNERA.ASM
Assembly Source File  |  2000-06-30  |  17KB  |  874 lines

  1. ; PROGRAM:  UNERA for ZCPR2
  2. ; AUTHOR:  RICHARD CONN
  3. ; VERSION:  2.2
  4. ; DATE:  25 July 83
  5. ; PREVIOUS VERSIONS: 2.1 (24 JULY 83), 2.0 (23 JULY 83)
  6. ; DERIVATION:  UNERA BY GENE COTTON
  7.  
  8. VERS    EQU    22        ;version number
  9.  
  10. ;
  11. ; PROGRAM TO RECOVER ERASED FILES, BY GENE COTTON
  12. ;
  13. ; From Interface Age December 1981 pg 146
  14. ;
  15. ; v2.0 - 07/23/83  Modified to be consistent in the ZCPR2 tool set.
  16. ;                    - Rick Conn
  17. ;
  18. ; Contributors:
  19. ;    v1.6 - Dave Rand
  20. ;    v1.5 - Irv Hoff
  21. ;    v1.4 - Paul Traina
  22. ;    v1.3 - Irv Hoff
  23. ;    v1.2 - Charlie Strom
  24. ;    v1.1 - Bruce Blakeslee
  25. ;     v1.0 - Retyped from Interface Age (Dec 81).  - Henry Rothberg
  26. ;
  27.  
  28. ;
  29. ; System equates:
  30. ;
  31. BOOT    EQU    0000H        ;CP/M WARM BOOT JUMP VECTOR
  32. BDOS    EQU    BOOT+05H    ;CP/M BDOS CALL JUMP VECTOR
  33. TBUFF    EQU    BOOT+80H    ;DISK I/O BUFFER
  34. FCB    EQU    BOOT+5CH    ;DEFAULT FILE CONTROL BLOCK
  35. FCB2    EQU    BOOT+6CH    ;SECONDARY FILE CONTROL AREA
  36. CR    EQU    'M'-'@'        ;CTL-M FOR CARRIAGE RETURN
  37. LF    EQU    'J'-'@'        ;CTL-J FOR LINE FEED
  38. CTRLC    EQU    'C'-'@'        ;ABORT
  39.  
  40. ;
  41. ;    ZCPR2 and its utilities, including this one, are released
  42. ; to the public domain.  Anyone who wishes to USE them may do so with
  43. ; no strings attached.  The author assumes no responsibility or
  44. ; liability for the use of ZCPR2 and its utilities.
  45. ;
  46.  
  47. ;
  48. ;  Branch to Start of Program
  49. ;
  50.     ORG    BOOT+100H
  51.     JMP    START
  52.  
  53. ;
  54. ;******************************************************************
  55. ;
  56. ;  SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format
  57. ;
  58. ;    This data block precisely defines the data format for
  59. ; initial features of a ZCPR2 system which are required for proper
  60. ; initialization of the ZCPR2-Specific Routines in SYSLIB.
  61. ;
  62.  
  63. ;
  64. ;  EXTERNAL PATH DATA
  65. ;
  66. EPAVAIL:
  67.     DB    0FFH    ; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES)
  68. EPADR:
  69.     DW    40H    ; ADDRESS OF EXTERNAL PATH IF AVAILABLE
  70.  
  71. ;
  72. ;  INTERNAL PATH DATA
  73. ;
  74. INTPATH:
  75.     DB    0,0    ; DISK, USER FOR FIRST PATH ELEMENT
  76.             ; DISK = 1 FOR A, '$' FOR CURRENT
  77.             ; USER = NUMBER, '$' FOR CURRENT
  78.     DB    0,0
  79.     DB    0,0
  80.     DB    0,0
  81.     DB    0,0
  82.     DB    0,0
  83.     DB    0,0
  84.     DB    0,0    ; DISK, USER FOR 8TH PATH ELEMENT
  85.     DB    0    ; END OF PATH
  86.  
  87. ;
  88. ;  MULTIPLE COMMAND LINE BUFFER DATA
  89. ;
  90. MCAVAIL:
  91.     DB    0FFH    ; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE?
  92. MCADR:
  93.     DW    0FF00H    ; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE
  94.  
  95. ;
  96. ;  DISK/USER LIMITS
  97. ;
  98. MDISK:
  99.     DB    4    ; MAXIMUM NUMBER OF DISKS
  100. MUSER:
  101.     DB    31    ; MAXIMUM USER NUMBER
  102.  
  103. ;
  104. ;  FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK
  105. ;
  106. DOK:
  107.     DB    0FFH    ; ALLOW DISK CHANGE? (0=NO, 0FFH=YES)
  108. UOK:
  109.     DB    0FFH    ; ALLOW USER CHANGE? (0=NO, 0FFH=YES)
  110.  
  111. ;
  112. ;  PRIVILEGED USER DATA
  113. ;
  114. PUSER:
  115.     DB    10    ; BEGINNING OF PRIVILEGED USER AREAS
  116. PPASS:
  117.     DB    'chdir',0    ; PASSWORD FOR MOVING INTO PRIV USER AREAS
  118.     DS    41-($-PPASS)    ; 40 CHARS MAX IN BUFFER + 1 for ending NULL
  119.  
  120. ;
  121. ;  CURRENT USER/DISK INDICATOR
  122. ;
  123. CINDIC:
  124.     DB    '$'    ; USUAL VALUE (FOR PATH EXPRESSIONS)
  125.  
  126. ;
  127. ;  DMA ADDRESS FOR DISK TRANSFERS
  128. ;
  129. DMADR:
  130.     DW    80H    ; TBUFF AREA
  131.  
  132. ;
  133. ;  NAMED DIRECTORY INFORMATION
  134. ;
  135. NDRADR:
  136.     DW    00000H    ; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY
  137. NDNAMES:
  138.     DB    64    ; MAX NUMBER OF DIRECTORY NAMES
  139. DNFILE:
  140.     DB    'NAMES   '    ; NAME OF DISK NAME FILE
  141.     DB    'DIR'        ; TYPE OF DISK NAME FILE
  142.  
  143. ;
  144. ;  REQUIREMENTS FLAGS
  145. ;
  146. EPREQD:
  147.     DB    000H    ; EXTERNAL PATH?
  148. MCREQD:
  149.     DB    000H    ; MULTIPLE COMMAND LINE?
  150. MXREQD:
  151.     DB    000H    ; MAX USER/DISK?
  152. UDREQD:
  153.     DB    000H    ; ALLOW USER/DISK CHANGE?
  154. PUREQD:
  155.     DB    000H    ; PRIVILEGED USER?
  156. CDREQD:
  157.     DB    000H    ; CURRENT INDIC AND DMA?
  158. NDREQD:
  159.     DB    000H    ; NAMED DIRECTORIES?
  160. Z2CLASS:
  161.     DB    0    ; CLASS 0
  162.     DB    'ZCPR2'
  163.     DS    10    ; RESERVED
  164.  
  165. ;
  166. ;  END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA
  167. ;
  168. ;******************************************************************
  169. ;
  170.  
  171. ;
  172. ;  Start of Program
  173. ;
  174. START:
  175. ;
  176.     LXI    H,0        ;SAVE STACK PTR
  177.     DAD    SP
  178.     SHLD    STACK
  179.     LXI    SP,STACK    ;SET STACK POINTER
  180.     CALL     HELLO        ;SIGN ON MESSAGE
  181.     CALL    HELPCHK        ;CHECK FOR AND PRINT HELP MESSAGE
  182.     CALL    PCHECK        ;CHECK PARAMETERS
  183.     LDA    FNCOUNT        ;NUMBER OF FILES SPECIFIED
  184.     ORA    A        ;0=NONE
  185.     CNZ    TRYFIX        ;DO THE RECOVERY
  186.     CALL    BYE        ;SIGN OFF MESSAGE
  187.     JMP    BOOT        ;RETURN TO CP/M
  188. ;
  189. ; ** Main Routines **
  190. ;
  191.  
  192. ;
  193. ; SAY WHO WE ARE
  194. ;
  195. HELLO:
  196.     CALL    PRINT
  197.     DB    'UNERA, Version '
  198.     DB    (VERS/10)+'0','.',(VERS MOD 10)+'0',0
  199.     RET
  200. ;
  201. ; CHECK FOR VALID PARAMETERS AND SAY WHICH CP?M VERSION
  202. ;
  203. PCHECK:
  204.     CALL    OPTCHK        ;CHECK FOR OPTIONS AND SET FLAGS
  205.     CALL    FCBCHK        ;MAKE SURE FILE SPECIFIED
  206.     CALL    CPMCHK        ;ESTABLISH CP/M PARAMETERS
  207.     CALL    PUSCHK        ;CHECK IF USER WANTS TO CHANGE DISK
  208.     RET
  209. ;
  210. ; LOOK THROUGH DIRECTORY
  211. ;
  212. TRYFIX:
  213.     CALL    NXTSEC        ;GET A DIRECTORY SECTOR
  214.     RZ            ;RETURNS ZERO FLAG IF NO MORE
  215.     CALL    CHKENT        ;CHECK IT OUT AND MAYBE FIX
  216.     JMP    TRYFIX        ;KEEP IT UP TILL DONE
  217. ;
  218. ; SIGN OFF AND RESET SYSTEM
  219. ;
  220. BYE:
  221.     MVI    C,13        ;SYSTEM RESET
  222.     CALL    BDOS
  223.     LDA    LISTFL        ;LIST ONLY?
  224.     ORA    A        ;0=NO
  225.     JNZ    PRNF
  226.     LDA    FIXCNT        ;CHECK FOR ACTIVITY
  227.     ORA    A
  228.     JZ    PRNF        ;SAY NONE FOUND
  229.     CALL    PRINT
  230.     DB    CR,LF,'File(s) Recovered - DOUBLE CHECK Before Using',0
  231.     RET
  232. PRNF:
  233.     CALL    PRINT
  234.     DB    CR,LF,'NO Files Recovered',0
  235.     RET
  236. ;
  237. ; CHECKS FOR P AND 0 OPTIONS IN COMMAND LINE
  238. ;
  239. OPTCHK:
  240.     XRA    A    ;TURN OFF FLAGS
  241.     STA    CURUSR
  242.     STA    PAUSE
  243.     STA    FIXCNT
  244.     STA    LISTFL
  245.     STA    FNCOUNT    ;NO FILE NAMES
  246.     LXI    H,1    ;SET SECTOR 1
  247.     SHLD    SECTOR
  248.     LXI    H,TBUFF    ;SCAN THRU TBUFF, BUILDING A FILE NAME TABLE
  249.     MOV    A,M    ;GET CHAR COUNT
  250.     INX    H    ;PT TO FIRST CHAR
  251.     PUSH    H    ;SAVE PTR
  252.     ADD    L    ;PT TO AFTER LAST CHAR
  253.     MOV    L,A
  254.     MVI    M,0    ;STORE ENDING ZERO
  255.     POP    H    ;GET PTR TO FIRST CHAR
  256.     CALL    SBLANK    ;SKIP BLANKS
  257.     LXI    D,FNTAB    ;PT TO TABLE
  258. FNLOOP:
  259.     PUSH    D    ;SAVE TABLE PTR
  260.     CALL    GETFN    ;EXTRACT FILE NAME
  261.     POP    D
  262.     PUSH    H
  263.     LXI    H,11    ;PT TO NEXT TABLE ENTRY
  264.     DAD    D
  265.     XCHG
  266.     POP    H
  267.     LDA    FNCOUNT    ;INCREMENT COUNT
  268.     INR    A
  269.     STA    FNCOUNT
  270.     MOV    A,M    ;GET TERMINATING CHAR
  271.     INX    H    ;PT TO NEXT
  272.     CPI    ','    ;ANOTHER FOLLOWS?
  273.     JZ    FNLOOP
  274.     DCX    H    ;POINT BACK TO DELIM
  275.     CALL    SBLANK    ;SKIP TO NON-BLANK
  276. OPTCK1:
  277.     MOV    A,M    ;GET OPTION
  278.     CALL    DELCHK    ;DONE IF DELIM
  279.     RZ
  280.     CPI    'L'    ;LIST ONLY?
  281.     JZ    OPTCKL
  282.     CPI    'P'    ;PAUSE?
  283.     JZ    OPTCKP
  284.     CPI    'Z'    ;USER 0?
  285.     JZ    OPTCKZ
  286.     CALL    PRINT
  287.     DB    CR,LF,'Invalid Option -- ',0
  288.     MOV    A,M
  289.     CALL    TYPE
  290.     JMP    HCK1
  291. OPTCKL:
  292.     MVI    A,0FFH    ;SET FLAG
  293.     STA    LISTFL
  294.     INX    H    ;PT TO NEXT
  295.     JMP    OPTCK1
  296. OPTCKP:
  297.     MVI    A,0FFH    ;SET FLAG
  298.     STA    PAUSE
  299.     INX    H    ;PT TO NEXT
  300.     JMP    OPTCK1
  301. OPTCKZ:
  302.     MVI    A,0FFH    ;SET FLAG
  303.     STA    CURUSR
  304.     INX    H
  305.     JMP    OPTCK1
  306. GETFN:
  307.     PUSH    D    ;FILL TARGET FCB
  308.     MVI    B,11    ;11 BYTES
  309.     MVI    A,' '    ;SPACE FILL
  310. GETFN0:
  311.     STAX    D    ;PUT SPACE
  312.     INX    D
  313.     DCR    B
  314.     JNZ    GETFN0
  315.     POP    D    ;PT TO ENTRY AGAIN
  316.     CALL    SCANCOL    ;SCAN FOR COLON
  317.     MVI    B,8    ;8 CHARS MAX
  318.     CALL    GETFN1    ;GET AND FILL ENTRY
  319.     MOV    A,M    ;GET CHAR
  320.     CPI    '.'    ;DELIM?
  321.     RNZ        ;DONE
  322.     INX    H    ;PT TO AFTER PERIOD
  323.     MVI    B,3    ;3 CHARS MAX AND DO IT AGAIN
  324. GETFN1:
  325.     MOV    A,M    ;GET CHAR
  326.     CPI    '.'    ;END OF FIELD?
  327.     JZ    GETFN3
  328.     CALL    DELCHK    ;CHECK DELIMITER
  329.     RZ
  330.     CPI    '*'    ;WILD?
  331.     JZ    GETFNQ
  332.     STAX    D    ;STORE CHAR
  333.     INX    H    ;PT TO NEXT
  334.     INX    D
  335.     DCR    B    ;COUNT DOWN
  336.     JNZ    GETFN1
  337. GETFN2:
  338.     MOV    A,M    ;FLUSH CHARS TO DELIM
  339.     CALL    DELCHK    ;CHECK FOR DELIMITER
  340.     RZ
  341.     INX    H    ;PT TO NEXT
  342.     JMP    GETFN2
  343. GETFN3:
  344.     INX    D    ;PT TO AFTER FIELD
  345.     DCR    B    ;COUNT DOWN
  346.     JNZ    GETFN3
  347.     RET
  348. GETFNQ:
  349.     MVI    A,'?'    ;FILL WITH QUESTION MARKS
  350.     STAX    D
  351.     INX    D
  352.     DCR    B
  353.     JNZ    GETFNQ
  354.     JMP    GETFN2    ;SKIP TO DELIM
  355. DELCHK:
  356.     ORA    A    ;END OF LINE?
  357.     RZ
  358.     CPI    '.'    ;END OF FIELD?
  359.     RZ
  360.     CPI    ','    ;END OF ENTRY?
  361.     RZ
  362.     CPI    ' '
  363.     RET
  364. SBLANK:
  365.     MOV    A,M    ;SKIP TO NON-BLANK
  366.     CPI    ' '
  367.     RNZ
  368.     INX    H
  369.     JMP    SBLANK
  370. SCANCOL:
  371.     PUSH    D    ;SAVE TABLE PTR
  372.     PUSH    H    ;SAVE PTR
  373. SCOL1:
  374.     MOV    A,M    ;GET CHAR
  375.     INX    H    ;PT TO NEXT
  376.     CPI    ':'    ;COLON?
  377.     JZ    SCOLX
  378.     CALL    DELCHK    ;CHECK FOR DELIMITER
  379.     JNZ    SCOL1
  380. SCOL2:
  381.     POP    H    ;RESTORE
  382.     POP    D
  383.     RET
  384. SCOLX:
  385.     XCHG        ;DE PTS TO AFTER COLON
  386.     POP    H    ;GET OLD PTR
  387.     XCHG        ;REPLACE IT
  388.     POP    D    ;GET TABLE PTR
  389.     RET
  390. ;
  391. ; CHECKS THE CURRENT 4 DIRECTORY ENTRIES AGAINST ARGUMENT
  392. ; IF MATCH, REWRITES SECTOR WITH REACTIVATED 1ST BYTES
  393. ;
  394. CHKENT:
  395.     XRA    A        ;ASSUME NO REWRITE
  396.     STA    REWRT
  397.     MVI    B,4        ;NUMBER OF ENTRIES PER SECTOR
  398.     LXI     H,TBUFF        ;BEGINNING OF BUFFER
  399. CKLUP:
  400.     PUSH    B
  401.     MOV    A,M
  402.     CPI    0E5H        ;CHECK FOR UNUSED
  403.     JNZ    CKINC
  404.     LXI    D,FNTAB        ;PT TO POTENTIAL FILES
  405.     LDA    FNCOUNT        ;NUMBER OF ENTRIES TO COUNT
  406.     MOV    B,A        ;... IN B
  407. CKLUP0:
  408.     PUSH     H        ;SAVE BEGINNING ADDRESS
  409.     PUSH    D        ;SAVE PTR
  410.     PUSH    B        ;SET NAME COUNT
  411.     CALL    COMPAR        ;COMPARE WITH ARGUMENT
  412.     POP    B        ;GET NAME COUNT
  413.     POP    D        ;GET PTR
  414.     POP    H
  415.     JZ    CKLUP1        ;MATCH!
  416.     PUSH    H        ;SAVE PTR
  417.     LXI    H,11        ;PT TO NEXT ENTRY
  418.     DAD    D
  419.     XCHG
  420.     POP    H
  421.     DCR    B        ;COUNT DOWN
  422.     JNZ    CKLUP0
  423.     JMP    CKINC
  424. CKLUP1:
  425.     LDA    LISTFL        ;LIST ONLY?
  426.     ORA    A        ;0=NO
  427.     JNZ    CKINC
  428.     MVI    M,0        ;SET USER 0
  429.     LDA    CURUSR        ;CHECK FOR CURRENT USER
  430.     CPI    0FFH
  431.     JZ    CKLUP2
  432.     PUSH    H        ;SAVE HL
  433.     MVI    E,0FFH        ;GET USER VALUE
  434.     MVI    C,32        ;GET USER AREA FUNCTION
  435.     CALL    BDOS        ;BDOS RETURNS CURRENT AREA IN 'A' REG.
  436.     POP    H        ;RESTORE HL
  437.     MOV    M,A        ;POKE IN CURRENT USER AREA
  438. CKLUP2:
  439.     MVI    A,0FH        ;SAY NEED REWRITE
  440.     STA    REWRT
  441.     MVI    A,0FFH        ;SET COUNT FLAG
  442.     STA    FIXCNT
  443. CKINC:
  444.     POP    B
  445.     LXI    D,32        ;LENGTH OF ENTRY
  446.     DAD    D
  447.     DCR    B
  448.     JNZ    CKLUP
  449.     LDA    REWRT        ;SEE IF NEED REWRITE
  450.     ORA    A
  451.     JZ    CKDONE        ;NO - DONE
  452. ;
  453. ; WRITE THE DIRECTORY SECTOR BACK TO THE DISK
  454. ;
  455.     LHLD    TRACK        ;SET TRACK
  456.     MOV    C,L
  457.     MOV    B,H
  458.     CALL    SETTRK
  459.     LHLD    SECTOR        ;SET SECTOR
  460.     MOV    B,H
  461.     MOV    C,L
  462.     CALL    TRNSLT
  463.     CALL     SETSEC
  464.     CALL    WRITE        ;WRITE THE SECTOR BACK
  465.     ORA    A
  466.     JNZ    ERRWRT        ;ABORT IF ERROR
  467. CKDONE:
  468.     LHLD    DIRMAX
  469.     DCX    H        ;REDUCE SECTORS LEFT
  470.     SHLD    DIRMAX
  471.     LHLD    SECTOR        ;POINT TO NEXT SECTOR
  472.     INX    H
  473.     SHLD    SECTOR
  474.     XCHG
  475.     LHLD    MAXSEC        ;REACHED LIMIT?
  476.     INX    H        ;ONE MORE
  477.     MOV    A,H        ;CHECK HIGH
  478.     CMP    D
  479.     RNZ
  480.     MOV    A,L        ;CHECK LOW
  481.     CMP    E
  482.     RNZ
  483.     LHLD    TRACK        ;NEXT TRACK
  484.     INX    H
  485.     SHLD    TRACK
  486.     LXI    H,1        ;FIRST SECTOR OF NEXT TRACK
  487.     SHLD    SECTOR
  488.     RET
  489. ;
  490. ; COMPARE 11 BYTES OF DIRECTORY ENTRY AGAINST ARGUMENT
  491. ;
  492. COMPAR:
  493.     SHLD    TEMP        ;Hold pointer in case of match
  494.     INX    H
  495.     XCHG
  496.     MVI    C,11
  497. CMPR1:
  498.     LDAX    D        ;GET DIRECTORY ENTRY CHARACTER
  499.     ANI    7FH        ;STRIP ANY FLAGS
  500.     CMP    M
  501.     JNZ    CMPCKAM
  502. CMPR2:
  503.     INX    D
  504.     INX    H        ;BUMP TO NEXT CHARACTER
  505.     DCR    C
  506.     JNZ    CMPR1        ;LOOP FOR 11 CHARACTERS
  507.     LDA    FIXCNT        ;CHECK FLAG
  508.     ORA    A        ;0=FIRST TIME
  509.     CZ    PRFIX
  510.     LHLD    TEMP
  511.     CALL    PRINTFCB
  512.     XRA    A
  513.     RET            ;RETURNS 'ZERO' FLAG SET FOR MATCH
  514. PRFIX:
  515.     LDA    LISTFL    ;LIST ONLY?
  516.     ORA    A    ;0=NO
  517.     JNZ    PRFIX1
  518.     CALL    PRINT
  519.     DB    CR,LF,'File(s) Recovered --',0
  520.     RET
  521. PRFIX1:
  522.     MVI    A,0FFH    ;DON'T PRINT THIS AGAIN
  523.     STA    FIXCNT
  524.     CALL    PRINT
  525.     DB    CR,LF,'Erased File(s) --',0
  526.     RET
  527. CMPCKAM:
  528.     LDAX    D
  529.     CPI    0E5H        ;NON-ALLOCATED ENTRY?
  530.     JZ    SKIP
  531.     MOV    A,M
  532.     CPI    '?'
  533.     RNZ
  534.     JMP    CMPR2
  535. SKIP:
  536.     ORA    A
  537.     RET            ;SET NZ FLAG
  538. ;
  539. ; CHECK FOR CP/M VERSION AND SET THINGS
  540. ;
  541. CPMCHK:
  542.     LXI    D,80H        ;SET DMA TO TBUFF
  543.     MVI    C,26
  544.     CALL    BDOS
  545.     MVI    C,12        ;VERSION NUMBER REQUEST
  546.     CALL     BDOS
  547.     CPI    20H        ;EARLIER THAN 2.2?
  548.     JC    VERERR
  549.     CALL    CPM22        ;IF 2.2 GO SET THINGS
  550.     CALL    GTBIOS        ;ESTABLISH BIOS JUMP VECTOR
  551. ;
  552. ; SELECT DISK AND SETUP DISK PARAMETER HEADER
  553. ;
  554.     LDA    FCB        ;GET THE DISK
  555.     MOV    E,A
  556.     MVI    C,14
  557.     CALL    BDOS
  558.     LDA    FCB
  559.     MOV    C,A
  560.     MVI    B,0
  561.     CALL    SELDSK        ;MAKE SURE DRIVE IS
  562.     MOV    A,H        ;  SELECTED
  563.     ORA    L
  564.     JZ    ILDISK
  565.     MOV    E,M        ;GET THE ADDRESS
  566.     INX    H        ;  OF THE XLTO
  567.     MOV    D,M    
  568.     XCHG
  569.     SHLD    DPH        ;SAVE THE ADDRESS
  570.     RET
  571. VERERR:
  572.     CALL    PRINT
  573.     DB    CR,LF,'ABORT - Prior to CP/M 2.x',0
  574.     JMP    BOOT
  575. ;
  576. ; IF CP/M 2.2 DETERMINE NUMBER OF DIRECTORY ENTRIES ALSO
  577. ;
  578. CPM22:
  579.     MVI    C,31        ;GET DISK PARAMETERS ADDRESS
  580.     CALL    BDOS        ;DPB ADDRESS IN 'HL' ON RETURN
  581.     MOV    E,M        ;NUMBER OF SECTORS/TRACK
  582.     INX    H        ;AS 2-BYTE QUANTITY IN DE
  583.     MOV    D,M
  584.     INX    H
  585.     XCHG
  586.     SHLD    MAXSEC        ;SET MAX SECTORS/TRACK
  587.     XCHG
  588.     INX    H
  589.     INX    H
  590.     MOV    A,M        ;GET EXM
  591.     STA    EXTENT
  592.     INX    H        ;PT TO DRM
  593.     INX    H
  594.     INX    H
  595.     MOV    E,M        ;GET NUMBER OF
  596.     INX    H        ;  DIRECTORY ENTRIES
  597.     MOV    D,M
  598.     XCHG
  599.     INX    H        ;ACCOUNT FOR - 1
  600.     CALL    SHFHL2        ;SHIFT 'HL' RIGHT 2
  601.     SHLD    DIRMAX        ;SAVE NUMBER DIRECTORY SECTORS
  602.     LXI    H,5        ;NOW POINT TO SYSTEM
  603.     DAD    D        ;  TRACK OFFSET
  604.     MOV    A,M        ;PICK UP NUMBER OF
  605.     INX    H
  606.     MOV    H,M
  607.     MOV    L,A
  608.     SHLD    TRACK
  609.     RET
  610. ;
  611. ; ERROR OCCURED DURING DISK WRITE - ABORT
  612. ;
  613. ERRWRT:
  614.     CALL    PRINT
  615.     DB    CR,LF,'ABORT - Error During Disk Write',0
  616.     JMP    BOOT        ;ABORT
  617. ;
  618. ; MAKE SURE A LEGAL DISK IS SPECIFIED AND CHECK FOR HELP
  619. ;
  620. FCBCHK:
  621.     LDA    FCB        ;GET DRIVE SPECIFICATION
  622.     ORA     A        ;SEE IF DEFAULT
  623.     JNZ    FCBCK1        ;NO, GO CHECK FILENAME
  624.     MVI    C,25        ;ASK FOR CURRENT DRIVE
  625.     CALL    BDOS
  626.     INR    A        ;OFFSET FOR NEXT INSTRUCTION
  627. FCBCK1:
  628.     DCR    A        ;CURRENT DRIVE NUMBER
  629.     STA    FCB        ;SAVE IT
  630.     RET
  631. ;
  632. ;  CHECK FOR HELP REQUEST
  633. ;
  634. HELPCHK:
  635.     LDA    FCB+1        ;GET 1ST BYTE OF FILENAME
  636.     CPI    '/'        ;HELP?
  637.     JZ    HCK1
  638.     CPI    ' '        ;MAKE SURE IT IS NON-BLANK
  639.     RNZ            ;OK - KEEP GOING
  640. ;    
  641. ; IF NO FILE NAME IS SPECIFIED, ABORT WITH NOTICE
  642. ;
  643. HCK1:
  644.     CALL     PRINT
  645.     DB    CR,LF
  646.     DB    CR,LF,'    UNERA is used to Unerase Files.  It must be used'
  647.     DB    CR,LF,'IMMEDIATELY after the file is erased (before any'
  648.     DB    CR,LF,'new files are created).  It is invoked by a command'
  649.     DB    CR,LF,'of the form:'
  650.     DB    CR,LF,'        UNERA afn,afn,afn,... o'
  651.     DB    CR,LF,'where "afn" is an ambigous file name which'
  652.     DB    CR,LF,'specifies the files to be unerased and "o" is'
  653.     DB    CR,LF,'none or more of the following options:'
  654.     DB    CR,LF,'        L - List Erased Files Only'
  655.     DB    CR,LF,'        P - Pause for disk change'
  656.     DB    CR,LF,'        Z - Place file in User 0 '
  657.     DB    '(default is current)'
  658.     DB    CR,LF,'    The forms:'
  659.     DB    CR,LF,'        UNERA or UNERA //'
  660.     DB    CR,LF,'present this Help message.'
  661.     DB    CR,LF,'    Drive prefixes (DU:) are ignored.'
  662.     DB    CR,LF,0
  663. CLEANRET:
  664.     LHLD    STACK        ;QUIET RETURN
  665.     SPHL
  666.     RET
  667. ;
  668. ; GET BIOS JUMPS VECTORS FOR EASY REFERENCE
  669. ;
  670. GTBIOS:
  671.     LHLD    BOOT+1        ;POINTS TO BIOS JUMP TABLE+3
  672.     LXI    D,WBOOT        ;WHERE WE WILL KEEP A COPY
  673.     MVI    B,16*3        ;MOVE 48 BYTES AND FALL THRU TO MOVE
  674. ;
  675. ; GENERAL PURPOSE MOVE ROUTINE
  676. ; FROM 'HL' TO 'DE' FOR COUNT OF 8
  677. ;
  678. MOVE:
  679.     MOV    A,M        ;GET A BYTE
  680.     STAX    D        ;PUT A BYTE
  681.     INX    D        ;INCREMENT TO NEXT
  682.     INX    H
  683.     DCR    B        ;COUNT DOWN
  684.     JNZ    MOVE
  685.     RET
  686. ;
  687. ;SPECIFIED AN ILLEGAL DISK DRIVE - ABORT
  688. ;
  689. ILDISK:
  690.     CALL    PRINT
  691.     DB    CR,LF,'ABORT - Illegal Disk Requested',0
  692.     JMP    BOOT        ;ABORT
  693. ;
  694. ; READS NEXT SECTOR (GROUP OF FOUR DIRECTORY ENTRIES)
  695. ; RETURNS WITH ZERO FLAG SET IF NO MORE
  696. ;
  697. NXTSEC:
  698.     LHLD    DIRMAX        ;SEE IF MORE SECTORS
  699.     MOV    A,H
  700.     ORA    L
  701.     RZ            ;RETURNS ZERO FLAG IF NO MORE
  702.     LHLD    TRACK        ;SET TRACK
  703.     MOV    C,L
  704.     MOV    B,H
  705.     CALL    SETTRK
  706.     LHLD    SECTOR        ;SET SECTOR
  707.     MOV    B,H
  708.     MOV    C,L
  709.     CALL    TRNSLT
  710.     CALL    SETSEC
  711.     CALL    READ        ;READ A SECTOR
  712.     ANI    1        ;REVERSE SENSE OF ERROR FLAG
  713.     XRI    1        ;RETURNS WITH ZERO FLAG SET
  714.     RET            ;IF BAD READ
  715. ;
  716. ;  PRINT STRING PTED TO BY RET ADR
  717. ;
  718. PRINT:
  719.     XTHL
  720. PRINTL:
  721.     MOV    A,M        ;GET CHAR
  722.     INX    H        ;PT TO NEXT
  723.     ANI    7FH        ;MASK
  724.     JZ    PRINTD
  725.     CALL    TYPE        ;PRINT
  726.     JMP    PRINTL
  727. PRINTD:
  728.     XTHL
  729.     RET
  730. ;
  731. ; FCB PRINTING ROUTINE
  732. ;
  733. PRINTFCB:
  734.     PUSH    H
  735.     LXI    D,1+8+3
  736.     DAD    D
  737.     LDA    EXTENT        ;GET EXTENT MASK
  738.     CMP    M        ;COMPARE TO TARGET
  739.     POP    H
  740.     RC            ;PRINT ONLY FIRST EXTENT
  741.     CALL    CRLF        ;NEW LINE
  742.     MVI    A,' '        ;SPACE IN
  743.     CALL    TYPE
  744.     CALL    TYPE
  745.     INX    H
  746.     MVI    B,8
  747.     CALL    PR1
  748.     MVI    A,'.'
  749.     CALL    TYPE
  750.     MVI    B,3
  751. PR1:
  752.     MOV    A,M
  753.     ANI    7FH
  754.     CPI    ' '        ;Check for blanks
  755.     CNZ    TYPE
  756.     INX    H
  757.     DCR    B
  758.     JNZ    PR1    
  759.     RET
  760. ;
  761. ;  PRINT CHAR IN A ON TERMINAL; AFFECT NO REGS
  762. ;
  763. TYPE:
  764.     PUSH    H    ;SAVE REGS
  765.     PUSH    D
  766.     PUSH    B
  767.     PUSH    PSW
  768.     MOV    E,A    ;CHAR IN E
  769.     MVI    C,2    ;BDOS ROUTINE
  770.     CALL    BDOS
  771.     POP    PSW    ;RESTORE REGS
  772.     POP    B
  773.     POP    D
  774.     POP    H
  775.     RET
  776. ;
  777. ; DOES USER WANT TO PAUSE TO CHANGE DISKS OR SELECT USER 0?
  778. ;
  779. PUSCHK:
  780.     LDA    PAUSE        ;GET OPTION
  781.     ORA    A
  782.     RZ            ;NOPE, SO RETURN
  783.     CALL    PRINT        ;PRINT PAUSE MESSAGE
  784.     DB    CR,LF,'Change Disk - Hit ^C to Abort, Anything Else to Cont - '
  785.     DB    0
  786.     MVI    C,01
  787.     CALL    BDOS        ;INPUT A CHAR
  788.     CPI    CTRLC        ;ABORT?
  789.     JZ    CLEANRET
  790.     CALL    CRLF
  791.     MVI    C,0DH
  792.     JMP    BDOS        ;RESET THE DISK
  793. ;
  794. ;  NEW LINE
  795. ;
  796. CRLF:
  797.     MVI    A,0DH        ;NEW LINE
  798.     CALL    TYPE
  799.     MVI    A,0AH
  800.     JMP    TYPE
  801. ;
  802. ; SHIFT REGS 'HL' RIGHT 2 BITS LOGICAL
  803. ;
  804. SHFHL2:
  805.     CALL    SHFHL        ;ROTATE RIGHT 1 BIT AND FALL THRU
  806. SHFHL:
  807.     XRA    A        ;CLEAR CARRY
  808.     MOV    A,H
  809.     RAR            ;SHIFTED BIT IN CARRY
  810.     MOV    H,A
  811.     MOV    A,L
  812.     RAR
  813.     MOV    L,A
  814.     RET
  815. ;
  816. ; TRANSLATE REG 'BC' FROM LOGICAL TO PHYSICAL SECTOR NUMBER
  817. ;
  818. TRNSLT:
  819.     LHLD    DPH        ;GET ADDRESS OF XLTO
  820.     XCHG
  821.     CALL    SECTRAN        ;USE BIOS ROUTINE
  822.     MOV    C,L        ;RETURN VALUE IN BC
  823.     MOV    B,H
  824.     RET
  825. ;
  826. ; THIS IS THE WORKING COPY OF THE BIOS JUMP TABLE
  827. ;
  828. WBOOT:     DS    3
  829. CONST:     DS    3
  830. CONIN:     DS    3
  831. CONOUT:     DS    3
  832. LIST:     DS    3
  833. PUNCH:     DS    3
  834. READER:     DS    3
  835. HOME:     DS    3
  836. SELDSK:     DS    3
  837. SETTRK:     DS    3
  838. SETSEC:     DS    3
  839. SETDMA:     DS      3
  840. READ:     DS    3
  841. WRITE:     DS    3
  842. LISTST:     DS    3
  843. SECTRAN: DS    3
  844. ;
  845.      DS    100        ;STACK DEPTH
  846. STACK:
  847.     DS    2        ;LOCATION OF STACK
  848. ;
  849. ; DATA AREAS
  850. ;
  851. FNCOUNT:
  852.     DS    1        ;NUMBER OF FILE NAMES IN COMMAND LINE
  853. CURUSR:    DS    1        ;0 IF NOT IN CURRENT USER
  854. PAUSE:    DS    1        ;0 IF NO PAUSE FOR DISK CHANGE
  855. LISTFL:    DS    1        ;0 IF NOT LIST ONLY
  856. DIRMAX:    DS    2        ;NUMBER OF SECTORS IN DIRECTORY =
  857. ;                ;   MAXIMUM NUMBER OF DIRECTORY ENTRIES
  858. ;                ;   DIVIDED BY 4 (ENTRIES PER SECTOR)
  859. TEMP:    DS    2        ;TEMP STORAGE FOR FCB PRINT
  860. EXTENT:    DS    1        ;EXTENT MASK
  861. MAXSEC:    DS    2        ;MAXIMUM NUMBER OF SECTORS/TRACK
  862. FIXCNT:    DS    1        ;CHANGE FLAG
  863. REWRT:    DS    1        ;REWRITE FLAG  0=NO, F=YES
  864. SECTOR:    DS    2        ;CURRENT SECTOR NUMBER
  865. TRACK:    DS    2        ;TRACK NUMBER OF DIRECTORY
  866. ;
  867. ;    ADDRESS OF THE TRANSLATE TABLE
  868. ;
  869. DPH:     DS    16
  870.  
  871. FNTAB:    DS    11*40        ;FILE NAME BUFFER
  872.  
  873.     END
  874.