home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 05 / praxis / realpro.asm < prev    next >
Encoding:
Assembly Source File  |  1991-04-03  |  7.8 KB  |  219 lines

  1. ; =========================================================
  2. ; Programm schaltet über die Funktion 89h des Int. 15h
  3. ; in den Protected-Modus, gibt einen Ton aus und kehrt
  4. ; über einen Reset in den Real-Modus zurück.
  5. ;         (c) 1991 Peter Monadjemi & toolbox
  6. ; =========================================================
  7. .MODEL SMALL,C
  8. .286                       ; Befehle der 80286-CPU zulassen
  9. .STACK
  10.  
  11.  GDT_SIZE        =  8  ; Anzahl der Deskriptoren in der GDT
  12.  IDT_SIZE        =  0  ; Anzahl der Deskriptoren in der IDT
  13.  CODE_DESCRIPT   = 48  ; Deskriptor-Index für Codesegment
  14.  
  15. DESCRIPTOR      STRUC
  16.                     LIMIT           DW ?
  17.                     BASE_LOW        DW ?
  18.                     BASE_HIGH       DB ?
  19.                     ZUGRIFF         DB ?
  20.                     DUMMY           DW 0
  21. DESCRIPTOR      ENDS
  22.  
  23. .DATA
  24.           MASK1_8259A DB ?
  25.           MASK2_8259A DB ?
  26.  
  27. ; ---------------------------------------------------------
  28. ; Sieben Deskriptoren für die GDT definieren
  29. ; ---------------------------------------------------------
  30.           GDT_START LABEL WORD
  31.           DESCRIPTOR <0,0,0,0>
  32.           DESCRIPTOR <GDT_SIZE * 8,,,92h>
  33.           DESCRIPTOR <IDT_SIZE * 8,,,92h>
  34.           DESCRIPTOR <0FFFFh,,,92h>
  35.           DESCRIPTOR <0FFFFh,,,92h>
  36.           DESCRIPTOR <0FFFFh,,,92h>
  37.           DESCRIPTOR <0FFFFh,,,9Ah>
  38. .CODE
  39.           DS_SAVE    DW ?
  40.           ES_SAVE    DW ?
  41.           SS_SAVE    DW ?
  42.  
  43. BEEP    PROC  FREQUENZ:WORD
  44.           MOV DI,FREQUENZ       ; Frequenz des Tones
  45.           MOV BX,10     ; Dauer des Tones in 0.2 Sek.
  46.           MOV AL,182    ; Timer initialisieren
  47.           OUT 43H,AL
  48.           MOV DX,12H    ; Zeitschleife festlegen
  49.           MOV AX,34DCh  ; Frequenz umrechnen
  50.           DIV DI
  51.           OUT 42H,AL    ; Umgerechnete Frequenz an den
  52.           MOV AL,AH     ; Timer schicken
  53.           OUT 42H,AL
  54.           IN  AL,61H    ; Inhalt des Ports 61h retten
  55.           MOV AH,AL
  56.           OR  AL,3      ; Lautsprecher einschalten
  57.           OUT 61H,AL
  58. WARTE:
  59.           MOV CX,0DAD4h ; Zeitschleife ca. 200 Millisekunden
  60. @@:
  61.           LOOP @B
  62.           DEC BX        ; Zähler erniedrigen
  63.           JNZ WARTE     ; Ausschalten ?
  64.           MOV AL,AH     ; Port 61h wieder herstellen
  65.           OUT 61H,AL    ; das heißt Lautsprecher aus
  66.           RET
  67. BEEP    ENDP
  68.  
  69. ; ----------------------------------------------------------
  70. ; Rechnet eine Segment:Offset-Adresse in eine 24-Bit-Adresse
  71. ; um, die in der GDT abgelegt wird.
  72. ; ----------------------------------------------------------
  73.  
  74. SET_GDT_BASE    PROC BASE_OFF:WORD,BASE_SEG:WORD,GDT_NR:WORD
  75.                     PUSH AX
  76.                     PUSH CX
  77.                     PUSH DX
  78.                     PUSH DI
  79.                     MOV AX,BASE_SEG
  80.                     MOV DX,16
  81.                     MUL DX
  82.                     ADD AX,BASE_OFF
  83.                     ADC DL,0
  84.                     MOV DI,GDT_NR
  85.                     MOV CL,3
  86.                     SHL DI,CL
  87.                     ADD DI,2
  88.                     MOV GDT_START[DI],AX
  89.                     ADD DI,2
  90.                     MOV BYTE PTR GDT_START[DI],DL
  91.                     POP DI
  92.                     POP DX
  93.                     POP CX
  94.                     POP AX
  95.                     RET
  96.  
  97. SET_GDT_BASE    ENDP
  98. ; ---------------------------------------------------------
  99. ; Durchführen eines Reset
  100. ; ---------------------------------------------------------
  101.                     MOV AL,0FEh
  102.                     OUT 64h,AL
  103.                     HLT
  104. ; ---------------------------------------------------------
  105. ; Hier wird nach einem Reset der Real-Modus eingeleitet.
  106. ; ---------------------------------------------------------
  107.  
  108. PROC_MODE_EXIT:
  109.                     MOV AX,CS:DS_SAVE
  110.                     MOV DS,AX
  111.                     MOV AX,CS:ES_SAVE
  112.                     MOV ES,AX
  113.                     MOV AX,CS:SS_SAVE
  114.                     MOV SS,AX
  115.                     MOV AL,MASK1_8259A
  116.                     OUT 021h,AL
  117.                     MOV AL,MASK2_8259A
  118.                     OUT 0A1h,AL
  119.                     JMP ENDE
  120. ; ---------------------------------------------------------
  121. ; Hier beginnt das Programm
  122. ; ---------------------------------------------------------
  123. START:
  124. ; ---------------------------------------------------------
  125. ; Initialisierung
  126. ; ---------------------------------------------------------
  127.                     MOV DX,@DATA
  128.                     MOV DS,DX
  129. ; ---------------------------------------------------------
  130. ; Die Basisadresse für die globalen Deskriptoren definieren
  131. ; ---------------------------------------------------------
  132.                     PUSH 1
  133.                     PUSH DS
  134.                     PUSH OFFSET GDT_START
  135.                     CALL SET_GDT_BASE
  136.                     ADD SP,6
  137.                     PUSH 3
  138.                     PUSH DS
  139.                     PUSH 0
  140.                     CALL SET_GDT_BASE
  141.                     ADD SP,6
  142.                     PUSH 4
  143.                     PUSH DS
  144.                     PUSH 0
  145.                     CALL SET_GDT_BASE
  146.                     ADD SP,6
  147.                     PUSH 5
  148.                     PUSH SS
  149.                     PUSH 0
  150.                     CALL SET_GDT_BASE
  151.                     ADD SP,6
  152.                     PUSH 6
  153.                     PUSH CS
  154.                     PUSH 0
  155.                     CALL SET_GDT_BASE
  156.                     ADD SP,6
  157. ; ---------------------------------------------------------
  158. ; Segmentregister für den Real-Modus retten
  159. ; ---------------------------------------------------------
  160.                     MOV AX,DS
  161.                     MOV CS:DS_SAVE,AX
  162.                     MOV AX,ES
  163.                     MOV CS:ES_SAVE,AX
  164.                     MOV AX,SS
  165.                     MOV CS:SS_SAVE,AX
  166. ; ---------------------------------------------------------
  167. ; 8259A-Register retten
  168. ; ---------------------------------------------------------
  169.                     IN AL,021h
  170.                     MOV MASK1_8259A,AL
  171.                     IN AL,0A1h
  172.                     MOV MASK2_8259A,AL
  173. ; ---------------------------------------------------------
  174. ; CMOS für Neustart markieren, damit kein Warmstart erfolgt
  175. ; ---------------------------------------------------------
  176.                     MOV AL,0Fh
  177.                     OUT 70h,AL
  178.                     MOV AL,05h
  179.                     OUT 71h,AL
  180. ; ---------------------------------------------------------
  181. ; Sprungvektor für Neustart setzen
  182. ; ---------------------------------------------------------
  183.                     PUSH DS
  184.                     MOV DX,0040h
  185.                     MOV DS,DX
  186.                     MOV DI,067h
  187.                     MOV DX,OFFSET PROC_MODE_EXIT
  188.                     MOV [DI],DX
  189.                     ADD DI,2
  190.                     MOV DX,CS
  191.                     MOV [DI],DX
  192.                     POP DS
  193. ; ---------------------------------------------------------
  194. ; In den Protected-Modus schalten
  195. ; ---------------------------------------------------------
  196.                     MOV DX,DS
  197.                     MOV ES,DX
  198.                     LEA SI,GDT_START
  199.                     MOV BH,00
  200.                     MOV BL,08
  201.                     MOV AH,89h
  202.                     MOV CX,0FFFFh  ; Zeitschleife
  203. @@:
  204.                     LOOP @B
  205.                     INT 15h
  206.                     PUSH 440
  207.                     CALL BEEP
  208.                     MOV AL,0FEh    ; Reset durchführen
  209.                     OUT 064h,AL
  210.                     HLT
  211. ENDE:
  212.                     MOV AH,01      ; Warten auf Tastendruck
  213.                     INT 21h
  214.                     MOV AH,4Ch     ; Zurück zu DOS
  215.                     INT 21h
  216. END START
  217. ; =========================================================
  218. ; =                 Ende von REALPRO.ASM                  =
  219.