Skip to content

Instantly share code, notes, and snippets.

@medvecky
Last active July 7, 2023 10:04
Show Gist options
  • Save medvecky/72ef713b03d53d8973d2fb26fc5719d5 to your computer and use it in GitHub Desktop.
Save medvecky/72ef713b03d53d8973d2fb26fc5719d5 to your computer and use it in GitHub Desktop.
Ratios calculator for C64 on 6510 assembly
.const getin = $ffe4
.const clearscreen = $e544;
.const print_str = $ab1e;
.const print_char = $ffd2
.const set_cursor = $e50c;
.const background = $d021;
.const border = $d020;
.const text_color = $0286;
.const fp_string_to_fac = $b7b5;
.const fp_fac_print = $aabc;
.const fp_store_fac_to_ram = $bbd4
.const fp_load_ram_to_fac = $bba2
.const fp_cmp = $bc5b
.const fp_div = $bb0f
.const fp_mult = $ba28
.var string_length = $06;
.var new_line = $8d;
.var q_sym = $51;
.var space_sym = $20;
BasicUpstart2( $1000 )
*= $1000
main:
jsr prepare_screen
jsr main_usage
wait_for_continue:
jsr getin
beq wait_for_continue
cmp #q_sym
beq restore_and_exit_jmp
jmp get_args
restore_and_exit_jmp:
jmp restore_and_exit
get_args:
jsr get_arguments
//check n1
lda #<n1
ldy #>n1
jsr fp_load_ram_to_fac
lda #<fp_zero
ldy #>fp_zero
jsr fp_cmp
cmp #$00
beq solve_for_n1
// check n2
lda #<n2
ldy #>n2
jsr fp_load_ram_to_fac
lda #<fp_zero
ldy #>fp_zero
jsr fp_cmp
cmp #$00
beq solve_for_n2
// check d1
lda #<d1
ldy #>d1
jsr fp_load_ram_to_fac
lda #<fp_zero
ldy #>fp_zero
jsr fp_cmp
cmp #$00
beq solve_for_d1
// check d2
lda #<d2
ldy #>d2
jsr fp_load_ram_to_fac
lda #<fp_zero
ldy #>fp_zero
jsr fp_cmp
cmp #$00
beq solve_for_d2
lda #<wrong_params
ldy #>wrong_params
jsr print_str
lda #new_line
jsr print_char
jmp wait_to_exit
solve_for_n1:
jsr solve_for_n1_proc
jmp wait_to_exit
solve_for_n2:
jsr solve_for_n2_proc
jmp wait_to_exit
solve_for_d1:
jsr solve_for_d1_proc
jmp wait_to_exit
solve_for_d2:
jsr solve_for_d2_proc
jmp wait_to_exit
wait_to_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 get_args
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
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
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 input_string,x
jmp input_get
increase_counter:
ldx counter
sta input_string,x
jsr print_char
inx
stx counter
cpx #string_length
bne input_get
input_string_end:
rts
string_to_fp:
lda #<input_string
sta $22
lda #>input_string
sta $23
lda #string_length
jsr fp_string_to_fac
jsr clear_input_string
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
lda #<usage_1_1
ldy #>usage_1_1
jsr print_str
lda #new_line
jsr print_char
jsr print_char
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
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
cursor_blink_on:
lda #$00
sta $cc
rts
cursor_blink_off:
lda $00cf
beq cursor_blink_off
lda #$01
sta $cc
rts
input_n1_prompt:
lda #<input_n1
ldy #>input_n1
jsr print_str
jsr cursor_blink_on
rts
input_n2_prompt:
lda #<input_n2
ldy #>input_n2
jsr print_str
jsr cursor_blink_on
rts
input_d1_prompt:
lda #<input_d1
ldy #>input_d1
jsr print_str
jsr cursor_blink_on
rts
input_d2_prompt:
lda #<input_d2
ldy #>input_d2
jsr print_str
jsr cursor_blink_on
rts
clear_input_string:
ldx #$0
lda #$0
clear_loop:
sta input_string, x
inx
cpx #string_length
bne clear_loop
rts
input_n1_proc:
jsr input_n1_prompt
jsr input_string_proc
jsr string_to_fp
ldx #<n1
ldy #>n1
jsr fp_store_fac_to_ram
lda #space_sym
jsr print_char
lda #new_line
jsr print_char
rts
input_n2_proc:
jsr input_n2_prompt
jsr input_string_proc
jsr string_to_fp
ldx #<n2
ldy #>n2
jsr fp_store_fac_to_ram
lda #space_sym
jsr print_char
lda #new_line
jsr print_char
rts
input_d1_proc:
jsr input_d1_prompt
jsr input_string_proc
jsr string_to_fp
ldx #<d1
ldy #>d1
jsr fp_store_fac_to_ram
lda #space_sym
jsr print_char
lda #new_line
jsr print_char
rts
input_d2_proc:
jsr input_d2_prompt
jsr input_string_proc
jsr string_to_fp
ldx #<d2
ldy #>d2
jsr fp_store_fac_to_ram
lda #space_sym
jsr print_char
lda #new_line
jsr print_char
rts
get_arguments:
jsr input_n1_proc
jsr input_d1_proc
jsr input_n2_proc
jsr input_d2_proc
jsr cursor_blink_off
rts
result_n1_prompt:
lda #space_sym
jsr print_char
lda #new_line
jsr print_char
lda #<result_n1
ldy #>result_n1
jsr print_str
rts
result_n2_prompt:
lda #space_sym
jsr print_char
lda #new_line
jsr print_char
lda #<result_n2
ldy #>result_n2
jsr print_str
rts
result_d1_prompt:
lda #space_sym
jsr print_char
lda #new_line
jsr print_char
lda #<result_d1
ldy #>result_d1
jsr print_str
rts
result_d2_prompt:
lda #space_sym
jsr print_char
lda #new_line
jsr print_char
lda #<result_d2
ldy #>result_d2
jsr print_str
rts
solve_for_n1_proc:
lda #<d1
ldy #>d1
jsr fp_load_ram_to_fac
lda #<n2
ldy #>n2
jsr fp_mult
ldx #<n2
ldy #>n2
jsr fp_store_fac_to_ram
lda #<d2
ldy #>d2
jsr fp_load_ram_to_fac
lda #<n2
ldy #>n2
jsr fp_div
ldx #<n1
ldy #>n1
jsr fp_store_fac_to_ram
jsr result_n1_prompt
lda #<n1
ldy #>n1
jsr fp_load_ram_to_fac
jsr fp_fac_print
lda #new_line
jsr print_char
rts
solve_for_n2_proc:
lda #<d2
ldy #>d2
jsr fp_load_ram_to_fac
lda #<n1
ldy #>n1
jsr fp_mult
ldx #<n1
ldy #>n1
jsr fp_store_fac_to_ram
lda #<d1
ldy #>d1
jsr fp_load_ram_to_fac
lda #<n1
ldy #>n1
jsr fp_div
ldx #<n2
ldy #>n2
jsr fp_store_fac_to_ram
jsr result_n2_prompt
lda #<n2
ldy #>n2
jsr fp_load_ram_to_fac
jsr fp_fac_print
lda #new_line
jsr print_char
rts
solve_for_d1_proc:
lda #<d2
ldy #>d2
jsr fp_load_ram_to_fac
lda #<n1
ldy #>n1
jsr fp_mult
ldx #<n1
ldy #>n1
jsr fp_store_fac_to_ram
lda #<n2
ldy #>n2
jsr fp_load_ram_to_fac
lda #<n1
ldy #>n1
jsr fp_div
ldx #<d1
ldy #>d1
jsr fp_store_fac_to_ram
jsr result_d1_prompt
lda #<d1
ldy #>d1
jsr fp_load_ram_to_fac
jsr fp_fac_print
lda #new_line
jsr print_char
rts
solve_for_d2_proc:
lda #<n2
ldy #>n2
jsr fp_load_ram_to_fac
lda #<d1
ldy #>d1
jsr fp_mult
ldx #<d1
ldy #>d1
jsr fp_store_fac_to_ram
lda #<n1
ldy #>n1
jsr fp_load_ram_to_fac
lda #<d1
ldy #>d1
jsr fp_div
ldx #<d2
ldy #>d2
jsr fp_store_fac_to_ram
jsr result_d2_prompt
lda #<d2
ldy #>d2
jsr fp_load_ram_to_fac
jsr fp_fac_print
lda #new_line
jsr print_char
rts
input_string:
.byte $00, $00, $00, $00, $00, $00, $00
counter:
.byte $0
n1:
.byte $00, $00, $00, $00, $00
n2:
.byte $00, $00, $00, $00, $00
d1:
.byte $00, $00, $00, $00, $00
d2:
.byte $00, $00, $00, $00, $00
fp_zero:
.byte $00, $00, $00, $00, $00
usage_1:
.text "RATIOS CALCULATOR"
.byte $00
usage_1_1:
.text "N1/D1 = N2/D2"
.byte $00
usage_2:
.text "PRESS ANY KEY TO CONTINUE"
.byte $00
usage_3:
.text "OR Q TO EXIT"
.byte $00
input_n1:
.text "N1(ZERO IF UNKOWN)?"
.byte $00
input_n2:
.text "N2(ZERO IF UNKOWN)?"
.byte $00
input_d1:
.text "D1(ZERO IF UNKOWN)?"
.byte $00
input_d2:
.text "D2(ZERO IF UNKOWN)?"
.byte $00
result_n1:
.text "N1="
.byte $00
result_n2:
.text "N2="
.byte $00
result_d1:
.text "D1="
.byte $00
result_d2:
.text "D2="
.byte $00
wrong_params:
.text "BAD ARGUMENTS"
.byte $00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment