From 65ca078b55a19859477075f21432bfb235785f8e Mon Sep 17 00:00:00 2001 From: Jeff Parsons Date: Sat, 9 May 2015 09:34:18 -0700 Subject: [PATCH] Fixed paging test and newAddr() --- modules/pcjs/bin/romtests.json | 2 +- modules/pcjs/lib/debugger.js | 4 ++-- tests/pc/80386/tests.nasm | 28 ++++++++++++++++------------ 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/modules/pcjs/bin/romtests.json b/modules/pcjs/bin/romtests.json index 168d9ef63..a40b43ce4 100644 --- a/modules/pcjs/bin/romtests.json +++ b/modules/pcjs/bin/romtests.json @@ -78,7 +78,7 @@ "debugger": { "id": "pc386.debugger", "name": "", - "commands": "bp F000:825F;g", + "commands": "", "messages": "" } } diff --git a/modules/pcjs/lib/debugger.js b/modules/pcjs/lib/debugger.js index 7c37dafe5..43d18b02d 100644 --- a/modules/pcjs/lib/debugger.js +++ b/modules/pcjs/lib/debugger.js @@ -1594,7 +1594,7 @@ if (DEBUGGER) { * @this {Debugger} * @param {number|null|undefined} [off] (default is zero) * @param {number|null|undefined} [sel] (default is null) - * @param {number|null|undefined} [addr] (default is zero) + * @param {number|null|undefined} [addr] (default is undefined) * @param {boolean} [fData32] (default is false) * @param {boolean} [fAddr32] (default is false) * @return {{DbgAddr}} @@ -1603,7 +1603,7 @@ if (DEBUGGER) { { if (fData32 === undefined) fData32 = (this.cpu && this.cpu.segCS.dataSize == 4); if (fAddr32 === undefined) fAddr32 = (this.cpu && this.cpu.segCS.addrSize == 4); - return {off: off || 0, sel: sel || null, addr: addr || 0, fTempBreak: false, fData32: fData32 || false, fAddr32: fAddr32 || false}; + return {off: off || 0, sel: sel || null, addr: addr, fTempBreak: false, fData32: fData32 || false, fAddr32: fAddr32 || false}; }; /** diff --git a/tests/pc/80386/tests.nasm b/tests/pc/80386/tests.nasm index 1653339e4..e93813bcd 100644 --- a/tests/pc/80386/tests.nasm +++ b/tests/pc/80386/tests.nasm @@ -39,7 +39,7 @@ bits 16 -PAGING equ 0 +PAGING equ 1 ; ; If we built our data structures in RAM, we might use the first page of RAM (0x0000-0x0fff) like so: @@ -199,18 +199,21 @@ initGDT: %endif ; ; Now we want to build a page directory and a page table, but we need two pages of - ; 4K-aligned physical memory. We can use hard-coded addresses in we're running in ROM, - ; otherwise we ask DOS for some memory. + ; 4K-aligned physical memory. We can use a hard-coded address (segment 0x100, corresponding + ; to physical address 0x1000) if we're running in ROM; otherwise, we ask DOS for some memory. ; cmp ax,CSEG_REAL - mov edi,0x1000 ; default to the 2nd physical page in low memory + mov ax,0x100 ; default to the 2nd physical page in low memory je initPages + mov bx,0x1000 ; 4K paragraphs == 64K bytes mov ah,DOS_SETBLOCK ; resize the current block so we can allocate a new block int INT_DOS jnc allocPages + exitErrDOSMem: mov dx,errDOSMem + exitErrDOS: mov ah,DOS_STD_CON_STRING_OUTPUT int INT_DOS @@ -231,20 +234,21 @@ allocPages: ; ; AX == segment of 64K memory block ; +initPages: movzx eax,ax shl eax,4 add eax,0xfff and eax,~0xfff - mov edi,eax ; EDI == first physical 4K-aligned page within the 64K - -initPages: - mov esi,edi ; ESI == saved copy of EDI + mov esi,eax ; ESI == first physical 4K-aligned page within the given segment + shr eax,4 + mov es,ax + xor edi,edi ; - ; Build a page directory at EDI with only 1 valid PDE (the first one) + ; Build a page directory at ES:EDI with only 1 valid PDE (the first one) ; cld cli ; make sure interrupts are still off (in case any DOS calls turned them back on) - mov eax,edi + mov eax,esi add eax,0x1000 ; EAX == page frame address (of the next page) or eax,PTE_USER | PTE_READWRITE | PTE_PRESENT stosd @@ -284,7 +288,7 @@ toProt32: ; ; Test moving a segment register to a 32-bit memory location ; -test1: 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 mov [0x0000],eax mov [0x0000],ds @@ -295,7 +299,7 @@ test1: mov edx,[0x0000] ; save the DWORD at 0x0000:0x0000 in EDX xor eax,0xffff0000 cmp eax,[0x0000] 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 ; ; Test moving a byte to a 32-bit register with sign-extension