Skip to content

Instantly share code, notes, and snippets.

@medvecky
Last active September 28, 2023 11:12
Show Gist options
  • Save medvecky/01f090aef633d32ec54f5565c2a6d301 to your computer and use it in GitHub Desktop.
Save medvecky/01f090aef633d32ec54f5565c2a6d301 to your computer and use it in GitHub Desktop.
Fractions calculator for Commodore 64 on 6510 assembly KIckAssembler (subroutines)
#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