Created
August 28, 2023 15:25
-
-
Save medvecky/11fda440812e529db431aadfd71c226f to your computer and use it in GitHub Desktop.
Fractions to decimal and percent converter for Commodore 64 on 6510 assembly
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
.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