Make IMULD more compatible in overflow cases
This commit is contained in:
parent
96d73bab99
commit
a3107a73ef
6 changed files with 159 additions and 76 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue