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

  1. ; ==================================================================
  2. ; Dieses Programm schaltet über die Funktion 89h des Interrupts 15h
  3. ; in den Protected-Modus, gibt einen Ton aus und kehrt
  4. ; über einen Reset in den Real-Modus zurück.
  5. ; ==================================================================
  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        = 14        ; Anzahl der Deskriptoren in der IDT
  13.     CODE_DESCRIPT   = 48        ; Deskriptor-Index für Codesegment
  14.  
  15. IDT_DESCRIPT    MACRO   LIMIT,BASE_LOW,BASE_HIGH,ACCESS
  16.         DW      LIMIT
  17.         DW      BASE_LOW
  18.         DB      BASE_HIGH
  19.         DB      ACCESS
  20.         DW      0
  21.         ENDM
  22.  
  23. DESCRIPTOR      STRUC
  24.         LIMIT           DW ?
  25.         BASE_LOW        DW ?
  26.         BASE_HIGH       DB ?
  27.         ZUGRIFF         DB ?
  28.         DUMMY           DW 0
  29. DESCRIPTOR      ENDS
  30.  
  31. .DATA
  32.     MASK1_8259A DB ?
  33.     MASK2_8259A DB ?
  34.  
  35. ; ---------------------------------------------------------
  36. ; Sieben Deskriptoren für die GDT definieren
  37. ; ---------------------------------------------------------
  38.     GDT_START LABEL WORD
  39.  
  40.     DESCRIPTOR <0,0,0,0>
  41.     DESCRIPTOR <GDT_SIZE * 8,,,92h>
  42.     DESCRIPTOR <IDT_SIZE * 8,,,92h>
  43.     DESCRIPTOR <0FFFFh,,,92h>
  44.     DESCRIPTOR <0FFFFh,,,92h>
  45.     DESCRIPTOR <0FFFFh,,,92h>
  46.     DESCRIPTOR <0FFFFh,,,9Ah>
  47.  
  48. ; ---------------------------------------------------------
  49. ; Vierzehn Interrupt Deskriptoren definieren
  50. ; ---------------------------------------------------------
  51.  
  52.     IDT_START LABEL WORD
  53.     IDT_DESCRIPT FAULT00,CODE_DESCRIPT,0,86h
  54.     IDT_DESCRIPT FAULT01,CODE_DESCRIPT,0,86h
  55.     IDT_DESCRIPT FAULT02,CODE_DESCRIPT,0,86h
  56.     IDT_DESCRIPT FAULT03,CODE_DESCRIPT,0,86h
  57.     IDT_DESCRIPT FAULT04,CODE_DESCRIPT,0,86h
  58.     IDT_DESCRIPT FAULT05,CODE_DESCRIPT,0,86h
  59.     IDT_DESCRIPT FAULT06,CODE_DESCRIPT,0,86h
  60.     IDT_DESCRIPT FAULT07,CODE_DESCRIPT,0,86h
  61.     IDT_DESCRIPT FAULT08,CODE_DESCRIPT,0,86h
  62.     IDT_DESCRIPT FAULT09,CODE_DESCRIPT,0,86h
  63.     IDT_DESCRIPT FAULT10,CODE_DESCRIPT,0,86h
  64.     IDT_DESCRIPT FAULT11,CODE_DESCRIPT,0,86h
  65.     IDT_DESCRIPT FAULT12,CODE_DESCRIPT,0,86h
  66.     IDT_DESCRIPT FAULT13,CODE_DESCRIPT,0,86h
  67.  
  68. .CODE
  69.     DS_SAVE    DW ?
  70.     ES_SAVE    DW ?
  71.     SS_SAVE    DW ?
  72.  
  73. BEEP    PROC  FREQUENZ:WORD
  74.     MOV DI,FREQUENZ          ; Frequenz des Tones
  75.     MOV BX,10                ; Dauer des Tones in 0.2 Sek.
  76.     MOV AL,182               ; Timer initialisieren
  77.     OUT 43H,AL
  78.     MOV DX,12H               ; Zeitschleife festlegen
  79.     MOV AX,34DCh             ; Frequenz umrechnen
  80.     DIV DI
  81.     OUT 42H,AL               ; Umgerechnete Frequenz an den
  82.     MOV AL,AH                ; Timer schicken
  83.     OUT 42H,AL
  84.     IN  AL,61H               ; Inhalt des Ports 61h retten
  85.     MOV AH,AL
  86.     OR  AL,3                 ; Lautsprecher einschalten
  87.     OUT 61H,AL
  88. WARTE:
  89.     MOV CX,0DAD4h             ; Zeitschleife ca. 200 Millisekunden
  90. @@:
  91.     LOOP @B
  92.     DEC BX                   ; Zähler erniedrigen
  93.     JNZ WARTE                ; Ausschalten ?
  94.     MOV AL,AH                ; Port 61h wieder herstellen
  95.     OUT 61H,AL               ; das heißt Lautsprecher aus
  96.     RET
  97. BEEP    ENDP
  98.  
  99. ; ---------------------------------------------------------
  100. ; Rechnet eine Segment:Offset-Adresse in eine 24-Bit-Adresse
  101. ; um, die in der GDT abgelegt wird.
  102. ; ---------------------------------------------------------
  103.  
  104. SET_GDT_BASE    PROC BASE_OFF:WORD,BASE_SEG:WORD,GDT_NR:WORD
  105.  
  106.         PUSH AX
  107.         PUSH CX
  108.         PUSH DX
  109.         PUSH DI
  110.  
  111.         MOV AX,BASE_SEG
  112.         MOV DX,16
  113.         MUL DX
  114.         ADD AX,BASE_OFF
  115.         ADC DL,0
  116.  
  117.         MOV DI,GDT_NR
  118.         MOV CL,3
  119.         SHL DI,CL
  120.         ADD DI,2
  121.         MOV GDT_START[DI],AX
  122.         ADD DI,2
  123.         MOV BYTE PTR GDT_START[DI],DL
  124.  
  125.         POP DI
  126.         POP DX
  127.         POP CX
  128.         POP AX
  129.  
  130.         RET
  131.  
  132. SET_GDT_BASE    ENDP
  133.  
  134. ; ---------------------------------------------------------
  135. ; Hier beginnen die Interrupt-Routinen 0-13
  136. ; ---------------------------------------------------------
  137.  
  138. FAULT13:
  139.         PUSH 1000
  140.         CALL BEEP
  141.         MOV CX,0FFFFh
  142. @@:
  143.         LOOP @B
  144. FAULT12:
  145.         PUSH 1000
  146.         CALL BEEP
  147.         MOV CX,0FFFFh
  148. @@:
  149.         LOOP @B
  150. FAULT11:
  151.         PUSH 1000
  152.         CALL BEEP
  153.         MOV CX,0FFFFh
  154. @@:
  155.         NOP
  156.         NOP
  157.         NOP
  158.         LOOP @B
  159. FAULT10:
  160.         PUSH 1000
  161.         CALL BEEP
  162.         MOV CX,0FFFFh
  163. @@:
  164.         NOP
  165.         NOP
  166.         NOP
  167.         LOOP @B
  168. FAULT09:
  169.         PUSH 1000
  170.         CALL BEEP
  171.         MOV CX,0FFFFh
  172. @@:
  173.         NOP
  174.         NOP
  175.         NOP
  176.         LOOP @B
  177. FAULT08:
  178.         PUSH 1000
  179.         CALL BEEP
  180.         MOV CX,0FFFFh
  181. @@:
  182.         NOP
  183.         NOP
  184.         NOP
  185.         LOOP @B
  186. FAULT07:
  187.         PUSH 1000
  188.         CALL BEEP
  189.         MOV CX,0FFFFh
  190. @@:
  191.         NOP
  192.         NOP
  193.         NOP
  194.         LOOP @B
  195. FAULT06:
  196.         PUSH 1000
  197.         CALL BEEP
  198.         MOV CX,0FFFFh
  199. @@:
  200.         NOP
  201.         NOP
  202.         NOP
  203.         LOOP @B
  204. FAULT05:
  205.         PUSH 1000
  206.         CALL BEEP
  207.         MOV CX,0FFFFh
  208. @@:
  209.         NOP
  210.         NOP
  211.         NOP
  212.         LOOP @B
  213. FAULT04:
  214.         PUSH 1000
  215.         CALL BEEP
  216.         MOV CX,0FFFFh
  217. @@:
  218.         NOP
  219.         NOP
  220.         NOP
  221.         LOOP @B
  222. FAULT03:
  223.         PUSH 1000
  224.         CALL BEEP
  225.         MOV CX,0FFFFh
  226. @@:
  227.         NOP
  228.         NOP
  229.         NOP
  230.         LOOP @B
  231. FAULT02:
  232.         PUSH 1000
  233.         CALL BEEP
  234.         MOV CX,0FFFFh
  235. @@:
  236.         NOP
  237.         NOP
  238.         NOP
  239.         LOOP @B
  240. FAULT01:
  241.         PUSH 1000
  242.         CALL BEEP
  243.         MOV CX,0FFFFh
  244. @@:
  245.         NOP
  246.         NOP
  247.         NOP
  248.         LOOP @B
  249. FAULT00:
  250.         PUSH 1000
  251.         CALL BEEP
  252.         MOV CX,0FFFFh
  253. @@:
  254.         NOP
  255.         NOP
  256.         NOP
  257.         LOOP @B
  258.  
  259.         POP BX
  260.         POP BX
  261.         POP BX
  262.         POP BX
  263.  
  264. ; ---------------------------------------------------------
  265. ; Durchführen eines Reset
  266. ; ---------------------------------------------------------
  267.  
  268.         MOV AL,0FEh
  269.         OUT 64h,AL
  270.         HLT
  271.  
  272. ; ---------------------------------------------------------
  273. ; Hier wird nach einem Reset der Real-Modus wieder eingeleitet.
  274. ; ---------------------------------------------------------
  275.  
  276. PROC_MODE_EXIT:
  277.         MOV AX,CS:DS_SAVE
  278.         MOV DS,AX
  279.         MOV AX,CS:ES_SAVE
  280.         MOV ES,AX
  281.         MOV AX,CS:SS_SAVE
  282.         MOV SS,AX
  283.  
  284.         MOV AL,MASK1_8259A
  285.         OUT 021h,AL
  286.         MOV AL,MASK2_8259A
  287.         OUT 0A1h,AL
  288.  
  289.  
  290.         JMP ENDE
  291.  
  292. ; ---------------------------------------------------------
  293. ; Hier beginnt das Programm
  294. ; ---------------------------------------------------------
  295.  
  296. START:
  297.  
  298. ; ---------------------------------------------------------
  299. ; Initialisierung
  300. ; ---------------------------------------------------------
  301.  
  302.         MOV DX,@DATA
  303.         MOV DS,DX
  304.  
  305. ; ---------------------------------------------------------
  306. ; Die Basisadresse für die globalen Deskriptoren definieren
  307. ; ---------------------------------------------------------
  308.  
  309.         PUSH 1
  310.         PUSH DS
  311.         PUSH OFFSET GDT_START
  312.         CALL SET_GDT_BASE
  313.         ADD SP,6
  314.  
  315.         PUSH 2
  316.         PUSH DS
  317.         PUSH OFFSET IDT_START
  318.         CALL SET_GDT_BASE
  319.         ADD SP,6
  320.  
  321.         PUSH 3
  322.         PUSH DS
  323.         PUSH 0
  324.         CALL SET_GDT_BASE
  325.         ADD SP,6
  326.  
  327.         PUSH 4
  328.         PUSH DS
  329.         PUSH 0
  330.         CALL SET_GDT_BASE
  331.         ADD SP,6
  332.  
  333.         PUSH 5
  334.         PUSH SS
  335.         PUSH 0
  336.         CALL SET_GDT_BASE
  337.         ADD SP,6
  338.  
  339.         PUSH 6
  340.         PUSH CS
  341.         PUSH 0
  342.         CALL SET_GDT_BASE
  343.         ADD SP,6
  344.  
  345. ; ---------------------------------------------------------
  346. ; Segmentregister für den Real-Modus retten
  347. ; ---------------------------------------------------------
  348.  
  349.         MOV AX,DS
  350.         MOV CS:DS_SAVE,AX
  351.         MOV AX,ES
  352.         MOV CS:ES_SAVE,AX
  353.         MOV AX,SS
  354.         MOV CS:SS_SAVE,AX
  355.  
  356. ; ---------------------------------------------------------
  357. ; 8259A-Register retten
  358. ; ---------------------------------------------------------
  359.  
  360.         IN AL,021h
  361.         MOV MASK1_8259A,AL
  362.         IN AL,0A1h
  363.         MOV MASK2_8259A,AL
  364.  
  365. ; ---------------------------------------------------------
  366. ; CMOS für Neustart markieren, damit kein Warmstart erfolgt
  367. ; ---------------------------------------------------------
  368.  
  369.         MOV AL,0Fh
  370.         OUT 70h,AL
  371.         MOV AL,05h
  372.         OUT 71h,AL
  373.  
  374. ; ---------------------------------------------------------
  375. ; Sprungvektor für Neustart setzen
  376. ; ---------------------------------------------------------
  377.  
  378.         PUSH DS
  379.         MOV DX,0040h
  380.         MOV DS,DX
  381.         MOV DI,067h
  382.         MOV DX,OFFSET PROC_MODE_EXIT
  383.         MOV [DI],DX
  384.         ADD DI,2
  385.         MOV DX,CS
  386.         MOV [DI],DX
  387.         POP DS
  388.  
  389. ; ---------------------------------------------------------
  390. ; In den Protected-Modus schalten
  391. ; ---------------------------------------------------------
  392.  
  393.         MOV DX,DS
  394.         MOV ES,DX
  395.         LEA SI,GDT_START
  396.         MOV BH,00
  397.         MOV BL,08
  398.         MOV AH,89h
  399.         MOV CX,0FFFFh           ; Zeitschleife
  400. @@:
  401.  
  402.         LOOP @B
  403.         INT 15h
  404.  
  405.         PUSH 440
  406.         CALL BEEP
  407.  
  408.         MOV AL,0FEh            ; Reset durchführen
  409.         OUT 064h,AL
  410.         HLT
  411. ENDE:
  412.  
  413.         MOV AH,01              ; Warten auf Tastendruck
  414.         INT 21h
  415.  
  416.         MOV AH,4Ch             ; Zurück zu DOS
  417.         INT 21h
  418.  
  419. END START
  420. ;------------------- Ende von DATABOX.ASM  -----------------
  421.