/media/sda-magnetic/david/Dokumente-16-2024-08-01/informatikUmathematik/excersize20240906before/test20240828004.asm


    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