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 / ZSYS / SIMTEL20 / ZCPR3 / UNERASE.MAC < prev    next >
Text File  |  2000-06-30  |  14KB  |  727 lines

  1. ; PROGRAM:  UNERASE for ZCPR3
  2. ; AUTHOR:  RICHARD CONN
  3. ; VERSION:  1.0
  4. ; DATE:  18 May 84
  5. ; DERIVATION:  UNERA 2.2 (25 July 83) for ZCPR2
  6. ; DERIVATION:  UNERA BY GENE COTTON
  7. ;
  8. VERS    EQU    10        ;version number
  9. z3env    SET    0f400h
  10.  
  11. ;
  12. ; PROGRAM TO RECOVER ERASED FILES, BY GENE COTTON
  13. ;
  14. ; From Interface Age December 1981 pg 146
  15. ;
  16. ; v2.0 - 07/23/83  Modified to be consistent in the ZCPR2 tool set.
  17. ;                    - Rick Conn
  18. ; v1.0 - 05/18/84  Modified to be consistent in the ZCPR3 tool set.
  19. ;                    - Rick Conn
  20. ;
  21. ; Contributors:
  22. ;    v1.6 - Dave Rand
  23. ;    v1.5 - Irv Hoff
  24. ;    v1.4 - Paul Traina
  25. ;    v1.3 - Irv Hoff
  26. ;    v1.2 - Charlie Strom
  27. ;    v1.1 - Bruce Blakeslee
  28. ;     v1.0 - Retyped from Interface Age (Dec 81).  - Henry Rothberg
  29. ;
  30.  
  31. ;
  32. ;  SYSLIB AND Z3LIB ROUTINES
  33. ;
  34.     EXT    Z3INIT,CODEND
  35.     EXT    PRINT,COUT,CRLF
  36.  
  37. ;
  38. ; System equates:
  39. ;
  40. BOOT    EQU    0000H        ;CP/M WARM BOOT JUMP VECTOR
  41. BDOS    EQU    BOOT+05H    ;CP/M BDOS CALL JUMP VECTOR
  42. TBUFF    EQU    BOOT+80H    ;DISK I/O BUFFER
  43. FCB    EQU    BOOT+5CH    ;DEFAULT FILE CONTROL BLOCK
  44. FCB2    EQU    BOOT+6CH    ;SECONDARY FILE CONTROL AREA
  45. CR    EQU    'M'-'@'        ;CTL-M FOR CARRIAGE RETURN
  46. LF    EQU    'J'-'@'        ;CTL-J FOR LINE FEED
  47. CTRLC    EQU    'C'-'@'        ;ABORT
  48.  
  49. ;
  50. ; Environment Definition
  51. ;
  52.     if    z3env ne 0
  53. ;
  54. ; External ZCPR3 Environment Descriptor
  55. ;
  56.     jmp    start
  57.     db    'Z3ENV'    ;This is a ZCPR3 Utility
  58.     db    1    ;External Environment Descriptor
  59. z3eadr:
  60.     dw    z3env
  61. start:
  62.     lhld    z3eadr    ;pt to ZCPR3 environment
  63. ;
  64.     else
  65. ;
  66. ; Internal ZCPR3 Environment Descriptor
  67. ;
  68.     MACLIB    Z3BASE.LIB
  69.     MACLIB    SYSENV.LIB
  70. z3eadr:
  71.     jmp    start
  72.     SYSENV
  73. start:
  74.     lxi    h,z3eadr    ;pt to ZCPR3 environment
  75.     endif
  76.  
  77. ;
  78. ; Start of Program -- Initialize ZCPR3 Environment
  79. ;
  80.     call    z3init    ;initialize the ZCPR3 Env and the VLIB Env
  81.     LXI    H,0        ;SAVE STACK PTR
  82.     DAD    SP
  83.     SHLD    STACK
  84.     CALL    CODEND        ;DETERMINE FREE SPACE
  85.     SHLD    FNTAB        ;SET PTR TO FILE NAME TABLE
  86.     LXI    D,512        ;1/2 K
  87.     DAD    D
  88.     SPHL            ;NEW STACK
  89.     CALL     HELLO        ;SIGN ON MESSAGE
  90.     CALL    HELPCHK        ;CHECK FOR AND PRINT HELP MESSAGE
  91.     CALL    PCHECK        ;CHECK PARAMETERS
  92.     LDA    FNCOUNT        ;NUMBER OF FILES SPECIFIED
  93.     ORA    A        ;0=NONE
  94.     CNZ    TRYFIX        ;DO THE RECOVERY
  95.     CALL    BYE        ;SIGN OFF MESSAGE
  96.     JMP    BOOT        ;RETURN TO CP/M
  97. ;
  98. ; ** Main Routines **
  99. ;
  100.  
  101. ;
  102. ; SAY WHO WE ARE
  103. ;
  104. HELLO:
  105.     CALL    PRINT
  106.     DB    'UNERASE  Version '
  107.     DB    (VERS/10)+'0','.',(VERS MOD 10)+'0',0
  108.     RET
  109. ;
  110. ; CHECK FOR VALID PARAMETERS AND SAY WHICH CP?M VERSION
  111. ;
  112. PCHECK:
  113.     CALL    OPTCHK        ;CHECK FOR OPTIONS AND SET FLAGS
  114.     CALL    FCBCHK        ;MAKE SURE FILE SPECIFIED
  115.     CALL    CPMCHK        ;ESTABLISH CP/M PARAMETERS
  116.     CALL    PUSCHK        ;CHECK IF USER WANTS TO CHANGE DISK
  117.     RET
  118. ;
  119. ; LOOK THROUGH DIRECTORY
  120. ;
  121. TRYFIX:
  122.     CALL    NXTSEC        ;GET A DIRECTORY SECTOR
  123.     RZ            ;RETURNS ZERO FLAG IF NO MORE
  124.     CALL    CHKENT        ;CHECK IT OUT AND MAYBE FIX
  125.     JMP    TRYFIX        ;KEEP IT UP TILL DONE
  126. ;
  127. ; SIGN OFF AND RESET SYSTEM
  128. ;
  129. BYE:
  130.     MVI    C,13        ;SYSTEM RESET
  131.     CALL    BDOS
  132.     LDA    LISTFL        ;LIST ONLY?
  133.     ORA    A        ;0=NO
  134.     JNZ    PRNF
  135.     LDA    FIXCNT        ;CHECK FOR ACTIVITY
  136.     ORA    A
  137.     JZ    PRNF        ;SAY NONE FOUND
  138.     CALL    PRINT
  139.     DB    CR,LF,'File(s) Recovered - DOUBLE CHECK Before Using',0
  140.     RET
  141. PRNF:
  142.     CALL    PRINT
  143.     DB    CR,LF,'NO Files Recovered',0
  144.     RET
  145. ;
  146. ; CHECKS FOR P AND 0 OPTIONS IN COMMAND LINE
  147. ;
  148. OPTCHK:
  149.     XRA    A    ;TURN OFF FLAGS
  150.     STA    CURUSR
  151.     STA    PAUSE
  152.     STA    FIXCNT
  153.     STA    LISTFL
  154.     STA    FNCOUNT    ;NO FILE NAMES
  155.     LXI    H,1    ;SET SECTOR 1
  156.     SHLD    SECTOR
  157.     LXI    H,TBUFF    ;SCAN THRU TBUFF, BUILDING A FILE NAME TABLE
  158.     MOV    A,M    ;GET CHAR COUNT
  159.     INX    H    ;PT TO FIRST CHAR
  160.     PUSH    H    ;SAVE PTR
  161.     ADD    L    ;PT TO AFTER LAST CHAR
  162.     MOV    L,A
  163.     MVI    M,0    ;STORE ENDING ZERO
  164.     LHLD    FNTAB    ;PT TO TABLE
  165.     XCHG        ;... IN DE
  166.     POP    H    ;GET PTR TO FIRST CHAR
  167.     CALL    SBLANK    ;SKIP BLANKS
  168. FNLOOP:
  169.     PUSH    D    ;SAVE TABLE PTR
  170.     CALL    GETFN    ;EXTRACT FILE NAME
  171.     POP    D
  172.     PUSH    H
  173.     LXI    H,11    ;PT TO NEXT TABLE ENTRY
  174.     DAD    D
  175.     XCHG
  176.     POP    H
  177.     LDA    FNCOUNT    ;INCREMENT COUNT
  178.     INR    A
  179.     STA    FNCOUNT
  180.     MOV    A,M    ;GET TERMINATING CHAR
  181.     INX    H    ;PT TO NEXT
  182.     CPI    ','    ;ANOTHER FOLLOWS?
  183.     JZ    FNLOOP
  184.     DCX    H    ;POINT BACK TO DELIM
  185.     CALL    SBLANK    ;SKIP TO NON-BLANK
  186. OPTCK1:
  187.     MOV    A,M    ;GET OPTION
  188.     CALL    DELCHK    ;DONE IF DELIM
  189.     RZ
  190.     CPI    'L'    ;LIST ONLY?
  191.     JZ    OPTCKL
  192.     CPI    'P'    ;PAUSE?
  193.     JZ    OPTCKP
  194.     CPI    'Z'    ;USER 0?
  195.     JZ    OPTCKZ
  196.     CALL    PRINT
  197.     DB    CR,LF,'Invalid Option -- ',0
  198.     MOV    A,M
  199.     CALL    COUT
  200.     JMP    HCK1
  201. OPTCKL:
  202.     MVI    A,0FFH    ;SET FLAG
  203.     STA    LISTFL
  204.     INX    H    ;PT TO NEXT
  205.     JMP    OPTCK1
  206. OPTCKP:
  207.     MVI    A,0FFH    ;SET FLAG
  208.     STA    PAUSE
  209.     INX    H    ;PT TO NEXT
  210.     JMP    OPTCK1
  211. OPTCKZ:
  212.     MVI    A,0FFH    ;SET FLAG
  213.     STA    CURUSR
  214.     INX    H
  215.     JMP    OPTCK1
  216. GETFN:
  217.     PUSH    D    ;FILL TARGET FCB
  218.     MVI    B,11    ;11 BYTES
  219.     MVI    A,' '    ;SPACE FILL
  220. GETFN0:
  221.     STAX    D    ;PUT SPACE
  222.     INX    D
  223.     DCR    B
  224.     JNZ    GETFN0
  225.     POP    D    ;PT TO ENTRY AGAIN
  226.     CALL    SCANCOL    ;SCAN FOR COLON
  227.     MVI    B,8    ;8 CHARS MAX
  228.     CALL    GETFN1    ;GET AND FILL ENTRY
  229.     MOV    A,M    ;GET CHAR
  230.     CPI    '.'    ;DELIM?
  231.     RNZ        ;DONE
  232.     INX    H    ;PT TO AFTER PERIOD
  233.     MVI    B,3    ;3 CHARS MAX AND DO IT AGAIN
  234. GETFN1:
  235.     MOV    A,M    ;GET CHAR
  236.     CPI    '.'    ;END OF FIELD?
  237.     JZ    GETFN3
  238.     CALL    DELCHK    ;CHECK DELIMITER
  239.     RZ
  240.     CPI    '*'    ;WILD?
  241.     JZ    GETFNQ
  242.     STAX    D    ;STORE CHAR
  243.     INX    H    ;PT TO NEXT
  244.     INX    D
  245.     DCR    B    ;COUNT DOWN
  246.     JNZ    GETFN1
  247. GETFN2:
  248.     MOV    A,M    ;FLUSH CHARS TO DELIM
  249.     CALL    DELCHK    ;CHECK FOR DELIMITER
  250.     RZ
  251.     INX    H    ;PT TO NEXT
  252.     JMP    GETFN2
  253. GETFN3:
  254.     INX    D    ;PT TO AFTER FIELD
  255.     DCR    B    ;COUNT DOWN
  256.     JNZ    GETFN3
  257.     RET
  258. GETFNQ:
  259.     MVI    A,'?'    ;FILL WITH QUESTION MARKS
  260.     STAX    D
  261.     INX    D
  262.     DCR    B
  263.     JNZ    GETFNQ
  264.     JMP    GETFN2    ;SKIP TO DELIM
  265. DELCHK:
  266.     ORA    A    ;END OF LINE?
  267.     RZ
  268.     CPI    '.'    ;END OF FIELD?
  269.     RZ
  270.     CPI    ','    ;END OF ENTRY?
  271.     RZ
  272.     CPI    ' '
  273.     RET
  274. SBLANK:
  275.     MOV    A,M    ;SKIP TO NON-BLANK
  276.     CPI    ' '
  277.     RNZ
  278.     INX    H
  279.     JMP    SBLANK
  280. SCANCOL:
  281.     PUSH    D    ;SAVE TABLE PTR
  282.     PUSH    H    ;SAVE PTR
  283. SCOL1:
  284.     MOV    A,M    ;GET CHAR
  285.     INX    H    ;PT TO NEXT
  286.     CPI    ':'    ;COLON?
  287.     JZ    SCOLX
  288.     CALL    DELCHK    ;CHECK FOR DELIMITER
  289.     JNZ    SCOL1
  290. SCOL2:
  291.     POP    H    ;RESTORE
  292.     POP    D
  293.     RET
  294. SCOLX:
  295.     XCHG        ;DE PTS TO AFTER COLON
  296.     POP    H    ;GET OLD PTR
  297.     XCHG        ;REPLACE IT
  298.     POP    D    ;GET TABLE PTR
  299.     RET
  300. ;
  301. ; CHECKS THE CURRENT 4 DIRECTORY ENTRIES AGAINST ARGUMENT
  302. ; IF MATCH, REWRITES SECTOR WITH REACTIVATED 1ST BYTES
  303. ;
  304. CHKENT:
  305.     XRA    A        ;ASSUME NO REWRITE
  306.     STA    REWRT
  307.     MVI    B,4        ;NUMBER OF ENTRIES PER SECTOR
  308.     LXI     H,TBUFF        ;BEGINNING OF BUFFER
  309. CKLUP:
  310.     PUSH    B
  311.     MOV    A,M
  312.     CPI    0E5H        ;CHECK FOR UNUSED
  313.     JNZ    CKINC
  314.     PUSH    H
  315.     LHLD    FNTAB        ;PT TO POTENTIAL FILES
  316.     XCHG
  317.     POP    H
  318.     LDA    FNCOUNT        ;NUMBER OF ENTRIES TO COUNT
  319.     MOV    B,A        ;... IN B
  320. CKLUP0:
  321.     PUSH     H        ;SAVE BEGINNING ADDRESS
  322.     PUSH    D        ;SAVE PTR
  323.     PUSH    B        ;SET NAME COUNT
  324.     CALL    COMPAR        ;COMPARE WITH ARGUMENT
  325.     POP    B        ;GET NAME COUNT
  326.     POP    D        ;GET PTR
  327.     POP    H
  328.     JZ    CKLUP1        ;MATCH!
  329.     PUSH    H        ;SAVE PTR
  330.     LXI    H,11        ;PT TO NEXT ENTRY
  331.     DAD    D
  332.     XCHG
  333.     POP    H
  334.     DCR    B        ;COUNT DOWN
  335.     JNZ    CKLUP0
  336.     JMP    CKINC
  337. CKLUP1:
  338.     LDA    LISTFL        ;LIST ONLY?
  339.     ORA    A        ;0=NO
  340.     JNZ    CKINC
  341.     MVI    M,0        ;SET USER 0
  342.     LDA    CURUSR        ;CHECK FOR CURRENT USER
  343.     CPI    0FFH
  344.     JZ    CKLUP2
  345.     PUSH    H        ;SAVE HL
  346.     MVI    E,0FFH        ;GET USER VALUE
  347.     MVI    C,32        ;GET USER AREA FUNCTION
  348.     CALL    BDOS        ;BDOS RETURNS CURRENT AREA IN 'A' REG.
  349.     POP    H        ;RESTORE HL
  350.     MOV    M,A        ;POKE IN CURRENT USER AREA
  351. CKLUP2:
  352.     MVI    A,0FH        ;SAY NEED REWRITE
  353.     STA    REWRT
  354.     MVI    A,0FFH        ;SET COUNT FLAG
  355.     STA    FIXCNT
  356. CKINC:
  357.     POP    B
  358.     LXI    D,32        ;LENGTH OF ENTRY
  359.     DAD    D
  360.     DCR    B
  361.     JNZ    CKLUP
  362.     LDA    REWRT        ;SEE IF NEED REWRITE
  363.     ORA    A
  364.     JZ    CKDONE        ;NO - DONE
  365. ;
  366. ; WRITE THE DIRECTORY SECTOR BACK TO THE DISK
  367. ;
  368.     LHLD    TRACK        ;SET TRACK
  369.     MOV    C,L
  370.     MOV    B,H
  371.     CALL    SETTRK
  372.     LHLD    SECTOR        ;SET SECTOR
  373.     MOV    B,H
  374.     MOV    C,L
  375.     CALL    TRNSLT
  376.     CALL     SETSEC
  377.     CALL    WRITE        ;WRITE THE SECTOR BACK
  378.     ORA    A
  379.     JNZ    ERRWRT        ;ABORT IF ERROR
  380. CKDONE:
  381.     LHLD    DIRMAX
  382.     DCX    H        ;REDUCE SECTORS LEFT
  383.     SHLD    DIRMAX
  384.     LHLD    SECTOR        ;POINT TO NEXT SECTOR
  385.     INX    H
  386.     SHLD    SECTOR
  387.     XCHG
  388.     LHLD    MAXSEC        ;REACHED LIMIT?
  389.     INX    H        ;ONE MORE
  390.     MOV    A,H        ;CHECK HIGH
  391.     CMP    D
  392.     RNZ
  393.     MOV    A,L        ;CHECK LOW
  394.     CMP    E
  395.     RNZ
  396.     LHLD    TRACK        ;NEXT TRACK
  397.     INX    H
  398.     SHLD    TRACK
  399.     LXI    H,1        ;FIRST SECTOR OF NEXT TRACK
  400.     SHLD    SECTOR
  401.     RET
  402. ;
  403. ; COMPARE 11 BYTES OF DIRECTORY ENTRY AGAINST ARGUMENT
  404. ;
  405. COMPAR:
  406.     SHLD    TEMP        ;Hold pointer in case of match
  407.     INX    H
  408.     XCHG
  409.     MVI    C,11
  410. CMPR1:
  411.     LDAX    D        ;GET DIRECTORY ENTRY CHARACTER
  412.     ANI    7FH        ;STRIP ANY FLAGS
  413.     CMP    M
  414.     JNZ    CMPCKAM
  415. CMPR2:
  416.     INX    D
  417.     INX    H        ;BUMP TO NEXT CHARACTER
  418.     DCR    C
  419.     JNZ    CMPR1        ;LOOP FOR 11 CHARACTERS
  420.     LDA    FIXCNT        ;CHECK FLAG
  421.     ORA    A        ;0=FIRST TIME
  422.     CZ    PRFIX
  423.     LHLD    TEMP
  424.     CALL    PRINTFCB
  425.     XRA    A
  426.     RET            ;RETURNS 'ZERO' FLAG SET FOR MATCH
  427. PRFIX:
  428.     LDA    LISTFL    ;LIST ONLY?
  429.     ORA    A    ;0=NO
  430.     JNZ    PRFIX1
  431.     CALL    PRINT
  432.     DB    CR,LF,'File(s) Recovered --',0
  433.     RET
  434. PRFIX1:
  435.     MVI    A,0FFH    ;DON'T PRINT THIS AGAIN
  436.     STA    FIXCNT
  437.     CALL    PRINT
  438.     DB    CR,LF,'Erased File(s) --',0
  439.     RET
  440. CMPCKAM:
  441.     LDAX    D
  442.     CPI    0E5H        ;NON-ALLOCATED ENTRY?
  443.     JZ    SKIP
  444.     MOV    A,M
  445.     CPI    '?'
  446.     RNZ
  447.     JMP    CMPR2
  448. SKIP:
  449.     ORA    A
  450.     RET            ;SET NZ FLAG
  451. ;
  452. ; CHECK FOR CP/M VERSION AND SET THINGS
  453. ;
  454. CPMCHK:
  455.     LXI    D,80H        ;SET DMA TO TBUFF
  456.     MVI    C,26
  457.     CALL    BDOS
  458.     CALL    CPM22        ;IF 2.2 GO SET THINGS
  459.     CALL    GTBIOS        ;ESTABLISH BIOS JUMP VECTOR
  460. ;
  461. ; SELECT DISK AND SETUP DISK PARAMETER HEADER
  462. ;
  463.     LDA    FCB        ;GET THE DISK
  464.     MOV    E,A
  465.     MVI    C,14
  466.     CALL    BDOS
  467.     LDA    FCB
  468.     MOV    C,A
  469.     MVI    B,0
  470.     CALL    SELDSK        ;MAKE SURE DRIVE IS
  471.     MOV    A,H        ;  SELECTED
  472.     ORA    L
  473.     JZ    ILDISK
  474.     MOV    E,M        ;GET THE ADDRESS
  475.     INX    H        ;  OF THE XLTO
  476.     MOV    D,M    
  477.     XCHG
  478.     SHLD    DPH        ;SAVE THE ADDRESS
  479.     RET
  480. ;
  481. ; DETERMINE NUMBER OF DIRECTORY ENTRIES
  482. ;
  483. CPM22:
  484.     MVI    C,31        ;GET DISK PARAMETERS ADDRESS
  485.     CALL    BDOS        ;DPB ADDRESS IN 'HL' ON RETURN
  486.     MOV    E,M        ;NUMBER OF SECTORS/TRACK
  487.     INX    H        ;AS 2-BYTE QUANTITY IN DE
  488.     MOV    D,M
  489.     INX    H
  490.     XCHG
  491.     SHLD    MAXSEC        ;SET MAX SECTORS/TRACK
  492.     XCHG
  493.     INX    H
  494.     INX    H
  495.     MOV    A,M        ;GET EXM
  496.     STA    EXTENT
  497.     INX    H        ;PT TO DRM
  498.     INX    H
  499.     INX    H
  500.     MOV    E,M        ;GET NUMBER OF
  501.     INX    H        ;  DIRECTORY ENTRIES
  502.     MOV    D,M
  503.     XCHG
  504.     INX    H        ;ACCOUNT FOR - 1
  505.     CALL    SHFHL2        ;SHIFT 'HL' RIGHT 2
  506.     SHLD    DIRMAX        ;SAVE NUMBER DIRECTORY SECTORS
  507.     LXI    H,5        ;NOW POINT TO SYSTEM
  508.     DAD    D        ;  TRACK OFFSET
  509.     MOV    A,M        ;PICK UP NUMBER OF
  510.     INX    H
  511.     MOV    H,M
  512.     MOV    L,A
  513.     SHLD    TRACK
  514.     RET
  515. ;
  516. ; ERROR OCCURED DURING DISK WRITE - ABORT
  517. ;
  518. ERRWRT:
  519.     CALL    PRINT
  520.     DB    CR,LF,'ABORT - Error During Disk Write',0
  521.     JMP    BOOT        ;ABORT
  522. ;
  523. ; MAKE SURE A LEGAL DISK IS SPECIFIED AND CHECK FOR HELP
  524. ;
  525. FCBCHK:
  526.     LDA    FCB        ;GET DRIVE SPECIFICATION
  527.     ORA     A        ;SEE IF DEFAULT
  528.     JNZ    FCBCK1        ;NO, GO CHECK FILENAME
  529.     MVI    C,25        ;ASK FOR CURRENT DRIVE
  530.     CALL    BDOS
  531.     INR    A        ;OFFSET FOR NEXT INSTRUCTION
  532. FCBCK1:
  533.     DCR    A        ;CURRENT DRIVE NUMBER
  534.     STA    FCB        ;SAVE IT
  535.     RET
  536. ;
  537. ;  CHECK FOR HELP REQUEST
  538. ;
  539. HELPCHK:
  540.     LDA    FCB+1        ;GET 1ST BYTE OF FILENAME
  541.     CPI    '/'        ;HELP?
  542.     JZ    HCK1
  543.     CPI    ' '        ;MAKE SURE IT IS NON-BLANK
  544.     RNZ            ;OK - KEEP GOING
  545. ;    
  546. ; IF NO FILE NAME IS SPECIFIED, ABORT WITH NOTICE
  547. ;
  548. HCK1:
  549.     CALL     PRINT
  550.     db    cr,lf,'Syntax:'
  551.     DB    CR,LF,'   UNERASE afn,afn,afn,... o'
  552.     db    cr,lf,'Options:'
  553.     DB    CR,LF,'   L - List Erased Files Only'
  554.     DB    CR,LF,'   P - Pause for disk change'
  555.     DB    CR,LF,'   Z - Place file in User 0 '
  556.     DB    '(default is current)'
  557.     DB    0
  558. CLEANRET:
  559.     LHLD    STACK        ;QUIET RETURN
  560.     SPHL
  561.     RET
  562. ;
  563. ; GET BIOS JUMPS VECTORS FOR EASY REFERENCE
  564. ;
  565. GTBIOS:
  566.     LHLD    BOOT+1        ;POINTS TO BIOS JUMP TABLE+3
  567.     LXI    D,WBOOT        ;WHERE WE WILL KEEP A COPY
  568.     MVI    B,16*3        ;MOVE 48 BYTES AND FALL THRU TO MOVE
  569. ;
  570. ; GENERAL PURPOSE MOVE ROUTINE
  571. ; FROM 'HL' TO 'DE' FOR COUNT OF 8
  572. ;
  573. MOVE:
  574.     MOV    A,M        ;GET A BYTE
  575.     STAX    D        ;PUT A BYTE
  576.     INX    D        ;INCREMENT TO NEXT
  577.     INX    H
  578.     DCR    B        ;COUNT DOWN
  579.     JNZ    MOVE
  580.     RET
  581. ;
  582. ;SPECIFIED AN ILLEGAL DISK DRIVE - ABORT
  583. ;
  584. ILDISK:
  585.     CALL    PRINT
  586.     DB    CR,LF,'ABORT - Illegal Disk Requested',0
  587.     JMP    BOOT        ;ABORT
  588. ;
  589. ; READS NEXT SECTOR (GROUP OF FOUR DIRECTORY ENTRIES)
  590. ; RETURNS WITH ZERO FLAG SET IF NO MORE
  591. ;
  592. NXTSEC:
  593.     LHLD    DIRMAX        ;SEE IF MORE SECTORS
  594.     MOV    A,H
  595.     ORA    L
  596.     RZ            ;RETURNS ZERO FLAG IF NO MORE
  597.     LHLD    TRACK        ;SET TRACK
  598.     MOV    C,L
  599.     MOV    B,H
  600.     CALL    SETTRK
  601.     LHLD    SECTOR        ;SET SECTOR
  602.     MOV    B,H
  603.     MOV    C,L
  604.     CALL    TRNSLT
  605.     CALL    SETSEC
  606.     CALL    READ        ;READ A SECTOR
  607.     ANI    1        ;REVERSE SENSE OF ERROR FLAG
  608.     XRI    1        ;RETURNS WITH ZERO FLAG SET
  609.     RET            ;IF BAD READ
  610. ;
  611. ; FCB PRINTING ROUTINE
  612. ;
  613. PRINTFCB:
  614.     PUSH    H
  615.     LXI    D,1+8+3
  616.     DAD    D
  617.     LDA    EXTENT        ;GET EXTENT MASK
  618.     CMP    M        ;COMPARE TO TARGET
  619.     POP    H
  620.     RC            ;PRINT ONLY FIRST EXTENT
  621.     CALL    PRINT        ;NEW LINE WITH 2 LEADING SPACES
  622.     DB    CR,LF,'  ',0
  623.     INX    H
  624.     MVI    B,8
  625.     CALL    PR1
  626.     MVI    A,'.'
  627.     CALL    COUT
  628.     MVI    B,3
  629. PR1:
  630.     MOV    A,M
  631.     ANI    7FH
  632.     CPI    ' '        ;Check for blanks
  633.     CNZ    COUT
  634.     INX    H
  635.     DCR    B
  636.     JNZ    PR1    
  637.     RET
  638. ;
  639. ; DOES USER WANT TO PAUSE TO CHANGE DISKS OR SELECT USER 0?
  640. ;
  641. PUSCHK:
  642.     LDA    PAUSE        ;GET OPTION
  643.     ORA    A
  644.     RZ            ;NOPE, SO RETURN
  645.     CALL    PRINT        ;PRINT PAUSE MESSAGE
  646.     DB    CR,LF,'Change Disk - Hit ^C to Abort, Anything Else to Cont - '
  647.     DB    0
  648.     MVI    C,01
  649.     CALL    BDOS        ;INPUT A CHAR
  650.     CPI    CTRLC        ;ABORT?
  651.     JZ    CLEANRET
  652.     CALL    CRLF
  653.     MVI    C,0DH
  654.     JMP    BDOS        ;RESET THE DISK
  655. ;
  656. ; SHIFT REGS 'HL' RIGHT 2 BITS LOGICAL
  657. ;
  658. SHFHL2:
  659.     CALL    SHFHL        ;ROTATE RIGHT 1 BIT AND FALL THRU
  660. SHFHL:
  661.     XRA    A        ;CLEAR CARRY
  662.     MOV    A,H
  663.     RAR            ;SHIFTED BIT IN CARRY
  664.     MOV    H,A
  665.     MOV    A,L
  666.     RAR
  667.     MOV    L,A
  668.     RET
  669. ;
  670. ; TRANSLATE REG 'BC' FROM LOGICAL TO PHYSICAL SECTOR NUMBER
  671. ;
  672. TRNSLT:
  673.     LHLD    DPH        ;GET ADDRESS OF XLTO
  674.     XCHG
  675.     CALL    SECTRAN        ;USE BIOS ROUTINE
  676.     MOV    C,L        ;RETURN VALUE IN BC
  677.     MOV    B,H
  678.     RET
  679. ;
  680. ; THIS IS THE WORKING COPY OF THE BIOS JUMP TABLE
  681. ;
  682. WBOOT:     DS    3
  683. CONST:     DS    3
  684. CONIN:     DS    3
  685. CONOUT:     DS    3
  686. LIST:     DS    3
  687. PUNCH:     DS    3
  688. READER:     DS    3
  689. HOME:     DS    3
  690. SELDSK:     DS    3
  691. SETTRK:     DS    3
  692. SETSEC:     DS    3
  693. SETDMA:     DS      3
  694. READ:     DS    3
  695. WRITE:     DS    3
  696. LISTST:     DS    3
  697. SECTRAN: DS    3
  698. ;
  699. STACK:
  700.     DS    2        ;LOCATION OF STACK
  701. ;
  702. ; DATA AREAS
  703. ;
  704. FNCOUNT:
  705.     DS    1        ;NUMBER OF FILE NAMES IN COMMAND LINE
  706. CURUSR:    DS    1        ;0 IF NOT IN CURRENT USER
  707. PAUSE:    DS    1        ;0 IF NO PAUSE FOR DISK CHANGE
  708. LISTFL:    DS    1        ;0 IF NOT LIST ONLY
  709. DIRMAX:    DS    2        ;NUMBER OF SECTORS IN DIRECTORY =
  710. ;                ;   MAXIMUM NUMBER OF DIRECTORY ENTRIES
  711. ;                ;   DIVIDED BY 4 (ENTRIES PER SECTOR)
  712. TEMP:    DS    2        ;TEMP STORAGE FOR FCB PRINT
  713. EXTENT:    DS    1        ;EXTENT MASK
  714. MAXSEC:    DS    2        ;MAXIMUM NUMBER OF SECTORS/TRACK
  715. FIXCNT:    DS    1        ;CHANGE FLAG
  716. REWRT:    DS    1        ;REWRITE FLAG  0=NO, F=YES
  717. SECTOR:    DS    2        ;CURRENT SECTOR NUMBER
  718. TRACK:    DS    2        ;TRACK NUMBER OF DIRECTORY
  719. ;
  720. ;    ADDRESS OF THE TRANSLATE TABLE
  721. ;
  722. DPH:     DS    16
  723.  
  724. FNTAB:    DS    2        ;FILE NAME BUFFER
  725.  
  726.     END
  727.