001.model huge002.stack 100h
003.data
004
005numstring db 10 dup(?), "$"
006
007keypressed db ? ; VARIABLE TO STORE ASCII OF PRESSED KEY FROM AL
008
009line0 db " CALCULATOR (press ESC to exit program)"
010line1 db 10,13, " _____________________"
011line2 db 10,13, " | _________________ |"
012line3 db 10,13, " | | 0. | |"
013line4 db 10,13, " | |_________________| |"
014line5 db 10,13, " | ___ ___ ___ ___ |"
015line6 db 10,13, " | | 7 | 8 | 9 | | + | |"
016line7 db 10,13, " | |___|___|___| |___| |"
017line8 db 10,13, " | | 4 | 5 | 6 | | - | |"
018line9 db 10,13, " | |___|___|___| |___| |"
019lineA db 10,13, " | | 1 | 2 | 3 | | x | |"
020lineB db 10,13, " | |___|___|___| |___| |"
021lineC db 10,13, " | | . | 0 | = | | / | |"
022lineD db 10,13, " | |___|___|___| |___| |"
023lineE db 10,13, " |_____________________|", "$"
024
025
026print0 db "0" , "$"
027print1 db "1" , "$"
028print2 db "2" , "$"
029print3 db "3" , "$"
030print4 db "4" , "$"
031print5 db "5" , "$"
032print6 db "6" , "$"
033print7 db "7" , "$"
034print8 db "8" , "$"
035print9 db "9" , "$"
036
037
038.code
039 call initds
040call clrscrandprintcalc
041call getkeyandpaintcalc
042call terminateprog
043
044
045mov ax ,3;
046int 10h
047
048mov ah,9
049lea dx ,print1
050int 21h
051
052;======== If its neccessary please don't touch the code beginning here======
053;========INITIALIZE=DATA=SEGMENT============
054proc initds near
055mov ax, @data ; init DS
056mov es, ax
057mov ds, ax
058ret
059initds endp
060;======CLEAR=THE=SCREEN=AND=PRINT=THE=CALCULATOR=========
061proc clrscrandprintcalc near
062mov ax, 3; CLEARSCREEN
063int 10h
064mov ah, 9
065lea dx, line1 ; PRINT CALCULATOR
066int 21h
067ret
068clrscrandprintcalc endp
069;======GET=INPUT=FROM=USER=AND=PAINT=CORRESPONDING=KEY=IN=THE=CALCULATOR=======
070proc getkeyandpaintcalc near
071jumps ; FOR LONG JUMPS
072lea si, numstring; LOAD SI WITH BASE ADDRESS OF NUMSTRING
073mov di, 0 ; COUNTER FOR PRINTING
074mov ah, 2
075mov bh, 0
076mov dx,0316h ; POSITION CURSOR IN THE LCD DISPLAY OF OUR CALCULATOR
077int 10h ; INTERRUPT TO POSITION CURSOR
078ulit:
079mov ah, 7 ;GET KEY
080int 21h
081mov keypressed, al ; MOVE AL TO KEYPRESSED
082cmp ch, 0; DOES CH HAVE A PREVIOUS VALUE? TO CHECK IF CLEARPREVIOUS PROCEDURE IS TO BE CALLED
083je skip
084call clearprevious
085skip:
086cmp keypressed, '0' ; TEST THE INPUTS
087je do0
088cmp keypressed, '1'
089je do1
090cmp keypressed, '2'
091je do2
092cmp keypressed, '3'
093je do3
094cmp keypressed, '4'
095je do4
096cmp keypressed, '5'
097je do5
098cmp keypressed, '6'
099je do6
100cmp keypressed, '7'
101je do7
102cmp keypressed, '8'
103je do8
104cmp keypressed, '9'
105je do9
106cmp keypressed, '.'
107je doperiod
108cmp keypressed, '='
109je doequals
110cmp keypressed, '+'
111je doplus
112cmp keypressed, '-'
113je dominus
114cmp keypressed, '*'
115je dotimes
116cmp keypressed, '/'
117je dodivide
118cmp keypressed, 1Bh
119je exit
120mov ch, 0
121jmp ulit
122
123do0: ;POSITION THE X AND Y OF THE BLOCKS FOR EACH KEY
124mov cx,0D0Ch
125mov dx,0D0Eh
126jmp do
127do2:
128mov cx,0B0Ch
129mov dx,0B0Eh
130jmp do
131do5:
132mov cx,090Ch
133mov dx,090Eh
134jmp do
135do8:
136mov cx,070Ch
137mov dx,070Eh
138jmp do
139do7:
140mov cx,0708h
141mov dx,070Ah
142jmp do
143do4:
144mov cx,0908h
145mov dx,090Ah
146jmp do
147do1:
148mov cx,0B08h
149mov dx,0B0Ah
150jmp do
151doperiod:
152mov cx,0D08h
153mov dx,0D0Ah
154jmp do
155do9:
156mov cx,0710h
157mov dx,0712h
158jmp do
159do6:
160mov cx,0910h
161mov dx,0912h
162jmp do
163do3:
164mov cx,0B10h
165mov dx,0B12h
166jmp do
167doequals:
168mov cx,0D10h
169mov dx,0D12h
170jmp do
171doplus:
172mov cx,0716h
173mov dx,0718h
174jmp do
175dominus:
176mov cx,0916h
177mov dx,0918h
178jmp do
179dotimes:
180mov cx,0B16h
181mov dx,0B18h
182jmp do
183dodivide:
184mov cx,0D16h
185mov dx,0D18h
186do:
187mov ax, 0600h ; CALL FUNCTION
188mov bh, 70h ; TO PAINT (WITH WHITE)
189int 10h ; THE KEY
190
191mov al, keypressed
192mov numstring[si], al
193inc si
194inc di
195;call printnums
196jmp ulit
197exit:
198ret
199getkeyandpaintcalc endp
200
201
202;===============================
203proc printnums near
204push cx
205push bx
206mov cx, di
207here:
208mov bx, 0
209mov ah,2
210mov dl, numstring[bx]
211int 21h
212loopne here
213pop bx
214pop cx
215ret
216printnums endp
217
218;===CLEARS=THE=PREVIOUS=PAINTED=KEY=AND=REDRAWS=THE=LINE=IN=THE=BOTTOM=OF=THE=KEY=====
219proc clearprevious near
220mov ax, 0600h
221mov bh, 07h ; PAINT WITH BLACK
222int 10h ; FUNCTION TO PAINT. NOTE THAT WE DID NOT CHANGE THE VALUES OF CX AND DX
223mov ah,2 ; POSITION CURSOR, READY TO REDRAW THE LINE
224mov bh, 0
225mov dx, cx
226int 10h ; INTERRUPT TO POSTION CURSOR
227mov dl,'_'
228int 21h ; THREE INT 21H BECAUSE
229int 21h ; THE LOWER LINE CONSISTS
230int 21h ; OF THREE (3) UNDERSCORES
231mov dx,0316h ; POSITION CURSOR IN THE LCD DISPLAY OF OUR CALCULATOR
232sub dx, di
233int 10h ; INTERRUPT TO POSITION CURSOR
234ret
235clearprevious endp
236;====TERMINTATE=THE=PROGRAM======
237proc terminateprog near
238mov ah, 4ch;
239int 21h
240ret
241endp terminateprog
242;===============================
243end