home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 07_08 / grdlagen / assemble / testprog.asm < prev    next >
Encoding:
Assembly Source File  |  1991-04-14  |  7.2 KB  |  202 lines

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