648 lines
13 KiB
NASM
648 lines
13 KiB
NASM
|
; Tests for opcode range 0xF0-FF
|
||
|
; ---------------------------------
|
||
|
|
||
|
|
||
|
; 0xF4 - HALT
|
||
|
; ############################################################
|
||
|
|
||
|
TEST_F4_0:
|
||
|
sti
|
||
|
mov ax,0001
|
||
|
hlt ; Two halts in a row
|
||
|
hlt ; Should wait for two interrupts
|
||
|
|
||
|
|
||
|
; 0xF5 - CMC
|
||
|
; ############################################################
|
||
|
|
||
|
TEST_F5_0:
|
||
|
stc ; Set Carry Flag
|
||
|
cmc ; Compliment the Carry Flag
|
||
|
jc FAIL_F5_0 ; Carry should not be set
|
||
|
|
||
|
clc ; Clear Carry Flag
|
||
|
cmc ; Compliment the Carry Flag
|
||
|
jnc FAIL_F5_0 ; Carry should be set
|
||
|
jmp TEST_F6_0
|
||
|
|
||
|
|
||
|
FAIL_F5_0:
|
||
|
mov dx,00035 ; Print a 5
|
||
|
mov ax,00202
|
||
|
int 021
|
||
|
|
||
|
|
||
|
; 0xF6
|
||
|
; ############################################################
|
||
|
|
||
|
TEST_F6_0: ; TEST REG8/MEM8 , IMM8
|
||
|
mov dh,05A
|
||
|
test dh,0A5
|
||
|
jne FAIL_F6_0
|
||
|
|
||
|
mov byte[00050],081
|
||
|
test byte [00050],018
|
||
|
jne FAIL_F6_0
|
||
|
|
||
|
mov bl,011
|
||
|
test bl,011
|
||
|
je FAIL_F6_0
|
||
|
|
||
|
mov byte[00050],055
|
||
|
test byte [00050],055
|
||
|
je FAIL_F6_0
|
||
|
jmp TEST_F6_1
|
||
|
|
||
|
FAIL_F6_0:
|
||
|
mov dx,00036 ; Print a 6
|
||
|
mov ax,00202
|
||
|
int 021
|
||
|
|
||
|
|
||
|
TEST_F6_1: ; NOT REG8/MEM8
|
||
|
mov bl,055
|
||
|
not bl
|
||
|
cmp bl,0AA
|
||
|
jne FAIL_F6_1
|
||
|
|
||
|
mov byte[00050],033
|
||
|
not byte[00050]
|
||
|
cmp byte[00050],0CC
|
||
|
jne FAIL_F6_1
|
||
|
jmp TEST_F6_2
|
||
|
|
||
|
FAIL_F6_1:
|
||
|
mov dx,00036 ; Print a 6
|
||
|
mov ax,00202
|
||
|
int 021
|
||
|
|
||
|
|
||
|
|
||
|
TEST_F6_2: ; NEG REG8/MEM8
|
||
|
mov bl,055
|
||
|
neg bl
|
||
|
cmp bl,0AB
|
||
|
jne FAIL_F6_2
|
||
|
|
||
|
mov byte[00050],033
|
||
|
neg byte[00050]
|
||
|
cmp byte[00050],0CD
|
||
|
jne FAIL_F6_2
|
||
|
|
||
|
clc
|
||
|
mov dh,022 ; Carry should be set
|
||
|
neg dh
|
||
|
jnc FAIL_F6_2
|
||
|
|
||
|
mov dh,080 ; Overflow should be set
|
||
|
neg dh
|
||
|
jno FAIL_F6_2
|
||
|
mov dh,001 ; Overflow should NOT be set
|
||
|
neg dh
|
||
|
jo FAIL_F6_2
|
||
|
|
||
|
mov dh,0EE ; Parity should be set
|
||
|
neg dh
|
||
|
jnp FAIL_F6_2
|
||
|
mov dh,055 ; Parity should NOT be set
|
||
|
neg dh
|
||
|
jp FAIL_F6_2
|
||
|
|
||
|
mov dh,055 ; Sign should be set
|
||
|
neg dh
|
||
|
jns FAIL_F6_2
|
||
|
mov dh,0F5 ; Sign should NOT be set
|
||
|
neg dh
|
||
|
js FAIL_F6_2
|
||
|
|
||
|
mov dh,000 ; Zero should be set
|
||
|
neg dh
|
||
|
jnz FAIL_F6_2
|
||
|
mov dh,080 ; Zero should NOT be set
|
||
|
neg dh
|
||
|
jz FAIL_F6_2
|
||
|
jmp TEST_F6_3
|
||
|
|
||
|
FAIL_F6_2:
|
||
|
mov dx,00036 ; Print a 6
|
||
|
mov ax,00202
|
||
|
int 021
|
||
|
|
||
|
|
||
|
|
||
|
TEST_F6_3: ; MUL REG8/MEM8
|
||
|
mov ax,00000
|
||
|
mov cx,01111
|
||
|
mov bx,00000
|
||
|
mov dx,00000
|
||
|
L_F6_0:
|
||
|
mul cl
|
||
|
add bx,ax
|
||
|
inc dl
|
||
|
mov al,dl
|
||
|
mov ah,000
|
||
|
loop L_F6_0
|
||
|
cmp bx,01C30
|
||
|
jne FAIL_F6_3
|
||
|
jmp TEST_F6_4
|
||
|
|
||
|
FAIL_F6_3:
|
||
|
mov dx,00036 ; Print a 6
|
||
|
mov ax,00202
|
||
|
int 021
|
||
|
|
||
|
|
||
|
|
||
|
TEST_F6_4: ; IMUL REG8/MEM8
|
||
|
mov ax,00000
|
||
|
mov cx,01111
|
||
|
mov bx,00000
|
||
|
mov dx,00000
|
||
|
L_F6_1:
|
||
|
imul cl
|
||
|
add bx,ax
|
||
|
inc dl
|
||
|
mov al,dl
|
||
|
mov ah,000
|
||
|
loop L_F6_1
|
||
|
cmp bx,09C30
|
||
|
jne FAIL_F6_4
|
||
|
jmp TEST_F6_5
|
||
|
|
||
|
FAIL_F6_4:
|
||
|
mov dx,00036 ; Print a 6
|
||
|
mov ax,00202
|
||
|
int 021
|
||
|
|
||
|
|
||
|
TEST_F6_5: ; DIV REG8/MEM8
|
||
|
mov ax,000FF
|
||
|
mov cx,000FF
|
||
|
mov bx,00000
|
||
|
L_F6_2:
|
||
|
cmp cl,000
|
||
|
je DONE_F6_5
|
||
|
div cl
|
||
|
add bx,ax
|
||
|
mov ax,000FF
|
||
|
loop L_F6_2
|
||
|
DONE_F6_5:
|
||
|
cmp bx,0C8B1
|
||
|
jne FAIL_F6_5
|
||
|
jmp TEST_F6_6
|
||
|
|
||
|
FAIL_F6_5:
|
||
|
mov dx,00036 ; Print a 6
|
||
|
mov ax,00202
|
||
|
int 021
|
||
|
|
||
|
|
||
|
TEST_F6_6: ; IDIV REG8/MEM8
|
||
|
mov ax,0007F
|
||
|
mov cx,0007F
|
||
|
mov bx,00000
|
||
|
L_F6_3:
|
||
|
cmp cl,000
|
||
|
je DONE_F6_6
|
||
|
idiv cl
|
||
|
add bx,ax
|
||
|
mov ax,0007F
|
||
|
loop L_F6_3
|
||
|
DONE_F6_6:
|
||
|
cmp bx,0237D
|
||
|
jne FAIL_F6_6
|
||
|
jmp TEST_F7_0
|
||
|
|
||
|
FAIL_F6_6:
|
||
|
mov dx,00036 ; Print a 6
|
||
|
mov ax,00202
|
||
|
int 021
|
||
|
|
||
|
|
||
|
|
||
|
; 0xF7
|
||
|
; ############################################################
|
||
|
|
||
|
TEST_F7_0: ; TEST REG16/MEM16 , IMM16
|
||
|
mov dx,0115A
|
||
|
test dx,022A5
|
||
|
jne FAIL_F7_0
|
||
|
|
||
|
mov word[00050],01181
|
||
|
test word [00050],02218
|
||
|
jne FAIL_F7_0
|
||
|
|
||
|
mov bx,03311
|
||
|
test bx,03311
|
||
|
je FAIL_F7_0
|
||
|
|
||
|
mov word[00050],05555
|
||
|
test word [00050],05555
|
||
|
je FAIL_F7_0
|
||
|
jmp TEST_F7_1
|
||
|
|
||
|
FAIL_F7_0:
|
||
|
mov dx,00037 ; Print a 7
|
||
|
mov ax,00202
|
||
|
int 021
|
||
|
|
||
|
|
||
|
|
||
|
TEST_F7_1: ; NOT REG16/MEM16
|
||
|
mov bx,05555
|
||
|
not bx
|
||
|
cmp bx,0AAAA
|
||
|
jne FAIL_F7_1
|
||
|
|
||
|
mov word[00050],03333
|
||
|
not word[00050]
|
||
|
cmp word[00050],0CCCC
|
||
|
jne FAIL_F7_1
|
||
|
jmp TEST_F7_2
|
||
|
|
||
|
FAIL_F7_1:
|
||
|
mov dx,00037 ; Print a 7
|
||
|
mov ax,00202
|
||
|
int 021
|
||
|
|
||
|
|
||
|
|
||
|
TEST_F7_2: ; NEG REG16/MEM16
|
||
|
mov bx,05555
|
||
|
neg bx
|
||
|
cmp bx,0AAAB
|
||
|
jne FAIL_F7_2
|
||
|
|
||
|
mov word[00050],01234
|
||
|
neg word[00050]
|
||
|
cmp word[00050],0EDCC
|
||
|
jne FAIL_F7_2
|
||
|
|
||
|
clc
|
||
|
mov dx,0789A ; Carry should be set
|
||
|
neg dx
|
||
|
jnc FAIL_F7_2
|
||
|
|
||
|
mov dx,08000 ; Overflow should be set
|
||
|
neg dx
|
||
|
jno FAIL_F7_2
|
||
|
mov dx,00001 ; Overflow should NOT be set
|
||
|
neg dx
|
||
|
jo FAIL_F7_2
|
||
|
|
||
|
mov dx,000EE ; Parity should be set
|
||
|
neg dx
|
||
|
jnp FAIL_F7_2
|
||
|
mov dx,00055 ; Parity should NOT be set
|
||
|
neg dx
|
||
|
jp FAIL_F7_2
|
||
|
|
||
|
mov dx,00055 ; Sign should be set
|
||
|
neg dx
|
||
|
jns FAIL_F7_2
|
||
|
mov dx,0FFF5 ; Sign should NOT be set
|
||
|
neg dx
|
||
|
js FAIL_F7_2
|
||
|
|
||
|
mov dx,00000 ; Zero should be set
|
||
|
neg dx
|
||
|
jnz FAIL_F7_2
|
||
|
mov dx,00080 ; Zero should NOT be set
|
||
|
neg dx
|
||
|
jz FAIL_F7_2
|
||
|
jmp TEST_F7_3
|
||
|
|
||
|
FAIL_F7_2:
|
||
|
mov dx,00037 ; Print a 7
|
||
|
mov ax,00202
|
||
|
int 021
|
||
|
|
||
|
|
||
|
TEST_F7_3: ; MUL REG16/MEM16
|
||
|
mov ax,00000
|
||
|
mov cx,0FFFF
|
||
|
mov bx,00000
|
||
|
mov dx,00000
|
||
|
L_F7_0:
|
||
|
mov ax,cx
|
||
|
not ax
|
||
|
mul cx
|
||
|
add bx,ax
|
||
|
add bx,dx
|
||
|
loop L_F7_0
|
||
|
cmp bx,0AAAC
|
||
|
jne FAIL_F7_3
|
||
|
jmp TEST_F7_4
|
||
|
|
||
|
FAIL_F7_3:
|
||
|
mov dx,00037 ; Print a 7
|
||
|
mov ax,00202
|
||
|
int 021
|
||
|
|
||
|
|
||
|
|
||
|
TEST_F7_4: ; IMUL REG16/MEM16
|
||
|
mov ax,00000
|
||
|
mov cx,0FFFF
|
||
|
mov bx,00000
|
||
|
mov dx,00000
|
||
|
L_F7_1:
|
||
|
mov ax,cx
|
||
|
not ax
|
||
|
imul cx
|
||
|
add bx,ax
|
||
|
add bx,dx
|
||
|
loop L_F7_1
|
||
|
cmp bx,02AAC
|
||
|
jne FAIL_F7_4
|
||
|
jmp TEST_F7_5
|
||
|
|
||
|
FAIL_F7_4:
|
||
|
mov dx,00037 ; Print a 7
|
||
|
mov ax,00202
|
||
|
int 021
|
||
|
|
||
|
|
||
|
TEST_F7_5: ; DIV REG16/MEM16
|
||
|
mov dx,01234
|
||
|
mov ax,05678
|
||
|
mov cx,0ABCD
|
||
|
div cx
|
||
|
cmp ax,01b20
|
||
|
jne FAIL_F7_5
|
||
|
cmp dx,03DD8
|
||
|
jne FAIL_F7_5
|
||
|
|
||
|
mov dx,00000
|
||
|
mov ax,0FACE
|
||
|
mov cx,00055
|
||
|
div cx
|
||
|
cmp ax,02F3
|
||
|
jne FAIL_F7_5
|
||
|
cmp dx,0001F
|
||
|
jne FAIL_F7_5
|
||
|
|
||
|
mov dx,00000
|
||
|
mov ax,00000
|
||
|
mov cx,00055
|
||
|
div cx
|
||
|
cmp ax,00000
|
||
|
jne FAIL_F7_5
|
||
|
cmp dx,00000
|
||
|
jne FAIL_F7_5
|
||
|
|
||
|
; IDIV REG16/MEM16
|
||
|
mov dx,01234
|
||
|
mov ax,05678
|
||
|
mov cx,0ABCD
|
||
|
idiv cx
|
||
|
cmp ax,0C8A7
|
||
|
jne FAIL_F7_5
|
||
|
cmp dx,01BBD
|
||
|
jne FAIL_F7_5
|
||
|
|
||
|
mov dx,00000
|
||
|
mov ax,0FACE
|
||
|
mov cx,00055
|
||
|
idiv cx
|
||
|
cmp ax,002F3
|
||
|
jne FAIL_F7_5
|
||
|
cmp dx,0001F
|
||
|
jne FAIL_F7_5
|
||
|
|
||
|
mov dx,00000
|
||
|
mov ax,00000
|
||
|
mov cx,00055
|
||
|
idiv cx
|
||
|
cmp ax,00000
|
||
|
jne FAIL_F7_5
|
||
|
cmp dx,00000
|
||
|
jne FAIL_F7_5
|
||
|
|
||
|
jmp TEST_FE_0
|
||
|
|
||
|
|
||
|
FAIL_F7_5:
|
||
|
mov dx,00037 ; Print a 7
|
||
|
mov ax,00202
|
||
|
int 021
|
||
|
|
||
|
|
||
|
; 0xFE
|
||
|
; ############################################################
|
||
|
|
||
|
TEST_FE_0: ; INC REG8/MEM8
|
||
|
mov dh,044
|
||
|
inc dh
|
||
|
cmp dh,045
|
||
|
jne FAIL_FE_0
|
||
|
|
||
|
mov byte[00050],033
|
||
|
inc byte[00050]
|
||
|
cmp byte[00050],034
|
||
|
jne FAIL_FE_0
|
||
|
|
||
|
mov al,07F ; Overflow should be set
|
||
|
inc al
|
||
|
jno FAIL_FE_0
|
||
|
|
||
|
mov al,044 ; Overflow should NOT be set
|
||
|
inc al
|
||
|
jo FAIL_FE_0
|
||
|
|
||
|
mov al,0F3 ; Sign should be set
|
||
|
inc al
|
||
|
jns FAIL_FE_0
|
||
|
|
||
|
mov al,044 ; Sign should NOT be set
|
||
|
inc al
|
||
|
js FAIL_FE_0
|
||
|
|
||
|
mov al,0FF ; Zero should be set
|
||
|
inc al
|
||
|
jnz FAIL_FE_0
|
||
|
|
||
|
mov al,044 ; Zero should NOT be set
|
||
|
inc al
|
||
|
jz FAIL_FE_0
|
||
|
|
||
|
mov al,011 ; Parity should be set
|
||
|
inc al
|
||
|
jnp FAIL_FE_0
|
||
|
|
||
|
mov al,012 ; Parity should NOT be set
|
||
|
inc al
|
||
|
jp FAIL_FE_0
|
||
|
jmp TEST_FF_0
|
||
|
|
||
|
FAIL_FE_0:
|
||
|
mov dx,00045 ; Print a E
|
||
|
mov ax,00202
|
||
|
int 021
|
||
|
|
||
|
|
||
|
|
||
|
TEST_FE_1: ; DEC REG8/MEM8
|
||
|
mov dh,044
|
||
|
dec dh
|
||
|
cmp dh,043
|
||
|
jne FAIL_FE_1
|
||
|
|
||
|
mov byte[00050],033
|
||
|
dec byte[00050]
|
||
|
cmp byte[00050],032
|
||
|
jne FAIL_FE_1
|
||
|
|
||
|
mov al,080 ; Overflow should be set
|
||
|
dec al
|
||
|
jno FAIL_FE_1
|
||
|
|
||
|
mov al,044 ; Overflow should NOT be set
|
||
|
dec al
|
||
|
jo FAIL_FE_1
|
||
|
|
||
|
mov al,0F3 ; Sign should be set
|
||
|
dec al
|
||
|
jns FAIL_FE_1
|
||
|
|
||
|
mov al,044 ; Sign should NOT be set
|
||
|
dec al
|
||
|
js FAIL_FE_1
|
||
|
|
||
|
mov al,001 ; Zero should be set
|
||
|
dec al
|
||
|
jnz FAIL_FE_1
|
||
|
|
||
|
mov al,044 ; Zero should NOT be set
|
||
|
dec al
|
||
|
jz FAIL_FE_1
|
||
|
|
||
|
mov al,013 ; Parity should be set
|
||
|
dec al
|
||
|
jnp FAIL_FE_1
|
||
|
|
||
|
mov al,014 ; Parity should NOT be set
|
||
|
dec al
|
||
|
jp FAIL_FE_1
|
||
|
jmp TEST_FF_0
|
||
|
|
||
|
FAIL_FE_1:
|
||
|
mov dx,00045 ; Print a E
|
||
|
mov ax,00202
|
||
|
int 021
|
||
|
|
||
|
|
||
|
; ############################################################
|
||
|
|
||
|
TEST_FF_0: ; INC MEM16
|
||
|
mov word[00050],03333
|
||
|
inc word[00050]
|
||
|
cmp word[00050],03334
|
||
|
jne FAIL_FF_0
|
||
|
|
||
|
mov word[00050],07FFF ; Overflow should be set
|
||
|
inc word[00050]
|
||
|
jno FAIL_FF_0
|
||
|
|
||
|
mov word[00050],00044 ; Overflow should NOT be set
|
||
|
inc word[00050]
|
||
|
jo FAIL_FF_0
|
||
|
|
||
|
mov word[00050],07FFF ; Sign should be set
|
||
|
inc word[00050]
|
||
|
jns FAIL_FF_0
|
||
|
|
||
|
mov word[00050],00044 ; Sign should NOT be set
|
||
|
inc word[00050]
|
||
|
js FAIL_FF_0
|
||
|
|
||
|
mov word[00050],0FFFF ; Zero should be set
|
||
|
inc word[00050]
|
||
|
jnz FAIL_FF_0
|
||
|
|
||
|
mov word[00050],00044 ; Zero should NOT be set
|
||
|
inc word[00050]
|
||
|
jz FAIL_FF_0
|
||
|
|
||
|
mov word[00050],00011 ; Parity should be set
|
||
|
inc word[00050]
|
||
|
jnp FAIL_FF_0
|
||
|
|
||
|
mov word[00050],00012 ; Parity should NOT be set
|
||
|
inc word[00050]
|
||
|
jp FAIL_FF_0
|
||
|
jmp TEST_FF_1
|
||
|
|
||
|
FAIL_FF_0:
|
||
|
mov dx,00046 ; Print a F
|
||
|
mov ax,00202
|
||
|
int 021
|
||
|
|
||
|
|
||
|
TEST_FF_1: ; DEC MEM16
|
||
|
mov word[00050],03333
|
||
|
dec word[00050]
|
||
|
cmp word[00050],03332
|
||
|
jne FAIL_FF_1
|
||
|
|
||
|
mov word[00050],08000 ; Overflow should be set
|
||
|
dec word[00050]
|
||
|
jno FAIL_FF_1
|
||
|
|
||
|
mov word[00050],00044 ; Overflow should NOT be set
|
||
|
dec word[00050]
|
||
|
jo FAIL_FF_1
|
||
|
|
||
|
mov word[00050],0FFF3 ; Sign should be set
|
||
|
dec word[00050]
|
||
|
jns FAIL_FF_1
|
||
|
|
||
|
mov word[00050],00044 ; Sign should NOT be set
|
||
|
dec word[00050]
|
||
|
js FAIL_FF_1
|
||
|
|
||
|
mov word[00050],00001 ; Zero should be set
|
||
|
dec word[00050]
|
||
|
jnz FAIL_FF_1
|
||
|
|
||
|
mov word[00050],00044 ; Zero should NOT be set
|
||
|
dec word[00050]
|
||
|
jz FAIL_FF_1
|
||
|
|
||
|
mov word[00050],00013 ; Parity should be set
|
||
|
dec word[00050]
|
||
|
jnp FAIL_FF_1
|
||
|
|
||
|
mov word[00050],00014 ; Parity should NOT be set
|
||
|
dec word[00050]
|
||
|
jp FAIL_FF_1
|
||
|
jmp TEST_FF_2
|
||
|
|
||
|
FAIL_FF_1:
|
||
|
mov dx,00046 ; Print a F
|
||
|
mov ax,00202
|
||
|
int 021
|
||
|
|
||
|
|
||
|
TEST_FF_2: ; PUSH MEM16
|
||
|
mov word[00050],0ABCD
|
||
|
push word[00050]
|
||
|
pop ax
|
||
|
cmp ax,0ABCD
|
||
|
jne FAIL_FF_2
|
||
|
jmp Z_END
|
||
|
|
||
|
FAIL_FF_2:
|
||
|
mov dx,00046 ; Print a F
|
||
|
mov ax,00202
|
||
|
int 021
|
||
|
|
||
|
|
||
|
; xxxxxxxxxxxxxxxxxxxxxxx
|
||
|
; End
|
||
|
; xxxxxxxxxxxxxxxxxxxxxxx
|
||
|
Z_END:
|
||
|
mov ax,00000 ; DOS Commtest=Exit
|
||
|
int 021
|
||
|
|