Revised tests

This commit is contained in:
Jeff Parsons 2015-05-08 16:35:36 -07:00 committed by jeffpar
commit e4eb0764d7

View file

@ -13,9 +13,9 @@
; See the machine definition file in /modules/pcjs/bin/romtests.json for a configuration that can ; See the machine definition file in /modules/pcjs/bin/romtests.json for a configuration that can
; load this file as a ROM image. ; load this file as a ROM image.
; ;
; PROT32 Notes ; REAL32 Notes
; ----------------- ; ------------
; PROT32 is NOT enabled by default, because based on what I've seen in VirtualBox (and notes ; REAL32 is NOT enabled by default, because based on what I've seen in VirtualBox (and notes
; at http://geezer.osdevbrasil.net/johnfine/segments.htm), if CS is loaded with a 32-bit code segment ; at http://geezer.osdevbrasil.net/johnfine/segments.htm), if CS is loaded with a 32-bit code segment
; while in protected-mode and we then return to real-mode, even if we immediately perform a FAR jump ; while in protected-mode and we then return to real-mode, even if we immediately perform a FAR jump
; with a real-mode CS, the base of CS will be updated, but all the other segment attributes, like ; with a real-mode CS, the base of CS will be updated, but all the other segment attributes, like
@ -25,9 +25,9 @@
; ;
; The work-around: load CS with a 16-bit code segment BEFORE returning to real-mode. ; The work-around: load CS with a 16-bit code segment BEFORE returning to real-mode.
; ;
; "Unreal mode" works by setting other segment registers (eg, DS, ES) to 32-bit segments, not CS. ; "Unreal mode" works by setting other segment registers (eg, DS, ES) to 32-bit segments before
; SS should not be set to a 32-bit segment either, because that causes implicit pushes to use ESP ; returning to real-mode -- just not CS. SS shouldn't be set to a 32-bit segment either, because
; instead of SP, even in real-mode. ; that causes implicit pushes to use ESP instead of SP, even in real-mode.
; ;
cpu 386 cpu 386
org 0x100 org 0x100
@ -190,7 +190,7 @@ initGDT:
add eax,myGDT ; EAX == physical address of myGDT add eax,myGDT ; EAX == physical address of myGDT
mov [cs:addrGDT+2],eax ; update the 32-bit base address of myGDT in addrGDT mov [cs:addrGDT+2],eax ; update the 32-bit base address of myGDT in addrGDT
mov ax,cs mov ax,cs
%ifdef PROT32 %ifdef REAL32
mov [cs:jmpReal+5],ax ; update the segment of the FAR jump that returns us to real-mode mov [cs:jmpReal+5],ax ; update the segment of the FAR jump that returns us to real-mode
%else %else
mov [cs:jmpReal+3],ax mov [cs:jmpReal+3],ax
@ -272,7 +272,6 @@ goProt: o32 lgdt [cs:addrGDT]
or eax,CR0_MSW_PE or eax,CR0_MSW_PE
%endif %endif
mov cr0,eax mov cr0,eax
jmpProt:
jmp CSEG_PROT32:toProt32 jmp CSEG_PROT32:toProt32
toProt32: toProt32:
@ -284,54 +283,57 @@ toProt32:
; ;
; Test moving a segment register to a 32-bit memory location ; Test moving a segment register to a 32-bit memory location
; ;
mov edx,[0x0000] ; save the DWORD at 0x0000:0x0000 in EDX test1: mov edx,[0x0000] ; save the DWORD at 0x0000:0x0000 in EDX
or eax,-1 or eax,-1
mov [0x0000],eax mov [0x0000],eax
mov [0x0000],ds mov [0x0000],ds
mov ax,ds mov ax,ds
cmp eax,[0x0000] cmp eax,[0x0000]
err1a: jne err1a jne error
mov eax,ds mov eax,ds
xor eax,0xffff0000 xor eax,0xffff0000
cmp eax,[0x0000] cmp eax,[0x0000]
err1b: jne err1b jne error
mov [0x0000],edx ; restore the DWORD at 0x0000:0x0000 from EDX mov [0x0000],edx ; restore the DWORD at 0x0000:0x0000 from EDX
jmp test2 jmp test2
; ;
; Test moving a byte to a 32-bit register with sign-extension ; Test moving a byte to a 32-bit register with sign-extension
; ;
test2: movsx eax,byte [hiByte] test2: movsx eax,byte [0xfffff]
cmp eax,0xffffff80 cmp eax,0xffffff80
err2: ; jne err2 jne error
; ;
; Test moving a word to a 32-bit register with sign-extension ; Test moving a word to a 32-bit register with sign-extension
; ;
movsx eax,word [hiWord] test3: movsx eax,word [0xffffe]
cmp eax,0xffff80fc cmp eax,0xffff80fc
err3: ; jne err3 jne error
; ;
; Test moving a byte to a 32-bit register with zero-extension ; Test moving a byte to a 32-bit register with zero-extension
; ;
movzx eax,byte [hiByte] test4: movzx eax,byte [0xfffff]
cmp eax,0x00000080 cmp eax,0x00000080
err4: ; jne err4 jne error
; ;
; Test moving a word to a 32-bit register with zero-extension ; Test moving a word to a 32-bit register with zero-extension
; ;
movzx eax,word [hiWord] test5: movzx eax,word [0xffffe]
cmp eax,0x000080fc cmp eax,0x000080fc
err5: ; jne err5 jne error
jmp doneProt
error: nop
doneProt:
%ifndef REAL32
; ;
; Return to real-mode now, after first loading CS with a 16-bit code segment ; Return to real-mode now, after first loading CS with a 16-bit code segment
; ;
jmp CSEG_PROT16:toProt16 jmp CSEG_PROT16:toProt16
toProt16: toProt16:
bits 16 bits 16
%endif
goReal: mov eax,cr0 goReal: mov eax,cr0
and eax,~(CR0_MSW_PE | CR0_PG) and eax,~(CR0_MSW_PE | CR0_PG)
@ -355,5 +357,5 @@ jmpStart:
db 0x20 db 0x20
db '04/04/15' db '04/04/15'
hiWord: db 0xFC ; 0000FFFE FC (Model ID byte) db 0xFC ; 0000FFFE FC (Model ID byte)
hiByte: db 0x80 ; 0000FFFF 80 (normally, location of a checksum byte) db 0x80 ; 0000FFFF 80 (normally, location of a checksum byte)