Projects/MCL86/Tests/TEST_80B.ASM

882 lines
21 KiB
NASM

; Tests for opcode range 0x80 with second byte=0x0-0x7
; Thest tests are REG8,IMM8
; ----------------------------------------------------
mov ax,es ; Increment ES so it is not the same as DS
inc ax
mov es,ax
; 0x80 - ADD REG8,IMM8
; ############################################################
TEST_80_0_0: ; Test from Memory
mov dl,0FF
lock add dl,0FF ; test lock prefix
cmp dl,0FE
jne FAIL_80_0_0
mov dl,000
add dl,000
cmp dl,000
jne FAIL_80_0_0
mov byte es:[00050],011 ; test segment override
add byte es:[00050],022
cmp byte es:[00050],033
jne FAIL_80_0_0
jmp TEST_80_0_1
FAIL_80_0_0:
mov dx,00030 ; Print a 0
mov ax,00202
int 021
TEST_80_0_1: ; ADD REG8,IMM8 - Test flags
; Overflow, Sign, Zero, Parity, AUX, Carry
mov dl,07B
add dl,036 ; Overflow should be set
jno FAIL_80_0_1 ; If not set, then fail
mov dl,0B1
add dl,037 ; Overflow should NOT be set
jno PASS_80_0_1 ; If not set, then we passed
jmp FAIL_80_0_1 ; If set then we fail
PASS_80_0_1:
mov dl,0FF
add byte[00050],0FF ; sign should be set
jns FAIL_80_0_1 ; If not set, then fail
mov dl,011
add dl,022 ; sign should NOT be set
js FAIL_80_0_1 ; If set then we fail
mov dl,000
add dl,000 ; zero should be set
jne FAIL_80_0_1 ; If not set then we fail
jmp TEST_80_1_0
FAIL_80_0_1:
mov dx,00030 ; Print a 0
mov ax,00202
int 021
; 0x80 - OR REG8,IMM8
; ############################################################
TEST_80_1_0: ; OR REG8,IMM8 - Test data values from memory
mov ax,es ; Increment ES so it is not the same as DS
inc ax
mov es,ax
mov dl,05A
lock or dl,0A5
cmp dl,0FF
jne FAIL_80_1_0
mov dl,000
or dl,000
cmp dl,000
jne FAIL_80_1_0
mov byte es:[00050],080
or byte es:[00050],001
cmp byte es:[00050],081
jne FAIL_80_1_0
jmp TEST_80_1_1
FAIL_80_1_0:
mov dx,00031 ; Print a 1
mov ax,00202
int 021
; ##################
TEST_80_1_1: ; OR REG8,IMM8 - Test flags
; Overflow, Sign, Zero, Parity, AUX, Carry
mov dl,011
or dl,022 ; Overflow should NEVER be set
jno PASS_80_1_1 ; If not set, then we passed
jmp FAIL_80_1_1 ; If set then we fail
PASS_80_1_1:
mov dl,080
or dl,000 ; sign should be set
jns FAIL_80_1_1 ; If not set, then fail
mov dl,011
or dl,022 ; sign should NOT be set
js FAIL_80_1_1 ; If set then we fail
mov dl,000
or dl,00 ; zero should be set
jne FAIL_80_1_1 ; If not set then we fail
jmp PASS_80_1_2
FAIL_80_1_1:
mov dx,00031 ; Print a 1
mov ax,00202
int 021
jmp TEST_80_2_0
PASS_80_1_2:
mov dl,000
or dl,001 ; zero should NOT be set
je FAIL_80_1_1 ; If set then we fail
mov dl,001
or dl,002 ; parity should be set
jnp FAIL_80_1_1 ; If not set then we fail
mov dl,001
or dl,006 ; parity should NOT be set
jp FAIL_80_1_1 ; If set then we fail
mov dl,012
or dl,034 ; carry should NEVER be set
jc FAIL_80_1_1 ; If set then we fail
; 0x80 - ADC REG8,IMM8
; ############################################################
TEST_80_2_0: ; ADC REG8,IMM8 - Test data values from memory
; Tests with Carry Bit CLEARED
; ----------------------------
clc
mov dl,000
lock adc dl,0FF ; test lock prefix
cmp dl,0FF
jne FAIL_80_2_0
clc
mov dl,000
adc dl,000
cmp dl,000
jne FAIL_80_2_0
clc
mov byte es:[00050],011 ; test segment override
adc byte es:[00050],022
cmp byte es:[00050],033
jne FAIL_80_2_0
clc
mov dl,0FF
adc dl,0FF
cmp dl,0FE
jne FAIL_80_2_0
jmp TEST_80_2_1
FAIL_80_2_0:
mov dx,00032 ; Print a 2
mov ax,00202
int 021
; ##################
; Tests with Carry Bit SET
; ------------------------
TEST_80_2_1:
stc
mov dl,000
lock adc dl,0FF ; test lock prefix
cmp dl,000
jne FAIL_80_2_1
stc
mov dl,000
adc dl,000
cmp dl,001
jne FAIL_80_2_1
stc
mov byte es:[00050],011 ; test segment override
adc byte es:[00050],022
cmp byte es:[00050],034
jne FAIL_80_2_1
stc
mov dl,0FF
adc dl,0FF
cmp dl,0FF
jne FAIL_80_2_1
jmp TEST_80_2_2
FAIL_80_2_1:
mov dx,00032 ; Print a 2
mov ax,00202
int 021
; ##################
TEST_80_2_2: ; ADC REG8,IMM8 - Test flags
; Overflow, Sign, Zero, Parity, AUX, Carry
; Tests with Carry Bit CLEARED
; ----------------------------
clc
mov dl,07B
adc dl,036 ; Overflow should be set
jno FAIL_80_2_2 ; If not set, then fail
clc
mov dl,0B1
adc dl,037 ; Overflow should NOT be set
jno PASS_80_2_2 ; If not set, then we passed
jmp FAIL_80_2_2 ; If set then we fail
PASS_80_2_2:
clc
mov dl,0FF
adc dl,0FF ; sign should be set
jns FAIL_80_2_2 ; If not set, then fail
clc
mov dl,011
adc dl,022 ; sign should NOT be set
js FAIL_80_2_2 ; If set then we fail
clc
mov dl,000
adc dl,000 ; zero should be set
jne FAIL_80_2_2 ; If not set then we fail
jmp PASS_80_2_3
FAIL_80_2_2:
mov dx,00032 ; Print a 2
mov ax,00202
int 021
jmp PASS_80_2_4
PASS_80_2_3:
clc
mov dl,000
adc dl,001 ; zero should NOT be set
je FAIL_80_2_2 ; If set then we fail
clc
mov dl,012
adc dl,035 ; parity should be set
jnp FAIL_80_2_2 ; If not set then we fail
clc
mov dl,012
adc dl,034 ; parity should NOT be set
jp FAIL_80_2_2 ; If set then we fail
clc
mov dl,0FF
adc dl,0FF ; carry should be set
jnc FAIL_80_2_2 ; If not set then we fail
clc
mov dl,012
adc dl,034 ; carry should NOT be set
jc FAIL_80_2_2 ; If set then we fail
; Tests with Carry Bit SET
; ------------------------
stc
mov dl,001
adc dl,07F ; Overflow should be set
jno FAIL_80_2_3 ; If not set, then fail
stc
mov dl,0B1
adc dl,037 ; Overflow should NOT be set
jno PASS_80_2_4 ; If not set, then we passed
jmp FAIL_80_2_3 ; If set then we fail
PASS_80_2_4:
stc
mov dl,0FF
adc dl,0FF ; sign should be set
jns FAIL_80_2_3 ; If not set, then fail
stc
mov dl,011
adc dl,022 ; sign should NOT be set
js FAIL_80_2_3 ; If set then we fail
stc
mov dl,000
adc dl,0FF ; zero should be set
jne FAIL_80_2_3 ; If not set then we fail
jmp PASS_80_2_5
FAIL_80_2_3:
mov dx,00030 ; Print a 0
mov ax,00202
int 021
jmp TEST_80_3_0
PASS_80_2_5:
stc
mov dl,000
adc dl,001 ; zero should NOT be set
je FAIL_80_2_3 ; If set then we fail
stc
mov dl,012
adc dl,035 ; parity should be set
jnp FAIL_80_2_3 ; If not set then we fail
stc
mov dl,012
adc dl,036 ; parity should NOT be set
jp FAIL_80_2_3 ; If set then we fail
stc
mov dl,0FF
adc dl,0FF ; carry should be set
jnc FAIL_80_2_3 ; If not set then we fail
stc
mov dl,012
adc dl,034 ; carry should NOT be set
jc FAIL_80_2_3 ; If set then we fail
; 0x80 - SBB REG8,IMM8
; ############################################################
TEST_80_3_0: ; SBB REG8,IMM8 - Test data values from memory
; Tests with Carry Bit CLEARED
; ----------------------------
clc
mov dl,000
lock sbb dl,0FF ; test lock prefix
cmp dl,001
jne FAIL_80_3_0
clc
mov dl,000
sbb dl,000
cmp dl,000
jne FAIL_80_3_0
clc
mov byte es:[00050],011 ; test segment override
sbb byte es:[00050],022
cmp byte es:[00050],0EF
jne FAIL_80_3_0
clc
mov dl,0FF
sbb dl,0FF
cmp dl,000
jne FAIL_80_3_0
jmp TEST_80_3_1
FAIL_80_3_0:
mov dx,00033 ; Print a 3
mov ax,00202
int 021
; ##################
; Tests with Carry Bit SET
; ------------------------
TEST_80_3_1:
stc
mov dl,000
lock sbb dl,0FF ; test lock prefix
cmp dl,000
jne FAIL_80_3_1
stc
mov dl,000
sbb dl,000
cmp dl,0FF
jne FAIL_80_3_1
stc
mov byte es:[00050],011 ; test segment override
sbb byte es:[00050],022
cmp byte es:[00050],0EE
jne FAIL_80_3_1
stc
mov dl,0FF
sbb dl,0FF
cmp dl,0FF
jne FAIL_80_3_1
jmp TEST_80_3_2
FAIL_80_3_1:
mov dx,00033 ; Print a 3
mov ax,00202
int 021
; ##################
TEST_80_3_2: ; SBB REG8,IMM8 - Test flags
; Overflow, Sign, Zero, Parity, AUX, Carry
; Tests with Carry Bit CLEARED
; ----------------------------
clc
mov dl,045
sbb dl,0AD ; Overflow should be set
jno FAIL_80_3_2 ; If not set, then fail
clc
mov dl,078
sbb dl,034 ; Overflow should NOT be set
jno PASS_80_3_2 ; If not set, then we passed
jmp FAIL_80_3_2 ; If set then we fail
PASS_80_3_2:
clc
mov dl,000
sbb dl,001 ; sign should be set
jns FAIL_80_3_2 ; If not set, then fail
clc
mov dl,011
sbb dl,002 ; sign should NOT be set
js FAIL_80_3_2 ; If set then we fail
clc
mov dl,034
sbb dl,034 ; zero should be set
jne FAIL_80_3_2 ; If not set then we fail
jmp PASS_80_3_3
FAIL_80_3_2:
mov dx,00033 ; Print a 3
mov ax,00202
int 021
jmp PASS_80_3_4
PASS_80_3_3:
clc
mov dl,000
sbb dl,022 ; zero should NOT be set
je FAIL_80_3_2 ; If set then we fail
clc
mov dl,012
sbb dl,035 ; parity should be set
jnp FAIL_80_3_2 ; If not set then we fail
clc
mov dl,014
sbb dl,034 ; parity should NOT be set
jp FAIL_80_3_2 ; If set then we fail
clc
mov dl,0FE
sbb dl,0FF ; carry should be set
jnc FAIL_80_3_2 ; If not set then we fail
clc
mov dl,012
sbb dl,012 ; carry should NOT be set
jc FAIL_80_3_2 ; If set then we fail
; Tests with Carry Bit SET
; ------------------------
stc
mov dl,080
sbb dl,011 ; Overflow should be set
jno FAIL_80_3_3 ; If not set, then fail
stc
mov dl,000
sbb dl,002 ; Overflow should NOT be set
jno PASS_80_3_4 ; If not set, then we passed
jmp FAIL_80_3_3 ; If set then we fail
PASS_80_3_4:
stc
mov dl,0FF
sbb dl,0FF ; sign should be set
jns FAIL_80_3_3 ; If not set, then fail
stc
mov dl,044
sbb dl,022 ; sign should NOT be set
js FAIL_80_3_3 ; If set then we fail
stc
mov dl,001
sbb dl,000 ; zero should be set
jne FAIL_80_3_3 ; If not set then we fail
jmp PASS_80_3_5
FAIL_80_3_3:
mov dx,00033 ; Print a 3
mov ax,00202
int 021
jmp TEST_80_4_0
PASS_80_3_5:
stc
mov dl,000
sbb dl,001 ; zero should NOT be set
je FAIL_80_3_3 ; If set then we fail
stc
mov dl,012
sbb dl,034 ; parity should be set
jnp FAIL_80_3_3 ; If not set then we fail
stc
mov dl,012
sbb dl,035 ; parity should NOT be set
jp FAIL_80_3_3 ; If set then we fail
stc
mov dl,0FF
sbb dl,0FF ; carry should be set
jnc FAIL_80_3_3 ; If not set then we fail
stc
mov dl,066
sbb dl,022 ; carry should NOT be set
jc FAIL_80_3_3 ; If set then we fail
; 0x80 - AND REG8,IMM8
; ############################################################
TEST_80_4_0: ; AND REG8,IMM8 - Test data values from memory
mov dl,05A
lock and dl,0A5
cmp dl,000
jne FAIL_80_4_0
mov dl,0FF
and dl,011
cmp dl,011
jne FAIL_80_4_0
mov byte es:[00050],081
and byte es:[00050],018
cmp byte es:[00050],000
jne FAIL_80_4_0
jmp TEST_80_4_1
FAIL_80_4_0:
mov dx,00034 ; Print a 4
mov ax,00202
int 021
; ##################
TEST_80_4_1: ; AND REG8,IMM8 - Test flags
; Overflow, Sign, Zero, Parity, AUX, Carry
mov dl,011
and dl,022 ; Overflow should NEVER be set
jno PASS_80_4_1 ; If not set, then we passed
jmp FAIL_80_4_1 ; If set then we fail
PASS_80_4_1:
mov dl,080
and dl,080 ; sign should be set
jns FAIL_80_4_1 ; If not set, then fail
mov dl,0FF
and dl,07F ; sign should NOT be set
js FAIL_80_4_1 ; If set then we fail
mov dl,000
and dl,0FF ; zero should be set
jne FAIL_80_4_1 ; If not set then we fail
jmp PASS_80_4_2
FAIL_80_4_1:
mov dx,00034 ; Print a 4
mov ax,00202
int 021
jmp TEST_80_5_0
PASS_80_4_2:
mov dl,0FF
and dl,001 ; zero should NOT be set
je FAIL_80_4_1 ; If set then we fail
mov dl,003
and dl,003 ; parity should be set
jnp FAIL_80_4_1 ; If not set then we fail
mov dl,003
and dl,001 ; parity should NOT be set
jp FAIL_80_4_1 ; If set then we fail
mov dl,012
and dl,034 ; carry should NEVER be set
jc FAIL_80_4_1 ; If set then we fail
; 0x28 - SUB REG8,IMM8
; ############################################################
TEST_80_5_0: ; SUB REG8,IMM8 - Test data values from memory
mov dl,088
lock sub dl,011 ; test lock prefix
cmp dl,077
jne FAIL_80_5_0
mov dl,000
sub dl,000
cmp dl,000
jne FAIL_80_5_0
mov byte es:[00050],022 ; test segment override
sub byte es:[00050],011
cmp byte es:[00050],011
jne FAIL_80_5_0
mov dl,000
sub dl,001
cmp dl,0FF
jne FAIL_80_5_0
jmp TEST_80_5_1
FAIL_80_5_0:
mov dx,00035 ; Print a 5
mov ax,00202
int 021
; ##################
TEST_80_5_1: ; SUB REG8,IMM8 - Test flags
; Overflow, Sign, Zero, Parity, AUX, Carry
mov dl,080
sub dl,066 ; Overflow should be set
jno FAIL_80_5_1 ; If not set, then fail
mov dl,034
sub dl,012 ; Overflow should NOT be set
jno PASS_80_5_1 ; If not set, then we passed
jmp FAIL_80_5_1 ; If set then we fail
PASS_80_5_1:
mov dl,000
sub dl,001 ; sign should be set
jns FAIL_80_5_1 ; If not set, then fail
mov dl,022
sub dl,011 ; sign should NOT be set
js FAIL_80_5_1 ; If set then we fail
mov dl,001
mov ax,00001
sub dl,001 ; zero should be set
jne FAIL_80_5_1 ; If not set then we fail
jmp PASS_80_5_2
FAIL_80_5_1:
mov dx,00035 ; Print a 5
mov ax,00202
int 021
jmp TEST_80_6_0
PASS_80_5_2:
mov dl,055
sub dl,011 ; zero should NOT be set
je FAIL_80_5_1 ; If set then we fail
mov dl,034
sub dl,001 ; parity should be set
jnp FAIL_80_5_1 ; If not set then we fail
mov dl,032
sub dl,001 ; parity should NOT be set
jp FAIL_80_5_1 ; If set then we fail
mov dl,000
sub dl,001 ; carry should be set
jnc FAIL_80_5_1 ; If not set then we fail
mov dl,031
sub dl,011 ; carry should NOT be set
jc FAIL_80_5_1 ; If set then we fail
; 0x80 - XOR REG8,IMM8
; ############################################################
TEST_80_6_0: ; XOR REG8,IMM8 - Test data values from memory
mov dl,05A
lock xor dl,0A5
cmp dl,0FF
jne FAIL_80_6_0
mov dl,000
xor dl,000
cmp dl,000
jne FAIL_80_6_0
mov byte es:[00050],080
xor byte es:[00050],001
cmp byte byte es:[00050],081
jne FAIL_80_6_0
jmp TEST_80_6_1
FAIL_80_6_0:
mov dx,00036 ; Print a 6
mov ax,00202
int 021
; ##################
TEST_80_6_1: ; XOR REG8,IMM8 - Test flags
; Overflow, Sign, Zero, Parity, AUX, Carry
mov dl,0FF
xor dl,07F ; Overflow should NEVER be set
jno PASS_80_6_1 ; If not set, then we passed
jmp FAIL_80_6_1 ; If set then we fail
PASS_80_6_1:
mov dl,080
xor dl,000 ; sign should be set
jns FAIL_80_6_1 ; If not set, then fail
mov dl,011
xor dl,022 ; sign should NOT be set
js FAIL_80_6_1 ; If set then we fail
mov dl,05A
xor dl,05A ; zero should be set
jne FAIL_80_6_1 ; If not set then we fail
jmp PASS_80_6_2
FAIL_80_6_1:
mov dx,00036 ; Print a 6
mov ax,00202
int 021
jmp TEST_80_7_0
PASS_80_6_2:
mov dl,000
xor dl,001 ; zero should NOT be set
je FAIL_80_6_1 ; If set then we fail
mov dl,001
xor dl,002 ; parity should be set
jnp FAIL_80_6_1 ; If not set then we fail
mov dl,001
xor dl,006 ; parity should NOT be set
jp FAIL_80_6_1 ; If set then we fail
mov dl,012
xor dl,034 ; carry should NEVER be set
jc FAIL_80_6_1 ; If set then we fail
; 0x80 - CMP REG8,IMM8
; ############################################################
TEST_80_7_0: ; CMP REG8,IMM8 - Test data values from memory
mov dl,012
lock cmp dl,012 ; test lock prefix
jne FAIL_80_7_0
mov dl,000
cmp dl,000
jne FAIL_80_7_0
mov byte es:[00050],011 ; test segment override
cmp byte es:[00050],011
jne FAIL_80_7_0
mov dl,0FF
cmp dl,0FF
jne FAIL_80_7_0
jmp TEST_80_7_1
FAIL_80_7_0:
mov dx,00037 ; Print a 7
mov ax,00202
int 021
; ##################
TEST_80_7_1: ; CMP REG8,IMM8 - Test flags
; Overflow, Sign, Zero, Parity, AUX, Carry
mov dl,001
cmp dl,080 ; Overflow should be set
jno FAIL_80_7_1 ; If not set, then fail
mov dl,001
cmp dl,030 ; Overflow should NOT be set
jno PASS_80_7_1 ; If not set, then we passed
jmp FAIL_80_7_1 ; If set then we fail
PASS_80_7_1:
mov dl,0FF
cmp dl,001 ; sign should be set
jns FAIL_80_7_1 ; If not set, then fail
mov dl,011
cmp dl,001 ; sign should NOT be set
js FAIL_80_7_1 ; If set then we fail
mov dl,034
cmp dl,034 ; zero should be set
jne FAIL_80_7_1 ; If not set then we fail
jmp PASS_80_7_2
FAIL_80_7_1:
mov dx,00037 ; Print a 7
mov ax,00202
int 021
jmp Z_END
PASS_80_7_2:
mov dl,000
cmp dl,001 ; zero should NOT be set
je FAIL_80_7_1 ; If set then we fail
mov dl,044
cmp dl,000 ; parity should be set
jnp FAIL_80_7_1 ; If not set then we fail
mov dl,044
cmp dl,001 ; parity should NOT be set
jp FAIL_80_7_1 ; If set then we fail
mov dl,000
cmp dl,001 ; carry should be set
jnc FAIL_80_7_1 ; If not set then we fail
mov dl,012
cmp dl,001 ; carry should NOT be set
jc FAIL_80_7_1 ; If set then we fail
; xxxxxxxxxxxxxxxxxxxxxxx
; End
; xxxxxxxxxxxxxxxxxxxxxxx
Z_END:
mov ax,00000 ; DOS Command=Exit
int 021