home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 03 / praxis / astool02.asm < prev    next >
Encoding:
Assembly Source File  |  1990-12-04  |  10.5 KB  |  361 lines

  1. ; **********************************************************
  2. ; *                    ASTOOL02.ASM                        *
  3. ; * Beispiel für einen Zugriff auf XMS-Speicher über       *
  4. ; *                 HIMEM.SYS 6/11/90                      *
  5. ; *       (c) 1991 bei Peter Monadjemi & toolbox           *
  6. ; **********************************************************
  7.  
  8. .MODEL SMALL,C
  9. .STACK 1000h
  10. .DATA
  11.         XMM_INITIALIZED DW 0
  12.         XMM_CONTROL     LABEL DWORD
  13.                         DW OFFSET XMM_NOT_INIT
  14.                         DW SEG _TEXT
  15.  
  16.         MEM_SIZE        DW 0
  17.         BLOCK_SIZE      DW 0
  18.         MEM_HANDLE      DW 0
  19. ;
  20. ; Hier wird der Info-Block für den MoveBefehl assembliert
  21. ;
  22. XMM_INFO       EQU $
  23. MOV_LAENGE     DD 0
  24. SRC_HANDLE     DW 0
  25. SRC_POINTER    DD 0
  26. DST_HANDLE     DW 0
  27. DST_POINTER    DD 0
  28.  
  29. TEXT1           DB 'XMS-Treiber konnte nicht installiert '
  30.                 DB 'werden!',10,13,'$'
  31. TEXT2           DB 'Fehler beim Verschieben eines Blocks!'
  32.                 DB 10,13,'$'
  33. TEXT3           DB 'Nicht genügend freier XMS-Speicher!'
  34.                 DB 10,13,'$'
  35. TEXT4           DB 'Speicherplatz kann nicht reserviert '
  36.                 DB 'werden!',10,13,'$'
  37. TEXT5           DB 'Fehler beim Anfordern der XMS-Größe!'
  38.                 DB '10,13,'$'
  39. PROMPT1         DB 'XMM-Handler installiert!',10,13,'$'
  40. PROMPT2         DB 'XMS-Speicher vorhanden!',10,13,'$'
  41. PROMPT3         DB 'XMS-Speicher angefordert',10,13,'$'
  42.  
  43. TEST_BUF        DB 'Ein Ausflug ins Extended-Memory!'
  44.                 DB '10,13,'$'
  45. ;
  46. ; Größe des zu verschiebenden Puffers muß gerade sein!
  47. ;
  48.         BUFSIZE         EQU ((($ - TEST_BUF +1) / 2)*2)
  49.         ERROR_FLAG      DB ?
  50. .CODE
  51. ;----------------------------------------------------------
  52. ;       XMM_NOT_INIT
  53. ;----------------------------------------------------------
  54.  
  55. XMM_NOT_INIT    PROC         ; Wird eingesetzt,
  56.                              ;wenn kein XMM-Treiber
  57.                              ;vorhanden
  58.                 XOR AX,AX
  59.                 MOV BL,80h
  60.                 RET
  61. XMM_NOT_INIT    ENDP
  62.  
  63. ;----------------------------------------------------------
  64. ;       BOOL XMM_INSTALL (void)
  65. ;__________________________________________________________
  66.  
  67. XMM_INSTALL     PROC
  68.                 CMP XMM_INITIALIZED,0
  69.                 JNE IST_BEREITS_INSTALLIERT
  70.  
  71.                 MOV AX,4300h
  72.                 INT 2Fh
  73.                 CMP AL,80h
  74.                 JNE NO_DRIVER
  75.  
  76.                 MOV AX,4310h
  77.                 INT 2Fh
  78.                 MOV WORD PTR XMM_CONTROL,BX
  79.                 MOV WORD PTR XMM_CONTROL+2,ES
  80.  
  81.  
  82.                 INC XMM_INITIALIZED
  83.  
  84. IST_BEREITS_INSTALLIERT:
  85. NO_DRIVER:
  86.                 MOV AX,XMM_INITIALIZED
  87.                 RET
  88. XMM_INSTALL     ENDP
  89.  
  90.  
  91. ;----------------------------------------------------------
  92. ;       WORD XMM_VERSION?
  93. ;----------------------------------------------------------
  94.  
  95. XMM_VERSION?    PROC
  96.                 XOR AH,AH
  97.                 CALL XMM_CONTROL
  98.                 RET
  99. XMM_VERSION?    ENDP
  100.  
  101. ;----------------------------------------------------------
  102. ;       XMM_ALLOCATE(int SizeK)
  103. ;----------------------------------------------------------
  104.  
  105. XMM_ALLOCATE    PROC  SIZEK:WORD
  106.  
  107.                 MOV ERROR_FLAG,0
  108.                 MOV AH,09
  109.                 MOV DX,SIZEK
  110.                 CALL XMM_CONTROL
  111.  
  112.                 OR AX,AX
  113.                 JZ ALLOC_FAIL
  114.                 MOV AX,DX
  115.                 JNZ ALLOC_OK
  116. ALLOC_FAIL:
  117.                 MOV ERROR_FLAG,BL
  118. ALLOC_OK:
  119.                 RET
  120. XMM_ALLOCATE    ENDP
  121.  
  122. ;----------------------------------------------------------
  123. ;       long XMM_FREE_MEM(WORD Handle)
  124. ;----------------------------------------------------------
  125.  
  126. XMM_FREE_MEM    PROC HANDLE:WORD
  127.                 MOV ERROR_FLAG,0
  128.                 MOV AH,0Ah
  129.                 MOV DX,HANDLE
  130.                 CALL XMM_CONTROL
  131.                 XOR DX,DX
  132.                 OR AX,AX
  133.                 JZ FREE_OK
  134.                 MOV ERROR_FLAG,BL
  135. FREE_OK:
  136.                 RET
  137. XMM_FREE_MEM    ENDP
  138.  
  139.  
  140. ;----------------------------------------------------------
  141. ;       long XMM_MOVE(XMSMOVE *pInfo)
  142. ;----------------------------------------------------------
  143.  
  144. XMM_MOVE        PROC    pINFO:NEAR PTR
  145.                 MOV ERROR_FLAG,0
  146.                 MOV AH,0Bh
  147.                 MOV SI,pINFO
  148.                 CALL XMM_CONTROL
  149.  
  150.                 OR AX,AX
  151.                 JNZ MOVE_OK
  152.                 MOV ERROR_FLAG,BL
  153. MOVE_OK:
  154.                 RET
  155. XMM_MOVE        ENDP
  156.  
  157. ;----------------------------------------------------------
  158. ;        int     GET_XMS_SIZE(void)
  159. ;----------------------------------------------------------
  160.  
  161. GET_XMS_SIZE    PROC
  162.                 MOV ERROR_FLAG,0
  163.                 MOV AH,08
  164.                 CALL XMM_CONTROL
  165.                 OR AX,AX
  166.                 JNZ GET_XMS_SIZE_OK
  167.                 MOV ERROR_FLAG,BL
  168. GET_XMS_SIZE_OK:
  169.                 RET
  170. GET_XMS_SIZE    ENDP
  171.  
  172. ; =========================================================
  173. ;  Hier ist der Eintrittspunkt des Programms
  174. ; =========================================================
  175. ;
  176. START:
  177.                 MOV DX,@DATA  ; Datensegment initialisieren
  178.                 MOV DS,DX
  179.  
  180. ; =========================================================
  181. ; Testpuffer ausgeben
  182. ; =========================================================
  183. ;
  184.                 MOV AH,09
  185.                 MOV DX,OFFSET TEST_BUF
  186.                 INT 21h
  187.  
  188.                 CALL XMM_INSTALL        ; XMM installieren
  189.                 CMP AX,0                ; Alles klar?
  190.  
  191.                 JNE @F                  ; Ja, dann weiter
  192.                 JMP ERROR1
  193. @@:
  194.  
  195.                 MOV DX,OFFSET PROMPT1
  196.                 MOV AH,09
  197.                 INT 21h
  198.  
  199.                 ALLOC_SIZE EQU (BUFSIZE/1024)+1
  200.  
  201.                 CALL GET_XMS_SIZE ;Wieviel Extended-Memory
  202.                 CMP ERROR_FLAG,0  ;ist verfügbar?
  203.                 JE @F
  204.                 JMP ERROR5
  205. @@:
  206.                 MOV MEM_SIZE,DX   ;Größe des Extended-Memory
  207.                 MOV BLOCK_SIZE,AX ;Größter verfügbarer Block
  208.  
  209.                 MOV DX,OFFSET PROMPT2
  210.                 MOV AH,09
  211.                 INT 21h
  212.  
  213.                 CMP AX,ALLOC_SIZE ;Ist genug Ext.-Memory da?
  214.                 JNB @F            ;Ja, dann weiter
  215.                 JMP ERROR3
  216. @@:
  217.  
  218.                 MOV AX,ALLOC_SIZE ;Speicher anfordern
  219.                 PUSH AX
  220.                 CALL XMM_ALLOCATE
  221.                 ADD SP,2          ;Stack aufräumen
  222.  
  223.                 CMP ERROR_FLAG,0
  224.                 JZ @F
  225.                 JMP ERROR4
  226. @@:
  227.                 MOV MEM_HANDLE,AX ;Handle abspeichern!!!!!!
  228.  
  229.                 MOV DX,OFFSET PROMPT3
  230.                 MOV AH,09
  231.                 INT 21h
  232.  
  233. ; =========================================================
  234. ; Testpuffer in das Extended-Memory verschieben
  235. ; =========================================================
  236.  
  237.                 MOV SRC_HANDLE,0
  238.                 MOV WORD PTR SRC_POINTER,OFFSET TEST_BUF
  239.                 MOV WORD PTR SRC_POINTER+2,SEG TEST_BUF
  240.                 MOV AX,MEM_HANDLE
  241.                 MOV DST_HANDLE,AX
  242.                 MOV WORD PTR DST_POINTER,0
  243.                 MOV WORD PTR DST_POINTER+2,0
  244.                 MOV WORD PTR MOV_LAENGE,BUFSIZE
  245.                 MOV WORD PTR MOV_LAENGE+2,0
  246.  
  247. ; =========================================================
  248. ; Verschieberoutine aufrufen
  249. ; =========================================================
  250. ;
  251.                 LEA AX,XMM_INFO
  252.                 PUSH AX
  253.                 CALL XMM_MOVE
  254.                 ADD SP,2
  255.  
  256.                 CMP ERROR_FLAG,0
  257.                 JZ @F
  258.                 JMP ERROR2
  259. @@:
  260.  
  261. ; =========================================================
  262. ;       Testpuffer überschreiben
  263. ; =========================================================
  264. ;
  265.                 MOV CX,BUFSIZE-4
  266.                 MOV DX,@DATA
  267.                 MOV ES,DX
  268.                 LEA DI,TEST_BUF
  269.                 MOV AL,'X'
  270.                 REP STOSB
  271.  
  272. ; =========================================================
  273. ; Überschriebenen Testpuffer ausgeben
  274. ; =========================================================
  275. ;
  276.                 MOV AH,09
  277.                 MOV DX,OFFSET TEST_BUF
  278.                 INT 21h
  279. ; =========================================================
  280. ; Speicherblock von Extended-Memory zurück in den Puffer
  281. ; =========================================================
  282. ;
  283.                 MOV AX,MEM_HANDLE
  284.                 MOV SRC_HANDLE,AX
  285.                 MOV WORD PTR SRC_POINTER,0
  286.                 MOV WORD PTR SRC_POINTER+2,0
  287.                 MOV DST_HANDLE,0
  288.                 MOV WORD PTR DST_POINTER,OFFSET TEST_BUF
  289.                 MOV WORD PTR DST_POINTER+2,SEG TEST_BUF
  290.                 MOV WORD PTR MOV_LAENGE,BUFSIZE
  291.                 MOV WORD PTR MOV_LAENGE+2,0
  292.  
  293. ; =========================================================
  294. ; Verschieberoutine aufrufen
  295. ; =========================================================
  296. ;
  297.                 LEA AX,XMM_INFO
  298.                 PUSH AX
  299.                 CALL XMM_MOVE
  300.                 ADD SP,2
  301.  
  302.                 CMP ERROR_FLAG,0
  303.                 JZ @F
  304.                 JMP ERROR2
  305. @@:
  306.  
  307. ; =========================================================
  308. ; Testpuffer erneut ausgeben
  309. ; =========================================================
  310. ;
  311.                 MOV AH,09
  312.                 MOV DX,OFFSET TEST_BUF
  313.                 INT 21h
  314.  
  315.                 MOV AH,0Ch
  316.                 MOV DX,MEM_HANDLE
  317.                 CALL XMM_CONTROL
  318.  
  319.                 MOV AH,0Ah
  320.                 MOV DX,MEM_HANDLE
  321.                 CALL XMM_CONTROL
  322.  
  323. ENDE:
  324.                 MOV AH,4Ch
  325.                 INT 21h
  326.  
  327.  
  328. ; =========================================================
  329. ; Fehlerroutinen
  330. ; =========================================================
  331.  
  332. ERROR1:
  333.                 MOV DX,OFFSET TEXT1
  334.                 MOV AH,09
  335.                 INT 21h
  336.                 JMP ENDE
  337. ERROR2:
  338.                 MOV DX,OFFSET TEXT2
  339.                 MOV AH,09
  340.                 INT 21h
  341.                 JMP ENDE
  342. ERROR3:
  343.                 MOV DX,OFFSET TEXT3
  344.                 MOV AH,09
  345.                 INT 21h
  346.                 JMP ENDE
  347. ERROR4:
  348.                 MOV DX,OFFSET TEXT4
  349.                 MOV AH,09
  350.                 INT 21h
  351.                 JMP ENDE
  352. ERROR5:
  353.                 MOV DX,OFFSET TEXT5
  354.                 MOV AH,09
  355.                 INT 21h
  356.                 JMP ENDE
  357.  
  358. END START
  359. ; **********************************************************
  360. ; *                Ende von ASTOOL02.ASM                   *
  361.