Projects/MCL86/Tests/TEST_3X.ASM

1233 lines
32 KiB
NASM

; Tests for opcode range 0x30-0x3F
; ---------------------------------
; 0x30 - XOR REG8/MEM8,REG8
; ############################################################
TEST_30_0: ; XOR MEM8,REG8 - Test data values from memory
mov ax,es ; Increment ES so it is not the same as DS
inc ax
mov es,ax
mov byte [00050],05A
mov ax,000A5
lock xor [00050],al
cmp byte [00050],0FF
jne FAIL_30_0
mov byte [00050],000
mov ax,00000
xor [00050],al
cmp byte [00050],000
jne FAIL_30_0
mov byte es:[00050],080
mov ax,00001
xor es:[00050],al
cmp byte es:[00050],081
jne FAIL_30_0
jmp TEST_30_1
FAIL_30_0:
mov dx,00030 ; Print a 0
mov ax,00202
int 021
; ##################
TEST_30_1: ; XOR MEM8,REG8 - Test flags
; Overflow, Sign, Zero, Parity, AUX, Carry
mov byte [00050],0FF
mov ax,0007F
xor [00050],al ; Overflow should NEVER be set
jno PASS_30_1 ; If not set, then we passed
jmp FAIL_30_1 ; If set then we fail
PASS_30_1:
mov byte [00050],080
mov ax,00000
xor [00050],al ; sign should be set
jns FAIL_30_1 ; If not set, then fail
mov byte [00050],011
mov ax,00022
xor [00050],al ; sign should NOT be set
js FAIL_30_1 ; If set then we fail
mov byte [00050],05A
mov ax,0005A
xor [00050],al ; zero should be set
jne FAIL_30_1 ; If not set then we fail
jmp PASS_30_2
FAIL_30_1:
mov dx,00030 ; Print a 0
mov ax,00202
int 021
jmp TEST_31_0
PASS_30_2:
mov byte [00050],000
mov ax,00001
xor [00050],al ; zero should NOT be set
je FAIL_30_1 ; If set then we fail
mov byte [00050],001
mov ax,00002
xor [00050],al ; parity should be set
jnp FAIL_30_1 ; If not set then we fail
mov byte [00050],001
mov ax,00006
xor [00050],al ; parity should NOT be set
jp FAIL_30_1 ; If set then we fail
mov byte [00050],012
mov ax,00034
xor [00050],al ; carry should NEVER be set
jc FAIL_30_1 ; If set then we fail
; 0x31 - XOR REG16/MEM16,REG16
; ############################################################
TEST_31_0: ; XOR MEM16,REG16 - Test data values from memory
mov word [00050],05A5A
mov ax,0A5A5
lock xor [00050],ax
cmp word [00050],0FFFF
jne FAIL_31_0
mov word [00050],00000
mov ax,00000
xor [00050],ax
cmp word [00050],00000
jne FAIL_31_0
mov word es:[00050],0FFFF
mov ax,01111
xor es:[00050],ax
cmp word es:[00050],0EEEE
jne FAIL_31_0
jmp TEST_31_1
FAIL_31_0:
mov dx,00031 ; Print a 1
mov ax,00202
int 021
; ##################
TEST_31_1: ; XOR MEM16,REG16 - Test flags
; Overflow, Sign, Zero, Parity, AUX, Carry
mov word [00050],07FFF
mov ax,02222
xor [00050],ax ; Overflow should NEVER be set
jno PASS_31_1 ; If not set, then we passed
jmp FAIL_31_1 ; If set then we fail
PASS_31_1:
mov word [00050],08000
mov ax,00000
xor [00050],ax ; sign should be set
jns FAIL_31_1 ; If not set, then fail
mov word [00050],07FF0
mov ax,0000F
xor [00050],ax ; sign should NOT be set
js FAIL_31_1 ; If set then we fail
mov word [00050],0A5A5
mov ax,0A5A5
xor [00050],ax ; zero should be set
jne FAIL_31_1 ; If not set then we fail
jmp PASS_31_2
FAIL_31_1:
mov dx,00031 ; Print a 1
mov ax,00202
int 021
jmp TEST_32_0
PASS_31_2:
mov word [00050],00000
mov ax,00001
xor [00050],ax ; zero should NOT be set
je FAIL_31_1 ; If set then we fail
mov word [00050],01111
mov ax,00000
xor [00050],ax ; parity should be set
jnp FAIL_31_1 ; If not set then we fail
mov word [00050],00011
mov ax,00002
xor [00050],ax ; parity should NOT be set
jp FAIL_31_1 ; If set then we fail
mov word [00050],00012
mov ax,00034
xor [00050],ax ; carry should NEVER be set
jc FAIL_31_1 ; If set then we fail
; 0x32 - XOR REG8,MEM8/REG8
; ############################################################
TEST_32_0: ; XOR REG8,REG8 - Test data values from registers
mov ax,05AA5
lock xor ah,al
cmp ax,0FFA5
jne FAIL_32_0
mov ax,00000
xor ah,al
cmp ax,00000
jne FAIL_32_0
mov ax,08001
xor ah,al
cmp ax,08101
jne FAIL_32_0
jmp TEST_32_1
FAIL_32_0:
mov dx,00032 ; Print a 2
mov ax,00202
int 021
; ##################
TEST_32_1: ; XOR MEM8,REG8 - Test data values from memory
mov byte [00050],05A
mov ax,000A5
xor al,[00050]
cmp al,0FF
jne FAIL_32_1
mov byte [00050],000
mov ax,00000
xor al,[00050]
cmp al,000
jne FAIL_32_1
mov byte es:[00050],080
mov ax,00001
xor al,es:[00050]
cmp al,081
jne FAIL_32_1
jmp TEST_32_2
FAIL_32_1:
mov dx,00032 ; Print a 2
mov ax,00202
int 021
; ##################
TEST_32_2: ; XOR REG8,REG8 - Test flags
; Overflow, Sign, Zero, Parity, AUX, Carry
mov ax,0B137 ; Test overflow flag
xor ah,al ; Overflow should NEVER be set
jno PASS_32_2 ; If not set, then we passed
jmp FAIL_32_2 ; If set then we fail
PASS_32_2:
mov dx,08000 ; Test sign flag
xor dl,dh ; sign should be set
jns FAIL_32_2 ; If not set, then fail
mov cx,08080 ; Test sign flag
xor ch,cl ; sign should NOT be set
js FAIL_32_2 ; If set then we fail
mov cx,07878 ; Test zero flag
xor ch,cl ; zero should be set
jne FAIL_32_2 ; If not set then we fail
mov cx,00001 ; Test zero flag
xor ch,cl ; zero should NOT be set
je FAIL_32_2 ; If set then we fail
mov ax,00102 ; Test parity flag
xor ah,al ; parity should be set
jnp FAIL_32_2 ; If not set then we fail
mov cx,00100 ; Test parity flag
xor ch,cl ; parity should NOT be set
jp FAIL_32_2 ; If set then we fail
mov cx,01234 ; Test carry flag
xor ch,cl ; carry should NEVER be set
jc FAIL_32_2 ; If set then we fail
jmp TEST_33_1
FAIL_32_2:
mov dx,00032 ; Print a 2
mov ax,00202
int 021
; 0x33 - XOR REG16,MEM16/REG16
; ############################################################
TEST_33_1: ; XOR MEM16,REG16 - Test data values from memory
mov word [00050],05A5A
mov ax,0A5A5
lock xor ax,[00050]
cmp ax,0FFFF
jne FAIL_33_1
mov word [00050],00000
mov ax,00000
xor ax,[00050]
cmp ax,00000
jne FAIL_33_1
mov word es:[00050],01111
mov ax,02222
xor ax,es:[00050]
cmp ax,03333
jne FAIL_33_1
jmp TEST_33_2
FAIL_33_1:
mov dx,00033 ; Print a 3
mov ax,00202
int 021
; ##################
TEST_33_2: ; XOR REG16,REG16 - Test flags
; Overflow, Sign, Zero, Parity, AUX, Carry
mov ax,01234 ; Test overflow flag
mov word[00060],05678
xor ax,[00060] ; Overflow should NEVER be set
jno PASS_33_2 ; If not set, then we passed
jmp FAIL_33_2 ; If set then we fail
PASS_33_2:
mov ax,08000 ; Test sign flag
mov word[00060],00001
xor ax,[00060] ; sign should be set
jns FAIL_33_2 ; If not set, then fail
mov ax,01122 ; Test sign flag
mov word[00060],01234
xor ax,[00060] ; sign should NOT be set
js FAIL_33_2 ; If set then we fail
mov ax,00000 ; Test zero flag
mov word[00060],00000
xor ax,[00060] ; zero should be set
jne FAIL_33_2 ; If not set then we fail
mov ax,00001 ; Test zero flag
mov word[00060],00000
xor ax,[00060] ; zero should NOT be set
je FAIL_33_2 ; If set then we fail
mov ax,00022 ; Test parity flag
mov word[00060],00011
xor ax,[00060] ; parity should be set
jnp FAIL_33_2 ; If not set then we fail
mov ax,00000 ; Test parity flag
mov word[00060],00010
xor ax,[00060] ; parity should NOT be set
jp FAIL_33_2 ; If set then we fail
mov ax,0FFFF ; Test carry flag
mov word[00060],0FFFF
xor ax,[00060] ; carry should NEVER be set
jc FAIL_33_2 ; If set then we fail
jmp TEST_34_0
FAIL_33_2:
mov dx,00033 ; Print a 3
mov ax,00202
int 021
; 0x34 - XOR AL,IMMED8
; ############################################################
TEST_34_0: ; XOR AL,IMMED8 - Test data values from registers
mov ax,0005A
lock xor al,0A5
cmp ax,000FF
jne FAIL_34_0
mov ax,00000
xor al,000
cmp ax,00000
jne FAIL_34_0
jmp TEST_34_1
FAIL_34_0:
mov dx,00034 ; Print a 4
mov ax,00202
int 021
; ##################
TEST_34_1: ; XOR AL,IMMED8 - Test flags
; Overflow, Sign, Zero, Parity, AUX, Carry
mov ax,01234 ; Test overflow flag
xor al,011 ; Overflow should NEVER be set
jno PASS_34_1 ; If not set, then we passed
jmp FAIL_34_1
PASS_34_1:
mov ax,00080 ; Test sign flag
xor al,001 ; sign should be set
jns FAIL_34_1 ; If not set, then fail
mov ax,0007E ; Test sign flag
xor al,001 ; sign should NOT be set
js FAIL_34_1 ; If set then we fail
mov ax,00000 ; Test zero flag
xor al,000 ; zero should be set
jne FAIL_34_1 ; If not set then we fail
mov ax,00001 ; Test zero flag
xor al,012 ; zero should NOT be set
je FAIL_34_1 ; If set then we fail
mov ax,01201 ; Test parity flag
xor al,002 ; parity should be set
jnp FAIL_34_1 ; If not set then we fail
mov ax,01201 ; Test parity flag
xor al,006 ; parity should NOT be set
jp FAIL_34_1 ; If set then we fail
mov ax,01234 ; Test carry flag
xor al,012 ; carry should NEVER be set
jc FAIL_34_1 ; If set then we fail
jmp TEST_35_0
FAIL_34_1:
mov dx,00034 ; Print a 4
mov ax,00202
int 021
; 0x35 - XOR AX,IMMED16
; ############################################################
TEST_35_0: ; XOR AX,IMMED16 - Test data values from registers
mov ax,05A5A
lock xor ax,0A5A5
cmp ax,0FFFF
jne FAIL_35_0
mov ax,00000
xor ax,00000
cmp ax,00000
jne FAIL_35_0
jmp TEST_35_1
FAIL_35_0:
mov dx,00035 ; Print a 5
mov ax,00202
int 021
; ##################
TEST_35_1: ; XOR AX,IMMED16 - Test flags
; Overflow, Sign, Zero, Parity, AUX, Carry
mov ax,0B137 ; Test overflow flag
xor ax,01234 ; Overflow should NEVER be set
jno PASS_35_1 ; If not set, then we passed
jmp FAIL_35_1
PASS_35_1:
mov ax,08000 ; Test sign flag
xor ax,00001 ; sign should be set
jns FAIL_35_1 ; If not set, then fail
mov ax,07FFE ; Test sign flag
xor ax,00001 ; sign should NOT be set
js FAIL_35_1 ; If set then we fail
mov ax,00000 ; Test zero flag
xor ax,00000 ; zero should be set
jne FAIL_35_1 ; If not set then we fail
mov ax,01000 ; Test zero flag
xor ax,00000 ; zero should NOT be set
je FAIL_35_1 ; If set then we fail
mov ax,00001 ; Test parity flag
xor ax,00002 ; parity should be set
jnp FAIL_35_1 ; If not set then we fail
mov ax,00001 ; Test parity flag
xor ax,00006 ; parity should NOT be set
jp FAIL_35_1 ; If set then we fail
mov ax,01234 ; Test carry flag
xor ax,01234 ; carry should NEVER be set
jc FAIL_35_1 ; If set then we fail
jmp TEST_36_0
FAIL_35_1:
mov dx,00035 ; Print a 5
mov ax,00202
int 021
; 0x36 - SS: Stack Segment Override
; ############################################################
TEST_36_0:
mov ax,es ; Increment SS so it is not the same as DS
inc ax
mov ss,ax
mov ax,01234
mov ss:[00050],ax
mov ax,05678
mov [00050],ax
cmp ss:[00050],01234
jne FAIL_36_0
jmp TEST_37_0
FAIL_36_0:
mov dx,00036 ; Print a 6
mov ax,00202
int 021
; 0x37 - AAA - ASCII Adjust for Addition
; ############################################################
; TEST WITH AUX_FLAG=0
; --------------------
TEST_37_0:
mov cx,000FF ; Loop count of 256
mov bx,00000 ; Initialize BX incrementer
mov dx,00000 ; Initialize DX summation counter
L30:
mov ax,00000
add ax,0 ; Cause AUX_FLAG to be set to 0
mov al,bl ; Set AL to incremented value
aaa
add dx,ax ; Add results to summation counter
inc bx ; Increment to the next value
loop L30
cmp dx,062BB ; All AAA values should add up to this
jz TEST_37_1
FAIL_37_0:
mov dx,00037 ; Print a 7
mov ax,00202
int 021
; TEST WITH AUX_FLAG=1
; --------------------
TEST_37_1:
mov cx,000FF ; Loop count of 256
mov bx,00000 ; Initialize BX incrementer
mov dx,00000 ; Initialize DX summation counter
L31:
mov ax,00001
add al,0F ; Cause AUX_FLAG to be set to 1
mov al,bl ; Set AL to incremented value
aaa
add dx,ax ; Add results to summation counter
inc bx ; Increment to the next value
loop L31
cmp dx,0067B ; All AAA values should add up to this
jz TEST_37_2
FAIL_37_1:
mov dx,00037 ; Print a 7
mov ax,00202
int 021
TEST_37_2: ; Test flags
mov ax,000F
aaa ; CF should be 1
jc TEST_38_0
FAIL_37_2:
mov dx,00037 ; Print a 7
mov ax,00202
int 021
; 0x38 - CMP REG8/MEM8,REG8
; ############################################################
TEST_38_0: ; CMP MEM8,REG8 - Test data values from memory
mov ax,es ; Increment ES so it is not the same as DS
inc ax
mov es,ax
mov byte [00050],012
mov ax,00012
lock cmp [00050],al ; test lock prefix
jne FAIL_38_0
mov byte [00050],000
mov ax,00000
cmp [00050],al
jne FAIL_38_0
mov byte es:[00052],011 ; test segment override
mov ax,00011
cmp es:[00052],al
jne FAIL_38_0
mov byte [00053],0FF
mov ax,0FF00
cmp [00053],ah
jne FAIL_38_0
jmp TEST_38_1
FAIL_38_0:
mov dx,00038 ; Print a 8
mov ax,00202
int 021
; ##################
TEST_38_1: ; CMP MEM8,REG8 - Test flags
; Overflow, Sign, Zero, Parity, AUX, Carry
mov byte [00054],001
mov ax,00080
cmp [00054],al ; Overflow should be set
jno FAIL_38_1 ; If not set, then fail
mov byte [00055],001
mov ax,00030
cmp [00055],al ; Overflow should NOT be set
jno PASS_38_1 ; If not set, then we passed
jmp FAIL_38_1 ; If set then we fail
PASS_38_1:
mov byte [00056],0FF
mov ax,00001
cmp [00056],al ; sign should be set
jns FAIL_38_1 ; If not set, then fail
mov byte [00057],011
mov ax,00001
cmp [00057],al ; sign should NOT be set
js FAIL_38_1 ; If set then we fail
mov byte [00058],034
mov ax,00034
cmp [00058],al ; zero should be set
jne FAIL_38_1 ; If not set then we fail
jmp PASS_38_2
FAIL_38_1:
mov dx,00038 ; Print a 8
mov ax,00202
int 021
jmp TEST_39_0
PASS_38_2:
mov byte [00050],000
mov ax,00001
cmp [00050],al ; zero should NOT be set
je FAIL_38_1 ; If set then we fail
mov byte [00050],044
mov ax,00000
cmp [00050],al ; parity should be set
jnp FAIL_38_1 ; If not set then we fail
mov byte [00050],044
mov ax,00001
cmp [00050],al ; parity should NOT be set
jp FAIL_38_1 ; If set then we fail
mov byte [00050],000
mov ax,00001
cmp [00050],al ; carry should be set
jnc FAIL_38_1 ; If not set then we fail
mov byte [00050],012
mov ax,00001
cmp [00050],al ; carry should NOT be set
jc FAIL_38_1 ; If set then we fail
; 0x39 - CMP REG16/MEM16,REG16
; ############################################################
TEST_39_0: ; CMP MEM16,REG16 - Test data values from memory
mov word [00060],0FFFF
mov ax,0FFFF
lock cmp [00060],ax
jne FAIL_39_0
mov word [00060],00000
mov ax,00000
cmp [00060],ax
jne FAIL_39_0
mov word es:[00060],03333
mov ax,03333
cmp es:[00060],ax
jne FAIL_39_0
mov word [00060],01234
mov ax,01234
cmp [00060],ax
jne FAIL_39_0
jmp TEST_39_1
FAIL_39_0:
mov dx,00039 ; Print a 9
mov ax,00202
int 021
; ##################
TEST_39_1: ; CMP MEM16,REG16 - Test flags
; Overflow, Sign, Zero, Parity, AUX, Carry
mov word [00050],08000
mov ax,00001
cmp [00050],ax ; Overflow should be set
jno FAIL_39_1 ; If not set, then fail
mov word [00050],00011
mov ax,00001
cmp [00050],ax ; Overflow should NOT be set
jno PASS_39_1 ; If not set, then we passed
jmp FAIL_39_1 ; If set then we fail
PASS_39_1:
mov word [00050],0FFFF
mov ax,00003
cmp [00050],ax ; sign should be set
jns FAIL_39_1 ; If not set, then fail
mov word [00050],01234
mov ax,00022
cmp [00050],ax ; sign should NOT be set
js FAIL_39_1 ; If set then we fail
mov word [00050],01234
mov ax,01234
cmp [00050],ax ; zero should be set
jne FAIL_39_1 ; If not set then we fail
jmp PASS_39_2
FAIL_39_1:
mov dx,00039 ; Print a 9
mov ax,00202
int 021
jmp TEST_3A_0
PASS_39_2:
mov word [00050],01111
mov ax,02222
cmp [00050],ax ; zero should NOT be set
je FAIL_39_1 ; If set then we fail
mov word [00050],04444
mov ax,01111
cmp [00050],ax ; parity should be set
jnp FAIL_39_1 ; If not set then we fail
mov word [00050],04444
mov ax,01110
cmp [00050],ax ; parity should NOT be set
jp FAIL_39_1 ; If set then we fail
mov word [00050],00000
mov ax,00001
cmp [00050],ax ; carry should be set
jnc FAIL_39_1 ; If not set then we fail
mov word [00050],01234
mov ax,00009
cmp [00050],ax ; carry should NOT be set
jc FAIL_39_1 ; If set then we fail
; 0x3A - CMP REG8,MEM8/REG8
; ############################################################
TEST_3A_0: ; CMP REG8,REG8 - Test data values from registers
mov ax,05656
lock cmp ah,al
jne FAIL_3A_0
mov ax,00000
cmp ah,al
jne FAIL_3A_0
mov ax,0FFFF
cmp ah,al
jne FAIL_3A_0
jmp TEST_3A_1
FAIL_3A_0:
mov dx,00041 ; Print a A
mov ax,00202
int 021
; ##################
TEST_3A_1: ; CMP MEM8,REG8 - Test data values from memory
mov byte [00050],0FF
mov ax,000FF
cmp al,[00050]
jne FAIL_3A_1
mov byte [00050],000
mov ax,00000
cmp al,[00050]
jne FAIL_3A_1
mov byte es:[00050],066
mov ax,00066
cmp al,es:[00050]
jne FAIL_3A_1
mov byte [00050],0FF
mov ax,000FF
cmp al,[00050]
jne FAIL_3A_1
jmp TEST_3A_2
FAIL_3A_1:
mov dx,00041 ; Print a A
mov ax,00202
int 021
; ##################
TEST_3A_2: ; CMP REG8,REG8 - Test flags
; Overflow, Sign, Zero, Parity, AUX, Carry
mov ax,08001 ; Test overflow flag
cmp ah,al ; Overflow should be set
jno FAIL_3A_2 ; If not set, then fail
mov ax,02201 ; Test overflow flag
cmp ah,al ; Overflow should NOT be set
jno PASS_3A_2 ; If not set, then we passed
jmp FAIL_3A_2 ; If set then we fail
PASS_3A_2:
mov dx,0FF01 ; Test sign flag
cmp dh,dl ; sign should be set
jns FAIL_3A_2 ; If not set, then fail
mov cx,02202 ; Test sign flag
cmp ch,cl ; sign should NOT be set
js FAIL_3A_2 ; If set then we fail
mov cx,05656 ; Test zero flag
cmp ch,cl ; zero should be set
jne FAIL_3A_2 ; If not set then we fail
mov cx,00001 ; Test zero flag
cmp ch,cl ; zero should NOT be set
je FAIL_3A_2 ; If set then we fail
mov ax,04411 ; Test parity flag
cmp ah,al ; parity should be set
jnp FAIL_3A_2 ; If not set then we fail
mov cx,04410 ; Test parity flag
cmp ch,cl ; parity should NOT be set
jp FAIL_3A_2 ; If set then we fail
mov ax,00001 ; Test carry flag
cmp ah,al ; carry should be set
jnc FAIL_3A_2 ; If not set then we fail
mov cx,04411 ; Test carry flag
cmp ch,cl ; carry should NOT be set
jc FAIL_3A_2 ; If set then we fail
jmp TEST_3B_0
FAIL_3A_2:
mov dx,00041 ; Print a A
mov ax,00202
int 021
; 0x3B - CMP REG16,MEM16/REG16
; ############################################################
TEST_3B_0: ; CMP MEM16,REG16 - Test data values from memory
mov word [00055],0FFFF
mov ax,0FFFF
cmp ax,[00055]
jne FAIL_3B_0
mov word [00057],00000
mov ax,00000
cmp ax,[00057]
jne FAIL_3B_0
mov word es:[00059],06666
mov ax,06666
cmp ax,es:[00059]
jne FAIL_3B_0
mov word [00060],01234
mov ax,01234
cmp ax,[00060]
jne FAIL_3B_0
jmp TEST_3B_1
FAIL_3B_0:
mov dx,00042 ; Print a B
mov ax,00202
int 021
; ##################
TEST_3B_1: ; CMP REG16,MEM16 - Test flags
; Overflow, Sign, Zero, Parity, AUX, Carry
mov word [00070],00001 ; Test overflow flag
mov ax,08000
cmp ax,word [00070] ; Overflow should be set
jno FAIL_3B_1 ; If not set, then fail
mov word [00070],00001 ; Test overflow flag
mov ax,00006
cmp ax,word [00070] ; Overflow should NOT be set
jno PASS_3B_1 ; If not set, then we passed
jmp FAIL_3B_1 ; If set then we fail
PASS_3B_1:
mov word [00070],00001 ; Test sign flag
mov ax,0FFFF
cmp ax,word [00070] ; Sign should be set
jns FAIL_3B_1 ; If not set, then fail
mov word [00070],00002 ; Test sign flag
mov ax,04321
cmp ax,word [00070] ; Sign should NOT be set
js FAIL_3B_1 ; If set, then fail
mov word [00070],01234 ; Test zero flag
mov ax,01234
cmp ax,word [00070] ; Zero should be set
jne FAIL_3B_1 ; If not set, then fail
mov word [00070],00001 ; Test zero flag
mov ax,00011
cmp ax,word [00070] ; Zero should NOT be set
je FAIL_3B_1 ; If set, then fail
jmp TEST_3B_2
FAIL_3B_1:
mov dx,00042 ; Print a B
mov ax,00202
int 021
TEST_3B_2:
mov word [00070],01111 ; Test parity flag
mov ax,04444
cmp ax,word [00070] ; Parity should be set
jnp FAIL_3B_2 ; If not set, then fail
mov word [00070],01110 ; Test parity flag
mov ax,04444
cmp ax,word [00070] ; Parity should NOT be set
jp FAIL_3B_2 ; If set, then fail
mov word [00070],00001 ; Test carry flag
mov ax,00000
cmp ax,word [00070] ; Carry should be set
jnc FAIL_3B_2 ; If not set, then fail
mov word [00070],00002 ; Test carry flag
mov ax,05678
cmp ax,word [00070] ; Carry should NOT be set
jc FAIL_3B_2 ; If set, then fail
jmp TEST_3C_0
FAIL_3B_2:
mov dx,00042 ; Print a B
mov ax,00202
int 021
; 0x3C - CMP AL,IMMED8
; ############################################################
TEST_3C_0: ; CMP AL,IMMED8 - Test data values from registers
mov ax,000FF
lock cmp al,0FF
jne FAIL_3C_0
mov ax,00000
cmp al,000
jne FAIL_3C_0
mov ax,03312
cmp al,012
jne FAIL_3C_0
jmp TEST_3C_1
FAIL_3C_0:
mov dx,00043 ; Print a C
mov ax,00202
int 021
; ##################
TEST_3C_1: ; CMP AL,IMMED8 - Test flags
; Overflow, Sign, Zero, Parity, AUX, Carry
mov ax,00080 ; Test overflow flag
cmp al,001 ; Overflow should be set
jno FAIL_3C_1 ; If not set, then fail
mov ax,037FF ; Test overflow flag
cmp al,001 ; Overflow should NOT be set
jno PASS_3C_1 ; If not set, then we passed
jmp FAIL_3C_1
PASS_3C_1:
mov ax,0FFFF ; Test sign flag
cmp al,001 ; sign should be set
jns FAIL_3C_1 ; If not set, then fail
mov ax,09911 ; Test sign flag
cmp al,001 ; sign should NOT be set
js FAIL_3C_1 ; If set then we fail
mov ax,00012 ; Test zero flag
cmp al,012 ; zero should be set
jne FAIL_3C_1 ; If not set then we fail
mov ax,00001 ; Test zero flag
cmp al,012 ; zero should NOT be set
je FAIL_3C_1 ; If set then we fail
mov ax,01244 ; Test parity flag
cmp al,011 ; parity should be set
jnp FAIL_3C_1 ; If not set then we fail
mov ax,01244 ; Test parity flag
cmp al,010 ; parity should NOT be set
jp FAIL_3C_1 ; If set then we fail
mov ax,0FF00 ; Test carry flag
cmp al,001 ; carry should be set
jnc FAIL_3C_1 ; If not set then we fail
mov ax,01234 ; Test carry flag
cmp al,001 ; carry should NOT be set
jc FAIL_3C_1 ; If set then we fail
jmp TEST_3D_0
FAIL_3C_1:
mov dx,00043 ; Print a C
mov ax,00202
int 021
; 0x3D - CMP AX,IMMED16
;
TEST_3D_0: ; CMP AX,IMMED16 - Test data values from registers
mov ax,0FFFF
lock cmp ax,0FFFF
jne FAIL_3D_0
mov ax,00000
cmp ax,00000
jne FAIL_3D_0
mov ax,01234
cmp ax,01234
jne FAIL_3D_0
jmp TEST_3D_1
FAIL_3D_0:
mov dx,00044 ; Print a D
mov ax,00202
int 021
; ##################
TEST_3D_1: ; CMP AX,IMMED16 - Test flags
; Overflow, Sign, Zero, Parity, AUX, Carry
mov ax,08000 ; Test overflow flag
cmp ax,00001 ; Overflow should be set
jno FAIL_3D_1 ; If not set, then fail
mov ax,01234 ; Test overflow flag
cmp ax,00002 ; Overflow should NOT be set
jno PASS_3D_1 ; If not set, then we passed
jmp FAIL_3D_1
PASS_3D_1:
mov ax,0FFFF ; Test sign flag
cmp ax,00023 ; sign should be set
jns FAIL_3D_1 ; If not set, then fail
mov ax,01234 ; Test sign flag
cmp ax,00001 ; sign should NOT be set
js FAIL_3D_1 ; If set then we fail
mov ax,01234 ; Test zero flag
cmp ax,01234 ; zero should be set
jne FAIL_3D_1 ; If not set then we fail
mov ax,00001 ; Test zero flag
cmp ax,01234 ; zero should NOT be set
je FAIL_3D_1 ; If set then we fail
mov ax,04444 ; Test parity flag
cmp ax,01111 ; parity should be set
jnp FAIL_3D_1 ; If not set then we fail
mov ax,04444 ; Test parity flag
cmp ax,04410 ; parity should NOT be set
jp FAIL_3D_1 ; If set then we fail
mov ax,00000 ; Test carry flag
cmp ax,00001 ; carry should be set
jnc FAIL_3D_1 ; If not set then we fail
mov ax,01234 ; Test carry flag
cmp ax,00001 ; carry should NOT be set
jc FAIL_3D_1 ; If set then we fail
jmp TEST_3E_0
FAIL_3D_1:
mov dx,00044 ; Print a D
mov ax,00202
int 021
; 0x3E - DS: Data Segment Override
; ############################################################
TEST_3E_0:
mov ax,01234
mov ds:[08050],ax
mov ax,05678
mov es:[08050],ax
cmp ds:[08050],01234
jne FAIL_3E_0
jmp TEST_3F_0
FAIL_3E_0:
mov dx,00045 ; Print a E
mov ax,00202
int 021
; 0x3F - AAS - AscII Adjust for Subtraction
; ############################################################
; TEST WITH AUX_FLAG=0
; --------------------
TEST_3F_0:
mov cx,000FF ; Loop count of 256
mov bx,00000 ; Initialize BX incrementer
mov dx,00000 ; Initialize DX summation counter
L32:
mov ax,00000
add ax,0 ; Cause AUX_FLAG to be set to 0
mov al,bl ; Set AL to incremented value
aas
add dx,ax ; Add results to summation counter
inc bx ; Increment to the next value
loop L32
cmp dx,0A637 ; All AAA values should add up to this
jz TEST_3F_1
FAIL_3F_0:
mov dx,00046 ; Print a F
mov ax,00202
int 021
; TEST WITH AUX_FLAG=1
; --------------------
TEST_3F_1:
mov cx,000FF ; Loop count of 256
mov bx,00000 ; Initialize BX incrementer
mov dx,00000 ; Initialize DX summation counter
L33:
mov ax,00001
add al,0F ; Cause AUX_FLAG to be set to 1
mov al,bl ; Set AL to incremented value
aas
add dx,ax ; Add results to summation counter
inc bx ; Increment to the next value
loop L33
cmp dx,00877 ; All AAA values should add up to this
jz TEST_3F_2
FAIL_3F_1:
mov dx,00046 ; Print a F
mov ax,00202
int 021
TEST_3F_2: ; Test flags
mov ax,000F
aas ; CF should be 1
jc Z_END
FAIL_3F_2:
mov dx,00046 ; Print a F
mov ax,00202
int 021
; xxxxxxxxxxxxxxxxxxxxxxx
; End
; xxxxxxxxxxxxxxxxxxxxxxx
Z_END:
mov ax,00000 ; DOS Command=Exit
int 021