Projects/MCL86/Tests/TEST_AX.ASM

1671 lines
41 KiB
NASM

; Tests for opcode range 0xA0-0xAF
; ---------------------------------
; 0xA0 - MOV AL,MEM8
; ############################################################
TEST_A0_0:
mov byte [00050],05A
mov al, byte[00050]
cmp al,005A
jne FAIL_A0_0
jmp TEST_A1_0
FAIL_A0_0:
mov dx,00030 ; Print a 0
mov ax,00202
int 021
jmp Z_END
; 0xA1 - MOV AX,MEM16
; ############################################################
TEST_A1_0:
mov word [00050],0ABCD
mov ax, word [00050]
cmp ax,0ABCD
jne FAIL_A1_0
jmp TEST_A2_0
FAIL_A1_0:
mov dx,00031 ; Print a 1
mov ax,00202
int 021
jmp Z_END
; 0xA2 - MOV MEM8,AL
; ############################################################
TEST_A2_0:
mov al,022
mov byte [00050],al
cmp byte [00050],022
jne FAIL_A2_0
jmp TEST_A3_0
FAIL_A2_0:
mov dx,00032 ; Print a 2
mov ax,00202
int 021
jmp Z_END
; 0xA3 - MOV AX,MEM16
; ############################################################
TEST_A3_0:
mov ax,0ABCD
mov word [00050],ax
cmp word [00050],0ABCD
jne FAIL_A3_0
jmp TEST_A4_0
FAIL_A3_0:
mov dx,00033 ; Print a 3
mov ax,00202
int 021
; 0xA4 - MOVSB
; ############################################################
TEST_A4_0: ; Direction set to 0
mov bx,0B000
mov ax,0B001 ; Set the pointers
mov si,ax
add ax,00005
mov di,ax
cld ; Clear direction to incrementing
mov byte ds:[bx+000],05A
mov byte ds:[bx+001],011
mov byte ds:[bx+002],022
mov byte ds:[bx+003],033
mov byte ds:[bx+004],044
mov byte ds:[bx+005],05A
movsb
lock movsb
movsb
movsb
cmp byte es:[di-04],011 ; Confifm the data was moved
jne FAIL_A4_0
cmp byte es:[di-03],022
jne FAIL_A4_0
cmp byte es:[di-02],033
jne FAIL_A4_0
cmp byte es:[di-01],044
jne FAIL_A4_0
cmp byte ds:[bx+000],05A ; Confifm surrounding data untouched
jne FAIL_A4_0
cmp byte ds:[bx+005],05A
jne FAIL_A4_0
cmp di,0B00A ; Check DI was incremented
jne FAIL_A4_0
cmp si,0B005 ; Check SI was incremented
jne FAIL_A4_0
jmp TEST_A4_1
FAIL_A4_0:
mov dx,00034 ; Print a 4
mov ax,00202
int 021
TEST_A4_1: ; Direction set to 1
mov ax,ds ; Increment the DS
inc ax
mov ds,ax
mov bx,0B000
mov ax,0B004 ; Set the pointers
mov si,ax
mov ax,0B009
mov di,ax
std ; Set direction to decrementing
mov byte es:[bx+000],05A
mov byte es:[bx+001],055
mov byte es:[bx+002],066
mov byte es:[bx+003],077
mov byte es:[bx+004],088
mov byte es:[bx+005],05A
es: movsb
es: movsb
es: movsb
es: movsb
cmp byte es:[di+01],055 ; Confifm the data was moved
jne FAIL_A4_1
cmp byte es:[di+02],066
jne FAIL_A4_1
cmp byte es:[di+03],077
jne FAIL_A4_1
cmp byte es:[di+04],088
jne FAIL_A4_1
cmp byte es:[bx+000],05A ; Confifm surrounding data untouched
jne FAIL_A4_1
cmp byte es:[bx+005],05A
jne FAIL_A4_1
cmp di,0B005 ; Check DI was decremented
jne FAIL_A4_1
cmp si,0B000 ; Check SI was decremented
jne FAIL_A4_1
jmp TEST_A4_2
FAIL_A4_1:
mov dx,00034 ; Print a 4
mov ax,00202
int 021
TEST_A4_2: ; Use REP prefix instead of single movsb's
mov bx,0B000
mov ax,0B001 ; Set the pointers
mov si,ax
add ax,00005
mov di,ax
cld ; Clear direction to incrementing
mov byte ds:[bx+000],05A
mov byte ds:[bx+001],011
mov byte ds:[bx+002],022
mov byte ds:[bx+003],033
mov byte ds:[bx+004],044
mov byte ds:[bx+005],05A
mov cx,04
rep movsb
cmp byte es:[di-04],011 ; Confifm the data was moved
jne FAIL_A4_2
cmp byte es:[di-03],022
jne FAIL_A4_2
cmp byte es:[di-02],033
jne FAIL_A4_2
cmp byte es:[di-01],044
jne FAIL_A4_2
cmp byte ds:[bx+000],05A ; Confifm surrounding data untouched
jne FAIL_A4_2
cmp byte ds:[bx+005],05A
jne FAIL_A4_2
cmp di,0B00A ; Check DI was incremented
jne FAIL_A4_2
cmp si,0B005 ; Check SI was incremented
jne FAIL_A4_2
jmp TEST_A5_0
FAIL_A4_2:
mov dx,00034 ; Print a 4
mov ax,00202
int 021
; 0xA5 - MOVSW
; ############################################################
TEST_A5_0: ; Direction set to 0
mov bx,0C000
mov ax,0C002 ; Set the pointers
mov si,ax
mov ax,0C012
mov di,ax
cld ; Clear direction to incrementing
mov word ds:[bx+000],05AA5
mov word ds:[bx+002],01122
mov word ds:[bx+004],03344
mov word ds:[bx+006],05566
mov word ds:[bx+008],07788
mov word ds:[bx+00A],0A55A
movsw
movsw
movsw
movsw
cmp word es:[di-08],01122 ; Confifm the data was moved
jne FAIL_A5_0
cmp word es:[di-06],03344
jne FAIL_A5_0
cmp word es:[di-04],05566
jne FAIL_A5_0
cmp word es:[di-02],07788
jne FAIL_A5_0
cmp di,0C01A ; Check DI was incremented
jne FAIL_A5_0
cmp si,0C00A ; Check SI was incremented
jne FAIL_A5_0
jmp TEST_A5_1
FAIL_A5_0:
mov dx,00035 ; Print a 5
mov ax,00202
int 021
TEST_A5_1: ; Direction set to 1
mov ax,ds ; Increment the DS
inc ax
mov ds,ax
mov bx,0C000
mov ax,0C008 ; Set the pointers
mov si,ax
mov ax,0C018
mov di,ax
std ; Set direction to decrementing
mov word es:[bx+000],00000
mov word es:[bx+002],01A1A
mov word es:[bx+004],02B2B
mov word es:[bx+006],03C3C
mov word es:[bx+008],04D4D
mov word es:[bx+00A],0EEEE
es:movsw
es:movsw
es:movsw
es:movsw
cmp word es:[di+02],01A1A ; Confifm the data was moved
jne FAIL_A5_1
cmp word es:[di+04],02B2B
jne FAIL_A5_1
cmp word es:[di+06],03C3C
jne FAIL_A5_1
cmp word es:[di+08],04D4D
jne FAIL_A5_1
cmp di,0C010 ; Check DI was decremented
jne FAIL_A5_1
cmp si,0C000 ; Check SI was decremented
jne FAIL_A5_1
jmp TEST_A5_2
FAIL_A5_1:
mov dx,00035 ; Print a 5
mov ax,00202
int 021
TEST_A5_2: ; Test REP instead of single MOVSW's
mov bx,0C000
mov ax,0C002 ; Set the pointers
mov si,ax
mov ax,0C012
mov di,ax
cld ; Clear direction to incrementing
mov word ds:[bx+000],05AA5
mov word ds:[bx+002],01122
mov word ds:[bx+004],03344
mov word ds:[bx+006],05566
mov word ds:[bx+008],07788
mov word ds:[bx+00A],0A55A
mov cx,0004
rep movsw
cmp word es:[di-08],01122 ; Confifm the data was moved
jne FAIL_A5_2
cmp word es:[di-06],03344
jne FAIL_A5_2
cmp word es:[di-04],05566
jne FAIL_A5_2
cmp word es:[di-02],07788
jne FAIL_A5_2
cmp di,0C01A ; Check DI was incremented
jne FAIL_A5_2
cmp si,0C00A ; Check SI was incremented
jne FAIL_A5_2
jmp TEST_A6_0
FAIL_A5_2:
mov dx,00035 ; Print a 5
mov ax,00202
int 021
; 0xA6 - CMPSB
; ############################################################
TEST_A6_0: ; Direction set to 0
mov ax,es ; Set ES apart from DS
add ax,020
mov es,ax
cld ; Clear direction to incrementing
mov si,0C000 ; Set the pointers
mov di,0C000
mov word ds:[si+000],03412 ; Fill DS Memory
mov word ds:[si+002],06666
mov word ds:[si+004],0AB89
mov word ds:[si+006],0EFCD
mov word ds:[si+008],0EADE
mov word ds:[si+00A],0EFBE
mov word es:[di+000],03412 ; Fill ES Memory
mov word es:[di+002],07856
mov word es:[di+004],0AB89
mov word es:[di+006],0EFCD
mov word es:[di+008],0EADE
mov word es:[di+00A],0EFBE
cmpsb ; Data should match
jne FAIL_A6_0
js FAIL_A6_0 ; Should not have Sign flag asserted
cmpsb ; Data should match
jne FAIL_A6_0
cmpsb ; Data should NOT match
je FAIL_A6_0
cmpsb ; Data should NOT match
je FAIL_A6_0
cmpsb ; Data should match
jne FAIL_A6_0
cmpsb ; Data should match
jne FAIL_A6_0
cmp di,0C006 ; Check DI was incremented
jne FAIL_A6_0
cmp si,0C006 ; Check SI was incremented
jne FAIL_A6_0
jmp TEST_A6_1
FAIL_A6_0:
mov dx,00036 ; Print a 6
mov ax,00202
int 021
TEST_A6_1: ; Direction set to 1
std ; Set direction for decrementing
mov si,0C005 ; Reset the pointers
mov di,0C005
mov ax,ds ; Increment the DS so it no longer points to data
mov ss,ax
inc ax
mov ds,ax
ss:cmpsb ; Data should match
jne FAIL_A6_1
ss:cmpsb ; Data should match
jne FAIL_A6_1
ss:cmpsb ; Data should NOT match
je FAIL_A6_1
ss:cmpsb ; Data should NOT match
je FAIL_A6_1
ss:cmpsb ; Data should match
jne FAIL_A6_1
ss:cmpsb ; Data should match
jne FAIL_A6_1
cmp di,0BFFF ; Check DI was decremented
jne FAIL_A6_1
cmp si,0BFFF ; Check SI was decremented
jne FAIL_A6_1
jmp TEST_A6_2
FAIL_A6_1:
mov dx,00036 ; Print a 6
mov ax,00202
int 021
TEST_A6_2: ; Direction set to 0
mov ax,es ; Set ES apart from DS
add ax,020
mov es,ax
cld ; Clear direction to incrementing
mov si,0C000 ; Set the pointers
mov di,0C000
mov word ds:[si+000],03412 ; Fill DS Memory
mov word ds:[si+002],07856
mov word ds:[si+004],0AB89
mov word ds:[si+006],0EFCD
mov word ds:[si+008],01111
mov word ds:[si+00A],0EFBE
mov word es:[di+000],03412 ; Fill ES Memory
mov word es:[di+002],07856
mov word es:[di+004],0AB89
mov word es:[di+006],0EFCD
mov word es:[di+008],0EADE
mov word es:[di+00A],0EFBE
mov cl,0C ; Scan up to 12 times
repz cmpsb
cmp di,0C009 ; Check where pointer left off
jne FAIL_A6_2
cmp si,0C009
jne FAIL_A6_2
jmp TEST_A6_3
FAIL_A6_2:
mov dx,00036 ; Print a 6
mov ax,00202
int 021
TEST_A6_3: ; Direction set to 1
mov ax,ds ; Set ES apart from DS
add ax,020
mov es,ax
std ; Set direction for decrementing
mov si,0C000 ; Set the pointers
mov di,0C000
mov word ds:[si+000],00000 ; Fill DS Memory
mov word ds:[si+002],00000
mov word ds:[si+004],00000
mov word ds:[si+006],00000
mov word ds:[si+008],00000
mov word ds:[si+00A],00000
mov word es:[di+000],01111 ; Fill ES Memory
mov word es:[di+002],01100
mov word es:[di+004],01111
mov word es:[di+006],01111
mov word es:[di+008],01111
mov word es:[di+00A],01111
mov si,0C008 ; Set the pointers
mov di,0C008
mov cl,0C ; Scan up to 12 times
repnz cmpsb
cmp di,0C001 ; Check where pointer left off
jne FAIL_A6_3
cmp si,0C001
jne FAIL_A6_3
jmp TEST_A7_0
FAIL_A6_3:
mov dx,00036 ; Print a 6
mov ax,00202
int 021
; 0xA7 - CMPSW
; ############################################################
TEST_A7_0: ; Direction set to 0
mov ax,es ; Set ES apart from DS
add ax,020
mov es,ax
cld ; Clear direction to incrementing
mov si,0C000 ; Set the pointers
mov di,0C000
mov word ds:[si+000],03412 ; Fill DS Memory
mov word ds:[si+002],06666
mov word ds:[si+004],0AB89
mov word ds:[si+006],0EFCD
mov word ds:[si+008],0EADE
mov word ds:[si+00A],0EFBE
mov word es:[di+000],03412 ; Fill ES Memory
mov word es:[di+002],07856
mov word es:[di+004],0AB89
mov word es:[di+006],0EFCD
mov word es:[di+008],0EADE
mov word es:[di+00A],0EFBE
cmpsw ; Data should match
jne FAIL_A7_0
js FAIL_A7_0 ; Should not have Sign flag asserted
cmpsw ; Data should NOT match
je FAIL_A7_0
cmpsw ; Data should match
jne FAIL_A7_0
lock cmpsw ; Data should match
jne FAIL_A7_0
cmpsw ; Data should match
jne FAIL_A7_0
cmpsw ; Data should match
jne FAIL_A7_0
cmp di,0C00C ; Check DI was incremented
jne FAIL_A7_0
cmp si,0C00C ; Check SI was incremented
jne FAIL_A7_0
jmp TEST_A7_1
FAIL_A7_0:
mov dx,00037 ; Print a 7
mov ax,00202
int 021
TEST_A7_1: ; Direction set to 1
std ; Set direction for decrementing
mov si,0C00A ; Reset the pointers
mov di,0C00A
mov ax,ds ; Increment the DS so it no longer points to data
mov ss,ax
inc ax
mov ds,ax
ss:cmpsw ; Data should match
jne FAIL_A7_1
ss:cmpsw ; Data should match
jne FAIL_A7_1
ss:cmpsw ; Data should match
jne FAIL_A7_1
ss:cmpsw ; Data should match
jne FAIL_A7_1
ss:cmpsw ; Data should NOT match
je FAIL_A7_1
ss:cmpsw ; Data should match
jne FAIL_A7_1
cmp di,0BFFE ; Check DI was decremented
jne FAIL_A7_1
cmp si,0BFFE ; Check SI was decremented
jne FAIL_A7_1
jmp TEST_A7_2
FAIL_A7_1:
mov dx,00037 ; Print a 7
mov ax,00202
int 021
TEST_A7_2: ; Direction set to 0
mov ax,es ; Set ES apart from DS
add ax,020
mov es,ax
cld ; Clear direction to incrementing
mov si,0C000 ; Set the pointers
mov di,0C000
mov word ds:[si+000],03412 ; Fill DS Memory
mov word ds:[si+002],07856
mov word ds:[si+004],0AB89
mov word ds:[si+006],0EFCD
mov word ds:[si+008],01111
mov word ds:[si+00A],0EFBE
mov word es:[di+000],03412 ; Fill ES Memory
mov word es:[di+002],07856
mov word es:[di+004],0AB89
mov word es:[di+006],0EFCD
mov word es:[di+008],0EADE
mov word es:[di+00A],0EFBE
mov cl,06 ; Scan up to 6 times
repz cmpsw
cmp di,0C00A ; Check where pointer left off
jne FAIL_A7_2
cmp si,0C00A
jne FAIL_A7_2
jmp TEST_A7_3
FAIL_A7_2:
mov dx,00037 ; Print a 7
mov ax,00202
int 021
TEST_A7_3: ; Direction set to 1
mov ax,ds ; Set ES apart from DS
add ax,020
mov es,ax
std ; Set direction for decrementing
mov si,0C000 ; Set the pointers
mov di,0C000
mov word ds:[si+000],00000 ; Fill DS Memory
mov word ds:[si+002],00000
mov word ds:[si+004],00000
mov word ds:[si+006],00000
mov word ds:[si+008],00000
mov word ds:[si+00A],00000
mov word es:[di+000],01111 ; Fill ES Memory
mov word es:[di+002],00000
mov word es:[di+004],01111
mov word es:[di+006],01111
mov word es:[di+008],01111
mov word es:[di+00A],01111
mov si,0C00A ; Set the pointers
mov di,0C00A
mov cl,06 ; Scan up to 6 times
repnz cmpsw
cmp di,0C000 ; Check where pointer left off
jne FAIL_A7_3
cmp si,0C000
jne FAIL_A7_3
jmp TEST_A8_0
FAIL_A7_3:
mov dx,00037 ; Print a 7
mov ax,00202
int 021
; 0xA8 - TEST AL,IMM8
; ############################################################
TEST_A8_0: ; TEST MEM8,REG8 - Test flags
mov ax,01234
test al,022 ; Overflow should NEVER be set
jno PASS_A8_0 ; If not set, then we passed
jmp FAIL_A8_0 ; If set then we fail
PASS_A8_0:
mov ax,00080
test al,0FF ; sign should be set
jns FAIL_A8_0 ; If not set, then fail
mov ax,0007F
test al,0FF ; sign should NOT be set
js FAIL_A8_0 ; If set then we fail
mov ax,0005A
test al,0A5 ; zero should be set
jne FAIL_A8_0 ; If not set then we fail
jmp PASS_A8_2
FAIL_A8_0:
mov dx,00038 ; Print a 8
mov ax,00202
int 021
jmp TEST_A9_0
PASS_A8_2:
mov ax,00001
test al,001 ; zero should NOT be set
je FAIL_A8_0 ; If set then we fail
mov ax,00003
test al,003 ; parity should be set
jnp FAIL_A8_0 ; If not set then we fail
mov ax,00001
test al,001 ; parity should NOT be set
jp FAIL_A8_0 ; If set then we fail
mov ax,01234
test al,066 ; carry should NEVER be set
jc FAIL_A8_0 ; If set then we fail
; 0xA9 - TEST AX,IMM16
; ############################################################
TEST_A9_0: ; TEST MEM8,REG8 - Test flags
mov ax,01234
test ax,00022 ; Overflow should NEVER be set
jno PASS_A9_0 ; If not set, then we passed
jmp FAIL_A9_0 ; If set then we fail
PASS_A9_0:
mov ax,08000
test ax,0FFFF ; sign should be set
jns FAIL_A9_0 ; If not set, then fail
mov ax,0FF7F
test ax,000FF ; sign should NOT be set
js FAIL_A9_0 ; If set then we fail
mov ax,0225A
test ax,044A5 ; zero should be set
jne FAIL_A9_0 ; If not set then we fail
jmp PASS_A9_2
FAIL_A9_0:
mov dx,00039 ; Print a 9
mov ax,00202
int 021
jmp TEST_AA_0
PASS_A9_2:
mov ax,01001
test ax,01001 ; zero should NOT be set
je FAIL_A9_0 ; If set then we fail
mov ax,00003
test ax,00003 ; parity should be set
jnp FAIL_A9_0 ; If not set then we fail
mov ax,00001
test ax,00001 ; parity should NOT be set
jp FAIL_A9_0 ; If set then we fail
mov ax,01234
test ax,00066 ; carry should NEVER be set
jc FAIL_A9_0 ; If set then we fail
; 0xAA - STOSB
; ############################################################
TEST_AA_0:
mov ax,es ; Set ES apart from DS
add ax,020
mov es,ax
add ax,020
mov ss,ax
cld ; Clear direction to incrementing
mov si,0C000 ; Set the pointers
mov di,0C000
mov word es:[di+000],00000 ; Fill ES Memory
mov word es:[di+002],00000
mov word es:[di+004],00000
mov word es:[di+006],00000
mov word es:[di+008],00000
mov word es:[di+00A],00000
mov word es:[di+00C],00000
mov word es:[di+00E],00000
mov al,011
lock stosb ; Test LOCK
mov al,022
stosb
mov al,033
stosb
mov al,044
ss: stosb ; Segment override should be ignored
cmp di,0C004 ; Check where pointer left off
jne FAIL_AA_0
cmp si,0C000
jne FAIL_AA_0
mov di,0C000 ; Reset DI
cmp byte es:[di+000],011 ; Data should match
jne FAIL_AA_0
cmp byte es:[di+001],022 ; Data should match
jne FAIL_AA_0
cmp byte es:[di+002],033 ; Data should match
jne FAIL_AA_0
cmp byte es:[di+003],044 ; Data should match
jne FAIL_AA_0
cmp byte es:[di+004],000 ; Data should match
jne FAIL_AA_0
jmp TEST_AA_1
FAIL_AA_0:
mov dx,00041 ; Print a A
mov ax,00202
int 021
TEST_AA_1:
std ; Set direction to Decrementing
mov si,0C000 ; Set the pointers
mov di,0C000
mov word es:[di+000],00000 ; Fill ES Memory
mov word es:[di+002],00000
mov word es:[di+004],00000
mov word es:[di+006],00000
mov word es:[di+008],00000
mov word es:[di+00A],00000
mov word es:[di+00C],00000
mov word es:[di+00E],00000
mov si,0C003 ; Set the pointers
mov di,0C003
mov al,044
lock stosb ; Test LOCK
mov al,033
stosb
mov al,022
stosb
mov al,011
ss: stosb ; Segment override should be ignored
cmp di,0BFFF ; Check where pointer left off
jne FAIL_AA_1
cmp si,0C003
jne FAIL_AA_1
mov di,0C000 ; Reset DI
cmp byte es:[di+000],011 ; Data should match
jne FAIL_AA_1
cmp byte es:[di+001],022 ; Data should match
jne FAIL_AA_1
cmp byte es:[di+002],033 ; Data should match
jne FAIL_AA_1
cmp byte es:[di+003],044 ; Data should match
jne FAIL_AA_1
cmp byte es:[di+004],000 ; Data should match
jne FAIL_AA_1
jmp TEST_AA_2
FAIL_AA_1:
mov dx,00041 ; Print a A
mov ax,00202
int 021
TEST_AA_2:
cld ; Clear direction to incrementing
mov si,0C000 ; Set the pointers
mov di,0C000
mov word es:[di+000],00000 ; Fill ES Memory
mov word es:[di+002],00000
mov word es:[di+004],00000
mov word es:[di+006],00000
mov word es:[di+008],00000
mov word es:[di+00A],00000
mov word es:[di+00C],00000
mov word es:[di+00E],00000
mov al,011
mov cx,004
rep stosb
cmp di,0C004 ; Check where pointer left off
jne FAIL_AA_2
cmp si,0C000
jne FAIL_AA_2
mov di,0C000 ; Reset DI
cmp byte es:[di+000],011 ; Data should match
jne FAIL_AA_2
cmp byte es:[di+001],011 ; Data should match
jne FAIL_AA_2
cmp byte es:[di+002],011 ; Data should match
jne FAIL_AA_2
cmp byte es:[di+003],011 ; Data should match
jne FAIL_AA_2
cmp byte es:[di+004],000 ; Data should match
jne FAIL_AA_2
jmp TEST_AA_3
FAIL_AA_2:
mov dx,00041 ; Print a A
mov ax,00202
int 021
TEST_AA_3:
std ; Set direction to Decrementing
mov si,0C000 ; Set the pointers
mov di,0C000
mov word es:[di+000],00000 ; Fill ES Memory
mov word es:[di+002],00000
mov word es:[di+004],00000
mov word es:[di+006],00000
mov word es:[di+008],00000
mov word es:[di+00A],00000
mov word es:[di+00C],00000
mov word es:[di+00E],00000
mov si,0C003 ; Set the pointers
mov di,0C003
mov al,011
mov cx,004
rep stosb
cmp di,0BFFF ; Check where pointer left off
jne FAIL_AA_3
cmp si,0C003
jne FAIL_AA_3
mov di,0C000 ; Reset DI
cmp byte es:[di+000],011 ; Data should match
jne FAIL_AA_3
cmp byte es:[di+001],011 ; Data should match
jne FAIL_AA_3
cmp byte es:[di+002],011 ; Data should match
jne FAIL_AA_3
cmp byte es:[di+003],011 ; Data should match
jne FAIL_AA_3
cmp byte es:[di+004],000 ; Data should match
jne FAIL_AA_3
jmp TEST_AB_0
FAIL_AA_3:
mov dx,00041 ; Print a A
mov ax,00202
int 021
; 0xAB - STOSW
; ############################################################
TEST_AB_0:
mov ax,es ; Set ES apart from DS
add ax,020
mov es,ax
add ax,020
mov ss,ax
cld ; Clear direction to incrementing
mov si,0C000 ; Set the pointers
mov di,0C000
mov word es:[di+000],00000 ; Fill ES Memory
mov word es:[di+002],00000
mov word es:[di+004],00000
mov word es:[di+006],00000
mov word es:[di+008],00000
mov word es:[di+00A],00000
mov word es:[di+00C],00000
mov word es:[di+00E],00000
mov ax,01111
lock stosw ; Test LOCK
mov ax,02222
stosw
mov ax,03333
stosw
mov ax,04444
ss: stosw ; Segment override should be ignored
cmp di,0C008 ; Check where pointer left off
jne FAIL_AB_0
cmp si,0C000
jne FAIL_AB_0
mov di,0C000 ; Reset DI
cmp word es:[di+000],01111 ; Data should match
jne FAIL_AB_0
cmp word es:[di+002],02222 ; Data should match
jne FAIL_AB_0
cmp word es:[di+004],03333 ; Data should match
jne FAIL_AB_0
cmp word es:[di+006],04444 ; Data should match
jne FAIL_AB_0
cmp word es:[di+008],00000 ; Data should match
jne FAIL_AB_0
jmp TEST_AB_1
FAIL_AB_0:
mov dx,00042 ; Print a B
mov ax,00202
int 021
TEST_AB_1:
std ; Set direction to Decrementing
mov si,0C000 ; Set the pointers
mov di,0C000
mov word es:[di+000],00000 ; Fill ES Memory
mov word es:[di+002],00000
mov word es:[di+004],00000
mov word es:[di+006],00000
mov word es:[di+008],00000
mov word es:[di+00A],00000
mov word es:[di+00C],00000
mov word es:[di+00E],00000
mov si,0C006 ; Set the pointers
mov di,0C006
mov ax,04444
lock stosw ; Test LOCK
mov ax,03333
stosw
mov ax,02222
stosw
mov ax,01111
ss: stosw ; Segment override should be ignored
cmp di,0BFFE ; Check where pointer left off
jne FAIL_AB_1
cmp si,0C006
jne FAIL_AB_1
mov di,0C000 ; Reset DI
cmp word es:[di+000],01111 ; Data should match
jne FAIL_AB_1
cmp word es:[di+002],02222 ; Data should match
jne FAIL_AB_1
cmp word es:[di+004],03333 ; Data should match
jne FAIL_AB_1
cmp word es:[di+006],04444 ; Data should match
jne FAIL_AB_1
cmp word es:[di+008],00000 ; Data should match
jne FAIL_AB_1
jmp TEST_AB_2
FAIL_AB_1:
mov dx,00042 ; Print a B
mov ax,00202
int 021
TEST_AB_2:
cld ; Clear direction to incrementing
mov si,0C000 ; Set the pointers
mov di,0C000
mov word es:[di+000],00000 ; Fill ES Memory
mov word es:[di+002],00000
mov word es:[di+004],00000
mov word es:[di+006],00000
mov word es:[di+008],00000
mov word es:[di+00A],00000
mov word es:[di+00C],00000
mov word es:[di+00E],00000
mov ax,01111
mov cx,004
rep stosw
cmp di,0C008 ; Check where pointer left off
jne FAIL_AB_2
cmp si,0C000
jne FAIL_AB_2
mov di,0C000 ; Reset DI
cmp word es:[di+000],01111 ; Data should match
jne FAIL_AB_2
cmp word es:[di+002],01111 ; Data should match
jne FAIL_AB_2
cmp word es:[di+004],01111 ; Data should match
jne FAIL_AB_2
cmp word es:[di+006],01111 ; Data should match
jne FAIL_AB_2
cmp word es:[di+008],00000 ; Data should match
jne FAIL_AB_2
jmp TEST_AB_3
FAIL_AB_2:
mov dx,00042 ; Print a B
mov ax,00202
int 021
TEST_AB_3:
std ; Set direction to Decrementing
mov si,0C000 ; Set the pointers
mov di,0C000
mov word es:[di+000],00000 ; Fill ES Memory
mov word es:[di+002],00000
mov word es:[di+004],00000
mov word es:[di+006],00000
mov word es:[di+008],00000
mov word es:[di+00A],00000
mov word es:[di+00C],00000
mov word es:[di+00E],00000
mov si,0C006 ; Set the pointers
mov di,0C006
mov ax,01111
mov cx,004
rep stosw
cmp di,0BFFE ; Check where pointer left off
jne FAIL_AB_3
cmp si,0C006
jne FAIL_AB_3
mov di,0C000 ; Reset DI
cmp word es:[di+000],01111 ; Data should match
jne FAIL_AB_3
cmp word es:[di+002],01111 ; Data should match
jne FAIL_AB_3
cmp word es:[di+004],01111 ; Data should match
jne FAIL_AB_3
cmp word es:[di+006],01111 ; Data should match
jne FAIL_AB_3
cmp word es:[di+008],0000 ; Data should match
jne FAIL_AB_3
jmp TEST_AC_0
FAIL_AB_3:
mov dx,00042 ; Print a B
mov ax,00202
int 021
; 0xAC - LODSB
; ############################################################
TEST_AC_0:
mov ax,es ; Set ES apart from DS
add ax,020
mov es,ax
add ax,020
mov ds,ax
cld ; Clear direction to incrementing
mov si,0C000 ; Set the pointers
mov di,0C000
mov word ds:[si+000],01111 ; Fill Memory
mov word ds:[si+002],02222
mov word ds:[si+004],03333
mov word ds:[si+006],04444
mov word ds:[si+008],05555
mov word ds:[si+00A],06666
mov word ds:[si+00C],07777
mov word ds:[si+00E],08888
lock lodsb ; Test LOCK
lodsb
lodsb
lodsb
cmp al,022 ; Check for data match
jne FAIL_AC_0
cmp di,0C000 ; Check where pointer left off
jne FAIL_AC_0
cmp si,0C004
jne FAIL_AC_0
jmp TEST_AC_1
FAIL_AC_0:
mov dx,00043 ; Print a C
mov ax,00202
int 021
TEST_AC_1:
std ; Set direction to Decrementing
mov si,0C003 ; Set the pointers
mov di,0C003
lock lodsb ; Test LOCK
lodsb
lodsb
lodsb
cmp al,011 ; Check for data match
jne FAIL_AC_1
cmp di,0C003 ; Check where pointer left off
jne FAIL_AC_1
cmp si,0BFFF
jne FAIL_AC_1
mov si,0C007 ; Set the pointers
es: lodsb ; Segment override where data wont match
cmp al,044 ; Check for data match
je FAIL_AC_1
jmp TEST_AC_2
FAIL_AC_1:
mov dx,00043 ; Print a C
mov ax,00202
int 021
TEST_AC_2:
cld ; Clear direction to incrementing
mov si,0C000 ; Set the pointers
mov di,0C000
mov cl,9
rep lodsb ; Test Repeat
cmp al,055 ; Check for data match
jne FAIL_AC_2
cmp di,0C000 ; Check where pointer left off
jne FAIL_AC_2
cmp si,0C009
jne FAIL_AC_2
jmp TEST_AD_0
FAIL_AC_2:
mov dx,00043 ; Print a C
mov ax,00202
int 021
; 0xAD - LODSW
; ############################################################
TEST_AD_0:
mov ax,es ; Set ES apart from DS
add ax,020
mov es,ax
add ax,020
mov ds,ax
cld ; Clear direction to incrementing
mov si,0C000 ; Set the pointers
mov di,0C000
mov word ds:[si+000],01111 ; Fill Memory
mov word ds:[si+002],02222
mov word ds:[si+004],03333
mov word ds:[si+006],04444
mov word ds:[si+008],05555
mov word ds:[si+00A],06666
mov word ds:[si+00C],07777
mov word ds:[si+00E],08888
lock lodsw ; Test LOCK
lodsw
lodsw
lodsw
cmp ax,04444 ; Check for data match
jne FAIL_AD_0
cmp di,0C000 ; Check where pointer left off
jne FAIL_AD_0
cmp si,0C008
jne FAIL_AD_0
jmp TEST_AD_1
FAIL_AD_0:
mov dx,00044 ; Print a D
mov ax,00202
int 021
TEST_AD_1:
std ; Set direction to Decrementing
mov si,0C008 ; Set the pointers
mov di,0C008
lock lodsw ; Test LOCK
lodsw
lodsw
lodsw
cmp ax,02222 ; Check for data match
jne FAIL_AD_1
cmp di,0C008 ; Check where pointer left off
jne FAIL_AD_1
cmp si,0C000
jne FAIL_AD_1
mov si,0C008 ; Set the pointers
es: lodsw ; Segment override where data wont match
cmp al,044 ; Check for data match
je FAIL_AD_1
jmp TEST_AD_2
FAIL_AD_1:
mov dx,00044 ; Print a D
mov ax,00202
int 021
TEST_AD_2:
cld ; Clear direction to incrementing
mov si,0C000 ; Set the pointers
mov di,0C000
mov cl,04
rep lodsw ; Test Repeat
cmp ax,04444 ; Check for data match
jne FAIL_AD_2
cmp di,0C000 ; Check where pointer left off
jne FAIL_AD_2
cmp si,0C008
jne FAIL_AD_2
jmp TEST_AE_0
FAIL_AD_2:
mov dx,00044 ; Print a D
mov ax,00202
int 021
; 0xAE - SCASB
; ############################################################
TEST_AE_0:
mov ax,es ; Set ES apart from DS
add ax,020
mov es,ax
add ax,020
mov ds,ax
cld ; Clear direction to incrementing
mov si,0C000 ; Set the pointers
mov di,0C000
mov word es:[di+000],01122 ; Fill Memory
mov word es:[di+002],03344
mov word es:[di+004],05566
mov word es:[di+006],07788
mov word es:[di+008],099AA
mov word es:[di+00A],0BBCC
mov word es:[di+00C],0DDEE
mov word es:[di+00E],0FF5A
mov al,066
lock scasb ; Test LOCK
je FAIL_AE_0 ; Should not have data match yet
lock scasb
je FAIL_AE_0 ; Should not have data match yet
lock scasb
je FAIL_AE_0 ; Should not have data match yet
lock scasb
je FAIL_AE_0 ; Should not have data match yet
lock scasb
jne FAIL_AE_0 ; Data should match here
cmp di,0C005 ; Check where pointer left off
jne FAIL_AE_0
cmp si,0C000
jne FAIL_AE_0
jmp TEST_AE_1
FAIL_AE_0:
mov dx,00045 ; Print a E
mov ax,00202
int 021
TEST_AE_1:
std ; Set direction to Decrementing
mov si,0C00A ; Set the pointers
mov di,0C00A
mov al,088
lock scasb ; Test LOCK
je FAIL_AE_1 ; Should not have data match yet
ss: scasb ; Segment Override should be ignored
je FAIL_AE_1 ; Should not have data match yet
lock scasb
je FAIL_AE_1 ; Should not have data match yet
lock scasb
je FAIL_AE_1 ; Should not have data match yet
lock scasb
jne FAIL_AE_1 ; Data should match here
cmp di,0C005 ; Check where pointer left off
jne FAIL_AE_1
cmp si,0C00A
jne FAIL_AE_1
mov si,0C007 ; Set the pointers
es: lodsb ; Segment override where data wont match
cmp al,044 ; Check for data match
je FAIL_AE_1
jmp TEST_AE_2
FAIL_AE_1:
mov dx,00045 ; Print a E
mov ax,00202
int 021
TEST_AE_2:
cld ; Clear direction to incrementing
mov si,0C000 ; Set the pointers
mov di,0C000
mov cl,00F
mov al,077
repne scasb ; Test REPZ - Scan for a data match
cmp di,0C008 ; Check where pointer left off
jne FAIL_AE_2
cmp si,0C000
jne FAIL_AE_2
mov si,0C000 ; Reset the pointers
mov di,0C000
mov word es:[di+000],04444 ; Fill Memory
mov word es:[di+002],04444
mov word es:[di+004],04444
mov word es:[di+006],04444
mov word es:[di+008],04544
mov word es:[di+00A],04444
mov word es:[di+00C],04444
mov word es:[di+00E],04444
mov cl,00F
mov al,044
repe scasb ; Test REPNZ - Scan for a data NOT match
cmp di,0C00A ; Check where pointer left off
jne FAIL_AE_2
cmp si,0C000
jne FAIL_AE_2
jmp TEST_AF_0
FAIL_AE_2:
mov dx,00045 ; Print a E
mov ax,00202
int 021
; 0xAF - SCASW
; ############################################################
TEST_AF_0:
mov ax,es ; Set ES apart from DS
add ax,020
mov es,ax
add ax,020
mov ds,ax
cld ; Clear direction to incrementing
mov si,0C000 ; Set the pointers
mov di,0C000
mov word es:[di+000],01111 ; Fill Memory
mov word es:[di+002],02222
mov word es:[di+004],03333
mov word es:[di+006],04444
mov word es:[di+008],05555
mov word es:[di+00A],06666
mov word es:[di+00C],07777
mov word es:[di+00E],08888
mov ax,05555
lock scasw ; Test LOCK
je FAIL_AF_0 ; Should not have data match yet
lock scasw
je FAIL_AF_0 ; Should not have data match yet
lock scasw
je FAIL_AF_0 ; Should not have data match yet
lock scasw
je FAIL_AF_0 ; Should not have data match yet
lock scasw
jne FAIL_AF_0 ; Data should match here
cmp di,0C00A ; Check where pointer left off
jne FAIL_AF_0
cmp si,0C000
jne FAIL_AF_0
jmp TEST_AF_1
FAIL_AF_0:
mov dx,00046 ; Print a F
mov ax,00202
int 021
TEST_AF_1:
std ; Set direction to Decrementing
mov si,0C00A ; Set the pointers
mov di,0C00A
mov ax,03333
lock scasw ; Test LOCK
je FAIL_AF_1 ; Should not have data match yet
ss: scasw ; Segment Override should be ignored
je FAIL_AF_1 ; Should not have data match yet
lock scasw
je FAIL_AF_1 ; Should not have data match yet
lock scasw
jne FAIL_AF_1 ; Data should match here
cmp di,0C002 ; Check where pointer left off
jne FAIL_AF_1
cmp si,0C00A
jne FAIL_AF_1
jmp TEST_AF_2
FAIL_AF_1:
mov dx,00046 ; Print a F
mov ax,00202
int 021
TEST_AF_2:
cld ; Clear direction to incrementing
mov si,0C000 ; Set the pointers
mov di,0C000
mov cl,00F
mov ax,07777
repne scasw ; Test REPZ - Scan for a data match
cmp di,0C00E ; Check where pointer left off
jne FAIL_AF_2
cmp si,0C000
jne FAIL_AF_2
mov si,0C000 ; Reset the pointers
mov di,0C000
mov word es:[di+000],04444 ; Fill Memory
mov word es:[di+002],04444
mov word es:[di+004],04444
mov word es:[di+006],04444
mov word es:[di+008],07777
mov word es:[di+00A],04444
mov word es:[di+00C],04444
mov word es:[di+00E],04444
mov cl,00F
mov ax,04444
repe scasw ; Test REPNZ - Scan for a data NOT match
cmp di,0C00A ; Check where pointer left off
jne FAIL_AF_2
cmp si,0C000
jne FAIL_AF_2
jmp Z_END
FAIL_AF_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