Last active
September 28, 2023 11:12
-
-
Save medvecky/01f090aef633d32ec54f5565c2a6d301 to your computer and use it in GitHub Desktop.
Fractions calculator for Commodore 64 on 6510 assembly KIckAssembler (subroutines)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#importonce | |
#import "defenitions.asm" | |
#import "data.asm" | |
prepare_screen: | |
// set gren text color | |
lda #5 | |
sta text_color | |
jsr clearscreen | |
// set border and background black | |
lda #$00 | |
sta border | |
sta background | |
rts | |
main_usage: | |
set_cursor_x_y( $00, $0a ) | |
print_string( usage_1 ) | |
print_new_line( 3 ) | |
rts | |
usage_at_exit: | |
print_string( usage_2 ) | |
print_new_line( 1 ) | |
print_string( usage_3 ) | |
print_new_line( 1 ) | |
rts | |
restore_screen: | |
// restore border and background colors | |
lda #$0f6 | |
sta background | |
lda #$fe | |
sta border | |
// restore text color | |
lda #$e | |
sta text_color | |
jsr clearscreen | |
// restore text mode | |
lda #$015 | |
sta $d018 | |
rts | |
show_menu: | |
print_string( menu_1 ) | |
print_new_line( 1 ) | |
print_string( menu_2 ) | |
print_new_line( 1 ) | |
print_string( menu_3 ) | |
print_new_line( 1 ) | |
print_string( menu_4 ) | |
print_new_line( 1 ) | |
print_string( menu_5 ) | |
print_new_line( 1 ) | |
print_string( menu_6 ) | |
print_new_line( 1 ) | |
print_string( menu_7 ) | |
print_new_line( 2 ) | |
rts | |
simplifying_handler: | |
// args input | |
jsr input_numerator | |
jsr input_denominator | |
jsr cursor_blink_off | |
simplifying_proc: | |
fp_ram_to_fac( num1 ); | |
fp_fac_to_ram( a ); | |
// check and handle if denominator is zero | |
fp_ram_to_fac( den1 ); | |
fp_cmp( zero ); | |
cmp #$0 | |
bne simplifying_handler_continue | |
print_string( denominator_zero_error_message ) | |
print_new_line( 1 ) | |
jmp simplifying_handler_end | |
simplifying_handler_continue: | |
// simplify using gcd | |
fp_fac_to_ram( b ); | |
jsr gcd | |
fp_div( num1, gcd_result ) | |
fp_fac_to_ram( num1_result ) | |
fp_div( den1, gcd_result ) | |
fp_fac_to_ram( den1_result ) | |
// first part of result | |
jsr print_result_fraction_only | |
// check and handle if result improper | |
fp_div( num1_result, den1_result ) | |
jsr fp_abs | |
fp_cmp( one ) | |
cmp #$ff | |
beq simplifying_handler_end | |
fp_ram_to_fac( num1_result ); | |
fp_fac_to_ram( num1 ); | |
fp_ram_to_fac( den1_result ); | |
fp_fac_to_ram( den1 ); | |
jsr convert_improper_to_mixed | |
//second part of result | |
jsr print_result_mixed | |
simplifying_handler_end: | |
rts | |
input_numerator: | |
input_fp_value( numerator_prompt, num1 ) | |
rts | |
input_denominator: | |
input_fp_value( denominator_prompt, den1 ) | |
rts | |
input_second_numerator: | |
input_fp_value( numerator_prompt, num2 ) | |
rts | |
input_second_denominator: | |
input_fp_value( denominator_prompt, den2 ) | |
rts | |
input_whole_part: | |
input_fp_value( whole_part_prompt, whole_part1 ); | |
rts | |
cursor_blink_on: | |
lda #$00 | |
sta $cc | |
rts | |
cursor_blink_off: | |
lda $00cf | |
beq cursor_blink_off | |
lda #$01 | |
sta $cc | |
rts | |
input_string_proc: | |
ldy #$00 | |
ldx #$00 | |
lda #$00 | |
sta counter | |
input_get: | |
//hadnle only [0-9], "-", "return", "backspace" | |
jsr getin | |
beq input_get | |
cmp #$0d | |
beq input_string_end | |
cmp #$14 | |
beq handle_backspace | |
cmp #minus_sym | |
beq increase_counter | |
cmp #zero_sym | |
bcc input_get | |
cmp #nine_sym | |
beq increase_counter | |
bcs input_get | |
jmp increase_counter | |
handle_backspace: | |
ldx counter | |
cpx #$0 | |
beq input_get | |
jsr print_char | |
dex | |
stx counter | |
lda #$00 | |
sta n_string,x | |
jmp input_get | |
increase_counter: | |
ldx counter | |
sta n_string,x | |
jsr print_char | |
inx | |
stx counter | |
cpx #string_length | |
bne input_get | |
input_string_end: | |
rts | |
string_to_fp: | |
lda #<n_string | |
sta $22 | |
lda #>n_string | |
sta $23 | |
lda #string_length | |
jsr fp_string_to_fac | |
jsr clear_input_string | |
rts | |
clear_input_string: | |
ldx #$0 | |
lda #$0 | |
clear_loop: | |
sta n_string, x | |
inx | |
cpx #string_length | |
bne clear_loop | |
rts | |
gcd: | |
fp_ram_to_fac( a ) | |
fp_cmp( zero ) | |
cmp #$0 | |
bne gcd_continue | |
jmp a_zero | |
gcd_continue: | |
fp_ram_to_fac( b ) | |
fp_cmp( zero ) | |
cmp #$0 | |
beq b_zero | |
gcd_loop: | |
fp_ram_to_fac( b ) | |
cmp #$0 | |
beq b_zero | |
fp_modulo( a, b ) | |
fp_fac_to_ram( remainder ) | |
fp_ram_to_fac( b ) | |
fp_fac_to_ram( a ) | |
fp_ram_to_fac( remainder ) | |
fp_fac_to_ram( b ) | |
jmp gcd_loop | |
b_zero: | |
fp_ram_to_fac( a ) | |
fp_fac_to_ram( gcd_result ) | |
jmp gcd_end | |
a_zero: | |
fp_ram_to_fac( b ) | |
fp_fac_to_ram( gcd_result ) | |
gcd_end: | |
rts | |
convert_improper_to_mixed: | |
fp_div( num1, den1 ) | |
jsr fp_int | |
fp_cmp( zero ) | |
cmp #$ff | |
bne result_positive | |
lda #<one | |
ldy #>one | |
jsr fp_add | |
result_positive: | |
fp_fac_to_ram( whole_part_result ) | |
fp_modulo( num1, den1 ) | |
fp_fac_to_ram( num1_result ) | |
fp_ram_to_fac( den1 ) | |
fp_fac_to_ram( den1_result ) | |
rts | |
print_result_fraction_only: | |
print_fp_string_part( num1_result ) | |
print_char( slash_sym ) | |
print_fp_string_part( den1_result ) | |
print_new_line( 1 ) | |
rts | |
print_result_mixed: | |
print_fp_string_part( whole_part_result ) | |
fp_ram_to_fac( num1_result ) | |
fp_cmp( zero ) | |
cmp #$0 | |
beq print_result_mixed_line | |
print_fp_string_part( num1_result ) | |
print_char( slash_sym ) | |
print_fp_string_part( den1_result ) | |
print_result_mixed_line: | |
print_new_line( 1 ) | |
rts | |
mixed_to_improper_handler: | |
jsr input_whole_part | |
jsr input_numerator | |
jsr input_denominator | |
jsr cursor_blink_off | |
fp_mult( whole_part1, den1 ) | |
fp_fac_to_ram( num1_result ) | |
fp_add(num1_result, num1) | |
fp_fac_to_ram( num1_result ) | |
fp_ram_to_fac( den1 ) | |
fp_fac_to_ram( den1_result ) | |
jsr print_result_fraction_only | |
jsr result_simplifying | |
rts | |
result_simplifying: | |
fp_ram_to_fac(den1_result) | |
fp_fac_to_ram( den1 ) | |
fp_ram_to_fac(num1_result) | |
fp_fac_to_ram( num1 ) | |
jsr simplifying_proc | |
rts | |
multiplication_handler: | |
print_string( factor1_prompt ) | |
print_new_line(1) | |
jsr input_numerator | |
jsr input_denominator | |
print_string( factor2_prompt ) | |
print_new_line(1) | |
jsr input_second_numerator | |
jsr input_second_denominator | |
jsr cursor_blink_off | |
fp_mult( num1, num2 ) | |
fp_fac_to_ram( num1_result ) | |
fp_mult( den1, den2 ) | |
fp_fac_to_ram( den1_result ) | |
jsr result_simplifying | |
rts | |
dividing_handler: | |
print_string( dividend_prompt ) | |
print_new_line(1) | |
jsr input_numerator | |
jsr input_denominator | |
print_string( divisor_prompt ) | |
print_new_line(1) | |
jsr input_second_numerator | |
jsr input_second_denominator | |
jsr cursor_blink_off | |
fp_mult( num1, den2 ) | |
fp_fac_to_ram( num1_result ) | |
fp_mult( den1, num2 ) | |
fp_fac_to_ram( den1_result ) | |
jsr result_simplifying | |
rts | |
addition_handler: | |
jsr get_terms_and_reduce_to_lcm | |
fp_ram_to_fac( den1 ) | |
fp_fac_to_ram( den1_result ) | |
fp_add( num1, num2 ) | |
fp_fac_to_ram( num1_result ) | |
jsr result_simplifying | |
rts | |
subtraction_handler: | |
jsr get_terms_and_reduce_to_lcm | |
fp_ram_to_fac( den1 ) | |
fp_fac_to_ram( den1_result ) | |
fp_subst( num1, num2 ) | |
fp_fac_to_ram( num1_result ) | |
jsr result_simplifying | |
rts | |
get_terms_and_reduce_to_lcm: | |
print_string( term1_prompt ) | |
print_new_line(1) | |
jsr input_numerator | |
jsr input_denominator | |
fp_ram_to_fac( den1 ) | |
fp_cmp( zero ) | |
cmp #$0 | |
bne get_terms_and_reduce_to_lcm_continue | |
jsr cursor_blink_off | |
jmp get_terms_and_reduce_to_lcm_end | |
get_terms_and_reduce_to_lcm_continue: | |
print_string( term2_prompt ) | |
print_new_line(1) | |
jsr input_second_numerator | |
jsr input_second_denominator | |
fp_ram_to_fac( den2 ) | |
fp_cmp( zero ) | |
cmp #$0 | |
bne get_terms_and_reduce_to_lcm_continue2 | |
jsr cursor_blink_off | |
jmp get_terms_and_reduce_to_lcm_end | |
get_terms_and_reduce_to_lcm_continue2: | |
jsr cursor_blink_off | |
fp_ram_to_fac( den1 ); | |
fp_fac_to_ram( a ); | |
fp_ram_to_fac( den2 ); | |
fp_fac_to_ram( b ); | |
jsr gcd | |
fp_mult( den1, den2 ) | |
fp_fac_to_ram( lcm ) | |
fp_div( lcm, gcd_result ) | |
fp_fac_to_ram( lcm ) | |
fp_div( lcm, den1) | |
fp_fac_to_ram( scale1 ) | |
fp_div( lcm, den2 ) | |
fp_fac_to_ram( scale2 ) | |
fp_mult( scale1, num1 ) | |
fp_fac_to_ram( num1 ) | |
fp_mult( scale2, num2 ) | |
fp_fac_to_ram( num2 ) | |
fp_ram_to_fac(lcm) | |
fp_fac_to_ram( den1 ) | |
fp_fac_to_ram( den2 ) | |
get_terms_and_reduce_to_lcm_end: | |
rts |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment