home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol090 / szcpr.mac < prev    next >
Encoding:
Text File  |  1984-04-29  |  6.3 KB  |  285 lines

  1. ;
  2. ; SYSLIB Module Name:  SZCPR
  3. ; Author:  Richard Conn
  4. ; SYSLIB Version Number:  2.0
  5. ; Module Version Number:  1.0
  6. ; Module Entry Points:
  7. ;    ZINIMC        ZINIEXT        ZCPRSET        ZCPRQ
  8. ;    ZMCPTR        ZPFIND        ZFSTAT
  9. ; Module External References:
  10. ;    BDOS
  11. ;
  12.  
  13. ;
  14. ;    THIS MODULE CONTAINS SEVERAL ROUTINES WHICH ARE SPECIFICALLY
  15. ; DESIGNED TO SUPPORT APPLICATION WITH FEATURES OF THE NEW ZCPR2 COMMAND
  16. ; PROCESSOR REPLACEMENT.
  17. ;
  18.  
  19. ;
  20. ;  DEFAULT VALUES FOR SPECIAL FLAGS/ADDRESSES
  21. ;
  22. CURSET    EQU    '$'    ; CURRENT USER OR DISK INDICATOR
  23. DMASET    EQU    80H    ; ADDRESS OF DMA BUFFER
  24.  
  25. ;
  26. ;  EXTERNALS
  27. ;
  28.     EXT    BDOS
  29.  
  30. ;
  31. ;  ZINIMC -- THIS ROUTINE MUST BE CALLED BEFORE THE ZMCPTR ROUTINE
  32. ;    IN THIS PACKAGE.  IT DEFINES THE BASE ADDRESS OF THE MULTIPLE
  33. ;    COMMAND LINE BUFFER IN THE USER'S ZCPR2 SYSTEM
  34. ;        HL - POINTER TO BASE ADDRESS OF MULTIPLE COMMAND LINE BUFFER
  35. ;
  36. ZINIMC::
  37.     PUSH    PSW
  38.     MVI    A,0FFH    ; SAY THAT MULTIPLE COMMANDS ARE DEFINED
  39.     STA    MCFLG    ; SET MULTIPLE COMMAND FLAG
  40.     SHLD    MCADR    ; SAVE ADDRESS
  41.     POP    PSW
  42.     RET
  43.  
  44. ;
  45. ;  ZINIEXT -- THIS ROUTINE DEFINES THE BASE ADDRESS OF THE USER'S EXTERNAL
  46. ;    PATH EXPRESSING IN THE USER'S ZCPR2 SYSTEM
  47. ;        HL - POINTER TO BASE ADDRESS OF EXTERNAL PATH EXPRESSION
  48. ;    THIS ROUTINE DOES NOT HAVE TO BE CALLED BY THE USER IF HE HAS NO
  49. ;    EXTERNAL PATHS; A NULL PATH IS ASSUMED IF THIS ROUTINE IS NOT
  50. ;    CALLED
  51. ;
  52. ZINIEXT::
  53.     SHLD    EXTADR    ; SAVE ADDRESS
  54.     RET
  55.  
  56. ;
  57. ;  ZCPRSET -- SET IMPORTANT SYSTEM VALUES FOR ZCPR-ORIENTED ROUTINES
  58. ;    ON ENTRY, A=CHAR THAT INDICATES CURRENT USER OR DISK ($ RECOMMENDED)
  59. ;        HL = ADDRESS OF DMA BUFFER (80H RECOMMENDED)
  60. ;    THIS ROUTINE NEED BE CALLED ONLY IF THE USER'S VALUES ARE
  61. ;        DIFFERENT FROM THE RECOMMENDED VALUES
  62. ;
  63. ZCPRSET::
  64.     STA    CURIND    ; SET INDICATOR
  65.     SHLD    DMADR    ; SET DMA ADDRESS
  66.     RET
  67. CURIND:
  68.     DB    CURSET    ; SET RECOMMENDED VALUE
  69. DMADR:
  70.     DW    DMASET    ; SET RECOMMENDED VALUE
  71.  
  72. ;
  73. ;  ZCPRQ -- QUESTION ZCPR ROUTINE STATUS; RETURNS:
  74. ;    HL = EXTERNAL PATH ADDRESS
  75. ;    DE = MULTIPLE COMMAND ADDRESS
  76. ;    A = MULTIPLE COMMAND AVAILABLE FLAG (0=NO)
  77. ;
  78. ZCPRQ::
  79.     LHLD    MCADR    ; GET MULTIPLE COMMAND ADDRESS
  80.     XCHG        ; ... IN DE
  81.     LHLD    EXTADR    ; GET EXTERNAL PATH ADDRESS
  82.     LDA    MCFLG    ; GET MC FLAG
  83.     RET
  84.  
  85. ;
  86. ;  GENERAL-PURPOSE BUFFERS
  87. ;
  88. NOPATH:
  89.     DB    0    ; EMPTY PATH
  90. MCFLG:
  91.     DB    0    ; 0 SAYS NO MULTIPLE COMMAND LINE BUFFER
  92. MCADR:
  93.     DS    2    ; ADDRESS OF MULTIPLE COMMAND LINE IF AVAILABLE
  94. EXTADR:
  95.     DW    NOPATH    ; ADDRESS OF EXTERNAL PATH (ASSUME NO PATH)
  96. CDISK:
  97.     DS    1    ; CURRENT DISK NUMBER
  98. CUSER:
  99.     DS    1    ; CURRENT USER NUMBER
  100. TDISK:
  101.     DS    1    ; TEMP DISK NUMBER
  102. TUSER:
  103.     DS    1    ; TEMP USER NUMBER
  104.  
  105. ;
  106. ;  MCPTR -- RETURN WITH HL POINTING TO NEXT BYTE OF COMMAND LINE
  107. ;    IF MULTIPLE COMMANDS ARE ENABLED
  108. ;    A IS RETURN CODE; A=0 AND ZERO FLAG SET (Z) IF ERROR,
  109. ;        A=0FFH AND ZERO FLAG CLEAR (NZ) IF NO ERROR
  110. ;
  111. ZMCPTR::
  112.     LHLD    MCADR    ; GET ADDRESS OF MULTIPLE COMMAND LINE
  113.     MOV    A,M    ; GET LOW-ORDER
  114.     INX    H    ; PT TO HIGH-ORDER
  115.     MOV    H,M    ; GET HIGH-ORDER
  116.     MOV    L,A    ; SET LOW-ORDER
  117.     LDA    MCFLG    ; MULTIPLE COMMANDS AVAILABLE?
  118.     ORA    A    ; 0=NO
  119.     RET
  120.  
  121. ;
  122. ;  PFIND -- LOOK FOR FILE WHOSE FCB IS PTED TO BY DE ALONG PATH
  123. ;    IF FILE FOUND, RETURN DISK NUMBER IN B, USER NUMBER IN C, AND
  124. ;    ZERO FLAG SET (Z) WITH A=0FFH; IF NOT FOUND, RETURN WITH ZERO FLAG
  125. ;    SET (Z) AND A=0; IF ERROR, RETURN WITH ERROR CODE (1,2,3) AND NZ
  126. ;
  127. ;    INPUTS:  DE PTS TO FCB, B IS FLAG: B=0 IF NO CURRENT SEARCH ALSO,
  128. ;                        <>0 IF CURRENT SEARCH
  129. ;    OUTPUTS:  B=DISK, C=USER IF FOUND
  130. ;            ZERO FLAG SET (Z) IF NOT FOUND
  131. ;            ZERO FLAG CLEAR (NZ) IF FOUND
  132. ;
  133. ZPFIND::
  134.     PUSH    H    ; SAVE REGS
  135.     PUSH    D
  136.     PUSH    D    ; SAVE FCB PTR
  137.     XRA    A    ; SET DISK NUMBER TO CURRENT
  138.     STAX    D    ; CHANGE FCB
  139.     MVI    C,25    ; GET CURRENT DISK
  140.     CALL    BDOSH
  141.     STA    CDISK    ; SAVE CURRENT DISK
  142.     STA    TDISK    ; SET TEMP DISK
  143.     MVI    C,32    ; GET CURRENT USER
  144.     MVI    E,0FFH
  145.     CALL    BDOSH
  146.     STA    CUSER    ; SAVE CURRENT USER
  147.     STA    TUSER    ; SAVE TEMP USER
  148.     POP    D    ; GET FCB PTR
  149.     LHLD    EXTADR    ; GET ADDRESS OF EXTERNAL PATH
  150.     MOV    A,B    ; SEARCH CURRENT?
  151.     ORA    A    ; 0=NO
  152.     JZ    PF1
  153.     MVI    C,17    ; SEARCH FOR FIRST
  154.     CALL    BDOSH
  155.     INR    A    ; FILE FOUND?
  156.     JNZ    PFFND
  157. PF1:
  158.     MOV    A,M    ; GET DRIVE NUMBER FROM PATH
  159.     ORA    A    ; 0=DONE=FILE NOT FOUND
  160.     JZ    PFNFND
  161.     LDA    CURIND    ; GET CURRENT INDICATOR
  162.     CMP    M    ; CURRENT DISK?
  163.     MOV    A,M    ; RESTORE DISK NUMBER
  164.     JNZ    PF2
  165.     LDA    CDISK    ; GET CURRENT DISK
  166.     INR    A    ; INCREMENT FOR LATER DECREMENT
  167. PF2:
  168.     PUSH    D    ; SAVE FCB PTR
  169.     DCR    A    ; ADJUST TO 0-15
  170.     ANI    0FH    ; MASK FOR DISK NUMBER
  171.     STA    TDISK    ; SET TEMP DISK
  172.     MOV    E,A    ; DISK NUMBER IN E
  173.     MVI    C,14    ; SELECT DISK
  174.     CALL    BDOSH
  175.     INX    H    ; PT TO USER NUMBER
  176.     MOV    A,M    ; GET USER NUMBER
  177.     ANI    7FH    ; MASK OUT SYSTEM FLAG
  178.     MOV    B,A    ; SAVE IN B
  179.     LDA    CURIND    ; CURRENT USER?
  180.     CMP    B
  181.     MOV    A,B    ; GET CURRENT USER BACK
  182.     JNZ    PF3
  183.     LDA    CUSER    ; GET CURRENT USER
  184. PF3:
  185.     STA    TUSER    ; SET TEMP USER
  186.     MOV    E,A    ; USER NUMBER IN E
  187.     MVI    C,32    ; SELECT USER
  188.     CALL    BDOSH
  189.     POP    D    ; GET PTR TO FCB
  190.     INX    H    ; PT TO NEXT PATH ENTRY
  191.     MVI    C,17    ; NOW, SEARCH FOR FILE
  192.     CALL    BDOSH
  193.     INR    A    ; FILE FOUND?
  194.     JZ    PF1    ; CONTINUE SEARCH IF NOT FOUND
  195. ;
  196. ;  FILE FOUND FLAG SETTING
  197. ;
  198. PFFND:
  199.     MVI    A,0FFH    ; FOUND RETURN CODE
  200.     ORA    A    ; SET FLAGS
  201.     JMP    FNDEXIT
  202. ;
  203. ;  FILE NOT FOUND ERROR
  204. ;
  205. PFNFND:
  206.     XRA    A    ; FILE NOT FOUND
  207. FNDEXIT:
  208.     PUSH    PSW    ; SAVE RETURN CODE
  209.     LDA    CDISK    ; RESTORE CURRENT DISK
  210.     MOV    E,A    ; SAVE IN E
  211.     LDA    TDISK    ; ALREADY THERE?
  212.     CMP    E    ; MATCH IF SO
  213.     JZ    FNDEX1
  214.     MVI    C,14    ; SELECT DISK IN E
  215.     CALL    BDOS
  216. FNDEX1:
  217.     LDA    CUSER    ; RESTORE CURRENT USER
  218.     MOV    E,A    ; SAVE IN E
  219.     LDA    TUSER    ; ALREADY THERE?
  220.     CMP    E    ; MATCH IF SO
  221.     JZ    FNDEX2
  222.     MVI    C,32    ; SELECT USER IN E
  223.     CALL    BDOS
  224. FNDEX2:
  225.     LDA    TDISK    ; SET FOUND DISK
  226.     MOV    B,A
  227.     LDA    TUSER    ; SET FOUND USER
  228.     MOV    C,A
  229.     POP    PSW    ; GET RETURN CODE
  230.     POP    D    ; RESTORE REGS
  231.     POP    H
  232.     RET
  233. ;
  234. ;  ROUTINE TO CALL BDOS AND NOT CHANGE HL
  235. ;
  236. BDOSH:
  237.     PUSH    H    ; CALL BDOS, BUT SAVE HL
  238.     CALL    BDOS
  239.     POP    H
  240.     RET
  241.  
  242. ;
  243. ;  ZFSTAT -- DETERMINE ATTRIBUTES OF FILE WHOSE FCB IS PTED TO BY DE
  244. ;    ON RETURN, B = 0 MEANS FILE IS NOT SYSTEM, C = 0 MEANS FILE IS NOT R/O
  245. ;        ZERO FLAG SET (Z) MEANS ALL OK, NZ MEANS FILE NOT FOUND
  246. ;
  247. ZFSTAT::
  248.     PUSH    H    ; SAVE REGS
  249.     PUSH    D
  250.     MVI    C,17    ; SEARCH FOR FILE
  251.     CALL    BDOS
  252.     INR    A    ; SET ZERO FLAG IF NOT FOUND
  253.     JZ    FSERR
  254.     DCR    A    ; GET OFFSET
  255.     RRC        ; CONVERT TO OFFSET INTO DMA BUFFER
  256.     RRC
  257.     RRC
  258.     ANI    60H
  259.     ADI    9    ; PT TO R/O BYTE
  260.     LHLD    DMADR    ; GET CURRENT DMA ADDRESS
  261.     ADD    L    ; MAKE HL PT TO DESIRED BYTE
  262.     MOV    L,A
  263.     MOV    A,H
  264.     ACI    0
  265.     MOV    H,A
  266.     MOV    A,M    ; GET R/O BYTE
  267.     ANI    80H    ; EXTRACT BIT FLAG
  268.     MOV    C,A    ; STORE RETURN CODE IN C
  269.     INX    H    ; PT TO SYSTEM BYTE
  270.     MOV    A,M    ; GET SYSTEM BYTE
  271.     ANI    80H    ; EXTRACT BIT FLAG
  272.     MOV    B,A    ; STORE RETURN CODE IN B
  273.     XRA    A    ; ALL OK
  274.     POP    D    ; RESTORE REGS
  275.     POP    H
  276.     RET
  277. FSERR:
  278.     MVI    A,0FFH    ; NOT OK -- FILE NOT FOUND
  279.     ORA    A    ; SET FLAGS
  280.     POP    D    ; RESTORE REGS
  281.     POP    H
  282.     RET
  283.  
  284.     END
  285.