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

  1. ;
  2. ; SYSLIB Module Name:  SZCPR
  3. ; Author:  Richard Conn
  4. ; SYSLIB Version Number:  2.2
  5. ; Module Version Number:  1.0
  6. ; Module Entry Points:
  7. ;    ZINIMC        ZINIEXT        ZINIDMA        ZINICI
  8. ;    ZCPRQ        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. ;  ZINIDMA -- SET DMA ADDRESS FOR ZCPR2 ROUTINES
  58. ;    ON ENTRY, HL = ADDRESS OF DMA BUFFER (80H RECOMMENDED)
  59. ;    THIS ROUTINE NEED BE CALLED ONLY IF THE USER'S VALUE IS
  60. ;        DIFFERENT FROM THE RECOMMENDED VALUES
  61. ;
  62. ZINIDMA::
  63.     SHLD    DMADR    ; SET DMA ADDRESS
  64.     RET
  65.  
  66. ;
  67. ;  ZINICI -- SET CURRENT USER/DISK INDICATOR CHARACTER
  68. ;    ON ENTRY, A = CHARACTER ("$" DEFAULT)
  69. ;    THIS ROUTINE NEED BE CALLED ONLY IF THE USER'S VALUE IS
  70. ;        DIFFERENT FROM THE RECOMMENDED VALUE
  71. ;
  72. ZINICI::
  73.     STA    CURIND    ; SET CURRENT INDICATOR
  74.     RET
  75.  
  76. ;
  77. ;  ZCPRQ -- RETURN ADDRESS OF ZCPR2 STATUS BUFFERS
  78. ;    ON EXIT, HL = ADDRESS OF FIRST BYTE IN EXTERNALLY-ACCESSABLE DATA AREA
  79. ;
  80. ZCPRQ::
  81.     LXI    H,EXTDATA    ; PT TO FIRST BYTE
  82.     RET
  83.  
  84. ;
  85. ;  EXTERNALLY-ACCESSABLE DATA AREA
  86. ;
  87. EXTDATA:        ; BEGINNING OF EXTERNALLY-ACCESSABLE DATA AREA
  88. MCFLG:
  89.     DB    0    ; 0 SAYS NO MULTIPLE COMMAND LINE BUFFER
  90. MCADR:
  91.     DW    NOPATH    ; ADDRESS OF MULTIPLE COMMAND LINE IF AVAILABLE
  92. EXTADR:
  93.     DW    NOPATH    ; ADDRESS OF EXTERNAL PATH (ASSUME NO PATH)
  94. CURIND:
  95.     DB    CURSET    ; SET RECOMMENDED VALUE
  96. DMADR:
  97.     DW    DMASET    ; SET RECOMMENDED VALUE
  98. ;
  99. ;  INTERNAL BUFFERS
  100. ;
  101. NOPATH:
  102.     DB    0    ; EMPTY PATH
  103. CDISK:
  104.     DS    1    ; CURRENT DISK NUMBER
  105. CUSER:
  106.     DS    1    ; CURRENT USER NUMBER
  107. TDISK:
  108.     DS    1    ; TEMP DISK NUMBER
  109. TUSER:
  110.     DS    1    ; TEMP USER NUMBER
  111.  
  112. ;
  113. ;  MCPTR -- RETURN WITH HL POINTING TO NEXT BYTE OF COMMAND LINE
  114. ;    IF MULTIPLE COMMANDS ARE ENABLED
  115. ;    A IS RETURN CODE; A=0 AND ZERO FLAG SET (Z) IF ERROR,
  116. ;        A=0FFH AND ZERO FLAG CLEAR (NZ) IF NO ERROR
  117. ;
  118. ZMCPTR::
  119.     LHLD    MCADR    ; GET ADDRESS OF MULTIPLE COMMAND LINE
  120.     MOV    A,M    ; GET LOW-ORDER
  121.     INX    H    ; PT TO HIGH-ORDER
  122.     MOV    H,M    ; GET HIGH-ORDER
  123.     MOV    L,A    ; SET LOW-ORDER
  124.     LDA    MCFLG    ; MULTIPLE COMMANDS AVAILABLE?
  125.     ORA    A    ; 0=NO
  126.     RET
  127.  
  128. ;
  129. ;  PFIND -- LOOK FOR FILE WHOSE FCB IS PTED TO BY DE ALONG PATH
  130. ;    IF FILE FOUND, RETURN DISK NUMBER IN B, USER NUMBER IN C, AND
  131. ;    ZERO FLAG SET (Z) WITH A=0FFH; IF NOT FOUND, RETURN WITH ZERO FLAG
  132. ;    SET (Z) AND A=0; IF ERROR, RETURN WITH ERROR CODE (1,2,3) AND NZ
  133. ;
  134. ;    INPUTS:  DE PTS TO FCB, B IS FLAG: B=0 IF NO CURRENT SEARCH ALSO,
  135. ;                        <>0 IF CURRENT SEARCH
  136. ;    OUTPUTS:  B=DISK, C=USER IF FOUND
  137. ;            ZERO FLAG SET (Z) IF NOT FOUND
  138. ;            ZERO FLAG CLEAR (NZ) IF FOUND
  139. ;
  140. ZPFIND::
  141.     PUSH    H    ; SAVE REGS
  142.     PUSH    D
  143.     PUSH    D    ; SAVE FCB PTR
  144.     XRA    A    ; SET DISK NUMBER TO CURRENT
  145.     STAX    D    ; CHANGE FCB
  146.     MVI    C,25    ; GET CURRENT DISK
  147.     CALL    BDOSH
  148.     STA    CDISK    ; SAVE CURRENT DISK
  149.     STA    TDISK    ; SET TEMP DISK
  150.     MVI    C,32    ; GET CURRENT USER
  151.     MVI    E,0FFH
  152.     CALL    BDOSH
  153.     STA    CUSER    ; SAVE CURRENT USER
  154.     STA    TUSER    ; SAVE TEMP USER
  155.     POP    D    ; GET FCB PTR
  156.     LHLD    EXTADR    ; GET ADDRESS OF EXTERNAL PATH
  157.     MOV    A,B    ; SEARCH CURRENT?
  158.     ORA    A    ; 0=NO
  159.     JZ    PF1
  160.     MVI    C,17    ; SEARCH FOR FIRST
  161.     CALL    BDOSH
  162.     INR    A    ; FILE FOUND?
  163.     JNZ    PFFND
  164. PF1:
  165.     MOV    A,M    ; GET DRIVE NUMBER FROM PATH
  166.     ORA    A    ; 0=DONE=FILE NOT FOUND
  167.     JZ    PFNFND
  168.     LDA    CURIND    ; GET CURRENT INDICATOR
  169.     CMP    M    ; CURRENT DISK?
  170.     MOV    A,M    ; RESTORE DISK NUMBER
  171.     JNZ    PF2
  172.     LDA    CDISK    ; GET CURRENT DISK
  173.     INR    A    ; INCREMENT FOR LATER DECREMENT
  174. PF2:
  175.     PUSH    D    ; SAVE FCB PTR
  176.     DCR    A    ; ADJUST TO 0-15
  177.     ANI    0FH    ; MASK FOR DISK NUMBER
  178.     STA    TDISK    ; SET TEMP DISK
  179.     MOV    E,A    ; DISK NUMBER IN E
  180.     MVI    C,14    ; SELECT DISK
  181.     CALL    BDOSH
  182.     INX    H    ; PT TO USER NUMBER
  183.     MOV    A,M    ; GET USER NUMBER
  184.     ANI    7FH    ; MASK OUT SYSTEM FLAG
  185.     MOV    B,A    ; SAVE IN B
  186.     LDA    CURIND    ; CURRENT USER?
  187.     CMP    B
  188.     MOV    A,B    ; GET CURRENT USER BACK
  189.     JNZ    PF3
  190.     LDA    CUSER    ; GET CURRENT USER
  191. PF3:
  192.     STA    TUSER    ; SET TEMP USER
  193.     MOV    E,A    ; USER NUMBER IN E
  194.     MVI    C,32    ; SELECT USER
  195.     CALL    BDOSH
  196.     POP    D    ; GET PTR TO FCB
  197.     INX    H    ; PT TO NEXT PATH ENTRY
  198.     MVI    C,17    ; NOW, SEARCH FOR FILE
  199.     CALL    BDOSH
  200.     INR    A    ; FILE FOUND?
  201.     JZ    PF1    ; CONTINUE SEARCH IF NOT FOUND
  202. ;
  203. ;  FILE FOUND FLAG SETTING
  204. ;
  205. PFFND:
  206.     MVI    A,0FFH    ; FOUND RETURN CODE
  207.     ORA    A    ; SET FLAGS
  208.     JMP    FNDEXIT
  209. ;
  210. ;  FILE NOT FOUND ERROR
  211. ;
  212. PFNFND:
  213.     XRA    A    ; FILE NOT FOUND
  214. FNDEXIT:
  215.     PUSH    PSW    ; SAVE RETURN CODE
  216.     LDA    CDISK    ; RESTORE CURRENT DISK
  217.     MOV    E,A    ; SAVE IN E
  218.     LDA    TDISK    ; ALREADY THERE?
  219.     CMP    E    ; MATCH IF SO
  220.     JZ    FNDEX1
  221.     MVI    C,14    ; SELECT DISK IN E
  222.     CALL    BDOS
  223. FNDEX1:
  224.     LDA    CUSER    ; RESTORE CURRENT USER
  225.     MOV    E,A    ; SAVE IN E
  226.     LDA    TUSER    ; ALREADY THERE?
  227.     CMP    E    ; MATCH IF SO
  228.     JZ    FNDEX2
  229.     MVI    C,32    ; SELECT USER IN E
  230.     CALL    BDOS
  231. FNDEX2:
  232.     LDA    TDISK    ; SET FOUND DISK
  233.     MOV    B,A
  234.     LDA    TUSER    ; SET FOUND USER
  235.     MOV    C,A
  236.     POP    PSW    ; GET RETURN CODE
  237.     POP    D    ; RESTORE REGS
  238.     POP    H
  239.     RET
  240. ;
  241. ;  ROUTINE TO CALL BDOS AND NOT CHANGE HL
  242. ;
  243. BDOSH:
  244.     PUSH    H    ; CALL BDOS, BUT SAVE HL
  245.     CALL    BDOS
  246.     POP    H
  247.     RET
  248.  
  249. ;
  250. ;  ZFSTAT -- DETERMINE ATTRIBUTES OF FILE WHOSE FCB IS PTED TO BY DE
  251. ;    ON RETURN, B = 0 MEANS FILE IS NOT SYSTEM, C = 0 MEANS FILE IS NOT R/O
  252. ;        ZERO FLAG SET (Z) MEANS ALL OK, NZ MEANS FILE NOT FOUND
  253. ;
  254. ZFSTAT::
  255.     PUSH    H    ; SAVE REGS
  256.     PUSH    D
  257.     MVI    C,17    ; SEARCH FOR FILE
  258.     CALL    BDOS
  259.     INR    A    ; SET ZERO FLAG IF NOT FOUND
  260.     JZ    FSERR
  261.     DCR    A    ; GET OFFSET
  262.     RRC        ; CONVERT TO OFFSET INTO DMA BUFFER
  263.     RRC
  264.     RRC
  265.     ANI    60H
  266.     ADI    9    ; PT TO R/O BYTE
  267.     LHLD    DMADR    ; GET CURRENT DMA ADDRESS
  268.     ADD    L    ; MAKE HL PT TO DESIRED BYTE
  269.     MOV    L,A
  270.     MOV    A,H
  271.     ACI    0
  272.     MOV    H,A
  273.     MOV    A,M    ; GET R/O BYTE
  274.     ANI    80H    ; EXTRACT BIT FLAG
  275.     MOV    C,A    ; STORE RETURN CODE IN C
  276.     INX    H    ; PT TO SYSTEM BYTE
  277.     MOV    A,M    ; GET SYSTEM BYTE
  278.     ANI    80H    ; EXTRACT BIT FLAG
  279.     MOV    B,A    ; STORE RETURN CODE IN B
  280.     XRA    A    ; ALL OK
  281.     POP    D    ; RESTORE REGS
  282.     POP    H
  283.     RET
  284. FSERR:
  285.     MVI    A,0FFH    ; NOT OK -- FILE NOT FOUND
  286.     ORA    A    ; SET FLAGS
  287.     POP    D    ; RESTORE REGS
  288.     POP    H
  289.     RET
  290.  
  291.     END
  292.