mov ax, 0x07C0
mov ds, ax
mov es, ax
mov si, str1
call putstr
mov si, str2
call putstr
mov si, str3
call putstr
mov si, str4
call putstr
; mov si, str5
; call putst
; mov si, str6
; call putstr
; mov si, str7
; call putstr
; mov si, str8
; call putstr
loop1: jmp loop1
load_blocks512_in_ram:
xor ax, ax
int 0x13
jnc load_blocks512_in_ram
mov bx, 0x2000
mov dl, 0x00
mov al, 4
mov ch, 0
mov cl, 2
mov dh, 0
int 0x13
jc load_blocks512_in_ram
jmp 0x0000:0x2000
str1 db "Ich werde zusammen mit ihnen das Paging des IA32 Testen", 0x0d, 0x0a, 0
str2 db "Heute ist der 27-08-2024", 0x0d, 0x0a, 0
str3 db "Heute ist Programmiertag", 0x0d, 0x0a, 0
str4 db "Wir werden das einschliesslich MMX und Co KG oefter machen", 0x0d, 0x0a, 0
;str5 db "Wir werden jetzt etwas kompliziert in den Protected Mode wechseln", 0x0d, 0x0a, 0
;str6 db "unter einen Diskette muessen wir uns nichts kompliziertes vorstellen", 0x0d, 0x0a, 0
;str7 db "Ein Sektor ist ein Mathematischer Sektor, das ist eine Schnitte im Kuchen, wenn man sie herausschneidet, das heisst, mathematisch, vom Kreis", 0x0d, 0x0a, 0
;str8 db "Wir muessen uns nur merken, Cylinder - also welcher Ring, Radius, Head, also Kopf bei Festplatten mit 4er Stapel, 4 ansonsten, Diskette, vorne und hinten und Kuchenscheibe", 0x0d, 0x0a, 0
putstr:
lodsb
or al, al
jz endputstr
mov ah, 0x0e
int 0x10
jmp putstr
endputstr:
ret
times 510-($-$$) db 0
db 0x55
db 0xAA
org 0x2000
[BITS 16]
cli
lgdt [gdtr]
in al, 0x92
cmp al, 0xff
je nofastA20
or al, 2
and al, ~1
out 0x92, al
jmp A20done
nofastA20:
call empty8042
mov al, 0xd1
out 0x64, al
call empty8042
mov al, 0xdf
out 0x60, al
call empty8042
A20done:
mov eax, cr0
or eax, 1
mov cr0, eax
jmp 0x2:ProtectedMode
empty8042:
call waitloop
in al, 0x64
cmp al, 0xff
je done
test al, 1
jz nooutput
call waitloop
in al, 0x60
jmp empty8042
nooutput:
test al, 2
jnz empty8042
done:
ret
[Bits 32]
ProtectedMode:
mov ax, 0x10
mov ds, ax
mov ss, ax
mov es, ax
xor eax, eax
mov fs, ax
mov gs, ax
mov esp, 0x200000 ;
mov ah, 0x01
mov esi, msgprotectedmode
call putstr32
pmloopend: jmp pmloopend
waitloop:
mov ebx,0x9ffff
loopstart:
dec ebx
jnz loopstart
ret
putstr32:
mov edi, [videobuffer]
nextchar:
lodsb
test al, al
jz end
stosw
jmp nextchar
end:
mov [videobuffer], edi
ret
videobuffer dd 0xb8000
msgprotectedmode db "Wir sind jetzt im Protected Mode, das A20 und das A21 Gate muessen sie kennen, das setzt die Prozedur vor dem Einschalten des Protected Modes vorraus, die uebrigen Sektoren ausser dem Bootsektor muessen vorher in den RAM und was eine Segment Deskriptor Tabelle ist, muss man auch lernen, bei IA32 und ebenso dass man jetzt keine Interrupts hat, sondern in den Videopuffer schreiben muss,", 0
nulldescriptor:
dd 0
dd 0
codesegmentdescriptor:
dw 0xFFFF
dw 0
db 0
db 10011010b
db 11001111b
db 0
datasegmentdescriptor:
dw 0xFFFF
dw 0
db 0
db 10010010b
db 11001111b
db 0
gdtr:
Limit dw 24
Base dd nulldescriptor
times 2048-($-$$) hlt