Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .MODEL SMALL
- .STACK 100h
- .DATA
- .386
- ;MAIN MENU
- m_dis1 db "Title: BASE 8,10,16 CALCULATOR & CONVERSION$"
- m_dis2 db "Name: Ignacio, Mary Catherine & Ofracio, Earl John$"
- m_dis3 db "MAIN MENU$"
- m_dis4 db "[1] Calculator $"
- m_dis5 db "[2] Conversion $"
- m_dis6 db "[9] Exit$"
- m_dis10 db "Pick your choice: $"
- ;CALCULATOR SUB-MENU
- cal_menu1 db "CALCULATOR$"
- cal_menu2 db "[1] Addition $"
- cal_menu3 db "[2] Subtraction $"
- cal_menu4 db "[3] Multiplication $"
- cal_menu5 db "[4] Division $"
- cal_menu6 db "[5] Modulo $"
- cal_menu7 db "[9] Back to Main Menu$"
- ;CALCULATOR MENU
- cal_header_add db "Calculator : ADDITION$"
- cal_header_sub db "Calculator : SUBTRACTION$"
- cal_header_mul db "Calculator : MULTIPLICATION$"
- cal_header_div db "Calculator : DIVISION$"
- cal_header_mod db "Calculator : MODULO$"
- cal_choice1 db "[1] Base 08$"
- cal_choice2 db "[2] Base 10$"
- cal_choice3 db "[3] Base 16$"
- cal_choice4 db "[9] Back to Sub Menu$"
- ;ADDITION
- add_header_base8 db "BASE 8 ADDITION$"
- add_header_base10 db "BASE 10 ADDITION$"
- add_header_base16 db "BASE 16 ADDITION$"
- add_input_1_8 db "Addend [0-0.777]: 0.$"
- add_input_2_8 db "Augend [0-0.777]: 0.$"
- add_input_1_10 db "Addend [0-0.999]: 0.$"
- add_input_2_10 db "Augend [0-0.999]: 0.$"
- add_input_1_16 db "Addend [0-0.FFF]: 0.$"
- add_input_2_16 db "Augend [0-0.FFF]: 0.$"
- add_ans db "Sum is : $"
- add_again db "Add Again? [Y/N]: $"
- ;SUBTRACTION
- sub_header_base8 db "BASE 8 SUBTRACTION$"
- sub_header_base10 db "BASE 10 SUBTRACTION$"
- sub_header_base16 db "BASE 16 SUBTRACTION$"
- sub_input_1_8 db "Minuend [0-0.777]: 0.$"
- sub_input_2_8 db "Subtrahend [0-0.777]: 0.$"
- sub_input_1_10 db "Minuend [0-0.999]: 0.$"
- sub_input_2_10 db "Subtrahend [0-0.999]: 0.$"
- sub_input_1_16 db "Minuend [0-0.FFF]: 0.$"
- sub_input_2_16 db "Subtrahend [0-0.FFF]: 0.$"
- sub_ans db "Difference is : $"
- sub_again db "Subtract Again?[Y/N]: $"
- ;MULTIPLICATION
- mul_header_base8 db "BASE 8 MULTIPLICATION$"
- mul_header_base10 db "BASE 10 MULTIPLICATION$"
- mul_header_base16 db "BASE 16 MULTIPLICATION$"
- mul_input_1_8 db "Multiplicand [0-0.777]: 0.$"
- mul_input_2_8 db "Multiplier [0-0.777]: 0.$"
- mul_input_1_10 db "Multiplicand [0-0.999]: 0.$"
- mul_input_2_10 db "Multiplier [0-0.999]: 0.$"
- mul_input_1_16 db "Multiplicand [0-0.FFF]: 0.$"
- mul_input_2_16 db "Multiplier [0-0.FFF]: 0.$"
- mul_ans db "Product is: 0.$"
- mul_again db "Multiply Again? [Y/N]: $"
- ;DIVISION
- div_header_base8 db "BASE 8 DIVISION$"
- div_header_base10 db "BASE 10 DIVISION$"
- div_header_base16 db "BASE 16 DIVISION$"
- div_input_1_8 db "Dividend [0-0.777]: 0.$"
- div_input_2_8 db "Divisor [0-0.777]: 0.$"
- div_input_1_10 db "Dividend [0-0.999]: 0.$"
- div_input_2_10 db "Divisor [0-0.999]: 0.$"
- div_input_1_16 db "Dividend [0-0.FFF]: 0.$"
- div_input_2_16 db "Divisor [0-0.FFF]: 0.$"
- div_ans db "Qoutient is : $"
- div_again db "Divide Again? [Y/N]: $"
- ;MODULO
- mod_header_base8 db "BASE 8 MODULO$"
- mod_header_base10 db "BASE 10 MODULO$"
- mod_header_base16 db "BASE 16 MODULO$"
- mod_input_1_8 db "Dividend [0-0.777] : 0.$"
- mod_input_2_8 db "Divisor [0-0.777] : 0.$"
- mod_input_1_10 db "Dividend [0-0.999] : 0.$"
- mod_input_2_10 db "Divisor [0-0.999] : 0.$"
- mod_input_1_16 db "Dividend [0-0.FFF] : 0.$"
- mod_input_2_16 db "Divisor [0-0.FFF] : 0.$"
- mod_ans db "Remainder is: 0.0$"
- mod_again db "Divide Again? [Y/N]: $"
- ;CONVERSION SUB-MENU
- con_menu1 db "CONVERSION SUB-MENU$"
- con_menu2 db "[1] Base 08 to Base 10 $"
- con_menu3 db "[2] Base 08 to Base 16$"
- con_menu4 db "[3] Base 10 to Base 08 $"
- con_menu5 db "[4] Base 10 to Base 16 $"
- con_menu6 db "[5] Base 16 to Base 08 $"
- con_menu7 db "[6] Base 16 to Base 10 $"
- con_menu8 db "[9] Back to Main Menu$"
- con_menu9 db "Enter a Choice: $"
- ;CONVERSION 08 TO 10
- con_header_08_10 db "CONVERSION: BASE 08 TO BASE 10 $"
- con_input_08_10 db "Base 08 [0-0.777] : 0.$"
- con_ans_08_10 db "Base 10 Equivalent : 0.$"
- con_again db "Convert Again? [Y/N] : $"
- ;CONVERSION 08 TO 16
- con_header_08_16 db "CONVERSION: BASE 08 TO BASE 16 $"
- con_input_08_16 db "Base 08 [0-0.777] : 0.$"
- con_ans_08_16 db "Base 16 Equivalent : 0.$"
- ;CONVERSION 10 TO 08
- con_header_10_08 db "CONVERSION: BASE 10 TO BASE 08 $"
- con_input_10_08 db "Base 10 [0-0.999] : 0.$"
- con_ans_10_08 db "Base 08 Equivalent : 0.$"
- ;CONVERSION 10 TO 16
- con_header_10_16 db "CONVERSION: BASE 10 TO BASE 16 $"
- con_input_10_16 db "Base 10 [0-0.999] : 0.$"
- con_ans_10_16 db "Base 16 Equivalent : 0.$"
- ;CONVERSION 16 TO 08
- con_header_16_08 db "CONVERSION: BASE 16 TO BASE 08 $"
- con_input_16_08 db "Base 16 [0-0.FFF] : 0.$"
- con_ans_16_08 db "Base 08 Equivalent : 0.$"
- ;CONVERSION 16 TO 10
- con_header_16_10 db "CONVERSION: BASE 16 TO BASE 10 $"
- con_input_16_10 db "Base 16 [0-0.FFF] : 0.$"
- con_ans_16_10 db "Base 10 Equivalent : 0.$"
- ;EXIT
- exit_dis1 db "THANK YOUR FOR USING THE SYSTEM$"
- exit_dis2 db "BASE 8,10,16 CALCULATOR & CONVERSION$"
- exit_dis3 db "CREATED By:$"
- exit_dis4 db "Ignacio, Mary Catherine$"
- exit_dis5 db "Ofracio, Earl John$"
- ;LINES
- line_1 db "====================================================$"
- line_3 db "____________________________________________________$"
- line_2 db "----------------------------------------------------$"
- ;WARNINGS
- war_invalid db "Invalid input $"
- war_press db "Press any key to continue.$"
- war_input db "There is an error in your inputted number$"
- .code
- main proc
- mov ax,@data
- mov ds,ax
- ; /Display the main menu
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,020Fh
- int 10h
- mov ah,09h
- lea dx, m_dis1
- int 21h
- mov ah,02h
- mov dx,040Fh
- int 10h
- mov ah,09h
- lea dx, m_dis2
- int 21h
- mov ah,02h
- mov dx,050Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0625h
- int 10h
- mov ah,09h
- lea dx, m_dis3
- int 21h
- mov ah,02h
- mov dx,070Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0923h
- int 10h
- mov ah,09h
- lea dx, m_dis4
- int 21h
- mov ah,02h
- mov dx,0A23h
- int 10h
- mov ah,09h
- lea dx, m_dis5
- int 21h
- mov ah,02h
- mov dx,0B23h
- int 10h
- mov ah,09h
- lea dx, m_dis6
- int 21h
- mov ah,02h
- mov dx,0D0Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0F23h
- int 10h
- mov ah,09h
- lea dx, m_dis10
- int 21h
- main_menu_conf:
- mov ah,08h
- int 21h
- cmp al,'1'
- je open_cal
- cmp al,'2'
- je open_con
- cmp al,'9'
- je close_app
- jmp main_menu_conf
- open_cal: call CAL_MENU
- open_con: call CON_MENU
- close_app: call TERMINATE
- endp main
- CAL_MENU proc
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0225h
- int 10h
- mov ah,09h
- lea dx, cal_menu1
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0522h
- int 10h
- mov ah,09h
- lea dx, cal_menu2
- int 21h
- mov ah,02h
- mov dx,0622h
- int 10h
- mov ah,09h
- lea dx, cal_menu3
- int 21h
- mov ah,02h
- mov dx,0722h
- int 10h
- mov ah,09h
- lea dx, cal_menu4
- int 21h
- mov ah,02h
- mov dx,0822h
- int 10h
- mov ah,09h
- lea dx, cal_menu5
- int 21h
- mov ah,02h
- mov dx,0922h
- int 10h
- mov ah,09h
- lea dx, cal_menu6
- int 21h
- mov ah,02h
- mov dx,0A22h
- int 10h
- mov ah,09h
- lea dx, cal_menu7
- int 21h
- mov ah,02h
- mov dx,0C0Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0E22h
- int 10h
- mov ah,09h
- lea dx, m_dis10
- int 21h
- cal_menu_conf:
- mov ah,08h
- int 21h
- cmp al,'1'
- je go_menu_add
- cmp al, '2'
- je go_menu_sub
- cmp al, '3'
- je go_menu_mul
- cmp al, '4'
- je go_menu_div
- cmp al, '5'
- je go_menu_mod
- cmp al, '9'
- je go_menu
- jmp cal_menu_conf
- go_menu_add: call CAL_MENU_ADD
- go_menu_sub: call CAL_MENU_SUB
- go_menu_mul: call CAL_MENU_MUL
- go_menu_div: call CAL_MENU_DIV
- go_menu_mod: call CAL_MENU_MOD
- go_menu: call main
- CAL_MENU endp
- ; Calculator Functions - Addition
- CAL_MENU_ADD proc
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,021Eh
- int 10h
- mov ah,09h
- lea dx, cal_header_add
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0523h
- int 10h
- mov ah,09h
- lea dx, cal_choice1
- int 21h
- mov ah,02h
- mov dx,0623h
- int 10h
- mov ah,09h
- lea dx, cal_choice2
- int 21h
- mov ah,02h
- mov dx,0723h
- int 10h
- mov ah,09h
- lea dx, cal_choice3
- int 21h
- mov ah,02h
- mov dx,0823h
- int 10h
- mov ah,09h
- lea dx, cal_choice4
- int 21h
- mov ah,02h
- mov dx,0A0Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0C22h
- int 10h
- mov ah,09h
- lea dx, m_dis10
- int 21h
- cal_add_conf:
- mov ah,08h
- int 21h
- cmp al,'1'
- je add_base8
- cmp al, '2'
- je add_base10
- cmp al, '3'
- je add_base16
- cmp al, '9'
- je add_back
- jmp cal_add_conf
- add_base8: call CAL_ADD_8
- add_base10: call CAL_ADD_10
- add_base16: call CAL_ADD_16
- add_back: call CAL_MENU
- CAL_MENU_ADD endp
- CAL_ADD_8 proc
- start_input_8:
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0223h
- int 10h
- mov ah,09h
- lea dx, add_header_base8
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,051Dh
- int 10h
- mov ah,09h
- lea dx, add_input_1_8
- int 21h
- ;1st 3 Inputs
- mov cl,03h
- add_8_input_1:
- mov ah,01
- int 21h
- cmp al, '0'
- jl start_input_8
- cmp al, '8'
- jge start_input_8
- call DEC_AL
- push ax
- loop add_8_input_1
- mov ah,02h
- mov dx,061Dh
- int 10h
- mov ah,09h
- lea dx, add_input_2_8
- int 21h
- ;2nd 3 Inputs
- mov cl,03h
- add_8_input_2:
- mov ah,01
- int 21h
- cmp al, '0'
- jl start_input_8
- cmp al, '8'
- jge start_input_8
- call DEC_AL
- push ax
- loop add_8_input_2
- mov ah,02h
- mov dx,071Dh
- int 10h
- mov ah,09h
- lea dx, add_ans
- int 21h
- ;Logic FOR BASE 8 Addition
- pop bx
- pop cx
- pop dx
- mov dh,dl
- pop ax
- add bl, al
- pop ax
- add cl, al
- pop ax
- add dh, al
- cmp bl, 08h
- jge cr_ones
- chk_tens:
- cmp cl, 08h
- jge cr_tens
- chk_hunds:
- cmp dl, 08h
- jge cr_hunds
- cmp dh, 08h
- jge cr_hunds
- mov dl, 30h
- out_ans:
- mov ah,02h
- add bl, 30h
- add cl, 30h
- add dh, 30h
- int 21h
- mov dl, 2Eh
- int 21h
- mov dl, dh
- int 21h
- mov dl, cl
- int 21h
- mov dl, bl
- int 21h
- jmp add_8_confirm
- cr_ones:
- inc cl
- sub bl, 08h
- jmp chk_tens
- cr_tens:
- inc dh
- sub cl, 08h
- jmp chk_hunds
- cr_hunds:
- sub dh,08h
- mov dl,31h
- jmp out_ans
- ;/ Ask input to confirm if to try again.
- add_8_confirm:
- call CENTER
- mov ah,02h
- mov dx,090Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0B20h
- int 10h
- mov ah,09h
- lea dx, add_again
- int 21h
- add_8_yn_filter:
- mov ah,08h
- int 21h
- cmp al, 'Y'
- je add_start_8
- cmp al, 'y'
- je add_start_8
- cmp al, 'N'
- je add_end_8
- cmp al, 'n'
- je add_end_8
- jmp add_8_yn_filter
- add_start_8: call CAL_ADD_8
- add_end_8: call CAL_MENU_ADD
- CAL_ADD_8 endp
- CAL_ADD_10 proc
- start_input_10:
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0223h
- int 10h
- mov ah,09h
- lea dx, add_header_base10
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,051Dh
- int 10h
- mov ah,09h
- lea dx, add_input_1_10
- int 21h
- ;1st 3 Inputs
- mov cl,03h
- add_10_input_1:
- mov ah,01
- int 21h
- cmp al, '0'
- jl start_input_10
- cmp al, '9'
- jg start_input_10
- call DEC_AL
- push ax
- loop add_10_input_1
- mov ah,02h
- mov dx,061Dh
- int 10h
- mov ah,09h
- lea dx, add_input_2_10
- int 21h
- ;2nd 3 Inputs
- mov cl,03h
- add_10_input_2:
- mov ah,01
- int 21h
- cmp al, '0'
- jl start_input_10
- cmp al, '9'
- jg start_input_10
- call DEC_AL
- push ax
- loop add_10_input_2
- mov ah,02h
- mov dx,071Dh
- int 10h
- mov ah,09h
- lea dx, add_ans
- int 21h
- ;Logic FOR BASE 10 Addition
- pop bx
- pop cx
- pop dx
- mov dh,dl
- pop ax
- add bl, al
- pop ax
- add cl, al
- pop ax
- add dh, al
- cmp bl, 0Ah
- jge cr_ones_10
- chk_tens_10:
- cmp cl, 0Ah
- jge cr_tens_10
- chk_hunds_10:
- cmp dl, 0Ah
- jge cr_hunds_10
- cmp dh, 0Ah
- jge cr_hunds_10
- mov dl, 30h
- out_ans_10:
- mov ah,02h
- add bl, 30h
- add cl, 30h
- add dh, 30h
- int 21h
- mov dl, 2Eh
- int 21h
- mov dl, dh
- int 21h
- mov dl, cl
- int 21h
- mov dl, bl
- int 21h
- jmp add_10_confirm
- cr_ones_10:
- inc cl
- sub bl, 0Ah
- jmp chk_tens_10
- cr_tens_10:
- inc dh
- sub cl, 0Ah
- jmp chk_hunds_10
- cr_hunds_10:
- sub dh,0Ah
- mov dl,31h
- jmp out_ans_10
- ;/ Ask input to confirm if to try again.
- add_10_confirm:
- call CENTER
- mov ah,02h
- mov dx,090Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0B20h
- int 10h
- mov ah,09h
- lea dx, add_again
- int 21h
- add_10_yn_filter:
- mov ah,08h
- int 21h
- cmp al, 'Y'
- je add_start_10
- cmp al, 'y'
- je add_start_10
- cmp al, 'N'
- je add_end_10
- cmp al, 'n'
- je add_end_10
- jmp add_10_yn_filter
- add_start_10: call CAL_ADD_10
- add_end_10: call CAL_MENU_ADD
- CAL_ADD_10 endp
- CAL_ADD_16 proc
- start_input_16:
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0223h
- int 10h
- mov ah,09h
- lea dx, add_header_base16
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,051Dh
- int 10h
- mov ah,09h
- lea dx, add_input_1_16
- int 21h
- ;1st 3 Inputs
- mov cl,03h
- add_16_input_1:
- mov ah,01
- int 21h
- cmp al, 30h
- jl start_input_16
- cmp al, 46h
- jg start_input_16
- cmp al, 3ah
- jb valid_add_1
- cmp al, 41h
- jl start_input_16
- cmp al, 46h
- jle valid_add_1
- valid_add_1:
- call DEC_AL
- push ax
- loop add_16_input_1
- mov ah,02h
- mov dx,061Dh
- int 10h
- mov ah,09h
- lea dx, add_input_2_16
- int 21h
- ;2nd 3 Inputs
- mov cl,03h
- add_16_input_2:
- mov ah,01
- int 21h
- cmp al, 30h
- jl start_input_16
- cmp al, 46h
- jg start_input_16
- cmp al, 3ah
- jb valid_add_2
- cmp al, 41h
- jl start_input_16
- cmp al, 46h
- jle valid_add_2
- valid_add_2:
- call DEC_AL
- push ax
- loop add_16_input_2
- mov ah,02h
- mov dx,071Dh
- int 10h
- mov ah,09h
- lea dx, add_ans
- int 21h
- ;Logic FOR BASE 16 Addition
- pop ax
- mov bl,al
- pop ax
- mov bh,al
- pop ax
- mov cl,al
- SHL BH, 4
- OR BL, BH
- MOV BH, CL
- pop ax
- mov dl,al
- pop ax
- mov dh,al
- pop ax
- mov cl,al
- SHL DH, 4
- OR DL,DH
- MOV DH, CL
- clc
- adc bx,dx
- mov dx,0000
- mov dh, bh ; will be used for comparison
- and bh,0Fh ; Left over will be the hundreds
- mov al,bh
- call ASCII_AL
- mov bh,al
- mov dl, bl
- SHR dl, 4
- mov al,dl
- call ASCII_AL
- mov cl,al
- and BL, 0Fh
- mov al,bl
- call ASCII_AL
- mov bl,al
- cmp dh, 0Fh
- jg has_carry
- jle no_carry
- has_carry:
- mov ah,02h
- mov dl,31h
- int 21h
- mov dl,2Eh
- int 21h
- mov dl,bh
- int 21h
- mov dl,cl
- int 21h
- mov dl,bl
- int 21h
- jmp add_16_confirm
- no_carry:
- mov ah,02h
- mov dl,30h
- int 21h
- mov dl,2Eh
- int 21h
- mov dl,bh
- int 21h
- mov dl,cl
- int 21h
- mov dl,bl
- int 21h
- jmp add_16_confirm
- ;/ Ask input to confirm if to try again.
- add_16_confirm:
- call CENTER
- mov ah,02h
- mov dx,090Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0B20h
- int 10h
- mov ah,09h
- lea dx, add_again
- int 21h
- add_16_yn_filter:
- mov ah,08h
- int 21h
- cmp al, 'Y'
- je add_start_16
- cmp al, 'y'
- je add_start_16
- cmp al, 'N'
- je add_end_16
- cmp al, 'n'
- je add_end_16
- jmp add_16_yn_filter
- add_start_16: call CAL_ADD_16
- add_end_16: call CAL_MENU_ADD
- CAL_ADD_16 endp
- ; Calculator Functions - Subtraction
- CAL_MENU_SUB proc
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,021Eh
- int 10h
- mov ah,09h
- lea dx, cal_header_sub
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0523h
- int 10h
- mov ah,09h
- lea dx, cal_choice1
- int 21h
- mov ah,02h
- mov dx,0623h
- int 10h
- mov ah,09h
- lea dx, cal_choice2
- int 21h
- mov ah,02h
- mov dx,0723h
- int 10h
- mov ah,09h
- lea dx, cal_choice3
- int 21h
- mov ah,02h
- mov dx,0823h
- int 10h
- mov ah,09h
- lea dx, cal_choice4
- int 21h
- mov ah,02h
- mov dx,0A0Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0C22h
- int 10h
- mov ah,09h
- lea dx, m_dis10
- int 21h
- cal_sub_conf:
- mov ah,08h
- int 21h
- cmp al,'1'
- je sub_base8
- cmp al, '2'
- je sub_base10
- cmp al, '3'
- je sub_base16
- cmp al, '9'
- je sub_back
- jmp cal_sub_conf
- sub_base8: call CAL_SUB_8
- sub_base10: call CAL_SUB_10
- sub_base16: call CAL_SUB_16
- sub_back: call CAL_MENU
- CAL_MENU_SUB endp
- CAL_SUB_8 proc
- sub_start_input_8:
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0223h
- int 10h
- mov ah,09h
- lea dx, sub_header_base8
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,051Dh
- int 10h
- mov ah,09h
- lea dx, sub_input_1_8
- int 21h
- ;1st 3 Inputs
- mov cl,03h
- sub_8_input_1:
- mov ah,01
- int 21h
- cmp al, '0'
- jl sub_start_input_8
- cmp al, '8'
- jge sub_start_input_8
- call DEC_AL
- push ax
- loop sub_8_input_1
- mov ah,02h
- mov dx,061Dh
- int 10h
- mov ah,09h
- lea dx, sub_input_2_8
- int 21h
- ;2nd 3 Inputs
- mov cl,03h
- sub_8_input_2:
- mov ah,01
- int 21h
- cmp al, '0'
- jl sub_start_input_8
- cmp al, '8'
- jge sub_start_input_8
- call DEC_AL
- push ax
- loop sub_8_input_2
- mov ah,02h
- mov dx,071Dh
- int 10h
- mov ah,09h
- lea dx, sub_ans
- int 21h
- ;Logic FOR BASE 8 Subtraction
- pop ax
- mov dl,al
- pop ax
- mov dh,al
- pop ax
- mov cl,al
- SHL DH, 4
- OR DL,DH
- MOV DH, CL
- pop ax
- mov bl,al
- pop ax
- mov bh,al
- pop ax
- mov cl,al
- SHL BH, 4
- OR BL, BH
- MOV BH, CL
- cmp bx,dx ; compare if bx is greater than dx if not then go to negative_sub_8
- jge positive_sub_8
- jl negative_sub_8
- positive_sub_8:
- clc
- sbb bx,dx
- jmp calc_dif_8
- negative_sub_8:
- clc
- sbb dx,bx
- mov bx,dx
- mov si,01h
- jmp calc_dif_8
- calc_dif_8:
- mov ah,09h
- lea dx, sub_ans
- int 21h
- mov dx,0000
- mov dh, bh ; will be used for comparison
- and bh,0Fh ; Left over will be the hundreds
- mov al,bh
- call ASCII_AL
- mov bh,al
- mov dl, bl
- SHR dl, 4
- mov al,dl
- call ASCII_AL
- mov cl,al
- and BL, 0Fh
- mov al,bl
- call ASCII_AL
- mov bl,al
- cmp si,01h
- je neg_sign_8 ; negative sign for negative subtractions
- cmp bh, 41h
- jge con_hun_8
- bk_con_hun_8:
- cmp cl, 41h
- jge con_ten_8
- bk_con_ten_8:
- cmp bl, 41h
- jge con_one_8
- chk_carry_8:
- cmp dh, 0Fh
- jg has_carry_sub_8
- jle no_carry_sub_8
- start_again_8:
- jmp sub_start_input_8
- con_hun_8:
- sub bh, 0Dh
- jmp bk_con_hun_8
- con_ten_8:
- sub cl, 0Dh
- jmp bk_con_ten_8
- con_one_8:
- sub bl, 0Dh
- jmp chk_carry_8
- has_carry_sub_8:
- mov ah,02h
- mov dl,31h
- int 21h
- mov dl,2Eh
- int 21h
- mov dl,bh
- int 21h
- mov dl,cl
- int 21h
- mov dl,bl
- int 21h
- jmp sub_8_confirm
- no_carry_sub_8:
- mov ah,02h
- mov dl,30h
- int 21h
- mov dl,2Eh
- int 21h
- mov dl,bh
- int 21h
- mov dl,cl
- int 21h
- mov dl,bl
- int 21h
- jmp sub_8_confirm
- neg_sign_8:
- mov si,00h
- mov ah,02
- mov dl,2Dh
- int 21h
- jmp no_carry_sub_8
- ;/ Ask input to confirm if to try again.
- sub_8_confirm:
- call CENTER
- mov ah,02h
- mov dx,090Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0B20h
- int 10h
- mov ah,09h
- lea dx, sub_again
- int 21h
- sub_8_yn_filter:
- mov ah,08h
- int 21h
- cmp al, 'Y'
- je sub_start_8
- cmp al, 'y'
- je sub_start_8
- cmp al, 'N'
- je sub_end_8
- cmp al, 'n'
- je sub_end_8
- jmp sub_8_yn_filter
- sub_start_8: call CAL_SUB_8
- sub_end_8: call CAL_MENU_SUB
- CAL_SUB_8 endp
- CAL_SUB_10 proc
- sub_start_input_10:
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0223h
- int 10h
- mov ah,09h
- lea dx, sub_header_base10
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,051Dh
- int 10h
- mov ah,09h
- lea dx, sub_input_1_10
- int 21h
- ;1st 3 Inputs
- mov cl,03h
- sub_10_input_1:
- mov ah,01
- int 21h
- cmp al, '0'
- jl sub_start_input_10
- cmp al, '9'
- jg sub_start_input_10
- call DEC_AL
- push ax
- loop sub_10_input_1
- mov ah,02h
- mov dx,061Dh
- int 10h
- mov ah,09h
- lea dx, sub_input_2_10
- int 21h
- ;2nd 3 Inputs
- mov cl,03h
- sub_10_input_2:
- mov ah,01
- int 21h
- cmp al, '0'
- jl sub_start_input_10
- cmp al, '9'
- jg sub_start_input_10
- call DEC_AL
- push ax
- loop sub_10_input_2
- mov ah,02h
- mov dx,071Dh
- int 10h
- mov ah,09h
- lea dx, sub_ans
- int 21h
- ;Logic FOR BASE 8 Subtraction
- pop ax
- mov dl,al
- pop ax
- mov dh,al
- pop ax
- mov cl,al
- SHL DH, 4
- OR DL,DH
- MOV DH, CL
- pop ax
- mov bl,al
- pop ax
- mov bh,al
- pop ax
- mov cl,al
- SHL BH, 4
- OR BL, BH
- MOV BH, CL
- cmp bx,dx ; compare if bx is greater than dx if not then go to negative_sub_10
- jge positive_sub_10
- jl negative_sub_10
- positive_sub_10:
- clc
- sbb bx,dx
- jmp calc_dif_10
- negative_sub_10:
- clc
- sbb dx,bx
- mov bx,dx
- mov si,01h
- jmp calc_dif_10
- calc_dif_10:
- mov ah,09h
- lea dx, sub_ans
- int 21h
- mov dx,0000
- mov dh, bh ; will be used for comparison
- and bh,0Fh ; Left over will be the hundreds
- mov al,bh
- call ASCII_AL
- mov bh,al
- mov dl, bl
- SHR dl, 4
- mov al,dl
- call ASCII_AL
- mov cl,al
- and BL, 0Fh
- mov al,bl
- call ASCII_AL
- mov bl,al
- cmp si,01h
- je neg_sign_10 ; negative sign for negative subtractions
- cmp bh, 41h
- jge con_hun_10
- bk_con_hun_10:
- cmp cl, 41h
- jge con_ten_10
- bk_con_ten_10:
- cmp bl, 41h
- jge con_one_10
- chk_carry_10:
- cmp dh, 0Fh
- jg has_carry_sub_10
- jle no_carry_sub_10
- start_again_10:
- jmp sub_start_input_10
- con_hun_10:
- sub bh, 0Dh
- jmp bk_con_hun_10
- con_ten_10:
- sub cl, 0Dh
- jmp bk_con_ten_10
- con_one_10:
- sub bl, 0Dh
- jmp chk_carry_10
- has_carry_sub_10:
- mov ah,02h
- mov dl,31h
- int 21h
- mov dl,2Eh
- int 21h
- mov dl,bh
- int 21h
- mov dl,cl
- int 21h
- mov dl,bl
- int 21h
- jmp sub_10_confirm
- no_carry_sub_10:
- mov ah,02h
- mov dl,30h
- int 21h
- mov dl,2Eh
- int 21h
- mov dl,bh
- int 21h
- mov dl,cl
- int 21h
- mov dl,bl
- int 21h
- jmp sub_10_confirm
- neg_sign_10:
- mov si,00h
- mov ah,02
- mov dl,2Dh
- int 21h
- jmp no_carry_sub_10
- ;/ Ask input to confirm if to try again.
- sub_10_confirm:
- call CENTER
- mov ah,02h
- mov dx,090Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0B20h
- int 10h
- mov ah,09h
- lea dx, sub_again
- int 21h
- sub_10_yn_filter:
- mov ah,08h
- int 21h
- cmp al, 'Y'
- je sub_start_10
- cmp al, 'y'
- je sub_start_10
- cmp al, 'N'
- je sub_end_10
- cmp al, 'n'
- je sub_end_10
- jmp sub_10_yn_filter
- sub_start_10: call CAL_SUB_10
- sub_end_10: call CAL_MENU_SUB
- CAL_SUB_10 endp
- CAL_SUB_16 proc
- sub_start_input_16:
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0223h
- int 10h
- mov ah,09h
- lea dx, sub_header_base16
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,051Dh
- int 10h
- mov ah,09h
- lea dx, sub_input_1_16
- int 21h
- ;1st 3 Inputs
- mov cl,03h
- sub_16_input_1:
- mov ah,01
- int 21h
- cmp al, 30h
- jl sub_start_input_16
- cmp al, 46h
- jg sub_start_input_16
- cmp al, 3ah
- jb valid_sub_1
- cmp al, 41h
- jl sub_start_input_16
- cmp al, 46h
- jle valid_sub_1
- valid_sub_1:
- call DEC_AL
- push ax
- loop sub_16_input_1
- mov ah,02h
- mov dx,061Dh
- int 10h
- mov ah,09h
- lea dx, sub_input_2_16
- int 21h
- ;2nd 3 Inputs
- mov cl,03h
- sub_16_input_2:
- mov ah,01
- int 21h
- cmp al, 30h
- jl sub_start_input_16
- cmp al, 46h
- jg sub_start_input_16
- cmp al, 3ah
- jb valid_sub_2
- cmp al, 41h
- jl sub_start_input_16
- cmp al, 46h
- jle valid_sub_2
- valid_sub_2:
- call DEC_AL
- push ax
- loop sub_16_input_2
- mov ah,02h
- mov dx,071Dh
- int 10h
- mov ah,09h
- lea dx, sub_ans
- int 21h
- ;Logic FOR BASE 8 Subtraction
- pop ax
- mov dl,al
- pop ax
- mov dh,al
- pop ax
- mov cl,al
- SHL DH, 4
- OR DL,DH
- MOV DH, CL
- pop ax
- mov bl,al
- pop ax
- mov bh,al
- pop ax
- mov cl,al
- SHL BH, 4
- OR BL, BH
- MOV BH, CL
- cmp bx,dx ; compare if bx is greater than dx if not then go to negative_sub
- jge positive_sub
- jl negative_sub
- positive_sub:
- clc
- sbb bx,dx
- jmp calc_dif
- negative_sub:
- clc
- sbb dx,bx
- mov bx,dx
- mov si,01h
- jmp calc_dif
- calc_dif:
- mov ah,09h
- lea dx, sub_ans
- int 21h
- mov dx,0000
- mov dh, bh ; will be used for comparison
- and bh,0Fh ; Left over will be the hundreds
- mov al,bh
- call ASCII_AL
- mov bh,al
- mov dl, bl
- SHR dl, 4
- mov al,dl
- call ASCII_AL
- mov cl,al
- and BL, 0Fh
- mov al,bl
- call ASCII_AL
- mov bl,al
- cmp si,01h
- je neg_sign ; negative sign for negative subtractions
- cmp dh, 0Fh
- jg has_carry_sub
- jle no_carry_sub
- has_carry_sub:
- mov ah,02h
- mov dl,31h
- int 21h
- mov dl,2Eh
- int 21h
- mov dl,bh
- int 21h
- mov dl,cl
- int 21h
- mov dl,bl
- int 21h
- jmp sub_16_confirm
- no_carry_sub:
- mov ah,02h
- mov dl,30h
- int 21h
- mov dl,2Eh
- int 21h
- mov dl,bh
- int 21h
- mov dl,cl
- int 21h
- mov dl,bl
- int 21h
- jmp sub_16_confirm
- neg_sign:
- mov si,00h
- mov ah,02
- mov dl,2Dh
- int 21h
- jmp no_carry_sub
- ;/ Ask input to confirm if to try again.
- sub_16_confirm:
- call CENTER
- mov ah,02h
- mov dx,090Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0B20h
- int 10h
- mov ah,09h
- lea dx, sub_again
- int 21h
- sub_16_yn_filter:
- mov ah,08h
- int 21h
- cmp al, 'Y'
- je sub_start_16
- cmp al, 'y'
- je sub_start_16
- cmp al, 'N'
- je sub_end_16
- cmp al, 'n'
- je sub_end_16
- jmp sub_16_yn_filter
- sub_start_16: call CAL_SUB_16
- sub_end_16: call CAL_MENU_SUB
- CAL_SUB_16 endp
- ; Calculator Functions - Multiplication
- CAL_MENU_MUL proc
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,021Eh
- int 10h
- mov ah,09h
- lea dx, cal_header_mul
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0523h
- int 10h
- mov ah,09h
- lea dx, cal_choice1
- int 21h
- mov ah,02h
- mov dx,0623h
- int 10h
- mov ah,09h
- lea dx, cal_choice2
- int 21h
- mov ah,02h
- mov dx,0723h
- int 10h
- mov ah,09h
- lea dx, cal_choice3
- int 21h
- mov ah,02h
- mov dx,0823h
- int 10h
- mov ah,09h
- lea dx, cal_choice4
- int 21h
- mov ah,02h
- mov dx,0A0Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0C22h
- int 10h
- mov ah,09h
- lea dx, m_dis10
- int 21h
- cal_mul_conf:
- mov ah,08h
- int 21h
- cmp al,'1'
- je mul_base8
- cmp al, '2'
- je mul_base10
- cmp al, '3'
- je mul_base16
- cmp al, '9'
- je mul_back
- jmp cal_mul_conf
- mul_base8: call CAL_MUL_8
- mul_base10: call CAL_MUL_10
- mul_base16: call CAL_MUL_16
- mul_back: call CAL_MENU
- CAL_MENU_MUL endp
- CAL_MUL_8 proc
- mul_start_input_8:
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0223h
- int 10h
- mov ah,09h
- lea dx, mul_header_base8
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,051Dh
- int 10h
- mov ah,09h
- lea dx, mul_input_1_8
- int 21h
- ;1st 3 Inputs
- mov cl,03h
- mul_8_input_1:
- mov ah,01
- int 21h
- cmp al, '0'
- jl mul_start_input_8
- cmp al, '8'
- jge mul_start_input_8
- call DEC_AL
- push ax
- loop mul_8_input_1
- mov ah,02h
- mov dx,061Dh
- int 10h
- mov ah,09h
- lea dx, mul_input_2_8
- int 21h
- ;2nd 3 Inputs
- mov cl,03h
- mul_8_input_2:
- mov ah,01
- int 21h
- cmp al, '0'
- jl mul_start_input_8
- cmp al, '8'
- jge mul_start_input_8
- call DEC_AL
- push ax
- loop mul_8_input_2
- mov ah,02h
- mov dx,071Dh
- int 10h
- mov ah,09h
- lea dx, mul_ans
- int 21h
- ; LOGIC FOR MUL
- ;/ Ask input to confirm if to try again.
- mul_8_confirm:
- call CENTER
- mov ah,02h
- mov dx,090Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0B20h
- int 10h
- mov ah,09h
- lea dx, mul_again
- int 21h
- mul_8_yn_filter:
- mov ah,08h
- int 21h
- cmp al, 'Y'
- je mul_start_8
- cmp al, 'y'
- je mul_start_8
- cmp al, 'N'
- je mul_end_8
- cmp al, 'n'
- je mul_end_8
- jmp mul_8_yn_filter
- mul_start_8: call CAL_MUL_8
- mul_end_8: call CAL_MENU_MUL
- CAL_MUL_8 endp
- CAL_MUL_10 proc
- mul_start_input_10:
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0223h
- int 10h
- mov ah,09h
- lea dx, mul_header_base10
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,051Dh
- int 10h
- mov ah,09h
- lea dx, mul_input_1_10
- int 21h
- ;1st 3 Inputs
- mov cl,03h
- mul_10_input_1:
- mov ah,01
- int 21h
- cmp al, '0'
- jl mul_start_input_10
- cmp al, '9'
- jg mul_start_input_10
- call DEC_AL
- push ax
- loop mul_10_input_1
- mov ah,02h
- mov dx,061Dh
- int 10h
- mov ah,09h
- lea dx, mul_input_2_10
- int 21h
- ;2nd 3 Inputs
- mov cl,03h
- mul_10_input_2:
- mov ah,01
- int 21h
- cmp al, '0'
- jl mul_start_input_10
- cmp al, '9'
- jg mul_start_input_10
- call DEC_AL
- push ax
- loop mul_10_input_2
- mov ah,02h
- mov dx,071Dh
- int 10h
- mov ah,09h
- lea dx, mul_ans
- int 21h
- ; LOGIC FOR MUL
- ;/ Ask input to confirm if to try again.
- mul_10_confirm:
- call CENTER
- mov ah,02h
- mov dx,090Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0B20h
- int 10h
- mov ah,09h
- lea dx, mul_again
- int 21h
- mul_10_yn_filter:
- mov ah,08h
- int 21h
- cmp al, 'Y'
- je mul_start_10
- cmp al, 'y'
- je mul_start_10
- cmp al, 'N'
- je mul_end_10
- cmp al, 'n'
- je mul_end_10
- jmp mul_10_yn_filter
- mul_start_10: call CAL_MUL_10
- mul_end_10: call CAL_MENU_MUL
- CAL_MUL_10 endp
- CAL_MUL_16 proc
- mul_start_input_16:
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0223h
- int 10h
- mov ah,09h
- lea dx, mul_header_base16
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,051Dh
- int 10h
- mov ah,09h
- lea dx, mul_input_1_16
- int 21h
- ;1st 3 Inputs
- mov cl,03h
- mul_16_input_1:
- mov ah,01
- int 21h
- cmp al, 30h
- jl mul_start_input_16
- cmp al, 46h
- jg mul_start_input_16
- cmp al, 3ah
- jb valid_mul_1
- cmp al, 41h
- jl mul_start_input_16
- cmp al, 46h
- jle valid_mul_1
- valid_mul_1:
- call DEC_AL
- push ax
- loop mul_16_input_1
- mov ah,02h
- mov dx,061Dh
- int 10h
- mov ah,09h
- lea dx, mul_input_2_16
- int 21h
- ;2nd 3 Inputs
- mov cl,03h
- mul_16_input_2:
- mov ah,01
- int 21h
- cmp al, 30h
- jl mul_start_input_16
- cmp al, 46h
- jg mul_start_input_16
- cmp al, 3ah
- jb valid_mul_2
- cmp al, 41h
- jl mul_start_input_16
- cmp al, 46h
- jle valid_mul_2
- valid_mul_2:
- call DEC_AL
- push ax
- loop mul_16_input_2
- mov ah,02h
- mov dx,071Dh
- int 10h
- mov ah,09h
- lea dx, mul_ans
- int 21h
- ; LOGIC FOR MUL
- pop ax
- mov bl,al
- pop ax
- mov bh,al
- pop ax
- mov cl,al
- SHL BH, 4
- OR BL, BH
- MOV BH, CL
- pop ax
- mov dl,al
- pop ax
- mov dh,al
- pop ax
- mov cl,al
- SHL DH, 4
- OR DL,DH
- MOV DH, CL
- mov ax,bx ; for mul
- mul dx
- mov bx,ax ; give back to bx the final answer
- ; final answer will be stored in DL,BX
- ;get the value of 0.00000x
- mov dh,bl ; back up for 0.0000x0
- and bl, 0Fh ; get right most digit
- mov al,bl ; to transform to ascii and push
- call ASCII_AL
- push ax
- ;get the value of 0.0000x0
- SHR dh, 4 ; move the leftmost digit to the right
- and dh, 0Fh ; clear any shifted values to the left
- mov al,dh
- call ASCII_AL
- push ax
- ;get the value of 0.000x00
- mov dh,bh ; back up for 0.00x000
- and bh, 0Fh
- mov al,bh
- call ASCII_AL
- push ax
- ;get the value of 0.00x000
- SHR dh, 4 ; move the leftmost digit to the right
- and dh, 0Fh ; clear any shifted values to the left
- mov al,dh
- call ASCII_AL
- push ax
- ;get the value of 0.0x0000
- mov dh,dl ; back up for 0.x00000
- and dl, 0Fh
- mov al, dl
- call ASCII_AL
- push ax
- ;get the value of 0.x00000
- SHR dh, 4 ; move the leftmost digit to the right
- and dh, 0Fh ; clear any shifted values to the left
- mov al,dh
- call ASCII_AL
- push ax
- mov cl,06h
- out_mul_16:
- pop ax
- mov dl,al
- mov ah,02h
- int 21h
- loop out_mul_16
- ;/ Ask input to confirm if to try again.
- mul_16_confirm:
- call CENTER
- mov ah,02h
- mov dx,090Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0B20h
- int 10h
- mov ah,09h
- lea dx, mul_again
- int 21h
- mul_16_yn_filter:
- mov ah,08h
- int 21h
- cmp al, 'Y'
- je mul_start_16
- cmp al, 'y'
- je mul_start_16
- cmp al, 'N'
- je mul_end_16
- cmp al, 'n'
- je mul_end_16
- jmp mul_16_yn_filter
- mul_start_16: call CAL_MUL_16
- mul_end_16: call CAL_MENU_MUL
- CAL_MUL_16 endp
- ; Calculator Functions - Division
- CAL_MENU_DIV proc
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,021Eh
- int 10h
- mov ah,09h
- lea dx, cal_header_div
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0523h
- int 10h
- mov ah,09h
- lea dx, cal_choice1
- int 21h
- mov ah,02h
- mov dx,0623h
- int 10h
- mov ah,09h
- lea dx, cal_choice2
- int 21h
- mov ah,02h
- mov dx,0723h
- int 10h
- mov ah,09h
- lea dx, cal_choice3
- int 21h
- mov ah,02h
- mov dx,0823h
- int 10h
- mov ah,09h
- lea dx, cal_choice4
- int 21h
- mov ah,02h
- mov dx,0A0Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0C22h
- int 10h
- mov ah,09h
- lea dx, m_dis10
- int 21h
- cal_div_conf:
- mov ah,08h
- int 21h
- cmp al,'1'
- je div_base8
- cmp al, '2'
- je div_base10
- cmp al, '3'
- je div_base16
- cmp al, '9'
- je div_back
- jmp cal_div_conf
- div_base8: call CAL_DIV_8
- div_base10: call CAL_DIV_10
- div_base16: call CAL_DIV_16
- div_back: call CAL_MENU
- CAL_MENU_div endp
- CAL_DIV_8 proc
- div_start_input_8:
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0223h
- int 10h
- mov ah,09h
- lea dx, div_header_base8
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,051Dh
- int 10h
- mov ah,09h
- lea dx, div_input_1_8
- int 21h
- ;1st 3 Inputs
- mov cl,03h
- div_8_input_1:
- mov ah,01
- int 21h
- cmp al, '0'
- jl div_start_input_8
- cmp al, '8'
- jge div_start_input_8
- call DEC_AL
- push ax
- loop div_8_input_1
- mov ah,02h
- mov dx,061Dh
- int 10h
- mov ah,09h
- lea dx, div_input_2_8
- int 21h
- ;2nd 3 Inputs
- mov cl,03h
- div_8_input_2:
- mov ah,01
- int 21h
- cmp al, '0'
- jl div_start_input_8
- cmp al, '8'
- jge div_start_input_8
- call DEC_AL
- push ax
- loop div_8_input_2
- mov ah,02h
- mov dx,071Dh
- int 10h
- mov ah,09h
- lea dx, div_ans
- int 21h
- ; LOGIC FOR DIV
- ;/ Ask input to confirm if to try again.
- div_8_confirm:
- call CENTER
- mov ah,02h
- mov dx,090Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0B20h
- int 10h
- mov ah,09h
- lea dx, div_again
- int 21h
- div_8_yn_filter:
- mov ah,08h
- int 21h
- cmp al, 'Y'
- je div_start_8
- cmp al, 'y'
- je div_start_8
- cmp al, 'N'
- je div_end_8
- cmp al, 'n'
- je div_end_8
- jmp div_8_yn_filter
- div_start_8: call CAL_DIV_8
- div_end_8: call CAL_MENU_DIV
- CAL_DIV_8 endp
- CAL_DIV_10 proc
- div_start_input_10:
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0223h
- int 10h
- mov ah,09h
- lea dx, div_header_base10
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,051Dh
- int 10h
- mov ah,09h
- lea dx, div_input_1_10
- int 21h
- ;1st 3 Inputs
- mov cl,03h
- div_10_input_1:
- mov ah,01
- int 21h
- cmp al, '0'
- jl div_start_input_10
- cmp al, '9'
- jg div_start_input_10
- call DEC_AL
- push ax
- loop div_10_input_1
- mov ah,02h
- mov dx,061Dh
- int 10h
- mov ah,09h
- lea dx, div_input_2_10
- int 21h
- ;2nd 3 Inputs
- mov cl,03h
- div_10_input_2:
- mov ah,01
- int 21h
- cmp al, '0'
- jl div_start_input_10
- cmp al, '9'
- jg div_start_input_10
- call DEC_AL
- push ax
- loop div_10_input_2
- mov ah,02h
- mov dx,071Dh
- int 10h
- mov ah,09h
- lea dx, div_ans
- int 21h
- ; LOGIC FOR DIV
- ;/ Ask input to confirm if to try again.
- div_10_confirm:
- call CENTER
- mov ah,02h
- mov dx,090Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0B20h
- int 10h
- mov ah,09h
- lea dx, div_again
- int 21h
- div_10_yn_filter:
- mov ah,08h
- int 21h
- cmp al, 'Y'
- je div_start_10
- cmp al, 'y'
- je div_start_10
- cmp al, 'N'
- je div_end_10
- cmp al, 'n'
- je div_end_10
- jmp div_10_yn_filter
- div_start_10: call CAL_DIV_10
- div_end_10: call CAL_MENU_DIV
- CAL_DIV_10 endp
- CAL_DIV_16 proc
- div_start_input_16:
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0223h
- int 10h
- mov ah,09h
- lea dx, div_header_base16
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,051Dh
- int 10h
- mov ah,09h
- lea dx, div_input_1_16
- int 21h
- ;1st 3 Inputs
- mov cl,03h
- div_16_input_1:
- mov ah,01
- int 21h
- cmp al, 30h
- jl div_start_input_16
- cmp al, 46h
- jg div_start_input_16
- cmp al, 3ah
- jb valid_div_1
- cmp al, 41h
- jl div_start_input_16
- cmp al, 46h
- jle valid_div_1
- valid_div_1:
- call DEC_AL
- push ax
- loop div_16_input_1
- mov ah,02h
- mov dx,061Dh
- int 10h
- mov ah,09h
- lea dx, div_input_2_16
- int 21h
- ;2nd 3 Inputs
- mov cl,03h
- div_16_input_2:
- mov ah,01
- int 21h
- cmp al, 30h
- jl div_start_input_16
- cmp al, 46h
- jg div_start_input_16
- cmp al, 3ah
- jb valid_div_2
- cmp al, 41h
- jl div_start_input_16
- cmp al, 46h
- jle valid_div_2
- valid_div_2:
- call DEC_AL
- push ax
- loop div_16_input_2
- mov ah,02h
- mov dx,071Dh
- int 10h
- mov ah,09h
- lea dx, div_ans
- int 21h
- ; LOGIC FOR DIV 16
- pop ax
- mov bl,al
- pop ax
- mov bh,al
- pop ax
- mov cl,al
- SHL BH, 4
- OR BL, BH
- MOV BH, CL
- pop ax
- mov dl,al
- pop ax
- mov dh,al
- pop ax
- mov cl,al
- SHL DH, 4
- OR DL,DH
- MOV DH, CL
- mov ax,dx ; for div
- mov dx, 0000h
- div bx
- mov bx,ax ; give back to bx the final answer
- ; final answer will be stored in DL,BX
- ;get the value of 0.00x
- mov dh,bl ; back up for 0.0000x0
- and bl, 0Fh ; get right most digit
- mov al,bl ; to transform to ascii and push
- call ASCII_AL
- push ax
- ;get the value of 0.0x0
- SHR dh, 4 ; move the the right most position
- mov al,dh
- call ASCII_AL
- push ax
- ;get the value of 0.x00
- and bh,0Fh
- mov al,bh
- call ASCII_AL
- push ax
- mov cl,03h
- out_div_16:
- pop ax
- mov dl,al
- mov ah,02h
- int 21h
- loop out_div_16
- div_16_confirm:
- div_16_confirm:
- call CENTER
- mov ah,02h
- mov dx,090Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0B20h
- int 10h
- mov ah,09h
- lea dx, div_again
- int 21h
- div_16_yn_filter:
- mov ah,08h
- int 21h
- cmp al, 'Y'
- je div_start_16
- cmp al, 'y'
- je div_start_16
- cmp al, 'N'
- je div_end_16
- cmp al, 'n'
- je div_end_16
- jmp div_16_yn_filter
- div_start_16: call CAL_DIV_16
- div_end_16: call CAL_MENU_DIV
- CAL_DIV_16 endp
- ; Calculator Functions - Modulo
- CAL_MENU_MOD proc
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,021Eh
- int 10h
- mov ah,09h
- lea dx, cal_header_mod
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0523h
- int 10h
- mov ah,09h
- lea dx, cal_choice1
- int 21h
- mov ah,02h
- mov dx,0623h
- int 10h
- mov ah,09h
- lea dx, cal_choice2
- int 21h
- mov ah,02h
- mov dx,0723h
- int 10h
- mov ah,09h
- lea dx, cal_choice3
- int 21h
- mov ah,02h
- mov dx,0823h
- int 10h
- mov ah,09h
- lea dx, cal_choice4
- int 21h
- mov ah,02h
- mov dx,0A0Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0C22h
- int 10h
- mov ah,09h
- lea dx, m_dis10
- int 21h
- cal_mod_conf:
- mov ah,08h
- int 21h
- cmp al,'1'
- je mod_base8
- cmp al, '2'
- je mod_base10
- cmp al, '3'
- je mod_base16
- cmp al, '9'
- je mod_back
- jmp cal_mod_conf
- mod_base8: call CAL_MOD_8
- mod_base10: call CAL_MOD_10
- mod_base16: call CAL_MOD_16
- mod_back: call CAL_MENU
- CAL_MENU_mod endp
- CAL_MOD_8 proc
- mod_start_input_8:
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0223h
- int 10h
- mov ah,09h
- lea dx, mod_header_base8
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,051Dh
- int 10h
- mov ah,09h
- lea dx, mod_input_1_8
- int 21h
- ;1st 3 Inputs
- mov cl,03h
- mod_8_input_1:
- mov ah,01
- int 21h
- cmp al, '0'
- jl mod_start_input_8
- cmp al, '8'
- jge mod_start_input_8
- call DEC_AL
- push ax
- loop mod_8_input_1
- mov ah,02h
- mov dx,061Dh
- int 10h
- mov ah,09h
- lea dx, mod_input_2_8
- int 21h
- ;2nd 3 Inputs
- mov cl,03h
- mod_8_input_2:
- mov ah,01
- int 21h
- cmp al, '0'
- jl mod_start_input_8
- cmp al, '8'
- jge mod_start_input_8
- call DEC_AL
- push ax
- loop mod_8_input_2
- mov ah,02h
- mov dx,071Dh
- int 10h
- mov ah,09h
- lea dx, mod_ans
- int 21h
- ; LOGIC FOR MOD
- ;/ Ask input to confirm if to try again.
- mod_8_confirm:
- call CENTER
- mov ah,02h
- mov dx,090Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0B20h
- int 10h
- mov ah,09h
- lea dx, mod_again
- int 21h
- mod_8_yn_filter:
- mov ah,08h
- int 21h
- cmp al, 'Y'
- je mod_start_8
- cmp al, 'y'
- je mod_start_8
- cmp al, 'N'
- je mod_end_8
- cmp al, 'n'
- je mod_end_8
- jmp mod_8_yn_filter
- mod_start_8: call CAL_MOD_8
- mod_end_8: call CAL_MENU_MOD
- CAL_MOD_8 endp
- CAL_MOD_10 proc
- mod_start_input_10:
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0223h
- int 10h
- mov ah,09h
- lea dx, mod_header_base10
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,051Dh
- int 10h
- mov ah,09h
- lea dx, mod_input_1_10
- int 21h
- ;1st 3 Inputs
- mov cl,03h
- mod_10_input_1:
- mov ah,01
- int 21h
- cmp al, '0'
- jl mod_start_input_10
- cmp al, '9'
- jg mod_start_input_10
- call DEC_AL
- push ax
- loop mod_10_input_1
- mov ah,02h
- mov dx,061Dh
- int 10h
- mov ah,09h
- lea dx, mod_input_2_10
- int 21h
- ;2nd 3 Inputs
- mov cl,03h
- mod_10_input_2:
- mov ah,01
- int 21h
- cmp al, '0'
- jl mod_start_input_10
- cmp al, '9'
- jg mod_start_input_10
- call DEC_AL
- push ax
- loop mod_10_input_2
- mov ah,02h
- mov dx,071Dh
- int 10h
- mov ah,09h
- lea dx, mod_ans
- int 21h
- ; LOGIC FOR MOD
- ;/ Ask input to confirm if to try again.
- mod_10_confirm:
- call CENTER
- mov ah,02h
- mov dx,090Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0B20h
- int 10h
- mov ah,09h
- lea dx, mod_again
- int 21h
- mod_10_yn_filter:
- mov ah,08h
- int 21h
- cmp al, 'Y'
- je mod_start_10
- cmp al, 'y'
- je mod_start_10
- cmp al, 'N'
- je mod_end_10
- cmp al, 'n'
- je mod_end_10
- jmp mod_10_yn_filter
- mod_start_10: call CAL_MOD_10
- mod_end_10: call CAL_MENU_MOD
- CAL_MOD_10 endp
- CAL_MOD_16 proc
- mod_start_input_16:
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0223h
- int 10h
- mov ah,09h
- lea dx, mod_header_base16
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,051Dh
- int 10h
- mov ah,09h
- lea dx, mod_input_1_16
- int 21h
- ;1st 3 Inputs
- mov cl,03h
- mod_16_input_1:
- mov ah,01
- int 21h
- cmp al, 30h
- jl mod_start_input_16
- cmp al, 46h
- jg mod_start_input_16
- cmp al, 3ah
- jb valid_mod_1
- cmp al, 41h
- jl mod_start_input_16
- cmp al, 46h
- jle valid_mod_1
- valid_mod_1:
- call DEC_AL
- push ax
- loop mod_16_input_1
- mov ah,02h
- mov dx,061Dh
- int 10h
- mov ah,09h
- lea dx, mod_input_2_16
- int 21h
- ;2nd 3 Inputs
- mov cl,03h
- mod_16_input_2:
- mov ah,01
- int 21h
- cmp al, 30h
- jl mod_start_input_16
- cmp al, 46h
- jg mod_start_input_16
- cmp al, 3ah
- jb valid_mod_2
- cmp al, 41h
- jl mod_start_input_16
- cmp al, 46h
- jle valid_mod_2
- valid_mod_2:
- call DEC_AL
- push ax
- loop mod_16_input_2
- mov ah,02h
- mov dx,071Dh
- int 10h
- mov ah,09h
- lea dx, mod_ans
- int 21h
- ; LOGIC FOR MOD
- pop ax
- mov bl,al
- pop ax
- mov bh,al
- pop ax
- mov cl,al
- SHL BH, 4
- OR BL, BH
- MOV BH, CL
- pop ax
- mov dl,al
- pop ax
- mov dh,al
- pop ax
- mov cl,al
- SHL DH, 4
- OR DL,DH
- MOV DH, CL
- mov ax,dx ; for div
- mov dx, 0000h
- cmp bx,ax ;compare if divisor is greater
- jge out_mod_16_zero
- div bx
- mov bx,ax ; give back to bx the final answer
- ; Get the remainder stored in DL 0.00x
- mov cl, dl ; backup for 0.0x0
- and dl, 0Fh
- mov al,dl
- call ASCII_AL
- push ax
- ;Get the value 0.0x0
- SHR cl, 4
- mov al,cl
- call ASCII_AL
- push ax
- mov cl,02h
- out_mod_16:
- pop ax
- mov dl,al
- mov ah,02h
- int 21h
- loop out_mod_16
- jmp mod_16_confirm
- out_mod_16_zero:
- mov ah,02h
- mov dl, 30h
- int 21h
- int 21h
- ;/ Ask input to confirm if to try again.
- mod_16_confirm:
- call CENTER
- mov ah,02h
- mov dx,090Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0B20h
- int 10h
- mov ah,09h
- lea dx, mod_again
- int 21h
- mod_16_yn_filter:
- mov ah,08h
- int 21h
- cmp al, 'Y'
- je mod_start_16
- cmp al, 'y'
- je mod_start_16
- cmp al, 'N'
- je mod_end_16
- cmp al, 'n'
- je mod_end_16
- jmp mod_16_yn_filter
- mod_start_16: call CAL_MOD_16
- mod_end_16: call CAL_MENU_MOD
- CAL_MOD_16 endp
- ; Conversion Functions
- CON_MENU proc
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0220h
- int 10h
- mov ah,09h
- lea dx, con_menu1
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0520h
- int 10h
- mov ah,09h
- lea dx, con_menu2
- int 21h
- mov ah,02h
- mov dx,0620h
- int 10h
- mov ah,09h
- lea dx, con_menu3
- int 21h
- mov ah,02h
- mov dx,0720h
- int 10h
- mov ah,09h
- lea dx, con_menu4
- int 21h
- mov ah,02h
- mov dx,0820h
- int 10h
- mov ah,09h
- lea dx, con_menu5
- int 21h
- mov ah,02h
- mov dx,0920h
- int 10h
- mov ah,09h
- lea dx, con_menu6
- int 21h
- mov ah,02h
- mov dx,0A20h
- int 10h
- mov ah,09h
- lea dx, con_menu7
- int 21h
- mov ah,02h
- mov dx,0B20h
- int 10h
- mov ah,09h
- lea dx, con_menu8
- int 21h
- mov ah,02h
- mov dx,0D0Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0F20h
- int 10h
- mov ah,09h
- lea dx, m_dis10
- int 21h
- con_menu_conf:
- mov ah,08h
- int 21h
- cmp al,'1'
- je go_menu_08_10
- cmp al, '2'
- je go_menu_08_16
- cmp al, '3'
- je go_menu_10_08
- cmp al, '4'
- je go_menu_10_16
- cmp al, '5'
- je go_menu_16_08
- cmp al, '6'
- je go_menu_16_10
- cmp al, '9'
- je go_menu_con
- jmp con_menu_conf
- go_menu_08_10: call CON_08_10
- go_menu_08_16: call CON_08_16
- go_menu_10_08: call CON_10_08
- go_menu_10_16: call CON_10_16
- go_menu_16_08: call CON_16_08
- go_menu_16_10: call CON_16_10
- go_menu_con: call main
- CON_MENU endp
- CON_08_10 proc
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,021Ah
- int 10h
- mov ah,09h
- lea dx, con_header_08_10
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,051Ah
- int 10h
- mov ah,09h
- lea dx, con_input_08_10
- int 21h
- ;1st 3 Inputs
- mov cl,03h
- con_08_10_input_1:
- mov ah,01
- int 21h
- cmp al, '0'
- jl con_start_08_10
- cmp al, '8'
- jge con_start_08_10
- call DEC_AL
- push ax
- loop con_08_10_input_1
- mov ah,02h
- mov dx,061Ah
- int 10h
- mov ah,09h
- lea dx, con_ans_08_10
- int 21h
- ; LOGIC FOR CON 08 to 10
- pop bx
- pop cx
- pop dx
- ; Multiply first digit (input * 8^2)
- mov ax,dx
- and ax, 000fh
- mov dx, 0040h ; 64 (8 ^ 2)
- mul dx
- push ax
- ; Multiply 2nd digit (input * 8^1)
- mov ax,cx
- and ax, 000fh
- mov cx, 0008h ; 8 (8 ^ 1)
- mul cx
- push ax
- ;Multiply 3rd digit (input * 8^0)
- mov ax,bx
- and ax, 000fh ;clear ax
- push ax
- ; Add the values together (i*8^2) + (i*8^1) + (i*8^0)
- pop ax
- pop bx
- pop cx
- add bx,cx
- add ax,bx
- mov cx,0003h
- CB_08_10:
- sub dx,dx
- mov bx,000Ah ; change to BASE
- div bx
- push dx
- loop CB_08_10
- mov cx,0003h
- OUT_08_10:
- sub ax,ax
- pop ax
- mov bl,al
- cmp bl,0Ah
- jge ASCII_08_10_NUM
- or bl,30h
- jmp ASCII_08_10_LET
- ASCII_08_10_NUM:
- add bl,37h
- ASCII_08_10_LET:
- mov ah,02h
- mov dl,bl
- int 21h
- loop OUT_08_10
- mov ah,02h
- mov dx,080Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0A1Ah
- int 10h
- mov ah,09h
- lea dx, con_again
- int 21h
- con_08_10_conf:
- mov ah,08h
- int 21h
- cmp al, 'Y'
- je con_start_08_10
- cmp al, 'y'
- je con_start_08_10
- cmp al, 'N'
- je con_end_08_10
- cmp al, 'n'
- je con_end_08_10
- jmp con_08_10_conf
- con_start_08_10: call CON_08_10
- con_end_08_10: call CON_MENU
- CON_08_10 endp
- CON_08_16 proc
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,021Ah
- int 10h
- mov ah,09h
- lea dx, con_header_08_16
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,051Ah
- int 10h
- mov ah,09h
- lea dx, con_input_08_16
- int 21h
- ;1st 3 Inputs
- mov cl,03h
- con_08_16_input_1:
- mov ah,01
- int 21h
- cmp al, '0'
- jl con_start_08_16
- cmp al, '8'
- jge con_start_08_16
- call DEC_AL
- push ax
- loop con_08_16_input_1
- mov ah,02h
- mov dx,061Ah
- int 10h
- mov ah,09h
- lea dx, con_ans_08_16
- int 21h
- ; LOGIC FOR CON 08 to 16
- pop bx
- pop cx
- pop dx
- ; Multiply first digit (input * 8^2)
- mov ax,dx
- and ax, 000fh
- mov dx, 0040h ; 64 (16 ^ 2)
- mul dx
- push ax
- ; Multiply 2nd digit (input * 8^1)
- mov ax,cx
- and ax, 000fh
- mov cx, 0008h ; 8 (16 ^ 1)
- mul cx
- push ax
- ;Multiply 3rd digit (input * 8^0)
- mov ax,bx
- and ax, 000fh ;clear ax
- push ax
- ; Add the values together (i*8^2) + (i*8^1) + (i*8^0)
- pop ax
- pop bx
- pop cx
- add bx,cx
- add ax,bx
- mov cx,0003h
- CB_08_16:
- sub dx,dx
- mov bx,0010h ; change to BASE / 08 to (16d)/(10h)
- div bx
- push dx
- loop CB_08_16
- mov cx,0003h
- OUT_08_16:
- sub ax,ax
- pop ax
- mov bl,al
- cmp bl,0Ah
- jge ASCII_08_16_NUM
- or bl,30h
- jmp ASCII_08_16_LET
- ASCII_08_16_NUM:
- add bl,37h
- ASCII_08_16_LET:
- mov ah,02h
- mov dl,bl
- int 21h
- loop OUT_08_16
- mov ah,02h
- mov dx,080Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0A1Ah
- int 10h
- mov ah,09h
- lea dx, con_again
- int 21h
- con_08_16_conf:
- mov ah,08h
- int 21h
- cmp al, 'Y'
- je con_start_08_16
- cmp al, 'y'
- je con_start_08_16
- cmp al, 'N'
- je con_end_08_16
- cmp al, 'n'
- je con_end_08_16
- jmp con_08_16_conf
- con_start_08_16: call CON_08_16
- con_end_08_16: call CON_MENU
- CON_08_16 endp
- CON_10_08 proc
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,021Ah
- int 10h
- mov ah,09h
- lea dx, con_header_10_08
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,051Ah
- int 10h
- mov ah,09h
- lea dx, con_input_10_08
- int 21h
- ;1st 3 Inputs
- mov cl,03h
- con_10_08_input_1:
- mov ah,01
- int 21h
- cmp al, '0'
- jl con_start_10_08
- cmp al, '9'
- jg con_start_10_08
- call DEC_AL
- push ax
- loop con_10_08_input_1
- mov ah,02h
- mov dx,061Ah
- int 10h
- mov ah,09h
- lea dx, con_ans_10_08
- int 21h
- ; LOGIC FOR CON 10 to 08
- pop bx
- pop cx
- pop dx
- ; Multiply first digit (input * 8^2)
- mov ax,dx
- and ax, 000fh
- mov dx, 0064h ; 100 (10 ^ 2)
- mul dx
- push ax
- ; Multiply 2nd digit (input * 8^1)
- mov ax,cx
- and ax, 000fh
- mov cx, 000Ah ; 10 (10 ^ 1)
- mul cx
- push ax
- ;Multiply 3rd digit (input * 8^0)
- mov ax,bx
- and ax, 000fh ;clear ax
- push ax
- ; Add the values together (i*8^2) + (i*8^1) + (i*8^0)
- pop ax
- pop bx
- pop cx
- add bx,cx
- add ax,bx
- mov cx,0004h
- CB_10_16:
- sub dx,dx
- mov bx,0010h ; change to BASE 16
- div bx
- push dx
- loop CB_10_16
- mov cx,0004h
- OUT_10_16:
- sub ax,ax
- pop ax
- mov bl,al
- cmp bl,0Ah
- jge ASCII_10_16_NUM
- or bl,30h
- jmp ASCII_10_16_LET
- ASCII_10_16_NUM:
- add bl,37h
- ASCII_10_16_LET:
- mov ah,02h
- mov dl,bl
- int 21h
- loop OUT_10_16
- mov ah,02h
- mov dx,080Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0A1Ah
- int 10h
- mov ah,09h
- lea dx, con_again
- int 21h
- con_10_08_conf:
- mov ah,08h
- int 21h
- cmp al, 'Y'
- je con_start_10_08
- cmp al, 'y'
- je con_start_10_08
- cmp al, 'N'
- je con_end_10_08
- cmp al, 'n'
- je con_end_10_08
- jmp con_10_08_conf
- con_start_10_08: call CON_10_08
- con_end_10_08: call CON_MENU
- CON_10_08 endp
- CON_10_16 proc
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,021Ah
- int 10h
- mov ah,09h
- lea dx, con_header_10_16
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,051Ah
- int 10h
- mov ah,09h
- lea dx, con_input_10_16
- int 21h
- ;1st 3 Inputs
- mov cl,03h
- con_10_16_input_1:
- mov ah,01
- int 21h
- cmp al, '0'
- jl con_start_10_16
- cmp al, '9'
- jg con_start_10_16
- call DEC_AL
- push ax
- loop con_10_16_input_1
- mov ah,02h
- mov dx,061Ah
- int 10h
- mov ah,09h
- lea dx, con_ans_10_16
- int 21h
- ; LOGIC FOR CON 10 to 08
- pop bx
- pop cx
- pop dx
- ; Multiply first digit (input * 8^2)
- mov ax,dx
- and ax, 000fh
- mov dx, 0064h ; 100 (10 ^ 2)
- mul dx
- push ax
- ; Multiply 2nd digit (input * 8^1)
- mov ax,cx
- and ax, 000fh
- mov cx, 000Ah ; 10 (10 ^ 1)
- mul cx
- push ax
- ;Multiply 3rd digit (input * 8^0)
- mov ax,bx
- and ax, 000fh ;clear ax
- push ax
- ; Add the values together (i*8^2) + (i*8^1) + (i*8^0)
- pop ax
- pop bx
- pop cx
- add bx,cx
- add ax,bx
- mov cx,0003h
- CB_10_16_x:
- sub dx,dx
- mov bx,0010h ; change to BASE 8
- div bx
- push dx
- loop CB_10_16_x
- mov cx,0003h
- OUT_10_16_x:
- sub ax,ax
- pop ax
- mov bl,al
- cmp bl,0Ah
- jge ASCII_10_16_NUM
- or bl,30h
- jmp ASCII_10_16_LET
- ASCII_10_16_NUM_x:
- add bl,37h
- ASCII_10_16_LET_x:
- mov ah,02h
- mov dl,bl
- int 21h
- loop OUT_10_16_x
- mov ah,02h
- mov dx,080Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0A1Ah
- int 10h
- mov ah,09h
- lea dx, con_again
- int 21h
- con_10_16_conf:
- mov ah,08h
- int 21h
- cmp al, 'Y'
- je con_start_10_16
- cmp al, 'y'
- je con_start_10_16
- cmp al, 'N'
- je con_end_10_16
- cmp al, 'n'
- je con_end_10_16
- jmp con_10_16_conf
- con_start_10_16: call CON_10_16
- con_end_10_16: call CON_MENU
- CON_10_16 endp
- CON_16_08 proc
- con_start_input_16:
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,021Ah
- int 10h
- mov ah,09h
- lea dx, con_header_16_08
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,051Ah
- int 10h
- mov ah,09h
- lea dx, con_input_16_08
- int 21h
- ;1st 3 Inputs
- mov cl,03h
- con_16_input_1:
- mov ah,01
- int 21h
- cmp al, 30h
- jl con_start_input_16
- cmp al, 46h
- jg con_start_input_16
- cmp al, 3ah
- jb valid_con_1
- cmp al, 41h
- jl con_start_input_16
- cmp al, 46h
- jle valid_con_1
- valid_con_1:
- call DEC_AL
- push ax
- loop con_16_input_1
- mov ah,02h
- mov dx,061Ah
- int 10h
- mov ah,09h
- lea dx, con_ans_16_08
- int 21h
- ; LOGIC FOR CON 16 to 08
- pop bx
- pop cx
- pop dx
- ; Multiply first digit (input * 16^2)
- mov ax,dx
- and ax, 000fh
- mov dx, 0100h ; 256 (16 ^ 2)
- mul dx
- push ax
- ; Multiply 2nd digit (input * 8^1)
- mov ax,cx
- and ax, 000fh
- mov cx, 0010h ; 16 (16 ^ 1)
- mul cx
- push ax
- ;Multiply 3rd digit (input * 16^0)
- mov ax,bx
- and ax, 000Fh ;clear ax
- push ax
- ; Add the values together (i*16^2) + (i*16^1) + (i*16^0)
- pop ax
- pop bx
- pop cx
- add bx,cx
- add ax,bx
- mov cx,0004h
- CB_16_08:
- sub dx,dx
- mov bx,0008h ; change to BASE
- div bx
- push dx
- loop CB_16_08
- mov cx,0004h
- OUT_16_08:
- sub ax,ax
- pop ax
- mov bl,al
- cmp bl,0Ah
- jge ASCII_16_08_NUM
- or bl,30h
- jmp ASCII_16_08_LET
- ASCII_16_08_NUM:
- add bl,37h
- ASCII_16_08_LET:
- mov ah,02h
- mov dl,bl
- int 21h
- loop OUT_16_08
- mov ah,02h
- mov dx,080Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0A1Ah
- int 10h
- mov ah,09h
- lea dx, con_again
- int 21h
- con_16_08_conf:
- mov ah,08h
- int 21h
- cmp al, 'Y'
- je con_start_16_08
- cmp al, 'y'
- je con_start_16_08
- cmp al, 'N'
- je con_end_16_08
- cmp al, 'n'
- je con_end_16_08
- jmp con_16_08_conf
- con_start_16_08: call CON_16_08
- con_end_16_08: call CON_MENU
- CON_16_08 endp
- CON_16_10 proc
- con_start_input_16_2:
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,021Ah
- int 10h
- mov ah,09h
- lea dx, con_header_16_10
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,051Ah
- int 10h
- mov ah,09h
- lea dx, con_input_16_10
- int 21h
- ;1st 3 Inputs
- mov cl,03h
- con_16_input_2:
- mov ah,01
- int 21h
- cmp al, 30h
- jl con_start_input_16_2
- cmp al, 46h
- jg con_start_input_16_2
- cmp al, 3ah
- jb valid_con_2
- cmp al, 41h
- jl con_start_input_16_2
- cmp al, 46h
- jle valid_con_2
- valid_con_2:
- call DEC_AL
- push ax
- loop con_16_input_2
- mov ah,02h
- mov dx,061Ah
- int 10h
- mov ah,09h
- lea dx, con_ans_16_10
- int 21h
- ; LOGIC FOR CON 16 to 10
- pop bx
- pop cx
- pop dx
- ; Multiply first digit (input * 16^2)
- mov ax,dx
- and ax, 000fh
- mov dx, 0100h ; 256 (16 ^ 2)
- mul dx
- push ax
- ; Multiply 2nd digit (input * 8^1)
- mov ax,cx
- and ax, 000fh
- mov cx, 0010h ; 16 (16 ^ 1)
- mul cx
- push ax
- ;Multiply 3rd digit (input * 16^0)
- mov ax,bx
- and ax, 000Fh ;clear ax
- push ax
- ; Add the values together (i*16^2) + (i*16^1) + (i*16^0)
- pop ax
- pop bx
- pop cx
- add bx,cx
- add ax,bx
- mov cx,0004h
- CB_16_10:
- sub dx,dx
- mov bx,000Ah ; change to BASE
- div bx
- push dx
- loop CB_16_10
- mov cx,0004h
- OUT_16_10:
- sub ax,ax
- pop ax
- mov bl,al
- cmp bl,0Ah
- jge ASCII_16_10_NUM
- or bl,30h
- jmp ASCII_16_10_LET
- ASCII_16_10_NUM:
- add bl,37h
- ASCII_16_10_LET:
- mov ah,02h
- mov dl,bl
- int 21h
- loop OUT_16_10
- mov ah,02h
- mov dx,080Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,0A1Ah
- int 10h
- mov ah,09h
- lea dx, con_again
- int 21h
- con_16_10_conf:
- mov ah,08h
- int 21h
- cmp al, 'Y'
- je con_start_16_10
- cmp al, 'y'
- je con_start_16_10
- cmp al, 'N'
- je con_end_16_10
- cmp al, 'n'
- je con_end_16_10
- jmp con_16_10_conf
- con_start_16_10: call CON_16_10
- con_end_16_10: call CON_MENU
- CON_16_10 endp
- ; Input Functions
- GET_INPUT PROC
- mov cl, 3h
- loop_input:
- mov ah,01h
- int 21h
- call DEC_AL
- push ax
- loop loop_input
- ret
- GET_INPUT ENDP
- ; Turns ASCII Hex input to their decimal counterpart.
- DEC_AL PROC
- mov ah,al
- cmp ah, 41h ; A in ASCII
- jge is_let ; AL - 31H to get the decimal equivalent of the letter
- jl is_num ; AL - 30H to get the decimal equivalent of the number
- is_num:
- sub ah,30h
- jmp return
- is_let:
- sub ah, 37h
- jmp return
- return:
- mov al,ah
- mov ah,01
- ret
- DEC_AL ENDP
- ; Turns Hex Input to their ASCII counterpart
- ASCII_AL PROC
- mov ah,al
- cmp ah, 0Ah ; A in ASCII
- jge is_let_ascii ; AL - 31H to get the decimal equivalent of the letter
- jl is_num_ascii ; AL - 30H to get the decimal equivalent of the number
- is_num_ascii:
- add ah,30h
- jmp return_ascii
- is_let_ascii:
- add ah, 37h
- jmp return_ascii
- return_ascii:
- mov al,ah
- mov ah,01
- ret
- ASCII_AL ENDP
- ; Universal Functions
- TERMINATE proc
- call CENTER_CLEAR
- mov ah,02h
- mov dx,010Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0218h
- int 10h
- mov ah,09h
- lea dx, exit_dis2
- int 21h
- mov ah,02h
- mov dx,030Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,040Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,051Ah
- int 10h
- mov ah,09h
- lea dx, exit_dis1
- int 21h
- mov ah,02h
- mov dx,060Fh
- int 10h
- mov ah,09h
- lea dx, line_2
- int 21h
- mov ah,02h
- mov dx,070Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,02h
- mov dx,0A23h
- int 10h
- mov ah,09h
- lea dx, exit_dis3
- int 21h
- mov ah,02h
- mov dx,0C1Dh
- int 10h
- mov ah,09h
- lea dx, exit_dis4
- int 21h
- mov ah,02h
- mov dx,0D20h
- int 10h
- mov ah,09h
- lea dx, exit_dis5
- int 21h
- mov ah,02h
- mov dx,110Fh
- int 10h
- mov ah,09h
- lea dx, line_1
- int 21h
- mov ah,4ch
- int 21h
- TERMINATE endp
- CENTER proc
- mov ax, 0000h
- mov bx, 0000h
- mov cx, 0000h
- mov dx, 0000h
- ret
- CENTER endp
- CENTER_CLEAR proc
- mov ax,0600h
- mov bh,0Dh
- mov cx,0000h
- mov dx,184Fh
- int 10h
- mov bh,00h
- ret
- CENTER_CLEAR endp
- BACKSPACE proc
- mov ah, 01h ; read a character from standard input
- int 21h
- mov dl, 08h ; move the cursor back one position
- mov ah, 02h
- int 21h
- mov dl, ' ' ; overwrite the character with a space
- mov ah, 02h
- int 21h
- mov dl, 08h ; move the cursor back again
- mov ah, 02h
- int 21h
- ret
- BACKSPACE endp
- ; Convert Functions
- CONVERT_08_16 proc
- ; LOGIC FOR CON 08 to 16
- pop bx
- pop cx
- pop dx
- ; Multiply first digit (input * 8^2)
- mov ax,dx
- and ax, 000fh
- mov dx, 0040h ; 64 (16 ^ 2)
- mul dx
- push ax
- ; Multiply 2nd digit (input * 8^1)
- mov ax,cx
- and ax, 000fh
- mov cx, 0008h ; 8 (16 ^ 1)
- mul cx
- push ax
- ;Multiply 3rd digit (input * 8^0)
- mov ax,bx
- and ax, 000fh ;clear ax
- push ax
- ; Add the values together (i*8^2) + (i*8^1) + (i*8^0)
- pop ax
- pop bx
- pop cx
- add bx,cx
- add ax,bx
- mov cx,0003h
- COB_08_16:
- sub dx,dx
- mov bx,0010h ; change to BASE / 08 to (16d)/(10h)
- div bx
- push dx
- loop COB_08_16
- CONVERT_08_16 endp
- CONVERT_16_08 proc
- CONVERT_16_08 endp
- CONVERT_10_16 proc
- CONVERT_10_16 endp
- CONVERT_16_10 proc
- CONVERT_16_10 endp
- end main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement