dosseg
.model small
.stack 200h
.data
msgX db 'Enter X: $'
msgY db 'Enter Y: $'
msgRes db 0ah, 'Result: $'
msgInside db 'inside the shaded square$'
msgOutside db 'outside the shaded square$'
cr equ 0dh
lf equ 0ah
string db 255, 0, 255 dup(?)
errmsg db 'Invalid char, digits only', cr, lf, '$'
negflag dw ?
.code
;----------- IntegerIn -----------
IntegerIn proc
start:
mov ah, 0ah
lea dx, string
int 21h
xor ax, ax
lea si, string+2
mov negflag, ax
cmp byte ptr [si], '-'
jne m2
not negflag
inc si
jmp m3
m2:
cmp byte ptr [si], '+'
jne m3
inc si
m3:
cmp byte ptr [si], cr
je ex1
cmp byte ptr [si], '0'
jb err1
cmp byte ptr [si], '9'
ja err1
mov bx, 10
mul bx
sub byte ptr [si], '0'
add al, [si]
adc ah, 0
inc si
jmp m3
err1:
lea dx, errmsg
mov ah, 9
int 21h
jmp start
ex1:
cmp negflag, 0
je ex
neg ax
ex:
ret
IntegerIn endp
;----------- IntegerOut -----------
IntegerOut proc
xor cx, cx
mov bx, 10
cmp ax, 0
jge m
neg ax
push ax
mov ah, 2
mov dl, '-'
int 21h
pop ax
m:
inc cx
xor dx, dx
div bx
push dx
or ax, ax
jnz m
m1:
pop dx
add dl, '0'
mov ah, 2
int 21h
loop m1
ret
IntegerOut endp
;----------- IsPointInSquare -----------
IsPointInSquare proc near
push bp
mov bp, sp
mov ax, [bp+4]
cmp ax, -10
jl outside
cmp ax, 10
jg outside
mov ax, [bp+6]
cmp ax, -10
jl outside
cmp ax, 10
jg outside
mov ax, 1
jmp finish
outside:
xor ax, ax
finish:
pop bp
ret 4
IsPointInSquare endp
;----------- print_result -----------
print_result proc
cmp ax, 1
jne out_msg
lea dx, msgInside
jmp print
out_msg:
lea dx, msgOutside
print:
mov ah, 9
int 21h
ret
print_result endp
;----------- Main -----------
Begin:
mov ax, @data
mov ds, ax
; Input X
mov ah, 9
lea dx, msgX
int 21h
call IntegerIn
push ax
; Input Y
mov ah, 9
lea dx, msgY
int 21h
call IntegerIn
push ax
; Check point
call IsPointInSquare
push ax
; Output result
mov ah, 9
lea dx, msgRes
int 21h
pop ax
call print_result
mov ax, 4C00h
int 21h
end Begin