Make IMULD more compatible in overflow cases

This commit is contained in:
Jeff Parsons 2015-10-17 08:39:38 -07:00
commit a3107a73ef
6 changed files with 159 additions and 76 deletions

View file

@ -1,7 +1,10 @@
all: test386.json
all: test386.json test386.img
test386.com: test386.nasm ../inc/dos.inc ../inc/misc.inc ../inc/x86.inc
nasm -i../inc/ -f bin test386.nasm -l test386.lst -o test386.com
test386.json: test386.com
node ../../../modules/filedump/bin/filedump --file=test386.com --output=test386.json --overwrite
test386.img: test386.com
node ../../../modules/diskdump/bin/diskdump --path=test386.com --output=test386.img --format=img --overwrite

View file

@ -146,8 +146,11 @@ start: nop
;
mov sp,tempStack
;
; Quick test of unsigned 32-bit multiplication and division
; Quick tests of unsigned 32-bit multiplication and division
;
mov eax,0x80000001
imul eax
mov eax,0x44332211
mov ebx,eax
mov ecx,0x88776655
@ -719,23 +722,35 @@ printVal:
ret
TYPE_ARITH equ 0
TYPE_LOGIC equ 1
TYPE_ARITH1 equ 1
TYPE_LOGIC equ 2
TYPE_MULDIV equ 3
SIZE_BYTE equ 0
SIZE_SHORT equ 1
SIZE_LONG equ 2
%macro defOp 5
%macro defOp 6
%ifidni %3,al
%assign size SIZE_BYTE
%elifidni %3,dl
%assign size SIZE_BYTE
%elifidni %3,ax
%assign size SIZE_SHORT
%elifidni %3,dx
%assign size SIZE_SHORT
%else
%assign size SIZE_LONG
%endif
db %%end-%%beg,%5,size
%%name: db %1,0
%%beg: %2 %3,%4
db %%end-%%beg,%6,size
%%name:
db %1,0
%%beg:
%ifidni %4,none
%2 %3
%else
%2 %3,%4
%endif
ret
%%end:
%endmacro
@ -746,37 +761,50 @@ strPS: db "PS=",0
achSize db "BWD"
tableOps:
defOp "ADD",add,al,dl,TYPE_ARITH
defOp "ADD",add,ax,dx,TYPE_ARITH
defOp "ADD",add,eax,edx,TYPE_ARITH
defOp "OR",or,al,dl,TYPE_LOGIC
defOp "OR",or,ax,dx,TYPE_LOGIC
defOp "OR",or,eax,edx,TYPE_LOGIC
defOp "ADC",adc,al,dl,TYPE_ARITH
defOp "ADC",adc,ax,dx,TYPE_ARITH
defOp "ADC",adc,eax,edx,TYPE_ARITH
defOp "SBB",sbb,al,dl,TYPE_ARITH
defOp "SBB",sbb,ax,dx,TYPE_ARITH
defOp "SBB",sbb,eax,edx,TYPE_ARITH
defOp "AND",and,al,dl,TYPE_LOGIC
defOp "AND",and,ax,dx,TYPE_LOGIC
defOp "AND",and,eax,edx,TYPE_LOGIC
defOp "SUB",sub,al,dl,TYPE_ARITH
defOp "SUB",sub,ax,dx,TYPE_ARITH
defOp "SUB",sub,eax,edx,TYPE_ARITH
defOp "XOR",xor,al,dl,TYPE_LOGIC
defOp "XOR",xor,ax,dx,TYPE_LOGIC
defOp "XOR",xor,eax,edx,TYPE_LOGIC
defOp "CMP",cmp,al,dl,TYPE_ARITH
defOp "CMP",cmp,ax,dx,TYPE_ARITH
defOp "CMP",cmp,eax,edx,TYPE_ARITH
defOp "ADD",add,al,dl,none,TYPE_ARITH
defOp "ADD",add,ax,dx,none,TYPE_ARITH
defOp "ADD",add,eax,edx,none,TYPE_ARITH
defOp "OR",or,al,dl,none,TYPE_LOGIC
defOp "OR",or,ax,dx,none,TYPE_LOGIC
defOp "OR",or,eax,edx,none,TYPE_LOGIC
defOp "ADC",adc,al,dl,none,TYPE_ARITH
defOp "ADC",adc,ax,dx,none,TYPE_ARITH
defOp "ADC",adc,eax,edx,none,TYPE_ARITH
defOp "SBB",sbb,al,dl,none,TYPE_ARITH
defOp "SBB",sbb,ax,dx,none,TYPE_ARITH
defOp "SBB",sbb,eax,edx,none,TYPE_ARITH
defOp "AND",and,al,dl,none,TYPE_LOGIC
defOp "AND",and,ax,dx,none,TYPE_LOGIC
defOp "AND",and,eax,edx,none,TYPE_LOGIC
defOp "SUB",sub,al,dl,none,TYPE_ARITH
defOp "SUB",sub,ax,dx,none,TYPE_ARITH
defOp "SUB",sub,eax,edx,none,TYPE_ARITH
defOp "XOR",xor,al,dl,none,TYPE_LOGIC
defOp "XOR",xor,ax,dx,none,TYPE_LOGIC
defOp "XOR",xor,eax,edx,none,TYPE_LOGIC
defOp "CMP",cmp,al,dl,none,TYPE_ARITH
defOp "CMP",cmp,ax,dx,none,TYPE_ARITH
defOp "CMP",cmp,eax,edx,none,TYPE_ARITH
defOp "INC",inc,al,none,none,TYPE_ARITH1
defOp "INC",inc,ax,none,none,TYPE_ARITH1
defOp "INC",inc,eax,none,none,TYPE_ARITH1
defOp "DEC",dec,al,none,none,TYPE_ARITH1
defOp "DEC",dec,ax,none,none,TYPE_ARITH1
defOp "DEC",dec,eax,none,none,TYPE_ARITH1
defOp "IMULA",imul,dl,none,none,TYPE_MULDIV
defOp "IMULA",imul,dx,none,none,TYPE_MULDIV
defOp "IMULA",imul,edx,none,none,TYPE_MULDIV
defOp "IMUL",imul,ax,dx,none,TYPE_MULDIV
defOp "IMUL",imul,eax,edx,none,TYPE_MULDIV
db 0
align 4
typeMasks:
dd PS_ARITH
dd PS_ARITH
dd PS_LOGIC
dd PS_MULDIV
arithValues:
.bvals: dd 0x00,0x01,0x02,0x7E,0x7F,0x80,0x81,0xFE,0xFF
@ -788,6 +816,16 @@ arithValues:
.dvals: dd 0x00000000,0x00000001,0x00000002,0x7FFFFFFE,0x7FFFFFFF,0x80000000,0x80000001,0xFFFFFFFE,0xFFFFFFFF
ARITH_DWORDS equ ($-.dvals)/4
muldivValues:
.bvals: dd 0x00,0x01,0x02,0x3F,0x40,0x41,0x7E,0x7F,0x80,0x81,0xFE,0xFF
MULDIV_BYTES equ ($-.bvals)/4
.wvals: dd 0x0000,0x0001,0x0002,0x3FFF,0x4000,0x4001,0x7FFE,0x7FFF,0x8000,0x8001,0xFFFE,0xFFFF
MULDIV_WORDS equ ($-.wvals)/4
.dvals: dd 0x00000000,0x00000001,0x00000002,0x3FFFFFFF,0x40000000,0x40000001,0x7FFFFFFE,0x7FFFFFFF,0x80000000,0x80000001,0xFFFFFFFE,0xFFFFFFFF
MULDIV_DWORDS equ ($-.dvals)/4
typeValues:
;
; Values for TYPE_ARITH
@ -797,12 +835,26 @@ typeValues:
dd ARITH_BYTES+ARITH_WORDS+ARITH_DWORDS,arithValues,ARITH_BYTES+ARITH_WORDS+ARITH_DWORDS,arithValues
dd 0,0,0,0
;
; Values for TYPE_LOGIC (I'm using ARITH values for now)
; Values for TYPE_ARITH1
;
dd ARITH_BYTES,arithValues,1,arithValues
dd ARITH_BYTES+ARITH_WORDS,arithValues,1,arithValues
dd ARITH_BYTES+ARITH_WORDS+ARITH_DWORDS,arithValues,1,arithValues
dd 0,0,0,0
;
; Values for TYPE_LOGIC (using ARITH values for now)
;
dd ARITH_BYTES,arithValues,ARITH_BYTES,arithValues
dd ARITH_BYTES+ARITH_WORDS,arithValues,ARITH_BYTES+ARITH_WORDS,arithValues
dd ARITH_BYTES+ARITH_WORDS+ARITH_DWORDS,arithValues,ARITH_BYTES+ARITH_WORDS+ARITH_DWORDS,arithValues
dd 0,0,0,0
;
; Values for TYPE_MULDIV (a superset of ARITH values)
;
dd MULDIV_BYTES,muldivValues,MULDIV_BYTES,muldivValues
dd MULDIV_BYTES+MULDIV_WORDS,muldivValues,MULDIV_BYTES+MULDIV_WORDS,muldivValues
dd MULDIV_BYTES+MULDIV_WORDS+MULDIV_DWORDS,muldivValues,MULDIV_BYTES+MULDIV_WORDS+MULDIV_DWORDS,muldivValues
dd 0,0,0,0
error: jmp error

View file

@ -12,6 +12,7 @@ PS_DF equ 0x0400
PS_OF equ 0x0800
PS_ARITH equ (PS_CF | PS_PF | PS_AF | PS_ZF | PS_SF | PS_OF)
PS_LOGIC equ (PS_CF | PS_PF | PS_ZF | PS_SF | PS_OF)
PS_MULDIV equ (PS_CF | PS_OF)
CR0_MSW_PE equ 0x0001
CR0_PG equ 0x80000000 ; set if paging enabled