home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 07_08 / grdlagen / assemble / promode.asm next >
Encoding:
Assembly Source File  |  1991-04-22  |  5.9 KB  |  207 lines

  1. ;-----------------------------------------------------------
  2. ;          Anfang Beispiel-Listing "PROMODE.ASM"
  3. ; Assembler-Ecke 07'91,  (c)  1991  toolbox  &  P.Monadjemi
  4. ; Dieses Programm initialisiert das Cache-Segmentregister
  5. ; des FS-Registers, so daß auch im Real-Modus ein Adreßraum
  6. ; von 4 GByte zur Verfügung steht.
  7. ; Wichtig: Da die A20-Leitung über die Funktionen von
  8. ; HIMEM.SYS ein- und ausgeschaltet wird, muß dieser Treiber
  9. ; vorhanden sein!
  10.  
  11. .386P   ; Assembler assembliert 80386-Protected-Mode Befehle
  12.  
  13.  
  14. STACK   SEGMENT STACK    ; Ein Stacksegment
  15.                          ; wird für den XMS-Treiber benötigt
  16.         DW 100h DUP (?)
  17. STACK   ENDS
  18.  
  19. DESCRIPTOR STRUC         ; Strukturtyp für den Deskriptor
  20.            LIMIT0_15       DW ?    ; Segmentgröße  0-15
  21.            BASIS0_15       DW ?    ; Basisadresse  0-15
  22.            BASIS16_23      DB ?    ; Basisadresse 16-23
  23.            ZUGRIFF         DB ?    ; Zugriffsrechte
  24.            EXTRA           DB ?    ; Zusätzliche Segmentinfo
  25.            BASIS24_31      DB ?    ; Basisadresse 24-31
  26. DESCRIPTOR ENDS
  27.  
  28. CODE    SEGMENT USE16    ; Hier beginnt das Codesegment
  29.         ASSUME CS:CODE,DS:CODE
  30.  
  31. GDT_ADR LABEL FWORD      ; Adresse und Größe der GDT
  32. DW 24                    ; Größe der GDT
  33. DD ?                     ; Startadresse der GDT
  34.  
  35. GDT_START LABEL DWORD          ; Hier beginnt die GDT
  36. D0 DESCRIPTOR <0,0,0,0,0,0>    ; Offset 0 - Dummy-Deskriptor
  37. D1 DESCRIPTOR <0FFFFh,0,0,92h,8Fh,0> ; Offset 8 - Des.für FS
  38.  
  39. XMSControl    DD 0           ; Adresse des XMS-Handlers
  40. ADRESSE_32BIT DD 8388568     ; Adresse im Extended-Memory
  41.  
  42. ERROR_TEXT1 DB 'HIMEM.SYS nicht gefunden!',07,10,13,'$'
  43. ERROR_TEXT2 DB 'Problem mit der A20-Leitung!',07,10,13,'$'
  44. OLD_BUF     DB 10,13,'Dieser Text war im Extended-Memory!'
  45.                ,'$'
  46. STRING_LEN = $ - OLD_BUF
  47.  
  48. NEW_BUF      DB (STRING_LEN - 1)  DUP (32)
  49.              DB '$'
  50.  
  51. SETUP_PMODE  PROC    ; Setzt Segmentgröße für FS auf 4 GByte
  52.  
  53.  MOV AX,CS ; Startadresse der GDT in 20-Bit-Format berechnen
  54.  AND EAX,0FFFFh
  55.  SHL EAX,4
  56.  ADD EAX,OFFSET GDT_START
  57.  MOV DWORD PTR GDT_ADR+2,EAX
  58.  LGDT GDT_ADR    ; LGDT-Register bereits im Real-Modus laden
  59.  
  60.  MOV EAX,CR0             ; PE-Bit im CR0-Register setzen
  61.  OR EAX,1
  62.  MOV CR0,EAX
  63.  JMP SHORT NEXT_BYTE     ; Warteschlange leeren
  64.  NEXT_BYTE:
  65.  MOV BX,8                ; 1. Deskriptor in FS-Cache laden
  66.  MOV FS,BX
  67.  AND AL,0FEh             ; Zurück in den Real-Modus
  68.  MOV CR0,EAX
  69.  RET
  70. SETUP_PMODE ENDP
  71.  
  72. ADRESSE EQU [BP+04]
  73. WERT    EQU [BP+08]
  74.  
  75. READ_BYTE   PROC        ; Ein Byte aus Extended-Memory lesen
  76.  PUSH BP                ; Stackrahmen aufbauen
  77.  MOV BP,SP
  78.  XOR BX,BX
  79.  MOV FS,BX
  80.  MOV EAX,ADRESSE
  81.  MOV AL,FS:[EAX]        ; Byte nach AL lesen
  82.  XOR AH,AH
  83.  POP BP
  84.  RET
  85. READ_BYTE       ENDP
  86.  
  87. WRITE_BYTE      PROC    ; Byte in Extended-Memory schreiben
  88.  PUSH BP
  89.  MOV BP,SP
  90.  XOR BX,BX
  91.  MOV FS,BX
  92.  MOV EAX,ADRESSE
  93.  MOV BX,WERT
  94.  MOV FS:[EAX],BL
  95.  POP BP
  96.  RET
  97. WRITE_BYTE      ENDP
  98.  
  99. NO_NMI          MACRO        ; NMI-Verarbeitung abschalten
  100.                 IN AL,07Fh
  101.                 OR AL,80h
  102.                 OUT 07Fh,AL
  103.                 ENDM
  104.  
  105. YES_NMI         MACRO        ; NMI wieder erlaubt
  106.                 IN AL,07Fh
  107.                 AND AL,07Fh
  108.                 OUT 07Fh,AL
  109.                 ENDM
  110.  
  111.                 ON  = 1
  112.                 OFF = 0
  113.  
  114. SET_A20         MACRO ZUSTAND; A20-Leitung ein-/ausschalten
  115.                 IF ZUSTAND EQ OFF
  116.                  MOV AH,06h
  117.                 ELSE
  118.                  MOV AH,05h
  119.                 ENDIF
  120.                 CALL XMSControl
  121.                 ENDM
  122.  
  123. START:
  124.  PUSH CS          ; DS mit CS laden
  125.  POP DS
  126.  
  127.  MOV AX,4300h     ; Ist HIMEM.SYS da?
  128.  INT 2Fh
  129.  CMP AL,80h
  130.  JNE NoXMS        ; Nein, dann Abbruch
  131.  MOV AX,4310h     ; Adresse des XMS-Treibers ermitteln
  132.  INT 2Fh          ; und abspeichern
  133.  
  134.  MOV WORD PTR [XMSControl],BX
  135.  MOV WORD PTR [XMSControl+2],ES
  136.  
  137.  CLI              ; Kein Interrupts bitte
  138.  NO_NMI           ; Und keinen NMI
  139.  
  140.  SET_A20 ON       ; A20-Leitung frei
  141.  CMP AX,1         ; Operation geglückt?
  142.  JNE A20_PROBLEM  ; Nein, dann Abbruch
  143.  CALL SETUP_PMODE ; Segmentgröße von FS auf 4 GByte setzen
  144.  
  145.  STI              ; Interrupts wieder zulassen
  146.  YES_NMI
  147.  
  148. ; ---------------------------------------------------------
  149. ; Ein String wird in das Extended-Memory geschrieben
  150. ; ---------------------------------------------------------
  151.  
  152.  LEA DI,OLD_BUF        ; Adresse des alten Puffers laden
  153.  MOV CX,STRING_LEN+1   ; Länge des Strings
  154.  MOV EAX,ADRESSE_32BIT ; Beliebige 32-Bit-Adresse
  155. M1:
  156.  XOR BH,BH             ; Puffer in das Extended-Memory an
  157.  MOV BL,[DI]           ; eine beliebige Adresse schreiben
  158.  PUSH BX
  159.  PUSH EAX
  160.  CALL WRITE_BYTE
  161.  ADD SP,6
  162.  INC EAX
  163.  INC DI
  164.  LOOP M1
  165.  
  166. ; ---------------------------------------------------------
  167. ; Ein String wird aus dem Extended-Memory gelesen
  168. ; ---------------------------------------------------------
  169.  
  170.  LEA DI,NEW_BUF          ; Adresse des neuen Puffers laden
  171.  MOV CX,STRING_LEN+1     ; Länge des Strings
  172.  MOV EAX,ADRESSE_32BIT   ; 32-Bit-Adresse
  173. M2:
  174.  PUSH EAX                ; Abgesp.String aus Extended-Memory
  175.  CALL READ_BYTE          ; in einen anderen Puffer laden
  176.  MOV [DI],AL
  177.  INC DI
  178.  POP EAX
  179.  INC EAX
  180.  LOOP M2
  181.  
  182.  MOV DX,OFFSET NEW_BUF   ; Neuen Pufferinhalt ausgeben
  183.  MOV AH,09
  184.  INT 21h
  185.  
  186.  SET_A20 OFF             ; A20-Leitung wieder sperren
  187.  CMP AX,1                ; Alles klar?
  188.  JNE A20_PROBLEM         ; Nein, dann kurze Mitteilung
  189. ENDE:
  190.  MOV AH,4Ch              ; Das ist das Ende
  191.  INT 21h
  192.  
  193. NoXMS:                   ; Fehlermeldung ausgeben
  194.   MOV DX,OFFSET ERROR_TEXT1
  195.   MOV AH,09
  196.   INT 21h
  197.   JMP ENDE
  198. A20_PROBLEM:             ; Fehlermeldung ausgeben
  199.   MOV DX,OFFSET ERROR_TEXT2
  200.   MOV AH,09
  201.   INT 21h
  202.   JMP ENDE
  203. CODE            ENDS
  204. END START
  205. ;-----------------------------------------------------------
  206. ;-                  Ende von "PROMODE.ASM"                 -
  207.