.model small
.stack 100h
.data
BeginM db "Enter Expression #+-*/#=",10,13,": $"
OpenM db 10,13,"Simple Calculator by John Reed",10,13,"Press Esc to exit",10,13,"$"
Err1M db 10,13,"You must enter numbers",10,13,": $"
Err2M db 10,13,"Invalid Operator, use +-*/",10,13,": $"
FBufferM db "..........$"
LBufferM db "..........$"
AnswerM db " $"
.code
start:
mov ax,@data
mov ds,ax
NewEx:
mov cl,00
mov dx,offset BeginM
mov ah,09h
int 21h
mov dx,0000h
InputEx:
mov ah,01h
int 21h
mov ch,00100000b
and ch,cl
jz PutIn1
jmp PutIn2
IReturn:
jmp InputEx
OutPutEx:
mov dx,0000h
mov bx,offset FBufferM
call DecToHex
push dx
mov bx,offset LBufferM
call DecToHex
push dx
mov bl,00000100b
and bl,cl
jnz ADDM
mov bl,00000001b
and bl,cl
jnz MULM
mov bl,00000010b
and bl,cl
jnz SUBM
mov bl,00000111b
and bl,cl
jz DIVM
MULM:
mov dx,0000h
mov bx,offset FBufferM
mov al,[bx]
cmp al,"-"
jne MULNext
mov dl,0FFh
MULNext:
mov bx,offset LBufferM
mov al,[bx]
cmp al,"-"
jne MULNext2
mov dh,0FFh
MULNext2:
sub dh,dl
jz MULNext3
mov dl,2dh
mov ah,02h
int 21h
MULNext3:
pop bx
pop ax
mul bx
push ax
mov ax,dx
pop ax
call HexToDec
jmp MEND
DIVM:
mov dx,0000h
mov bx,offset FBufferM
mov al,[bx]
cmp al,"-"
jne DIVNext
mov dl,0FFh
DIVNext:
mov bx,offset LBufferM
mov al,[bx]
cmp al,"-"
jne DIVNext2
mov dh,0FFh
DIVNext2:
sub dh,dl
jz DIVNext3
mov dl,2dh
mov ah,02h
int 21h
DIVNext3:
pop bx
pop ax
mov dx,0000h
div bx
call HexToDec
cmp dx,0000h
je MEND
push bx
push dx
mov ah,02h
mov dl,"."
int 21h
pop dx
mov ax,dx
mov bx,0Ah
mul bx
pop bx
mov dx,0000h
div bx
call HexToDec
jmp MEND
ADDM:
mov bx,offset FBufferM
mov al,[bx]
cmp al,"-"
je ADFNeg
mov bx,offset LBufferM
mov al,[bx]
cmp al,"-"
je ADOSNeg
pop ax
pop dx
add ax,dx
call HexToDec
jmp MEND
ADOSNeg:
pop ax
pop dx
cmp ax,dx
jg ADSub1
sub dx,ax
mov ax,dx
call HexToDec
jmp MEND
ADSub1:
push ax
push dx
mov dl,"-"
mov ah,02h
int 21h
pop dx
pop ax
sub ax,dx
call HexToDec
jmp MEND
ADFNeg:
mov bx,offset LBufferM
mov al,[bx]
cmp al,"-"
je ADSNeg
pop ax
pop dx
cmp dx,ax
jg ADSub2
sub ax,dx
call HexToDec
jmp MEND
ADSub2:
push ax
push dx
mov dl,"-"
mov ah,02h
int 21h
pop dx
pop ax
sub dx,ax
mov ax,dx
call HexToDec
jmp MEND
ADSNeg:
mov dl,"-"
mov ah,02h
int 21h
pop ax
pop dx
add ax,dx
call HexToDec
jmp MEND
SUBM:
mov bx,offset FBufferM
mov al,[bx]
cmp al,"-"
je SBFNeg
mov bx,offset LBufferM
mov al,[bx]
cmp al,"-"
je SBOSNeg
pop ax
pop dx
cmp ax,dx
jg SBSub1
sub dx,ax
mov ax,dx
call HexToDec
jmp MEND
SBSub1:
push ax
push dx
mov dl,"-"
mov ah,02h
int 21h
pop dx
pop ax
sub ax,dx
call HexToDec
jmp MEND
SBOSNeg:
pop ax
pop dx
add ax,dx
call HexToDec
jmp MEND
SBFNeg:
mov bx,offset LBufferM
mov al,[bx]
cmp al,"-"
je SBSNeg
mov dl,"-"
mov ah,02h
int 21h
pop ax
pop dx
add ax,dx
call HexToDec
jmp MEND
SBSNeg:
pop ax
pop dx
cmp dx,ax
jg SBSub2
sub ax,dx
call HexToDec
jmp MEND
SBSub2:
push ax
push dx
mov dl,"-"
mov ah,02h
int 21h
pop dx
pop ax
sub dx,ax
mov ax,dx
call HexToDec
jmp MEND
MEND:
mov ax,4c00h
int 21h
PutIn1:
mov ch,10000000b
and ch,cl
jnz SecCheck
cmp al,"-"
je SecEntry
SecCheck:
mov bl,al
call IsNumeric
cmp bl,00h
je In1Err
or cl,01000000b
SecEntry:
or cl,10000000b
mov bx,offset FBufferM
add bx,dx
inc dx
mov [bx],al
jmp IReturn
In1Err:
mov ch,01000000b
and ch,cl
jnz FindOp
mov dx,offset Err1M
mov ah,09h
int 21h
jmp NewEx
FindOp:
and cl,11111000b
cmp al,"+"
je OpPlus
cmp al,"-"
je OpMinus
cmp al,"*"
je OpTimes
cmp al,"/"
je OpDiv
mov dx,offset Err2M
mov ah,09h
int 21h
jmp NewEx
OpPlus:
or cl,00000100b
or cl,00100000b
mov dx,0000h
jmp IReturn
OpMinus:
or cl,00000010b
or cl,00100000b
mov dx,0000h
jmp IReturn
OpTimes:
or cl,00000001b
or cl,00100000b
mov dx,0000h
jmp IReturn
OpDiv:
and cl,11111000b
or cl,00100000b
mov dx,0000h
jmp IReturn
PutIn2:
mov ch,00010000b
and ch,cl
jnz SecCheck2
cmp al,"-"
je SecEntry2
SecCheck2:
mov bl,al
call IsNumeric
cmp bl,00h
je In2Err
or cl,01000000b
SecEntry2:
or cl,00010000b
mov bx,offset LBufferM
add bx,dx
inc dx
mov [bx],al
jmp IReturn
In2Err:
cmp al,"="
je OutPutEx
mov dx,offset Err1M
mov ah,09h
int 21h
jmp NewEx
DecToHex:
push ax
push cx
mov dx,0000h
mov cx,0000h
mov ax,0006h
add bx,ax
dec bx
DTHStart:
mov ch,[bx]
cmp ch,"."
jne DTHIsNum
dec bx
dec ax
jmp DTHStart
DTHIsNum:
cmp ch,"-"
je NCheck
cmp cl,00h
je DTHOnes
cmp cl,01h
je DTHTens
cmp cl,02h
je DTHHuns
cmp cl,03h
je DTHThou
cmp cl,04h
je DTHTenT
jmp NCheck
DTHOnes:
mov dl,ch
sub dx,30h
inc cl
jmp NCheck
DTHTens:
push bx
push ax
mov bl,0Ah
mov al,ch
sub al,30h
mul bl
add dx,ax
inc cl
pop ax
pop bx
jmp NCheck
DTHHuns:
push bx
push ax
mov bl,64h
mov al,ch
sub al,30h
mul bl
add dx,ax
inc cl
pop ax
pop bx
jmp NCheck
DTHThou:
push bx
push ax
mov bx,3e8h
mov al,ch
sub al,30h
push dx
mul bx
pop dx
add dx,ax
inc cl
pop ax
pop bx
jmp NCheck
DTHTenT:
push bx
push ax
mov bx,2710h
mov al,ch
sub al,30h
push dx
mul bx
pop dx
add dx,ax
inc cl
pop ax
pop bx
jmp NCheck
NCheck:
dec bx
dec ax
jz DRet
jmp DTHStart
DRet:
pop cx
pop ax
ret
HexToDec:
push dx
mov dx,0000h
push cx
mov cx,0000h
push ax
mov bx,2710h
div bx
cmp ax,0000h
je HTD1k
push ax
mov dx,ax
add dx,30h
mov ah,02h
int 21h
pop ax
mov bx,2710h
mul bx
mov bx,ax
pop ax
sub ax,bx
push ax
mov cl,0FFh
HTD1K:
pop ax
push ax
mov bx,3e8h
mov dx,0000h
div bx
cmp cl,0FFh
je HTD1kPrint
cmp ax,0000h
je HTD100
HTD1kPrint:
push ax
mov dx,ax
add dx,30h
mov ah,02h
int 21h
pop ax
mov bx,3e8h
mul bx
mov bx,ax
pop ax
sub ax,bx
push ax
mov cl,0FFh
HTD100:
pop ax
push ax
mov bx,64h
mov dx,0000h
div bx
cmp cl,0FFh
je HTD100Print
cmp ax,0000h
je HTD10
HTD100Print:
push ax
mov dx,ax
add dx,30h
mov ah,02h
int 21h
pop ax
mov bx,64h
mul bx
mov bx,ax
pop ax
sub ax,bx
push ax
mov cl,0FFh
HTD10:
pop ax
push ax
mov bx,0ah
mov dx,0000h
div bx
cmp cl,0FFh
je HTD10Print
cmp ax,0000h
je HTD1
HTD10Print:
push ax
mov dx,ax
add dx,30h
mov ah,02h
int 21h
pop ax
mov bx,0ah
mul bx
mov bx,ax
pop ax
sub ax,bx
push ax
mov cl,0FFh
HTD1:
pop ax
add ax,30h
mov dx,ax
mov ah,02h
int 21h
pop cx
pop dx
ret
IsNumeric:
mov bh,2Fh
IsNTest:
inc bh
cmp bh,bl
je IsNTrue
cmp bh,3Ah
je IsNFalse
jmp IsNTest
IsNTrue:
ret
IsNFalse:
mov bl,00h
ret
IDebug:
push ax
push bx
push cx
push dx
pushf
push dx
push cx
mov cx,ax
mov ah,02h
mov dl,10
int 21h
mov dl,13
int 21h
mov dl,ch
int 21h
mov dl,cl
int 21h
mov dl,10
mov dl,13
mov dl,bh
int 21h
mov dl,bl
int 21h
mov dl,10
mov dl,13
pop cx
mov dl,ch
int 21h
mov dl,cl
int 21h
mov dl,10
mov dl,13
pop dx
mov cx,dx
mov dl,ch
int 21h
mov dl,cl
int 21h
popf
pop dx
pop cx
pop bx
pop ax
ret
end start