index : archi486 | |
Archlinux32 i486 tools | gitolite user |
summaryrefslogtreecommitdiff |
author | Andreas Baumann <mail@andreasbaumann.cc> | 2022-09-02 09:18:52 +0200 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2022-09-02 09:18:52 +0200 |
commit | 52be99d8c0862ff87db9a4f9ccec1ac4b5f7caed (patch) | |
tree | 1a1a1c98090afd8459cc8f045f9de2d4a7cba5ab /floppy/tests | |
parent | 15adaba9eaa6a98c8b55bc5c5f73c3a9e0e55e7a (diff) |
-rw-r--r-- | floppy/tests/test_a20.asm | 61 | ||||
-rw-r--r-- | floppy/tests/test_unreal.asm | 49 |
diff --git a/floppy/tests/test_a20.asm b/floppy/tests/test_a20.asm new file mode 100644 index 0000000..43da6e3 --- /dev/null +++ b/floppy/tests/test_a20.asm @@ -0,0 +1,61 @@ +; The following code is public domain licensed + +[bits 16] + +; Function: check_a20 +; +; Purpose: to check the status of the a20 line in a completely self-contained state-preserving way. +; The function can be modified as necessary by removing push's at the beginning and their +; respective pop's at the end if complete self-containment is not required. +; +; Returns: 0 in ax if the a20 line is disabled (memory wraps around) +; 1 in ax if the a20 line is enabled (memory does not wrap around) + +check_a20: + pushf + push ds + push es + push di + push si + + cli + + xor ax, ax ; ax = 0 + mov es, ax + + not ax ; ax = 0xFFFF + mov ds, ax + + mov di, 0x0500 + mov si, 0x0510 + + mov al, byte [es:di] + push ax + + mov al, byte [ds:si] + push ax + + mov byte [es:di], 0x00 + mov byte [ds:si], 0xFF + + cmp byte [es:di], 0xFF + + pop ax + mov byte [ds:si], al + + pop ax + mov byte [es:di], al + + mov ax, 0 + je check_a20__exit + + mov ax, 1 + +check_a20__exit: + pop si + pop di + pop es + pop ds + popf + + ret diff --git a/floppy/tests/test_unreal.asm b/floppy/tests/test_unreal.asm new file mode 100644 index 0000000..687a528 --- /dev/null +++ b/floppy/tests/test_unreal.asm @@ -0,0 +1,49 @@ +; Assembly example + +; nasm boot.asm -o boot.bin +; partcopy boot.bin 0 200 -f0 + +[ORG 0x7c00] ; add to offsets + +start: xor ax, ax ; make it zero + mov ds, ax ; DS=0 + mov ss, ax ; stack starts at seg 0 + mov sp, 0x9c00 ; 2000h past code start, + ; making the stack 7.5k in size + + cli ; no interrupts + push ds ; save real mode + + lgdt [gdtinfo] ; load gdt register + + mov eax, cr0 ; switch to pmode by + or al,1 ; set pmode bit + mov cr0, eax + + jmp $+2 ; tell 386/486 to not crash + + mov bx, 0x08 ; select descriptor 1 + mov ds, bx ; 8h = 1000b + + and al,0xFE ; back to realmode + mov cr0, eax ; by toggling bit again + + pop ds ; get back old segment + sti + + mov bx, 0x0f01 ; attrib/char of smiley + mov eax, 0x0b8000 ; note 32 bit offset + mov word [ds:eax], bx + + jmp $ ; loop forever + +gdtinfo: + dw gdt_end - gdt - 1 ;last byte in table + dd gdt ;start of table + +gdt dd 0,0 ; entry 0 is always unused +flatdesc db 0xff, 0xff, 0, 0, 0, 10010010b, 11001111b, 0 +gdt_end: + + times 510-($-$$) db 0 ; fill sector w/ 0's + dw 0xAA55 ; Required by some BIOSes |