Skip to content

Instantly share code, notes, and snippets.

@medvecky
Created August 28, 2023 15:25
Show Gist options
  • Save medvecky/11fda440812e529db431aadfd71c226f to your computer and use it in GitHub Desktop.
Save medvecky/11fda440812e529db431aadfd71c226f to your computer and use it in GitHub Desktop.
Fractions to decimal and percent converter for Commodore 64 on 6510 assembly
.const clearscreen = $e544;
.const print_str = $ab1e;
.const print_char = $ffd2
.const getin = $ffe4
.const fp_string_to_fac = $b7b5;
.const fp_store_fac_to_ram = $bbd4
.const fp_load_ram_to_fac = $bba2
.const fp_fac_print = $aabc;
.const fp_mult = $ba28
.const fp_div = $bb0f;
.const fp_to_str = $bddd;
.const text_color = $0286;
.const set_cursor = $e50c;
.const background = $d021;
.const border = $d020;
.var new_line = $8d;
.var q_sym = $51;
.var one_sym = $31
.var two_sym = $32
.var three_sym = $33
.var space_sym = $20;
.var string_length = $0F;
BasicUpstart2( $1000 )
*= $1000
main:
jsr prepare_screen
jsr main_usage
menu:
jsr show_menu
wait_for_continue:
jsr getin
beq wait_for_continue
cmp #q_sym
beq go_to_exit
cmp #one_sym
beq handle_decimal
cmp #two_sym
beq handle_fraction
cmp #three_sym
beq handle_percent
jsr clearscreen
jmp menu
handle_decimal:
jsr decimal_handler
jmp continue_or_exit
handle_fraction:
jsr fraction_handler
jmp continue_or_exit
handle_percent:
jsr percent_handler
jmp continue_or_exit
go_to_exit:
jmp restore_and_exit
continue_or_exit:
jsr usage_at_exit
wait_for_input:
jsr getin
beq wait_for_input
cmp #q_sym
bne continue
jmp restore_and_exit
continue:
jsr clearscreen
jmp menu
restore_and_exit:
jsr restore_screen
rts
// END OF MAIN
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:
ldx #$00
ldy #$0a
jsr set_cursor
lda #<usage_1
ldy #>usage_1
jsr print_str
lda #new_line
jsr print_char
jsr print_char
jsr print_char
rts
usage_at_exit:
lda #<usage_2
ldy #>usage_2
jsr print_str
lda #new_line
jsr print_char
lda #<usage_3
ldy #>usage_3
jsr print_str
lda #new_line
jsr print_char
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:
lda #<menu_1
ldy #>menu_1
jsr print_str
lda #new_line
jsr print_char
lda #new_line
jsr print_char
lda #<menu_2
ldy #>menu_2
jsr print_str
lda #new_line
jsr print_char
lda #<menu_3
ldy #>menu_3
jsr print_str
lda #new_line
jsr print_char
lda #<menu_4
ldy #>menu_4
jsr print_str
lda #new_line
jsr print_char
lda #<menu_5
ldy #>menu_5
jsr print_str
lda #new_line
jsr print_char
lda #new_line
jsr print_char
rts
decimal_handler:
jsr input_decimal
jsr cursor_blink_off
jsr calculate_den
lda #<n
ldy #>n
jsr fp_load_ram_to_fac
lda #<den
ldy #>den
jsr fp_mult
ldx #<num
ldy #>num
jsr fp_store_fac_to_ram
lda #<hundred
ldy #>hundred
jsr fp_load_ram_to_fac
lda #<n
ldy #>n
jsr fp_mult
ldx #<per
ldy #>per
jsr fp_store_fac_to_ram
jsr show_results
rts
input_decimal:
jsr input_decimal_prompt
jsr input_string_proc
jsr string_to_fp
ldx #<n
ldy #>n
jsr fp_store_fac_to_ram
jsr get_exponent_by_counter
lda #space_sym
jsr print_char
lda #new_line
jsr print_char
rts
input_decimal_prompt:
lda #<decimal_prompt
ldy #>decimal_prompt
jsr print_str
jsr cursor_blink_on
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:
jsr getin
beq input_get
cmp #$0d
beq input_string_end
cmp #$14
bne increase_counter
jsr print_char
ldx counter
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
get_exponent_by_counter:
ldx counter
dex
txa
sta e_counter
lda number_strings
clc
adc counter
sta address
dec address
lda #<(address)
sta $22
lda #>(address)
sta $23
lda #string_length
jsr fp_string_to_fac
ldx #<e
ldy #>e
jsr fp_store_fac_to_ram
rts
calculate_den:
ldx e_counter
dex
beq handle_tenth
txa
sta counter
lda #<ten
ldy #>ten
jsr fp_load_ram_to_fac
mult_loop:
lda #<ten
ldy #>ten
jsr fp_mult
ldx counter
dex
beq end_loop
txa
sta counter
jmp mult_loop
end_loop:
ldx #<den
ldy #>den
jsr fp_store_fac_to_ram
jmp end_mult
handle_tenth:
lda #<ten
ldy #>ten
jsr fp_load_ram_to_fac
ldx #<den
ldy #>den
jsr fp_store_fac_to_ram
end_mult:
rts
show_results:
lda #space_sym
jsr print_char
lda #new_line
jsr print_char
lda #<result_1
ldy #>result_1
jsr print_str
lda #<n
ldy #>n
jsr fp_load_ram_to_fac
jsr fp_to_str
jsr print_str
lda #new_line
jsr print_char
lda #<result_2
ldy #>result_2
jsr print_str
lda #<num
ldy #>num
jsr fp_load_ram_to_fac
jsr fp_to_str
jsr print_str
lda #<result_3
ldy #>result_3
jsr print_str
lda #<den
ldy #>den
jsr fp_load_ram_to_fac
jsr fp_to_str
jsr print_str
lda #new_line
jsr print_char
lda #<result_4
ldy #>result_4
jsr print_str
lda #<per
ldy #>per
jsr fp_load_ram_to_fac
jsr fp_to_str
jsr print_str
lda #new_line
jsr print_char
lda #new_line
jsr print_char
rts
fraction_handler:
jsr input_num_den
jsr cursor_blink_off
lda #<den
ldy #>den
jsr fp_load_ram_to_fac
lda #<num
ldy #>num
jsr fp_div
ldx #<n
ldy #>n
jsr fp_store_fac_to_ram
lda #<hundred
ldy #>hundred
jsr fp_load_ram_to_fac
lda #<n
ldy #>n
jsr fp_mult
ldx #<per
ldy #>per
jsr fp_store_fac_to_ram
jsr show_results
rts
input_num_den:
jsr input_num_prompt
jsr input_string_proc
lda #space_sym
jsr print_char
lda #new_line
jsr print_char
jsr string_to_fp
ldx #<num
ldy #>num
jsr fp_store_fac_to_ram
jsr input_den_prompt
jsr input_string_proc
jsr string_to_fp
ldx #<den
ldy #>den
jsr fp_store_fac_to_ram
lda #space_sym
jsr print_char
lda #new_line
jsr print_char
rts
input_num_prompt:
lda #<num_prompt
ldy #>num_prompt
jsr print_str
jsr cursor_blink_on
rts
input_den_prompt:
lda #<den_prompt
ldy #>den_prompt
jsr print_str
jsr cursor_blink_on
rts
percent_handler:
jsr input_percents
lda #<hundred
ldy #>hundred
jsr fp_load_ram_to_fac
lda #<per
ldy #>per
jsr fp_div
ldx #<n
ldy #>n
jsr fp_store_fac_to_ram
lda #<per
ldy #>per
jsr fp_load_ram_to_fac
ldx #<num
ldy #>num
jsr fp_store_fac_to_ram
lda #<hundred
ldy #>hundred
jsr fp_load_ram_to_fac
ldx #<den
ldy #>den
jsr fp_store_fac_to_ram
jsr show_results
rts
input_percents:
jsr input_percent_prompt
jsr input_string_proc
lda #space_sym
jsr print_char
lda #new_line
jsr print_char
jsr string_to_fp
ldx #<per
ldy #>per
jsr fp_store_fac_to_ram
rts
input_percent_prompt:
lda #<percent_prompt
ldy #>percent_prompt
jsr print_str
jsr cursor_blink_on
rts
usage_1:
.text "FRACTIONS CONVERTER"
.byte $00
usage_2:
.text "PRESS ANY KEY TO CONTINUE"
.byte $00
usage_3:
.text "OR Q TO EXIT"
.byte $00
menu_1:
.text "ENTER ARGUMENT TYPE:"
.byte $00
menu_2:
.text "1. DECIMAL"
.byte $00
menu_3:
.text "2. FRACTION"
.byte $00
menu_4:
.text "3. PERCENT"
.byte $00
menu_5:
.text "Q. EXIT"
.byte $00
decimal_prompt:
.text "INPUT DIGITS:"
.byte $00
result_1:
.text "DECIMAL:"
.byte $00
result_2:
.text "FRACTION:"
.byte $00
result_3:
.text "/"
.byte $00
result_4:
.text "PERCENT:"
.byte $00
num_prompt:
.text "NUMERATOR:"
.byte $00
den_prompt:
.text "DENOMINATOR:"
.byte $00
percent_prompt:
.text "PERCENTS:"
.byte $00
number_strings:
.text "0"
.byte $0
.text "1"
.byte $0
.text "2"
.byte $0
.text "3"
.byte $0
.text "4"
.byte $0
.text "5"
.byte $0
.text "6"
.byte $0
.text "7"
.byte $0
.text "8"
.byte $0
.text "9"
.byte $0
.text "10"
.byte $0
.text "11"
.byte $0
.text "12"
.byte $0
.text "13"
.byte $0
.text "14"
.byte $0
.text "15"
.byte $0
address:
.byte $0
e:
.byte $00, $00, $00, $00, $00
n_string:
.byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
counter:
.byte $0
e_counter:
.byte $0
n:
.byte $00, $00, $00, $00, $00
ten:
.byte $84, $20, $00, $00, $00
hundred:
.byte $87, $48, $00, $00, $00
den:
.byte $00, $00, $00, $00, $00
num:
.byte $00, $00, $00, $00, $00
per:
.byte $00, $00, $00, $00, $00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment