Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: MNemo am 29. July 2006, 12:39
-
Hi
ich hab ein problem mit dem A20-Gate.
Meine Procedure, die das Gate activiert funktioniert zwar in DOS
aber bei beim booten hangt sie sicht auf. :cry:
CLI ;Disable Interrupts
CALL Enable_A20
STI ;Enable Interrupts
JC A20_Error
Enable_A20 PUSH AX
.1 IN AL, 0x64 ;Wait until KBC is ready for 0xD0 command
Test AL, 0x03
JNZ .1
MOV AL, 0xD0
OUT 0x64,AL
.2 IN AL, 0x64
TEST AL, 0x01 ; Wait until KBC has data
JZ .2
IN AL, 0x60
OR AL, 0x02
PUSH AX
.3 IN AL, 0x64 ; Wait until KBC is ready for Command
TEST AL, 0x02
JNZ .3
MOV AL, 0xD1
OUT 0x64,AL
.4 IN AL, 0x64 ; Wait until KBC is ready for Data
TEST AL, 0x02
JNZ .4
POP AX
OUT 0x60,AL
;Check
.5 IN AL, 0x64
Test AL, 0x03
JNZ .5
MOV AL, 0xD0
OUT 0x64,AL
.6 IN AL, 0x64
TEST AL, 0x01
JZ .6
IN AL, 0x60
SHR AL, 0x2 ;A20-Gate Bit to CF
JC .NoError ;CF Invertieren
STI
JC .Exit
.NoError CLI
.Exit POP AX
RET
könnt ihr mir vieleich sagen wo mein fehler ist?
-
Also dein Code den du verwendest funktioniert sowieso nicht auf allen PCs. Bei manchen geht er und bei manchen hängt der PC sich auf. Unter DOS geht es und beim Booten nicht? Ein und der selbe PC? Könnte vielleicht daranliegen das in DOS sowieso das A20 aktiviert wird (falls nicht geändert). Du meinst jetzt auch das echte DOS? Also dann wird der Code vielleicht bei deinem PC nicht funktionieren. Bei mir hat er bei 3 von 4 funktioniert. Beim 4 hat der PC sich aufgehangen. Ich habe jetzt den Code verkleinert wie er auch in vielen Tutorials zu finden ist. Da funktioniert er bis jetzt auf allen PCs die ich damit hab laufen lassen. Hier:
;set A20-Gate
Empty8084 ;macro
mov al,0D1h ;command write
out 64h,al
Empty8084 ;macro
mov al,0DFh ;enable A20 (Bit 1 gesetzt)
out 60h,al
Empty8084 ;macro
...
macro Empty8084
{
local Empty8084Adr
Empty8084Adr:
in al,64h
test al,00000010b ;2
jnz Empty8084Adr
}
Ich hoffe mal der funst bei dir auch. So wie ich es mitbekommen habe, sollte der auf den gängigsten PCs funktionieren. Ich habe aber gehört das es keine aktivierung des A20 gibt die auf allen PCs funktioniert. Selbst M$ hatte unter DOS Probleme damit. Die Testen in ihrer Himem.sys auf sämtliche PCs um dann dementsprechend zu aktivieren. Aber den genauen Code kennt wohl nur M$ und evt. IBM.
bitmaster
-
Hab grad rausgefunden das dafür ne BIOS funktion gibt
die müste doch eigendlich auf allen PC laufen oder!?
-
Hab grad rausgefunden das dafür ne BIOS funktion gibt
die müste doch eigendlich auf allen PC laufen oder!?
Stimmt, habe ich gerade gar nicht dran gedacht. Weiß ich gar nicht genau, aber die sollte schon funktionieren. Versuchs doch einfach. ;-)
bitmaster
-
deaktivier mal vor der Routine Interrupts (cli),
das war bei mir jedenfalls das Problem
-
deaktivier mal vor der Routine Interrupts (cli),
das war bei mir jedenfalls das Problem
hab ich doch (weils sonst in dos auch nit gefunzt hätte, da ist es dann aber irgend wann weiter gegangen wenn man aufm KB rumgehämmert hat)
-
Also das mit dem Interrupt hat unter DOS nit gefunzt.
Ich hab aber das hier Note: bit 0 (system reset) should always be set when writing the output
port, as the system may hang constantly; use pulse output port
(command FEh) instead.
in Ralf Brown's Port liste gefunden
Da ist es ja kein wunder, dass sich das auf hängt