Last active
July 7, 2023 10:04
-
-
Save medvecky/72ef713b03d53d8973d2fb26fc5719d5 to your computer and use it in GitHub Desktop.
Ratios calculator for C64 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 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