home *** CD-ROM | disk | FTP | other *** search
/ GRIPS 2: Government Rast…rocessing Software & Data / GRIPS_2.cdr / dos / pcshow / src / msc5_1 / dosio.asm < prev    next >
Encoding:
Assembly Source File  |  1990-01-06  |  3.7 KB  |  193 lines

  1. ;
  2. ;  dosio.asm
  3. ;  Support for BIOS calls in ImProVise
  4. ;****************************************************************************
  5. ;*                                                                            *
  6. ;*                                                                            *
  7. ;*      part of ImProVise                                                         *
  8. ;*      by Quincey Koziol                                                         *
  9. ;*                                                                            *
  10. ;*                                                                             *
  11. ;*                                                                             *
  12. ;****************************************************************************
  13.  
  14.     TITLE    DOSIO    -- LOW-LEVEL I/O FOR SANE HARDWARE HANDLING
  15.  
  16. ;
  17. ;    From original code by Tim Krauskopf    1984-1985
  18. ;    National Center for Supercomputing Applications
  19. ;
  20.     NAME    DOSIO
  21.  
  22. ;
  23. ;  Macros for reading and writing I/O ports
  24. ;
  25. MOUT    MACRO    REG,STUFF        ; one byte to the given I/O register
  26.     MOV    DX,REG
  27.     MOV    AL,STUFF
  28.     OUT    DX,AL
  29.     ENDM
  30. ;
  31. MIN    MACRO    REG             ; get one byte to al
  32.     MOV    DX,REG
  33.     IN    AL,DX
  34.     ENDM
  35. ;
  36. ;  Internal data 
  37. ;
  38.     X EQU    6                ;  for the large model programs
  39.  
  40. .model large
  41. .data
  42. ;    INCLUDE    DOS.MAC
  43. ;    DSEG
  44.  
  45.     PUBLIC    _DTAPTR                ; POINTER TO DTA LOCATION
  46.  
  47. _DTAPTR    DW    0000H                ; dta ADDRESS FOR ME
  48. DTADS    DW    0000H                ; ds FOR dta
  49.  
  50. ;    ENDDS
  51. ;
  52. ;
  53. ;
  54. ;    The subroutines to call from C
  55. ;
  56. ;    PSEG
  57. .code
  58.  
  59.     PUBLIC  _FIND_1ST,_FINDNEXT,_MEM2CPY,_MEMQCPY,_MEMQSIZE
  60.  
  61.  
  62. ;**********************************************************************
  63. ;
  64. ;  find first
  65. ;    make dos find file names according to wildcards
  66. ;  findfirst(filename,attr)
  67. ;    char *filename; int attr;
  68. ;
  69. _FIND_1ST    PROC    FAR
  70.     PUSH    BP
  71.     MOV        BP,SP
  72.     PUSH    DS
  73.     PUSH    ES
  74.     
  75.     MOV        AH,02FH                    ; dos FUNCTION GET dta
  76.     INT        21H
  77.     MOV        _DTAPTR,BX                ; SQUIRREL A COPY FOR ME
  78.     MOV        AX,ES
  79.     MOV        DTADS,AX
  80.  
  81.     MOV        AX,[BP+X+2]                ; DS OF FILENAME PTR
  82.     MOV        DS,AX
  83.     MOV        DX,[BP+X]                ; PTR PART OF FILENAME
  84.     MOV        CX,[BP+X+4]                ; ATTRIBUTE TO SEARCH FOR
  85.     MOV        AH,04EH                    ; FIND MATCHING FILE dos CALL
  86.     INT        21H
  87.     JC        BADRET                    ; AX ALREADY CONTAINS ERROR CODE
  88.     XOR        AX,AX
  89.  
  90. BADRET:
  91.     POP        ES
  92.     POP        DS
  93.     POP        BP
  94.     RET
  95. _FIND_1ST    ENDP
  96.  
  97. ;
  98. ;  findnext()
  99. ;  will find entries that follow findfirst
  100. ;  no need to respecify file name
  101. ;
  102. _FINDNEXT    PROC    FAR
  103.     PUSH    BP
  104.     PUSH    DS
  105.     PUSH    ES
  106.  
  107.     MOV        AH,04FH                    ; FIND NEXT dos CALL
  108.     INT        21H
  109.     JC        NBADRET
  110.     XOR        AX,AX
  111.  
  112. NBADRET:
  113.     POP        ES
  114.     POP        DS
  115.     POP        BP
  116.     RET
  117. _FINDNEXT    ENDP
  118.  
  119. ;
  120. ;    PROCEDURE TO MOVE MEMORY IN WORDS RATHER THAN IN BYTES
  121. ;        USAGE    _MEM2CPY(&TO,&FROM,# OF WORDS);
  122. ;
  123. _MEM2CPY    PROC    FAR
  124.     PUSH    BP
  125.     MOV    BP,SP
  126.     PUSH    DS
  127.     PUSH    ES
  128.     PUSH    SI
  129.     PUSH    DI
  130.  
  131.     LES    DI,DWORD PTR [BP+X]            ; GET THE SEGMENT AND OFFSET OF THE DESTINATION ARRAY
  132.     LDS    SI,DWORD PTR [BP+X+4]        ; GET THE SEGMENT AND OFFSET OF THE SOURCE MEMORY
  133.     MOV    CX,[BP+X+8]                    ; GET THE COUNT
  134.  
  135.     REP    MOVSW                        ; MOVE WORDS
  136.  
  137.     POP        DI
  138.     POP        SI
  139.     POP        ES
  140.     POP        DS
  141.     POP    BP
  142.     RET
  143. _MEM2CPY    ENDP    
  144. ;
  145. ;    PROCEDURE TO MOVE MEMORY IN WORDS RATHER THAN IN BYTES IF IT IS POSSIBLE
  146. ;        USAGE    _MEMQCPY(&TO,&FROM,# OF BYTES);
  147. ;
  148. _MEMQCPY    PROC    FAR
  149.     PUSH    BP
  150.     MOV    BP,SP
  151.     PUSH    DS
  152.     PUSH    ES
  153.     PUSH    SI
  154.     PUSH    DI
  155.  
  156.     LES    DI,DWORD PTR [BP+X]            ; GET THE SEGMENT AND OFFSET OF THE DESTINATION ARRAY
  157.     LDS    SI,DWORD PTR [BP+X+4]        ; GET THE SEGMENT AND OFFSET OF THE SOURCE MEMORY
  158.     MOV    CX,[BP+X+8]                    ; GET THE COUNT
  159.     SHR    CX,1                        ; CHECK WHETHER THIS CAN BE WORD MOV'ED OR NOT
  160.     JC    DOBYTES                        ; NO, CANNOT USE WORD MOVE
  161.     REP    MOVSW                        ; MOVE WORDS
  162.     JMP    SHORT    DONECOPY            ; JUMP AROUND THE BYTE COPY
  163.  
  164. DOBYTES:
  165.     MOV    CX,[BP+X+8]                    ; GET THE COUNT OF BYTES TO MOVE
  166.     REP    MOVSB                        ; MOV THE MEMORY
  167.     
  168. DONECOPY:
  169.     POP        DI
  170.     POP        SI
  171.     POP        ES
  172.     POP        DS
  173.     POP    BP
  174.     RET
  175. _MEMQCPY    ENDP
  176. ;
  177. ;    FUNCTION TO DETERMINE THE MEMORY SIZE IN 1KB BLOCKS OF EXTENDED MEMORY
  178. ;        USAGE    _MEMQSIZE();
  179. ;
  180. _MEMQSIZE    PROC    FAR
  181.     PUSH    BP
  182.     MOV    BP,SP
  183.  
  184.     MOV        AH,88H                ; SET AH FOR GETTING EXTENDED MEMORY SIZE
  185.     INT        15H                    ; SYSTEM SERVICES INTERUPT
  186.  
  187.     POP    BP
  188.     RET
  189. _MEMQSIZE    ENDP
  190.  
  191. ;    ENDPS
  192.     END
  193.