From c8d255130cfcfed296723fdbdbab3749a65fc94c Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 20 Sep 2020 20:22:36 +0200 Subject: [PATCH] migrated to ACME assembler commit 145d64aa6e78838ed07cefed372f0ad6a4687e97 Author: FeralChild64 Date: Sun Sep 20 20:16:57 2020 +0200 ACME adaptation commit 885209d7822286744ea53232ae7461472a01d5d6 Author: FeralChild64 Date: Sun Sep 20 19:57:25 2020 +0200 ACME adaptation commit 334d84486bc603551887e7cbeb59d329f2224cc7 Author: FeralChild64 Date: Sun Sep 20 18:29:15 2020 +0200 ACME adaptation commit b5966f49bcd8f0ca79cbec93819a31238924707e Author: FeralChild64 Date: Sun Sep 20 18:09:31 2020 +0200 ACME adaptation commit 786536a93a5eab5e676fca99625b4eb094a554e7 Author: FeralChild64 Date: Sun Sep 20 17:24:48 2020 +0200 ACME adaptation commit 704c70dfb1f5d68775d6f3da220803b8a3990f56 Author: FeralChild64 Date: Sun Sep 20 15:07:12 2020 +0200 ACME adaptation commit 136874964c9083b375f151475310f9636871fc72 Author: FeralChild64 Date: Sun Sep 20 14:45:14 2020 +0200 ACME adaptation commit 8eca0d5700b72d04336e72c5cd3a68e18b85f96d Author: FeralChild64 Date: Sun Sep 20 14:06:52 2020 +0200 ACME adaptation commit 11d29eb7ee318239d782f85498b6d0524624d5c4 Author: FeralChild64 Date: Sun Sep 20 13:56:45 2020 +0200 ACME apaptation commit c9b5e5e04cceb92c66bc027e6440bc0f7c5a499f Author: FeralChild64 Date: Sun Sep 20 13:49:04 2020 +0200 ACME adaptation commit f5cc254cbc921f07863807468cb3fe26b410b409 Author: FeralChild64 Date: Sun Sep 20 13:01:18 2020 +0200 ACME adaptation commit e135a27bf9c30cc0965379c954564e06406303b1 Author: FeralChild64 Date: Sat Sep 19 21:55:01 2020 +0200 ACME adaptation commit e9dfddf90d9e2795e88b7da40ae050d733faeb56 Author: FeralChild64 Date: Sat Sep 19 21:48:47 2020 +0200 Makefile fix commit 07030104c65cf5e5beeacf6d629ccb9245e58657 Author: FeralChild64 Date: Sat Sep 19 21:42:00 2020 +0200 ACME adaptation commit f824362ee5bcfbffca86c430b57773b2ffd65655 Author: FeralChild64 Date: Sat Sep 19 20:14:56 2020 +0200 ACME adaptation commit 3a3c59007dcd4940d89b8669f34ca56b61c25fdf Author: FeralChild64 Date: Fri Sep 18 21:51:45 2020 +0200 ACME adaptation commit 6790ef7bc88a41de2881c69b7524dd4ab8c74b5d Author: FeralChild64 Date: Fri Sep 18 20:35:23 2020 +0200 ACME adaptation commit 38ad18b90e9ec713aa7ca49576b3388ce1733357 Author: FeralChild64 Date: Fri Sep 18 18:46:20 2020 +0200 ACME adaptation commit 541340371122a9702f7b2d9771c298223cffd0e9 Author: FeralChild64 Date: Fri Sep 18 16:49:46 2020 +0200 ACME adaptation commit 25cfd5e186459be1a260d3eb8cfff767838de370 Author: FeralChild64 Date: Thu Sep 17 20:13:33 2020 +0200 ACME adaptation commit f61599444d5b1d03d8fd8e4a6a7c3b85069bedb3 Author: FeralChild64 Date: Thu Sep 17 19:29:23 2020 +0200 ACME adaptation commit b290be31ec7bb2e5723607697da1bbc621c84429 Author: FeralChild64 Date: Thu Sep 17 17:20:14 2020 +0200 ACME adaptation commit 877be9e856880d98fd4bcb25b42aaaacda9dc463 Author: FeralChild64 Date: Wed Sep 16 21:47:38 2020 +0200 ACME adaptation commit bb20edaf85d386e41d5c2f715b745b68fbd3362e Author: FeralChild64 Date: Wed Sep 16 21:31:30 2020 +0200 ACME adaptation commit c5d31bd8685abce37c8e254d15aac20bd1570d9f Author: FeralChild64 Date: Wed Sep 16 18:40:49 2020 +0200 ACME adaptation commit 29349826b38f8a89649171559dc8cf24c560aff1 Author: FeralChild64 Date: Mon Sep 14 23:35:47 2020 +0200 ACME adaptation commit 8bcd6a621c4b11766d0cf34f79858ba90a67248e Author: FeralChild64 Date: Mon Sep 14 22:52:25 2020 +0200 ACME adaptation commit e87a69edc2ce4bfcc460c31e08dcc352a985f88d Author: FeralChild64 Date: Mon Sep 14 22:43:27 2020 +0200 ACME adaptation commit f49a097bd52e96d00b866c02bda7121e4543233c Author: FeralChild64 Date: Mon Sep 14 19:02:07 2020 +0200 ACME adaptation commit fa0e9214a633b8e8f867cc70925b390940dcd426 Author: FeralChild64 Date: Mon Sep 14 17:47:19 2020 +0200 ACME adaptation commit 1b763b91e7a03e426227129c7f22f0ce57a4c197 Author: FeralChild64 Date: Mon Sep 14 17:17:10 2020 +0200 ACME adaptation commit e92a4b57b232cd85eb1e71090b8a89c7c8461ebc Author: FeralChild64 Date: Mon Sep 14 17:15:37 2020 +0200 ACME adaptation commit de3c693e8a7e73ea5289198946058e3240894e6a Author: FeralChild64 Date: Mon Sep 14 17:10:05 2020 +0200 ACME adaptation commit f9bd7ae0f04e932d613be9ed5cb19af9be5d338e Author: FeralChild64 Date: Sun Sep 13 14:34:44 2020 +0200 ACME adaptation commit 694dee52555dbfc2b1f7f452a9671ff51106c057 Author: FeralChild64 Date: Sun Sep 13 14:16:14 2020 +0200 ACME adaptation commit 0af2c55edfcd22942d9f25417eb0d35f55b71604 Author: FeralChild64 Date: Fri Sep 11 17:38:09 2020 +0200 ACME adaptation commit 2015e17334bd56a1e8a13a5abc098d9c2e7ea44f Author: FeralChild64 Date: Fri Sep 11 16:46:05 2020 +0200 ACME adaptation commit b1e972162798d60f4483cd6cc261e856c20c2c8c Author: FeralChild64 Date: Fri Sep 11 16:24:31 2020 +0200 ACME adaptation commit 9d027e868466901ba53bf074a79ec8cf16273021 Author: FeralChild64 Date: Fri Sep 11 15:04:31 2020 +0200 ACME adaptation commit 957186deddd1aa4f3b4f1aa1f421e4239a584e57 Author: FeralChild64 Date: Thu Sep 10 22:49:07 2020 +0200 ACME adaptation commit b8060f67a455cfac109f08d96b62c360d693b931 Author: FeralChild64 Date: Wed Sep 9 23:07:28 2020 +0200 ACME adaptation commit e54d004568f44bbfe5c070ef1d7cf3544112e497 Author: FeralChild64 Date: Wed Sep 9 22:58:20 2020 +0200 ACME adaptation commit f90b77f073c5a605cb31c6ee451f65c8a8aff7d8 Author: FeralChild64 Date: Wed Sep 9 22:12:09 2020 +0200 ACME adaptation commit b211bb4afcd9c58fe1f5c92f3007717d611cd531 Author: FeralChild64 Date: Wed Sep 9 22:01:40 2020 +0200 ACME adaptation commit 8d7ea343b07e9e08e5f77f3c414758a6cffd0440 Author: FeralChild64 Date: Wed Sep 9 21:38:34 2020 +0200 ACME adaptation commit 46413eb0d92d6400aba0ff8dfe556e61e8a44d78 Author: FeralChild64 Date: Wed Sep 9 21:07:47 2020 +0200 ACME adaptation commit 9f98f69ecc21f7b74a5eb89e247f5a2c6fcb655d Author: FeralChild64 Date: Wed Sep 9 20:05:03 2020 +0200 ACME adaptation commit 7bb9f1cadc682c7e0a4a6796739d860d473ca110 Author: FeralChild64 Date: Wed Sep 9 19:55:12 2020 +0200 ACME adaptation commit 5fc115392b5bdca6b56f67ad866b1884d2d2bdf8 Author: FeralChild64 Date: Wed Sep 9 19:31:10 2020 +0200 ACME adaptation commit b7940fc60e568d859df9e3156f6bacc6d685b2cc Author: FeralChild64 Date: Wed Sep 9 19:16:09 2020 +0200 ACME adaptation commit 56288cb97197561afa0816b29c134ec1190e8eab Author: FeralChild64 Date: Wed Sep 9 18:48:23 2020 +0200 ACME adaptation commit 10401a60fc7922a53d782120ef6795d889140218 Author: FeralChild64 Date: Wed Sep 9 16:34:16 2020 +0200 ACME adaptation commit 8ce76e4d2b56837a691ae84b1a412a2ae32a157b Author: FeralChild64 Date: Wed Sep 9 16:20:44 2020 +0200 ACME adaptation commit 33fade899fa6172ea6b5b5f6683bb61f544429fd Author: FeralChild64 Date: Wed Sep 9 15:28:46 2020 +0200 ACME adaptation commit a416f04734402fcfbc57a933731376df2e0180a1 Author: FeralChild64 Date: Wed Sep 9 12:40:03 2020 +0200 ACME adaptation commit f8daee005b1d29f6912723be2ac94bc5fbeb0508 Author: FeralChild64 Date: Mon Sep 7 23:29:54 2020 +0200 ACME adaptation commit 83fe6bdd0b08a44fdbfc6eefe323a4b194ccaf5b Author: FeralChild64 Date: Mon Sep 7 22:23:16 2020 +0200 ACME adaptation commit cb1f75620b9c83000a15c9c7f7acefdfee79a979 Author: FeralChild64 Date: Mon Sep 7 19:23:12 2020 +0200 ACME adaptation commit e524d517c933ae1f0aeb49764d307fadb4845025 Author: FeralChild64 Date: Sun Sep 6 08:24:25 2020 +0200 ACME adaptation - replaced comments commit 2ab572c3a21f4a78a7312d0e684bc11d91d1717a Author: FeralChild64 Date: Sat Sep 5 17:59:10 2020 +0200 ACME adaptation - replaced the assembler --- .gitignore | 1 + .gitmodules | 3 + CONFIG.md | 72 +-- Makefile | 67 +- assembler/KickAss.cfg | 3 - assembler/KickAss.jar | Bin 625876 -> 0 bytes assembler/KickAssembler.pdf | Bin 785420 -> 0 bytes assembler/LICENSE | 3 - assembler/acme | 1 + src/,,config_custom.s | 233 +++---- src/,,config_cx16.s | 179 ++--- src/,,config_generic.s | 213 +++--- src/,,config_mega65.s | 183 +++--- src/,,config_testing.s | 214 +++--- src/,,config_ultimate64.s | 193 +++--- src/aliases/,aliases_config.s | 602 +++++++++-------- src/aliases/,aliases_cpu.s | 610 +++--------------- src/aliases/,aliases_error_codes.s | 122 ++-- src/aliases/,aliases_hardware.s | 301 ++++----- src/aliases/,aliases_hardware_cx16.s | 103 ++- src/aliases/,aliases_hardware_m65.s | 69 +- src/aliases/,aliases_petscii_codes.s | 309 ++++----- src/aliases/,aliases_ram_lowmem.s | 577 ++++++++--------- src/aliases/,aliases_ram_lowmem_m65.s | 122 ++-- src/aliases/,aliases_ram_over64K_m65.s | 34 +- src/aliases/,aliases_rom_basic.s | 17 +- src/aliases/,aliases_rom_cart.s | 13 +- src/aliases/,aliases_rom_kernal.s | 84 +-- src/basic/,aliases.s | 13 - src/basic/,basic_aliases.s | 39 ++ src/basic/,imports.s | 78 +-- src/basic/,stubs/a408.reason.s | 13 +- src/basic/,stubs/a453.unknown.s | 12 +- src/basic/,stubs/a483.main.s | 26 +- src/basic/,stubs/a57c.chrnch.s | 27 +- src/basic/,stubs/a644.new.s | 13 +- src/basic/,stubs/a659.setcharptr.s | 17 +- src/basic/,stubs/a71a.qplop.s | 27 +- src/basic/,stubs/a7e4.gone.s | 27 +- src/basic/,stubs/ae86.eval.s | 27 +- src/basic/,stubs/basic_adray1.s | 11 +- src/basic/,stubs/basic_adray2.s | 11 +- src/basic/,stubs/e38b.error.s | 25 +- src/basic/,stubs/e3bf.init.s | 11 +- src/basic/,stubs/e453.rvect.s | 11 +- .../,stubs_math/a9c4.convert_FAC1_to_INT.s | 32 +- src/basic/,stubs_math/aabc.print_FAC1.s | 24 +- src/basic/,stubs_math/af7b.compute_TI.s | 24 +- src/basic/,stubs_math/af7e.math_stub.s | 24 +- src/basic/,stubs_math/af87.math_stub.s | 24 +- src/basic/,stubs_math/af9a.compute_ST.s | 24 +- src/basic/,stubs_math/b1aa.FACINX.s | 35 +- .../,stubs_math/b1bf.convert_FAC1_to_s16.s | 24 +- src/basic/,stubs_math/b391.GIVAYF.s | 35 +- .../,stubs_math/b3a2.convert_Y_to_FAC1.s | 28 +- .../,stubs_math/b794.convert_A_to_FAC1.s | 22 +- src/basic/,stubs_math/b7b5.STRVAL.s | 32 +- .../,stubs_math/b7f7.convert_FAC1_to_ADDR.s | 28 +- .../,stubs_math/b947.inv_FAC1_mantissa.s | 28 +- src/basic/,stubs_math/b9ea.log_FAC1.s | 31 +- .../,stubs_math/ba90.get_FAC2_via_INDEX.s | 24 +- .../,stubs_math/bba6.get_FAC1_via_INDEX.s | 24 +- src/basic/,stubs_math/bc39.sgn_FAC1.s | 34 +- .../,stubs_math/bc3c.convert_A_to_FAC1.s | 24 +- .../,stubs_math/bc44.convert_i16_to_FAC1.s | 22 +- src/basic/,stubs_math/bc58.abs_FAC1.s | 29 +- src/basic/,stubs_math/bc5b.FCOMP.s | 51 +- src/basic/,stubs_math/bc9b.QINT.s | 33 +- src/basic/,stubs_math/bccc.int_FAC1.s | 29 +- src/basic/,stubs_math/bcf3.FIN.s | 41 +- src/basic/,stubs_math/bd7e.FINLOG.s | 24 +- src/basic/,stubs_math/bddd.FOUT.s | 37 +- src/basic/,stubs_math/bf74.sqr_FAC2.s | 35 +- src/basic/,stubs_math/bf7b.pwr_FAC2_FAC1.s | 43 +- src/basic/,stubs_math/bfed.exp_FAC1.s | 31 +- src/basic/,stubs_math/e043.poly1_FAC1.s | 47 +- src/basic/,stubs_math/e059.poly2_FAC1.s | 47 +- src/basic/,stubs_math/e264.cos_FAC1.s | 27 +- src/basic/,stubs_math/e26b.sin_FAC1.s | 41 +- src/basic/,stubs_math/e2b4.tan_FAC1.s | 27 +- src/basic/,stubs_math/e30e.atn_FAC1.s | 27 +- src/basic/a68e.runc.s | 30 +- src/basic/a7ae.newstt.s | 30 +- src/basic/ab1e.strout.s | 34 +- src/basic/assets/basic_vector_defaults.s | 34 +- src/basic/assets/c000.skip_gap.s | 12 +- src/basic/assets/packed_as_1n.s | 10 +- src/basic/assets/packed_as_3n.s | 10 +- src/basic/assets/packed_dictionary.s | 15 +- src/basic/assets/packed_errors.s | 18 +- src/basic/assets/packed_keywords.s | 10 +- src/basic/assets/packed_keywords_01.s | 10 +- src/basic/assets/packed_keywords_02.s | 15 +- src/basic/assets/packed_keywords_03.s | 14 +- src/basic/assets/packed_misc.s | 19 +- src/basic/assets/startup_banner.s | 74 +-- src/basic/assets/startup_banner_m65.s | 119 ++-- src/basic/assets/str_rev_question.s | 10 +- src/basic/assets/table_ti_hi.s | 42 +- src/basic/assets/table_ti_lo.s | 42 +- src/basic/assets/table_ti_mid.s | 42 +- src/basic/basic_commands/cmd__jumptable.s | 144 ++--- src/basic/basic_commands/cmd__unimplemented.s | 58 +- src/basic/basic_commands/cmd_clr.s | 10 +- src/basic/basic_commands/cmd_dim.s | 8 +- src/basic/basic_commands/cmd_go_goto_run.s | 99 ++- src/basic/basic_commands/cmd_if.s | 29 +- src/basic/basic_commands/cmd_let.s | 8 +- src/basic/basic_commands/cmd_list.s | 31 +- src/basic/basic_commands/cmd_load_verify.s | 64 +- src/basic/basic_commands/cmd_new.s | 8 +- src/basic/basic_commands/cmd_print.s | 62 +- src/basic/basic_commands/cmd_rem.s | 10 +- src/basic/basic_commands/cmd_restore.s | 10 +- src/basic/basic_commands/cmd_save.s | 32 +- src/basic/basic_commands/cmd_stop_end.s | 14 +- src/basic/basic_commands/cmd_sys.s | 70 +- .../basic_commands/helper_if_mega65_38K.s | 37 +- .../basic_commands/helper_if_mega65_46K_50K.s | 42 +- .../basic_commands/helper_load_fetch_devnum.s | 18 +- .../helper_load_fetch_filename.s | 28 +- .../helper_load_fetch_secondary.s | 18 +- .../basic_commands/helper_load_init_param.s | 26 +- .../basic_commands/helper_load_setnam_any.s | 14 +- .../helper_print_string_46K_50K.s | 23 +- .../basic_commands_01/cmd__jumptable_01.s | 78 ++- src/basic/basic_commands_01/cmd_fast_slow.s | 43 +- src/basic/basic_commands_01/cmd_old.s | 14 +- .../basic_commands_02/cmd__jumptable_02.s | 56 +- .../basic_commands_02/cmd_bload_bverify.s | 32 +- src/basic/basic_commands_02/cmd_bsave.s | 26 +- src/basic/basic_commands_02/cmd_clear.s | 8 +- src/basic/basic_commands_02/cmd_cold.s | 19 +- src/basic/basic_commands_02/cmd_dispose.s | 8 +- src/basic/basic_commands_02/cmd_mem.s | 98 +-- src/basic/basic_commands_02/cmd_merge.s | 28 +- src/basic/basic_commands_02/cmd_sysinfo.s | 91 ++- .../basic_commands_02/helper_ask_if_sure.s | 62 +- .../helper_bload_fetch_address.s | 18 +- .../helper_bload_fetch_filename.s | 22 +- .../basic_commands_02/helper_mem_tab_str.s | 29 +- .../basic_commands_02/helper_mem_tab_x.s | 29 +- .../basic_commands_02/helper_mem_tab_y.s | 29 +- .../basic_commands_03_m65/cmd__jumptable_03.s | 20 +- src/basic/basic_functions/fun__jumptable.s | 98 ++- .../basic_functions/fun__unimplemented.s | 64 +- src/basic/basic_operators/oper__jumptable.s | 109 ++-- src/basic/basic_operators/oper_add.s | 83 ++- src/basic/basic_operators/oper_and.s | 8 +- src/basic/basic_operators/oper_cmp_eq.s | 8 +- src/basic/basic_operators/oper_cmp_gt.s | 8 +- src/basic/basic_operators/oper_cmp_gteq.s | 8 +- src/basic/basic_operators/oper_cmp_lt.s | 8 +- src/basic/basic_operators/oper_cmp_lteq.s | 8 +- src/basic/basic_operators/oper_cmp_neq.s | 8 +- src/basic/basic_operators/oper_div.s | 8 +- src/basic/basic_operators/oper_mul.s | 8 +- src/basic/basic_operators/oper_or.s | 8 +- src/basic/basic_operators/oper_pow.s | 8 +- src/basic/basic_operators/oper_sub.s | 8 +- src/basic/basic_operators/oper_unary_minus.s | 8 +- src/basic/basic_operators/oper_unary_not.s | 8 +- src/basic/bdcd.linprt.s | 22 +- .../board_m65/4000.mega65_vectable_basic_1.s | 90 +-- src/basic/board_m65/mega65_imports.s | 91 ++- src/basic/board_m65/mega65_map_helpers.s | 18 +- src/basic/board_m65/mega65_proxies.s | 82 +-- src/basic/board_x16/cx16_dummy.s | 6 +- src/basic/board_x16/cx16_stubs.s | 6 +- src/basic/engine_editor/a533.linkprg.s | 100 +-- src/basic/engine_editor/delete_line.s | 71 +- src/basic/engine_editor/find_line_38K_60K.s | 61 +- src/basic/engine_editor/find_line_46K_50K.s | 58 +- src/basic/engine_editor/insert_line.s | 78 +-- src/basic/engine_editor/shell.s | 140 ++-- src/basic/engine_editor/shift_txt_down.s | 20 +- src/basic/engine_editor/shift_txt_up.s | 27 +- src/basic/engine_editor/tk_cut_away.s | 34 +- src/basic/engine_editor/tk_pack.s | 161 +++-- src/basic/engine_editor/tk_search.s | 58 +- src/basic/engine_editor/tk_shorten.s | 72 +-- src/basic/engine_editor/tokenise_line.s | 143 ++-- .../engine_editor/update_vartab_do_clr.s | 30 +- src/basic/engine_runtime/ad9e.frmevl.jmp.s | 10 +- src/basic/engine_runtime/check_stack_space.s | 14 +- .../engine_runtime/convert_PETSCII_to_digit.s | 12 +- src/basic/engine_runtime/do_error.s | 214 +++--- src/basic/engine_runtime/do_new_clr_restore.s | 67 +- src/basic/engine_runtime/end_of_statement.s | 22 +- .../engine_runtime/execute_line_statements.s | 196 +++--- src/basic/engine_runtime/fetch_line_number.s | 22 +- src/basic/engine_runtime/fetch_operator.s | 90 +-- src/basic/engine_runtime/fetch_uint16.s | 54 +- src/basic/engine_runtime/fetch_uint8.s | 28 +- .../engine_runtime/follow_link_to_next_line.s | 24 +- src/basic/engine_runtime/frmevl.s | 285 ++++---- .../helper_frmevl_strdesccpy_46K_50K.s | 27 +- src/basic/engine_runtime/init_oldtxt.s | 6 +- src/basic/engine_runtime/injest_assign.s | 16 +- src/basic/engine_runtime/injest_comma.s | 22 +- src/basic/engine_runtime/is_alphanumeric.s | 22 +- .../engine_runtime/is_end_of_statement.s | 34 +- .../is_line_pointer_null_38K_60K.s | 33 +- .../is_line_pointer_null_46K_50K.s | 23 +- .../engine_runtime/prepare_direct_execution.s | 34 +- .../engine_runtime/unconsume_character.s | 17 +- src/basic/engine_variables/array_create.s | 163 +++-- src/basic/engine_variables/assign_variable.s | 303 +++++---- .../assign_variable_TI_string.s | 40 +- src/basic/engine_variables/fetch_variable.s | 107 ++- .../engine_variables/fetch_variable_ST.s | 8 +- .../engine_variables/fetch_variable_TI.s | 8 +- .../fetch_variable_TI_string.s | 49 +- .../engine_variables/fetch_variable_arr.s | 88 ++- .../engine_variables/fetch_variable_name.s | 82 +-- src/basic/engine_variables/find_array.s | 52 +- .../find_array_next_46K_50K.s | 23 +- .../helper_array_check_no_dims_46K_50K.s | 19 +- .../helper_array_create_checkmem.s | 34 +- .../helper_array_create_mul.s | 42 +- .../helper_array_fetch_dimension_46K_50K.s | 19 +- .../helper_array_refresh_bptrs.s | 81 ++- ...helper_array_refresh_bptrs_part1_46K_50K.s | 38 +- ...helper_array_refresh_bptrs_part2_46K_50K.s | 22 +- .../engine_variables/helper_cmp_fretop.s | 22 +- .../helper_cmp_varnam_38K_60K.s | 27 +- .../helper_cmp_varnam_46K_50K.s | 23 +- .../engine_variables/helper_fetch_arr_coord.s | 30 +- src/basic/engine_variables/helper_fretop.s | 26 +- src/basic/engine_variables/helper_fretop_up.s | 18 +- .../helper_gc_fetch_backpointer_46K_50K.s | 19 +- .../engine_variables/helper_gc_misc_46K_50K.s | 29 +- .../helper_index_up_a_38K_60K.s | 23 +- .../helper_index_up_a_46K_50K.s | 25 +- .../helper_strconcat_46K_50K.s | 37 +- .../engine_variables/helper_strdesccpy_38K.s | 17 +- .../helper_strdesccpy_46K_50K.s | 25 +- .../engine_variables/helper_strdesccpy_60K.s | 17 +- .../engine_variables/helper_strvarcpy_38K.s | 25 +- .../helper_strvarcpy_46K_50K.s | 31 +- .../engine_variables/helper_strvarcpy_60K.s | 25 +- .../engine_variables/helper_txtptr_down.s | 18 +- .../engine_variables/helper_varpnt_up_A.s | 18 +- src/basic/engine_variables/is_var_ST.s | 16 +- src/basic/engine_variables/is_var_TI.s | 16 +- src/basic/engine_variables/is_var_TI_string.s | 16 +- src/basic/engine_variables/tmpstr_alloc.s | 42 +- src/basic/engine_variables/tmpstr_free.s | 55 +- src/basic/engine_variables/tmpstr_free_all.s | 26 +- src/basic/engine_variables/varstr_alloc.s | 107 ++- src/basic/engine_variables/varstr_free.s | 83 ++- .../engine_variables/varstr_garbage_collect.s | 168 +++-- src/basic/init/a000.cold_start_vector.s | 12 +- src/basic/init/a002.warm_start_vector.s | 12 +- src/basic/init/basic_cold_start_internal.s | 36 +- src/basic/init/basic_warm_start_internal.s | 26 +- src/basic/init/e394.basic_cold_start.s | 29 +- src/basic/init/e3b7.basic_warm_start.jmp.s | 8 +- src/basic/init/e422.initmsg.jmp.s | 39 +- src/basic/init/initmsg_bytes_free.s | 64 +- src/basic/init/initmsg_m65.s | 30 +- src/basic/init/initmsg_real.s | 60 +- src/basic/math/add_FAC2_FAC1_sub.s | 50 +- src/basic/math/add_align_exponents.s | 54 +- src/basic/math/b849.add_HALF_FAC1.s | 18 +- src/basic/math/b850.sub_MEM_FAC1.s | 34 +- src/basic/math/b853.sub_FAC2_FAC1.s | 30 +- src/basic/math/b862.add_align_exponent.jmp.s | 10 +- src/basic/math/b867.add_MEM_FAC1.s | 34 +- src/basic/math/b86a.add_FAC2_FAC1.s | 62 +- src/basic/math/b8fe.normal_FAC1.jmp.s | 10 +- src/basic/math/ba28.mul_MEM_FAC1.jmp.s | 40 +- src/basic/math/ba2b.mul_FAC2_FAC1.s | 10 +- src/basic/math/ba8c.mov_MEM_FAC2.jmp.s | 10 +- src/basic/math/bae2.mul10_FAC1.s | 34 +- src/basic/math/bafe.div10_FAC1_p.s | 32 +- src/basic/math/bb0f.div_MEM_FAC1.s | 34 +- src/basic/math/bb12.div_FAC2_FAC1.s | 74 +-- src/basic/math/bc1b.round_FAC1.jmp.s | 10 +- src/basic/math/bc2b.sgn_FAC1_A.s | 36 +- src/basic/math/bf71.sqr_FAC1.s | 32 +- src/basic/math/bf78.pwr_FAC2_MEM.s | 36 +- src/basic/math/bfb4.toggle_sign_FAC1.s | 34 +- src/basic/math/div_FAC1_denorm.s | 38 +- src/basic/math/div_mantissas.s | 42 +- src/basic/math/e097.rnd_FAC1.s | 26 +- src/basic/math/e09a.rnd_A.s | 34 +- src/basic/math/e0be.rnd_generate.s | 36 +- src/basic/math/mul10_FAC1_mul2.s | 16 +- src/basic/math/mul_FAC2_FAC1.s | 110 ++-- src/basic/math/mul_FAC2_FAC1_8x8.s | 85 ++- src/basic/math/mul_FAC2_FAC1_shift.s | 34 +- src/basic/math/muldiv_RESHO_helpers.s | 16 +- src/basic/math/normal_FAC1.s | 64 +- src/basic/math/rnd_seed_from_FAC1.s | 14 +- src/basic/math/rnd_seed_init.s | 36 +- src/basic/math/round_FAC1.s | 40 +- src/basic/math_consts/aea8.const_PI.s | 20 +- src/basic/math_consts/b1a5.const_NEG_32768.s | 20 +- src/basic/math_consts/b9bc.const_ONE.s | 20 +- src/basic/math_consts/b9d6.const_INV_SQR_2.s | 18 +- src/basic/math_consts/b9db.const_SQR_2.s | 18 +- src/basic/math_consts/b9e0.const_NEG_HALF.s | 18 +- src/basic/math_consts/b9e5.const_LOG_2.s | 18 +- src/basic/math_consts/baf9.const_TEN.s | 20 +- src/basic/math_consts/bf11.const_HALF.s | 20 +- src/basic/math_consts/bfbf.const_INV_LOG_2.s | 18 +- src/basic/math_consts/bfe8.const_ONE.s | 18 +- src/basic/math_consts/e2e0.const_HALF_PI.s | 16 +- src/basic/math_consts/e2e5.const_DOUBLE_PI.s | 16 +- src/basic/math_consts/e2ea.const_QUARTER.s | 16 +- src/basic/math_consts/e309.const_DOUBLE_PI.s | 16 +- src/basic/math_mov/bba2.mov_MEM_FAC1.jmp.s | 10 +- src/basic/math_mov/bbc7.mov_r_FAC1_TMP2.s | 10 +- src/basic/math_mov/bbca.mov_r_FAC1_TMP1.s | 10 +- src/basic/math_mov/bbd0.mov_r_FAC1_VAR.s | 28 +- src/basic/math_mov/bbd4.mov_r_FAC1_MEM.s | 38 +- src/basic/math_mov/bbfc.mov_FAC2_FAC1.s | 10 +- src/basic/math_mov/bc0c.mov_r_FAC1_FAC2.s | 34 +- src/basic/math_mov/bc0f.mov_FAC1_FAC2.jmp.s | 10 +- src/basic/math_mov/mov_FAC1_FAC2.s | 54 +- src/basic/math_mov/mov_FAC1_MEM.s | 56 +- src/basic/math_mov/mov_FAC2_FAC1.s | 44 +- src/basic/math_mov/mov_MEM_FAC1.s | 68 +- src/basic/math_mov/mov_MEM_FAC2.s | 70 +- src/basic/math_mov/mov_r_FAC1_TMP1.s | 20 +- src/basic/math_mov/mov_r_FAC1_TMP2.s | 20 +- src/basic/memory/fetch_character.s | 49 +- .../memory/fetch_character_skip_spaces.s | 23 +- src/basic/memory/shift_mem_adapt_pointers.s | 26 +- src/basic/memory/shift_mem_aliases.s | 9 - src/basic/memory/shift_mem_down.s | 55 +- src/basic/memory/shift_mem_up.s | 55 +- src/basic/memory/under_rom_60k.s | 62 +- .../memory/under_rom_peek_fetch_46k_50k.s | 69 +- src/basic/memory/under_rom_shift_46k_50k.s | 56 +- src/basic/print/list_single_line.s | 192 +++--- src/basic/print/print_features.s | 24 +- src/basic/print/print_integer.s | 42 +- src/basic/print/print_integer_compare.s | 16 +- src/basic/print/print_integer_tab_hi.s | 22 +- src/basic/print/print_integer_tab_lo.s | 22 +- src/basic/print/print_packed_dict_string.s | 42 +- src/basic/print/print_packed_freq_string.s | 119 ++-- src/basic/print/print_packed_search.s | 26 +- src/basic/rom_revision/a004.identifier.s | 27 +- .../rom_revision/bf52.rom_revision_basic.s | 44 +- .../rom_revision/e4b7.rom_revision_kernal.s | 62 +- src/basic/wedge/wedge_dos.s | 214 +++--- src/basic/wedge/wedge_tape.s | 41 +- src/basic/wedge/wedge_tape_prepare_load.s | 53 +- src/dos_m65/,aliases_dos.s | 29 +- src/dos_m65/4000.dos_vectable.s | 24 +- src/dos_m65/dos_chkunit.s | 22 +- src/dos_m65/dos_init.s | 20 +- src/dos_m65/dos_setunit.s | 18 +- src/dos_m65/stubs.s | 18 +- src/kernal/,disabled/,aliases_ultimate64.s | 30 +- src/kernal/,disabled/u64_load.s | 60 +- src/kernal/,stubs/e6b6.advance_cursor.s | 10 +- src/kernal/,stubs/e701.previous_line.s | 10 +- src/kernal/,stubs/e716.chrout_screen.s | 10 +- src/kernal/,stubs/e96c.insert_line_at_top.s | 10 +- src/kernal/,stubs/f3f6.unknown.s | 10 +- src/kernal/,stubs/f646.iec_close.s | 10 +- src/kernal/,stubs/fd90.unknown.s | 10 +- src/kernal/assets/cartridge_signature.s | 10 +- src/kernal/assets/e8da.colour_codes.s | 13 +- src/kernal/assets/fd30.vector_defaults.s | 51 +- src/kernal/assets/filename_any.s | 8 +- src/kernal/assets/irq_timing_hi.s | 65 +- src/kernal/assets/irq_timing_lo.s | 65 +- src/kernal/assets/kernal_messages.s | 121 ++-- src/kernal/assets/programmable_keys.s | 207 +++--- .../board_m65/4000.mega65_vectable_kernal_1.s | 106 ++- src/kernal/board_m65/mega65_dmagic.s | 93 +-- src/kernal/board_m65/mega65_imports.s | 148 ++--- src/kernal/board_m65/mega65_load_autoswitch.s | 26 +- src/kernal/board_m65/mega65_map_helpers.s | 40 +- src/kernal/board_m65/mega65_native_meminit.s | 14 +- src/kernal/board_m65/mega65_proxies.s | 39 +- src/kernal/board_m65/mega65_redirect_api.s | 42 +- src/kernal/board_m65/mega65_redirect_screen.s | 30 +- src/kernal/board_m65/mega65_redirect_tape.s | 54 +- src/kernal/board_m65/mega65_reset_part.s | 22 +- .../board_m65/mega65_tape_normal_byte_store.s | 16 +- src/kernal/board_m65/mega65_viciv_init.s | 30 +- src/kernal/board_m65/mega65_viciv_shutdown.s | 24 +- src/kernal/board_m65/mega65_viciv_unhide.s | 10 +- src/kernal/board_x16/cx16_dummy.s | 6 +- src/kernal/board_x16/cx16_stubs.s | 30 +- src/kernal/errors.s | 58 +- src/kernal/extapi_m65/mega65__jumptable.s | 20 +- src/kernal/extapi_m65/mega65_modeget.s | 24 +- src/kernal/extapi_m65/mega65_modeset.s | 38 +- src/kernal/extapi_m65/mega65_slow_fast.s | 12 +- src/kernal/iec/acptr.s | 46 +- src/kernal/iec/chkin_iec.s | 26 +- src/kernal/iec/chrin_iec.s | 14 +- src/kernal/iec/chrout_iec.s | 14 +- src/kernal/iec/ciout.s | 53 +- src/kernal/iec/ckout_iec.s | 26 +- src/kernal/iec/close_iec.s | 33 +- src/kernal/iec/clrchn_iec.s | 30 +- src/kernal/iec/iec_check_devnum.s | 38 +- src/kernal/iec/iec_close_load.s | 22 +- src/kernal/iec/iec_cmd_close.s | 34 +- src/kernal/iec/iec_cmd_open.s | 83 ++- src/kernal/iec/iec_pull_release.s | 70 +- src/kernal/iec/iec_return.s | 50 +- src/kernal/iec/iec_rx_byte.s | 157 +++-- src/kernal/iec/iec_rx_check_eoi.s | 45 +- src/kernal/iec/iec_send_file_name.s | 40 +- src/kernal/iec/iec_set_idle.s | 17 +- src/kernal/iec/iec_turnaround_to_listen.s | 46 +- src/kernal/iec/iec_turnaround_to_talk.s | 32 +- src/kernal/iec/iec_tx_byte.s | 142 ++-- src/kernal/iec/iec_tx_command.s | 55 +- src/kernal/iec/iec_tx_command_finalize.s | 26 +- src/kernal/iec/iec_tx_flush.s | 26 +- src/kernal/iec/iec_update_eal_by_y.s | 24 +- src/kernal/iec/iec_wait1ms.s | 44 +- src/kernal/iec/iec_wait20us.s | 41 +- src/kernal/iec/iec_wait60us.s | 49 +- src/kernal/iec/iec_wait_for_clk_release.s | 12 +- src/kernal/iec/iec_wait_for_data_pull.s | 16 +- src/kernal/iec/iec_wait_for_data_release.s | 15 +- src/kernal/iec/listen.s | 58 +- src/kernal/iec/load_iec.s | 149 +++-- src/kernal/iec/open_iec.s | 38 +- src/kernal/iec/save_iec.s | 93 +-- src/kernal/iec/second.s | 48 +- src/kernal/iec/talk.s | 70 +- src/kernal/iec/tksa.s | 46 +- src/kernal/iec/unlsn.s | 59 +- src/kernal/iec/untlk.s | 75 ++- src/kernal/iec_fast/burst_cia1_advertise.s | 38 +- src/kernal/iec_fast/burst_cia2_advertise.s | 60 +- src/kernal/iec_fast/burst_m65_advertise.s | 30 +- src/kernal/iec_fast/dolphindos_detect.s | 52 +- src/kernal/iec_fast/dolphindos_load.s | 101 ++- src/kernal/iec_fast/jiffydos_bittable.s | 63 +- src/kernal/iec_fast/jiffydos_detect.s | 60 +- src/kernal/iec_fast/jiffydos_load.s | 145 ++--- src/kernal/iec_fast/jiffydos_prepare.s | 28 +- src/kernal/iec_fast/jiffydos_rx_byte.s | 104 ++- src/kernal/iec_fast/jiffydos_tx_byte.s | 92 ++- src/kernal/iec_fast/jiffydos_wait_line.s | 40 +- src/kernal/iec_fast/m65dos_bridge.s | 106 +-- src/kernal/iec_fast/m65dos_check.s | 14 +- src/kernal/iec_fast/m65dos_detect.s | 18 +- src/kernal/init/cartridge_check.s | 16 +- src/kernal/init/cint_screen_keyboard.s | 65 +- src/kernal/init/e518.cint_legacy.s | 47 +- src/kernal/init/e5a0.vicii_init.s | 73 ++- src/kernal/init/fce2.hw_entry_reset.s | 82 ++- src/kernal/init/fd50.ramtas.s | 106 +-- src/kernal/init/fda3.ioinit.s | 187 +++--- src/kernal/init/ff5b.cint.s | 22 +- src/kernal/init/fffc.vector_reset.s | 12 +- src/kernal/init/setup_pal_ntsc.s | 52 +- .../interrupts/ea31.default_irq_handler.s | 58 +- .../ea7e.ack_cia1_return_from_interrupt.s | 20 +- .../interrupts/ea81.return_from_interrupt.s | 30 +- .../interrupts/fe47.default_nmi_handler.s | 41 +- .../interrupts/fe66.default_brk_handler.s | 39 +- src/kernal/interrupts/fffa.vector_nmi.s | 12 +- src/kernal/interrupts/fffe.vector_irq.s | 14 +- src/kernal/interrupts/hw_entry_irq.s | 51 +- src/kernal/interrupts/hw_entry_nmi.s | 25 +- src/kernal/interrupts/nmi_lock.s | 54 +- src/kernal/iostack/chkinout.s | 16 +- src/kernal/iostack/clall_real.s | 48 +- src/kernal/iostack/e50a.plot.s | 32 +- src/kernal/iostack/f13e.getin.s | 22 +- src/kernal/iostack/f157.chrin.s | 60 +- src/kernal/iostack/f1ca.chrout.s | 82 +-- src/kernal/iostack/f20e.chkin.s | 67 +- src/kernal/iostack/f250.ckout.s | 62 +- src/kernal/iostack/f291.close.s | 56 +- src/kernal/iostack/f32f.clall.jmp.s | 10 +- src/kernal/iostack/f333.clrchn.s | 36 +- src/kernal/iostack/f34a.open.s | 68 +- src/kernal/iostack/f49e.load_prep.s | 32 +- src/kernal/iostack/f4a5.load.s | 80 ++- src/kernal/iostack/f5dd.save_prep.s | 30 +- src/kernal/iostack/f5ed.save.s | 40 +- src/kernal/iostack/findfls.s | 18 +- src/kernal/iostack/getin_real.s | 37 +- src/kernal/iostack/load_save_common.s | 135 ++-- src/kernal/iostack/pop_keyboard_buffer.s | 23 +- src/kernal/iostack/readst.s | 40 +- src/kernal/iostack/seldev.s | 24 +- src/kernal/iostack/setfls.s | 26 +- src/kernal/iostack/setmsg.s | 22 +- src/kernal/iostack/setnam.s | 26 +- src/kernal/iostack/settmo.s | 22 +- src/kernal/jumptable/ff81.jcint.s | 10 +- src/kernal/jumptable/ff84.jioinit.s | 10 +- src/kernal/jumptable/ff87.jramtas.s | 10 +- src/kernal/jumptable/ff8a.jrestor.s | 10 +- src/kernal/jumptable/ff8d.jvector.s | 10 +- src/kernal/jumptable/ff90.jsetmsg.s | 10 +- src/kernal/jumptable/ff93.jsecond.s | 10 +- src/kernal/jumptable/ff96.jtksa.s | 10 +- src/kernal/jumptable/ff99.jmemtop.s | 10 +- src/kernal/jumptable/ff9c.jmembot.s | 10 +- src/kernal/jumptable/ff9f.jscnkey.s | 10 +- src/kernal/jumptable/ffa2.jsettmo.s | 10 +- src/kernal/jumptable/ffa5.jacptr.s | 10 +- src/kernal/jumptable/ffa8.jciout.s | 10 +- src/kernal/jumptable/ffab.juntlk.s | 10 +- src/kernal/jumptable/ffae.junlsn.s | 10 +- src/kernal/jumptable/ffb1.jlisten.s | 10 +- src/kernal/jumptable/ffb4.jtalk.s | 10 +- src/kernal/jumptable/ffb7.jreadst.s | 10 +- src/kernal/jumptable/ffba.jsetfls.s | 10 +- src/kernal/jumptable/ffbd.jsetnam.s | 10 +- src/kernal/jumptable/ffc0.jopen.s | 12 +- src/kernal/jumptable/ffc3.jclose.s | 12 +- src/kernal/jumptable/ffc6.jchkin.s | 12 +- src/kernal/jumptable/ffc9.jckout.s | 12 +- src/kernal/jumptable/ffcc.jclrchn.s | 12 +- src/kernal/jumptable/ffcf.jchrin.s | 12 +- src/kernal/jumptable/ffd2.jchrout.s | 12 +- src/kernal/jumptable/ffd5.jload.s | 10 +- src/kernal/jumptable/ffd8.jsave.s | 10 +- src/kernal/jumptable/ffdb.jsettim.s | 10 +- src/kernal/jumptable/ffde.jrdtim.s | 10 +- src/kernal/jumptable/ffe1.jstop.s | 12 +- src/kernal/jumptable/ffe4.jgetin.s | 12 +- src/kernal/jumptable/ffe7.jclall.s | 12 +- src/kernal/jumptable/ffea.judtim.s | 10 +- src/kernal/jumptable/ffed.jscreen.s | 10 +- src/kernal/jumptable/fff0.jplot.s | 14 +- src/kernal/jumptable/fff3.jiobase.s | 40 +- src/kernal/keyboard/f142.getin_keyboard.s | 30 +- src/kernal/keyboard/f6ed.stop.s | 32 +- src/kernal/keyboard/kb_matrix.s | 102 +-- src/kernal/keyboard/kb_matrix_128.s | 39 +- src/kernal/keyboard/kb_matrix_65.s | 26 +- src/kernal/keyboard/kb_matrix_alwaysrepeat.s | 32 +- src/kernal/keyboard/kb_matrix_bucky.s | 128 ++-- src/kernal/keyboard/kb_matrix_bucky_filter.s | 44 +- src/kernal/keyboard/kb_matrix_joy.s | 50 +- src/kernal/keyboard/kb_matrix_lookup.s | 41 +- src/kernal/keyboard/kb_matrix_lookup_legacy.s | 49 +- src/kernal/keyboard/kb_matrix_row_keys.s | 47 +- src/kernal/keyboard/kb_matrix_row_offsets.s | 37 +- src/kernal/keyboard/keyboard_disconnect.s | 28 +- src/kernal/keyboard/scnkey.s | 406 ++++++------ src/kernal/keyboard/scnkey_128.s | 58 +- src/kernal/keyboard/scnkey_65.s | 58 +- src/kernal/keyboard/scnkey_legacy.s | 346 +++++----- src/kernal/keyboard/scnkey_set_keytab.s | 80 +-- src/kernal/keyboard/scnkey_via_keylog.s | 15 +- src/kernal/memory/fd15.restor.s | 30 +- src/kernal/memory/fe25.memtop.s | 26 +- src/kernal/memory/membot.s | 24 +- src/kernal/memory/under_rom_46k_50k.s | 39 +- src/kernal/memory/under_rom_60k.s | 31 +- src/kernal/memory/vector_real.s | 38 +- src/kernal/panic.s | 58 +- src/kernal/print/print_hex_byte.s | 31 +- src/kernal/print/print_kernal_message.s | 17 +- src/kernal/print/print_return.s | 14 +- src/kernal/print/print_space.s | 14 +- src/kernal/print/printf.s | 85 ++- .../rom_revision/ff80.kernal_revision.s | 127 ++-- src/kernal/rs232/chkin_rs232_up2400.s | 18 +- src/kernal/rs232/chkin_rs232_up9600.s | 44 +- src/kernal/rs232/chrin_rs232_up2400.s | 18 +- src/kernal/rs232/chrin_rs232_up9600.s | 36 +- src/kernal/rs232/chrout_rs232.s | 18 +- src/kernal/rs232/ckout_rs232_up2400.s | 18 +- src/kernal/rs232/ckout_rs232_up9600.s | 20 +- src/kernal/rs232/close_rs232.s | 34 +- src/kernal/rs232/getin_rs232.s | 19 +- src/kernal/rs232/open_rs232.s | 41 +- src/kernal/rs232/rs232_count_channels.s | 27 +- src/kernal/rs232/up9600_disable.s | 36 +- src/kernal/rs232/up9600_enable.s | 82 ++- src/kernal/rs232/up9600_irq.s | 30 +- src/kernal/rs232/up9600_nmi.s | 54 +- src/kernal/rs232/up9600_rsin.s | 38 +- src/kernal/rs232/up9600_rsout.s | 44 +- src/kernal/screen/chrin_keyboard.s | 90 ++- src/kernal/screen/chrin_programmable_keys.s | 46 +- src/kernal/screen/chrout_screen.s | 67 +- src/kernal/screen/chrout_screen_clr.s | 14 +- src/kernal/screen/chrout_screen_control.s | 40 +- src/kernal/screen/chrout_screen_crsr.s | 34 +- src/kernal/screen/chrout_screen_del.s | 62 +- src/kernal/screen/chrout_screen_gfxtxt.s | 26 +- src/kernal/screen/chrout_screen_home.s | 14 +- src/kernal/screen/chrout_screen_ins.s | 64 +- .../screen/chrout_screen_jumptable_codes.s | 167 +++-- src/kernal/screen/chrout_screen_quote.s | 30 +- src/kernal/screen/chrout_screen_return.s | 26 +- src/kernal/screen/chrout_screen_rvs.s | 18 +- src/kernal/screen/chrout_screen_shift_onoff.s | 22 +- src/kernal/screen/chrout_screen_stop.s | 20 +- src/kernal/screen/chrout_screen_tab.s | 27 +- src/kernal/screen/chrout_to_screen_code.s | 52 +- src/kernal/screen/cursor.s | 64 +- src/kernal/screen/cursor_enable.s | 16 +- src/kernal/screen/cursor_show.s | 33 +- src/kernal/screen/e544.clear_screen.s | 43 +- src/kernal/screen/e566.cursor_home.s | 24 +- .../screen/e56c.screen_calculate_pointers.s | 29 +- src/kernal/screen/e8ea.screen_scroll_up.s | 76 ++- src/kernal/screen/e9ff.screen_clear_line.s | 46 +- src/kernal/screen/screen.s | 49 +- .../screen/screen_advance_to_next_line.s | 18 +- src/kernal/screen/screen_calculate_pnt_user.s | 34 +- .../screen/screen_calculate_pntr_lnmx.s | 34 +- .../screen/screen_check_space_ends_line.s | 8 +- src/kernal/screen/screen_check_toggle_quote.s | 20 +- src/kernal/screen/screen_code_to_petscii.s | 50 +- src/kernal/screen/screen_get_cliped_pntr.s | 18 +- .../screen/screen_get_logical_line_end_ptr.s | 16 +- src/kernal/screen/screen_grow_logical_line.s | 76 +-- src/kernal/screen/screen_off.s | 39 +- src/kernal/screen/screen_on.s | 23 +- src/kernal/screen/screen_preserve_sal_eal.s | 32 +- src/kernal/screen/screen_restore_sal_eal.s | 26 +- src/kernal/screen_m65/mega65_chrin_keyboard.s | 81 ++- src/kernal/screen_m65/mega65_chrout_screen.s | 168 ++--- .../screen_m65/mega65_chrout_screen_control.s | 42 +- .../mega65_chrout_screen_control_1.s | 36 +- .../mega65_chrout_screen_control_2.s | 88 +-- .../mega65_chrout_screen_control_del.s | 51 +- src/kernal/screen_m65/mega65_clrscr.s | 32 +- src/kernal/screen_m65/mega65_clrwin.s | 62 +- src/kernal/screen_m65/mega65_cursor.s | 46 +- src/kernal/screen_m65/mega65_cursor_blink.s | 66 +- src/kernal/screen_m65/mega65_screen_helpers.s | 20 +- .../screen_m65/mega65_screen_helpers_K0.s | 24 +- .../screen_m65/mega65_screen_helpers_irq.s | 6 +- .../mega65_screen_helpers_scrlpnt.s | 16 +- src/kernal/screen_m65/mega65_screen_quote.s | 27 +- .../screen_m65/mega65_screen_table_height.s | 12 +- .../screen_m65/mega65_screen_table_width.s | 12 +- .../screen_m65/mega65_screen_tables_misc.s | 172 +++-- src/kernal/screen_m65/mega65_scrmodeget.s | 12 +- src/kernal/screen_m65/mega65_scrmodeset.s | 68 +- src/kernal/screen_m65/mega65_setwin.s | 6 +- src/kernal/status.s | 36 +- src/kernal/tape/load_tape_normal.s | 161 +++-- src/kernal/tape/load_tape_turbo.s | 148 +++-- src/kernal/tape/tape_common.s | 208 +++--- src/kernal/tape/tape_common_autodetect.s | 92 ++- src/kernal/tape/tape_common_clean_sid.s | 30 +- src/kernal/tape/tape_common_ditch_verify.s | 22 +- src/kernal/tape/tape_common_get_pulse.s | 42 +- src/kernal/tape/tape_common_motor.s | 26 +- src/kernal/tape/tape_common_prepare_cia.s | 95 ++- src/kernal/tape/tape_common_screen.s | 46 +- src/kernal/tape/tape_head_align.s | 176 ++--- src/kernal/tape/tape_head_align_gen_code.s | 67 +- src/kernal/tape/tape_head_align_get_pulse.s | 46 +- src/kernal/tape/tape_head_align_help.s | 103 ++- src/kernal/tape/tape_head_align_irq.s | 50 +- src/kernal/tape/tape_normal_calibrate.s | 70 +- src/kernal/tape/tape_normal_get_bit.s | 34 +- src/kernal/tape/tape_normal_get_byte.s | 52 +- src/kernal/tape/tape_normal_get_data_1.s | 68 +- src/kernal/tape/tape_normal_get_data_2.s | 76 ++- src/kernal/tape/tape_normal_get_marker.s | 44 +- src/kernal/tape/tape_normal_get_pilot.s | 92 ++- src/kernal/tape/tape_normal_sync.s | 30 +- src/kernal/tape/tape_normal_update_checksum.s | 18 +- src/kernal/tape/tape_turbo_bytestore.s | 68 +- src/kernal/tape/tape_turbo_get_bit.s | 40 +- src/kernal/tape/tape_turbo_get_byte.s | 54 +- src/kernal/tape/tape_turbo_sync.s | 67 +- src/kernal/tape/tape_turbo_sync_first.s | 33 +- src/kernal/time/rdtim.s | 34 +- src/kernal/time/settim.s | 34 +- src/kernal/time/udtim.s | 119 ++-- .../program_traces/BASIC2.trace | 0 {src => testsuite}/program_traces/README.md | 0 tools/build_segment.cc | 237 +++++-- tools/generate_constants.cc | 2 +- tools/generate_strings.cc | 68 +- 685 files changed, 15835 insertions(+), 16296 deletions(-) delete mode 100644 assembler/KickAss.cfg delete mode 100644 assembler/KickAss.jar delete mode 100644 assembler/KickAssembler.pdf delete mode 100644 assembler/LICENSE create mode 160000 assembler/acme delete mode 100644 src/basic/,aliases.s create mode 100644 src/basic/,basic_aliases.s delete mode 100644 src/basic/memory/shift_mem_aliases.s rename {src => testsuite}/program_traces/BASIC2.trace (100%) rename {src => testsuite}/program_traces/README.md (100%) diff --git a/.gitignore b/.gitignore index 1f3eaccc..58427e72 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ build/* # Various IDE project files, temporary files, etc. dump.mem +vgcore* *project .*swp *.log diff --git a/.gitmodules b/.gitmodules index e69de29b..1ea12891 100644 --- a/.gitmodules +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "assembler/acme"] + path = assembler/acme + url = https://github.com/MEGA65/acme diff --git a/CONFIG.md b/CONFIG.md index 88b6b7c9..3b096f4a 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -13,7 +13,7 @@ Just edit them and recompile the project. To enable particular option - uncommen Note however, that features do not came for free - enabling them needs some additional ROM space (in BASIC segment, in KERNAL segment, or in both), which is VERY limited on the target machines. Some options might be unavailable for speecific targets - read the comments in the configuration files. Some options might also carry compatibility and/or performance hit - so choose wisely. -## Hardware platform and brand +## Hardware platform ### `CONFIG_PLATFORM_COMMODORE_64` @@ -25,13 +25,17 @@ Since Open ROMs is highly modular, it should be possible to add other platforms * 8KB ROM area `$A000`-`$BFFF` * 8KB ROM area `$E000`-`$FFFF` -### `CONFIG_MB_MEGA_65`, `CONFIG_MB_ULTIMATE_64` +### `CONFIG_MB_M65`, `CONFIG_MB_U64` -Select if the ROM is going to be used exclusively on the specific motherboard. It prevents from enabling options not having sense, skips initialization of C128-only registers, etc. +Select if the ROM is going to be used exclusively on the specified motherboard. It prevents from enabling options not having sense, skips initialization of C128-only registers, and enables motherboard-specific features. + +## Brand + +Branding is only allowed for C64 platform, if no motherboard is specified. ### `CONFIG_BRAND_CUSTOM` -Intended for custom builds, which are not to be redistributed. Allows to configure branding with `CONFIG_CUSTOM_BRAND` varaible +Intended for custom builds, for private purposes. Allows to configure branding with `CONFIG_CUSTOM_BRAND` macro. ### `CONFIG_BRAND_GENERIC` @@ -41,12 +45,10 @@ If you don't know which variant to choose - select this one. Use this one for any kind of testing/experimental build. -### `CONFIG_BRAND_MEGA_65`, `CONFIG_BRAND_ULTIMATE_64` - -Select if you are using appropriate motherboard. - ## Processor instruction set +Processor type should be set only for C64 platform, if no motherboard is specified. Otherwise, it will be selected automatically. Setting proper CPU allows to enable various size/performance optimizations. + ### `CONFIG_CPU_MOS_6502` Choose if your CPU only supports the original MOS Technology 6502 instruction set, like: @@ -57,35 +59,20 @@ Choose if your CPU only supports the original MOS Technology 6502 instruction se If unsure - select this one. +### `CONFIG_CPU_DTV_6502` + +Choose if your CPU only supports extended C64 DTV instruction set. + +### `CONFIG_CPU_RCW_65C02` + +Choose if your CPU supports the Rockwell 65C02 instruction set. + ### `CONFIG_CPU_WDC_65C02` Choose if your CPU supports the Western Design Center 65C02 instruction set, like: * WDC 65C02 - used in the Turbo Master accelerator -It enables some speed/size code optimizations. - -### `CONFIG_CPU_CSG_65CE02` - -Choose if your CPU supports the Commodore Semiconductor Group 65CE02 instruction set, like: - -* CSG 65CE02 -* CSG 4510 - microcontroller used in the Commodore 65 prototypes - -It enables some speed/size code optimizations. - -### `CONFIG_CPU_CSG_4510` - -Choose if your CPU supports the Commodore Semiconductor Group 4510 instruction set, like: - -* CSG 4510 - microcontroller used in the Commodore 65 prototypes - -It enables some speed/size code optimizations and allows C65 memory mapping to work. - -### `CONFIG_CPU_M65_45GS02` - -Choose if you have a MEGA65 FPGA board. It enables some speed/size code optimizations and allows MEGA65 memory mapping to work. - ### `CONFIG_CPU_WDC_65816` Choose if your CPU supports the 16-bit Western Design Center 65816 instruction set, like: @@ -93,7 +80,12 @@ Choose if your CPU supports the 16-bit Western Design Center 65816 instruction s * WDC 65C816 - used in the Flash 8 accelerator * WDC 65C816S - used in the SuperCPU accelerator -It enables some speed/size code optimizations. +### `CONFIG_CPU_CSG_65CE02` + +Choose if your CPU supports the Commodore Semiconductor Group 65CE02 instruction set, like: + +* CSG 65CE02 +* CSG 4510 - microcontroller used in the Commodore 65 prototypes ## Memory model @@ -115,7 +107,9 @@ It is currently not compatible with MEGA65 extended ROMs. Comparing to standard memory model, it needs about 180 bytes in BASIC segment and 80 bytes in KERNAL segment - at the moment of doing the test, these values are expected to change often. -## IEC devices +## IEC bus + +IEC bus, also known as Serial Port, is a standard interface to connect disk drives, printers, SD2IEC device, etc. ### `CONFIG_IEC` @@ -145,7 +139,7 @@ Needs about 430 bytes in KERNAL segment. If unsure - enable. Causes screen blanking during JiffyDOS file loading to increase performance. -## Tape support +## Tape deck Note: for MEGA65 most of the tape support code is placed in it's extended ROM; very little of the (tiny) KERNAL segment is used. @@ -175,15 +169,15 @@ Enable this option if you are using a tape interface adapter with some audio sig Enable this option if you are using a tape interface adapter lacking tape motor control (most likely every adapter currently being sold) - this will eliminate the need to quickly press space when the program header information gets displayed. Note: if you are using a cassette player with REM port, and your adapter is connected to this port too, than you do not need this option. -## Multiple SID support +## Sound support -The SID is a sound chip - the original Commodore 64 had one installed. However, mods exists to add more of them for improved sound capabilities. Emulators and FPGA machines typically allow to simulate more than one too. Unfortunately, there is no standard regarding how these additional chips are visible in the processor address space, and there is no sane way to detect it - thus, it has to be configurable. +The original Commodore 64 had one SID sound chip installed. However, mods exists to add more of them for improved sound capabilities. Emulators and FPGA machines typically allow to simulate more than one too. Unfortunately, there is no standard regarding how these additional chips are visible in the processor address space, and there is no sane way to detect it - thus, it has to be configurable. The SID support in the ROM is very limited - it only disables the sound during startup or warm restart (when STOP+RESTORE is pressed or BRK assembler instruction is executed). -### `CONFIG_SID_2ND` and `CONFIG_SID_3RD` +### `CONFIG_SID_2ND_ADDRESS` and `CONFIG_SID_3RD_ADDRESS` -Each of them add support for one additional SID - addresses should be given in `CONFIG_SID_2ND_ADDRESS` and `CONFIG_SID_3RD_ADDRESS`, respectively. Do not use when `CONFIG_MB_MEGA_65` is selected - the motherboard support code already knows the SID locations. +Each of them add support for one additional SID - addresses should be given as parameter, respectively. Do not use when `CONFIG_MB_M65` is selected - the motherboard support code already knows the SID locations. Each of these options needs 3 bytes in KERNAL segment. @@ -191,7 +185,7 @@ Each of these options needs 3 bytes in KERNAL segment. Cause the system to support SIDs in `$D4xx` and `$D5xx` ranges, respectively. -Each of them needs a couple of bytes in KERNAL segment - but they can share some code, and `$D4xx` range support replaces the standard `$D400` address handling, so exact amount depends on the exact configuration. Do not use when `CONFIG_MB_MEGA_65` is selected - the motherboard support code already knows the SID locations. +Each of them needs a couple of bytes in KERNAL segment - but they can share some code, and `$D4xx` range support replaces the standard `$D400` address handling, so exact amount depends on the exact configuration. Do not use when `CONFIG_MB_M65` is selected - the motherboard support code already knows the SID locations. ## Keyboard diff --git a/Makefile b/Makefile index 62da0476..171ef80f 100644 --- a/Makefile +++ b/Makefile @@ -64,9 +64,17 @@ SRC_DOS_M65 = $(foreach dir,$(SRCDIR_DOS_M65),$(wildcard $(dir)/*.s)) SRC_KERNAL = $(foreach dir,$(SRCDIR_KERNAL),$(wildcard $(dir)/*.s)) SRC_TOOLS = $(wildcard tools/*.c,tools/*.cc) +DIR_ACME = assembler/acme/src +HDR_ACME = $(filter-out $(wildcard $(DIR_ACME)/_*.h),$(wildcard $(DIR_ACME)/*.h)) +SRC_ACME = $(DIR_ACME)/acme.c $(DIR_ACME)/platform.c $(DIR_ACME)/alu.c $(DIR_ACME)/typesystem.c \ + $(DIR_ACME)/cliargs.c $(DIR_ACME)/global.c $(DIR_ACME)/output.c $(DIR_ACME)/flow.c \ + $(DIR_ACME)/macro.c $(DIR_ACME)/cpu.c $(DIR_ACME)/encoding.c $(DIR_ACME)/pseudoopcodes.c \ + $(DIR_ACME)/dynabuf.c $(DIR_ACME)/mnemo.c $(DIR_ACME)/input.c $(DIR_ACME)/section.c \ + $(DIR_ACME)/symbol.c $(DIR_ACME)/tree.c + # Generated files -GEN_BASIC = build/,generated/float_constants.s +GEN_BASIC = build/,generated/,float_constants.s GEN_KERNAL = # List of build directories @@ -89,12 +97,12 @@ CFG_X16 = src/,,config_cx16.s # List of files with generated strings -GEN_STR_CUS = $(DIR_CUS)/,generated/packed_strings.s -GEN_STR_GEN = $(DIR_GEN)/,generated/packed_strings.s -GEN_STR_TST = $(DIR_TST)/,generated/packed_strings.s -GEN_STR_M65 = $(DIR_M65)/,generated/packed_strings.s -GEN_STR_U64 = $(DIR_U64)/,generated/packed_strings.s -GEN_STR_X16 = $(DIR_X16)/,generated/packed_strings.s +GEN_STR_CUS = $(DIR_CUS)/,generated/,packed_strings.s +GEN_STR_GEN = $(DIR_GEN)/,generated/,packed_strings.s +GEN_STR_TST = $(DIR_TST)/,generated/,packed_strings.s +GEN_STR_M65 = $(DIR_M65)/,generated/,packed_strings.s +GEN_STR_U64 = $(DIR_U64)/,generated/,packed_strings.s +GEN_STR_X16 = $(DIR_X16)/,generated/,packed_strings.s # Dependencies - helper variables @@ -104,7 +112,6 @@ DEP_KERNAL = $(SRC_KERNAL) $(SRCDIR_KERNAL) $(GEN_KERNAL) # List of tools -TOOL_COLLECT_DATA = build/tools/collect_data TOOL_GENERATE_CONSTANTS = build/tools/generate_constants TOOL_GENERATE_STRINGS = build/tools/generate_strings TOOL_PATCH_CHARGEN = build/tools/patch_chargen @@ -112,9 +119,16 @@ TOOL_PNGPREPARE = build/tools/pngprepare TOOL_BUILD_SEGMENT = build/tools/build_segment TOOL_RELEASE = build/tools/release TOOL_SIMILARITY = build/tools/similarity -TOOL_ASSEMBLER = assembler/KickAss.jar +TOOL_ASSEMBLER = build/tools/acme -TOOLS_LIST = $(pathsubst tools/%,build/tools/%,$(basename $(SRC_TOOLS))) +TOOLS_LIST = $(TOOL_GENERATE_CONSTANTS) \ + $(TOOL_GENERATE_STRINGS) \ + $(TOOL_PATCH_CHARGEN) \ + $(TOOL_PNGPREPARE) \ + $(TOOL_BUILD_SEGMENT) \ + $(TOOL_RELEASE) \ + $(TOOL_SIMILARITY) \ + $(TOOL_ASSEMBLER) # List of targets @@ -149,13 +163,13 @@ TARGET_LIST = build/chargen_openroms.rom \ SEG_LIST_M65 = $(DIR_M65)/basic.seg_0 \ $(DIR_M65)/basic.seg_1 \ $(DIR_M65)/dos.seg_1 \ - $(DIR_M65)/kernal.seg_0 \ - $(DIR_M65)/kernal.seg_1 + $(DIR_M65)/kernal.seg_0 \ + $(DIR_M65)/kernal.seg_1 SEG_LIST_X16 = $(DIR_X16)/basic.seg_0 \ $(DIR_X16)/basic.seg_1 \ - $(DIR_X16)/kernal.seg_0 \ - $(DIR_X16)/kernal.seg_1 + $(DIR_X16)/kernal.seg_0 \ + $(DIR_X16)/kernal.seg_1 REL_TARGET_LIST = $(TARGET_LIST_GEN) $(TARGET_M65_x) $(TARGET_M65_x_PXL) $(TARGET_LIST_U64) @@ -169,14 +183,18 @@ GIT_COMMIT:= $(shell git log -1 --pretty='%h' | tr '[:lower:]' '[:upper:]') # Rules - main XXX fast build does not always succeed, not yet clear, why -.PHONY: all fast clean updatebin +.PHONY: all clean updatebin all: + @echo + @echo --- Building tools --- + @echo + $(MAKE) -j64 --output-sync=target $(TOOLS_LIST) + @echo + @echo --- Building Open ROMs --- + @echo $(MAKE) $(TARGET_LIST) $(EXT_TARGET_LIST) -fast: - $(MAKE) -j64 --output-sync=target $(TARGET_LIST) $(EXT_TARGET_LIST) - clean: @rm -rf build src/basic/combined.s src/kernal/combined.s @@ -187,6 +205,15 @@ updatebin: # Rules - tools +$(DIR_ACME) $(SRC_ACME) $(HDR_ACME): + git submodule init + git submodule update + +$(TOOL_ASSEMBLER): $(DIR_ACME) $(SRC_ACME) $(HDR_ACME) + @mkdir -p build/tools + echo $(OUT_ACME) + $(CC) -o $(TOOL_ASSEMBLER) $(SRC_ACME) -lm -I./assembler/acme/src + $(TOOL_PNGPREPARE): tools/pngprepare.c @mkdir -p build/tools $(CC) -O2 -Wall -I/usr/local/include -L/usr/local/lib -o $@ $< -lpng @@ -303,9 +330,9 @@ $(GEN_STR_X16): $(TOOL_GENERATE_STRINGS) $(CFG_X16) @mkdir -p $(DIR_X16)/,generated $(TOOL_GENERATE_STRINGS) -o $@ -c $(CFG_X16) -build/,generated/float_constants.s: $(TOOL_GENERATE_CONSTANTS) +build/,generated/,float_constants.s: $(TOOL_GENERATE_CONSTANTS) @mkdir -p build/,generated - $(TOOL_GENERATE_CONSTANTS) -o build/,generated/float_constants.s + $(TOOL_GENERATE_CONSTANTS) -o build/,generated/,float_constants.s GEN_STR_custom = $(GEN_STR_CUS) GEN_STR_generic = $(GEN_STR_GEN) diff --git a/assembler/KickAss.cfg b/assembler/KickAss.cfg deleted file mode 100644 index 919ec309..00000000 --- a/assembler/KickAss.cfg +++ /dev/null @@ -1,3 +0,0 @@ -# These are the defaults - not needed for Open ROMs build system -# -showmem -# -symbolfile diff --git a/assembler/KickAss.jar b/assembler/KickAss.jar deleted file mode 100644 index 77fa9f23ad450bac410db55499c2e0fdba16eee7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 625876 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 z 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 z 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%0A23}aU;(LlheO+nLrKK_d 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⋘oA=^X42*{nSb!>ibogBzeprUWr#zTHt)1 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 U?Z!+BRbJnH|NYN@`TX5~0l 1) { !error "Please select at most one CONFIG_MB_* option" } + +!ifdef ROM_LAYOUT_M65 { !ifndef CONFIG_MB_M65 { !error "ROM layout requires CONFIG_MB_M65 option" } } +!ifdef ROM_LAYOUT_U16 { !ifndef CONFIG_MB_U64 { !error "ROM layout requires CONFIG_MB_U64 option" } } + +!ifdef CONFIG_MB_M65 { !ifndef ROM_LAYOUT_M65 { !error "CONFIG_MB_M65 can only be used with appropriate ROM layout" } } +; !ifdef CONFIG_MB_U64 { !ifndef ROM_LAYOUT_U64 { !error "CONFIG_MB_U64 can only be used with appropriate ROM layout" } } + +!ifdef CONFIG_MB_M65 { !ifndef CONFIG_PLATFORM_COMMODORE_64 { !error "CONFIG_MB_M65 can only be used with CONFIG_PLATFORM_COMMODORE_64" } } +!ifdef CONFIG_MB_U64 { !ifndef CONFIG_PLATFORM_COMMODORE_64 { !error "CONFIG_MB_U64 can only be used with CONFIG_PLATFORM_COMMODORE_64" } } + + + +; Check that brand configuration is correct + +!set counter = 0 +!ifdef CONFIG_BRAND_CUSTOM_BUILD { !set counter = counter + 1 } +!ifdef CONFIG_BRAND_GENERIC { !set counter = counter + 1 } +!ifdef CONFIG_BRAND_TESTING { !set counter = counter + 1 } + +!ifndef CONFIG_PLATFORM_COMMODORE_64 { + !if (counter != 0) { !error "Do not use CONFIG_BRAND_* options for non-C64 platforms" } +} else ifdef CONFIG_MB_M65 { + !if (counter != 0) { !error "Do not use CONFIG_BRAND_* options for the MEGA65 motherboard" } +} else ifdef CONFIG_MB_U64 { + !if (counter != 0) { !error "Do not use CONFIG_BRAND_* options for the Ultimate 64 motherboard" } +} else if (counter != 1) { + !error "Please select exactly one CONFIG_BRAND_* option" } -// Check that motherboard extras configuration is correct -{ - .var selected = 0; +; Check that processor configuration is correct -#if CONFIG_MB_MEGA_65 - .eval selected++ -#endif -#if CONFIG_MB_ULTIMATE_64 - .eval selected++ -#endif +!set counter = 0 +!ifdef CONFIG_CPU_MOS_6502 { !set counter = counter + 1 } +!ifdef CONFIG_CPU_DTV_6502 { !set counter = counter + 1 } +!ifdef CONFIG_CPU_RCW_65C02 { !set counter = counter + 1 } +!ifdef CONFIG_CPU_WDC_65C02 { !set counter = counter + 1 } +!ifdef CONFIG_CPU_WDC_65816 { !set counter = counter + 1 } +!ifdef CONFIG_CPU_CSG_65CE02 { !set counter = counter + 1 } - .if (selected > 1) .error "Please select at most one CONFIG_MB_* option" - -#if !CONFIG_PLATFORM_COMMODORE_64 && CONFIG_BRAND_MEGA_65 && - .error "CONFIG_BRAND_MEGA_65 can only be used with CONFIG_PLATFORM_COMMODORE_64" -#endif -#if !CONFIG_PLATFORM_COMMODORE_64 && CONFIG_BRAND_ULTIMATE_64 && - .error "CONFIG_BRAND_ULTIMATE_64 can only be used with CONFIG_PLATFORM_COMMODORE_64" -#endif - -#if CONFIG_MB_MEGA_65 && (CONFIG_SID_2ND || CONFIG_SID_3RD || CONFIG_SID_D4XX || CONFIG_SID_D5XX) - .error "CONFIG_MB_MEGA_65 cannot be used with CONFIG_SID_*" -#endif +!ifdef CONFIG_PLATFORM_COMMANDER_X16 { + !if (counter != 0) { !error "Do not use CONFIG_CPU_* options for Commander X16 platform" } +} else ifdef CONFIG_MB_M65 { + !if (counter != 0) { !error "Do not use CONFIG_CPU_* options for MEGA65 motherboard" } +} else ifdef CONFIG_MB_U64 { + !if (counter != 0) { !error "Do not use CONFIG_CPU_* options for Ultimate 64 motherboard" } +} else if (counter != 1) { + !error "Please select exactly one CONFIG_CPU_* option" } -// Check that brand configuration is correct -{ - .var selected = 0; +; Check that memory model configuration is correct -#if CONFIG_BRAND_CUSTOM_BUILD - .eval selected++ -#endif -#if CONFIG_BRAND_GENERIC - .eval selected++ -#endif -#if CONFIG_BRAND_TESTING - .eval selected++ -#endif -#if CONFIG_BRAND_ULTIMATE_64 - .eval selected++ -#endif +!set counter = 0 +!ifdef CONFIG_MEMORY_MODEL_38K { !set counter = counter + 1 } +!ifdef CONFIG_MEMORY_MODEL_46K { !set counter = counter + 1 } +!ifdef CONFIG_MEMORY_MODEL_50K { !set counter = counter + 1 } +!ifdef CONFIG_MEMORY_MODEL_60K { !set counter = counter + 1 } -#if !CONFIG_MB_MEGA_65 - .if (selected != 1) .error "Please select exactly one CONFIG_BRAND_* option" -#endif -#if CONFIG_MB_MEGA_65 - .if (selected != 0) .error "Do not use CONFIG_BRAND_* options for MEGA65" -#endif - -#if CONFIG_MB_MEGA_65 && CONFIG_SHOW_FEATURES - .if (selected != 0) .error "Do not use CONFIG_SHOW_FEATURES options for MEGA65" -#endif - -#if CONFIG_MB_ULTIMATE_64 && !(CONFIG_BRAND_ULTIMATE_64 || CONFIG_BRAND_TESTING || CONFIG_BRAND_CUSTOM_BUILD) - .error "Please select brand either matching the CONFIG_MB_*, or a testing/custom one" -#endif +!ifdef CONFIG_MB_M65 { + !ifdef CONFIG_MEMORY_MODEL_60K { !error "Do not use CONFIG_MEMORY_MODEL_60K options for MEGA65 motherboard" } +} +!ifdef CONFIG_PLATFORM_COMMANDER_X16 { + !ifndef CONFIG_MEMORY_MODEL_38K { !error "Select CONFIG_MEMORY_MODEL_38K options for Commander X16 platform" } +} +!if (counter != 1) { + !error "Please select exactly one CONFIG_MEMORY_MODEL_* option" } -// Check that processor configuration is correct -{ - .var selected = 0; +; Check that IEC configuration is correct -#if CONFIG_CPU_MOS_6502 - .eval selected++ -#endif -#if CONFIG_CPU_WDC_65C02 - .eval selected++ -#endif -#if CONFIG_CPU_CSG_65CE02 - .eval selected++ -#endif -#if CONFIG_CPU_M65_45GS02 - .eval selected++ -#endif -#if CONFIG_CPU_WDC_65816 - .eval selected++ -#endif - - .if (selected != 1) .error "Please select exactly one CONFIG_CPU_* option" +!ifdef CONFIG_PLATFORM_COMMANDER_X16 { + !ifdef CONFIG_IEC { !error "Do not use CONFIG_IEC options for Commander X16 platform, it is not implemented" } +} +!ifdef CONFIG_MB_MEGA65 { + !ifdef CONFIG_IEC_BURST_CIA1 { !error "Do not use CONFIG_IEC_BURST_CIA1 options for MEGA65 motherboard, CONFIG_IEC_BURST_M65 instead" } + !ifdef CONFIG_IEC_BURST_CIA2 { !error "Do not use CONFIG_IEC_BURST_CIA2 options for MEGA65 motherboard, CONFIG_IEC_BURST_M65 instead" } +} +!ifndef CONFIG_MB_MEGA65 { + !ifdef CONFIG_IEC_BURST_M65 { !error "CONFIG_IEC_BURST_M65 is only possible for MEGA65 motherboard" } +} +!ifdef CONFIG_IEC_BURST_CIA1 { + !ifndef CONFIG_IEC { !error "CONFIG_IEC_BURST_CIA1 requires CONFIG_IEC" } +} +!ifdef CONFIG_IEC_BURST_CIA2 { + !ifndef CONFIG_IEC { !error "CONFIG_IEC_BURST_CIA2 requires CONFIG_IEC" } +} +!ifdef CONFIG_IEC_BURST_CIA1 { + !ifdef CONFIG_IEC_BURST_CIA2 { !error "CONFIG_IEC_BURST_CIA1 and CONFIG_IEC_BURST_CIA2 are mutually exclusive" } +} +!ifdef CONFIG_IEC_BURST_M65 { + !ifndef CONFIG_IEC { !error "CONFIG_IEC_BURST_M65 requires CONFIG_IEC" } +} +!ifdef CONFIG_IEC_DOLPHINDOS { + !ifndef CONFIG_IEC { !error "CONFIG_IEC_DOLPHINDOS requires CONFIG_IEC" } +} +!ifdef CONFIG_IEC_DOLPHINDOS_FAST { + !ifndef CONFIG_IEC_DOLPHINDOS { !error "CONFIG_IEC_DOLPHINDOS_FAST requires CONFIG_IEC_DOLPHINDOS" } +} +!ifdef CONFIG_IEC_JIFFYDOS { + !ifndef CONFIG_IEC { !error "CONFIG_IEC_JIFFYDOS requires CONFIG_IEC" } +} +!ifdef CONFIG_IEC_JIFFYDOS_BLANK { + !ifndef CONFIG_IEC_JIFFYDOS { !error "CONFIG_IEC_JIFFYDOS_BLANK requires CONFIG_IEC_JIFFYDOS" } } -// Check that memory model and ROM layout configurations is correct -{ -#if ROM_LAYOUT_M65 && !CONFIG_CPU_M65_45GS02 - .error "MEGA65 ROM layout requires CONFIG_CPU_M65_45GS02" -#endif -#if ROM_LAYOUT_M65 && !CONFIG_MB_MEGA_65 - .error "MEGA65 ROM layout requires CONFIG_MB_MEGA_65" -#endif +; Check that tape deck configuration is correct - .var selected = 0; +!set counter = 0 +!ifdef CONFIG_TAPE_NORMAL { !set counter = counter + 1 } +!ifdef CONFIG_TAPE_TURBO { !set counter = counter + 1 } -#if CONFIG_MEMORY_MODEL_38K - .eval selected++ -#endif -#if CONFIG_MEMORY_MODEL_46K - .eval selected++ -#endif -#if CONFIG_MEMORY_MODEL_50K - .eval selected++ -#endif -#if CONFIG_MEMORY_MODEL_60K - .eval selected++ -#endif - - .if (selected != 1) .error "Please select exactly one CONFIG_MEMORY_MODEL_* option" +!ifdef CONFIG_PLATFORM_COMMANDER_X16 { + !ifdef CONFIG_TAPE_NORMAL { !error "Do not use CONFIG_TAPE_NORMAL options for Commander X16 platform, it is not implemented" } + !ifdef CONFIG_TAPE_TURBO { !error "Do not use CONFIG_TAPE_TURBO options for Commander X16 platform, it is not implemented" } +} +!ifdef CONFIG_TAPE_AUTODETECT { !ifndef CONFIG_TAPE_NORMAL { !ifndef CONFIG_TAPE_TURBO { + !error "CONFIG_TAPE_AUTODETECT requires both CONFIG_TAPE_NORMAL and CONFIG_TAPE_TURBO" +} } } +!ifdef CONFIG_TAPE_HEAD_ALIGN { + !ifndef CONFIG_TAPE_WEDGE { !error "CONFIG_TAPE_HEAD_ALIGN requires CONFIG_TAPE_WEDGE" } +} +!ifdef CONFIG_TAPE_WEDGE { + !if (counter = 0) { !error "CONFIG_TAPE_WEDGE requires CONFIG_TAPE_TURBO or CONFIG_TAPE_NORMAL"} } -// Check that IEC configuration is correct -{ -#if CONFIG_IEC_JIFFYDOS && !CONFIG_IEC - .error "CONFIG_IEC_JIFFYDOS requires CONFIG_IEC" -#endif +; Check that RS-232 configuration is correct -#if CONFIG_IEC_JIFFYDOS_BLANK && !CONFIG_IEC_JIFFYDOS - .error "CONFIG_IEC_JIFFYDOS_BLANK requires CONFIG_IEC_JIFFYDOS" -#endif +!set counter = 0 +!ifdef CONFIG_RS232_ACIA { !set counter = counter + 1 } +!ifdef CONFIG_RS232_UP2400 { !set counter = counter + 1 } +!ifdef CONFIG_RS232_UP9600 { !set counter = counter + 1 } -#if CONFIG_IEC_DOLPHINDOS && !CONFIG_IEC - .error "CONFIG_IEC_DOLPHINDOS requires CONFIG_IEC" -#endif +!ifdef CONFIG_PLATFORM_COMMANDER_X16 { + !if (counter != 0) { !error "Do not use CONFIG_RS232_* options for Commander X16 platform, it is not implemented" } +} +!ifdef CONFIG_RS232_UP9600 { + !ifdef CONFIG_TAPE_NORMAL { !error "CONFIG_RS232_UP9600 is not compatible with CONFIG_TAPE_NORMAL" } + !ifdef CONFIG_TAPE_TURBO { !error "CONFIG_RS232_UP9600 is not compatible with CONFIG_TAPE_TURBO" } +} +!if (counter > 1) { !error "Please select at most one CONFIG_RS232_* option" } -#if CONFIG_IEC_DOLPHINDOS_FAST && !CONFIG_IEC_DOLPHINDOS - .error "CONFIG_IEC_DOLPHINDOS_FAST requires CONFIG_IEC_DOLPHINDOS" -#endif -#if (CONFIG_IEC_BURST_CIA1 || CONFIG_IEC_BURST_CIA1 || CONFIG_IEC_BURST_MEGA_65) && !CONFIG_IEC - .error "CONFIG_IEC_BURST_* requires CONFIG_IEC" -#endif -#if CONFIG_IEC_BURST_MEGA_65 && !CONFIG_MB_MEGA_65 - .error "CONFIG_IEC_BURST_MEGA_65 requires CONFIG_MB_MEGA_65" -#endif +; Check that sound support configuration is correct - .var selected_iec_burst = 0; +!set counter = 0 +!ifdef CONFIG_SID_2ND_ADDRESS { !set counter = counter + 1 } +!ifdef CONFIG_SID_3RD_ADDRESS { !set counter = counter + 1 } +!ifdef CONFIG_SID_D4XX { !set counter = counter + 1 } +!ifdef CONFIG_SID_D5XX { !set counter = counter + 1 } -#if CONFIG_IEC_BURST_CIA1 - .eval selected_iec_burst++ -#endif -#if CONFIG_IEC_BURST_CIA2 - .eval selected_iec_burst++ -#endif -#if CONFIG_IEC_BURST_MEGA_65 - .eval selected_iec_burst++ -#endif +!ifdef CONFIG_PLATFORM_COMMANDER_X16 { + !if (counter != 0) { !error "Do not use CONFIG_SID_* options for Commander X16 platform" } +} +!ifdef CONFIG_MB_M65 { + !if (counter != 0) { !error "Do not use CONFIG_SID_* options for MEGA65 motherboard" } +} +!ifdef CONFIG_SID_2ND_ADDRESS { + !if (CONFIG_SID_2ND_ADDRESS = $D400) { !error "CONFIG_SID_2ND_ADDRESS points to the 1st SID" } +} +!ifdef CONFIG_SID_3RD_ADDRESS { + !if (CONFIG_SID_3RD_ADDRESS = $D400) { !error "CONFIG_SID_3RD_ADDRESS points to the 1st SID" } +} +!ifdef CONFIG_SID_2ND_ADDRESS { !ifdef CONFIG_SID_3RD_ADDRESS { + !if (CONFIG_SID_2ND_ADDRESS = CONFIG_SID_3RD_ADDRESS) { !error "Configured SIDs have the same addresses" } +} } - .if (selected_iec_burst > 1) .error "Please select at most one CONFIG_IEC_BURST_* option" + + +; Check that keyboard settings are correct + +!ifdef CONFIG_LEGACY_SCNKEY { + !ifdef CONFIG_RS232_UP2400 { !error "CONFIG_LEGACY_SCNKEY is not compatible with CONFIG_RS232_UP2400" } + !ifdef CONFIG_RS232_UP9600 { !error "CONFIG_LEGACY_SCNKEY is not compatible with CONFIG_RS232_UP9600" } + !ifdef CONFIG_TAPE_NORMAL { !error "CONFIG_LEGACY_SCNKEY is not compatible with CONFIG_TAPE_NORMAL" } + !ifdef CONFIG_KEYBOARD_C128 { !error "CONFIG_LEGACY_SCNKEY is not compatible with CONFIG_KEYBOARD_C128" } + !ifdef CONFIG_KEYBOARD_C128_CAPS_LOCK { !error "CONFIG_LEGACY_SCNKEY is not compatible with CONFIG_KEYBOARD_C128_CAPS_LOCK" } + !ifdef CONFIG_KEYBOARD_C65 { !error "CONFIG_LEGACY_SCNKEY is not compatible with CONFIG_KEYBOARD_C65" } + !ifdef CONFIG_KEYBOARD_C65_CAPS_LOCK { !error "CONFIG_LEGACY_SCNKEY is not compatible with CONFIG_KEYBOARD_C65_CAPS_LOCK" } +} +!ifdef CONFIG_MB_M65 { + !ifdef CONFIG_KEYBOARD_C128 { !error "MEGA65 motherboard is not compatible with CONFIG_KEYBOARD_C128" } + !ifdef CONFIG_KEYBOARD_C128_CAPS_LOCK { !error "MEGA65 motherboard is not compatible with CONFIG_KEYBOARD_C128_CAPS_LOCK" } + !ifdef CONFIG_LEGACY_SCNKEY { !error "MEGA65 motherboard is not compatible with CONFIG_LEGACY_SCNKEY" } +} +!ifdef CONFIG_MB_U64 { + !ifdef CONFIG_KEYBOARD_C128 { !error "Ultimate 64 motherboard is not compatible with CONFIG_KEYBOARD_C128" } + !ifdef CONFIG_KEYBOARD_C128_CAPS_LOCK { !error "Ultimate 64 motherboard is not compatible with CONFIG_KEYBOARD_C128_CAPS_LOCK" } + !ifdef CONFIG_KEYBOARD_C65 { !error "Ultimate 64 motherboard is not compatible with CONFIG_KEYBOARD_C65" } + !ifdef CONFIG_KEYBOARD_C65_CAPS_LOCK { !error "Ultimate 64 motherboard is not compatible with CONFIG_KEYBOARD_C65_CAPS_LOCK" } } -// Check that tape configuration is correct -{ -#if (!CONFIG_TAPE_NORMAL || !CONFIG_TAPE_TURBO) && CONFIG_TAPE_AUTODETECT - .error "CONFIG_TAPE_AUTODETECT requires both CONFIG_TAPE_NORMAL and CONFIG_TAPE_TURBO" -#endif +; Check that startup banner configuration is correct + +!set counter = 0 +!ifdef CONFIG_BANNER_SIMPLE { !set counter = counter + 1 } +!ifdef CONFIG_BANNER_FANCY { !set counter = counter + 1 } + +!ifdef CONFIG_MB_M65 { + !if (counter > 0) { !error "Do not use CONFIG_BANNER_* options for MEGA65" } + !ifdef CONFIG_COLORS_BRAND { !errror "Do not use CONFIG_COLORS_BRAND options for MEGA65" } + !ifdef CONFIG_SHOW_FEATURES { !errror "Do not use CONFIG_SHOW_FEATURES options for MEGA65" } +} else { + !if (counter != 1) { !error "Please select exactly one CONFIG_BANNER_* option" } } -// Check that RS-232 configuration is correct -{ -#if CONFIG_RS232_UP9600 && (CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO) - .error "CONFIG_RS232_UP9600 is not compatible with CONFIG_TAPE_*" -#endif +; +; Define some macros depending on the configuration +; - .var selected_rs232 = 0; -#if CONFIG_RS232_UP2400 - .eval selected_rs232++ -#endif -#if CONFIG_RS232_UP9600 - .eval selected_rs232++ -#endif - .if (selected_rs232 > 1) .error "Please select at most one CONFIG_RS232_* option" +; Handle CPU configuration + +!ifdef CONFIG_BCD_SAFE_INTERRUPTS { !set HAS_BCD_SAFE_INTERRUPTS = 1 } + +!ifdef CONFIG_CPU_MOS_6502 { + !cpu 6502 +} +!ifdef CONFIG_CPU_DTV_6502 { + !cpu c64dtv2 + !set HAS_OPCODE_BRA = 1 + ; XXX +} +!ifdef CONFIG_CPU_RCW_65C02 { + !cpu r65c02 + !set HAS_BCD_SAFE_INTERRUPTS = 1 + !set HAS_OPCODE_BRA = 1 + !set HAS_OPCODES_65C02 = 1 +} +!ifdef CONFIG_PLATFORM_COMMANDER_X16 { + !cpu w65c02 + !set HAS_BCD_SAFE_INTERRUPTS = 1 + !set HAS_OPCODE_BRA = 1 + !set HAS_OPCODES_65C02 = 1 +} +!ifdef CONFIG_CPU_WDC_65C02 { + !cpu w65c02 + !set HAS_BCD_SAFE_INTERRUPTS = 1 + !set HAS_OPCODE_BRA = 1 + !set HAS_OPCODES_65C02 = 1 +} +!ifdef CONFIG_CPU_WDC_65816 { + !cpu 65816 + !set HAS_BCD_SAFE_INTERRUPTS = 1 + !set HAS_OPCODE_BRA = 1 + !set HAS_OPCODES_65C02 = 1 + !set HAS_OPCODES_65816 = 1 +} +!ifdef CONFIG_CPU_CSG_65CE02 { + !cpu 65ce02 + !set HAS_BCD_SAFE_INTERRUPTS = 1 + !set HAS_OPCODE_BRA = 1 + !set HAS_OPCODES_65C02 = 1 + !set HAS_OPCODES_65CE02 = 1 +} +!ifdef CONFIG_MB_M65 { + !cpu m65 + !set HAS_BCD_SAFE_INTERRUPTS = 1 + !set HAS_OPCODE_BRA = 1 + !set HAS_OPCODES_65C02 = 1 + !set HAS_OPCODES_65CE02 = 1 } -// Check that startup banner configuration is correct -{ - .var selected = 0; +; Handle memory model -#if CONFIG_BANNER_SIMPLE - .eval selected++ -#endif -#if CONFIG_BANNER_FANCY - .eval selected++ -#endif - -#if !CONFIG_MB_MEGA_65 - .if (selected != 1) .error "Please select exactly one CONFIG_BANNER_* option" -#endif - -#if CONFIG_MB_MEGA_65 - .if (selected != 0) .error "Do not use CONFIG_BANNER_* options for MEGA65" -#endif - -#if CONFIG_MB_MEGA_65 && CONFIG_COLORS_BRAND - .error "Do not use CONFIG_COLORS_BRAND options for MEGA65" -#endif - -} +!ifdef CONFIG_MEMORY_MODEL_46K { !set CONFIG_MEMORY_MODEL_46K_OR_50K = 1 } +!ifdef CONFIG_MEMORY_MODEL_50K { !set CONFIG_MEMORY_MODEL_46K_OR_50K = 1 } -// Check if keyboard options are correct -.function CHECK_KEYCMD(keycmd) -{ - .if (keycmd.size() > 0) .return 1 - .return 0 -} -{ -#if CONFIG_LEGACY_SCNKEY && CONFIG_RS232_UP9600 - .error "CONFIG_LEGACY_SCNKEY is not compatible with CONFIG_RS232_UP9600" -#endif -#if CONFIG_LEGACY_SCNKEY && CONFIG_TAPE_NORMAL - .error "CONFIG_LEGACY_SCNKEY is not compatible with CONFIG_TAPE_NORMAL" -#endif -#if CONFIG_LEGACY_SCNKEY && (CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C128_CAPS_LOCK || CONFIG_KEYBOARD_C65 || CONFIG_KEYBOARD_C65_CAPS_LOCK) - .error "CONFIG_LEGACY_SCNKEY and CONFIG_KEYBOARD_C128* / CONFIG_KEYBOARD_C65* are mutually exclusive" -#endif +; Handle IEC configuration -#if (CONFIG_MB_MEGA_65 || CONFIG_MB_ULTIMATE_64) && (CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C128_CAPS_LOCK) - .error "Selected CONFIG_MB_* is not compatible with CONFIG_KEYBOARD_C128*" -#endif -#if CONFIG_MB_ULTIMATE_64 && (CONFIG_KEYBOARD_C65 || CONFIG_KEYBOARD_C65_CAPS_LOCK) - .error "Selected CONFIG_MB_* is not compatible with CONFIG_KEYBOARD_C65*" -#endif +!ifdef CONFIG_IEC_BURST_CIA1 { !set HAS_IEC_BURST = 1 } +!ifdef CONFIG_IEC_BURST_CIA2 { !set HAS_IEC_BURST = 1 } +!ifdef CONFIG_IEC_BURST_M65 { !set HAS_IEC_BURST = 1 } - .var num_pkeys_base = 0 - .var num_pkeys_ext1 = 0 - .var num_pkeys_ext2 = 0 - - .eval num_pkeys_base += CHECK_KEYCMD(CONFIG_KEYCMD_RUN) - - .eval num_pkeys_base += CHECK_KEYCMD(CONFIG_KEYCMD_F1) - .eval num_pkeys_base += CHECK_KEYCMD(CONFIG_KEYCMD_F2) - .eval num_pkeys_base += CHECK_KEYCMD(CONFIG_KEYCMD_F3) - .eval num_pkeys_base += CHECK_KEYCMD(CONFIG_KEYCMD_F4) - .eval num_pkeys_base += CHECK_KEYCMD(CONFIG_KEYCMD_F5) - .eval num_pkeys_base += CHECK_KEYCMD(CONFIG_KEYCMD_F6) - .eval num_pkeys_base += CHECK_KEYCMD(CONFIG_KEYCMD_F7) - .eval num_pkeys_base += CHECK_KEYCMD(CONFIG_KEYCMD_F8) - - .eval num_pkeys_ext1 += CHECK_KEYCMD(CONFIG_KEYCMD_HELP) - - .eval num_pkeys_ext2 += CHECK_KEYCMD(CONFIG_KEYCMD_F9) - .eval num_pkeys_ext2 += CHECK_KEYCMD(CONFIG_KEYCMD_F10) - .eval num_pkeys_ext2 += CHECK_KEYCMD(CONFIG_KEYCMD_F11) - .eval num_pkeys_ext2 += CHECK_KEYCMD(CONFIG_KEYCMD_F12) - .eval num_pkeys_ext2 += CHECK_KEYCMD(CONFIG_KEYCMD_F13) - .eval num_pkeys_ext2 += CHECK_KEYCMD(CONFIG_KEYCMD_F14) - - .var num_pkeys = num_pkeys_base -#if !CONFIG_LEGACY_SCNKEY && (CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65) - .eval num_pkeys += num_pkeys_ext1 -#endif -#if !CONFIG_LEGACY_SCNKEY && CONFIG_KEYBOARD_C65 - .eval num_pkeys += num_pkeys_ext2 -#endif - -#if CONFIG_PROGRAMMABLE_KEYS - .if (num_pkeys == 0) .error "CONFIG_PROGRAMMABLE_KEYS requires at least one defined key" -#endif -} +!ifdef CONFIG_IEC_JIFFYDOS { !set CONFIG_IEC_JIFFYDOS_OR_DOLPHINDOS = 1 } +!ifdef CONFIG_IEC_DOLPHINDOS { !set CONFIG_IEC_JIFFYDOS_OR_DOLPHINDOS = 1 } -// Check that features are configured correctly -{ -#if CONFIG_TAPE_WEDGE && !CONFIG_TAPE_TURBO && !CONFIG_TAPE_NORMAL - .error "CONFIG_TAPE_WEDGE requires CONFIG_TAPE_TURBO or CONFIG_TAPE_NORMAL" -#endif -#if !CONFIG_TAPE_WEDGE && CONFIG_TAPE_HEAD_ALIGN - .error "CONFIG_TAPE_HEAD_ALIGN requires CONFIG_TAPE_WEDGE" -#endif -} +; Handle tape configuration + +!ifdef CONFIG_TAPE_NORMAL { !set HAS_TAPE = 1 } +!ifdef CONFIG_TAPE_TURBO { !set HAS_TAPE = 1 } + +!ifdef CONFIG_TAPE_NORMAL { !set HAS_TAPE_OR_IEC = 1 } +!ifdef CONFIG_TAPE_TURBO { !set HAS_TAPE_OR_IEC = 1 } +!ifdef CONFIG_IEC { !set HAS_TAPE_OR_IEC = 1 } + +!ifdef CONFIG_DOS_WEDGE { !set HAS_WEDGE = 1 } +!ifdef CONFIG_TAPE_WEDGE { !set HAS_WEDGE = 1 } -// Handle I/O configuration +; Handle RS-232 configuration -#if CONFIG_RS232_UP2400 || CONFIG_RS232_UP9600 -#define HAS_RS232 -#endif +!ifdef CONFIG_RS232_ACIA { !set HAS_RS232 = 1 } +!ifdef CONFIG_RS232_UP2400 { !set HAS_RS232 = 1 } +!ifdef CONFIG_RS232_UP9600 { !set HAS_RS232 = 1 } -// Handle configuration of various features +; Handle sound configuration -#if CONFIG_BCD_SAFE_INTERRUPTS -#define HAS_BCD_SAFE_INTERRUPTS -#endif +!ifdef CONFIG_SID_D4XX { !set CONFIG_SID_D4XX_OR_D5XX = 1 } +!ifdef CONFIG_SID_D5XX { !set CONFIG_SID_D4XX_OR_D5XX = 1 } -// Handle configuration of debug infrastructure +; Handle keyboard configuration -.macro STUB_IMPLEMENTATION_RTS() { +!ifdef CONFIG_KEYBOARD_C128 { !set CONFIG_KEYBOARD_C128_OR_C65 = 1 } +!ifdef CONFIG_KEYBOARD_C65 { !set CONFIG_KEYBOARD_C128_OR_C65 = 1 } + +!ifdef CONFIG_KEYBOARD_C65 { !set CONFIG_KEYBOARD_C65_OR_CAPS_LOCK = 1 } +!ifdef CONFIG_KEYBOARD_C65_CAPS_LOCK { !set CONFIG_KEYBOARD_C65_OR_CAPS_LOCK = 1 } + +!ifdef CONFIG_KEYBOARD_C128_CAPS_LOCK { !set CONFIG_KEYBOARD_CAPS_LOCK = 1 } +!ifdef CONFIG_KEYBOARD_C65_CAPS_LOCK { !set CONFIG_KEYBOARD_CAPS_LOCK = 1 } + +!ifdef CONFIG_JOY1_CURSOR { !set CONFIG_JOY1_OR_JOY2_CURSOR = 1 } +!ifdef CONFIG_JOY2_CURSOR { !set CONFIG_JOY1_OR_JOY2_CURSOR = 1 } + + +; Handle debug configuration + +!macro STUB_IMPLEMENTATION_RTS { rts } -.macro STUB_IMPLEMENTATION_BRK() { - .break +!macro STUB_IMPLEMENTATION_BRK { + ; XXX set VICE breakpoint brk brk jmp *-2 } -.macro STUB_IMPLEMENTATION() -{ -#if CONFIG_DBG_STUBS_BRK - STUB_IMPLEMENTATION_BRK() -#else - STUB_IMPLEMENTATION_RTS() -#endif +!ifdef CONFIG_DBG_STUBS_BRK { + !macro STUB_IMPLEMENTATION { +STUB_IMPLEMENTATION_BRK } +} else { + !macro STUB_IMPLEMENTATION { +STUB_IMPLEMENTATION_RTS } } -// Setup colors +; Handle colors -#if CONFIG_COLORS_BRAND && CONFIG_BRAND_ULTIMATE_64 +!set CONFIG_COLOR_BG = $06 +!set CONFIG_COLOR_TXT = $01 - .const CONFIG_COLOR_BG = $00 - .const CONFIG_COLOR_TXT = $01 - -#else - - .const CONFIG_COLOR_BG = $06 - .const CONFIG_COLOR_TXT = $01 - -#endif +!ifdef CONFIG_COLORS_BRAND { + !ifdef CONFIG_MB_U64 { + !set CONFIG_COLOR_BG = $00 + !set CONFIG_COLOR_TXT = $01 + } +} -// Determine if we need space-savings in BASIC code -#if !ROM_LAYOUT_M65 -#define HAS_SMALL_BASIC -#endif +; Determine if we need space-savings in BASIC code + +!ifndef CONFIG_MB_M65 { + !set HAS_SMALL_BASIC = 1 +} + + + +; Defines for multi-segment ROMs + +!ifdef CONFIG_MB_M65 { + !ifdef SEGMENT_BASIC_0 { !set SEGMENT_M65_BASIC_0 = 1 } + !ifdef SEGMENT_BASIC_1 { !set SEGMENT_M65_BASIC_1 = 1 } + !ifdef SEGMENT_KERNAL_0 { !set SEGMENT_M65_KERNAL_0 = 1 } +} diff --git a/src/aliases/,aliases_cpu.s b/src/aliases/,aliases_cpu.s index 7ea9898c..faef48c8 100644 --- a/src/aliases/,aliases_cpu.s +++ b/src/aliases/,aliases_cpu.s @@ -1,546 +1,138 @@ -// -// Provide pseudocommands (and other goodies) to make CPU optimizations easier -// - -#if CONFIG_CPU_WDC_65C02 || CONFIG_CPU_CSG_65CE02 || CONFIG_CPU_CSG_4510 || CONFIG_CPU_M65_45GS02 || CONFIG_CPU_WDC_65816 - .cpu _65c02 - #define HAS_OPCODES_65C02 - #define HAS_BCD_SAFE_INTERRUPTS -#endif - -#if CONFIG_CPU_CSG_65CE02 || CONFIG_CPU_CSG_4510 || CONFIG_CPU_M65_45GS02 - #define HAS_OPCODES_65CE02 -#endif - -#if CONFIG_CPU_CSG_4510 || CONFIG_CPU_M65_45GS02 - #define HAS_OPCODES_4510 -#endif - -#if CONFIG_CPU_M65_45GS02 - #define HAS_OPCODES_45GS02 -#endif - -#if CONFIG_CPU_WDC_65816 - #define HAS_OPCODES_65816 -#endif +; +; Various macros - mainly for making CPU-specific optimizations easier +; -// -// These are not exactly for optimization - but to encourage proper usage of panic screen -// - -.pseudocommand panic code -{ - // If case no panic screen is used, we can skip providing error codes within Kernal -#if CONFIG_PANIC_SCREEN - lda code -#endif +!macro panic @code { + ; If case no panic screen is used, we can skip providing error codes within Kernal + !ifdef CONFIG_PANIC_SCREEN { lda #@code } jmp ($E4B7) } - - -// -// Macros for generating jumptables -// - - -.macro put_jumptable_lo(list) -{ - .for (var i = 0; i < list.size(); i++) - { - .byte mod((list.get(i) - 1), $100) - } +!macro skip_2_bytes_trash_nvz { + ; Trick to skip a 2-byte instruction + !byte $2C } -.macro put_jumptable_hi(list) -{ - .for (var i = 0; i < list.size(); i++) - { - .byte floor((list.get(i) - 1) / $100) - } -} - -#if HAS_OPCODES_65C02 - -.macro put_jumptable(list) -{ - .for (var i = 0; i < list.size(); i++) - { - .word list.get(i) - } -} - -#endif - - - -// -// Trick to skip a 2-byte instruction -// - -.pseudocommand skip_2_bytes_trash_nvz { .byte $2C } - - - -// -// Memory mapping for C65 and MEGA65 -// - -#if HAS_OPCODES_4510 - -.pseudocommand map { .byte $5C } -.pseudocommand eom { .byte $EA } - -#endif - - -// -// Some additional 65C02 instructions -// - -#if HAS_OPCODES_65C02 - -.pseudocommand inc_a { .byte $1A } -.pseudocommand dec_a { .byte $3A } - -#endif - -// -// Some additional 65CE02 instructions -// - -#if HAS_OPCODES_65CE02 - -// CPU flags support - -.pseudocommand cle { .byte $02 } -.pseudocommand see { .byte $03 } - -// .B register support - -.pseudocommand tab { .byte $5B } -.pseudocommand tba { .byte $7B } - -// .Z register support - -.pseudocommand inz { .byte $1B } -.pseudocommand dez { .byte $3B } -.pseudocommand phz { .byte $DB } -.pseudocommand plz { .byte $FB } -.pseudocommand taz { .byte $4B } -.pseudocommand tza { .byte $6B } - -// 16-bit data processing - -.pseudocommand dew addr -{ - .var arg = addr.getValue() - .if (arg > $FF) .error "DEW requires zeropage address" - .byte $C3, arg -} - -.pseudocommand inw addr -{ - .var arg = addr.getValue() - .if (arg > $FF) .error "INW requires zeropage address" - .byte $E3, arg -} - -// Zero page bit handling - -.pseudocommand rmb0 addr -{ - .var arg = addr.getValue() - .if (arg > $FF) .error "RMB0 requires zeropage address" - .byte $07, arg -} - -.pseudocommand rmb1 addr -{ - .var arg = addr.getValue() - .if (arg > $FF) .error "RMB1 requires zeropage address" - .byte $17, arg -} - -.pseudocommand rmb2 addr -{ - .var arg = addr.getValue() - .if (arg > $FF) .error "RMB2 requires zeropage address" - .byte $27, arg -} - -.pseudocommand rmb3 addr -{ - .var arg = addr.getValue() - .if (arg > $FF) .error "RMB3 requires zeropage address" - .byte $37, arg -} - -.pseudocommand rmb4 addr -{ - .var arg = addr.getValue() - .if (arg > $FF) .error "RMB4 requires zeropage address" - .byte $47, arg -} - -.pseudocommand rmb5 addr -{ - .var arg = addr.getValue() - .if (arg > $FF) .error "RMB5 requires zeropage address" - .byte $57, arg -} - -.pseudocommand rmb6 addr -{ - .var arg = addr.getValue() - .if (arg > $FF) .error "RMB6 requires zeropage address" - .byte $67, arg -} - -.pseudocommand rmb7 addr -{ - .var arg = addr.getValue() - .if (arg > $FF) .error "RMB7 requires zeropage address" - .byte $77, arg -} - -.pseudocommand smb0 addr -{ - .var arg = addr.getValue() - .if (arg > $FF) .error "SMB0 requires zeropage address" - .byte $87, arg -} - -.pseudocommand smb1 addr -{ - .var arg = addr.getValue() - .if (arg > $FF) .error "SMB1 requires zeropage address" - .byte $97, arg -} - -.pseudocommand smb2 addr -{ - .var arg = addr.getValue() - .if (arg > $FF) .error "SMB2 requires zeropage address" - .byte $A7, arg -} - -.pseudocommand smb3 addr -{ - .var arg = addr.getValue() - .if (arg > $FF) .error "SMB3 requires zeropage address" - .byte $B7, arg -} - -.pseudocommand smb4 addr -{ - .var arg = addr.getValue() - .if (arg > $FF) .error "SMB4 requires zeropage address" - .byte $C7, arg -} - -.pseudocommand smb5 addr -{ - .var arg = addr.getValue() - .if (arg > $FF) .error "SMB5 requires zeropage address" - .byte $D7, arg -} - -.pseudocommand smb6 addr -{ - .var arg = addr.getValue() - .if (arg > $FF) .error "SMB6 requires zeropage address" - .byte $E7, arg -} - -.pseudocommand smb7 addr -{ - .var arg = addr.getValue() - .if (arg > $FF) .error "SMB7 requires zeropage address" - .byte $F7, arg -} - -// Additional addressing modes - -.pseudocommand jsr_ind addr -{ - .var arg = addr.getValue() - .byte $22, mod(arg, $100), floor(arg / $100) -} - -.pseudocommand jsr_ind_x addr -{ - .var arg = addr.getValue() - .byte $23, mod(arg, $100), floor(arg / $100) -} - - -// Others, taken from https://github.com/smnjameson/M65_KickAsm_PseudoCommands - -.const z = -999 // allows (base page),z addressing mode -.const sy = -998 // allows (base page, s),y addressing mode -.const AT_IZEROPAGEZ = 13 // adds a pseudo addressing mode -.const AT_INDIRECTX = -5 // adds a pseudo addressing mode - -.function GetAdressingModeType(arg) { - .if(arg == AT_NONE) .return "AT_NONE" - .if(arg == AT_IMMEDIATE) .return "AT_IMMEDIATE" - .if(arg == AT_INDIRECT) .return "AT_INDIRECT" - .if(arg == AT_INDIRECTX) .return "AT_INDIRECTX" - .if(arg == AT_ABSOLUTE) .return "AT_ABSOLUTE" - .if(arg == AT_ABSOLUTEX) .return "AT_ABSOLUTEX" - .if(arg == AT_ABSOLUTEY) .return "AT_ABSOLUTEY" - .if(arg == AT_IZEROPAGEX) .return "AT_IZEROPAGEX" - .if(arg == AT_IZEROPAGEY) .return "AT_IZEROPAGEY" - .if(arg == AT_IZEROPAGEZ) .return "AT_IZEROPAGEZ" - .return arg -} - -.pseudocommand cpz arg { - .var value = arg.getValue() - .var type = arg.getType() - .if(type == AT_IMMEDIATE) { - .byte $C2, value - } else .if(type == AT_ABSOLUTE) { - .if(value <= $FF ) { - .byte $D4, value - } else { - .byte $DC, value - } +!macro lda_zero { + ; WARNING: this one can be dangerous in soem cases, use with care! + !ifdef HAS_OPCODES_65CE02 { + tba } else { - .error "Invalid adressingmode. 'cpz' doesn't support "+GetAdressingModeType(type)+" mode" + lda #$00 } } -.pseudocommand lda arg { - .var value = arg.getValue() - .var type = arg.getType() - .if(type != AT_IZEROPAGEZ) .error "':lda' only accepts AT_IZEROPAGEZ" - .if(value > $FF ) .error "':lda ($nn),z' requires zeropage address" - .byte $B2, value -} -.pseudocommand ldz arg -{ - .var value = arg.getValue() - .var type = arg.getType() - .if(type == AT_IMMEDIATE) { - .byte $A3, value - } else .if(type == AT_ABSOLUTE) { - .byte $AB, value - } else .if(type == AT_ABSOLUTEX) { - .byte $BB, value + +; Stack manipulation - some CPUs will leave .A unchanged, some will use it as temporary storage, so consider .A trashed + +!macro phx_trash_a { !ifdef HAS_OPCODES_65C02 { + phx } else { - .error "Invalid adressingmode. 'ldz' doesn't support "+GetAdressingModeType(type)+" mode" - } -} + txa + pha +} } -.pseudocommand sta arg { - .var value = arg.getValue() - .var type = arg.getType() - .if(type != AT_IZEROPAGEZ) .error "':sta' only accepts AT_IZEROPAGEZ" - .if(value > $FF ) .error "':sta ($nn),z' requires zeropage address" - .byte $92, value -} +!macro phy_trash_a { !ifdef HAS_OPCODES_65C02 { + phy + } else { + tya + pha +} } -// Flat memory access support +!macro plx_trash_a { !ifdef HAS_OPCODES_65C02 { + plx + } else { + pla + tax +} } -.pseudocommand lda_lp arg { - .var value = arg.getValue() - .var type = arg.getType() - .if(type != AT_IZEROPAGEZ) .error "'lda_lp' only accepts AT_IZEROPAGEZ" - .if(value > $FF ) .error "'lda_lp' requires zeropage address" - nop - .byte $B2, value -} - -.pseudocommand sta_lp arg { - .var value = arg.getValue() - .var type = arg.getType() - .if(type != AT_IZEROPAGEZ) .error "'sta_lp' only accepts AT_IZEROPAGEZ" - .if(value > $FF ) .error "'sta_lp' requires zeropage address" - nop - .byte $92, value -} - -#endif +!macro ply_trash_a { !ifdef HAS_OPCODES_65C02 { + ply + } else { + pla + tay +} } -// -// Calculation shortcuts -// +; Near jump, on some CPUs can be substituted with shorter instruction -.pseudocommand lda_zero // WARNING: do not use within interrupts -{ -#if HAS_OPCODES_65CE02 - tba -#else - lda #$00 -#endif -} +!macro bra @dst { !ifdef HAS_OPCODE_BRA { + bra @dst + } else { + jmp @dst +} } -// -// Stack manipulation - some CPUs will leave .A unchanged, some will use it as temporary storage, so consider .A trashed -// +; NOP definition, MEGA65 CPU uses EOM instead -.pseudocommand phx_trash_a -{ -#if HAS_OPCODES_65C02 - phx -#else - txa - pha -#endif -} - -.pseudocommand phy_trash_a -{ -#if HAS_OPCODES_65C02 - phy -#else - tya - pha -#endif -} - -.pseudocommand plx_trash_a -{ -#if HAS_OPCODES_65C02 - plx -#else - pla - tax -#endif -} - -.pseudocommand ply_trash_a -{ -#if HAS_OPCODES_65C02 - ply -#else - pla - tay -#endif -} +!macro nop { !ifdef CONFIG_MB_M65 { + eom + } else { + nop +} } -// -// Branches with far offsets, substitutes by Bxx + JMP for CPUs not supporting the instruction -// +; Branches with far offsets, substitutes by Bxx + JMP for CPUs not supporting the instruction -.pseudocommand bcs_16 dst -{ -#if HAS_OPCODES_65CE02 - .var offset = mod($10000 + dst.getValue() - *, $10000) -2 - .byte $B3, mod(offset, $100), floor(offset / $100) -#else - bcc __l - jmp dst -__l: -#endif -} +!macro bcs @dst { !ifdef HAS_OPCODES_65CE02 { + lbcs @dst + } else { + bcc *+5 + jmp @dst +} } -.pseudocommand bcc_16 dst -{ -#if HAS_OPCODES_65CE02 - .var offset = mod($10000 + dst.getValue() - *, $10000) -2 - .byte $93, mod(offset, $100), floor(offset / $100) -#else - bcs __l - jmp dst -__l: -#endif -} +!macro bcc @dst { !ifdef HAS_OPCODES_65CE02 { + lbcc @dst + } else { + bcs *+5 + jmp @dst +} } -.pseudocommand beq_16 dst -{ -#if HAS_OPCODES_65CE02 - .var offset = mod($10000 + dst.getValue() - *, $10000) -2 - .byte $F3, mod(offset, $100), floor(offset / $100) -#else - bne __l - jmp dst -__l: -#endif -} +!macro beq @dst { !ifdef HAS_OPCODES_65CE02 { + lbeq @dst + } else { + bne *+5 + jmp @dst +} } -.pseudocommand bne_16 dst -{ -#if HAS_OPCODES_65CE02 - .var offset = mod($10000 + dst.getValue() - *, $10000) -2 - .byte $D3, mod(offset, $100), floor(offset / $100) -#else - beq __l - jmp dst -__l: -#endif -} +!macro bne @dst { !ifdef HAS_OPCODES_65CE02 { + lbne @dst + } else { + beq *+5 + jmp @dst +} } -.pseudocommand bmi_16 dst -{ -#if HAS_OPCODES_65CE02 - .var offset = mod($10000 + dst.getValue() - *, $10000) -2 - .byte $33, mod(offset, $100), floor(offset / $100) -#else - bpl __l - jmp dst -__l: -#endif -} +!macro bmi @dst { !ifdef HAS_OPCODES_65CE02 { + lbmi @dst + } else { + bpl *+5 + jmp @dst +} } -.pseudocommand bpl_16 dst -{ -#if HAS_OPCODES_65CE02 - .var offset = mod($10000 + dst.getValue() - *, $10000) -2 - .byte $13, mod(offset, $100), floor(offset / $100) -#else - bmi __l - jmp dst -__l: -#endif -} +!macro bpl @dst { !ifdef HAS_OPCODES_65CE02 { + lbpl @dst + } else { + bmi *+5 + jmp @dst +} } -.pseudocommand bvc_16 dst -{ -#if HAS_OPCODES_65CE02 - .var offset = mod($10000 + dst.getValue() - *, $10000) -2 - .byte $53, mod(offset, $100), floor(offset / $100) -#else - bvs __l - jmp dst -__l: -#endif -} +!macro bvc @dst { !ifdef HAS_OPCODES_65CE02 { + lbvc @dst + } else { + bvs *+5 + jmp @dst +} } -.pseudocommand bvs_16 dst -{ -#if HAS_OPCODES_65CE02 - .var offset = mod($10000 + dst.getValue() - *, $10000) -2 - .byte $73, mod(offset, $100), floor(offset / $100) -#else - bvc __l - jmp dst -__l: -#endif -} - - -// -// Near jump, on some CPUs can be substituted with shorter instruction -// - -.pseudocommand jmp_8 dst -{ -#if HAS_OPCODES_65C02 - bra dst -#else - jmp dst -#endif -} +!macro bvs @dst { !ifdef HAS_OPCODES_65CE02 { + lbvs @dst + } else { + bvc *+5 + jmp @dst +} } diff --git a/src/aliases/,aliases_error_codes.s b/src/aliases/,aliases_error_codes.s index fc30b384..a9fde15c 100644 --- a/src/aliases/,aliases_error_codes.s +++ b/src/aliases/,aliases_error_codes.s @@ -1,69 +1,69 @@ - // Error codes for 'panic' pseudocommand +; Error codes for 'panic' pseudocommand - .const P_ERR_NONE = $00 - .const P_ERR_ROM_MISMATCH = $01 // this value has to be stable as long as possible +!set P_ERR_NONE = $00 +!set P_ERR_ROM_MISMATCH = $01 ; this value has to be stable as long as possible - // Kernal error codes - returned in the A register - // Described in 'Commodore 64 Programmer's Reference Guide', page 306 +; Kernal error codes - returned in the A register +; Described in 'Commodore 64 Programmer's Reference Guide', page 306 - .const K_ERR_ROUTINE_TERMINATED = $00 - .const K_ERR_TOO_MANY_OPEN_FILES = $01 - .const K_ERR_FILE_ALREADY_OPEN = $02 - .const K_ERR_FILE_NOT_OPEN = $03 - .const K_ERR_FILE_NOT_FOUND = $04 - .const K_ERR_DEVICE_NOT_FOUND = $05 - .const K_ERR_FILE_NOT_INPUT = $06 - .const K_ERR_FILE_NOT_OUTPUT = $07 - .const K_ERR_FILE_NAME_MISSING = $08 - .const K_ERR_ILLEGAL_DEVICE_NUMBER = $09 - .const K_ERR_TOP_MEM_RS232 = $F0 +!set K_ERR_ROUTINE_TERMINATED = $00 +!set K_ERR_TOO_MANY_OPEN_FILES = $01 +!set K_ERR_FILE_ALREADY_OPEN = $02 +!set K_ERR_FILE_NOT_OPEN = $03 +!set K_ERR_FILE_NOT_FOUND = $04 +!set K_ERR_DEVICE_NOT_FOUND = $05 +!set K_ERR_FILE_NOT_INPUT = $06 +!set K_ERR_FILE_NOT_OUTPUT = $07 +!set K_ERR_FILE_NAME_MISSING = $08 +!set K_ERR_ILLEGAL_DEVICE_NUMBER = $09 +!set K_ERR_TOP_MEM_RS232 = $F0 - // Kernal status codes for READST routine (IOSTATUS) - // Described in 'Commodore 64 Programmer's Reference Guide', page 292 +; Kernal status codes for READST routine (IOSTATUS) +; Described in 'Commodore 64 Programmer's Reference Guide', page 292 - // For IEC devices - .const K_STS_TIMEOUT_WRITE = $01 - .const K_STS_TIMEOUT_READ = $02 - .const K_STS_EOI = $40 - .const K_STS_DEVICE_NOT_FOUND = $80 - // For tape deck - .const K_STS_SHORT_BLOCK = $04 - .const K_STS_LONG_BLOCK = $08 - .const K_STS_READ_ERROR = $10 - .const K_STS_CHECKSUM_ERROR = $20 - .const K_STS_END_OF_FILE = $40 - .const K_STS_END_OF_TAPE = $80 +; For IEC devices +!set K_STS_TIMEOUT_WRITE = $01 +!set K_STS_TIMEOUT_READ = $02 +!set K_STS_EOI = $40 +!set K_STS_DEVICE_NOT_FOUND = $80 +; For tape deck +!set K_STS_SHORT_BLOCK = $04 +!set K_STS_LONG_BLOCK = $08 +!set K_STS_READ_ERROR = $10 +!set K_STS_CHECKSUM_ERROR = $20 +!set K_STS_END_OF_FILE = $40 +!set K_STS_END_OF_TAPE = $80 - // BASIC error codes, taken from http://sta.c64.org/cbm64baserr.html - .const B_ERR_TOO_MANY_FILES = $01 - .const B_ERR_FILE_OPEN = $02 - .const B_ERR_FILE_NOT_OPEN = $03 - .const B_ERR_FILE_NOT_FOUND = $04 - .const B_ERR_DEVICE_NOT_PRESENT = $05 - .const B_ERR_NOT_INPUT_FILE = $06 - .const B_ERR_NOT_OUTPUT_FILE = $07 - .const B_ERR_MISSING_FILENAME = $08 - .const B_ERR_ILLEGAL_DEVICE_NUMBER = $09 - .const B_ERR_NEXT_WITHOUT_FOR = $0A - .const B_ERR_SYNTAX = $0B - .const B_ERR_RETURN_WITHOUT_GOSUB = $0C - .const B_ERR_OUT_OF_DATA = $0D - .const B_ERR_ILLEGAL_QUANTITY = $0E - .const B_ERR_OVERFLOW = $0F - .const B_ERR_OUT_OF_MEMORY = $10 - .const B_ERR_UNDEFD_STATEMENT = $11 - .const B_ERR_BAD_SUBSCRIPT = $12 - .const B_ERR_REDIMD_ARRAY = $13 - .const B_ERR_DIVISION_BY_ZERO = $14 - .const B_ERR_ILLEGAL_DIRECT = $15 - .const B_ERR_TYPE_MISMATCH = $16 - .const B_ERR_STRING_TOO_LONG = $17 - .const B_ERR_FILE_DATA = $18 - .const B_ERR_FORMULA_TOO_COMPLEX = $19 - .const B_ERR_CANT_CONTINUE = $1A - .const B_ERR_UNDEFD_FUNCTION = $1B - .const B_ERR_VERIFY = $1C - .const B_ERR_LOAD = $1D - .const B_ERR_BREAK = $1E +; BASIC error codes, taken from http://sta.c64.org/cbm64baserr.html +!set B_ERR_TOO_MANY_FILES = $01 +!set B_ERR_FILE_OPEN = $02 +!set B_ERR_FILE_NOT_OPEN = $03 +!set B_ERR_FILE_NOT_FOUND = $04 +!set B_ERR_DEVICE_NOT_PRESENT = $05 +!set B_ERR_NOT_INPUT_FILE = $06 +!set B_ERR_NOT_OUTPUT_FILE = $07 +!set B_ERR_MISSING_FILENAME = $08 +!set B_ERR_ILLEGAL_DEVICE_NUMBER = $09 +!set B_ERR_NEXT_WITHOUT_FOR = $0A +!set B_ERR_SYNTAX = $0B +!set B_ERR_RETURN_WITHOUT_GOSUB = $0C +!set B_ERR_OUT_OF_DATA = $0D +!set B_ERR_ILLEGAL_QUANTITY = $0E +!set B_ERR_OVERFLOW = $0F +!set B_ERR_OUT_OF_MEMORY = $10 +!set B_ERR_UNDEFD_STATEMENT = $11 +!set B_ERR_BAD_SUBSCRIPT = $12 +!set B_ERR_REDIMD_ARRAY = $13 +!set B_ERR_DIVISION_BY_ZERO = $14 +!set B_ERR_ILLEGAL_DIRECT = $15 +!set B_ERR_TYPE_MISMATCH = $16 +!set B_ERR_STRING_TOO_LONG = $17 +!set B_ERR_FILE_DATA = $18 +!set B_ERR_FORMULA_TOO_COMPLEX = $19 +!set B_ERR_CANT_CONTINUE = $1A +!set B_ERR_UNDEFD_FUNCTION = $1B +!set B_ERR_VERIFY = $1C +!set B_ERR_LOAD = $1D +!set B_ERR_BREAK = $1E diff --git a/src/aliases/,aliases_hardware.s b/src/aliases/,aliases_hardware.s index ae0ae762..5b6d5167 100644 --- a/src/aliases/,aliases_hardware.s +++ b/src/aliases/,aliases_hardware.s @@ -1,198 +1,179 @@ -// -// Names of hardware registers - names from C64 Programmer's Reference Guide, sometimes slightly modified -// +; +; Names of hardware registers - names from C64 Programmer's Reference Guide, sometimes slightly modified +; -#if CONFIG_PLATFORM_COMMODORE_64 +!ifdef CONFIG_PLATFORM_COMMODORE_64 { - // CPU memory registers + ; CPU memory registers - .label CPU_D6510 = $00 - .label CPU_R6510 = $01 + !addr CPU_D6510 = $00 + !addr CPU_R6510 = $01 - // VIC-II registers + ; VIC-II registers - .label __VIC_BASE = $D000 // base address of the chip + !addr __VIC_BASE = $D000 ; base address of the chip - .label VIC_SP0X = $D000 - .label VIC_SP0Y = $D001 - .label VIC_SP1X = $D002 - .label VIC_SP1Y = $D003 - .label VIC_SP2X = $D004 - .label VIC_SP2Y = $D005 - .label VIC_SP3X = $D006 - .label VIC_SP3Y = $D007 - .label VIC_SP4X = $D008 - .label VIC_SP4Y = $D009 - .label VIC_SP5X = $D00A - .label VIC_SP5Y = $D00B - .label VIC_SP6X = $D00C - .label VIC_SP6Y = $D00D - .label VIC_SP7X = $D00E - .label VIC_SP7Y = $D00F + !addr VIC_SP0X = $D000 + !addr VIC_SP0Y = $D001 + !addr VIC_SP1X = $D002 + !addr VIC_SP1Y = $D003 + !addr VIC_SP2X = $D004 + !addr VIC_SP2Y = $D005 + !addr VIC_SP3X = $D006 + !addr VIC_SP3Y = $D007 + !addr VIC_SP4X = $D008 + !addr VIC_SP4Y = $D009 + !addr VIC_SP5X = $D00A + !addr VIC_SP5Y = $D00B + !addr VIC_SP6X = $D00C + !addr VIC_SP6Y = $D00D + !addr VIC_SP7X = $D00E + !addr VIC_SP7Y = $D00F - .label VIC_MSIGX = $D010 - .label VIC_SCROLY = $D011 - .label VIC_RASTER = $D012 - .label VIC_LPENX = $D013 - .label VIC_LPENY = $D014 - .label VIC_SPENA = $D015 - .label VIC_SCROLX = $D016 - .label VIC_YXPAND = $D017 - .label VIC_YMCSB = $D018 - .label VIC_IRQ = $D019 - .label VIC_IRQMSK = $D01A - .label VIC_SPBGPR = $D01B - .label VIC_SPMC = $D01C - .label VIC_XXPAND = $D01D - .label VIC_SPSPCL = $D01E - .label VIC_SPBGCL = $D01F + !addr VIC_MSIGX = $D010 + !addr VIC_SCROLY = $D011 + !addr VIC_RASTER = $D012 + !addr VIC_LPENX = $D013 + !addr VIC_LPENY = $D014 + !addr VIC_SPENA = $D015 + !addr VIC_SCROLX = $D016 + !addr VIC_YXPAND = $D017 + !addr VIC_YMCSB = $D018 + !addr VIC_IRQ = $D019 + !addr VIC_IRQMSK = $D01A + !addr VIC_SPBGPR = $D01B + !addr VIC_SPMC = $D01C + !addr VIC_XXPAND = $D01D + !addr VIC_SPSPCL = $D01E + !addr VIC_SPBGCL = $D01F - .label VIC_EXTCOL = $D020 - .label VIC_BGCOL0 = $D021 - .label VIC_BGCOL1 = $D022 - .label VIC_BGCOL2 = $D023 - .label VIC_BGCOL3 = $D024 - .label VIC_SPMC0 = $D025 - .label VIC_SPMC1 = $D026 - .label VIC_SP0COL = $D027 - .label VIC_SP1COL = $D028 - .label VIC_SP2COL = $D029 - .label VIC_SP3COL = $D02A - .label VIC_SP4COL = $D02B - .label VIC_SP5COL = $D02C - .label VIC_SP6COL = $D02D - .label VIC_SP7COL = $D02E + !addr VIC_EXTCOL = $D020 + !addr VIC_BGCOL0 = $D021 + !addr VIC_BGCOL1 = $D022 + !addr VIC_BGCOL2 = $D023 + !addr VIC_BGCOL3 = $D024 + !addr VIC_SPMC0 = $D025 + !addr VIC_SPMC1 = $D026 + !addr VIC_SP0COL = $D027 + !addr VIC_SP1COL = $D028 + !addr VIC_SP2COL = $D029 + !addr VIC_SP3COL = $D02A + !addr VIC_SP4COL = $D02B + !addr VIC_SP5COL = $D02C + !addr VIC_SP6COL = $D02D + !addr VIC_SP7COL = $D02E -#if !CONFIG_MB_MEGA_65 && !CONFIG_MB_ULTIMATE_64 +!ifndef CONFIG_MB_M65 { !ifndef CONFIG_MB_U64 { - .label VIC_XSCAN = $D02F // C128 only - .label VIC_CLKRATE = $D030 // C128 only + !addr VIC_XSCAN = $D02F ; C128 only + !addr VIC_CLKRATE = $D030 ; C128 only +} } -#endif + ; SID registers - // SID registers + !addr __SID_BASE = $D400 ; base address of the chip - .label __SID_BASE = $D400 // base address of the chip + !addr SID_FRELO1 = $D400 + !addr SID_FREHI1 = $D401 + !addr SID_PWLO1 = $D402 + !addr SID_PWHI1 = $D403 + !addr SID_VCREG1 = $D404 + !addr SID_ATDCY1 = $D405 + !addr SID_SUREL1 = $D406 -#if CONFIG_MB_MEGA_65 + !addr SID_FRELO2 = $D407 + !addr SID_FREHI2 = $D408 + !addr SID_PWLO2 = $D409 + !addr SID_PWHI2 = $D40A + !addr SID_VCREG2 = $D40B + !addr SID_ATDCY2 = $D40C + !addr SID_SUREL2 = $D40D - .label __SID_R1_OFFSET = $00 // right SID 1, $D400 - .label __SID_R2_OFFSET = $20 // right SID 2, $D420 - .label __SID_L1_OFFSET = $40 // left SID 1, $D440 - .label __SID_L2_OFFSET = $60 // left SID 2, $D460 + !addr SID_FRELO3 = $D40E + !addr SID_FREHI3 = $D40F + !addr SID_PWLO3 = $D410 + !addr SID_PWHI3 = $D411 + !addr SID_VCREG3 = $D412 + !addr SID_ATDCY3 = $D413 + !addr SID_SUREL3 = $D414 -#endif + !addr SID_CUTLO = $D415 + !addr SID_CUTHI = $D416 + !addr SID_RESON = $D417 + !addr SID_SIGVOL = $D418 + !addr SID_POTX = $D419 + !addr SID_POTY = $D41A + !addr SID_RANDOM = $D41B + !addr SID_ENV3 = $D41C - .label SID_FRELO1 = $D400 - .label SID_FREHI1 = $D401 - .label SID_PWLO1 = $D402 - .label SID_PWHI1 = $D403 - .label SID_VCREG1 = $D404 - .label SID_ATDCY1 = $D405 - .label SID_SUREL1 = $D406 + ; Color COLOR_RAM - .label SID_FRELO2 = $D407 - .label SID_FREHI2 = $D408 - .label SID_PWLO2 = $D409 - .label SID_PWHI2 = $D40A - .label SID_VCREG2 = $D40B - .label SID_ATDCY2 = $D40C - .label SID_SUREL2 = $D40D + !addr COLOR_RAM = $D800 - .label SID_FRELO3 = $D40E - .label SID_FREHI3 = $D40F - .label SID_PWLO3 = $D410 - .label SID_PWHI3 = $D411 - .label SID_VCREG3 = $D412 - .label SID_ATDCY3 = $D413 - .label SID_SUREL3 = $D414 + ; CIA #1 registers - .label SID_CUTLO = $D415 - .label SID_CUTHI = $D416 - .label SID_RESON = $D417 - .label SID_SIGVOL = $D418 - .label SID_POTX = $D419 - .label SID_POTY = $D41A - .label SID_RANDOM = $D41B - .label SID_ENV3 = $D41C + !addr __CIA1_BASE = $DC00 ; base address of the chip - // Color COLOR_RAM + !addr CIA1_PRA = $DC00 + !addr CIA1_PRB = $DC01 + !addr CIA1_DDRA = $DC02 + !addr CIA1_DDRB = $DC03 - .label COLOR_RAM = $D800 + !addr CIA1_TIMALO = $DC04 + !addr CIA1_TIMAHI = $DC05 + !addr CIA1_TIMBLO = $DC06 + !addr CIA1_TIMBHI = $DC07 - // CIA #1 registers + !addr CIA1_TODTEN = $DC08 + !addr CIA1_TODSEC = $DC09 + !addr CIA1_TODMIN = $DC0A + !addr CIA1_TODHRS = $DC0B - .label __CIA1_BASE = $DC00 // base address of the chip + !addr CIA1_SDR = $DC0C + !addr CIA1_ICR = $DC0D + !addr CIA1_CRA = $DC0E + !addr CIA1_CRB = $DC0F - .label CIA1_PRA = $DC00 - .label CIA1_PRB = $DC01 - .label CIA1_DDRA = $DC02 - .label CIA1_DDRB = $DC03 + ; CIA #2 registers - .label CIA1_TIMALO = $DC04 - .label CIA1_TIMAHI = $DC05 - .label CIA1_TIMBLO = $DC06 - .label CIA1_TIMBHI = $DC07 + !addr __CIA2_BASE = $DD00 ; base address of the chip - .label CIA1_TODTEN = $DC08 - .label CIA1_TODSEC = $DC09 - .label CIA1_TODMIN = $DC0A - .label CIA1_TODHRS = $DC0B + !addr CIA2_PRA = $DD00 ; VIC bank switching and IEC port + !addr CIA2_PRB = $DD01 + !addr CIA2_DDRA = $DD02 + !addr CIA2_DDRB = $DD03 - .label CIA1_SDR = $DC0C - .label CIA1_ICR = $DC0D - .label CIA1_CRA = $DC0E - .label CIA1_CRB = $DC0F + !addr CIA2_TIMALO = $DD04 + !addr CIA2_TIMAHI = $DD05 + !addr CIA2_TIMBLO = $DD06 + !addr CIA2_TIMBHI = $DD07 - // CIA #2 registers + !addr CIA2_TODTEN = $DD08 + !addr CIA2_TODSEC = $DD09 + !addr CIA2_TODMIN = $DD0A + !addr CIA2_TODHRS = $DD0B - .label __CIA2_BASE = $DD00 // base address of the chip + !addr CIA2_SDR = $DD0C + !addr CIA2_ICR = $DD0D + !addr CIA2_CRA = $DD0E + !addr CIA2_CRB = $DD0F - .label CIA2_PRA = $DD00 // VIC bank switching and IEC port - .label CIA2_PRB = $DD01 - .label CIA2_DDRA = $DD02 - .label CIA2_DDRB = $DD03 - - .label CIA2_TIMALO = $DD04 - .label CIA2_TIMAHI = $DD05 - .label CIA2_TIMBLO = $DD06 - .label CIA2_TIMBHI = $DD07 - - .label CIA2_TODTEN = $DD08 - .label CIA2_TODSEC = $DD09 - .label CIA2_TODMIN = $DD0A - .label CIA2_TODHRS = $DD0B - - .label CIA2_SDR = $DD0C - .label CIA2_ICR = $DD0D - .label CIA2_CRA = $DD0E - .label CIA2_CRB = $DD0F - - // CIA #2 helper bits - IEC bus + ; CIA #2 helper bits - IEC bus - .const BIT_CIA2_PRA_ATN_OUT = $08 // 1 - low (pulled), 0 - high (released) - .const BIT_CIA2_PRA_CLK_OUT = $10 // 1 - low (pulled), 0 - high (released) - .const BIT_CIA2_PRA_DAT_OUT = $20 // 1 - low (pulled), 0 - high (released) - .const BIT_CIA2_PRA_CLK_IN = $40 // 0 - low (pulled), 1 - high (released) - .const BIT_CIA2_PRA_DAT_IN = $80 // 0 - low (pulled), 1 - high (released) + !set BIT_CIA2_PRA_ATN_OUT = $08 ; 1 - low (pulled), 0 - high (released) + !set BIT_CIA2_PRA_CLK_OUT = $10 ; 1 - low (pulled), 0 - high (released) + !set BIT_CIA2_PRA_DAT_OUT = $20 ; 1 - low (pulled), 0 - high (released) + !set BIT_CIA2_PRA_CLK_IN = $40 ; 0 - low (pulled), 1 - high (released) + !set BIT_CIA2_PRA_DAT_IN = $80 ; 0 - low (pulled), 1 - high (released) -#if CONFIG_MB_MEGA_65 + ; SuperCPU registers - .label C65_EXTKEYS_PR = $D607 - .label C65_EXTKEYS_DDR = $D608 +!ifndef CONFIG_MB_M65 { -#endif + !addr SCPU_SPEED_NORMAL = $D07A + !addr SCPU_SPEED_TURBO = $D07B +} -#if !CONFIG_MB_MEGA_65 - - // SuperCPU registers - - .label SCPU_SPEED_NORMAL = $D07A - .label SCPU_SPEED_TURBO = $D07B - -#endif - - -#endif +} diff --git a/src/aliases/,aliases_hardware_cx16.s b/src/aliases/,aliases_hardware_cx16.s index 79bfbb4a..f803555f 100644 --- a/src/aliases/,aliases_hardware_cx16.s +++ b/src/aliases/,aliases_hardware_cx16.s @@ -1,73 +1,72 @@ -// -// Names of hardware registers -// +; +; Names of hardware registers +; -#if CONFIG_PLATFORM_COMMANDER_X16 +!ifdef CONFIG_PLATFORM_COMMANDER_X16 { - // VERA registers + ; VERA registers - .label __VERA_BASE = $9F20 // base address of the chip + !addr __VERA_BASE = $9F20 ; base address of the chip - .label VERA_ADDR_LO = $9F20 - .label VERA_ADDR_MID = $9F21 - .label VERA_ADDR_HI = $9F22 + !addr VERA_ADDR_LO = $9F20 + !addr VERA_ADDR_MID = $9F21 + !addr VERA_ADDR_HI = $9F22 - .label VERA_DATA0 = $9F23 - .label VERA_DATA1 = $9F24 + !addr VERA_DATA0 = $9F23 + !addr VERA_DATA1 = $9F24 - .label VERA_CTRL = $9F25 + !addr VERA_CTRL = $9F25 - .label VERA_IEN = $9F26 - .label VERA_ISR = $9F27 + !addr VERA_IEN = $9F26 + !addr VERA_ISR = $9F27 - // VIA #1 registers + ; VIA #1 registers - .label __VIA1_BASE = $9F60 // base address of the chip + !addr __VIA1_BASE = $9F60 ; base address of the chip - .label VIA1_PRB = $9F60 - .label VIA1_PRA = $9F61 - .label VIA1_DDRB = $9F62 - .label VIA1_DDRA = $9F63 + !addr VIA1_PRB = $9F60 + !addr VIA1_PRA = $9F61 + !addr VIA1_DDRB = $9F62 + !addr VIA1_DDRA = $9F63 - .label VIA1_T1C_L = $9F64 - .label VIA1_T1C_H = $9F65 - .label VIA1_T1L_L = $9F66 - .label VIA1_T1L_H = $9F67 - .label VIA1_T2C_L = $9F68 - .label VIA1_T2C_H = $9F69 + !addr VIA1_T1C_L = $9F64 + !addr VIA1_T1C_H = $9F65 + !addr VIA1_T1L_L = $9F66 + !addr VIA1_T1L_H = $9F67 + !addr VIA1_T2C_L = $9F68 + !addr VIA1_T2C_H = $9F69 - .label VIA1_SR = $9F6A - .label VIA1_ACR = $9F6B - .label VIA1_PCR = $9F6C - .label VIA1_IFR = $9F6D - .label VIA1_IER = $9F6E + !addr VIA1_SR = $9F6A + !addr VIA1_ACR = $9F6B + !addr VIA1_PCR = $9F6C + !addr VIA1_IFR = $9F6D + !addr VIA1_IER = $9F6E - .label VIA1_PRA_NH = $9F6F + !addr VIA1_PRA_NH = $9F6F - // VIA #2 registers + ; VIA #2 registers - .label __VIA2_BASE = $9F70 // base address of the chip + !addr __VIA2_BASE = $9F70 ; base address of the chip - .label VIA2_PRB = $9F70 - .label VIA2_PRA = $9F71 - .label VIA2_DDRB = $9F72 - .label VIA2_DDRA = $9F73 + !addr VIA2_PRB = $9F70 + !addr VIA2_PRA = $9F71 + !addr VIA2_DDRB = $9F72 + !addr VIA2_DDRA = $9F73 - .label VIA2_T1C_L = $9F74 - .label VIA2_T1C_H = $9F75 - .label VIA2_T1L_L = $9F76 - .label VIA2_T1L_H = $9F77 - .label VIA2_T2C_L = $9F78 - .label VIA2_T2C_H = $9F79 + !addr VIA2_T1C_L = $9F74 + !addr VIA2_T1C_H = $9F75 + !addr VIA2_T1L_L = $9F76 + !addr VIA2_T1L_H = $9F77 + !addr VIA2_T2C_L = $9F78 + !addr VIA2_T2C_H = $9F79 - .label VIA2_SR = $9F7A - .label VIA2_ACR = $9F7B - .label VIA2_PCR = $9F7C - .label VIA2_IFR = $9F7D - .label VIA2_IER = $9F7E + !addr VIA2_SR = $9F7A + !addr VIA2_ACR = $9F7B + !addr VIA2_PCR = $9F7C + !addr VIA2_IFR = $9F7D + !addr VIA2_IER = $9F7E - .label VIA2_PRA_NH = $9F7F - -#endif + !addr VIA2_PRA_NH = $9F7F +} diff --git a/src/aliases/,aliases_hardware_m65.s b/src/aliases/,aliases_hardware_m65.s index 80cc491e..ad72e0e2 100644 --- a/src/aliases/,aliases_hardware_m65.s +++ b/src/aliases/,aliases_hardware_m65.s @@ -1,45 +1,56 @@ -// -// Names of hardware registers -// -// See https://github.com/MEGA65/mega65-core/blob/master/iomap.txt -// +; +; Names of hardware registers +; +; See https://github.com/MEGA65/mega65-core/blob/master/iomap.txt +; -#if CONFIG_MB_MEGA_65 +!ifdef CONFIG_MB_M65 { - // VIC-IV registers + ; VIC-IV registers - .label VIC_KEY = $D02F - .label VIC_CTRLA = $D030 - .label VIC_CTRLB = $D031 + !addr VIC_KEY = $D02F + !addr VIC_CTRLA = $D030 + !addr VIC_CTRLB = $D031 - .label VIC_XPOS = $D050 + !addr VIC_XPOS = $D050 - .label VIC_CTRLC = $D054 + !addr VIC_CTRLC = $D054 - .label VIC_CHARSTEP = $D058 // 2 bytes - logical characters per line + !addr VIC_CHARSTEP = $D058 ; 2 bytes - logical characters per line - .label VIC_SRH = $D05D // - various flags, bit 7 = hot registers + !addr VIC_SRH = $D05D ; - various flags, bit 7 = hot registers - .label VIC_SCRNPTR = $D060 // 4 bytes - pointer to start of screen memory - .label VIC_COLPTR = $D064 // 2 bytes - pointer to start of color memory + !addr VIC_SCRNPTR = $D060 ; 4 bytes - pointer to start of screen memory + !addr VIC_COLPTR = $D064 ; 2 bytes - pointer to start of color memory - .label VIC_CHARPTR = $D068 // 3 bytes - pointer to start of character generator + !addr VIC_CHARPTR = $D068 ; 3 bytes - pointer to start of character generator - // DMAgic + ; Keyboard - .label DMA_ADDRLSBTRIG = $D700 - .label DMA_ADDRMSB = $D701 - .label DMA_ADDRBANK = $D702 - .label DMA_EN018B = $D703 - .label DMA_ADDRMB = $D704 - .label DMA_ETRIG = $D705 - .label DMA_ADDRLSB = $D70E + !addr C65_EXTKEYS_PR = $D607 + !addr C65_EXTKEYS_DDR = $D608 - // MISC registers + ; DMAgic - .label MISC_BOARDID = $D629 // board identification byte - .label MISC_EMU = $D710 // to enable badlines and slow interrupts + !addr DMA_ADDRLSBTRIG = $D700 + !addr DMA_ADDRMSB = $D701 + !addr DMA_ADDRBANK = $D702 + !addr DMA_EN018B = $D703 + !addr DMA_ADDRMB = $D704 + !addr DMA_ETRIG = $D705 + !addr DMA_ADDRLSB = $D70E -#endif + ; MISC registers + + !addr MISC_BOARDID = $D629 ; board identification byte + !addr MISC_EMU = $D710 ; to enable badlines and slow interrupts + + ; SID offsets + + !set __SID_R1_OFFSET = $00 ; right SID 1, $D400 + !set __SID_R2_OFFSET = $20 ; right SID 2, $D420 + !set __SID_L1_OFFSET = $40 ; left SID 1, $D440 + !set __SID_L2_OFFSET = $60 ; left SID 2, $D460 +} diff --git a/src/aliases/,aliases_petscii_codes.s b/src/aliases/,aliases_petscii_codes.s index cde7575f..5beb2c43 100644 --- a/src/aliases/,aliases_petscii_codes.s +++ b/src/aliases/,aliases_petscii_codes.s @@ -1,176 +1,191 @@ -// -// PETSCII codes for all the supported keys, for all the keyboards -// -// - [CM64] Compute's Mapping the Commodore 64 -// - [CM128] Compute's Mapping the Commodore 128 -// - https://github.com/MEGA65/c65-specifications/blob/master/c65manualupdated.txt -// - https://en.wikipedia.org/wiki/PETSCII -// +; +; PETSCII codes for all the supported keys, for all the keyboards +; +; - [CM64] Compute's Mapping the Commodore 64 +; - [CM128] Compute's Mapping the Commodore 128 +; - https://github.com/MEGA65/c65-specifications/blob/master/c65manualupdated.txt +; - https://en.wikipedia.org/wiki/PETSCII +; -// Not really PETSCII codes, but bitmask values for SHFLAG variable -// [CM64] page 68, [CM128] page 212 +; First determine what to define -.const KEY_FLAG_SHIFT = %00000001 -.const KEY_FLAG_VENDOR = %00000010 -.const KEY_FLAG_CTRL = %00000100 - -#if CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65 || ROM_LAYOUT_M65 -.const KEY_FLAG_ALT = %00001000 -#if CONFIG_KEYBOARD_C128_CAPS_LOCK || CONFIG_KEYBOARD_C65_CAPS_LOCK -.const KEY_CAPS_LOCK = %00010000 -#endif -.const KEY_FLAG_NO_SCRL = %00100000 // Open ROMs unofficial -#endif - -// Note - the following PETSCII codes are currently unassigned, can be used for further extensions: $01, $04, $06, ($80 ?) - - -.const KEY_NA = $00 // to indicate that no key is presed +!ifdef CONFIG_KEYBOARD_C128 { !set _NEED_EXTENDED = 1 } +!ifdef CONFIG_KEYBOARD_C128_CAPS_LOCK { !set _NEED_CAPS_LOCK = 1 } +!ifdef CONFIG_KEYBOARD_C65 { !set _NEED_EXTENDED = 1 } +!ifdef CONFIG_KEYBOARD_C65_CAPS_LOCK { !set _NEED_CAPS_LOCK = 1 } +!ifdef CONFIG_MB_M65 { !set _NEED_EXTENDED = 1 } +!ifdef CONFIG_KEYBOARD_C65 { !set _NEED_C65KB = 1 } +!ifdef CONFIG_MB_M65 { !set _NEED_C65KB = 1 } -// PETSCII codes for our extended screen editor +; Not really PETSCII codes, but bitmask values for SHFLAG variable +; [CM64] page 68, [CM128] page 212 -.const KEY_C64_TAB_FW = $8F // CTRL+>, TAB - Open ROMs unofficial, original TAB conflicts with C64 PETSCII, XXX remove? -.const KEY_C64_TAB_BW = $80 // CTRL+<, SHIFT+TAB - Open ROMs unofficial, original TAB conflicts with C64 PETSCII, XXX remove? +!set KEY_FLAG_SHIFT = %00000001 +!set KEY_FLAG_VENDOR = %00000010 +!set KEY_FLAG_CTRL = %00000100 + +!ifdef _NEED_EXTENDED { + !set KEY_FLAG_ALT = %00001000 + !set KEY_FLAG_NO_SCRL = %00100000 +} +!ifdef _NEED_CAPS_LOCK { + !set KEY_CAPS_LOCK = %00010000 +} -// PETSCII codes for certain C128 and C65 functionalities -#if CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65 || ROM_LAYOUT_M65 -.const KEY_BELL = $07 // no key, originally CTRL+G // XXX implement, add to C65 keyboard matrix -.const KEY_ESC = $1B -#endif - -#if CONFIG_KEYBOARD_C65 || ROM_LAYOUT_M65 -.const KEY_TAB = $09 // XXX add to C65 keyboard matrix -.const KEY_LINE_FEED = $0A // XXX add to C65 keyboard matrix -.const KEY_TAB_SET_CLR = $18 // XXX add to C65 keyboard matrix -.const KEY_UNDERLINE_ON = $02 // XXX add to C65 keyboard matrix -.const KEY_UNDERLINE_OFF = $82 // XXX add to C65 keyboard matrix -.const KEY_FLASHING_ON = $0F // XXX add to C65 keyboard matrix -.const KEY_FLASHING_OFF = $8F // XXX add to C65 keyboard matrix -#endif - -// PETSCII codes for programmable keys - -.const KEY_STOP = $03 -.const KEY_RUN = $83 - -.const KEY_F1 = $85 -.const KEY_F2 = $89 -.const KEY_F3 = $86 -.const KEY_F4 = $8A -.const KEY_F5 = $87 -.const KEY_F6 = $8B -.const KEY_F7 = $88 -.const KEY_F8 = $8C - -#if CONFIG_KEYBOARD_C65 || ROM_LAYOUT_M65 -.const KEY_F9 = $10 -.const KEY_F10 = $15 -.const KEY_F11 = $16 -.const KEY_F12 = $17 -.const KEY_F13 = $19 -.const KEY_F14 = $1A -#endif - -#if CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65 || ROM_LAYOUT_M65 -.const KEY_HELP = $84 -#endif +; Note - the following PETSCII codes are currently unassigned, can be used for further extensions: $01, $04, $06, ($80 ?) -// PETSCII codes for cursor keys -.const KEY_CRSR_UP = $91 -.const KEY_CRSR_DOWN = $11 -.const KEY_CRSR_LEFT = $9D -.const KEY_CRSR_RIGHT = $1D +!set KEY_NA = $00 ; to indicate that no key is presed -// PETSCII codes for colors +; PETSCII codes for our extended screen editor -.const KEY_RVS_ON = $12 // CTRL+9 -.const KEY_RVS_OFF = $92 // CTRL+0 - -.const KEY_BLACK = $90 // CTRL+1 -.const KEY_WHITE = $05 // CTRL+2 -.const KEY_RED = $1C // CTRL+3 -.const KEY_CYAN = $9F // CTRL+4 -.const KEY_PURPLE = $9C // CTRL+5 -.const KEY_GREEN = $1E // CTRL+6 -.const KEY_BLUE = $1F // CTRL+7 -.const KEY_YELLOW = $9E // CTRL+8 - -.const KEY_ORANGE = $81 // VENDOR+1 -.const KEY_BROWN = $95 // VENDOR+2 -.const KEY_LT_RED = $96 // VENDOR+3 -.const KEY_GREY_1 = $97 // VENDOR+4 -.const KEY_GREY_2 = $98 // VENDOR+5 -.const KEY_LT_GREEN = $99 // VENDOR+6 -.const KEY_LT_BLUE = $9A // VENDOR+7 -.const KEY_GREY_3 = $9B // VENDOR+8 +!set KEY_C64_TAB_FW = $8F ; CTRL+>, TAB - Open ROMs unofficial, original TAB conflicts with C64 PETSCII, XXX remove? +!set KEY_C64_TAB_BW = $80 ; CTRL+<, SHIFT+TAB - Open ROMs unofficial, original TAB conflicts with C64 PETSCII, XXX remove? -// PETSCII codes for case toggle +; PETSCII codes for certain C128 and C65 functionalities -.const KEY_C64_SHIFT_ON = $09 // no key -.const KEY_C64_SHIFT_OFF = $08 // no key -#if CONFIG_KEYBOARD_C65 || ROM_LAYOUT_M65 -.const KEY_C65_SHIFT_OFF = $0B // no key -.const KEY_C65_SHIFT_ON = $0C // no key -#endif -.const KEY_TXT = $0E // no key -.const KEY_GFX = $8E // no key +!ifdef _NEED_EXTENDED { + !set KEY_BELL = $07 ; no key, originally CTRL+G ; XXX implement, add to C65 keyboard matrix + !set KEY_ESC = $1B +} + +!ifdef _NEED_C65KB { + !set KEY_TAB = $09 ; XXX add to C65 keyboard matrix + !set KEY_LINE_FEED = $0A ; XXX add to C65 keyboard matrix + !set KEY_TAB_SET_CLR = $18 ; XXX add to C65 keyboard matrix + !set KEY_UNDERLINE_ON = $02 ; XXX add to C65 keyboard matrix + !set KEY_UNDERLINE_OFF = $82 ; XXX add to C65 keyboard matrix + !set KEY_FLASHING_ON = $0F ; XXX add to C65 keyboard matrix + !set KEY_FLASHING_OFF = $8F ; XXX add to C65 keyboard matrix +} -// PETSCII codes for other non-printable characters +; PETSCII codes for programmable keys -.const KEY_RETURN = $0D -.const KEY_CLR = $93 -.const KEY_HOME = $13 -.const KEY_INS = $94 -.const KEY_DEL = $14 +!set KEY_STOP = $03 +!set KEY_RUN = $83 + +!set KEY_F1 = $85 +!set KEY_F2 = $89 +!set KEY_F3 = $86 +!set KEY_F4 = $8A +!set KEY_F5 = $87 +!set KEY_F6 = $8B +!set KEY_F7 = $88 +!set KEY_F8 = $8C + +!ifdef _NEED_C65KB { + !set KEY_F9 = $10 + !set KEY_F10 = $15 + !set KEY_F11 = $16 + !set KEY_F12 = $17 + !set KEY_F13 = $19 + !set KEY_F14 = $1A +} + +!ifdef _NEED_EXTENDED { + !set KEY_HELP = $84 +} -// PETSCII codes for printable characters +; PETSCII codes for cursor keys -.const KEY_SPACE = $20 -.const KEY_EXCLAMATION = $21 -.const KEY_QUOTE = $22 -.const KEY_HASH = $23 -.const KEY_DOLLAR = $24 -.const KEY_PERCENT = $25 -.const KEY_AMPERSAND = $26 -.const KEY_APOSTROPHE = $27 -.const KEY_R_BRACKET_L = $28 -.const KEY_R_BRACKET_R = $29 -.const KEY_ASTERISK = $2A -.const KEY_PLUS = $2B -.const KEY_COMA = $2C -.const KEY_MINUS = $2D -.const KEY_FULLSTOP = $2E -.const KEY_SLASH = $2F - -.const KEY_0 = $30 -.const KEY_1 = $31 -.const KEY_2 = $32 -.const KEY_3 = $33 -.const KEY_4 = $34 -.const KEY_5 = $35 -.const KEY_6 = $36 -.const KEY_7 = $37 -.const KEY_8 = $38 -.const KEY_9 = $39 -.const KEY_COLON = $3A -.const KEY_SEMICOLON = $3B -.const KEY_LT = $3C -.const KEY_EQ = $3D -.const KEY_GT = $3E -.const KEY_QUESTION = $3F +!set KEY_CRSR_UP = $91 +!set KEY_CRSR_DOWN = $11 +!set KEY_CRSR_LEFT = $9D +!set KEY_CRSR_RIGHT = $1D -// XXX finish this: $4x, $5x, $6x, $7x, $Ax, $Bx, $Cx, $Dx, $Ex, $Fx +; PETSCII codes for colors + +!set KEY_RVS_ON = $12 ; CTRL+9 +!set KEY_RVS_OFF = $92 ; CTRL+0 + +!set KEY_BLACK = $90 ; CTRL+1 +!set KEY_WHITE = $05 ; CTRL+2 +!set KEY_RED = $1C ; CTRL+3 +!set KEY_CYAN = $9F ; CTRL+4 +!set KEY_PURPLE = $9C ; CTRL+5 +!set KEY_GREEN = $1E ; CTRL+6 +!set KEY_BLUE = $1F ; CTRL+7 +!set KEY_YELLOW = $9E ; CTRL+8 + +!set KEY_ORANGE = $81 ; VENDOR+1 +!set KEY_BROWN = $95 ; VENDOR+2 +!set KEY_LT_RED = $96 ; VENDOR+3 +!set KEY_GREY_1 = $97 ; VENDOR+4 +!set KEY_GREY_2 = $98 ; VENDOR+5 +!set KEY_LT_GREEN = $99 ; VENDOR+6 +!set KEY_LT_BLUE = $9A ; VENDOR+7 +!set KEY_GREY_3 = $9B ; VENDOR+8 + + +; PETSCII codes for case toggle + +!set KEY_C64_SHIFT_ON = $09 ; no key +!set KEY_C64_SHIFT_OFF = $08 ; no key +!ifdef _NEED_C65KB { + !set KEY_C65_SHIFT_OFF = $0B ; no key + !set KEY_C65_SHIFT_ON = $0C ; no key +} +!set KEY_TXT = $0E ; no key +!set KEY_GFX = $8E ; no key + + +; PETSCII codes for other non-printable characters + +!set KEY_RETURN = $0D +!set KEY_CLR = $93 +!set KEY_HOME = $13 +!set KEY_INS = $94 +!set KEY_DEL = $14 + + +; PETSCII codes for printable characters + +!set KEY_SPACE = $20 +!set KEY_EXCLAMATION = $21 +!set KEY_QUOTE = $22 +!set KEY_HASH = $23 +!set KEY_DOLLAR = $24 +!set KEY_PERCENT = $25 +!set KEY_AMPERSAND = $26 +!set KEY_APOSTROPHE = $27 +!set KEY_R_BRACKET_L = $28 +!set KEY_R_BRACKET_R = $29 +!set KEY_ASTERISK = $2A +!set KEY_PLUS = $2B +!set KEY_COMA = $2C +!set KEY_MINUS = $2D +!set KEY_FULLSTOP = $2E +!set KEY_SLASH = $2F + +!set KEY_0 = $30 +!set KEY_1 = $31 +!set KEY_2 = $32 +!set KEY_3 = $33 +!set KEY_4 = $34 +!set KEY_5 = $35 +!set KEY_6 = $36 +!set KEY_7 = $37 +!set KEY_8 = $38 +!set KEY_9 = $39 +!set KEY_COLON = $3A +!set KEY_SEMICOLON = $3B +!set KEY_LT = $3C +!set KEY_EQ = $3D +!set KEY_GT = $3E +!set KEY_QUESTION = $3F + + +; XXX finish this: $4x, $5x, $6x, $7x, $Ax, $Bx, $Cx, $Dx, $Ex, $Fx diff --git a/src/aliases/,aliases_ram_lowmem.s b/src/aliases/,aliases_ram_lowmem.s index 09f1a861..50f8edec 100644 --- a/src/aliases/,aliases_ram_lowmem.s +++ b/src/aliases/,aliases_ram_lowmem.s @@ -1,329 +1,326 @@ -// -// Names of ZP and low memory locations: -// - Computes Mapping the Commodore 64 -// - https://www.c64-wiki.com/wiki/Zeropage -// - http://unusedino.de/ec64/technical/project64/memory_maps.html -// +; +; Names of ZP and low memory locations: +; - Computes Mapping the Commodore 64 +; - https://www.c64-wiki.com/wiki/Zeropage +; - http://unusedino.de/ec64/technical/project64/memory_maps.html +; - // $00-$01 - 6502 CPU registers are here + ; $00-$01 - 6502 CPU registers are here - // - // Page 0 - BASIC area ($02-$8F) - // + ; + ; Page 0 - BASIC area ($02-$8F) + ; - // $02 -- UNUSED -- free for user software - .label ADRAY1 = $03 // $03-$04 - .label ADRAY2 = $05 // $05-$06 - .label CHARAC = $07 // [!] our implementation might be different XXX give more details - .label ENDCHR = $08 // [!] our implementation might be different XXX give more details - .label TRMPOS = $09 // -- NOT IMPLEMENTED -- - .label VERCKB = $0A // flag used by BASIC, 0 - LOAD, 1 - VERIFY - .label COUNT = $0B // [!] our implementation might be different XXX give more details - .label DIMFLG = $0C // [!] our implementation might be different XXX give more details - .label VALTYP = $0D // expression eveluation result; $00 - float, $FF - string - .label INTFLG = $0E // -- NOT IMPLEMENTED -- - .label GARBFL = $0F // [!] our implementation might be different XXX give more details - .label SUBFLG = $10 // -- NOT IMPLEMENTED -- - .label INPFLG = $11 // -- NOT IMPLEMENTED -- - .label TANSGN = $12 // -- NOT IMPLEMENTED -- - .label CHANNL = $13 // -- NOT IMPLEMENTED -- - .label LINNUM = $14 // $14-$15 BASIC line number, [!] also used by DOS Wedge - .label TEMPPT = $16 // pointer to the first available slot in the temporary string descriptor stack - .label LASTPT = $17 // $17-$18 pointer to the last used slot in the temporary string descriptor - .label TEMPST = $19 // $19-$21 temporary string stack descriptors - .label INDEX = $22 // $22-$25 temporary variables, [!] our usage might be different - .label RESHO = $26 // $26-$2A temporary variables, [!] our usage might be different - .label TXTTAB = $2B // $2B-$2C start of BASIC code - .label VARTAB = $2D // $2D-$2E end of BASIC code, start of variables - .label ARYTAB = $2F // $2F-$30 pointer to start of array storage - .label STREND = $31 // $31-$32 pointer to start of free RAM - .label FRETOP = $33 // $33-$34 pointer to bottom of strings area - .label FRESPC = $35 // $35-$36 [!] our implementation uses this as temporary string pointer - .label MEMSIZ = $37 // $37-$38 highest address of BASIC memory + 1 - .label CURLIN = $39 // $39-$3A current BASIC line number - .label OLDLIN = $3B // $3B-$3C previous BASIC line number - .label OLDTXT = $3D // $3D-$3E current BASIC line pointer - .label DATLIN = $3F // $3F-$40 -- NOT IMPLEMENTED -- - .label DATPTR = $41 // $41-$42 pointer for READ/DATA copmmands - .label INPPTR = $43 // $43-$44 -- NOT IMPLEMENTED -- - .label VARNAM = $45 // $45-$46 current variable name - .label VARPNT = $47 // $47-$48 current variable/descriptor pointer - .label FORPNT = $49 // $49-$4A -- NOT IMPLEMENTED -- - .label OPPTR = $4B // $4B-$4C helper variable for expression computation, [!] our usage details are different - .label OPMASK = $4D // -- NOT IMPLEMENTED -- - .label DEFPNT = $4E // $4E-$4F -- NOT IMPLEMENTED -- - .label DSCPNT = $50 // $50-$52 temporary area fro string handling, [!] our usage might differ - .label FOUR6 = $53 // size of variable content (float = 5, integer = 2, string descriptor = 3) - .label JMPER = $54 // $54-$56 -- NOT IMPLEMENTED -- - .label TEMPF1 = $57 // $57-$5B BASIC numeric work area - .label TEMPF2 = $5C // $5C-$60 BASIC numeric work area + ; $02 -- UNUSED -- free for user software + !addr ADRAY1 = $03 ; $03-$04 + !addr ADRAY2 = $05 ; $05-$06 + !addr CHARAC = $07 ; [!] our implementation might be different XXX give more details + !addr ENDCHR = $08 ; [!] our implementation might be different XXX give more details + !addr TRMPOS = $09 ; -- NOT IMPLEMENTED -- + !addr VERCKB = $0A ; flag used by BASIC, 0 - LOAD, 1 - VERIFY + !addr COUNT = $0B ; [!] our implementation might be different XXX give more details + !addr DIMFLG = $0C ; [!] our implementation might be different XXX give more details + !addr VALTYP = $0D ; expression eveluation result; $00 - float, $FF - string + !addr INTFLG = $0E ; -- NOT IMPLEMENTED -- + !addr GARBFL = $0F ; [!] our implementation might be different XXX give more details + !addr SUBFLG = $10 ; -- NOT IMPLEMENTED -- + !addr INPFLG = $11 ; -- NOT IMPLEMENTED -- + !addr TANSGN = $12 ; -- NOT IMPLEMENTED -- + !addr CHANNL = $13 ; -- NOT IMPLEMENTED -- + !addr LINNUM = $14 ; $14-$15 BASIC line number, [!] also used by DOS Wedge + !addr TEMPPT = $16 ; pointer to the first available slot in the temporary string descriptor stack + !addr LASTPT = $17 ; $17-$18 pointer to the last used slot in the temporary string descriptor + !addr TEMPST = $19 ; $19-$21 temporary string stack descriptors + !addr INDEX = $22 ; $22-$25 temporary variables, [!] our usage might be different + !addr RESHO = $26 ; $26-$2A temporary variables, [!] our usage might be different + !addr TXTTAB = $2B ; $2B-$2C start of BASIC code + !addr VARTAB = $2D ; $2D-$2E end of BASIC code, start of variables + !addr ARYTAB = $2F ; $2F-$30 pointer to start of array storage + !addr STREND = $31 ; $31-$32 pointer to start of free RAM + !addr FRETOP = $33 ; $33-$34 pointer to bottom of strings area + !addr FRESPC = $35 ; $35-$36 [!] our implementation uses this as temporary string pointer + !addr MEMSIZ = $37 ; $37-$38 highest address of BASIC memory + 1 + !addr CURLIN = $39 ; $39-$3A current BASIC line number + !addr OLDLIN = $3B ; $3B-$3C previous BASIC line number + !addr OLDTXT = $3D ; $3D-$3E current BASIC line pointer + !addr DATLIN = $3F ; $3F-$40 -- NOT IMPLEMENTED -- + !addr DATPTR = $41 ; $41-$42 pointer for READ/DATA copmmands + !addr INPPTR = $43 ; $43-$44 -- NOT IMPLEMENTED -- + !addr VARNAM = $45 ; $45-$46 current variable name + !addr VARPNT = $47 ; $47-$48 current variable/descriptor pointer + !addr FORPNT = $49 ; $49-$4A -- NOT IMPLEMENTED -- + !addr OPPTR = $4B ; $4B-$4C helper variable for expression computation, [!] our usage details are different + !addr OPMASK = $4D ; -- NOT IMPLEMENTED -- + !addr DEFPNT = $4E ; $4E-$4F -- NOT IMPLEMENTED -- + !addr DSCPNT = $50 ; $50-$52 temporary area fro string handling, [!] our usage might differ + !addr FOUR6 = $53 ; size of variable content (float = 5, integer = 2, string descriptor = 3) + !addr JMPER = $54 ; $54-$56 -- NOT IMPLEMENTED -- + !addr TEMPF1 = $57 ; $57-$5B BASIC numeric work area + !addr TEMPF2 = $5C ; $5C-$60 BASIC numeric work area - .label __FAC1 = $61 // $61-$66 floating point accumulator 1 - .label FAC1_exponent = $61 - .label FAC1_mantissa = $62 // $62 - $65 - .label FAC1_sign = $66 + !addr __FAC1 = $61 ; $61-$66 floating point accumulator 1 + !addr FAC1_exponent = $61 + !addr FAC1_mantissa = $62 ; $62 - $65 + !addr FAC1_sign = $66 - .label SGNFLG = $67 // -- NOT IMPLEMENTED -- - .label BITS = $68 // FAC1 overflow + !addr SGNFLG = $67 ; -- NOT IMPLEMENTED -- + !addr BITS = $68 ; FAC1 overflow - .label __FAC2 = $69 // $69-$6E floating point accumulator 2 [!] also used for memory move pointers - .label FAC2_exponent = $69 - .label FAC2_mantissa = $6A // $6A - $6D - .label FAC2_sign = $6E + !addr __FAC2 = $69 ; $69-$6E floating point accumulator 2 [!] also used for memory move pointers + !addr FAC2_exponent = $69 + !addr FAC2_mantissa = $6A ; $6A - $6D + !addr FAC2_sign = $6E - .label ARISGN = $6F // -- NOT IMPLEMENTED -- - .label FACOV = $70 // FAC1 low order mantissa - .label FBUFPT = $71 // $71-$72 -- NOT IMPLEMENTED -- - .label CHRGET = $73 // $73-$8A -- NOT IMPLEMENTED -- - .label TXTPTR = $7A // $7A-$7B current BASIC statement pointer - .label RNDX = $8B // $8B-$8F random number seed + !addr ARISGN = $6F ; -- NOT IMPLEMENTED -- + !addr FACOV = $70 ; FAC1 low order mantissa + !addr FBUFPT = $71 ; $71-$72 -- NOT IMPLEMENTED -- + !addr CHRGET = $73 ; $73-$8A -- NOT IMPLEMENTED -- + !addr TXTPTR = $7A ; $7A-$7B current BASIC statement pointer + !addr RNDX = $8B ; $8B-$8F random number seed - // - // Page 0 - Kernal area ($90-$FF) - // + ; + ; Page 0 - Kernal area ($90-$FF) + ; - .label IOSTATUS = $90 - .label STKEY = $91 // keys down clears bits. STOP - bit 7, C= - bit 6, SPACE - bit 4, CTRL - bit 2 - .label SVXT = $92 // tape reading constant [!] our tape routines use it differently - .label VERCKK = $93 // 0 = LOAD, 1 = VERIFY - .label C3PO = $94 // flag - is BSOUR content valid - .label BSOUR = $95 // serial bus buffered output byte - .label SYNO = $96 // temporary tape routines storage, [!] our usage differs - .label XSAV = $97 // temporary register storage for ASCII/tape related routines [!] usage details might differ - .label LDTND = $98 // number of entries in LAT / FAT / SAT tables - .label DFLTN = $99 // default input device - .label DFLTO = $9A // default output device - .label PRTY = $9B // tape storage for parity/checksum -#if !CONFIG_TAPE_NORMAL && !CONFIG_TAPE_TURBO - .label DPSW = $9C // -- NOT IMPLEMENTED -- -#else - .label COLSTORE = $9C // [!] screen border storage for tape routines -#endif - .label MSGFLG = $9D // bit 6 = error messages, bit 7 = control message - .label PTR1 = $9E // for tape support, counter of errorneous bytes - .label PTR2 = $9F // for tape support, counter for errorneous bytes correction - .label TIME = $A0 // $A0-$A2 jiffy clock - .label IECPROTO = $A3 // [!] IEC or pseudo-IEC protocol, >= $80 for unknown; originally named TSFCNT - .label TBTCNT = $A4 // temporary variable for tape and IEC, [!] our usage probably differs in details - .label CNTDN = $A5 // -- NOT IMPLEMENTED -- - .label BUFPNT = $A6 // -- NOT IMPLEMENTED -- - .label INBIT = $A7 // temporary storage for tape / RS-232 received bits -#if !CONFIG_LEGACY_SCNKEY - .label BITCI = $A8 // -- NOT IMPLEMENTED -- - .label RINONE = $A9 // -- WIP -- (UP9600 only) RS-232 check for start bit flag - .label RIDDATA = $AA // -- NOT IMPLEMENTED -- - .label RIPRTY = $AB // -- WIP -- checksum while reading tape -#endif - .label SAL = $AC // $AC-$AD -- XXX: describe -- (implemented screen part) - .label EAL = $AE // $AE-$AF -- XXX: describe -- [!] used also by screen editor, for temporary color storage when scrolling - .label CMP0 = $B0 // $B0-$B1 temporary tape storage, [!] here used for BRK instruction address - .label TAPE1 = $B2 // $B2-$B3 tape buffer pointer -#if !CONFIG_LEGACY_SCNKEY - .label BITTS = $B4 // -- NOT IMPLEMENTED -- -#endif - .label NXTBIT = $B5 // -- NOT IMPLEMENTED -- -#if !CONFIG_LEGACY_SCNKEY - .label RODATA = $B6 // -- NOT IMPLEMENTED -- -#endif + !addr IOSTATUS = $90 + !addr STKEY = $91 ; keys down clears bits. STOP - bit 7, C= - bit 6, SPACE - bit 4, CTRL - bit 2 + !addr SVXT = $92 ; tape reading constant [!] our tape routines use it differently + !addr VERCKK = $93 ; 0 = LOAD, 1 = VERIFY + !addr C3PO = $94 ; flag - is BSOUR content valid + !addr BSOUR = $95 ; serial bus buffered output byte + !addr SYNO = $96 ; temporary tape routines storage, [!] our usage differs + !addr XSAV = $97 ; temporary register storage for ASCII/tape related routines [!] usage details might differ + !addr LDTND = $98 ; number of entries in LAT / FAT / SAT tables + !addr DFLTN = $99 ; default input device + !addr DFLTO = $9A ; default output device + !addr PRTY = $9B ; tape storage for parity/checksum +!ifndef HAS_TAPE { + !addr DPSW = $9C ; -- NOT IMPLEMENTED -- +} else { + !addr COLSTORE = $9C ; [!] screen border storage for tape routines +} + !addr MSGFLG = $9D ; bit 6 = error messages, bit 7 = control message + !addr PTR1 = $9E ; for tape support, counter of errorneous bytes + !addr PTR2 = $9F ; for tape support, counter for errorneous bytes correction + !addr TIME = $A0 ; $A0-$A2 jiffy clock + !addr IECPROTO = $A3 ; [!] IEC or pseudo-IEC protocol, >= $80 for unknown; originally named TSFCNT + !addr TBTCNT = $A4 ; temporary variable for tape and IEC, [!] our usage probably differs in details + !addr CNTDN = $A5 ; -- NOT IMPLEMENTED -- + !addr BUFPNT = $A6 ; -- NOT IMPLEMENTED -- + !addr INBIT = $A7 ; temporary storage for tape / RS-232 received bits +!ifndef CONFIG_LEGACY_SCNKEY { + !addr BITCI = $A8 ; -- NOT IMPLEMENTED -- + !addr RINONE = $A9 ; -- WIP -- (UP9600 only) RS-232 check for start bit flag + !addr RIDDATA = $AA ; -- NOT IMPLEMENTED -- + !addr RIPRTY = $AB ; -- WIP -- checksum while reading tape +} + !addr SAL = $AC ; $AC-$AD -- XXX: describe -- (implemented screen part) + !addr EAL = $AE ; $AE-$AF -- XXX: describe -- [!] used also by screen editor, for temporary color storage when scrolling + !addr CMP0 = $B0 ; $B0-$B1 temporary tape storage, [!] here used for BRK instruction address + !addr TAPE1 = $B2 ; $B2-$B3 tape buffer pointer +!ifndef CONFIG_LEGACY_SCNKEY { + !addr BITTS = $B4 ; -- NOT IMPLEMENTED -- +} + !addr NXTBIT = $B5 ; -- NOT IMPLEMENTED -- +!ifndef CONFIG_LEGACY_SCNKEY { + !addr RODATA = $B6 ; -- NOT IMPLEMENTED -- +} + !addr FNLEN = $B7 ; current file name length + !addr LA = $B8 ; current logical_file number + !addr SA = $B9 ; current secondary address + !addr FA = $BA ; current device number + !addr FNADDR = $BB ; $BB-$BC current file name pointer + !addr ROPRTY = $BD ; -- NOT IMPLEMENTED -- tape / RS-232 temporary storage + !addr FSBLK = $BE ; -- NOT IMPLEMENTED -- tape / RS-232 temporary storage + !addr MYCH = $BF ; -- NOT IMPLEMENTED -- + !addr CAS1 = $C0 ; tape motor interlock + !addr STAL = $C1 ; $C1-$C2 LOAD/SAVE start address + !addr MEMUSS = $C3 ; $C3-$C4 temporary address for tape LOAD/SAVE + !addr LSTX = $C5 ; last key matrix position [!] our usage probably differs in details + !addr NDX = $C6 ; number of chars in keyboard buffer + !addr RVS = $C7 ; flag, whether to print reversed characters + !addr INDX = $C8 ; end of logical line (column, 0-79) + !addr LSXP = $C9 ; $C9-$CA start of input, X/Y position (typo in Mapping the C64, fixed in Mapping the C128) + !addr SFDX = $CB ; -- NOT IMPLEMENTED -- + !addr BLNSW = $CC ; cursor blink disable flag + !addr BLNCT = $CD ; cursor blink countdown + !addr GDBLN = $CE ; cursor saved character + !addr BLNON = $CF ; cursor visibility flag + !addr CRSW = $D0 ; whether to input from screen or keyboard (if from screen, stores input offset) + !addr PNT = $D1 ; $D1-$D2 pointer to the current screen line + !addr PNTR = $D3 ; current screen X position (logical column), 0-79 + !addr QTSW = $D4 ; quote mode flag + !addr LNMX = $D5 ; logical line length, 39 or 79 + !addr TBLX = $D6 ; current screen Y position (row), 0-24 + !addr SCHAR = $D7 ; ASCII value of the last printed character + !addr INSRT = $D8 ; insert mode flag/counter + !addr LDTB1 = $D9 ; $D9-$F2 screen line link table, [!] our usage is different XXX give more details + !addr USER = $F3 ; $F3-$F4 pointer to current color RAM location + !addr KEYTAB = $F5 ; $F5-$F6 pointer to keyboard lookup table + !addr RIBUF = $F7 ; $F7-$F8 -- WIP -- RS-232 receive buffer pointer + !addr ROBUF = $F9 ; $F9-$FA -- WIP -- RS-232 send buffer pointer + ; $FB $FB-$FE -- UNUSED -- free for user software + !addr BASZPT = $FF ; -- NOT IMPLEMENTED -- - .label FNLEN = $B7 // current file name length - .label LA = $B8 // current logical_file number - .label SA = $B9 // current secondary address - .label FA = $BA // current device number - .label FNADDR = $BB // $BB-$BC current file name pointer - .label ROPRTY = $BD // -- NOT IMPLEMENTED -- tape / RS-232 temporary storage - .label FSBLK = $BE // -- NOT IMPLEMENTED -- tape / RS-232 temporary storage - .label MYCH = $BF // -- NOT IMPLEMENTED -- - .label CAS1 = $C0 // tape motor interlock - .label STAL = $C1 // $C1-$C2 LOAD/SAVE start address - .label MEMUSS = $C3 // $C3-$C4 temporary address for tape LOAD/SAVE - .label LSTX = $C5 // last key matrix position [!] our usage probably differs in details - .label NDX = $C6 // number of chars in keyboard buffer - .label RVS = $C7 // flag, whether to print reversed characters - .label INDX = $C8 // end of logical line (column, 0-79) - .label LSXP = $C9 // $C9-$CA start of input, X/Y position (typo in Mapping the C64, fixed in Mapping the C128) - .label SFDX = $CB // -- NOT IMPLEMENTED -- - .label BLNSW = $CC // cursor blink disable flag - .label BLNCT = $CD // cursor blink countdown - .label GDBLN = $CE // cursor saved character - .label BLNON = $CF // cursor visibility flag - .label CRSW = $D0 // whether to input from screen or keyboard (if from screen, stores input offset) - .label PNT = $D1 // $D1-$D2 pointer to the current screen line - .label PNTR = $D3 // current screen X position (logical column), 0-79 - .label QTSW = $D4 // quote mode flag - .label LNMX = $D5 // logical line length, 39 or 79 - .label TBLX = $D6 // current screen Y position (row), 0-24 - .label SCHAR = $D7 // ASCII value of the last printed character - .label INSRT = $D8 // insert mode flag/counter - .label LDTB1 = $D9 // $D9-$F2 screen line link table, [!] our usage is different XXX give more details - .label USER = $F3 // $F3-$F4 pointer to current color RAM location - .label KEYTAB = $F5 // $F5-$F6 pointer to keyboard lookup table - .label RIBUF = $F7 // $F7-$F8 -- WIP -- RS-232 receive buffer pointer - .label ROBUF = $F9 // $F9-$FA -- WIP -- RS-232 send buffer pointer - // $FB $FB-$FE -- UNUSED -- free for user software - .label BASZPT = $FF // -- NOT IMPLEMENTED -- + ; + ; Page 1 + ; - // - // Page 1 - // + !addr STACK = $100 ; $100-$1FF, processor stack - .label STACK = $100 // $100-$1FF, processor stack - - // - // Pages 2 & 3 - // + ; + ; Pages 2 & 3 + ; - .label BUF = $200 // $200-$250, BASIC line editor input buffer (81 bytes) + !addr BUF = $200 ; $200-$250, BASIC line editor input buffer (81 bytes) - // $250-$258 is the 81st - 88th characters in BASIC input, a carry over from VIC-20 - // and not used on C64 - they are used if CONFIG_LEGACY_SCNKEY is enabled. + ; $250-$258 is the 81st - 88th characters in BASIC input, a carry over from VIC-20 + ; and not used on C64 - they are used if CONFIG_LEGACY_SCNKEY is enabled. - // [!] XXX document $251-$258 usage - .label LAT = $259 // $259-$262, logical file numbers (table, 10 bytes) - .label FAT = $263 // $263-$26C, device numbers (table, 10 bytes) - .label SAT = $26D // $26D-$276, secondary addresses (table, 10 bytes) - .label KEYD = $277 // $277-$280, keyboard buffer - .label MEMSTR = $281 // $281-$282, start of BASIC memory - .label MEMSIZK = $283 // $283-$284, NOTE: Mapping the 64 erroneously has the hex as $282 (DEC is correct) - .label TIMOUT = $285 // IEEE-488 timeout - .label COLOR = $286 // current text foreground color - .label GDCOL = $287 // color of character under cursor - .label HIBASE = $288 // high byte of start of screen - .label XMAX = $289 // max keyboard buffer size - .label RPTFLG = $28A // whether to repeat keys (highest bit set = repeat) - .label KOUNT = $28B // key repeat counter - .label DELAY = $28C // -- NOT IMPLEMENTED -- - .label SHFLAG = $28D // bucky keys (SHIFT/CTRL/C=) flags - .label LSTSHF = $28E // last bucky key flags - .label KEYLOG = $28F // $28F-$290 routine to setup keyboard decoding - .label MODE = $291 // flag, is case switch allowed - .label AUTODN = $292 // -- NOT IMPLEMENTED -- screen scroll disable -#if !CONFIG_LEGACY_SCNKEY - .label M51CRT = $293 // -- NOT IMPLEMENTED -- mock 6551 - .label M51CDR = $294 // -- NOT IMPLEMENTED -- mock 6551 - .label M51AJB = $295 // $295-$296 -- NOT IMPLEMENTED -- mock 6551 - .label RSSTAT = $297 // -- WIP -- (UP9600 only) mock 6551, RS-232 status - .label BITNUM = $298 // -- NOT IMPLEMENTED -- - .label BAUDOF = $299 // $299-$29A -- NOT IMPLEMENTED -- -#endif - .label RIDBE = $29B // -- WIP -- write pointer into RS-232 receive buffer - .label RIDBS = $29C // -- WIP -- read pointer into RS-232 receive buffer - .label RODBS = $29D // -- WIP -- read pointer into RS-232 send buffer - .label RODBE = $29E // -- WIP -- write pointer into RS-232 send buffer - .label IRQTMP = $29F // $29F-$2A0 temporary IRQ vector storage [!] we use it for tape speed calibration instead - .label ENABL = $2A1 // -- NOT IMPLEMENTED -- - .label TODSNS = $2A2 // -- NOT IMPLEMENTED -- - .label TRDTMP = $2A3 // -- NOT IMPLEMENTED -- - .label TD1IRQ = $2A4 // -- NOT IMPLEMENTED -- - .label TLNIDX = $2A5 // -- NOT IMPLEMENTED -- - .label TVSFLG = $2A6 // 0 = NTSC, 1 = PAL + ; [!] XXX document $251-$258 usage + !addr LAT = $259 ; $259-$262, logical file numbers (table, 10 bytes) + !addr FAT = $263 ; $263-$26C, device numbers (table, 10 bytes) + !addr SAT = $26D ; $26D-$276, secondary addresses (table, 10 bytes) + !addr KEYD = $277 ; $277-$280, keyboard buffer + !addr MEMSTR = $281 ; $281-$282, start of BASIC memory + !addr MEMSIZK = $283 ; $283-$284, NOTE: Mapping the 64 erroneously has the hex as $282 (DEC is correct) + !addr TIMOUT = $285 ; IEEE-488 timeout + !addr COLOR = $286 ; current text foreground color + !addr GDCOL = $287 ; color of character under cursor + !addr HIBASE = $288 ; high byte of start of screen + !addr XMAX = $289 ; max keyboard buffer size + !addr RPTFLG = $28A ; whether to repeat keys (highest bit set = repeat) + !addr KOUNT = $28B ; key repeat counter + !addr DELAY = $28C ; -- NOT IMPLEMENTED -- + !addr SHFLAG = $28D ; bucky keys (SHIFT/CTRL/C=) flags + !addr LSTSHF = $28E ; last bucky key flags + !addr KEYLOG = $28F ; $28F-$290 routine to setup keyboard decoding + !addr MODE = $291 ; flag, is case switch allowed + !addr AUTODN = $292 ; -- NOT IMPLEMENTED -- screen scroll disable +!ifndef CONFIG_LEGACY_SCNKEY { + !addr M51CRT = $293 ; -- NOT IMPLEMENTED -- mock 6551 + !addr M51CDR = $294 ; -- NOT IMPLEMENTED -- mock 6551 + !addr M51AJB = $295 ; $295-$296 -- NOT IMPLEMENTED -- mock 6551 + !addr RSSTAT = $297 ; -- WIP -- (UP9600 only) mock 6551, RS-232 status + !addr BITNUM = $298 ; -- NOT IMPLEMENTED -- + !addr BAUDOF = $299 ; $299-$29A -- NOT IMPLEMENTED -- +} + !addr RIDBE = $29B ; -- WIP -- write pointer into RS-232 receive buffer + !addr RIDBS = $29C ; -- WIP -- read pointer into RS-232 receive buffer + !addr RODBS = $29D ; -- WIP -- read pointer into RS-232 send buffer + !addr RODBE = $29E ; -- WIP -- write pointer into RS-232 send buffer + !addr IRQTMP = $29F ; $29F-$2A0 temporary IRQ vector storage [!] we use it for tape speed calibration instead + !addr ENABL = $2A1 ; -- NOT IMPLEMENTED -- + !addr TODSNS = $2A2 ; -- NOT IMPLEMENTED -- + !addr TRDTMP = $2A3 ; -- NOT IMPLEMENTED -- + !addr TD1IRQ = $2A4 ; -- NOT IMPLEMENTED -- + !addr TLNIDX = $2A5 ; -- NOT IMPLEMENTED -- + !addr TVSFLG = $2A6 ; 0 = NTSC, 1 = PAL - // [!] $2A7-$2FF is normally free, but in our case some extra functionality uses it + ; [!] $2A7-$2FF is normally free, but in our case some extra functionality uses it -#if CONFIG_MEMORY_MODEL_60K +!ifdef CONFIG_MEMORY_MODEL_60K { - // IRQs are disabled when doing such accesses, and a default NMI handler only increments - // a counter, so that if an NMI occurs, it does not crash the machine, but can be captured. + ; IRQs are disabled when doing such accesses, and a default NMI handler only increments + ; a counter, so that if an NMI occurs, it does not crash the machine, but can be captured. - .label missed_nmi_flag = $2A7 - .label tiny_nmi_handler = $2A8 - .label peek_under_roms = tiny_nmi_handler + peek_under_roms_routine - tiny_nmi_handler_routine - .label poke_under_roms = tiny_nmi_handler + poke_under_roms_routine - tiny_nmi_handler_routine - .label memmap_allram = tiny_nmi_handler + memmap_allram_routine - tiny_nmi_handler_routine - .label memmap_normal = tiny_nmi_handler + memmap_normal_routine - tiny_nmi_handler_routine -#if SEGMENT_BASIC - .label shift_mem_up_internal = tiny_nmi_handler + shift_mem_up_routine - tiny_nmi_handler_routine - .label shift_mem_down_internal = tiny_nmi_handler + shift_mem_down_routine - tiny_nmi_handler_routine -#endif + !addr missed_nmi_flag = $2A7 + !addr tiny_nmi_handler = $2A8 + !addr peek_under_roms = tiny_nmi_handler + peek_under_roms_routine - tiny_nmi_handler_routine + !addr poke_under_roms = tiny_nmi_handler + poke_under_roms_routine - tiny_nmi_handler_routine + !addr memmap_allram = tiny_nmi_handler + memmap_allram_routine - tiny_nmi_handler_routine + !addr memmap_normal = tiny_nmi_handler + memmap_normal_routine - tiny_nmi_handler_routine +!ifdef SEGMENT_BASIC { + !addr shift_mem_up_internal = tiny_nmi_handler + shift_mem_up_routine - tiny_nmi_handler_routine + !addr shift_mem_down_internal = tiny_nmi_handler + shift_mem_down_routine - tiny_nmi_handler_routine +} -#endif // CONFIG_MEMORY_MODEL_60K +} ; CONFIG_MEMORY_MODEL_60K - // BASIC vectors - .label IERROR = $300 // $300-$301 - .label IMAIN = $302 // $302-$303 - .label ICRNCH = $304 // $304-$305 - .label IQPLOP = $306 // $306-$307 - .label IGONE = $308 // $308-$309 - .label IEVAL = $30A // $30A-$30B + ; BASIC vectors + !addr IERROR = $300 ; $300-$301 + !addr IMAIN = $302 ; $302-$303 + !addr ICRNCH = $304 ; $304-$305 + !addr IQPLOP = $306 ; $306-$307 + !addr IGONE = $308 ; $308-$309 + !addr IEVAL = $30A ; $30A-$30B - .label SAREG = $30C // .A storage, for SYS call - .label SXREG = $30D // .X storage, for SYS call - .label SYREG = $30E // .Y storage, for SYS call - .label SPREG = $30F // .P storage, for SYS call + !addr SAREG = $30C ; .A storage, for SYS call + !addr SXREG = $30D ; .X storage, for SYS call + !addr SYREG = $30E ; .Y storage, for SYS call + !addr SPREG = $30F ; .P storage, for SYS call - .label USRPOK = $310 // -- NOT IMPLEMENTED -- JMP instruction - .label USRADD = $311 // $311-$312 -- NOT IMPLEMENTED -- - // $313 -- UNUSED -- free for user software + !addr USRPOK = $310 ; -- NOT IMPLEMENTED -- JMP instruction + !addr USRADD = $311 ; $311-$312 -- NOT IMPLEMENTED -- + ; $313 -- UNUSED -- free for user software - // Kernal vectors - interrupts - .label CINV = $314 // $314-$315 - .label CBINV = $316 // $316-$317 - .label NMINV = $318 // $318-$319 + ; Kernal vectors - interrupts + !addr CINV = $314 ; $314-$315 + !addr CBINV = $316 ; $316-$317 + !addr NMINV = $318 ; $318-$319 - // Kernal vectors - routines - .label IOPEN = $31A // $31A-$31B - .label ICLOSE = $31C // $31C-$31D - .label ICHKIN = $31E // $31E-$31F - .label ICKOUT = $320 // $320-$321 - .label ICLRCH = $322 // $322-$323 - .label IBASIN = $324 // $324-$325 - .label IBSOUT = $326 // $326-$327 - .label ISTOP = $328 // $328-$329 - .label IGETIN = $32A // $32A-$32B - .label ICLALL = $32C // $32C-$32D - .label USRCMD = $32E // $32E-$32F - .label ILOAD = $330 // $330-$331 - .label ISAVE = $332 // $332-$333 + ; Kernal vectors - routines + !addr IOPEN = $31A ; $31A-$31B + !addr ICLOSE = $31C ; $31C-$31D + !addr ICHKIN = $31E ; $31E-$31F + !addr ICKOUT = $320 ; $320-$321 + !addr ICLRCH = $322 ; $322-$323 + !addr IBASIN = $324 ; $324-$325 + !addr IBSOUT = $326 ; $326-$327 + !addr ISTOP = $328 ; $328-$329 + !addr IGETIN = $32A ; $32A-$32B + !addr ICLALL = $32C ; $32C-$32D + !addr USRCMD = $32E ; $32E-$32F + !addr ILOAD = $330 ; $330-$331 + !addr ISAVE = $332 ; $332-$333 - // $314 $334-$33B -- UNUSED -- free for user software + ; $314 $334-$33B -- UNUSED -- free for user software -#if !CONFIG_RS232_UP9600 - .label TBUFFR = $33C // $33C-$3FB [!] tape buffer, our usage details differ -#else - .label REVTAB = $37C // $37C-$3FB -- WIP -- [!] RS-232 precalculated data -#endif +!ifndef CONFIG_RS232_UP9600 { + !addr TBUFFR = $33C ; $33C-$3FB [!] tape buffer, our usage details differ +} else { + !addr REVTAB = $37C ; $37C-$3FB -- WIP -- [!] RS-232 precalculated data +} - // $3FC $3FC-$3FF -- UNUSED -- free for user software + ; $3FC $3FC-$3FF -- UNUSED -- free for user software -// -// Definitions for extended IEC functionality -// +; +; Definitions for extended IEC functionality +; - .const IEC_NORMAL = 0 // has to be 0, always! -#if CONFIG_IEC_JIFFYDOS - .const IEC_JIFFY = 1 // has to be 1, always! -#endif -#if CONFIG_IEC_DOLPHINDOS - .const IEC_DOLPHIN = 2 -#endif -#if CONFIG_IEC_BURST_CIA1 || CONFIG_IEC_BURST_CIA2 || ROM_LAYOUT_M65 - .const IEC_BURST = 3 -#endif -#if ROM_LAYOUT_M65 - .const IEC_ROMDOS = 4 -#endif + !set IEC_NORMAL = 0 ; has to be 0, always! +!ifdef CONFIG_IEC_JIFFYDOS { + !set IEC_JIFFY = 1 ; has to be 1, always! +} +!ifdef CONFIG_IEC_DOLPHINDOS { + !set IEC_DOLPHIN = 2 +} +!ifdef HAS_IEC_BURST { + !set IEC_BURST = 3 +} +!ifdef CONFIG_MB_M65 { + !set IEC_ROMDOS = 4 +} -// -// Definitions for tape functionality -// +; +; Definitions for tape functionality +; -#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO +!ifdef HAS_TAPE { - .label __normal_time_S = IRQTMP+0 // duration of the short pulse - .label __normal_time_M = IRQTMP+1 // duration of the medium pulse + !addr __normal_time_S = IRQTMP+0 ; duration of the short pulse + !addr __normal_time_M = IRQTMP+1 ; duration of the medium pulse - .label __turbo_half_S = IRQTMP+0 // half-duration of the short pulse - .label __turbo_half_L = IRQTMP+1 // half-duration of the long pulse + !addr __turbo_half_S = IRQTMP+0 ; half-duration of the short pulse + !addr __turbo_half_L = IRQTMP+1 ; half-duration of the long pulse - .label __pulse_threshold = SVXT // pulse classification threshold - .label __pulse_threshold_ML = SYNO // M/L pulse classification threshold, for normal only + !addr __pulse_threshold = SVXT ; pulse classification threshold + !addr __pulse_threshold_ML = SYNO ; M/L pulse classification threshold, for normal only +} -#endif +!ifdef CONFIG_TAPE_TURBO { -#if CONFIG_TAPE_TURBO - - .label __tape_turbo_bytestore = STACK // location of byte storage helper routine - -#endif + !addr __tape_turbo_bytestore = STACK ; location of byte storage helper routine +} diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index c109804e..73b55d0f 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -1,76 +1,76 @@ -// #LAYOUT# M65 * #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 * #TAKE +;; #LAYOUT# * * #IGNORE -// -// Names of ZP and low memory locations for the native MEGA65 mode -// +; +; Names of ZP and low memory locations for the native MEGA65 mode +; - // - // Page 0 - reused LDTB1 and USER - // + ; + ; Page 0 - reused LDTB1 and USER + ; - .label M65_TMP__K1 = $D9 // $D9 -- UNUSED -- temporary value for various Kernal routines - .label M65_LPNT_BAS1 = $DA // $DA-$DD 4-byte pointer for temporary usage within BASIC - .label M65_LPNT_BAS2 = $DE // $DE-$E1 4-byte pointer for temporary usage within BASIC - .label M65_LPNT_SCR = $E2 // $E2-$E5 4-byte pointer for temporary usage within BASIC and screen editor - // E6 reserved for BASIC error handling routines, also in native mode - .label M65_MAGICSTR = $E7 // $E7-$E9 if equals 'M65' it means we are in native mode - // EA reserved for BASIC error handling routines, also in native mode - .label M65_LPNT_IRQ = $EB // $EB-$EE 4-byte pointer for temporary usage within interrupts - .label M65_LPNT_KERN = $EF // $EF-$F3 4-byte pointer for temporary usage by KERNAL - .label M65_TMP__K2 = $F4 // $F4 -- UNUSED -- temporary value for various Kernal routines + !addr M65_TMP__K1 = $D9 ; $D9 -- UNUSED -- temporary value for various Kernal routines + !addr M65_LPNT_BAS1 = $DA ; $DA-$DD 4-byte pointer for temporary usage within BASIC + !addr M65_LPNT_BAS2 = $DE ; $DE-$E1 4-byte pointer for temporary usage within BASIC + !addr M65_LPNT_SCR = $E2 ; $E2-$E5 4-byte pointer for temporary usage within BASIC and screen editor + ; E6 reserved for BASIC error handling routines, also in native mode + !addr M65_MAGICSTR = $E7 ; $E7-$E9 if equals 'M65' it means we are in native mode + ; EA reserved for BASIC error handling routines, also in native mode + !addr M65_LPNT_IRQ = $EB ; $EB-$EE 4-byte pointer for temporary usage within interrupts + !addr M65_LPNT_KERN = $EF ; $EF-$F3 4-byte pointer for temporary usage by KERNAL + !addr M65_TMP__K2 = $F4 ; $F4 -- UNUSED -- temporary value for various Kernal routines - // - // Page 0 - other reused values - // + ; + ; Page 0 - other reused values + ; - .label M65__TXTROW = TBLX // screen row - .label M65__TXTCOL = PNTR // screen column - .label M65__SCRINPUT = LSXP // pointer to the screen input, within the screen segment + !addr M65__TXTROW = TBLX ; screen row + !addr M65__TXTCOL = PNTR ; screen column + !addr M65__SCRINPUT = LSXP ; pointer to the screen input, within the screen segment - // - // Pages 4-7 - reused screen memory - // + ; + ; Pages 4-7 - reused screen memory + ; - // $400-$57F - reserved for BASIC + ; $400-$57F - reserved for BASIC - // $400-$57F -- UNUSED -- reserved for BASIC + ; $400-$57F -- UNUSED -- reserved for BASIC - // $580-$5FF - reserved for KERNAL + ; $580-$5FF - reserved for KERNAL - .label M65_SCRSEG = $580 // $580-$581 segment address (2 higher bytes) of the screen memory - .label M65_SCRBASE = $582 // $582-$583 first byte of screen memory - .label M65_SCRGUARD = $584 // $584-$585 last byte of screen memory + 1 XXX is it needed? - .label M65_COLGUARD = $586 // $586-$587 last byte of colour memory + 1 - .label M65_COLVIEW = $588 // $588-$589 first byte of color memory viewport - .label M65_COLVIEWMAX = $58A // $58A-$58B largest allowed value of M65_COLVIEW - .label M65_SCRMODE = $58C // 0 = 40x25, 1 = 80x25, 2 = 80x50 - .label M65_SCRWINMODE = $58D // $00 = normal mode, $FF = window enabled - .label M65_TXTWIN_X0 = $58E // text window - top-left X coordinate, starting from 0 - .label M65_TXTWIN_Y0 = $58F // text window - top-left Y coordinate, starting from 0 - .label M65_TXTWIN_X1 = $590 // text window - bottom-right X coordinate + 1 - .label M65_TXTWIN_Y1 = $591 // text window - bottom-right Y coordinate + 1 - .label M65_TXTROW_OFF = $592 // $592-$593 offset to the current text row from the viewport start - .label M65_SCRCOLMAX = $594 // maximum allowed column - // $595-$5EB -- UNUSED -- - .label M65_DMAGIC_LIST = $5EF // $5EF-$5FF reserved for DMAgic list, 17 bytes - .label M65_RS232_INBUF = $600 // $600-$6FF -- reserved for RS-232 input buffer -- - .label M65_RS232_OUTBUF = $700 // $700-$7FF -- reserved for RS-232 output buffer -- + !addr M65_SCRSEG = $580 ; $580-$581 segment address (2 higher bytes) of the screen memory + !addr M65_SCRBASE = $582 ; $582-$583 first byte of screen memory + !addr M65_SCRGUARD = $584 ; $584-$585 last byte of screen memory + 1 XXX is it needed? + !addr M65_COLGUARD = $586 ; $586-$587 last byte of colour memory + 1 + !addr M65_COLVIEW = $588 ; $588-$589 first byte of color memory viewport + !addr M65_COLVIEWMAX = $58A ; $58A-$58B largest allowed value of M65_COLVIEW + !addr M65_SCRMODE = $58C ; 0 = 40x25, 1 = 80x25, 2 = 80x50 + !addr M65_SCRWINMODE = $58D ; $00 = normal mode, $FF = window enabled + !addr M65_TXTWIN_X0 = $58E ; text window - top-left X coordinate, starting from 0 + !addr M65_TXTWIN_Y0 = $58F ; text window - top-left Y coordinate, starting from 0 + !addr M65_TXTWIN_X1 = $590 ; text window - bottom-right X coordinate + 1 + !addr M65_TXTWIN_Y1 = $591 ; text window - bottom-right Y coordinate + 1 + !addr M65_TXTROW_OFF = $592 ; $592-$593 offset to the current text row from the viewport start + !addr M65_SCRCOLMAX = $594 ; maximum allowed column + ; $595-$5EB -- UNUSED -- + !addr M65_DMAGIC_LIST = $5EF ; $5EF-$5FF reserved for DMAgic list, 17 bytes + !addr M65_RS232_INBUF = $600 ; $600-$6FF -- reserved for RS-232 input buffer -- + !addr M65_RS232_OUTBUF = $700 ; $700-$7FF -- reserved for RS-232 output buffer -- - // - // Addresses for configuring the DMA job - // + ; + ; Addresses for configuring the DMA job + ; - .label M65_DMAJOB_SIZE_0 = M65_DMAGIC_LIST + 7 - .label M65_DMAJOB_SIZE_1 = M65_DMAGIC_LIST + 8 + !addr M65_DMAJOB_SIZE_0 = M65_DMAGIC_LIST + 7 + !addr M65_DMAJOB_SIZE_1 = M65_DMAGIC_LIST + 8 - .label M65_DMAJOB_SRC_0 = M65_DMAGIC_LIST + 9 - .label M65_DMAJOB_SRC_1 = M65_DMAGIC_LIST + 10 - .label M65_DMAJOB_SRC_2 = M65_DMAGIC_LIST + 11 - .label M65_DMAJOB_SRC_3 = M65_DMAGIC_LIST + 2 + !addr M65_DMAJOB_SRC_0 = M65_DMAGIC_LIST + 9 + !addr M65_DMAJOB_SRC_1 = M65_DMAGIC_LIST + 10 + !addr M65_DMAJOB_SRC_2 = M65_DMAGIC_LIST + 11 + !addr M65_DMAJOB_SRC_3 = M65_DMAGIC_LIST + 2 - .label M65_DMAJOB_DST_0 = M65_DMAGIC_LIST + 12 - .label M65_DMAJOB_DST_1 = M65_DMAGIC_LIST + 13 - .label M65_DMAJOB_DST_2 = M65_DMAGIC_LIST + 14 - .label M65_DMAJOB_DST_3 = M65_DMAGIC_LIST + 4 + !addr M65_DMAJOB_DST_0 = M65_DMAGIC_LIST + 12 + !addr M65_DMAJOB_DST_1 = M65_DMAGIC_LIST + 13 + !addr M65_DMAJOB_DST_2 = M65_DMAGIC_LIST + 14 + !addr M65_DMAJOB_DST_3 = M65_DMAGIC_LIST + 4 diff --git a/src/aliases/,aliases_ram_over64K_m65.s b/src/aliases/,aliases_ram_over64K_m65.s index 0c49297d..63a1ffcd 100644 --- a/src/aliases/,aliases_ram_over64K_m65.s +++ b/src/aliases/,aliases_ram_over64K_m65.s @@ -1,24 +1,24 @@ -// #LAYOUT# M65 * #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 * #TAKE +;; #LAYOUT# * * #IGNORE - // XXX target High RAM memory map concept - TODO: update current code + ; XXX target High RAM memory map concept - TODO: update current code - // $10000-$17FFF (32KB) - reserved for DOS - // $18000-$18FFF (4KB) - chargen copied to RAM, to allow character redefinition + ; $10000-$17FFF (32KB) - reserved for DOS + ; $18000-$18FFF (4KB) - chargen copied to RAM, to allow character redefinition -.const MEMCONF_CHRBASE = $8000 +!set MEMCONF_CHRBASE = $8000 - // $19000-$1B7FF (10KB) - reserved for virtual text screen, 80x128 + ; $19000-$1B7FF (10KB) - reserved for virtual text screen, 80x128 -.const MEMCONF_SCRBASE = $9000 -.const MEMCONF_SCRROWS = 128 +!set MEMCONF_SCRBASE = $9000 +!set MEMCONF_SCRROWS = 128 - // $1B800-$1DFFF (10KB) - reserved for a color RAM backup when switchin between text/graphics modes - // (4KB) - reserved for sprites - // (2KB) - reserved for future use - // (2KB) - color RAM mirror, not useable - // $20000-$2FFFF (64KB) - ROM, the essential part - // $30000-$4FFFF (64KB) - ROM, additions - // $50000-$57FFF (32KB) - reserved for graphics screen - // $58000-... - extended BASIC variables, RAM disk, etc. + ; $1B800-$1DFFF (10KB) - reserved for a color RAM backup when switchin between text/graphics modes + ; (4KB) - reserved for sprites + ; (2KB) - reserved for future use + ; (2KB) - color RAM mirror, not useable + ; $20000-$2FFFF (64KB) - ROM, the essential part + ; $30000-$4FFFF (64KB) - ROM, additions + ; $50000-$57FFF (32KB) - reserved for graphics screen + ; $58000-... - extended BASIC variables, RAM disk, etc. diff --git a/src/aliases/,aliases_rom_basic.s b/src/aliases/,aliases_rom_basic.s index 89963b51..cf763787 100644 --- a/src/aliases/,aliases_rom_basic.s +++ b/src/aliases/,aliases_rom_basic.s @@ -1,15 +1,14 @@ - // BASIC startup vectors + ; BASIC startup vectors -#if ROM_LAYOUT_X16 +!ifdef CONFIG_PLATFORM_COMMANDER_X16 { - .label IBASIC_COLD_START = $C000 - .label IBASIC_WARM_START = $C002 + !addr IBASIC_COLD_START = $C000 + !addr IBASIC_WARM_START = $C002 -#else +} else { - .label IBASIC_COLD_START = $A000 - .label IBASIC_WARM_START = $A002 - -#endif + !addr IBASIC_COLD_START = $A000 + !addr IBASIC_WARM_START = $A002 +} diff --git a/src/aliases/,aliases_rom_cart.s b/src/aliases/,aliases_rom_cart.s index 620960a7..cc4fda07 100644 --- a/src/aliases/,aliases_rom_cart.s +++ b/src/aliases/,aliases_rom_cart.s @@ -1,10 +1,9 @@ -#if CONFIG_PLATFORM_COMMODORE_64 +!ifdef CONFIG_PLATFORM_COMMODORE_64 { - // Cartridge ROM locations + ; Cartridge ROM locations - .label ICART_COLD_START = $8000 // $8000-$8001, cartridge cold start vector - .label ICART_WARM_START = $8002 // $8002-$8003, cartridge warm start vector (RESTORE key) - .label CART_SIG = $8004 // $8004-$8008, signature for cartridge detection - -#endif + !addr ICART_COLD_START = $8000 ; $8000-$8001, cartridge cold start vector + !addr ICART_WARM_START = $8002 ; $8002-$8003, cartridge warm start vector (RESTORE key) + !addr CART_SIG = $8004 ; $8004-$8008, signature for cartridge detection +} diff --git a/src/aliases/,aliases_rom_kernal.s b/src/aliases/,aliases_rom_kernal.s index 2f568ce2..92368db6 100644 --- a/src/aliases/,aliases_rom_kernal.s +++ b/src/aliases/,aliases_rom_kernal.s @@ -1,44 +1,44 @@ -// #LAYOUT# * BASIC_1 #IGNORE -// #LAYOUT# * * #TAKE +;; #LAYOUT# * BASIC_1 #IGNORE +;; #LAYOUT# * * #TAKE - // Kernal jump table + ; Kernal jump table - .label JCINT = $FF81 - .label JIOINIT = $FF84 - .label JRAMTAS = $FF87 - .label JRESTOR = $FF8A - .label JVECTOR = $FF8D - .label JSETMSG = $FF90 - .label JSECOND = $FF93 - .label JTKSA = $FF96 - .label JMEMTOP = $FF99 - .label JMEMBOT = $FF9C - .label JSCNKEY = $FF9F - .label JSETTMO = $FFA2 - .label JACPTR = $FFA5 - .label JCIOUT = $FFA8 - .label JUNTLK = $FFAB - .label JUNLSN = $FFAE - .label JLISTEN = $FFB1 - .label JTALK = $FFB4 - .label JREADST = $FFB7 - .label JSETFLS = $FFBA - .label JSETNAM = $FFBD - .label JOPEN = $FFC0 - .label JCLOSE = $FFC3 - .label JCHKIN = $FFC6 - .label JCKOUT = $FFC9 - .label JCLRCHN = $FFCC - .label JCHRIN = $FFCF - .label JCHROUT = $FFD2 - .label JLOAD = $FFD5 - .label JSAVE = $FFD8 - .label JSETTIM = $FFDB - .label JRDTIM = $FFDE - .label JSTOP = $FFE1 - .label JGETIN = $FFE4 - .label JCLALL = $FFE7 - .label JUDTIM = $FFEA - .label JSCREEN = $FFED - .label JPLOT = $FFF0 - .label JIOBASE = $FFF3 + !addr JCINT = $FF81 + !addr JIOINIT = $FF84 + !addr JRAMTAS = $FF87 + !addr JRESTOR = $FF8A + !addr JVECTOR = $FF8D + !addr JSETMSG = $FF90 + !addr JSECOND = $FF93 + !addr JTKSA = $FF96 + !addr JMEMTOP = $FF99 + !addr JMEMBOT = $FF9C + !addr JSCNKEY = $FF9F + !addr JSETTMO = $FFA2 + !addr JACPTR = $FFA5 + !addr JCIOUT = $FFA8 + !addr JUNTLK = $FFAB + !addr JUNLSN = $FFAE + !addr JLISTEN = $FFB1 + !addr JTALK = $FFB4 + !addr JREADST = $FFB7 + !addr JSETFLS = $FFBA + !addr JSETNAM = $FFBD + !addr JOPEN = $FFC0 + !addr JCLOSE = $FFC3 + !addr JCHKIN = $FFC6 + !addr JCKOUT = $FFC9 + !addr JCLRCHN = $FFCC + !addr JCHRIN = $FFCF + !addr JCHROUT = $FFD2 + !addr JLOAD = $FFD5 + !addr JSAVE = $FFD8 + !addr JSETTIM = $FFDB + !addr JRDTIM = $FFDE + !addr JSTOP = $FFE1 + !addr JGETIN = $FFE4 + !addr JCLALL = $FFE7 + !addr JUDTIM = $FFEA + !addr JSCREEN = $FFED + !addr JPLOT = $FFF0 + !addr JIOBASE = $FFF3 diff --git a/src/basic/,aliases.s b/src/basic/,aliases.s deleted file mode 100644 index 291df1a7..00000000 --- a/src/basic/,aliases.s +++ /dev/null @@ -1,13 +0,0 @@ - -// -// Helper aliases to make the code more readable -// Always use double underscore in label names -// to allow automatic VICE label conflict prevention -// - - // Temporary variables for various routines - .label __tokenise_work1 = $07 // CHARAC - .label __tokenise_work2 = $08 // ENDCHR - .label __tokenise_work3 = $0B // COUNT - .label __tokenise_work4 = $0F // GARBFL - .label __tokenise_work5 = $0C // DIMFLG diff --git a/src/basic/,basic_aliases.s b/src/basic/,basic_aliases.s new file mode 100644 index 00000000..b1242b1c --- /dev/null +++ b/src/basic/,basic_aliases.s @@ -0,0 +1,39 @@ + +; +; Aliases for memory locations for memory block copy routines +; + +!addr memmove__src = INDEX+2 +!addr memmove__dst = RESHO+0 +!addr memmove__size = RESHO+2 +!addr memmove__tmp = RESHO+4 + + + +; +; Helper aliases to make the code more readable +; Always use double underscore in label names +; to allow automatic VICE label conflict prevention +; + +!addr __tokenise_work1 = $07 ; CHARAC +!addr __tokenise_work2 = $08 ; ENDCHR +!addr __tokenise_work3 = $0B ; COUNT +!addr __tokenise_work4 = $0F ; GARBFL +!addr __tokenise_work5 = $0C ; DIMFLG + + + +; +; Aliases for the tokeniser - reuse the CPU stack +; + +!addr tk__offset = $100 ; offset into string +!addr tk__length = __tokenise_work1 ; length of the raw string + +!addr tk__len_unpacked = $101 ; length of unpacked data; it could replace 'tk__nibble_flag', but at the cost of code size/performance +!addr tk__shorten_bits = $102 ; 2 bytes for quick shortening of packed candidate +!addr tk__nibble_flag = $104 ; $00 = start from new byte, $FF = start from high nibble +!addr tk__byte_offset = $105 ; offset of the current byte (to place new data) in tk__packed + +!addr tk__packed = $106 ; packed candidate, 25 bytes is enough for worst case - a 16 byte keyword diff --git a/src/basic/,imports.s b/src/basic/,imports.s index 86959543..62a37c08 100644 --- a/src/basic/,imports.s +++ b/src/basic/,imports.s @@ -1,63 +1,39 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 BASIC_0 #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 BASIC_0 #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * * #IGNORE +;; #IMPORT# KERNAL_0 = KERNAL_combined.sym KERNAL_0_combined.sym -// Routines imported from Kernal - our private API +; +; Routines imported from Kernal - our private API +; -#if ROM_LAYOUT_STD - #import "KERNAL_combined.sym" -#else - #import "KERNAL_0_combined.sym" -#endif +;; #ALIAS# panic = KERNAL_0.panic +;; #ALIAS# vector_reset = KERNAL_0.vector_reset +;; #ALIAS# hw_entry_reset = KERNAL_0.hw_entry_reset -.function KERNAL() -{ -#if ROM_LAYOUT_STD - .return KERNAL -#else - .return KERNAL_0 -#endif -} +;; #ALIAS# clear_screen = KERNAL_0.clear_screen +;; #ALIAS# printf = KERNAL_0.printf -#if ROM_LAYOUT_M65 -.label map_end = KERNAL().map_end -.label map_NORMAL = KERNAL().map_NORMAL -#endif +;; #ALIAS# plot_set = KERNAL_0.plot_set +;; #ALIAS# print_hex_byte = KERNAL_0.print_hex_byte +;; #ALIAS# print_return = KERNAL_0.print_return +;; #ALIAS# print_space = KERNAL_0.print_space -#if CONFIG_PANIC_SCREEN -.label panic = KERNAL().panic -#endif +;; #ALIAS# tape_head_align = KERNAL_0.tape_head_align -.label vector_reset = KERNAL().vector_reset -.label hw_entry_reset = KERNAL().hw_entry_reset +;; #ALIAS# filename_any = KERNAL_0.filename_any -.label clear_screen = KERNAL().clear_screen +;; #ALIAS# SELDEV = KERNAL_0.SELDEV -#if CONFIG_DBG_PRINTF -.label printf = KERNAL().printf -#endif +;; #ALIAS# map_end = KERNAL_0.map_end +;; #ALIAS# map_NORMAL = KERNAL_0.map_NORMAL -.label plot_set = KERNAL().plot_set -.label print_hex_byte = KERNAL().print_hex_byte -.label print_return = KERNAL().print_return -.label print_space = KERNAL().print_space - -#if CONFIG_TAPE_HEAD_ALIGN -.label tape_head_align = KERNAL().tape_head_align -#endif - -.label filename_any = KERNAL().filename_any - -.label SELDEV = KERNAL().SELDEV - -#if ROM_LAYOUT_M65 -.label M65_MODEGET = KERNAL().M65_MODEGET -.label M65_MODESET = KERNAL().M65_MODESET -.label M65_SLOW = KERNAL().M65_SLOW -.label M65_FAST = KERNAL().M65_FAST -.label M65_SETWIN_Y = KERNAL().M65_SETWIN_Y -#endif +;; #ALIAS# M65_MODEGET = KERNAL_0.M65_MODEGET +;; #ALIAS# M65_MODESET = KERNAL_0.M65_MODESET +;; #ALIAS# M65_SLOW = KERNAL_0.M65_SLOW +;; #ALIAS# M65_FAST = KERNAL_0.M65_FAST +;; #ALIAS# M65_SETWIN_Y = KERNAL_0.M65_SETWIN_Y diff --git a/src/basic/,stubs/a408.reason.s b/src/basic/,stubs/a408.reason.s index 00e36030..722534db 100644 --- a/src/basic/,stubs/a408.reason.s +++ b/src/basic/,stubs/a408.reason.s @@ -1,10 +1,11 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// XXX provide documentation and implementation +; XXX provide documentation and implementation REASON: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs/a453.unknown.s b/src/basic/,stubs/a453.unknown.s index 7a54c8b2..2dabd3b9 100644 --- a/src/basic/,stubs/a453.unknown.s +++ b/src/basic/,stubs/a453.unknown.s @@ -1,9 +1,9 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// XXX provide documentation and implementation +; XXX provide documentation and implementation - STUB_IMPLEMENTATION() + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs/a483.main.s b/src/basic/,stubs/a483.main.s index 9533f2cb..3f50fcee 100644 --- a/src/basic/,stubs/a483.main.s +++ b/src/basic/,stubs/a483.main.s @@ -1,16 +1,16 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official BASIC routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - XXX -// - [CM64] Computes Mapping the Commodore 64 - page 69, XXX -// -// CPU registers that has to be preserved (see [RG64]): XXX -// +; +; Official BASIC routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - XXX +; - [CM64] Computes Mapping the Commodore 64 - page 69, XXX +; +; CPU registers that has to be preserved (see [RG64]): XXX +; MAIN: - STUB_IMPLEMENTATION() + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs/a57c.chrnch.s b/src/basic/,stubs/a57c.chrnch.s index d320dd69..0d3862f5 100644 --- a/src/basic/,stubs/a57c.chrnch.s +++ b/src/basic/,stubs/a57c.chrnch.s @@ -1,17 +1,18 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official BASIC routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - XXX -// - [CM64] Computes Mapping the Commodore 64 - page 69, XXX -// -// CPU registers that has to be preserved (see [RG64]): XXX -// +; +; Official BASIC routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - XXX +; - [CM64] Computes Mapping the Commodore 64 - page 69, XXX +; +; CPU registers that has to be preserved (see [RG64]): XXX +; CHRNCH: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs/a644.new.s b/src/basic/,stubs/a644.new.s index 306c8228..e8b664c3 100644 --- a/src/basic/,stubs/a644.new.s +++ b/src/basic/,stubs/a644.new.s @@ -1,10 +1,11 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// XXX provide documentation and real implementation +; XXX provide documentation and real implementation new: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs/a659.setcharptr.s b/src/basic/,stubs/a659.setcharptr.s index 17f8cef5..4037628f 100644 --- a/src/basic/,stubs/a659.setcharptr.s +++ b/src/basic/,stubs/a659.setcharptr.s @@ -1,12 +1,13 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// XXX provide documentation and implementation -// see: https://www.lemon64.com/forum/viewtopic.php?t=64721&sid=bc400a5a6d404f8f092e4d32a92f5de7 -// https://www.lemon64.com/forum/viewtopic.php?t=70680&sid=3ff66caf7f5fdf2a3c2ff2ee31fc3fd8 +; XXX provide documentation and implementation +; see: https://www.lemon64.com/forum/viewtopic.php?t=64721&sid=bc400a5a6d404f8f092e4d32a92f5de7 +; https://www.lemon64.com/forum/viewtopic.php?t=70680&sid=3ff66caf7f5fdf2a3c2ff2ee31fc3fd8 setcharptr: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs/a71a.qplop.s b/src/basic/,stubs/a71a.qplop.s index 03f00cd3..649a02d7 100644 --- a/src/basic/,stubs/a71a.qplop.s +++ b/src/basic/,stubs/a71a.qplop.s @@ -1,17 +1,18 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official BASIC routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - XXX -// - [CM64] Computes Mapping the Commodore 64 - page 69, XXX -// -// CPU registers that has to be preserved (see [RG64]): XXX -// +; +; Official BASIC routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - XXX +; - [CM64] Computes Mapping the Commodore 64 - page 69, XXX +; +; CPU registers that has to be preserved (see [RG64]): XXX +; QPLOP: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs/a7e4.gone.s b/src/basic/,stubs/a7e4.gone.s index 33b6e87c..f7a1e47f 100644 --- a/src/basic/,stubs/a7e4.gone.s +++ b/src/basic/,stubs/a7e4.gone.s @@ -1,17 +1,18 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official BASIC routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - XXX -// - [CM64] Computes Mapping the Commodore 64 - page 70, XXX -// -// CPU registers that has to be preserved (see [RG64]): XXX -// +; +; Official BASIC routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - XXX +; - [CM64] Computes Mapping the Commodore 64 - page 70, XXX +; +; CPU registers that has to be preserved (see [RG64]): XXX +; GONE: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs/ae86.eval.s b/src/basic/,stubs/ae86.eval.s index b790c094..56951d00 100644 --- a/src/basic/,stubs/ae86.eval.s +++ b/src/basic/,stubs/ae86.eval.s @@ -1,17 +1,18 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official BASIC routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - XXX -// - [CM64] Computes Mapping the Commodore 64 - page 70, XXX -// -// CPU registers that has to be preserved (see [RG64]): XXX -// +; +; Official BASIC routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - XXX +; - [CM64] Computes Mapping the Commodore 64 - page 70, XXX +; +; CPU registers that has to be preserved (see [RG64]): XXX +; EVAL: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs/basic_adray1.s b/src/basic/,stubs/basic_adray1.s index 201195a2..7ed97079 100644 --- a/src/basic/,stubs/basic_adray1.s +++ b/src/basic/,stubs/basic_adray1.s @@ -1,9 +1,10 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// XXX provide documentation and implementation +; XXX provide documentation and implementation basic_adray1: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs/basic_adray2.s b/src/basic/,stubs/basic_adray2.s index afb58e61..4f42a31e 100644 --- a/src/basic/,stubs/basic_adray2.s +++ b/src/basic/,stubs/basic_adray2.s @@ -1,8 +1,9 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// XXX provide documentation and implementation +; XXX provide documentation and implementation basic_adray2: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs/e38b.error.s b/src/basic/,stubs/e38b.error.s index e057f13a..c1c4534b 100644 --- a/src/basic/,stubs/e38b.error.s +++ b/src/basic/,stubs/e38b.error.s @@ -1,16 +1,17 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official BASIC routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - XXX -// - [CM64] Computes Mapping the Commodore 64 - page 69, XXX -// -// CPU registers that has to be preserved (see [RG64]): XXX -// +; +; Official BASIC routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - XXX +; - [CM64] Computes Mapping the Commodore 64 - page 69, XXX +; +; CPU registers that has to be preserved (see [RG64]): XXX +; ERROR: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs/e3bf.init.s b/src/basic/,stubs/e3bf.init.s index 25cf67c0..713b9a40 100644 --- a/src/basic/,stubs/e3bf.init.s +++ b/src/basic/,stubs/e3bf.init.s @@ -1,9 +1,10 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// XXX provide documentation and implementation +; XXX provide documentation and implementation INIT: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs/e453.rvect.s b/src/basic/,stubs/e453.rvect.s index b8322901..085b6004 100644 --- a/src/basic/,stubs/e453.rvect.s +++ b/src/basic/,stubs/e453.rvect.s @@ -1,9 +1,10 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// XXX provide documentation and implementation +; XXX provide documentation and implementation RVECT: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/a9c4.convert_FAC1_to_INT.s b/src/basic/,stubs_math/a9c4.convert_FAC1_to_INT.s index 55b66169..991361f1 100644 --- a/src/basic/,stubs_math/a9c4.convert_FAC1_to_INT.s +++ b/src/basic/,stubs_math/a9c4.convert_FAC1_to_INT.s @@ -1,22 +1,22 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - subtract FAC1 to integer in memory -// -// Output: -// - integer pointed by $49/$4A -// -// See also: -// - https://sta.c64.org/cbm64basconv.html -// - https://www.c64-wiki.com/wiki/BASIC-ROM -// +; +; Math package - subtract FAC1 to integer in memory +; +; Output: +; - integer pointed by $49/$4A +; +; See also: +; - https://sta.c64.org/cbm64basconv.html +; - https://www.c64-wiki.com/wiki/BASIC-ROM +; -// XXX implement, test +; XXX implement, test convert_FAC1_to_INT: - STUB_IMPLEMENTATION() + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/aabc.print_FAC1.s b/src/basic/,stubs_math/aabc.print_FAC1.s index 163da77b..2aec74aa 100644 --- a/src/basic/,stubs_math/aabc.print_FAC1.s +++ b/src/basic/,stubs_math/aabc.print_FAC1.s @@ -1,18 +1,18 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - print FAC1 value -// -// See also: -// - https://sourceforge.net/p/acme-crossass/code-0/38/tree/trunk/ACME_Lib/cbm/c64/float.a?force=True -// +; +; Math package - print FAC1 value +; +; See also: +; - https://sourceforge.net/p/acme-crossass/code-0/38/tree/trunk/ACME_Lib/cbm/c64/float.a?force=True +; -// XXX implement, test +; XXX implement, test print_FAC1: - STUB_IMPLEMENTATION() \ No newline at end of file + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/af7b.compute_TI.s b/src/basic/,stubs_math/af7b.compute_TI.s index 0bd1acfc..e360918a 100644 --- a/src/basic/,stubs_math/af7b.compute_TI.s +++ b/src/basic/,stubs_math/af7b.compute_TI.s @@ -1,17 +1,17 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - compute TI value -// -// See also: -// - https://www.c64-wiki.com/wiki/BASIC-ROM -// +; +; Math package - compute TI value +; +; See also: +; - https://www.c64-wiki.com/wiki/BASIC-ROM +; -// XXX implement, test +; XXX implement, test compute_TI: - STUB_IMPLEMENTATION() + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/af7e.math_stub.s b/src/basic/,stubs_math/af7e.math_stub.s index c5eacf46..051a14e5 100644 --- a/src/basic/,stubs_math/af7e.math_stub.s +++ b/src/basic/,stubs_math/af7e.math_stub.s @@ -1,15 +1,15 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - sets mantissa to 00yyxxaa -// -// See also: -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - sets mantissa to 00yyxxaa +; +; See also: +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; -// XXX add name, label, implement, test +; XXX add name, label, implement, test - STUB_IMPLEMENTATION() + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/af87.math_stub.s b/src/basic/,stubs_math/af87.math_stub.s index 25746cdc..3a85250e 100644 --- a/src/basic/,stubs_math/af87.math_stub.s +++ b/src/basic/,stubs_math/af87.math_stub.s @@ -1,15 +1,15 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - set rest of FAC1 and JMP to $b8d2 -// -// See also: -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - set rest of FAC1 and JMP to $b8d2 +; +; See also: +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; -// XXX add name, label, implement, test +; XXX add name, label, implement, test - STUB_IMPLEMENTATION() + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/af9a.compute_ST.s b/src/basic/,stubs_math/af9a.compute_ST.s index 801fa221..8ffe15cc 100644 --- a/src/basic/,stubs_math/af9a.compute_ST.s +++ b/src/basic/,stubs_math/af9a.compute_ST.s @@ -1,17 +1,17 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - compute ST value -// -// See also: -// - https://www.c64-wiki.com/wiki/BASIC-ROM -// +; +; Math package - compute ST value +; +; See also: +; - https://www.c64-wiki.com/wiki/BASIC-ROM +; -// XXX implement, test +; XXX implement, test compute_ST: - STUB_IMPLEMENTATION() + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/b1aa.FACINX.s b/src/basic/,stubs_math/b1aa.FACINX.s index 11ab5ed0..fd913708 100644 --- a/src/basic/,stubs_math/b1aa.FACINX.s +++ b/src/basic/,stubs_math/b1aa.FACINX.s @@ -1,21 +1,22 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - convert FAC1 to 16-bit signed integer -// -// Input: -// - .A - address low byte -// - .Y - address high byte -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 105 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// +; +; Math package - convert FAC1 to 16-bit signed integer +; +; Input: +; - .A - address low byte +; - .Y - address high byte +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 105 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; -// XXX provide implementation +; XXX provide implementation FACINX: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/b1bf.convert_FAC1_to_s16.s b/src/basic/,stubs_math/b1bf.convert_FAC1_to_s16.s index 601bf5d7..caa3e52d 100644 --- a/src/basic/,stubs_math/b1bf.convert_FAC1_to_s16.s +++ b/src/basic/,stubs_math/b1bf.convert_FAC1_to_s16.s @@ -1,17 +1,17 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - XXX -// -// See also: -// - https://sourceforge.net/p/acme-crossass/code-0/38/tree/trunk/ACME_Lib/cbm/c64/float.a?force=True -// +; +; Math package - XXX +; +; See also: +; - https://sourceforge.net/p/acme-crossass/code-0/38/tree/trunk/ACME_Lib/cbm/c64/float.a?force=True +; -// XXX implement, test +; XXX implement, test convert_FAC1_to_s16: - STUB_IMPLEMENTATION() + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/b391.GIVAYF.s b/src/basic/,stubs_math/b391.GIVAYF.s index 982b2262..b2b0d282 100644 --- a/src/basic/,stubs_math/b391.GIVAYF.s +++ b/src/basic/,stubs_math/b391.GIVAYF.s @@ -1,21 +1,22 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - 16-bit signed integer to FAC1 -// -// Output: -// - .A - address high byte (XXX really, not the opposite?) -// - .Y - address low byte -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 107 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// +; +; Math package - 16-bit signed integer to FAC1 +; +; Output: +; - .A - address high byte (XXX really, not the opposite?) +; - .Y - address low byte +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 107 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; -// XXX provide implementation +; XXX provide implementation GIVAYF: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/b3a2.convert_Y_to_FAC1.s b/src/basic/,stubs_math/b3a2.convert_Y_to_FAC1.s index 7ec3f99a..dbd6d250 100644 --- a/src/basic/,stubs_math/b3a2.convert_Y_to_FAC1.s +++ b/src/basic/,stubs_math/b3a2.convert_Y_to_FAC1.s @@ -1,16 +1,16 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - XXX -// -// - https://www.c64-wiki.com/wiki/BASIC-ROM -// - https://sta.c64.org/cbm64basconv.html -// - https://sourceforge.net/p/acme-crossass/code-0/38/tree/trunk/ACME_Lib/cbm/c64/float.a?force=True -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// -// XXX add name, label, documentation, implement, test +; +; Math package - XXX +; +; - https://www.c64-wiki.com/wiki/BASIC-ROM +; - https://sta.c64.org/cbm64basconv.html +; - https://sourceforge.net/p/acme-crossass/code-0/38/tree/trunk/ACME_Lib/cbm/c64/float.a?force=True +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; +; XXX add name, label, documentation, implement, test - STUB_IMPLEMENTATION() + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/b794.convert_A_to_FAC1.s b/src/basic/,stubs_math/b794.convert_A_to_FAC1.s index c79f363c..e33d3f30 100644 --- a/src/basic/,stubs_math/b794.convert_A_to_FAC1.s +++ b/src/basic/,stubs_math/b794.convert_A_to_FAC1.s @@ -1,13 +1,13 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - XXX -// -// - https://sta.c64.org/cbm64basconv.html -// -// XXX add name, label, documentation, implement, test +; +; Math package - XXX +; +; - https://sta.c64.org/cbm64basconv.html +; +; XXX add name, label, documentation, implement, test - STUB_IMPLEMENTATION() + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/b7b5.STRVAL.s b/src/basic/,stubs_math/b7b5.STRVAL.s index f754d8f6..69acf4cc 100644 --- a/src/basic/,stubs_math/b7b5.STRVAL.s +++ b/src/basic/,stubs_math/b7b5.STRVAL.s @@ -1,20 +1,20 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - imports string to FAC1 - XXX: what about spaces? -// -// Input: -// - .A needs to be loaded with string length -// - string address in $22/$23 -// -// See also: -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// +; +; Math package - imports string to FAC1 - XXX: what about spaces? +; +; Input: +; - .A needs to be loaded with string length +; - string address in $22/$23 +; +; See also: +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; -// XXX provide implementation +; XXX provide implementation STRVAL: - STUB_IMPLEMENTATION() + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/b7f7.convert_FAC1_to_ADDR.s b/src/basic/,stubs_math/b7f7.convert_FAC1_to_ADDR.s index f38d5a98..e9d87ff7 100644 --- a/src/basic/,stubs_math/b7f7.convert_FAC1_to_ADDR.s +++ b/src/basic/,stubs_math/b7f7.convert_FAC1_to_ADDR.s @@ -1,20 +1,20 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - subtract FAC1 to memory address at $14/$15 and Y/A -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 112 -// - https://sta.c64.org/cbm64basconv.html -// - https://www.c64-wiki.com/wiki/BASIC-ROM -// +; +; Math package - subtract FAC1 to memory address at $14/$15 and Y/A +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 112 +; - https://sta.c64.org/cbm64basconv.html +; - https://www.c64-wiki.com/wiki/BASIC-ROM +; -// XXX implement, test +; XXX implement, test convert_FAC1_to_ADDR: - STUB_IMPLEMENTATION() + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/b947.inv_FAC1_mantissa.s b/src/basic/,stubs_math/b947.inv_FAC1_mantissa.s index ceadfe99..c0b60e54 100644 --- a/src/basic/,stubs_math/b947.inv_FAC1_mantissa.s +++ b/src/basic/,stubs_math/b947.inv_FAC1_mantissa.s @@ -1,20 +1,20 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - invert FAC1 mantissa -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 113 -// - https://www.c64-wiki.com/wiki/BASIC-ROM -// - https://sta.c64.org/cbm64basconv.html -// +; +; Math package - invert FAC1 mantissa +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 113 +; - https://www.c64-wiki.com/wiki/BASIC-ROM +; - https://sta.c64.org/cbm64basconv.html +; -// XXX implement, test +; XXX implement, test inv_FAC1_mantissa: - STUB_IMPLEMENTATION() + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/b9ea.log_FAC1.s b/src/basic/,stubs_math/b9ea.log_FAC1.s index 2bc2765c..8c6571d9 100644 --- a/src/basic/,stubs_math/b9ea.log_FAC1.s +++ b/src/basic/,stubs_math/b9ea.log_FAC1.s @@ -1,19 +1,20 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - natural logarigthm -// -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 113 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - natural logarigthm +; +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 113 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; -// XXX provide implementation +; XXX provide implementation log_FAC1: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/ba90.get_FAC2_via_INDEX.s b/src/basic/,stubs_math/ba90.get_FAC2_via_INDEX.s index 1e5b639a..4c2bfcaa 100644 --- a/src/basic/,stubs_math/ba90.get_FAC2_via_INDEX.s +++ b/src/basic/,stubs_math/ba90.get_FAC2_via_INDEX.s @@ -1,17 +1,17 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - XXX -// -// See also: -// - https://sourceforge.net/p/acme-crossass/code-0/38/tree/trunk/ACME_Lib/cbm/c64/float.a?force=True -// +; +; Math package - XXX +; +; See also: +; - https://sourceforge.net/p/acme-crossass/code-0/38/tree/trunk/ACME_Lib/cbm/c64/float.a?force=True +; -// XXX implement, test +; XXX implement, test get_FAC2_via_INDEX: - STUB_IMPLEMENTATION() + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/bba6.get_FAC1_via_INDEX.s b/src/basic/,stubs_math/bba6.get_FAC1_via_INDEX.s index fc6675f6..81499d2f 100644 --- a/src/basic/,stubs_math/bba6.get_FAC1_via_INDEX.s +++ b/src/basic/,stubs_math/bba6.get_FAC1_via_INDEX.s @@ -1,17 +1,17 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - XXX -// -// See also: -// - https://sourceforge.net/p/acme-crossass/code-0/38/tree/trunk/ACME_Lib/cbm/c64/float.a?force=True -// +; +; Math package - XXX +; +; See also: +; - https://sourceforge.net/p/acme-crossass/code-0/38/tree/trunk/ACME_Lib/cbm/c64/float.a?force=True +; -// XXX implement, test +; XXX implement, test get_FAC1_via_INDEX: - STUB_IMPLEMENTATION() + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/bc39.sgn_FAC1.s b/src/basic/,stubs_math/bc39.sgn_FAC1.s index 47af6ee9..7828f4e6 100644 --- a/src/basic/,stubs_math/bc39.sgn_FAC1.s +++ b/src/basic/,stubs_math/bc39.sgn_FAC1.s @@ -1,21 +1,21 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - evaluate FAC1 sign, to FAC1 -// -// Output: -// - FAC1 - 0 for FAC1 equal 0, 1 for FAC1 > 0, -1 for FAC1 < 0 -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 115 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - evaluate FAC1 sign, to FAC1 +; +; Output: +; - FAC1 - 0 for FAC1 equal 0, 1 for FAC1 > 0, -1 for FAC1 < 0 +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 115 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; -// XXX provide implementation +; XXX provide implementation sgn_FAC1: - STUB_IMPLEMENTATION() + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/bc3c.convert_A_to_FAC1.s b/src/basic/,stubs_math/bc3c.convert_A_to_FAC1.s index 9187103d..5d34e1cd 100644 --- a/src/basic/,stubs_math/bc3c.convert_A_to_FAC1.s +++ b/src/basic/,stubs_math/bc3c.convert_A_to_FAC1.s @@ -1,14 +1,14 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - XXX -// -// - https://codebase64.org/doku.php?id=base:asm_include_file_for_basic_routines -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// -// XXX add name, label, documentation, implement, test +; +; Math package - XXX +; +; - https://codebase64.org/doku.php?id=base:asm_include_file_for_basic_routines +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; +; XXX add name, label, documentation, implement, test - STUB_IMPLEMENTATION() + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/bc44.convert_i16_to_FAC1.s b/src/basic/,stubs_math/bc44.convert_i16_to_FAC1.s index b0e1f2e7..c7992238 100644 --- a/src/basic/,stubs_math/bc44.convert_i16_to_FAC1.s +++ b/src/basic/,stubs_math/bc44.convert_i16_to_FAC1.s @@ -1,13 +1,13 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - XXX -// -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// -// XXX add name, label, documentation, implement, test +; +; Math package - XXX +; +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; +; XXX add name, label, documentation, implement, test - STUB_IMPLEMENTATION() + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/bc58.abs_FAC1.s b/src/basic/,stubs_math/bc58.abs_FAC1.s index 919f179a..caf41ff8 100644 --- a/src/basic/,stubs_math/bc58.abs_FAC1.s +++ b/src/basic/,stubs_math/bc58.abs_FAC1.s @@ -1,18 +1,19 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - absolute value -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 115 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - absolute value +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 115 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; -// XXX provide implementation +; XXX provide implementation abs_FAC1: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/bc5b.FCOMP.s b/src/basic/,stubs_math/bc5b.FCOMP.s index e0f00777..595c3a96 100644 --- a/src/basic/,stubs_math/bc5b.FCOMP.s +++ b/src/basic/,stubs_math/bc5b.FCOMP.s @@ -1,29 +1,30 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - compare FAC1 with RAM location -// -// Input: -// - .A - address low byte -// - .Y - address high byte -// -// Output: -// - .A - $00 for equal, $01 for FAC1 > RAM, $FF for FAC1 < RAM -// - flags N/Z, depending on whether FAC1 is 0, positive, or negative -// -// Notes: -// - uses vector at $24, leaves FAC1 and FAC2 unchanged (Codebase64) -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 115 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - compare FAC1 with RAM location +; +; Input: +; - .A - address low byte +; - .Y - address high byte +; +; Output: +; - .A - $00 for equal, $01 for FAC1 > RAM, $FF for FAC1 < RAM +; - flags N/Z, depending on whether FAC1 is 0, positive, or negative +; +; Notes: +; - uses vector at $24, leaves FAC1 and FAC2 unchanged (Codebase64) +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 115 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; -// XXX provide implementation +; XXX provide implementation FCOMP: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/bc9b.QINT.s b/src/basic/,stubs_math/bc9b.QINT.s index 26ba5f71..57bc0803 100644 --- a/src/basic/,stubs_math/bc9b.QINT.s +++ b/src/basic/,stubs_math/bc9b.QINT.s @@ -1,20 +1,21 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - convert FAC1 to 32 bit signed integer -// -// Output: -// - $62-$65, big-endian order -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 115 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// +; +; Math package - convert FAC1 to 32 bit signed integer +; +; Output: +; - $62-$65, big-endian order +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 115 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; -// XXX provide implementation +; XXX provide implementation QINT: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/bccc.int_FAC1.s b/src/basic/,stubs_math/bccc.int_FAC1.s index 4a7c6d47..827fdaa5 100644 --- a/src/basic/,stubs_math/bccc.int_FAC1.s +++ b/src/basic/,stubs_math/bccc.int_FAC1.s @@ -1,18 +1,19 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - rounds away the decimal to make an integer -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 116 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - rounds away the decimal to make an integer +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 116 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; -// XXX provide implementation +; XXX provide implementation int_FAC1: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/bcf3.FIN.s b/src/basic/,stubs_math/bcf3.FIN.s index f06e63eb..d5375a5e 100644 --- a/src/basic/,stubs_math/bcf3.FIN.s +++ b/src/basic/,stubs_math/bcf3.FIN.s @@ -1,24 +1,25 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - imports string to FAC1, ignores spaces -// -// -// Input: -// - .A needs to be loaded with first char of the string -// - Carry flag must be clear -// - string address in $7A/$7B -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 116 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - imports string to FAC1, ignores spaces +; +; +; Input: +; - .A needs to be loaded with first char of the string +; - Carry flag must be clear +; - string address in $7A/$7B +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 116 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; -// XXX provide implementation +; XXX provide implementation FIN: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/bd7e.FINLOG.s b/src/basic/,stubs_math/bd7e.FINLOG.s index 998ca32b..2172420a 100644 --- a/src/basic/,stubs_math/bd7e.FINLOG.s +++ b/src/basic/,stubs_math/bd7e.FINLOG.s @@ -1,18 +1,18 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - add an ASCII digit that has been converted to a signed integer to FAC1 -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 113 -// +; +; Math package - add an ASCII digit that has been converted to a signed integer to FAC1 +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 113 +; -// XXX implement, test +; XXX implement, test FINLOG: - STUB_IMPLEMENTATION() + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/bddd.FOUT.s b/src/basic/,stubs_math/bddd.FOUT.s index a9b3b2d8..4ee10301 100644 --- a/src/basic/,stubs_math/bddd.FOUT.s +++ b/src/basic/,stubs_math/bddd.FOUT.s @@ -1,22 +1,23 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - outputs FAC1 to string at $0100 -// -// Output: -// - .A - address low byte -// - .Y - address high byte -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 116 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - outputs FAC1 to string at $0100 +; +; Output: +; - .A - address low byte +; - .Y - address high byte +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 116 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; -// XXX provide implementation +; XXX provide implementation FOUT: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/bf74.sqr_FAC2.s b/src/basic/,stubs_math/bf74.sqr_FAC2.s index a0b8a412..1cb3db61 100644 --- a/src/basic/,stubs_math/bf74.sqr_FAC2.s +++ b/src/basic/,stubs_math/bf74.sqr_FAC2.s @@ -1,21 +1,22 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - square root of FAC2 -// -// Note: -// - loads .5 into FAC1 and falling through to the exponentiation routine -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 117 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - square root of FAC2 +; +; Note: +; - loads .5 into FAC1 and falling through to the exponentiation routine +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 117 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; -// XXX provide implementation +; XXX provide implementation sqr_FAC2: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/bf7b.pwr_FAC2_FAC1.s b/src/basic/,stubs_math/bf7b.pwr_FAC2_FAC1.s index 6bb1a7f6..5ea6028a 100644 --- a/src/basic/,stubs_math/bf7b.pwr_FAC2_FAC1.s +++ b/src/basic/,stubs_math/bf7b.pwr_FAC2_FAC1.s @@ -1,25 +1,26 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - set FAC1 as FAC2 raised to the power of FAC1 -// -// Input: -// - .A - must load FAC1 exponent ($61) beforehand to set the zero flag -// -// Note: -// - load FAC2 after FAC1, or mimic the Kernals sign comparison (XXX do we need it?) -// - uses exp(x*log(y)) formula to calculate y^x; slow and inaccurate -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 117 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - set FAC1 as FAC2 raised to the power of FAC1 +; +; Input: +; - .A - must load FAC1 exponent ($61) beforehand to set the zero flag +; +; Note: +; - load FAC2 after FAC1, or mimic the Kernals sign comparison (XXX do we need it?) +; - uses exp(x*log(y)) formula to calculate y^x; slow and inaccurate +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 117 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; -// XXX provide implementation +; XXX provide implementation pwr_FAC2_FAC1: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/bfed.exp_FAC1.s b/src/basic/,stubs_math/bfed.exp_FAC1.s index 296a58a3..4eb007f9 100644 --- a/src/basic/,stubs_math/bfed.exp_FAC1.s +++ b/src/basic/,stubs_math/bfed.exp_FAC1.s @@ -1,19 +1,20 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - exponential function, e raised to FAC1 power -// -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 117 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - exponential function, e raised to FAC1 power +; +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 117 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; -// XXX provide implementation +; XXX provide implementation exp_FAC1: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/e043.poly1_FAC1.s b/src/basic/,stubs_math/e043.poly1_FAC1.s index 94639620..c4ca783b 100644 --- a/src/basic/,stubs_math/e043.poly1_FAC1.s +++ b/src/basic/,stubs_math/e043.poly1_FAC1.s @@ -1,27 +1,28 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - evaluate polynomial with odd powers only for FAC1 value -// -// Input: -// - .A - table address low byte -// - .Y - table address low byte -// - table format: -// - polynomial degree (8 bit integer) -// - oefficients (floats), starting from highest degree, times 1+degree -// -// Notes: -// - calls POLY2(table, X*X)*X -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 206 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://www.c64-wiki.com/wiki/POLY1 -// +; +; Math package - evaluate polynomial with odd powers only for FAC1 value +; +; Input: +; - .A - table address low byte +; - .Y - table address low byte +; - table format: +; - polynomial degree (8 bit integer) +; - oefficients (floats), starting from highest degree, times 1+degree +; +; Notes: +; - calls POLY2(table, X*X)*X +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 206 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://www.c64-wiki.com/wiki/POLY1 +; -// XXX provide implementation +; XXX provide implementation poly1_FAC1: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/e059.poly2_FAC1.s b/src/basic/,stubs_math/e059.poly2_FAC1.s index 226c61b3..f7148ef3 100644 --- a/src/basic/,stubs_math/e059.poly2_FAC1.s +++ b/src/basic/,stubs_math/e059.poly2_FAC1.s @@ -1,27 +1,28 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - evaluate polynomial with odd and even powers for FAC1 value -// -// Input: -// - .A - table address low byte -// - .Y - table address low byte -// - table format: -// - polynomial degree (8 bit integer) -// - oefficients (floats), starting from highest degree, times 1+degree -// -// Notes: -// - uses Horner method -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 207 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://www.c64-wiki.com/wiki/POLY1 -// +; +; Math package - evaluate polynomial with odd and even powers for FAC1 value +; +; Input: +; - .A - table address low byte +; - .Y - table address low byte +; - table format: +; - polynomial degree (8 bit integer) +; - oefficients (floats), starting from highest degree, times 1+degree +; +; Notes: +; - uses Horner method +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 207 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://www.c64-wiki.com/wiki/POLY1 +; -// XXX provide implementation +; XXX provide implementation poly2_FAC1: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/e264.cos_FAC1.s b/src/basic/,stubs_math/e264.cos_FAC1.s index bdf0b761..42999aa7 100644 --- a/src/basic/,stubs_math/e264.cos_FAC1.s +++ b/src/basic/,stubs_math/e264.cos_FAC1.s @@ -1,17 +1,18 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - cosine of FAC1 in radians -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 210 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - cosine of FAC1 in radians +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 210 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; -// XXX provide implementation +; XXX provide implementation COS: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/e26b.sin_FAC1.s b/src/basic/,stubs_math/e26b.sin_FAC1.s index 82a86d2f..f1f2f340 100644 --- a/src/basic/,stubs_math/e26b.sin_FAC1.s +++ b/src/basic/,stubs_math/e26b.sin_FAC1.s @@ -1,28 +1,29 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - sine of FAC1 in radians -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 210 - XXX address does not match -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - sine of FAC1 in radians +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 210 - XXX address does not match +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; -// XXX provide implementation +; XXX provide implementation sin_FAC1: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION poly_sin: - .byte $05 // series length - 1 + !byte $05 ; series length - 1 - put_const_POLY_SIN_1() - put_const_POLY_SIN_2() - put_const_POLY_SIN_3() - put_const_POLY_SIN_4() - put_const_POLY_SIN_5() - put_const_POLY_SIN_6() + +PUT_CONST_POLY_SIN_1 + +PUT_CONST_POLY_SIN_2 + +PUT_CONST_POLY_SIN_3 + +PUT_CONST_POLY_SIN_4 + +PUT_CONST_POLY_SIN_5 + +PUT_CONST_POLY_SIN_6 diff --git a/src/basic/,stubs_math/e2b4.tan_FAC1.s b/src/basic/,stubs_math/e2b4.tan_FAC1.s index 480991fc..778ffa21 100644 --- a/src/basic/,stubs_math/e2b4.tan_FAC1.s +++ b/src/basic/,stubs_math/e2b4.tan_FAC1.s @@ -1,17 +1,18 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - tangent of FAC1 in radians -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 210 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - tangent of FAC1 in radians +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 210 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; -// XXX provide implementation +; XXX provide implementation tan_FAC1: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/,stubs_math/e30e.atn_FAC1.s b/src/basic/,stubs_math/e30e.atn_FAC1.s index 1fc04501..36e35274 100644 --- a/src/basic/,stubs_math/e30e.atn_FAC1.s +++ b/src/basic/,stubs_math/e30e.atn_FAC1.s @@ -1,17 +1,18 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - arc tangent of FAC1 -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 211 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - arc tangent of FAC1 +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 211 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; -// XXX provide implementation +; XXX provide implementation atn_FAC1: - STUB_IMPLEMENTATION() + + +STUB_IMPLEMENTATION diff --git a/src/basic/a68e.runc.s b/src/basic/a68e.runc.s index bda66edc..e63a84d9 100644 --- a/src/basic/a68e.runc.s +++ b/src/basic/a68e.runc.s @@ -1,23 +1,23 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// Well-known BASIC routine, described in: -// -// - [CM64] Computes Mapping the Commodore 64 - page 97 -// - https://www.c64-wiki.com/wiki/BASIC-ROM -// - https://csdb.dk/forums/?roomid=11&topicid=137233 -// +; Well-known BASIC routine, described in: +; +; - [CM64] Computes Mapping the Commodore 64 - page 97 +; - https://www.c64-wiki.com/wiki/BASIC-ROM +; - https://csdb.dk/forums/?roomid=11&topicid=137233 +; -// XXX use this routine to initialize TXTPTR +; XXX use this routine to initialize TXTPTR RUNC: - // According to WIKI, we should load $7A/$7B with $2B-1/$2C-1), this does not makes sense. - // But CSDB claims, that it should 'set current character pointer to start of basic - 1' - this - // looks sane, also checked that the original BASIC routine does this (short test program) + ; According to WIKI, we should load $7A/$7B with $2B-1/$2C-1), this does not makes sense. + ; But CSDB claims, that it should 'set current character pointer to start of basic - 1' - this + ; looks sane, also checked that the original BASIC routine does this (short test program) - // Lets initialize TXTPTR using TXTTAB + ; Lets initialize TXTPTR using TXTTAB lda TXTTAB+0 sec diff --git a/src/basic/a7ae.newstt.s b/src/basic/a7ae.newstt.s index 069a1276..817d2824 100644 --- a/src/basic/a7ae.newstt.s +++ b/src/basic/a7ae.newstt.s @@ -1,22 +1,22 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// Well-known BASIC routine, described in: -// -// - [CM64] Computes Mapping the Commodore 64 - page 97 -// - https://www.lemon64.com/forum/viewtopic.php?t=64721&sid=bc400a5a6d404f8f092e4d32a92f5de7 -// - https://www.lemon64.com/forum/viewtopic.php?t=70680&sid=3ff66caf7f5fdf2a3c2ff2ee31fc3fd8 -// - https://codebase64.org/doku.php?id=base:assembling_your_own_cart_rom_image +; Well-known BASIC routine, described in: +; +; - [CM64] Computes Mapping the Commodore 64 - page 97 +; - https://www.lemon64.com/forum/viewtopic.php?t=64721&sid=bc400a5a6d404f8f092e4d32a92f5de7 +; - https://www.lemon64.com/forum/viewtopic.php?t=70680&sid=3ff66caf7f5fdf2a3c2ff2ee31fc3fd8 +; - https://codebase64.org/doku.php?id=base:assembling_your_own_cart_rom_image NEWSTT: - // XXX Real implementation is more complicated, it iss actually a part - // of the BASIC main loop. It is, however, often called by various - // utilities to simply run the software which was just loaded or - // uncompressed. + ; XXX Real implementation is more complicated, it iss actually a part + ; of the BASIC main loop. It is, however, often called by various + ; utilities to simply run the software which was just loaded or + ; uncompressed. - // For now, lets cheat a little - this should provide some compatibility: + ; For now, lets cheat a little - this should provide some compatibility: jmp cmd_run diff --git a/src/basic/ab1e.strout.s b/src/basic/ab1e.strout.s index 9f99e7bf..3f88c657 100644 --- a/src/basic/ab1e.strout.s +++ b/src/basic/ab1e.strout.s @@ -1,31 +1,31 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# M65 BASIC_1 #TAKE-FLOAT -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE-FLOAT +;; #LAYOUT# * * #IGNORE -// Print string at $YYAA -// Computes Mapping the 64 p101 +; Print string at $YYAA +; Computes Mapping the 64 p101 -// print string routine +; print string routine STROUT: - // Setup pointer + ; Setup pointer sty FRESPC+1 sta FRESPC+0 - phx_trash_a + +phx_trash_a - // Get offset ready + ; Get offset ready ldy #$00 -!: - // Save Y in X, since X is preserved by chrout, but Y is not +@1: + ; Save Y in X, since X is preserved by chrout, but Y is not tya tax lda (FRESPC),y - beq !+ + beq @2 jsr JCHROUT @@ -33,8 +33,8 @@ STROUT: tay iny - bne !- -!: - pla // XXX can we use plx_trash_a here? + bne @1 +@2: + pla ; XXX can we use plx_trash_a here? tax rts diff --git a/src/basic/assets/basic_vector_defaults.s b/src/basic/assets/basic_vector_defaults.s index 9e7ebb73..7cc2db03 100644 --- a/src/basic/assets/basic_vector_defaults.s +++ b/src/basic/assets/basic_vector_defaults.s @@ -1,24 +1,24 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Default values for BASIC vectors - described in: -// -// - [RG64] C64 Programmers Reference Guide - pages 68-70 -// - [CM64] Computes Mapping the Commodore 64 - page 318 -// +; +; Default values for BASIC vectors - described in: +; +; - [RG64] C64 Programmers Reference Guide - pages 68-70 +; - [CM64] Computes Mapping the Commodore 64 - page 318 +; basic_vector_defaults_1: - .word ERROR // IERROR - .word MAIN // IMAIN - .word CHRNCH // ICHRNCH - .word QPLOP // IQPLOP - .word GONE // IGONE - .word EVAL // IEVAL + !word ERROR ; IERROR + !word MAIN ; IMAIN + !word CHRNCH ; ICHRNCH + !word QPLOP ; IQPLOP + !word GONE ; IGONE + !word EVAL ; IEVAL basic_vector_defaults_2: - .word basic_adray1 // ADRAY1 - .word basic_adray2 // ADRAY2 + !word basic_adray1 ; ADRAY1 + !word basic_adray2 ; ADRAY2 diff --git a/src/basic/assets/c000.skip_gap.s b/src/basic/assets/c000.skip_gap.s index a8d678e6..54fa6e9e 100644 --- a/src/basic/assets/c000.skip_gap.s +++ b/src/basic/assets/c000.skip_gap.s @@ -1,9 +1,9 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// Skip the gap between $C000-$DFFF +; Skip the gap between $C000-$DFFF - .fill $2000, $00 + !fill $2000, $00 diff --git a/src/basic/assets/packed_as_1n.s b/src/basic/assets/packed_as_1n.s index ba42d331..4deeadcf 100644 --- a/src/basic/assets/packed_as_1n.s +++ b/src/basic/assets/packed_as_1n.s @@ -1,9 +1,9 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE packed_as_1n: - put_packed_as_1n() + +PUT_PACKED_AS_1N diff --git a/src/basic/assets/packed_as_3n.s b/src/basic/assets/packed_as_3n.s index 27e7f9e3..f7e85a7c 100644 --- a/src/basic/assets/packed_as_3n.s +++ b/src/basic/assets/packed_as_3n.s @@ -1,9 +1,9 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE packed_as_3n: - put_packed_as_3n() + +PUT_PACKED_AS_3N diff --git a/src/basic/assets/packed_dictionary.s b/src/basic/assets/packed_dictionary.s index b7f9c640..f53559cc 100644 --- a/src/basic/assets/packed_dictionary.s +++ b/src/basic/assets/packed_dictionary.s @@ -1,13 +1,12 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -#if CONFIG_COMPRESSION_LVL_2 +!ifdef CONFIG_COMPRESSION_LVL_2 { packed_dictionary: - put_packed_freq_DICTIONARY() - -#endif + +PUT_PACKED_FREQ_dictionary +} diff --git a/src/basic/assets/packed_errors.s b/src/basic/assets/packed_errors.s index d71177b0..ded0d7e1 100644 --- a/src/basic/assets/packed_errors.s +++ b/src/basic/assets/packed_errors.s @@ -1,19 +1,19 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -#if CONFIG_COMPRESSION_LVL_2 +!ifdef CONFIG_COMPRESSION_LVL_2 { packed_dict_errors: - put_packed_dict_errors() + +PUT_PACKED_DICT_errors -#else +} else { packed_freq_errors: - put_packed_freq_errors() + +PUT_PACKED_FREQ_errors -#endif +} diff --git a/src/basic/assets/packed_keywords.s b/src/basic/assets/packed_keywords.s index b6cd2eab..df83fd3b 100644 --- a/src/basic/assets/packed_keywords.s +++ b/src/basic/assets/packed_keywords.s @@ -1,9 +1,9 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE packed_freq_keywords_V2: - put_packed_freq_keywords_V2() + +PUT_PACKED_FREQ_keywords_V2 diff --git a/src/basic/assets/packed_keywords_01.s b/src/basic/assets/packed_keywords_01.s index 85093d48..b743b433 100644 --- a/src/basic/assets/packed_keywords_01.s +++ b/src/basic/assets/packed_keywords_01.s @@ -1,9 +1,9 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE packed_freq_keywords_01: - put_packed_freq_keywords_01() + +PUT_PACKED_FREQ_keywords_01 \ No newline at end of file diff --git a/src/basic/assets/packed_keywords_02.s b/src/basic/assets/packed_keywords_02.s index 37c9903a..34c1334b 100644 --- a/src/basic/assets/packed_keywords_02.s +++ b/src/basic/assets/packed_keywords_02.s @@ -1,12 +1,11 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -#if !HAS_SMALL_BASIC +!ifndef HAS_SMALL_BASIC { packed_freq_keywords_02: - put_packed_freq_keywords_02() - -#endif + +PUT_PACKED_FREQ_keywords_02 +} diff --git a/src/basic/assets/packed_keywords_03.s b/src/basic/assets/packed_keywords_03.s index 10edc998..d7f57653 100644 --- a/src/basic/assets/packed_keywords_03.s +++ b/src/basic/assets/packed_keywords_03.s @@ -1,12 +1,12 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -#if ROM_LAYOUT_M65 +!ifdef CONFIG_MB_M65 { packed_freq_keywords_03: - put_packed_freq_keywords_03() + +PUT_PACKED_FREQ_keywords_03 -#endif +} \ No newline at end of file diff --git a/src/basic/assets/packed_misc.s b/src/basic/assets/packed_misc.s index 3af051b7..d87ddb3b 100644 --- a/src/basic/assets/packed_misc.s +++ b/src/basic/assets/packed_misc.s @@ -1,19 +1,18 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -#if CONFIG_COMPRESSION_LVL_2 +!ifdef CONFIG_COMPRESSION_LVL_2 { packed_dict_misc: - put_packed_dict_misc() + +PUT_PACKED_DICT_misc -#else +} else { packed_freq_misc: - put_packed_freq_misc() - -#endif + +PUT_PACKED_FREQ_misc +} diff --git a/src/basic/assets/startup_banner.s b/src/basic/assets/startup_banner.s index d1096c4f..c8f46dca 100644 --- a/src/basic/assets/startup_banner.s +++ b/src/basic/assets/startup_banner.s @@ -1,56 +1,52 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Startup banner, to be displayed during cold start -// - -.encoding "petscii_upper" +; +; Startup banner, to be displayed during cold start +; -.macro BANNER_TEXT() { +!macro BANNER_TEXT { -#if CONFIG_BRAND_CUSTOM_BUILD - .text "OPEN ROMS " - .text CONFIG_CUSTOM_BRAND -#elif CONFIG_BRAND_GENERIC - .text "OPEN ROMS GENERIC BUILD" -#elif CONFIG_BRAND_TESTING - .text "OPEN ROMS TESTING BUILD" -#elif CONFIG_BRAND_ULTIMATE_64 - .text "OPEN ROMS FOR ULTIMATE 64" -#endif +!ifdef CONFIG_BRAND_CUSTOM_BUILD { + !pet "open roms " + +CONFIG_CUSTOM_BRAND +} else ifdef CONFIG_BRAND_GENERIC { + !pet "open roms generic build" +} else ifdef CONFIG_BRAND_TESTING { + !pet "open roms testing build" +} else ifdef CONFIG_BRAND_ULTIMATE_64 { + !pet "open roms for ultimate 64" +} } startup_banner: -#if CONFIG_BANNER_SIMPLE +!ifdef CONFIG_BANNER_SIMPLE { - .text " " - BANNER_TEXT() - .byte $00 + !pet " " + +BANNER_TEXT + !byte $00 -#elif CONFIG_BANNER_FANCY +} else ifdef CONFIG_BANNER_FANCY { - BANNER_TEXT() - .byte $00 + +BANNER_TEXT + !byte $00 rainbow_logo: -{ - .var SET_COLOR_0 = $05 - .var SET_COLOR_1 = $1C - .var SET_COLOR_2 = $9E - .var SET_COLOR_3 = $1E - .var SET_COLOR_4 = $9F + !set SET_COLOR_0 = $05 + !set SET_COLOR_1 = $1C + !set SET_COLOR_2 = $9E + !set SET_COLOR_3 = $1E + !set SET_COLOR_4 = $9F + + !byte SET_COLOR_1, $12, $A4, $A4, $A4, $A4, $A4, $A4, $A4, $0D + !byte SET_COLOR_2, $12, $A4, $A4, $A4, $A4, $A4, $A4, $0D + !byte SET_COLOR_3, $12, $A4, $A4, $A4, $A4, $A4, $0D + !byte SET_COLOR_4, $12, $A4, $A4, $A4, $A4, $92 + !byte SET_COLOR_0, $00 - .byte SET_COLOR_1, $12, $A4, $A4, $A4, $A4, $A4, $A4, $A4, $0D - .byte SET_COLOR_2, $12, $A4, $A4, $A4, $A4, $A4, $A4, $0D - .byte SET_COLOR_3, $12, $A4, $A4, $A4, $A4, $A4, $0D - .byte SET_COLOR_4, $12, $A4, $A4, $A4, $A4, $92 - .byte SET_COLOR_0, $00 } - -#endif diff --git a/src/basic/assets/startup_banner_m65.s b/src/basic/assets/startup_banner_m65.s index a09193ed..8e4b3830 100644 --- a/src/basic/assets/startup_banner_m65.s +++ b/src/basic/assets/startup_banner_m65.s @@ -1,71 +1,66 @@ -// #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Startup banner, to be displayed during cold start -// - -.encoding "petscii_upper" +; +; Startup banner, to be displayed during cold start +; startup_banner: - // Fancy MEGA65 banner - from Retrofan, slightly tweaked + ; Fancy MEGA65 banner - from Retrofan, slightly tweaked - // remove unneeded $1F's (blue) and $9A's (light blue) + !byte $9A, $12, $20, $20, $7F, $A9, $20, $20, $92, $20, $12, $20, $20, $20, $20, $92 + !byte $20, $12, $A9, $20, $20, $20, $92, $A1, $20, $12, $A9, $20, $20, $20, $7F, $92 + !byte $20, $20, $12, $A3, $A3, $A3, $A3, $A3, $A3, $A3 + !byte $0D + !byte $9A, $12, $20, $20, $20, $20, $20 + !byte $20, $92, $20, $12, $20, $20, $92, $A2, $BB, $92, $20, $12, $20, $20, $92, $AC + !byte $A2, $A2, $20, $9A, $12, $20, $20, $92, $20, $12, $20, $20, $92, $20, $20, $12 + !byte $1E, $A3, $A3, $A3, $A3, $A3, $A3 + !byte $0D + !byte $9A, $12, $20, $20, $92, $7F, $A9, $12, $20, $20, $92, $20, $12, $20, $20, $A2 + !byte $92, $BE, $92, $20, $12, $20, $20, $92, $BC, $12, $20, $20, $92, $20, $12, $20 + !byte $20, $20, $20, $20, $92, $20, $20, $12, $9E, $A3, $A3, $A3, $A3, $A3 + !byte $0D + !byte $9A, $12, $20, $20, $92, $20, $20, $12, $20, $20, $92, $20, $12, $20, $20, $20 + !byte $20, $92, $20, $12, $20, $20, $20, $20, $20, $92, $20, $12, $20, $20, $92, $20 + !byte $12, $20, $20, $92, $20, $20, $12, $96, $A3, $A3, $A3, $A3, $1F, $92 + !byte $0D, $0D, $05, $00 + ; Fancy MEGA65 banner - from Retrofan + ; + ; !byte $9a, $12, $20, $20, $7f, $a9, $20, $20, $1f, $20, $9a, $20, $20, $20 + ; !byte $20, $1f, $20, $9a, $a9, $20, $20, $20, $92, $a1, $1f, $12, $20, $9a, $a9, $20 + ; !byte $20, $20, $7f, $1f, $20, $20, $9a, $a3, $a3, $a3, $a3, $a3, $a3, $a3, $1f, $20 + ; !byte $20, $20, $20, $05, $92, $4d, $45, $47, $41, $9a, $12, $20, $20, $20, $20, $20 + ; !byte $20, $1f, $20, $9a, $20, $20, $92, $a2, $bb, $1f, $12, $20, $9a, $20, $20, $92 + ; !byte $ac, $a2, $a2, $1f, $12, $20, $9a, $20, $20, $1f, $20, $9a, $20, $20, $1f, $20 + ; !byte $20, $1e, $a3, $a3, $a3, $a3, $a3, $a3, $1f, $20, $20, $20, $20, $05, $92, $42 + ; !byte $41, $53, $49, $43, $9a, $12, $20, $20, $92, $7f, $a9, $12, $20, $20, $1f, $20 + ; !byte $9a, $20, $20, $a2, $92, $be, $1f, $12, $20, $9a, $20, $20, $92, $bc, $12, $20 + ; !byte $20, $1f, $20, $9a, $20, $20, $20, $20, $20, $1f, $20, $20, $9e, $a3, $a3, $a3 + ; !byte $a3, $a3, $1f, $20, $20, $20, $20, $05, $92, $2d, $2d, $2d, $2d, $2d, $2d, $9a + ; !byte $12, $20, $20, $1f, $20, $20, $9a, $20, $20, $1f, $20, $9a, $20, $20, $20, $20 + ; !byte $1f, $20, $9a, $20, $20, $20, $20, $20, $1f, $20, $9a, $20, $20, $1f, $20, $9a + ; !byte $20, $20, $1f, $20, $20, $96, $a3, $a3, $a3, $a3, $1f + ; !byte $92, $0D, $0D, $05, $00 - .byte $9A, $12, $20, $20, $7F, $A9, $20, $20, $92, $20, $12, $20, $20, $20, $20, $92 - .byte $20, $12, $A9, $20, $20, $20, $92, $A1, $20, $12, $A9, $20, $20, $20, $7F, $92 - .byte $20, $20, $12, $A3, $A3, $A3, $A3, $A3, $A3, $A3 - .byte $0D - .byte $9A, $12, $20, $20, $20, $20, $20 - .byte $20, $92, $20, $12, $20, $20, $92, $A2, $BB, $92, $20, $12, $20, $20, $92, $AC - .byte $A2, $A2, $20, $9A, $12, $20, $20, $92, $20, $12, $20, $20, $92, $20, $20, $12 - .byte $1E, $A3, $A3, $A3, $A3, $A3, $A3 - .byte $0D - .byte $9A, $12, $20, $20, $92, $7F, $A9, $12, $20, $20, $92, $20, $12, $20, $20, $A2 - .byte $92, $BE, $92, $20, $12, $20, $20, $92, $BC, $12, $20, $20, $92, $20, $12, $20 - .byte $20, $20, $20, $20, $92, $20, $20, $12, $9E, $A3, $A3, $A3, $A3, $A3 - .byte $0D - .byte $9A, $12, $20, $20, $92, $20, $20, $12, $20, $20, $92, $20, $12, $20, $20, $20 - .byte $20, $92, $20, $12, $20, $20, $20, $20, $20, $92, $20, $12, $20, $20, $92, $20 - .byte $12, $20, $20, $92, $20, $20, $12, $96, $A3, $A3, $A3, $A3, $1F, $92 - .byte $0D, $0D, $05, $00 - - // Fancy MEGA65 banner - from Retrofan - // - // .byte $9a, $12, $20, $20, $7f, $a9, $20, $20, $1f, $20, $9a, $20, $20, $20 - // .byte $20, $1f, $20, $9a, $a9, $20, $20, $20, $92, $a1, $1f, $12, $20, $9a, $a9, $20 - // .byte $20, $20, $7f, $1f, $20, $20, $9a, $a3, $a3, $a3, $a3, $a3, $a3, $a3, $1f, $20 - // .byte $20, $20, $20, $05, $92, $4d, $45, $47, $41, $9a, $12, $20, $20, $20, $20, $20 - // .byte $20, $1f, $20, $9a, $20, $20, $92, $a2, $bb, $1f, $12, $20, $9a, $20, $20, $92 - // .byte $ac, $a2, $a2, $1f, $12, $20, $9a, $20, $20, $1f, $20, $9a, $20, $20, $1f, $20 - // .byte $20, $1e, $a3, $a3, $a3, $a3, $a3, $a3, $1f, $20, $20, $20, $20, $05, $92, $42 - // .byte $41, $53, $49, $43, $9a, $12, $20, $20, $92, $7f, $a9, $12, $20, $20, $1f, $20 - // .byte $9a, $20, $20, $a2, $92, $be, $1f, $12, $20, $9a, $20, $20, $92, $bc, $12, $20 - // .byte $20, $1f, $20, $9a, $20, $20, $20, $20, $20, $1f, $20, $20, $9e, $a3, $a3, $a3 - // .byte $a3, $a3, $1f, $20, $20, $20, $20, $05, $92, $2d, $2d, $2d, $2d, $2d, $2d, $9a - // .byte $12, $20, $20, $1f, $20, $20, $9a, $20, $20, $1f, $20, $9a, $20, $20, $20, $20 - // .byte $1f, $20, $9a, $20, $20, $20, $20, $20, $1f, $20, $9a, $20, $20, $1f, $20, $9a - // .byte $20, $20, $1f, $20, $20, $96, $a3, $a3, $a3, $a3, $1f - // .byte $92, $0D, $0D, $05, $00 - - // Original MEGA65 banner - supplied by Deft - // - // .byte $9A,$12,$A3,$A3,$A3,$A3,$A3,$A3,$DF,$9B,$92,$20,$05,$12,$A0,$A0 - // .byte $DF,$9B,$92,$20,$05,$12,$A0,$A0,$DF,$9B,$92,$20,$05,$12,$A0,$A0 - // .byte $DF,$9B,$92,$20,$05,$12,$A0,$A0,$DF,$9A,$92,$20,$05,$20,$20,$20 - // .byte $4D,$20,$45,$20,$47,$20,$41,$0D,$99,$12,$A3,$A3,$A3,$A3,$A3,$A3 - // .byte $A3,$DF,$92,$7F,$12,$CD,$CD,$DF,$92,$7F,$12,$DF,$05,$92,$20,$20 - // .byte $99,$7F,$12,$DF,$05,$92,$20,$20,$99,$7F,$12,$DF,$92,$7F,$12,$DF - // .byte $05,$92,$20,$20,$99,$42,$20,$41,$20,$53,$20,$49,$20,$43,$0D,$9E - // .byte $12,$A3,$A3,$A3,$A3,$A3,$A3,$A3,$A3,$DF,$9B,$92,$7F,$12,$DF,$92 - // .byte $7F,$12,$DF,$92,$7F,$12,$CD,$05,$92,$20,$20,$9B,$7F,$12,$CD,$92 - // .byte $7F,$12,$DF,$92,$7F,$12,$CD,$92,$7F,$12,$DF,$9A,$92,$20,$05,$20 - // .byte $9A,$2D,$2D,$2D,$2D,$2D,$2D,$2D,$0D,$96,$12,$A3,$A3,$A3,$A3,$A3 - // .byte $A3,$A3,$A3,$A3,$DF,$9A,$92,$7F,$12,$DF,$92,$7F,$9B,$20,$9A,$7F - // .byte $12,$A0,$A0,$9B,$92,$20,$9A,$7F,$12,$A0,$A0,$9B,$92,$20,$9A,$7F - // .byte $12,$DF,$92,$7F,$9B,$20,$9A,$20,$9B,"0.2.0.0",$0D - // .byte $0D,$05,$92,$00 + ; Original MEGA65 banner - supplied by Deft + ; + ; !byte $9A,$12,$A3,$A3,$A3,$A3,$A3,$A3,$DF,$9B,$92,$20,$05,$12,$A0,$A0 + ; !byte $DF,$9B,$92,$20,$05,$12,$A0,$A0,$DF,$9B,$92,$20,$05,$12,$A0,$A0 + ; !byte $DF,$9B,$92,$20,$05,$12,$A0,$A0,$DF,$9A,$92,$20,$05,$20,$20,$20 + ; !byte $4D,$20,$45,$20,$47,$20,$41,$0D,$99,$12,$A3,$A3,$A3,$A3,$A3,$A3 + ; !byte $A3,$DF,$92,$7F,$12,$CD,$CD,$DF,$92,$7F,$12,$DF,$05,$92,$20,$20 + ; !byte $99,$7F,$12,$DF,$05,$92,$20,$20,$99,$7F,$12,$DF,$92,$7F,$12,$DF + ; !byte $05,$92,$20,$20,$99,$42,$20,$41,$20,$53,$20,$49,$20,$43,$0D,$9E + ; !byte $12,$A3,$A3,$A3,$A3,$A3,$A3,$A3,$A3,$DF,$9B,$92,$7F,$12,$DF,$92 + ; !byte $7F,$12,$DF,$92,$7F,$12,$CD,$05,$92,$20,$20,$9B,$7F,$12,$CD,$92 + ; !byte $7F,$12,$DF,$92,$7F,$12,$CD,$92,$7F,$12,$DF,$9A,$92,$20,$05,$20 + ; !byte $9A,$2D,$2D,$2D,$2D,$2D,$2D,$2D,$0D,$96,$12,$A3,$A3,$A3,$A3,$A3 + ; !byte $A3,$A3,$A3,$A3,$DF,$9A,$92,$7F,$12,$DF,$92,$7F,$9B,$20,$9A,$7F + ; !byte $12,$A0,$A0,$9B,$92,$20,$9A,$7F,$12,$A0,$A0,$9B,$92,$20,$9A,$7F + ; !byte $12,$DF,$92,$7F,$9B,$20,$9A,$20,$9B,"0.2.0.0",$0D + ; !byte $0D,$05,$92,$00 diff --git a/src/basic/assets/str_rev_question.s b/src/basic/assets/str_rev_question.s index ba0c8302..a0323ba7 100644 --- a/src/basic/assets/str_rev_question.s +++ b/src/basic/assets/str_rev_question.s @@ -1,9 +1,9 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// String - question mark in reverse +; String - question mark in reverse str_rev_question: - .byte $12, $3F, $92, $00 + !byte $12, $3F, $92, $00 diff --git a/src/basic/assets/table_ti_hi.s b/src/basic/assets/table_ti_hi.s index e0615a58..46504a30 100644 --- a/src/basic/assets/table_ti_hi.s +++ b/src/basic/assets/table_ti_hi.s @@ -1,29 +1,29 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Table to TI$ special variable support -// +; +; Table to TI$ special variable support +; table_TI_hi: -#if !CONFIG_RS232_UP9600 +!ifndef CONFIG_RS232_UP9600 { - .byte $20 // 10 hours = 2169000 ticks - .byte $03 // 1 hour = 216000 ticks - .byte $00 // 10 minutes = 36000 ticks - .byte $00 // 1 minute = 3600 ticks - .byte $00 // 10 seconds = 600 ticks - .byte $00 // 1 second = 60 ticks + !byte $20 ; 10 hours = 2169000 ticks + !byte $03 ; 1 hour = 216000 ticks + !byte $00 ; 10 minutes = 36000 ticks + !byte $00 ; 1 minute = 3600 ticks + !byte $00 ; 10 seconds = 600 ticks + !byte $00 ; 1 second = 60 ticks -#else +} else { - .byte $23 // 10 hours = 2304000 ticks - .byte $03 // 1 hour = 230400 ticks - .byte $00 // 10 minutes = 38400 ticks - .byte $00 // 1 minute = 3840 ticks - .byte $00 // 10 seconds = 640 ticks - .byte $00 // 1 second = 64 ticks + !byte $23 ; 10 hours = 2304000 ticks + !byte $03 ; 1 hour = 230400 ticks + !byte $00 ; 10 minutes = 38400 ticks + !byte $00 ; 1 minute = 3840 ticks + !byte $00 ; 10 seconds = 640 ticks + !byte $00 ; 1 second = 64 ticks -#endif \ No newline at end of file +} diff --git a/src/basic/assets/table_ti_lo.s b/src/basic/assets/table_ti_lo.s index 4f7ef5ae..2ad13a79 100644 --- a/src/basic/assets/table_ti_lo.s +++ b/src/basic/assets/table_ti_lo.s @@ -1,29 +1,29 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Table to TI$ special variable support -// +; +; Table to TI$ special variable support +; table_TI_lo: -#if !CONFIG_RS232_UP9600 +!ifndef CONFIG_RS232_UP9600 { - .byte $80 // 10 hours = 2169000 ticks - .byte $C0 // 1 hour = 216000 ticks - .byte $A0 // 10 minutes = 36000 ticks - .byte $10 // 1 minute = 3600 ticks - .byte $58 // 10 seconds = 600 ticks - .byte $3C // 1 second = 60 ticks + !byte $80 ; 10 hours = 2169000 ticks + !byte $C0 ; 1 hour = 216000 ticks + !byte $A0 ; 10 minutes = 36000 ticks + !byte $10 ; 1 minute = 3600 ticks + !byte $58 ; 10 seconds = 600 ticks + !byte $3C ; 1 second = 60 ticks -#else +} else { - .byte $00 // 10 hours = 2304000 ticks - .byte $00 // 1 hour = 230400 ticks - .byte $00 // 10 minutes = 38400 ticks - .byte $00 // 1 minute = 3840 ticks - .byte $80 // 10 seconds = 640 ticks - .byte $40 // 1 second = 64 ticks + !byte $00 ; 10 hours = 2304000 ticks + !byte $00 ; 1 hour = 230400 ticks + !byte $00 ; 10 minutes = 38400 ticks + !byte $00 ; 1 minute = 3840 ticks + !byte $80 ; 10 seconds = 640 ticks + !byte $40 ; 1 second = 64 ticks -#endif +} diff --git a/src/basic/assets/table_ti_mid.s b/src/basic/assets/table_ti_mid.s index 22b38fb8..1d816dfe 100644 --- a/src/basic/assets/table_ti_mid.s +++ b/src/basic/assets/table_ti_mid.s @@ -1,29 +1,29 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Table to TI$ special variable support -// +; +; Table to TI$ special variable support +; table_TI_mid: -#if !CONFIG_RS232_UP9600 +!ifndef CONFIG_RS232_UP9600 { - .byte $F5 // 10 hours = 2169000 ticks - .byte $4B // 1 hour = 216000 ticks - .byte $8C // 10 minutes = 36000 ticks - .byte $0E // 1 minute = 3600 ticks - .byte $02 // 10 seconds = 600 ticks - .byte $00 // 1 second = 60 ticks + !byte $F5 ; 10 hours = 2169000 ticks + !byte $4B ; 1 hour = 216000 ticks + !byte $8C ; 10 minutes = 36000 ticks + !byte $0E ; 1 minute = 3600 ticks + !byte $02 ; 10 seconds = 600 ticks + !byte $00 ; 1 second = 60 ticks -#else +} else { - .byte $28 // 10 hours = 2304000 ticks - .byte $84 // 1 hour = 230400 ticks - .byte $96 // 10 minutes = 38400 ticks - .byte $0F // 1 minute = 3840 ticks - .byte $02 // 10 seconds = 640 ticks - .byte $00 // 1 second = 64 ticks + !byte $28 ; 10 hours = 2304000 ticks + !byte $84 ; 1 hour = 230400 ticks + !byte $96 ; 10 minutes = 38400 ticks + !byte $0F ; 1 minute = 3840 ticks + !byte $02 ; 10 seconds = 640 ticks + !byte $00 ; 1 second = 64 ticks -#endif +} diff --git a/src/basic/basic_commands/cmd__jumptable.s b/src/basic/basic_commands/cmd__jumptable.s index 3f541ef8..a521f1e4 100644 --- a/src/basic/basic_commands/cmd__jumptable.s +++ b/src/basic/basic_commands/cmd__jumptable.s @@ -1,96 +1,86 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Jumptable for BASIC V2 dialect commands -// +; +; Jumptable for BASIC V2 dialect commands +; +!set ITEM_80 = cmd_end +!set ITEM_81 = cmd_for +!set ITEM_82 = cmd_next +!set ITEM_83 = cmd_data +!set ITEM_84 = cmd_inputhash +!set ITEM_85 = cmd_input +!set ITEM_86 = array_create ; cmd_dim +!set ITEM_87 = cmd_read +!set ITEM_88 = assign_variable ; cmd_let +!set ITEM_89 = cmd_goto +!set ITEM_8A = cmd_run +!set ITEM_8B = cmd_if +!set ITEM_8C = do_restore ; cmd_restore +!set ITEM_8D = cmd_gosub +!set ITEM_8E = cmd_return +!set ITEM_8F = cmd_rem -.const command_list = List().add( +!set ITEM_90 = cmd_stop +!set ITEM_91 = cmd_on +!set ITEM_92 = cmd_wait +!set ITEM_93 = cmd_load +!set ITEM_94 = cmd_save +!set ITEM_95 = cmd_verify +!set ITEM_96 = cmd_def +!set ITEM_97 = cmd_poke +!set ITEM_98 = cmd_printhash +!set ITEM_99 = cmd_print +!set ITEM_9A = cmd_cont +!set ITEM_9B = cmd_list +!set ITEM_9C = do_clr ; cmd_clr +!set ITEM_9D = cmd_cmd +!set ITEM_9E = cmd_sys +!set ITEM_9F = cmd_open - // $80 - $8F - - cmd_end, - cmd_for, - cmd_next, - cmd_data, - cmd_inputhash, - cmd_input, - array_create, // cmd_dim - cmd_read, - assign_variable, // cmd_let - cmd_goto, - cmd_run, - cmd_if, - do_restore, // cmd_restore - cmd_gosub, - cmd_return, - cmd_rem, - - // $90-$9F - - cmd_stop, - cmd_on, - cmd_wait, - cmd_load, - cmd_save, - cmd_verify, - cmd_def, - cmd_poke, - cmd_printhash, - cmd_print, - cmd_cont, - cmd_list, - do_clr, // cmd_clr - cmd_cmd, - cmd_sys, - cmd_open, - - // $A0-$A6 - - cmd_close, - cmd_get, - cmd_new, - cmd_tab, // XXX this token probably does not belong here - do_SYNTAX_error, // 'TO' is not a standalone command - do_SYNTAX_error, // 'FN' is not a standalone command - cmd_spc // XXX this token probably does not belong here +!set ITEM_A0 = cmd_close +!set ITEM_A1 = cmd_get +!set ITEM_A2 = cmd_new +!set ITEM_A3 = cmd_tab ; XXX this token probably does not belong here +!set ITEM_A4 = do_SYNTAX_error ; 'TO' is not a standalone command +!set ITEM_A5 = do_SYNTAX_error ; 'FN' is not a standalone command +!set ITEM_A6 = cmd_spc ; XXX this token probably does not belong here - // 'THEN' ($A7) and 'STEP' ($A9) are not standalone commands - // 'NOT' ($A8) is an operator, not a command + ; 'THEN' ($A7) and 'STEP' ($A9) are not standalone commands + ; 'NOT' ($A8) is an operator, not a command - // 'GO' ($CB) is handled separately -) + ; 'GO' ($CB) is handled separately -#if !HAS_OPCODES_65C02 - +!ifndef HAS_OPCODES_65C02 { command_jumptable_lo: - put_jumptable_lo(command_list) - + !byte <(ITEM_80-1), <(ITEM_81-1), <(ITEM_82-1), <(ITEM_83-1), <(ITEM_84-1), <(ITEM_85-1), <(ITEM_86-1), <(ITEM_87-1) + !byte <(ITEM_88-1), <(ITEM_89-1), <(ITEM_8A-1), <(ITEM_8B-1), <(ITEM_8C-1), <(ITEM_8D-1), <(ITEM_8E-1), <(ITEM_8F-1) + !byte <(ITEM_90-1), <(ITEM_91-1), <(ITEM_92-1), <(ITEM_93-1), <(ITEM_94-1), <(ITEM_95-1), <(ITEM_96-1), <(ITEM_97-1) + !byte <(ITEM_98-1), <(ITEM_99-1), <(ITEM_9A-1), <(ITEM_9B-1), <(ITEM_9C-1), <(ITEM_9D-1), <(ITEM_9E-1), <(ITEM_9F-1) + !byte <(ITEM_A0-1), <(ITEM_A1-1), <(ITEM_A2-1), <(ITEM_A3-1), <(ITEM_A4-1), <(ITEM_A5-1), <(ITEM_A6-1) command_jumptable_hi: - put_jumptable_hi(command_list) + !byte >(ITEM_80-1), >(ITEM_81-1), >(ITEM_82-1), >(ITEM_83-1), >(ITEM_84-1), >(ITEM_85-1), >(ITEM_86-1), >(ITEM_87-1) + !byte >(ITEM_88-1), >(ITEM_89-1), >(ITEM_8A-1), >(ITEM_8B-1), >(ITEM_8C-1), >(ITEM_8D-1), >(ITEM_8E-1), >(ITEM_8F-1) + !byte >(ITEM_90-1), >(ITEM_91-1), >(ITEM_92-1), >(ITEM_93-1), >(ITEM_94-1), >(ITEM_95-1), >(ITEM_96-1), >(ITEM_97-1) + !byte >(ITEM_98-1), >(ITEM_99-1), >(ITEM_9A-1), >(ITEM_9B-1), >(ITEM_9C-1), >(ITEM_9D-1), >(ITEM_9E-1), >(ITEM_9F-1) + !byte >(ITEM_A0-1), >(ITEM_A1-1), >(ITEM_A2-1), >(ITEM_A3-1), >(ITEM_A4-1), >(ITEM_A5-1), >(ITEM_A6-1) - -#else // HAS_OPCODES_65C02 - - -__before_command_jumptable: - -.if (mod(*, $2) == 1) { brk } // align code so that vector never crosses page boundary +} else { ; HAS_OPCODES_65C02 command_jumptable: - put_jumptable(command_list) + ; Note: 65C02 has the page boundary vector bug fixed! - // Make sure routine size is always the same - build system limitation - -.if (__before_command_jumptable == command_jumptable) { brk } - - -#endif + !word ITEM_80, ITEM_81, ITEM_82, ITEM_83, ITEM_84, ITEM_85, ITEM_86, ITEM_87 + !word ITEM_88, ITEM_89, ITEM_8A, ITEM_8B, ITEM_8C, ITEM_8D, ITEM_8E, ITEM_8F + !word ITEM_90, ITEM_91, ITEM_92, ITEM_93, ITEM_94, ITEM_95, ITEM_96, ITEM_97 + !word ITEM_98, ITEM_99, ITEM_9A, ITEM_9B, ITEM_9C, ITEM_9D, ITEM_9E, ITEM_9F + !word ITEM_A0, ITEM_A1, ITEM_A2, ITEM_A3, ITEM_A4, ITEM_A5, ITEM_A6 +} diff --git a/src/basic/basic_commands/cmd__unimplemented.s b/src/basic/basic_commands/cmd__unimplemented.s index 9b76d5f6..37366ea2 100644 --- a/src/basic/basic_commands/cmd__unimplemented.s +++ b/src/basic/basic_commands/cmd__unimplemented.s @@ -1,55 +1,55 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Default handler for all not-yet-implemented commands -// -// Note: NOPs are here just to make debugging easier (no duplicated labels)! -// +; +; Default handler for all not-yet-implemented commands +; +; Note: NOPs are here just to make debugging easier (no duplicated labels)! +; cmd_for: - nop + +nop cmd_next: - nop + +nop cmd_data: - nop + +nop cmd_inputhash: - nop + +nop cmd_input: - nop + +nop cmd_read: - nop + +nop cmd_gosub: - nop + +nop cmd_return: - nop + +nop cmd_on: - nop + +nop cmd_wait: - nop + +nop cmd_def: - nop + +nop cmd_poke: - nop + +nop cmd_printhash: - nop + +nop cmd_cont: - nop + +nop cmd_cmd: - nop + +nop cmd_open: - nop + +nop cmd_close: - nop + +nop cmd_get: - nop + +nop cmd_tab: - nop + +nop cmd_spc: - nop + +nop - // Unimplemented tokens + ; Unimplemented tokens jmp do_NOT_IMPLEMENTED_error diff --git a/src/basic/basic_commands/cmd_clr.s b/src/basic/basic_commands/cmd_clr.s index 9305ec00..6554b554 100644 --- a/src/basic/basic_commands/cmd_clr.s +++ b/src/basic/basic_commands/cmd_clr.s @@ -1,8 +1,8 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// PLACEHOLDER for completeness - jumptable contains direct address +; PLACEHOLDER for completeness - jumptable contains direct address -// CLR command does not stop execution (confirmed on a C64) +; CLR command does not stop execution (confirmed on a C64) diff --git a/src/basic/basic_commands/cmd_dim.s b/src/basic/basic_commands/cmd_dim.s index cccb47e2..8d9470ca 100644 --- a/src/basic/basic_commands/cmd_dim.s +++ b/src/basic/basic_commands/cmd_dim.s @@ -1,6 +1,6 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// PLACEHOLDER for completeness - jumptable contains direct address +; PLACEHOLDER for completeness - jumptable contains direct address diff --git a/src/basic/basic_commands/cmd_go_goto_run.s b/src/basic/basic_commands/cmd_go_goto_run.s index 5bfb7281..4dbaf399 100644 --- a/src/basic/basic_commands/cmd_go_goto_run.s +++ b/src/basic/basic_commands/cmd_go_goto_run.s @@ -1,60 +1,60 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE cmd_go: jsr fetch_character_skip_spaces - cmp #$A4 // 'TO' keyword + cmp #$A4 ; 'TO' keyword beq cmd_goto -#if !ROM_LAYOUT_M65 +!ifndef CONFIG_MB_M65 { - // FALLTROUGH + ; FALLTROUGH cmd_go_syntax_error: jmp do_SYNTAX_error -#else +} else { - cmp #$9E // 'SYS' keyword, for 'GO SYS' - beq_16 cmd_gosys + cmp #$9E ; 'SYS' keyword, for 'GO SYS' + +beq cmd_gosys - dew TXTPTR // unconsume character + dew TXTPTR ; unconsume character - // Fetch desired mode + ; Fetch desired mode jsr fetch_uint8 cmp #64 - bne !+ + bne @1 - // If in native mode - switch to C64 compatibilty + ; If in native mode - switch to C64 compatibilty jsr M65_MODEGET bcs cmd_go_rts jsr helper_ask_if_sure - bcs_16 cmd_end + +bcs cmd_end sec - jsr M65_MODESET // Carry set = switch to C64 mode - jmp_8 cmd_go_switchmode_clr_banner -!: + jsr M65_MODESET ; Carry set = switch to C64 mode + +bra cmd_go_switchmode_clr_banner +@1: cmp #65 - bne_16 do_ILLEGAL_QUANTITY_error + +bne do_ILLEGAL_QUANTITY_error - // If in C64 compatibility mode - switch to native mode + ; If in C64 compatibility mode - switch to native mode jsr M65_MODEGET bcc cmd_go_rts jsr helper_ask_if_sure - bcs_16 cmd_end - jsr M65_MODESET // Carry clear = switch to M65 mode + +bcs cmd_end + jsr M65_MODESET ; Carry clear = switch to M65 mode - // FALLTROUGH + ; FALLTROUGH cmd_go_switchmode_clr_banner: @@ -62,7 +62,7 @@ cmd_go_switchmode_clr_banner: ldx CURLIN+1 inx - beq_16 INITMSG + +beq INITMSG lda #147 jmp JCHROUT @@ -70,90 +70,87 @@ cmd_go_switchmode_clr_banner: cmd_go_rts: rts - - -#endif +} cmd_run: - // RUN clears all variables + ; RUN clears all variables jsr do_clr - // Initialize OLDTXT pointer, disable Kernal messages + ; Initialize OLDTXT pointer, disable Kernal messages jsr init_oldtxt lda #$00 jsr JSETMSG - // Check if we have any paramenters + ; Check if we have any paramenters jsr is_end_of_statement bcs cmd_run_goto_launch - // FALLTROUGH + ; FALLTROUGH cmd_goto: - // GOTO requires line number - // XXX in case of no parameter, go to line 0 - checked with original ROMs - + ; GOTO requires line number + ; XXX in case of no parameter, go to line 0 - checked with original ROMs jsr fetch_line_number -#if !ROM_LAYOUT_M65 +!ifndef CONFIG_MB_M65 { bcs cmd_go_syntax_error -#else - bcs_16 do_SYNTAX_error -#endif +} else { + +bcs do_SYNTAX_error +} - // Check for direct mode + ; Check for direct mode lda CURLIN+1 bmi cmd_goto_direct - // Not a direct mode - compare desired line number (LINNUM) with the current one (CURLIN) + ; Not a direct mode - compare desired line number (LINNUM) with the current one (CURLIN) lda LINNUM+1 cmp CURLIN+1 - bne !+ + bne @2 lda LINNUM+0 cmp CURLIN+0 -!: - // If desired line number is lower - search line number from start +@2: + ; If desired line number is lower - search line number from start bcc cmd_goto_from_start - // Else - search from the current line + ; Else - search from the current line jsr find_line_from_current - jmp_8 cmd_goto_check + +bra cmd_goto_check cmd_goto_direct: - // Disable Kernal messages + ; Disable Kernal messages lda #$00 jsr JSETMSG - // FALLTROUGH + ; FALLTROUGH cmd_goto_from_start: - // Direct mode - find the line from the beginning + ; Direct mode - find the line from the beginning jsr find_line_from_start - // FALLTROUGH + ; FALLTROUGH cmd_goto_check: - bcs_16 do_UNDEFD_STATEMENT_error + +bcs do_UNDEFD_STATEMENT_error - // FALLTROUGH + ; FALLTROUGH cmd_run_goto_launch: - // Run it! + ; Run it! pha pha diff --git a/src/basic/basic_commands/cmd_if.s b/src/basic/basic_commands/cmd_if.s index 7e3a4488..4f821478 100644 --- a/src/basic/basic_commands/cmd_if.s +++ b/src/basic/basic_commands/cmd_if.s @@ -1,38 +1,37 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE cmd_if: -#if ROM_LAYOUT_M65 +!ifdef CONFIG_MB_M65 { jsr helper_if_mega65 bcc cmd_if_true +} -#endif - - // Calculate expression + ; Calculate expression jsr FRMEVL - // Check the result - either string size or floating point 0 vs non-0 + ; Check the result - either string size or floating point 0 vs non-0 lda FAC1_exponent - beq_16 cmd_rem + +beq cmd_rem - // FALLTROUGH + ; FALLTROUGH cmd_if_true: - // Condition fulfilled - look for GOTO or THEN + ; Condition fulfilled - look for GOTO or THEN jsr fetch_character_skip_spaces - cmp #$89 // 'GOTO' - beq_16 cmd_goto + cmp #$89 ; 'GOTO' + +beq cmd_goto - cmp #$A7 // 'THEN' - bne_16 do_SYNTAX_error + cmp #$A7 ; 'THEN' + +bne do_SYNTAX_error pla pla diff --git a/src/basic/basic_commands/cmd_let.s b/src/basic/basic_commands/cmd_let.s index cccb47e2..8d9470ca 100644 --- a/src/basic/basic_commands/cmd_let.s +++ b/src/basic/basic_commands/cmd_let.s @@ -1,6 +1,6 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// PLACEHOLDER for completeness - jumptable contains direct address +; PLACEHOLDER for completeness - jumptable contains direct address diff --git a/src/basic/basic_commands/cmd_list.s b/src/basic/basic_commands/cmd_list.s index 6d7eecc3..b53c4eef 100644 --- a/src/basic/basic_commands/cmd_list.s +++ b/src/basic/basic_commands/cmd_list.s @@ -1,44 +1,43 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// LIST basic text. -// XXX - Does not currently support line number ranges +; LIST basic text. +; XXX - Does not currently support line number ranges cmd_list: - // Set current line pointer to start of memory + ; Set current line pointer to start of memory jsr init_oldtxt list_loop: ldy #1 -#if CONFIG_MEMORY_MODEL_60K +!ifdef CONFIG_MEMORY_MODEL_60K { ldx #2060 sta LINNUM+1 - bne cmd_sys_setup_call // always jumps + bne cmd_sys_setup_call ; always jumps cmd_sys_hack_not_needed: - // - // XXX End of hack - // + ; + ; XXX End of hack + ; - lda #IDX__EV2_0B // 'SYNTAX ERROR' + lda #IDX__EV2_0B ; 'SYNTAX ERROR' jsr fetch_uint16 - bcs_16 do_SYNTAX_error + +bcs do_SYNTAX_error cmd_sys_setup_call: - lda #$4C // JMP opcode + lda #$4C ; JMP opcode sta USRPOK lda LINNUM+0 sta USRADD+0 lda LINNUM+1 sta USRADD+1 - // Setup the register values + ; Setup the register values lda SPREG pha ldy SYREG @@ -87,12 +86,13 @@ cmd_sys_setup_call: lda SAREG plp - // Call the routine. + ; Call the routine. jmp USRPOK - // - // XXX Temporary ugly hack to support 'SYS PI*656' - // + ; + ; XXX Temporary ugly hack to support 'SYS PI*656' + ; cmd_sys_hack_str: - .byte $FF, $AC, $36, $35, $36, $00 + + !byte $FF, $AC, $36, $35, $36, $00 diff --git a/src/basic/basic_commands/helper_if_mega65_38K.s b/src/basic/basic_commands/helper_if_mega65_38K.s index fd93f63e..1c77e940 100644 --- a/src/basic/basic_commands/helper_if_mega65_38K.s +++ b/src/basic/basic_commands/helper_if_mega65_38K.s @@ -1,41 +1,41 @@ -// #LAYOUT# M65 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -#if CONFIG_MEMORY_MODEL_38K +!ifndef CONFIG_MEMORY_MODEL_46K_OR_50K { helper_if_mega65: - // Injest all spaces + ; Injest all spaces ldy #$00 -!: +@1: lda (TXTPTR), Y cmp #$20 - bne !+ + bne @2 inw TXTPTR - bra !- -!: + bra @1 +@2: - // Check for MEGA65 untokenized keyword + ; Check for MEGA65 untokenized keyword ldy #$05 -!: +@3: lda (TXTPTR), Y cmp str_mega65, Y - bne_16 helper_if_mega65_fail + +bne helper_if_mega65_fail dey - bpl !- + bpl @3 - // Increment TXTPTR by 6 + ; Increment TXTPTR by 6 clc lda TXTPTR+0 adc #$06 sta TXTPTR+0 - bcc !+ + bcc @4 inc TXTPTR+1 -!: - // Report successful check +@4: + ; Report successful check clc rts @@ -47,6 +47,5 @@ helper_if_mega65_fail: str_mega65: - .byte $4D, $45, $47, $41, $36, $35 - -#endif + !byte $4D, $45, $47, $41, $36, $35 +} diff --git a/src/basic/basic_commands/helper_if_mega65_46K_50K.s b/src/basic/basic_commands/helper_if_mega65_46K_50K.s index 24b76024..243ce3e3 100644 --- a/src/basic/basic_commands/helper_if_mega65_46K_50K.s +++ b/src/basic/basic_commands/helper_if_mega65_46K_50K.s @@ -1,54 +1,52 @@ -// #LAYOUT# M65 BASIC_0 #TAKE-HIGH -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 BASIC_0 #TAKE-HIGH +;; #LAYOUT# * * #IGNORE -// This has to go $E000 or above - routine below banks out the main BASIC ROM! +; This has to go $E000 or above - routine below banks out the main BASIC ROM! -#if CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K +!ifdef CONFIG_MEMORY_MODEL_46K_OR_50K { helper_if_mega65: - // Unmap BASIC lower ROM + ; Unmap BASIC lower ROM lda #$26 sta CPU_R6510 - // Injest all spaces + ; Injest all spaces ldy #$00 -!: +@1: lda (TXTPTR), Y cmp #$20 - bne !+ + bne @2 inw TXTPTR - bra !- -!: + bra @1 +@2: - // Check for MEGA65 untokenized keyword + ; Check for MEGA65 untokenized keyword ldy #$05 -!: +@3: lda (TXTPTR), Y cmp str_mega65, Y - bne_16 remap_BASIC_sec_rts + +bne remap_BASIC_sec_rts dey - bpl !- + bpl @3 - // Increment TXTPTR by 6 + ; Increment TXTPTR by 6 clc lda TXTPTR+0 adc #$06 sta TXTPTR+0 - bcc !+ + bcc @4 inc TXTPTR+1 -!: - // Report successful check +@4: + ; Report successful check jmp remap_BASIC_clc_rts str_mega65: - .byte $4D, $45, $47, $41, $36, $35 - - -#endif + !byte $4D, $45, $47, $41, $36, $35 +} diff --git a/src/basic/basic_commands/helper_load_fetch_devnum.s b/src/basic/basic_commands/helper_load_fetch_devnum.s index 5b6f66e4..5781fbcd 100644 --- a/src/basic/basic_commands/helper_load_fetch_devnum.s +++ b/src/basic/basic_commands/helper_load_fetch_devnum.s @@ -1,20 +1,20 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tries to fetch device number - sets Carry if failure -// +; +; Tries to fetch device number - sets Carry if failure +; helper_load_fetch_devnum: - // Fetch the device number + ; Fetch the device number jsr fetch_coma_uint8 - bcs !+ + bcs @1 sta FA -!: +@1: rts diff --git a/src/basic/basic_commands/helper_load_fetch_filename.s b/src/basic/basic_commands/helper_load_fetch_filename.s index 367b4cbf..256957c2 100644 --- a/src/basic/basic_commands/helper_load_fetch_filename.s +++ b/src/basic/basic_commands/helper_load_fetch_filename.s @@ -1,27 +1,27 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Fetches file name, Carry set if not found -// +; +; Fetches file name, Carry set if not found +; helper_load_fetch_filename: - // Check if end of statement + ; Check if end of statement jsr is_end_of_statement - bcs !+ + bcs @1 - // Call the expression parser, make sure it returned a string + ; Call the expression parser, make sure it returned a string jsr FRMEVL lda VALTYP - bpl_16 do_SYNTAX_error + +bpl do_SYNTAX_error - // Set the filename address and pointer + ; Set the filename address and pointer lda __FAC1+0 sta FNLEN @@ -31,11 +31,11 @@ helper_load_fetch_filename: lda __FAC1+2 sta FNADDR+1 - // Mark success + ; Mark success clc - // FALLTROUGH + ; FALLTROUGH -!: +@1: rts diff --git a/src/basic/basic_commands/helper_load_fetch_secondary.s b/src/basic/basic_commands/helper_load_fetch_secondary.s index 89212e12..3fbfa94a 100644 --- a/src/basic/basic_commands/helper_load_fetch_secondary.s +++ b/src/basic/basic_commands/helper_load_fetch_secondary.s @@ -1,20 +1,20 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tries to fetch secondary address - sets Carry if failure -// +; +; Tries to fetch secondary address - sets Carry if failure +; helper_load_fetch_secondary: - // Fetch the device number + ; Fetch the device number jsr fetch_coma_uint8 - bcs !+ + bcs @1 sta SA -!: +@1: rts diff --git a/src/basic/basic_commands/helper_load_init_param.s b/src/basic/basic_commands/helper_load_init_param.s index e070b2be..68a225d2 100644 --- a/src/basic/basic_commands/helper_load_init_param.s +++ b/src/basic/basic_commands/helper_load_init_param.s @@ -1,27 +1,27 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Sets initial parameters for LOAD and simiar commands -// -// Input: -// - VERCKB content in .A -// +; +; Sets initial parameters for LOAD and simiar commands +; +; Input: +; - VERCKB content in .A +; helper_load_init_params: - // Set LOAD/VERIFY flag + ; Set LOAD/VERIFY flag sta VERCKB - // FALLTROUGH + ; FALLTROUGH helper_load_init_params_no_VERCKB: - // Set default device, set secondary address to 0 + ; Set default device, set secondary address to 0 jsr SELDEV - ldy #$00 // secondary address + ldy #$00 ; secondary address jmp JSETFLS diff --git a/src/basic/basic_commands/helper_load_setnam_any.s b/src/basic/basic_commands/helper_load_setnam_any.s index b702ed98..3f397457 100644 --- a/src/basic/basic_commands/helper_load_setnam_any.s +++ b/src/basic/basic_commands/helper_load_setnam_any.s @@ -1,15 +1,15 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Set '*' as file name -// +; +; Set '*' as file name +; helper_load_setnam_any: - lda #$01 // name length + lda #$01 ; name length ldx #filename_any jmp JSETNAM diff --git a/src/basic/basic_commands/helper_print_string_46K_50K.s b/src/basic/basic_commands/helper_print_string_46K_50K.s index 4902509e..98d956ca 100644 --- a/src/basic/basic_commands/helper_print_string_46K_50K.s +++ b/src/basic/basic_commands/helper_print_string_46K_50K.s @@ -1,27 +1,26 @@ -// #LAYOUT# STD * #TAKE-HIGH -// #LAYOUT# * BASIC_0 #TAKE-HIGH -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE-HIGH +;; #LAYOUT# * BASIC_0 #TAKE-HIGH +;; #LAYOUT# * * #IGNORE -// This has to go $E000 or above - routine below banks out the main BASIC ROM! +; This has to go $E000 or above - routine below banks out the main BASIC ROM! -#if CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K +!ifdef CONFIG_MEMORY_MODEL_46K_OR_50K { helper_print_string: - // Unmap BASIC lower ROM + ; Unmap BASIC lower ROM lda #$26 sta CPU_R6510 - // Print the string + ; Print the string ldy #$00 -!: +@1: cpy __FAC1 + 0 - beq_16 remap_BASIC // branch if end of the string + +beq remap_BASIC ; branch if end of the string lda (__FAC1 + 1), y jsr JCHROUT iny - bpl !- - -#endif + bpl @1 +} diff --git a/src/basic/basic_commands_01/cmd__jumptable_01.s b/src/basic/basic_commands_01/cmd__jumptable_01.s index 269ff014..12152493 100644 --- a/src/basic/basic_commands_01/cmd__jumptable_01.s +++ b/src/basic/basic_commands_01/cmd__jumptable_01.s @@ -1,55 +1,53 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Jumptable for BASIC commands with tokens prefixed by $01 -// +; +; Jumptable for BASIC commands with tokens prefixed by $01 +; + +!ifdef CONFIG_MB_M65 { + +!set ITEM_00 = M65_SLOW +!set ITEM_01 = M65_FAST + +} else { + +!set ITEM_00 = cmd_slow +!set ITEM_01 = cmd_fast + +} + +!set ITEM_02 = cmd_old + + ; NOTE! These commands are temporarily placed here, they should be a part of list 02! + +!set ITEM_03 = cmd_merge + +!set ITEM_04 = cmd_bload +!set ITEM_05 = cmd_bsave +!set ITEM_06 = cmd_bverify + +!set ITEM_07 = cmd_clear +!set ITEM_08 = varstr_garbage_collect ; cmd_dispose -.const command_01_list = List().add( - -#if CONFIG_MB_MEGA_65 - M65_SLOW, - M65_FAST, -#else - cmd_slow, - cmd_fast, -#endif - - cmd_old, - - // NOTE! These commands are temporarily placed here, they should be a part of list 02! - - cmd_merge, - - cmd_bload, - cmd_bsave, - cmd_bverify, - - cmd_clear, - varstr_garbage_collect // cmd_dispose -) - - -#if !HAS_OPCODES_65C02 - +!ifndef HAS_OPCODES_65C02 { command_01_jumptable_lo: - put_jumptable_lo(command_01_list) + !byte <(ITEM_00-1), <(ITEM_01-1), <(ITEM_02-1), <(ITEM_03-1), <(ITEM_04-1), <(ITEM_05-1), <(ITEM_06-1), <(ITEM_07-1), <(ITEM_08-1) command_01_jumptable_hi: - put_jumptable_hi(command_01_list) + !byte >(ITEM_00-1), >(ITEM_01-1), >(ITEM_02-1), >(ITEM_03-1), >(ITEM_04-1), >(ITEM_05-1), >(ITEM_06-1), >(ITEM_07-1), >(ITEM_08-1) - -#else // HAS_OPCODES_65C02 +} else { ; HAS_OPCODES_65C02 command_01_jumptable: - // Note: 65C02 has the page boundary vector bug fixed! - put_jumptable(command_01_list) + ; Note: 65C02 has the page boundary vector bug fixed! -#endif + !word ITEM_00, ITEM_01, ITEM_02, ITEM_03, ITEM_04, ITEM_05, ITEM_06, ITEM_07, ITEM_08 +} diff --git a/src/basic/basic_commands_01/cmd_fast_slow.s b/src/basic/basic_commands_01/cmd_fast_slow.s index bd740ee3..8789c50a 100644 --- a/src/basic/basic_commands_01/cmd_fast_slow.s +++ b/src/basic/basic_commands_01/cmd_fast_slow.s @@ -1,15 +1,15 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -#if CONFIG_MB_MEGA_65 +!ifdef CONFIG_MB_M65 { - // For MEGA65 Kernal routines are called directly + ; For MEGA65 Kernal routines are called directly -#elif CONFIG_MB_ULTIMATE_64 +} else ifdef CONFIG_MB_U64 { - // Command implementation for Ultimate 64 - SuperCPU compatible way should be enough + ; Command implementation for Ultimate 64 - SuperCPU compatible way should be enough cmd_slow: @@ -21,41 +21,44 @@ cmd_fast: sta SCPU_SPEED_TURBO rts -#elif CONFIG_PLATFORM_COMMODORE_64 +} else ifdef CONFIG_PLATFORM_COMMODORE_64 { - // Command implementation for generic C64 platform + ; Command implementation for generic C64 platform cmd_slow: - // Try to disable turbo in SuperCPU compatible way + ; Try to disable turbo in SuperCPU compatible way sta SCPU_SPEED_NORMAL - // Try to disable turbo mode in C128 compatible way + ; Try to disable turbo mode in C128 compatible way lda #$00 - beq !+ // branch always + beq cmdfastslow_end ; branch always cmd_fast: - // Try to enable turbo in SuperCPU compatible way + ; Try to enable turbo in SuperCPU compatible way sta SCPU_SPEED_TURBO - // Try to enable turbo mode in C128 compatible way + ; Try to enable turbo mode in C128 compatible way lda #$01 -!: + + ; FALLTROUGH + +cmdfastslow_end: + sta VIC_CLKRATE rts -#else +} else { cmd_slow: - nop // just to prevent double label + nop ; just to prevent double label - // FALLTROUGH + ; FALLTROUGH cmd_fast: jmp do_NOT_IMPLEMENTED_error - -#endif +} diff --git a/src/basic/basic_commands_01/cmd_old.s b/src/basic/basic_commands_01/cmd_old.s index 1eeca8e9..6d2d4f9d 100644 --- a/src/basic/basic_commands_01/cmd_old.s +++ b/src/basic/basic_commands_01/cmd_old.s @@ -1,17 +1,17 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE cmd_old: - // First make sure we are in direct mode + ; First make sure we are in direct mode ldx CURLIN+1 inx - bne_16 do_DIRECT_MODE_ONLY_error + +bne do_DIRECT_MODE_ONLY_error - // Now try to restore program linkage and VARTAB + ; Now try to restore program linkage and VARTAB ldy #$01 tya @@ -19,6 +19,6 @@ cmd_old: jsr update_LINKPRG_VARTAB_do_clr - // Quit + ; Quit jmp end_of_program diff --git a/src/basic/basic_commands_02/cmd__jumptable_02.s b/src/basic/basic_commands_02/cmd__jumptable_02.s index 32285618..deb3dc4d 100644 --- a/src/basic/basic_commands_02/cmd__jumptable_02.s +++ b/src/basic/basic_commands_02/cmd__jumptable_02.s @@ -1,52 +1,44 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Jumptable for BASIC commands with tokens prefixed by $02 -// +; +; Jumptable for BASIC commands with tokens prefixed by $02 +; -#if !HAS_SMALL_BASIC +!ifndef HAS_SMALL_BASIC { -.const command_02_list = List().add( + ; NOTE! These commands are temporarily placed in list 01! - // NOTE! These commands are temporarily placed in list 01! + ; cmd_merge, - // cmd_merge, + ; cmd_bload, + ; cmd_bsave, + ; cmd_bverify, - // cmd_bload, - // cmd_bsave, - // cmd_bverify, + ; cmd_clear, + ; varstr_garbage_collect, ; cmd_dispose - // cmd_clear, - // varstr_garbage_collect, // cmd_dispose - - cmd_cold, - cmd_mem, - cmd_sysinfo -) +!set ITEM_00 = cmd_cold +!set ITEM_01 = cmd_mem +!set ITEM_02 = cmd_sysinfo -#if !HAS_OPCODES_65C02 - +!ifndef HAS_OPCODES_65C02 { command_02_jumptable_lo: - put_jumptable_lo(command_02_list) - + !byte <(ITEM_00-1), <(ITEM_01-1), <(ITEM_02-1) command_02_jumptable_hi: - put_jumptable_hi(command_02_list) + !byte >(ITEM_00-1), >(ITEM_01-1), >(ITEM_02-1) - -#else // HAS_OPCODES_65C02 +} else { ; HAS_OPCODES_65C02 command_02_jumptable: - // Note: 65C02 has the page boundary vector bug fixed! - put_jumptable(command_02_list) + ; Note: 65C02 has the page boundary vector bug fixed! -#endif - -#endif + !word ITEM_00, ITEM_01, ITEM_02 +} } diff --git a/src/basic/basic_commands_02/cmd_bload_bverify.s b/src/basic/basic_commands_02/cmd_bload_bverify.s index 149e7caa..87ab76d8 100644 --- a/src/basic/basic_commands_02/cmd_bload_bverify.s +++ b/src/basic/basic_commands_02/cmd_bload_bverify.s @@ -1,42 +1,42 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE cmd_bverify: - // LOAD and VERIFY are very similar, from BASIC perspective there is almost no difference; - // just different parameter passed to Kernal and different error message in case of failure + ; LOAD and VERIFY are very similar, from BASIC perspective there is almost no difference; + ; just different parameter passed to Kernal and different error message in case of failure - lda #$01 // mark operation as VERIFY - skip_2_bytes_trash_nvz + lda #$01 ; mark operation as VERIFY + +skip_2_bytes_trash_nvz cmd_bload: - lda #$00 // mark operation as LOAD + lda #$00 ; mark operation as LOAD jsr helper_load_init_params - // Fetch the file name + ; Fetch the file name jsr helper_bload_fetch_filename - // Fetch device number + ; Fetch device number jsr fetch_coma_uint8 - bcs_16 do_SYNTAX_error + +bcs do_SYNTAX_error sta FA - // Fetch the start address + ; Fetch the start address jsr helper_bload_fetch_address - // Perform loading + ; Perform loading - lda VERCKB // LOAD or VERIFY + lda VERCKB ; LOAD or VERIFY jsr JLOAD - bcs_16 do_kernal_error + +bcs do_kernal_error - // Execute next statement + ; Execute next statement rts diff --git a/src/basic/basic_commands_02/cmd_bsave.s b/src/basic/basic_commands_02/cmd_bsave.s index 1e2dbdf8..f702a295 100644 --- a/src/basic/basic_commands_02/cmd_bsave.s +++ b/src/basic/basic_commands_02/cmd_bsave.s @@ -1,32 +1,32 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE cmd_bsave: - // Set default device and secondary address + ; Set default device and secondary address jsr helper_load_init_params_no_VERCKB - // Fetch the file name + ; Fetch the file name jsr helper_load_fetch_filename - bcs_16 do_MISSING_FILENAME_error + +bcs do_MISSING_FILENAME_error - // Fetch device number + ; Fetch device number jsr helper_load_fetch_devnum - bcs_16 do_SYNTAX_error + +bcs do_SYNTAX_error - // Fetch memory area start address + ; Fetch memory area start address jsr helper_bload_fetch_address - phx_trash_a - phy_trash_a + +phx_trash_a + +phy_trash_a - // Fetch memory area end address + ; Fetch memory area end address jsr helper_bload_fetch_address @@ -37,6 +37,6 @@ cmd_bsave: lda #LINNUM - // Perform SAVE - reuse regular command + ; Perform SAVE - reuse regular command jmp cmd_save_do diff --git a/src/basic/basic_commands_02/cmd_clear.s b/src/basic/basic_commands_02/cmd_clear.s index ef71e4ff..a4af3508 100644 --- a/src/basic/basic_commands_02/cmd_clear.s +++ b/src/basic/basic_commands_02/cmd_clear.s @@ -1,10 +1,10 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE cmd_clear: - // XXX in the future add separate implementation for graphics screen + ; XXX in the future add separate implementation for graphics screen jmp clear_screen diff --git a/src/basic/basic_commands_02/cmd_cold.s b/src/basic/basic_commands_02/cmd_cold.s index 21f9cc05..474f6b47 100644 --- a/src/basic/basic_commands_02/cmd_cold.s +++ b/src/basic/basic_commands_02/cmd_cold.s @@ -1,18 +1,17 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -#if !HAS_SMALL_BASIC +!ifndef HAS_SMALL_BASIC { cmd_cold: jsr helper_ask_if_sure - bcs !+ + bcs @1 - jsr JCLALL // for extra safety - jmp (vector_reset) // hardware CPU vector -!: + jsr JCLALL ; for extra safety + jmp (vector_reset) ; hardware CPU vector +@1: rts - -#endif +} diff --git a/src/basic/basic_commands_02/cmd_dispose.s b/src/basic/basic_commands_02/cmd_dispose.s index cccb47e2..8d9470ca 100644 --- a/src/basic/basic_commands_02/cmd_dispose.s +++ b/src/basic/basic_commands_02/cmd_dispose.s @@ -1,6 +1,6 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// PLACEHOLDER for completeness - jumptable contains direct address +; PLACEHOLDER for completeness - jumptable contains direct address diff --git a/src/basic/basic_commands_02/cmd_mem.s b/src/basic/basic_commands_02/cmd_mem.s index debd0e0c..19c53e03 100644 --- a/src/basic/basic_commands_02/cmd_mem.s +++ b/src/basic/basic_commands_02/cmd_mem.s @@ -1,81 +1,85 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -#if !HAS_SMALL_BASIC +!ifndef HAS_SMALL_BASIC { -#if (!ROM_LAYOUT_M65 || SEGMENT_BASIC_0) +!ifdef SEGMENT_M65_BASIC_0 { cmd_mem: - // First perform the garbage collection - to be able to determine real values + ; First perform the garbage collection - to be able to determine real values jsr varstr_garbage_collect -#endif // ROM layout -#if (ROM_LAYOUT_M65 && SEGMENT_BASIC_0) + jsr map_BASIC_1 + jsr (VB1__cmd_mem_cont) + jmp map_NORMAL - jsr map_BASIC_1 - jsr_ind VB1__cmd_mem_cont - jmp map_NORMAL - -#else - -#if (ROM_LAYOUT_M65 && SEGMENT_BASIC_1) +} else ifdef SEGMENT_M65_BASIC_1 { cmd_mem_cont: -#endif +} else { - // Print header +cmd_mem: + + ; First perform the garbage collection - to be able to determine real values + + jsr varstr_garbage_collect +} + +!ifndef SEGMENT_M65_BASIC_0 { + + ; Print header lda #$12 jsr JCHROUT ldx #IDX__STR_MEM_HDR jsr print_packed_misc_str - // Print all the information, in a loop, in reverse order + ; Print all the information, in a loop, in reverse order ldy #$04 - // FALLTROUGH + ; FALLTROUGH cmd_mem_loop: - // First print the information string + ; First print the information string ldx helper_mem_tab_str, y - phy_trash_a + +phy_trash_a jsr print_packed_misc_str - // Print start address + ; Print start address ldx #IDX__STR_MEM_1 jsr print_packed_misc_str -#if HAS_OPCODES_65C02 +!ifdef HAS_OPCODES_65C02 { ply phy -#else +} else { pla pha tay -#endif +} ldx helper_mem_tab_y, y lda $01, x jsr print_hex_byte -#if HAS_OPCODES_65C02 +!ifdef HAS_OPCODES_65C02 { ply phy -#else +} else { pla pha tay -#endif +} ldx helper_mem_tab_y, y lda $00, x jsr print_hex_byte @@ -84,22 +88,22 @@ cmd_mem_loop: ldx #IDX__STR_MEM_2 jsr print_packed_misc_str - // Fetch addresses of zeropage variables + ; Fetch addresses of zeropage variables -#if HAS_OPCODES_65C02 +!ifdef HAS_OPCODES_65C02 { ply phy -#else +} else { pla pha tay -#endif +} ldx helper_mem_tab_x, y lda helper_mem_tab_y, y tay - // Print difference between two zeropage variables + ; Print difference between two zeropage variables sec lda $00, x @@ -110,40 +114,40 @@ cmd_mem_loop: lda $00, x sbc $0000, y -#if HAS_OPCODES_65C02 +!ifdef HAS_OPCODES_65C02 { plx -#else +} else { tay pla tax tya -#endif +} - // Before printing, make sure the result is not negative + ; Before printing, make sure the result is not negative - bcs !+ + bcs @1 lda #$3F jsr JCHROUT - jmp_8 cmd_mem_next + +bra cmd_mem_next -!: +@1: jsr print_integer - // FALLTROUGH + ; FALLTROUGH cmd_mem_next: - // Check if more iterations needed + ; Check if more iterations needed - ply_trash_a + +ply_trash_a dey bpl cmd_mem_loop - // Finish + ; Finish jmp print_return -#endif // ROM layout +} ; ROM layout -#endif // !HAS_SMALL_BASIC +} ; !HAS_SMALL_BASIC diff --git a/src/basic/basic_commands_02/cmd_merge.s b/src/basic/basic_commands_02/cmd_merge.s index dab2f34f..75e5bc44 100644 --- a/src/basic/basic_commands_02/cmd_merge.s +++ b/src/basic/basic_commands_02/cmd_merge.s @@ -1,47 +1,47 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE cmd_merge: - lda #$00 // mark operation as LOAD + lda #$00 ; mark operation as LOAD jsr helper_load_init_params - // Fetch the file name + ; Fetch the file name jsr helper_bload_fetch_filename - // Fetch device number + ; Fetch device number jsr helper_load_fetch_devnum - // FALLTROUGH + ; FALLTROUGH cmd_merge_got_params: - // Make sure VARTAB is correctly set + ; Make sure VARTAB is correctly set jsr update_VARTAB_do_clr - // Perform loading - just for a different address + ; Perform loading - just for a different address sec lda VARTAB+0 sbc #$02 sta VARTAB+0 tax - bcs !+ + bcs @1 dec VARTAB+1 -!: +@1: ldy VARTAB+1 - lda VERCKB // LOAD or VERIFY + lda VERCKB ; LOAD or VERIFY jsr JLOAD - bcs_16 do_kernal_error + +bcs do_kernal_error cmd_merge_no_error: - // Relink loaded program, clear variables, execute next statement + ; Relink loaded program, clear variables, execute next statement jmp update_LINKPRG_VARTAB_do_clr diff --git a/src/basic/basic_commands_02/cmd_sysinfo.s b/src/basic/basic_commands_02/cmd_sysinfo.s index 094b6996..27f5c5b3 100644 --- a/src/basic/basic_commands_02/cmd_sysinfo.s +++ b/src/basic/basic_commands_02/cmd_sysinfo.s @@ -1,32 +1,32 @@ -// #LAYOUT# M65 * #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 * #TAKE +;; #LAYOUT# * * #IGNORE -#if SEGMENT_BASIC_0 +!ifdef SEGMENT_BASIC_0 { cmd_sysinfo: - jsr map_BASIC_1 - jsr_ind VB1__cmd_sysinfo - jmp map_NORMAL + jsr map_BASIC_1 + jsr (VB1__cmd_sysinfo) + jmp map_NORMAL -#else +} else { cmd_sysinfo: jsr print_return - // Print mode and build information + ; Print mode and build information ldx #IDX__STR_SI_HEADER jsr print_packed_misc_str jsr M65_MODEGET - bcc !+ + bcc @1 ldx #IDX__STR_SI_MODE64 - skip_2_bytes_trash_nvz -!: + +skip_2_bytes_trash_nvz +@1: ldx #IDX__STR_SI_MODE65 jsr print_packed_misc_str @@ -44,40 +44,40 @@ cmd_sysinfo: jsr print_return - // FALLTROUGH + ; FALLTROUGH print_sysinfo_banner: - // Print board type (information not accessible in native mode) + ; Print board type (information not accessible in native mode) ldx #IDX__STR_SI_HDR_HW jsr print_packed_misc_str lda MISC_BOARDID ldy #(__cmd_sysinfo_hw_ids_end - cmd_sysinfo_hw_ids - 1) -!: +@2: cmp cmd_sysinfo_hw_ids, y - beq !+ + beq @3 dey - bpl !- + bpl @2 ldy #(__cmd_sysinfo_hw_ids_end - cmd_sysinfo_hw_ids) -!: +@3: ldx cmd_sysinfo_hw_str, y phx jsr print_packed_misc_str plx cpx #IDX__STR_SI_HW_XX - bne !+ + bne @4 lda MISC_BOARDID jsr print_hex_byte -!: +@4: - // FALLTROUGH + ; FALLTROUGH print_sysinfo_video: - // Print video system information + ; Print video system information ldx #IDX__STR_SI_HDR_VID jsr print_packed_misc_str @@ -101,12 +101,12 @@ print_sysinfo_video: ldx #IDX__STR_NTSC lda TVSFLG - beq !+ + beq @5 ldx #IDX__STR_PAL -!: +@5: jsr print_packed_misc_str - // Print build featires information + ; Print build featires information ldx #IDX__STR_SI_FEATURES jmp print_packed_misc_str @@ -115,31 +115,28 @@ print_sysinfo_video: cmd_sysinfo_hw_ids: - .byte $01 - .byte $02 - .byte $03 - .byte $21 - .byte $40 - .byte $41 - .byte $42 - .byte $FD - .byte $FE + !byte $01 + !byte $02 + !byte $03 + !byte $21 + !byte $40 + !byte $41 + !byte $42 + !byte $FD + !byte $FE __cmd_sysinfo_hw_ids_end: cmd_sysinfo_hw_str: - .byte IDX__STR_SI_HW_01 - .byte IDX__STR_SI_HW_02 - .byte IDX__STR_SI_HW_03 - .byte IDX__STR_SI_HW_21 - .byte IDX__STR_SI_HW_40 - .byte IDX__STR_SI_HW_41 - .byte IDX__STR_SI_HW_42 - .byte IDX__STR_SI_HW_FD - .byte IDX__STR_SI_HW_FE - .byte IDX__STR_SI_HW_XX - - - -#endif + !byte IDX__STR_SI_HW_01 + !byte IDX__STR_SI_HW_02 + !byte IDX__STR_SI_HW_03 + !byte IDX__STR_SI_HW_21 + !byte IDX__STR_SI_HW_40 + !byte IDX__STR_SI_HW_41 + !byte IDX__STR_SI_HW_42 + !byte IDX__STR_SI_HW_FD + !byte IDX__STR_SI_HW_FE + !byte IDX__STR_SI_HW_XX +} diff --git a/src/basic/basic_commands_02/helper_ask_if_sure.s b/src/basic/basic_commands_02/helper_ask_if_sure.s index e274b38e..5f52d7b9 100644 --- a/src/basic/basic_commands_02/helper_ask_if_sure.s +++ b/src/basic/basic_commands_02/helper_ask_if_sure.s @@ -1,74 +1,74 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// For direct mode, asks the user if he is sure (sets Carry if not); -// otherwise returns with Carry clear -// +; +; For direct mode, asks the user if he is sure (sets Carry if not); +; otherwise returns with Carry clear +; -#if !HAS_SMALL_BASIC +!ifndef HAS_SMALL_BASIC { helper_ask_if_sure: -#if (ROM_LAYOUT_M65 && SEGMENT_BASIC_0) +!ifdef SEGMENT_M65_BASIC_0 { - jsr map_BASIC_1 - jsr_ind VB1__helper_ask_if_sure - jmp map_NORMAL + jsr map_BASIC_1 + jsr (VB1__helper_ask_if_sure) + jmp map_NORMAL -#else +} else { - // First check, if we are in direct mode,; if not, do not ask + ; First check, if we are in direct mode,; if not, do not ask ldx CURLIN+1 inx - bne helper_ask_if_sure_ok // branch if not direct mode + bne helper_ask_if_sure_ok ; branch if not direct mode - // Not direct mode - display the question + ; Not direct mode - display the question ldx #IDX__STR_IF_SURE jsr print_packed_misc_str - // Clear the keyboard queue + ; Clear the keyboard queue lda #$00 sta NDX - // Enable cursor, fetch the answer + ; Enable cursor, fetch the answer lda #$00 sta BLNSW -!: +@1: jsr JGETIN cmp #$00 - beq !- + beq @1 - // Check if 'Y' + ; Check if 'Y' cmp #$59 - beq !+ + beq @2 - lda #$4E // 'N' + lda #$4E ; 'N' jsr JCHROUT sec rts -!: - // Display 'Y' and wait a short moment for a better user experience +@2: + ; Display 'Y' and wait a short moment for a better user experience jsr JCHROUT clc lda TIME+2 adc #$0C -!: +@3: cmp TIME+2 - bne !- + bne @3 - // FALLTROUGH + ; FALLTROUGH helper_ask_if_sure_ok: @@ -76,6 +76,6 @@ helper_ask_if_sure_ok: rts -#endif // ROM layout +} ; ROM layout -#endif // !HAS_SMALL_BASIC +} ; !HAS_SMALL_BASIC diff --git a/src/basic/basic_commands_02/helper_bload_fetch_address.s b/src/basic/basic_commands_02/helper_bload_fetch_address.s index e4a28e6d..f3ab147f 100644 --- a/src/basic/basic_commands_02/helper_bload_fetch_address.s +++ b/src/basic/basic_commands_02/helper_bload_fetch_address.s @@ -1,20 +1,20 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Fetches address for BLOAD/BVERIFY/BSAVE, reports error if not found -// +; +; Fetches address for BLOAD/BVERIFY/BSAVE, reports error if not found +; helper_bload_fetch_address: jsr injest_comma - bcs_16 do_SYNTAX_error + +bcs do_SYNTAX_error - lda #IDX__EV2_0B // 'SYNTAX ERROR' + lda #IDX__EV2_0B ; 'SYNTAX ERROR' jsr fetch_uint16 - bcs_16 do_SYNTAX_error + +bcs do_SYNTAX_error ldx LINNUM+0 ldy LINNUM+1 diff --git a/src/basic/basic_commands_02/helper_bload_fetch_filename.s b/src/basic/basic_commands_02/helper_bload_fetch_filename.s index 13da848c..e1b238de 100644 --- a/src/basic/basic_commands_02/helper_bload_fetch_filename.s +++ b/src/basic/basic_commands_02/helper_bload_fetch_filename.s @@ -1,26 +1,26 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Fetches file name for BLOAD/BVERIFY/MERGE, reports error if not found -// +; +; Fetches file name for BLOAD/BVERIFY/MERGE, reports error if not found +; helper_bload_fetch_filename: - // Fetch the file name + ; Fetch the file name jsr helper_load_fetch_filename - bcc !+ + bcc @1 - // No filename supplied - this should only be allowed for tape (device number below 8) + ; No filename supplied - this should only be allowed for tape (device number below 8) lda FA and #%11111000 - bne_16 do_MISSING_FILENAME_error + +bne do_MISSING_FILENAME_error lda #$00 sta FNLEN -!: +@1: rts diff --git a/src/basic/basic_commands_02/helper_mem_tab_str.s b/src/basic/basic_commands_02/helper_mem_tab_str.s index 8bf56176..eca887b1 100644 --- a/src/basic/basic_commands_02/helper_mem_tab_str.s +++ b/src/basic/basic_commands_02/helper_mem_tab_str.s @@ -1,20 +1,19 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Helper table for 'MEM' command - list of strings to print -// +; +; Helper table for 'MEM' command - list of strings to print +; -#if !HAS_SMALL_BASIC +!ifndef HAS_SMALL_BASIC { helper_mem_tab_str: - .byte IDX__STR_MEM_FREE - .byte IDX__STR_MEM_STRS - .byte IDX__STR_MEM_ARRS - .byte IDX__STR_MEM_VARS - .byte IDX__STR_MEM_TEXT - -#endif \ No newline at end of file + !byte IDX__STR_MEM_FREE + !byte IDX__STR_MEM_STRS + !byte IDX__STR_MEM_ARRS + !byte IDX__STR_MEM_VARS + !byte IDX__STR_MEM_TEXT +} diff --git a/src/basic/basic_commands_02/helper_mem_tab_x.s b/src/basic/basic_commands_02/helper_mem_tab_x.s index ec74d04a..825d0a59 100644 --- a/src/basic/basic_commands_02/helper_mem_tab_x.s +++ b/src/basic/basic_commands_02/helper_mem_tab_x.s @@ -1,20 +1,19 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Helper table for 'MEM' command - list of minuend zeropage variables -// +; +; Helper table for 'MEM' command - list of minuend zeropage variables +; -#if !HAS_SMALL_BASIC +!ifndef HAS_SMALL_BASIC { helper_mem_tab_x: - .byte FRETOP - .byte MEMSIZ - .byte STREND - .byte ARYTAB - .byte VARTAB - -#endif + !byte FRETOP + !byte MEMSIZ + !byte STREND + !byte ARYTAB + !byte VARTAB +} diff --git a/src/basic/basic_commands_02/helper_mem_tab_y.s b/src/basic/basic_commands_02/helper_mem_tab_y.s index d8a02f22..083817d8 100644 --- a/src/basic/basic_commands_02/helper_mem_tab_y.s +++ b/src/basic/basic_commands_02/helper_mem_tab_y.s @@ -1,20 +1,19 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Helper table for 'MEM' command - list of subtrahend zeropage variables -// +; +; Helper table for 'MEM' command - list of subtrahend zeropage variables +; -#if !HAS_SMALL_BASIC +!ifndef HAS_SMALL_BASIC { helper_mem_tab_y: - .byte STREND - .byte FRETOP - .byte ARYTAB - .byte VARTAB - .byte TXTTAB - -#endif + !byte STREND + !byte FRETOP + !byte ARYTAB + !byte VARTAB + !byte TXTTAB +} diff --git a/src/basic/basic_commands_03_m65/cmd__jumptable_03.s b/src/basic/basic_commands_03_m65/cmd__jumptable_03.s index 4af16cb7..cd3b7b54 100644 --- a/src/basic/basic_commands_03_m65/cmd__jumptable_03.s +++ b/src/basic/basic_commands_03_m65/cmd__jumptable_03.s @@ -1,17 +1,15 @@ -// #LAYOUT# M65 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Jumptable for BASIC commands with tokens prefixed by $03 -// +; +; Jumptable for BASIC commands with tokens prefixed by $03 +; -.const command_03_list = List().add( - - cmd_rem // XXX just for testing -) +!set ITEM_00 = cmd_rem ; XXX just for testing command_03_jumptable: - // Note: 65C02 has the page boundary vector bug fixed! - put_jumptable(command_03_list) + ; Note: 65C02 has the page boundary vector bug fixed! + + !word ITEM_00 diff --git a/src/basic/basic_functions/fun__jumptable.s b/src/basic/basic_functions/fun__jumptable.s index d5b47811..0898ef1d 100644 --- a/src/basic/basic_functions/fun__jumptable.s +++ b/src/basic/basic_functions/fun__jumptable.s @@ -1,63 +1,61 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Jumptable for BASIC V2 dialect functions -// +; +; Jumptable for BASIC V2 dialect functions +; + +!set ITEM_B4 = fun_sgn +!set ITEM_B5 = fun_int +!set ITEM_B6 = fun_abs +!set ITEM_B7 = fun_usr +!set ITEM_B8 = fun_fre +!set ITEM_B9 = fun_pos +!set ITEM_BA = fun_sqr +!set ITEM_BB = fun_rnd +!set ITEM_BC = fun_log +!set ITEM_BD = fun_exp +!set ITEM_BE = fun_cos +!set ITEM_BF = fun_sin + +!set ITEM_C0 = fun_tan +!set ITEM_C1 = fun_atn +!set ITEM_C2 = fun_peek +!set ITEM_C3 = fun_len +!set ITEM_C4 = fun_str +!set ITEM_C5 = fun_val +!set ITEM_C6 = fun_asc +!set ITEM_C7 = fun_chr +!set ITEM_C8 = fun_left +!set ITEM_C9 = fun_right +!set ITEM_CA = fun_mid -.const function_list = List().add( - - // $B4-$BF - - fun_sgn, - fun_int, - fun_abs, - fun_usr, - fun_fre, - fun_pos, - fun_sqr, - fun_rnd, - fun_log, - fun_exp, - fun_cos, - fun_sin, - - // $C0-$CA - - fun_tan, - fun_atn, - fun_peek, - fun_len, - fun_str, - fun_val, - fun_asc, - fun_chr, - fun_left, - fun_right, - fun_mid -) - - -#if !HAS_OPCODES_65C02 - +!ifndef HAS_OPCODES_65C02 { function_jumptable_lo: - put_jumptable_lo(function_list) - + !byte <(ITEM_B4-1), <(ITEM_B5-1), <(ITEM_B6-1), <(ITEM_B7-1) + !byte <(ITEM_B8-1), <(ITEM_B9-1), <(ITEM_BA-1), <(ITEM_BB-1), <(ITEM_BC-1), <(ITEM_BD-1), <(ITEM_BE-1), <(ITEM_BF-1) + !byte <(ITEM_C0-1), <(ITEM_C1-1), <(ITEM_C2-1), <(ITEM_C3-1), <(ITEM_C4-1), <(ITEM_C5-1), <(ITEM_C6-1), <(ITEM_C7-1) + !byte <(ITEM_C8-1), <(ITEM_C9-1), <(ITEM_CA-1) function_jumptable_hi: - put_jumptable_hi(function_list) + !byte >(ITEM_B4-1), >(ITEM_B5-1), >(ITEM_B6-1), >(ITEM_B7-1) + !byte >(ITEM_B8-1), >(ITEM_B9-1), >(ITEM_BA-1), >(ITEM_BB-1), >(ITEM_BC-1), >(ITEM_BD-1), >(ITEM_BE-1), >(ITEM_BF-1) + !byte >(ITEM_C0-1), >(ITEM_C1-1), >(ITEM_C2-1), >(ITEM_C3-1), >(ITEM_C4-1), >(ITEM_C5-1), >(ITEM_C6-1), >(ITEM_C7-1) + !byte >(ITEM_C8-1), >(ITEM_C9-1), >(ITEM_CA-1) - -#else // HAS_OPCODES_65C02 +} else { ; HAS_OPCODES_65C02 function_jumptable: - // Note: 65C02 has the page boundary vector bug fixed! - put_jumptable(function_list) - -#endif + ; Note: 65C02 has the page boundary vector bug fixed! + + !word ITEM_B4, ITEM_B5, ITEM_B6, ITEM_B7 + !word ITEM_B8, ITEM_B9, ITEM_BA, ITEM_BB, ITEM_BC, ITEM_BD, ITEM_BE, ITEM_BF + !word ITEM_C0, ITEM_C1, ITEM_C2, ITEM_C3, ITEM_C4, ITEM_C5, ITEM_C6, ITEM_C7 + !word ITEM_C8, ITEM_C9, ITEM_CA +} diff --git a/src/basic/basic_functions/fun__unimplemented.s b/src/basic/basic_functions/fun__unimplemented.s index 8954996d..d4a23172 100644 --- a/src/basic/basic_functions/fun__unimplemented.s +++ b/src/basic/basic_functions/fun__unimplemented.s @@ -1,61 +1,61 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Default handler for all not-yet-implemented functions -// -// Note: NOPs are here just to make debugging easier (no duplicated labels)! -// +; +; Default handler for all not-yet-implemented functions +; +; Note: NOPs are here just to make debugging easier (no duplicated labels)! +; fun_sgn: - nop + +nop fun_int: - nop + +nop fun_abs: - nop + +nop fun_usr: - nop + +nop fun_fre: - nop + +nop fun_pos: - nop + +nop fun_sqr: - nop + +nop fun_rnd: - nop + +nop fun_log: - nop + +nop fun_exp: - nop + +nop fun_cos: - nop + +nop fun_sin: - nop + +nop fun_tan: - nop + +nop fun_atn: - nop + +nop fun_peek: - nop + +nop fun_len: - nop + +nop fun_str: - nop + +nop fun_val: - nop + +nop fun_asc: - nop + +nop fun_chr: - nop + +nop fun_left: - nop + +nop fun_right: - nop + +nop fun_mid: - nop + +nop - // Unimplemented tokens + ; Unimplemented tokens jmp do_NOT_IMPLEMENTED_error diff --git a/src/basic/basic_operators/oper__jumptable.s b/src/basic/basic_operators/oper__jumptable.s index 2edc0dc3..7eddf19e 100644 --- a/src/basic/basic_operators/oper__jumptable.s +++ b/src/basic/basic_operators/oper__jumptable.s @@ -1,68 +1,65 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Jumptable and priority list for all BASIC operators -// +; +; Jumptable and priority list for all BASIC operators +; + + ; Tokens $AA-$AF + +!set ITEM_00 = oper_add +!set ITEM_01 = oper_sub +!set ITEM_02 = oper_mul +!set ITEM_03 = oper_div +!set ITEM_04 = oper_pow +!set ITEM_05 = oper_and + + ; Tokens $B0-$B3 + +!set ITEM_06 = oper_or +!set ITEM_07 = oper_cmp_gt +!set ITEM_08 = oper_cmp_eq +!set ITEM_09 = oper_cmp_lt + + ; Combined two tokens + +!set ITEM_0A = oper_cmp_gteq +!set ITEM_0B = oper_cmp_lteq +!set ITEM_0C = oper_cmp_neq + + ; Unary operators + +!set ITEM_0D = oper_unary_minus +!set ITEM_0E = oper_unary_not -.const operator_list = List().add( - - // Tokens $AA-$B0 - - oper_add, // ID: $00 - oper_sub, // ID: $01 - oper_mul, // ID: $02 - oper_div, // ID: $03 - oper_pow, // ID: $04 - oper_and, // ID: $05 - oper_or, // ID: $06 - - // Tokens $B1-$B3 - - oper_cmp_gt, // ID: $07 - oper_cmp_eq, // ID: $08 - oper_cmp_lt, // ID: $09 - - // Combined two tokens - - oper_cmp_gteq, // ID: $0A - oper_cmp_lteq, // ID: $0B - oper_cmp_neq, // ID: $0C - - // Unary operators - - oper_unary_minus, // ID: $0D - oper_unary_not // ID: $0E -) - - -operator_priorities: // higher number = higher priority - - .byte $05 // oper_add - .byte $05 // oper_sub - .byte $06 // oper_mul - .byte $06 // oper_div - .byte $08 // oper_pow - .byte $02 // oper_and - .byte $01 // oper_or - .byte $04 // oper_cmp_gt - .byte $04 // oper_cmp_eq - .byte $04 // oper_cmp_lt - .byte $04 // oper_cmp_gteq - .byte $04 // oper_cmp_lteq - .byte $04 // oper_cmp_neq - .byte $07 // oper_unary_minus - .byte $03 // oper_unary_not +operator_priorities: ; higher number = higher priority + !byte $05 ; oper_add + !byte $05 ; oper_sub + !byte $06 ; oper_mul + !byte $06 ; oper_div + !byte $08 ; oper_pow + !byte $02 ; oper_and + !byte $01 ; oper_or + !byte $04 ; oper_cmp_gt + !byte $04 ; oper_cmp_eq + !byte $04 ; oper_cmp_lt + !byte $04 ; oper_cmp_gteq + !byte $04 ; oper_cmp_lteq + !byte $04 ; oper_cmp_neq + !byte $07 ; oper_unary_minus + !byte $03 ; oper_unary_not operator_jumptable_lo: - put_jumptable_lo(operator_list) + !byte <(ITEM_00-1), <(ITEM_01-1), <(ITEM_02-1), <(ITEM_03-1), <(ITEM_04-1), <(ITEM_05-1), <(ITEM_06-1), <(ITEM_07-1) + !byte <(ITEM_08-1), <(ITEM_09-1), <(ITEM_0A-1), <(ITEM_0B-1), <(ITEM_0C-1), <(ITEM_0D-1), <(ITEM_0E-1) operator_jumptable_hi: - put_jumptable_hi(operator_list) + !byte >(ITEM_00-1), >(ITEM_01-1), >(ITEM_02-1), >(ITEM_03-1), >(ITEM_04-1), >(ITEM_05-1), >(ITEM_06-1), >(ITEM_07-1) + !byte >(ITEM_08-1), >(ITEM_09-1), >(ITEM_0A-1), >(ITEM_0B-1), >(ITEM_0C-1), >(ITEM_0D-1), >(ITEM_0E-1) diff --git a/src/basic/basic_operators/oper_add.s b/src/basic/basic_operators/oper_add.s index e663af97..96a6cbd4 100644 --- a/src/basic/basic_operators/oper_add.s +++ b/src/basic/basic_operators/oper_add.s @@ -1,50 +1,50 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE oper_add: - // This operator can be used either with two strings, or with two floats - // First check whether arguments match and then choose the variant + ; This operator can be used either with two strings, or with two floats + ; First check whether arguments match and then choose the variant pla eor VALTYP - bmi_16 do_TYPE_MISMATCH_error + +bmi do_TYPE_MISMATCH_error lda VALTYP bmi oper_add_strings - // FALLTROUGH + ; FALLTROUGH oper_add_floats: - // XXX implement this + ; XXX implement this jmp do_NOT_IMPLEMENTED_error oper_add_strings: - // Retrieve string address + ; Retrieve string address pla sta __FAC2+2 pla sta __FAC2+1 - // Pull string length + ; Pull string length pla sta __FAC2+0 - // If string 2 is empty, release it and quit + ; If string 2 is empty, release it and quit beq oper_add_strings_end - // If string 1 is empty, just copy the metadata + ; If string 1 is empty, just copy the metadata lda __FAC1+0 - bne !+ + bne @1 jsr tmpstr_free_FAC1 @@ -56,16 +56,16 @@ oper_add_strings: sta __FAC1+2 jmp FRMEVL_continue -!: - // Allocate memory for the concatenated string +@1: + ; Allocate memory for the concatenated string clc adc __FAC2+0 - bcs_16 do_STRING_TOO_LONG_error + +bcs do_STRING_TOO_LONG_error jsr tmpstr_alloc - // Copy the temporary string pointer to INDEX + ; Copy the temporary string pointer to INDEX ldy #$01 lda (VARPNT), y @@ -74,86 +74,85 @@ oper_add_strings: lda (VARPNT), y sta INDEX+1 - // Perform the concatenation + ; Perform the concatenation -#if CONFIG_MEMORY_MODEL_60K +!ifdef CONFIG_MEMORY_MODEL_60K { - // Copy data from the first string + ; Copy data from the first string ldy #$00 -!: +@2: ldx #<(__FAC2+1) jsr peek_under_roms ldx #OLDTXT - // .byte $f0,OLDTXT - // .byte $0d,0 + ; jsr printf + ; .text "DELETING LINE AT $" + ; .byte $f1,OLDTXT + ; .byte $f0,OLDTXT + ; .byte $0d,0 - // Get address of next line + ; Get address of next line ldy #$00 -#if CONFIG_MEMORY_MODEL_60K +!ifdef CONFIG_MEMORY_MODEL_60K { ldx #__tokenise_work4 - // .byte $f0,<__tokenise_work3,>__tokenise_work3 - // .byte $0d,0 + ; jsr printf + ; .text "LINE LENGTH IS $" + ; .byte $f0,<__tokenise_work4,>__tokenise_work4 + ; .byte $f0,<__tokenise_work3,>__tokenise_work3 + ; .byte $0d,0 lda __tokenise_work4 sbc #0 cmp #$00 - beq !+ - // Line length is <0 or >255 bytes. - // Either way, things are bad, so abort. + ; Line length is <0 or >255 bytes. + ; Either way, things are bad, so abort. - jmp do_MEMORY_CORRUPT_error -!: - // Length can now be safely assumed to be in the low - // byte only, i.e., stored in __tokenise_work3 + +bne do_MEMORY_CORRUPT_error + + ; Length can now be safely assumed to be in the low + ; byte only, i.e., stored in __tokenise_work3 ldx __tokenise_work3 - // Shuffle everything down + ; Shuffle everything down jsr shift_txt_down - // Finish by fixing program linkage and calculating new + ; Finish by fixing program linkage and calculating new jmp update_LINKPRG_VARTAB_do_clr diff --git a/src/basic/engine_editor/find_line_38K_60K.s b/src/basic/engine_editor/find_line_38K_60K.s index 309975da..2e16f69c 100644 --- a/src/basic/engine_editor/find_line_38K_60K.s +++ b/src/basic/engine_editor/find_line_38K_60K.s @@ -1,55 +1,55 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// Find the BASIC line with number in LINNUM +; Find the BASIC line with number in LINNUM -#if CONFIG_MEMORY_MODEL_38K || CONFIG_MEMORY_MODEL_60K +!ifndef CONFIG_MEMORY_MODEL_46K_OR_50K { find_line_from_start: - // Get pointer to start of BASIC text + ; Get pointer to start of BASIC text jsr init_oldtxt - // FALLTROUGH + ; FALLTROUGH find_line_from_current: - // Check if line is not empty + ; Check if line is not empty jsr is_line_pointer_null beq find_line_fail - // Fetch the high byte of line number and compare + ; Fetch the high byte of line number and compare ldy #$03 -#if CONFIG_MEMORY_MODEL_60K +!ifdef CONFIG_MEMORY_MODEL_60K { ldx #OLDTXT - // .byte $f0,OLDTXT - // .byte $0d,0 + ; jsr printf + ; .text "INSERTING LINE AT $" + ; .byte $f1,OLDTXT + ; .byte $f0,OLDTXT + ; .byte $0d,0 - // Get number of bytes in tokenised line after line number + ; Get number of bytes in tokenised line after line number lda __tokenise_work2 sec sbc __tokenise_work1 - // Add on the five bytes space we need (2 bytes for linkage, 2 bytes for line number, 1 byte for terminator) + ; Add on the five bytes space we need (2 bytes for linkage, 2 bytes for line number, 1 byte for terminator) clc adc #$05 tax - // Make the space + ; Make the space jsr shift_txt_up - // Put dummy linkage, we will correct it later + ; Put dummy linkage, we will correct it later ldy #$01 tya -#if CONFIG_MEMORY_MODEL_60K +!ifdef CONFIG_MEMORY_MODEL_60K { ldx #BUF @@ -144,46 +141,46 @@ shell_process_line: jsr fetch_line_number - // Get pointer to next char + ; Get pointer to next char lda TXTPTR+0 sta __tokenise_work1 - // Got a valid line number - we will be adding/deleting a new line + ; Got a valid line number - we will be adding/deleting a new line - // Skip any spaces after the line number + ; Skip any spaces after the line number ldx __tokenise_work1 -!: +@3: lda BUF,x cmp #$20 - bne !+ + bne @4 inx - bne !- -!: + bne @3 +@4: stx __tokenise_work1 - // FALLTROUGH + ; FALLTROUGH shell_add_delete_line: - // First make sure VARTAB is correct and clear all the variables + ; First make sure VARTAB is correct and clear all the variables jsr update_VARTAB_do_clr - // Check if line already present + ; Check if line already present jsr find_line_from_start - bcs !+ + bcs @5 - // Line already present - delete it + ; Line already present - delete it jsr delete_line - jsr find_line_from_start // refresh OLDTXT -!: - // Insert new line if non-zero length, i.e., that - // we are not just deleting the line. + jsr find_line_from_start ; refresh OLDTXT +@5: + ; Insert new line if non-zero length, i.e., that + ; we are not just deleting the line. lda __tokenise_work1 cmp __tokenise_work2 - beq !+ + beq @6 jsr insert_line -!: - // No READY message after entering or deleting a line of BASIC +@6: + ; No READY message after entering or deleting a line of BASIC jmp shell_read_next_line @@ -191,4 +188,3 @@ shell_execute_line: jsr prepare_direct_execution jmp execute_statements - diff --git a/src/basic/engine_editor/shift_txt_down.s b/src/basic/engine_editor/shift_txt_down.s index c093f671..805738c1 100644 --- a/src/basic/engine_editor/shift_txt_down.s +++ b/src/basic/engine_editor/shift_txt_down.s @@ -1,23 +1,23 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Shift the BASIC program down to cover the area of removed line -// +; +; Shift the BASIC program down to cover the area of removed line +; shift_txt_down: - // First byte of destination is OLDTXT + ; First byte of destination is OLDTXT lda OLDTXT+0 sta memmove__dst+0 lda OLDTXT+1 sta memmove__dst+1 - // First byte of source is memmove__dst + .X + ; First byte of source is memmove__dst + .X clc txa @@ -28,7 +28,7 @@ shift_txt_down: adc #$00 sta memmove__src+1 - // Size is distance from source to the end of BASIC text (VARTAB) + ; Size is distance from source to the end of BASIC text (VARTAB) lda VARTAB+0 sec @@ -38,6 +38,6 @@ shift_txt_down: sbc memmove__src+1 sta memmove__size+1 - // Perform the copy + ; Perform the copy jmp shift_mem_down diff --git a/src/basic/engine_editor/shift_txt_up.s b/src/basic/engine_editor/shift_txt_up.s index 221e1460..5380067f 100644 --- a/src/basic/engine_editor/shift_txt_up.s +++ b/src/basic/engine_editor/shift_txt_up.s @@ -1,18 +1,18 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Shift the BASIC program up to make space for a new line -// +; +; Shift the BASIC program up to make space for a new line +; shift_txt_up: - // Last byte of source is VARTAB-1 + ; Last byte of source is VARTAB-1 -#if !HAS_OPCODES_65CE02 +!ifndef HAS_OPCODES_65CE02 { sec lda VARTAB+0 @@ -22,17 +22,16 @@ shift_txt_up: sbc #$00 sta memmove__src+1 -#else // HAS_OPCODES_65CE02 +} else { ; HAS_OPCODES_65CE02 lda VARTAB+0 sta memmove__src+0 lda VARTAB+1 sta memmove__src+1 dew memmove__src +} -#endif - - // Last byte of destination is memmove__src + .X + ; Last byte of destination is memmove__src + .X clc txa @@ -43,7 +42,7 @@ shift_txt_up: adc #$00 sta memmove__dst+1 - // Size is distance from OLDTXT to the end of BASIC text (VARTAB) + ; Size is distance from OLDTXT to the end of BASIC text (VARTAB) lda VARTAB+0 sec @@ -53,6 +52,6 @@ shift_txt_up: sbc OLDTXT+1 sta memmove__size+1 - // Perform the copy + ; Perform the copy jmp shift_mem_up diff --git a/src/basic/engine_editor/tk_cut_away.s b/src/basic/engine_editor/tk_cut_away.s index 4741388c..0eeb2de3 100644 --- a/src/basic/engine_editor/tk_cut_away.s +++ b/src/basic/engine_editor/tk_cut_away.s @@ -1,31 +1,31 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Cuts away unnecessary characters after tokenizing a keyword -// +; +; Cuts away unnecessary characters after tokenizing a keyword +; -tk_cut_away_2: // for two-bytes tokenized keywords +tk_cut_away_2: ; for two-bytes tokenized keywords dec tk__len_unpacked - // FALLTROUGH + ; FALLTROUGH -tk_cut_away_1: // for single-byte tokenized keywords +tk_cut_away_1: ; for single-byte tokenized keywords - dec tk__len_unpacked // keyword length, afterwards number of bytes to cut away + dec tk__len_unpacked ; keyword length, afterwards number of bytes to cut away - // Correct the line length + ; Correct the line length sec lda tk__length sbc tk__len_unpacked sta tk__length - // Copy the remaining,. untokenized part in the proper place + ; Copy the remaining,. untokenized part in the proper place inc tk__offset ldy tk__offset @@ -34,13 +34,13 @@ tk_cut_away_1: // for single-byte tokenized keywords clc adc tk__offset tax -!: +@1: lda BUF, x sta BUF, y - beq !+ + beq @2 inx iny - bne !- -!: + bne @1 +@2: rts diff --git a/src/basic/engine_editor/tk_pack.s b/src/basic/engine_editor/tk_pack.s index 56d3db31..1b4c9d70 100644 --- a/src/basic/engine_editor/tk_pack.s +++ b/src/basic/engine_editor/tk_pack.s @@ -1,94 +1,85 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Packs a keyword candidate using a simple compression scheme, -// same as in 'generate_strings.cc'. -// -// This allows us to search through the compressed tokens directly -// using the compressed fragment of BASIC, and thus work out the -// token for a given piece of string. -// -// This also helps ensure that we have an implementation that is totally -// different to that of the original C64 BASIC, as well as likely -// saving a bit of space in the ROM, especially once we start implementing -// larger keyword vocabs for extended BASIC, since the compression and -// decompression machinery is of fixed size. -// -// Input: -// - .X = offset of string to pack, address is BUF ($0200) + .X -// Output: -// - see labels in 'tk_pack' -// +; +; Packs a keyword candidate using a simple compression scheme, +; same as in 'generate_strings.cc'. +; +; This allows us to search through the compressed tokens directly +; using the compressed fragment of BASIC, and thus work out the +; token for a given piece of string. +; +; This also helps ensure that we have an implementation that is totally +; different to that of the original C64 BASIC, as well as likely +; saving a bit of space in the ROM, especially once we start implementing +; larger keyword vocabs for extended BASIC, since the compression and +; decompression machinery is of fixed size. +; +; Input: +; - .X = offset of string to pack, address is BUF ($0200) + .X +; Output: +; - see labels in 'tk_pack' +; tk_pack: - // Reuse the CPU stack - address $100 is used by 'tokenise_line.s' - - .label tk__len_unpacked = $101 // length of unpacked data; it could replace 'tk__nibble_flag', but at the cost of code size/performance - .label tk__shorten_bits = $102 // 2 bytes for quick shortening of packed candidate - .label tk__nibble_flag = $104 // $00 = start from new byte, $FF = start from high nibble - .label tk__byte_offset = $105 // offset of the current byte (to place new data) in tk__packed - - .label tk__packed = $106 // packed candidate, 25 bytes is enough for worst case - a 16 byte keyword - - // Initialize variables + ; Initialize variables lda #$00 - ldy #($04 + 25) // initialize 5 bytes of data + 25 bytes of space for packing -!: + ldy #($04 + 25) ; initialize 5 bytes of data + 25 bytes of space for packing +@1: sta tk__len_unpacked, y dey - bpl !- + bpl @1 - // FALLTROUGH + ; FALLTROUGH tk_pack_loop: - // Get the next character + ; Get the next character lda BUF, x - // If character cannot be a part of a keyword - do not pack anything more + ; If character cannot be a part of a keyword - do not pack anything more - cmp #$23 // '#' - first sane character for a keyword - bcc tk_pack_done // branch if below '#' - cmp #$7B // 'Z' + 1 - bcs tk_pack_done // branch if above 'Z' + cmp #$23 ; '#' - first sane character for a keyword + bcc tk_pack_done ; branch if below '#' + cmp #$7B ; 'Z' + 1 + bcs tk_pack_done ; branch if above 'Z' - // Keywords should not contain digits, colons, or semicolons + ; Keywords should not contain digits, colons, or semicolons cmp #$30 - bcc !+ // branch if below '0' + bcc @2 ; branch if below '0' cmp #$3C - bcc tk_pack_done // branch if below '<' -!: - // Try to find a nibble to encode the character + bcc tk_pack_done ; branch if below '<' +@2: + ; Try to find a nibble to encode the character ldy #$0E -!: +@3: cmp packed_as_1n-1, y beq tk_pack_1n dey - bne !- + bne @3 - // Try to find a 3-nibble sequence to encode the character (1st nibble is always 0xF in this case) + ; Try to find a 3-nibble sequence to encode the character (1st nibble is always 0xF in this case) ldy #TK__PACKED_AS_3N -!: +@4: cmp packed_as_3n-1, y beq tk_pack_3n dey - bne !- + bne @4 - // If it is not on the list, it cannot be a part of token - quit + ; If it is not on the list, it cannot be a part of token - quit - // FALLTROUGH + ; FALLTROUGH tk_pack_done: @@ -96,12 +87,12 @@ tk_pack_done: tk_pack_1n: - // .Y contains our nibble; check whether we should start a new encoded byte + ; .Y contains our nibble; check whether we should start a new encoded byte bit tk__nibble_flag bpl tk_pack_1n_new_byte - // Store in the high nibble of the current byte + ; Store in the high nibble of the current byte tya @@ -114,112 +105,112 @@ tk_pack_1n: ora tk__packed, y sta tk__packed, y - // Adjust remaining counters / flags + ; Adjust remaining counters / flags inc tk__byte_offset - inc tk__nibble_flag // $FF -> $00 + inc tk__nibble_flag ; $FF -> $00 - // FALLTROUGH + ; FALLTROUGH tk_pack_1n_done: - // Put the bit mark - to indicate 1-nibble encoding + ; Put the bit mark - to indicate 1-nibble encoding clc ror tk__shorten_bits+0 ror tk__shorten_bits+1 - // FALLTROUGH + ; FALLTROUGH tk_pack_loop_next: - // Prepare for the next loop iteration - increment counters + ; Prepare for the next loop iteration - increment counters inx inc tk__len_unpacked - // Check length, if it is OK to pack one more byte; quit if not + ; Check length, if it is OK to pack one more byte; quit if not lda tk__len_unpacked cmp #TK__MAX_KEYWORD_LEN - beq !+ // if max length reached - quit + beq @5 ; if max length reached - quit - // Check for characters that can only end the keyword + ; Check for characters that can only end the keyword lda BUF-1, x cmp #$41 bcs tk_pack_loop -!: +@5: rts tk_pack_1n_new_byte: - // Store in the low nibble of the next byte + ; Store in the low nibble of the next byte tya ldy tk__byte_offset sta tk__packed, y - // Adjust remaining counters / flags + ; Adjust remaining counters / flags - dec tk__nibble_flag // $00 -> $FF + dec tk__nibble_flag ; $00 -> $FF bmi tk_pack_1n_done tk_pack_3n: - // .Y contains 2 nibbles to encode; check whether we should start a new encoded byte + ; .Y contains 2 nibbles to encode; check whether we should start a new encoded byte bit tk__nibble_flag bpl tk_pack_3n_new_byte - // Store 1st nibble (alwys 0xF) in the high nibble of the current byte + ; Store 1st nibble (alwys 0xF) in the high nibble of the current byte - phy_trash_a + +phy_trash_a lda #$F0 ldy tk__byte_offset ora tk__packed, y sta tk__packed, y - // Store byte in the next byte + ; Store byte in the next byte iny pla sta tk__packed, y - // Adjust remaining counters / flags + ; Adjust remaining counters / flags iny sty tk__byte_offset - inc tk__nibble_flag // $FF -> $00 + inc tk__nibble_flag ; $FF -> $00 - // FALLTROUGH + ; FALLTROUGH tk_pack_3n_done: - // Put the bit mark - to indicate 3-nibble encoding + ; Put the bit mark - to indicate 3-nibble encoding sec ror tk__shorten_bits+0 ror tk__shorten_bits+1 - bcc tk_pack_loop_next // branch always + bcc tk_pack_loop_next ; branch always tk_pack_3n_new_byte: - // First store everything in the current byte, we will set '0xF' mark later + ; First store everything in the current byte, we will set '0xF' mark later tya ldy tk__byte_offset sta tk__packed, y - // Now store just the low nibble in the next byte + ; Now store just the low nibble in the next byte iny and #$0F sta tk__packed, y - // Go back for a moment and set the '0xF' mark in the low nibble + ; Go back for a moment and set the '0xF' mark in the low nibble dey lda tk__packed, y @@ -227,9 +218,9 @@ tk_pack_3n_new_byte: sta tk__packed, y iny - // Adjust remaining counters / flags + ; Adjust remaining counters / flags sty tk__byte_offset - dec tk__nibble_flag // $00 -> $FF + dec tk__nibble_flag ; $00 -> $FF - bmi tk_pack_3n_done // branch always + bmi tk_pack_3n_done ; branch always diff --git a/src/basic/engine_editor/tk_search.s b/src/basic/engine_editor/tk_search.s index fb847b24..49be5178 100644 --- a/src/basic/engine_editor/tk_search.s +++ b/src/basic/engine_editor/tk_search.s @@ -1,29 +1,29 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Search for a token on the list pointed by FRESPC -// -// Input: -// - list address in FRESPC, has to be refreshed after routine call -// - uses same variables as 'tk_pack' -// Output: -// - Carry set = not found -// - .X = index of token found -// +; +; Search for a token on the list pointed by FRESPC +; +; Input: +; - list address in FRESPC, has to be refreshed after routine call +; - uses same variables as 'tk_pack' +; Output: +; - Carry set = not found +; - .X = index of token found +; tk_search: - ldx #$00 // initial token index + ldx #$00 ; initial token index - // FALLTROUGH + ; FALLTROUGH tk_search_loop: - // Check if end of the list + ; Check if end of the list ldy #$00 lda (FRESPC), y @@ -35,14 +35,14 @@ tk_search_loop: cmp #$FF bne tk_search_compare - // End of the list + ; End of the list sec rts tk_search_compare: - // Compare the packed candidate with the current keyword list entry + ; Compare the packed candidate with the current keyword list entry lda (FRESPC), y cmp tk__packed, y @@ -51,30 +51,30 @@ tk_search_compare: cmp #$00 beq tk_search_found - // For now everything matches, try the next byte + ; For now everything matches, try the next byte iny - bne tk_search_compare // branch always + bne tk_search_compare ; branch always tk_search_not_matching: - inx // increment token index + inx ; increment token index - // We need to find the end of the keyword on the list - // and proceed one byte further + ; We need to find the end of the keyword on the list + ; and proceed one byte further cmp #$00 beq tk_search_next -!: +@1: iny lda (FRESPC), y - bne !- + bne @1 - // FALLTROUGH + ; FALLTROUGH tk_search_next: - // Update FRESPC - advance by .Y + ; Update FRESPC - advance by .Y iny tya @@ -85,7 +85,7 @@ tk_search_next: adc #$00 sta FRESPC+1 - bcc tk_search_loop // branch always + bcc tk_search_loop ; branch always tk_search_found: diff --git a/src/basic/engine_editor/tk_shorten.s b/src/basic/engine_editor/tk_shorten.s index 977b0c02..10ed762c 100644 --- a/src/basic/engine_editor/tk_shorten.s +++ b/src/basic/engine_editor/tk_shorten.s @@ -1,44 +1,44 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Shortens a keyword candidate previously packed by tk_pack by 1 character -// -// Input: -// - uses same variables as 'tk_pack' -// +; +; Shortens a keyword candidate previously packed by tk_pack by 1 character +; +; Input: +; - uses same variables as 'tk_pack' +; tk_shorten: - // First make sure we actually can shorten anything + ; First make sure we actually can shorten anything dec tk__len_unpacked beq tk_shorten_end - // Now check if the last character was encoded as 1 nibble or 3 nibbles + ; Now check if the last character was encoded as 1 nibble or 3 nibbles asl tk__shorten_bits+1 rol tk__shorten_bits+0 bcs tk_shorten_3n - // FALLTROUGH + ; FALLTROUGH tk_shorten_1n: - ldy tk__byte_offset // will be needed in both cases + ldy tk__byte_offset ; will be needed in both cases - // Now we need to check which nibble to cut away + ; Now we need to check which nibble to cut away bit tk__nibble_flag bmi tk_shorten_1n_lo - // FALLTROUGH + ; FALLTROUGH -tk_shorten_1n_hi: // tk__nibble_flag = $00, both nibbles free +tk_shorten_1n_hi: ; tk__nibble_flag = $00, both nibbles free - // Go back one byte and clear the high nibble only + ; Go back one byte and clear the high nibble only dey sty tk__byte_offset @@ -47,62 +47,62 @@ tk_shorten_1n_hi: // tk__nibble_flag = $00, both nibbles fr and #$0F sta tk__packed, y - // Adjust remaining counters / flags, and quit + ; Adjust remaining counters / flags, and quit - dec tk__nibble_flag // $00 -> $FF + dec tk__nibble_flag ; $00 -> $FF - // FALLTROUGH + ; FALLTROUGH tk_shorten_end: rts -tk_shorten_1n_lo: // tk__nibble_flag = $FF, only the high nibble is free +tk_shorten_1n_lo: ; tk__nibble_flag = $FF, only the high nibble is free - // Clear the whole byte, it will be faster + ; Clear the whole byte, it will be faster lda #$00 sta tk__packed, y - // Adjust remaining counters / flags, and quit + ; Adjust remaining counters / flags, and quit - inc tk__nibble_flag // $FF -> $00 + inc tk__nibble_flag ; $FF -> $00 rts tk_shorten_3n: - ldy tk__byte_offset // will be needed in both cases + ldy tk__byte_offset ; will be needed in both cases lda #$00 - // Now we need to check which nibble to cut away + ; Now we need to check which nibble to cut away bit tk__nibble_flag bmi tk_shorten_3n_2bytes - // FALLTROUGH + ; FALLTROUGH -tk_shorten_3n_byte_nibble: // tk__nibble_flag = $00, both nibbles free +tk_shorten_3n_byte_nibble: ; tk__nibble_flag = $00, both nibbles free - // Go back one byte, clear it, go back and clear the high nibble only + ; Go back one byte, clear it, go back and clear the high nibble only dey sta tk__packed, y - // Reuse 'tk_shorten_1n_hi' + ; Reuse 'tk_shorten_1n_hi' sty tk__byte_offset - jmp_8 tk_shorten_1n_hi + +bra tk_shorten_1n_hi -tk_shorten_3n_2bytes: // tk__nibble_flag = $FF, only the high nibble is free +tk_shorten_3n_2bytes: ; tk__nibble_flag = $FF, only the high nibble is free - // Clear the byte, go back, clear one more byte + ; Clear the byte, go back, clear one more byte sta tk__packed, y dey sta tk__packed, y - // Adjust remaining counters / flags, and quit + ; Adjust remaining counters / flags, and quit sty tk__byte_offset - inc tk__nibble_flag // $FF -> $00 + inc tk__nibble_flag ; $FF -> $00 rts diff --git a/src/basic/engine_editor/tokenise_line.s b/src/basic/engine_editor/tokenise_line.s index 13f1fcfd..4141f2a4 100644 --- a/src/basic/engine_editor/tokenise_line.s +++ b/src/basic/engine_editor/tokenise_line.s @@ -1,53 +1,48 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tokenise a line of BASIC stored at $0200 -// -// Input: -// - length in __tokenise_work1 -// +; +; Tokenise a line of BASIC stored at $0200 +; +; Input: +; - length in __tokenise_work1 +; tokenise_line: -#if (ROM_LAYOUT_M65 && SEGMENT_BASIC_0) +!ifdef SEGMENT_M65_BASIC_0 { - jsr map_BASIC_1 - jsr_ind VB1__tokenise_line - jmp map_NORMAL + jsr map_BASIC_1 + jsr (VB1__tokenise_line) + jmp map_NORMAL -#else +} else { - // Reuse the CPU stack - addresses above $100 are used by 'tk_pack.s' - - .label tk__offset = $100 // offset into string - .label tk__length = __tokenise_work1 // length of the raw string - - // Initialize variables + ; Initialize variables lda #$00 sta tk__offset - // Terminate input string with $00 + ; Terminate input string with $00 - // XXX do we need this? + ; XXX do we need this? ldx tk__length sta BUF, x - // FALLTROUGH + ; FALLTROUGH tokenise_line_loop: - // Check if we have reached end of the line + ; Check if we have reached end of the line lda tk__offset cmp tk__length beq tokenise_line_done - // Check for some special characters + ; Check for some special characters ldx tk__offset lda BUF, x @@ -59,16 +54,16 @@ tokenise_line_loop: beq tokenise_line_pi cmp #$3F - beq tokenise_line_question_mark // shortcut for PRINT command + beq tokenise_line_question_mark ; shortcut for PRINT command - // Try to tokenise + ; Try to tokenise jsr tk_pack -!: +@1: lda tk__len_unpacked - beq tokenise_line_char // branch if attempt to tokenise failed + beq tokenise_line_char ; branch if attempt to tokenise failed - // Check for BASIC V2 tokens + ; Check for BASIC V2 tokens lda # + ; We were in a program, so show IN ldx #IDX__STR_IN jsr print_packed_misc_str @@ -211,12 +211,12 @@ do_basic_error: // error code in .X lda CURLIN+1 ldx CURLIN+0 jsr print_integer -!: - // Reset stack, and go back to main loop +@1: + ; Reset stack, and go back to main loop ldx #$FE txs jmp shell_main_loop -#endif // ROM layout +} ; ROM layout diff --git a/src/basic/engine_runtime/do_new_clr_restore.s b/src/basic/engine_runtime/do_new_clr_restore.s index 28fbfed7..9a96cc25 100644 --- a/src/basic/engine_runtime/do_new_clr_restore.s +++ b/src/basic/engine_runtime/do_new_clr_restore.s @@ -1,35 +1,40 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// See https://www.c64-wiki.com/wiki/Memory_(BASIC) for BASIC memory organization +; See https://www.c64-wiki.com/wiki/Memory_(BASIC) for BASIC memory organization -do_new: +do_new: -#if (ROM_LAYOUT_M65 && SEGMENT_BASIC_0) +!ifdef SEGMENT_M65_BASIC_0 { - jsr map_BASIC_1 - jsr_ind VB1__do_new - jmp map_NORMAL + jsr map_BASIC_1 + jsr (VB1__do_new) + +bra do_restore_end do_clr: - jsr map_BASIC_1 - jsr_ind VB1__do_clr - jmp map_NORMAL + jsr map_BASIC_1 + jsr (VB1__do_clr) + +bra do_restore_end do_restore: - jsr map_BASIC_1 - jsr_ind VB1__do_restore - jmp map_NORMAL + jsr map_BASIC_1 + jsr (VB1__do_restore) + + ; FALLTROUGH + +do_restore_end: -#else + jmp map_NORMAL - // See Computes Mapping the Commodore 64 - page 96 +} else { + + ; See Computes Mapping the Commodore 64 - page 96 ldy #$00 tya @@ -37,7 +42,7 @@ do_restore: iny sta (TXTTAB),y - // The book does not mention this, but IMHO it is necessary to initialize VARTAB here too + ; The book does not mention this, but IMHO it is necessary to initialize VARTAB here too clc lda TXTTAB+0 @@ -49,9 +54,9 @@ do_restore: do_clr: - // See Computes Mapping the Commodore 64 - page 96 + ; See Computes Mapping the Commodore 64 - page 96 - // XXX check if original ROM does this too + ; XXX check if original ROM does this too jsr JCLALL lda MEMSIZ+0 @@ -59,7 +64,7 @@ do_clr: lda MEMSIZ+1 sta FRETOP+1 - // The book is not precise here $31-$32 is definitely not the end of BASIC text + ; The book is not precise here $31-$32 is definitely not the end of BASIC text lda VARTAB+0 sta ARYTAB+0 @@ -69,18 +74,18 @@ do_clr: sta ARYTAB+1 sta STREND+1 - // This is a good place to reset the temporary string stack + ; This is a good place to reset the temporary string stack jsr tmpstr_free_all_reset - // FALLTROUGH (confirmed on real C64 that CLR indeed resets DATPTR) + ; FALLTROUGH (confirmed on real C64 that CLR indeed resets DATPTR) do_restore: - // See Computes Mapping the Commodore 64 - page 98 - // Initial DATPTR value checked on real C64 + ; See Computes Mapping the Commodore 64 - page 98 + ; Initial DATPTR value checked on real C64 -#if HAS_OPCODES_65CE02 +!ifdef HAS_OPCODES_65CE02 { lda TXTTAB+0 sta DATPTR+0 @@ -89,7 +94,7 @@ do_restore: dew DATPTR -#else +} else { sec lda TXTTAB+0 @@ -98,10 +103,8 @@ do_restore: lda TXTTAB+1 sbc #$00 sta DATPTR+1 - -#endif +} rts - -#endif // ROM layout +} ; ROM layout diff --git a/src/basic/engine_runtime/end_of_statement.s b/src/basic/engine_runtime/end_of_statement.s index 8216d144..9b9af397 100644 --- a/src/basic/engine_runtime/end_of_statement.s +++ b/src/basic/engine_runtime/end_of_statement.s @@ -1,10 +1,10 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Executes the next command - after previous got finished -// +; +; Executes the next command - after previous got finished +; end_of_statement: @@ -12,12 +12,12 @@ end_of_statement: jsr tmpstr_free_all jsr fetch_character_skip_spaces - cmp #$3A // check for colon - beq_16 execute_statements + cmp #$3A ; check for colon + +beq execute_statements - cmp #$00 // check for end of the line - beq_16 execute_statements_end_of_line + cmp #$00 ; check for end of the line + +beq execute_statements_end_of_line - // Unexpected character + ; Unexpected character jmp do_SYNTAX_error diff --git a/src/basic/engine_runtime/execute_line_statements.s b/src/basic/engine_runtime/execute_line_statements.s index dd1d3b99..cd9dcfd3 100644 --- a/src/basic/engine_runtime/execute_line_statements.s +++ b/src/basic/engine_runtime/execute_line_statements.s @@ -1,72 +1,71 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tries to execute the statement, and all the subsequent ones -// +; +; Tries to execute the statement, and all the subsequent ones +; execute_statements: - // Check for RUN/STOP + ; Check for RUN/STOP lda STKEY - bpl_16 cmd_stop + +bpl cmd_stop - // Skip over any white spaces and colons (':') -!: + ; Skip over any white spaces and colons (':') +@1: jsr fetch_character_skip_spaces - cmp #$3A // colon, can be skipped - beq !- + cmp #$3A ; colon, can be skipped + beq @1 - // Check if end of the line + ; Check if end of the line cmp #$00 beq execute_statements_end_of_line - // Not end of the line - it seems we actually have something to execute + ; Not end of the line - it seems we actually have something to execute - // Move token code to .X + ; Move token code to .X tax - // Push the 'end_of_statement' address for RTS + ; Push the 'end_of_statement' address for RTS lda #>(end_of_statement - 1) pha lda #<(end_of_statement - 1) pha - // Check if token is valid for execution + ; Check if token is valid for execution -#if HAS_SMALL_BASIC +!ifdef HAS_SMALL_BASIC { cpx #$01 beq execute_statements_01 -#else +} else { -#if ROM_LAYOUT_M65 +!ifdef CONFIG_MB_M65 { cpx #$04 -#else +} else { cpx #$03 -#endif +} bcc execute_statements_extended - -#endif +} cpx #$CB - beq_16 cmd_go // // 'GO' command has a strange token, placed after function tokens + +beq cmd_go ; 'GO' command has a strange token, placed after function tokens cpx #$7F - bcc_16 execute_statements_var_assign // not a token - try variable assign + +bcc execute_statements_var_assign ; not a token - try variable assign cpx #$A7 - bcs_16 do_SYNTAX_error + +bcs do_SYNTAX_error -#if !HAS_OPCODES_65C02 +!ifndef HAS_OPCODES_65C02 { - // Get the jump table entry for it, push it on the stack, and then RTS to start it. + ; Get the jump table entry for it, push it on the stack, and then RTS to start it. lda command_jumptable_hi - $80, x pha @@ -75,24 +74,23 @@ execute_statements: rts -#else // HAS_OPCODES_65C02 +} else { ; HAS_OPCODES_65C02 - // Use jumptable to go to the command routine + ; Use jumptable to go to the command routine txa asl tax jmp (command_jumptable, x) +} -#endif - -#if !HAS_SMALL_BASIC +!ifndef HAS_SMALL_BASIC { execute_statements_extended: - // Support for extended BASIC commands + ; Support for extended BASIC commands - // XXX consider jumpable here + ; XXX consider jumpable here cpx #$01 beq execute_statements_01 @@ -100,33 +98,31 @@ execute_statements_extended: cpx #$02 beq execute_statements_02 -#if ROM_LAYOUT_M65 +!ifdef CONGIH_MB_M65 { cpx #$03 beq execute_statements_03 - -#endif +} jmp do_SYNTAX_error - -#endif +} execute_statements_01: - // Get the sub-token, check that it is valid + ; Get the sub-token, check that it is valid jsr fetch_character cmp #$00 - beq_16 do_SYNTAX_error + +beq do_SYNTAX_error cmp #(TK__MAXTOKEN_keywords_01+1) - bcs_16 do_SYNTAX_error + +bcs do_SYNTAX_error - // Execute command + ; Execute command -#if !HAS_OPCODES_65C02 +!ifndef HAS_OPCODES_65C02 { - // Get the jump table entry for it, push it on the stack, and then RTS to start it. + ; Get the jump table entry for it, push it on the stack, and then RTS to start it. tax lda command_01_jumptable_hi - 1, x @@ -136,34 +132,33 @@ execute_statements_01: rts -#else // HAS_OPCODES_65C02 +} else { ; HAS_OPCODES_65C02 - // Use jumptable to go to the command routine + ; Use jumptable to go to the command routine asl tax jmp (command_01_jumptable - 2, x) +} -#endif - -#if !HAS_SMALL_BASIC +!ifndef HAS_SMALL_BASIC { execute_statements_02: - // Get the sub-token, check that it is valid + ; Get the sub-token, check that it is valid jsr fetch_character cmp #$00 - beq_16 do_SYNTAX_error + +beq do_SYNTAX_error cmp #(TK__MAXTOKEN_keywords_02+1) - bcs_16 do_SYNTAX_error + +bcs do_SYNTAX_error - // Execute command + ; Execute command -#if !HAS_OPCODES_65C02 +!ifndef HAS_OPCODES_65C02 { - // Get the jump table entry for it, push it on the stack, and then RTS to start it. + ; Get the jump table entry for it, push it on the stack, and then RTS to start it. tax lda command_02_jumptable_hi - 1, x @@ -173,75 +168,74 @@ execute_statements_02: rts -#else // HAS_OPCODES_65C02 +} else { ; HAS_OPCODES_65C02 - // Use jumptable to go to the command routine + ; Use jumptable to go to the command routine asl tax jmp (command_02_jumptable - 2, x) +} -#endif +} ; !HAS_SMALL_BASIC -#endif // !HAS_SMALL_BASIC - -#if ROM_LAYOUT_M65 +!ifdef CONFIG_MB_M65 { execute_statements_03: - // Get the sub-token, check that it is valid + ; Get the sub-token, check that it is valid jsr fetch_character cmp #$00 - beq_16 do_SYNTAX_error + +beq do_SYNTAX_error cmp #(TK__MAXTOKEN_keywords_03+1) - bcs_16 do_SYNTAX_error + +bcs do_SYNTAX_error - // Use jumptable to go to the command routine + ; Use jumptable to go to the command routine asl tax jmp (command_03_jumptable - 2, x) -#endif // ROM_LAYOUT_M65 +} ; CONFIG_MB_M65 execute_statements_end_of_line: - // First check, if we are in direct mode - if so, - // end the execution and go to main loop + ; First check, if we are in direct mode - if so, + ; end the execution and go to main loop ldx CURLIN+1 inx - beq_16 shell_main_loop + +beq shell_main_loop - // Advance to the next line - first copy the line number - // to previous line number + ; Advance to the next line - first copy the line number + ; to previous line number lda CURLIN+0 sta OLDLIN+0 lda CURLIN+1 sta OLDLIN+1 - // Advance the basic line pointer to the next line; if end, - // go to the main loop + ; Advance the basic line pointer to the next line; if end, + ; go to the main loop jsr follow_link_to_next_line lda OLDTXT+0 ora OLDTXT+1 - beq_16 shell_main_loop + +beq shell_main_loop - // FALLTROUGH + ; FALLTROUGH execute_line: - // Check if pointer is null, if so, we are at the end of the program + ; Check if pointer is null, if so, we are at the end of the program jsr is_line_pointer_null - beq_16 shell_main_loop // branch if end of program reached + +beq shell_main_loop ; branch if end of program reached - // Skip pointer and line number to get address of first statement + ; Skip pointer and line number to get address of first statement lda OLDTXT+0 clc @@ -253,25 +247,25 @@ execute_line: ldy #$02 -#if CONFIG_MEMORY_MODEL_60K +!ifdef CONFIG_MEMORY_MODEL_60K { ldx #=', '<=' and '<>' operators + ; Now we have to recognize '>=', '<=' and '<>' operators cmp #$07 beq fetch_operator_try_gteq @@ -32,7 +32,7 @@ fetch_operator: // XXX change the operator code to start from 0 cmp #$09 beq fetch_operator_try_lteq_neq - // FALLTROUGH + ; FALLTROUGH fetch_operator_success: @@ -41,11 +41,11 @@ fetch_operator_success: fetch_operator_failed: -#if !HAS_OPCODES_65CE02 +!ifndef HAS_OPCODES_65CE02 { jsr unconsume_character -#else +} else { dew TXTPTR -#endif +} sec rts @@ -53,54 +53,54 @@ fetch_operator_failed: fetch_operator_try_gteq: - // Here we distinguish between '>' and '>=' + ; Here we distinguish between '>' and '>=' jsr fetch_character - cmp #$B2 // '=' - beq !+ + cmp #$B2 ; '=' + beq @1 - // This is a '>' + ; This is a '>' -#if !HAS_OPCODES_65CE02 +!ifndef HAS_OPCODES_65CE02 { jsr unconsume_character -#else +} else { dew TXTPTR -#endif +} lda #$07 - bne fetch_operator_success // branch always -!: - // This is a '>=' + bne fetch_operator_success ; branch always +@1: + ; This is a '>=' lda #$0A - bne fetch_operator_success // branch always + bne fetch_operator_success ; branch always fetch_operator_try_lteq_neq: - // Here we distinguish between '<', '<=', and '<>' + ; Here we distinguish between '<', '<=', and '<>' jsr fetch_character - cmp #$B2 // '=' - beq !+ - cmp #$B1 // '>' - beq !++ + cmp #$B2 ; '=' + beq @2 + cmp #$B1 ; '>' + beq @3 - // This is a '<' + ; This is a '<' -#if !HAS_OPCODES_65CE02 +!ifndef HAS_OPCODES_65CE02 { jsr unconsume_character -#else +} else { dew TXTPTR -#endif +} lda #$09 - bne fetch_operator_success // branch always -!: - // This is a '<=' + bne fetch_operator_success ; branch always +@2: + ; This is a '<=' lda #$0B - bne fetch_operator_success // branch always -!: - // This is a '<>' + bne fetch_operator_success ; branch always +@3: + ; This is a '<>' lda #$0C - bne fetch_operator_success // branch always + bne fetch_operator_success ; branch always diff --git a/src/basic/engine_runtime/fetch_uint16.s b/src/basic/engine_runtime/fetch_uint16.s index 6a960a4a..8217a330 100644 --- a/src/basic/engine_runtime/fetch_uint16.s +++ b/src/basic/engine_runtime/fetch_uint16.s @@ -1,49 +1,49 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Fetches unsigned 16-bit integer, stores it in LINNUM, sets Carry to indicate failure (not a number) -// -// If value above 65535, error depends on .A opn entry -// -// Preserves both .X and .Y -// +; +; Fetches unsigned 16-bit integer, stores it in LINNUM, sets Carry to indicate failure (not a number) +; +; If value above 65535, error depends on .A opn entry +; +; Preserves both .X and .Y +; fetch_uint16: - // Push the error code to stack + ; Push the error code to stack pha - // Fetch the first character (skip spaces), check if 0-9 + ; Fetch the first character (skip spaces), check if 0-9 jsr fetch_character_skip_spaces jsr convert_PETSCII_to_digit bcs fetch_uint16_rts - // First character seems to be correct - store it + ; First character seems to be correct - store it sta LINNUM+0 lda #$00 sta LINNUM+1 - // FALLTROUGH + ; FALLTROUGH fetch_uint16_loop: - // Try to fetch another digit + ; Try to fetch another digit jsr fetch_character jsr convert_PETSCII_to_digit bcs fetch_uint16_end - // We got another digit - store it + ; We got another digit - store it pha - // Multiply current LINNUM by 10 (x * 10 = (x * 2) + (x * 2) * 4) + ; Multiply current LINNUM by 10 (x * 10 = (x * 2) + (x * 2) * 4) jsr fetch_uint16_mul_LINNUM_2 bcs fetch_uint16_1PLA_error @@ -67,7 +67,7 @@ fetch_uint16_loop: sta LINNUM+1 bcs fetch_uint16_1PLA_error - // Add the new digit to LINNUM + ; Add the new digit to LINNUM pla clc @@ -78,20 +78,20 @@ fetch_uint16_loop: sta LINNUM+1 bcs fetch_uint16_error - // Next iteration + ; Next iteration - jmp_8 fetch_uint16_loop + +bra fetch_uint16_loop fetch_uint16_end: -#if !HAS_OPCODES_65CE02 +!ifndef HAS_OPCODES_65CE02 { jsr unconsume_character -#else +} else { dew TXTPTR -#endif +} clc - // FALLTROUGH + ; FALLTROUGH fetch_uint16_rts: @@ -110,15 +110,15 @@ fetch_uint16_3PLA_error: pla pla - // FALLTROUGH + ; FALLTROUGH fetch_uint16_1PLA_error: pla - // FALLTROUGH + ; FALLTROUGH fetch_uint16_error: - plx_trash_a + +plx_trash_a jmp do_basic_error diff --git a/src/basic/engine_runtime/fetch_uint8.s b/src/basic/engine_runtime/fetch_uint8.s index 75d8c685..03233205 100644 --- a/src/basic/engine_runtime/fetch_uint8.s +++ b/src/basic/engine_runtime/fetch_uint8.s @@ -1,27 +1,31 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Fetches 8-bit unsigned integer -// +; +; Fetches 8-bit unsigned integer +; fetch_coma_uint8: jsr injest_comma - bcs !+ + bcs fetch_uint8_end - // FALLTROUGH + ; FALLTROUGH fetch_uint8: - lda #IDX__EV2_0E // 'ILLEGAL QUANTITY ERROR' + lda #IDX__EV2_0E ; 'ILLEGAL QUANTITY ERROR' jsr fetch_uint16 - bcs !+ + bcs fetch_uint8_end lda LINNUM+1 - bne_16 do_ILLEGAL_QUANTITY_error + +bne do_ILLEGAL_QUANTITY_error lda LINNUM+0 clc -!: + + ; FALLTROUGH + +fetch_uint8_end: + rts diff --git a/src/basic/engine_runtime/follow_link_to_next_line.s b/src/basic/engine_runtime/follow_link_to_next_line.s index 99899f20..42b697b4 100644 --- a/src/basic/engine_runtime/follow_link_to_next_line.s +++ b/src/basic/engine_runtime/follow_link_to_next_line.s @@ -1,30 +1,32 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE follow_link_to_next_line: ldy #0 -#if CONFIG_MEMORY_MODEL_60K + ; XXX! for models 46K/50K provide optimized version + +!ifdef CONFIG_MEMORY_MODEL_60K { ldx #const_PI jsr mov_MEM_FAC1 - jmp_8 FRMEVL_got_value_float + +bra FRMEVL_got_value_float -// -// This subroutine fetches the floating point value from the 'outside world' -// +; +; This subroutine fetches the floating point value from the 'outside world' +; FRMEVL_fetch_float: - // XXX implement this + ; XXX implement this jmp do_NOT_IMPLEMENTED_error - // FALLTROUGH + ; FALLTROUGH FRMEVL_got_value_float: @@ -187,13 +186,13 @@ FRMEVL_got_value_float: sta VALTYP beq FRMEVL_got_value -// -// This subroutine fetches the string value from the 'outside world' -// +; +; This subroutine fetches the string value from the 'outside world' +; FRMEVL_fetch_string: - // Mark return value as a string, set initial length as 0 + ; Mark return value as a string, set initial length as 0 ldx #$FF stx VALTYP @@ -201,69 +200,69 @@ FRMEVL_fetch_string: inx stx __FAC1 + 0 - // Set pointer to start of the string + ; Set pointer to start of the string ldx TXTPTR + 0 stx __FAC1 + 1 ldx TXTPTR + 1 stx __FAC1 + 2 -!: - // Search for closing quote +@1: + ; Search for closing quote jsr fetch_character cmp #$22 beq FRMEVL_got_value cmp #$00 - beq !+ + beq @2 inc __FAC1 + 0 - bne !- + bne @1 jmp do_STRING_TOO_LONG_error -!: - // No closing quote, but end of the data +@2: + ; No closing quote, but end of the data -#if !HAS_OPCODES_65CE02 +!ifndef HAS_OPCODES_65CE02 { jsr unconsume_character -#else +} else { dew TXTPTR -#endif +} - // FALLTROUGH + ; FALLTROUGH -// -// This subroutine handles the situation after fetching the value from 'outside world': -// - either there is nothing sane remaining there; if so, this value is or final result -// - or there is an operator following the value; in such case we have much more work to do; -// we push the current value and the operator to the stack and we proceed to fetch the next -// value (which is mandatory) -// small catch: if the priority of the new operator is not higher than priority of the last -// operator on the stack (sentinel is considered as the lowest priority operator) we first -// compute what currently is present on the stack - this enforces proper operator precedence -// +; +; This subroutine handles the situation after fetching the value from 'outside world': +; - either there is nothing sane remaining there; if so, this value is or final result +; - or there is an operator following the value; in such case we have much more work to do; +; we push the current value and the operator to the stack and we proceed to fetch the next +; value (which is mandatory) +; small catch: if the priority of the new operator is not higher than priority of the last +; operator on the stack (sentinel is considered as the lowest priority operator) we first +; compute what currently is present on the stack - this enforces proper operator precedence +; FRMEVL_got_value: jsr is_end_of_statement - bcs FRMEVL_compute_all // compute the stack if expression ended + bcs FRMEVL_compute_all ; compute the stack if expression ended - // FALLTROUGH + ; FALLTROUGH FRMEVL_fetch_operator: - // We have a value, but this is not the end of expression. Check if - // there is an operator waiting to be served + ; We have a value, but this is not the end of expression. Check if + ; there is an operator waiting to be served jsr fetch_operator - bcs FRMEVL_compute_all // if operator not recognized, compute what we have - // on stack and quit + bcs FRMEVL_compute_all ; if operator not recognized, compute what we have + ; on stack and quit - // Move the new operator ID to .Y + ; Move the new operator ID to .Y tay - // Compare the priority of the last operator with the new one + ; Compare the priority of the last operator with the new one pla pha @@ -271,39 +270,43 @@ FRMEVL_fetch_operator: cmp operator_priorities, y bcc FRMEVL_push_value_operator - // Here the priority is not higher - so compute what we already have on stack - // but do not finish proccessing + ; Here the priority is not higher - so compute what we already have on stack + ; but do not finish proccessing - sty OPPTR+1 // store .Y, we want to preserve it - lda #$FF // mark that we want to return here + sty OPPTR+1 ; store .Y, we want to preserve it + lda #$FF ; mark that we want to return here sta OPPTR+0 -!: + + ; FALLTROUGH + +FRMEVL_fetch_operator_end: + jmp FRMEVL_compute_partial FRMEVL_compute_partial_return: pla pha - bne !- + bne FRMEVL_fetch_operator_end ldy OPPTR+1 - // FALLTROUGH + ; FALLTROUGH FRMEVL_push_value_operator: - // Push the value from FAC1 + ; Push the value from FAC1 ldx VALTYP bmi FRMEVL_push_string - // Push float + ; Push float - // XXX implement this + ; XXX implement this FRMEVL_push_string: - // Push string - length, address, type + ; Push string - length, address, type lda __FAC1+0 pha @@ -316,56 +319,56 @@ FRMEVL_push_string: txa pha - // FALLTROUGH + ; FALLTROUGH FRMEVL_push_operator_address: - // Check if there is enough stack space; this could not have been done earlier, - // as this is the place where unary operator support calls + ; Check if there is enough stack space; this could not have been done earlier, + ; as this is the place where unary operator support calls jsr check_stack_space - // Push the operator address to stack, in a form - // suitable for RTS + ; Push the operator address to stack, in a form + ; suitable for RTS lda operator_jumptable_hi, y pha lda operator_jumptable_lo, y pha - // Push operator priority + ; Push operator priority lda operator_priorities, y pha - // Continue + ; Continue jmp FRMEVL_loop -// -// This part serves two purposes: -// - it is an exit point for the concrete operator implementations -// - it causes computation of everything which is stored on the stack -// +; +; This part serves two purposes: +; - it is an exit point for the concrete operator implementations +; - it causes computation of everything which is stored on the stack +; FRMEVL_compute_all: lda #$00 sta OPPTR+0 - // FALLTROUGH + ; FALLTROUGH FRMEVL_continue: lda OPPTR+0 bne FRMEVL_compute_partial_return - // FALLTROUGH + ; FALLTROUGH FRMEVL_compute_partial: - // Now, we have to compute operation; at this point we should have a value - // in FAC1 and (most likely) operator on a stack + ; Now, we have to compute operation; at this point we should have a value + ; in FAC1 and (most likely) operator on a stack - pla // priority does not matter here, get rid of it - rts // this either jumps to operator, or quits FRMEVL + pla ; priority does not matter here, get rid of it + rts ; this either jumps to operator, or quits FRMEVL diff --git a/src/basic/engine_runtime/helper_frmevl_strdesccpy_46K_50K.s b/src/basic/engine_runtime/helper_frmevl_strdesccpy_46K_50K.s index 249dbb7d..75d2f552 100644 --- a/src/basic/engine_runtime/helper_frmevl_strdesccpy_46K_50K.s +++ b/src/basic/engine_runtime/helper_frmevl_strdesccpy_46K_50K.s @@ -1,24 +1,24 @@ -// #LAYOUT# STD * #TAKE-HIGH -// #LAYOUT# * BASIC_0 #TAKE-HIGH -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE-HIGH +;; #LAYOUT# * BASIC_0 #TAKE-HIGH +;; #LAYOUT# * * #IGNORE -// This has to go $E000 or above - routines below banks out the main BASIC ROM! +; This has to go $E000 or above - routines below banks out the main BASIC ROM! -// -// Helper routine to copy string descriptor, for expression evaluator -// +; +; Helper routine to copy string descriptor, for expression evaluator +; -#if CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K +!ifdef CONFIG_MEMORY_MODEL_46K_OR_50K { helper_frmevl_strdesccpy: - // Unmap BASIC lower ROM + ; Unmap BASIC lower ROM lda #$26 sta CPU_R6510 - // Copy string descriptor + ; Copy string descriptor ldy #$00 lda (VARPNT),y @@ -30,15 +30,14 @@ helper_frmevl_strdesccpy: lda (VARPNT),y sta __FAC1+2 - // FALLTROUGH + ; FALLTROUGH remap_BASIC: - // Restore default memory mapping + ; Restore default memory mapping lda #$27 sta CPU_R6510 rts - -#endif +} diff --git a/src/basic/engine_runtime/init_oldtxt.s b/src/basic/engine_runtime/init_oldtxt.s index 9879e463..3078170a 100644 --- a/src/basic/engine_runtime/init_oldtxt.s +++ b/src/basic/engine_runtime/init_oldtxt.s @@ -1,6 +1,6 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE init_oldtxt: diff --git a/src/basic/engine_runtime/injest_assign.s b/src/basic/engine_runtime/injest_assign.s index 56456299..360aed7f 100644 --- a/src/basic/engine_runtime/injest_assign.s +++ b/src/basic/engine_runtime/injest_assign.s @@ -1,16 +1,16 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Consummes assign operator in a BASIC code, triggers error if not found -// +; +; Consummes assign operator in a BASIC code, triggers error if not found +; injest_assign: jsr fetch_character_skip_spaces - cmp #$B2 // assign operator character - bne_16 do_SYNTAX_error + cmp #$B2 ; assign operator character + +bne do_SYNTAX_error rts diff --git a/src/basic/engine_runtime/injest_comma.s b/src/basic/engine_runtime/injest_comma.s index ff712d0e..7a17f8bd 100644 --- a/src/basic/engine_runtime/injest_comma.s +++ b/src/basic/engine_runtime/injest_comma.s @@ -1,25 +1,25 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Consummes a comma in a BASIC code, Carry set if not found. Injests all spaces. -// +; +; Consummes a comma in a BASIC code, Carry set if not found. Injests all spaces. +; injest_comma: jsr fetch_character_skip_spaces - cmp #$2C // comma character + cmp #$2C ; comma character beq injest_comma_found - // Not found + ; Not found -#if !HAS_OPCODES_65CE02 +!ifndef HAS_OPCODES_65CE02 { jsr unconsume_character -#else +} else { dew TXTPTR -#endif +} sec rts diff --git a/src/basic/engine_runtime/is_alphanumeric.s b/src/basic/engine_runtime/is_alphanumeric.s index fa85c4c5..317833a0 100644 --- a/src/basic/engine_runtime/is_alphanumeric.s +++ b/src/basic/engine_runtime/is_alphanumeric.s @@ -1,11 +1,11 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Check .A content, if within 0-9, A-Z ranges, sets Carry if check fails -// +; +; Check .A content, if within 0-9, A-Z ranges, sets Carry if check fails +; is_09_AZ: @@ -17,19 +17,19 @@ is_09_AZ: is_09: - cmp #$30 // if below '0' - check failed + cmp #$30 ; if below '0' - check failed bcc is_alphanumeric_fail - cmp #$3A // if above '9' - check failed + cmp #$3A ; if above '9' - check failed rts is_AZ: - cmp #$41 // if below 'A' - check failed + cmp #$41 ; if below 'A' - check failed bcc is_alphanumeric_fail - cmp #$7B // if above 'Z' - check failed + cmp #$7B ; if above 'Z' - check failed rts diff --git a/src/basic/engine_runtime/is_end_of_statement.s b/src/basic/engine_runtime/is_end_of_statement.s index 32cbfcb0..a14fb6fb 100644 --- a/src/basic/engine_runtime/is_end_of_statement.s +++ b/src/basic/engine_runtime/is_end_of_statement.s @@ -1,10 +1,10 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Check for end of statement, sets Carry if so. Injests all spaces. -// +; +; Check for end of statement, sets Carry if so. Injests all spaces. +; is_end_of_statement: @@ -12,28 +12,28 @@ is_end_of_statement: jsr fetch_character_skip_spaces cmp #$00 - beq !+ + beq @1 cmp #$3A - beq !+ + beq @1 - // Not end of statement + ; Not end of statement -#if !HAS_OPCODES_65CE02 +!ifndef HAS_OPCODES_65CE02 { jsr unconsume_character -#else +} else { dew TXTPTR -#endif +} clc rts -!: - // End of statement +@1: + ; End of statement -#if !HAS_OPCODES_65CE02 +!ifndef HAS_OPCODES_65CE02 { jsr unconsume_character -#else +} else { dew TXTPTR -#endif +} sec rts diff --git a/src/basic/engine_runtime/is_line_pointer_null_38K_60K.s b/src/basic/engine_runtime/is_line_pointer_null_38K_60K.s index 5ca5b151..2650d389 100644 --- a/src/basic/engine_runtime/is_line_pointer_null_38K_60K.s +++ b/src/basic/engine_runtime/is_line_pointer_null_38K_60K.s @@ -1,37 +1,36 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// Return pointer in BASIC memory space status in Z flag +; Return pointer in BASIC memory space status in Z flag -#if CONFIG_MEMORY_MODEL_38K || CONFIG_MEMORY_MODEL_60K +!ifndef CONFIG_MEMORY_MODEL_46K_OR_50K { is_line_pointer_null: - // Check the pointer + ; Check the pointer - ldy #$01 // for non-NULL pointer, high byte is almost certainly not NULL + ldy #$01 ; for non-NULL pointer, high byte is almost certainly not NULL -#if CONFIG_MEMORY_MODEL_60K +!ifdef CONFIG_MEMORY_MODEL_60K { ldx #BUF sta TXTPTR+1 - // There is no stored line, so zero that pointer out + ; There is no stored line, so zero that pointer out lda #$00 sta OLDTXT+0 sta OLDTXT+1 - // Put invalid line number in current line number value, - // so that we know we are in direct mode (Computes Mapping the 64 p19) + ; Put invalid line number in current line number value, + ; so that we know we are in direct mode (Computes Mapping the 64 p19) lda #$FF sta CURLIN+1 rts -#endif // ROM layout +} ; ROM layout diff --git a/src/basic/engine_runtime/unconsume_character.s b/src/basic/engine_runtime/unconsume_character.s index 73609eff..13ff587a 100644 --- a/src/basic/engine_runtime/unconsume_character.s +++ b/src/basic/engine_runtime/unconsume_character.s @@ -1,12 +1,12 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Reverses character fetch -// +; +; Reverses character fetch +; -#if !HAS_OPCODES_65CE02 +!ifndef HAS_OPCODES_65CE02 { unconsume_character: @@ -19,5 +19,4 @@ unconsume_character: sta TXTPTR+1 rts - -#endif +} diff --git a/src/basic/engine_variables/array_create.s b/src/basic/engine_variables/array_create.s index 15a0f982..1e97df8c 100644 --- a/src/basic/engine_variables/array_create.s +++ b/src/basic/engine_variables/array_create.s @@ -1,22 +1,22 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE array_create: - // First retrieve array name + ; First retrieve array name jsr fetch_variable_name - bcs_16 do_SYNTAX_error + +bcs do_SYNTAX_error - // Make sure the array does not exist + ; Make sure the array does not exist jsr find_array - bcc_16 do_REDIMD_ARRAY_error + +bcc do_REDIMD_ARRAY_error - // Push variable name and FOUR6 on the stack - fetching dimensions might cause - // the to be overwritten by the expression parser + ; Push variable name and FOUR6 on the stack - fetching dimensions might cause + ; the to be overwritten by the expression parser lda VARNAM+1 pha @@ -25,7 +25,7 @@ array_create: lda FOUR6 pha - // Check if the array dimension is given - if not, assume '10' was specified + ; Check if the array dimension is given - if not, assume '10' was specified bit DIMFLG bmi array_create_fetch_dims @@ -35,78 +35,78 @@ array_create: lda #$00 pha ldx #$01 - bne array_create_store_dims // branch always + bne array_create_store_dims ; branch always array_create_fetch_dims: - ldx #$00 // counts number of dimensions + ldx #$00 ; counts number of dimensions - // FALLTROUGH + ; FALLTROUGH array_create_fetch_dims_loop: inx - // Fetch the dimension, increment it by 1, and put it on the stack; - // confirmed with original ROM, that it also stores dimensions in the reverse order + ; Fetch the dimension, increment it by 1, and put it on the stack; + ; confirmed with original ROM, that it also stores dimensions in the reverse order jsr helper_fetch_arr_coord -#if !HAS_OPCODES_65CE02 +!ifndef HAS_OPCODES_65CE02 { inc LINNUM+0 - bne !+ + bne @1 inc LINNUM+1 -!: -#else +@1: +} else { inw LINNUM -#endif +} - beq_16 do_OUT_OF_MEMORY_error + +beq do_OUT_OF_MEMORY_error lda LINNUM+0 pha lda LINNUM+1 pha - // Check if more dimensions are given + ; Check if more dimensions are given cpy #$00 beq array_create_fetch_dims_loop - // FALLTROUGH + ; FALLTROUGH array_create_store_dims: - // We got the dimensions, time to alocate memory. Arrays are not declared too often, - // it will be easier if we perform the garbage collection now + ; We got the dimensions, time to alocate memory. Arrays are not declared too often, + ; it will be easier if we perform the garbage collection now - phx_trash_a + +phx_trash_a jsr varstr_garbage_collect - // __FAC1+1/+2 will be used to calculate number of elements + ; __FAC1+1/+2 will be used to calculate number of elements ldy #$01 sty __FAC1+1 dey sty __FAC1+2 - // Check if there is enough free memory for the header + ; Check if there is enough free memory for the header - pla // .A - number of dimensions + pla ; .A - number of dimensions sta __FAC1+0 jsr helper_array_create_checkmem lda __FAC1+0 - // Create the initial array structure (header) - format checked by creating arrays with original ROM + ; Create the initial array structure (header) - format checked by creating arrays with original ROM - // Bytes 0/1 - array name, but we can not fetch it easily now, so skip it for now - // Bytes 2/3 - offset to the next array, skip it for now too - // Byte 4 - number of dimensions - // Bytes 5+ - max index in each dimension (big endian!), this will be set in a loop + ; Bytes 0/1 - array name, but we can not fetch it easily now, so skip it for now + ; Bytes 2/3 - offset to the next array, skip it for now too + ; Byte 4 - number of dimensions + ; Bytes 5+ - max index in each dimension (big endian!), this will be set in a loop ldy #$04 -#if CONFIG_MEMORY_MODEL_60K +!ifdef CONFIG_MEMORY_MODEL_60K { stx INDEX+2 @@ -115,20 +115,19 @@ array_create_store_dims: ldx INDEX+2 -#else // CONFIG_MEMORY_MODEL_38K || CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K +} else { ; CONFIG_MEMORY_MODEL_38K || CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K sta (STREND), y +} -#endif + iny ; .Y - index to store dimension sizes + tax ; .X - dimensions not stored yet - iny // .Y - index to store dimension sizes - tax // .X - dimensions not stored yet - - // FALLTROUGH + ; FALLTROUGH array_create_store_loop: -#if CONFIG_MEMORY_MODEL_60K +!ifdef CONFIG_MEMORY_MODEL_60K { stx INDEX+2 ldx #(assign_variable_arr_ret-1) pha lda #<(assign_variable_arr_ret-1) pha - // Store FOUR6 on tha stack + ; Store FOUR6 on tha stack lda FOUR6 pha - // Retrieve all the coordinates + ; Retrieve all the coordinates ldx #$00 -!: +@1: inx jsr helper_fetch_arr_coord @@ -39,44 +39,44 @@ assign_variable: lda LINNUM+0 pha - // Check if more dimensions are given + ; Check if more dimensions are given cpy #$00 - beq !- + beq @1 - // Store number of dimensions on the stack + ; Store number of dimensions on the stack - phx_trash_a + +phx_trash_a - // Fetch assignment operator and continue + ; Fetch assignment operator and continue jsr injest_assign - lda #$FF // force DIMFLG to be array - jmp_8 assign_variable_common_1 + lda #$FF ; force DIMFLG to be array + +bra assign_variable_common_1 assign_variable_not_array_1: - // Require assignment operator + ; Require assignment operator jsr injest_assign - // Check for special variables + ; Check for special variables jsr is_var_TI_string - beq_16 assign_variable_TI_string + +beq assign_variable_TI_string jsr is_var_TI - beq_16 do_SYNTAX_error + +beq do_SYNTAX_error jsr is_var_ST - beq_16 do_SYNTAX_error + +beq do_SYNTAX_error - // Push the DIMFLG and VARNAM to the stack - it might get overridden + ; Push the DIMFLG and VARNAM to the stack - it might get overridden lda DIMFLG - // FALLTROUGH + ; FALLTROUGH assign_variable_common_1: @@ -86,191 +86,188 @@ assign_variable_common_1: lda VARNAM+1 pha - // Evaluate the expression + ; Evaluate the expression jsr FRMEVL - // Restore VARNAM and DIMFLG + ; Restore VARNAM and DIMFLG pla sta VARNAM+1 pla sta VARNAM+0 pla - sta DIMFLG // XXX is it needed? + sta DIMFLG ; XXX is it needed? - // Check if array + ; Check if array bpl assign_variable_not_array_2 - // Yes, this is an array - preserve FAC1 values which might get overwritten - // XXX adapt this for floats! + ; Yes, this is an array - preserve FAC1 values which might get overwritten + ; XXX adapt this for floats! ldx #$04 -!: +@2: lda __FAC1,x sta __FAC2,x dex - bpl !- + bpl @2 - // Get array address + ; Get array address jsr find_array - bcc !+ + bcc @3 - // Array does not exist - we will have to create one with default parameters + ; Array does not exist - we will have to create one with default parameters - // XXX implement this + ; XXX implement this jmp do_NOT_IMPLEMENTED_error -!: - // Fetch the number of dimensions +@3: + ; Fetch the number of dimensions pla sta __FAC1+0 tax - // Fetch the address of the variable + ; Fetch the address of the variable - jmp fetch_variable_arr_calc_pos // RTS goes to assign_variable_arr_ret + jmp fetch_variable_arr_calc_pos ; RTS goes to assign_variable_arr_ret assign_variable_arr_ret: - // Restore FAC1 values - // XXX adapt this for floats! + ; Restore FAC1 values + ; XXX adapt this for floats! ldx #$04 -!: +@4: lda __FAC2,x sta __FAC1,x dex - bpl !- - bmi assign_variable_common_2 // branch always + bpl @4 + bmi assign_variable_common_2 ; branch always assign_variable_not_array_2: - // Retrieve the variable address + ; Retrieve the variable address jsr fetch_variable_find_addr - // FALLTROUGH + ; FALLTROUGH assign_variable_common_2: - // Determine variable type + ; Determine variable type lda #$00 clc bit VARNAM+0 - bpl !+ + bpl @5 adc #$01 -!: +@5: bit VARNAM+1 - bpl !+ + bpl @6 adc #$80 -!: - // Determine what to assign +@6: + ; Determine what to assign bmi assign_string beq assign_float - // FALLTROUGH + ; FALLTROUGH - // XXX integer and float probably have much in common + ; XXX integer and float probably have much in common assign_integer: lda VALTYP - bmi_16 do_TYPE_MISMATCH_error + +bmi do_TYPE_MISMATCH_error -#if CONFIG_MEMORY_MODEL_60K +!ifdef CONFIG_MEMORY_MODEL_60K { - // XXX - // XXX: implement this - // XXX + ; XXX + ; XXX: implement this + ; XXX -#elif CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K - // XXX consider optimized version without multiple JSRs +} else ifdef CONFIG_MEMORY_MODEL_46K_OR_50K { + ; XXX consider optimized version without multiple JSRs - // XXX - // XXX: implement this - // XXX + ; XXX + ; XXX: implement this + ; XXX -#else // CONFIG_MEMORY_MODEL_38K - - // XXX - // XXX: implement this - // XXX - -#endif +} else { ; CONFIG_MEMORY_MODEL_38K + ; XXX + ; XXX: implement this + ; XXX +} jmp do_NOT_IMPLEMENTED_error assign_float: lda VALTYP - bmi_16 do_TYPE_MISMATCH_error + +bmi do_TYPE_MISMATCH_error -#if CONFIG_MEMORY_MODEL_60K +!ifdef CONFIG_MEMORY_MODEL_60K { - // XXX - // XXX: implement this - // XXX + ; XXX + ; XXX: implement this + ; XXX -#elif CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K - // XXX consider optimized version without multiple JSRs +} else ifdef CONFIG_MEMORY_MODEL_46K_OR_50K { + ; XXX consider optimized version without multiple JSRs - // XXX - // XXX: implement this - // XXX + ; XXX + ; XXX: implement this + ; XXX -#else // CONFIG_MEMORY_MODEL_38K +} else { ; CONFIG_MEMORY_MODEL_38K - // XXX - // XXX: implement this - // XXX - -#endif + ; XXX + ; XXX: implement this + ; XXX +} jmp do_NOT_IMPLEMENTED_error assign_string: - // Check if value type matches + ; Check if value type matches lda VALTYP - bpl_16 do_TYPE_MISMATCH_error + +bpl do_TYPE_MISMATCH_error - // Copy the string descriptor to DSCPNT + ; Copy the string descriptor to DSCPNT jsr helper_strdesccpy - // First special case - check if the new string has size 0 + ; First special case - check if the new string has size 0 lda __FAC1+0 bne assign_string_not_empty - // Yes, it is empty - free the old one + ; Yes, it is empty - free the old one jsr varstr_free - // Set the new variable as empty string + ; Set the new variable as empty string ldy #$00 lda #$00 -#if CONFIG_MEMORY_MODEL_60K +!ifdef CONFIG_MEMORY_MODEL_60K { ldx #= 7) + ; First check if we have enough space for a new descriptor (if FRETOP - STREND >= 7) sec lda FRETOP+0 @@ -102,21 +102,21 @@ fetch_variable_alocate: pha lda FRETOP+1 sbc STREND+1 - bne !+ // branch if high byte of result > 0 + bne @3 ; branch if high byte of result > 0 pla cmp #$07 bcs fetch_variable_alocate_space_OK jmp do_OUT_OF_MEMORY_error -!: +@3: pla - // FALLTROUGH + ; FALLTROUGH fetch_variable_alocate_space_OK: - // If arrays exist, we need to move them upwards + ; If arrays exist, we need to move them upwards sec lda STREND+0 @@ -131,12 +131,12 @@ fetch_variable_alocate_space_OK: ora memmove__size+0 beq fetch_variable_alocate_adjust_vars - // Indeed, there are arrays - adjust size, calculate the destination and perform copying + ; Indeed, there are arrays - adjust size, calculate the destination and perform copying inc memmove__size+0 - bne !+ + bne @4 inc memmove__size+1 -!: +@4: clc lda memmove__src+0 @@ -148,38 +148,38 @@ fetch_variable_alocate_space_OK: jsr shift_mem_up - // FALLTROUGH + ; FALLTROUGH fetch_variable_alocate_adjust_vars: - // Adjust ARYTAB and STREND + ; Adjust ARYTAB and STREND clc lda STREND+0 adc #$07 sta STREND+0 - bcc !+ + bcc @5 inc STREND+1 -!: +@5: clc lda ARYTAB+0 adc #$07 sta ARYTAB+0 - bcc !+ + bcc @6 inc ARYTAB+1 -!: - // VARPNT already points to the start of the variable descriptor +@6: + ; VARPNT already points to the start of the variable descriptor - // We need to recreate the back-pointers to string arrays + ; We need to recreate the back-pointers to string arrays jsr helper_array_refresh_bptrs - // Fill-in the new variable name and descriptor (it is enough to zero first 2 bytes of content) + ; Fill-in the new variable name and descriptor (it is enough to zero first 2 bytes of content) ldy #$00 -#if CONFIG_MEMORY_MODEL_60K +!ifdef CONFIG_MEMORY_MODEL_60K { ldx # 0, then we certainly have enough space + ; If high byte (INDEX+3) > 0, then we certainly have enough space lda INDEX+3 bne helper_array_create_checkmem_success - // We have very little memory left - we need at least number of dimensions*2 + 5 bytes + ; We have very little memory left - we need at least number of dimensions*2 + 5 bytes lda __FAC1+0 asl @@ -51,7 +51,7 @@ helper_array_create_checkmem: cmp INDEX+2 bcs helper_array_create_checkmem_fail - // FALLTROUGH + ; FALLTROUGH helper_array_create_checkmem_success: diff --git a/src/basic/engine_variables/helper_array_create_mul.s b/src/basic/engine_variables/helper_array_create_mul.s index fca065b5..b974a2d2 100644 --- a/src/basic/engine_variables/helper_array_create_mul.s +++ b/src/basic/engine_variables/helper_array_create_mul.s @@ -1,51 +1,51 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// 16-bit multiplication, INDEX+0/+1 = __FAC1+1/+2 * __FAC1+3/+4; __FAC1+1/+2 = INDEX+0/+1 -// uses INDEX+2/+3 (for helper routine) as work area +; 16-bit multiplication, INDEX+0/+1 = __FAC1+1/+2 * __FAC1+3/+4; __FAC1+1/+2 = INDEX+0/+1 +; uses INDEX+2/+3 (for helper routine) as work area -helper_array_create_mul: // preserves .X and .Y +helper_array_create_mul: ; preserves .X and .Y - phx_trash_a + +phx_trash_a - // We will reuse 8x8 multiplication routine used by floating point operations + ; We will reuse 8x8 multiplication routine used by floating point operations - // __FAC1+1 (lo byte) * __FAC1+3 (lo byte) + ; __FAC1+1 (lo byte) * __FAC1+3 (lo byte) lda __FAC1+1 sta INDEX+3 lda __FAC1+3 - jsr mul_FAC2_FAC1_8x8 // this preserves .Y + jsr mul_FAC2_FAC1_8x8 ; this preserves .Y - sta INDEX+0 // result - lo byte - stx INDEX+1 // result - hi byte + sta INDEX+0 ; result - lo byte + stx INDEX+1 ; result - hi byte - // __FAC1+1 (lo byte) * __FAC1+4 (hi byte) + ; __FAC1+1 (lo byte) * __FAC1+4 (hi byte) lda __FAC1+1 sta INDEX+3 lda __FAC1+4 - jsr helper_array_create_mul_8x8_add // multiply and add to high byte of the result + jsr helper_array_create_mul_8x8_add ; multiply and add to high byte of the result - // __FAC1+2 (hi byte) * __FAC1+3 (lo byte) + ; __FAC1+2 (hi byte) * __FAC1+3 (lo byte) lda __FAC1+2 sta INDEX+3 lda __FAC1+3 - jsr helper_array_create_mul_8x8_add // multiply and add to high byte of the result + jsr helper_array_create_mul_8x8_add ; multiply and add to high byte of the result - // __FAC1+2 (hi byte) * __FAC1+4 (hi byte) has to be 0, - // otherwise the result would be out of range - // do not calculate + ; __FAC1+2 (hi byte) * __FAC1+4 (hi byte) has to be 0, + ; otherwise the result would be out of range + ; do not calculate lda __FAC1+2 beq helper_array_create_mul_success lda __FAC1+4 beq helper_array_create_mul_success - // FALLTROUGH + ; FALLTROUGH helper_array_create_mul_error: @@ -58,7 +58,7 @@ helper_array_create_mul_success: lda INDEX+1 sta __FAC1+2 - plx_trash_a + +plx_trash_a rts helper_array_create_mul_8x8_add: diff --git a/src/basic/engine_variables/helper_array_fetch_dimension_46K_50K.s b/src/basic/engine_variables/helper_array_fetch_dimension_46K_50K.s index c53efb9e..aec2f8b2 100644 --- a/src/basic/engine_variables/helper_array_fetch_dimension_46K_50K.s +++ b/src/basic/engine_variables/helper_array_fetch_dimension_46K_50K.s @@ -1,19 +1,19 @@ -// #LAYOUT# STD * #TAKE-HIGH -// #LAYOUT# * BASIC_0 #TAKE-HIGH -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE-HIGH +;; #LAYOUT# * BASIC_0 #TAKE-HIGH +;; #LAYOUT# * * #IGNORE -// This has to go $E000 or above - routine below banks out the main BASIC ROM! +; This has to go $E000 or above - routine below banks out the main BASIC ROM! -#if CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K +!ifdef CONFIG_MEMORY_MODEL_46K_OR_50K { helper_array_fetch_dimension: - // Unmap BASIC lower ROM + ; Unmap BASIC lower ROM lda #$26 sta CPU_R6510 - // Fetch the dimension + ; Fetch the dimension lda (VARPNT), y sta __FAC1+4 @@ -22,11 +22,10 @@ helper_array_fetch_dimension: sta __FAC1+3 iny - // Restore default memory mapping + ; Restore default memory mapping lda #$27 sta CPU_R6510 rts - -#endif +} diff --git a/src/basic/engine_variables/helper_array_refresh_bptrs.s b/src/basic/engine_variables/helper_array_refresh_bptrs.s index 616ed146..6a45f837 100644 --- a/src/basic/engine_variables/helper_array_refresh_bptrs.s +++ b/src/basic/engine_variables/helper_array_refresh_bptrs.s @@ -1,37 +1,37 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Refresh back-pointer to arrays -// +; +; Refresh back-pointer to arrays +; helper_array_refresh_bptrs: - // Refresh back-pointers to arrays + ; Refresh back-pointers to arrays lda ARYTAB+0 sta INDEX+0 lda ARYTAB+1 sta INDEX+1 - // FALLTROUGH + ; FALLTROUGH helper_array_refresh_bptrs_loop_1: - // Check if we reached end of arays + ; Check if we reached end of arrays lda INDEX+1 cmp STREND+1 - bne !+ + bne @1 lda INDEX+0 cmp STREND+0 - bne !+ + bne @1 rts -!: - // Calculate start address of the next array, store it in INDEX+2/+3 +@1: + ; Calculate start address of the next array, store it in INDEX+2/+3 -#if CONFIG_MEMORY_MODEL_60K +!ifdef CONFIG_MEMORY_MODEL_60K { ldx # STREND, Carry set if not +helper_FRETOP_check: ; check if FRETOP > STREND, Carry set if not lda STREND+1 cmp FRETOP+1 - beq !+ + beq @2 rts -!: +@2: lda STREND+0 cmp FRETOP+0 rts diff --git a/src/basic/engine_variables/helper_fretop_up.s b/src/basic/engine_variables/helper_fretop_up.s index de5ee2b2..2444fde3 100644 --- a/src/basic/engine_variables/helper_fretop_up.s +++ b/src/basic/engine_variables/helper_fretop_up.s @@ -1,19 +1,19 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Helper routine for FRETOP handling -// +; +; Helper routine for FRETOP handling +; -helper_FRETOP_up: // DSCPNT+0 - bytes to increment FRETO +helper_FRETOP_up: ; DSCPNT+0 - bytes to increment FRETO clc lda FRETOP+0 adc DSCPNT+0 sta FRETOP+0 - bcc !+ + bcc @1 inc FRETOP+1 -!: +@1: rts diff --git a/src/basic/engine_variables/helper_gc_fetch_backpointer_46K_50K.s b/src/basic/engine_variables/helper_gc_fetch_backpointer_46K_50K.s index 1b72c7cd..4921d6c9 100644 --- a/src/basic/engine_variables/helper_gc_fetch_backpointer_46K_50K.s +++ b/src/basic/engine_variables/helper_gc_fetch_backpointer_46K_50K.s @@ -1,19 +1,19 @@ -// #LAYOUT# STD * #TAKE-HIGH -// #LAYOUT# * BASIC_0 #TAKE-HIGH -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE-HIGH +;; #LAYOUT# * BASIC_0 #TAKE-HIGH +;; #LAYOUT# * * #IGNORE -// This has to go $E000 or above - routine below banks out the main BASIC ROM! +; This has to go $E000 or above - routine below banks out the main BASIC ROM! -#if CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K +!ifdef CONFIG_MEMORY_MODEL_46K_OR_50K { helper_gc_fetch_backpointer: - // Unmap BASIC lower ROM + ; Unmap BASIC lower ROM lda #$26 sta CPU_R6510 - // Copy the back-pointer to OLDTXT, check if it is NULL + ; Copy the back-pointer to OLDTXT, check if it is NULL ldy #$00 lda (TXTPTR),y @@ -25,8 +25,7 @@ helper_gc_fetch_backpointer: ora OLDTXT+0 - // Restore default memory mapping + ; Restore default memory mapping jmp remap_BASIC_preserve_P - -#endif +} diff --git a/src/basic/engine_variables/helper_gc_misc_46K_50K.s b/src/basic/engine_variables/helper_gc_misc_46K_50K.s index 503df2aa..03e93b5c 100644 --- a/src/basic/engine_variables/helper_gc_misc_46K_50K.s +++ b/src/basic/engine_variables/helper_gc_misc_46K_50K.s @@ -1,19 +1,19 @@ -// #LAYOUT# STD * #TAKE-HIGH -// #LAYOUT# * BASIC_0 #TAKE-HIGH -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE-HIGH +;; #LAYOUT# * BASIC_0 #TAKE-HIGH +;; #LAYOUT# * * #IGNORE -// This has to go $E000 or above - routines below bank out the main BASIC ROM! +; This has to go $E000 or above - routines below bank out the main BASIC ROM! -#if CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K +!ifdef CONFIG_MEMORY_MODEL_46K_OR_50K { helper_gc_set_memmove_src: - // Unmap BASIC lower ROM + ; Unmap BASIC lower ROM lda #$26 sta CPU_R6510 - // Set memmove__src + ; Set memmove__src lda (OLDTXT),y sta memmove__src+0 @@ -21,18 +21,18 @@ helper_gc_set_memmove_src: lda (OLDTXT),y sta memmove__src+1 - // Restore default memory mapping + ; Restore default memory mapping - jmp_8 helper_gc_misc_end + +bra helper_gc_misc_end helper_gc_increase_oldtxt: - // Unmap BASIC lower ROM + ; Unmap BASIC lower ROM lda #$26 sta CPU_R6510 - // Increase OLDTXT accordingly + ; Increase OLDTXT accordingly lda (OLDTXT),y clc @@ -43,12 +43,11 @@ helper_gc_increase_oldtxt: adc INDEX+1 sta (OLDTXT),y - // FALLTROUGH + ; FALLTROUGH helper_gc_misc_end: - // Restore default memory mapping + ; Restore default memory mapping jmp remap_BASIC - -#endif +} diff --git a/src/basic/engine_variables/helper_index_up_a_38K_60K.s b/src/basic/engine_variables/helper_index_up_a_38K_60K.s index 54198e25..0a8e2fcb 100644 --- a/src/basic/engine_variables/helper_index_up_a_38K_60K.s +++ b/src/basic/engine_variables/helper_index_up_a_38K_60K.s @@ -1,14 +1,14 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Helper routine, used in several places -// +; +; Helper routine, used in several places +; -#if CONFIG_MEMORY_MODEL_38K || CONFIG_MEMORY_MODEL_60K +!ifndef CONFIG_MEMORY_MODEL_46K_OR_50K { -helper_INDEX_up_A: // .A - bytes to increase INDEX, uses DSCPNT+0 +helper_INDEX_up_A: ; .A - bytes to increase INDEX, uses DSCPNT+0 sta DSCPNT+0 @@ -16,9 +16,8 @@ helper_INDEX_up_A: // .A - bytes to increase INDEX, uses DSC lda INDEX+0 adc DSCPNT+0 sta INDEX+0 - bcc !+ + bcc @1 dec INDEX+1 -!: +@1: rts - -#endif +} diff --git a/src/basic/engine_variables/helper_index_up_a_46K_50K.s b/src/basic/engine_variables/helper_index_up_a_46K_50K.s index 38ede00c..2e160b50 100644 --- a/src/basic/engine_variables/helper_index_up_a_46K_50K.s +++ b/src/basic/engine_variables/helper_index_up_a_46K_50K.s @@ -1,16 +1,16 @@ -// #LAYOUT# STD * #TAKE-HIGH -// #LAYOUT# * BASIC_0 #TAKE-HIGH -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE-HIGH +;; #LAYOUT# * BASIC_0 #TAKE-HIGH +;; #LAYOUT# * * #IGNORE -// This has to go $E000 or above - it can be used by routines which bank out the main BASIC ROM! +; This has to go $E000 or above - it can be used by routines which bank out the main BASIC ROM! -// -// Helper routine, used in several places -// +; +; Helper routine, used in several places +; -#if CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K +!ifdef CONFIG_MEMORY_MODEL_46K_OR_50K { -helper_INDEX_up_A: // .A - bytes to increase INDEX, uses DSCPNT+0 +helper_INDEX_up_A: ; .A - bytes to increase INDEX, uses DSCPNT+0 sta DSCPNT+0 @@ -18,9 +18,8 @@ helper_INDEX_up_A: // .A - bytes to increase INDEX, uses DSC lda INDEX+0 adc DSCPNT+0 sta INDEX+0 - bcc !+ + bcc @1 dec INDEX+1 -!: +@1: rts - -#endif +} diff --git a/src/basic/engine_variables/helper_strconcat_46K_50K.s b/src/basic/engine_variables/helper_strconcat_46K_50K.s index e44ea918..c83ca61d 100644 --- a/src/basic/engine_variables/helper_strconcat_46K_50K.s +++ b/src/basic/engine_variables/helper_strconcat_46K_50K.s @@ -1,53 +1,52 @@ -// #LAYOUT# STD * #TAKE-HIGH -// #LAYOUT# * BASIC_0 #TAKE-HIGH -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE-HIGH +;; #LAYOUT# * BASIC_0 #TAKE-HIGH +;; #LAYOUT# * * #IGNORE -// This has to go $E000 or above - routines below banks out the main BASIC ROM! +; This has to go $E000 or above - routines below banks out the main BASIC ROM! -// -// Helper routine for string concatenation -// +; +; Helper routine for string concatenation +; -#if CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K +!ifdef CONFIG_MEMORY_MODEL_46K_OR_50K { helper_strconcat: - // Unmap BASIC lower ROM + ; Unmap BASIC lower ROM lda #$26 sta CPU_R6510 - // Copy data from the first string + ; Copy data from the first string ldy #$00 -!: +@1: lda (__FAC2+1),y sta (INDEX),y iny cpy __FAC2+0 - bne !- + bne @1 - // Increase INDEX pointer by the size of the 1st string + ; Increase INDEX pointer by the size of the 1st string tya jsr helper_INDEX_up_A - // Copy data from the second string + ; Copy data from the second string ldy #$00 -!: +@2: lda (__FAC1+1),y sta (INDEX),y iny cpy __FAC1+0 - bne !- + bne @2 - // Restore default memory mapping + ; Restore default memory mapping lda #$27 sta CPU_R6510 rts - -#endif +} diff --git a/src/basic/engine_variables/helper_strdesccpy_38K.s b/src/basic/engine_variables/helper_strdesccpy_38K.s index 04870841..3b337ee4 100644 --- a/src/basic/engine_variables/helper_strdesccpy_38K.s +++ b/src/basic/engine_variables/helper_strdesccpy_38K.s @@ -1,13 +1,13 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Helper routine to copy string descriptor -// +; +; Helper routine to copy string descriptor +; -#if CONFIG_MEMORY_MODEL_38K +!ifdef CONFIG_MEMORY_MODEL_38K { helper_strdesccpy: @@ -22,5 +22,4 @@ helper_strdesccpy: sta DSCPNT+2 rts - -#endif +} diff --git a/src/basic/engine_variables/helper_strdesccpy_46K_50K.s b/src/basic/engine_variables/helper_strdesccpy_46K_50K.s index df7d4172..ac7a9f4d 100644 --- a/src/basic/engine_variables/helper_strdesccpy_46K_50K.s +++ b/src/basic/engine_variables/helper_strdesccpy_46K_50K.s @@ -1,24 +1,24 @@ -// #LAYOUT# STD * #TAKE-HIGH -// #LAYOUT# * BASIC_0 #TAKE-HIGH -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE-HIGH +;; #LAYOUT# * BASIC_0 #TAKE-HIGH +;; #LAYOUT# * * #IGNORE -// This has to go $E000 or above - routine below banks out the main BASIC ROM! +; This has to go $E000 or above - routine below banks out the main BASIC ROM! -// -// Helper routine to copy string descriptor -// +; +; Helper routine to copy string descriptor +; -#if CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K +!ifdef CONFIG_MEMORY_MODEL_46K_OR_50K { helper_strdesccpy: - // Unmap BASIC lower ROM + ; Unmap BASIC lower ROM lda #$26 sta CPU_R6510 - // Retrieve pointer to destination + ; Retrieve pointer to destination ldy #$00 lda (VARPNT), y @@ -30,11 +30,10 @@ helper_strdesccpy: lda (VARPNT), y sta DSCPNT+2 - // Restore default memory mapping + ; Restore default memory mapping lda #$27 sta CPU_R6510 rts - -#endif +} diff --git a/src/basic/engine_variables/helper_strdesccpy_60K.s b/src/basic/engine_variables/helper_strdesccpy_60K.s index 9e627a18..e3647853 100644 --- a/src/basic/engine_variables/helper_strdesccpy_60K.s +++ b/src/basic/engine_variables/helper_strdesccpy_60K.s @@ -1,13 +1,13 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Helper routine to copy string descriptor -// +; +; Helper routine to copy string descriptor +; -#if CONFIG_MEMORY_MODEL_60K +!ifdef CONFIG_MEMORY_MODEL_60K { helper_strdesccpy: @@ -24,5 +24,4 @@ helper_strdesccpy: sta DSCPNT+2 rts - -#endif +} diff --git a/src/basic/engine_variables/helper_strvarcpy_38K.s b/src/basic/engine_variables/helper_strvarcpy_38K.s index 8a15fe3e..9b01590a 100644 --- a/src/basic/engine_variables/helper_strvarcpy_38K.s +++ b/src/basic/engine_variables/helper_strvarcpy_38K.s @@ -1,17 +1,17 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Helper routine to copy string descriptor -// +; +; Helper routine to copy string descriptor +; -#if CONFIG_MEMORY_MODEL_38K +!ifdef CONFIG_MEMORY_MODEL_38K { helper_strvarcpy: - // Retrieve pointer to destination + ; Retrieve pointer to destination ldy #$02 lda (VARPNT), y @@ -21,14 +21,13 @@ helper_strvarcpy: sta DSCPNT+1 dey - // .Y is now 0 - copy the content -!: + ; .Y is now 0 - copy the content +@1: lda (__FAC1+1),y sta (DSCPNT+1),y iny cpy __FAC1+0 - bne !- + bne @1 rts - -#endif +} diff --git a/src/basic/engine_variables/helper_strvarcpy_46K_50K.s b/src/basic/engine_variables/helper_strvarcpy_46K_50K.s index 6c7f9545..dbf907f9 100644 --- a/src/basic/engine_variables/helper_strvarcpy_46K_50K.s +++ b/src/basic/engine_variables/helper_strvarcpy_46K_50K.s @@ -1,24 +1,24 @@ -// #LAYOUT# STD * #TAKE-HIGH -// #LAYOUT# * BASIC_0 #TAKE-HIGH -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE-HIGH +;; #LAYOUT# * BASIC_0 #TAKE-HIGH +;; #LAYOUT# * * #IGNORE -// This has to go $E000 or above - routines below banks out the main BASIC ROM! +; This has to go $E000 or above - routines below banks out the main BASIC ROM! -// -// Helper routine to copy string variable content -// +; +; Helper routine to copy string variable content +; -#if CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K +!ifdef CONFIG_MEMORY_MODEL_46K_OR_50K { helper_strvarcpy: - // Unmap BASIC lower ROM + ; Unmap BASIC lower ROM lda #$26 sta CPU_R6510 - // Retrieve pointer to destination + ; Retrieve pointer to destination ldy #$02 lda (VARPNT), y @@ -28,19 +28,18 @@ helper_strvarcpy: sta DSCPNT+1 dey - // Copy the string content -!: + ; Copy the string content +@1: lda (__FAC1+1),y sta (DSCPNT+1),y iny cpy __FAC1+0 - bne !- + bne @1 - // Restore default memory mapping + ; Restore default memory mapping lda #$27 sta CPU_R6510 rts - -#endif +} diff --git a/src/basic/engine_variables/helper_strvarcpy_60K.s b/src/basic/engine_variables/helper_strvarcpy_60K.s index a3c05119..5a1c19b2 100644 --- a/src/basic/engine_variables/helper_strvarcpy_60K.s +++ b/src/basic/engine_variables/helper_strvarcpy_60K.s @@ -1,19 +1,19 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Helper routine to copy string descriptor -// +; +; Helper routine to copy string descriptor +; -#if CONFIG_MEMORY_MODEL_60K +!ifdef CONFIG_MEMORY_MODEL_60K { helper_strvarcpy: ldx # 0 -// -// Output: -// - VARPNT points to the newly alocated descriptor -// +; +; Allocates memory for a temporary string +; +; Input: +; -.A desired string length, has to be > 0 +; +; Output: +; - VARPNT points to the newly alocated descriptor +; tmpstr_alloc: tax - // First we need to find a free temporary string descriptor + ; First we need to find a free temporary string descriptor lda TEMPPT cmp #$22 @@ -28,36 +28,36 @@ tmpstr_alloc: adc #$03 sta TEMPPT - // FALLTROUGH + ; FALLTROUGH tmpstr_alloc_found: - // Store desired string length + ; Store desired string length stx $00, y - // Store descriptor address + ; Store descriptor address sty VARPNT+0 lda #$00 sta VARPNT+1 - // Jump to alocation routine + ; Jump to alocation routine jmp varstr_alloc tmpstr_alloc_try_reuse: - // It seems there is no space left - try to find empty entry + ; It seems there is no space left - try to find empty entry ldy #$19 - // FALLTROUGH + ; FALLTROUGH tmpstr_alloc_try_reuse_loop: lda $00, y - beq tmpstr_alloc_found // branch if free entry found + beq tmpstr_alloc_found ; branch if free entry found iny iny @@ -65,6 +65,6 @@ tmpstr_alloc_try_reuse_loop: cpy #$22 bne tmpstr_alloc_try_reuse_loop - // Everything failed - give up + ; Everything failed - give up jmp do_FORMULA_TOO_COMPLEX_error diff --git a/src/basic/engine_variables/tmpstr_free.s b/src/basic/engine_variables/tmpstr_free.s index 14d41291..b14dc43a 100644 --- a/src/basic/engine_variables/tmpstr_free.s +++ b/src/basic/engine_variables/tmpstr_free.s @@ -1,13 +1,13 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Frees the string if it belongs to temporary string stack -// -// Input: -// - DSCPNT+1/+2 - pointer to string (depending on the call addres, can fetch from FAC1/FAC2) -// +; +; Frees the string if it belongs to temporary string stack +; +; Input: +; - DSCPNT+1/+2 - pointer to string (depending on the call addres, can fetch from FAC1/FAC2) +; tmpstr_free_FAC1: @@ -16,39 +16,42 @@ tmpstr_free_FAC1: sta DSCPNT+1 lda __FAC1+2 - jmp_8 !+ - + +bra tmpstr_free_FAC2_cont tmpstr_free_FAC2: lda __FAC2+1 sta DSCPNT+1 lda __FAC2+2 -!: + + ; FALLTROUGH + +tmpstr_free_FAC2_cont: + sta DSCPNT+2 - // FALLTROUGH + ; FALLTROUGH tmpstr_free: - // First find the descriptor matching the given string + ; First find the descriptor matching the given string ldx #$19 - //FALLTROUGH + ;FALLTROUGH tmpstr_free_loop: cpx TEMPPT - bne !+ - rts // quit if not found -!: - // First fetch the string size - if 0, do not even try to compare + bne @1 + rts ; quit if not found +@1: + ; First fetch the string size - if 0, do not even try to compare ldy $00, x beq tmpstr_free_next_3 - // Check if current string + ; Check if current string inx lda $00, x @@ -60,14 +63,14 @@ tmpstr_free_loop: cmp DSCPNT+2 bne tmpstr_free_next_1 - // This is the string we need to free + ; This is the string we need to free sty DSCPNT+0 - phx_trash_a + +phx_trash_a jsr varstr_free_no_checks - plx_trash_a + +plx_trash_a - // Mark empty string as free and quit + ; Mark empty string as free and quit dex dex @@ -80,13 +83,13 @@ tmpstr_free_next_3: inx - // FALLTROUGH + ; FALLTROUGH tmpstr_free_next_2: inx - // FALLTROUGH + ; FALLTROUGH tmpstr_free_next_1: diff --git a/src/basic/engine_variables/tmpstr_free_all.s b/src/basic/engine_variables/tmpstr_free_all.s index bd0f3067..facf3971 100644 --- a/src/basic/engine_variables/tmpstr_free_all.s +++ b/src/basic/engine_variables/tmpstr_free_all.s @@ -1,25 +1,25 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE tmpstr_free_all: - // Go through all the temporary descriptors and free everything + ; Go through all the temporary descriptors and free everything ldx #$19 - //FALLTROUGH + ;FALLTROUGH tmpstr_free_all_loop: - // Free all the temporary strings, one by one + ; Free all the temporary strings, one by one cpx TEMPPT beq tmpstr_free_all_reset lda $00, x - beq !+ + beq @1 sta DSCPNT+0 lda $01, x @@ -27,18 +27,18 @@ tmpstr_free_all_loop: lda $02, x sta DSCPNT+2 - phx_trash_a + +phx_trash_a jsr varstr_free_no_checks - plx_trash_a -!: + +plx_trash_a +@1: inx inx inx - bne tmpstr_free_all_loop // branch always + bne tmpstr_free_all_loop ; branch always -tmpstr_free_all_reset: // entry point for CLR +tmpstr_free_all_reset: ; entry point for CLR - // RESET TEMPPT and LASTPT to default values + ; RESET TEMPPT and LASTPT to default values lda #$19 sta TEMPPT diff --git a/src/basic/engine_variables/varstr_alloc.s b/src/basic/engine_variables/varstr_alloc.s index 371116ef..00028bca 100644 --- a/src/basic/engine_variables/varstr_alloc.s +++ b/src/basic/engine_variables/varstr_alloc.s @@ -1,141 +1,140 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Allocates memory for string - lowers FRETOP (but not below STREND) -// -// Note: We are not going to use the C64-style memory management here, as it implies -// a very slow garbage collector. Instead, we are using a scheme similar to used in -// BASIC V3.5 and later, with 'back-pointers' after each string, telling about the -// location of the string descriptor. -// -// See: -// - https://www.c64-wiki.com/wiki/Memory_(BASIC) -// - https://sites.google.com/site/h2obsession/CBM/basic/variable-format -// -// Input: -// - VARPNT - pointer to string descriptor, first pointed byte should contain desired length -// Output: -// - fills-in pointer in the string descriptor -// +; +; Allocates memory for string - lowers FRETOP (but not below STREND) +; +; Note: We are not going to use the C64-style memory management here, as it implies +; a very slow garbage collector. Instead, we are using a scheme similar to used in +; BASIC V3.5 and later, with 'back-pointers' after each string, telling about the +; location of the string descriptor. +; +; See: +; - https://www.c64-wiki.com/wiki/Memory_(BASIC) +; - https://sites.google.com/site/h2obsession/CBM/basic/variable-format +; +; Input: +; - VARPNT - pointer to string descriptor, first pointed byte should contain desired length +; Output: +; - fills-in pointer in the string descriptor +; -// NOTE: if FAC1 or FAC2 contains a value (not a string descriptor - these are going to be updated -// if garbage collector starts), then preserve __FAC1+1/+2 and __FAC2+1/+2 somewhere, as there -// is a small chance they'll get damaged! +; NOTE: if FAC1 or FAC2 contains a value (not a string descriptor - these are going to be updated +; if garbage collector starts), then preserve __FAC1+1/+2 and __FAC2+1/+2 somewhere, as there +; is a small chance they'll get damaged! varstr_alloc: - // Mark garbage collector as not run yet + ; Mark garbage collector as not run yet lda #$00 - // FALLTROUGH + ; FALLTROUGH varstr_alloc_retry: - sta GARBFL // Computes Mapping the Commodore 64, page 10 + sta GARBFL ; Computes Mapping the Commodore 64, page 10 - // Backup FRETOP in case of alocation problems + ; Backup FRETOP in case of alocation problems lda FRETOP+0 sta INDEX+0 lda FRETOP+1 sta INDEX+1 - // Lower FRETOP to make space for the back-pointer + ; Lower FRETOP to make space for the back-pointer -#if !HAS_OPCODES_65CE02 +!ifndef HAS_OPCODES_65CE02 { lda #$02 jsr helper_FRETOP_down_A -#else // HAS_OPCODES_65CE02 - this time code is slightly longer, but faster +} else { ; HAS_OPCODES_65CE02 - this time code is slightly longer, but faster dew FRETOP dew FRETOP jsr helper_FRETOP_check - -#endif +} bcs varstr_alloc_fail - // Create the back-pointer to the string descriptor + ; Create the back-pointer to the string descriptor ldy #$00 lda VARPNT+0 -#if CONFIG_MEMORY_MODEL_60K +!ifdef CONFIG_MEMORY_MODEL_60K { ldx # $FF + dec GARBFL ; $00 -> $FF jsr varstr_garbage_collect - jmp_8 varstr_alloc_retry + +bra varstr_alloc_retry diff --git a/src/basic/engine_variables/varstr_free.s b/src/basic/engine_variables/varstr_free.s index b4815d7a..dbd37622 100644 --- a/src/basic/engine_variables/varstr_free.s +++ b/src/basic/engine_variables/varstr_free.s @@ -1,65 +1,64 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Releases back memory used by string -// -// Input: -// - DSCPNT+0 - string size -// - DSCPNT+1, DSCPNT+2 - pointer to string -// +; +; Releases back memory used by string +; +; Input: +; - DSCPNT+0 - string size +; - DSCPNT+1, DSCPNT+2 - pointer to string +; varstr_free: - // Check the string size - do not do anything if 0 + ; Check the string size - do not do anything if 0 lda DSCPNT+0 - bne !+ + bne @1 rts -!: - // Check if string is above FRETOP (in string area) +@1: + ; Check if string is above FRETOP (in string area) jsr helper_cmp_fretop bcs varstr_free_no_checks - // No, it does not belong to string area - quit + ; No, it does not belong to string area - quit rts -varstr_free_no_checks: // entry point to be used when it is clear that string is not empty and above FRETOP +varstr_free_no_checks: ; entry point to be used when it is clear that string is not empty and above FRETOP - // Check if this is the lowest string + ; Check if this is the lowest string bne varstr_free_inside - // This is the lowest string - so just increase FRETOP, this way - // the garbage collector will not be needed that quickly + ; This is the lowest string - so just increase FRETOP, this way + ; the garbage collector will not be needed that quickly - jsr helper_FRETOP_up // free the string data + jsr helper_FRETOP_up ; free the string data -#if !HAS_OPCODES_65CE02 +!ifndef HAS_OPCODES_65CE02 { - lda #$02 // free the back-pointer + lda #$02 ; free the back-pointer sta DSCPNT+0 jmp helper_FRETOP_up -#else // HAS_OPCODES_65CE02 +} else { ; HAS_OPCODES_65CE02 - inw FRETOP // free the back-pointer + inw FRETOP ; free the back-pointer inw FRETOP rts - -#endif +} varstr_free_inside: - // This is not the lowest string; mark it as free - // First preserve the string size, it will make it easier for the garbage collector + ; This is not the lowest string; mark it as free + ; First preserve the string size, it will make it easier for the garbage collector - // Increase DSCPNT+1/+2 to point to the back-pointer minus 1 + ; Increase DSCPNT+1/+2 to point to the back-pointer minus 1 dec DSCPNT+0 @@ -67,37 +66,37 @@ varstr_free_inside: lda DSCPNT+1 adc DSCPNT+0 sta DSCPNT+1 - bcc !+ + bcc @2 inc DSCPNT+2 -!: - // Put the size-1, garbage collector will make use of this value +@2: + ; Put the size-1, garbage collector will make use of this value lda DSCPNT+0 ldy #$00 -#if CONFIG_MEMORY_MODEL_60K +!ifdef CONFIG_MEMORY_MODEL_60K { ldx #do_ILLEGAL_QUANTITY_error sta USRADD+1 - // Clear the BRK location address + ; Clear the BRK location address lda #$00 sta CMP0+0 sta CMP0+1 - // Print startup messages + ; Print startup messages jsr INITMSG - // Initialize other variables by performing NEW + ; Initialize other variables by performing NEW jsr do_new - // jump into warm start loop + ; jump into warm start loop jmp basic_warm_start diff --git a/src/basic/init/basic_warm_start_internal.s b/src/basic/init/basic_warm_start_internal.s index 81ff572c..90acdf91 100644 --- a/src/basic/init/basic_warm_start_internal.s +++ b/src/basic/init/basic_warm_start_internal.s @@ -1,23 +1,23 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Continuation of the BASIC cold start routine -// +; +; Continuation of the BASIC cold start routine +; basic_warm_start_real: -#if CONFIG_MEMORY_MODEL_60K - // We need our helpers to get to filenames under ROMs or IO area +!ifdef CONFIG_MEMORY_MODEL_60K { + ; We need our helpers to get to filenames under ROMs or IO area jsr install_ram_routines -#endif +} - // If warm start caused by BRK, print it address - // XXX sys 58235 also triggers this - to be fixed + ; If warm start caused by BRK, print it address + ; XXX sys 58235 also triggers this - to be fixed lda CMP0 ora CMP0+1 - beq !+ + beq @1 ldx #IDX__STR_BRK_AT jsr print_packed_misc_str @@ -26,5 +26,5 @@ basic_warm_start_real: jsr print_hex_byte lda CMP0+0 jsr print_hex_byte -!: +@1: jmp shell_main_loop diff --git a/src/basic/init/e394.basic_cold_start.s b/src/basic/init/e394.basic_cold_start.s index a7ba4138..ef12b162 100644 --- a/src/basic/init/e394.basic_cold_start.s +++ b/src/basic/init/e394.basic_cold_start.s @@ -1,31 +1,30 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// BASIC Cold start entry point -// Computes Mapping the 64 p211 +; BASIC Cold start entry point +; Computes Mapping the 64 p211 basic_cold_start: -#if ROM_LAYOUT_STD // skip on non-sgtandard ROM layouts - they produce single image nevertheless +!ifdef ROM_LAYOUT_STD { ; skip on non-sgtandard ROM layouts - they produce single image nevertheless - // Before doing anything, check if we have a compatible BASIC/KERNAL pair + ; Before doing anything, check if we have a compatible BASIC/KERNAL pair ldy #(__rom_revision_basic_end - rom_revision_basic - 1) -!: +@1: lda rom_revision_basic, y cmp rom_revision_kernal, y - beq !+ + beq @2 - panic #P_ERR_ROM_MISMATCH + +panic P_ERR_ROM_MISMATCH -!: +@2: dey - bpl !-- + bpl @1 +} -#endif - - // Remaining part would not fit here + ; Remaining part would not fit here jmp basic_cold_start_internal diff --git a/src/basic/init/e3b7.basic_warm_start.jmp.s b/src/basic/init/e3b7.basic_warm_start.jmp.s index 144ba4b6..65810f95 100644 --- a/src/basic/init/e3b7.basic_warm_start.jmp.s +++ b/src/basic/init/e3b7.basic_warm_start.jmp.s @@ -1,9 +1,9 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// Clear screen etc, show READY prompt. +; Clear screen etc, show READY prompt. basic_warm_start: diff --git a/src/basic/init/e422.initmsg.jmp.s b/src/basic/init/e422.initmsg.jmp.s index f0de165f..37cbe78e 100644 --- a/src/basic/init/e422.initmsg.jmp.s +++ b/src/basic/init/e422.initmsg.jmp.s @@ -1,32 +1,35 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Well-known BASIC routine, described in: -// -// - [CM64] Computes Mapping the Commodore 64 - page 212 -// -// Prints the start-up messages -// +; +; Well-known BASIC routine, described in: +; +; - [CM64] Computes Mapping the Commodore 64 - page 212 +; +; Prints the start-up messages +; INITMSG: -#if ROM_LAYOUT_M65 +!ifdef CONFIG_MB_M65 { jsr map_BASIC_1 - jsr_ind VB1__INITMSG -!: + jsr (VB1__INITMSG) + + ; FALLTROUGH + +INITMSG_end: + jmp map_NORMAL INITMSG_autoswitch: jsr map_BASIC_1 - jsr_ind VB1__INITMSG_autoswitch - bra !- + jsr (VB1__INITMSG_autoswitch) + bra INITMSG_end -#else +} else { jmp initmsg_real - -#endif +} diff --git a/src/basic/init/initmsg_bytes_free.s b/src/basic/init/initmsg_bytes_free.s index 97f9f32b..379365bf 100644 --- a/src/basic/init/initmsg_bytes_free.s +++ b/src/basic/init/initmsg_bytes_free.s @@ -1,61 +1,61 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Print out the amount of free bytes - for the startup banner -// +; +; Print out the amount of free bytes - for the startup banner +; initmsg_bytes_free: - // Setup pointers to BASIC memory storage + ; Setup pointers to BASIC memory storage lda #<$0801 sta TXTTAB+0 lda #>$0801 sta TXTTAB+1 - // Get top of memory. - // If a cart is present, then it is $7FFF, - // if not, then it is $F7FF, since we support having - // programs and variables under ROM. - // i.e., we support 56KB RAM for BASIC, keeping some space - // free for some optimisation structures, e.g., FOR/NEXT loop - // records (without them going on the stack), GOSUB stack - // (same story), expression value cache? + ; Get top of memory. + ; If a cart is present, then it is $7FFF, + ; if not, then it is $F7FF, since we support having + ; programs and variables under ROM. + ; i.e., we support 56KB RAM for BASIC, keeping some space + ; free for some optimisation structures, e.g., FOR/NEXT loop + ; records (without them going on the stack), GOSUB stack + ; (same story), expression value cache? - sec // Read, not write value + sec ; Read, not write value jsr JMEMTOP cpx #$80 - beq !+ -#if CONFIG_MEMORY_MODEL_60K + beq @1 +!ifdef CONFIG_MEMORY_MODEL_60K { lda #>$F7FF -#elif CONFIG_MEMORY_MODEL_50K +} else ifdef CONFIG_MEMORY_MODEL_50K { lda #>$D000 -#elif CONFIG_MEMORY_MODEL_46K +} else ifdef CONFIG_MEMORY_MODEL_46K { lda #>$C000 -#else // CONFIG_MEMORY_MODEL_38K +} else { ; CONFIG_MEMORY_MODEL_38K lda #>$A000 -#endif - skip_2_bytes_trash_nvz -!: +} + +skip_2_bytes_trash_nvz +@1: lda #>$8000 sta MEMSIZ+1 -#if CONFIG_MEMORY_MODEL_60K +!ifdef CONFIG_MEMORY_MODEL_60K { cpx #$80 - beq !+ + beq @2 lda #$FF - skip_2_bytes_trash_nvz -!: + +skip_2_bytes_trash_nvz +@2: lda #<$00 -#else // CONFIG_MEMORY_MODEL_38K || CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K +} else { ; CONFIG_MEMORY_MODEL_38K || CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K lda #<$00 -#endif +} sta MEMSIZ+0 - // Print number of bytes free + ; Print number of bytes free sec lda MEMSIZ+0 diff --git a/src/basic/init/initmsg_m65.s b/src/basic/init/initmsg_m65.s index bbe77b95..baedbe52 100644 --- a/src/basic/init/initmsg_m65.s +++ b/src/basic/init/initmsg_m65.s @@ -1,22 +1,22 @@ -// #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# * * #IGNORE -// Routine is too long to fit in the original location +; Routine is too long to fit in the original location -// XXX banner-related code needs cleanup, move MEGA65 stuff to a separate file +; XXX banner-related code needs cleanup, move MEGA65 stuff to a separate file INITMSG: jsr INITMSG_main_banner - // Display additional information, depending on the mode + ; Display additional information, depending on the mode jsr M65_MODEGET - bcc !+ + bcc @1 - // Legacy C64 compatibility mode + ; Legacy C64 compatibility mode jsr INITMSG_partial @@ -24,8 +24,8 @@ INITMSG: jsr print_packed_misc_str bra INITMSG_end -!: - // Native mode +@1: + ; Native mode ldx #48 ldy #0 @@ -39,7 +39,7 @@ INITMSG: jsr print_sysinfo_banner jsr M65_SETWIN_N - // Native mode - display revision and available memory + ; Native mode - display revision and available memory ldx #$05 ldy #$00 @@ -53,7 +53,7 @@ INITMSG: jsr print_return jsr print_return - // FALLTROUGH + ; FALLTROUGH INITMSG_end: @@ -65,18 +65,18 @@ INITMSG_end: INITMSG_main_banner: - // Clear the screen first, some cartridges (like IEEE-488) are leaving a mess on the screen + ; Clear the screen first, some cartridges (like IEEE-488) are leaving a mess on the screen lda #147 jsr JCHROUT - // Display main banner + ; Display main banner lda #startup_banner jmp STROUT -INITMSG_autoswitch: // entry point for 'SYS command' +INITMSG_autoswitch: ; entry point for 'SYS command' jsr INITMSG_main_banner jsr INITMSG_partial @@ -89,7 +89,7 @@ INITMSG_partial: ldx #IDX__STR_ORS_LEGACY_1 jsr print_packed_misc_str - // FALLTROUGH + ; FALLTROUGH INITMSG_revision: diff --git a/src/basic/init/initmsg_real.s b/src/basic/init/initmsg_real.s index 8a38e3e6..57170601 100644 --- a/src/basic/init/initmsg_real.s +++ b/src/basic/init/initmsg_real.s @@ -1,24 +1,24 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// Routine is too long to fit in the original location +; Routine is too long to fit in the original location initmsg_real: - // Clear the screen first, some cartridges (like IEEE-488) are leaving a mess on the screen + ; Clear the screen first, some cartridges (like IEEE-488) are leaving a mess on the screen lda #147 jsr JCHROUT -#if CONFIG_BANNER_SIMPLE +!ifdef CONFIG_BANNER_SIMPLE { lda #startup_banner jsr STROUT -#if !CONFIG_BRAND_CUSTOM_BUILD +!ifndef CONFIG_BRAND_CUSTOM_BUILD { ldx #$01 ldy #$04 @@ -28,32 +28,32 @@ initmsg_real: ldy #>rom_revision_basic_string jsr STROUT -#endif // no CONFIG_BRAND_CUSTOM_BUILD +} ; no CONFIG_BRAND_CUSTOM_BUILD -#if !CONFIG_BRAND_CUSTOM_BUILD +!ifndef CONFIG_BRAND_CUSTOM_BUILD { ldx #$03 -#else +} else { ldx #$02 -#endif +} ldy #$04 jsr plot_set jsr initmsg_bytes_free -#if !CONFIG_BRAND_CUSTOM_BUILD +!ifndef CONFIG_BRAND_CUSTOM_BUILD { ldx #$06 -#else +} else { ldx #$05 -#endif +} ldy #$00 -#if CONFIG_SHOW_FEATURES +!ifdef CONFIG_SHOW_FEATURES { jsr plot_set jmp print_features -#else +} else { jmp plot_set -#endif +} -#elif CONFIG_BANNER_FANCY +} else ifdef CONFIG_BANNER_FANCY { lda #rainbow_logo @@ -67,7 +67,7 @@ initmsg_real: ldy #>startup_banner jsr STROUT -#if !CONFIG_BRAND_CUSTOM_BUILD +!ifndef CONFIG_BRAND_CUSTOM_BUILD { ldx #$01 ldy #$0A @@ -80,29 +80,29 @@ initmsg_real: ldy #>rom_revision_basic_string jsr STROUT -#endif // no CONFIG_BRAND_CUSTOM_BUILD +} ; no CONFIG_BRAND_CUSTOM_BUILD -#if !CONFIG_BRAND_CUSTOM_BUILD +!ifndef CONFIG_BRAND_CUSTOM_BUILD { ldx #$03 -#else +} else { ldx #$02 -#endif +} ldy #$0A jsr plot_set jsr initmsg_bytes_free -#if !CONFIG_BRAND_CUSTOM_BUILD +!ifndef CONFIG_BRAND_CUSTOM_BUILD { ldx #$06 -#else +} else { ldx #$05 -#endif +} ldy #$00 -#if CONFIG_SHOW_FEATURES +!ifdef CONFIG_SHOW_FEATURES { jsr plot_set jmp print_features -#else +} else { jmp plot_set -#endif +} -#endif +} diff --git a/src/basic/math/add_FAC2_FAC1_sub.s b/src/basic/math/add_FAC2_FAC1_sub.s index a045e1b8..d2fe2da1 100644 --- a/src/basic/math/add_FAC2_FAC1_sub.s +++ b/src/basic/math/add_FAC2_FAC1_sub.s @@ -1,46 +1,46 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - add FAC2 to FAC1, subtraction part -// +; +; Math package - add FAC2 to FAC1, subtraction part +; -// XXX test this +; XXX test this add_FAC2_FAC1_sub: - // First verify that |FAC1| > |FAC2|, branch to proper variant if it is not - // We ignore FACOV here. Note, that exponents are already equalized + ; First verify that |FAC1| > |FAC2|, branch to proper variant if it is not + ; We ignore FACOV here. Note, that exponents are already equalized lda FAC1_mantissa+0 cmp FAC2_mantissa+0 - bcc add_FAC2_FAC1_sub_rev // if FAC1 < FAC2, branch - bne !+ // if FAC1 > FAC2, branch + bcc add_FAC2_FAC1_sub_rev ; if FAC1 < FAC2, branch + bne @1 ; if FAC1 > FAC2, branch lda FAC1_mantissa+1 cmp FAC2_mantissa+1 - bcc add_FAC2_FAC1_sub_rev // if FAC1 < FAC2, branch - bne !+ // if FAC1 > FAC2, branch + bcc add_FAC2_FAC1_sub_rev ; if FAC1 < FAC2, branch + bne @1 ; if FAC1 > FAC2, branch lda FAC1_mantissa+2 cmp FAC2_mantissa+2 - bcc add_FAC2_FAC1_sub_rev // if FAC1 < FAC2, branch - bne !+ // if FAC1 > FAC2, branch + bcc add_FAC2_FAC1_sub_rev ; if FAC1 < FAC2, branch + bne @1 ; if FAC1 > FAC2, branch lda FAC1_mantissa+3 cmp FAC2_mantissa+3 - bcc add_FAC2_FAC1_sub_rev // if FAC1 < FAC2, branch - bne !+ // if FAC1 > FAC2, branch + bcc add_FAC2_FAC1_sub_rev ; if FAC1 < FAC2, branch + bne @1 ; if FAC1 > FAC2, branch - // If we are here, than FAC1 is equal to FAC2 - so just set FAC1 to 0 + ; If we are here, than FAC1 is equal to FAC2 - so just set FAC1 to 0 lda #$00 sta FAC1_exponent rts -!: - // Perform the subtration, FAC1 = FAC1 - FAC2 +@1: + ; Perform the subtration, FAC1 = FAC1 - FAC2 sec lda FAC1_mantissa+3 @@ -59,17 +59,17 @@ add_FAC2_FAC1_sub: sbc FAC2_mantissa+0 sta FAC1_mantissa+0 - // Exponent should never need adaptation here + ; Exponent should never need adaptation here jmp normal_FAC1 add_FAC2_FAC1_sub_rev: - // Since |FAC1| < |FAC2|, toggle FAC1 sign before subtraction + ; Since |FAC1| < |FAC2|, toggle FAC1 sign before subtraction jsr toggle_sign_FAC1_skipcheck - // Perform the subtration, FAC1 = FAC2 - FAC1 + ; Perform the subtration, FAC1 = FAC2 - FAC1 sec lda #$00 @@ -92,6 +92,6 @@ add_FAC2_FAC1_sub_rev: sbc FAC1_mantissa+0 sta FAC1_mantissa+0 - // Exponent should never need adaptation here + ; Exponent should never need adaptation here jmp normal_FAC1 diff --git a/src/basic/math/add_align_exponents.s b/src/basic/math/add_align_exponents.s index 882cb337..2060e0a9 100644 --- a/src/basic/math/add_align_exponents.s +++ b/src/basic/math/add_align_exponents.s @@ -1,44 +1,44 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - align FAC1 and FAC2 exponents for addition -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 115 -// - https://www.c64-wiki.com/wiki/BASIC-ROM +; +; Math package - align FAC1 and FAC2 exponents for addition +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 115 +; - https://www.c64-wiki.com/wiki/BASIC-ROM add_align_exponents: - // XXX assume here none of the exponents is 0, check if this is true for orignal ROMs + ; XXX assume here none of the exponents is 0, check if this is true for orignal ROMs lda FAC1_exponent cmp FAC2_exponent - beq add_align_exponents_done // branch if exponents the same + beq add_align_exponents_done ; branch if exponents the same bcs add_align_exponent_FAC2 - // FALLTROUGH + ; FALLTROUGH add_align_exponent_FAC1: - // First check the exponent difference + ; First check the exponent difference lda FAC2_exponent sec sbc FAC1_exponent cmp #$28 - bcs add_align_exponent_FAC1_zero // branch if difference is very high + bcs add_align_exponent_FAC1_zero ; branch if difference is very high cmp #$08 bcc add_align_exponent_FAC1_bit - // FALLTROUGH + ; FALLTROUGH add_align_exponent_FAC1_byte: - // Add 8 to exponent, divide mantissa by 256 + ; Add 8 to exponent, divide mantissa by 256 lda FAC1_exponent clc @@ -56,11 +56,11 @@ add_align_exponent_FAC1_byte: lda #$00 sta FAC1_mantissa+0 - beq add_align_exponent_FAC1 // branch always - next iteration + beq add_align_exponent_FAC1 ; branch always - next iteration add_align_exponent_FAC1_bit: - // Increment exponent, divide mantissa by 2 + ; Increment exponent, divide mantissa by 2 inc FAC1_exponent @@ -73,7 +73,7 @@ add_align_exponent_FAC1_bit: lda FAC1_exponent cmp FAC2_exponent - bne add_align_exponent_FAC1_bit // branch if next iteration needed + bne add_align_exponent_FAC1_bit ; branch if next iteration needed rts @@ -90,7 +90,7 @@ add_align_exponent_FAC1_zero: lda FAC2_exponent sta FAC1_exponent - // FALLTROUGH + ; FALLTROUGH add_align_exponents_done: @@ -100,22 +100,22 @@ add_align_exponents_done: add_align_exponent_FAC2: - // First check the exponent difference, Carry already set here + ; First check the exponent difference, Carry already set here lda FAC1_exponent sbc FAC2_exponent cmp #$20 - bcs add_align_exponent_FAC2_zero // branch if difference is very high + bcs add_align_exponent_FAC2_zero ; branch if difference is very high cmp #$08 bcc add_align_exponent_FAC2_bit - // FALLTROUGH + ; FALLTROUGH add_align_exponent_FAC2_byte: - // Add 8 to exponent, divide mantissa by 256 + ; Add 8 to exponent, divide mantissa by 256 lda FAC2_exponent clc @@ -131,11 +131,11 @@ add_align_exponent_FAC2_byte: lda #$00 sta FAC2_mantissa+0 - beq add_align_exponent_FAC2 // branch always - next iteration + beq add_align_exponent_FAC2 ; branch always - next iteration add_align_exponent_FAC2_bit: - // Increment exponent, divide mantissa by 2 + ; Increment exponent, divide mantissa by 2 inc FAC2_exponent @@ -147,7 +147,7 @@ add_align_exponent_FAC2_bit: lda FAC1_exponent cmp FAC2_exponent - bne add_align_exponent_FAC2_bit // branch if next iteration needed + bne add_align_exponent_FAC2_bit ; branch if next iteration needed rts diff --git a/src/basic/math/b849.add_HALF_FAC1.s b/src/basic/math/b849.add_HALF_FAC1.s index 76f21ff0..adb72fe7 100644 --- a/src/basic/math/b849.add_HALF_FAC1.s +++ b/src/basic/math/b849.add_HALF_FAC1.s @@ -1,13 +1,13 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - add 0.5 to FAC1 -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 112 +; +; Math package - add 0.5 to FAC1 +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 112 add_HALF_FAC1: diff --git a/src/basic/math/b850.sub_MEM_FAC1.s b/src/basic/math/b850.sub_MEM_FAC1.s index 72281c92..c1d759d6 100644 --- a/src/basic/math/b850.sub_MEM_FAC1.s +++ b/src/basic/math/b850.sub_MEM_FAC1.s @@ -1,23 +1,23 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - subtract FAC1 from memory variable -// -// Input: -// - .A - address low byte -// - .Y - address high byte -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 112 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - subtract FAC1 from memory variable +; +; Input: +; - .A - address low byte +; - .Y - address high byte +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 112 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; sub_MEM_FAC1: jsr mov_MEM_FAC2 - // FALLTROUGH to sub_FAC2_FAC1 + ; FALLTROUGH to sub_FAC2_FAC1 diff --git a/src/basic/math/b853.sub_FAC2_FAC1.s b/src/basic/math/b853.sub_FAC2_FAC1.s index e54a85a9..e2ce7e04 100644 --- a/src/basic/math/b853.sub_FAC2_FAC1.s +++ b/src/basic/math/b853.sub_FAC2_FAC1.s @@ -1,25 +1,25 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - subtract FAC1 from FAC2 -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 112 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - subtract FAC1 from FAC2 +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 112 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; -// XXX test this +; XXX test this sub_FAC2_FAC1: - // Toggle FAC1 sign + ; Toggle FAC1 sign lda FAC1_sign eor #$FF sta FAC1_sign - // Perform addition + ; Perform addition jmp add_FAC2_FAC1 diff --git a/src/basic/math/b862.add_align_exponent.jmp.s b/src/basic/math/b862.add_align_exponent.jmp.s index 03fef8c3..31973617 100644 --- a/src/basic/math/b862.add_align_exponent.jmp.s +++ b/src/basic/math/b862.add_align_exponent.jmp.s @@ -1,9 +1,9 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// Just a compatibility jump - our routine is longer than original one +; Just a compatibility jump - our routine is longer than original one jmp add_align_exponents diff --git a/src/basic/math/b867.add_MEM_FAC1.s b/src/basic/math/b867.add_MEM_FAC1.s index 1d948ee0..87f33af4 100644 --- a/src/basic/math/b867.add_MEM_FAC1.s +++ b/src/basic/math/b867.add_MEM_FAC1.s @@ -1,23 +1,23 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - add memory variable to FAC1 -// -// Input: -// - .A - address low byte -// - .Y - address high byte -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 112 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - add memory variable to FAC1 +; +; Input: +; - .A - address low byte +; - .Y - address high byte +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 112 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; add_MEM_FAC1: jsr mov_MEM_FAC2 - // FALLTROUGH to add_FAC2_FAC1 + ; FALLTROUGH to add_FAC2_FAC1 diff --git a/src/basic/math/b86a.add_FAC2_FAC1.s b/src/basic/math/b86a.add_FAC2_FAC1.s index 9ae04a29..2ea751ae 100644 --- a/src/basic/math/b86a.add_FAC2_FAC1.s +++ b/src/basic/math/b86a.add_FAC2_FAC1.s @@ -1,49 +1,49 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - add FAC2 to FAC1 -// -// Input: -// - .A - must load FAC1 exponent ($61) beforehand to set the zero flag -// -// Note: -// - load FAC2 after FAC1, or mimic the Kernals sign comparison (XXX do we need it?) -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 112 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - add FAC2 to FAC1 +; +; Input: +; - .A - must load FAC1 exponent ($61) beforehand to set the zero flag +; +; Note: +; - load FAC2 after FAC1, or mimic the Kernals sign comparison (XXX do we need it?) +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 112 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; -// XXX test this +; XXX test this add_FAC2_FAC1: - // Check if FAC2 is 0; if so leave FAC1 without changes + ; Check if FAC2 is 0; if so leave FAC1 without changes lda FAC2_exponent beq add_FAC2_FAC1_done - // If FAC1 is 0, if so just copy FAC2 to FAC1 + ; If FAC1 is 0, if so just copy FAC2 to FAC1 lda FAC1_exponent - beq_16 mov_FAC2_FAC1 + +beq mov_FAC2_FAC1 - // Make sure the exponents are aligned + ; Make sure the exponents are aligned jsr add_align_exponents - // Check whether signs are the same + ; Check whether signs are the same lda FAC1_sign eor FAC2_sign - bmi_16 add_FAC2_FAC1_sub // branch if signs are opposite + +bmi add_FAC2_FAC1_sub ; branch if signs are opposite - // Perform the addition + ; Perform the addition clc lda FAC2_mantissa+3 @@ -62,14 +62,14 @@ add_FAC2_FAC1: adc FAC1_mantissa+0 sta FAC1_mantissa+0 - bcc_16 normal_FAC1 // end if no need to adapt the exponent + +bcc normal_FAC1 ; end if no need to adapt the exponent inc FAC1_exponent - bne add_FAC2_FAC1_adapt_mantissa // end if no overflow + bne add_FAC2_FAC1_adapt_mantissa ; end if no overflow - // FALLTROUGH + ; FALLTROUGH -set_FAC1_max: // entry used by other routines too +set_FAC1_max: ; entry used by other routines too lda #$FF sta FAC1_exponent @@ -78,7 +78,7 @@ set_FAC1_max: // entry used by other routines too sta FAC1_mantissa+1 sta FAC1_mantissa+0 - // FALLTROUGH + ; FALLTROUGH add_FAC2_FAC1_done: diff --git a/src/basic/math/b8fe.normal_FAC1.jmp.s b/src/basic/math/b8fe.normal_FAC1.jmp.s index e40972f8..be867799 100644 --- a/src/basic/math/b8fe.normal_FAC1.jmp.s +++ b/src/basic/math/b8fe.normal_FAC1.jmp.s @@ -1,8 +1,8 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// Just a compatibility jump - our routine is longer than original one +; Just a compatibility jump - our routine is longer than original one jmp normal_FAC1 diff --git a/src/basic/math/ba28.mul_MEM_FAC1.jmp.s b/src/basic/math/ba28.mul_MEM_FAC1.jmp.s index 02a35b91..9c927026 100644 --- a/src/basic/math/ba28.mul_MEM_FAC1.jmp.s +++ b/src/basic/math/ba28.mul_MEM_FAC1.jmp.s @@ -1,26 +1,26 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - multiplies FAC1 by RAM -// -// Input: -// - .A - address low byte -// - .Y - address high byte -// -// Note: -// - C64 Wiki calls it FMULT, this looks like a mistake -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 113 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - multiplies FAC1 by RAM +; +; Input: +; - .A - address low byte +; - .Y - address high byte +; +; Note: +; - C64 Wiki calls it FMULT, this looks like a mistake +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 113 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; mul_MEM_FAC1: jsr mov_MEM_FAC2 - // FALLTROUGH to mul_FAC2_FAC1 + ; FALLTROUGH to mul_FAC2_FAC1 diff --git a/src/basic/math/ba2b.mul_FAC2_FAC1.s b/src/basic/math/ba2b.mul_FAC2_FAC1.s index 1b918524..e3ddc14a 100644 --- a/src/basic/math/ba2b.mul_FAC2_FAC1.s +++ b/src/basic/math/ba2b.mul_FAC2_FAC1.s @@ -1,8 +1,8 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// Just a compatibility jump - our routine is longer than original one +; Just a compatibility jump - our routine is longer than original one jmp mul_FAC2_FAC1 diff --git a/src/basic/math/ba8c.mov_MEM_FAC2.jmp.s b/src/basic/math/ba8c.mov_MEM_FAC2.jmp.s index d556073a..2238045e 100644 --- a/src/basic/math/ba8c.mov_MEM_FAC2.jmp.s +++ b/src/basic/math/ba8c.mov_MEM_FAC2.jmp.s @@ -1,8 +1,8 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// Just a compatibility jump - our routine is longer than original one +; Just a compatibility jump - our routine is longer than original one jmp mov_MEM_FAC2 diff --git a/src/basic/math/bae2.mul10_FAC1.s b/src/basic/math/bae2.mul10_FAC1.s index 5b20e8a7..6eb6b434 100644 --- a/src/basic/math/bae2.mul10_FAC1.s +++ b/src/basic/math/bae2.mul10_FAC1.s @@ -1,38 +1,38 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - multiply FAC1 by 10 -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 114 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - multiply FAC1 by 10 +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 114 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; mul10_FAC1: - // Handle special case of FAC1 equal 0 + ; Handle special case of FAC1 equal 0 lda FAC1_exponent beq mul10_FAC1_done - // Start by multiplying FAC1 by 2 + ; Start by multiplying FAC1 by 2 jsr mul10_FAC1_mul2 - // Move FAC1 to FAC2, so that FAC1 = FAC2 = 2 * initial + ; Move FAC1 to FAC2, so that FAC1 = FAC2 = 2 * initial jsr mov_FAC1_FAC2 - // Multiply FAC1 by 4 + ; Multiply FAC1 by 4 jsr mul10_FAC1_mul2 jsr mul10_FAC1_mul2 - // Now we have FAC1 = 8 * initial and FAC2 = 2 * initial; so just add these 2 values + ; Now we have FAC1 = 8 * initial and FAC2 = 2 * initial; so just add these 2 values jmp add_FAC2_FAC1 diff --git a/src/basic/math/bafe.div10_FAC1_p.s b/src/basic/math/bafe.div10_FAC1_p.s index 0c1af809..a13dd084 100644 --- a/src/basic/math/bafe.div10_FAC1_p.s +++ b/src/basic/math/bafe.div10_FAC1_p.s @@ -1,22 +1,22 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - divide FAC1 by 10, result is always positive -// -// Notes: -// - shifts FAC1 to FAC2, loads FAC1 with the constant 10, falls through to the division routine +; +; Math package - divide FAC1 by 10, result is always positive +; +; Notes: +; - shifts FAC1 to FAC2, loads FAC1 with the constant 10, falls through to the division routine -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 114 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 114 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; -// XXX test this +; XXX test this div10_FAC1_p: diff --git a/src/basic/math/bb0f.div_MEM_FAC1.s b/src/basic/math/bb0f.div_MEM_FAC1.s index 2863958a..79b15cef 100644 --- a/src/basic/math/bb0f.div_MEM_FAC1.s +++ b/src/basic/math/bb0f.div_MEM_FAC1.s @@ -1,23 +1,23 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - divide RAM by FAC1 -// -// Input: -// - .A - address low byte -// - .Y - address high byte -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 114 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - divide RAM by FAC1 +; +; Input: +; - .A - address low byte +; - .Y - address high byte +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 114 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; div_MEM_FAC1: jsr mov_MEM_FAC2 - // FALLTROUGH to div_FAC2_FAC1 + ; FALLTROUGH to div_FAC2_FAC1 diff --git a/src/basic/math/bb12.div_FAC2_FAC1.s b/src/basic/math/bb12.div_FAC2_FAC1.s index 5bbf09d9..80efb11f 100644 --- a/src/basic/math/bb12.div_FAC2_FAC1.s +++ b/src/basic/math/bb12.div_FAC2_FAC1.s @@ -1,75 +1,75 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - divide FAC2 (dividend) by FAC1 (divisor) -// -// Input: -// - .A - must load FAC1 exponent ($61) beforehand to set the zero flag (but our routine does not need this) -// -// Output: -// - FAC1 -// -// Note: -// - some documentation suggest this is a division leaving quotient and remainder (left in FAC2), -// but it seems (experimentation) that this is not true -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 114 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - divide FAC2 (dividend) by FAC1 (divisor) +; +; Input: +; - .A - must load FAC1 exponent ($61) beforehand to set the zero flag (but our routine does not need this) +; +; Output: +; - FAC1 +; +; Note: +; - some documentation suggest this is a division leaving quotient and remainder (left in FAC2), +; but it seems (experimentation) that this is not true +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 114 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; div_FAC2_FAC1: - // 'Pamiętaj, cholero - nie dziel przez zero!' - ancient polish proverb + ; 'Pamiętaj, cholero - nie dziel przez zero!' - ancient polish proverb lda FAC1_exponent - beq_16 do_DIVISION_BY_ZERO_error + +beq do_DIVISION_BY_ZERO_error - // Handle special case - dividing 0 by non-zero value + ; Handle special case - dividing 0 by non-zero value lda FAC2_exponent - beq_16 set_FAC1_zero + +beq set_FAC1_zero - // Multiply signs + ; Multiply signs lda FAC1_sign eor FAC2_sign sta FAC1_sign - // Subtract the exponents + ; Subtract the exponents - lda #$A0 // correction for bias and FAC2 digits + lda #$A0 ; correction for bias and FAC2 digits sta RESHO+0 lda #$00 sta RESHO+1 - lda FAC2_exponent // add FAC2 exponent to temporary variable + lda FAC2_exponent ; add FAC2 exponent to temporary variable jsr muldiv_RESHO_01_add_A - lda RESHO+0 // subtract FAC1 exponent from temporary variable + lda RESHO+0 ; subtract FAC1 exponent from temporary variable sec sbc FAC1_exponent sta RESHO+0 - bcs !+ + bcs @1 dec RESHO+1 - !: +@1: lda RESHO+1 - bmi_16 set_FAC1_zero // result too low, set 0 and quit + +bmi set_FAC1_zero ; result too low, set 0 and quit lda RESHO+0 sta FAC1_exponent - // Divide the mantissas + ; Divide the mantissas jsr div_FAC1_denorm jsr muldiv_RESHO_set_0 jsr div_mantissas - // Copy the result to FAC1 - XXX we probably already have similar code somewhere... + ; Copy the result to FAC1 - XXX we probably already have similar code somewhere... lda FAC2_mantissa+3 sta FAC1_mantissa+3 @@ -80,6 +80,6 @@ div_FAC2_FAC1: lda FAC2_mantissa+0 sta FAC1_mantissa+0 - // Normalize and quit + ; Normalize and quit jmp normal_FAC1 diff --git a/src/basic/math/bc1b.round_FAC1.jmp.s b/src/basic/math/bc1b.round_FAC1.jmp.s index 6658d65e..47f8b624 100644 --- a/src/basic/math/bc1b.round_FAC1.jmp.s +++ b/src/basic/math/bc1b.round_FAC1.jmp.s @@ -1,9 +1,9 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// Just a compatibility jump - our routine is longer than original one +; Just a compatibility jump - our routine is longer than original one jmp round_FAC1 diff --git a/src/basic/math/bc2b.sgn_FAC1_A.s b/src/basic/math/bc2b.sgn_FAC1_A.s index 66f449e6..0fb477ce 100644 --- a/src/basic/math/bc2b.sgn_FAC1_A.s +++ b/src/basic/math/bc2b.sgn_FAC1_A.s @@ -1,26 +1,26 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - evaluate FAC1 sign, to .A -// -// Output: -// - .A - 0 for FAC1 equal 0, 1 for FAC1 > 0, -1 for FAC1 < 0 -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 115 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - evaluate FAC1 sign, to .A +; +; Output: +; - .A - 0 for FAC1 equal 0, 1 for FAC1 > 0, -1 for FAC1 < 0 +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 115 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; sgn_FAC1_A: lda FAC1_exponent - beq !+ + beq @1 lda FAC1_sign - bne !+ + bne @1 lda #$01 -!: +@1: rts diff --git a/src/basic/math/bf71.sqr_FAC1.s b/src/basic/math/bf71.sqr_FAC1.s index a670c052..aa43da5e 100644 --- a/src/basic/math/bf71.sqr_FAC1.s +++ b/src/basic/math/bf71.sqr_FAC1.s @@ -1,22 +1,22 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - square root of FAC1 -// -// Note: -// - transfers FAC1 to FAC2 and falls through to SQR2 -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 117 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - square root of FAC1 +; +; Note: +; - transfers FAC1 to FAC2 and falls through to SQR2 +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 117 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; sqr_FAC1: jsr mov_FAC1_FAC2 - // FALLLTROUGH to sqr_FAC2 + ; FALLLTROUGH to sqr_FAC2 diff --git a/src/basic/math/bf78.pwr_FAC2_MEM.s b/src/basic/math/bf78.pwr_FAC2_MEM.s index 8b785204..eebadd3a 100644 --- a/src/basic/math/bf78.pwr_FAC2_MEM.s +++ b/src/basic/math/bf78.pwr_FAC2_MEM.s @@ -1,24 +1,24 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - set FAC1 as RAM raised to the power of FAC2 -// -// Input: -// - .A - address low byte -// - .Y - address high byte -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 117 (FPWRT) -// - https://www.c64-wiki.com/wiki/BASIC-ROM -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - set FAC1 as RAM raised to the power of FAC2 +; +; Input: +; - .A - address low byte +; - .Y - address high byte +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 117 (FPWRT) +; - https://www.c64-wiki.com/wiki/BASIC-ROM +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; pwr_FAC2_MEM: jsr mov_MEM_FAC1 - // FALLTROUGH to pwr_FAC2_FAC1 + ; FALLTROUGH to pwr_FAC2_FAC1 diff --git a/src/basic/math/bfb4.toggle_sign_FAC1.s b/src/basic/math/bfb4.toggle_sign_FAC1.s index d3fa428a..c3b7b079 100644 --- a/src/basic/math/bfb4.toggle_sign_FAC1.s +++ b/src/basic/math/bfb4.toggle_sign_FAC1.s @@ -1,27 +1,31 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - toggle FAC1 sign (if not 0) -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 117 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// +; +; Math package - toggle FAC1 sign (if not 0) +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 117 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; toggle_sign_FAC1: lda FAC1_exponent - beq !+ // do not toggle the sign if value is 0 + beq toggle_sign_FAC1_end ; do not toggle the sign if value is 0 - // FALLTROUGH + ; FALLTROUGH -toggle_sign_FAC1_skipcheck: // entry for other routines +toggle_sign_FAC1_skipcheck: ; entry for other routines lda FAC1_sign eor #$FF sta FAC1_sign -!: + + ; FALLTROUGH + +toggle_sign_FAC1_end: + rts diff --git a/src/basic/math/div_FAC1_denorm.s b/src/basic/math/div_FAC1_denorm.s index 9e8bc371..81f779a8 100644 --- a/src/basic/math/div_FAC1_denorm.s +++ b/src/basic/math/div_FAC1_denorm.s @@ -1,33 +1,33 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - denormalize FAC1 mantissa and adapt its exponent accordingly for division -// +; +; Math package - denormalize FAC1 mantissa and adapt its exponent accordingly for division +; div_FAC1_denorm: - // Set FACOV to 0, no need for increased precision here + ; Set FACOV to 0, no need for increased precision here lda #$00 sta FACOV - // Start by moving whole bytes, if possible + ; Start by moving whole bytes, if possible lda FAC1_mantissa+3 - bne div_FAC1_denorm_by_bit // branch if last byte of mantissa is non-zero + bne div_FAC1_denorm_by_bit ; branch if last byte of mantissa is non-zero lda FAC1_exponent cmp #$08 - bcc div_FAC1_denorm_by_bit // branch if not suitable to increment exponent by 8 + bcc div_FAC1_denorm_by_bit ; branch if not suitable to increment exponent by 8 - // Increment exponent + ; Increment exponent - sbc #$08 // Carry already sec + sbc #$08 ; Carry already sec sta FAC1_exponent - // Move mantissa bytes + ; Move mantissa bytes lda FAC1_mantissa+2 sta FAC1_mantissa+3 @@ -38,22 +38,22 @@ div_FAC1_denorm: lda #$00 sta FAC1_mantissa+0 - beq div_FAC1_denorm // branch always + beq div_FAC1_denorm ; branch always div_FAC1_denorm_by_bit: lda FAC1_mantissa+3 and #$01 - bne div_FAC1_denorm_done // branch if lowest bit of mantissa is already 1 + bne div_FAC1_denorm_done ; branch if lowest bit of mantissa is already 1 lda FAC1_exponent - beq div_FAC1_denorm_done // branch if not suitable to decrement exponent + beq div_FAC1_denorm_done ; branch if not suitable to decrement exponent - // Decrement exponent + ; Decrement exponent dec FAC1_exponent - // Move mantissa bits + ; Move mantissa bits clc ror FAC1_mantissa+0 @@ -61,7 +61,7 @@ div_FAC1_denorm_by_bit: ror FAC1_mantissa+2 ror FAC1_mantissa+3 - bcc div_FAC1_denorm_by_bit // branch always + bcc div_FAC1_denorm_by_bit ; branch always div_FAC1_denorm_done: diff --git a/src/basic/math/div_mantissas.s b/src/basic/math/div_mantissas.s index 06c274aa..eb064082 100644 --- a/src/basic/math/div_mantissas.s +++ b/src/basic/math/div_mantissas.s @@ -1,41 +1,41 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// Math package - 32-bit mantissa division, based on code by Verz -// -// divident: FAC2_mantissa, divisor: FAC1_mantissa (without FACOV), result: FAC2_mantissa, remainder: RESHO -// temporary storage: INDEX+0, INDEX+1, INDEX+2, INDEX+3 -// -// RESHO (remainder) should be set to 0 before -// -// see https://codebase64.org/doku.php?id=base:24bit_division_24-bit_result +; Math package - 32-bit mantissa division, based on code by Verz +; +; divident: FAC2_mantissa, divisor: FAC1_mantissa (without FACOV), result: FAC2_mantissa, remainder: RESHO +; temporary storage: INDEX+0, INDEX+1, INDEX+2, INDEX+3 +; +; RESHO (remainder) should be set to 0 before +; +; see https://codebase64.org/doku.php?id=base:24bit_division_24-bit_result -// XXX test this +; XXX test this div_mantissas: - ldx #32 // repeat for each bit + ldx #32 ; repeat for each bit - // FALLTROUGH + ; FALLTROUGH div_mantissas_loop: - // Multiply divident by 2, msb -> Carry + ; Multiply divident by 2, msb -> Carry asl FAC2_mantissa+3 rol FAC2_mantissa+2 rol FAC2_mantissa+1 rol FAC2_mantissa+0 - // Multiply remainder by 2, lsb <- Carry + ; Multiply remainder by 2, lsb <- Carry rol RESHO+3 rol RESHO+2 rol RESHO+1 rol RESHO+0 - // Subtract divisor from the remainder, result to INDEX and .Y + ; Subtract divisor from the remainder, result to INDEX and .Y sec lda RESHO+3 @@ -53,10 +53,10 @@ div_mantissas_loop: lda RESHO+0 sbc FAC1_mantissa+0 - bcc div_mantissas_skip // if Carry is not set then divisor did not fit in remainder yet + bcc div_mantissas_skip ; if Carry is not set then divisor did not fit in remainder yet sta INDEX+0 - // Save subtraction result as new remainder + ; Save subtraction result as new remainder lda INDEX+3 sta RESHO+3 @@ -70,11 +70,11 @@ div_mantissas_loop: lda INDEX+0 sta RESHO+0 - // Increment result cause divisor fit in 1 times + ; Increment result cause divisor fit in 1 times inc FAC2_mantissa+3 - // FALLTROUGH + ; FALLTROUGH div_mantissas_skip: diff --git a/src/basic/math/e097.rnd_FAC1.s b/src/basic/math/e097.rnd_FAC1.s index 0091fe7f..09749b97 100644 --- a/src/basic/math/e097.rnd_FAC1.s +++ b/src/basic/math/e097.rnd_FAC1.s @@ -1,20 +1,20 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Random number generator routine -// -// Input: -// - FAC1 (0 - reinitialize the seed with random value, negative - create seed from FAC1) -// -// Output: -// - FAC1 -// +; +; Random number generator routine +; +; Input: +; - FAC1 (0 - reinitialize the seed with random value, negative - create seed from FAC1) +; +; Output: +; - FAC1 +; rnd_FAC1: jsr sgn_FAC1_A - // FALLTROUGH to rnd_A + ; FALLTROUGH to rnd_A diff --git a/src/basic/math/e09a.rnd_A.s b/src/basic/math/e09a.rnd_A.s index 1bb428f8..a3bc25ad 100644 --- a/src/basic/math/e09a.rnd_A.s +++ b/src/basic/math/e09a.rnd_A.s @@ -1,26 +1,26 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Random number generator routine -// -// Input: -// - .A (0 - reinitialize the seed with random value, $80 or above - create seed from FAC1) -// -// Output: -// - FAC1 -// -// See also: -// - https://www.atarimagazines.com/compute/issue72/random_numbers.php -// +; +; Random number generator routine +; +; Input: +; - .A (0 - reinitialize the seed with random value, $80 or above - create seed from FAC1) +; +; Output: +; - FAC1 +; +; See also: +; - https://www.atarimagazines.com/compute/issue72/random_numbers.php +; rnd_A: cmp #$00 - beq_16 rnd_seed_init + +beq rnd_seed_init cmp #$80 - bcc_16 rnd_generate + +bcc rnd_generate jmp rnd_seed_from_FAC1 diff --git a/src/basic/math/e0be.rnd_generate.s b/src/basic/math/e0be.rnd_generate.s index f33e2921..1692c0f6 100644 --- a/src/basic/math/e0be.rnd_generate.s +++ b/src/basic/math/e0be.rnd_generate.s @@ -1,17 +1,17 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// A fast pseudorandom generator, modified idea from: -// - https://codebase64.org/doku.php?id=base:32bit_galois_lfsr -// -// Output: -// - FAC1 -// -// See also: -// - https://www.atarimagazines.com/compute/issue72/random_numbers.php -// +; +; A fast pseudorandom generator, modified idea from: +; - https://codebase64.org/doku.php?id=base:32bit_galois_lfsr +; +; Output: +; - FAC1 +; +; See also: +; - https://www.atarimagazines.com/compute/issue72/random_numbers.php +; rnd_generate: @@ -38,13 +38,13 @@ rnd_generate: eor #$04 sta RNDX+4 - sec // make sure Carry is always set, for adc + sec ; make sure Carry is always set, for adc - // FALLTROUGH + ; FALLTROUGH rnd_generate_copy: - // Copy the generated number to FAC1, mangle it a little + ; Copy the generated number to FAC1, mangle it a little lda RNDX+3 adc #$C6 @@ -63,7 +63,7 @@ rnd_generate_copy: rol sta FAC1_mantissa+3 - // FALLTROUGH + ; FALLTROUGH rnd_generate_finalize: @@ -71,7 +71,7 @@ rnd_generate_finalize: sta FAC1_sign lda #$80 - sta FACOV // just to prevent 0 after normalization + sta FACOV ; just to prevent 0 after normalization sta FAC1_exponent jmp normal_FAC1 diff --git a/src/basic/math/mul10_FAC1_mul2.s b/src/basic/math/mul10_FAC1_mul2.s index 55b8f160..4498a60d 100644 --- a/src/basic/math/mul10_FAC1_mul2.s +++ b/src/basic/math/mul10_FAC1_mul2.s @@ -1,16 +1,16 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Multiply FAC1 by 2, do not normalize -// +; +; Multiply FAC1 by 2, do not normalize +; mul10_FAC1_mul2: - // Increment the exponent + ; Increment the exponent inc FAC1_exponent - beq_16 set_FAC1_max + +beq set_FAC1_max rts diff --git a/src/basic/math/mul_FAC2_FAC1.s b/src/basic/math/mul_FAC2_FAC1.s index 20cafdd0..64112040 100644 --- a/src/basic/math/mul_FAC2_FAC1.s +++ b/src/basic/math/mul_FAC2_FAC1.s @@ -1,21 +1,21 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - multiplies FAC1 by FAC2 -// -// Input: -// - .A - must load FAC1 exponent ($61) beforehand to set the zero flag -// -// Note: -// - load FAC2 after FAC1, or mimic the Kernals sign comparison (XXX do we need it?) -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 113 XXX address does not match -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - multiplies FAC1 by FAC2 +; +; Input: +; - .A - must load FAC1 exponent ($61) beforehand to set the zero flag +; +; Note: +; - load FAC2 after FAC1, or mimic the Kernals sign comparison (XXX do we need it?) +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 113 XXX address does not match +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; set_FAC1_zero: @@ -28,23 +28,23 @@ mul_FAC2_FAC1_done: mul_FAC2_FAC1: - // First handle special case of multiplying by 0 + ; First handle special case of multiplying by 0 lda FAC1_exponent beq mul_FAC2_FAC1_done lda FAC2_exponent - bne !+ + bne @1 sta FAC1_exponent beq mul_FAC2_FAC1_done -!: - // Multiply signs +@1: + ; Multiply signs lda FAC1_sign eor FAC2_sign sta FAC1_sign - // Add the exponents (subtract the bias) - XXX can this be optimized somehow? + ; Add the exponents (subtract the bias) - XXX can this be optimized somehow? jsr muldiv_RESHO_set_0 @@ -55,58 +55,58 @@ mul_FAC2_FAC1: jsr muldiv_RESHO_01_add_A lda RESHO+0 - sbc #$80 // we need to correct double BIAS + sbc #$80 ; we need to correct double BIAS sta RESHO+0 - bcs !+ + bcs @2 lda RESHO+1 sbc #$00 bcc set_FAC1_zero sta RESHO+1 -!: +@2: lda RESHO+1 - bne_16 set_FAC1_max // overflow + +bne set_FAC1_max ; overflow lda RESHO+0 sta FAC1_exponent - // Multiply the mantissas + ; Multiply the mantissas jsr muldiv_RESHO_set_0 clc - // XXX maybe we should preserve .X on stack? this will not cost us too much + ; XXX maybe we should preserve .X on stack? this will not cost us too much lda FACOV jsr mul_FAC2_FAC1_by_A jsr mul_FAC2_FAC1_shift - bcc !+ + bcc @3 inc RESHO+0 -!: +@3: lda FAC1_mantissa+3 jsr mul_FAC2_FAC1_by_A jsr mul_FAC2_FAC1_shift - bcc !+ + bcc @4 inc RESHO+0 -!: +@4: lda FAC1_mantissa+2 jsr mul_FAC2_FAC1_by_A jsr mul_FAC2_FAC1_shift - bcc !+ + bcc @5 inc RESHO+0 -!: +@5: lda FAC1_mantissa+1 jsr mul_FAC2_FAC1_by_A jsr mul_FAC2_FAC1_shift - bcc !+ + bcc @6 inc RESHO+0 -!: +@6: lda FAC1_mantissa+0 jsr mul_FAC2_FAC1_by_A jsr mul_FAC2_FAC1_shift - bcc !+ + bcc @7 inc RESHO+0 -!: - // Copy RESHO to FAC1 mantissa +@7: + ; Copy RESHO to FAC1 mantissa lda RESHO+4 sta FACOV @@ -119,12 +119,12 @@ mul_FAC2_FAC1: lda RESHO+0 sta FAC1_mantissa+0 - // Correct the exponent + ; Correct the exponent lda FAC1_exponent clc adc #$08 - bcs_16 set_FAC1_max // branch if overflow + +bcs set_FAC1_max ; branch if overflow sta FAC1_exponent jmp normal_FAC1 @@ -133,7 +133,7 @@ mul_FAC2_FAC1_by_A: beq mul_FAC2_FAC1_by_A_done sta INDEX+3 - // Multiply FAC2_mantissa+3 + ; Multiply FAC2_mantissa+3 lda FAC2_mantissa+3 jsr mul_FAC2_FAC1_8x8 @@ -143,14 +143,14 @@ mul_FAC2_FAC1_by_A: txa adc RESHO+3 sta RESHO+3 - bcc !+ + bcc @8 inc RESHO+2 - bne !+ + bne @8 inc RESHO+1 - bne !+ + bne @8 inc RESHO+0 -!: - // Multiply FAC2_mantissa+2 +@8: + ; Multiply FAC2_mantissa+2 lda FAC2_mantissa+2 jsr mul_FAC2_FAC1_8x8 @@ -160,12 +160,12 @@ mul_FAC2_FAC1_by_A: txa adc RESHO+2 sta RESHO+2 - bcc !+ + bcc @9 inc RESHO+1 - bne !+ + bne @9 inc RESHO+0 -!: - // Multiply FAC2_mantissa+1 +@9: + ; Multiply FAC2_mantissa+1 lda FAC2_mantissa+1 jsr mul_FAC2_FAC1_8x8 @@ -175,10 +175,10 @@ mul_FAC2_FAC1_by_A: txa adc RESHO+1 sta RESHO+1 - bcc !+ + bcc @10 inc RESHO+0 -!: - // Multiply FAC2_mantissa+0 +@10: + ; Multiply FAC2_mantissa+0 lda FAC2_mantissa+0 jsr mul_FAC2_FAC1_8x8 @@ -188,7 +188,7 @@ mul_FAC2_FAC1_by_A: adc RESHO+0 sta RESHO+0 - // FALLTROUGH + ; FALLTROUGH mul_FAC2_FAC1_by_A_done: diff --git a/src/basic/math/mul_FAC2_FAC1_8x8.s b/src/basic/math/mul_FAC2_FAC1_8x8.s index ff06c0c2..703f17f6 100644 --- a/src/basic/math/mul_FAC2_FAC1_8x8.s +++ b/src/basic/math/mul_FAC2_FAC1_8x8.s @@ -1,20 +1,20 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Helper routine, based on code by djmips (fast version) from: -// - https://codebase64.org/doku.php?id=base:8bit_multiplication_16bit_product_fast_no_tables -// or by code by Graham (small version) from: -// - https://codebase64.org/doku.php?id=base:short_8bit_multiplication_16bit_product -// -// input: .A (and Zero flag set according to .A), INDEX+3 -// output: .X (high byte), .A (low byte), carry always clear -// +; +; Helper routine, based on code by djmips (fast version) from: +; - https://codebase64.org/doku.php?id=base:8bit_multiplication_16bit_product_fast_no_tables +; or by code by Graham (small version) from: +; - https://codebase64.org/doku.php?id=base:short_8bit_multiplication_16bit_product +; +; input: .A (and Zero flag set according to .A), INDEX+3 +; output: .X (high byte), .A (low byte), carry always clear +; mul_FAC2_FAC1_8x8: - // Special cases - handle multiplication by 0 + ; Special cases - handle multiplication by 0 beq mul_FAC2_FAC1_8x8_zero sta INDEX+2 @@ -22,54 +22,54 @@ mul_FAC2_FAC1_8x8: lda INDEX+3 beq mul_FAC2_FAC1_8x8_zero - // Multiply INDEX+2 * INDEX+3 + ; Multiply INDEX+2 * INDEX+3 -#if !HAS_SMALL_BASIC +!ifndef HAS_SMALL_BASIC { - // Fast multiplication routine + ; Fast multiplication routine lda #$00 - dec INDEX+3 // decrement because we will be adding with carry set for speed (an extra one) + dec INDEX+3 ; decrement because we will be adding with carry set for speed (an extra one) ror INDEX+2 - bcc !+ + bcc @1 adc INDEX+3 -!: +@1: ror ror INDEX+2 - bcc !+ + bcc @2 adc INDEX+3 -!: +@2: ror ror INDEX+2 - bcc !+ + bcc @3 adc INDEX+3 -!: +@3: ror ror INDEX+2 - bcc !+ + bcc @4 adc INDEX+3 -!: +@4: ror ror INDEX+2 - bcc !+ + bcc @5 adc INDEX+3 -!: +@5: ror ror INDEX+2 - bcc !+ + bcc @6 adc INDEX+3 -!: +@6: ror ror INDEX+2 - bcc !+ + bcc @7 adc INDEX+3 -!: +@7: ror ror INDEX+2 - bcc !+ + bcc @8 adc INDEX+3 -!: +@8: ror ror INDEX+2 inc INDEX+3 @@ -77,32 +77,31 @@ mul_FAC2_FAC1_8x8: tax lda INDEX+2 -#else +} else { - // Small multiplication routine + ; Small multiplication routine lda #$00 ldx #$08 clc -!: - bcc !+ +@9: + bcc @10 clc adc INDEX+3 -!: +@10: ror ror INDEX+2 dex - bpl !-- + bpl @9 ldx INDEX+2 - // Reverse return byte order, to match fast version - // (such order is easier top handle for the callers) + ; Reverse return byte order, to match fast version + ; (such order is easier top handle for the callers) stx INDEX+2 tax lda INDEX+2 - -#endif +} clc rts diff --git a/src/basic/math/mul_FAC2_FAC1_shift.s b/src/basic/math/mul_FAC2_FAC1_shift.s index 6aed5169..7e3eaada 100644 --- a/src/basic/math/mul_FAC2_FAC1_shift.s +++ b/src/basic/math/mul_FAC2_FAC1_shift.s @@ -1,22 +1,22 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Shift RESHO by one byte - for multiplication -// +; +; Shift RESHO by one byte - for multiplication +; mul_FAC2_FAC1_shift: - // Check if rounding is needed + ; Check if rounding is needed php clc lda RESHO+4 - bpl !+ + bpl @1 sec -!: - // Copy bytes +@1: + ; Copy bytes lda RESHO+3 sta RESHO+4 @@ -28,19 +28,19 @@ mul_FAC2_FAC1_shift: sta RESHO+1 lda #$00 sta RESHO+0 - bcc !+ + bcc @2 - // Perform rounding + ; Perform rounding inc RESHO+4 - bne !+ + bne @2 inc RESHO+3 - bne !+ + bne @2 inc RESHO+2 - bne !+ + bne @2 inc RESHO+1 - bne !+ + bne @2 inc RESHO+0 -!: +@2: plp rts diff --git a/src/basic/math/muldiv_RESHO_helpers.s b/src/basic/math/muldiv_RESHO_helpers.s index 7f73037f..3097567d 100644 --- a/src/basic/math/muldiv_RESHO_helpers.s +++ b/src/basic/math/muldiv_RESHO_helpers.s @@ -1,10 +1,10 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - helper routines for RESHO manipulation -// +; +; Math package - helper routines for RESHO manipulation +; muldiv_RESHO_set_0: @@ -24,7 +24,7 @@ muldiv_RESHO_01_add_A: clc adc RESHO+0 sta RESHO+0 - bcc !+ + bcc @1 inc RESHO+1 -!: +@1: rts diff --git a/src/basic/math/normal_FAC1.s b/src/basic/math/normal_FAC1.s index 5c0cc405..64d8f938 100644 --- a/src/basic/math/normal_FAC1.s +++ b/src/basic/math/normal_FAC1.s @@ -1,48 +1,48 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - normalize FAC1 -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 113 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - normalize FAC1 +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 113 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; -// XXX test this +; XXX test this normal_FAC1: lda FAC1_exponent - beq normal_FAC1_end // branch if our float is 0 + beq normal_FAC1_end ; branch if our float is 0 - // FALLTROUGH + ; FALLTROUGH normal_FAC1_check_mantissa_byte: lda FAC1_mantissa+0 - beq normal_FAC1_by_byte // branch if we can move the whole byte + beq normal_FAC1_by_byte ; branch if we can move the whole byte - // FALLTROUGH + ; FALLTROUGH normal_FAC1_check_mantissa_bit: - lda FAC1_mantissa+0 // XXX optimize for 65CE02? + lda FAC1_mantissa+0 ; XXX optimize for 65CE02? and #$80 - bne normal_FAC1_end // branch if already normalized + bne normal_FAC1_end ; branch if already normalized - // FALLTROUGH + ; FALLTROUGH normal_FAC1_by_bit: - // Decrement the exponent + ; Decrement the exponent dec FAC1_exponent - beq normal_FAC1_end // exponent reached 0, nothing more to do + beq normal_FAC1_end ; exponent reached 0, nothing more to do - // Multiply the mantissa by 2 + ; Multiply the mantissa by 2 asl FACOV rol FAC1_mantissa+3 @@ -50,23 +50,23 @@ normal_FAC1_by_bit: rol FAC1_mantissa+1 rol FAC1_mantissa+0 - bcc normal_FAC1_check_mantissa_bit // branch if next iteration needed + bcc normal_FAC1_check_mantissa_bit ; branch if next iteration needed rts normal_FAC1_by_byte: - // First decrement the exponent by 8, but not below 0 + ; First decrement the exponent by 8, but not below 0 lda FAC1_exponent sec sbc #$08 - bcs !+ + bcs @1 lda #$00 -!: +@1: sta FAC1_exponent - beq normal_FAC1_end // branch if our float reached 0 + beq normal_FAC1_end ; branch if our float reached 0 - // Now multiply the mantissa by 8 by moving the whole bytes + ; Now multiply the mantissa by 8 by moving the whole bytes lda FAC1_mantissa+1 sta FAC1_mantissa+0 @@ -81,20 +81,20 @@ normal_FAC1_by_byte: lda #$00 sta FACOV - // Now check if mantissa is not 0 + ; Now check if mantissa is not 0 ora FAC1_mantissa+0 ora FAC1_mantissa+1 ora FAC1_mantissa+2 ora FAC1_mantissa+3 - bne normal_FAC1_check_mantissa_byte // not 0 - branch to next iteration + bne normal_FAC1_check_mantissa_byte ; not 0 - branch to next iteration - // Our mantissa reached 0 - mark exponent as 0 and finish + ; Our mantissa reached 0 - mark exponent as 0 and finish sta FAC1_exponent - // FALLTROUGH + ; FALLTROUGH normal_FAC1_end: diff --git a/src/basic/math/rnd_seed_from_FAC1.s b/src/basic/math/rnd_seed_from_FAC1.s index 0a288ca2..7c53738f 100644 --- a/src/basic/math/rnd_seed_from_FAC1.s +++ b/src/basic/math/rnd_seed_from_FAC1.s @@ -1,11 +1,11 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Initialize random seed using values from FAC1, -// afterwards generate random number in FAC1 -// +; +; Initialize random seed using values from FAC1, +; afterwards generate random number in FAC1 +; rnd_seed_from_FAC1: diff --git a/src/basic/math/rnd_seed_init.s b/src/basic/math/rnd_seed_init.s index a2510214..27924caa 100644 --- a/src/basic/math/rnd_seed_init.s +++ b/src/basic/math/rnd_seed_init.s @@ -1,33 +1,33 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Initialize random seed, afterwards generate random number in FAC1, -// try to gather as much entropy from different sources as possible -// +; +; Initialize random seed, afterwards generate random number in FAC1, +; try to gather as much entropy from different sources as possible +; rnd_seed_init: - eor CIA1_TIMALO // timer used for IRQ generation, use potential entropy from .A + eor CIA1_TIMALO ; timer used for IRQ generation, use potential entropy from .A sta RNDX+3 - txa // .X might contain some entropy - eor VIC_RASTER // lowest 8 bits of current raster line + txa ; .X might contain some entropy + eor VIC_RASTER ; lowest 8 bits of current raster line sta RNDX+1 - tya // .Y might contain some entropy + tya ; .Y might contain some entropy eor CIA1_TIMAHI sta RNDX+4 - lda TIME+2 // byte from jiffy counter might be useful too - eor SID_RANDOM // not sure if SID set correctly, but it will not hurt -#if CONFIG_MB_MEGA_65 - eor VIC_XPOS // not sure if VIC-IV visible, but it will not hurt -#endif + lda TIME+2 ; byte from jiffy counter might be useful too + eor SID_RANDOM ; not sure if SID set correctly, but it will not hurt +!ifdef CONFIG_MB_M65 { + eor VIC_XPOS ; not sure if VIC-IV visible, but it will not hurt +} sta RNDX+2 - // RNDX+0 will be overwritten by generator + ; RNDX+0 will be overwritten by generator jmp rnd_generate diff --git a/src/basic/math/round_FAC1.s b/src/basic/math/round_FAC1.s index 7cef4a05..0b401ef9 100644 --- a/src/basic/math/round_FAC1.s +++ b/src/basic/math/round_FAC1.s @@ -1,31 +1,31 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - rounds FAC1 before copying -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 115 -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - rounds FAC1 before copying +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 115 +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; -// XXX test this +; XXX test this round_FAC1: - // If number is 0, do not do anything + ; If number is 0, do not do anything lda FAC1_exponent beq round_FAC1_done lda FACOV - bpl round_FAC1_zero_FACOV // branch if it is enough to clear FACOV + bpl round_FAC1_zero_FACOV ; branch if it is enough to clear FACOV - // Increment the 4 bytes of matissa + ; Increment the 4 bytes of matissa - // Curse you, who invented this format! Had the mantissa been little endian, - // we could have used INW on 65C02 and above, the code would have been smaller! + ; Curse you, who invented this format! Had the mantissa been little endian, + ; we could have used INW on 65C02 and above, the code would have been smaller! inc FAC1_mantissa+3 bne round_FAC1_zero_FACOV @@ -36,25 +36,25 @@ round_FAC1: inc FAC1_mantissa+0 bne round_FAC1_zero_FACOV - // If we are here, it means mantissa is 0; put it to minimum allowed and increment exponent + ; If we are here, it means mantissa is 0; put it to minimum allowed and increment exponent lda #$80 sta FAC1_mantissa+0 inc FAC1_exponent bne round_FAC1_zero_FACOV - // If we are here, it means the exponent wrapped around to $00; put it back to $FF + ; If we are here, it means the exponent wrapped around to $00; put it back to $FF dec FAC1_exponent - // FALLTROUGH + ; FALLTROUGH round_FAC1_zero_FACOV: lda #$00 sta FACOV - // FALLTROUGH + ; FALLTROUGH round_FAC1_done: diff --git a/src/basic/math_consts/aea8.const_PI.s b/src/basic/math_consts/aea8.const_PI.s index d86c1687..cd7dd5b6 100644 --- a/src/basic/math_consts/aea8.const_PI.s +++ b/src/basic/math_consts/aea8.const_PI.s @@ -1,14 +1,14 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - a constant, for documentation see: -// - https://www.c64-wiki.com/wiki/BASIC-ROM -// - Computes Mapping the Commodore 64, page 103 -// +; +; Math package - a constant, for documentation see: +; - https://www.c64-wiki.com/wiki/BASIC-ROM +; - Computes Mapping the Commodore 64, page 103 +; const_PI: - put_const_PI() + +PUT_CONST_PI diff --git a/src/basic/math_consts/b1a5.const_NEG_32768.s b/src/basic/math_consts/b1a5.const_NEG_32768.s index c45694fa..ffa7c0b9 100644 --- a/src/basic/math_consts/b1a5.const_NEG_32768.s +++ b/src/basic/math_consts/b1a5.const_NEG_32768.s @@ -1,14 +1,14 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - a constant, for documentation see: -// - https://www.c64-wiki.com/wiki/BASIC-ROM -// - Computes Mapping the Commodore 64, page 105 -// +; +; Math package - a constant, for documentation see: +; - https://www.c64-wiki.com/wiki/BASIC-ROM +; - Computes Mapping the Commodore 64, page 105 +; CONST_NEG_32768: - put_const_NEG_32768() + +PUT_CONST_NEG_32768 diff --git a/src/basic/math_consts/b9bc.const_ONE.s b/src/basic/math_consts/b9bc.const_ONE.s index 38997280..9c044036 100644 --- a/src/basic/math_consts/b9bc.const_ONE.s +++ b/src/basic/math_consts/b9bc.const_ONE.s @@ -1,14 +1,14 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - a constant, for documentation see: -// - https://www.c64-wiki.com/wiki/BASIC-ROM -// - Computes Mapping the Commodore 64, page 113 -// +; +; Math package - a constant, for documentation see: +; - https://www.c64-wiki.com/wiki/BASIC-ROM +; - Computes Mapping the Commodore 64, page 113 +; const_ONE: - put_const_ONE() + +PUT_CONST_ONE diff --git a/src/basic/math_consts/b9d6.const_INV_SQR_2.s b/src/basic/math_consts/b9d6.const_INV_SQR_2.s index e3733683..a538c7bc 100644 --- a/src/basic/math_consts/b9d6.const_INV_SQR_2.s +++ b/src/basic/math_consts/b9d6.const_INV_SQR_2.s @@ -1,13 +1,13 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - a constant, for documentation see: -// - https://www.c64-wiki.com/wiki/BASIC-ROM -// +; +; Math package - a constant, for documentation see: +; - https://www.c64-wiki.com/wiki/BASIC-ROM +; const_INV_SQR_2: - put_const_INV_SQR_2() + +PUT_CONST_INV_SQR_2 diff --git a/src/basic/math_consts/b9db.const_SQR_2.s b/src/basic/math_consts/b9db.const_SQR_2.s index ab9d0a51..27ef1d61 100644 --- a/src/basic/math_consts/b9db.const_SQR_2.s +++ b/src/basic/math_consts/b9db.const_SQR_2.s @@ -1,13 +1,13 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - a constant, for documentation see: -// - https://www.c64-wiki.com/wiki/BASIC-ROM -// +; +; Math package - a constant, for documentation see: +; - https://www.c64-wiki.com/wiki/BASIC-ROM +; const_SQR_2: - put_const_SQR_2() + +PUT_CONST_SQR_2 diff --git a/src/basic/math_consts/b9e0.const_NEG_HALF.s b/src/basic/math_consts/b9e0.const_NEG_HALF.s index 0227e546..cf98afdf 100644 --- a/src/basic/math_consts/b9e0.const_NEG_HALF.s +++ b/src/basic/math_consts/b9e0.const_NEG_HALF.s @@ -1,13 +1,13 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - a constant, for documentation see: -// - https://www.c64-wiki.com/wiki/BASIC-ROM -// +; +; Math package - a constant, for documentation see: +; - https://www.c64-wiki.com/wiki/BASIC-ROM +; const_NEG_HALF: - put_const_NEG_HALF() + +PUT_CONST_NEG_HALF diff --git a/src/basic/math_consts/b9e5.const_LOG_2.s b/src/basic/math_consts/b9e5.const_LOG_2.s index 559d1861..456f92ba 100644 --- a/src/basic/math_consts/b9e5.const_LOG_2.s +++ b/src/basic/math_consts/b9e5.const_LOG_2.s @@ -1,13 +1,13 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - a constant, for documentation see: -// - https://www.c64-wiki.com/wiki/BASIC-ROM -// +; +; Math package - a constant, for documentation see: +; - https://www.c64-wiki.com/wiki/BASIC-ROM +; const_LOG_2: - put_const_LOG_2() + +PUT_CONST_LOG_2 diff --git a/src/basic/math_consts/baf9.const_TEN.s b/src/basic/math_consts/baf9.const_TEN.s index e2610722..94762816 100644 --- a/src/basic/math_consts/baf9.const_TEN.s +++ b/src/basic/math_consts/baf9.const_TEN.s @@ -1,14 +1,14 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - a constant, for documentation see: -// - https://www.c64-wiki.com/wiki/BASIC-ROM -// - Computes Mapping the Commodore 64, page 114 -// +; +; Math package - a constant, for documentation see: +; - https://www.c64-wiki.com/wiki/BASIC-ROM +; - Computes Mapping the Commodore 64, page 114 +; const_TEN: - put_const_TEN() + +PUT_CONST_TEN diff --git a/src/basic/math_consts/bf11.const_HALF.s b/src/basic/math_consts/bf11.const_HALF.s index 15e1f801..a9ae49f1 100644 --- a/src/basic/math_consts/bf11.const_HALF.s +++ b/src/basic/math_consts/bf11.const_HALF.s @@ -1,14 +1,14 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - a constant, for documentation see: -// - https://www.c64-wiki.com/wiki/BASIC-ROM -// - Computes Mapping the Commodore 64, page 116 -// +; +; Math package - a constant, for documentation see: +; - https://www.c64-wiki.com/wiki/BASIC-ROM +; - Computes Mapping the Commodore 64, page 116 +; const_HALF: - put_const_HALF() + +PUT_CONST_HALF diff --git a/src/basic/math_consts/bfbf.const_INV_LOG_2.s b/src/basic/math_consts/bfbf.const_INV_LOG_2.s index 07d97253..854c6ad3 100644 --- a/src/basic/math_consts/bfbf.const_INV_LOG_2.s +++ b/src/basic/math_consts/bfbf.const_INV_LOG_2.s @@ -1,13 +1,13 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - a constant, for documentation see: -// - https://www.c64-wiki.com/wiki/BASIC-ROM -// +; +; Math package - a constant, for documentation see: +; - https://www.c64-wiki.com/wiki/BASIC-ROM +; const_INV_LOG_2: - put_const_INV_LOG_2() + +PUT_CONST_INV_LOG_2 diff --git a/src/basic/math_consts/bfe8.const_ONE.s b/src/basic/math_consts/bfe8.const_ONE.s index bea746ee..d39c248b 100644 --- a/src/basic/math_consts/bfe8.const_ONE.s +++ b/src/basic/math_consts/bfe8.const_ONE.s @@ -1,11 +1,11 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - a constant, for documentation see: -// - https://www.c64-wiki.com/wiki/BASIC-ROM -// +; +; Math package - a constant, for documentation see: +; - https://www.c64-wiki.com/wiki/BASIC-ROM +; - put_const_ONE() // duplicated constant - no label + +PUT_CONST_ONE ; duplicated constant - no label diff --git a/src/basic/math_consts/e2e0.const_HALF_PI.s b/src/basic/math_consts/e2e0.const_HALF_PI.s index a75efb68..ff8fab44 100644 --- a/src/basic/math_consts/e2e0.const_HALF_PI.s +++ b/src/basic/math_consts/e2e0.const_HALF_PI.s @@ -1,12 +1,12 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - a constant, for documentation see: -// - https://sourceforge.net/p/acme-crossass/code-0/38/tree/trunk/ACME_Lib/cbm/c64/float.a?force=True -// +; +; Math package - a constant, for documentation see: +; - https://sourceforge.net/p/acme-crossass/code-0/38/tree/trunk/ACME_Lib/cbm/c64/float.a?force=True +; const_HALF_PI: - put_const_HALF_PI() + +PUT_CONST_HALF_PI diff --git a/src/basic/math_consts/e2e5.const_DOUBLE_PI.s b/src/basic/math_consts/e2e5.const_DOUBLE_PI.s index f8728ef7..731e51d8 100644 --- a/src/basic/math_consts/e2e5.const_DOUBLE_PI.s +++ b/src/basic/math_consts/e2e5.const_DOUBLE_PI.s @@ -1,12 +1,12 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - a constant, for documentation see: -// - https://sourceforge.net/p/acme-crossass/code-0/38/tree/trunk/ACME_Lib/cbm/c64/float.a?force=True -// +; +; Math package - a constant, for documentation see: +; - https://sourceforge.net/p/acme-crossass/code-0/38/tree/trunk/ACME_Lib/cbm/c64/float.a?force=True +; const_DOUBLE_PI: - put_const_DOUBLE_PI() + +PUT_CONST_DOUBLE_PI diff --git a/src/basic/math_consts/e2ea.const_QUARTER.s b/src/basic/math_consts/e2ea.const_QUARTER.s index 77962d8a..3cba4c8b 100644 --- a/src/basic/math_consts/e2ea.const_QUARTER.s +++ b/src/basic/math_consts/e2ea.const_QUARTER.s @@ -1,12 +1,12 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - a constant, for documentation see: -// - https://sourceforge.net/p/acme-crossass/code-0/38/tree/trunk/ACME_Lib/cbm/c64/float.a?force=True -// +; +; Math package - a constant, for documentation see: +; - https://sourceforge.net/p/acme-crossass/code-0/38/tree/trunk/ACME_Lib/cbm/c64/float.a?force=True +; const_QUARTER: - put_const_QUARTER() \ No newline at end of file + +PUT_CONST_QUARTER diff --git a/src/basic/math_consts/e309.const_DOUBLE_PI.s b/src/basic/math_consts/e309.const_DOUBLE_PI.s index 33a01f1b..50c149ca 100644 --- a/src/basic/math_consts/e309.const_DOUBLE_PI.s +++ b/src/basic/math_consts/e309.const_DOUBLE_PI.s @@ -1,10 +1,10 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - a constant, for documentation see: -// - https://sourceforge.net/p/acme-crossass/code-0/38/tree/trunk/ACME_Lib/cbm/c64/float.a?force=True -// +; +; Math package - a constant, for documentation see: +; - https://sourceforge.net/p/acme-crossass/code-0/38/tree/trunk/ACME_Lib/cbm/c64/float.a?force=True +; - put_const_DOUBLE_PI() // duplicated constant - no label + +PUT_CONST_DOUBLE_PI ; duplicated constant - no label diff --git a/src/basic/math_mov/bba2.mov_MEM_FAC1.jmp.s b/src/basic/math_mov/bba2.mov_MEM_FAC1.jmp.s index 21e9f9ca..bad7d253 100644 --- a/src/basic/math_mov/bba2.mov_MEM_FAC1.jmp.s +++ b/src/basic/math_mov/bba2.mov_MEM_FAC1.jmp.s @@ -1,8 +1,8 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// Just a compatibility jump - our routine is longer than original one +; Just a compatibility jump - our routine is longer than original one jmp mov_MEM_FAC1 diff --git a/src/basic/math_mov/bbc7.mov_r_FAC1_TMP2.s b/src/basic/math_mov/bbc7.mov_r_FAC1_TMP2.s index a3651fd4..fd47291a 100644 --- a/src/basic/math_mov/bbc7.mov_r_FAC1_TMP2.s +++ b/src/basic/math_mov/bbc7.mov_r_FAC1_TMP2.s @@ -1,8 +1,8 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// Just a compatibility jump - our routine is longer than original one +; Just a compatibility jump - our routine is longer than original one jmp mov_r_FAC1_TMP2 diff --git a/src/basic/math_mov/bbca.mov_r_FAC1_TMP1.s b/src/basic/math_mov/bbca.mov_r_FAC1_TMP1.s index d9993d30..51494056 100644 --- a/src/basic/math_mov/bbca.mov_r_FAC1_TMP1.s +++ b/src/basic/math_mov/bbca.mov_r_FAC1_TMP1.s @@ -1,8 +1,8 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// Just a compatibility jump - our routine is longer than original one +; Just a compatibility jump - our routine is longer than original one jmp mov_r_FAC1_TMP1 diff --git a/src/basic/math_mov/bbd0.mov_r_FAC1_VAR.s b/src/basic/math_mov/bbd0.mov_r_FAC1_VAR.s index 59ac4b18..9de76027 100644 --- a/src/basic/math_mov/bbd0.mov_r_FAC1_VAR.s +++ b/src/basic/math_mov/bbd0.mov_r_FAC1_VAR.s @@ -1,21 +1,21 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - move FAC1 (rounds) to memory variable -// -// Input: -// - FORPNT ($49/$4A) - variable address -// -// See also: -// - https://www.c64-wiki.com/wiki/BASIC-ROM -// +; +; Math package - move FAC1 (rounds) to memory variable +; +; Input: +; - FORPNT ($49/$4A) - variable address +; +; See also: +; - https://www.c64-wiki.com/wiki/BASIC-ROM +; mov_r_FAC1_VAR: ldy #FORPNT+1 ldx #FORPNT+0 - // FALLTROUGH to mov_r_FAC1_MEM + ; FALLTROUGH to mov_r_FAC1_MEM diff --git a/src/basic/math_mov/bbd4.mov_r_FAC1_MEM.s b/src/basic/math_mov/bbd4.mov_r_FAC1_MEM.s index 8bf3182d..3fcad9d5 100644 --- a/src/basic/math_mov/bbd4.mov_r_FAC1_MEM.s +++ b/src/basic/math_mov/bbd4.mov_r_FAC1_MEM.s @@ -1,26 +1,26 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - copy FAC1 to memory location, do not round -// -// Input: -// - .X - address low byte -// - .Y - address high byte -// -// Output: -// - .A - FAC1 exponent -// -// See also: -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - copy FAC1 to memory location, do not round +; +; Input: +; - .X - address low byte +; - .Y - address high byte +; +; Output: +; - .A - FAC1 exponent +; +; See also: +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; mov_r_FAC1_MEM: - // Start by rounding FAC1 + ; Start by rounding FAC1 jsr round_FAC1 jmp mov_FAC1_MEM diff --git a/src/basic/math_mov/bbfc.mov_FAC2_FAC1.s b/src/basic/math_mov/bbfc.mov_FAC2_FAC1.s index a59de960..c320e722 100644 --- a/src/basic/math_mov/bbfc.mov_FAC2_FAC1.s +++ b/src/basic/math_mov/bbfc.mov_FAC2_FAC1.s @@ -1,8 +1,8 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// Just a compatibility jump - our routine is longer than original one +; Just a compatibility jump - our routine is longer than original one jmp mov_FAC2_FAC1 diff --git a/src/basic/math_mov/bc0c.mov_r_FAC1_FAC2.s b/src/basic/math_mov/bc0c.mov_r_FAC1_FAC2.s index edf6e9cd..dbaae34c 100644 --- a/src/basic/math_mov/bc0c.mov_r_FAC1_FAC2.s +++ b/src/basic/math_mov/bc0c.mov_r_FAC1_FAC2.s @@ -1,23 +1,23 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - round and move FAC1 to FAC2 -// -// Output: -// - .A - FAC1 exponent -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 115 -// - https://www.c64-wiki.com/wiki/BASIC-ROM -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// +; +; Math package - round and move FAC1 to FAC2 +; +; Output: +; - .A - FAC1 exponent +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 115 +; - https://www.c64-wiki.com/wiki/BASIC-ROM +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; mov_r_FAC1_FAC2: - // First round FAC1 + ; First round FAC1 jsr round_FAC1 - // FALLTROUGH to mov_FAC1_FAC2 + ; FALLTROUGH to mov_FAC1_FAC2 diff --git a/src/basic/math_mov/bc0f.mov_FAC1_FAC2.jmp.s b/src/basic/math_mov/bc0f.mov_FAC1_FAC2.jmp.s index 6cb71a8d..f7409462 100644 --- a/src/basic/math_mov/bc0f.mov_FAC1_FAC2.jmp.s +++ b/src/basic/math_mov/bc0f.mov_FAC1_FAC2.jmp.s @@ -1,8 +1,8 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// Just a compatibility jump - our routine is longer than original one +; Just a compatibility jump - our routine is longer than original one jmp mov_FAC1_FAC2 diff --git a/src/basic/math_mov/mov_FAC1_FAC2.s b/src/basic/math_mov/mov_FAC1_FAC2.s index 8ce497d5..25202fc0 100644 --- a/src/basic/math_mov/mov_FAC1_FAC2.s +++ b/src/basic/math_mov/mov_FAC1_FAC2.s @@ -1,34 +1,34 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - move FAC1 to FAC2 -// -// Output (all found by experimentation): -// - .A - FAC1 exponent -// - .X - always 0 -// -// Preserves (found by experimentation): -// - .Y -// -// Note: -// - observed that original ROM always clears FACOV, not sure why -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 115 -// - https://www.c64-wiki.com/wiki/BASIC-ROM -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// +; +; Math package - move FAC1 to FAC2 +; +; Output (all found by experimentation): +; - .A - FAC1 exponent +; - .X - always 0 +; +; Preserves (found by experimentation): +; - .Y +; +; Note: +; - observed that original ROM always clears FACOV, not sure why +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 115 +; - https://www.c64-wiki.com/wiki/BASIC-ROM +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; mov_FAC1_FAC2: - // Copy the exponent + ; Copy the exponent lda FAC1_exponent sta FAC2_exponent - beq !+ // for 0 no need to copy mantissa and sign + beq @1 ; for 0 no need to copy mantissa and sign - // Copy the mantissa + ; Copy the mantissa lda FAC1_mantissa+0 sta FAC2_mantissa+0 lda FAC1_mantissa+1 @@ -38,13 +38,13 @@ mov_FAC1_FAC2: lda FAC1_mantissa+3 sta FAC2_mantissa+3 - // Copy the sign + ; Copy the sign lda FAC1_sign sta FAC2_sign lda FAC1_exponent -!: - // Duplicate the original ROM behaviour +@1: + ; Duplicate the original ROM behaviour ldx #$00 stx FACOV diff --git a/src/basic/math_mov/mov_FAC1_MEM.s b/src/basic/math_mov/mov_FAC1_MEM.s index 84d49903..a26e5684 100644 --- a/src/basic/math_mov/mov_FAC1_MEM.s +++ b/src/basic/math_mov/mov_FAC1_MEM.s @@ -1,54 +1,54 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - copy FAC1 to memory location, do not round -// -// Input: -// - .X - address low byte -// - .Y - address high byte -// -// Output: -// - .A - FAC1 exponent -// -// See also: -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - copy FAC1 to memory location, do not round +; +; Input: +; - .X - address low byte +; - .Y - address high byte +; +; Output: +; - .A - FAC1 exponent +; +; See also: +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; mov_FAC1_MEM: - // Original routines use $22/$23 location for a vector too, see here: - // - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics + ; Original routines use $22/$23 location for a vector too, see here: + ; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics sty INDEX+1 stx INDEX+0 ldy #$00 - // Copy exponent + ; Copy exponent lda FAC1_exponent sta (INDEX), y - beq mov_FAC1_MEM_end // for 0 no need to copy anything more + beq mov_FAC1_MEM_end ; for 0 no need to copy anything more - // Copy first byte of mantissa + ; Copy first byte of mantissa iny lda FAC2_mantissa+3 sta (INDEX), y - // Copy the sign XXX try to optimize this part + ; Copy the sign XXX try to optimize this part lda FAC1_sign - bne !+ + bne @1 lda FAC2_mantissa+3 and #$7F sta (INDEX), y -!: - // Copy remaining parts of mantissa +@1: + ; Copy remaining parts of mantissa iny lda FAC2_mantissa+2 @@ -62,8 +62,8 @@ mov_FAC1_MEM: lda FAC2_mantissa+0 sta (INDEX), y - // Checked, that mov_FAC1_MEM works on real ROM too (at $BBD7), - // and clears FACOV in a similar way as mov_FAC1_FAC2 does (not surprising) + ; Checked, that mov_FAC1_MEM works on real ROM too (at $BBD7), + ; and clears FACOV in a similar way as mov_FAC1_FAC2 does (not surprising) ldy #$00 sty FACOV diff --git a/src/basic/math_mov/mov_FAC2_FAC1.s b/src/basic/math_mov/mov_FAC2_FAC1.s index 231c0b91..b860cac2 100644 --- a/src/basic/math_mov/mov_FAC2_FAC1.s +++ b/src/basic/math_mov/mov_FAC2_FAC1.s @@ -1,26 +1,26 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - copy FAC2 to FAC1 -// -// Output (found by experimentation): -// - .A - FAC1 exponent -// - .X - always 0 -// -// Preserves: -// - .Y -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 115 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - copy FAC2 to FAC1 +; +; Output (found by experimentation): +; - .A - FAC1 exponent +; - .X - always 0 +; +; Preserves: +; - .Y +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 115 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; mov_FAC2_FAC1: - // Copy the mantissa + ; Copy the mantissa lda FAC2_mantissa+3 sta FAC1_mantissa+3 @@ -31,17 +31,17 @@ mov_FAC2_FAC1: lda FAC2_mantissa+0 sta FAC1_mantissa+0 - // Copy the sign + ; Copy the sign lda FAC2_sign sta FAC1_sign - // Copy the exponent + ; Copy the exponent lda FAC2_exponent sta FAC1_exponent - // Clear FACOV + ; Clear FACOV ldx #$00 stx FACOV diff --git a/src/basic/math_mov/mov_MEM_FAC1.s b/src/basic/math_mov/mov_MEM_FAC1.s index f99cb9ee..94ec6ad7 100644 --- a/src/basic/math_mov/mov_MEM_FAC1.s +++ b/src/basic/math_mov/mov_MEM_FAC1.s @@ -1,38 +1,38 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// Math package - fetch FAC1 from RAM location -// -// Input: -// - .A - address low byte -// - .Y - address high byte -// -// Output: -// - .A - FAC1 exponent, affects status flags -// - .Y - always 0 -// -// Preserves: -// - .X - (experimentation with original ROM) -// -// See also: -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; Math package - fetch FAC1 from RAM location +; +; Input: +; - .A - address low byte +; - .Y - address high byte +; +; Output: +; - .A - FAC1 exponent, affects status flags +; - .Y - always 0 +; +; Preserves: +; - .X - (experimentation with original ROM) +; +; See also: +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// XXX test this +; XXX test this mov_MEM_FAC1: - // Original routines use $22/$23 location for a vector too, see here: - // - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics + ; Original routines use $22/$23 location for a vector too, see here: + ; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics sty INDEX+1 sta INDEX+0 - // Now copy the data from RAM to FAC2, for the format description see: - // - https://www.c64-wiki.com/wiki/Floating_point_arithmetic#Representation_in_the_C-64 + ; Now copy the data from RAM to FAC2, for the format description see: + ; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic#Representation_in_the_C-64 - // Copy the mantissa + ; Copy the mantissa ldy #$04 lda (INDEX), y @@ -48,32 +48,32 @@ mov_MEM_FAC1: dey lda (INDEX), y - ora #$80 // clear the sign bit + ora #$80 ; clear the sign bit sta FAC1_mantissa+0 - // Copy the sign + ; Copy the sign lda (INDEX), y - bpl !+ // assumption: non-negative numbers are more frequent + bpl @1 ; assumption: non-negative numbers are more frequent lda #$FF - skip_2_bytes_trash_nvz -!: + +skip_2_bytes_trash_nvz +@1: lda #$00 sta FAC1_sign - // Copy the exponent + ; Copy the exponent dey lda (INDEX), y sta FAC1_exponent - // Set low order mantissa to 0 - this should give the - // most precision while operating on integers + ; Set low order mantissa to 0 - this should give the + ; most precision while operating on integers sty FACOV - // Return the FAC1 exponent + ; Return the FAC1 exponent lda FAC1_exponent rts diff --git a/src/basic/math_mov/mov_MEM_FAC2.s b/src/basic/math_mov/mov_MEM_FAC2.s index f461a667..4cce1956 100644 --- a/src/basic/math_mov/mov_MEM_FAC2.s +++ b/src/basic/math_mov/mov_MEM_FAC2.s @@ -1,41 +1,41 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - fetch FAC2 from memory location -// -// Input: -// - .A - address low byte -// - .Y - address high byte -// -// Output: -// - .A - FAC1 exponent (yes, really - Codebase64 is right) -// - .Y - 0 (experimentation with original ROM) -// -// Preserves: -// - .X - (experimentation with original ROM) -// -// See also: -// - [CM64] Computes Mapping the Commodore 64 - page 114 -// - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -// - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -// +; +; Math package - fetch FAC2 from memory location +; +; Input: +; - .A - address low byte +; - .Y - address high byte +; +; Output: +; - .A - FAC1 exponent (yes, really - Codebase64 is right) +; - .Y - 0 (experimentation with original ROM) +; +; Preserves: +; - .X - (experimentation with original ROM) +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 114 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; -// XXX test this +; XXX test this mov_MEM_FAC2: - // Original routines use $22/$23 location for a vector too, see here: - // - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics + ; Original routines use $22/$23 location for a vector too, see here: + ; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics sty INDEX+1 sta INDEX+0 - // Now copy the data from RAM to FAC2, for the format description see: - // - https://www.c64-wiki.com/wiki/Floating_point_arithmetic#Representation_in_the_C-64 + ; Now copy the data from RAM to FAC2, for the format description see: + ; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic#Representation_in_the_C-64 - // Copy the mantissa + ; Copy the mantissa ldy #$04 lda (INDEX), y @@ -51,27 +51,27 @@ mov_MEM_FAC2: dey lda (INDEX), y - ora #$80 // clear the sign bit + ora #$80 ; clear the sign bit sta FAC2_mantissa+0 - // Copy the sign + ; Copy the sign lda (INDEX), y - bpl !+ // assumption: non-negative numbers are more frequent + bpl @1 ; assumption: non-negative numbers are more frequent lda #$FF - skip_2_bytes_trash_nvz -!: + +skip_2_bytes_trash_nvz +@1: lda #$00 sta FAC2_sign - // Copy the exponent + ; Copy the exponent dey lda (INDEX), y sta FAC2_exponent - // Return the FAC1 exponent + ; Return the FAC1 exponent lda FAC1_exponent rts diff --git a/src/basic/math_mov/mov_r_FAC1_TMP1.s b/src/basic/math_mov/mov_r_FAC1_TMP1.s index 7edcf115..79917784 100644 --- a/src/basic/math_mov/mov_r_FAC1_TMP1.s +++ b/src/basic/math_mov/mov_r_FAC1_TMP1.s @@ -1,14 +1,14 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - store FAC1 (rounds) in TEMPF1 -// -// See also: -// - https://www.c64-wiki.com/wiki/BASIC-ROM -// - https://sta.c64.org/cbm64basconv.html -// +; +; Math package - store FAC1 (rounds) in TEMPF1 +; +; See also: +; - https://www.c64-wiki.com/wiki/BASIC-ROM +; - https://sta.c64.org/cbm64basconv.html +; mov_r_FAC1_TMP1: diff --git a/src/basic/math_mov/mov_r_FAC1_TMP2.s b/src/basic/math_mov/mov_r_FAC1_TMP2.s index 3897d02a..0b94bbee 100644 --- a/src/basic/math_mov/mov_r_FAC1_TMP2.s +++ b/src/basic/math_mov/mov_r_FAC1_TMP2.s @@ -1,14 +1,14 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Math package - store FAC1 (rounds) in TEMPF2 -// -// See also: -// - https://www.c64-wiki.com/wiki/BASIC-ROM -// - https://sta.c64.org/cbm64basconv.html -// +; +; Math package - store FAC1 (rounds) in TEMPF2 +; +; See also: +; - https://www.c64-wiki.com/wiki/BASIC-ROM +; - https://sta.c64.org/cbm64basconv.html +; mov_r_FAC1_TMP2: diff --git a/src/basic/memory/fetch_character.s b/src/basic/memory/fetch_character.s index 231cd086..90ebf514 100644 --- a/src/basic/memory/fetch_character.s +++ b/src/basic/memory/fetch_character.s @@ -1,56 +1,55 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Fetches a single character -// +; +; Fetches a single character +; +!set NEEDED = 0 +; For these configurations we have optimized version in another file +!ifndef CONFIG_MB_M65 { !set NEEDED = 1 } +!ifndef CONFIG_MEMORY_MODEL_46K_OR_50K { !set NEEDED = 1 } -// For these configurations we have optimized version in another file -#if !(ROM_LAYOUT_M65 && (CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K)) +!if NEEDED { fetch_character: ldy #0 -#if CONFIG_MEMORY_MODEL_60K +!ifdef CONFIG_MEMORY_MODEL_60K { ldx # memmove__src - // - // This means we have to copy from the back end down. - // This routine assumes the pointers are already pointed to the end of the areas, and that .Y is correctly initialized + ; Move memmove__size bytes from memmove__src to memmove__dst, where memmove__dst > memmove__src + ; + ; This means we have to copy from the back end down. + ; This routine assumes the pointers are already pointed to the end of the areas, and that .Y is correctly initialized php -!: +@1: lda (memmove__src),y sta (memmove__dst),y iny - bne !- + bne @1 inc memmove__src+1 inc memmove__dst+1 dec memmove__size+1 - bne !- + bne @1 plp rts -#else +} else { jmp shift_mem_down_internal - -#endif +} diff --git a/src/basic/memory/shift_mem_up.s b/src/basic/memory/shift_mem_up.s index 7af21766..4a230d1c 100644 --- a/src/basic/memory/shift_mem_up.s +++ b/src/basic/memory/shift_mem_up.s @@ -1,56 +1,55 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Copies the memory up -// -// Input: -// - memmove__src - pointer to the last byte of source -// - memmove__dst - pointer to the last byte of destination -// - memmove__size - number of bytes to copy -// -// All the input variables, .A, and .Y register, are destroyed. Also uses memmove__tmp variable. -// +; +; Copies the memory up +; +; Input: +; - memmove__src - pointer to the last byte of source +; - memmove__dst - pointer to the last byte of destination +; - memmove__size - number of bytes to copy +; +; All the input variables, .A, and .Y register, are destroyed. Also uses memmove__tmp variable. +; shift_mem_up: - // The copy routine is simplified, so that it is fast and (for memory model 60K) - // can fit in a small RAM area - therefore it requires to pre-set .Y, so that - // the copy ends when it reaches 0; so if copying one byte we want .Y = $01 + ; The copy routine is simplified, so that it is fast and (for memory model 60K) + ; can fit in a small RAM area - therefore it requires to pre-set .Y, so that + ; the copy ends when it reaches 0; so if copying one byte we want .Y = $01 ldy memmove__size+0 - // Now we have to move down the memmove_src and memmove_dst pointers to compensate for .Y not being 0 + ; Now we have to move down the memmove_src and memmove_dst pointers to compensate for .Y not being 0 jsr shift_mem_adapt_pointers -#if CONFIG_MEMORY_MODEL_38K +!ifdef CONFIG_MEMORY_MODEL_38K { shift_mem_up_internal: - // Move memmove__size bytes from memmove__src to memmove__dst, where memmove__dst > memmove__src - // - // This means we have to copy from the back end down. - // This routine assumes the pointers are already pointed to the end of the areas, and that .Y is correctly initialized + ; Move memmove__size bytes from memmove__src to memmove__dst, where memmove__dst > memmove__src + ; + ; This means we have to copy from the back end down. + ; This routine assumes the pointers are already pointed to the end of the areas, and that .Y is correctly initialized php -!: +@1: lda (memmove__src),y sta (memmove__dst),y dey - bne !- + bne @1 dec memmove__src+1 dec memmove__dst+1 dec memmove__size+1 - bne !- + bne @1 plp rts -#else +} else { jmp shift_mem_up_internal - -#endif +} diff --git a/src/basic/memory/under_rom_60k.s b/src/basic/memory/under_rom_60k.s index a3b72346..5afdfc70 100644 --- a/src/basic/memory/under_rom_60k.s +++ b/src/basic/memory/under_rom_60k.s @@ -1,25 +1,25 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -#if CONFIG_MEMORY_MODEL_60K +!ifdef CONFIG_MEMORY_MODEL_60K { -// IMPORTANT: -// These routines lengths cannot be changed without changing -// the aliases for peek_under_roms, poke_under_roms, etc. -// Thus those addresses are expressed using formulae. +; IMPORTANT: +; These routines lengths cannot be changed without changing +; the aliases for peek_under_roms, poke_under_roms, etc. +; Thus those addresses are expressed using formulae. install_ram_routines: - // Copy routines into place + ; Copy routines into place ldx #__ram_routines_end-__ram_routines_start-1 -!: +@1: lda __ram_routines_start,x sta tiny_nmi_handler,x dex - bpl !- + bpl @1 - // Point NMI handler to tiny_nmi_handler + ; Point NMI handler to tiny_nmi_handler lda #tiny_nmi_handler @@ -29,14 +29,14 @@ install_ram_routines: __ram_routines_start: - // XXX - Routine order must match that of the KERNAL version of the file. - // (since it has fewer routines) + ; XXX - Routine order must match that of the KERNAL version of the file. + ; (since it has fewer routines) tiny_nmi_handler_routine: inc missed_nmi_flag rti peek_under_roms_routine: php - // Offset of arg of lda ($00),y + ; Offset of arg of lda ($00),y stx peek_under_roms+pa-peek_under_roms_routine+1 jsr memmap_allram pa: lda ($00),y @@ -46,7 +46,7 @@ pa: lda ($00),y poke_under_roms_routine: php - // Offset of arg of lda ($00),y + ; Offset of arg of lda ($00),y stx poke_under_roms+pb-poke_under_roms_routine+1 jsr memmap_allram pb: sta ($00),y @@ -71,46 +71,46 @@ memmap_allram_routine: shift_mem_up_routine: - // Move memmove__size bytes from memmove__src to memmove__dst, where memmove__dst > memmove__src - // - // This means we have to copy from the back end down. - // This routine assumes the pointers are already pointed to the end of the areas, and that .Y is correctly initialized + ; Move memmove__size bytes from memmove__src to memmove__dst, where memmove__dst > memmove__src + ; + ; This means we have to copy from the back end down. + ; This routine assumes the pointers are already pointed to the end of the areas, and that .Y is correctly initialized php jsr memmap_allram -!: +@2: lda (memmove__src),y sta (memmove__dst),y dey - bne !- + bne @2 dec memmove__src+1 dec memmove__dst+1 dec memmove__size+1 - bne !- + bne @2 plp jmp memmap_normal shift_mem_down_routine: - // Move memmove__size bytes from memmove__src to memmove__dst, where memmove__dst > memmove__src - // - // This means we have to copy from the back end down. - // This routine assumes the pointers are already pointed to the end of the areas, and that .Y is correctly initialized + ; Move memmove__size bytes from memmove__src to memmove__dst, where memmove__dst > memmove__src + ; + ; This means we have to copy from the back end down. + ; This routine assumes the pointers are already pointed to the end of the areas, and that .Y is correctly initialized php jsr memmap_allram -!: +@3: lda (memmove__src),y sta (memmove__dst),y iny - bne !- + bne @3 inc memmove__src+1 inc memmove__dst+1 dec memmove__size+1 - bne !- + bne @3 plp jmp memmap_normal __ram_routines_end: -#endif +} diff --git a/src/basic/memory/under_rom_peek_fetch_46k_50k.s b/src/basic/memory/under_rom_peek_fetch_46k_50k.s index f4b652aa..edc90a9f 100644 --- a/src/basic/memory/under_rom_peek_fetch_46k_50k.s +++ b/src/basic/memory/under_rom_peek_fetch_46k_50k.s @@ -1,121 +1,116 @@ -// #LAYOUT# STD * #TAKE-HIGH -// #LAYOUT# * BASIC_0 #TAKE-HIGH -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE-HIGH +;; #LAYOUT# * BASIC_0 #TAKE-HIGH +;; #LAYOUT# * * #IGNORE -// This has to go $E000 or above - as the routines below bank out the main BASIC ROM! +; This has to go $E000 or above - as the routines below bank out the main BASIC ROM! -#if CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K +!ifdef CONFIG_MEMORY_MODEL_46K_OR_50K { peek_under_roms_via_TXTPTR: - // Unmap BASIC lower ROM + ; Unmap BASIC lower ROM lda #$26 sta CPU_R6510 - // Retrieve value from under ROMs + ; Retrieve value from under ROMs lda (TXTPTR), y - // FALLTROUGH + ; FALLTROUGH remap_BASIC_preserve_A: - // Restore memory mapping + ; Restore memory mapping pha lda #$27 sta CPU_R6510 pla - // Quit + ; Quit rts peek_under_roms_via_OLDTXT: - // Unmap BASIC lower ROM + ; Unmap BASIC lower ROM lda #$26 sta CPU_R6510 - // Retrieve value from under ROMs + ; Retrieve value from under ROMs lda (OLDTXT), y - jmp_8 remap_BASIC_preserve_A + +bra remap_BASIC_preserve_A peek_under_roms_via_VARPNT: - // Unmap BASIC lower ROM + ; Unmap BASIC lower ROM lda #$26 sta CPU_R6510 - // Retrieve value from under ROMs + ; Retrieve value from under ROMs lda (VARPNT), y - jmp_8 remap_BASIC_preserve_A + +bra remap_BASIC_preserve_A peek_under_roms_via_FAC1_PLUS_1: - // Unmap BASIC lower ROM + ; Unmap BASIC lower ROM lda #$26 sta CPU_R6510 - // Retrieve value from under ROMs + ; Retrieve value from under ROMs lda (__FAC1+1), y - jmp_8 remap_BASIC_preserve_A - -#if ROM_LAYOUT_M65 + +bra remap_BASIC_preserve_A +!ifdef CONFIG_MB_M65 { fetch_character: ldy #0 - // Unmap BASIC lower ROM + ; Unmap BASIC lower ROM lda #$26 sta CPU_R6510 - // Retrieve value from under ROMs, advance text pointer + ; Retrieve value from under ROMs, advance text pointer lda (TXTPTR), y inw TXTPTR - // Restore memory mapping + ; Restore memory mapping - jmp_8 remap_BASIC_preserve_A + +bra remap_BASIC_preserve_A fetch_character_skip_spaces: ldy #0 - // Unmap BASIC lower ROM + ; Unmap BASIC lower ROM lda #$26 sta CPU_R6510 - // Retrieve value from under ROMs, advance text pointer -!: + ; Retrieve value from under ROMs, advance text pointer +@1: lda (TXTPTR), y inw TXTPTR - // Skip space characters + ; Skip space characters cmp #$20 - beq !- + beq @1 - // Restore memory mapping + ; Restore memory mapping - jmp_8 remap_BASIC_preserve_A - - -#endif - -#endif + +bra remap_BASIC_preserve_A +} } diff --git a/src/basic/memory/under_rom_shift_46k_50k.s b/src/basic/memory/under_rom_shift_46k_50k.s index cd023d33..9e178c61 100644 --- a/src/basic/memory/under_rom_shift_46k_50k.s +++ b/src/basic/memory/under_rom_shift_46k_50k.s @@ -1,71 +1,71 @@ -// #LAYOUT# STD * #TAKE-HIGH -// #LAYOUT# * BASIC_0 #TAKE-HIGH -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE-HIGH +;; #LAYOUT# * BASIC_0 #TAKE-HIGH +;; #LAYOUT# * * #IGNORE -// This has to go $E000 or above - as the routines below bank out the main BASIC ROM! +; This has to go $E000 or above - as the routines below bank out the main BASIC ROM! -#if CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K +!ifdef CONFIG_MEMORY_MODEL_46K_OR_50K { shift_mem_up_internal: - // Move memmove__size bytes from memmove__src to memmove__dst, where memmove__dst > memmove__src - // - // This means we have to copy from the back end down. - // This routine assumes the pointers are already pointed to the end of the areas, and that .Y is correctly initialized + ; Move memmove__size bytes from memmove__src to memmove__dst, where memmove__dst > memmove__src + ; + ; This means we have to copy from the back end down. + ; This routine assumes the pointers are already pointed to the end of the areas, and that .Y is correctly initialized - // Unmap BASIC lower ROM + ; Unmap BASIC lower ROM php lda #$26 sta CPU_R6510 - // Perform the copying -!: + ; Perform the copying +@1: lda (memmove__src),y sta (memmove__dst),y dey - bne !- + bne @1 dec memmove__src+1 dec memmove__dst+1 dec memmove__size+1 - bne !- + bne @1 - jmp_8 shift_mem_internal_finalize + +bra shift_mem_internal_finalize shift_mem_down_internal: - // Move memmove__size bytes from memmove__src to memmove__dst, where memmove__dst > memmove__src - // - // This means we have to copy from the back end down. - // This routine assumes the pointers are already pointed to the end of the areas, and that .Y is correctly initialized + ; Move memmove__size bytes from memmove__src to memmove__dst, where memmove__dst > memmove__src + ; + ; This means we have to copy from the back end down. + ; This routine assumes the pointers are already pointed to the end of the areas, and that .Y is correctly initialized - // Unmap BASIC lower ROM + ; Unmap BASIC lower ROM php lda #$26 sta CPU_R6510 - // Perform the copying -!: + ; Perform the copying +@2: lda (memmove__src),y sta (memmove__dst),y iny - bne !- + bne @2 inc memmove__src+1 inc memmove__dst+1 dec memmove__size+1 - bne !- + bne @2 - // FALLTROUGH + ; FALLTROUGH shift_mem_internal_finalize: - // Restore memory mapping and quit + ; Restore memory mapping and quit lda #$27 sta CPU_R6510 @@ -73,6 +73,4 @@ shift_mem_internal_finalize: plp rts - - -#endif +} diff --git a/src/basic/print/list_single_line.s b/src/basic/print/list_single_line.s index 6a0eab20..797b58ea 100644 --- a/src/basic/print/list_single_line.s +++ b/src/basic/print/list_single_line.s @@ -1,52 +1,53 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE + list_single_line: -#if (ROM_LAYOUT_M65 && SEGMENT_BASIC_0) +!ifdef SEGMENT_M65_BASIC_0 { - jsr map_BASIC_1 - jsr_ind VB1__list_single_line - jmp map_NORMAL + jsr map_BASIC_1 + jsr (VB1__list_single_line) + jmp map_NORMAL -#else +} else { - // Print line number - in a new line + ; Print line number - in a new line jsr print_return ldy #3 -#if ROM_LAYOUT_M65 +!ifdef CONFIG_MB_M65 { jsr peek_via_OLDTXT -#elif CONFIG_MEMORY_MODEL_60K +} else ifdef CONFIG_MEMORY_MODEL_60K { jsr peek_under_roms -#elif CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K +} else ifdef CONFIG_MEMORY_MODEL_46K_OR_50K { jsr peek_under_roms_via_OLDTXT -#else // CONFIG_MEMORY_MODEL_38K +} else { ; CONFIG_MEMORY_MODEL_38K lda (OLDTXT),y -#endif +} pha dey -#if ROM_LAYOUT_M65 +!ifdef CONFIG_MB_M65 { jsr peek_via_OLDTXT -#elif CONFIG_MEMORY_MODEL_60K +} else ifdef CONFIG_MEMORY_MODEL_60K { jsr peek_under_roms -#elif CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K +} else ifdef CONFIG_MEMORY_MODEL_46K_OR_50K { jsr peek_under_roms_via_OLDTXT -#else // CONFIG_MEMORY_MODEL_38K +} else { ; CONFIG_MEMORY_MODEL_38K lda (OLDTXT),y -#endif +} tax pla jsr print_integer jsr print_space - // Iterate through printing out the line - // contents + ; Iterate through printing out the line + ; contents lda #0 sta QTSW @@ -54,22 +55,22 @@ list_single_line: list_print_loop: -#if ROM_LAYOUT_M65 +!ifdef CONFIG_MB_M65 { jsr peek_via_OLDTXT -#elif CONFIG_MEMORY_MODEL_60K +} else ifdef CONFIG_MEMORY_MODEL_60K { ldx #str_rev_question jsr STROUT - ply_trash_a + +ply_trash_a - jmp_8 !+ + +bra list_is_literal_known_cont list_is_literal_known: pla jsr JCHROUT -!: + + ; FALLTROUGH + +list_is_literal_known_cont: + iny - bne_16 list_print_loop + +bne list_print_loop - rts // end of line + rts ; end of line list_display_unknown_token: pla pla - jmp_8 list_is_unknown + +bra list_is_unknown list_display_token_01: - // Display a 2-byte token - for extended BASIC + ; Display a 2-byte token - for extended BASIC jsr list_fetch_subtoken - // Check if token is known + ; Check if token is known cpx #TK__MAXTOKEN_keywords_01 bcs list_is_unknown - // Now ask for it to be printed - phy_trash_a + ; Now ask for it to be printed + +phy_trash_a jsr print_packed_keyword_01 - // FALLTROUGH + ; FALLTROUGH list_display_token_ext_done: - ply_trash_a + +ply_trash_a - // Next iteration - jmp_8 list_not_rem + ; Next iteration + +bra list_not_rem -#if !HAS_SMALL_BASIC +!ifndef HAS_SMALL_BASIC { list_display_token_02: - // Display a 2-byte token - for extended BASIC + ; Display a 2-byte token - for extended BASIC jsr list_fetch_subtoken - // Check if token is known + ; Check if token is known cpx #TK__MAXTOKEN_keywords_02 bcs list_is_unknown - // Now ask for it to be printed - phy_trash_a + ; Now ask for it to be printed + +phy_trash_a jsr print_packed_keyword_02 - jmp_8 list_display_token_ext_done + +bra list_display_token_ext_done +} -#endif - -#if ROM_LAYOUT_M65 +!ifdef CONFIG_MB_M65 { list_display_token_03: - // Display a 2-byte token - for extended BASIC + ; Display a 2-byte token - for extended BASIC jsr list_fetch_subtoken - // Check if token is known + ; Check if token is known cpx #TK__MAXTOKEN_keywords_03 bcs list_is_unknown - // Now ask for it to be printed - phy_trash_a + ; Now ask for it to be printed + +phy_trash_a jsr print_packed_keyword_03 - jmp_8 list_display_token_ext_done - -#endif + +bra list_display_token_ext_done +} list_fetch_subtoken: - // Fetch the sub-token + ; Fetch the sub-token iny -#if ROM_LAYOUT_M65 +!ifdef CONFIG_MB_M65 { jsr peek_via_OLDTXT -#elif CONFIG_MEMORY_MODEL_60K +} else ifdef CONFIG_MEMORY_MODEL_60K { ldx #1 - .byte >10 - .byte >100 - .byte >1000 - .byte >10000 + !byte >1 + !byte >10 + !byte >100 + !byte >1000 + !byte >10000 diff --git a/src/basic/print/print_integer_tab_lo.s b/src/basic/print/print_integer_tab_lo.s index 47fef0ec..32f88836 100644 --- a/src/basic/print/print_integer_tab_lo.s +++ b/src/basic/print/print_integer_tab_lo.s @@ -1,15 +1,15 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Helper power of 10s table (low buytes) for 'print_integer' -// +; +; Helper power of 10s table (low buytes) for 'print_integer' +; print_integer_tab_lo: - .byte <1 - .byte <10 - .byte <100 - .byte <1000 - .byte <10000 + !byte <1 + !byte <10 + !byte <100 + !byte <1000 + !byte <10000 diff --git a/src/basic/print/print_packed_dict_string.s b/src/basic/print/print_packed_dict_string.s index 4683b730..a0bb463e 100644 --- a/src/basic/print/print_packed_dict_string.s +++ b/src/basic/print/print_packed_dict_string.s @@ -1,43 +1,43 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -#if CONFIG_COMPRESSION_LVL_2 +!ifdef CONFIG_COMPRESSION_LVL_2 { -print_packed_error: // .X - error string index +print_packed_error: ; .X - error string index lda #packed_dict_errors - bne print_dict_packed_string // branch always + bne print_dict_packed_string ; branch always -print_packed_misc_str: // .X - misc string index +print_packed_misc_str: ; .X - misc string index lda #packed_dict_misc - // FALLTROUGH + ; FALLTROUGH print_dict_packed_string: - // Search for the packed string on the list + ; Search for the packed string on the list jsr print_packed_search ldy #$00 -!: - // At this point FRESPC contains a pointer to the string to display - // Fetch a byte-code +@1: + ; At this point FRESPC contains a pointer to the string to display + ; Fetch a byte-code lda (FRESPC), y - beq print_dict_packed_string_end // branch if everything displayed + beq print_dict_packed_string_end ; branch if everything displayed tax dex - // Call 'print_freq_packed_string' - but preserve all the data needed to progress further + ; Call 'print_freq_packed_string' - but preserve all the data needed to progress further - phy_trash_a + +phy_trash_a lda FRESPC+0 pha lda FRESPC+1 @@ -52,16 +52,14 @@ print_dict_packed_string: sta FRESPC+1 pla sta FRESPC+0 - ply_trash_a + +ply_trash_a - // Next iteration + ; Next iteration iny - bne !- // branch always + bne @1 ; branch always print_dict_packed_string_end: rts - - -#endif +} diff --git a/src/basic/print/print_packed_freq_string.s b/src/basic/print/print_packed_freq_string.s index 100da364..8450317e 100644 --- a/src/basic/print/print_packed_freq_string.s +++ b/src/basic/print/print_packed_freq_string.s @@ -1,125 +1,122 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// This routine prints strings that have been packed using the 'generate_trings' tool. -// The general idea is to save space in the ROM. +; This routine prints strings that have been packed using the 'generate_trings' tool. +; The general idea is to save space in the ROM. -#if (ROM_LAYOUT_M65 && SEGMENT_BASIC_0) +!ifdef SEGMENT_M65_BASIC_0 { print_packed_error: - jsr map_BASIC_1 - jsr_ind VB1__print_packed_error - jmp map_NORMAL + jsr map_BASIC_1 + jsr (VB1__print_packed_error) + jmp map_NORMAL print_packed_misc_str: - jsr map_BASIC_1 - jsr_ind VB1__print_packed_misc_str - jmp map_NORMAL + jsr map_BASIC_1 + jsr (VB1__print_packed_misc_str) + jmp map_NORMAL -#else +} else { -#if !CONFIG_COMPRESSION_LVL_2 +!ifndef CONFIG_COMPRESSION_LVL_2 { -print_packed_error: // .X - error string index +print_packed_error: ; .X - error string index lda #packed_freq_errors - bne print_freq_packed_string // branch always + bne print_freq_packed_string ; branch always -print_packed_misc_str: // .X - misc string index +print_packed_misc_str: ; .X - misc string index lda #packed_freq_misc - bne print_freq_packed_string // branch always + bne print_freq_packed_string ; branch always +} -#endif - -print_packed_keyword_01: // .X - token number +print_packed_keyword_01: ; .X - token number lda #packed_freq_keywords_01 - bne print_freq_packed_string // branch always + bne print_freq_packed_string ; branch always -#if !HAS_SMALL_BASIC +!ifndef HAS_SMALL_BASIC { -print_packed_keyword_02: // .X - token number +print_packed_keyword_02: ; .X - token number lda #packed_freq_keywords_02 - bne print_freq_packed_string // branch always + bne print_freq_packed_string ; branch always +} -#endif +!ifdef CONFIG_MB_M65 { -#if ROM_LAYOUT_M65 - -print_packed_keyword_03: // .X - token number +print_packed_keyword_03: ; .X - token number lda #packed_freq_keywords_03 - bne print_freq_packed_string // branch always + bne print_freq_packed_string ; branch always +} -#endif - -print_packed_keyword_V2: // .X - token number +print_packed_keyword_V2: ; .X - token number lda #packed_freq_keywords_V2 - // FALLTROUGH + ; FALLTROUGH -print_freq_packed_string: // not to be used directly XXX rename to print_packed_string +print_freq_packed_string: ; not to be used directly XXX rename to print_packed_string - // Search for the packed string on the list + ; Search for the packed string on the list jsr print_packed_search - // At this point FRESPC contains a pointer to the string to display - // and we should start from the lower nibble + ; At this point FRESPC contains a pointer to the string to display + ; and we should start from the lower nibble ldy #$00 - // FALLTROUGH + ; FALLTROUGH print_freq_packed_string_nibble_lo: - // Get the low nibble and check for the end of packed string + ; Get the low nibble and check for the end of packed string lda (FRESPC), y and #$0F beq print_freq_packed_string_end - // Not the end - check if this is a common character, encoded by a single nibble + ; Not the end - check if this is a common character, encoded by a single nibble cmp #$0F beq print_freq_packed_string_3n_split - // Character is encoded by a single nibble - fetch it and display + ; Character is encoded by a single nibble - fetch it and display tax lda packed_as_1n-1, x - jsr JCHROUT // preserves .Y + jsr JCHROUT ; preserves .Y - // FALLTROUGH + ; FALLTROUGH print_freq_packed_string_nibble_hi: - // Get the high nibble and check for the end of packed string + ; Get the high nibble and check for the end of packed string lda (FRESPC), y and #$F0 beq print_freq_packed_string_end - // Not the end - check if this is a common character, encoded by a single nibble + ; Not the end - check if this is a common character, encoded by a single nibble cmp #$F0 beq print_freq_packed_string_3n_single - // Character is encoded by a single nibble - fetch it and display + ; Character is encoded by a single nibble - fetch it and display lsr lsr @@ -128,28 +125,32 @@ print_freq_packed_string_nibble_hi: tax lda packed_as_1n-1, x - jmp_8 !+ + +bra print_freq_packed_string_3n_single_cont print_freq_packed_string_3n_single: - // Character is encoded using 3 nibbles (1st is a mark, already interpreted) + ; Character is encoded using 3 nibbles (1st is a mark, already interpreted) iny lda (FRESPC), y tax lda packed_as_3n-1, x -!: - jsr JCHROUT // preserves .Y - // Advance to next nibble + ; FALLTROUGH + +print_freq_packed_string_3n_single_cont: + + jsr JCHROUT ; preserves .Y + + ; Advance to next nibble iny - bne print_freq_packed_string_nibble_lo // branch always + bne print_freq_packed_string_nibble_lo ; branch always print_freq_packed_string_3n_split: - // Character is encoded using 3 nibbles (1st is a mark, already interpreted), - // but the 2 remaining nibbles are in two neighbour bytes; use a stack to combine them + ; Character is encoded using 3 nibbles (1st is a mark, already interpreted), + ; but the 2 remaining nibbles are in two neighbour bytes; use a stack to combine them lda (FRESPC), y and #$F0 @@ -163,11 +164,11 @@ print_freq_packed_string_3n_split: clc adc STACK, x - txs // one cycle faster than PLA + txs ; one cycle faster than PLA tax lda packed_as_3n-1, x - jsr JCHROUT // preserves .Y + jsr JCHROUT ; preserves .Y jmp print_freq_packed_string_nibble_hi @@ -176,4 +177,4 @@ print_freq_packed_string_end: rts -#endif // ROM layout +} ; ROM layout diff --git a/src/basic/print/print_packed_search.s b/src/basic/print/print_packed_search.s index f536eb2e..8012727c 100644 --- a/src/basic/print/print_packed_search.s +++ b/src/basic/print/print_packed_search.s @@ -1,31 +1,31 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE print_packed_search: - // First store the initial address of the packed strings list + ; First store the initial address of the packed strings list sta FRESPC+0 sty FRESPC+1 - // Now find the address of the string to print out - // The implementation assumes no packed string is longer than 255 bytes, including trailing zero -!: + ; Now find the address of the string to print out + ; The implementation assumes no packed string is longer than 255 bytes, including trailing zero +@1: cpx #$00 - beq print_packed_done // branch if no need to advance anymore + beq print_packed_done ; branch if no need to advance anymore dex ldy #$00 -!: +@2: lda (FRESPC), y iny cmp #$00 - bne !- // branch if not the end of packed string + bne @2 ; branch if not the end of packed string - clc // advance FREESPC pointer + clc ; advance FREESPC pointer tya adc FRESPC+0 sta FRESPC+0 @@ -33,7 +33,7 @@ print_packed_search: adc FRESPC+1 sta FRESPC+1 - jmp !-- + +bra @1 print_packed_done: diff --git a/src/basic/rom_revision/a004.identifier.s b/src/basic/rom_revision/a004.identifier.s index c8c4e527..a07354d5 100644 --- a/src/basic/rom_revision/a004.identifier.s +++ b/src/basic/rom_revision/a004.identifier.s @@ -1,23 +1,22 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// Computes Mapping the 64, p89 - 8 character name +; Computes Mapping the 64, p89 - 8 character name -#if ROM_LAYOUT_M65 +!ifdef CONFIG_MB_M65 { - // 'M65BASIC' + ; 'M65BASIC' - .byte $4D, $36, $35 // 'M65' + !byte $4D, $36, $35 ; 'M65' -#else +} else { - // 'ORGBASIC', Open ROMs Generic BASIC + ; 'ORGBASIC', Open ROMs Generic BASIC - .byte $4F, $52, $47 // 'ORG' + !byte $4F, $52, $47 ; 'ORG' +} -#endif - - .byte $42, $41, $53, $49, $43 // 'BASIC' + !byte $42, $41, $53, $49, $43 ; 'BASIC' diff --git a/src/basic/rom_revision/bf52.rom_revision_basic.s b/src/basic/rom_revision/bf52.rom_revision_basic.s index c3920eea..bb73cb60 100644 --- a/src/basic/rom_revision/bf52.rom_revision_basic.s +++ b/src/basic/rom_revision/bf52.rom_revision_basic.s @@ -1,36 +1,34 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// !!! PROPOSAL ONLY !!! PROPOSAL ONLY !!! NOT FOR USING EXTERNALLY YET !!! -// -// -// Do not change! Locations of the following data should be constant - now and forever! -// -// If you want to integrate Open ROMs support in your emulator, FPGA ccomputer, etc. - this -// is the official way to recognize the ROM and its revision. -// +; +; Do not change - unless there is a really important reason! +; Ideally, locations of the following data should be constant - now and forever! +; +; If you want to integrate Open ROMs support in your emulator, FPGA computer, etc. - this +; is the official way to recognize the ROM and its revision. +; rom_revision_basic: - // $BF52 + ; $BF52 - .text "OR" // project signature, after "Open ROMs" - .byte CONFIG_ID // config file ID, might change between revisions + !pet "or" ; project signature, "OR" stands for "Open ROMs" + !byte CONFIG_ID ; config file ID - this may change between revisions, without any warning rom_revision_basic_string: - // $BF55 + ; $BF55 -#if !CONFIG_BRAND_CUSTOM_BUILD - .text "(DEVEL SNAPSHOT)" // actual ROM revision string; up to 16 characters -#else - .text "(CUSTOM BUILD)" -#endif +!ifndef CONFIG_BRAND_CUSTOM_BUILD { + !pet "(devel snapshot)" ; ROM revision string; up to 16 characters, string format will change in the future +} else { + !pet "(custom build)" +} - .byte $00 // marks the end of string + !byte $00 ; marks the end of string __rom_revision_basic_end: diff --git a/src/basic/rom_revision/e4b7.rom_revision_kernal.s b/src/basic/rom_revision/e4b7.rom_revision_kernal.s index e9254347..9388caaf 100644 --- a/src/basic/rom_revision/e4b7.rom_revision_kernal.s +++ b/src/basic/rom_revision/e4b7.rom_revision_kernal.s @@ -1,49 +1,47 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// !!! PROPOSAL ONLY !!! PROPOSAL ONLY !!! NOT FOR USING EXTERNALLY YET !!! -// -// -// Do not change! Locations of the following data should be constant - now and forever! -// -// If you want to integrate Open ROMs support in your emulator, FPGA ccomputer, etc. - this -// is the official way to recognize the ROM and its revision. -// +; +; Do not change - unless there is a really important reason! +; Ideally, locations of the following data should be constant - now and forever! +; +; If you want to integrate Open ROMs support in your emulator, FPGA computer, etc. - this +; is the official way to recognize the ROM and its revision. +; - // $E4B7 + ; $E4B7 - // This vector is to be used by non-Kernal ROMs, if they want to - // complain about incompatible ROM releases - do not use it directly, - // use a 'panic' pseudocommand with error code (will be passed using .A) - // #P_ERR_ROM_MISMATCH - it should remain stable even between releases + ; This vector is to be used by non-Kernal ROMs, if they want to + ; complain about incompatible ROM releases - do not use it directly, + ; use a 'panic' pseudocommand with error code (will be passed using .A) + ; #P_ERR_ROM_MISMATCH - it should remain stable even between releases -#if CONFIG_PANIC_SCREEN - .word panic -#else - .word hw_entry_reset -#endif +!ifdef CONFIG_PANIC_SCREEN { + !word panic +} else { + !word hw_entry_reset +} rom_revision_kernal: - // $E4B9 + ; $E4B9 - .text "OR" // project signature, after "Open ROMs" - .byte CONFIG_ID // config file ID, might change between revisions + !pet "or" ; project signature, "OR" stands for "Open ROMs" + !byte CONFIG_ID ; config file ID - this may change between revisions, without any warning rom_revision_kernal_string: - // $E4BC + ; $E4BC -#if !CONFIG_BRAND_CUSTOM_BUILD - .text "(DEVEL SNAPSHOT)" // actual ROM revision string; up to 16 characters -#else - .text "(CUSTOM BUILD)" -#endif +!ifndef CONFIG_BRAND_CUSTOM_BUILD { + !pet "(devel snapshot)" ; ROM revision string; up to 16 characters, string format will change in the future +} else { + !pet "(custom build)" +} - .byte $00 // marks the end of string + !byte $00 ; marks the end of string __rom_revision_kernal_end: diff --git a/src/basic/wedge/wedge_dos.s b/src/basic/wedge/wedge_dos.s index 8ca489e0..eaa80fa4 100644 --- a/src/basic/wedge/wedge_dos.s +++ b/src/basic/wedge/wedge_dos.s @@ -1,92 +1,92 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE -#if CONFIG_DOS_WEDGE +!ifdef CONFIG_DOS_WEDGE { -// .X has to contain size of the buffer +; .X has to contain size of the buffer wedge_dos: -#if (ROM_LAYOUT_M65 && SEGMENT_BASIC_0) +!ifdef SEGMENT_M65_BASIC_0 { - jsr map_BASIC_1 - jsr_ind VB1__wedge_dos - jmp map_NORMAL + jsr map_BASIC_1 + jsr (VB1__wedge_dos) + jmp map_NORMAL -#else +} else { - // Prepare buffer - finish it with '0' + ; Prepare buffer - finish it with '0' lda #$00 sta BUF,x - // Close all the channels, so that wedge has full control + ; Close all the channels, so that wedge has full control jsr JCLALL - // Set file parameters, channel 15 is a typical one for commands - jsr SELDEV // sets .X register + ; Set file parameters, channel 15 is a typical one for commands + jsr SELDEV ; sets .X register lda #$0F ldy #$0F jsr JSETFLS - // Setup necessary part of BASIC + ; Setup necessary part of BASIC jsr prepare_direct_execution jsr fetch_character - // Now we have to check what the user wants us to do + ; Now we have to check what the user wants us to do - // Check if user asked for a status + ; Check if user asked for a status ldy #$00 lda (TXTPTR), y - beq_16 wedge_dos_status + +beq wedge_dos_status - // Check if asked for a directory + ; Check if asked for a directory cmp #$24 - beq_16 wedge_dos_directory + +beq wedge_dos_directory - // Check if asked to change drive number, or if it is a regular command + ; Check if asked to change drive number, or if it is a regular command jsr is_09 bcc wedge_dos_change_drive - // FALLTROUGH + ; FALLTROUGH wedge_dos_command: -#if !HAS_SMALL_BASIC +!ifndef HAS_SMALL_BASIC { - // Check if command needs confirmation + ; Check if command needs confirmation ldy #$00 lda (TXTPTR), y - cmp #$52 // 'R' - because 'RD' is a directory removal command - bne !+ + cmp #$52 ; 'R' - because 'RD' is a directory removal command + bne @1 iny lda (TXTPTR), y - cmp #$44 // 'D' + cmp #$44 ; 'D' bne wedge_dos_command_confirmed beq wedge_dos_command_ask -!: - cmp #$4E // 'N' - for the disk format - beq !+ - cmp #$53 // 'S' - for the file scratch +@1: + cmp #$4E ; 'N' - for the disk format + beq @2 + cmp #$53 ; 'S' - for the file scratch bne wedge_dos_command_confirmed -!: - // This is probably a dangerous command - check further the syntax, - // if 'N:', 'S:', 'Nx:' or 'Sx:' (where 'x' is a digit) - ask for confirmation first +@2: + ; This is probably a dangerous command - check further the syntax, + ; if 'N:', 'S:', 'Nx:' or 'Sx:' (where 'x' is a digit) - ask for confirmation first iny lda (TXTPTR), y - cmp #$3A // ':' - colon + cmp #$3A ; ':' - colon beq wedge_dos_command_ask jsr is_09 @@ -94,125 +94,125 @@ wedge_dos_command: iny lda (TXTPTR), y - cmp #$3A // ':' - colon + cmp #$3A ; ':' - colon bne wedge_dos_command_confirmed - // FALLTROUGH + ; FALLTROUGH wedge_dos_command_ask: jsr helper_ask_if_sure - bcs_16 wedge_dos_clean_exit + +bcs wedge_dos_clean_exit - // FALLTROUGH + ; FALLTROUGH wedge_dos_command_confirmed: -#endif // !HAS_SMALL_BASIC +} ; !HAS_SMALL_BASIC - // Provide command name + ; Provide command name jsr wedge_dos_setnam jsr JSETNAM jsr JOPEN - bcs_16 wedge_dos_basic_error + +bcs wedge_dos_basic_error - // Retrieve status, print it if not OK + ; Retrieve status, print it if not OK jsr JCLALL jsr wedge_dos_status_get_no_new_line lda BUF+0 - cmp #$30 // '0' + cmp #$30 ; '0' bne wedge_dos_status_print eor BUF+1 bne wedge_dos_status_print - // Clean-up and exit + ; Clean-up and exit jmp wedge_dos_clean_exit wedge_dos_change_drive: - // Fetch new drive number, make sure this is the last part of the command + ; Fetch new drive number, make sure this is the last part of the command jsr fetch_uint8 pha jsr fetch_character_skip_spaces cmp #$00 - bne_16 do_SYNTAX_error + +bne do_SYNTAX_error pla - // Check if device number is valid for IEC drive + ; Check if device number is valid for IEC drive cmp #$08 - bcc_16 do_ILLEGAL_DEVICE_NUMBER_error + +bcc do_ILLEGAL_DEVICE_NUMBER_error - // Store new device number and return to shell + ; Store new device number and return to shell sta FA jmp shell_main_loop wedge_dos_status_get: - // New line - separate status from current display + ; New line - separate status from current display jsr print_return - // FALLTROUGH + ; FALLTROUGH wedge_dos_status_get_no_new_line: - // Here the flow is mostly the same as in the example from - // https://codebase64.org/doku.php?id=base:reading_the_error_channel_of_a_disk_drive + ; Here the flow is mostly the same as in the example from + ; https://codebase64.org/doku.php?id=base:reading_the_error_channel_of_a_disk_drive - // Set remaining file parameters, open the channel + ; Set remaining file parameters, open the channel - lda #$00 // empty file name + lda #$00 ; empty file name jsr JSETNAM jsr JOPEN - bcs_16 wedge_dos_basic_error + +bcs wedge_dos_basic_error - // Set channel for input + ; Set channel for input ldx #$0F jsr JCHKIN - bcs_16 wedge_dos_basic_error + +bcs wedge_dos_basic_error - // Fetch the drive status + ; Fetch the drive status ldy #$00 - // FALLTROUGH + ; FALLTROUGH wedge_dos_status_get_loop: - // Check for buffer overflow + ; Check for buffer overflow cpy #$50 - beq_16 do_OVERFLOW_error + +beq do_OVERFLOW_error - // Check for EOF + ; Check for EOF jsr JREADST - // XXX check for transfer errors + ; XXX check for transfer errors bne wedge_dos_status_get_done - // Retrieve a byte and put it into the buffer + ; Retrieve a byte and put it into the buffer jsr JCHRIN - bcs_16 wedge_dos_basic_error + +bcs wedge_dos_basic_error sta BUF, y iny - bne wedge_dos_status_get_loop // branch always + bne wedge_dos_status_get_loop ; branch always wedge_dos_status_get_done: - // Strip ending RETURN + ; Strip ending RETURN dey rts @@ -220,45 +220,45 @@ wedge_dos_status_get_done: wedge_dos_status: jsr wedge_dos_status_get - jmp_8 wedge_dos_status_print_no_new_line + +bra wedge_dos_status_print_no_new_line wedge_dos_status_print: jsr print_return - // FALLTROUGH + ; FALLTROUGH wedge_dos_status_print_no_new_line: - // Print buffered status + ; Print buffered status ldx #$00 -!: +@3: dey - bmi !+ + bmi @4 lda BUF, x jsr JCHROUT inx - bne !- -!: - // Clean-up and exit + bne @3 +@4: + ; Clean-up and exit - jmp_8 wedge_dos_clean_exit + +bra wedge_dos_clean_exit wedge_dos_directory: - // First change the secondary address to the one suitable for directory loading + ; First change the secondary address to the one suitable for directory loading - lda #$00 // logical device number + lda #$00 ; logical device number ldx FA ldy #$60 jsr JSETFLS - // Provide file name + ; Provide file name jsr wedge_dos_setnam - // Open the file, set channel for reading + ; Open the file, set channel for reading jsr JOPEN bcs wedge_dos_basic_error @@ -267,52 +267,52 @@ wedge_dos_directory: jsr JCHKIN bcs wedge_dos_basic_error - // Ignore start address (2 first bytes) - XXX check for errors + ; Ignore start address (2 first bytes) - XXX check for errors jsr JCHRIN bcs wedge_dos_basic_error jsr JCHRIN bcs wedge_dos_basic_error - // FALLTROUGH + ; FALLTROUGH wedge_dos_directory_line: - // Load a single line, reuse BASIC input buffer + ; Load a single line, reuse BASIC input buffer ldy #$FF -!: +@5: iny jsr JCHRIN bcs wedge_dos_basic_error sta BUF, y cpy #$50 - beq_16 do_OVERFLOW_error // branch if line too long + +beq do_OVERFLOW_error ; branch if line too long jsr JREADST - bne !+ // end of file - cpy #$04 // 2 bytes (pointer to next line) + 2 bytes (line number) - bcc !- + bne @6 ; end of file + cpy #$04 ; 2 bytes (pointer to next line) + 2 bytes (line number) + bcc @5 lda BUF, y - bne !- + bne @5 - // End of line, but not end of file + ; End of line, but not end of file beq wedge_dos_directory_display -!: +@6: lda #K_STS_END_OF_FILE - sta IOSTATUS // make sure end of file is marked + sta IOSTATUS ; make sure end of file is marked - // FALLTROUGH + ; FALLTROUGH wedge_dos_directory_display: - cpy #$05 // protection against malformed directory + cpy #$05 ; protection against malformed directory bcc wedge_dos_clean_exit - lda #$00 // extra protection agains buffer overflow + lda #$00 ; extra protection agains buffer overflow sta BUF, y - // Display line + ; Display line ldx #16380 +; +; Values for IRQ generation timer - original idea was: +; +; (This value was calculated by running a custom IRQ handler on a C64 +; with original KERNAL, and writing the values of $DC04/5 to the screen +; in the IRQ handler to see roughly what value the timers must be set to) +; ldy #<16380 +; ldx #>16380 -// Current values selected on the following assumptions: -// -// PAL C64 (https://codebase64.org/doku.php?id=base:cpu_clocking), -// is clocked at 0.985248 MHz, so that 1/60s is 16421 ($4025) CPU cycles -// -// NTSC C64 (https://codebase64.org/doku.php?id=base:cpu_clocking), -// is clocked at 1.022727 MHz, so that 1/60s is 17045 ($4295) CPU cycles +; Current values selected on the following assumptions: +; +; PAL C64 (https://codebase64.org/doku.php?id=base:cpu_clocking), +; is clocked at 0.985248 MHz, so that 1/60s is 16421 ($4025) CPU cycles +; +; NTSC C64 (https://codebase64.org/doku.php?id=base:cpu_clocking), +; is clocked at 1.022727 MHz, so that 1/60s is 17045 ($4295) CPU cycles -irq_timing_hi: // high bytes +irq_timing_hi: ; high bytes -#if !CONFIG_RS232_UP9600 +!ifndef CONFIG_RS232_UP9600 { - .byte >17045 // NTSC - .byte >16421 // PAL + !byte >17045 ; NTSC + !byte >16421 ; PAL -#else +} else { -// -// Timer values needed by UP9600 -// -// Original driver code by Daniel Dallman with Bo Zimmerman adaptations, -// these causes the tick to be generated 64 times per second -// +; +; Timer values needed by UP9600 +; +; Original driver code by Daniel Dallman with Bo Zimmerman adaptations, +; these causes the tick to be generated 64 times per second +; - .byte $42 // NTSC - .byte $40 // PAL - -#endif \ No newline at end of file + !byte $42 ; NTSC + !byte $40 ; PAL +} diff --git a/src/kernal/assets/irq_timing_lo.s b/src/kernal/assets/irq_timing_lo.s index 3760f444..c7663df6 100644 --- a/src/kernal/assets/irq_timing_lo.s +++ b/src/kernal/assets/irq_timing_lo.s @@ -1,42 +1,41 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Values for IRQ generation timer - original idea was: -// -// (This value was calculated by running a custom IRQ handler on a C64 -// with original KERNAL, and writing the values of $DC04/5 to the screen -// in the IRQ handler to see roughly what value the timers must be set to) -// ldy #<16380 -// ldx #>16380 +; +; Values for IRQ generation timer - original idea was: +; +; (This value was calculated by running a custom IRQ handler on a C64 +; with original KERNAL, and writing the values of $DC04/5 to the screen +; in the IRQ handler to see roughly what value the timers must be set to) +; ldy #<16380 +; ldx #>16380 -// Current values selected on the following assumptions: -// -// PAL C64 (https://codebase64.org/doku.php?id=base:cpu_clocking), -// is clocked at 0.985248 MHz, so that 1/60s is 16421 ($4025) CPU cycles -// -// NTSC C64 (https://codebase64.org/doku.php?id=base:cpu_clocking), -// is clocked at 1.022727 MHz, so that 1/60s is 17045 ($4295) CPU cycles +; Current values selected on the following assumptions: +; +; PAL C64 (https://codebase64.org/doku.php?id=base:cpu_clocking), +; is clocked at 0.985248 MHz, so that 1/60s is 16421 ($4025) CPU cycles +; +; NTSC C64 (https://codebase64.org/doku.php?id=base:cpu_clocking), +; is clocked at 1.022727 MHz, so that 1/60s is 17045 ($4295) CPU cycles -irq_timing_lo: // low bytes +irq_timing_lo: ; low bytes -#if !CONFIG_RS232_UP9600 +!ifndef CONFIG_RS232_UP9600 { - .byte <17045 // NTSC - .byte <16421 // PAL + !byte <17045 ; NTSC + !byte <16421 ; PAL -#else +} else { -// -// Timer values needed by UP9600 -// -// Original driver code by Daniel Dallman with Bo Zimmerman adaptations, -// these causes the tick to be generated 64 times per second -// +; +; Timer values needed by UP9600 +; +; Original driver code by Daniel Dallman with Bo Zimmerman adaptations, +; these causes the tick to be generated 64 times per second +; - .byte $95 // NTSC - .byte $25 // PAL - -#endif \ No newline at end of file + !byte $95 ; NTSC + !byte $25 ; PAL +} diff --git a/src/kernal/assets/kernal_messages.s b/src/kernal/assets/kernal_messages.s index 16129aa8..5c816750 100644 --- a/src/kernal/assets/kernal_messages.s +++ b/src/kernal/assets/kernal_messages.s @@ -1,98 +1,91 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Messages to be prined out by Kernal -// - -.encoding "petscii_upper" +; +; Messages to be prined out by Kernal +; -// Double underscore prevents labels from being passed to VICE (would confuse monitor) +; Double underscore prevents labels from being passed to VICE (would confuse monitor) -.label __MSG_KERNAL_SEARCHING_FOR = __msg_kernalsearching_for - __msg_kernal_first -.label __MSG_KERNAL_LOADING = __msg_kernalloading - __msg_kernal_first -.label __MSG_KERNAL_VERIFYING = __msg_kernalverifying - __msg_kernal_first -.label __MSG_KERNAL_SAVING = __msg_kernalsaving - __msg_kernal_first -.label __MSG_KERNAL_FROM_HEX = __msg_kernalfrom_hex - __msg_kernal_first -.label __MSG_KERNAL_TO_HEX = __msg_kernalto_hex - __msg_kernal_first +!addr __MSG_KERNAL_SEARCHING_FOR = __msg_kernalsearching_for - __msg_kernal_first +!addr __MSG_KERNAL_LOADING = __msg_kernalloading - __msg_kernal_first +!addr __MSG_KERNAL_VERIFYING = __msg_kernalverifying - __msg_kernal_first +!addr __MSG_KERNAL_SAVING = __msg_kernalsaving - __msg_kernal_first +!addr __MSG_KERNAL_FROM_HEX = __msg_kernalfrom_hex - __msg_kernal_first +!addr __MSG_KERNAL_TO_HEX = __msg_kernalto_hex - __msg_kernal_first -#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO -.label __MSG_KERNAL_PRESS_PLAY = __msg_kernalplay - __msg_kernal_first -.label __MSG_KERNAL_FOUND = __msg_kernalfound - __msg_kernal_first -#if CONFIG_MB_MEGA_65 -.label __MSG_KERNAL_OK_SEARCHING = __msg_kernaloksearching - __msg_kernal_first -#endif -#endif +!ifdef HAS_TAPE { +!addr __MSG_KERNAL_PRESS_PLAY = __msg_kernalplay - __msg_kernal_first +!addr __MSG_KERNAL_FOUND = __msg_kernalfound - __msg_kernal_first +!ifdef CONFIG_MB_M65 { +!addr __MSG_KERNAL_OK_SEARCHING = __msg_kernaloksearching - __msg_kernal_first +} } -#if CONFIG_PANIC_SCREEN -.label __MSG_KERNAL_PANIC = __msg_kernalpanic - __msg_kernal_first -.label __MSG_KERNAL_PANIC_ROM_MISMATCH = __msg_kernalpanic_rom_mismatch - __msg_kernal_first -#endif +!ifdef CONFIG_PANIC_SCREEN { +!addr __MSG_KERNAL_PANIC = __msg_kernalpanic - __msg_kernal_first +!addr __MSG_KERNAL_PANIC_ROM_MISMATCH = __msg_kernalpanic_rom_mismatch - __msg_kernal_first +} __msg_kernal_first: __msg_kernalsearching_for: - .byte $0D - .text "SEARCHING FOR" - .byte $80 + $20 // end of string mark + space + !byte $0D + !pet "searching for" + !byte $80 + $20 ; end of string mark + space __msg_kernalloading: - .byte $0D - .text "LOADIN" - .byte $80 + $47 // end of string mark + 'G' + !byte $0D + !pet "loadin" + !byte $80 + $47 ; end of string mark + 'G' __msg_kernalverifying: - .byte $0D - .text "VERIFYIN" - .byte $80 + $47 // end of string mark + 'G' + !byte $0D + !pet "verifyin" + !byte $80 + $47 ; end of string mark + 'G' __msg_kernalsaving: - .byte $0D - .text "SAVING" - .byte $80 + $20 // end of string mark + space + !byte $0D + !pet "saving" + !byte $80 + $20 ; end of string mark + space __msg_kernalfrom_hex: - .text " FROM " - .byte $80 + $24 // end of string mark + '$' + !pet " from " + !byte $80 + $24 ; end of string mark + '$' __msg_kernalto_hex: - .text " TO " - .byte $80 + $24 // end of string mark + '$' + !pet " to " + !byte $80 + $24 ; end of string mark + '$' -#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO +!ifdef HAS_TAPE { __msg_kernalplay: - .byte $0D - .text "PRESS PLAY ON TAPE" - .byte $80 + $0D // end of string mark + return + !byte $0D + !pet "press play on tape" + !byte $80 + $0D ; end of string mark + return __msg_kernalfound: - .text "FOUND" - .byte $80 + $20 // end of string mark + space + !pet "found" + !byte $80 + $20 ; end of string mark + space -#if CONFIG_MB_MEGA_65 +!ifdef CONFIG_MB_M65 { __msg_kernaloksearching: - .text "OK" - .byte $0D, $0D - .text "SEARCHIN" - .byte $80 + $47 // end of string mark + 'G' + !pet "ok" + !byte $0D, $0D + !pet "searchin" + !byte $80 + $47 ; end of string mark + 'G' +} } -#endif - -#endif - -#if CONFIG_PANIC_SCREEN +!ifdef CONFIG_PANIC_SCREEN { __msg_kernalpanic: - .text "KERNAL PANI" - .byte $80 + $43 // end of string mark + 'C' + !pet "kernal pani" + !byte $80 + $43 ; end of string mark + 'C' __msg_kernalpanic_rom_mismatch: - .text " - ROM MISMATC" - .byte $80 + $48 // end of string mark + 'H' - -#endif // CONFIG_PANIC_SCREEN + !pet " - rom mismatc" + !byte $80 + $48 ; end of string mark + 'H' +} diff --git a/src/kernal/assets/programmable_keys.s b/src/kernal/assets/programmable_keys.s index 181914e0..4a0f88a4 100644 --- a/src/kernal/assets/programmable_keys.s +++ b/src/kernal/assets/programmable_keys.s @@ -1,128 +1,139 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Command string definitions for programmable keys -// +; +; Command string definitions for programmable keys +; -#if CONFIG_PROGRAMMABLE_KEYS - - -.macro PROGRAMMABLE_KEY_CODE(STR, CODE) -{ - .if (STR.size() > 0) - { - .byte CODE - } -} - -.macro PROGRAMMABLE_KEY_STRING(STR) -{ - .if (STR.size() > 0) - { - .text STR - .byte $00 - } -} - -.macro PROGRAMMABLE_KEY_OFFSET(STR, LABEL) -{ - .if (STR.size() > 0) - { - .byte LABEL - programmable_keys_strings - } -} +!ifdef CONFIG_PROGRAMMABLE_KEYS { programmable_keys_codes: - PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_RUN, KEY_RUN) + !ifdef CONFIG_KEYCMD_RUN { !byte KEY_RUN } - PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F1, KEY_F1) - PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F2, KEY_F2) - PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F3, KEY_F3) - PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F4, KEY_F4) - PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F5, KEY_F5) - PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F6, KEY_F6) - PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F7, KEY_F7) - PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F8, KEY_F8) + !ifdef CONFIG_KEYCMD_F1 { !byte KEY_F1 } + !ifdef CONFIG_KEYCMD_F2 { !byte KEY_F2 } + !ifdef CONFIG_KEYCMD_F3 { !byte KEY_F3 } + !ifdef CONFIG_KEYCMD_F4 { !byte KEY_F4 } + !ifdef CONFIG_KEYCMD_F5 { !byte KEY_F5 } + !ifdef CONFIG_KEYCMD_F6 { !byte KEY_F6 } + !ifdef CONFIG_KEYCMD_F7 { !byte KEY_F7 } + !ifdef CONFIG_KEYCMD_F8 { !byte KEY_F8 } -#if !CONFIG_LEGACY_SCNKEY && (CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65) - PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_HELP, KEY_HELP) -#endif +!ifndef CONFIG_LEGACY_SCNKEY { + +!ifdef CONFIG_KEYBOARD_C128 { + + !ifdef CONFIG_KEYCMD_HELP { !byte KEY_HELP } + +} else ifdef CONFIG_KEYBOARD_C65 { + + !ifdef CONFIG_KEYCMD_HELP { !byte KEY_HELP } + + !ifdef CONFIG_KEYCMD_F9 { !byte KEY_F9 } + !ifdef CONFIG_KEYCMD_F10 { !byte KEY_F10 } + !ifdef CONFIG_KEYCMD_F11 { !byte KEY_F11 } + !ifdef CONFIG_KEYCMD_F12 { !byte KEY_F12 } + !ifdef CONFIG_KEYCMD_F13 { !byte KEY_F13 } + !ifdef CONFIG_KEYCMD_F14 { !byte KEY_F14 } + + +} } -#if !CONFIG_LEGACY_SCNKEY && CONFIG_KEYBOARD_C65 - PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F9, KEY_F9) - PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F10, KEY_F10) - PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F11, KEY_F11) - PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F12, KEY_F12) - PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F13, KEY_F13) - PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F14, KEY_F14) -#endif __programmable_keys_codes_end: programmable_keys_strings: -__str_offset_RUN: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_RUN) +__str_offset_RUN: !ifdef CONFIG_KEYCMD_RUN { +CONFIG_KEYCMD_RUN + !byte $00 } -__str_offset_F1: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F1) -__str_offset_F2: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F2) -__str_offset_F3: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F3) -__str_offset_F4: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F4) -__str_offset_F5: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F5) -__str_offset_F6: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F6) -__str_offset_F7: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F7) -__str_offset_F8: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F8) +__str_offset_F1: !ifdef CONFIG_KEYCMD_F1 { +CONFIG_KEYCMD_F1 + !byte $00 } +__str_offset_F2: !ifdef CONFIG_KEYCMD_F2 { +CONFIG_KEYCMD_F2 + !byte $00 } +__str_offset_F3: !ifdef CONFIG_KEYCMD_F3 { +CONFIG_KEYCMD_F3 + !byte $00 } +__str_offset_F4: !ifdef CONFIG_KEYCMD_F4 { +CONFIG_KEYCMD_F4 + !byte $00 } +__str_offset_F5: !ifdef CONFIG_KEYCMD_F5 { +CONFIG_KEYCMD_F5 + !byte $00 } +__str_offset_F6: !ifdef CONFIG_KEYCMD_F6 { +CONFIG_KEYCMD_F6 + !byte $00 } +__str_offset_F7: !ifdef CONFIG_KEYCMD_F7 { +CONFIG_KEYCMD_F7 + !byte $00 } +__str_offset_F8: !ifdef CONFIG_KEYCMD_F8 { +CONFIG_KEYCMD_F8 + !byte $00 } -#if !CONFIG_LEGACY_SCNKEY && (CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65) -__str_offset_HELP: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_HELP) -#endif +!ifndef CONFIG_LEGACY_SCNKEY { + +!ifdef CONFIG_KEYBOARD_C128 { + +__str_offset_HELP: !ifdef CONFIG_KEYCMD_HELP { +CONFIG_KEYCMD_HELP + !byte $00 } + +} else ifdef CONFIG_KEYBOARD_C65 { + +__str_offset_HELP: !ifdef CONFIG_KEYCMD_HELP { +CONFIG_KEYCMD_HELP + !byte $00 } + +__str_offset_F9: !ifdef CONFIG_KEYCMD_F9 { +CONFIG_KEYCMD_F9 + !byte $00 } +__str_offset_F10: !ifdef CONFIG_KEYCMD_F10 { +CONFIG_KEYCMD_F10 + !byte $00 } +__str_offset_F11: !ifdef CONFIG_KEYCMD_F11 { +CONFIG_KEYCMD_F11 + !byte $00 } +__str_offset_F12: !ifdef CONFIG_KEYCMD_F12 { +CONFIG_KEYCMD_F12 + !byte $00 } +__str_offset_F13: !ifdef CONFIG_KEYCMD_F13 { +CONFIG_KEYCMD_F13 + !byte $00 } +__str_offset_F14: !ifdef CONFIG_KEYCMD_F14 { +CONFIG_KEYCMD_F14 + !byte $00 } + +} } -#if !CONFIG_LEGACY_SCNKEY && CONFIG_KEYBOARD_C65 -__str_offset_F9: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F9) -__str_offset_F10: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F10) -__str_offset_F11: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F11) -__str_offset_F12: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F12) -__str_offset_F13: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F13) -__str_offset_F14: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F14) -#endif __programmable_keys_strings_end: -{ - .var offset = __programmable_keys_strings_end - programmable_keys_strings - .if (offset >= 255) .error "Programmable keys took too much space" -} + + !if (__programmable_keys_strings_end - programmable_keys_strings > 255) { + !error "Programmable keys took too much space" + } programmable_keys_offsets: - PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_RUN, __str_offset_RUN) + !ifdef CONFIG_KEYCMD_RUN { !byte __str_offset_RUN - programmable_keys_strings } - PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F1, __str_offset_F1) - PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F2, __str_offset_F2) - PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F3, __str_offset_F3) - PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F4, __str_offset_F4) - PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F5, __str_offset_F5) - PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F6, __str_offset_F6) - PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F7, __str_offset_F7) - PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F8, __str_offset_F8) + !ifdef CONFIG_KEYCMD_F1 { !byte __str_offset_F1 - programmable_keys_strings } + !ifdef CONFIG_KEYCMD_F2 { !byte __str_offset_F2 - programmable_keys_strings } + !ifdef CONFIG_KEYCMD_F3 { !byte __str_offset_F3 - programmable_keys_strings } + !ifdef CONFIG_KEYCMD_F4 { !byte __str_offset_F4 - programmable_keys_strings } + !ifdef CONFIG_KEYCMD_F5 { !byte __str_offset_F5 - programmable_keys_strings } + !ifdef CONFIG_KEYCMD_F6 { !byte __str_offset_F6 - programmable_keys_strings } + !ifdef CONFIG_KEYCMD_F7 { !byte __str_offset_F7 - programmable_keys_strings } + !ifdef CONFIG_KEYCMD_F8 { !byte __str_offset_F8 - programmable_keys_strings } -#if !CONFIG_LEGACY_SCNKEY && (CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65) - PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_HELP, __str_offset_HELP) -#endif +!ifndef CONFIG_LEGACY_SCNKEY { -#if !CONFIG_LEGACY_SCNKEY && CONFIG_KEYBOARD_C65 - PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F9, __str_offset_F9) - PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F10, __str_offset_F10) - PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F11, __str_offset_F11) - PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F12, __str_offset_F12) - PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F13, __str_offset_F13) - PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F14, __str_offset_F14) -#endif +!ifdef CONFIG_KEYBOARD_C128 { + !ifdef CONFIG_KEYCMD_HELP { !byte __str_offset_HELP - programmable_keys_strings } -#endif // CONFIG_PROGRAMMABLE_KEYS +} else ifdef CONFIG_KEYBOARD_C65 { + + !ifdef CONFIG_KEYCMD_HELP { !byte __str_offset_HELP - programmable_keys_strings } + + !ifdef CONFIG_KEYCMD_F9 { !byte __str_offset_F9 - programmable_keys_strings } + !ifdef CONFIG_KEYCMD_F10 { !byte __str_offset_F10 - programmable_keys_strings } + !ifdef CONFIG_KEYCMD_F11 { !byte __str_offset_F11 - programmable_keys_strings } + !ifdef CONFIG_KEYCMD_F12 { !byte __str_offset_F12 - programmable_keys_strings } + !ifdef CONFIG_KEYCMD_F13 { !byte __str_offset_F13 - programmable_keys_strings } + !ifdef CONFIG_KEYCMD_F14 { !byte __str_offset_F14 - programmable_keys_strings } + +} } + +} diff --git a/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s b/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s index 9b337da2..38f47421 100644 --- a/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s +++ b/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s @@ -1,72 +1,64 @@ -// #LAYOUT# M65 KERNAL_0 #TAKE-FLOAT -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 KERNAL_0 #TAKE-FLOAT +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Definitions for communication with MEGA65 segment KERNAL_1 from KERNAL_0 -// +; +; Definitions for communication with MEGA65 segment KERNAL_1 from KERNAL_0 +; -#if SEGMENT_KERNAL_0 +!ifdef SEGMENT_KERNAL_0 { - // Label definitions + ; Label definitions - .label VK1__IOINIT = $4000 + 2 * 0 - .label VK1__RAMTAS = $4000 + 2 * 1 - .label VK1__vicii_init = $4000 + 2 * 2 - .label VK1__load_tape_normal = $4000 + 2 * 3 - .label VK1__load_tape_turbo = $4000 + 2 * 4 - .label VK1__load_tape_auto = $4000 + 2 * 5 - .label VK1__tape_head_align = $4000 + 2 * 6 - .label VK1__m65_chrout_screen = $4000 + 2 * 7 - .label VK1__m65_chrin_keyboard = $4000 + 2 * 8 - .label VK1__M65_MODESET = $4000 + 2 * 9 - .label VK1__M65_SCRMODEGET = $4000 + 2 * 10 - .label VK1__M65_SCRMODESET = $4000 + 2 * 11 - .label VK1__M65_CLRSCR = $4000 + 2 * 12 - .label VK1__M65_CLRWIN = $4000 + 2 * 13 - .label VK1__m65_screen_upd_txtrow_off = $4000 + 2 * 14 + !addr VK1__IOINIT = $4000 + 2 * 0 + !addr VK1__RAMTAS = $4000 + 2 * 1 + !addr VK1__vicii_init = $4000 + 2 * 2 + !addr VK1__load_tape_normal = $4000 + 2 * 3 + !addr VK1__load_tape_turbo = $4000 + 2 * 4 + !addr VK1__load_tape_auto = $4000 + 2 * 5 + !addr VK1__tape_head_align = $4000 + 2 * 6 + !addr VK1__m65_chrout_screen = $4000 + 2 * 7 + !addr VK1__m65_chrin_keyboard = $4000 + 2 * 8 + !addr VK1__M65_MODESET = $4000 + 2 * 9 + !addr VK1__M65_SCRMODEGET = $4000 + 2 * 10 + !addr VK1__M65_SCRMODESET = $4000 + 2 * 11 + !addr VK1__M65_CLRSCR = $4000 + 2 * 12 + !addr VK1__M65_CLRWIN = $4000 + 2 * 13 + !addr VK1__m65_screen_upd_txtrow_off = $4000 + 2 * 14 -#else +} else { - // Vector table (Open ROMs private!) + ; Vector table (Open ROMs private!) - .word IOINIT - .word RAMTAS - .word vicii_init + !word IOINIT + !word RAMTAS + !word vicii_init -#if CONFIG_TAPE_NORMAL && !CONFIG_TAPE_AUTODETECT - .word load_tape_normal -#else - .word $0000 -#endif +!ifdef CONFIG_TAPE_NORMAL { !ifndef CONFIG_TAPE_AUTODETECT { + !word load_tape_normal +} else { !word $0000 } } else { !word $0000 } -#if CONFIG_TAPE_TURBO && !CONFIG_TAPE_AUTODETECT - .word load_tape_turbo -#else - .word $0000 -#endif +!ifdef CONFIG_TAPE_TURBO { !ifndef CONFIG_TAPE_AUTODETECT { + !word load_tape_turbo +} else { !word $0000 } } else { !word $0000 } -#if CONFIG_TAPE_AUTODETECT - .word load_tape_auto -#else - .word $0000 -#endif -#if CONFIG_TAPE_HEAD_ALIGN - .word tape_head_align -#else - .word $0000 -#endif +!ifdef CONFIG_TAPE_AUTODETECT { + !word load_tape_auto +} else { !word $0000 } - .word m65_chrout_screen - .word m65_chrin_keyboard +!ifdef CONFIG_TAPE_HEAD_ALIGN { + !word tape_head_align +} else { !word $0000 } - .word M65_MODESET - .word M65_SCRMODEGET - .word M65_SCRMODESET - .word M65_CLRSCR - .word M65_CLRWIN - .word m65_screen_upd_txtrow_off + !word m65_chrout_screen + !word m65_chrin_keyboard -#endif + !word M65_MODESET + !word M65_SCRMODEGET + !word M65_SCRMODESET + !word M65_CLRSCR + !word M65_CLRWIN + !word m65_screen_upd_txtrow_off +} diff --git a/src/kernal/board_m65/mega65_dmagic.s b/src/kernal/board_m65/mega65_dmagic.s index 22cb5ad8..c68ac527 100644 --- a/src/kernal/board_m65/mega65_dmagic.s +++ b/src/kernal/board_m65/mega65_dmagic.s @@ -1,79 +1,81 @@ -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// Helper routines for DMAgic usage +; Helper routines for DMAgic usage -// See: -// - https://c65gs.blogspot.com/2019/03/auto-detecting-required-revision-of.html -// - https://c65gs.blogspot.com/2018/01/improving-dmagic-controller-interface.html +; See: +; - https://c65gs.blogspot.com/2019/03/auto-detecting-required-revision-of.html +; - https://c65gs.blogspot.com/2018/01/improving-dmagic-controller-interface.html m65_dmagic_oper_fill: - // To configure job parameters, use: - // - M65_DMAJOB_SIZE_* - // - M65_DMAJOB_DST_* - // - .A - byte for filling - // Afterwards, consider M65_DMAJOB_*_2 and M65_DMAJOB_*_3 destroyed. + ; To configure job parameters, use: + ; - M65_DMAJOB_SIZE_* + ; - M65_DMAJOB_DST_* + ; - .A - byte for filling + ; Afterwards, consider M65_DMAJOB_DST_2 and M65_DMAJOB_*_3 destroyed. - // Set fill address + ; Set fill address sta M65_DMAJOB_SRC_0 - // Set operation type + ; Set operation type - lda #($03 + $08) // operation: FILL + allow interrupts + lda #($03 + $08) ; operation: FILL + allow interrupts sta M65_DMAGIC_LIST+6 - // Adapt the addresses, launch the job + ; XXX! put 0 into M65_DMAJOB_SRC_3 to clear the flags + + ; Adapt the addresses, launch the job jsr m65_dmagic_adapt_dst - jmp_8 m65_dmagic_launch + bra m65_dmagic_launch m65_dmagic_oper_copy: - // To configure job parameters, use: - // - M65_DMAJOB_SIZE_* - // - M65_DMAJOB_SRC_* - // - M65_DMAJOB_DST_* - // Afterwards, consider M65_DMAJOB_DST_2 and M65_DMAJOB_DST_3 destroyed. + ; To configure job parameters, use: + ; - M65_DMAJOB_SIZE_* + ; - M65_DMAJOB_SRC_* + ; - M65_DMAJOB_DST_* + ; Afterwards, consider M65_DMAJOB_*_2 and M65_DMAJOB_*_3 destroyed. - // Set operation type + ; Set operation type - lda #($00 + $08) // operation: COPY + allow interrupts + lda #($00 + $08) ; operation: COPY + allow interrupts sta M65_DMAGIC_LIST+6 - // Adapt the addresses, launch the job + ; Adapt the addresses, launch the job jsr m65_dmagic_adapt_src jsr m65_dmagic_adapt_dst - // XXX prepare separate version for the opposite direction - change direction - // by setting bit 6 of M65_DMAJOB_*_2 + ; XXX possibly prepare separate version for the opposite direction - change direction + ; by setting bit 6 of M65_DMAJOB_*_2 - // FALLTROUGH + ; FALLTROUGH m65_dmagic_launch: - // Launch the DMA list + ; Launch the DMA list lda #$00 - sta DMA_ADDRBANK // $D702 - sta DMA_ADDRMB // $D704 + sta DMA_ADDRBANK ; $D702 + sta DMA_ADDRMB ; $D704 lda #>M65_DMAGIC_LIST - sta DMA_ADDRMSB // $D701 + sta DMA_ADDRMSB ; $D701 lda #scnkey_set_keytab sta KEYLOG+1 - // Initialise cursor blink flags (Computes Mapping the 64 p215) + ; Initialise cursor blink flags (Computes Mapping the 64 p215) lda #$01 sta BLNCT sta BLNSW - // Enable cursor repeat - XXX make it configurable + ; Enable cursor repeat - XXX make it configurable -#if CONFIG_KEY_REPEAT_DEFAULT && !CONFIG_KEY_REPEAT_ALWAYS +!ifdef CONFIG_KEY_REPEAT_DEFAULT { !ifndef CONFIG_KEY_REPEAT_ALWAYS { lda #$80 sta RPTFLG +} } -#endif + ; Set keyboard decode vector (Computes Mapping the 64 p215) - // Set keyboard decode vector (Computes Mapping the 64 p215) +!ifdef CONFIG_LEGACY_SCNKEY { -#if CONFIG_LEGACY_SCNKEY - - // Set initial variables for our improved keyboard scan routine + ; Set initial variables for our improved keyboard scan routine lda #$FF ldx #6 -!: sta BufferOld,x +@1: + sta BufferOld,x dex - bpl !- + bpl @1 sta BufferQuantity - // Set key repeat delay (Computes Mapping the 64 p215) - // Making some numbers up here: Repeat every ~1/10th sec - // But require key to be held for ~1/3sec before - // repeating (Computes Mapping the 64 p58) + ; Set key repeat delay (Computes Mapping the 64 p215) + ; Making some numbers up here: Repeat every ~1/10th sec + ; But require key to be held for ~1/3sec before + ; repeating (Computes Mapping the 64 p58) - // Not needed for default keyboard scanning code + ; Not needed for default keyboard scanning code - ldx #22-2 // Fudge factor to match speed + ldx #22-2 ; Fudge factor to match speed stx DELAY - -#endif +} - // Set current colour for text (Computes Mapping the 64 p215) + ; Set current colour for text (Computes Mapping the 64 p215) ldx #CONFIG_COLOR_TXT stx COLOR - // Set maximum keyboard buffer size (Computes Mapping the 64 p215) + ; Set maximum keyboard buffer size (Computes Mapping the 64 p215) ldx #10 stx XMAX - // Put non-zero value in MODE to enable case switch + ; Put non-zero value in MODE to enable case switch ldx #$00 stx MODE - // Fallthrough/jump to screen clear routine (Computes Mapping the 64 p215) + ; Fallthrough/jump to screen clear routine (Computes Mapping the 64 p215) jmp clear_screen diff --git a/src/kernal/init/e518.cint_legacy.s b/src/kernal/init/e518.cint_legacy.s index 23ef60ec..b986e07b 100644 --- a/src/kernal/init/e518.cint_legacy.s +++ b/src/kernal/init/e518.cint_legacy.s @@ -1,40 +1,39 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Part of the official Kernal routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - page 280 -// - [CM64] Computes Mapping the Commodore 64 - page 242 -// -// CPU registers that has to be preserved (see [RG64]): none -// +; +; Part of the official Kernal routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - page 280 +; - [CM64] Computes Mapping the Commodore 64 - page 242 +; +; CPU registers that has to be preserved (see [RG64]): none +; -cint_legacy: // $E518 +cint_legacy: ; $E518 -#if ROM_LAYOUT_M65 +!ifdef CONFIG_MB_M65 { jsr M65_MODEGET - bcs !+ + bcs @1 jsr M65_MODESET bra cint_legacy_end -!: -#endif - - // Setup video and I/O - // See here: https://csdb.dk/forums/index.php?roomid=11&topicid=17048&firstpost=22 +@1: +} + ; Setup video and I/O + ; See here: https://csdb.dk/forums/index.php?roomid=11&topicid=17048&firstpost=22 jsr vicii_init - // FALLTROUGH + ; FALLTROUGH cint_legacy_end: - // Code below must be placed under $E51B, or some code will break - see here: - // - https://csdb.dk/forums/index.php?roomid=11&topicid=17048&firstpost=2 - // Game 'Operacja Proboszcz' is one example. + ; Code below must be placed under $E51B, or some code will break - see here: + ; - https://csdb.dk/forums/index.php?roomid=11&topicid=17048&firstpost=2 + ; Game 'Operacja Proboszcz' is one example. - jmp cint_screen_keyboard // XXX try to fit the code here + jmp cint_screen_keyboard ; XXX try to fit the code here diff --git a/src/kernal/init/e5a0.vicii_init.s b/src/kernal/init/e5a0.vicii_init.s index 5cb3d59c..1657e714 100644 --- a/src/kernal/init/e5a0.vicii_init.s +++ b/src/kernal/init/e5a0.vicii_init.s @@ -1,71 +1,74 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_0 #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE-FLOAT -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_0 #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE-FLOAT +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * * #IGNORE -// -// Well-known Kernal routine, described in: -// -// - [CM64] Computes Mapping the Commodore 64 - page 215 -// +; +; Well-known Kernal routine, described in: +; +; - [CM64] Computes Mapping the Commodore 64 - page 215 +; vicii_init: -#if (ROM_LAYOUT_M65 && SEGMENT_KERNAL_0) +!ifdef SEGMENT_M65_KERNAL_0 { - jsr map_KERNAL_1 - jsr_ind VK1__vicii_init - jmp map_NORMAL + jsr map_KERNAL_1 + jsr (VK1__vicii_init) + jmp map_NORMAL -#else +} else { - // Clear everything - turn off sprites (observed hanging around after - // running programs and resetting), etc. + ; Clear everything - turn off sprites (observed hanging around after + ; running programs and resetting), etc. lda #$00 ldx #$2E - !: +@1: sta __VIC_BASE, x dex - bpl !- + bpl @1 -#if !CONFIG_MB_MEGA_65 && !CONFIG_MB_ULTIMATE_64 +!ifndef CONFIG_MB_M65 { !ifndef CONFIG_MB_U64 { - // Disable C128 extra keys - just to be sure they will not interfere with anything + ; Disable C128 extra keys - just to be sure they will not interfere with anything stx VIC_XSCAN - // Disable the C128 2MHz mode, it prevents VIC-II display from working correctly + ; Disable the C128 2MHz mode, it prevents VIC-II display from working correctly stx VIC_CLKRATE +} } -#endif + ; Set up default IO values + ; - [CM64] page 129 - VIC_SCROLY + ; - [CM64] pages 140-144 - VIC_SCROLX + ; - [CM64] pages 145-146 - VIC_YMCSB - // Set up default IO values - // - [CM64] page 129 - VIC_SCROLY - // - [CM64] pages 140-144 - VIC_SCROLX - // - [CM64] pages 145-146 - VIC_YMCSB - - lda #$1B // according to [CM64] page 137 some software assumes oldest bit is 0 + lda #$1B ; according to [CM64] page 137 some software assumes oldest bit is 0 sta VIC_SCROLY lda #$C8 - sta VIC_SCROLX // 40 column, etc. + sta VIC_SCROLX ; 40 column, etc. lda #$14 sta VIC_YMCSB lda #$0F - sta VIC_IRQ // clear all interrupts + sta VIC_IRQ ; clear all interrupts - // We use a different colour scheme of white text on all blue by default, - // but brand-specific color scheme can also be enabled + ; We use a different colour scheme of white text on all blue by default, + ; but brand-specific color scheme can also be enabled lda #CONFIG_COLOR_BG sta VIC_EXTCOL sta VIC_BGCOL0 - // Setup default I/O devices + ; Setup default I/O devices +!ifdef CONFIG_IEC { jmp clrchn_reset +} else { + jmp CLRCHN +} -#endif // ROM layout +} ; ROM layout diff --git a/src/kernal/init/fce2.hw_entry_reset.s b/src/kernal/init/fce2.hw_entry_reset.s index 754ccff8..41c21683 100644 --- a/src/kernal/init/fce2.hw_entry_reset.s +++ b/src/kernal/init/fce2.hw_entry_reset.s @@ -1,78 +1,72 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// Resources describing the C64 reset sequence: -// https://www.c64-wiki.com/wiki/Reset_(Process) +; Resources describing the C64 reset sequence: +; https://www.c64-wiki.com/wiki/Reset_(Process) hw_entry_reset: - // The GPL program at https://github.com/Klaus2m5/6502_65C02_functional_tests/blob/master/6502_functional_test.a65 - // uses the similar initial reset sequence, affirmed by c64 PRG p269 + ; The GPL program at https://github.com/Klaus2m5/6502_65C02_functional_tests/blob/master/6502_functional_test.a65 + ; uses the similar initial reset sequence, affirmed by c64 PRG p269 - sei // disable the interrupts, as fast as possible - they are disabled in case of HW reset, - // but this routine can be also called manually + sei ; disable the interrupts, as fast as possible - they are disabled in case of HW reset, + ; but this routine can be also called manually - cld // required for all CPUs - due to possibility of manual call + cld ; required for all CPUs - due to possibility of manual call -#if HAS_OPCODES_65CE02 +!ifdef HAS_OPCODES_65CE02 { - see // disable extended stack - -#endif + see ; disable extended stack +} ldx #$FF txs -#if ROM_LAYOUT_M65 +!ifdef CONFIG_MB_M65 { jsr m65_reset_part +} -#endif +!ifdef CONFIG_PLATFORM_COMMODORE_64 { -#if CONFIG_PLATFORM_COMMODORE_64 + ; The following routine is based on reading the public KERNAL jumptable routine + ; list, and making unimaginative assumptions about what should be done on reset. + ; Also, https://codebase64.org/doku.php?id=base:assembling_your_own_cart_rom_image was used + ; as it shows example startup sequence, to be followe by cartridge creators - // The following routine is based on reading the public KERNAL jumptable routine - // list, and making unimaginative assumptions about what should be done on reset. - // Also, https://codebase64.org/doku.php?id=base:assembling_your_own_cart_rom_image was used - // as it shows example startup sequence, to be followe by cartridge creators - - // C64 PRG p269 + ; C64 PRG p269 jsr cartridge_check - bne !+ + bne @1 jmp (ICART_COLD_START) -!: +@1: - // Disable the screen (and set 40 columns) to prevent visual glitches later + ; Disable the screen (and set 40 columns) to prevent visual glitches later ldx #$28 stx VIC_SCROLX - -#endif - - // Initialising IO is obviously required. Also indicated by c64 prg p269. +} + ; Initialising IO is obviously required. Also indicated by c64 prg p269. jsr JIOINIT - // Setting up the screen and testing ram is obviously required - // also affirmed by p269 of c64 prg - jsr JRAMTAS // called RANTAM on Codebase64 wiki + ; Setting up the screen and testing ram is obviously required + ; also affirmed by p269 of c64 prg + jsr JRAMTAS ; called RANTAM on Codebase64 wiki - // Resetting IO vectors is obviously required, if we want interrupts to run - // also affirmed by c64 prg p269 + ; Resetting IO vectors is obviously required, if we want interrupts to run + ; also affirmed by c64 prg p269 jsr JRESTOR - // "Compute's Mapping the 64" p236 + ; "Compute's Mapping the 64" p236 jsr JCINT -#if ROM_LAYOUT_M65 +!ifdef CONFIG_MB_M65 { clc - jsr M65_MODESET // on MEGA65 go to native mode by default + jsr M65_MODESET ; on MEGA65 go to native mode by default +} + ; What do we do when finished? A C64 jumps into the BASIC ROM + cli ; allow interrupts to happen -#endif - - // What do we do when finished? A C64 jumps into the BASIC ROM - cli // allow interrupts to happen - - // c64 prg p269 + ; c64 prg p269 jmp (IBASIC_COLD_START) diff --git a/src/kernal/init/fd50.ramtas.s b/src/kernal/init/fd50.ramtas.s index 70a4abc2..d68d3f16 100644 --- a/src/kernal/init/fd50.ramtas.s +++ b/src/kernal/init/fd50.ramtas.s @@ -1,71 +1,71 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_0 #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE-FLOAT -// #LAYOUT# X16 KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_0 #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE-FLOAT +;; #LAYOUT# X16 KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official Kernal routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - page 291 -// - [CM64] Computes Mapping the Commodore 64 - page 237 -// -// CPU registers that has to be preserved (see [RG64]): none -// +; +; Official Kernal routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - page 291 +; - [CM64] Computes Mapping the Commodore 64 - page 237 +; +; CPU registers that has to be preserved (see [RG64]): none +; RAMTAS: -#if (ROM_LAYOUT_M65 && SEGMENT_KERNAL_0) +!ifdef SEGMENT_M65_KERNAL_0 { - jsr map_KERNAL_1 - jsr_ind VK1__RAMTAS - jmp map_NORMAL + jsr map_KERNAL_1 + jsr (VK1__RAMTAS) + jmp map_NORMAL -#else +} else { - // C64 Programmers Reference guide p291: - // Clear $0000-$0101, $0200-$03ff - // PGS: $0000, $0001 are CPU IO ports, so should not get written to + ; C64 Programmers Reference guide p291: + ; Clear $0000-$0101, $0200-$03ff + ; PGS: $0000, $0001 are CPU IO ports, so should not get written to - // How many ways are there to efficiently erase these two pages - // of RAM? We would like to avoid any unnecessary byte similarity - // with the C64 KERNAL. Thus we do $0300 before $0200, even though - // with the longer sequence of identicale bytes we see no basis for - // it being copyrightable. Again, we just want to redue the attack - // surface for any misguided suit. + ; How many ways are there to efficiently erase these two pages + ; of RAM? We would like to avoid any unnecessary byte similarity + ; with the C64 KERNAL. Thus we do $0300 before $0200, even though + ; with the longer sequence of identicale bytes we see no basis for + ; it being copyrightable. Again, we just want to redue the attack + ; surface for any misguided suit. ldy #$00 lda #$00 -!: +@1: sta $0300,Y sta $0200,Y - sta $0002,Y // that is why we do not use .X for index, we do not want zeropage addressing here! + sta $0002,Y ; that is why we do not use .X for index, we do not want zeropage addressing here! iny - bne !- + bne @1 - // Allocate cassette buffer + ; Allocate cassette buffer ldx #<$033C stx TAPE1+0 ldx #>$033C stx TAPE1+1 -#if CONFIG_PLATFORM_COMMODORE_64 +!ifdef CONFIG_PLATFORM_COMMODORE_64 { - // Set screen address pointer ("Compute's Mapping the 64" p238) - // This is obvious boiler plate containing no creative input, but to avoid - // unnecessarily similarity to the C64 KERNAL, we use X instead of A to do this, - // and several following + ; Set screen address pointer ("Compute's Mapping the 64" p238) + ; This is obvious boiler plate containing no creative input, but to avoid + ; unnecessarily similarity to the C64 KERNAL, we use X instead of A to do this, + ; and several following ldx #>$0400 stx HIBASE - // Set BASIC start text pointer - // (remember, that low memory is 0 initialized at this moment) + ; Set BASIC start text pointer + ; (remember, that low memory is 0 initialized at this moment) ldx #>$0800 stx MEMSTR+1 - // Work out RAM size and put in MEMSIZK - // Try to modify $8000, if it fails then RAM ends at $7FFF, else $9FFF + ; Work out RAM size and put in MEMSIZK + ; Try to modify $8000, if it fails then RAM ends at $7FFF, else $9FFF ldx $8000 inx @@ -73,17 +73,21 @@ RAMTAS: cpx $8000 bne ramtas_32k - // FALLTROUGH + ; FALLTROUGH ramtas_40k: - // 40K RAM - restore memory content, set MEMSIZK + ; 40K RAM - restore memory content, set MEMSIZK ldy #$A0 -!: + + ; FALLTROUGH + +ramtas_xxk: + sty MEMSIZK+1 - // Always restore memory, cartridge might have RAM under ROM + ; Always restore memory, cartridge might have RAM under ROM dex stx $8000 @@ -92,12 +96,12 @@ ramtas_40k: ramtas_32k: - // 32K RAM - restore memory content, set MEMSIZK + ; 32K RAM - restore memory content, set MEMSIZK ldy #$80 - bne !- // branch always + bne ramtas_xxk ; branch always -#elif CONFIG_PLATFORM_COMMANDER_X16 +} else ifdef CONFIG_PLATFORM_COMMANDER_X16 { ldx #>$0800 stx MEMSTR+1 @@ -105,11 +109,11 @@ ramtas_32k: ldy #$9F sty MEMSIZK+1 -#else +} else { - .error "Please fill-in RAMTAS" + !error "Please fill-in RAMTAS" -#endif // platform +} ; platform -#endif // ROM layout +} ; ROM layout diff --git a/src/kernal/init/fda3.ioinit.s b/src/kernal/init/fda3.ioinit.s index b3973e07..98f2cd8b 100644 --- a/src/kernal/init/fda3.ioinit.s +++ b/src/kernal/init/fda3.ioinit.s @@ -1,175 +1,170 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_0 #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE-FLOAT -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_0 #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE-FLOAT +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * * #IGNORE -// -// Official Kernal routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - page 285 -// - [CM64] Computes Mapping the Commodore 64 - page 238 -// -// CPU registers that has to be preserved (see [RG64]): none -// +; +; Official Kernal routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - page 285 +; - [CM64] Computes Mapping the Commodore 64 - page 238 +; +; CPU registers that has to be preserved (see [RG64]): none +; IOINIT: -#if (ROM_LAYOUT_M65 && SEGMENT_KERNAL_0) +!ifdef SEGMENT_M65_KERNAL_0 { - jsr map_KERNAL_1 - jsr_ind VK1__IOINIT - // End by initializing the MEGA65 internal DOS - jmp m65dos_init + jsr map_KERNAL_1 + jsr (VK1__IOINIT) + jmp m65dos_init ; end by initializing the MEGA65 internal DOS -#else +} else { - // - // First initialize the CPU port, to make sure we have correct memory map - // + ; + ; First initialize the CPU port, to make sure we have correct memory map + ; - // We want BASIC and KERNAL ROMs mapped, and datasette motor off - // (https://www.c64-wiki.com/wiki/Zeropage) - // Work around for VICE bug: Writing $00 before $01 results in rubbish in $01 - // after. https://sourceforge.net/p/vice-emu/bugs/1057/ + ; We want BASIC and KERNAL ROMs mapped, and datasette motor off + ; (https://www.c64-wiki.com/wiki/Zeropage) + ; Work around for VICE bug: Writing $00 before $01 results in rubbish in $01 + ; after. https://sourceforge.net/p/vice-emu/bugs/1057/ ldx #$27 stx CPU_R6510 - ldx #$2F // checked real ROM value + ldx #$2F ; checked real ROM value stx CPU_D6510 - // - // Now prevent the CIAs from generating interrupts, who knows what damage they can do - // + ; + ; Now prevent the CIAs from generating interrupts, who knows what damage they can do + ; - // Disable IRQ generation for both CIAs - see [CM64], page 149 + ; Disable IRQ generation for both CIAs - see [CM64], page 149 ldx #$7F - stx CIA1_ICR // $DC0D - stx CIA2_ICR // $DD0D + stx CIA1_ICR ; $DC0D + stx CIA2_ICR ; $DD0D - // See discussion here: - // https://www.lemon64.com/forum/viewtopic.php?t=41744&sid=e294c254db2ba671cde643f100aae341 - // It seems that initializing this register to $7F is the best idea - UDTIM key scanning - // also leaves this at $7F + ; See discussion here: + ; https://www.lemon64.com/forum/viewtopic.php?t=41744&sid=e294c254db2ba671cde643f100aae341 + ; It seems that initializing this register to $7F is the best idea - UDTIM key scanning + ; also leaves this at $7F - stx CIA1_PRA // $DC00 + stx CIA1_PRA ; $DC00 - // - // Now silence the SID chip(s), depending on the configuration - we want them silent ASAP - // + ; + ; Now silence the SID chip(s), depending on the configuration - we want them silent ASAP + ; lda #$00 -#if !CONFIG_MB_MEGA_65 +!ifndef CONFIG_MB_M65 { - // First the standard chip (skip if it is covered by whole $D4XX range) + ; First the standard chip (skip if it is covered by whole $D4XX range) -#if !CONFIG_SID_D4XX +!ifndef CONFIG_SID_D4XX { sta SID_SIGVOL -#endif // !CONFIG_SID_D4XX +} - // Silence manually configured 2nd and 3rd SIDs + ; Silence manually configured 2nd and 3rd SIDs -#if CONFIG_SID_2ND +!ifdef CONFIG_SID_2ND_ADDRESS { sta SID_SIGVOL - __SID_BASE + CONFIG_SID_2ND_ADDRESS -#endif // CONFIG_SID_2ND +} -#if CONFIG_SID_3RD +!ifdef CONFIG_SID_3RD_ADDRESS { sta SID_SIGVOL - __SID_BASE + CONFIG_SID_3RD_ADDRESS -#endif // CONFIG_SID_3RD +} + ; Silence whole D4XX and D5XX ranges (if configured) - // Silence whole D4XX and D5XX ranges (if configured) - -#if CONFIG_SID_D4XX || CONFIG_SID_D5XX +!ifdef CONFIG_SID_D4XX_OR_D5XX { ldy #$00 -!: +@1: -#if CONFIG_SID_D4XX +!ifdef CONFIG_SID_D4XX { sta SID_SIGVOL + $000, Y -#endif // CONFIG_SID_D4XX - -#if CONFIG_SID_D5XX +} +!ifdef CONFIG_SID_D5XX { sta SID_SIGVOL + $100, Y -#endif // CONFIG_SID_D4XX +} tya clc adc #$20 tay - bne !- + bne @1 -#endif // CONFIG_SID_D4XX || CONFIG_SID_D5XX +} ; CONFIG_SID_D4XX_OR_D5XX -#else +} else { ; CONFIG_MB_M65 - // MEGA65 specific handling - it contains 4 SIDs + ; MEGA65 specific handling - it contains 4 SIDs sta SID_SIGVOL + __SID_R1_OFFSET sta SID_SIGVOL + __SID_R2_OFFSET sta SID_SIGVOL + __SID_L1_OFFSET sta SID_SIGVOL + __SID_L2_OFFSET -#endif // CONFIG_MB_MEGA_65 +} - // - // Now continue the CIAs initialization - // + ; + ; Now continue the CIAs initialization + ; - // For CIA #1 we need port A as output and port B as input to scan the keyboard + ; For CIA #1 we need port A as output and port B as input to scan the keyboard ldx #$FF - stx CIA1_DDRA // $DC02 + stx CIA1_DDRA ; $DC02 inx - stx CIA1_DDRB // $DC03 - stx CIA2_DDRB // $DD03 // XXX this port is used for RS-232, value here is most likely wrong! + stx CIA1_DDRB ; $DC03 + stx CIA2_DDRB ; $DD03 ; XXX this port is used for RS-232, value here is most likely wrong! -#if CONFIG_KEYBOARD_C65 || CONFIG_KEYBOARD_C65_CAPS_LOCK +!ifdef CONFIG_KEYBOARD_C65_OR_CAPS_LOCK { lda #$02 - sta C65_EXTKEYS_DDR // output for most keys, input for CAPS LOCK bit + sta C65_EXTKEYS_DDR ; output for most keys, input for CAPS LOCK bit +} -#endif - - // Set DDR on CIA2 for IEC bus, VIC-II banking (see [CM64], $DDOO description on page 193) + ; Set DDR on CIA2 for IEC bus, VIC-II banking (see [CM64], $DDOO description on page 193) lda #$3F - sta CIA2_DDRA // $DD02 + sta CIA2_DDRA ; $DD02 - // Checked using VICE that original ROM initializes timers this way + ; Checked using VICE that original ROM initializes timers this way ldx #$08 - stx CIA1_CRB // $DC0F - stx CIA2_CRA // $DD0E - stx CIA2_CRB // $DD0F + stx CIA1_CRB ; $DC0F + stx CIA2_CRA ; $DD0E + stx CIA2_CRB ; $DD0F - // Set VIC-II bank - at least the 'Operacja Proboszcz' game needs this within IOINIT - // Checked on original ROMs, that it sets bit #2 (RS-232 output) high + ; Set VIC-II bank - at least the 'Operacja Proboszcz' game needs this within IOINIT + ; Checked on original ROMs, that it sets bit #2 (RS-232 output) high - ldx #%00000111 // XXX adapt this to IEC idle state, JMP at the end won't be needed - stx CIA2_PRA // $DD00 + ldx #%00000111 ; XXX adapt this to IEC idle state, JMP at the end won't be needed + stx CIA2_PRA ; $DD00 - // Put something sane in the IRQ timer + ; Put something sane in the IRQ timer jsr setup_irq_timer - // Enable timer A to run continuously (http://codebase64.org/doku.php?id=base:timerinterrupts) + ; Enable timer A to run continuously (http://codebase64.org/doku.php?id=base:timerinterrupts) ldx #$11 - stx CIA1_CRA // $DC0E + stx CIA1_CRA ; $DC0E - // Enable timer interrupt + ; Enable timer interrupt ldx #$81 - stx CIA1_ICR // $DC0D + stx CIA1_ICR ; $DC0D -#if CONFIG_IEC +!ifdef CONFIG_IEC { - // Set IEC bus to its initial idle state + ; Set IEC bus to its initial idle state jmp iec_set_idle -#else +} else { rts - -#endif +} -#endif // ROM layout +} ; ROM layout diff --git a/src/kernal/init/ff5b.cint.s b/src/kernal/init/ff5b.cint.s index 784bb73f..47f7eee9 100644 --- a/src/kernal/init/ff5b.cint.s +++ b/src/kernal/init/ff5b.cint.s @@ -1,15 +1,15 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official Kernal routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - page 280 -// - [CM64] Computes Mapping the Commodore 64 - page 242 -// -// CPU registers that has to be preserved (see [RG64]): none -// +; +; Official Kernal routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - page 280 +; - [CM64] Computes Mapping the Commodore 64 - page 242 +; +; CPU registers that has to be preserved (see [RG64]): none +; CINT: diff --git a/src/kernal/init/fffc.vector_reset.s b/src/kernal/init/fffc.vector_reset.s index 32fb6c03..a6545674 100644 --- a/src/kernal/init/fffc.vector_reset.s +++ b/src/kernal/init/fffc.vector_reset.s @@ -1,11 +1,11 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// $FFFC - CPU Reset Vector -// Uncontrovertial, as it is a CPU requirement, and nothing else. +; $FFFC - CPU Reset Vector +; Uncontrovertial, as it is a CPU requirement, and nothing else. vector_reset: - .word hw_entry_reset + !word hw_entry_reset diff --git a/src/kernal/init/setup_pal_ntsc.s b/src/kernal/init/setup_pal_ntsc.s index 52845204..c887f904 100644 --- a/src/kernal/init/setup_pal_ntsc.s +++ b/src/kernal/init/setup_pal_ntsc.s @@ -1,65 +1,65 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// Detect video system (PAL/NTSC), use method by Graham, as it is short and reliable -// see here: https://codebase64.org/doku.php?id=base:detect_pal_ntsc +; Detect video system (PAL/NTSC), use method by Graham, as it is short and reliable +; see here: https://codebase64.org/doku.php?id=base:detect_pal_ntsc setup_pal_ntsc: lda VIC_RASTER -!: +@1: cmp VIC_RASTER - beq !- + beq @1 bmi setup_pal_ntsc - // Result in A, if no interrupt happened during the test: - // #$37 -> 312 rasterlines, PAL, VIC 6569 - // #$06 -> 263 rasterlines, NTSC, VIC 6567R8 - // #$05 -> 262 rasterlines, NTSC, VIC 6567R56A + ; Result in A, if no interrupt happened during the test: + ; #$37 -> 312 rasterlines, PAL, VIC 6569 + ; #$06 -> 263 rasterlines, NTSC, VIC 6567R8 + ; #$05 -> 262 rasterlines, NTSC, VIC 6567R56A cmp #$07 bcc setup_ntsc - // FALLTROUGH + ; FALLTROUGH setup_pal: lda #$01 - skip_2_bytes_trash_nvz + +skip_2_bytes_trash_nvz - // FALLTROUGH + ; FALLTROUGH setup_ntsc: lda #$00 - // FALLTROUGH + ; FALLTROUGH setup_pal_ntsc_end: sta TVSFLG - // FALLTROUGH + ; FALLTROUGH -setup_irq_timer: // entry point needed by UP9600 and CIA1 burst mod support +setup_irq_timer: ; entry point needed by UP9600 and CIA1 burst mod support - // Sets up IRQ timer in CIA1 to ~1/60th of a second, - // depending on the detected video system + ; Sets up IRQ timer in CIA1 to ~1/60th of a second, + ; depending on the detected video system - // Retrieve video system (0 - NTSC, 1 - PAL), assume PAL for unknown values + ; Retrieve video system (0 - NTSC, 1 - PAL), assume PAL for unknown values ldx TVSFLG - beq !+ + beq @2 ldx #$01 -!: - // Setup interval for timer A in CIA1 +@2: + ; Setup interval for timer A in CIA1 lda irq_timing_lo, x - sta CIA1_TIMALO // $DC04 + sta CIA1_TIMALO ; $DC04 lda irq_timing_hi, x - sta CIA1_TIMAHI // $DC05 + sta CIA1_TIMAHI ; $DC05 rts diff --git a/src/kernal/interrupts/ea31.default_irq_handler.s b/src/kernal/interrupts/ea31.default_irq_handler.s index 394b5c21..bd43b132 100644 --- a/src/kernal/interrupts/ea31.default_irq_handler.s +++ b/src/kernal/interrupts/ea31.default_irq_handler.s @@ -1,75 +1,71 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE default_irq_handler: -#if CONFIG_RS232_UP9600 +!ifdef CONFIG_RS232_UP9600 { jsr rs232_count_channels cpx #$00 - beq !+ + beq @1 jsr up9600_irq -!: +@1: +} -#endif // CONFIG_RS232_UP9600 -#if ROM_LAYOUT_M65 +!ifdef CONFIG_MB_M65 { jsr M65_MODEGET - bcs !+ + bcs @2 jsr m65_cursor_blink bra default_irq_handler_common -!: +@2: jsr cursor_blink default_irq_handler_common: jsr JSCNKEY - jsr JUDTIM // update jiffy clock + jsr JUDTIM ; update jiffy clock -#else +} else { jsr cursor_blink jsr JSCNKEY - jsr JUDTIM // update jiffy clock - -#endif + jsr JUDTIM ; update jiffy clock +} -#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO +!ifdef HAS_TAPE { - // Turn tape motor on/off depending on the button state - // For CAS1 (tape motor interlock) variable description, see Mapping the C64, page 7 + ; Turn tape motor on/off depending on the button state + ; For CAS1 (tape motor interlock) variable description, see Mapping the C64, page 7 lda CPU_R6510 and #$10 - beq !+ // branch if tape button pressed + beq @3 ; branch if tape button pressed jsr tape_motor_off lda #$00 sta CAS1 - beq default_irq_handler_end_tape // branch always -!: + beq @4 ; branch always +@3: lda CAS1 - bne default_irq_handler_end_tape + bne @4 jsr tape_motor_on - -default_irq_handler_end_tape: - -#endif // CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO +@4: +} -#if CONFIG_PLATFORM_COMMODORE_64 +!ifdef CONFIG_PLATFORM_COMMODORE_64 { - // Acknowledge CIA interrupt and return + ; Acknowledge CIA interrupt and return jmp clear_cia1_interrupt_flag_and_return_from_interrupt -#else + } else { jmp return_from_interrupt - -#endif +} diff --git a/src/kernal/interrupts/ea7e.ack_cia1_return_from_interrupt.s b/src/kernal/interrupts/ea7e.ack_cia1_return_from_interrupt.s index 6d72292d..298bef0c 100644 --- a/src/kernal/interrupts/ea7e.ack_cia1_return_from_interrupt.s +++ b/src/kernal/interrupts/ea7e.ack_cia1_return_from_interrupt.s @@ -1,17 +1,17 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// https://csdb.dk/forums/index.php?roomid=11&topicid=5776 -// Clear the CIA1 interrupt flag, and then fall through to -// the return from interrupt routine +; https://csdb.dk/forums/index.php?roomid=11&topicid=5776 +; Clear the CIA1 interrupt flag, and then fall through to +; the return from interrupt routine clear_cia1_interrupt_flag_and_return_from_interrupt: - // We have free choice of LDA, LDX or LDY to achieve this goal - // in 3 bytes and minimum cycles. Thus we randomly choose LDY. + ; We have free choice of LDA, LDX or LDY to achieve this goal + ; in 3 bytes and minimum cycles. Thus we randomly choose LDY. ldy CIA1_ICR - // FALL THROUGH to $EA81 + ; FALLTHROUGH to $EA81 diff --git a/src/kernal/interrupts/ea81.return_from_interrupt.s b/src/kernal/interrupts/ea81.return_from_interrupt.s index 9372d84d..a3cfb174 100644 --- a/src/kernal/interrupts/ea81.return_from_interrupt.s +++ b/src/kernal/interrupts/ea81.return_from_interrupt.s @@ -1,26 +1,26 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// The IRQ is a commonly messed with thing on the C64, -// so we need to handle entry points that are commonly -// relied upon, including: -// $EA31 - Standard IRQ routine -// $EA61 - Check keyboard, but do not update timer? https://github.com/cc65/cc65/issues/324 -// $EA81 - https://www.lemon64.com/forum/viewtopic.php?t=2112&sid=6ea01982b26da69783120a7923ca46fb -// Also the $0314 vector is widely used (e.g., https://www.lemon64.com/forum/viewtopic.php?t=2112&sid=6ea01982b26da69783120a7923ca46fb) +; The IRQ is a commonly messed with thing on the C64, +; so we need to handle entry points that are commonly +; relied upon, including: +; $EA31 - Standard IRQ routine +; $EA61 - Check keyboard, but do not update timer? https://github.com/cc65/cc65/issues/324 +; $EA81 - https://www.lemon64.com/forum/viewtopic.php?t=2112&sid=6ea01982b26da69783120a7923ca46fb +; Also the $0314 vector is widely used (e.g., https://www.lemon64.com/forum/viewtopic.php?t=2112&sid=6ea01982b26da69783120a7923ca46fb) return_from_interrupt: - // Restore registers and return - // Sequence according to Computes Mapping the 64 p73 + ; Restore registers and return + ; Sequence according to Computes Mapping the 64 p73 - ply_trash_a - plx_trash_a + +ply_trash_a + +plx_trash_a pla - // FALLTROUGH + ; FALLTROUGH return_from_interrupt_rti: diff --git a/src/kernal/interrupts/fe47.default_nmi_handler.s b/src/kernal/interrupts/fe47.default_nmi_handler.s index 5e86373f..eb6946ba 100644 --- a/src/kernal/interrupts/fe47.default_nmi_handler.s +++ b/src/kernal/interrupts/fe47.default_nmi_handler.s @@ -1,40 +1,39 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE default_nmi_handler: - // Implemented according to Computes Mapping the Commodore 64, page 74 - // and to https://www.c64-wiki.com/wiki/Interrupt + ; Implemented according to Computes Mapping the Commodore 64, page 74 + ; and to https://www.c64-wiki.com/wiki/Interrupt - // Save registers, sequence according to Computes Mapping the Commodore 64, page 73 + ; Save registers, sequence according to Computes Mapping the Commodore 64, page 73 pha - phx_trash_a - phy_trash_a + +phx_trash_a + +phy_trash_a - // XXX: RS-232 support is not implemented + ; XXX: RS-232 support is not implemented - // XXX confirm NMIs from CIA, or no other NMI will arrive! + ; XXX confirm NMIs from CIA, or no other NMI will arrive! -#if CONFIG_PLATFORM_COMMODORE_64 +!ifdef CONFIG_PLATFORM_COMMODORE_64 { jsr cartridge_check - bne !+ + bne @1 jmp (ICART_WARM_START) -!: +@1: +} -#endif + ; According to C64 Wiki, if STOP key is pressed, the routine assumes warm start request - // According to C64 Wiki, if STOP key is pressed, the routine assumes warm start request - - // XXX is it right? how to check that IRQ was caused by RESTORE? + ; XXX is it right? how to check that IRQ was caused by RESTORE? jsr JSTOP - bcs !+ - jmp return_from_interrupt // no STOP pressed -!: - // STOP + RESTORE - clean the address of the BRK instruction (it is not BRK) first + bcs @2 + jmp return_from_interrupt ; no STOP pressed +@2: + ; STOP + RESTORE - clean the address of the BRK instruction (it is not BRK) first lda #$00 sta CMP0+0 sta CMP0+1 diff --git a/src/kernal/interrupts/fe66.default_brk_handler.s b/src/kernal/interrupts/fe66.default_brk_handler.s index eb7e2cec..258bd701 100644 --- a/src/kernal/interrupts/fe66.default_brk_handler.s +++ b/src/kernal/interrupts/fe66.default_brk_handler.s @@ -1,43 +1,40 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE default_brk_handler: - // Implemented according to Computes Mapping the Commodore 64, pages 73-74 + ; Implemented according to Computes Mapping the Commodore 64, pages 73-74 - sei // disable IRQs, to be sure they wont interfere + sei ; disable IRQs, to be sure they wont interfere -#if CONFIG_PLATFORM_COMMODORE_64 +!ifdef CONFIG_PLATFORM_COMMODORE_64 { ldx #$00 - sta VIC_SCROLX // turn the display off - we want as little screen artifacts as possible + sta VIC_SCROLX ; turn the display off - we want as little screen artifacts as possible +} -#endif + cld ; make sure this dangerous flag is disabled - cld // make sure this dangerous flag is disabled +!ifdef HAS_OPCODES_65CE02 { -#if HAS_OPCODES_65CE02 + see ; disable extended stack +} - see // disable extended stack +!ifdef CONFIG_MB_M65 { -#endif - -#if ROM_LAYOUT_M65 - - // Make sure we have normal memory mapping + ; Make sure we have normal memory mapping jsr map_NORMAL - -#endif +} jsr JRESTOR jsr JIOINIT - // Original routine calls just a part of CINT - but I am not sure which one. Most likely it - // skips the PAL/NTSC check by calling $E518. I suspect bug in the original ROM, lets - // call the whole CINT, just to be sure everything is initialized. + ; Original routine calls just a part of CINT - but I am not sure which one. Most likely it + ; skips the PAL/NTSC check by calling $E518. I suspect bug in the original ROM, lets + ; call the whole CINT, just to be sure everything is initialized. jsr CINT diff --git a/src/kernal/interrupts/fffa.vector_nmi.s b/src/kernal/interrupts/fffa.vector_nmi.s index 16089345..a5a81cd0 100644 --- a/src/kernal/interrupts/fffa.vector_nmi.s +++ b/src/kernal/interrupts/fffa.vector_nmi.s @@ -1,11 +1,11 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// $FFFA - CPU NMI Hanlder -// Uncontrovertial as this is also a CPU requirement. +; $FFFA - CPU NMI Hanlder +; Uncontrovertial as this is also a CPU requirement. vector_nmi: - .word hw_entry_nmi + !word hw_entry_nmi diff --git a/src/kernal/interrupts/fffe.vector_irq.s b/src/kernal/interrupts/fffe.vector_irq.s index ba5a1f6f..fe8eb827 100644 --- a/src/kernal/interrupts/fffe.vector_irq.s +++ b/src/kernal/interrupts/fffe.vector_irq.s @@ -1,12 +1,12 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// $FFFE - CPU IRQ Vector. -// This is non-controvertial, as it is a 6502 CPU requirement, and we just have to point -// it to whatever IRQ routine we make. +; $FFFE - CPU IRQ Vector. +; This is non-controvertial, as it is a 6502 CPU requirement, and we just have to point +; it to whatever IRQ routine we make. vector_irq: - .word hw_entry_irq + !word hw_entry_irq diff --git a/src/kernal/interrupts/hw_entry_irq.s b/src/kernal/interrupts/hw_entry_irq.s index 0424705a..bcfe6d57 100644 --- a/src/kernal/interrupts/hw_entry_irq.s +++ b/src/kernal/interrupts/hw_entry_irq.s @@ -1,45 +1,46 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE hw_entry_irq: - // The IRQ is a commonly messed with thing on the C64, - // so we need to handle entry points that are commonly - // relied upon, including: - // $EA31 - Standard IRQ routine - // $EA61 - Check keyboard, but do not update timer? https://github.com/cc65/cc65/issues/324 - // $EA81 - https://www.lemon64.com/forum/viewtopic.php?t=2112&sid=6ea01982b26da69783120a7923ca46fb - // Also the $0314 vector is widely used (e.g., https://www.lemon64.com/forum/viewtopic.php?t=2112&sid=6ea01982b26da69783120a7923ca46fb) + ; The IRQ is a commonly messed with thing on the C64, + ; so we need to handle entry points that are commonly + ; relied upon, including: + ; $EA31 - Standard IRQ routine + ; $EA61 - Check keyboard, but do not update timer? https://github.com/cc65/cc65/issues/324 + ; $EA81 - https://www.lemon64.com/forum/viewtopic.php?t=2112&sid=6ea01982b26da69783120a7923ca46fb + ; Also the $0314 vector is widely used (e.g., https://www.lemon64.com/forum/viewtopic.php?t=2112&sid=6ea01982b26da69783120a7923ca46fb) - // Save registers, sequence according to Computes Mapping the Commodore 64, page 73 + ; Save registers, sequence according to Computes Mapping the Commodore 64, page 73 pha - phx_trash_a - phy_trash_a + +phx_trash_a + +phy_trash_a -#if CONFIG_CPU_MOS_6502 && CONFIG_BCD_SAFE_INTERRUPTS - cld // clear decimal flag to allow using it without disabling interrupts -#endif +!ifndef HAS_OPCODES_65CE02 { !ifdef CONFIG_BCD_SAFE_INTERRUPTS { - // Check if caused by BRK + cld ; clear decimal flag to allow using it without disabling interrupts +} } + + ; Check if caused by BRK tsx - lda $0104, x // get the pre-interrupt processor state + lda $0104, x ; get the pre-interrupt processor state and #$10 bne irq_handler_brk - // Not caused by BRK - call interrupt routine (only if initialised) - // Routine on zeropage = assuming not initialized + ; Not caused by BRK - call interrupt routine (only if initialised) + ; Routine on zeropage = assuming not initialized lda CINV+1 - beq !+ + beq @1 jmp (CINV) -!: - // Vector not initialized - call default interrupt routine +@1: + ; Vector not initialized - call default interrupt routine jmp default_irq_handler irq_handler_brk: - // Store BRK adddress, to be displayed + ; Store BRK adddress, to be displayed sec lda $0105, x sbc #$02 @@ -48,5 +49,5 @@ irq_handler_brk: sbc #$00 sta CMP0+1 - // Interrupt caused by BRK + ; Interrupt caused by BRK jmp (CBINV) diff --git a/src/kernal/interrupts/hw_entry_nmi.s b/src/kernal/interrupts/hw_entry_nmi.s index 225f9397..68bd744f 100644 --- a/src/kernal/interrupts/hw_entry_nmi.s +++ b/src/kernal/interrupts/hw_entry_nmi.s @@ -1,23 +1,24 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE hw_entry_nmi: - sei // do not allow IRQ to interfere, see https://www.c64-wiki.com/wiki/Interrupt + sei ; do not allow IRQ to interfere, see https://www.c64-wiki.com/wiki/Interrupt -#if CONFIG_CPU_MOS_6502 && CONFIG_BCD_SAFE_INTERRUPTS - cld // clear decimal flag to allow using it without disabling interrupts -#endif +!ifndef HAS_OPCODES_65CE02 { !ifdef CONFIG_BCD_SAFE_INTERRUPTS { - // Call interrupt routine (only if initialised) + cld ; clear decimal flag to allow using it without disabling interrupts +} } + + ; Call interrupt routine (only if initialised) pha - lda NMINV+1 // consider zeropage NMI address as uninitialized vector - beq !+ // this allows safer interrupt vector modifications + lda NMINV+1 ; consider zeropage NMI address as uninitialized vector + beq @1 ; this allows safer interrupt vector modifications pla jmp (NMINV) -!: - // Vector not initialized - call default interrupt routine +@1: + ; Vector not initialized - call default interrupt routine pla jmp default_nmi_handler diff --git a/src/kernal/interrupts/nmi_lock.s b/src/kernal/interrupts/nmi_lock.s index 0b1462ee..83a5b9eb 100644 --- a/src/kernal/interrupts/nmi_lock.s +++ b/src/kernal/interrupts/nmi_lock.s @@ -1,60 +1,58 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Routine to lock NMI interrupts, using a trick described here: -// - https://codebase64.org/doku.php?id=base:nmi_lock -// +; +; Routine to lock NMI interrupts, using a trick described here: +; - https://codebase64.org/doku.php?id=base:nmi_lock +; -#if CONFIG_TAPE_HEAD_ALIGN +!ifdef CONFIG_TAPE_HEAD_ALIGN { -// XXX consider broader usage of this method to make IO safer +; XXX consider broader usage of this method to make IO safer nmi_lock: - // We will have to change NMI vector to point empty routine, - // which will not acknowledge the interrupt - thus preventing - // the NMI to be triggered again + ; We will have to change NMI vector to point empty routine, + ; which will not acknowledge the interrupt - thus preventing + ; the NMI to be triggered again - // Our code considers zeropage address invalid, so put - // it there as a preparation + ; Our code considers zeropage address invalid, so put + ; it there as a preparation ldx #$00 stx NMINV+1 - // We can now safelly replace the vector + ; We can now safelly replace the vector lda #return_from_interrupt_rti sta NMINV+1 - // Stop timer A + ; Stop timer A - stx CIA2_CRA // $DD0E + stx CIA2_CRA ; $DD0E - // Set timer A to 0, after starting NMI will occur immediately + ; Set timer A to 0, after starting NMI will occur immediately - stx CIA2_TIMALO // $DD04 - stx CIA2_TIMAHI // $DD05 + stx CIA2_TIMALO ; $DD04 + stx CIA2_TIMAHI ; $DD05 - // Set timer A as source for NMI + ; Set timer A as source for NMI lda #$81 - sta CIA2_ICR // $DD0D + sta CIA2_ICR ; $DD0D - // Start timer A to trigger the NMI + ; Start timer A to trigger the NMI lda #$01 - sta CIA2_CRA // $DD0E + sta CIA2_CRA ; $DD0E - // All done. Unmaskable interrupts are now masked. + ; All done. Unmaskable interrupts are now masked. rts - - -#endif +} diff --git a/src/kernal/iostack/chkinout.s b/src/kernal/iostack/chkinout.s index 1d7c2043..e4374cf8 100644 --- a/src/kernal/iostack/chkinout.s +++ b/src/kernal/iostack/chkinout.s @@ -1,21 +1,21 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Common part of CHKIN and CKOUT -// +; +; Common part of CHKIN and CKOUT +; chkinout_device_not_present: - ply_trash_a + +ply_trash_a pla jsr kernalstatus_DEVICE_NOT_FOUND jmp kernalerror_DEVICE_NOT_FOUND chkinout_file_not_open: - ply_trash_a + +ply_trash_a pla jmp kernalerror_FILE_NOT_OPEN diff --git a/src/kernal/iostack/clall_real.s b/src/kernal/iostack/clall_real.s index 7243d7d6..bd1a3450 100644 --- a/src/kernal/iostack/clall_real.s +++ b/src/kernal/iostack/clall_real.s @@ -1,38 +1,38 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official Kernal routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - page 281 -// - [CM64] Computes Mapping the Commodore 64 - page 230 -// -// CPU registers that has to be preserved (see [RG64]): .Y -// +; +; Official Kernal routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - page 281 +; - [CM64] Computes Mapping the Commodore 64 - page 230 +; +; CPU registers that has to be preserved (see [RG64]): .Y +; clall_real: - // Store .Y register - phy_trash_a + ; Store .Y register + +phy_trash_a - // Original routine probably just sets LDTND to 0, but this is not really safe, - // so we actually close all the channels; at least IDE64 does the same for - // its channels, see CLALL description in the IDE64 Users Guide -!: + ; Original routine probably just sets LDTND to 0, but this is not really safe, + ; so we actually close all the channels; at least IDE64 does the same for + ; its channels, see CLALL description in the IDE64 Users Guide +@1: ldy LDTND - beq !+ + beq @2 dey lda LAT, y jsr JCLOSE - jmp !- -!: - // Restore .Y register - ply_trash_a + jmp @1 +@2: + ; Restore .Y register + +ply_trash_a - // 'C64 Programmers Reference Guide', page 281, claims it calls CLRCHN too + ; 'C64 Programmers Reference Guide', page 281, claims it calls CLRCHN too jsr CLRCHN - // Not sure whether original Kernal does so, but it seems sane to also clear possible errors + ; Not sure whether original Kernal does so, but it seems sane to also clear possible errors jmp kernalstatus_reset diff --git a/src/kernal/iostack/e50a.plot.s b/src/kernal/iostack/e50a.plot.s index e42d76c0..d060398e 100644 --- a/src/kernal/iostack/e50a.plot.s +++ b/src/kernal/iostack/e50a.plot.s @@ -1,25 +1,25 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official Kernal routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - page 290 -// - [CM64] Computes Mapping the Commodore 64 - page 215 -// -// CPU registers that has to be preserved (see [RG64]): none -// +; +; Official Kernal routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - page 290 +; - [CM64] Computes Mapping the Commodore 64 - page 215 +; +; CPU registers that has to be preserved (see [RG64]): none +; PLOT: bcs plot_get - // Note: the 'set' part has to start from $E50C, as this is a known address - // - https://www.lemon64.com/forum/viewtopic.php?t=3296&%3Bstart=15 - // - https://sys64738.org/2019/05/c64-bedtime-coding-eng-printing-08/ - // - 'Duotris' game calls $E50C during startup screen initialization + ; Note: the 'set' part has to start from $E50C, as this is a known address + ; - https://www.lemon64.com/forum/viewtopic.php?t=3296&%3Bstart=15 + ; - https://sys64738.org/2019/05/c64-bedtime-coding-eng-printing-08/ + ; - 'Duotris' game calls $E50C during startup screen initialization plot_set: @@ -28,7 +28,7 @@ plot_set: jsr screen_calculate_pointers - // FALLTROUGH to save one byte on RTS + ; FALLTROUGH to save one byte on RTS plot_get: diff --git a/src/kernal/iostack/f13e.getin.s b/src/kernal/iostack/f13e.getin.s index c3017601..4950ace7 100644 --- a/src/kernal/iostack/f13e.getin.s +++ b/src/kernal/iostack/f13e.getin.s @@ -1,15 +1,15 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official Kernal routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - page 283 -// - [CM64] Computes Mapping the Commodore 64 - page 227/228 -// -// CPU registers that has to be preserved (see [RG64]): for RS-232: .X, .Y -// +; +; Official Kernal routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - page 283 +; - [CM64] Computes Mapping the Commodore 64 - page 227/228 +; +; CPU registers that has to be preserved (see [RG64]): for RS-232: .X, .Y +; GETIN: diff --git a/src/kernal/iostack/f157.chrin.s b/src/kernal/iostack/f157.chrin.s index b663cd93..018decc0 100644 --- a/src/kernal/iostack/f157.chrin.s +++ b/src/kernal/iostack/f157.chrin.s @@ -1,51 +1,51 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official Kernal routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - page 277/278 -// - [CM64] Computes Mapping the Commodore 64 - page 228 -// -// CPU registers that has to be preserved (see [RG64]): .Y -// +; +; Official Kernal routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - page 277/278 +; - [CM64] Computes Mapping the Commodore 64 - page 228 +; +; CPU registers that has to be preserved (see [RG64]): .Y +; -// Reads a byte of input, unless from keyboard. -// If from keyboard, then it gets a whole line of input, and returns the first char. -// Repeated calls after that read out the successive bytes of the line of input. +; Reads a byte of input, unless from keyboard. +; If from keyboard, then it gets a whole line of input, and returns the first char. +; Repeated calls after that read out the successive bytes of the line of input. CHRIN: - // Determine the device number + ; Determine the device number lda DFLTN - // Try $00 - keyboard - beq_16 chrin_keyboard + ; Try $00 - keyboard + +beq chrin_keyboard - // XXX Try $03 - screen - // cmp #$03 - // beq_16 chrin_screen + ; XXX Try $03 - screen + ; cmp #$03 + ; +beq chrin_screen -#if HAS_RS232 +!ifdef HAS_RS232 { - // Try $02 - RS-232 + ; Try $02 - RS-232 cmp #$02 - beq_16 chrin_rs232 + +beq chrin_rs232 -#endif // HAS_RS232 +} ; HAS_RS232 -chrin_getin: // jump entry for GETIN +chrin_getin: ; jump entry for GETIN -#if CONFIG_IEC +!ifdef CONFIG_IEC { - // Try IEC devices + ; Try IEC devices jsr iec_check_devnum_oc - bcc_16 chrin_iec + +bcc chrin_iec -#endif // CONFIG_IEC +} ; CONFIG_IEC - // Not a supported device + ; Not a supported device jmp lvs_device_not_found_error diff --git a/src/kernal/iostack/f1ca.chrout.s b/src/kernal/iostack/f1ca.chrout.s index b528a8bb..a9685588 100644 --- a/src/kernal/iostack/f1ca.chrout.s +++ b/src/kernal/iostack/f1ca.chrout.s @@ -1,80 +1,80 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official Kernal routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - page 278/279 -// - [CM64] Computes Mapping the Commodore 64 - page 228 -// -// CPU registers that has to be preserved (see [RG64]): .Y -// Additionally we have to preserve .X for out CHRIN and implementation -// +; +; Official Kernal routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - page 278/279 +; - [CM64] Computes Mapping the Commodore 64 - page 228 +; +; CPU registers that has to be preserved (see [RG64]): .Y +; Additionally we have to preserve .X for out CHRIN and implementation +; CHROUT: sta SCHAR - // Save X and Y values - // (Confirmed by writing a test program that X and Y - // do not get modified, in agreement with C64 PRG - // description of CHROUT) + ; Save X and Y values + ; (Confirmed by writing a test program that X and Y + ; do not get modified, in agreement with C64 PRG + ; description of CHROUT) - phx_trash_a - phy_trash_a + +phx_trash_a + +phy_trash_a php - // Determine the device number + ; Determine the device number lda DFLTO - cmp #$03 // screen - beq_16 chrout_screen + cmp #$03 ; screen + +beq chrout_screen -#if HAS_RS232 +!ifdef HAS_RS232 { cmp #$02 - beq_16 chrout_rs232 -#endif + +beq chrout_rs232 +} -#if CONFIG_IEC +!ifdef CONFIG_IEC { jsr iec_check_devnum_oc - bcc_16 chrout_iec -#endif + +bcc chrout_iec +} - // FALLTROUGH + ; FALLTROUGH chrout_done_fail: plp - // Restore X and Y - ply_trash_a - plx_trash_a + ; Restore X and Y + +ply_trash_a + +plx_trash_a - sec // indicate failure + sec ; indicate failure rts chrout_done_unknown_device: plp - // Restore X and Y - ply_trash_a - plx_trash_a + ; Restore X and Y + +ply_trash_a + +plx_trash_a - // End wioth error + ; End wioth error jmp lvs_device_not_found_error chrout_done_success: plp - cli // needed for screen (checked calling the routine on original ROMs), XXX what about other devices? + cli ; needed for screen (checked calling the routine on original ROMs), XXX what about other devices? - // Restore X and Y - ply_trash_a - plx_trash_a + ; Restore X and Y + +ply_trash_a + +plx_trash_a lda SCHAR - clc // indicate success + clc ; indicate success rts diff --git a/src/kernal/iostack/f20e.chkin.s b/src/kernal/iostack/f20e.chkin.s index e2eae99e..e417edbb 100644 --- a/src/kernal/iostack/f20e.chkin.s +++ b/src/kernal/iostack/f20e.chkin.s @@ -1,74 +1,73 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official Kernal routines, described in: -// -// - [RG64] C64 Programmers Reference Guide - page 275 -// - [CM64] Computes Mapping the Commodore 64 - page 229 -// -// CPU registers that has to be preserved (see [RG64]): .Y, .A (see [CM64], page 213) -// +; +; Official Kernal routines, described in: +; +; - [RG64] C64 Programmers Reference Guide - page 275 +; - [CM64] Computes Mapping the Commodore 64 - page 229 +; +; CPU registers that has to be preserved (see [RG64]): .Y, .A (see [CM64], page 213) +; CHKIN: - // Store registers for preservation + ; Store registers for preservation pha - phy_trash_a + +phy_trash_a - // Reset status + ; Reset status jsr kernalstatus_reset - // First retrieve the FAT/LAT/SAT table index (and check if file is open) + ; First retrieve the FAT/LAT/SAT table index (and check if file is open) txa jsr find_fls - bcs_16 chkinout_file_not_open + +bcs chkinout_file_not_open - // Now we have table index in Y + ; Now we have table index in Y lda FAT,Y - // Handle all the devices + ; Handle all the devices - beq chkin_set_device // 0 - keyboard + beq chkin_set_device ; 0 - keyboard - // Tape not supported here + ; Tape not supported here -#if HAS_RS232 +!ifdef HAS_RS232 { cmp #$02 - beq_16 chkin_rs232 + +beq chkin_rs232 +} -#endif // HAS_RS232 - -#if CONFIG_IEC +!ifdef CONFIG_IEC { jsr iec_check_devnum_oc - bcc_16 chkin_iec + +bcc chkin_iec +} -#endif // CONFIG_IEC - - cmp #$03 // screen - only legal one left - bne_16 chkinout_device_not_present + cmp #$03 ; screen - only legal one left + +bne chkinout_device_not_present chkin_set_device: + lda FAT,Y sta DFLTN - // FALLTROUGH + ; FALLTROUGH chkinout_end: - ply_trash_a + +ply_trash_a pla - clc // indicate success + clc ; indicate success rts chkin_file_not_input: - ply_trash_a + +ply_trash_a pla jmp kernalerror_FILE_NOT_INPUT diff --git a/src/kernal/iostack/f250.ckout.s b/src/kernal/iostack/f250.ckout.s index a99f359e..d420fcc6 100644 --- a/src/kernal/iostack/f250.ckout.s +++ b/src/kernal/iostack/f250.ckout.s @@ -1,65 +1,65 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official Kernal routines, described in: -// -// - [RG64] C64 Programmers Reference Guide - page 276 -// - [CM64] Computes Mapping the Commodore 64 - page 229 -// -// CPU registers that has to be preserved (see [RG64]): .Y, .A (see [CM64], page 213) -// +; +; Official Kernal routines, described in: +; +; - [RG64] C64 Programmers Reference Guide - page 276 +; - [CM64] Computes Mapping the Commodore 64 - page 229 +; +; CPU registers that has to be preserved (see [RG64]): .Y, .A (see [CM64], page 213) +; CKOUT: - // Store registers for preservation + ; Store registers for preservation pha - phy_trash_a + +phy_trash_a - // Reset status + ; Reset status jsr kernalstatus_reset - // First retrieve the FAT/LAT/SAT table index (and check if file is open) + ; First retrieve the FAT/LAT/SAT table index (and check if file is open) txa jsr find_fls - bcs_16 chkinout_file_not_open + +bcs chkinout_file_not_open - // Now we have table index in Y + ; Now we have table index in Y lda FAT,Y - // Handle all the devices + ; Handle all the devices - beq ckout_file_not_output // 0 - keyboard + beq ckout_file_not_output ; 0 - keyboard - // Tape not supported here + ; Tape not supported here -#if HAS_RS232 +!ifdef HAS_RS232 { cmp #$02 - beq_16 ckout_rs232 + +beq ckout_rs232 +} -#endif // HAS_RS232 - -#if CONFIG_IEC +!ifdef CONFIG_IEC { jsr iec_check_devnum_oc - bcc_16 ckout_iec + +bcc ckout_iec +} -#endif // CONFIG_IEC - - cmp #$03 // screen - only legal one left - bne_16 chkinout_device_not_present + cmp #$03 ; screen - only legal one left + +bne chkinout_device_not_present ckout_set_device: + lda FAT,Y sta DFLTO jmp chkinout_end ckout_file_not_output: - ply_trash_a + + +ply_trash_a pla jmp kernalerror_FILE_NOT_OUTPUT diff --git a/src/kernal/iostack/f291.close.s b/src/kernal/iostack/f291.close.s index 1a5b49a6..d3dd249d 100644 --- a/src/kernal/iostack/f291.close.s +++ b/src/kernal/iostack/f291.close.s @@ -1,48 +1,48 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official Kernal routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - page 281/282 -// - [CM64] Computes Mapping the Commodore 64 - page 229/230 -// - https://www.pagetable.com/?p=1031, https://github.com/mist64/cbmbus_doc (IEC command) -// -// CPU registers that has to be preserved (see [RG64]): none -// +; +; Official Kernal routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - page 281/282 +; - [CM64] Computes Mapping the Commodore 64 - page 229/230 +; - https://www.pagetable.com/?p=1031, https://github.com/mist64/cbmbus_doc (IEC command) +; +; CPU registers that has to be preserved (see [RG64]): none +; CLOSE: - // Find the LAT / SAT / FAT entry which LAT corresponds to A + ; Find the LAT / SAT / FAT entry which LAT corresponds to A jsr find_fls - bcs close_end // XXX can we report error in IOSTATUS here? + bcs close_end ; XXX can we report error in IOSTATUS here? - // We have the entry index in .Y + ; We have the entry index in .Y lda FAT, y - // Perform device-specific actions + ; Perform device-specific actions -#if HAS_RS232 +!ifdef HAS_RS232 { cmp #$02 - beq_16 close_rs232 -#endif + +beq close_rs232 +} -#if CONFIG_IEC +!ifdef CONFIG_IEC { jsr iec_check_devnum_oc - bcc_16 close_iec -#endif + +bcc close_iec +} - // FALLTROUGH + ; FALLTROUGH close_remove_from_table: - // Remove channel from the table + ; Remove channel from the table iny cpy #$0A - bpl !+ + bpl @1 lda LAT, y sta LAT-1, y lda FAT, y @@ -50,11 +50,11 @@ close_remove_from_table: lda SAT, y sta SAT-1, y jmp close_remove_from_table -!: - // Decrement the list size variable +@1: + ; Decrement the list size variable dec LDTND - clc // report success - not sure if original CLOSE does this, but it is nevertheless a good practice + clc ; report success - not sure if original CLOSE does this, but it is nevertheless a good practice close_end: rts diff --git a/src/kernal/iostack/f32f.clall.jmp.s b/src/kernal/iostack/f32f.clall.jmp.s index 3305e94a..946eb160 100644 --- a/src/kernal/iostack/f32f.clall.jmp.s +++ b/src/kernal/iostack/f32f.clall.jmp.s @@ -1,10 +1,10 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// Our implementation is longer than the original one, -// placing it here would cause a collision with CLRCHN +; Our implementation is longer than the original one, +; placing it here would cause a collision with CLRCHN CLALL: diff --git a/src/kernal/iostack/f333.clrchn.s b/src/kernal/iostack/f333.clrchn.s index b4829b11..be3a8e81 100644 --- a/src/kernal/iostack/f333.clrchn.s +++ b/src/kernal/iostack/f333.clrchn.s @@ -1,34 +1,32 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official Kernal routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - page 282 -// - [CM64] Computes Mapping the Commodore 64 - page 230 -// -// CPU registers that has to be preserved (see [RG64]): .Y -// +; +; Official Kernal routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - page 282 +; - [CM64] Computes Mapping the Commodore 64 - page 230 +; +; CPU registers that has to be preserved (see [RG64]): .Y +; CLRCHN: -#if CONFIG_IEC +!ifdef CONFIG_IEC { jsr clrchn_iec -#else - nop // just to prevent double label -#endif - // FALLTROUGH + ; FALLTROUGH -clrchn_reset: // entry needed by vicii_init +clrchn_reset: ; entry needed by vicii_init +} - // Set input device number to keyboard + ; Set input device number to keyboard lda #$00 sta DFLTN - // Set output device number to screen + ; Set output device number to screen lda #$03 sta DFLTO diff --git a/src/kernal/iostack/f34a.open.s b/src/kernal/iostack/f34a.open.s index 6387bdf1..19ab1b69 100644 --- a/src/kernal/iostack/f34a.open.s +++ b/src/kernal/iostack/f34a.open.s @@ -1,51 +1,52 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official Kernal routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - page 289 -// - [CM64] Computes Mapping the Commodore 64 - page 230/231 -// -// CPU registers that has to be preserved (see [RG64]): none -// +; +; Official Kernal routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - page 289 +; - [CM64] Computes Mapping the Commodore 64 - page 230/231 +; +; CPU registers that has to be preserved (see [RG64]): none +; OPEN: - // Reset status + ; Reset status jsr kernalstatus_reset - // Check if the logical file number is unique + ; Check if the logical file number is unique ldy LDTND -!: - beq !+ +@1: + beq @3 dey lda LAT, y cmp LA - bne open_not_yet_open + bne @2 jmp kernalerror_FILE_ALREADY_OPEN -open_not_yet_open: +@2: ; not yet open + cpy #$00 - jmp !- -!: - // Check if we have space in tables + jmp @1 +@3: + ; Check if we have space in tables ldy LDTND cpy #$0A bcc open_has_space -!: - // Table is full + + ; Table is full jmp kernalerror_TOO_MANY_OPEN_FILES open_has_space: - // Update the tables + ; Update the tables - // LAT / FAT / SAT support implemented according to - // 'Computes Mapping the Commodore 64', page 52 + ; LAT / FAT / SAT support implemented according to + ; 'Computes Mapping the Commodore 64', page 52 lda LA sta LAT, y @@ -59,21 +60,18 @@ open_has_space: lda FA -#if HAS_RS232 +!ifdef HAS_RS232 { cmp #$02 - beq_16 open_rs232 + +beq open_rs232 +} -#endif - -#if CONFIG_IEC +!ifdef CONFIG_IEC { jsr iec_check_devnum_oc - bcc_16 open_iec - -#endif - - // FALLTROUGH + +bcc open_iec +} + ; FALLTROUGH open_done_success: diff --git a/src/kernal/iostack/f49e.load_prep.s b/src/kernal/iostack/f49e.load_prep.s index 6d71806c..cb7e6401 100644 --- a/src/kernal/iostack/f49e.load_prep.s +++ b/src/kernal/iostack/f49e.load_prep.s @@ -1,22 +1,22 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// LOAD preparation routine -// +; +; LOAD preparation routine +; -// -// Input (according to http://sta.c64.org/cbm64krnfunc.html) -// .A - 0 for load, non-0 for verify -// .X and .Y - load address (if secondary address is 0) -// +; +; Input (according to http://sta.c64.org/cbm64krnfunc.html) +; .A - 0 for load, non-0 for verify +; .X and .Y - load address (if secondary address is 0) +; -// -// Note: Although the vector at $330 points to $F4A5, the Kernal jump table points to $F49E -// (see also Mapping the C64, page 76). By experimenting I have discovered that $F49E performs -// indirect jump via ($0330) vector, after setting MEMUSS. -// +; +; Note: Although the vector at $330 points to $F4A5, the Kernal jump table points to $F49E +; (see also Mapping the C64, page 76). By experimenting I have discovered that $F49E performs +; indirect jump via ($0330) vector, after setting MEMUSS. +; LOAD_PREP: diff --git a/src/kernal/iostack/f4a5.load.s b/src/kernal/iostack/f4a5.load.s index ac201c15..43b511a5 100644 --- a/src/kernal/iostack/f4a5.load.s +++ b/src/kernal/iostack/f4a5.load.s @@ -1,74 +1,72 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official Kernal routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - page 286 -// - [CM64] Computes Mapping the Commodore 64 - page 231 -// - IEC reference at http://www.zimmers.net/anonftp/pub/cbm/programming/serial-bus.pdf -// -// CPU registers that has to be preserved (see [RG64]): none -// +; +; Official Kernal routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - page 286 +; - [CM64] Computes Mapping the Commodore 64 - page 231 +; - IEC reference at http://www.zimmers.net/anonftp/pub/cbm/programming/serial-bus.pdf +; +; CPU registers that has to be preserved (see [RG64]): none +; - // Expects that SETLFS and SETNAM are called before hand. - // $YYXX = load address. - // (ignored if SETLFS channel = 1, i.e., like ,8,1) - // If A=1 then VERIFY instead of LOAD. - // On exit, $YYXX is the highest address into which data - // will have been placed. + ; Expects that SETLFS and SETNAM are called before hand. + ; $YYXX = load address. + ; (ignored if SETLFS channel = 1, i.e., like ,8,1) + ; If A=1 then VERIFY instead of LOAD. + ; On exit, $YYXX is the highest address into which data + ; will have been placed. LOAD: - // Are we loading or verifying? + ; Are we loading or verifying? sta VERCKK - // Store start address of LOAD + ; Store start address of LOAD lda MEMUSS+0 sta STAL+0 lda MEMUSS+1 sty STAL+1 - // Reset status + ; Reset status jsr kernalstatus_reset -#if CONFIG_MEMORY_MODEL_60K - // We need our helpers to get to filenames under ROMs or IO area +!ifdef CONFIG_MEMORY_MODEL_60K { + ; We need our helpers to get to filenames under ROMs or IO area jsr install_ram_routines -#endif +} - // Check whether we support the requested device + ; Check whether we support the requested device lda FA -#if !CONFIG_TAPE_AUTODETECT +!ifndef CONFIG_TAPE_AUTODETECT { -#if CONFIG_TAPE_NORMAL +!ifdef CONFIG_TAPE_NORMAL { cmp #$01 - beq_16 load_tape_normal -#endif -#if CONFIG_TAPE_TURBO + +beq load_tape_normal +} +!ifdef CONFIG_TAPE_TURBO { cmp #$07 - beq_16 load_tape_turbo -#endif + +beq load_tape_turbo +} -#else // CONFIG_TAPE_AUTODETECT +} else { ; CONFIG_TAPE_AUTODETECT cmp #$01 - beq_16 load_tape_auto + +beq load_tape_auto cmp #$07 - beq_16 load_tape_auto - -#endif + +beq load_tape_auto +} -#if CONFIG_IEC +!ifdef CONFIG_IEC { jsr iec_check_devnum_lvs - bcc_16 load_iec -#endif - + +bcc load_iec +} jmp lvs_illegal_device_number diff --git a/src/kernal/iostack/f5dd.save_prep.s b/src/kernal/iostack/f5dd.save_prep.s index be34baea..b197e498 100644 --- a/src/kernal/iostack/f5dd.save_prep.s +++ b/src/kernal/iostack/f5dd.save_prep.s @@ -1,21 +1,21 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// SAVE preparation routine -// +; +; SAVE preparation routine +; -// -// Input (according to http://sta.c64.org/cbm64krnfunc.html) -// .A - address of zero page register holding start address of memory area to save -// .X and .Y - end address of memory area plus 1 -// +; +; Input (according to http://sta.c64.org/cbm64krnfunc.html) +; .A - address of zero page register holding start address of memory area to save +; .X and .Y - end address of memory area plus 1 +; -// -// Note: Experimenting can easily confirm that SAVE preparation routine does similar -// actions as LOAD preparation routine. -// +; +; Note: Experimenting can easily confirm that SAVE preparation routine does similar +; actions as LOAD preparation routine. +; SAVE_PREP: diff --git a/src/kernal/iostack/f5ed.save.s b/src/kernal/iostack/f5ed.save.s index caf08d01..f3f65b27 100644 --- a/src/kernal/iostack/f5ed.save.s +++ b/src/kernal/iostack/f5ed.save.s @@ -1,33 +1,33 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official Kernal routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - page 293/294 -// - [CM64] Computes Mapping the Commodore 64 - page 231/232 -// - IEC reference at http://www.zimmers.net/anonftp/pub/cbm/programming/serial-bus.pdf -// -// CPU registers that has to be preserved (see [RG64]): none -// +; +; Official Kernal routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - page 293/294 +; - [CM64] Computes Mapping the Commodore 64 - page 231/232 +; - IEC reference at http://www.zimmers.net/anonftp/pub/cbm/programming/serial-bus.pdf +; +; CPU registers that has to be preserved (see [RG64]): none +; SAVE: - // Reset status + ; Reset status jsr kernalstatus_reset -#if CONFIG_MEMORY_MODEL_60K - // We need our helpers to get to filenames under ROMs or IO area +!ifdef CONFIG_MEMORY_MODEL_60K { + ; We need our helpers to get to filenames under ROMs or IO area jsr install_ram_routines -#endif +} - // Check whether we support the requested device + ; Check whether we support the requested device lda FA -#if CONFIG_IEC +!ifdef CONFIG_IEC { jsr iec_check_devnum_lvs - bcc_16 save_iec -#endif + +bcc save_iec +} jmp lvs_illegal_device_number diff --git a/src/kernal/iostack/findfls.s b/src/kernal/iostack/findfls.s index 52c04c5a..5ee50aaa 100644 --- a/src/kernal/iostack/findfls.s +++ b/src/kernal/iostack/findfls.s @@ -1,20 +1,20 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// Just a helper routine +; Just a helper routine -// Find the LAT / SAT / FAT entry index where LAT corresponds to A, returns index in Y -// Carry flag set means not found +; Find the LAT / SAT / FAT entry index where LAT corresponds to A, returns index in Y +; Carry flag set means not found find_fls: ldy LDTND -!: +@1: dey - bmi find_fls_not_found // no more entries + bmi find_fls_not_found ; no more entries cmp LAT, y - bne !- // does not match, try the next one + bne @1 ; does not match, try the next one clc rts diff --git a/src/kernal/iostack/getin_real.s b/src/kernal/iostack/getin_real.s index 335c0319..e1826b55 100644 --- a/src/kernal/iostack/getin_real.s +++ b/src/kernal/iostack/getin_real.s @@ -1,31 +1,30 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official Kernal routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - page 283 -// - [CM64] Computes Mapping the Commodore 64 - page 227/228 -// -// CPU registers that has to be preserved (see [RG64]): for RS-232: .X, .Y -// +; +; Official Kernal routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - page 283 +; - [CM64] Computes Mapping the Commodore 64 - page 227/228 +; +; CPU registers that has to be preserved (see [RG64]): for RS-232: .X, .Y +; getin_real: - // Determine the device number + ; Determine the device number lda DFLTN - // Try $00 - keyboard - beq_16 getin_keyboard + ; Try $00 - keyboard + +beq getin_keyboard -#if HAS_RS232 +!ifdef HAS_RS232 { - // Try $02 - RS-232 + ; Try $02 - RS-232 cmp #$02 - beq_16 getin_rs232 - -#endif // HAS_RS232 + +beq getin_rs232 +} jmp chrin_getin diff --git a/src/kernal/iostack/load_save_common.s b/src/kernal/iostack/load_save_common.s index 6c5dc73e..d40039f9 100644 --- a/src/kernal/iostack/load_save_common.s +++ b/src/kernal/iostack/load_save_common.s @@ -1,10 +1,10 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Helper functions for various LOAD/VERIFY/SAVE routine variants (IEC / U64 / etc.) -// +; +; Helper functions for various LOAD/VERIFY/SAVE routine variants (IEC / U64 / etc.) +; lvs_handle_byte_load_verify: @@ -12,14 +12,14 @@ lvs_handle_byte_load_verify: ldy VERCKK bne lvs_handle_byte_verify - // As with our BASIC, we want to enable LOADing - // anywhere in memory, including over the IO space. - // Thus we have to use a helper routine in low memory - // to do the memory access + ; As with our BASIC, we want to enable LOADing + ; anywhere in memory, including over the IO space. + ; Thus we have to use a helper routine in low memory + ; to do the memory access -#if CONFIG_MEMORY_MODEL_60K +!ifdef CONFIG_MEMORY_MODEL_60K { - // Save byte under ROMs and IO if required + ; Save byte under ROMs and IO if required php sei ldx #$33 @@ -30,14 +30,13 @@ lvs_handle_byte_load_verify: stx $01 plp -#else +} else { ldy #0 sta (EAL),y +} -#endif - - // FALLTROUGH + ; FALLTROUGH lvs_handle_byte_load_verify_end: @@ -47,12 +46,12 @@ lvs_handle_byte_load_verify_end: lvs_handle_byte_verify: -#if CONFIG_MEMORY_MODEL_60K +!ifdef CONFIG_MEMORY_MODEL_60K { - // Store byte for comparing + ; Store byte for comparing sta TBTCNT - // Retrieve byte from under ROMs and IO if required + ; Retrieve byte from under ROMs and IO if required php sei ldx #$33 @@ -63,33 +62,32 @@ lvs_handle_byte_verify: stx $01 plp - // Compare with stored byte + ; Compare with stored byte cmp TBTCNT -#elif CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K +} else ifdef CONFIG_MEMORY_MODEL_46K_OR_50K { - // Store byte for comparing + ; Store byte for comparing sta TBTCNT ldy #0 jsr peek_under_roms_via_EAL - // Compare with stored byte + ; Compare with stored byte cmp TBTCNT -#else // CONFIG_MEMORY_MODEL_38K +} else { ; CONFIG_MEMORY_MODEL_38K ldy #0 cmp (EAL),y - -#endif +} beq lvs_handle_byte_load_verify_end sec rts -#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO || CONFIG_IEC +!ifdef HAS_TAPE_OR_IEC { lvs_STAL_to_MEMUSS: @@ -99,33 +97,28 @@ lvs_STAL_to_MEMUSS: sta MEMUSS+1 rts -#endif - -#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO || CONFIG_IEC - -#if !HAS_OPCODES_65CE02 +!ifndef HAS_OPCODES_65CE02 { lvs_advance_MEMUSS: - // Advance pointer + ; Advance pointer inc MEMUSS+0 - bne !+ + bne @1 inc MEMUSS+1 -!: +@1: rts - -#endif +} lvs_check_EAL: lda MEMUSS+1 cmp EAL+1 - bne !+ + bne @2 lda MEMUSS+0 cmp EAL+0 -!: +@2: rts @@ -138,22 +131,22 @@ lvs_display_searching_for: jsr print_kernal_message ldy #$00 -!: +@3: cpy FNLEN beq lvs_display_end -#if CONFIG_MEMORY_MODEL_60K +!ifdef CONFIG_MEMORY_MODEL_60K { ldx #__kb_matrix_shift // up - .byte >__kb_matrix_normal // down - .byte >__kb_matrix_shift // left - .byte >__kb_matrix_normal // right + !byte >__kb_matrix_shift ; up + !byte >__kb_matrix_normal ; down + !byte >__kb_matrix_shift ; left + !byte >__kb_matrix_normal ; right -#endif +} } diff --git a/src/kernal/keyboard/kb_matrix_lookup.s b/src/kernal/keyboard/kb_matrix_lookup.s index bb82cf2c..b320f0ae 100644 --- a/src/kernal/keyboard/kb_matrix_lookup.s +++ b/src/kernal/keyboard/kb_matrix_lookup.s @@ -1,27 +1,26 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Helper table for determining keyboard matrix decoding table on the C64 keyboard -// -// When more than one bucky keey is pressed, decoding keys is asking for trouble, -// so never allow this. -// +; +; Helper table for determining keyboard matrix decoding table on the C64 keyboard +; +; When more than one bucky keey is pressed, decoding keys is asking for trouble, +; so never allow this. +; -#if !CONFIG_LEGACY_SCNKEY +!ifndef CONFIG_LEGACY_SCNKEY { kb_matrix_lookup: - .byte (__kb_matrix_normal - kb_matrix) // %000 Normal - .byte (__kb_matrix_shift - kb_matrix) // %001 SHIFT - .byte (__kb_matrix_vendor - kb_matrix) // %010 VENDOR - .byte $FF // %011 SHIFT+VENDOR - .byte (__kb_matrix_ctrl - kb_matrix) // %100 CTRL - .byte $FF // %101 SHIFT+CTRL - .byte $FF // %110 VENDOR+CTRL - .byte $FF // %111 SHIFT+VENDOR+CTRL - -#endif + !byte (__kb_matrix_normal - kb_matrix) ; %000 Normal + !byte (__kb_matrix_shift - kb_matrix) ; %001 SHIFT + !byte (__kb_matrix_vendor - kb_matrix) ; %010 VENDOR + !byte $FF ; %011 SHIFT+VENDOR + !byte (__kb_matrix_ctrl - kb_matrix) ; %100 CTRL + !byte $FF ; %101 SHIFT+CTRL + !byte $FF ; %110 VENDOR+CTRL + !byte $FF ; %111 SHIFT+VENDOR+CTRL +} \ No newline at end of file diff --git a/src/kernal/keyboard/kb_matrix_lookup_legacy.s b/src/kernal/keyboard/kb_matrix_lookup_legacy.s index da4df653..1d1ddaa2 100644 --- a/src/kernal/keyboard/kb_matrix_lookup_legacy.s +++ b/src/kernal/keyboard/kb_matrix_lookup_legacy.s @@ -1,32 +1,31 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Work out if normal, shifted, control or Vendor modified keyboard. -// Table contains the offsets into keyboard_matrixes that should be used -// for different values of the bottom 3 bits of key_bucky_state XXX -// Interaction is simple to work out when playing with a C64: -// CTRL trumps SHIFT or VENDOR -// VENDOR + SHIFT = DOES NOTHING -// All 3 does CONTROL -// +; +; Work out if normal, shifted, control or Vendor modified keyboard. +; Table contains the offsets into keyboard_matrixes that should be used +; for different values of the bottom 3 bits of key_bucky_state XXX +; Interaction is simple to work out when playing with a C64: +; CTRL trumps SHIFT or VENDOR +; VENDOR + SHIFT = DOES NOTHING +; All 3 does CONTROL +; -// This lookup table is used by TWW/CTR keyboard routine only! +; This lookup table is used by TWW/CTR keyboard routine only! -#if CONFIG_LEGACY_SCNKEY +!ifdef CONFIG_LEGACY_SCNKEY { kb_matrix_lookup: - .byte $00 // Normal - .byte $40 // Shifted - .byte $80 // Control - .byte $80 // Control + SHIFT - .byte $C0 // Vendor - .byte $C0 // Vendor + SHIFT - .byte $80 // Vendor + CTRL - .byte $80 // Vendor + CTRL + SHIFT - -#endif // CONFIG_LEGACY_SCNKEY + !byte $00 ; Normal + !byte $40 ; Shifted + !byte $80 ; Control + !byte $80 ; Control + SHIFT + !byte $C0 ; Vendor + !byte $C0 ; Vendor + SHIFT + !byte $80 ; Vendor + CTRL + !byte $80 ; Vendor + CTRL + SHIFT +} diff --git a/src/kernal/keyboard/kb_matrix_row_keys.s b/src/kernal/keyboard/kb_matrix_row_keys.s index ce225e80..e74f02db 100644 --- a/src/kernal/keyboard/kb_matrix_row_keys.s +++ b/src/kernal/keyboard/kb_matrix_row_keys.s @@ -1,33 +1,32 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Single row key codes for scanning the C64 keyboard -// -// Values based on: -// - [CM64] Computes Mapping the Commodore 64 - pags 58 (SHFLAG), 173 (matrix) -// +; +; Single row key codes for scanning the C64 keyboard +; +; Values based on: +; - [CM64] Computes Mapping the Commodore 64 - pags 58 (SHFLAG), 173 (matrix) +; -#if !CONFIG_LEGACY_SCNKEY +!ifndef CONFIG_LEGACY_SCNKEY { kb_matrix_row_keys: - // - values for CIA1_PRA to connect only the given row - // - first 3 values also meant for VIC_XSCAN for C128 keyboards - // - also used to scan a single row + ; - values for CIA1_PRA to connect only the given row + ; - first 3 values also meant for VIC_XSCAN for C128 keyboards + ; - also used to scan a single row - .byte %11111110 - .byte %11111101 - .byte %11111011 - .byte %11110111 - .byte %11101111 - .byte %11011111 - .byte %10111111 - .byte %01111111 + !byte %11111110 + !byte %11111101 + !byte %11111011 + !byte %11110111 + !byte %11101111 + !byte %11011111 + !byte %10111111 + !byte %01111111 - -#endif // no CONFIG_LEGACY_SCNKEY +} ; no CONFIG_LEGACY_SCNKEY diff --git a/src/kernal/keyboard/kb_matrix_row_offsets.s b/src/kernal/keyboard/kb_matrix_row_offsets.s index 314a0852..6a59df0d 100644 --- a/src/kernal/keyboard/kb_matrix_row_offsets.s +++ b/src/kernal/keyboard/kb_matrix_row_offsets.s @@ -1,27 +1,26 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Helper values to quickly determine row offset from the start of keyboard matrix -// +; +; Helper values to quickly determine row offset from the start of keyboard matrix +; -#if !CONFIG_LEGACY_SCNKEY +!ifndef CONFIG_LEGACY_SCNKEY { kb_matrix_row_offsets: - // - offsets (in bytes) to the first bytes of keyboard matrix rows + ; - offsets (in bytes) to the first bytes of keyboard matrix rows - .byte 0*8 - .byte 1*8 - .byte 2*8 - .byte 3*8 - .byte 4*8 - .byte 5*8 - .byte 6*8 - .byte 7*8 - -#endif // no CONFIG_LEGACY_SCNKEY + !byte 0*8 + !byte 1*8 + !byte 2*8 + !byte 3*8 + !byte 4*8 + !byte 5*8 + !byte 6*8 + !byte 7*8 +} diff --git a/src/kernal/keyboard/keyboard_disconnect.s b/src/kernal/keyboard/keyboard_disconnect.s index 98c0150b..416ed33a 100644 --- a/src/kernal/keyboard/keyboard_disconnect.s +++ b/src/kernal/keyboard/keyboard_disconnect.s @@ -1,26 +1,24 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Helper routine - disconnects the keyboard from CIA1_PRB, -// leaves $FF in .X (behavior needed in some places) -// +; +; Helper routine - disconnects the keyboard from CIA1_PRB, +; leaves $FF in .X (behavior needed in some places) +; -#if !CONFIG_LEGACY_SCNKEY +!ifndef CONFIG_LEGACY_SCNKEY { keyboard_disconnect: ldx #$FF - stx CIA1_PRA // disconnect all the rows -#if CONFIG_KEYBOARD_C128 + stx CIA1_PRA ; disconnect all the rows +!ifdef CONFIG_KEYBOARD_C128 { stx VIC_XSCAN -#endif +} rts - - -#endif +} diff --git a/src/kernal/keyboard/scnkey.s b/src/kernal/keyboard/scnkey.s index 50965ea7..5560f22d 100644 --- a/src/kernal/keyboard/scnkey.s +++ b/src/kernal/keyboard/scnkey.s @@ -1,282 +1,276 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official Kernal routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - page 295 -// - [CM64] Computes Mapping the Commodore 64 - page 220 -// -// CPU registers that has to be preserved (see [RG64]): none -// +; +; Official Kernal routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - page 295 +; - [CM64] Computes Mapping the Commodore 64 - page 220 +; +; CPU registers that has to be preserved (see [RG64]): none +; -// Variables used: -// - KEYTAB - keyboard matrix pointer -// - DELAY - counter for first delay between key repeats -// - KOUNT - counter for next delays between key repeats -// - SHFLAG - SHIFT / CTRL / VENDOR keypress status -// - NDX - number of characters in keyboard buffer -// - XMAX - maximum size of keyboard buffer -// - LSTX - matrix coordinate of last pressed key -// - LSTSHF - previous status of SHFLAG -// - MODE - flag, whether charset toggle (SHIFT+VENDOR) is allowed -// - RPTFLG - whether key repeat is allowed +; Variables used: +; - KEYTAB - keyboard matrix pointer +; - DELAY - counter for first delay between key repeats +; - KOUNT - counter for next delays between key repeats +; - SHFLAG - SHIFT / CTRL / VENDOR keypress status +; - NDX - number of characters in keyboard buffer +; - XMAX - maximum size of keyboard buffer +; - LSTX - matrix coordinate of last pressed key +; - LSTSHF - previous status of SHFLAG +; - MODE - flag, whether charset toggle (SHIFT+VENDOR) is allowed +; - RPTFLG - whether key repeat is allowed -#if !CONFIG_LEGACY_SCNKEY +!ifndef CONFIG_LEGACY_SCNKEY { -// Routine takes some ideas from TWW/CTR proposal, see here: -// - http://codebase64.org/doku.php?id=base:scanning_the_keyboard_the_correct_and_non_kernal_way +; Routine takes some ideas from TWW/CTR proposal, see here: +; - http://codebase64.org/doku.php?id=base:scanning_the_keyboard_the_correct_and_non_kernal_way SCNKEY: - // Prepare for SHFLAG update + ; Prepare for SHFLAG update lda SHFLAG sta LSTSHF lda #$00 sta SHFLAG -#if !CONFIG_JOY2_CURSOR && CONFIG_KEY_FAST_SCAN +!ifndef CONFIG_JOY2_CURSOR { !ifdef CONFIG_KEY_FAST_SCAN { - // Check for any activity - speed optimization, but cannot be done - // that early if we are to scan the joystick #2 + ; Check for any activity - speed optimization, but cannot be done + ; that early if we are to scan the joystick #2 ldx #$00 - stx CIA1_PRA // connect all the rows -#if CONFIG_KEYBOARD_C128 + stx CIA1_PRA ; connect all the rows +!ifdef CONFIG_KEYBOARD_C128 { stx VIC_XSCAN -#endif - dex // puts $FF +} + dex ; puts $FF cpx CIA1_PRB beq scnkey_no_keys -#endif +} } - // Retrieve SHIFT / VENDOR / CTRL / ALT / CAPS LOCK status + ; Retrieve SHIFT / VENDOR / CTRL / ALT / CAPS LOCK status -#if CONFIG_KEYBOARD_C128_CAPS_LOCK +!ifdef CONFIG_KEYBOARD_C128_CAPS_LOCK { - // First check if this is really a C128 - to avoid false positive + ; First check if this is really a C128 - to avoid false positive ldx #$00 stx VIC_XSCAN - dex // puts $FF + dex ; puts $FF cpx VIC_XSCAN - beq !+ // branch if C64, C128 will keep some bits cleared + beq @1 ; branch if C64, C128 will keep some bits cleared lda CPU_R6510 and #$40 - bne !+ // branch if no CAPS LOCK + bne @1 ; branch if no CAPS LOCK lda #KEY_CAPS_LOCK sta SHFLAG -!: +@1: -#if !CONFIG_KEYBOARD_C128 - stx VIC_XSCAN // disconnect C128 keys if no C128 keyboard is supported -#endif +!ifndef !CONFIG_KEYBOARD_C128 { + stx VIC_XSCAN ; disconnect C128 keys if no C128 keyboard is supported +} } -#endif - -#if CONFIG_KEYBOARD_C65_CAPS_LOCK +!ifdef CONFIG_KEYBOARD_C65_CAPS_LOCK { lda C65_EXTKEYS_PR and #$01 - bne !+ // branch if no CAPS LOCK + bne @2 ; branch if no CAPS LOCK lda #KEY_CAPS_LOCK sta SHFLAG -!: +@2: -#if !CONFIG_KEYBOARD_C65 +!ifndef CONFIG_KEYBOARD_C65 { ldx #$FF - stx C65_EXTKEYS_PR // disconnect C128 keys if no C128 keyboard is supported -#endif - -#endif + stx C65_EXTKEYS_PR ; disconnect C65 keys if no C65 keyboard is supported +} } ldy #(__kb_matrix_bucky_confmask_end - kb_matrix_bucky_confmask - 1) scnkey_bucky_loop: lda kb_matrix_bucky_confmask, y sta CIA1_PRA -#if CONFIG_KEYBOARD_C128 +!ifdef CONFIG_KEYBOARD_C128 { lda kb_matrix_bucky_confmask_c128, y sta VIC_XSCAN -#endif -#if CONFIG_KEYBOARD_C65 +} +!ifdef CONFIG_KEYBOARD_C65 { lda kb_matrix_bucky_confmask_c65, y sta C65_EXTKEYS_PR -#endif +} lda kb_matrix_bucky_testmask, y and CIA1_PRB - bne !+ // branch if not pressed + bne @3 ; branch if not pressed lda SHFLAG ora kb_matrix_bucky_shflag, y sta SHFLAG -!: +@3: dey bpl scnkey_bucky_loop - // Set KEYTAB vector + ; Set KEYTAB vector lda KEYLOG+1 - bne !+ - jsr scnkey_set_keytab // KEYLOG routine on zeropage? most likely vector not set - jmp_8 scnkey_keytab_set_done + bne @11 + jsr scnkey_set_keytab ; KEYLOG routine on zeropage? most likely vector not set + +bra scnkey_keytab_set_done -!: -#if HAS_OPCODES_65CE02 - jsr_ind KEYLOG -#else +@11: +!ifdef HAS_OPCODES_65CE02 { + jsr (KEYLOG) +} else { jsr scnkey_via_keylog -#endif +} scnkey_keytab_set_done: -#if CONFIG_JOY2_CURSOR +!ifdef CONFIG_JOY2_CURSOR { - // Check for control port 2 activity + ; Check for control port 2 activity ldx #$00 - stx CIA1_DDRA // set port to input to read joystick + stx CIA1_DDRA ; set port to input to read joystick - lda CIA1_PRA // read the joystick 2 status + lda CIA1_PRA ; read the joystick 2 status - dex // puts $FF - stx CIA1_DDRA // set port back to output + dex ; puts $FF + stx CIA1_DDRA ; set port back to output - and #%00001111 // filter out anything but joystick movement + and #%00001111 ; filter out anything but joystick movement cmp #%00001111 bne scnkey_joystick_filtered -#if CONFIG_KEY_FAST_SCAN +!ifdef CONFIG_KEY_FAST_SCAN { - inx // puts $00 - stx CIA1_PRA // connect all the rows -#if CONFIG_KEYBOARD_C128 + inx ; puts $00 + stx CIA1_PRA ; connect all the rows +!ifdef CONFIG_KEYBOARD_C128 { stx VIC_XSCAN -#endif -#if CONFIG_KEYBOARD_C65 +} +!ifdef CONFIG_KEYBOARD_C65 { stx C65_EXTKEYS_PR -#endif - dex // puts $FF +} + dex ; puts $FF cpx CIA1_PRB beq scnkey_no_keys -#endif // CONFIG_KEY_FAST_SCAN +} ; CONFIG_KEY_FAST_SCAN +} ; CONFIG_JOY2_CURSOR -#endif // CONFIG_JOY2_CURSOR + ; Check for control port 1 activity (can interfere with keyboard) - // Check for control port 1 activity (can interfere with keyboard) + jsr keyboard_disconnect ; disconnect all the rows, .X will be $FF + cpx CIA1_PRB ; only control port activity will be reported +!ifdef CONFIG_JOY1_CURSOR { + bne scnkey_joystick_1 ; use joystick for cursor keys +} else { + bne scnkey_no_keys ; if activity detected do not scan the keyboard +} - jsr keyboard_disconnect // disconnect all the rows, .X will be $FF - cpx CIA1_PRB // only control port activity will be reported -#if CONFIG_JOY1_CURSOR - bne scnkey_joystick_1 // use joystick for cursor keys -#else - bne scnkey_no_keys // if activity detected do not scan the keyboard -#endif - - // Check if KEYTAB is not 0 (happens if more than one bucky key is pressed) - // High byte equal to 0 = table considered invalid + ; Check if KEYTAB is not 0 (happens if more than one bucky key is pressed) + ; High byte equal to 0 = table considered invalid lda KEYTAB+1 beq scnkey_no_keys - // Scan the keyboard matrix + ; Scan the keyboard matrix - ldy #$FF // offset in key matrix table, $FF for not found yet -#if CONFIG_KEYBOARD_C128 + ldy #$FF ; offset in key matrix table, $FF for not found yet +!ifdef CONFIG_KEYBOARD_C128 { jsr scnkey_128 -#endif -#if CONFIG_KEYBOARD_C65 +} +!ifdef CONFIG_KEYBOARD_C65 { jsr scnkey_65 -#endif +} ldx #$07 scnkey_matrix_loop: lda kb_matrix_row_keys, x sta CIA1_PRA - lda kb_matrix_bucky_filter, x // filter out bucky keys + lda kb_matrix_bucky_filter, x ; filter out bucky keys ora CIA1_PRB cmp #$FF - beq scnkey_matrix_loop_next // skip if no key pressed from this row + beq scnkey_matrix_loop_next ; skip if no key pressed from this row cpy #$FF - bne scnkey_no_keys // jam, more than one key pressed - // We have at least one key pressed in this row, we need to find which one exactly + bne scnkey_no_keys ; jam, more than one key pressed + ; We have at least one key pressed in this row, we need to find which one exactly ldy #$07 scnkey_matrix_loop_inner: cmp kb_matrix_row_keys, y - bne !+ // not this particular key - tya // now .A contains key offset within a row + bne @4 ; not this particular key + tya ; now .A contains key offset within a row clc - adc kb_matrix_row_offsets, x // now .A contains key offset from the matrix start + adc kb_matrix_row_offsets, x ; now .A contains key offset from the matrix start tay jmp scnkey_matrix_loop_next -!: +@4: dey bpl scnkey_matrix_loop_inner - bmi scnkey_no_keys // branch always, multiple keys must have been pressed + bmi scnkey_no_keys ; branch always, multiple keys must have been pressed scnkey_matrix_loop_next: dex bpl scnkey_matrix_loop - // Scanning complete - check if we got a key + ; Scanning complete - check if we got a key cpy #$FF beq scnkey_no_keys - // To be extra sure, check for possible control port 1 interference once again + ; To be extra sure, check for possible control port 1 interference once again - jsr keyboard_disconnect // disconnect all the rows, .X will be $FF - cpx CIA1_PRB // only control port activity will be reported - beq scnkey_got_key // branch if joystick activity NOT detected + jsr keyboard_disconnect ; disconnect all the rows, .X will be $FF + cpx CIA1_PRB ; only control port activity will be reported + beq scnkey_got_key ; branch if joystick activity NOT detected - // FALLTROUGH + ; FALLTROUGH scnkey_no_keys: - // Mark no key press + ; Mark no key press lda #$40 sta LSTX rts -#if CONFIG_JOY1_CURSOR +!ifdef CONFIG_JOY1_CURSOR { scnkey_joystick_1: - // Prepare joystick 1 status + ; Prepare joystick 1 status lda CIA1_PRB - and #%00001111 // filter out anything but movement + and #%00001111 ; filter out anything but movement - // FALLTROUGH + ; FALLTROUGH +} -#endif - -#if CONFIG_JOY1_CURSOR || CONFIG_JOY2_CURSOR +!ifdef CONFIG_JOY1_OR_JOY2_CURSOR { scnkey_joystick_filtered: - // Set appropriate keyboard matrix and key code for joystick event + ; Set appropriate keyboard matrix and key code for joystick event ldy #$03 -!: +@5: cmp kb_matrix_joy_status, y - beq !+ + beq @6 dey - bpl !- + bpl @5 - // Not found + ; Not found rts -!: - // Found +@6: + ; Found lda kb_matrix_joy_keytab_lo, y sta KEYTAB+0 @@ -285,65 +279,64 @@ scnkey_joystick_filtered: lda kb_matrix_joy_keytab_idx, y tay - // FALLTROUGH + ; FALLTROUGH +} -#endif - -scnkey_got_key: // .Y should now contain the key offset in matrix pointed by KEYTAB +scnkey_got_key: ; .Y should now contain the key offset in matrix pointed by KEYTAB cpy LSTX - beq scnkey_try_repeat // branch if the same key as previously + beq scnkey_try_repeat ; branch if the same key as previously sty LSTX - // Reset key repeat counters - see [CM64] page 58 + ; Reset key repeat counters - see [CM64] page 58 - // Note: according to [CM64] it should be $10 for initializing DELAY, $06 for - // initializing KOUNT for the first time and $04 for subsequent ones - but replicating - // this would make our implementation longer, probably without improving the compatibility. - // - // Besides - since I am the one who writes the code, I will make the values exactly how I like them :D + ; Note: according to [CM64] it should be $10 for initializing DELAY, $06 for + ; initializing KOUNT for the first time and $04 for subsequent ones - but replicating + ; this would make our implementation longer, probably without improving the compatibility. + ; + ; Besides - since I am the one who writes the code, I will make the values exactly how I like them :D -#if !CONFIG_RS232_UP9600 +!ifndef CONFIG_RS232_UP9600 { lda #$16 -#else +} else { lda #$18 -#endif +} sta DELAY - // FALLTROUGH + ; FALLTROUGH scnkey_output_key: - // Check if we have free space in the keyboard buffer + ; Check if we have free space in the keyboard buffer lda NDX cmp XMAX - bcs scnkey_early_repeat // no space in buffer + bcs scnkey_early_repeat ; no space in buffer - // Reinitialize secondary counter + ; Reinitialize secondary counter lda #$03 sta KOUNT - // Retrieve the PETSCII code + ; Retrieve the PETSCII code -#if CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65 +!ifdef CONFIG_KEYBOARD_C128_OR_C65 { cpy #$40 - bcc !+ + bcc scnkey_output_get_keycode -#if CONFIG_KEYBOARD_C128 - lda kb_matrix_128 - $41, y // retrieve key code from C128 extended matrix -#elif CONFIG_KEYBOARD_C65 +!ifdef CONFIG_KEYBOARD_C128 { + lda kb_matrix_128 - $41, y ; retrieve key code from C128 extended matrix +} else ifdef CONFIG_KEYBOARD_C65 { - // Select key matrix (normal or shifted) for extended C65 keys + ; Select key matrix (normal or shifted) for extended C65 keys lda SHFLAG - and #%00000111 // KEY_FLAG_SHIFT + KEY_FLAG_VENDOR + KEY_FLAG_CTRL + and #%00000111 ; KEY_FLAG_SHIFT + KEY_FLAG_VENDOR + KEY_FLAG_CTRL beq scnkey_output_65_no_shift cmp #KEY_FLAG_SHIFT - // XXX how to behave on VENDOR/CTRL key? Harmonize this with claasic keys behavior - bne scnkey_no_keys // no scanning for this bucky key combination + ; XXX how to behave on VENDOR/CTRL key? Harmonize this with clasic keys behavior + bne scnkey_no_keys ; no scanning for this bucky key combination lda kb_matrix_65_shifted - $41, y jmp scnkey_got_petscii @@ -351,76 +344,79 @@ scnkey_output_key: scnkey_output_65_no_shift: lda kb_matrix_65 - $41, y +} -#endif jmp scnkey_got_petscii -!: - lda (KEYTAB), y // retrieve key code from standard matrix -#endif // CONFIG_KEYBOARD_C128 or CONFIG_KEYBOARD_C65 + ; FALLTROUGH -#if CONFIG_KEYBOARD_C128_CAPS_LOCK || CONFIG_KEYBOARD_C65_CAPS_LOCK +scnkey_output_get_keycode: - // Check if we need special handling for a CAPS LOCK key - // This is shorter than a separate set of tables + lda (KEYTAB), y ; retrieve key code from standard matrix + +} ; CONFIG_KEYBOARD_C128 or CONFIG_KEYBOARD_C65 + +!ifdef CONFIG_KEYBOARD_CAPS_LOCK { + + ; Check if we need special handling for a CAPS LOCK key + ; This is shorter than a separate set of tables scnkey_handle_caps_lock: -#if !CONFIG_KEYBOARD_C128 && !CONFIG_KEYBOARD_C65 +!ifndef CONFIG_KEYBOARD_C128_OR_C65 { lda (KEYTAB), y -#endif +} tax lda SHFLAG and #(%00000111 + KEY_CAPS_LOCK) cmp #KEY_CAPS_LOCK - bne !+ // branch if no special CAPS LOCK handling needed + bne @7 ; branch if no special CAPS LOCK handling needed - cpx #$41 // 'A' - bcc !+ - cpx #$5B // 'Z' + 1 - bcs !+ + cpx #$41 ; 'A' + bcc @7 + cpx #$5B ; 'Z' + 1 + bcs @7 txa clc - adc #$20 // turn lowercase into uppercase + adc #$20 ; turn lowercase into uppercase tax -!: +@7: txa -#endif // CONFIG_KEYBOARD_C128_CAPS_LOCK or CONFIG_KEYBOARD_C65_CAPS_LOCK +} ; CONFIG_KEYBOARD_C128_CAPS_LOCK or CONFIG_KEYBOARD_C65_CAPS_LOCK -#if !CONFIG_KEYBOARD_C128 && !CONFIG_KEYBOARD_C128_CAPS_LOCK && !CONFIG_KEYBOARD_C65 && !CONFIG_KEYBOARD_C65_CAPS_LOCK +!ifndef CONFIG_KEYBOARD_C128_OR_C65 { !ifndef CONFIG_KEYBOARD_CAPS_LOCK { lda (KEYTAB), y +} } -#endif - - // Output PETSCII code to the keyboard buffer + ; Output PETSCII code to the keyboard buffer scnkey_got_petscii: -#if CONFIG_KEYBOARD_C128 && CONFIG_EDIT_TABULATORS +!ifdef CONFIG_KEYBOARD_C128 { !ifdef CONFIG_EDIT_TABULATORS { - // Special handling for SHIFT+TAB; it is easier than creating new matrix + ; Special handling for SHIFT+TAB; it is easier than creating new matrix tax cmp #KEY_C64_TAB_FW - bne !+ + bne @8 lda SHFLAG and #KEY_FLAG_SHIFT - beq !+ + beq @8 ldx #KEY_C64_TAB_BW -!: +@8: txa -#endif // CONFIG_KEYBOARD_C128 and CONFIG_EDIT_TABULATORS +} } ; CONFIG_KEYBOARD_C128 and CONFIG_EDIT_TABULATORS - beq scnkey_no_keys // branch if we have no PETSCII code for this key + beq scnkey_no_keys ; branch if we have no PETSCII code for this key ldy NDX sta KEYD, y inc NDX - // FALLTROUGH + ; FALLTROUGH scnkey_done: @@ -428,46 +424,46 @@ scnkey_done: scnkey_try_repeat: -#if !CONFIG_KEY_REPEAT_ALWAYS +!ifndef CONFIG_KEY_REPEAT_ALWAYS { - // Check whether we should repeat keys - first the flag, afterwards hardcoded list + ; Check whether we should repeat keys - first the flag, afterwards hardcoded list lda RPTFLG - bmi scnkey_handle_repeat // branch if we should repeat always + bmi scnkey_handle_repeat ; branch if we should repeat always tya ldx #(__kb_matrix_alwaysrepeat_end - kb_matrix_alwaysrepeat - 1) -!: +@9: cmp kb_matrix_alwaysrepeat, x beq scnkey_handle_repeat dex - bpl !- + bpl @9 bmi scnkey_done scnkey_handle_repeat: -#endif // no CONFIG_KEY_REPEAT_ALWAYS +} ; no CONFIG_KEY_REPEAT_ALWAYS - // Countdown before first repeat + ; Countdown before first repeat lda DELAY - beq !+ + beq @10 dec DELAY rts -!: - // Countdown before subsequent repeats +@10: + ; Countdown before subsequent repeats lda KOUNT - beq scnkey_output_key // if second counter is also 0, we can repeat the key + beq scnkey_output_key ; if second counter is also 0, we can repeat the key dec KOUNT rts scnkey_early_repeat: - // Keyboard buffer was full - at least make sure the key - // will be repeated as soon as possible + ; Keyboard buffer was full - at least make sure the key + ; will be repeated as soon as possible lda #$00 sta DELAY @@ -475,4 +471,4 @@ scnkey_early_repeat: rts -#endif // no CONFIG_LEGACY_SCNKEY +} ; no CONFIG_LEGACY_SCNKEY diff --git a/src/kernal/keyboard/scnkey_128.s b/src/kernal/keyboard/scnkey_128.s index fd00cddc..07b11b21 100644 --- a/src/kernal/keyboard/scnkey_128.s +++ b/src/kernal/keyboard/scnkey_128.s @@ -1,71 +1,71 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Keyboard scanning routine extension for C128 keyboards -// -// - [CM128] Computes Mapping the Commodore 128 - pages 212 (SHFLAG), 290 (matrix) -// +; +; Keyboard scanning routine extension for C128 keyboards +; +; - [CM128] Computes Mapping the Commodore 128 - pages 212 (SHFLAG), 290 (matrix) +; -#if CONFIG_KEYBOARD_C128 && !CONFIG_LEGACY_SCNKEY +!ifdef CONFIG_KEYBOARD_C128 { !ifndef CONFIG_LEGACY_SCNKEY { -// Inlining this within SCNKEY would both overcomplicate the implementation -// and disrupt a lot of branches (they would cross the 127 bytes distance limit) +; Inlining this within SCNKEY would both overcomplicate the implementation +; and disrupt a lot of branches (they would cross the 127 bytes distance limit) -// .Y is now $FF - try to put there a key code from extended keyboard +; .Y is now $FF - try to put there a key code from extended keyboard scnkey_128: - sty CIA1_PRA // disconnect all the classic keys first + sty CIA1_PRA ; disconnect all the classic keys first ldx #$02 scnkey_matrix_128_loop: lda kb_matrix_row_keys, x sta VIC_XSCAN - lda kb_matrix_128_bucky_filter, x // filter out bucky keys + lda kb_matrix_128_bucky_filter, x ; filter out bucky keys ora CIA1_PRB cmp #$FF - beq scnkey_matrix_128_loop_next // skip if no key pressed from this row + beq scnkey_matrix_128_loop_next ; skip if no key pressed from this row cpy #$FF - bne scnkey_128_no_keys // jam, more than one key pressed - // We have at least one key pressed in this row, we need to find which one exactly + bne scnkey_128_no_keys ; jam, more than one key pressed + ; We have at least one key pressed in this row, we need to find which one exactly ldy #$07 scnkey_matrix_128_loop_inner: cmp kb_matrix_row_keys, y - bne !+ // not this particular key - tya // now .A contains key offset within a row + bne @1 ; not this particular key + tya ; now .A contains key offset within a row clc - adc kb_matrix_row_offsets, x // now .A contains key offset from the matrix start - adc #$41 // now .A contains offset after the standard matrix + adc kb_matrix_row_offsets, x ; now .A contains key offset from the matrix start + adc #$41 ; now .A contains offset after the standard matrix tay jmp scnkey_matrix_128_loop_next -!: +@1: dey bpl scnkey_matrix_128_loop_inner - bmi scnkey_128_no_keys // branch always, multiple keys must have been pressed + bmi scnkey_128_no_keys ; branch always, multiple keys must have been pressed scnkey_matrix_128_loop_next: dex bpl scnkey_matrix_128_loop - // Scanning the C128 keyboard part complete + ; Scanning the C128 keyboard part complete scnkey_128_done: - stx VIC_XSCAN // $FF, disconnects C128 keys + stx VIC_XSCAN ; $FF, disconnects C128 keys rts scnkey_128_no_keys: - pla // get rid of return address from the stack + pla ; get rid of return address from the stack pla - jmp scnkey_no_keys // pass controll to original routine + jmp scnkey_no_keys ; pass controll to original routine -#endif // CONFIG_KEYBOARD_C128 and no CONFIG_LEGACY_SCNKEY +} } ; CONFIG_KEYBOARD_C128 and no CONFIG_LEGACY_SCNKEY diff --git a/src/kernal/keyboard/scnkey_65.s b/src/kernal/keyboard/scnkey_65.s index 8518c837..6d000c2e 100644 --- a/src/kernal/keyboard/scnkey_65.s +++ b/src/kernal/keyboard/scnkey_65.s @@ -1,68 +1,68 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Keyboard scanning routine extension for C65 keyboards -// -// - [CM128] Computes Mapping the Commodore 128 - pages 212 (SHFLAG) -// - https://github.com/MEGA65/c65-specifications/blob/master/c65manualupdated.txt (matrix) -// +; +; Keyboard scanning routine extension for C65 keyboards +; +; - [CM128] Computes Mapping the Commodore 128 - pages 212 (SHFLAG) +; - https://github.com/MEGA65/c65-specifications/blob/master/c65manualupdated.txt (matrix) +; -#if CONFIG_KEYBOARD_C65 && !CONFIG_LEGACY_SCNKEY +!ifdef CONFIG_KEYBOARD_C65 { !ifndef CONFIG_LEGACY_SCNKEY { -// Inlining this within SCNKEY would both overcomplicate the implementation -// and disrupt a lot of branches (they would cross the 127 bytes distance limit) +; Inlining this within SCNKEY would both overcomplicate the implementation +; and disrupt a lot of branches (they would cross the 127 bytes distance limit) -// .Y is now $FF - try to put there a key code from extended keyboard +; .Y is now $FF - try to put there a key code from extended keyboard scnkey_65: - sty CIA1_PRA // disconnect classic keys + sty CIA1_PRA ; disconnect classic keys lda #$00 - sta C65_EXTKEYS_PR // connect C65 keys + sta C65_EXTKEYS_PR ; connect C65 keys - lda #%00000101 // filter out bucky keys: ALT, NO_SCRL + lda #%00000101 ; filter out bucky keys: ALT, NO_SCRL ora CIA1_PRB cmp #$FF - beq scnkey_65_done // skip if no key pressed from this row + beq scnkey_65_done ; skip if no key pressed from this row - // At least one key is pressed - decode it + ; At least one key is pressed - decode it ldy #$07 scnkey_matrix_65_loop: cmp kb_matrix_row_keys, y - bne !+ // not this particular key - tya // now .A contains key offset within a row + bne @1 ; not this particular key + tya ; now .A contains key offset within a row clc - adc kb_matrix_row_offsets, x // now .A contains key offset from the matrix start - adc #$41 // now .A contains offset after the standard matrix + adc kb_matrix_row_offsets, x ; now .A contains key offset from the matrix start + adc #$41 ; now .A contains offset after the standard matrix tay jmp scnkey_65_done -!: +@1: dey bpl scnkey_matrix_65_loop - // FALLTROUGH, multiple keys must have been pressed + ; FALLTROUGH, multiple keys must have been pressed scnkey_65_no_keys: - pla // get rid of return address from the stack + pla ; get rid of return address from the stack pla - jmp scnkey_no_keys // pass controll to original routine + jmp scnkey_no_keys ; pass controll to original routine scnkey_65_done: ldx #$FF - stx C65_EXTKEYS_PR // connect C65 keys + stx C65_EXTKEYS_PR ; connect C65 keys rts -#endif // CONFIG_KEYBOARD_C65 and no CONFIG_LEGACY_SCNKEY +} } ; CONFIG_KEYBOARD_C65 and no CONFIG_LEGACY_SCNKEY diff --git a/src/kernal/keyboard/scnkey_legacy.s b/src/kernal/keyboard/scnkey_legacy.s index d5ab27d2..38feccd1 100644 --- a/src/kernal/keyboard/scnkey_legacy.s +++ b/src/kernal/keyboard/scnkey_legacy.s @@ -1,124 +1,124 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official Kernal routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - page 295 -// - [CM64] Computes Mapping the Commodore 64 - page 220 -// -// CPU registers that has to be preserved (see [RG64]): none -// +; +; Official Kernal routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - page 295 +; - [CM64] Computes Mapping the Commodore 64 - page 220 +; +; CPU registers that has to be preserved (see [RG64]): none +; -// NOTE: The code here is described as legacy, because the algorithm (although working very well) -// requires much more RAM than the original Kernal routine uses; without any form of extended -// RAM available to Open ROMs it will always be a serious compatibility risk. +; NOTE: The code here is described as legacy, because the algorithm (although working very well) +; requires much more RAM than the original Kernal routine uses; without any form of extended +; RAM available to Open ROMs it will always be a serious compatibility risk. -#if CONFIG_LEGACY_SCNKEY +!ifdef CONFIG_LEGACY_SCNKEY { -// Scan the keyboard.. -// Here we don't use the horrible buggy original routine, -// not just because of copyright. Instead, we use the -// nice one with joystick interference removal and -// key roll-over support from -// http://codebase64.org/doku.php?id=base:scanning_the_keyboard_the_correct_and_non_kernal_way +; Scan the keyboard.. +; Here we don't use the horrible buggy original routine, +; not just because of copyright. Instead, we use the +; nice one with joystick interference removal and +; key roll-over support from +; http://codebase64.org/doku.php?id=base:scanning_the_keyboard_the_correct_and_non_kernal_way -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Keyboard IO Routine -// ~~~~~~~~~~~~~~~~~~~ -// By: TWW/CTR +; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +; Keyboard IO Routine +; ~~~~~~~~~~~~~~~~~~~ +; By: TWW/CTR -// Information -// ~~~~~~~~~~~ -// The routine uses "2 Key rollower" or up to 3 if the key-combination doesen't induce shadowing. -// If 2 or 3 keys are pressed simultaneously (within 1 scan) a "No Activity" state has to occur before new valid keys are returned. -// RESTORE is not detectable and must be handled by NMI IRQ. -// SHIFT LOCK is not detected due to unreliability. +; Information +; ~~~~~~~~~~~ +; The routine uses "2 Key rollower" or up to 3 if the key-combination doesen't induce shadowing. +; If 2 or 3 keys are pressed simultaneously (within 1 scan) a "No Activity" state has to occur before new valid keys are returned. +; RESTORE is not detectable and must be handled by NMI IRQ. +; SHIFT LOCK is not detected due to unreliability. -// History: -// ~~~~~~~~ -// V3.0 - Hacked to pieces by PGS to work as KERNAL keyboard scan routine -// V2.5 - New test tool. -// Added return of error codes. -// Fixed a bug causing Buffer Overflow. -// Fixed a bug in Non Alphanumerical Flags from 2.0. -// V2.1 - Shortened the source by adding .for loops & Updated the header and some comments. -// Added "simultaneous keypress" check. -// V2.0 - Added return of non-Alphanumeric keys into X & Y-Registers. -// Small optimizations here and there. -// V1.1 - Unrolled code to make it faster and optimized other parts of it. -// Removed SHIFT LOCK scanning. -// V1.0 - First Working Version along with test tool. +; History: +; ~~~~~~~~ +; V3.0 - Hacked to pieces by PGS to work as KERNAL keyboard scan routine +; V2.5 - New test tool. +; Added return of error codes. +; Fixed a bug causing Buffer Overflow. +; Fixed a bug in Non Alphanumerical Flags from 2.0. +; V2.1 - Shortened the source by adding .for loops & Updated the header and some comments. +; Added "simultaneous keypress" check. +; V2.0 - Added return of non-Alphanumeric keys into X & Y-Registers. +; Small optimizations here and there. +; V1.1 - Unrolled code to make it faster and optimized other parts of it. +; Removed SHIFT LOCK scanning. +; V1.0 - First Working Version along with test tool. -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ - // Low memory variables + ; Low memory variables - // Reuse RS232 variables, since they should not be used by other things. - // Carefully avoid $A7 which is used by 64NET - .label KeyQuantity = $A8 // 1 byte - .label BufferNew = $A9 // 3 bytes - .label TempZP = $B6 // 1 byte - // These should be initialized in CINT to $FF - .label BufferQuantity = $B4 // 1 byte - .label BufferOld = $293 // 3 bytes - .label Buffer = $297 // 4 bytes + ; Reuse RS232 variables, since they should not be used by other things. + ; Carefully avoid $A7 which is used by 64NET + !addr KeyQuantity = $A8 ; 1 byte + !addr BufferNew = $A9 ; 3 bytes + !addr TempZP = $B6 ; 1 byte + ; These should be initialized in CINT to $FF + !addr BufferQuantity = $B4 ; 1 byte + !addr BufferOld = $293 ; 3 bytes + !addr Buffer = $297 ; 4 bytes - // $250-$258 is the 81st - 88th characters in BASIC input, a carry over from VIC-20 - // and not used on C64, so safe for us to use, probably. - .label ScanResult = $250 // 8 bytes + ; $250-$258 is the 81st - 88th characters in BASIC input, a carry over from VIC-20 + ; and not used on C64, so safe for us to use, probably. + !addr ScanResult = $250 ; 8 bytes - // Operational Variables - .const MaxKeyRollover = 3 + ; Operational Variables + !addr MaxKeyRollover = 3 SCNKEY: lda #$00 sta BufferQuantity - // Decrement key repeat timeout if non-zero + ; Decrement key repeat timeout if non-zero ldx KOUNT beq sk_start dec KOUNT sk_start: - // Call main keyboard scanning routine + ; Call main keyboard scanning routine jsr Main lda BufferQuantity beq no_keys_waiting - // Stuff each key pressed into the keyboard buffer + ; Stuff each key pressed into the keyboard buffer ldy #$00 -!: +@1: lda Buffer,y jsr accept_key iny cpy BufferQuantity - bne !- + bne @1 no_keys_waiting: rts accept_key: - // Work out what is new and needs to be added - // to the input buffer. - // Also update the bucky key status flags etc + ; Work out what is new and needs to be added + ; to the input buffer. + ; Also update the bucky key status flags etc cmp #$ff beq sk_nokey - // Got a key, turn it from matrix position to key value, - // and stuff it in the keyboard buffer + ; Got a key, turn it from matrix position to key value, + ; and stuff it in the keyboard buffer - // Convert matrix position to key code - // XXX - Add offset of $40, $80 or $C0 if shift, CONTROL or C= are held down + ; Convert matrix position to key code + ; XXX - Add offset of $40, $80 or $C0 if shift, CONTROL or C= are held down pha lda SHFLAG and #$7 @@ -128,10 +128,10 @@ accept_key: ora kb_matrix_lookup,x tax lda kb_matrix,x - // But don't insert $00 characters + ; But don't insert $00 characters beq sk_nokey - // Stash key into keyboard buffer + ; Stash key into keyboard buffer ldx NDX cpx XMAX beq sk_nokey @@ -142,8 +142,8 @@ sk_nokey: rts - // //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // // Routine for Scanning a Matrix Row + ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ; ; Routine for Scanning a Matrix Row KeyInRow: ldy #7 @@ -159,18 +159,18 @@ nokey: rts - // //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // // Routine for handling: Key Found + ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ; ; Routine for handling: Key Found KeyFound: stx TempZP dec KeyQuantity bmi OverFlow - // Originally, we resolved the keys. - // Now we just return the matrix position, so that - // we can do C64-style bucky modifications as normal - // was: ldy KeyTable,x + ; Originally, we resolved the keys. + ; Now we just return the matrix position, so that + ; we can do C64-style bucky modifications as normal + ; was: ldy KeyTable,x pha txa @@ -180,15 +180,15 @@ KeyFound: ldx TempZP rts - // //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // // Routine for handling: Overflow + ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ; ; Routine for handling: Overflow OverFlow: - pla // Dirty hack to handle 2 layers of JSR + pla ; Dirty hack to handle 2 layers of JSR pla pla pla - // Don't manipulate last legal buffer as the routine will fix itself once it gets valid input again. + ; Don't manipulate last legal buffer as the routine will fix itself once it gets valid input again. ReturnNoKeys: sec @@ -197,21 +197,21 @@ ReturnNoKeys: lda #$FF sta LSTX ldx #MaxKeyRollover-1 -!: +@2: sta Buffer,x sta BufferOld,x dex - bpl !- + bpl @2 rts - // //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // // Exit Routine for: No Activity + ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ; ; Exit Routine for: No Activity NoActivityDetected: - // So cancel all bucky keys + ; So cancel all bucky keys lda SHFLAG sta LSTSHF lda #$00 @@ -219,22 +219,22 @@ NoActivityDetected: jmp ReturnNoKeys - // //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // // Configure Data Direction Registers + ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ; ; Configure Data Direction Registers Main: - // Begin with no key events + ; Begin with no key events lda #$ff sta BufferNew+0 sta BufferNew+1 sta BufferNew+2 - // //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // // Check for Port Activity + ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ; ; Check for Port Activity ldx #$FF ldy #$00 - sty CIA1_PRA // Connect all Keyboard Rows + sty CIA1_PRA ; Connect all Keyboard Rows cpx CIA1_PRB bne skip0 @@ -242,69 +242,69 @@ Main: JoystickActivity: - // Clear bucky key status + ; Clear bucky key status lda #$00 sta SHFLAG lda CIA1_PRB and #$03 cmp #$01 - bne !+ - // down - ldx #$07 // UP/DOWN + bne @3 + ; down + ldx #$07 ; UP/DOWN jsr KeyFound -!: +@3: cmp #$02 - bne !+ - // Up - // Mark shift as pressed + bne @4 + ; Up + ; Mark shift as pressed ldx #$01 stx SHFLAG - ldx #$07 // UP/DOWN + ldx #$07 ; UP/DOWN jsr KeyFound -!: - // Only allow up/down OR left/right, since - // else we have confusing situation with SHIFT required - // for one, but not the other. - // XXX - We could fix this by making the joystick activity - // feed the key input at a higher level, rather than - // simulating directly pressing the cursor keys. +@4: + ; Only allow up/down OR left/right, since + ; else we have confusing situation with SHIFT required + ; for one, but not the other. + ; XXX - We could fix this by making the joystick activity + ; feed the key input at a higher level, rather than + ; simulating directly pressing the cursor keys. cmp #$03 - beq !+ + beq @5 jmp skdone -!: +@5: lda CIA1_PRB and #$0c cmp #$04 - bne !+ + bne @6 ldx #$02 - jsr KeyFound // LEFT/RIGHT -!: + jsr KeyFound ; LEFT/RIGHT +@6: cmp #$08 - bne !+ + bne @7 ldx #$01 stx SHFLAG ldx #$02 - jsr KeyFound // LEFT/RIGHT -!: + jsr KeyFound ; LEFT/RIGHT +@7: jmp skdone skip0: - // // Set max keys allowed before ignoring result + ; ; Set max keys allowed before ignoring result lda #MaxKeyRollover sta KeyQuantity - // //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // // Check for Control Port #1 Activity + ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ; ; Check for Control Port #1 Activity - stx CIA1_PRA // Disconnect all Keyboard Rows - cpx CIA1_PRB // Only Control Port activity will be detected + stx CIA1_PRA ; Disconnect all Keyboard Rows + cpx CIA1_PRB ; Only Control Port activity will be detected bne JoystickActivity - // //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // // Scan Keyboard Matrix + ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ; ; Scan Keyboard Matrix ldx #7 lda #%11111110 @@ -319,40 +319,40 @@ next_row: dex bpl next_row - // X gets back to $FF here, which is assumed below + ; X gets back to $FF here, which is assumed below - // //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // // Check for Control Port #1 Activity (again) + ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ; ; Check for Control Port #1 Activity (again) - stx CIA1_PRA // Disconnect all Keyboard Rows - cpx CIA1_PRB // Only Control Port activity will be detected - beq !+ + stx CIA1_PRA ; Disconnect all Keyboard Rows + cpx CIA1_PRB ; Only Control Port activity will be detected + beq @8 jmp ReturnNoKeys -!: - // Make X = $00, assumed below +@8: + ; Make X = $00, assumed below inx - // //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // // Check and flag Non Alphanumeric Keys + ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ; ; Check and flag Non Alphanumeric Keys - // Store de-bounce data for bucky keys - // (Compute's Mapping the 64, p58-59) + ; Store de-bounce data for bucky keys + ; (Compute's Mapping the 64, p58-59) lda SHFLAG sta LSTSHF - // Build bucky state + ; Build bucky state lda #$00 sta SHFLAG lda ScanResult+6 eor #%10000000 - and #%10000000 // Left shift + and #%10000000 ; Left shift rol rol and #$01 ora SHFLAG sta SHFLAG - // Right shift + ; Right shift lda ScanResult+1 eor #$10 lsr @@ -363,14 +363,14 @@ next_row: ora SHFLAG sta SHFLAG - // Control + ; Control lda ScanResult+0 eor #$04 and #$04 ora SHFLAG sta SHFLAG - // Vendor key + ; Vendor key lda ScanResult+0 eor #$ff lsr @@ -381,13 +381,13 @@ next_row: ora SHFLAG sta SHFLAG - // Handle SHIFT + VENDOR + ; Handle SHIFT + VENDOR jsr scnkey_toggle_if_needed no_case_toggle: - // //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // // Check for pressed key(s) + ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ; ; Check for pressed key(s) lda ScanResult+7 cmp #$ff @@ -432,15 +432,15 @@ skdone: - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // Key Scan Completed + ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ; Key Scan Completed - // Put any new key (not in old scan) into buffer + ; Put any new key (not in old scan) into buffer ldx #MaxKeyRollover-1 ProcessPressedKeys: - // Check if the currently pressed key is continuing to be held down + ; Check if the currently pressed key is continuing to be held down lda BufferNew,x cmp #$ff beq ConsiderNextKey @@ -453,12 +453,12 @@ ProcessPressedKeys: RecordKeypress: - // New Key Detected + ; New Key Detected ldy BufferQuantity cpy #MaxKeyRollover - bcc !+ - jmp ReturnNoKeys // too many new keys -!: + bcc @9 + jmp ReturnNoKeys ; too many new keys +@9: AcceptKeyEvent: sta Buffer,y iny @@ -468,26 +468,26 @@ ConsiderNextKey: dex bpl ProcessPressedKeys - // Copy new presses to old list + ; Copy new presses to old list ldx #MaxKeyRollover-1 -!: +@10: lda BufferNew,x sta BufferOld,x dex - bpl !- + bpl @10 - // Return success and set of pressed keys + ; Return success and set of pressed keys clc rts KeyHeld: - // The key in A is still held down. - // compare with key in LSTX - // (Compute's Mapping the 64 p36-37) - // if different, reset repeat count down. + ; The key in A is still held down. + ; compare with key in LSTX + ; (Compute's Mapping the 64 p36-37) + ; if different, reset repeat count down. - // Ignore bucky keys, so that repeat can work when a - // bucky is held down. + ; Ignore bucky keys, so that repeat can work when a + ; bucky is held down. cmp #15 beq BuckyHeld cmp #52 @@ -500,7 +500,7 @@ KeyHeld: cmp LSTX beq SameKeyHeld - // Different key held + ; Different key held sta LSTX pha lda DELAY @@ -514,12 +514,12 @@ SameKeyHeld: lda KOUNT bmi KeyCanRepeat bne KeyRepeatWait - // Count down ended, so repeat key now + ; Count down ended, so repeat key now KeyCanRepeat: - // (Compute's Mapping the 64 p58) + ; (Compute's Mapping the 64 p58) pha - lda #6-2 // Fudge factor to match speed + lda #6-2 ; Fudge factor to match speed sta KOUNT pla pla @@ -530,4 +530,4 @@ KeyRepeatWait: jmp ConsiderNextKey -#endif // CONFIG_LEGACY_SCNKEY +} ; CONFIG_LEGACY_SCNKEY diff --git a/src/kernal/keyboard/scnkey_set_keytab.s b/src/kernal/keyboard/scnkey_set_keytab.s index 0b2bf4ed..86aceb29 100644 --- a/src/kernal/keyboard/scnkey_set_keytab.s +++ b/src/kernal/keyboard/scnkey_set_keytab.s @@ -1,109 +1,113 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Well-known Kernal routine, described in: -// -// - [CM64] Computes Mapping the Commodore 64 - pages 220, 221 -// +; +; Well-known Kernal routine, described in: +; +; - [CM64] Computes Mapping the Commodore 64 - pages 220, 221 +; scnkey_set_keytab: -#if CONFIG_LEGACY_SCNKEY // routine not compatible with legacy SCNKEY +!ifdef CONFIG_LEGACY_SCNKEY { ; routine not compatible with legacy SCNKEY rts -#else +} else { - // Set initial KEYTAB value + ; Set initial KEYTAB value lda #kb_matrix sta KEYTAB+1 - // Calculate table index + ; Calculate table index lda SHFLAG - and #$07 // we are only interested in SHIFT / CTRL / VENDOR keys + and #$07 ; we are only interested in SHIFT / CTRL / VENDOR keys tax - // Retrieve table offset + ; Retrieve table offset lda kb_matrix_lookup, x cmp #$FF bne scnkey_valid_offset - // $FF means we should not decode anything, mark this by setting high byte - // of KEYTAB to 0 (I do not think anyone would put keyboard decoding table - // at zeropage) + ; $FF means we should not decode anything, mark this by setting high byte + ; of KEYTAB to 0 (I do not think anyone would put keyboard decoding table + ; at zeropage) lda #$00 - beq !+ // branch always + beq scnkey_valid_offset_cont ; branch always scnkey_valid_offset: - // Add offset to the vector + ; Add offset to the vector clc adc KEYTAB+0 sta KEYTAB+0 lda #$00 adc KEYTAB+1 -!: + + ; FALLTROUGH + +scnkey_valid_offset_cont: + sta KEYTAB+1 - // FALLTROUGH + ; FALLTROUGH -#endif // no CONFIG_LEGACY_SCNKEY +} ; no CONFIG_LEGACY_SCNKEY -scnkey_toggle_if_needed: // entry for SCNKEY (TWW/CTR version) +scnkey_toggle_if_needed: ; entry for SCNKEY (TWW/CTR version) - // Check if we should toggle the character set + ; Check if we should toggle the character set lda MODE - bne !+ // not allowed to toggle + bne @1 ; not allowed to toggle lda SHFLAG and #$03 cmp #$03 - bne !+ // no SHIFT + VENDOR pressed + bne @1 ; no SHIFT + VENDOR pressed lda LSTSHF and #$03 cmp #$03 - beq !+ // already toggled + beq @1 ; already toggled - // Toggle char set + ; Toggle char set -#if ROM_LAYOUT_M65 +!ifdef CONFIG_MB_M65 { jsr M65_MODEGET - bcc !++ + bcc @2 - // Toggling charsets for C64 mode + ; Toggling charsets for C64 mode lda VIC_YMCSB eor #$02 sta VIC_YMCSB -!: +@1: rts - // Toggling charsets for M65 mode -!: + ; Toggling charsets for M65 mode +@2: lda VIC_CHARPTR+1 eor #%00001000 sta VIC_CHARPTR+1 rts -#else +} else { lda VIC_YMCSB eor #$02 sta VIC_YMCSB -!: +@1: rts -#endif +} diff --git a/src/kernal/keyboard/scnkey_via_keylog.s b/src/kernal/keyboard/scnkey_via_keylog.s index d23f27d1..3b141824 100644 --- a/src/kernal/keyboard/scnkey_via_keylog.s +++ b/src/kernal/keyboard/scnkey_via_keylog.s @@ -1,14 +1,13 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// Short helper jump-via-vector routine, to set the keyboard matrix +; Short helper jump-via-vector routine, to set the keyboard matrix -#if !HAS_OPCODES_65CE02 +!ifndef HAS_OPCODES_65CE02 { scnkey_via_keylog: jmp (KEYLOG) - -#endif +} diff --git a/src/kernal/memory/fd15.restor.s b/src/kernal/memory/fd15.restor.s index a4a5b106..34167be5 100644 --- a/src/kernal/memory/fd15.restor.s +++ b/src/kernal/memory/fd15.restor.s @@ -1,27 +1,27 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official Kernal routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - page 293 (RESTOR), 304 (VECTOR) -// - [CM64] Computes Mapping the Commodore 64 - page 237 -// -// CPU registers that has to be preserved (see [RG64]): none -// +; +; Official Kernal routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - page 293 (RESTOR), 304 (VECTOR) +; - [CM64] Computes Mapping the Commodore 64 - page 237 +; +; CPU registers that has to be preserved (see [RG64]): none +; RESTOR: - clc // clear carry - for writing to system table + clc ; clear carry - for writing to system table ldy #>vector_defaults ldx #tiny_nmi_handler @@ -35,7 +35,7 @@ tiny_nmi_handler_routine: rti peek_under_roms_routine: php - // Offset of arg of lda ($00),y + ; Offset of arg of lda ($00),y stx peek_under_roms+pa-peek_under_roms_routine+1 jsr memmap_allram pa: lda ($00),y @@ -45,7 +45,7 @@ pa: lda ($00),y poke_under_roms_routine: php - // Offset of arg of lda ($00),y + ; Offset of arg of lda ($00),y stx poke_under_roms+pb-poke_under_roms_routine+1 jsr memmap_allram pb: sta ($00),y @@ -70,5 +70,4 @@ memmap_allram_routine: __ram_routines_end: - -#endif +} diff --git a/src/kernal/memory/vector_real.s b/src/kernal/memory/vector_real.s index 9440fa34..4cfee796 100644 --- a/src/kernal/memory/vector_real.s +++ b/src/kernal/memory/vector_real.s @@ -1,45 +1,45 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE vector_real: - // Use MEMUSS as temporary storage location - checked on real C64 that this is the - // address originally used; after calling VECTOR and checking zero page - // area afterwards, the address could be found there + ; Use MEMUSS as temporary storage location - checked on real C64 that this is the + ; address originally used; after calling VECTOR and checking zero page + ; area afterwards, the address could be found there - // According to 'Computes Mapping the Commodore 64' page 237, - // the CBM implementation does not disable IRQs - yet, the - // 'C64 Programmers Reference Guide' does not contain such - // warning and does not mention any preparations needed. + ; According to 'Computes Mapping the Commodore 64' page 237, + ; the CBM implementation does not disable IRQs - yet, the + ; 'C64 Programmers Reference Guide' does not contain such + ; warning and does not mention any preparations needed. - // Initial idea was to do php, cli, ..., plp to make the routine safer, - // but it seems it might cause problem with initialization on XEMU emulator - // XXX find out, why + ; Initial idea was to do php, cli, ..., plp to make the routine safer, + ; but it seems it might cause problem with initialization on XEMU emulator + ; XXX find out, why - // Prepare the user data pointer - strange order to reduce risk - // of potential similarity to the original routine + ; Prepare the user data pointer - strange order to reduce risk + ; of potential similarity to the original routine sty MEMUSS + 1 stx MEMUSS + 0 lda #$00 - sta NMINV + 1 // our routine considers this a disabled interrupt + sta NMINV + 1 ; our routine considers this a disabled interrupt - // Select routine variant - store or restore vectors + ; Select routine variant - store or restore vectors ldy #$1F bcc vector_restore lda CINV, y sta (MEMUSS), y - bcs vector_end_loop // branch always + bcs vector_end_loop ; branch always vector_restore: lda (MEMUSS), y sta CINV, y - // FALLTROUGH + ; FALLTROUGH vector_end_loop: dey diff --git a/src/kernal/panic.s b/src/kernal/panic.s index 1dbbf993..0cb5a0bc 100644 --- a/src/kernal/panic.s +++ b/src/kernal/panic.s @@ -1,56 +1,54 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Something terrible happened - show the panic screen -// +; +; Something terrible happened - show the panic screen +; -#if CONFIG_PANIC_SCREEN +!ifdef CONFIG_PANIC_SCREEN { panic: - // Store error code on stack + ; Store error code on stack pha - // Reinitialize the hardware + ; Reinitialize the hardware sei jsr IOINIT -#if ROM_LAYOUT_M65 +!ifdef CONFIG_MB_M65 { - // Make sure we are in legacy mode with normal memory mapping + ; Make sure we are in legacy mode with normal memory mapping jsr map_NORMAL sec - jsr M65_MODESET // switch to legacy C64 compatibility mode + jsr M65_MODESET ; switch to legacy C64 compatibility mode sei -#else +} else { jsr vicii_init - -#endif +} jsr clear_screen - // Disable NMIs + ; Disable NMIs -#if CONFIG_TAPE_HEAD_ALIGN +!ifdef CONFIG_TAPE_HEAD_ALIGN { jsr nmi_lock -#else +} else { lda #$00 - sta NMINV + 1 // our routine does not allow zeropage vectors + sta NMINV + 1 ; our routine does not allow zeropage vectors +} -#endif - - // Display KERNAL PANIC message + ; Display KERNAL PANIC message ldx #$14 ldy #$0E @@ -59,7 +57,7 @@ panic: ldx #__MSG_KERNAL_PANIC jsr print_kernal_message - // Display error code and message (if known) + ; Display error code and message (if known) pla beq kernal_panic_infinite_loop @@ -80,20 +78,20 @@ panic: ldx #__MSG_KERNAL_PANIC_ROM_MISMATCH jsr print_kernal_message - // Display some raster effect in the infinitew loop + ; Display some raster effect in the infinitew loop kernal_panic_infinite_loop: + ldx #$00 stx VIC_EXTCOL -!: +@1: inx - bpl !- + bpl @1 ldx #$06 stx VIC_EXTCOL - nop + +nop - bne kernal_panic_infinite_loop // branch always - -#endif // CONFIG_PANIC_SCREEN + bne kernal_panic_infinite_loop ; branch always +} diff --git a/src/kernal/print/print_hex_byte.s b/src/kernal/print/print_hex_byte.s index 5bcbbd34..ee07b2f3 100644 --- a/src/kernal/print/print_hex_byte.s +++ b/src/kernal/print/print_hex_byte.s @@ -1,16 +1,16 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Print the hex value in .A as two digits -// +; +; Print the hex value in .A as two digits +; print_hex_byte: -#if HAS_BCD_SAFE_INTERRUPTS +!ifdef HAS_BCD_SAFE_INTERRUPTS { - // Idea by Haubitze + ; Idea by Haubitze sed pha @@ -30,7 +30,7 @@ print_hex_byte: cld jmp JCHROUT -#else +} else { pha lsr @@ -39,15 +39,16 @@ print_hex_byte: lsr ora #$30 cmp #$3A - bcc !+ + bcc @1 adc #6 -!: jsr JCHROUT +@1: + jsr JCHROUT pla and #$0f ora #$30 cmp #$3A - bcc !+ + bcc @2 adc #6 -!: jmp JCHROUT - -#endif +@2: + jmp JCHROUT +} diff --git a/src/kernal/print/print_kernal_message.s b/src/kernal/print/print_kernal_message.s index 906ee939..01f15850 100644 --- a/src/kernal/print/print_kernal_message.s +++ b/src/kernal/print/print_kernal_message.s @@ -1,18 +1,19 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Print one of the standard Kernal messages, index in .X -// +; +; Print one of the standard Kernal messages, index in .X +; + +print_kernal_message_loop: -!: jsr JCHROUT inx print_kernal_message: lda __msg_kernal_first, x - bpl !- // 0 marks end of string + bpl print_kernal_message_loop ; 0 marks end of string and #$7F jmp JCHROUT diff --git a/src/kernal/print/print_return.s b/src/kernal/print/print_return.s index f9926e7d..3966a0ec 100644 --- a/src/kernal/print/print_return.s +++ b/src/kernal/print/print_return.s @@ -1,11 +1,11 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Print the carriage return -// +; +; Print the carriage return +; print_return: - lda #$0D // carriage return code + lda #$0D ; carriage return code jmp JCHROUT diff --git a/src/kernal/print/print_space.s b/src/kernal/print/print_space.s index 374873f5..ea601d94 100644 --- a/src/kernal/print/print_space.s +++ b/src/kernal/print/print_space.s @@ -1,11 +1,11 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Print the space character -// +; +; Print the space character +; print_space: - lda #$20 // space code + lda #$20 ; space code jmp JCHROUT diff --git a/src/kernal/print/printf.s b/src/kernal/print/printf.s index 42934867..c134f1b3 100644 --- a/src/kernal/print/printf.s +++ b/src/kernal/print/printf.s @@ -1,23 +1,23 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// printf()-like routine for simplifying debugging +; printf()-like routine for simplifying debugging -// Prints the literal zero-terminated string that follows, -// which may also include special tokens that allow -// printing of hex byte and word values stored at the indicated -// addresses. +; Prints the literal zero-terminated string that follows, +; which may also include special tokens that allow +; printing of hex byte and word values stored at the indicated +; addresses. -// .byte 1,$byte = display byte as hex -// .byte 2,$low,$hi = display word as hex -// .byte $f0+n,$low,$hi = display byte at $hi$lo+n as hex +; .byte 1,$byte = display byte as hex +; .byte 2,$low,$hi = display word as hex +; .byte $f0+n,$low,$hi = display byte at $hi$lo+n as hex -#if CONFIG_DBG_PRINTF +!ifdef CONFIG_DBG_PRINTF { printf: - // Temporary storage is between end of screen at $0400 - // and the sprite pointers at $7f8 + ; Temporary storage is between end of screen at $0400 + ; and the sprite pointers at $7f8 sta $7f0 stx $7f1 sty $7f2 @@ -25,14 +25,14 @@ printf: pla sta $7f3 - // Set up read routine - lda #$ad // LDA $nnnn + ; Set up read routine + lda #$ad ; LDA $nnnn sta $7f4 lda #$60 - sta $7f7 // RTS + sta $7f7 ; RTS - // Get PC of caller from the stack, so that - // we can parse through it + ; Get PC of caller from the stack, so that + ; we can parse through it pla clc adc #$01 @@ -45,8 +45,8 @@ printf_loop: jsr $7f4 cmp #$00 bne printf_continues - // Put return address on stack and restore - // registers + ; Put return address on stack and restore + ; registers lda $7f6 pha lda $7f5 @@ -62,33 +62,33 @@ printf_loop: printf_continues: cmp #$01 bne not_hexbyte - // Print a hex byte + ; Print a hex byte - // Skip the token + ; Skip the token jsr printf_advance - // Read the low byte + ; Read the low byte jsr $7f4 - // Print as hex + ; Print as hex jsr print_hex_byte jmp printf_nextchar not_hexbyte: cmp #$02 bne not_hexword - // Print a hex word + ; Print a hex word - // Skip the token + ; Skip the token jsr printf_advance jsr printf_advance - // Read the high byte + ; Read the high byte jsr $7f4 - // Print as hex + ; Print as hex jsr print_hex_byte - // Skip the token + ; Skip the token jsr printf_retreat - // Read the low byte + ; Read the low byte jsr $7f4 - // Print as hex + ; Print as hex jsr print_hex_byte jsr printf_advance jmp printf_nextchar @@ -97,11 +97,11 @@ not_hexword: cmp #$f0 bcc not_pointer - // Treat two-byte arg as base address - // and lower 4 bits of token as offset from - // that location. + ; Treat two-byte arg as base address + ; and lower 4 bits of token as offset from + ; that location. - // Get offset + ; Get offset and #$0f tay @@ -117,7 +117,7 @@ not_hexword: jmp printf_nextchar not_pointer: - // Print character + ; Print character jsr JCHROUT printf_nextchar: @@ -125,15 +125,15 @@ printf_nextchar: jmp printf_loop printf_advance: - // Advance pointer to next character + ; Advance pointer to next character inc $7f5 - bne !+ + bne @1 inc $7f6 -!: +@1: rts printf_retreat: - // Retreat pointer to previous char + ; Retreat pointer to previous char lda $7f5 sec sbc #1 @@ -142,5 +142,4 @@ printf_retreat: sbc #0 sta $7f6 rts - -#endif // CONFIG_DBG_PRINTF +} diff --git a/src/kernal/rom_revision/ff80.kernal_revision.s b/src/kernal/rom_revision/ff80.kernal_revision.s index 74101501..dff88bb0 100644 --- a/src/kernal/rom_revision/ff80.kernal_revision.s +++ b/src/kernal/rom_revision/ff80.kernal_revision.s @@ -1,67 +1,68 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// This byte (hex $FF80, dec 65408) identifies Kernal revision on several machines. Although not all -// of the, used it for versioning purpose, here is the list of all the values I could find. Sources: -// - [CM64] Computes Mapping the Commodore 64 (page 242/243) -// - [MM] Marko Mäkelä article, http://www.zimmers.net/anonftp/pub/cbm/firmware/computers/c64/revisions.txt -// - [VICE] Checked with ROMs included in VICE emulator -// - [XEMU] Checked with ROMs retrieved by XEMU emulator -// -// IDEA: put here a value, that is different from any version currently known, as -// a warning that this is not a Commodore Kernal or anything already known. -// -// C64 - values from the official ROMs: -// - $00 - [CM64] then current number [MM] 901227-02 [VICE] C64 Revision 2 -// - $03 - [CM64] (not mentionned) [MM] 901227-02, 901227-03 [VICE] C64 Revision 3 -// - $43 - [CM64] (not mentionned) [MM] 251104-04 [VICE] SX-64 -// - $64 - [CM64] PET64 ROM [MM] (not mentionned) [VICE] PET64 -// - $AA - [CM64] first version of ROM [MM] 901227-01 [VICE] C64 Revision 1 -// -// C64 - values from unofficial 3rd party ROMs: -// - $00 - Turbo Trans, Turbo Access, Turbo Process -// - $03 - SuperCPU ROM 1.40, 2.04, also unofficial 0.7 ROM from [VICE], -// DolphinDOS 2.0, JiffyDOS 6.01, EXOS V3/4, -// Datel Mercury V3 US, Datel DOS-ROM V1.2, Datel Turbo ROM II V3.2+, -// Turbo Process US, -// burst CIA 1/2 Kernal by Albert, SD2IEC Kernal 1.0/2.0/2.1/2.2 by Claus -// - $4A - S-JiffyDOS -// - $53 - Professional DOS V1, SpeedDOS Plus 2.7 -// - $C3 - Cockroach Turbo ROM V1 -// -// PET: -// - $40 - [VICE] PET 2001-8N -// - $A7 - [VICE] PET 30XX -// - $AA - [VICE] PET 40XX, PET 80XX, SuperPET -// -// CBM II: -// - $E0 - [VICE] 5x0, 6x0, 7x0 models -// -// VIC-20: -// - $16 - [VICE] all models, also VIC-20 JiffyDOS PAL/NTSC -// -// 264 family: -// - $01 - [VICE] 364 -// - $05 - [VICE] C16, C116, Plus/4 -// - $06 - (unofficial) JiffyDOS NTSC -// - $81 - [VICE] 232 -// - $86 - (unofficial) JiffyDOS PAL -// -// C128: -// - $01 - see https://www.pagetable.com/?p=1058 -// - $02 - unreleased updated ROM, see https://www.pagetable.com/?p=1058 -// -// Commodore prototypes: -// - $04 - [XEMU] 64 mode ROM of the C65 prototype, ROM 910111 -// - $FF - [XEMU] C65 native mode, ROM 910111 -// - $FF - [XEMU] Commodore LCD -// -// Non-Commodore machines: -// - $FF - Commander X16 (emulator r28) -// +; +; This byte (hex $FF80, dec 65408) identifies Kernal revision on several machines. Although not all +; of the, used it for versioning purpose, here is the list of all the values I could find. Sources: +; - [CM64] Computes Mapping the Commodore 64 (page 242/243) +; - [MM] Marko Mäkelä article, http://www.zimmers.net/anonftp/pub/cbm/firmware/computers/c64/revisions.txt +; - [VICE] Checked with ROMs included in VICE emulator +; - [XEMU] Checked with ROMs retrieved by XEMU emulator +; +; IDEA: put here a value, that is different from any version currently known, as +; a warning that this is not a Commodore Kernal or anything already known. +; +; C64 - values from the official ROMs: +; - $00 - [CM64] then current number [MM] 901227-02 [VICE] C64 Revision 2 +; - $03 - [CM64] (not mentionned) [MM] 901227-02, 901227-03 [VICE] C64 Revision 3 +; - $43 - [CM64] (not mentionned) [MM] 251104-04 [VICE] SX-64 +; - $64 - [CM64] PET64 ROM [MM] (not mentionned) [VICE] PET64 +; - $AA - [CM64] first version of ROM [MM] 901227-01 [VICE] C64 Revision 1 +; +; C64 - values from unofficial 3rd party ROMs: +; - $00 - Turbo Trans, Turbo Access, Turbo Process +; - $03 - SuperCPU ROM 1.40, 2.04, also unofficial 0.7 ROM from [VICE], +; DolphinDOS 2.0, JiffyDOS 6.01, EXOS V3/4, +; Datel Mercury V3 US, Datel DOS-ROM V1.2, Datel Turbo ROM II V3.2+, +; Turbo Process US, +; burst CIA 1/2 Kernal by Albert, SD2IEC Kernal 1.0/2.0/2.1/2.2 by Claus +; - $4A - S-JiffyDOS +; - $53 - Professional DOS V1, SpeedDOS Plus 2.7 +; - $C3 - Cockroach Turbo ROM V1 +; +; PET: +; - $40 - [VICE] PET 2001-8N +; - $A7 - [VICE] PET 30XX +; - $AA - [VICE] PET 40XX, PET 80XX, SuperPET +; +; CBM II: +; - $E0 - [VICE] 5x0, 6x0, 7x0 models +; +; VIC-20: +; - $16 - [VICE] all models, also VIC-20 JiffyDOS PAL/NTSC +; +; 264 family: +; - $01 - [VICE] 364 +; - $05 - [VICE] C16, C116, Plus/4 +; - $06 - (unofficial) JiffyDOS NTSC +; - $81 - [VICE] 232 +; - $86 - (unofficial) JiffyDOS PAL +; +; C128: +; - $01 - see https://www.pagetable.com/?p=1058 +; - $02 - unreleased updated ROM, see https://www.pagetable.com/?p=1058 +; +; Commodore prototypes: +; - $04 - [XEMU] 64 mode ROM of the C65 prototype, ROM 910111 +; - $FF - [XEMU] C65 native mode, ROM 910111 +; - $FF - [XEMU] Commodore LCD +; +; Non-Commodore machines: +; - $FF - Commander X16 (emulator r28) +; kernal_revision: - .byte $F0 // chosen not to conflict with anything known so far + + !byte $F0 ; chosen not to conflict with anything known so far diff --git a/src/kernal/rs232/chkin_rs232_up2400.s b/src/kernal/rs232/chkin_rs232_up2400.s index ea8edff1..dc031040 100644 --- a/src/kernal/rs232/chkin_rs232_up2400.s +++ b/src/kernal/rs232/chkin_rs232_up2400.s @@ -1,17 +1,17 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// RS-232 part of the CHKIN routine -// +; +; RS-232 part of the CHKIN routine +; -#if CONFIG_RS232_UP2400 +!ifdef CONFIG_RS232_UP2400 { chkin_rs232: - STUB_IMPLEMENTATION() // XXX provide implementation for both UP2400 and UP9600 + +STUB_IMPLEMENTATION ; XXX provide implementation for both UP2400 and UP9600 -#endif // CONFIG_RS232_UP2400 +} ; CONFIG_RS232_UP2400 diff --git a/src/kernal/rs232/chkin_rs232_up9600.s b/src/kernal/rs232/chkin_rs232_up9600.s index c1ffd6cb..3bb4b141 100644 --- a/src/kernal/rs232/chkin_rs232_up9600.s +++ b/src/kernal/rs232/chkin_rs232_up9600.s @@ -1,51 +1,51 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// RS-232 part of the CHKIN routine -// +; +; RS-232 part of the CHKIN routine +; -// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations +; Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations -#if CONFIG_RS232_UP9600 +!ifdef CONFIG_RS232_UP9600 { -// XXX get rid of the ENABLE/DISABLE mechanism +; XXX get rid of the ENABLE/DISABLE mechanism chkin_rs232: pha lda XXX_UPFLAG - bne !+ + bne @1 pla - jmp $F20E // XXX + jmp $F20E ; XXX -!: +@1: pla - jsr $F30F // XXX - beq !+ - jmp $F701 // XXX + jsr $F30F ; XXX + beq @2 + jmp $F701 ; XXX -!: - jsr $F31F // XXX +@2: + jsr $F31F ; XXX lda FA cmp #$02 - beq !+ + beq @3 cmp #$04 bcc chkin_rs232_nochkin jsr XXX_DISABLE jmp chkin_rs232_nochkin -!: +@3: sta $99 jsr XXX_ENABLE clc rts -chkin_rs232_nochkin - jmp $F219 // XXX +chkin_rs232_nochkin: + jmp $F219 ; XXX -#endif // CONFIG_RS232_UP9600 +} ; CONFIG_RS232_UP9600 diff --git a/src/kernal/rs232/chrin_rs232_up2400.s b/src/kernal/rs232/chrin_rs232_up2400.s index d11f6ca2..11c27bed 100644 --- a/src/kernal/rs232/chrin_rs232_up2400.s +++ b/src/kernal/rs232/chrin_rs232_up2400.s @@ -1,17 +1,17 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// RS-232 part of the CHRIN routine -// +; +; RS-232 part of the CHRIN routine +; -#if CONFIG_RS232_UP2400 +!ifdef CONFIG_RS232_UP2400 { chrin_rs232: - STUB_IMPLEMENTATION() // XXX provide implementation for both UP2400 and UP9600 + +STUB_IMPLEMENTATION ; XXX provide implementation for both UP2400 and UP9600 -#endif // CONFIG_RS232_UP2400 +} ; CONFIG_RS232_UP2400 diff --git a/src/kernal/rs232/chrin_rs232_up9600.s b/src/kernal/rs232/chrin_rs232_up9600.s index 8ada792c..93563fa3 100644 --- a/src/kernal/rs232/chrin_rs232_up9600.s +++ b/src/kernal/rs232/chrin_rs232_up9600.s @@ -1,46 +1,46 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// RS-232 part of the CHRIN routine -// +; +; RS-232 part of the CHRIN routine +; -// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations +; Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations -#if CONFIG_RS232_UP9600 +!ifdef CONFIG_RS232_UP9600 { chrin_rs232: - phy_trash_a - phx_trash_a + +phy_trash_a + +phx_trash_a lda #$00 sta XXX_SAVBYTE sta RSSTAT jsr up9600_rsin - bcc !+ - plx_trash_a - ply_trash_a + bcc @1 + +plx_trash_a + +ply_trash_a - lda #$08 // XXX don't we have some routine for this? + lda #$08 ; XXX don't we have some routine for this? sta RSSTAT lda #$00 clc rts -!: +@1: sta XXX_SAVBYTE XXX_DOGET4: - plx_trash_a - ply_trash_a + +plx_trash_a + +ply_trash_a lda XXX_SAVBYTE clc rts -#endif // CONFIG_RS232_UP9600 +} ; CONFIG_RS232_UP9600 diff --git a/src/kernal/rs232/chrout_rs232.s b/src/kernal/rs232/chrout_rs232.s index 4ed361cf..0ed2b03c 100644 --- a/src/kernal/rs232/chrout_rs232.s +++ b/src/kernal/rs232/chrout_rs232.s @@ -1,17 +1,17 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// RS-232 part of the CHROUT routine -// +; +; RS-232 part of the CHROUT routine +; -#if HAS_RS232 +!ifdef HAS_RS232 { chrout_rs232: - STUB_IMPLEMENTATION() // XXX provide implementation for both UP2400 and UP9600 + +STUB_IMPLEMENTATION ; XXX provide implementation for both UP2400 and UP9600 -#endif // HAS_RS232 +} ; HAS_RS232 diff --git a/src/kernal/rs232/ckout_rs232_up2400.s b/src/kernal/rs232/ckout_rs232_up2400.s index 40d1c374..058991c5 100644 --- a/src/kernal/rs232/ckout_rs232_up2400.s +++ b/src/kernal/rs232/ckout_rs232_up2400.s @@ -1,17 +1,17 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// RS-232 part of the CKOUT routine -// +; +; RS-232 part of the CKOUT routine +; -#if CONFIG_RS232_UP2400 +!ifdef CONFIG_RS232_UP2400 { ckout_rs232: - STUB_IMPLEMENTATION() // XXX provide implementation for both UP2400 and UP9600 + +STUB_IMPLEMENTATION ; XXX provide implementation for both UP2400 and UP9600 -#endif // CONFIG_RS232_UP2400 +} ; CONFIG_RS232_UP2400 diff --git a/src/kernal/rs232/ckout_rs232_up9600.s b/src/kernal/rs232/ckout_rs232_up9600.s index 3e36affb..2592996d 100644 --- a/src/kernal/rs232/ckout_rs232_up9600.s +++ b/src/kernal/rs232/ckout_rs232_up9600.s @@ -1,20 +1,20 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// RS-232 part of the CKOUT routine -// +; +; RS-232 part of the CKOUT routine +; -// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations +; Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations -#if CONFIG_RS232_UP9600 +!ifdef CONFIG_RS232_UP9600 { ckout_rs232: - // XXX adapt this + ; XXX adapt this lda #$02 sta DFLTO @@ -23,4 +23,4 @@ ckout_rs232: rts -#endif // CONFIG_RS232_UP9600 +} ; CONFIG_RS232_UP9600 diff --git a/src/kernal/rs232/close_rs232.s b/src/kernal/rs232/close_rs232.s index 7a254c8d..e57066cc 100644 --- a/src/kernal/rs232/close_rs232.s +++ b/src/kernal/rs232/close_rs232.s @@ -1,35 +1,35 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// RS-232 part of the CLOSE routine -// +; +; RS-232 part of the CLOSE routine +; -#if HAS_RS232 +!ifdef HAS_RS232 { -#if CONFIG_MEMORY_MODEL_60K - .error "CONFIG_MEMORY_MODEL_60K is not compatible with RS-232 memory allocation code" -#endif +!ifdef CONFIG_MEMORY_MODEL_60K { + !error "CONFIG_MEMORY_MODEL_60K is not compatible with RS-232 memory allocation code" +} close_rs232: - // First check how many RS-232 channels are currently allocated. - // If more than one, skip deallocation (other channels still uses the buffer). + ; First check how many RS-232 channels are currently allocated. + ; If more than one, skip deallocation (other channels still uses the buffer). jsr rs232_count_channels - cpx #$02 // set Carry if more than one is open + cpx #$02 ; set Carry if more than one is open bcs close_rs232_end - // Deallocate buffer + ; Deallocate buffer inc MEMSIZK+1 inc MEMSIZK+1 - // XXX is this needed? check with original ROM what it actually does + ; XXX is this needed? check with original ROM what it actually does lda #$00 sta ROBUF+0 @@ -37,9 +37,11 @@ close_rs232: sta RIBUF+0 sta RIBUF+1 + ; FALLTROUGH + close_rs232_end: jmp close_remove_from_table -#endif // HAS_RS232 +} ; HAS_RS232 diff --git a/src/kernal/rs232/getin_rs232.s b/src/kernal/rs232/getin_rs232.s index c1b01556..6c838231 100644 --- a/src/kernal/rs232/getin_rs232.s +++ b/src/kernal/rs232/getin_rs232.s @@ -1,17 +1,16 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// RS-232 part of the GETIN routine -// +; +; RS-232 part of the GETIN routine +; -#if HAS_RS232 +!ifdef HAS_RS232 { getin_rs232: - STUB_IMPLEMENTATION() // XXX provide implementation for both UP2400 and UP9600 - -#endif // HAS_RS232 + STUB_IMPLEMENTATION+ ; XXX provide implementation for both UP2400 and UP9600 +} diff --git a/src/kernal/rs232/open_rs232.s b/src/kernal/rs232/open_rs232.s index 06c08e65..3b410ccb 100644 --- a/src/kernal/rs232/open_rs232.s +++ b/src/kernal/rs232/open_rs232.s @@ -1,31 +1,31 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// RS-232 part of the OPEN routine -// +; +; RS-232 part of the OPEN routine +; -#if HAS_RS232 +!ifdef HAS_RS232 { -#if CONFIG_MEMORY_MODEL_60K - .error "CONFIG_MEMORY_MODEL_60K is not compatible with RS-232 memory allocation code" -#endif +!ifdef CONFIG_MEMORY_MODEL_60K { + !error "CONFIG_MEMORY_MODEL_60K is not compatible with RS-232 memory allocation code" +} open_rs232: - // First check how many RS-232 channels are currently allocated. - // If more than one, skip allocation (already allocated). + ; First check how many RS-232 channels are currently allocated. + ; If more than one, skip allocation (already allocated). jsr rs232_count_channels - cpx #$02 // set Carry if more than one is open + cpx #$02 ; set Carry if more than one is open bcs open_rs232_end - // Allocate buffers - first RIBUF, afterwards ROBUF - // (checked addresses on original ROMs) + ; Allocate buffers - first RIBUF, afterwards ROBUF + ; (checked addresses on original ROMs) lda MEMSIZK+0 sta ROBUF+0 @@ -39,7 +39,7 @@ open_rs232: lda MEMSIZK+1 sta ROBUF+1 - // Initialize buffer indexes + ; Initialize buffer indexes lda #$00 sta RIDBE @@ -48,16 +48,13 @@ open_rs232: sta RODBE -#if CONFIG_RS232_UP9600 +!ifdef CONFIG_RS232_UP9600 { jmp up9600_enable - -#endif // CONFIG_RS232_UP9600 - +} open_rs232_end: jmp open_done_success +} - -#endif // HAS_RS232 diff --git a/src/kernal/rs232/rs232_count_channels.s b/src/kernal/rs232/rs232_count_channels.s index c4f17976..9f7b6d3d 100644 --- a/src/kernal/rs232/rs232_count_channels.s +++ b/src/kernal/rs232/rs232_count_channels.s @@ -1,29 +1,28 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Sets .X to number of open RS-232 channels -// +; +; Sets .X to number of open RS-232 channels +; -#if HAS_RS232 +!ifdef HAS_RS232 { rs232_count_channels: ldx #$00 ldy LDTND -!: +@1: dey - bmi !+ + bmi @2 lda FAT, y cmp #$02 - bne !- + bne @1 inx - bpl !- // branch always -!: + bpl @1 ; branch always +@2: rts +} - -#endif diff --git a/src/kernal/rs232/up9600_disable.s b/src/kernal/rs232/up9600_disable.s index 44d6691f..87463876 100644 --- a/src/kernal/rs232/up9600_disable.s +++ b/src/kernal/rs232/up9600_disable.s @@ -1,32 +1,32 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Disable UP9600 interface -// +; +; Disable UP9600 interface +; -// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations +; Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations -#if CONFIG_RS232_UP9600 +!ifdef CONFIG_RS232_UP9600 { -up9600_disable: // XXX adapt +up9600_disable: ; XXX adapt - // XXX restore interrupt vectors and IRQ timer + ; XXX restore interrupt vectors and IRQ timer sei - lda CIA2_PRB // $DD01; DISABLE RTS + lda CIA2_PRB ; $DD01; DISABLE RTS and #$FD - sta CIA2_PRB // $DD01 + sta CIA2_PRB ; $DD01 lda #$7F - sta CIA2_ICR // $DD0D ; DISABLE ALL CIA INTERRUPTS - sta CIA1_ICR // $DC0D + sta CIA2_ICR ; $DD0D ; DISABLE ALL CIA INTERRUPTS + sta CIA1_ICR ; $DC0D lda #$41; QUICK (AND DIRTY) HACK TO SWITCH BACK - sta CIA1_TIMAHI // $DC05 ; TO THE DEFAULT CIA1 CONFIGURATION + sta CIA1_TIMAHI ; $DC05 ; TO THE DEFAULT CIA1 CONFIGURATION lda #$81 - sta CIA1_ICR // $DC0D ; ENABLE TIMER1 (THIS IS DEFAULT) + sta CIA1_ICR ; $DC0D ; ENABLE TIMER1 (THIS IS DEFAULT) lda #ORIGIRQ @@ -41,6 +41,4 @@ up9600_disable: // XXX adapt pla tax pla - - -#endif // CONFIG_RS232_UP9600 +} diff --git a/src/kernal/rs232/up9600_enable.s b/src/kernal/rs232/up9600_enable.s index 2f9be6db..ce451f7f 100644 --- a/src/kernal/rs232/up9600_enable.s +++ b/src/kernal/rs232/up9600_enable.s @@ -1,23 +1,22 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Enable UP9600 interface support -// +; +; Enable UP9600 interface support +; -// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations +; Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations -#if CONFIG_RS232_UP9600 +!ifdef CONFIG_RS232_UP9600 { -up9600_enable: // XXX adapt +up9600_enable: ; XXX adapt sei - lda IRQVECT cmp #NMIBYTRY sta NMIVECT+1 -NMIDOBI2 +NMIDOBI2: pla; IGNORE, IF NMI WAS TRIGGERED BY RESTORE-KEY rti - ; -NMIBYTRY +NMIBYTRY: pha - bit CIA2_ICR // $DD0D; CHECK BIT 7 (SDR FULL PRINT) + bit CIA2_ICR ; $DD0D; CHECK BIT 7 (SDR FULL PRINT) bpl NMIDOBI2; SDR NOT FULL, THEN SKIP (EG. RESTORE-KEY) lda #$92 - sta CIA2_CRB // $DD0F; STOP TIMER B (KEEP SIGNALLING AT PB7!) - sta CIA2_ICR // $DD0D; ENABLE FLAG (AND TIMER) INTERRUPTS + sta CIA2_CRB ; $DD0F; STOP TIMER B (KEEP SIGNALLING AT PB7!) + sta CIA2_ICR ; $DD0D; ENABLE FLAG (AND TIMER) INTERRUPTS lda #NMIDOBIT sta NMIVECT+1 - phx_trash_a - phy_trash_a - lda CIA2_SDR // $DD0C; READ SDR (BIT0=DATABIT7,...,BIT7=DATABIT0) + +phx_trash_a + +phy_trash_a + lda CIA2_SDR ; $DD0C; READ SDR (BIT0=DATABIT7,...,BIT7=DATABIT0) cmp #128; MOVE BIT7 INTO CARRY-FLAG and #127 tax @@ -57,13 +56,12 @@ NMIBYTRY sbc RIDBS cmp #200 bcc NMIBYTR2 - lda CIA2_PRB // $DD01;; MORE THAN 200 BYTES IN THE RECEIVE BUFFER + lda CIA2_PRB ; $DD01;; MORE THAN 200 BYTES IN THE RECEIVE BUFFER and #$FD;; THEN DISABLE RTS - sta CIA2_PRB // $DD01 -NMIBYTR2 - ply_trash_a - plx_trash_a + sta CIA2_PRB ; $DD01 +NMIBYTR2: + +ply_trash_a + +plx_trash_a pla rti - -#endif // CONFIG_RS232_UP9600 +} diff --git a/src/kernal/rs232/up9600_rsin.s b/src/kernal/rs232/up9600_rsin.s index 67cb5f93..40767446 100644 --- a/src/kernal/rs232/up9600_rsin.s +++ b/src/kernal/rs232/up9600_rsin.s @@ -1,46 +1,44 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Get byte from serial interface -// +; +; Get byte from serial interface +; -// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations +; Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations -#if CONFIG_RS232_UP9600 +!ifdef CONFIG_RS232_UP9600 { up9600_rsin: ldy RIDBS cpy RIDBE - beq up9600_rsin_end; // skip (empty buffer, return with carry set) + beq up9600_rsin_end; ; skip (empty buffer, return with carry set) lda (RIBUF),Y iny sty RIDBS - pha // begin buffer emptying chk + pha ; begin buffer emptying chk tya sec sbc RIDBE - cmp #206 // 256-50 - bcc !+ + cmp #206 ; 256-50 + bcc @1 lda #$02 - ora CIA2_PR // $DD01 - sta CIA2_PR // enable RTS + ora CIA2_PR ; $DD01 + sta CIA2_PR ; enable RTS clc - // FALLTROUGH - -!: + ; FALLTROUGH +@1: pla - // FALLTROUGH + ; FALLTROUGH up9600_rsin_end: rts - -#endif // CONFIG_RS232_UP9600 +} diff --git a/src/kernal/rs232/up9600_rsout.s b/src/kernal/rs232/up9600_rsout.s index 0efed7f4..c1921252 100644 --- a/src/kernal/rs232/up9600_rsout.s +++ b/src/kernal/rs232/up9600_rsout.s @@ -1,25 +1,25 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Put byte to serial interface -// +; +; Put byte to serial interface +; -// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations +; Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations -#if CONFIG_RS232_UP9600 +!ifdef CONFIG_RS232_UP9600 { up9600_rsout: pha - sta $9E // XXX synchronize with aliases + sta $9E ; XXX synchronize with aliases cmp #$80 and #$7F - stx $A8 // XXX synchronize with aliases - sty $A7 // XXX synchronize with aliases + stx $A8 ; XXX synchronize with aliases + sty $A7 ; XXX synchronize with aliases tax jsr up9600_rsout_time @@ -27,15 +27,15 @@ up9600_rsout: adc #$00 lsr sei - sta CIA1_SDR // $DC0C + sta CIA1_SDR ; $DC0C lda #$02 - STA XXX_OUTSTAT + sta XXX_OUTSTAT ror ora #$7F - sta CIA1_SDR // $DC0C + sta CIA1_SDR ; $DC0C cli - ldx $A8 // XXX synchronize with aliases - ldy $A7 // XXX synchronize with aliases + ldx $A8 ; XXX synchronize with aliases + ldy $A7 ; XXX synchronize with aliases pla rts @@ -43,17 +43,15 @@ up9600_rsout_time: cli lda #$FD - sta TIME+2 // XXX check if this is the lowest byte + sta TIME+2 ; XXX check if this is the lowest byte rs232_rsout_wait: lda XXX_OUTSTAT - beq !+ + beq @1 bit TIME+2 bmi up9600_rsout_wait +@1: + jmp $F490 ; XXX +} -!: - jmp $F490 // XXX - - -#endif // CONFIG_RS232_UP9600 diff --git a/src/kernal/screen/chrin_keyboard.s b/src/kernal/screen/chrin_keyboard.s index 5cfe67e2..6fc937c9 100644 --- a/src/kernal/screen/chrin_keyboard.s +++ b/src/kernal/screen/chrin_keyboard.s @@ -1,54 +1,53 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Keyboard part of the CHRIN routine -// +; +; Keyboard part of the CHRIN routine +; chrin_keyboard: -#if ROM_LAYOUT_M65 +!ifdef CONFIG_MB_M65 { jsr M65_MODEGET - bcc_16 m65_chrin_keyboard + +bcc m65_chrin_keyboard +} -#endif - - // Preserve .X and .Y registers + ; Preserve .X and .Y registers stx XSAV - phy_trash_a + +phy_trash_a - // FALLTROUGH + ; FALLTROUGH chrin_keyboard_repeat: - // Do we have a line of input we are currently returning? - // If so, return the next byte, and clear the flag when we reach the end. + ; Do we have a line of input we are currently returning? + ; If so, return the next byte, and clear the flag when we reach the end. lda CRSW beq chrin_keyboard_read - // We have input waiting at (LSXP)+CRSW - // When CRSW = INDX, then we return a carriage return and clear the flag + ; We have input waiting at (LSXP)+CRSW + ; When CRSW = INDX, then we return a carriage return and clear the flag cmp INDX bne chrin_keyboard_not_end_of_input - // Clear pending input and quote flags + ; Clear pending input and quote flags lda #$00 sta CRSW sta QTSW - // FALLTROUGH + ; FALLTROUGH chrin_keyboard_empty_line: - // For an empty line, just return the carriage return + ; For an empty line, just return the carriage return - ply_trash_a + +ply_trash_a ldx XSAV clc lda #$0D @@ -56,19 +55,19 @@ chrin_keyboard_empty_line: chrin_keyboard_not_end_of_input: - // Advance index, return the next byte + ; Advance index, return the next byte inc CRSW tay - // FALLTROUGH + ; FALLTROUGH chrin_keyboard_return_byte: lda (LSXP),y jsr screen_check_toggle_quote tax - ply_trash_a + +ply_trash_a txa ldx XSAV jsr screen_code_to_petscii @@ -79,7 +78,7 @@ chrin_keyboard_read: jsr cursor_enable - // Wait for a key + ; Wait for a key lda NDX beq chrin_keyboard_repeat @@ -87,7 +86,7 @@ chrin_keyboard_read: cmp #$0D bne chrkn_keyboard_not_enter - // FALLTROUGH + ; FALLTROUGH chrin_keyboard_enter: @@ -95,38 +94,38 @@ chrin_keyboard_enter: jsr pop_keyboard_buffer jsr cursor_hide_if_visible - // It was enter. Note that we have a line of input to return, and return the first byte - // after computing and storing its length (Computes Mapping the 64, p96) + ; It was enter. Note that we have a line of input to return, and return the first byte + ; after computing and storing its length (Computes Mapping the 64, p96) - // Set pointer to line of input + ; Set pointer to line of input lda PNT+0 sta LSXP+0 lda PNT+1 sta LSXP+1 - // If the current line is a continuation of the previous one, decrease LSXP by 40 + ; If the current line is a continuation of the previous one, decrease LSXP by 40 ldy TBLX lda LDTB1, y - bmi chrin_enter_calc_length // branch if not continuation + bmi chrin_enter_calc_length ; branch if not continuation lda LSXP+0 sec sbc #40 sta LSXP+0 - bcs !+ + bcs @1 dec LSXP+1 -!: +@1: ldy #80 - bne chrin_enter_loop // branch always + bne chrin_enter_loop ; branch always chrin_enter_calc_length: - // Get the logical line length + ; Get the logical line length jsr screen_get_logical_line_end_ptr iny chrin_enter_loop: - // Skip spaces at the end of line + ; Skip spaces at the end of line dey bmi chrin_keyboard_empty_line lda (LSXP),y @@ -135,29 +134,28 @@ chrin_enter_loop: iny sty INDX - // Set mark informing that we are returning a line + ; Set mark informing that we are returning a line ldy #$01 sty CRSW - // Clear quote mode mark - dey // set .Y to 0 + ; Clear quote mode mark + dey ; set .Y to 0 sty QTSW - // Return first char of line - beq chrin_keyboard_return_byte // branch always + ; Return first char of line + beq chrin_keyboard_return_byte ; branch always chrkn_keyboard_not_enter: lda KEYD -#if CONFIG_PROGRAMMABLE_KEYS +!ifdef CONFIG_PROGRAMMABLE_KEYS { jsr chrin_programmable_keys bcc chrin_keyboard_enter +} -#endif // CONFIG_PROGRAMMABLE_KEYS - - // Print character, keep looking for input from keyboard until carriage return + ; Print character, keep looking for input from keyboard until carriage return jsr CHROUT jsr pop_keyboard_buffer jmp chrin_keyboard_repeat diff --git a/src/kernal/screen/chrin_programmable_keys.s b/src/kernal/screen/chrin_programmable_keys.s index c785543a..8f79d65a 100644 --- a/src/kernal/screen/chrin_programmable_keys.s +++ b/src/kernal/screen/chrin_programmable_keys.s @@ -1,46 +1,46 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Keyboard part of the CHRIN routine - programmable keys support -// Output: if Carry clear, programmable key was handled -// +; +; Keyboard part of the CHRIN routine - programmable keys support +; Output: if Carry clear, programmable key was handled +; -#if CONFIG_PROGRAMMABLE_KEYS +!ifdef CONFIG_PROGRAMMABLE_KEYS { chrin_programmable_keys: - // Check if the key is programmable + ; Check if the key is programmable ldx #(__programmable_keys_codes_end - programmable_keys_codes - 1) -!: +@1: cmp programmable_keys_codes, x - beq !+ + beq @2 dex - bpl !- + bpl @1 - // This is not a programmable key + ; This is not a programmable key sec rts -!: - // .X contains index of the key code, we need offset to key string instead +@2: + ; .X contains index of the key code, we need offset to key string instead lda programmable_keys_offsets, x tax - // Print all the characters assigned to key -!: + ; Print all the characters assigned to key +@3: lda programmable_keys_strings, x - beq !+ - jsr CHROUT // our implementation preserves .X too + beq @4 + jsr CHROUT ; our implementation preserves .X too inx - bne !- // jumps always -!: + bne @3 ; jumps always +@4: clc rts -#endif // CONFIG_PROGRAMMABLE_KEYS +} ; CONFIG_PROGRAMMABLE_KEYS diff --git a/src/kernal/screen/chrout_screen.s b/src/kernal/screen/chrout_screen.s index 153425d9..8aae371a 100644 --- a/src/kernal/screen/chrout_screen.s +++ b/src/kernal/screen/chrout_screen.s @@ -1,92 +1,91 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// CHROUT routine - screen support (character output) -// +; +; CHROUT routine - screen support (character output) +; chrout_screen: -#if ROM_LAYOUT_M65 +!ifdef CONFIG_MB_M65 { jsr M65_MODEGET - bcc_16 m65_chrout_screen - -#endif + +bcc m65_chrout_screen +} jsr cursor_hide_if_visible lda SCHAR tax - // All the PETSCII control codes are within $0x, $1x, $8x, $9x, remaining - // ones are always printable characters; separate away control codes + ; All the PETSCII control codes are within $0x, $1x, $8x, $9x, remaining + ; ones are always printable characters; separate away control codes and #$60 - beq_16 chrout_screen_control + +beq chrout_screen_control txa - // Literals - first convert PETSCII to screen code + ; Literals - first convert PETSCII to screen code jsr chrout_to_screen_code - // FALLTROUGH + ; FALLTROUGH -chrout_screen_literal: // entry point for chrout_screen_quote +chrout_screen_literal: ; entry point for chrout_screen_quote - // Write normal character on the screen + ; Write normal character on the screen - tax // store screen code, we need .A for calculations + tax ; store screen code, we need .A for calculations - // First we need offset from PNT in .Y, we can take it from PNTR + ; First we need offset from PNT in .Y, we can take it from PNTR jsr screen_get_clipped_PNTR - // Put the character on the screen + ; Put the character on the screen txa - ora RVS // Computes Mapping the 64, page 38 + ora RVS ; Computes Mapping the 64, page 38 sta (PNT),y - // Decrement number of chars waiting to be inserted + ; Decrement number of chars waiting to be inserted lda INSRT - beq !+ + beq @1 dec INSRT -!: - // Toggle quote flag if required +@1: + ; Toggle quote flag if required txa jsr screen_check_toggle_quote - // Set colour of the newly printed character + ; Set colour of the newly printed character lda COLOR sta (USER),y - // Advance the column + ; Advance the column ldy PNTR iny sty PNTR - // Scroll down (extend logical line) if needed + ; Scroll down (extend logical line) if needed cpy #40 - bne !+ + bne @2 jsr screen_grow_logical_line inc TBLX ldy PNTR -!: - // If not the 80th character of the logical row, we are done +@2: + ; If not the 80th character of the logical row, we are done cpy #80 bcc chrout_screen_calc_lptr_done - // Advance to the next line + ; Advance to the next line jmp screen_advance_to_next_line @@ -94,7 +93,7 @@ chrout_screen_calc_lptr_done: jsr screen_calculate_pointers - // FALLTROUGH + ; FALLTROUGH chrout_screen_done: diff --git a/src/kernal/screen/chrout_screen_clr.s b/src/kernal/screen/chrout_screen_clr.s index e2860ce5..21c15f7a 100644 --- a/src/kernal/screen/chrout_screen_clr.s +++ b/src/kernal/screen/chrout_screen_clr.s @@ -1,11 +1,11 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// CLR key handling within CHROUT -// +; +; CLR key handling within CHROUT +; chrout_screen_CLR: diff --git a/src/kernal/screen/chrout_screen_control.s b/src/kernal/screen/chrout_screen_control.s index 8100db55..10355eb2 100644 --- a/src/kernal/screen/chrout_screen_control.s +++ b/src/kernal/screen/chrout_screen_control.s @@ -1,11 +1,11 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// CHROUT routine - screen support, control codes -// +; +; CHROUT routine - screen support, control codes +; chrout_screen_control: @@ -20,37 +20,37 @@ chrout_try_jumptable_loop: cpx #(__chrout_screen_jumptable_quote_guard - chrout_screen_jumptable_codes - 1) bne chrout_try_jumptable_loop_noquote - // Is this insert/quote mode? + ; Is this insert/quote mode? tay lda QTSW ora INSRT - beq !+ + beq @1 tya jmp chrout_screen_quote -!: +@1: tya - // FALLTROUGH + ; FALLTROUGH chrout_try_jumptable_loop_noquote: cmp chrout_screen_jumptable_codes, x - bne !+ + bne @2 - // Found, perform a jump to subroutine -#if !HAS_OPCODES_65C02 + ; Found, perform a jump to subroutine +!ifndef HAS_OPCODES_65C02 { lda chrout_screen_jumptable_hi, x pha lda chrout_screen_jumptable_lo, x pha rts -#else +} else { txa asl tax jmp (chrout_screen_jumptable, x) -#endif -!: +} +@2: dex bpl chrout_try_jumptable_loop @@ -61,12 +61,12 @@ chrout_try_COLOR: chrout_try_color_loop: cmp colour_codes,x - bne !+ + bne @3 stx COLOR jmp chrout_screen_done -!: +@3: dex bpl chrout_try_color_loop - // Unknown code, or key not requiring any handling + ; Unknown code, or key not requiring any handling jmp chrout_screen_done diff --git a/src/kernal/screen/chrout_screen_crsr.s b/src/kernal/screen/chrout_screen_crsr.s index 819c8a9a..b9ae5308 100644 --- a/src/kernal/screen/chrout_screen_crsr.s +++ b/src/kernal/screen/chrout_screen_crsr.s @@ -1,11 +1,11 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Cursor keys handling within CHROUT -// +; +; Cursor keys handling within CHROUT +; chrout_screen_CRSR_UP: @@ -14,7 +14,7 @@ chrout_screen_CRSR_UP: beq chrout_screen_CRSR_done dec TBLX - // FALLTROUGH + ; FALLTROUGH chrout_screen_CRSR_done: @@ -25,9 +25,9 @@ chrout_screen_CRSR_DOWN: lda TBLX cmp #24 - bne !+ + bne @1 jsr screen_scroll_up -!: +@1: inc TBLX jmp chrout_screen_calc_lptr_done @@ -36,19 +36,23 @@ chrout_screen_CRSR_RIGHT: jsr screen_get_clipped_PNTR cpy #39 - beq_16 screen_advance_to_next_line + +beq screen_advance_to_next_line iny -!: + + ; FALLTROUGH + +chrout_screen_CRSR_LR_end: + sty PNTR - bpl chrout_screen_CRSR_done // branch always + bpl chrout_screen_CRSR_done ; branch always chrout_screen_CRSR_LEFT: jsr screen_get_clipped_PNTR dey - bpl !- + bpl chrout_screen_CRSR_LR_end lda TBLX beq chrout_screen_CRSR_done @@ -56,4 +60,4 @@ chrout_screen_CRSR_LEFT: dec TBLX lda #39 sta PNTR - bne chrout_screen_CRSR_done // branch always + bne chrout_screen_CRSR_done ; branch always diff --git a/src/kernal/screen/chrout_screen_del.s b/src/kernal/screen/chrout_screen_del.s index 807e4b79..0ca97edf 100644 --- a/src/kernal/screen/chrout_screen_del.s +++ b/src/kernal/screen/chrout_screen_del.s @@ -1,79 +1,79 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// CHROUT routine - screen support, DEL key handling -// +; +; CHROUT routine - screen support, DEL key handling +; chrout_screen_DEL: - // In insert mode it embeds control character + ; In insert mode it embeds control character ldx INSRT - beq !+ + beq @1 lda #KEY_DEL jmp chrout_screen_quote -!: +@1: ldy PNTR beq chrout_screen_del_column_0 cpy #40 bne chrout_screen_del_column_normal - // FALLTROUGH + ; FALLTROUGH chrout_screen_del_column_40: - // First column of the extended line - decrement USER/PNT for copying + ; First column of the extended line - decrement USER/PNT for copying -#if HAS_OPCODES_65CE02 +!ifdef HAS_OPCODES_65CE02 { dew USER dew PNT -#else +} else { lda USER+0 - bne !+ + bne @2 dec USER+1 dec PNT+1 -!: +@2: dec USER+0 dec PNT+0 -#endif +} - // Copy characters + ; Copy characters ldx #39 ldy #0 jsr chrout_screen_del_copy_loop - // Finish by moving the cursor left + ; Finish by moving the cursor left jmp chrout_screen_CRSR_LEFT chrout_screen_del_column_normal: - // We need to scroll back the rest of the logical line + ; We need to scroll back the rest of the logical line - // First reduce PNTR to 0-39 range + ; First reduce PNTR to 0-39 range jsr screen_get_clipped_PNTR sty PNTR - // Now get the offset to the last logical line character + ; Now get the offset to the last logical line character jsr screen_get_logical_line_end_ptr tya - // Substract the PNTR value, this will tell us how many characters we need to move + ; Substract the PNTR value, this will tell us how many characters we need to move sec sbc PNTR tax - // Perform the character copy (scroll back) in a loop + ; Perform the character copy (scroll back) in a loop ldy PNTR dey jsr chrout_screen_del_copy_loop dec PNTR - // FALLTROUGH + ; FALLTROUGH chrout_screen_del_done: @@ -94,7 +94,7 @@ chrout_screen_del_copy_loop: dex bpl chrout_screen_del_copy_loop - // Clear char at end of line (just the character - not color!) + ; Clear char at end of line (just the character - not color!) lda #$20 sta (PNT),y @@ -103,20 +103,20 @@ chrout_screen_del_copy_loop: chrout_screen_del_column_0: ldy TBLX - beq chrout_screen_del_done // delete from row 0, col 0 does nothing + beq chrout_screen_del_done ; delete from row 0, col 0 does nothing - // Move cursor to end of previous line + ; Move cursor to end of previous line dec TBLX lda #39 sta PNTR - // Update PNT and USER pointers + ; Update PNT and USER pointers jsr screen_calculate_PNT_USER - // Put space character at the current cursor position (do not clear the color!) + ; Put space character at the current cursor position (do not clear the color!) ldy #39 lda #$20 sta (PNT),y - // Finish with recalculating all the variables + ; Finish with recalculating all the variables bne chrout_screen_del_done diff --git a/src/kernal/screen/chrout_screen_gfxtxt.s b/src/kernal/screen/chrout_screen_gfxtxt.s index 04d73c04..37cfbf4e 100644 --- a/src/kernal/screen/chrout_screen_gfxtxt.s +++ b/src/kernal/screen/chrout_screen_gfxtxt.s @@ -1,23 +1,27 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// GFX/TXT mode switch handling within CHROUT -// +; +; GFX/TXT mode switch handling within CHROUT +; chrout_screen_GFX: lda VIC_YMCSB - and #$02 // to upper case -!: + and #$02 ; to upper case + + ; FALLTROUGH + +chrout_screen_GFX_TXT_end: + sta VIC_YMCSB jmp chrout_screen_done chrout_screen_TXT: lda VIC_YMCSB - ora #$02 // to lower case - bne !- // branch always + ora #$02 ; to lower case + bne chrout_screen_GFX_TXT_end ; branch always diff --git a/src/kernal/screen/chrout_screen_home.s b/src/kernal/screen/chrout_screen_home.s index 353429f4..bd2a6712 100644 --- a/src/kernal/screen/chrout_screen_home.s +++ b/src/kernal/screen/chrout_screen_home.s @@ -1,11 +1,11 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// HOME key handling within CHROUT -// +; +; HOME key handling within CHROUT +; chrout_screen_HOME: diff --git a/src/kernal/screen/chrout_screen_ins.s b/src/kernal/screen/chrout_screen_ins.s index 0e3eed38..96c5ba4d 100644 --- a/src/kernal/screen/chrout_screen_ins.s +++ b/src/kernal/screen/chrout_screen_ins.s @@ -1,82 +1,82 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// CHROUT routine - screen support, INS key handling -// +; +; CHROUT routine - screen support, INS key handling +; chrout_screen_INS: - // First check if last character of the logical line is space + ; First check if last character of the logical line is space jsr screen_check_space_ends_line beq chrout_screen_ins_possible - // Not space, we cannot insert anything + ; Not space, we cannot insert anything - bne_16 chrout_screen_done + +bne chrout_screen_done chrout_screen_ins_possible: - // Move chars towards end of the line + ; Move chars towards end of the line jsr screen_get_logical_line_end_ptr - // Special handling for cursor in second line + ; Special handling for cursor in second line ldx TBLX lda LDTB1+0, x bpl chrout_screen_ins_second_line - // Perform character copy + ; Perform character copy jsr chrout_screen_ins_copy_loop - // Put space in the inserted gap + ; Put space in the inserted gap lda #$20 sta (PNT), y - // If line does not end with space now, try to grow the logical line + ; If line does not end with space now, try to grow the logical line jsr screen_check_space_ends_line beq chrout_screen_ins_done jsr screen_grow_logical_line - // FALLTROUGH + ; FALLTROUGH chrout_screen_ins_done: - // End of processing + ; End of processing jmp chrout_screen_calc_lptr_done chrout_screen_ins_second_line: - // Adapt PNTR for copying + ; Adapt PNTR for copying lda PNTR sec sbc #40 sta PNTR - // Perform character copy + ; Perform character copy jsr chrout_screen_ins_copy_loop - // Put space in the inserted gap + ; Put space in the inserted gap lda #$20 sta (PNT), y - // End of processing - bne chrout_screen_ins_done // branch always + ; End of processing + bne chrout_screen_ins_done ; branch always chrout_screen_ins_copy_loop: - // Note: While the following routine is obvious to any skilled - // in the art as the most obvious simple and efficient solution, - // if the screen writes are before the colour writes, it results - // in a relatively long verbatim stretch of bytes when compared to - // the C64 KERNAL. Thus we have swapped the order, just to reduce - // the potential for any argument of copyright infringement, even - // though we really do not believe that the routine can be copyrighted - // due to the lack of creativity. + ; Note: While the following routine is obvious to any skilled + ; in the art as the most obvious simple and efficient solution, + ; if the screen writes are before the colour writes, it results + ; in a relatively long verbatim stretch of bytes when compared to + ; the C64 KERNAL. Thus we have swapped the order, just to reduce + ; the potential for any argument of copyright infringement, even + ; though we really do not believe that the routine can be copyrighted + ; due to the lack of creativity. dey lda (USER),y iny @@ -90,8 +90,8 @@ chrout_screen_ins_copy_loop: cpy PNTR bne chrout_screen_ins_copy_loop - // Increase insert mode count (which causes quote-mode like behaviour) + ; Increase insert mode count (which causes quote-mode like behaviour) inc INSRT - // Return from loop + ; Return from loop rts diff --git a/src/kernal/screen/chrout_screen_jumptable_codes.s b/src/kernal/screen/chrout_screen_jumptable_codes.s index 4299d42a..1777deba 100644 --- a/src/kernal/screen/chrout_screen_jumptable_codes.s +++ b/src/kernal/screen/chrout_screen_jumptable_codes.s @@ -1,91 +1,124 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Jumptable for screen control codes support. To improve performance, should be sorted -// starting from the least probable routine. -// +; +; Jumptable for screen control codes support. To improve performance, should be sorted +; starting from the least probable routine. +; chrout_screen_jumptable_codes: - .byte KEY_CLR - .byte KEY_HOME - .byte KEY_C64_SHIFT_OFF - .byte KEY_C64_SHIFT_ON - .byte KEY_TXT - .byte KEY_GFX - .byte KEY_RVS_OFF - .byte KEY_RVS_ON - .byte KEY_CRSR_RIGHT - .byte KEY_CRSR_LEFT - .byte KEY_CRSR_DOWN - .byte KEY_CRSR_UP - .byte KEY_INS + !byte KEY_CLR + !byte KEY_HOME + !byte KEY_C64_SHIFT_OFF + !byte KEY_C64_SHIFT_ON + !byte KEY_TXT + !byte KEY_GFX + !byte KEY_RVS_OFF + !byte KEY_RVS_ON + !byte KEY_CRSR_RIGHT + !byte KEY_CRSR_LEFT + !byte KEY_CRSR_DOWN + !byte KEY_CRSR_UP + !byte KEY_INS __chrout_screen_jumptable_quote_guard: -#if CONFIG_EDIT_STOPQUOTE - .byte KEY_STOP -#endif -#if CONFIG_EDIT_TABULATORS - .byte KEY_C64_TAB_BW - .byte KEY_C64_TAB_FW -#endif - .byte KEY_DEL - .byte KEY_RETURN +!ifdef CONFIG_EDIT_STOPQUOTE { + !byte KEY_STOP +} +!ifdef CONFIG_EDIT_TABULATORS { + !byte KEY_C64_TAB_BW + !byte KEY_C64_TAB_FW +} + !byte KEY_DEL + !byte KEY_RETURN __chrout_screen_jumptable_codes_end: -.const chrout_list = List().add( - - chrout_screen_CLR, - chrout_screen_HOME, - chrout_screen_SHIFT_OFF, - chrout_screen_SHIFT_ON, - chrout_screen_TXT, - chrout_screen_GFX, - chrout_screen_RVS_OFF, - chrout_screen_RVS_ON, - chrout_screen_CRSR_RIGHT, - chrout_screen_CRSR_LEFT, - chrout_screen_CRSR_DOWN, - chrout_screen_CRSR_UP, - chrout_screen_INS, -#if CONFIG_EDIT_STOPQUOTE - chrout_screen_STOP, -#endif -#if CONFIG_EDIT_TABULATORS - chrout_screen_TAB_BW, - chrout_screen_TAB_FW, -#endif - chrout_screen_DEL, - chrout_screen_RETURN -) - - -#if !HAS_OPCODES_65C02 - +!ifndef HAS_OPCODES_65C02 { chrout_screen_jumptable_lo: - put_jumptable_lo(chrout_list) - + !byte <(chrout_screen_CLR-1) + !byte <(chrout_screen_HOME-1) + !byte <(chrout_screen_SHIFT_OFF-1) + !byte <(chrout_screen_SHIFT_ON-1) + !byte <(chrout_screen_TXT-1) + !byte <(chrout_screen_GFX-1) + !byte <(chrout_screen_RVS_OFF-1) + !byte <(chrout_screen_RVS_ON-1) + !byte <(chrout_screen_CRSR_RIGHT-1) + !byte <(chrout_screen_CRSR_LEFT-1) + !byte <(chrout_screen_CRSR_DOWN-1) + !byte <(chrout_screen_CRSR_UP-1) + !byte <(chrout_screen_INS-1) +!ifdef CONFIG_EDIT_STOPQUOTE { + !byte <(chrout_screen_STOP-1) +} +!ifdef CONFIG_EDIT_TABULATORS { + !byte <(chrout_screen_TAB_BW-1) + !byte <(chrout_screen_TAB_FW-1) +} + !byte <(chrout_screen_DEL-1) + !byte <(chrout_screen_RETURN-1) chrout_screen_jumptable_hi: - put_jumptable_hi(chrout_list) + !byte >(chrout_screen_CLR-1) + !byte >(chrout_screen_HOME-1) + !byte >(chrout_screen_SHIFT_OFF-1) + !byte >(chrout_screen_SHIFT_ON-1) + !byte >(chrout_screen_TXT-1) + !byte >(chrout_screen_GFX-1) + !byte >(chrout_screen_RVS_OFF-1) + !byte >(chrout_screen_RVS_ON-1) + !byte >(chrout_screen_CRSR_RIGHT-1) + !byte >(chrout_screen_CRSR_LEFT-1) + !byte >(chrout_screen_CRSR_DOWN-1) + !byte >(chrout_screen_CRSR_UP-1) + !byte >(chrout_screen_INS-1) +!ifdef CONFIG_EDIT_STOPQUOTE { + !byte >(chrout_screen_STOP-1) +} +!ifdef CONFIG_EDIT_TABULATORS { + !byte >(chrout_screen_TAB_BW-1) + !byte >(chrout_screen_TAB_FW-1) +} + !byte >(chrout_screen_DEL-1) + !byte >(chrout_screen_RETURN-1) - -#else // HAS_OPCODES_65C02 +} else { ; HAS_OPCODES_65C02 chrout_screen_jumptable: - // Note: 65C02 has the page boundary vector bug fixed! - put_jumptable(chrout_list) + ; Note: 65C02 has the page boundary vector bug fixed! -#endif + !word chrout_screen_CLR + !word chrout_screen_HOME + !word chrout_screen_SHIFT_OFF + !word chrout_screen_SHIFT_ON + !word chrout_screen_TXT + !word chrout_screen_GFX + !word chrout_screen_RVS_OFF + !word chrout_screen_RVS_ON + !word chrout_screen_CRSR_RIGHT + !word chrout_screen_CRSR_LEFT + !word chrout_screen_CRSR_DOWN + !word chrout_screen_CRSR_UP + !word chrout_screen_INS +!ifdef CONFIG_EDIT_STOPQUOTE { + !word chrout_screen_STOP +} +!ifdef CONFIG_EDIT_TABULATORS { + !word chrout_screen_TAB_BW + !word chrout_screen_TAB_FW +} + !word chrout_screen_DEL + !word chrout_screen_RETURN +} diff --git a/src/kernal/screen/chrout_screen_quote.s b/src/kernal/screen/chrout_screen_quote.s index 245450ab..084c639d 100644 --- a/src/kernal/screen/chrout_screen_quote.s +++ b/src/kernal/screen/chrout_screen_quote.s @@ -1,24 +1,24 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// CHROUT routine - screen support, control codes in quote mode -// +; +; CHROUT routine - screen support, control codes in quote mode +; chrout_screen_quote: - // Low control codes are just +$80 + ; Low control codes are just +$80 clc adc #$80 - // If it overflowed, then it is a high control code, - // so we need to make it be $80 + $40 + char - // as we will have flipped back to just $00 + char, we should - // now add $c0 if C is set from overflow - bcc !+ - adc #$BF // C=1, so adding $BF + C = add $C0 -!: + ; If it overflowed, then it is a high control code, + ; so we need to make it be $80 + $40 + char + ; as we will have flipped back to just $00 + char, we should + ; now add $c0 if C is set from overflow + bcc @1 + adc #$BF ; C=1, so adding $BF + C = add $C0 +@1: jmp chrout_screen_literal diff --git a/src/kernal/screen/chrout_screen_return.s b/src/kernal/screen/chrout_screen_return.s index 93a28a19..ec9b2c57 100644 --- a/src/kernal/screen/chrout_screen_return.s +++ b/src/kernal/screen/chrout_screen_return.s @@ -1,33 +1,33 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// RETURN key handling within CHROUT -// +; +; RETURN key handling within CHROUT +; chrout_screen_RETURN: - // RETURN clears quote and insert modes, it also clears reverse flag + ; RETURN clears quote and insert modes, it also clears reverse flag lda #$00 sta QTSW sta INSRT sta RVS - // RETURN key moves cursor two lines down in case - // of first line of the extended logical line + ; RETURN key moves cursor two lines down in case + ; of first line of the extended logical line ldy TBLX cpy #24 - beq !+ // last line on screen - no need for a double line skip + beq @1 ; last line on screen - no need for a double line skip lda LDTB1+1, y - bmi !+ // current line is not continued + bmi @1 ; current line is not continued inc TBLX jsr screen_calculate_PNT_USER -!: +@1: jmp screen_advance_to_next_line diff --git a/src/kernal/screen/chrout_screen_rvs.s b/src/kernal/screen/chrout_screen_rvs.s index 5703cacc..fed019ec 100644 --- a/src/kernal/screen/chrout_screen_rvs.s +++ b/src/kernal/screen/chrout_screen_rvs.s @@ -1,19 +1,19 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// RVS ON/OFF handling within CHROUT -// +; +; RVS ON/OFF handling within CHROUT +; chrout_screen_RVS_ON: lda #$80 - skip_2_bytes_trash_nvz + +skip_2_bytes_trash_nvz - // FALLTROUGH + ; FALLTROUGH chrout_screen_RVS_OFF: diff --git a/src/kernal/screen/chrout_screen_shift_onoff.s b/src/kernal/screen/chrout_screen_shift_onoff.s index 0058e836..0104f812 100644 --- a/src/kernal/screen/chrout_screen_shift_onoff.s +++ b/src/kernal/screen/chrout_screen_shift_onoff.s @@ -1,23 +1,23 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// SHIFT ON/OFF handling within CHROUT -// +; +; SHIFT ON/OFF handling within CHROUT +; chrout_screen_SHIFT_ON: - lda #$00 // enable SHIFT+VENDOR combination - skip_2_bytes_trash_nvz + lda #$00 ; enable SHIFT+VENDOR combination + +skip_2_bytes_trash_nvz - // FALLTROUGH + ; FALLTROUGH chrout_screen_SHIFT_OFF: - lda #$80 // disable SHIFT+VENDOR combination + lda #$80 ; disable SHIFT+VENDOR combination sta MODE jmp chrout_screen_done diff --git a/src/kernal/screen/chrout_screen_stop.s b/src/kernal/screen/chrout_screen_stop.s index d44654f6..243db941 100644 --- a/src/kernal/screen/chrout_screen_stop.s +++ b/src/kernal/screen/chrout_screen_stop.s @@ -1,14 +1,14 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// STOP key handling within CHROUT -// +; +; STOP key handling within CHROUT +; -#if CONFIG_EDIT_STOPQUOTE +!ifdef CONFIG_EDIT_STOPQUOTE { chrout_screen_STOP: @@ -17,6 +17,4 @@ chrout_screen_STOP: sta QTSW sta INSRT jmp chrout_screen_done - - -#endif +} diff --git a/src/kernal/screen/chrout_screen_tab.s b/src/kernal/screen/chrout_screen_tab.s index 6ca12662..390350de 100644 --- a/src/kernal/screen/chrout_screen_tab.s +++ b/src/kernal/screen/chrout_screen_tab.s @@ -1,14 +1,14 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tabulation keys handling within CHROUT -// +; +; Tabulation keys handling within CHROUT +; -#if CONFIG_EDIT_TABULATORS +!ifdef CONFIG_EDIT_TABULATORS { chrout_screen_TAB_FW: @@ -19,9 +19,9 @@ chrout_screen_TAB_FW: tay iny cpy #40 - bcc !+ + bcc @1 ldy #39 -!: +@1: sty PNTR jmp chrout_screen_calc_lptr_done @@ -30,14 +30,13 @@ chrout_screen_TAB_FW: chrout_screen_TAB_BW: jsr screen_get_clipped_PNTR - beq !+ // column 0, recalculating pointers is not necessary, but this is a rare case nevertheless + beq @2 ; column 0, recalculating pointers is not necessary, but this is a rare case nevertheless dey tya and #%11111000 sta PNTR -!: +@2: jmp chrout_screen_calc_lptr_done - -#endif // CONFIG_EDIT_TABULATORS +} ; CONFIG_EDIT_TABULATORS diff --git a/src/kernal/screen/chrout_to_screen_code.s b/src/kernal/screen/chrout_to_screen_code.s index 207c512d..f328829a 100644 --- a/src/kernal/screen/chrout_to_screen_code.s +++ b/src/kernal/screen/chrout_to_screen_code.s @@ -1,44 +1,48 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// CHROUT routine - convert PETSCII to screen code -// +; +; CHROUT routine - convert PETSCII to screen code +; chrout_to_screen_code: - // Codes $C0-$DF become $40-$5F + ; Codes $C0-$DF become $40-$5F cmp #$E0 - bcs !+ + bcs @1 cmp #$C0 - bcc !+ + bcc @1 and #$7F - rts // not high char -!: - // Range $20-$3F is unchanged + rts ; not high char +@1: + ; Range $20-$3F is unchanged cmp #$40 - bcc !+ // not high char + bcc @done ; not high char - // Unshifted letters and symbols from $40-$5F - // all end up being -$40 - // (C64 PRG p376) + ; Unshifted letters and symbols from $40-$5F + ; all end up being -$40 + ; (C64 PRG p376) - // But anything >= $80 needs to be -$40 - // (C64 PRG p380-381) - // And bit 7 should be cleared, only to be - // set by reverse video + ; But anything >= $80 needs to be -$40 + ; (C64 PRG p380-381) + ; And bit 7 should be cleared, only to be + ; set by reverse video sec sbc #$40 - // Fix shifted chars by adding $20 again + ; Fix shifted chars by adding $20 again cmp #$20 - bcc !+ // not high char + bcc @done ; not high char cmp #$40 - bcs !+ // not high char + bcs @done ; not high char clc adc #$20 -!: + + ; FALLTROUGH + +@done: + rts diff --git a/src/kernal/screen/cursor.s b/src/kernal/screen/cursor.s index 4058778b..3e19d327 100644 --- a/src/kernal/screen/cursor.s +++ b/src/kernal/screen/cursor.s @@ -1,36 +1,36 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Variables used: -// - BLNSW (cursor blink switch) -// - BLNCT (cursor blink countdown) -// - GDBLN (cursor saved character) -// - BLNON (if cursor is visible) -// - GDCOL (colour under cursor) -// - USER (current screen line colour pointer) -// - PNT (current screen line pointer) -// - PNTR (current screen x position) -// +; +; Variables used: +; - BLNSW (cursor blink switch) +; - BLNCT (cursor blink countdown) +; - GDBLN (cursor saved character) +; - BLNON (if cursor is visible) +; - GDCOL (colour under cursor) +; - USER (current screen line colour pointer) +; - PNT (current screen line pointer) +; - PNTR (current screen x position) +; cursor_blink: - // Is the cursor enabled? + ; Is the cursor enabled? lda BLNSW bne cursor_blink_end - // Do we need to redraw things? + ; Do we need to redraw things? dec BLNCT bpl cursor_blink_end - // Check if cursor was visible or not, and toggle + ; Check if cursor was visible or not, and toggle lda BLNON bne cursor_undraw - // FALLTROUGH + ; FALLTROUGH cursor_draw: @@ -39,7 +39,7 @@ cursor_draw: sta GDBLN eor #$80 sta (PNT),y - // Also set cursor colour + ; Also set cursor colour lda (USER),y sta GDCOL lda COLOR @@ -48,29 +48,29 @@ cursor_draw: lda #1 sta BLNON - bne cursor_timer_reset // branches always + bne cursor_timer_reset ; branches always -// XXX code below is probably not 100% safe +; XXX code below is probably not 100% safe cursor_disable: lda #$80 sta BLNSW - // FALLTHROUGH + ; FALLTHROUGH cursor_hide_if_visible: - // Set countdown to high value, to prevent IRQ interference + ; Set countdown to high value, to prevent IRQ interference lda #$FF sta BLNCT - // If cursor is not visible, not much to do + ; If cursor is not visible, not much to do lda BLNON beq cursor_timer_reset - // FALLTROUGH + ; FALLTROUGH cursor_undraw: @@ -80,23 +80,23 @@ cursor_undraw: lda GDCOL sta (USER),y - // FALLTROUGH + ; FALLTROUGH -cursor_undraw_cont: // entry point used by MEGA65 screen editor +cursor_undraw_cont: ; entry point used by MEGA65 screen editor - // Mark cursor as not drawn + ; Mark cursor as not drawn lda #0 sta BLNON - // FALLTROUGH + ; FALLTROUGH cursor_timer_reset: - // Rest blink counter (Mapping the 64, p39-40) + ; Rest blink counter (Mapping the 64, p39-40) lda #20 sta BLNCT - // FALLTROUGH + ; FALLTROUGH cursor_blink_end: diff --git a/src/kernal/screen/cursor_enable.s b/src/kernal/screen/cursor_enable.s index 2208768b..88c22c21 100644 --- a/src/kernal/screen/cursor_enable.s +++ b/src/kernal/screen/cursor_enable.s @@ -1,12 +1,12 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Variables used: -// - BLNSW (cursor blink switch) -// +; +; Variables used: +; - BLNSW (cursor blink switch) +; cursor_enable: diff --git a/src/kernal/screen/cursor_show.s b/src/kernal/screen/cursor_show.s index 585ce97e..98a3c139 100644 --- a/src/kernal/screen/cursor_show.s +++ b/src/kernal/screen/cursor_show.s @@ -1,28 +1,28 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Variables used: -// - BLNSW (cursor blink switch) -// - BLNON (if cursor is visible) -// - BLNCT (cursor blink countdown) -// +; +; Variables used: +; - BLNSW (cursor blink switch) +; - BLNON (if cursor is visible) +; - BLNCT (cursor blink countdown) +; cursor_show_if_enabled: lda BLNSW - bne !+ + bne cursor_show_done lda BLNON - bne !+ + bne cursor_show_done - // FALLTROUGH + ; FALLTROUGH cursor_show: - // Set the cursor so that it is going to be repainted by the next IRQ + ; Set the cursor so that it is going to be repainted by the next IRQ lda #$01 sta BLNCT @@ -30,5 +30,8 @@ cursor_show: lda #$00 sta BLNON -!: + ; FALLTROUGH + +cursor_show_done: + rts diff --git a/src/kernal/screen/e544.clear_screen.s b/src/kernal/screen/e544.clear_screen.s index a153885e..e5ed73fe 100644 --- a/src/kernal/screen/e544.clear_screen.s +++ b/src/kernal/screen/e544.clear_screen.s @@ -1,42 +1,41 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Clear screen and initialise line link table, described in: -// -// - [CM64] Computes Mapping the Commodore 64 - pages 215-216 -// +; +; Clear screen and initialise line link table, described in: +; +; - [CM64] Computes Mapping the Commodore 64 - pages 215-216 +; clear_screen: -#if ROM_LAYOUT_M65 +!ifdef CONFIG_MB_M65 { jsr M65_MODEGET - bcc_16 M65_CLRSCR + +bcc M65_CLRSCR +} -#endif - - // Clear the line link table - cheecked on original ROMs, - // the highest bit set means that the line is NOT a logical - // continuation of the previous one + ; Clear the line link table - cheecked on original ROMs, + ; the highest bit set means that the line is NOT a logical + ; continuation of the previous one lda #$80 ldy #24 -!: +@1: sta LDTB1,y dey - bpl !- + bpl @1 - // Clear all the rows + ; Clear all the rows ldx #24 -!: +@2: jsr screen_clear_line dex - bpl !- + bpl @2 - // Fall to cursor home routine + ; Fall to cursor home routine jmp cursor_home diff --git a/src/kernal/screen/e566.cursor_home.s b/src/kernal/screen/e566.cursor_home.s index 782f5189..2b08ef7b 100644 --- a/src/kernal/screen/e566.cursor_home.s +++ b/src/kernal/screen/e566.cursor_home.s @@ -1,19 +1,19 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Home the cursor, described in: -// -// - [CM64] Computes Mapping the Commodore 64 - page 216 -// +; +; Home the cursor, described in: +; +; - [CM64] Computes Mapping the Commodore 64 - page 216 +; cursor_home: lda #$00 - sta PNTR // current column (logical) - sta TBLX // current row + sta PNTR ; current column (logical) + sta TBLX ; current row - // FALLTROUGH to the next routine + ; FALLTROUGH to the next routine diff --git a/src/kernal/screen/e56c.screen_calculate_pointers.s b/src/kernal/screen/e56c.screen_calculate_pointers.s index 3c30b0b4..2103d1fc 100644 --- a/src/kernal/screen/e56c.screen_calculate_pointers.s +++ b/src/kernal/screen/e56c.screen_calculate_pointers.s @@ -1,26 +1,25 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Set pointer (PNT) to current screen line , described in: -// -// - [CM64] Computes Mapping the Commodore 64 - page 216 -// - http://sta.c64.org/cbm64scrfunc.html -// +; +; Set pointer (PNT) to current screen line , described in: +; +; - [CM64] Computes Mapping the Commodore 64 - page 216 +; - http://sta.c64.org/cbm64scrfunc.html +; -// XXX find out what the original ROM really recalculate +; XXX find out what the original ROM really recalculate screen_calculate_pointers: -#if ROM_LAYOUT_M65 +!ifdef CONFIG_MB_M65 { jsr M65_MODEGET - bcc_16 m65_screen_upd_txtrow_off - -#endif + +bcc m65_screen_upd_txtrow_off +} jsr screen_calculate_PNT_USER jmp screen_calculate_PNTR_LNMX diff --git a/src/kernal/screen/e8ea.screen_scroll_up.s b/src/kernal/screen/e8ea.screen_scroll_up.s index be3ab67d..73d1f5a7 100644 --- a/src/kernal/screen/e8ea.screen_scroll_up.s +++ b/src/kernal/screen/e8ea.screen_scroll_up.s @@ -1,66 +1,64 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Scroll the whole screen up by 1 logical line, described in: -// -// - [CM64] Computes Mapping the Commodore 64 - page 218 -// +; +; Scroll the whole screen up by 1 logical line, described in: +; +; - [CM64] Computes Mapping the Commodore 64 - page 218 +; screen_scroll_up: - // First handle CTRL and NO_SCRL keys + ; First handle CTRL and NO_SCRL keys -#if CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65 +!ifdef CONFIG_KEYBOARD_C128_OR_C65 { - // Do not scroll if NO_SCRL is pressed and interrupts are enabled -!: + ; Do not scroll if NO_SCRL is pressed and interrupts are enabled +@1: php pla and #%00000010 - bne !+ // branch if IRQs disabled, we cannot detect NO_SCRL status + bne @2 ; branch if IRQs disabled, we cannot detect NO_SCRL status lda SHFLAG and #KEY_FLAG_NO_SCRL - bne !- -!: - -#endif - - // Check if CTRL key pressed - if so, perform a delay + bne @1 +@2: +} + ; Check if CTRL key pressed - if so, perform a delay lda SHFLAG and #KEY_FLAG_CTRL beq screen_scroll_up_delay_done ldy #$09 -!: +@3: ldx #$FF jsr wait_x_bars dey - bne !- + bne @3 - // FALLTROUGH + ; FALLTROUGH -screen_scroll_up_delay_done: // entry point for cursor move control codes +screen_scroll_up_delay_done: ; entry point for cursor move control codes - // Scroll the LDTB1 (line link table) + ; Scroll the LDTB1 (line link table) ldy #$00 -!: +@4: lda LDTB1+1, y sta LDTB1+0, y iny cpy #24 - bne !- + bne @4 lda #$80 sta LDTB1+24 - // Preserve SAL and EAL, prepare initial SAL/EAL/PNT/USER values + ; Preserve SAL and EAL, prepare initial SAL/EAL/PNT/USER values jsr screen_preserve_sal_eal @@ -79,7 +77,7 @@ screen_scroll_up_delay_done: // entry point for cursor move control codes sta SAL+0 sta PNT+0 - // Now copy, SAL->EAL, PNT->USER, in a loop + ; Now copy, SAL->EAL, PNT->USER, in a loop ldy #$00 @@ -90,15 +88,15 @@ screen_scroll_up_loop: lda (PNT), y sta (USER), y - // Check if this was the last byte (last destination byte for color copy is #DBBF) + ; Check if this was the last byte (last destination byte for color copy is #DBBF) cpy #$BF - bne !+ // definitely not the last byte + bne @5 ; definitely not the last byte lda USER+1 cmp #$DB beq screen_scroll_up_loop_done -!: - // Increment .Y, possibly advance pointers +@5: + ; Increment .Y, possibly advance pointers iny bne screen_scroll_up_loop @@ -107,28 +105,28 @@ screen_scroll_up_loop: inc EAL+1 inc USER+1 inc PNT+1 - bne screen_scroll_up_loop // branch alwayys + bne screen_scroll_up_loop ; branch alwayys screen_scroll_up_loop_done: - // Restore SAL and EAL + ; Restore SAL and EAL jsr screen_restore_sal_eal - // Clear the newly introduced line + ; Clear the newly introduced line ldx #24 jsr screen_clear_line - // Decrement the current physical line number + ; Decrement the current physical line number dec TBLX - // If the first line is linked, scroll once more + ; If the first line is linked, scroll once more bit LDTB1+0 bpl screen_scroll_up - // Recalculate PNT and USER + ; Recalculate PNT and USER jmp screen_calculate_PNT_USER diff --git a/src/kernal/screen/e9ff.screen_clear_line.s b/src/kernal/screen/e9ff.screen_clear_line.s index 4611a575..b969e618 100644 --- a/src/kernal/screen/e9ff.screen_clear_line.s +++ b/src/kernal/screen/e9ff.screen_clear_line.s @@ -1,38 +1,38 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Well-known routine, described in: -// -// - [CM64] Computes Mapping the Commodore 64 - page 219 -// - http://sta.c64.org/cbm64scrfunc.html -// -// input: .X - screen line to clear -// -// Checked that original routine preserves X (convenient for loops), -// and leaves space screen code in .A, so duplicate this behaviour -// +; +; Well-known routine, described in: +; +; - [CM64] Computes Mapping the Commodore 64 - page 219 +; - http://sta.c64.org/cbm64scrfunc.html +; +; input: .X - screen line to clear +; +; Checked that original routine preserves X (convenient for loops), +; and leaves space screen code in .A, so duplicate this behaviour +; screen_clear_line: - // First, calculate PNT and USER - phx_trash_a + ; First, calculate PNT and USER + +phx_trash_a jsr screen_calculate_PNT_USER_from_X - plx_trash_a + +plx_trash_a - // Now clear the line + ; Now clear the line ldy #39 -!: +@1: lda COLOR sta (USER), y - lda #$20 // space character screen code + lda #$20 ; space character screen code sta (PNT), y dey - bpl !- + bpl @1 - // Done + ; Done rts diff --git a/src/kernal/screen/screen.s b/src/kernal/screen/screen.s index f83b39b1..c84cc23c 100644 --- a/src/kernal/screen/screen.s +++ b/src/kernal/screen/screen.s @@ -1,44 +1,44 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official Kernal routine, described in: -// -// - [RG64] C64 Programmer's Reference Guide - page 295 -// - [CM64] Compute's Mapping the Commodore 64 - page 215 -// -// CPU registers that has to be preserved (see [RG64]): .A -// +; +; Official Kernal routine, described in: +; +; - [RG64] C64 Programmer's Reference Guide - page 295 +; - [CM64] Compute's Mapping the Commodore 64 - page 215 +; +; CPU registers that has to be preserved (see [RG64]): .A +; SCREEN: -#if !ROM_LAYOUT_M65 +!ifndef CONFIG_MB_M65 { - // There are only 2 sane ways to implement this routine, - // I hope this one is different than what Commodore picked :) + ; There are only 2 sane ways to implement this routine, + ; I hope this one is different than what Commodore picked :) - ldy #25 // 25 columns - ldx #40 // 40 rows + ldy #25 ; 25 columns + ldx #40 ; 40 rows rts -#else +} else { php jsr M65_MODEGET - bcc !+ + bcc @1 plp - ldy #25 // 25 columns - ldx #40 // 40 rows + ldy #25 ; 25 columns + ldx #40 ; 40 rows rts -!: - // Screen dimensions depends on text mode +@1: + ; Screen dimensions depends on text mode plp pha @@ -50,5 +50,4 @@ SCREEN: pla rts - -#endif +} \ No newline at end of file diff --git a/src/kernal/screen/screen_advance_to_next_line.s b/src/kernal/screen/screen_advance_to_next_line.s index eb02bc8b..eb2e7c21 100644 --- a/src/kernal/screen/screen_advance_to_next_line.s +++ b/src/kernal/screen/screen_advance_to_next_line.s @@ -1,22 +1,22 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE screen_advance_to_next_line: - // Check if we are at the bottom of the screen + ; Check if we are at the bottom of the screen ldy TBLX cpy #24 - bne !+ + bne @1 - // We need to scroll the screen up + ; We need to scroll the screen up jsr screen_scroll_up -!: +@1: inc TBLX - // Set PNTR to 0 (for continued line will be fixed later) + ; Set PNTR to 0 (for continued line will be fixed later) lda #$00 sta PNTR diff --git a/src/kernal/screen/screen_calculate_pnt_user.s b/src/kernal/screen/screen_calculate_pnt_user.s index 75603fc1..acea7d8e 100644 --- a/src/kernal/screen/screen_calculate_pnt_user.s +++ b/src/kernal/screen/screen_calculate_pnt_user.s @@ -1,48 +1,48 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Set pointers PNT and USER to current screen line -// +; +; Set pointers PNT and USER to current screen line +; screen_calculate_PNT_USER: ldx TBLX - // FALLTROUGH + ; FALLTROUGH -screen_calculate_PNT_USER_from_X: // entry point for screen_clear_line +screen_calculate_PNT_USER_from_X: ; entry point for screen_clear_line - // Reset pointer to start of screen + ; Reset pointer to start of screen lda HIBASE sta PNT+1 lda #$00 sta PNT+0 - // Add 40 to PNT for every line + ; Add 40 to PNT for every line cpx #$00 beq screen_calculate_USER -!: +@1: lda #40 clc adc PNT+0 sta PNT+0 - bcc !+ + bcc @2 inc PNT+1 -!: +@2: dex - bne !-- + bne @1 - // FALLTROUGH + ; FALLTROUGH screen_calculate_USER: - // Calculate USER (pointer to the current line in color RAM) + ; Calculate USER (pointer to the current line in color RAM) lda PNT+0 sta USER+0 diff --git a/src/kernal/screen/screen_calculate_pntr_lnmx.s b/src/kernal/screen/screen_calculate_pntr_lnmx.s index 75c31643..3ed7ccae 100644 --- a/src/kernal/screen/screen_calculate_pntr_lnmx.s +++ b/src/kernal/screen/screen_calculate_pntr_lnmx.s @@ -1,12 +1,12 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Sets PNTR in a proper range (0-39 or 40-79) -// Sets LNMX to 39 or 79 -// +; +; Sets PNTR in a proper range (0-39 or 40-79) +; Sets LNMX to 39 or 79 +; screen_calculate_PNTR_LNMX: @@ -18,7 +18,7 @@ screen_calculate_PNTR_LNMX: plp bmi screen_calculate_PNTR_0_39 - // FALLTROUGH + ; FALLTROUGH screen_calculate_PNTR_40_79: @@ -27,35 +27,35 @@ screen_calculate_PNTR_40_79: adc #40 tay - // FALLTROUGH + ; FALLTROUGH screen_calculate_PNTR_0_39: sty PNTR - // FALLTROUGH + ; FALLTROUGH screen_calculate_LNMX: ldy TBLX lda LDTB1, y - bpl screen_calculate_lnmx_79 // this line is a continuation + bpl screen_calculate_lnmx_79 ; this line is a continuation cpy #24 - beq screen_calculate_lnmx_39 // this is the last line, which is not a continuation + beq screen_calculate_lnmx_39 ; this is the last line, which is not a continuation iny lda LDTB1, y - bpl screen_calculate_lnmx_79 // line is continued + bpl screen_calculate_lnmx_79 ; line is continued - // FALLTROUGH + ; FALLTROUGH screen_calculate_lnmx_39: lda #39 - skip_2_bytes_trash_nvz + +skip_2_bytes_trash_nvz - // FALLTROUGH + ; FALLTROUGH screen_calculate_lnmx_79: diff --git a/src/kernal/screen/screen_check_space_ends_line.s b/src/kernal/screen/screen_check_space_ends_line.s index 7c1243b5..b6ce85bb 100644 --- a/src/kernal/screen/screen_check_space_ends_line.s +++ b/src/kernal/screen/screen_check_space_ends_line.s @@ -1,7 +1,7 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE screen_check_space_ends_line: diff --git a/src/kernal/screen/screen_check_toggle_quote.s b/src/kernal/screen/screen_check_toggle_quote.s index 255f1d19..73899019 100644 --- a/src/kernal/screen/screen_check_toggle_quote.s +++ b/src/kernal/screen/screen_check_toggle_quote.s @@ -1,21 +1,21 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Helper routine - check character in .A, toggles quote flag if needed -// +; +; Helper routine - check character in .A, toggles quote flag if needed +; screen_check_toggle_quote: cmp #$22 - bne !+ + bne @1 lda QTSW eor #$80 sta QTSW - lda #$22 // restore previous .A valuee -!: + lda #$22 ; restore previous .A valuee +@1: rts diff --git a/src/kernal/screen/screen_code_to_petscii.s b/src/kernal/screen/screen_code_to_petscii.s index e19aad58..e72c63ac 100644 --- a/src/kernal/screen/screen_code_to_petscii.s +++ b/src/kernal/screen/screen_code_to_petscii.s @@ -1,52 +1,52 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Screen code to PETSCII conversion - see: -// -// - https://www.lemon64.com/forum/viewtopic.php?t=66362 -// - https://sta.c64.org/cbm64scrtopetext.html -// +; +; Screen code to PETSCII conversion - see: +; +; - https://www.lemon64.com/forum/viewtopic.php?t=66362 +; - https://sta.c64.org/cbm64scrtopetext.html +; screen_code_to_petscii: cmp #$20 - bcc s2p_adc_40 // $00-$1F -> $40-$5F + bcc s2p_adc_40 ; $00-$1F -> $40-$5F cmp #$40 - bcc s2p_end // $20-$3F -> $20-$3F + bcc s2p_end ; $20-$3F -> $20-$3F cmp #$60 - bcc s2p_adc_80 // $40-$5F -> $C0-$DF + bcc s2p_adc_80 ; $40-$5F -> $C0-$DF cmp #$80 - bcc s2p_adc_40 // $60-$7F -> $A0-$BF + bcc s2p_adc_40 ; $60-$7F -> $A0-$BF - // Here we have to check for quote mode + ; Here we have to check for quote mode bit QTSW bmi screen_code_to_petscii_quote - // Not quote mode - continue + ; Not quote mode - continue cmp #$A0 - bcc s2p_adc_C0 // $80-$9F -> $40-$5F + bcc s2p_adc_C0 ; $80-$9F -> $40-$5F cmp #$C0 - bcc s2p_adc_80 // $A0-$BF -> $20-$3F + bcc s2p_adc_80 ; $A0-$BF -> $20-$3F cmp #$E0 - bcc s2p_end // $C0-$DF -> $C0-$DF + bcc s2p_end ; $C0-$DF -> $C0-$DF clc - bcc s2p_adc_C0 // $E0-$FF -> $A0-$BF + bcc s2p_adc_C0 ; $E0-$FF -> $A0-$BF s2p_adc_40: - adc #$40 // Carry already clear + adc #$40 ; Carry already clear s2p_end: @@ -54,19 +54,19 @@ s2p_end: s2p_adc_80: - adc #$80 // Carry already clear + adc #$80 ; Carry already clear rts screen_code_to_petscii_quote: cmp #$C0 - bcc s2p_adc_80 // $80-$BF -> $00-$3F + bcc s2p_adc_80 ; $80-$BF -> $00-$3F clc - // FALLTROUGH $C0-$FF -> $80-$BF + ; FALLTROUGH $C0-$FF -> $80-$BF s2p_adc_C0: - adc #$C0 // Carry already clear + adc #$C0 ; Carry already clear rts diff --git a/src/kernal/screen/screen_get_cliped_pntr.s b/src/kernal/screen/screen_get_cliped_pntr.s index 355499fb..6839ecf1 100644 --- a/src/kernal/screen/screen_get_cliped_pntr.s +++ b/src/kernal/screen/screen_get_cliped_pntr.s @@ -1,20 +1,20 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Get PNTR value clipped to 0-39 range in .Y, sets flags to compare with 0, can trash .A -// +; +; Get PNTR value clipped to 0-39 range in .Y, sets flags to compare with 0, can trash .A +; screen_get_clipped_PNTR: ldy PNTR cpy #40 - bcc !+ + bcc @1 tya sbc #40 tay -!: +@1: cpy #$00 rts diff --git a/src/kernal/screen/screen_get_logical_line_end_ptr.s b/src/kernal/screen/screen_get_logical_line_end_ptr.s index d52dbc75..63ef357d 100644 --- a/src/kernal/screen/screen_get_logical_line_end_ptr.s +++ b/src/kernal/screen/screen_get_logical_line_end_ptr.s @@ -1,22 +1,22 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE screen_get_logical_line_end_ptr: ldy TBLX cpy #24 - bcs screen_get_logical_line_end_39 // last line of the screen + bcs screen_get_logical_line_end_39 ; last line of the screen lda LDTB1+0, y - bpl screen_get_logical_line_end_39 // current line continues previous one + bpl screen_get_logical_line_end_39 ; current line continues previous one lda LDTB1+1, y - bmi screen_get_logical_line_end_39 // current line is not continued + bmi screen_get_logical_line_end_39 ; current line is not continued - // FALLTROUGH + ; FALLTROUGH screen_get_logical_line_end_79: diff --git a/src/kernal/screen/screen_grow_logical_line.s b/src/kernal/screen/screen_grow_logical_line.s index b7e5acc6..72552579 100644 --- a/src/kernal/screen/screen_grow_logical_line.s +++ b/src/kernal/screen/screen_grow_logical_line.s @@ -1,14 +1,14 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE screen_grow_logical_line_done_scroll: inc TBLX - // FALLTROUGH + ; FALLTROUGH screen_grow_logical_line_done: @@ -19,59 +19,59 @@ screen_grow_logical_line_screen_up: jsr screen_scroll_up - // FALLTROUGH + ; FALLTROUGH screen_grow_logical_line: - // Do not grow line if previus one is grown + ; Do not grow line if previus one is grown ldy TBLX lda LDTB1+0, y bpl screen_grow_logical_line_done_scroll - // If last line, scroll the screen up + ; If last line, scroll the screen up cpy #24 beq screen_grow_logical_line_screen_up - // Do not grow line if already grown + ; Do not grow line if already grown lda LDTB1+1, y bpl screen_grow_logical_line_done - // Preserve SAL and EAL + ; Preserve SAL and EAL jsr screen_preserve_sal_eal - // Scroll LDTB1 down (start from the end) + ; Scroll LDTB1 down (start from the end) ldy #23 -!: +@1: cpy TBLX - beq !+ - bcc !+ + beq @2 + bcc @2 lda LDTB1+0, y sta LDTB1+1, y dey - bne !- -!: - // Mark current line as grown + bne @1 +@2: + ; Mark current line as grown ldy TBLX lda #$00 sta LDTB1+1, y - // Now we have to scroll lines downwards to make space. We start from the end, - // and work backwards. We cannot be as simple and efficient here as we are - // for scrolling up, because we do not know how much must be scrolled. + ; Now we have to scroll lines downwards to make space. We start from the end, + ; and work backwards. We cannot be as simple and efficient here as we are + ; for scrolling up, because we do not know how much must be scrolled. - // Work out how many physical lines to scroll down + ; Work out how many physical lines to scroll down lda #23 sec sbc TBLX - beq screen_grow_logical_line_copy_done // branch if no need to copyy + beq screen_grow_logical_line_copy_done ; branch if no need to copyy tax - // Prepare initial SAL/EAL/PNT/USER values + ; Prepare initial SAL/EAL/PNT/USER values lda HIBASE clc @@ -79,64 +79,64 @@ screen_grow_logical_line: sta SAL+1 sta EAL+1 - lda #>$DB00 // 3rd page of the color memory + lda #>$DB00 ; 3rd page of the color memory sta PNT+1 sta USER+1 - lda #<$03C0 // start of destination row + lda #<$03C0 ; start of destination row sta EAL+0 sta USER+0 - lda #<$0398 // start of source row + lda #<$0398 ; start of source row sta SAL+0 sta PNT+0 screen_grow_logical_line_loop: - // Scroll down one line each loop iteration + ; Scroll down one line each loop iteration ldy #39 -!: +@3: lda (SAL), y sta (EAL), y lda (PNT), y sta (USER), y dey - bpl !- + bpl @3 - // Decrement SAL/PNT pointers by 40 (optimized due to fact they share LSB) + ; Decrement SAL/PNT pointers by 40 (optimized due to fact they share LSB) lda SAL+0 sec sbc #40 sta SAL+0 sta PNT+0 - bcs !+ + bcs @4 dec SAL+1 dec PNT+1 -!: - // Decrement EAL/USER pointers by 40 (optimized due to fact they share LSB) +@4: + ; Decrement EAL/USER pointers by 40 (optimized due to fact they share LSB) lda EAL+0 sec sbc #40 sta EAL+0 sta USER+0 - bcs !+ + bcs @5 dec EAL+1 dec USER+1 -!: - // Next loop iteration +@5: + ; Next loop iteration dex bne screen_grow_logical_line_loop screen_grow_logical_line_copy_done: - // Restore SAL and EAL + ; Restore SAL and EAL jsr screen_restore_sal_eal - // Erase newly inserted line and quit + ; Erase newly inserted line and quit ldx TBLX inx diff --git a/src/kernal/screen/screen_off.s b/src/kernal/screen/screen_off.s index 21ee078e..7e285bbd 100644 --- a/src/kernal/screen/screen_off.s +++ b/src/kernal/screen/screen_off.s @@ -1,14 +1,17 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Helper routine to blank screen -// +; +; Helper routine to blank screen +; +!set NEEDED = 0 +!ifdef HAS_TAPE { !set NEEDED = 1 } +!ifdef CONFIG_IEC_JIFFYDOS { !ifndef CONFIG_MEMORY_MODEL_60K { !set NEEDED = 1 } } -#if ((CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO)) || (CONFIG_IEC_JIFFYDOS && !CONFIG_MEMORY_MODEL_60K) +!if NEEDED { screen_off: @@ -17,16 +20,14 @@ screen_off: and #($FF - $10) sta VIC_SCROLY - // To be sure there are no badlines we have to wait till the next screen, - // as the bit is checked by VIC-II at the start of the frame only -!: - lda VIC_SCROLY // wait for higher part of screen - bpl !- -!: - lda VIC_SCROLY // wait for lower part of the screen - bmi !- + ; To be sure there are no badlines we have to wait till the next screen, + ; as the bit is checked by VIC-II at the start of the frame only +@1: + lda VIC_SCROLY ; wait for higher part of screen + bpl @1 +@2: + lda VIC_SCROLY ; wait for lower part of the screen + bmi @2 rts - - -#endif +} diff --git a/src/kernal/screen/screen_on.s b/src/kernal/screen/screen_on.s index 57e81c02..d05c5aba 100644 --- a/src/kernal/screen/screen_on.s +++ b/src/kernal/screen/screen_on.s @@ -1,14 +1,17 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Helper routine to show screen -// +; +; Helper routine to show screen +; +!set NEEDED = 0 +!ifdef HAS_TAPE { !set NEEDED = 1 } +!ifdef CONFIG_IEC_JIFFYDOS { !ifndef CONFIG_MEMORY_MODEL_60K { !set NEEDED = 1 } } -#if (CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO) || (CONFIG_IEC_JIFFYDOS && !CONFIG_MEMORY_MODEL_60K) +!if NEEDED { screen_on: @@ -18,6 +21,4 @@ screen_on: sta VIC_SCROLY rts - - -#endif +} diff --git a/src/kernal/screen/screen_preserve_sal_eal.s b/src/kernal/screen/screen_preserve_sal_eal.s index a576cbab..3f31ed29 100644 --- a/src/kernal/screen/screen_preserve_sal_eal.s +++ b/src/kernal/screen/screen_preserve_sal_eal.s @@ -1,21 +1,21 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE screen_preserve_sal_eal: - plx_trash_a - ply_trash_a + +plx_trash_a + +ply_trash_a - // Note: While the following routine is obvious to any skilled - // in the art as the most obvious simple and efficient solution, - // it results in a relatively long verbatim stretch of bytes when - // compared to the C64 KERNAL. Thus we have swapped the order, - // just to reduce the potential for any argument of copyright - // infringement, even though we really do not believe that the - // routine can be copyrighted due to the lack of creativity. + ; Note: While the following routine is obvious to any skilled + ; in the art as the most obvious simple and efficient solution, + ; it results in a relatively long verbatim stretch of bytes when + ; compared to the C64 KERNAL. Thus we have swapped the order, + ; just to reduce the potential for any argument of copyright + ; infringement, even though we really do not believe that the + ; routine can be copyrighted due to the lack of creativity. lda SAL+0 pha @@ -26,10 +26,10 @@ screen_preserve_sal_eal: lda EAL+1 pha - // FALLTROUGH + ; FALLTROUGH screen_common_sal_eal: - phy_trash_a - phx_trash_a + +phy_trash_a + +phx_trash_a rts diff --git a/src/kernal/screen/screen_restore_sal_eal.s b/src/kernal/screen/screen_restore_sal_eal.s index 6f10b390..6e822740 100644 --- a/src/kernal/screen/screen_restore_sal_eal.s +++ b/src/kernal/screen/screen_restore_sal_eal.s @@ -1,21 +1,21 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 * #IGNORE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE screen_restore_sal_eal: - plx_trash_a - ply_trash_a + +plx_trash_a + +ply_trash_a - // Note: While the following routine is obvious to any skilled - // in the art as the most obvious simple and efficient solution, - // it results in a relatively long verbatim stretch of bytes when - // compared to the C64 KERNAL. Thus we have swapped the order, - // just to reduce the potential for any argument of copyright - // infringement, even though we really do not believe that the - // routine can be copyrighted due to the lack of creativity. + ; Note: While the following routine is obvious to any skilled + ; in the art as the most obvious simple and efficient solution, + ; it results in a relatively long verbatim stretch of bytes when + ; compared to the C64 KERNAL. Thus we have swapped the order, + ; just to reduce the potential for any argument of copyright + ; infringement, even though we really do not believe that the + ; routine can be copyrighted due to the lack of creativity. pla sta EAL+1 diff --git a/src/kernal/screen_m65/mega65_chrin_keyboard.s b/src/kernal/screen_m65/mega65_chrin_keyboard.s index 9ed62009..76f02967 100644 --- a/src/kernal/screen_m65/mega65_chrin_keyboard.s +++ b/src/kernal/screen_m65/mega65_chrin_keyboard.s @@ -1,50 +1,50 @@ -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Keyboard part of the CHRIN routine, version for MEGA65 native mode -// +; +; Keyboard part of the CHRIN routine, version for MEGA65 native mode +; -m65_chrin_keyboard: // XXX connnect this function to Kernal +m65_chrin_keyboard: ; XXX connnect this function to Kernal - // Preserve .X, .Y and .Z register + ; Preserve .X, .Y and .Z register phx phy phz - // FALLTROUGH + ; FALLTROUGH m65_chrin_keyboard_repeat: - // Do we have a line of input we are currently returning? - // If so, return the next byte, and clear the flag when we reach the end. + ; Do we have a line of input we are currently returning? + ; If so, return the next byte, and clear the flag when we reach the end. lda CRSW beq m65_chrin_keyboard_read - // We have input waiting at [M65__SCRINPUT]+CRSW - // When CRSW = INDX, then we return a carriage return and clear the flag + ; We have input waiting at [M65__SCRINPUT]+CRSW + ; When CRSW = INDX, then we return a carriage return and clear the flag cmp INDX bne m65_chrin_keyboard_not_end_of_input - // Clear pending input and quote flags + ; Clear pending input and quote flags lda #$00 sta CRSW sta QTSW - // FALLTROUGH + ; FALLTROUGH m65_chrin_keyboard_empty_line: - // For an empty line, just return the carriage return + ; For an empty line, just return the carriage return lda #$0D - // FALLTROUGH + ; FALLTROUGH m65_chrin_keyboard_end: @@ -56,12 +56,12 @@ m65_chrin_keyboard_end: m65_chrin_keyboard_not_end_of_input: - // Advance index, return the next byte + ; Advance index, return the next byte inc CRSW tay - // FALLTROUGH + ; FALLTROUGH m65_chrin_keyboard_return_byte: @@ -69,38 +69,38 @@ m65_chrin_keyboard_return_byte: tya taz - lda_lp (M65_LPNT_SCR), z + lda [M65_LPNT_SCR], z jsr screen_check_toggle_quote jsr screen_code_to_petscii - jmp_8 m65_chrin_keyboard_end + bra m65_chrin_keyboard_end m65_chrin_keyboard_read: jsr cursor_enable - // Wait for a key + ; Wait for a key lda NDX beq m65_chrin_keyboard_repeat lda KEYD cmp #$0D bne m65_chrin_keyboard_not_enter - // FALLTROUGH + ; FALLTROUGH m65_chrin_keyboard_enter: - // Disable cursor, retrieve code from keyboard buffer + ; Disable cursor, retrieve code from keyboard buffer jsr m65_cursor_disable jsr pop_keyboard_buffer jsr m65_cursor_hide_if_visible - // It was enter. Note that we have a line of input to return, and return the first byte - // after computing and storing its length (Computes Mapping the 64, p96) + ; It was enter. Note that we have a line of input to return, and return the first byte + ; after computing and storing its length (Computes Mapping the 64, p96) - // Set pointer to the input, start for the viewport offset + screen memory base + ; Set pointer to the input, start for the viewport offset + screen memory base clc lda M65_COLVIEW+0 adc M65_SCRBASE+0 @@ -108,7 +108,7 @@ m65_chrin_keyboard_enter: lda M65_COLVIEW+1 adc M65_SCRBASE+1 sta M65__SCRINPUT+1 - // Add current row offset + ; Add current row offset clc lda M65__SCRINPUT+0 adc M65_TXTROW_OFF+0 @@ -117,54 +117,53 @@ m65_chrin_keyboard_enter: adc M65_TXTROW_OFF+1 sta M65__SCRINPUT+1 - // Retrieve first byte which is not space + ; Retrieve first byte which is not space jsr m65_helper_scrlpnt_chrin - ldy M65_COLVIEWMAX // XXX add support for windowed mode here + ldy M65_COLVIEWMAX ; XXX add support for windowed mode here iny - // FALLTROUGH + ; FALLTROUGH m65_chrin_enter_loop: - // Skip spaces at the end of line + ; Skip spaces at the end of line dey bmi m65_chrin_keyboard_empty_line tya taz - lda_lp (M65_LPNT_SCR), z + lda [M65_LPNT_SCR], z cmp #$20 beq m65_chrin_enter_loop iny sty INDX - // XXX add windowed mode support here - correct INDX and M65__SCRINPUT + ; XXX add windowed mode support here - correct INDX and M65__SCRINPUT - // Set mark informing that we are returning a line + ; Set mark informing that we are returning a line ldy #$01 sty CRSW - // Clear quote mode mark + ; Clear quote mode mark dey sty QTSW - // Return first char of line - jmp_8 m65_chrin_keyboard_return_byte // branch always + ; Return first char of line + bra m65_chrin_keyboard_return_byte ; branch always m65_chrin_keyboard_not_enter: lda KEYD -#if CONFIG_PROGRAMMABLE_KEYS +!ifdef CONFIG_PROGRAMMABLE_KEYS { jsr chrin_programmable_keys bcc m65_chrin_keyboard_enter +} -#endif // CONFIG_PROGRAMMABLE_KEYS - - // Print character, keep looking for input from keyboard until carriage return + ; Print character, keep looking for input from keyboard until carriage return jsr CHROUT jsr pop_keyboard_buffer jmp m65_chrin_keyboard_repeat diff --git a/src/kernal/screen_m65/mega65_chrout_screen.s b/src/kernal/screen_m65/mega65_chrout_screen.s index c2533579..933062f8 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen.s +++ b/src/kernal/screen_m65/mega65_chrout_screen.s @@ -1,87 +1,87 @@ -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// CHROUT routine - screen support (character output), MEGA65 native mode version -// +; +; CHROUT routine - screen support (character output), MEGA65 native mode version +; m65_chrout_screen: jsr m65_cursor_hide_if_visible - // Retrieve the character to output + ; Retrieve the character to output lda SCHAR tax - // All the PETSCII control codes are within $0x, $1x, $8x, $9x, remaining - // ones are always printable characters; separate away control codes + ; All the PETSCII control codes are within $0x, $1x, $8x, $9x, remaining + ; ones are always printable characters; separate away control codes and #$60 - beq_16 m65_chrout_screen_control + +beq m65_chrout_screen_control txa - // Literals - first convert PETSCII to screen code + ; Literals - first convert PETSCII to screen code jsr chrout_to_screen_code - // FALLTROUGH + ; FALLTROUGH -m65_chrout_screen_literal: // entry point for m65_chrout_screen_quote +m65_chrout_screen_literal: ; entry point for m65_chrout_screen_quote - // Write normal character on the screen + ; Write normal character on the screen - tax // store screen code, we need .A for calculations + tax ; store screen code, we need .A for calculations - // Preserve .Z on stack + ; Preserve .Z on stack phz - // Prepare .Z and M65_LPNT_SCR for colour memory manipulation + ; Prepare .Z and M65_LPNT_SCR for colour memory manipulation ldz M65__TXTCOL jsr m65_helper_scrlpnt_color - // Store the new color in screen memory + ; Store the new color in screen memory lda COLOR - sta_lp (M65_LPNT_SCR),z + sta [M65_LPNT_SCR], z - // Now change M65_LPNT_SCR to point to screen memory + ; Now change M65_LPNT_SCR to point to screen memory jsr m65_helper_scrlpnt_to_screen - // Decrement number of chars waiting to be inserted + ; Decrement number of chars waiting to be inserted lda INSRT - beq !+ + beq @1 dec INSRT -!: - // Toggle quote flag if required +@1: + ; Toggle quote flag if required txa jsr screen_check_toggle_quote - // Store the new character in screen memory, restore .Z + ; Store the new character in screen memory, restore .Z txa bit RVS - bpl !+ - ora #$80 // reverse the character XXX consider doing this within chrout_to_screen_code -!: - sta_lp (M65_LPNT_SCR),z + bpl @2 + ora #$80 ; reverse the character XXX consider doing this within chrout_to_screen_code +@2: + sta [M65_LPNT_SCR], z - // Restore .Z + ; Restore .Z plz - // Increment screen column by 1 + ; Increment screen column by 1 inc M65__TXTCOL - // FALLTROUGH + ; FALLTROUGH m65_chrout_fix_column_row: @@ -90,158 +90,158 @@ m65_chrout_fix_column_row: bit M65_SCRWINMODE bmi m65_chrout_fix_column_row_win - // Non-windowed mode + ; Non-windowed mode - // Check for column below 0 + ; Check for column below 0 lda M65__TXTCOL - bpl !++ + bpl @4 lda M65_COLVIEW+0 ora M65_COLVIEW+1 ora M65__TXTROW - bne !+ + bne @3 lda #$00 sta M65__TXTCOL - jmp_8 !++ -!: + bra @4 +@3: dec M65__TXTROW lda m65_scrtab_txtwidth,y sta M65__TXTCOL dec M65__TXTCOL -!: - // Check for column above maximum +@4: + ; Check for column above maximum lda M65__TXTCOL cmp m65_scrtab_txtwidth,y - bcc !+ + bcc @5 inc M65__TXTROW lda #$00 sta M65__TXTCOL -!: - // Check for row below 0 +@5: + ; Check for row below 0 lda M65__TXTROW - bpl !+ + bpl @6 jsr m65_chrout_fix_scroll_down -!: - // Check for row above maximum +@6: + ; Check for row above maximum lda M65__TXTROW cmp m65_scrtab_txtheight,y - bcc !+ + bcc @7 jsr m65_chrout_fix_scroll_up -!: - jmp_8 m65_chrout_fix_txtrow_off +@7: + bra m65_chrout_fix_txtrow_off m65_chrout_fix_column_row_win: - // Windowed mode + ; Windowed mode - // XXX - // XXX provide implementation - // XXX + ; XXX + ; XXX provide implementation + ; XXX - nop + +nop - // FALLTROUGH + ; FALLTROUGH m65_chrout_fix_txtrow_off: jsr m65_screen_upd_txtrow_off - // FALLTROUGH + ; FALLTROUGH m65_chrout_screen_done: jsr cursor_show_if_enabled - // XXX make sure it return success + ; XXX make sure it return success rts -// Try to fix coordinates by scrolling the screen down +; Try to fix coordinates by scrolling the screen down m65_chrout_fix_scroll_down: inc M65__TXTROW - // Check if we can simply adapt the viewport + ; Check if we can simply adapt the viewport lda M65_COLVIEW+0 ora M65_COLVIEW+1 beq m65_chrout_fix_scroll_down_end - // Yes, we can simply adapt the viewport + ; Yes, we can simply adapt the viewport sec lda M65_COLVIEW+0 sbc #$50 sta M65_COLVIEW+0 sta VIC_COLPTR+0 - bcs !+ + bcs @8 dec M65_COLVIEW+1 dec VIC_COLPTR+1 -!: +@8: sec lda VIC_SCRNPTR+0 sbc #$50 sta VIC_SCRNPTR+0 - bcs !+ + bcs @9 dec VIC_SCRNPTR+1 -!: - // FALLTROUGH +@9: + ; FALLTROUGH m65_chrout_fix_scroll_down_end: rts -// Try to fix coordinates by scrolling the screen up +; Try to fix coordinates by scrolling the screen up m65_chrout_fix_scroll_up: dec M65__TXTROW - // Check if we can simply adapt the viewport + ; Check if we can simply adapt the viewport lda M65_COLVIEW+1 cmp M65_COLVIEWMAX+1 - bne !+ + bne @10 lda M65_COLVIEW+0 cmp M65_COLVIEWMAX+0 beq m65_chrout_fix_scroll_up_scroll -!: - // Yes, we can simply adapt the viewport +@10: + ; Yes, we can simply adapt the viewport clc lda M65_COLVIEW+0 adc #$50 sta M65_COLVIEW+0 sta VIC_COLPTR+0 - bcc !+ + bcc @11 inc M65_COLVIEW+1 inc VIC_COLPTR+1 -!: +@11: clc lda VIC_SCRNPTR+0 adc #$50 sta VIC_SCRNPTR+0 - bcc !+ + bcc @12 inc VIC_SCRNPTR+1 -!: +@12: rts m65_chrout_fix_scroll_up_scroll: - // Virtual screen is too small - we will lose one row + ; Virtual screen is too small - we will lose one row - // Calculate size of data to copy + ; Calculate size of data to copy sec lda M65_COLGUARD+0 @@ -251,19 +251,19 @@ m65_chrout_fix_scroll_up_scroll: sbc #$00 sta M65_DMAJOB_SIZE_1 - // Scroll up screen memory + ; Scroll up screen memory jsr m65_screen_dmasrcdst_screen jsr m65_screen_dmasrc_add_row jsr m65_dmagic_oper_copy - // Scroll up color memory + ; Scroll up color memory jsr m65_screen_dmasrcdst_color jsr m65_screen_dmasrc_add_row jsr m65_dmagic_oper_copy - // Clear the last row - color and screen memory + ; Clear the last row - color and screen memory phz @@ -271,18 +271,18 @@ m65_chrout_fix_scroll_up_scroll: lda COLOR and #$0F ldz M65_SCRCOLMAX -!: - sta_lp (M65_LPNT_SCR), z +@13: + sta [M65_LPNT_SCR], z dez - bpl !- + bpl @13 jsr m65_helper_scrlpnt_to_screen lda #$20 ldz M65_SCRCOLMAX -!: - sta_lp (M65_LPNT_SCR), z +@14: + sta [M65_LPNT_SCR], z dez - bpl !- + bpl @14 plz diff --git a/src/kernal/screen_m65/mega65_chrout_screen_control.s b/src/kernal/screen_m65/mega65_chrout_screen_control.s index 3ad9551a..d2bd24b0 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen_control.s +++ b/src/kernal/screen_m65/mega65_chrout_screen_control.s @@ -1,5 +1,5 @@ -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE m65_chrout_screen_control: @@ -15,32 +15,32 @@ m65_chrout_try_jumptable_loop: cpx #(__m65_chrout_screen_jumptable_quote_guard - m65_chrout_screen_jumptable_codes - 1) bne m65_chrout_try_jumptable_loop_noquote - // Is this insert/quote mode? + ; Is this insert/quote mode? tay lda QTSW ora INSRT - beq !+ + beq @1 tya jmp m65_chrout_screen_quote -!: +@1: tya - // FALLTROUGH + ; FALLTROUGH m65_chrout_try_jumptable_loop_noquote: cmp m65_chrout_screen_jumptable_codes, x - bne !+ + bne @2 - // Found, perform a jump to subroutine + ; Found, perform a jump to subroutine txa asl tax jmp (m65_chrout_screen_jumptable, x) -!: +@2: dex bpl m65_chrout_try_jumptable_loop @@ -51,7 +51,7 @@ m65_chrout_try_COLOR: m65_chrout_try_color_loop: cmp colour_codes,x - bne !+ + bne @3 lda COLOR and #$F0 @@ -62,35 +62,35 @@ m65_chrout_try_color_loop: sta COLOR jmp m65_chrout_screen_done -!: +@3: dex bpl m65_chrout_try_color_loop - // Unknown code, or key not requiring any handling + ; Unknown code, or key not requiring any handling jmp m65_chrout_screen_done -// XXX: implement screen routines below: +; XXX: implement screen routines below: m65_chrout_screen_TAB: - nop + +nop m65_chrout_screen_LINE_FEED: - nop + +nop m65_chrout_screen_UNDERLINE_ON: - nop + +nop m65_chrout_screen_UNDERLINE_OFF: - nop + +nop m65_chrout_screen_FLASHING_ON: - nop + +nop m65_chrout_screen_FLASHING_OFF: - nop + +nop m65_chrout_screen_TAB_SET_CLR: - nop + +nop m65_chrout_screen_ESC: - nop + +nop m65_chrout_screen_BELL: jmp m65_chrout_screen_done diff --git a/src/kernal/screen_m65/mega65_chrout_screen_control_1.s b/src/kernal/screen_m65/mega65_chrout_screen_control_1.s index 9264e959..4a3b62db 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen_control_1.s +++ b/src/kernal/screen_m65/mega65_chrout_screen_control_1.s @@ -1,62 +1,62 @@ -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// Cursor movement +; Cursor movement m65_chrout_screen_CRSR_RIGHT: inc M65__TXTCOL - skip_2_bytes_trash_nvz + +skip_2_bytes_trash_nvz - // FALLTROUGH + ; FALLTROUGH m65_chrout_screen_CRSR_LEFT: dec M65__TXTCOL - skip_2_bytes_trash_nvz + +skip_2_bytes_trash_nvz - // FALLTROUGH + ; FALLTROUGH m65_chrout_screen_CRSR_DOWN: inc M65__TXTROW - skip_2_bytes_trash_nvz + +skip_2_bytes_trash_nvz - // FALLTROUGH + ; FALLTROUGH m65_chrout_screen_CRSR_UP: dec M65__TXTROW - jmp_8 m65_chrout_screen_ctrl1_end + bra m65_chrout_screen_ctrl1_end -// 'RETURN' key +; 'RETURN' key m65_chrout_screen_RETURN: - // RETURN clears quote and insert modes, it also clears reverse flag + ; RETURN clears quote and insert modes, it also clears reverse flag lda #$00 sta QTSW sta INSRT sta RVS - // Move cursor to the beginning of the next line + ; Move cursor to the beginning of the next line bit M65_SCRWINMODE - bpl !+ + bpl @1 lda M65_TXTWIN_X0 - skip_2_bytes_trash_nvz -!: + +skip_2_bytes_trash_nvz +@1: lda #$00 sta M65__TXTCOL inc M65__TXTROW - // FALLTROUGH + ; FALLTROUGH m65_chrout_screen_ctrl1_end: - // Correct the column/row values + ; Correct the column/row values jmp m65_chrout_fix_column_row diff --git a/src/kernal/screen_m65/mega65_chrout_screen_control_2.s b/src/kernal/screen_m65/mega65_chrout_screen_control_2.s index 606d7cb0..d935efab 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen_control_2.s +++ b/src/kernal/screen_m65/mega65_chrout_screen_control_2.s @@ -1,15 +1,15 @@ -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// 'REVERSE' mode support +; 'REVERSE' mode support m65_chrout_screen_RVS_ON: lda #$80 - skip_2_bytes_trash_nvz + +skip_2_bytes_trash_nvz - // FALLTROUGH + ; FALLTROUGH m65_chrout_screen_RVS_OFF: @@ -17,134 +17,138 @@ m65_chrout_screen_RVS_OFF: sta RVS - // FALLTROUGH + ; FALLTROUGH m65_chrout_screen_ctrl2_end: jmp m65_chrout_screen_done -// 'SHIFT ON/OFF' support +; 'SHIFT ON/OFF' support m65_chrout_screen_SHIFT_ON: - lda #$00 // enable SHIFT+VENDOR combination - skip_2_bytes_trash_nvz + lda #$00 ; enable SHIFT+VENDOR combination + +skip_2_bytes_trash_nvz - // FALLTROUGH + ; FALLTROUGH m65_chrout_screen_SHIFT_OFF: - lda #$80 // disable SHIFT+VENDOR combination + lda #$80 ; disable SHIFT+VENDOR combination sta MODE - jmp_8 m65_chrout_screen_ctrl2_end + bra m65_chrout_screen_ctrl2_end -// STOP key support +; STOP key support m65_chrout_screen_STOP: lda #$00 sta QTSW sta INSRT - jmp_8 m65_chrout_screen_ctrl2_end + bra m65_chrout_screen_ctrl2_end -// CLR/HOME key support +; CLR/HOME key support m65_chrout_screen_CLR: jsr M65_CLRWIN - jmp_8 m65_chrout_screen_ctrl2_end + bra m65_chrout_screen_ctrl2_end m65_chrout_screen_HOME: jsr M65_HOME - jmp_8 m65_chrout_screen_ctrl2_end + bra m65_chrout_screen_ctrl2_end -// Character set switching +; Character set switching m65_chrout_screen_GFX: lda VIC_CHARPTR+1 ora #%00001000 -!: + + ; FALLTROUGH + +m65_chrout_screen_GFX_cont: + sta VIC_CHARPTR+1 - jmp_8 m65_chrout_screen_ctrl2_end + bra m65_chrout_screen_ctrl2_end m65_chrout_screen_TXT: lda VIC_CHARPTR+1 and #%11110111 - jmp_8 !- + bra m65_chrout_screen_GFX_cont -// INS key +; INS key m65_chrout_screen_INS: - // First prepare the pointer to the current row + ; First prepare the pointer to the current row jsr m65_helper_scrlpnt_color jsr m65_helper_scrlpnt_to_screen - // Check for windowed mode + ; Check for windowed mode lda M65_SCRWINMODE - bmi_16 m65_chrout_screen_INS_winmode + +bmi m65_chrout_screen_INS_winmode - // Check if last character of the line is space + ; Check if last character of the line is space ldy M65_SCRMODE lda m65_scrtab_txtwidth,y - dec_a + dec taz - lda_lp (M65_LPNT_SCR), z + lda [M65_LPNT_SCR], z cmp #$20 - bne_16 m65_chrout_screen_ctrl2_end + +bne m65_chrout_screen_ctrl2_end phz - // Last character is space - move the characters + ; Last character is space - move the characters jsr m65_chrout_screen_INS_copy - // Store space in the current character cell + ; Store space in the current character cell lda #$20 - sta_lp (M65_LPNT_SCR), z + sta [M65_LPNT_SCR], z - // Move the color memory + ; Move the color memory jsr m65_helper_scrlpnt_color plz jsr m65_chrout_screen_INS_copy - // Store current colour in the current character cell + ; Store current colour in the current character cell lda COLOR and #$0F - sta_lp (M65_LPNT_SCR), z + sta [M65_LPNT_SCR], z - // Increase insert mode count (which causes quote-mode like behaviour) and quit + ; Increase insert mode count (which causes quote-mode like behaviour) and quit inc INSRT - jmp_8 m65_chrout_screen_ctrl2_end + bra m65_chrout_screen_ctrl2_end m65_chrout_screen_INS_winmode: - // Check if last character of the line within window is space + ; Check if last character of the line within window is space - // XXX provide implementation + ; XXX provide implementation - jmp_8 m65_chrout_screen_ctrl2_end + bra m65_chrout_screen_ctrl2_end m65_chrout_screen_INS_copy: dez - lda_lp (M65_LPNT_SCR), z + lda [M65_LPNT_SCR], z inz - sta_lp (M65_LPNT_SCR), z + sta [M65_LPNT_SCR], z dez cpz M65__TXTCOL bne m65_chrout_screen_INS_copy diff --git a/src/kernal/screen_m65/mega65_chrout_screen_control_del.s b/src/kernal/screen_m65/mega65_chrout_screen_control_del.s index 54462dd6..b1baaaa9 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen_control_del.s +++ b/src/kernal/screen_m65/mega65_chrout_screen_control_del.s @@ -1,23 +1,23 @@ -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// 'DEL' key support +; 'DEL' key support m65_chrout_screen_DEL: - // First check for window mode + ; First check for window mode lda M65_SCRWINMODE bmi m65_chrout_screen_DEL_winmode - // Not a window mode; check if we are in the first column + ; Not a window mode; check if we are in the first column lda M65__TXTCOL beq m65_chrout_screen_DEL_1stcol - // Not a window mode, not a first column - we can safely - // delete the character and sroll back the rest of the row + ; Not a window mode, not a first column - we can safely + ; delete the character and sroll back the rest of the row phz @@ -27,18 +27,18 @@ m65_chrout_screen_DEL: ldz M65_SCRCOLMAX lda COLOR and #$0F - sta_lp (M65_LPNT_SCR), z + sta [M65_LPNT_SCR], z jsr m65_helper_scrlpnt_to_screen jsr m65_chrout_screen_DEL_copy ldz M65_SCRCOLMAX lda #$20 - sta_lp (M65_LPNT_SCR), z + sta [M65_LPNT_SCR], z plz - // End by moving cursor one position left + ; End by moving cursor one position left jmp m65_chrout_screen_CRSR_LEFT @@ -46,33 +46,33 @@ m65_chrout_screen_DEL_copy: ldz M65__TXTCOL dez -!: +@1: cpz M65_SCRCOLMAX - beq !+ + beq @2 inz - lda_lp (M65_LPNT_SCR), z + lda [M65_LPNT_SCR], z dez - sta_lp (M65_LPNT_SCR), z + sta [M65_LPNT_SCR], z inz - jmp_8 !- -!: + bra @1 +@2: rts m65_chrout_screen_DEL_1stcol: - // Start by moving one position left + ; Start by moving one position left jsr m65_chrout_screen_CRSR_LEFT - // If we are still in the first column - nothing to do + ; If we are still in the first column - nothing to do lda M65__TXTCOL - beq !+ + beq @3 - // Deleta character under cursor + ; Deleta character under cursor phz @@ -81,22 +81,21 @@ m65_chrout_screen_DEL_1stcol: lda COLOR and #$0F - sta_lp (M65_LPNT_SCR), z + sta [M65_LPNT_SCR], z jsr m65_helper_scrlpnt_to_screen lda #$20 - sta_lp (M65_LPNT_SCR), z + sta [M65_LPNT_SCR], z plz - // End of character deletion -!: + ; End of character deletion +@3: jmp m65_chrout_screen_done m65_chrout_screen_DEL_winmode: - // XXX provide implementation for window mode + ; XXX provide implementation for window mode jmp m65_chrout_screen_done - diff --git a/src/kernal/screen_m65/mega65_clrscr.s b/src/kernal/screen_m65/mega65_clrscr.s index 41913d29..72d28b9f 100644 --- a/src/kernal/screen_m65/mega65_clrscr.s +++ b/src/kernal/screen_m65/mega65_clrscr.s @@ -1,51 +1,51 @@ -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE M65_CLRSCR: - // Clear additional attributes from the color code + ; Clear additional attributes from the color code jsr m65_screen_clear_colorattr - // Disable the window mode + ; Disable the window mode lda #$00 sta M65_SCRWINMODE - // FALLTROUGH + ; FALLTROUGH m65_clrscr_takeover: - // Clear the whole screen + colour memory + ; Clear the whole screen + colour memory - // Screen size + ; Screen size lda M65_COLGUARD+0 sta M65_DMAJOB_SIZE_0 lda M65_COLGUARD+1 sta M65_DMAJOB_SIZE_1 - // Fill screen memory with spaces + ; Fill screen memory with spaces jsr m65_screen_dmasrcdst_screen lda #$20 jsr m65_dmagic_oper_fill - // Fill color memory with the current color + ; Fill color memory with the current color jsr m65_screen_dmasrcdst_color lda COLOR and #$0F jsr m65_dmagic_oper_fill - // Set the viewport to the beginning of virtual screen - // XXX deduplicate with mode setting routine + ; Set the viewport to the beginning of virtual screen + ; XXX deduplicate with mode setting routine lda #$00 sta M65_COLVIEW+0 sta M65_COLVIEW+1 - // Set screen+color base address in VIC IV - // XXX deduplicate with mode setting routine + ; Set screen+color base address in VIC IV + ; XXX deduplicate with mode setting routine sta VIC_COLPTR+0 sta VIC_COLPTR+1 @@ -57,11 +57,11 @@ m65_clrscr_takeover: lda M65_SCRBASE+1 sta VIC_SCRNPTR+1 - // Set logical row length + ; Set logical row length jsr m65_screen_set_indx - // FALLTROUGH + ; FALLTROUGH M65_HOME: @@ -78,6 +78,6 @@ M65_HOME: M65_HOME_winmode: - // XXX provide implementation + ; XXX provide implementation rts diff --git a/src/kernal/screen_m65/mega65_clrwin.s b/src/kernal/screen_m65/mega65_clrwin.s index c519f8b4..4323fa05 100644 --- a/src/kernal/screen_m65/mega65_clrwin.s +++ b/src/kernal/screen_m65/mega65_clrwin.s @@ -1,28 +1,28 @@ -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// XXX deduplicate pointer manipulation, see M65_CLRSCR -// XXX consider using DMAgic for this - FILL command +; XXX deduplicate pointer manipulation, see M65_CLRSCR +; XXX consider using DMAgic for this - FILL command M65_CLRWIN: - // Clear additional attributes from the color code + ; Clear additional attributes from the color code jsr m65_screen_clear_colorattr - // Check if windowed mode; if not, go to M65_CLRSCR + ; Check if windowed mode; if not, go to M65_CLRSCR lda M65_SCRWINMODE - bpl_16 m65_clrscr_takeover + +bpl m65_clrscr_takeover - // To clear the window, two zeropage long pointers will be used: - // - M65_LPNT_SCR for screen memory - // - M65_LPNT_KERN for colour memory (starts from $FF80000) // XXX preserve this on stack, restore afterwards + ; To clear the window, two zeropage long pointers will be used: + ; - M65_LPNT_SCR for screen memory + ; - M65_LPNT_KERN for colour memory (starts from $FF80000) ; XXX preserve this on stack, restore afterwards - // First initialize both pointers + ; First initialize both pointers - // XXX use m65_helper_scrlpnt_color and m65_helper_scrlpnt_to_screen instead + ; XXX use m65_helper_scrlpnt_color and m65_helper_scrlpnt_to_screen instead clc lda M65_COLVIEW+0 @@ -40,67 +40,67 @@ M65_CLRWIN: sta M65_LPNT_KERN+0 lda M65_COLVIEW+1 sta M65_LPNT_KERN+1 - // XXX deduplicate part below with M65_CLRSCR + ; XXX deduplicate part below with M65_CLRSCR lda #$F8 sta M65_LPNT_KERN+2 lda #$0F sta M65_LPNT_KERN+3 - // Go trough all the rows + ; Go trough all the rows phz ldy #$00 - // FALLTROUGH + ; FALLTROUGH m65_clrwin_loop: - // Check if .Y cordinate is not below the window + ; Check if .Y cordinate is not below the window cpy M65_TXTWIN_Y0 - bcc m65_clrwin_loop_next // branch if we should skip this row + bcc m65_clrwin_loop_next ; branch if we should skip this row - // Clear the row + ; Clear the row ldz M65_TXTWIN_X0 -!: +@1: lda #$20 - sta_lp (M65_LPNT_SCR),z + sta [M65_LPNT_SCR],z lda COLOR - sta_lp (M65_LPNT_KERN),z + sta [M65_LPNT_KERN],z inz cpz M65_TXTWIN_X1 - bne !- + bne @1 - // FALLTROUGH + ; FALLTROUGH m65_clrwin_loop_next: - // Increment M65_LPNT_SCR and M65_LPNT_KERN by the logical row length (always 80 = $50) + ; Increment M65_LPNT_SCR and M65_LPNT_KERN by the logical row length (always 80 = $50) clc lda #$50 adc M65_LPNT_SCR+0 sta M65_LPNT_SCR+0 - bcc !+ + bcc @2 inc M65_LPNT_SCR+1 -!: +@2: clc lda #$50 adc M65_LPNT_KERN+0 sta M65_LPNT_KERN+0 - bcc !+ + bcc @3 inc M65_LPNT_KERN+1 -!: - // Increment row counter, check if new row is valid +@3: + ; Increment row counter, check if new row is valid iny cpy M65_TXTWIN_Y1 bne m65_clrwin_loop plz - // Set screen variables + ; Set screen variables - // XXX implement this + ; XXX implement this rts diff --git a/src/kernal/screen_m65/mega65_cursor.s b/src/kernal/screen_m65/mega65_cursor.s index 3df29bf2..c5d20628 100644 --- a/src/kernal/screen_m65/mega65_cursor.s +++ b/src/kernal/screen_m65/mega65_cursor.s @@ -1,54 +1,54 @@ -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Variables used: -// - BLNSW (cursor blink switch) -// - BLNCT (cursor blink countdown) -// - GDBLN (cursor saved character) -// - BLNON (if cursor is visible) -// - GDCOL (colour under cursor) -// +; +; Variables used: +; - BLNSW (cursor blink switch) +; - BLNCT (cursor blink countdown) +; - GDBLN (cursor saved character) +; - BLNON (if cursor is visible) +; - GDCOL (colour under cursor) +; -m65_cursor_disable: // XXX utilize this! +m65_cursor_disable: ; XXX utilize this! - // Disable cursor blinking + ; Disable cursor blinking lda #$80 sta BLNSW - // FALLTHROUGH + ; FALLTHROUGH m65_cursor_hide_if_visible: - // Set countdown to high value, to prevent IRQ interference + ; Set countdown to high value, to prevent IRQ interference lda #$FF sta BLNCT - // If cursor is not visible, not much to do + ; If cursor is not visible, not much to do lda BLNON - beq_16 cursor_timer_reset + +beq cursor_timer_reset - // FALLTROUGH + ; FALLTROUGH m65_cursor_undraw: - // Preserve .Z + ; Preserve .Z phz - // Cursor undraw - color + ; Cursor undraw - color jsr m65_helper_scrlpnt_color ldz M65__TXTCOL lda GDCOL - sta_lp (M65_LPNT_SCR),z + sta [M65_LPNT_SCR],z - // Cursor undraw - character + ; Cursor undraw - character jsr m65_helper_scrlpnt_to_screen lda GDBLN - sta_lp (M65_LPNT_SCR),z + sta [M65_LPNT_SCR],z - // Restore .Z and continue as with normal editor + ; Restore .Z and continue as with normal editor plz jmp cursor_undraw_cont diff --git a/src/kernal/screen_m65/mega65_cursor_blink.s b/src/kernal/screen_m65/mega65_cursor_blink.s index 80fd31c8..e144b74a 100644 --- a/src/kernal/screen_m65/mega65_cursor_blink.s +++ b/src/kernal/screen_m65/mega65_cursor_blink.s @@ -1,33 +1,33 @@ -// #LAYOUT# M65 KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Variables used: -// - BLNSW (cursor blink switch) -// - BLNCT (cursor blink countdown) -// - GDBLN (cursor saved character) -// - BLNON (if cursor is visible) -// - GDCOL (colour under cursor) -// +; +; Variables used: +; - BLNSW (cursor blink switch) +; - BLNCT (cursor blink countdown) +; - GDBLN (cursor saved character) +; - BLNON (if cursor is visible) +; - GDCOL (colour under cursor) +; m65_cursor_blink: - // Preserve .Z + ; Preserve .Z phz - // Is the cursor enabled? + ; Is the cursor enabled? lda BLNSW bne m65_cursor_blink_end - // Do we need to redraw things? + ; Do we need to redraw things? dec BLNCT bpl m65_cursor_blink_end - // Prepare .Z for offset within row + ; Prepare .Z for offset within row ldz M65__TXTCOL - // Prepare long pointer to color memory + ; Prepare long pointer to color memory lda #$0F sta M65_LPNT_IRQ+3 lda #$F8 @@ -38,7 +38,7 @@ m65_cursor_blink: lda M65_COLVIEW+0 sta M65_LPNT_IRQ+0 - // Add screen row to the address + ; Add screen row to the address clc lda M65_TXTROW_OFF+0 adc M65_LPNT_IRQ+0 @@ -47,38 +47,38 @@ m65_cursor_blink: adc M65_LPNT_IRQ+1 sta M65_LPNT_IRQ+1 - // Check if cursor was visible or not, and toggle + ; Check if cursor was visible or not, and toggle lda BLNON bne m65_cursor_blink_undraw - // FALLTROUGH + ; FALLTROUGH m65_cursor_blink_draw: lda #1 sta BLNON - // Cursor draw - color - lda_lp (M65_LPNT_IRQ),z + ; Cursor draw - color + lda [M65_LPNT_IRQ],z sta GDCOL lda COLOR - and #$0F // take current colour, but not extended attributes - sta_lp (M65_LPNT_IRQ),z + and #$0F ; take current colour, but not extended attributes + sta [M65_LPNT_IRQ],z - // Cursor draw - character + ; Cursor draw - character jsr m65_cursor_blink_irqpnt_to_screen - lda_lp (M65_LPNT_IRQ),z + lda [M65_LPNT_IRQ],z sta GDBLN eor #$80 - sta_lp (M65_LPNT_IRQ),z + sta [M65_LPNT_IRQ],z m65_cursor_blink_timer_reset: - // Rest blink counter (Mapping the 64, p39-40) + ; Rest blink counter (Mapping the 64, p39-40) lda #20 sta BLNCT - // FALLTROUGH + ; FALLTROUGH m65_cursor_blink_end: @@ -87,17 +87,17 @@ m65_cursor_blink_end: m65_cursor_blink_undraw: - // Cursor undraw - color + ; Cursor undraw - color lda GDCOL - sta_lp (M65_LPNT_IRQ),z + sta [M65_LPNT_IRQ],z - // Cursor undraw - character + ; Cursor undraw - character jsr m65_cursor_blink_irqpnt_to_screen lda GDBLN - sta_lp (M65_LPNT_IRQ),z + sta [M65_LPNT_IRQ],z - // Mark cursor as not drawn + ; Mark cursor as not drawn lda #0 sta BLNON - jmp_8 m65_cursor_blink_timer_reset + bra m65_cursor_blink_timer_reset diff --git a/src/kernal/screen_m65/mega65_screen_helpers.s b/src/kernal/screen_m65/mega65_screen_helpers.s index a8192463..5baad989 100644 --- a/src/kernal/screen_m65/mega65_screen_helpers.s +++ b/src/kernal/screen_m65/mega65_screen_helpers.s @@ -1,5 +1,5 @@ -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE m65_screen_clear_colorattr: @@ -24,7 +24,7 @@ m65_screen_upd_txtrow_off: m65_screen_dmasrcdst_screen: - // Set screen memory as start/end addresses + ; Set screen memory as start/end addresses lda M65_SCRBASE+0 sta M65_DMAJOB_SRC_0 @@ -36,7 +36,11 @@ m65_screen_dmasrcdst_screen: sta M65_DMAJOB_SRC_2 sta M65_DMAJOB_DST_2 lda M65_SCRSEG+1 -!: + + ; FALLTROUGH + +m65_screen_dmasrcdst_screen_cont: + sta M65_DMAJOB_SRC_3 sta M65_DMAJOB_DST_3 @@ -45,7 +49,7 @@ m65_screen_dmasrcdst_screen: m65_screen_dmasrcdst_color: - // Set color memory as start/end addresses + ; Set color memory as start/end addresses lda #$00 sta M65_DMAJOB_SRC_0 @@ -56,7 +60,7 @@ m65_screen_dmasrcdst_color: sta M65_DMAJOB_SRC_2 sta M65_DMAJOB_DST_2 lda #$0F - jmp_8 !- + bra m65_screen_dmasrcdst_screen_cont m65_screen_dmasrc_add_row: @@ -65,7 +69,7 @@ m65_screen_dmasrc_add_row: lda M65_DMAJOB_SRC_0 adc #$50 sta M65_DMAJOB_SRC_0 - bcc !+ + bcc @1 inc M65_DMAJOB_SRC_1 -!: +@1: rts diff --git a/src/kernal/screen_m65/mega65_screen_helpers_K0.s b/src/kernal/screen_m65/mega65_screen_helpers_K0.s index edcd9382..f6597b3c 100644 --- a/src/kernal/screen_m65/mega65_screen_helpers_K0.s +++ b/src/kernal/screen_m65/mega65_screen_helpers_K0.s @@ -1,30 +1,30 @@ -// #LAYOUT# M65 KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Set the INDX variable - logical row length -// +; +; Set the INDX variable - logical row length +; -m65_screen_set_indx: // leaves value in .A +m65_screen_set_indx: ; leaves value in .A lda M65_SCRWINMODE - bmi !+ + bmi @1 - // Non-windowed mode + ; Non-windowed mode phx ldx M65_SCRMODE lda m65_scrtab_txtwidth,x - dec_a + dec sta INDX plx rts -!: - // Windowed mode +@1: + ; Windowed mode sec lda M65_TXTWIN_X1 sbc M65_TXTWIN_X0 - dec_a + dec sta INDX rts diff --git a/src/kernal/screen_m65/mega65_screen_helpers_irq.s b/src/kernal/screen_m65/mega65_screen_helpers_irq.s index a5e851a2..75f6d674 100644 --- a/src/kernal/screen_m65/mega65_screen_helpers_irq.s +++ b/src/kernal/screen_m65/mega65_screen_helpers_irq.s @@ -1,10 +1,10 @@ -// #LAYOUT# M65 KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE m65_cursor_blink_irqpnt_to_screen: - // Adapt pointer to point to screen memory + ; Adapt pointer to point to screen memory lda M65_SCRSEG+1 sta M65_LPNT_IRQ+3 diff --git a/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s b/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s index 31630d11..82f016bb 100644 --- a/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s +++ b/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s @@ -1,10 +1,10 @@ -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE m65_helper_scrlpnt_color: - // Setting M65_LPNT_SCR to point to colour memory (starts from $FF80000) + ; Setting M65_LPNT_SCR to point to colour memory (starts from $FF80000) lda #$0F sta M65_LPNT_SCR+3 @@ -16,7 +16,7 @@ m65_helper_scrlpnt_color: lda M65_COLVIEW+0 sta M65_LPNT_SCR+0 - // Add screen row to the address + ; Add screen row to the address clc lda M65_TXTROW_OFF+0 @@ -32,7 +32,7 @@ m65_helper_scrlpnt_color: m65_helper_scrlpnt_to_screen: - // Change M65_LPNT_SCR to point to screen memory (when it points to color memory) + ; Change M65_LPNT_SCR to point to screen memory (when it points to color memory) clc lda M65_SCRBASE+0 @@ -42,7 +42,7 @@ m65_helper_scrlpnt_to_screen: adc M65_LPNT_SCR+1 sta M65_LPNT_SCR+1 - // FALLTROUGH + ; FALLTROUGH m65_helper_scrlpnt_to_screen_hi: @@ -57,11 +57,11 @@ m65_helper_scrlpnt_to_screen_hi: m65_helper_scrlpnt_chrin: - // Prepare the pointer for CHRIN + ; Prepare the pointer for CHRIN lda M65__SCRINPUT+0 sta M65_LPNT_SCR+0 lda M65__SCRINPUT+1 sta M65_LPNT_SCR+1 - jmp_8 m65_helper_scrlpnt_to_screen_hi + bra m65_helper_scrlpnt_to_screen_hi diff --git a/src/kernal/screen_m65/mega65_screen_quote.s b/src/kernal/screen_m65/mega65_screen_quote.s index 7e89455c..2ca64d13 100644 --- a/src/kernal/screen_m65/mega65_screen_quote.s +++ b/src/kernal/screen_m65/mega65_screen_quote.s @@ -1,23 +1,22 @@ +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE - -// -// CHROUT routine - screen support, control codes in quote mode, MEGA65 native mode version -// +; +; CHROUT routine - screen support, control codes in quote mode, MEGA65 native mode version +; m65_chrout_screen_quote: - // Low control codes are just +$80 + ; Low control codes are just +$80 clc adc #$80 - // If it overflowed, then it is a high control code, - // so we need to make it be $80 + $40 + char - // as we will have flipped back to just $00 + char, we should - // now add $c0 if C is set from overflow - bcc !+ - adc #$BF // C=1, so adding $BF + C = add $C0 -!: + ; If it overflowed, then it is a high control code, + ; so we need to make it be $80 + $40 + char + ; as we will have flipped back to just $00 + char, we should + ; now add $c0 if C is set from overflow + bcc @1 + adc #$BF ; C=1, so adding $BF + C = add $C0 +@1: jmp m65_chrout_screen_literal diff --git a/src/kernal/screen_m65/mega65_screen_table_height.s b/src/kernal/screen_m65/mega65_screen_table_height.s index 7c531313..d7503930 100644 --- a/src/kernal/screen_m65/mega65_screen_table_height.s +++ b/src/kernal/screen_m65/mega65_screen_table_height.s @@ -1,9 +1,9 @@ -// #LAYOUT# M65 KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -m65_scrtab_txtheight: // height of the text screen +m65_scrtab_txtheight: ; height of the text screen - .byte 25 - .byte 25 - .byte 50 + !byte 25 + !byte 25 + !byte 50 diff --git a/src/kernal/screen_m65/mega65_screen_table_width.s b/src/kernal/screen_m65/mega65_screen_table_width.s index 1a9a5850..2ac37b62 100644 --- a/src/kernal/screen_m65/mega65_screen_table_width.s +++ b/src/kernal/screen_m65/mega65_screen_table_width.s @@ -1,9 +1,9 @@ -// #LAYOUT# M65 KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -m65_scrtab_txtwidth: // width of the text screen (logical width is always set to 80) +m65_scrtab_txtwidth: ; width of the text screen (logical width is always set to 80) - .byte 40 - .byte 80 - .byte 80 + !byte 40 + !byte 80 + !byte 80 diff --git a/src/kernal/screen_m65/mega65_screen_tables_misc.s b/src/kernal/screen_m65/mega65_screen_tables_misc.s index 10c14d36..f0f6b684 100644 --- a/src/kernal/screen_m65/mega65_screen_tables_misc.s +++ b/src/kernal/screen_m65/mega65_screen_tables_misc.s @@ -1,114 +1,110 @@ -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -m65_scrtab_vic_ctrlb: // parameters for VIC control register B +m65_scrtab_vic_ctrlb: ; parameters for VIC control register B - .byte %00100000 // 40x25 + extended attributes - .byte %10100000 // 80x25 + extended attributes - .byte %10101000 // 80x50 + extended attributes + !byte %00100000 ; 40x25 + extended attributes + !byte %10100000 ; 80x25 + extended attributes + !byte %10101000 ; 80x50 + extended attributes -m65_scrtab_colviewmax_lo: // maximum allowed color viewport start - low byte +m65_scrtab_colviewmax_lo: ; maximum allowed color viewport start - low byte - .byte <((MEMCONF_SCRROWS - 25) * 80) - .byte <((MEMCONF_SCRROWS - 25) * 80) - .byte <((MEMCONF_SCRROWS - 50) * 80) + !byte <((MEMCONF_SCRROWS - 25) * 80) + !byte <((MEMCONF_SCRROWS - 25) * 80) + !byte <((MEMCONF_SCRROWS - 50) * 80) -m65_scrtab_colviewmax_hi: // maximum allowed color viewport start - high byte +m65_scrtab_colviewmax_hi: ; maximum allowed color viewport start - high byte - .byte >((MEMCONF_SCRROWS - 25) * 80) - .byte >((MEMCONF_SCRROWS - 25) * 80) - .byte >((MEMCONF_SCRROWS - 50) * 80) + !byte >((MEMCONF_SCRROWS - 25) * 80) + !byte >((MEMCONF_SCRROWS - 25) * 80) + !byte >((MEMCONF_SCRROWS - 50) * 80) -m65_scrtab_scrolx: // values for VIC_SCROLX +m65_scrtab_scrolx: ; values for VIC_SCROLX - .byte $C8 - .byte $CA - .byte $CA + !byte $C8 + !byte $CA + !byte $CA -m65_scrtab_rowoffset_lo: // row offsets - low bytes +m65_scrtab_rowoffset_lo: ; row offsets - low bytes - .byte <(80 * 0), <(80 * 1), <(80 * 2), <(80 * 3), <(80 * 4), <(80 * 5), <(80 * 6), <(80 * 7), <(80 * 8), <(80 * 9) - .byte <(80 * 10), <(80 * 11), <(80 * 12), <(80 * 13), <(80 * 14), <(80 * 15), <(80 * 16), <(80 * 17), <(80 * 18), <(80 * 19) - .byte <(80 * 20), <(80 * 21), <(80 * 22), <(80 * 23), <(80 * 24), <(80 * 25), <(80 * 26), <(80 * 27), <(80 * 28), <(80 * 29) - .byte <(80 * 30), <(80 * 31), <(80 * 32), <(80 * 33), <(80 * 34), <(80 * 35), <(80 * 36), <(80 * 37), <(80 * 38), <(80 * 39) - .byte <(80 * 40), <(80 * 41), <(80 * 42), <(80 * 43), <(80 * 44), <(80 * 45), <(80 * 46), <(80 * 47), <(80 * 48), <(80 * 49) + !byte <(80 * 0), <(80 * 1), <(80 * 2), <(80 * 3), <(80 * 4), <(80 * 5), <(80 * 6), <(80 * 7), <(80 * 8), <(80 * 9) + !byte <(80 * 10), <(80 * 11), <(80 * 12), <(80 * 13), <(80 * 14), <(80 * 15), <(80 * 16), <(80 * 17), <(80 * 18), <(80 * 19) + !byte <(80 * 20), <(80 * 21), <(80 * 22), <(80 * 23), <(80 * 24), <(80 * 25), <(80 * 26), <(80 * 27), <(80 * 28), <(80 * 29) + !byte <(80 * 30), <(80 * 31), <(80 * 32), <(80 * 33), <(80 * 34), <(80 * 35), <(80 * 36), <(80 * 37), <(80 * 38), <(80 * 39) + !byte <(80 * 40), <(80 * 41), <(80 * 42), <(80 * 43), <(80 * 44), <(80 * 45), <(80 * 46), <(80 * 47), <(80 * 48), <(80 * 49) -m65_scrtab_rowoffset_hi: // row offsets - high bytes +m65_scrtab_rowoffset_hi: ; row offsets - high bytes - .byte >(80 * 0), >(80 * 1), >(80 * 2), >(80 * 3), >(80 * 4), >(80 * 5), >(80 * 6), >(80 * 7), >(80 * 8), >(80 * 9) - .byte >(80 * 10), >(80 * 11), >(80 * 12), >(80 * 13), >(80 * 14), >(80 * 15), >(80 * 16), >(80 * 17), >(80 * 18), >(80 * 19) - .byte >(80 * 20), >(80 * 21), >(80 * 22), >(80 * 23), >(80 * 24), >(80 * 25), >(80 * 26), >(80 * 27), >(80 * 28), >(80 * 29) - .byte >(80 * 30), >(80 * 31), >(80 * 32), >(80 * 33), >(80 * 34), >(80 * 35), >(80 * 36), >(80 * 37), >(80 * 38), >(80 * 39) - .byte >(80 * 40), >(80 * 41), >(80 * 42), >(80 * 43), >(80 * 44), >(80 * 45), >(80 * 46), >(80 * 47), >(80 * 48), >(80 * 49) + !byte >(80 * 0), >(80 * 1), >(80 * 2), >(80 * 3), >(80 * 4), >(80 * 5), >(80 * 6), >(80 * 7), >(80 * 8), >(80 * 9) + !byte >(80 * 10), >(80 * 11), >(80 * 12), >(80 * 13), >(80 * 14), >(80 * 15), >(80 * 16), >(80 * 17), >(80 * 18), >(80 * 19) + !byte >(80 * 20), >(80 * 21), >(80 * 22), >(80 * 23), >(80 * 24), >(80 * 25), >(80 * 26), >(80 * 27), >(80 * 28), >(80 * 29) + !byte >(80 * 30), >(80 * 31), >(80 * 32), >(80 * 33), >(80 * 34), >(80 * 35), >(80 * 36), >(80 * 37), >(80 * 38), >(80 * 39) + !byte >(80 * 40), >(80 * 41), >(80 * 42), >(80 * 43), >(80 * 44), >(80 * 45), >(80 * 46), >(80 * 47), >(80 * 48), >(80 * 49) -// Jumptable for screen control codes support. To improve performance, should be sorted -// starting from the least probable routine. +; Jumptable for screen control codes support. To improve performance, should be sorted +; starting from the least probable routine. m65_chrout_screen_jumptable_codes: - .byte KEY_CLR - .byte KEY_HOME - .byte KEY_C65_SHIFT_OFF - .byte KEY_C65_SHIFT_ON - .byte KEY_TXT - .byte KEY_GFX - .byte KEY_RVS_OFF - .byte KEY_RVS_ON - .byte KEY_CRSR_RIGHT - .byte KEY_CRSR_LEFT - .byte KEY_CRSR_DOWN - .byte KEY_CRSR_UP - .byte KEY_TAB - .byte KEY_LINE_FEED - .byte KEY_UNDERLINE_ON - .byte KEY_UNDERLINE_OFF - .byte KEY_FLASHING_ON - .byte KEY_FLASHING_OFF - .byte KEY_TAB_SET_CLR - .byte KEY_ESC - .byte KEY_BELL + !byte KEY_CLR + !byte KEY_HOME + !byte KEY_C65_SHIFT_OFF + !byte KEY_C65_SHIFT_ON + !byte KEY_TXT + !byte KEY_GFX + !byte KEY_RVS_OFF + !byte KEY_RVS_ON + !byte KEY_CRSR_RIGHT + !byte KEY_CRSR_LEFT + !byte KEY_CRSR_DOWN + !byte KEY_CRSR_UP + !byte KEY_TAB + !byte KEY_LINE_FEED + !byte KEY_UNDERLINE_ON + !byte KEY_UNDERLINE_OFF + !byte KEY_FLASHING_ON + !byte KEY_FLASHING_OFF + !byte KEY_TAB_SET_CLR + !byte KEY_ESC + !byte KEY_BELL __m65_chrout_screen_jumptable_quote_guard: - .byte KEY_INS - .byte KEY_STOP - .byte KEY_DEL - .byte KEY_RETURN + !byte KEY_INS + !byte KEY_STOP + !byte KEY_DEL + !byte KEY_RETURN __m65_chrout_screen_jumptable_codes_end: -.const m65_chrout_list = List().add( - - m65_chrout_screen_CLR, - m65_chrout_screen_HOME, - m65_chrout_screen_SHIFT_OFF, - m65_chrout_screen_SHIFT_ON, - m65_chrout_screen_TXT, - m65_chrout_screen_GFX, - m65_chrout_screen_RVS_OFF, - m65_chrout_screen_RVS_ON, - m65_chrout_screen_CRSR_RIGHT, - m65_chrout_screen_CRSR_LEFT, - m65_chrout_screen_CRSR_DOWN, - m65_chrout_screen_CRSR_UP, - m65_chrout_screen_TAB, - m65_chrout_screen_LINE_FEED, - m65_chrout_screen_UNDERLINE_ON, - m65_chrout_screen_UNDERLINE_OFF, - m65_chrout_screen_FLASHING_ON, - m65_chrout_screen_FLASHING_OFF, - m65_chrout_screen_TAB_SET_CLR, - m65_chrout_screen_ESC, - m65_chrout_screen_BELL, - m65_chrout_screen_INS, - m65_chrout_screen_STOP, - m65_chrout_screen_DEL, - m65_chrout_screen_RETURN -) - m65_chrout_screen_jumptable: - // Note: 65C02 has the page boundary vector bug fixed! - put_jumptable(m65_chrout_list) + ; Note: 65C02 has the page boundary vector bug fixed! + + !word m65_chrout_screen_CLR + !word m65_chrout_screen_HOME + !word m65_chrout_screen_SHIFT_OFF + !word m65_chrout_screen_SHIFT_ON + !word m65_chrout_screen_TXT + !word m65_chrout_screen_GFX + !word m65_chrout_screen_RVS_OFF + !word m65_chrout_screen_RVS_ON + !word m65_chrout_screen_CRSR_RIGHT + !word m65_chrout_screen_CRSR_LEFT + !word m65_chrout_screen_CRSR_DOWN + !word m65_chrout_screen_CRSR_UP + !word m65_chrout_screen_TAB + !word m65_chrout_screen_LINE_FEED + !word m65_chrout_screen_UNDERLINE_ON + !word m65_chrout_screen_UNDERLINE_OFF + !word m65_chrout_screen_FLASHING_ON + !word m65_chrout_screen_FLASHING_OFF + !word m65_chrout_screen_TAB_SET_CLR + !word m65_chrout_screen_ESC + !word m65_chrout_screen_BELL + !word m65_chrout_screen_INS + !word m65_chrout_screen_STOP + !word m65_chrout_screen_DEL + !word m65_chrout_screen_RETURN diff --git a/src/kernal/screen_m65/mega65_scrmodeget.s b/src/kernal/screen_m65/mega65_scrmodeget.s index b541aa37..39498701 100644 --- a/src/kernal/screen_m65/mega65_scrmodeget.s +++ b/src/kernal/screen_m65/mega65_scrmodeget.s @@ -1,10 +1,10 @@ -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Output: -// .A - current screen mode -// +; +; Output: +; .A - current screen mode +; M65_SCRMODEGET: diff --git a/src/kernal/screen_m65/mega65_scrmodeset.s b/src/kernal/screen_m65/mega65_scrmodeset.s index 51edf6cd..b060e736 100644 --- a/src/kernal/screen_m65/mega65_scrmodeset.s +++ b/src/kernal/screen_m65/mega65_scrmodeset.s @@ -1,48 +1,48 @@ -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Input: -// - .A - desired screen mode -// -// Output: -// - Carry set = unsupported screen mode -// - Carry clear = screen mode switched correctly -// +; +; Input: +; - .A - desired screen mode +; +; Output: +; - Carry set = unsupported screen mode +; - Carry clear = screen mode switched correctly +; M65_SCRMODESET: cmp #$03 - bcs m65_scrmodeset_rts // branch if unsupported screen mode + bcs m65_scrmodeset_rts ; branch if unsupported screen mode - // Preserve .X, move desired mode to .X, disable interrupts + ; Preserve .X, move desired mode to .X, disable interrupts phx sei - // Perform the switch + ; Perform the switch jsr m65_scrmodeset_internal - // Re-enable interrupts, restore .X + ; Re-enable interrupts, restore .X cli plx - // FALLTROUGH + ; FALLTROUGH m65_scrmodeset_rts: rts -m65_scrmodeset_internal: // entry point for M65_MODE65 +m65_scrmodeset_internal: ; entry point for M65_MODE65 - // Store desired screen mode + ; Store desired screen mode sta M65_SCRMODE - // Set flags/variables for 40/80 columns and 25/50 rows + ; Set flags/variables for 40/80 columns and 25/50 rows tax @@ -55,28 +55,28 @@ m65_scrmodeset_internal: // entry point for M65_MODE65 jsr viciv_hotregs_off - // Set the logical row length to 80 + ; Set the logical row length to 80 ldx #$50 stx VIC_CHARSTEP+0 ldx #$00 stx VIC_CHARSTEP+1 - // Set the following locations: - // - M65_SCRWINMODE - for scroll-console mode - // - M65_SCRSEG, VIC_SCRNPTR+2/+3 - for screen in $0001xxxx area + ; Set the following locations: + ; - M65_SCRWINMODE - for scroll-console mode + ; - M65_SCRSEG, VIC_SCRNPTR+2/+3 - for screen in $0001xxxx area - stx M65_SCRWINMODE // .X = 0 + stx M65_SCRWINMODE ; .X = 0 stx M65_SCRSEG+1 stx VIC_SCRNPTR+3 inx stx M65_SCRSEG+0 stx VIC_SCRNPTR+2 - // Set the following locations: - // - M65_SCRBASE - for screen starting from $xxxx9000 - // - VIC_SCRNPTR+0/+1 - for screen viewport start - // - M65_COLVIEW, VIC_COLPTR - for using color memory from the start + ; Set the following locations: + ; - M65_SCRBASE - for screen starting from $xxxx9000 + ; - VIC_SCRNPTR+0/+1 - for screen viewport start + ; - M65_COLVIEW, VIC_COLPTR - for using color memory from the start ldx #>MEMCONF_SCRBASE stx M65_SCRBASE+1 @@ -91,8 +91,8 @@ m65_scrmodeset_internal: // entry point for M65_MODE65 stx VIC_COLPTR+0 stx VIC_COLPTR+1 - // Set the following location: - // - VIC_CHARPTR - for character generator location + ; Set the following location: + ; - VIC_CHARPTR - for character generator location lda #normal takeover - -#endif +load_tape_normal_takeover: ; entry point for turbo->normal takeover +} jsr load_MEMUSS_to_STAL - // Try to load header into tape buffer (we will restore MEMUSS later) + ; Try to load header into tape buffer (we will restore MEMUSS later) jsr tape_normal_get_pilot_header -#if CONFIG_TAPE_AUTODETECT - bcs load_tape_normal_switch_turbo // failed, try turbo -#endif +!ifdef CONFIG_TAPE_AUTODETECT { + bcs load_tape_normal_switch_turbo ; failed, try turbo +} jsr load_TAPE1_to_MEMUSS jsr tape_normal_get_data_1 -#if !CONFIG_TAPE_AUTODETECT - bcs load_tape_normal_header // unable to read block, try again -#else - bcc !+ +!ifndef CONFIG_TAPE_AUTODETECT { + bcs load_tape_normal_header ; unable to read block, try again +} else { + bcc load_tape_normal_switch_turbo_skip load_tape_normal_switch_turbo: jsr lvs_STAL_to_MEMUSS - jmp load_tape_turbo_takeover // unable to read block, try turbo instead -!: -#endif + jmp load_tape_turbo_takeover ; unable to read block, try turbo instead +load_tape_normal_switch_turbo_skip: +} jsr load_TAPE1_to_MEMUSS jsr tape_normal_get_data_2 -#if !CONFIG_TAPE_AUTODETECT - bcs load_tape_normal_header // block load error, try again -#else - bcs load_tape_normal_switch_turbo // block load error, try turbo instead -#endif +!ifndef CONFIG_TAPE_AUTODETECT { + bcs load_tape_normal_header ; block load error, try again +} else { + bcs load_tape_normal_switch_turbo ; block load error, try turbo instead +} - // Check header type + ; Check header type ldy #$00 lda (TAPE1),y cmp #$05 - beq_16 tape_load_error // end of tape mark, nothing to load + +beq tape_load_error ; end of tape mark, nothing to load cmp #$01 - beq !+ + beq @1 cmp #$03 -#if !CONFIG_TAPE_AUTODETECT - bne load_tape_normal_header // header types 1 and 3 are loadable, see Mapping the C64, page 77 -#else +!ifndef CONFIG_TAPE_AUTODETECT { + bne load_tape_normal_header ; header types 1 and 3 are loadable, see Mapping the C64, page 77 +} else { bne load_tape_normal_takeover -#endif +} lda #$01 - sta SA // this file is non-relocatable; override secondary address with 1 -!: - // Restore MEMUSS, handle header + sta SA ; this file is non-relocatable; override secondary address with 1 +@1: + ; Restore MEMUSS, handle header jsr lvs_STAL_to_MEMUSS jsr tape_handle_header -#if !CONFIG_TAPE_AUTODETECT - bcs load_tape_normal_header // if name does not match, look for other header -#else +!ifndef CONFIG_TAPE_AUTODETECT { + bcs load_tape_normal_header ; if name does not match, look for other header +} else { bcs load_tape_normal_takeover -#endif +} - // FALLTROUGH + ; FALLTROUGH load_tape_normal_payload: - // Retrieve data + ; Retrieve data jsr tape_normal_get_pilot_data - ldy #$00 // no data size limit + ldy #$00 ; no data size limit jsr tape_normal_get_data_1 - bcs_16 tape_load_error + +bcs tape_load_error jsr lvs_check_EAL - bne_16 tape_load_error // amount of data read does not match header info + +bne tape_load_error ; amount of data read does not match header info jsr lvs_STAL_to_MEMUSS jsr tape_normal_get_data_2 - bcs_16 tape_load_error + +bcs tape_load_error jmp tape_load_success -load_TAPE1_to_MEMUSS: // set MEMUSS (start address) as tape buffer +load_TAPE1_to_MEMUSS: ; set MEMUSS (start address) as tape buffer lda TAPE1+1 sta MEMUSS+1 @@ -151,7 +150,7 @@ load_TAPE1_to_MEMUSS: // set MEMUSS (start address) as tape bu rts -load_MEMUSS_to_STAL: // preserve MEMUSS +load_MEMUSS_to_STAL: ; preserve MEMUSS lda MEMUSS+1 sta STAL+1 @@ -159,6 +158,4 @@ load_MEMUSS_to_STAL: // preserve MEMUSS sta STAL+0 rts - - -#endif +} diff --git a/src/kernal/tape/load_tape_turbo.s b/src/kernal/tape/load_tape_turbo.s index fe20438e..c4f08877 100644 --- a/src/kernal/tape/load_tape_turbo.s +++ b/src/kernal/tape/load_tape_turbo.s @@ -1,75 +1,73 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tape (turbo) part of the LOAD routine -// +; +; Tape (turbo) part of the LOAD routine +; -// Initially based on routine by enthusi/Onslaught, found here: -// - https://codebase64.pokefinder.org/doku.php?id=base:turbotape_loader_source -// but heavily reworked since then. Still, original authors deserve credits! +; Initially based on routine by enthusi/Onslaught, found here: +; - https://codebase64.pokefinder.org/doku.php?id=base:turbotape_loader_source +; but heavily reworked since then. Still, original authors deserve credits! -#if CONFIG_TAPE_TURBO +!ifdef CONFIG_TAPE_TURBO { -#if !CONFIG_TAPE_AUTODETECT +!ifndef CONFIG_TAPE_AUTODETECT { load_tape_turbo: -#else +} else { load_tape_auto: +} -#endif + jsr tape_ditch_verify ; only LOAD is supported, no VERIFY - jsr tape_ditch_verify // only LOAD is supported, no VERIFY - - // Prepare for sound effects + ; Prepare for sound effects jsr tape_clean_sid - // Start playing + ; Start playing jsr tape_common_prepare_cia jsr tape_ask_play -#if CONFIG_TAPE_HEAD_ALIGN +!ifdef CONFIG_TAPE_HEAD_ALIGN { jsr tape_prepare_reading -#endif +} - // FALLTROUGH + ; FALLTROUGH -#if CONFIG_TAPE_AUTODETECT +!ifdef CONFIG_TAPE_AUTODETECT { -load_tape_turbo_takeover: // entry point for normal->turbo takeover +load_tape_turbo_takeover: ; entry point for normal->turbo takeover jsr tape_common_autodetect - bcc_16 load_tape_normal_takeover + +bcc load_tape_normal_takeover +} -#endif - - // FALLTROUGH + ; FALLTROUGH load_tape_turbo_header: - // Read file header; structure described here: - // - https://www.luigidifraia.com/c64/docs/tapeloaders.html#turbotape64 - // - // 1 byte - file type (0 = data, odd value = relocatable, even value = non-relocatable) - // 2 bytes - start address - // 2 bytes - end address + 1 - // 1 byte - if $B0 (tape timing) contained at the time of saving - // (we skip this one to match normal system header) - // 16 bytes - filename, padded with 0x20 + ; Read file header; structure described here: + ; - https://www.luigidifraia.com/c64/docs/tapeloaders.html#turbotape64 + ; + ; 1 byte - file type (0 = data, odd value = relocatable, even value = non-relocatable) + ; 2 bytes - start address + ; 2 bytes - end address + 1 + ; 1 byte - if $B0 (tape timing) contained at the time of saving + ; (we skip this one to match normal system header) + ; 16 bytes - filename, padded with 0x20 jsr tape_turbo_sync_header -#if CONFIG_TAPE_AUTODETECT - bcs_16 load_tape_normal_takeover // failure, probably not a turbo tape file -#endif +!ifdef CONFIG_TAPE_AUTODETECT { + +bcs load_tape_normal_takeover ; failure, probably not a turbo tape file +} ldy #$00 - sta (TAPE1), y // store header type + sta (TAPE1), y ; store header type iny - // FALLTROUGH + ; FALLTROUGH load_tape_turbo_header_loop: @@ -77,85 +75,83 @@ load_tape_turbo_header_loop: sta (TAPE1), y iny cpy #$05 - bne !+ - jsr tape_turbo_get_byte // tape timing - skip this one -!: - cpy #$C0 // header is 192 bytes long in total + bne @1 + jsr tape_turbo_get_byte ; tape timing - skip this one +@1: + cpy #$C0 ; header is 192 bytes long in total bne load_tape_turbo_header_loop - // For non-relocatable files, override secondary address - ldy #$00 // XXX optimize out for 65C02 + ; For non-relocatable files, override secondary address + ldy #$00 ; XXX optimize out for 65C02 lda (TAPE1), y - beq !+ + beq @2 and #$01 - bne !+ - lda #$01 // XXX for 65C02 just set the bit with one instruction + bne @2 + lda #$01 ; XXX for 65C02 just set the bit with one instruction sta SA -!: - // Handle the header +@2: + ; Handle the header jsr tape_clean_sid jsr tape_handle_header - bcs load_tape_turbo_header // if name does not match, look for other header + bcs load_tape_turbo_header ; if name does not match, look for other header - // FALLTROUGH + ; FALLTROUGH load_tape_turbo_payload: - // Copy helper byte store routine to RAM, provide default memory mapping + ; Copy helper byte store routine to RAM, provide default memory mapping ldx #(__tape_turbo_bytestore_size - 1) -!: +@3: lda tape_turbo_bytestore_source, x sta __tape_turbo_bytestore, x dex - bpl !- + bpl @3 lda CPU_R6510 sta __tape_turbo_bytestore_defmap - // Initial checksum value + ; Initial checksum value lda #$00 sta PRTY - // Read file payload -!: + ; Read file payload +@4: jsr tape_turbo_sync_payload -#if CONFIG_TAPE_AUTODETECT - bcs !- -#endif +!ifdef CONFIG_TAPE_AUTODETECT { + bcs @4 +} - // FALLTROUGH + ; FALLTROUGH load_tape_turbo_loop: jsr tape_turbo_get_byte - jsr __tape_turbo_bytestore // like 'sta (MEMUSS),y' - but under I/O + jsr __tape_turbo_bytestore ; like 'sta (MEMUSS),y' - but under I/O - eor PRTY // handle checksum + eor PRTY ; handle checksum sta PRTY - // Advance MEMUSS (see Mapping the C64, page 36) -#if !HAS_OPCODES_65CE02 + ; Advance MEMUSS (see Mapping the C64, page 36) +!ifndef HAS_OPCODES_65CE02 { jsr lvs_advance_MEMUSS -#else +} else { inw MEMUSS+0 -#endif +} jsr lvs_check_EAL bne load_tape_turbo_loop - // Get the checksum + ; Get the checksum jsr tape_turbo_get_byte tax - // Silence audio + ; Silence audio jsr tape_clean_sid - // Verify the checksum + ; Verify the checksum cpx PRTY - beq_16 tape_load_success + +beq tape_load_success jmp tape_load_error - - -#endif // CONFIG_TAPE_TURBO +} diff --git a/src/kernal/tape/tape_common.s b/src/kernal/tape/tape_common.s index 4b896671..761927e0 100644 --- a/src/kernal/tape/tape_common.s +++ b/src/kernal/tape/tape_common.s @@ -1,18 +1,18 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Common routines for tape support -// +; +; Common routines for tape support +; -#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO +!ifdef HAS_TAPE { -// -// Loading terminated by user -// +; +; Loading terminated by user +; tape_break_error: @@ -22,31 +22,30 @@ tape_break_error: jmp kernalerror_ROUTINE_TERMINATED -// -// Ask user to press PLAY on tape deck, -// Unless user cancelled loading, blank screen and start motor -// +; +; Ask user to press PLAY on tape deck, +; Unless user cancelled loading, blank screen and start motor +; tape_ask_play: -#if !CONFIG_TAPE_NO_KEY_SENSE +!ifndef CONFIG_TAPE_NO_KEY_SENSE { - // First check whether the button is already pressed + ; First check whether the button is already pressed lda CPU_R6510 and #$10 beq tape_wait_play_done +} -#endif - - // Display message + ; Display message ldx #__MSG_KERNAL_PRESS_PLAY jsr print_kernal_message - // FALLTROUGH + ; FALLTROUGH -#if !CONFIG_TAPE_NO_KEY_SENSE +!ifndef CONFIG_TAPE_NO_KEY_SENSE { tape_wait_play_loop: @@ -54,122 +53,118 @@ tape_wait_play_loop: bcs tape_break_error lda CPU_R6510 - and #$10 // check for pressed button + and #$10 ; check for pressed button bne tape_wait_play_loop - // FALLTROUGH + ; FALLTROUGH -#else +} else { - // The ROM is configured for tape adapter without the key sense - but it is still - // possible, that regular Datasette or Tapuino is connected + ; The ROM is configured for tape adapter without the key sense - but it is still + ; possible, that regular Datasette or Tapuino is connected lda CPU_R6510 and #$10 - beq tape_wait_first_pulse // branch if button reported pressed, most likely really no key sense + beq tape_wait_first_pulse ; branch if button reported pressed, most likely really no key sense - // We have key sense - perform regular waiting -!: + ; We have key sense - perform regular waiting +@1: jsr STOP bcs tape_break_error lda CPU_R6510 and #$10 - beq !- + beq @1 tape_wait_first_pulse: - // We have no key sense - so just turn the motor on and wait for the first pulse + ; We have no key sense - so just turn the motor on and wait for the first pulse jsr tape_motor_on -!: +@2: jsr STOP bcs tape_break_error lda #$10 - bit CIA1_ICR // $DC0D - bne !- -!: + bit CIA1_ICR ; $DC0D + bne @2 +@3: jsr STOP bcs tape_break_error lda #$10 - bit CIA1_ICR // $DC0D - beq !- + bit CIA1_ICR ; $DC0D + beq @3 +} -#endif - - // FALLTROUGH + ; FALLTROUGH tape_wait_play_done: lda #$01 - sta CAS1 // set the interlock + sta CAS1 ; set the interlock -#if CONFIG_TAPE_HEAD_ALIGN +!ifdef CONFIG_TAPE_HEAD_ALIGN { rts tape_prepare_reading: -#endif // CONFIG_TAPE_HEAD_ALIGN +} ; CONFIG_TAPE_HEAD_ALIGN -#if CONFIG_MB_MEGA_65 +!ifdef CONFIG_MB_M65 { - // Display confirmation + ; Display confirmation ldx #__MSG_KERNAL_OK_SEARCHING jsr print_kernal_message +} -#endif - - // Prepare for reading + ; Prepare for reading jsr print_return jmp tape_screen_off_motor_on -// -// Handle file header - display it, decide whether load the file or not, etc. -// +; +; Handle file header - display it, decide whether load the file or not, etc. +; tape_handle_header: -#if !CONFIG_TAPE_NO_MOTOR_CONTROL +!ifndef CONFIG_TAPE_NO_MOTOR_CONTROL { jsr tape_screen_on_motor_off +} -#endif - - // Print FOUND + file name + ; Print FOUND + file name ldx #__MSG_KERNAL_FOUND jsr print_kernal_message ldy #$05 -!: +@4: lda (TAPE1), y jsr JCHROUT iny cpy #$15 - bne !- + bne @4 -#if !CONFIG_TAPE_NO_MOTOR_CONTROL +!ifndef CONFIG_TAPE_NO_MOTOR_CONTROL { - // Header, wait for user decision + ; Header, wait for user decision jsr tape_header_get_decision bcs tape_break_error +} -#endif - - // Check if file name matches + ; Check if file name matches jsr tape_match_filename bcs tape_handle_header_skip - // Setup STAL and EAL + ; Setup STAL and EAL ldy #$01 lda (TAPE1), y @@ -187,12 +182,12 @@ tape_handle_header: lda (TAPE1), y sta EAL+1 - // Handle the secondary address, 0 means loading to location from MEMUSS + ; Handle the secondary address, 0 means loading to location from MEMUSS lda SA - bne !+ + bne @5 - // EAL = EAL - STAL + ; EAL = EAL - STAL sec lda EAL+0 @@ -202,14 +197,14 @@ tape_handle_header: sbc STAL+1 sta EAL+1 - // STAL = MEMUSS + ; STAL = MEMUSS lda MEMUSS+0 sta STAL+0 lda MEMUSS+1 sta STAL+1 - // EAL = EAL + STAL + ; EAL = EAL + STAL clc lda EAL+0 @@ -218,36 +213,34 @@ tape_handle_header: lda EAL+1 adc STAL+1 sta EAL+1 -!: - // Setup MEMUSS (see Mapping the C64, page 36) +@5: + ; Setup MEMUSS (see Mapping the C64, page 36) jsr lvs_STAL_to_MEMUSS -#if ROM_LAYOUT_M65 +!ifdef CONFIG_MB_M65 { - // Switch to legacy mode if needed + ; Switch to legacy mode if needed jsr m65_load_autoswitch_tape +} -#endif - - // Print LOADING and start address + ; Print LOADING and start address jsr lvs_display_loading_verifying - // FALLTROUGH + ; FALLTROUGH -#if !CONFIG_TAPE_NO_MOTOR_CONTROL +!ifndef CONFIG_TAPE_NO_MOTOR_CONTROL { tape_handle_header_displayed: - // Load the file + ; Load the file jsr tape_screen_off_motor_on - // FALLTROUGH - -#endif + ; FALLTROUGH +} tape_return_ok: @@ -256,12 +249,12 @@ tape_return_ok: tape_handle_header_skip: - // Skip this file + ; Skip this file jsr print_return jsr tape_screen_off_motor_on - // FALLTROUGH + ; FALLTROUGH tape_return_not_ok: @@ -269,24 +262,24 @@ tape_return_not_ok: rts -// -// Check whether file name matches the pattern -// +; +; Check whether file name matches the pattern +; tape_match_filename: lda FNLEN - beq tape_return_ok // no pattern to match + beq tape_return_ok ; no pattern to match ldy #$00 tape_match_loop: - lda #$20 // default byte, for padding + lda #$20 ; default byte, for padding cpy FNLEN - bcs !+ // end of pattern - lda (FNADDR), y // byte from pattern -!: + bcs @6 ; end of pattern + lda (FNADDR), y ; byte from pattern +@6: cmp #KEY_ASTERISK beq tape_return_ok @@ -311,31 +304,31 @@ tape_match_loop: rts -#if !CONFIG_TAPE_NO_MOTOR_CONTROL +!ifndef CONFIG_TAPE_NO_MOTOR_CONTROL { -// -// Get user decision whether to load the file or not -// +; +; Get user decision whether to load the file or not +; tape_header_get_decision: ldy #$00 -!: +@7: jsr udtim_keyboard lda STKEY - bpl tape_header_wait_stop // STOP pressed + bpl tape_header_wait_stop ; STOP pressed and #$10 - beq tape_header_wait_space // SPACE pressed + beq tape_header_wait_space ; SPACE pressed ldx #$80 - jsr wait_x_bars // sets .X to 0 + jsr wait_x_bars ; sets .X to 0 dex jsr wait_x_bars dey - bne !- + bne @7 - // FALLTROUGH - timeout + ; FALLTROUGH - timeout tape_header_wait_space: @@ -346,13 +339,12 @@ tape_header_wait_stop: sec rts - -#endif +} -// -// Report that file loading succeeded (or not) -// +; +; Report that file loading succeeded (or not) +; tape_load_success: @@ -364,6 +356,4 @@ tape_load_error: jsr tape_screen_on_motor_off jmp lvs_load_verify_error - - -#endif +} \ No newline at end of file diff --git a/src/kernal/tape/tape_common_autodetect.s b/src/kernal/tape/tape_common_autodetect.s index bad0c45e..0a592b5e 100644 --- a/src/kernal/tape/tape_common_autodetect.s +++ b/src/kernal/tape/tape_common_autodetect.s @@ -1,92 +1,92 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tries to detect -// -// Carry clear - normal, Carry set - turbo -// +; +; Tries to detect +; +; Carry clear - normal, Carry set - turbo +; -#if CONFIG_TAPE_AUTODETECT +!ifdef CONFIG_TAPE_AUTODETECT { tape_common_autodetect: - // Set screen color to something neutral, silence the audio + ; Set screen color to something neutral, silence the audio lda #$0B sta VIC_EXTCOL lda #$00 -#if CONFIG_MB_MEGA_65 +!ifdef CONFIG_MB_M65 { sta SID_SIGVOL + __SID_R1_OFFSET sta SID_SIGVOL + __SID_L1_OFFSET -#else +} else { sta SID_SIGVOL -#endif +} - // FALLTROUGH + ; FALLTROUGH tape_common_autodetect_retry: - // It is not trivial to distinguish between normal and turbo, - // as short pulses of normal (and sync uses only shorts) - // have similar lengths as long pulses of turbo + ; It is not trivial to distinguish between normal and turbo, + ; as short pulses of normal (and sync uses only shorts) + ; have similar lengths as long pulses of turbo - // Thus, the routine here reads certain amount of pulses - // looking for evidence for either normal or turbo system; - // in case of no evidence found, assume normal + ; Thus, the routine here reads certain amount of pulses + ; looking for evidence for either normal or turbo system; + ; in case of no evidence found, assume normal - lda #$00 // plus = probably normal, minus = turbo + lda #$00 ; plus = probably normal, minus = turbo sta XSAV - ldy #$60 // $60 pulses cover 12 bytes of turbo recording - jsr tape_common_get_pulse // first pulse might be a garbage, ignore it + ldy #$60 ; $60 pulses cover 12 bytes of turbo recording + jsr tape_common_get_pulse ; first pulse might be a garbage, ignore it - // FALLTROUGH + ; FALLTROUGH tape_common_autodetect_loop: - jsr tape_common_get_pulse // read pulse for detection attempt + jsr tape_common_get_pulse ; read pulse for detection attempt - // If garbage found, retry detection + ; If garbage found, retry detection cmp #$28 - bcc tape_common_autodetect_retry // this is a VERY long pulse + bcc tape_common_autodetect_retry ; this is a VERY long pulse cmp #$E8 - bcs tape_common_autodetect_retry // this is a VERY short pulse + bcs tape_common_autodetect_retry ; this is a VERY short pulse - // First try to distinguish turbo short signal (reference: $CD) - // from normal signals (reference: $A5 or lower), these values - // give us threshold of ($CD + $A5) / 2 = $B9 + ; First try to distinguish turbo short signal (reference: $CD) + ; from normal signals (reference: $A5 or lower), these values + ; give us threshold of ($CD + $A5) / 2 = $B9 cmp #$B9 - bcc !+ - dec XSAV // above $B9 (so signal is shorter), looks like turbo -!: - // Now try to distinguish turbo signals (reference: $B1 or higher) - // from normal medium/long signals (reference: $7D or below), these values - // give us threshold of ($B1 + $7D) / 2 = $97 + bcc @1 + dec XSAV ; above $B9 (so signal is shorter), looks like turbo +@1: + ; Now try to distinguish turbo signals (reference: $B1 or higher) + ; from normal medium/long signals (reference: $7D or below), these values + ; give us threshold of ($B1 + $7D) / 2 = $97 cmp #$97 - bcs !+ + bcs @2 inc XSAV -!: - // The sync for turbo is not too long - if we have enough evidence, - // assume turbo recording already +@2: + ; The sync for turbo is not too long - if we have enough evidence, + ; assume turbo recording already lda XSAV cmp #$FD beq tape_common_autodetect_turbo - // Next iteration + ; Next iteration dey bpl tape_common_autodetect_loop - // Last chance for turbo + ; Last chance for turbo lda XSAV bmi tape_common_autodetect_turbo - // FALLTROUGH + ; FALLTROUGH tape_common_autodetect_normal: @@ -97,6 +97,4 @@ tape_common_autodetect_turbo: sec rts - - -#endif +} diff --git a/src/kernal/tape/tape_common_clean_sid.s b/src/kernal/tape/tape_common_clean_sid.s index 41083007..0c44d2bd 100644 --- a/src/kernal/tape/tape_common_clean_sid.s +++ b/src/kernal/tape/tape_common_clean_sid.s @@ -1,40 +1,38 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Clear the SID settings - for sound effects during LOAD -// +; +; Clear the SID settings - for sound effects during LOAD +; -#if CONFIG_TAPE_TURBO +!ifdef CONFIG_TAPE_TURBO { tape_clean_sid: lda #$00 ldy #$1C -!: +@1: -#if CONFIG_MB_MEGA_65 +!ifdef CONFIG_MB_M65 { - // It should be safer than cleaning whole $D400-D47C range + ; It should be safer than cleaning whole $D400-D47C range sta __SID_BASE + __SID_R1_OFFSET, y sta __SID_BASE + __SID_R2_OFFSET, y sta __SID_BASE + __SID_L1_OFFSET, y sta __SID_BASE + __SID_L2_OFFSET, y -#else +} else { sta __SID_BASE, y -#endif +} dey - bpl !- + bpl @1 rts - - -#endif +} \ No newline at end of file diff --git a/src/kernal/tape/tape_common_ditch_verify.s b/src/kernal/tape/tape_common_ditch_verify.s index b7d21d8a..65514982 100644 --- a/src/kernal/tape/tape_common_ditch_verify.s +++ b/src/kernal/tape/tape_common_ditch_verify.s @@ -1,24 +1,22 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Check if VERIFY asked - if yes, terminate loading -// +; +; Check if VERIFY asked - if yes, terminate loading +; -#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO +!ifdef HAS_TAPE { tape_ditch_verify: lda VERCKK - bne !+ + bne @1 rts -!: +@1: pla pla jmp lvs_device_not_found_error - - -#endif +} diff --git a/src/kernal/tape/tape_common_get_pulse.s b/src/kernal/tape/tape_common_get_pulse.s index 3cfccf75..00591f0e 100644 --- a/src/kernal/tape/tape_common_get_pulse.s +++ b/src/kernal/tape/tape_common_get_pulse.s @@ -1,33 +1,31 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tape helper routine - pulse reading -// -// Returns pulse length (with a bias, see comments) in .A -// +; +; Tape helper routine - pulse reading +; +; Returns pulse length (with a bias, see comments) in .A +; -#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO +!ifdef HAS_TAPE { tape_common_get_pulse: - // Contrary to original ROM implementation we do not use interrupts - // (see http://unusedino.de/ec64/technical/formats/tap.html) - busy wait - // implementation is probably just shorter + ; Contrary to original ROM implementation we do not use interrupts + ; (see http://unusedino.de/ec64/technical/formats/tap.html) - busy wait + ; implementation is probably just shorter lda #$10 -!: - bit CIA1_ICR // $DC0D - beq !- // busy loop to detect signal, restart timer afterwards - lda CIA2_TIMBLO // $DD06 - ldx #%01010001 // start timer, force latch reload, count timer A underflows - stx CIA2_CRB // $DD0F +@1: + bit CIA1_ICR ; $DC0D + beq @1 ; busy loop to detect signal, restart timer afterwards + lda CIA2_TIMBLO ; $DD06 + ldx #%01010001 ; start timer, force latch reload, count timer A underflows + stx CIA2_CRB ; $DD0F - cmp __pulse_threshold // default pulse check + cmp __pulse_threshold ; default pulse check rts - - -#endif +} diff --git a/src/kernal/tape/tape_common_motor.s b/src/kernal/tape/tape_common_motor.s index f88934da..dc6c9171 100644 --- a/src/kernal/tape/tape_common_motor.s +++ b/src/kernal/tape/tape_common_motor.s @@ -1,28 +1,30 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Handle tape deck motor -// +; +; Handle tape deck motor +; -#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO +!ifdef HAS_TAPE { tape_motor_off: lda CPU_R6510 ora #$20 - bne !+ // branch always + bne tape_motor_common ; branch always tape_motor_on: lda CPU_R6510 and #($FF - $20) -!: + + ; FALLTROUGH + +tape_motor_common: + sta CPU_R6510 rts - - -#endif +} diff --git a/src/kernal/tape/tape_common_prepare_cia.s b/src/kernal/tape/tape_common_prepare_cia.s index dd9eb3c5..d6977c05 100644 --- a/src/kernal/tape/tape_common_prepare_cia.s +++ b/src/kernal/tape/tape_common_prepare_cia.s @@ -1,65 +1,64 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Prepare CIA timers for tape reading -// +; +; Prepare CIA timers for tape reading +; -// -// Checked under VICE, PAL, average of 256 pulses: -// -// normal - short - timer goes down to $A5 -// normal - medium - timer goes down to $7D -// normal - long - timer goes down to $52 -// -// turbo - short - timer goes down to $CD -// turbo - long - timer goes down to $B1 -// -// -// Measurement subroutine: .A should contain timer value, $C000-$C002 zeroed -// -// clc -// adc $C001 -// sta $C001 -// bcc !+ -// inc $C000 -// !: -// inc $C002 -// beq !+ -// rts -// !: -// lda $C000 -// .break // .A contains our average -// rts -// +; +; Checked under VICE, PAL, average of 256 pulses: +; +; normal - short - timer goes down to $A5 +; normal - medium - timer goes down to $7D +; normal - long - timer goes down to $52 +; +; turbo - short - timer goes down to $CD +; turbo - long - timer goes down to $B1 +; +; +; Measurement subroutine: .A should contain timer value, $C000-$C002 zeroed +; +; clc +; adc $C001 +; sta $C001 +; bcc !+ +; inc $C000 +; !: +; inc $C002 +; beq !+ +; rts +; !: +; lda $C000 +; .break ; .A contains our average +; rts +; -#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO +!ifdef HAS_TAPE { tape_common_prepare_cia: - // Setup CIA #2 timers + ; Setup CIA #2 timers - ldx #$03 // set timer A to 4 ticks + ldx #$03 ; set timer A to 4 ticks - // FALLTROUGH + ; FALLTROUGH -tape_common_prepare_cia_by_x: // entry point for head align tool +tape_common_prepare_cia_by_x: ; entry point for head align tool - stx CIA2_TIMALO // $DD04 + stx CIA2_TIMALO ; $DD04 ldx #$00 - stx CIA2_TIMAHI // $DD05 + stx CIA2_TIMAHI ; $DD05 - stx CIA2_TIMBHI // $DD07 - dex // puts $FF - for running timer B as long as possible - stx CIA2_TIMBLO // $DD06 + stx CIA2_TIMBHI ; $DD07 + dex ; puts $FF - for running timer B as long as possible + stx CIA2_TIMBLO ; $DD06 - // Let timer A run continuously + ; Let timer A run continuously - ldx #%00010001 // start timer, force latch reload - stx CIA2_CRA // $DD0E + ldx #%00010001 ; start timer, force latch reload + stx CIA2_CRA ; $DD0E rts - -#endif +} diff --git a/src/kernal/tape/tape_common_screen.s b/src/kernal/tape/tape_common_screen.s index 9aa968e8..a1636149 100644 --- a/src/kernal/tape/tape_common_screen.s +++ b/src/kernal/tape/tape_common_screen.s @@ -1,14 +1,14 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Handle screen (visible/blanked) + tape deck motor (on/off), -// store/restore screen color -// +; +; Handle screen (visible/blanked) + tape deck motor (on/off), +; store/restore screen color +; -#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO +!ifdef HAS_TAPE { @@ -19,46 +19,44 @@ tape_screen_on_motor_off: lda COLSTORE sta VIC_EXTCOL -#if !ROM_LAYOUT_M65 +!ifndef CONFIG_MB_M65 { jmp screen_on -#else +} else { jsr M65_MODEGET - bcs_16 screen_on // MEGA65 native mode does not have badlines, no need to enable/disable screen + +bcs screen_on ; MEGA65 native mode does not have badlines, no need to enable/disable screen rts - -#endif +} tape_screen_off_motor_on: - // We do not want interrupts and CHROUT reenables them + ; We do not want interrupts and CHROUT reenables them sei - // Clear keyboard buffer + ; Clear keyboard buffer lda #$00 sta NDX - // Set screen color + ; Set screen color lda VIC_EXTCOL sta COLSTORE -#if !ROM_LAYOUT_M65 +!ifndef CONFIG_MB_M65 { jsr screen_off -#else +} else { jsr M65_MODEGET - // XXX optimize this - bcs !+ // MEGA65 native mode does not have badlines, no need to enable/disable screen + ; XXX optimize this + bcs @1 ; MEGA65 native mode does not have badlines, no need to enable/disable screen jsr screen_off -!: +@1: -#endif +} jmp tape_motor_on - -#endif +} diff --git a/src/kernal/tape/tape_head_align.s b/src/kernal/tape/tape_head_align.s index 690c665b..12ce37ab 100644 --- a/src/kernal/tape/tape_head_align.s +++ b/src/kernal/tape/tape_head_align.s @@ -1,64 +1,64 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tape head alignemnt tool -// +; +; Tape head alignemnt tool +; -#if CONFIG_TAPE_HEAD_ALIGN +!ifdef CONFIG_TAPE_HEAD_ALIGN { -.label __ha_start = 12 // starting row of the chart -.label __ha_rows = 11 // number of rows for scrolling +!set __ha_start = 12 ; starting row of the chart +!set __ha_rows = 11 ; number of rows for scrolling -// Helper tables +; Helper tables -.label __ha_offsets = $1000; -.label __ha_masks = $1100; +!addr __ha_offsets = $1000; +!addr __ha_masks = $1100; -// Generated code location +; Generated code location -.label __ha_scroll = $1300; +!addr __ha_scroll = $1300; -// Flag for GFX effects - reuse BASIC numeric work area on zero page +; Flag for GFX effects - reuse BASIC numeric work area on zero page -.label __ha_gfxflag = TEMPF2; // 1 byte +!addr __ha_gfxflag = TEMPF2; ; 1 byte tape_head_align: - // Make sure user really wants to launch the tool + ; Make sure user really wants to launch the tool jsr tape_ask_play - // Disable interrupts, set proper I/O values + ; Disable interrupts, set proper I/O values jsr CLALL sei jsr IOINIT - // jsr CINT + ; jsr CINT jsr nmi_lock - // Prepare CIA timers + ; Prepare CIA timers - ldx #$02 // set timer A to 3 ticks + ldx #$02 ; set timer A to 3 ticks jsr tape_common_prepare_cia_by_x - ldx #$FF // timer to control scroll speed - stx CIA1_TIMBLO // $DC06 - stx CIA1_TIMBHI // $DC07 + ldx #$FF ; timer to control scroll speed + stx CIA1_TIMBLO ; $DC06 + stx CIA1_TIMBHI ; $DC07 jsr tape_motor_on - // Clear color data ($0800) + ; Clear color data ($0800) ldy #$00 -!: +@1: lda #(CONFIG_COLOR_TXT * $10 + CONFIG_COLOR_BG) sta $0800, y @@ -67,146 +67,146 @@ tape_head_align: sta $0B00, y iny - bne !- + bne @1 - // Clear bitmap data ($2000) + ; Clear bitmap data ($2000) lda #$20 sta SAL+1 - tya // put 0 to .A + tya ; put 0 to .A sta SAL+0 -!: +@2: sta (SAL), y iny - bne !- + bne @2 inc SAL+1 ldx SAL+1 cpx #$40 - bne !- + bne @2 - // Print help message + ; Print help message jsr tape_head_align_print_help - // Make sure the row where the chart is being created is not visible + ; Make sure the row where the chart is being created is not visible lda #(CONFIG_COLOR_TXT * $10 + CONFIG_COLOR_TXT) ldy #$24 -!: +@3: sta $0800 + __ha_start * 40 + 1, y sta $0800 + __ha_start * 40 + 1 + (__ha_rows + 1) * 40, y dey - bne !- + bne @3 - // Set graphics mode + ; Set graphics mode - lda #$28 // graphics start at $2000, color at $0800 + lda #$28 ; graphics start at $2000, color at $0800 sta VIC_YMCSB - lda #$3B // set bit 5 to enable graphic mode + lda #$3B ; set bit 5 to enable graphic mode sta VIC_SCROLY - // Prepare lookup tables - to speed drawing, we are going to use two of them: - // - byte offset table will tell us which byte in memory to alter - // - mask will allow us to quickly put the pixel + ; Prepare lookup tables - to speed drawing, we are going to use two of them: + ; - byte offset table will tell us which byte in memory to alter + ; - mask will allow us to quickly put the pixel - ldx #$00 // loop index - ldy #$00 // temporary value for mask calculation -!: - // Byte offset is simple, just zero the 3 least significant bits + ldx #$00 ; loop index + ldy #$00 ; temporary value for mask calculation +@4: + ; Byte offset is simple, just zero the 3 least significant bits txa and #%11111000 sta __ha_offsets, x - // Mask changes with each iteration, use our temporary value in .Y + ; Mask changes with each iteration, use our temporary value in .Y tya clc ror - bne !+ + bne @5 lda #%10000000 -!: +@5: tay sta __ha_masks, x - // Next iteration + ; Next iteration inx - bne !-- + bne @4 - // Initialize flag for additional GFX effects + ; Initialize flag for additional GFX effects - stx __ha_gfxflag // .X is 0 at this moment + stx __ha_gfxflag ; .X is 0 at this moment - // Generate helper code for screen scrolling + ; Generate helper code for screen scrolling jsr tape_head_align_gen_code - // Provide new IRQ routine address + ; Provide new IRQ routine address lda #tape_head_align_irq sta CINV+1 - // Setup raster interrupt routine - see https://www.c64-wiki.com/wiki/Raster_interrupt + ; Setup raster interrupt routine - see https://www.c64-wiki.com/wiki/Raster_interrupt - lda #%01111111 // prevent CIA from generating interrupts - sta CIA1_ICR // $DC0D + lda #%01111111 ; prevent CIA from generating interrupts + sta CIA1_ICR ; $DC0D - and VIC_SCROLY // clear the highest bit of RASTER - sta VIC_SCROLY // $D011 + and VIC_SCROLY ; clear the highest bit of RASTER + sta VIC_SCROLY ; $D011 - lda #$FB // we want no badlines during the interrupt, this raster is 100% safe + lda #$FB ; we want no badlines during the interrupt, this raster is 100% safe sta VIC_RASTER - lda #%00000001 // enable raster interrupts - sta VIC_IRQMSK // $D01A + lda #%00000001 ; enable raster interrupts + sta VIC_IRQMSK ; $D01A cli tape_head_align_loop_1: - // Check for STOP key + ; Check for STOP key jsr udtim_keyboard jsr STOP bcs tape_head_align_quit - // Launch the timer + ; Launch the timer - ldx #%00011001 // start timer, one-shot force latch reload, count system ticks - stx CIA1_CRB // $DC0F + ldx #%00011001 ; start timer, one-shot force latch reload, count system ticks + stx CIA1_CRB ; $DC0F - // Scroll the whole chart one line down + ; Scroll the whole chart one line down ldx #$00 -!: - jsr __ha_scroll // scroll one column down, using fast generated code +@6: + jsr __ha_scroll ; scroll one column down, using fast generated code txa clc adc #$08 tax - bne !- + bne @6 - // Draw decorations + ; Draw decorations lda __ha_gfxflag inc __ha_gfxflag clc adc #$08 and #%00001100 - bne !+ + bne @7 ldy #%11110001 lda #%10001111 - bne !++ -!: + bne @8 +@7: ldy #%00000001 lda #%10000000 -!: +@8: ora __ha_chart + 7 + 8 * 0 sta __ha_chart + 7 + 8 * 0 @@ -214,13 +214,13 @@ tape_head_align_loop_1: ora __ha_chart + 7 + 8 * 31 sta __ha_chart + 7 + 8 * 31 - // Draw helper lines + ; Draw helper lines lda __ha_gfxflag and #%00000010 - beq !+ + beq @9 - // For 'normal' + ; For 'normal' lda #%00000001 ora __ha_chart + 7 + 8 * 6 @@ -230,13 +230,13 @@ tape_head_align_loop_1: ora __ha_chart + 7 + 8 * 13 sta __ha_chart + 7 + 8 * 13 - // For 'turbo' + ; For 'turbo' lda #%00010000 ora __ha_chart + 7 + 8 * 21 sta __ha_chart + 7 + 8 * 21 -!: - // FALLTROUGH +@9: + ; FALLTROUGH tape_head_align_loop_2: @@ -250,18 +250,18 @@ tape_head_align_loop_2: tape_head_align_quit: - // It makes no sense to return to system, as we already destroyed - // a lot of memory; fust clear initial BASIC text area to prevent - // data recovery attempts, and reset + ; It makes no sense to return to system, as we already destroyed + ; a lot of memory; fust clear initial BASIC text area to prevent + ; data recovery attempts, and reset ldx #$00 txa -!: +@10: sta $0800, x inx - bne !- + bne @10 jmp hw_entry_reset -#endif // CONFIG_TAPE_HEAD_ALIGN +} ; CONFIG_TAPE_HEAD_ALIGN diff --git a/src/kernal/tape/tape_head_align_gen_code.s b/src/kernal/tape/tape_head_align_gen_code.s index f79b761a..30e4834a 100644 --- a/src/kernal/tape/tape_head_align_gen_code.s +++ b/src/kernal/tape/tape_head_align_gen_code.s @@ -1,31 +1,31 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tape head alignemnt tool - helper code generator -// +; +; Tape head alignemnt tool - helper code generator +; -#if CONFIG_TAPE_HEAD_ALIGN +!ifdef CONFIG_TAPE_HEAD_ALIGN { -// Helper variables - reuse BASIC numeric work area on zero page +; Helper variables - reuse BASIC numeric work area on zero page -.label __ha_lda_addr = TEMPF1 + 0; // 2 bytes, for code generator -.label __ha_sta_addr = TEMPF1 + 2; // 2 bytes, for code generator +!addr __ha_lda_addr = TEMPF1 + 0; ; 2 bytes, for code generator +!addr __ha_sta_addr = TEMPF1 + 2; ; 2 bytes, for code generator tape_head_align_gen_code: - // Setup generated code start address + ; Setup generated code start address lda #<__ha_scroll sta SAL+0 lda #>__ha_scroll sta SAL+1 - // Setup initial source and destination addresses + ; Setup initial source and destination addresses ldy #<(__ha_chart + __ha_rows * (8 * 40) + 6) sty __ha_lda_addr + 0 @@ -36,19 +36,19 @@ tape_head_align_gen_code: sty __ha_lda_addr + 1 sty __ha_sta_addr + 1 - // Emit code to move 7 rows of one 8x8 cell -!: + ; Emit code to move 7 rows of one 8x8 cell +@1: ldx #$07 -!: +@2: jsr tape_head_align_gen_code_emit_pair dec __ha_lda_addr + 0 dec __ha_sta_addr + 0 dex - bne !- + bne @2 - // Emit code to fetch a top row from the cell above + ; Emit code to fetch a top row from the cell above inc __ha_lda_addr + 0 sec @@ -62,7 +62,7 @@ tape_head_align_gen_code: jsr tape_head_align_gen_code_emit_pair - // Prepare addresses for the next iteration + ; Prepare addresses for the next iteration lda __ha_lda_addr + 0 sta __ha_sta_addr + 0 @@ -71,16 +71,16 @@ tape_head_align_gen_code: dec __ha_lda_addr + 0 - // Now, new iteration - if needed + ; Now, new iteration - if needed lda __ha_sta_addr + 0 cmp #<(__ha_chart + 7) - bne !-- + bne @1 lda __ha_sta_addr + 1 cmp #>(__ha_chart + 7) - bne !-- + bne @1 - // Last pair to be generated starts from LDA #$00 + ; Last pair to be generated starts from LDA #$00 lda #$A9 jsr tape_head_align_gen_code_emit_byte @@ -89,7 +89,7 @@ tape_head_align_gen_code: jsr tape_head_align_gen_code_emit_sta - // Emit RTS and quit + ; Emit RTS and quit lda #$60 jmp tape_head_align_gen_code_emit_byte @@ -98,7 +98,7 @@ tape_head_align_gen_code: tape_head_align_gen_code_emit_pair: - lda #$BD // LDA absolute, x + lda #$BD ; LDA absolute, x jsr tape_head_align_gen_code_emit_byte lda __ha_lda_addr + 0 @@ -106,33 +106,32 @@ tape_head_align_gen_code_emit_pair: lda __ha_lda_addr + 1 jsr tape_head_align_gen_code_emit_byte - // FALLTROUGH + ; FALLTROUGH tape_head_align_gen_code_emit_sta: - lda #$9D // STA absolute, x + lda #$9D ; STA absolute, x jsr tape_head_align_gen_code_emit_byte lda __ha_sta_addr + 0 jsr tape_head_align_gen_code_emit_byte lda __ha_sta_addr + 1 - // FALLTROUGH + ; FALLTROUGH tape_head_align_gen_code_emit_byte: ldy #$00 sta (SAL), y -#if HAS_OPCODES_65CE02 +!ifdef HAS_OPCODES_65CE02 { inw SAL -#else +} else { inc SAL+0 - bne !+ + bne @3 inc SAL+1 -!: -#endif - +@3: +} rts -#endif // CONFIG_TAPE_HEAD_ALIGN +} ; CONFIG_TAPE_HEAD_ALIGN diff --git a/src/kernal/tape/tape_head_align_get_pulse.s b/src/kernal/tape/tape_head_align_get_pulse.s index 71b22e8e..df1cacd4 100644 --- a/src/kernal/tape/tape_head_align_get_pulse.s +++ b/src/kernal/tape/tape_head_align_get_pulse.s @@ -1,45 +1,45 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tape head alignemnt tool - reading pulses from tape -// +; +; Tape head alignemnt tool - reading pulses from tape +; -#if CONFIG_TAPE_HEAD_ALIGN +!ifdef CONFIG_TAPE_HEAD_ALIGN { tape_head_align_get_pulse: - // This routine differs from the one used to read pulse during tape reading: - // - it is not as precise - // - it terminates when timer reaches $FF - // - it returns value in .Y + ; This routine differs from the one used to read pulse during tape reading: + ; - it is not as precise + ; - it terminates when timer reaches $FF + ; - it returns value in .Y lda #$10 -!: - // Loop to detect signal +@1: + ; Loop to detect signal - ldy CIA2_TIMBLO // $DD06 - bit CIA1_ICR // $DC0D - bne !+ + ldy CIA2_TIMBLO ; $DD06 + bit CIA1_ICR ; $DC0D + bne @2 cpy #$FF - bne !- -!: - // FALLTROUGH + bne @1 +@2: + ; FALLTROUGH tape_head_align_get_pulse_start_timer: - // Start timer again, force latch reload, count timer A underflows + ; Start timer again, force latch reload, count timer A underflows lda #%01010001 - sta CIA2_CRB // $DD0F + sta CIA2_CRB ; $DD0F - // Return with time elapsed in .Y + ; Return with time elapsed in .Y rts -#endif // CONFIG_TAPE_HEAD_ALIGN +} ; CONFIG_TAPE_HEAD_ALIGN diff --git a/src/kernal/tape/tape_head_align_help.s b/src/kernal/tape/tape_head_align_help.s index a7115363..243dab12 100644 --- a/src/kernal/tape/tape_head_align_help.s +++ b/src/kernal/tape/tape_head_align_help.s @@ -1,35 +1,35 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tape head alignemnt tool - prints out a help message on screen -// +; +; Tape head alignemnt tool - prints out a help message on screen +; -#if CONFIG_TAPE_HEAD_ALIGN +!ifdef CONFIG_TAPE_HEAD_ALIGN { -// Helper variable - reuse BASIC numeric work area on zero page +; Helper variable - reuse BASIC numeric work area on zero page -.label __ha_storage = TEMPF1; // 1 byte +!addr __ha_storage = TEMPF1; ; 1 byte tape_head_align_print_help: - // Make screen font visible + ; Make screen font visible lda CPU_R6510 pha and #%11111011 sta CPU_R6510 - // Print help message + ; Print help message ldy #$00 - // Retrieve address -!: + ; Retrieve address +@1: lda tape_head_align_help_text, y iny cmp #$FF @@ -39,24 +39,24 @@ tape_head_align_print_help: lda tape_head_align_help_text, y iny sta EAL+1 -!: - // Retrieve and print character +@2: + ; Retrieve and print character lda tape_head_align_help_text, y iny cmp #$FF - beq !-- + beq @1 sty __ha_storage jsr tape_head_align_print_char ldy __ha_storage - bne !- // branch alwats + bne @2 ; branch alwats tape_head_align_print_end: - // Restore normal memory configuration and quit + ; Restore normal memory configuration and quit pla sta CPU_R6510 @@ -68,7 +68,7 @@ tape_head_align_print_string: tape_head_align_print_char: - // Calculate start address of character in .A + ; Calculate start address of character in .A sta SAL+0 lda #$00 @@ -86,62 +86,57 @@ tape_head_align_print_char: adc #$D0 sta SAL+1 - // Print out the character + ; Print out the character ldy #$07 -!: +@3: lda (SAL), y sta (EAL), y dey - bpl !- + bpl @3 - // Prepare EAL for the next character + ; Prepare EAL for the next character lda EAL+0 clc adc #$08 sta EAL+0 - bne !+ + bne @4 inc EAL+1 -!: +@4: rts -// -// Strings to print -// - -.encoding "screencode_upper" - +; +; Strings to print +; tape_head_align_help_text: - // Each string consists of: - // - destination (start byte) address - // - text in screencodes - // - $FF to mark end + ; Each string consists of: + ; - destination (start byte) address + ; - text in screencodes + ; - $FF to mark end - .word $2000 + (40 * 8) * 0 + 8 * 1 - .text "COMPUTER HAS TO TELL THE SIGNALS APART" - .byte $FF + !word $2000 + (40 * 8) * 0 + 8 * 1 + !scr "computer has to tell the signals apart" + !byte $FF - .word $2000 + (40 * 8) * 3 + 8 * 6 - .text "ALIGN HEAD FOR MINIMUM NOISE" - .byte $FF + !word $2000 + (40 * 8) * 3 + 8 * 6 + !scr "align head for minimum noise" + !byte $FF - .word $2000 + (40 * 8) * 6 + 8 * 2 - .text "IF THE DECK HAS A PITCH (TAPE SPEED)" - .byte $FF + !word $2000 + (40 * 8) * 6 + 8 * 2 + !scr "if the deck has a pitch (tape speed)" + !byte $FF - .word $2000 + (40 * 8) * 7 + 8 * 1 - .text "CONTROL, TWEAK IT SO THAT DOTTED LINES" - .byte $FF + !word $2000 + (40 * 8) * 7 + 8 * 1 + !scr "control, tweak it so that dotted lines" + !byte $FF - .word $2000 + (40 * 8) * 8 + 8 * 5 - .text "ARE HALF A WAY BETWEEN SIGNALS" - .byte $FF + !word $2000 + (40 * 8) * 8 + 8 * 5 + !scr "are half a way between signals" + !byte $FF - .byte $FF // end of strings - - -#endif + !byte $FF ; end of strings +} diff --git a/src/kernal/tape/tape_head_align_irq.s b/src/kernal/tape/tape_head_align_irq.s index 878041c6..0ff660c3 100644 --- a/src/kernal/tape/tape_head_align_irq.s +++ b/src/kernal/tape/tape_head_align_irq.s @@ -1,55 +1,55 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tape head alignemnt tool - interrupt routine -// +; +; Tape head alignemnt tool - interrupt routine +; -#if CONFIG_TAPE_HEAD_ALIGN +!ifdef CONFIG_TAPE_HEAD_ALIGN { tape_head_align_irq: - // Acknowledge interrupt + ; Acknowledge interrupt asl VIC_IRQ - // Ignore 2 first pulses, they can be garbage + ; Ignore 2 first pulses, they can be garbage jsr tape_head_align_get_pulse jsr tape_head_align_get_pulse - // Now, we can retrieve pulses for the chart + ; Now, we can retrieve pulses for the chart ldx #$00 - // FALLTROUGH + ; FALLTROUGH tape_head_align_irq_loop: jsr tape_head_align_get_pulse - // If we approached badlines again - we cannot use this measurement anymore + ; If we approached badlines again - we cannot use this measurement anymore lda VIC_SCROLY - bmi !+ // branch if lower border + bmi @1 ; branch if lower border lda VIC_RASTER - cmp #$33 // first line where badline can occur + cmp #$33 ; first line where badline can occur bcs tape_head_align_irq_end -!: - // Draw pulse on the screen +@1: + ; Draw pulse on the screen cpy #$FF - beq !+ + beq @2 - // Center the chart horizontaly, with some margin from top + ; Center the chart horizontaly, with some margin from top - .label __ha_chart = $2000 + 8 * (40 * __ha_start + 4) + !addr __ha_chart = $2000 + 8 * (40 * __ha_start + 4) - phx_trash_a + +phx_trash_a lda __ha_offsets, y tax @@ -57,19 +57,19 @@ tape_head_align_irq_loop: ora __ha_chart + 7, x sta __ha_chart + 7, x - plx_trash_a -!: - // Next iteration + +plx_trash_a +@2: + ; Next iteration inx cpx #$40 bne tape_head_align_irq_loop - // FALLTROUGH + ; FALLTROUGH tape_head_align_irq_end: jmp return_from_interrupt -#endif // CONFIG_TAPE_HEAD_ALIGN +} ; CONFIG_TAPE_HEAD_ALIGN diff --git a/src/kernal/tape/tape_normal_calibrate.s b/src/kernal/tape/tape_normal_calibrate.s index 71201c5c..6dca34dc 100644 --- a/src/kernal/tape/tape_normal_calibrate.s +++ b/src/kernal/tape/tape_normal_calibrate.s @@ -1,69 +1,69 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tape (normal) helper routine - reading speed calibration -// -// Needs pulse length in .A -// +; +; Tape (normal) helper routine - reading speed calibration +; +; Needs pulse length in .A +; -#if CONFIG_TAPE_NORMAL +!ifdef CONFIG_TAPE_NORMAL { -tape_normal_calibrate_during_pilot: // reecalibration during the pilot +tape_normal_calibrate_during_pilot: ; reecalibration during the pilot sta __normal_time_S - // We do not have any recent medium pulse measurement, - // probably the only solution is to estimate it + ; We do not have any recent medium pulse measurement, + ; probably the only solution is to estimate it lda #$FF sec sbc __normal_time_S - // We now have a difference from the starting point ($FF) + ; We now have a difference from the starting point ($FF) clc ror - sta __normal_time_M // this is temporary only! + sta __normal_time_M ; this is temporary only! - // We now have half the difference, substract it from - // short pulse measurement result + ; We now have half the difference, substract it from + ; short pulse measurement result lda __normal_time_S sec sbc __normal_time_M - // Add a small correction to gain $7D if starting from $A5. Dirty, ugly, - // and imprecise hack - but in real life should be good enough + ; Add a small correction to gain $7D if starting from $A5. Dirty, ugly, + ; and imprecise hack - but in real life should be good enough clc adc #$05 - sta __normal_time_M // estimated medium pulse length + sta __normal_time_M ; estimated medium pulse length jmp tape_normal_calibrate_common -tape_normal_calibrate_after_S: // recalibration after short pulse +tape_normal_calibrate_after_S: ; recalibration after short pulse sta __normal_time_S rts - skip_2_bytes_trash_nvz + +skip_2_bytes_trash_nvz - // FALLTROUGH + ; FALLTROUGH -tape_normal_calibrate_after_M: // recalibration after medium pulse +tape_normal_calibrate_after_M: ; recalibration after medium pulse sta __normal_time_M - // FALLTROUGH + ; FALLTROUGH tape_normal_calibrate_common: - // Now compare results with current threshold + ; Now compare results with current threshold lda __normal_time_S sec @@ -73,20 +73,20 @@ tape_normal_calibrate_common: cmp __pulse_threshold - beq tape_normal_calibrate_done // branch if no recalibration needed + beq tape_normal_calibrate_done ; branch if no recalibration needed - // Correct the thresholds (default is $91 for the S/M one) + ; Correct the thresholds (default is $91 for the S/M one) - bcs tape_normal_calibrate_threshold_inc // branch if .A >= memory + bcs tape_normal_calibrate_threshold_inc ; branch if .A >= memory - // FALLTROUGH + ; FALLTROUGH tape_normal_calibrate_threshold_dec: lda __pulse_threshold cmp #($91-10) - bcc tape_normal_calibrate_done // do not decrement thresholds too far + bcc tape_normal_calibrate_done ; do not decrement thresholds too far sec sbc #$02 @@ -97,14 +97,14 @@ tape_normal_calibrate_threshold_dec: sbc #$03 sta __pulse_threshold_ML - bne tape_normal_calibrate_done // branch always + bne tape_normal_calibrate_done ; branch always tape_normal_calibrate_threshold_inc: lda __pulse_threshold cmp #($91+11) - bcs tape_normal_calibrate_done // do not increment thresholds too far + bcs tape_normal_calibrate_done ; do not increment thresholds too far clc adc #$02 @@ -115,12 +115,10 @@ tape_normal_calibrate_threshold_inc: adc #$03 sta __pulse_threshold_ML - // FALLTROUGH + ; FALLTROUGH tape_normal_calibrate_done: rts - - -#endif +} diff --git a/src/kernal/tape/tape_normal_get_bit.s b/src/kernal/tape/tape_normal_get_bit.s index 96ab54d4..fd3b175d 100644 --- a/src/kernal/tape/tape_normal_get_bit.s +++ b/src/kernal/tape/tape_normal_get_bit.s @@ -1,25 +1,25 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tape (normal) helper routine - bit reading -// -// Returns bit in Zero flag, Carry set means error, on 0 bit .A is 0 too -// +; +; Tape (normal) helper routine - bit reading +; +; Returns bit in Zero flag, Carry set means error, on 0 bit .A is 0 too +; -#if CONFIG_TAPE_NORMAL +!ifdef CONFIG_TAPE_NORMAL { tape_normal_get_bit: - // Fetch the first pulse + ; Fetch the first pulse jsr tape_common_get_pulse bcc tape_normal_get_bit_1 - // First impulse was short, second should be medium + ; First impulse was short, second should be medium jsr tape_normal_calibrate_after_S @@ -28,11 +28,11 @@ tape_normal_get_bit: jsr tape_normal_calibrate_after_M - // We have a bit '0' + ; We have a bit '0' lda #$00 - // FALLTROUGH + ; FALLTROUGH tape_normal_get_bit_done: @@ -43,7 +43,7 @@ tape_normal_get_bit_done: tape_normal_get_bit_1: - // First impulse was medium, second should be short + ; First impulse was medium, second should be short jsr tape_normal_calibrate_after_M @@ -52,11 +52,11 @@ tape_normal_get_bit_1: jsr tape_normal_calibrate_after_S - // We have a bit '1' + ; We have a bit '1' clc lda #$06 - bne tape_normal_get_bit_done // branch always + bne tape_normal_get_bit_done ; branch always tape_normal_get_bit_error: @@ -65,4 +65,4 @@ tape_normal_get_bit_error: rts -#endif // CONFIG_TAPE_NORMAL +} ; CONFIG_TAPE_NORMAL diff --git a/src/kernal/tape/tape_normal_get_byte.s b/src/kernal/tape/tape_normal_get_byte.s index 35e18bec..35558dee 100644 --- a/src/kernal/tape/tape_normal_get_byte.s +++ b/src/kernal/tape/tape_normal_get_byte.s @@ -1,60 +1,60 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tape (normal) helper routine - byte reading -// -// Returns byte in .A (also sotred in INBIT), Carry flag set = error -// +; +; Tape (normal) helper routine - byte reading +; +; Returns byte in .A (also sotred in INBIT), Carry flag set = error +; -#if CONFIG_TAPE_NORMAL +!ifdef CONFIG_TAPE_NORMAL { tape_normal_get_byte: - // Init parity bit and canary bit + ; Init parity bit and canary bit lda #$01 sta PRTY - lda #%01111111 // canary bit is 0 + lda #%01111111 ; canary bit is 0 sta INBIT - // Now fetch individual bits + ; Now fetch individual bits tape_normal_get_byte_loop: jsr tape_normal_get_bit bcs tape_normal_get_byte_error - beq !+ + beq @1 - // Handle parity bit + ; Handle parity bit lda #$01 eor PRTY sta PRTY sec -!: // moved bit state from Zero to Carry flag +@1: ; moved bit state from Zero to Carry flag - ror INBIT // put the bit in - bcs tape_normal_get_byte_loop // loop if no canary bit reached + ror INBIT ; put the bit in + bcs tape_normal_get_byte_loop ; loop if no canary bit reached - // Byte retrieved (on stack), now we need to validate the parity + ; Byte retrieved (on stack), now we need to validate the parity jsr tape_normal_get_bit bcs tape_normal_get_byte_error - beq !+ + beq @2 lda #$01 -!: +@2: eor PRTY bne tape_normal_get_byte_error - // Checksum validated succesfully + ; Checksum validated succesfully ldx #$0B - // Carry already clear + ; Carry already clear - // FALLTROUGH + ; FALLTROUGH tape_normal_get_byte_done: @@ -66,8 +66,6 @@ tape_normal_get_byte_done: tape_normal_get_byte_error: ldx #$09 - sec // make sure Carry is set to indicate error + sec ; make sure Carry is set to indicate error bcs tape_normal_get_byte_done - - -#endif +} diff --git a/src/kernal/tape/tape_normal_get_data_1.s b/src/kernal/tape/tape_normal_get_data_1.s index 963fcea9..9d3e49fd 100644 --- a/src/kernal/tape/tape_normal_get_data_1.s +++ b/src/kernal/tape/tape_normal_get_data_1.s @@ -1,36 +1,36 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tape (normal) helper routine - data block (primary) reading -// -// Stores data starting from MEMUSS, Carry set means error, on 0 bit .A is 0 too -// .Y not equal to 0 - returns error if data block is longer (length includes checksum) +; +; Tape (normal) helper routine - data block (primary) reading +; +; Stores data starting from MEMUSS, Carry set means error, on 0 bit .A is 0 too +; .Y not equal to 0 - returns error if data block is longer (length includes checksum) -#if CONFIG_TAPE_NORMAL +!ifdef CONFIG_TAPE_NORMAL { tape_normal_get_data_1: - // Initialize checksum (RIPRTY, see http://sta.c64.org/cbm64mem.html) - // and pointers for error log and correction mechanism + ; Initialize checksum (RIPRTY, see http://sta.c64.org/cbm64mem.html) + ; and pointers for error log and correction mechanism lda #$00 sta RIPRTY sta PTR2 sta PTR1 - // FALLTROUGH + ; FALLTROUGH tape_normal_get_data_1_block: - // - // Read the 1st copy of the block - // + ; + ; Read the 1st copy of the block + ; - // Read sync of the block + ; Read sync of the block ldy #$89 jsr tape_normal_sync bcs tape_normal_get_data_1_fail @@ -41,11 +41,11 @@ tape_normal_get_data_1_loop: jsr tape_normal_get_byte bcc tape_normal_get_data_1_loop_byte_OK - // Problem reading a byte, try to add it to the error log + ; Problem reading a byte, try to add it to the error log tsx - cpx #$20 // just to be on a safe side - bcc tape_normal_get_data_1_fail // branch if no more space in error log + cpx #$20 ; just to be on a safe side + bcc tape_normal_get_data_1_fail ; branch if no more space in error log ldx PTR1 lda MEMUSS+0 @@ -56,7 +56,7 @@ tape_normal_get_data_1_loop: inx stx PTR1 - // Addres added to error log, check if this was a checksum + ; Addres added to error log, check if this was a checksum jsr tape_normal_get_marker bcc tape_normal_get_data_1_loop_advance bcs tape_normal_get_data_1_success @@ -64,33 +64,33 @@ tape_normal_get_data_1_loop: tape_normal_get_data_1_loop_byte_OK: jsr tape_normal_get_marker - bcc !+ + bcc @1 - // End of the block + ; End of the block jsr tape_normal_update_checksum jmp tape_normal_get_data_1_success -!: - // Store byte, calculate checksum +@1: + ; Store byte, calculate checksum lda INBIT ldy #$00 -#if ROM_LAYOUT_M65 +!ifdef CONFIG_MB_M65 { jsr tape_normal_byte_store -#else +} else { sta (MEMUSS), y -#endif +} jsr tape_normal_update_checksum - // FALLTROUGH + ; FALLTROUGH tape_normal_get_data_1_loop_advance: - // Advance pointer -#if !HAS_OPCODES_65CE02 + ; Advance pointer +!ifndef HAS_OPCODES_65CE02 { jsr lvs_advance_MEMUSS -#else +} else { inw MEMUSS+0 -#endif +} jmp tape_normal_get_data_1_loop @@ -104,6 +104,4 @@ tape_normal_get_data_1_fail: sec rts - - -#endif +} diff --git a/src/kernal/tape/tape_normal_get_data_2.s b/src/kernal/tape/tape_normal_get_data_2.s index 2b88c12c..9f5fffc1 100644 --- a/src/kernal/tape/tape_normal_get_data_2.s +++ b/src/kernal/tape/tape_normal_get_data_2.s @@ -1,77 +1,77 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tape (normal) helper routine - data block (backup) reading -// +; +; Tape (normal) helper routine - data block (backup) reading +; -#if CONFIG_TAPE_NORMAL +!ifdef CONFIG_TAPE_NORMAL { tape_normal_get_data_2: - // NOTE: Always read all the bytes fro second copy, to taht we stop - // at the moment when it is safe to start recording! + ; NOTE: Always read all the bytes fro second copy, to taht we stop + ; at the moment when it is safe to start recording! - // Read sync of the block + ; Read sync of the block ldy #$09 jsr tape_normal_sync - bcs tape_normal_get_data_2_done // Carry already set, will indicate error + bcs tape_normal_get_data_2_done ; Carry already set, will indicate error jsr tape_normal_get_marker - // FALLTROUGH + ; FALLTROUGH tape_normal_get_data_2_loop: - // Read missing bytes + ; Read missing bytes jsr tape_normal_get_byte bcc tape_normal_get_data_2_loop_byte_OK - // Problem reading a byte - just skip it + ; Problem reading a byte - just skip it bcs tape_normal_get_data_2_loop_advance tape_normal_get_data_2_loop_byte_OK: jsr load_cmp_log_MEMUSS - beq tape_normal_get_data_2_loop_from_log // branch if byte from the log + beq tape_normal_get_data_2_loop_from_log ; branch if byte from the log jsr tape_normal_get_marker - bcs tape_normal_get_data_2_log_checksum // branch if end of blocks + bcs tape_normal_get_data_2_log_checksum ; branch if end of blocks bcc tape_normal_get_data_2_loop_advance tape_normal_get_data_2_loop_from_log: - // This is a byte from the log + ; This is a byte from the log jsr tape_normal_get_marker - bcs !+ + bcs @1 lda INBIT ldy #$00 -#if ROM_LAYOUT_M65 +!ifdef CONFIG_MB_M65 { jsr tape_normal_byte_store -#else +} else { sta (MEMUSS), y -#endif -!: +} +@1: jsr tape_normal_update_checksum - // FALLTROUGH + ; FALLTROUGH tape_normal_get_data_2_loop_advance: - // Advance pointer -#if !HAS_OPCODES_65CE02 + ; Advance pointer +!ifndef HAS_OPCODES_65CE02 { jsr lvs_advance_MEMUSS -#else +} else { inw MEMUSS+0 -#endif +} jmp tape_normal_get_data_2_loop @@ -80,14 +80,14 @@ tape_normal_get_data_2_log_checksum: lda PTR1 cmp PTR2 - bne tape_normal_get_data_2_done // Carry already set + bne tape_normal_get_data_2_done ; Carry already set - // Validate checksum + ; Validate checksum lda RIPRTY - cmp #$01 // sets Carry if checksum verification fails + cmp #$01 ; sets Carry if checksum verification fails - // FALLTROUGH + ; FALLTROUGH tape_normal_get_data_2_done: @@ -99,19 +99,17 @@ load_cmp_log_MEMUSS: ldx PTR2 lda STACK+0, x cmp MEMUSS+0 - bne !+ + bne @2 lda STACK+1, x cmp MEMUSS+1 - bne !+ + bne @2 - // MEMUSS matches address from the log + ; MEMUSS matches address from the log inc PTR2 inc PTR2 - lda #$00 // to set Zero flag -!: + lda #$00 ; to set Zero flag +@2: rts - - -#endif +} diff --git a/src/kernal/tape/tape_normal_get_marker.s b/src/kernal/tape/tape_normal_get_marker.s index 350e8c49..b3f62525 100644 --- a/src/kernal/tape/tape_normal_get_marker.s +++ b/src/kernal/tape/tape_normal_get_marker.s @@ -1,17 +1,17 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tape (normal) helper routine - marker reading -// -// Reeturns marker type in Carry flag, set = end of data (normal marker) or failure (marker while sync) -// +; +; Tape (normal) helper routine - marker reading +; +; Reeturns marker type in Carry flag, set = end of data (normal marker) or failure (marker while sync) +; -#if CONFIG_TAPE_NORMAL +!ifdef CONFIG_TAPE_NORMAL { - // (L,M) - end of byte, (L,S) - end of data + ; (L,M) - end of byte, (L,S) - end of data tape_normal_get_marker: @@ -19,9 +19,9 @@ tape_normal_get_marker: jsr tape_common_get_pulse cmp __pulse_threshold_ML - bcs tape_normal_get_marker // too short for a long pulse + bcs tape_normal_get_marker ; too short for a long pulse - // FALLTROUGH + ; FALLTROUGH tape_normal_get_marker_type: @@ -29,21 +29,21 @@ tape_normal_get_marker_type: - // Not an entry point!!! -!: - jsr tape_normal_calibrate_during_pilot // while sync use short pulses for calibration + ; Not an entry point!!! - // FALLTROUGH +tape_normal_get_marker_while_sync_loop: + + jsr tape_normal_calibrate_during_pilot ; while sync use short pulses for calibration + + ; FALLTROUGH tape_normal_get_marker_while_sync: jsr tape_common_get_pulse - bcs !- // branch if short pulse + bcs tape_normal_get_marker_while_sync_loop ; branch if short pulse cmp __pulse_threshold_ML - bcs tape_normal_get_marker_while_sync // too short for a long pulse + bcs tape_normal_get_marker_while_sync ; too short for a long pulse - bcc tape_normal_get_marker_type // branch always - - -#endif + bcc tape_normal_get_marker_type ; branch always +} diff --git a/src/kernal/tape/tape_normal_get_pilot.s b/src/kernal/tape/tape_normal_get_pilot.s index fad10a1d..40be7e60 100644 --- a/src/kernal/tape/tape_normal_get_pilot.s +++ b/src/kernal/tape/tape_normal_get_pilot.s @@ -1,25 +1,25 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tape (turbo) helper routine - handling the pilot -// +; +; Tape (turbo) helper routine - handling the pilot +; -// Injest the pilot - series of short pulses. According to http://sidpreservation.6581.org/tape-format/ -// it consist of the following number of pulses: -// - $6A00 for header -// - $1A00 for data and seq block header -// - $4F for repeated header/data +; Injest the pilot - series of short pulses. According to http://sidpreservation.6581.org/tape-format/ +; it consist of the following number of pulses: +; - $6A00 for header +; - $1A00 for data and seq block header +; - $4F for repeated header/data -#if CONFIG_TAPE_NORMAL +!ifdef CONFIG_TAPE_NORMAL { -tape_normal_get_pilot_header: // entry point, reset calibration, require 128x $40 pulses +tape_normal_get_pilot_header: ; entry point, reset calibration, require 128x $40 pulses - // Reading the pilot header is the first action performed, - // thus start by setting default thresholds + ; Reading the pilot header is the first action performed, + ; thus start by setting default thresholds lda #$91 sta __pulse_threshold @@ -28,36 +28,36 @@ tape_normal_get_pilot_header: // entry point, reset calibration, requir lda #$80 -#if CONFIG_TAPE_AUTODETECT - ldy #$FF // marker: try to detect turbo +!ifdef CONFIG_TAPE_AUTODETECT { + ldy #$FF ; marker: try to detect turbo bmi tape_normal_get_pilot_header_cont -#else - skip_2_bytes_trash_nvz -#endif +} else { + +skip_2_bytes_trash_nvz +} - // FALLTROUGH + ; FALLTROUGH -tape_normal_get_pilot_data: // entry point, require 4x $40 pulses +tape_normal_get_pilot_data: ; entry point, require 4x $40 pulses lda #$04 - skip_2_bytes_trash_nvz + +skip_2_bytes_trash_nvz - // FALLTROUGH + ; FALLTROUGH -tape_normal_get_pilot_short: // entry point, require 1x $40 pulses +tape_normal_get_pilot_short: ; entry point, require 1x $40 pulses lda #$01 -#if CONFIG_TAPE_AUTODETECT - ldy #$00 // marker: do not try to detect turbo - // FALLTROUGH +!ifdef CONFIG_TAPE_AUTODETECT { + ldy #$00 ; marker: do not try to detect turbo + ; FALLTROUGH tape_normal_get_pilot_header_cont: sty INBIT -#else - skip_2_bytes_trash_nvz -#endif +} else { + +skip_2_bytes_trash_nvz +} - // FALLTROUGH + ; FALLTROUGH tape_normal_get_pilot_common: @@ -66,34 +66,34 @@ tape_normal_get_pilot_common: lda #$0B sta VIC_EXTCOL - // FALLTROUGH + ; FALLTROUGH tape_normal_get_pilot_common_restart: lda FSBLK sta ROPRTY - // FALLTROUGH + ; FALLTROUGH tape_normal_get_pilot_common_loop_outer: ldy #$40 - // FALLTROUGH + ; FALLTROUGH tape_normal_get_pilot_common_loop_inner: jsr tape_common_get_pulse - bcc tape_normal_get_pilot_common_restart // not a pilot - try again + bcc tape_normal_get_pilot_common_restart ; not a pilot - try again -#if CONFIG_TAPE_AUTODETECT +!ifdef CONFIG_TAPE_AUTODETECT { bit INBIT - bpl !+ - // Try to distinguish turbo by cheecking for short signals - cmp #$B9 // see comment in tape_common_autodetect.s - bcs !++ -!: -#endif + bpl @1 + ; Try to distinguish turbo by checking for short signals + cmp #$B9 ; see comment in tape_common_autodetect.s + bcs @2 +@1: +} jsr tape_normal_calibrate_during_pilot @@ -104,8 +104,6 @@ tape_normal_get_pilot_common_loop_inner: bne tape_normal_get_pilot_common_loop_outer clc -!: +@2: rts - - -#endif +} diff --git a/src/kernal/tape/tape_normal_sync.s b/src/kernal/tape/tape_normal_sync.s index 8a749e36..19cc3b83 100644 --- a/src/kernal/tape/tape_normal_sync.s +++ b/src/kernal/tape/tape_normal_sync.s @@ -1,15 +1,15 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tape (turbo) helper routine - synchronization handling -// -// .Y should contain start value (either $89 or $09) -// Carry set = failed +; +; Tape (turbo) helper routine - synchronization handling +; +; .Y should contain start value (either $89 or $09) +; Carry set = failed -#if CONFIG_TAPE_NORMAL +!ifdef CONFIG_TAPE_NORMAL { tape_normal_sync: @@ -17,20 +17,20 @@ tape_normal_sync: lda #$06 sta VIC_EXTCOL - // Injest bytes of decreasing values + ; Injest bytes of decreasing values jsr tape_normal_get_marker_while_sync - bcs tape_normal_sync_fail // branch if end of data marker + bcs tape_normal_sync_fail ; branch if end of data marker jsr tape_normal_get_byte bcs tape_normal_sync_fail - cpy INBIT // INBIT contains same value as .A + cpy INBIT ; INBIT contains same value as .A bne tape_normal_sync_fail dey and #%01111110 - bne tape_normal_sync // branch if not $80 and not $00 + bne tape_normal_sync ; branch if not $80 and not $00 clc rts @@ -40,6 +40,4 @@ tape_normal_sync_fail: sec rts - - -#endif +} diff --git a/src/kernal/tape/tape_normal_update_checksum.s b/src/kernal/tape/tape_normal_update_checksum.s index 8b60d534..8f5010ec 100644 --- a/src/kernal/tape/tape_normal_update_checksum.s +++ b/src/kernal/tape/tape_normal_update_checksum.s @@ -1,13 +1,13 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tape (normal) helper routine - checksum calculation -// +; +; Tape (normal) helper routine - checksum calculation +; -#if CONFIG_TAPE_NORMAL +!ifdef CONFIG_TAPE_NORMAL { tape_normal_update_checksum: @@ -17,6 +17,4 @@ tape_normal_update_checksum: sta RIPRTY rts - - -#endif +} diff --git a/src/kernal/tape/tape_turbo_bytestore.s b/src/kernal/tape/tape_turbo_bytestore.s index 03bd41f6..e178825f 100644 --- a/src/kernal/tape/tape_turbo_bytestore.s +++ b/src/kernal/tape/tape_turbo_bytestore.s @@ -1,57 +1,57 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tape (turbo) helper routine - storing byte uder I/O -// -// Has to preserve .A and .Y -// +; +; Tape (turbo) helper routine - storing byte uder I/O +; +; Has to preserve .A and .Y +; -// This helper routine is meant to be copied to the start of CPU stack. -// Original ROM tape loading routines uses this area to store information -// about bytes that did not read properly for the first time -// (see Mapping the C64, page 47); this mechanism is useless for turbo tape, -// but it means we can safely use this area for our purposes +; This helper routine is meant to be copied to the start of CPU stack. +; Original ROM tape loading routines uses this area to store information +; about bytes that did not read properly for the first time +; (see Mapping the C64, page 47); this mechanism is useless for turbo tape, +; but it means we can safely use this area for our purposes -#if CONFIG_TAPE_TURBO +!ifdef CONFIG_TAPE_TURBO { -#if ROM_LAYOUT_M65 -.label __tape_turbo_bytestore_defmap = __tape_turbo_bytestore + 10 -#else -.label __tape_turbo_bytestore_defmap = __tape_turbo_bytestore + 7 -#endif -.label __tape_turbo_bytestore_size = __tape_turbo_bytestore_source_end - tape_turbo_bytestore_source +!ifdef CONFIG_MB_M65 { +!addr __tape_turbo_bytestore_defmap = __tape_turbo_bytestore + 10 +} else { +!addr __tape_turbo_bytestore_defmap = __tape_turbo_bytestore + 7 +} +!addr __tape_turbo_bytestore_size = __tape_turbo_bytestore_source_end - tape_turbo_bytestore_source tape_turbo_bytestore_source: -#if ROM_LAYOUT_M65 - jsr KERNAL_0.map_NORMAL -#endif +!ifdef CONFIG_MB_M65 { + jsr map_NORMAL +} - // Set all memory as RAM, tape motor ON + ; Set all memory as RAM, tape motor ON ldx #$00 stx CPU_R6510 - // Store byte in memory + ; Store byte in memory sta (MEMUSS), y - // Restore default memory layout - ldx #$00 // value will be determined later, offset from start: 7 bytes + ; Restore default memory layout + ldx #$00 ; value will be determined later, offset from start: 7 bytes stx CPU_R6510 -#if ROM_LAYOUT_M65 - // Restore default map and quit - jmp KERNAL_0.map_KERNAL_1 -#else - // Go back +!ifdef CONFIG_MB_M65 { + ; Restore default map and quit + jmp map_KERNAL_1 +} else { + ; Go back rts -#endif +} __tape_turbo_bytestore_source_end: -#endif // CONFIG_TAPE_TURBO +} ; CONFIG_TAPE_TURBO diff --git a/src/kernal/tape/tape_turbo_get_bit.s b/src/kernal/tape/tape_turbo_get_bit.s index d2cf4f6a..52416132 100644 --- a/src/kernal/tape/tape_turbo_get_bit.s +++ b/src/kernal/tape/tape_turbo_get_bit.s @@ -1,53 +1,53 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tape (turbo) helper routine - bit reading -// +; +; Tape (turbo) helper routine - bit reading +; -// Based on routine by enthusi/Onslaught, found here: -// - https://codebase64.pokefinder.org/doku.php?id=base:turbotape_loader_source +; Based on routine by enthusi/Onslaught, found here: +; - https://codebase64.pokefinder.org/doku.php?id=base:turbotape_loader_source -#if CONFIG_TAPE_TURBO +!ifdef CONFIG_TAPE_TURBO { tape_turbo_get_bit: jsr tape_common_get_pulse - bcs !+ + bcs @1 clc ror - sta __turbo_half_S // store half of the last measurement result for short pulse + sta __turbo_half_S ; store half of the last measurement result for short pulse lda #$01 -#if CONFIG_MB_MEGA_65 +!ifdef CONFIG_MB_M65 { sta SID_SIGVOL + __SID_R1_OFFSET sta SID_SIGVOL + __SID_L1_OFFSET -#else +} else { sta SID_SIGVOL -#endif +} lda #$06 sta VIC_EXTCOL sec rts -!: +@1: clc ror - sta __turbo_half_L // store half of the last measurement result for long pulse + sta __turbo_half_L ; store half of the last measurement result for long pulse lda #$00 -#if CONFIG_MB_MEGA_65 +!ifdef CONFIG_MB_M65 { sta SID_SIGVOL + __SID_R1_OFFSET sta SID_SIGVOL + __SID_L1_OFFSET -#else +} else { sta SID_SIGVOL -#endif +} sta VIC_EXTCOL clc rts -#endif // CONFIG_TAPE_TURBO +} ; CONFIG_TAPE_TURBO diff --git a/src/kernal/tape/tape_turbo_get_byte.s b/src/kernal/tape/tape_turbo_get_byte.s index 6d4753b2..584bf9f9 100644 --- a/src/kernal/tape/tape_turbo_get_byte.s +++ b/src/kernal/tape/tape_turbo_get_byte.s @@ -1,53 +1,53 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tape (turbo) helper routine - byte reading -// -// Returns byte in .A -// +; +; Tape (turbo) helper routine - byte reading +; +; Returns byte in .A +; -// Based on routine by enthusi/Onslaught, found here: -// - https://codebase64.pokefinder.org/doku.php?id=base:turbotape_loader_source +; Based on routine by enthusi/Onslaught, found here: +; - https://codebase64.pokefinder.org/doku.php?id=base:turbotape_loader_source -#if CONFIG_TAPE_TURBO +!ifdef CONFIG_TAPE_TURBO { tape_turbo_get_byte: - phx_trash_a + +phx_trash_a lda #$01 - sta INBIT // init the to-be-read byte with 1 (canary bit to mark loop end) -!: + sta INBIT ; init the to-be-read byte with 1 (canary bit to mark loop end) +@1: jsr tape_turbo_get_bit rol INBIT - bcc !- // is the initial 1 shifted into carry already? - plx_trash_a + bcc @1 ; is the initial 1 shifted into carry already? + +plx_trash_a - // Compensate for tape speed variations + ; Compensate for tape speed variations - lda __turbo_half_S // half of the last value for bit '0' + lda __turbo_half_S ; half of the last value for bit '0' clc - adc __turbo_half_L // half of the last value for bit '1' + adc __turbo_half_L ; half of the last value for bit '1' sec - sbc __pulse_threshold // now we have a diff between current threshold and calculated one - beq tape_turbo_get_byte_done // branch if threshold correction not needed + sbc __pulse_threshold ; now we have a diff between current threshold and calculated one + beq tape_turbo_get_byte_done ; branch if threshold correction not needed - bpl !+ + bpl @2 lda __pulse_threshold cmp #($BF - 10) - beq tape_turbo_get_byte_done // do not decrease threshold too far no matter what + beq tape_turbo_get_byte_done ; do not decrease threshold too far no matter what dec __pulse_threshold - bne tape_turbo_get_byte_done // branch always -!: + bne tape_turbo_get_byte_done ; branch always +@2: lda __pulse_threshold cmp #($BF + 10) - beq tape_turbo_get_byte_done // do not increase threshold too far no matter what + beq tape_turbo_get_byte_done ; do not increase threshold too far no matter what inc __pulse_threshold @@ -57,4 +57,4 @@ tape_turbo_get_byte_done: rts -#endif // CONFIG_TAPE_TURBO +} ; CONFIG_TAPE_TURBO diff --git a/src/kernal/tape/tape_turbo_sync.s b/src/kernal/tape/tape_turbo_sync.s index 81106fb0..788d3b1b 100644 --- a/src/kernal/tape/tape_turbo_sync.s +++ b/src/kernal/tape/tape_turbo_sync.s @@ -1,77 +1,76 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tape (turbo) helper routine - synchronization handling -// +; +; Tape (turbo) helper routine - synchronization handling +; -// Based on routine by enthusi/Onslaught, found here: -// - https://codebase64.pokefinder.org/doku.php?id=base:turbotape_loader_source +; Based on routine by enthusi/Onslaught, found here: +; - https://codebase64.pokefinder.org/doku.php?id=base:turbotape_loader_source -#if CONFIG_TAPE_TURBO +!ifdef CONFIG_TAPE_TURBO { tape_turbo_sync_header: - // Initial pulse threshold - lda #$BF // measured 128 bits '0' and 128 bits '1' under VICE, calculated average + ; Initial pulse threshold + lda #$BF ; measured 128 bits '0' and 128 bits '1' under VICE, calculated average sta __pulse_threshold - // Synchronize with start of sync sequence + ; Synchronize with start of sync sequence jsr tape_turbo_sync_first -#if CONFIG_TAPE_AUTODETECT +!ifdef CONFIG_TAPE_AUTODETECT { bcs tape_turbo_sync_done -#endif +} - // Perform synchronization, double loop, total $C0 * $04 iterations + ; Perform synchronization, double loop, total $C0 * $04 iterations ldx #$C0 -!: +@1: ldy #$04 -!: +@2: stx XSAV jsr tape_turbo_get_byte cmp #$02 - bne tape_turbo_sync_header // branch if failure + bne tape_turbo_sync_header ; branch if failure dey - bne !- + bne @2 ldx XSAV dex - bne !-- + bne @1 - // FALLTROUGH + ; FALLTROUGH tape_turbo_sync_payload: jsr tape_turbo_sync_first -#if CONFIG_TAPE_AUTODETECT - bcs tape_turbo_sync_done // this shopuld not happen -#endif -!: - ldx #$09 // 9, 8, ... -!: +!ifdef CONFIG_TAPE_AUTODETECT { + bcs tape_turbo_sync_done ; this shopuld not happen +} + ldx #$09 ; 9, 8, ... +@3: jsr tape_turbo_get_byte cmp #$02 - beq !- + beq @3 ldy #$00 -!: +@4: cpx INBIT bne tape_turbo_sync_payload jsr tape_turbo_get_byte dex - bne !- + bne @4 -#if CONFIG_TAPE_AUTODETECT +!ifdef CONFIG_TAPE_AUTODETECT { clc -#endif +} - // FALLTROUGH + ; FALLTROUGH tape_turbo_sync_done: rts -#endif // CONFIG_TAPE_TURBO +} ; CONFIG_TAPE_TURBO diff --git a/src/kernal/tape/tape_turbo_sync_first.s b/src/kernal/tape/tape_turbo_sync_first.s index 4e200bb9..6ef93293 100644 --- a/src/kernal/tape/tape_turbo_sync_first.s +++ b/src/kernal/tape/tape_turbo_sync_first.s @@ -1,30 +1,30 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Tape (turbo) helper routine - syynchronize to first byte with value $02 -// +; +; Tape (turbo) helper routine - syynchronize to first byte with value $02 +; -#if CONFIG_TAPE_TURBO +!ifdef CONFIG_TAPE_TURBO { tape_turbo_sync_first: -#if CONFIG_TAPE_AUTODETECT +!ifdef CONFIG_TAPE_AUTODETECT { ldy #$00 -!: +@1: jsr tape_turbo_get_bit rol INBIT lda INBIT cmp #$FF - bne !+ + bne @2 iny - bpl !- - bmi tape_turbo_sync_first_fail // suspiciously many $FF bytes, probably not a turbo tape -!: + bpl @1 + bmi tape_turbo_sync_first_fail ; suspiciously many $FF bytes, probably not a turbo tape +@2: cmp #$02 bne tape_turbo_sync_first @@ -36,7 +36,7 @@ tape_turbo_sync_first_fail: sec rts -#else // no CONFIG_TAPE_AUTODETECT + } else { ; no CONFIG_TAPE_AUTODETECT jsr tape_turbo_get_bit rol INBIT @@ -46,8 +46,7 @@ tape_turbo_sync_first_fail: bne tape_turbo_sync_first rts - -#endif +} -#endif +} diff --git a/src/kernal/time/rdtim.s b/src/kernal/time/rdtim.s index 0271acb3..7b0fcbab 100644 --- a/src/kernal/time/rdtim.s +++ b/src/kernal/time/rdtim.s @@ -1,29 +1,29 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official Kernal routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - page 291 -// - [CM64] Computes Mapping the Commodore 64 - page 232 -// -// CPU registers that has to be preserved (see [RG64]): none -// +; +; Official Kernal routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - page 291 +; - [CM64] Computes Mapping the Commodore 64 - page 232 +; +; CPU registers that has to be preserved (see [RG64]): none +; RDTIM: - // Disable interrupts for the duration of the routine, to prevent - // jiffy clock update while reeading its values + ; Disable interrupts for the duration of the routine, to prevent + ; jiffy clock update while reeading its values sei - // Store the jiffy clock state + ; Store the jiffy clock state ldy TIME+0 ldx TIME+1 lda TIME+2 - // Enable interrupts. More elegant solution would be pha + sei + ... + pla, - // but (checked by running a test program) original ROM routine always - // leaves IRQs enabled. + ; Enable interrupts. More elegant solution would be pha + sei + ... + pla, + ; but (checked by running a test program) original ROM routine always + ; leaves IRQs enabled. cli rts diff --git a/src/kernal/time/settim.s b/src/kernal/time/settim.s index 7c07eb5c..ab81678c 100644 --- a/src/kernal/time/settim.s +++ b/src/kernal/time/settim.s @@ -1,29 +1,29 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official Kernal routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - page 299/300 -// - [CM64] Computes Mapping the Commodore 64 - page 232 -// -// CPU registers that has to be preserved (see [RG64]): .A, .X, .Y -// +; +; Official Kernal routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - page 299/300 +; - [CM64] Computes Mapping the Commodore 64 - page 232 +; +; CPU registers that has to be preserved (see [RG64]): .A, .X, .Y +; SETTIM: - // Disable interrupts for the duration of the routine, to prevent - // jiffy clock update while changing its values + ; Disable interrupts for the duration of the routine, to prevent + ; jiffy clock update while changing its values sei - // Store the jiffy clock state + ; Store the jiffy clock state sty TIME + 0 stx TIME + 1 sta TIME + 2 - // Enable interrupts. More elegant solution would be pha + sei + ... + pla, - // but (checked by running a test program) original ROM routine always - // leaves IRQs enabled. + ; Enable interrupts. More elegant solution would be pha + sei + ... + pla, + ; but (checked by running a test program) original ROM routine always + ; leaves IRQs enabled. cli rts diff --git a/src/kernal/time/udtim.s b/src/kernal/time/udtim.s index 44913c57..f3438648 100644 --- a/src/kernal/time/udtim.s +++ b/src/kernal/time/udtim.s @@ -1,21 +1,21 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE -// -// Official Kernal routine, described in: -// -// - [RG64] C64 Programmers Reference Guide - page 303 -// - [CM64] Computes Mapping the Commodore 64 - pages 27, 232 -// -// CPU registers that has to be preserved (see [RG64]): .Y -// +; +; Official Kernal routine, described in: +; +; - [RG64] C64 Programmers Reference Guide - page 303 +; - [CM64] Computes Mapping the Commodore 64 - pages 27, 232 +; +; CPU registers that has to be preserved (see [RG64]): .Y +; UDTIM: - // Update jiffy clock. The whole day is $4F1A00 jiffies - // (24 hours * 60 minutes * 60 seconds * 60 jiffies), - // after this time we have to reset the clock. + ; Update jiffy clock. The whole day is $4F1A00 jiffies + ; (24 hours * 60 minutes * 60 seconds * 60 jiffies), + ; after this time we have to reset the clock. inc TIME+2 bne udtim_rollover_check @@ -23,26 +23,26 @@ UDTIM: bne udtim_rollover_check inc TIME+0 - // FALLTROUGH + ; FALLTROUGH udtim_rollover_check: lda TIME+0 -#if !CONFIG_RS232_UP9600 +!ifndef CONFIG_RS232_UP9600 { cmp #$4F -#else +} else { cmp #$54 -#endif +} bcc udtim_keyboard lda TIME+1 -#if !CONFIG_RS232_UP9600 +!ifndef CONFIG_RS232_UP9600 { cmp #$1A -#else +} else { cmp #$60 -#endif +} bcc udtim_keyboard - // FALLTROUGH + ; FALLTROUGH udtim_clock_reset: @@ -51,61 +51,60 @@ udtim_clock_reset: sta TIME+1 sta TIME+2 - // FALLTROUGH + ; FALLTROUGH -// -// Keyboard part of the UDTIM routine, has to preserve .Y -// +; +; Keyboard part of the UDTIM routine, has to preserve .Y +; udtim_keyboard: -#if CONFIG_PLATFORM_COMMANDER_X16 +!ifdef CONFIG_PLATFORM_COMMANDER_X16 { - STUB_IMPLEMENTATION() + +STUB_IMPLEMENTATION -#else +} else { - // According to [CM64], page 27, the action we have to perform is to copy - // the last row of keyboard to RAM, so that various routines can detect the STOP - // key press. But something as simple as this would have created warm restart - // with M+N+SPACE+RESTORE due to ghosting - so the original ROM has to provide - // some protection here. I do not know what the mechanism there exactly does, - // but I hope the mechanism below will be compatible enough. + ; According to [CM64], page 27, the action we have to perform is to copy + ; the last row of keyboard to RAM, so that various routines can detect the STOP + ; key press. But something as simple as this would have created warm restart + ; with M+N+SPACE+RESTORE due to ghosting - so the original ROM has to provide + ; some protection here. I do not know what the mechanism there exactly does, + ; but I hope the mechanism below will be compatible enough. lda #$80 - sta CIA1_PRA // select all the rows except the last one -#if CONFIG_KEYBOARD_C128 + sta CIA1_PRA ; select all the rows except the last one +!ifdef CONFIG_KEYBOARD_C128 { ldx #$00 - stx VIC_XSCAN // connect all the extra C128 keys -#endif -#if CONFIG_KEYBOARD_C65 + stx VIC_XSCAN ; connect all the extra C128 keys +} +!ifdef CONFIG_KEYBOARD_C65 { ldx #$00 - stx C65_EXTKEYS_PR // connect all the extra C65 keys -#endif + stx C65_EXTKEYS_PR ; connect all the extra C65 keys +} - lda CIA1_PRB // read the keys + lda CIA1_PRB ; read the keys eor #$FF - sta STKEY // store reversed state - to filter out anything vulnerable to ghosting + sta STKEY ; store reversed state - to filter out anything vulnerable to ghosting -#if CONFIG_KEYBOARD_C128 - dex // puts $FF - stx VIC_XSCAN // disconnect the extra C128 keys -#endif -#if CONFIG_KEYBOARD_C65 - dex // puts $FF - stx C65_EXTKEYS_PR // disconnect the extra C65 keys -#endif +!ifdef CONFIG_KEYBOARD_C128 { + dex ; puts $FF + stx VIC_XSCAN ; disconnect the extra C128 keys +} +!ifdef CONFIG_KEYBOARD_C65 { + dex ; puts $FF + stx C65_EXTKEYS_PR ; disconnect the extra C65 keys +} lda #$7F - sta CIA1_PRA // select the last row (bit to 0) + sta CIA1_PRA ; select the last row (bit to 0) - lda CIA1_PRB // read the row - ora STKEY // filter out what might be the reason of ghosting + lda CIA1_PRB ; read the row + ora STKEY ; filter out what might be the reason of ghosting sta STKEY - // Leave the CIA configured this way. It would be far better to disconnect - // the keyboard at this point, but certain software (mainly intros) is - // unable to, for example, read the space bar status. + ; Leave the CIA configured this way. It would be far better to disconnect + ; the keyboard at this point, but certain software (mainly intros) is + ; unable to, for example, read the space bar status. rts - -#endif +} \ No newline at end of file diff --git a/src/program_traces/BASIC2.trace b/testsuite/program_traces/BASIC2.trace similarity index 100% rename from src/program_traces/BASIC2.trace rename to testsuite/program_traces/BASIC2.trace diff --git a/src/program_traces/README.md b/testsuite/program_traces/README.md similarity index 100% rename from src/program_traces/README.md rename to testsuite/program_traces/README.md diff --git a/tools/build_segment.cc b/tools/build_segment.cc index ab6c41ed..68211c5e 100644 --- a/tools/build_segment.cc +++ b/tools/build_segment.cc @@ -20,18 +20,16 @@ #include #include -const std::string ASM_CMD = "java -jar "; - const std::string LAB_OUT_START = "__routine_START_"; const std::string LAB_OUT_END = "__routine_END_"; -const std::string LAB_IN_START = ".label __routine_START_"; -const std::string LAB_IN_END = ".label __routine_END_"; +const std::string LAB_IN_START = "\t" + LAB_OUT_START; +const std::string LAB_IN_END = "\t" + LAB_OUT_END; // // Command line settings // -std::string CMD_assFile = "KickAss.jar"; +std::string CMD_assembler = "./acme"; std::string CMD_outFile = "OUT.BIN"; std::string CMD_outDir = "./out"; std::string CMD_segName = "MAIN"; @@ -49,7 +47,7 @@ std::list CMD_inList; void printUsage() { std::cout << "\n" << - "usage: build_segment [-a ] [-o ] [-d ]" << "\n" << + "usage: build_segment [-a ] [-o ] [-d ]" << "\n" << " [-l ] [-h ]" << "\n" << " [-s ] [-i ]" << "\n" << " [-r ]" << "\n" << @@ -70,6 +68,16 @@ void printBannerBinCompile() printBannerLineBottom(); } +std::string toLabel(const std::string &fileName) +{ + std::string retVal = fileName; + + std::replace(retVal.begin(), retVal.end(), ',', '_'); + std::replace(retVal.begin(), retVal.end(), '.', '_'); + + return retVal; +} + // // Class definitions // @@ -80,15 +88,24 @@ public: SourceFile(const std::string &fileName, const std::string &dirName); void preprocess(); - bool preprocessLine(const std::string &line); + void preprocessLine(const std::string &line, uint32_t lineNum); + void preprocessLine_Alias(const std::list &tokens, std::list::iterator &iter, uint32_t lineNum); + void preprocessLine_Import(const std::list &tokens, std::list::iterator &iter); + void preprocessLine_Layout(const std::list &tokens, std::list::iterator &iter); + bool nameMatch(const std::string &token, const std::string &name); std::string fileName; std::string dirName; + bool layoutProcessingDone; bool ignore; bool floating; bool high; + + std::map>> symbolImports; + std::map> symbolAliases; + std::vector content; std::string label; @@ -166,7 +183,7 @@ void parseCommandLine(int argc, char **argv) { switch(opt) { - case 'a': CMD_assFile = optarg; break; + case 'a': CMD_assembler = optarg; break; case 'o': CMD_outFile = optarg; break; case 'd': CMD_outDir = optarg; break; case 's': CMD_segName = optarg; break; @@ -291,15 +308,15 @@ void calcRoutineSizes() // Start at $100, so that no local data gets accesses using ZP addressing modes // during this pass, which would otherwise upset things later - outFile << "\n" << ".segment " << CMD_segName << " [start=$100, min=$100, max=$FFFF]" << "\n"; - outFile << "#define SEGMENT_" << CMD_segName << "\n"; - outFile << "#define ROM_LAYOUT_" << CMD_romLayout << "\n"; + outFile << "\n" << "*=$100" << "\n"; + outFile << "!set SEGMENT_" << CMD_segName << " = 1\n"; + outFile << "!set ROM_LAYOUT_" << CMD_romLayout << " = 1\n"; for (const auto &sourceFile : GLOBAL_sourceFiles) { outFile << "\n\n\n\n"; - outFile << "/* Source file: " << sourceFile.fileName << " */" << "\n\n"; - outFile << ".memblock \"" << sourceFile.fileName << "\"" << "\n"; + outFile << ";--- Source file " << sourceFile.fileName << "\n\n"; + outFile << "!zone " << toLabel(sourceFile.fileName) << "\n\n"; outFile << LAB_OUT_START << sourceFile.label << ":" << "\n\n"; outFile << std::string(sourceFile.content.begin(), sourceFile.content.end()); @@ -313,8 +330,9 @@ void calcRoutineSizes() // All written - now launch the assembler - const std::string cmd = "cd " + filePath + " && " + ASM_CMD + CMD_assFile + " " + - outFileNameBare + " -symbolfile -o /dev/null"; + const std::string cmd = "cd " + filePath + " && " + CMD_assembler + + " --color --outfile /dev/null --symbollist " + CMD_segName + "_sizetest.sym " + + outFileNameBare; std::cout << "command: " << cmd << "\n" << std::flush; if (0 != system(cmd.c_str())) { @@ -348,8 +366,8 @@ void calcRoutineSizes() auto eqPos = line.rfind('='); - auto address = strtol(line.substr(eqPos + 2).c_str(), nullptr ,16); - std::string refLabel = line.substr(0, eqPos); + auto address = strtol(line.substr(eqPos + 3).c_str(), nullptr , 16); + std::string refLabel = line.substr(0, eqPos - 1); for (auto &sourceFile : GLOBAL_sourceFiles) { @@ -494,32 +512,32 @@ void compileSegment() // First combine everything into one assembler file const std::string outFileNameBare = CMD_segName + "_combined.s"; + const std::string vlfFileNamePath = CMD_segName + "_combined.vs"; + const std::string repFileNamePath = CMD_segName + "_combined.rep"; + const std::string symFileNamePath = CMD_segName + "_combined.sym"; const std::string filePath = CMD_outDir + DIR_SEPARATOR; const std::string outFileNamePath = filePath + outFileNameBare; unlink(outFileNamePath.c_str()); + unlink(vlfFileNamePath.c_str()); + unlink(repFileNamePath.c_str()); + unlink(symFileNamePath.c_str()); std::ofstream outFile(outFileNamePath, std::fstream::out | std::fstream::trunc); if (!outFile.good()) ERROR(std::string("can't open temporary file '") + outFileNamePath + "'"); // Write the header - outFile << "\n" << - ".segment " << CMD_segName << - " [start=$" << std::hex << CMD_loAddress << - ", min=$" << std::hex << CMD_loAddress << - ", max=$" << std::hex << CMD_hiAddress << - ", outBin=\"" << CMD_outFile << "\", fill]" << - "\n"; - outFile << "#define SEGMENT_" << CMD_segName << "\n"; - outFile << "#define ROM_LAYOUT_" << CMD_romLayout << "\n"; - outFile << ".namespace " << CMD_segName << " {" << "\n\n"; + outFile << "!set SEGMENT_" << CMD_segName << " = 1\n"; + outFile << "!set ROM_LAYOUT_" << CMD_romLayout << " = 1\n\n"; + outFile << "\t* = $" << std::hex << CMD_loAddress << ", INVISIBLE\n"; + outFile << "\t!fill $" << std::hex << (CMD_hiAddress + 1 - CMD_loAddress) << "\n\n"; // Write files which only contain definitions (no routines) for (const auto &sourceFile : GLOBAL_sourceFiles_noCode) { outFile << "\n\n\n\n"; - outFile << "/* Source file: " << sourceFile.fileName << " */" << "\n\n"; - outFile << ".memblock \"" << sourceFile.fileName << "\"" << "\n"; + outFile << ";--- Source file " << sourceFile.fileName << "\n\n"; + outFile << "!zone " << toLabel(sourceFile.fileName) << "\n\n"; outFile << std::string(sourceFile.content.begin(), sourceFile.content.end()); outFile << "\n"; } @@ -529,22 +547,27 @@ void compileSegment() for (const auto &routine : GLOBAL_binningProblem.fixedRoutines) { outFile << "\n\n\n\n"; - outFile << "/* Source file: " << routine.second->fileName << " */" << "\n\n"; - outFile << ".memblock \"" << routine.second->fileName << "\"" << "\n"; + outFile << ";--- Source file " << routine.second->fileName << "\n\n"; + outFile << "!zone " << toLabel(routine.second->fileName) << "\n\n"; outFile << "\t* = $" << std::hex << routine.first << "\n\n"; outFile << std::string(routine.second->content.begin(), routine.second->content.end()); outFile << "\n"; } - outFile << "\n\n" << "} // namespace" << "\n"; + outFile << "\n\n"; if (!outFile.good()) ERROR(std::string("error writing temporary file '") + outFileNamePath + "'"); outFile.close(); // All written - now launch the assembler - const std::string cmd = "cd " + filePath + " && " + ASM_CMD + CMD_assFile + " " + - outFileNameBare + " -symbolfile -vicesymbols -o " + CMD_outFile; + const std::string cmd = "cd " + filePath + " && " + CMD_assembler + + " --strict-segments --color" + + " --outfile " + CMD_outFile + + " --symbollist " + symFileNamePath + + " --vicelabels " + vlfFileNamePath + + " --report " + repFileNamePath + + " " + outFileNameBare; std::cout << "command: " << cmd << "\n" << std::flush; if (0 != system(cmd.c_str())) { @@ -582,6 +605,7 @@ int main(int argc, char **argv) SourceFile::SourceFile(const std::string &fileName, const std::string &dirName) : fileName(fileName), dirName(dirName), + layoutProcessingDone(false), ignore(false), floating(false), high(false), @@ -638,30 +662,65 @@ SourceFile::SourceFile(const std::string &fileName, const std::string &dirName) preprocess(); - // Generate KickAss compatible label from the file name + // Generate assembler compatible label from the file name - label = fileName.substr(0, fileName.length() - 2); - - std::replace(label.begin(), label.end(), '.', '_'); - std::replace(label.begin(), label.end(), ',', '_'); + label = toLabel(fileName); } void SourceFile::preprocess() { std::string contentStr(content.begin(), content.end()); - std::istringstream stream(contentStr); + std::istringstream stream1(contentStr); + std::istringstream stream2(contentStr); std::string line; + uint32_t lineNum = 0; - while (std::getline(stream, line)) + // Preprocess all the lines + + while (std::getline(stream1, line)) { + lineNum++; + if (line.empty()) continue; std::replace(line.begin(), line.end(), '\t', ' '); line.erase(std::remove(line.begin(), line.end(), '\r'), line.end()); - if (!preprocessLine(line)) break; + preprocessLine(line, lineNum - 1); } + + // Replace content with preprocessed one + + std::string spacing; + content.clear(); + lineNum = 0; + + size_t maxSymLen = 0; + for (const auto &symbolAlias : symbolAliases) maxSymLen = std::max(maxSymLen, symbolAlias.second.first.length()); + + while (std::getline(stream2, line)) + { + if (symbolAliases.find(lineNum) != symbolAliases.end()) + { + std::ostringstream alias; + spacing.resize(maxSymLen + 2 - symbolAliases[lineNum].first.length(), ' '); + alias << "!addr " << symbolAliases[lineNum].first << spacing << "= $" << + std::hex << symbolAliases[lineNum].second << " " << line; + const std::string aliasStr = alias.str(); + content.insert(content.end(), aliasStr.begin(), aliasStr.end()); + } + else + { + content.insert(content.end(), line.begin(), line.end()); + } + + content.push_back('\n'); + lineNum++; + } + + symbolAliases.clear(); + symbolImports.clear(); } -bool SourceFile::preprocessLine(const std::string &line) +void SourceFile::preprocessLine(const std::string &line, uint32_t lineNum) { // Split the line into tokens @@ -674,7 +733,7 @@ bool SourceFile::preprocessLine(const std::string &line) if (token.empty()) continue; tokens.push_back(token); } - if (tokens.empty()) return true; + if (tokens.empty()) return; // Now preprocess line using the token list @@ -682,19 +741,94 @@ bool SourceFile::preprocessLine(const std::string &line) // Injest the comment token - if ((iter++)->compare("//") != 0 || iter == tokens.end()) return true; + if ((iter++)->compare(";;") != 0 || iter == tokens.end()) return; // Check if supported directive - if ((iter++)->compare("#LAYOUT#") != 0) return true; + if (iter->compare("#ALIAS#") == 0) preprocessLine_Alias(tokens, ++iter, lineNum); + else if (iter->compare("#IMPORT#") == 0) preprocessLine_Import(tokens, ++iter); + else if (iter->compare("#LAYOUT#") == 0) preprocessLine_Layout(tokens, ++iter); +} + +void SourceFile::preprocessLine_Alias(const std::list &tokens, std::list::iterator &iter, uint32_t lineNum) +{ + if (ignore) return; + + // Extract symbol, namespace, and target + + if (iter == tokens.end()) ERROR("syntax error, missing symbol in '#ALIAS#'"); + std::string symbol = *(iter++); + + if (iter == tokens.end() || (iter++)->compare("=") != 0) ERROR("syntax error, expected assignment in '#ALIAS#'"); + if (iter == tokens.end()) ERROR("syntax error, missing namespace/target in '#ALIAS#'"); + + auto dotPos = iter->rfind('.'); + std::string symNameSpace = iter->substr(0, dotPos); + std::string symTarget = iter->substr(dotPos + 1, std::string::npos); + + if (symNameSpace.empty()) ERROR("syntax error, missing namespace in '#ALIAS#'"); + if (symTarget.empty()) ERROR("syntax error, missing target in '#ALIAS#'"); + + // Put the alias - if address found + + for (const auto &alias : symbolImports[symNameSpace]) + { + if (alias.first.compare(symTarget) != 0) continue; + + symbolAliases[lineNum] = std::pair(symbol, alias.second); + break; + } +} + +void SourceFile::preprocessLine_Import(const std::list &tokens, std::list::iterator &iter) +{ + if (ignore) return; + + if (iter == tokens.end()) ERROR("syntax error, missing namespace in '#IMPORT#'"); + std::string symNameSpace = *(iter++); + + if (iter == tokens.end() || iter->compare("=") != 0) ERROR("syntax error, expected assignment in '#IMPORT#'"); + + while (++iter != tokens.end()) + { + // Try to import sumbols for the file + + std::ifstream impFile; + impFile.open(CMD_outDir + DIR_SEPARATOR + *iter); + if (!impFile.good()) + { + impFile.close(); + continue; + } + + std::string line; + while (std::getline(impFile, line)) + { + // Import label and address + + auto eqPos = line.rfind('='); + + auto address = strtol(line.substr(eqPos + 3).c_str(), nullptr , 16); + std::string label = line.substr(1, eqPos - 2); + + symbolImports[symNameSpace].push_back(std::pair(label, address)); + } + + impFile.close(); + } +} + +void SourceFile::preprocessLine_Layout(const std::list &tokens, std::list::iterator &iter) +{ + if (layoutProcessingDone) return; // Check if segment name and rom layout match if (iter == tokens.end()) ERROR("syntax error, missing rom layout in '#LAYOUT#'"); - if (!nameMatch(*(iter++), CMD_romLayout)) return true; + if (!nameMatch(*(iter++), CMD_romLayout)) return; if (iter == tokens.end()) ERROR("syntax error, missing segment name in '#LAYOUT#'"); - if (!nameMatch(*(iter++), CMD_segName)) return true; + if (!nameMatch(*(iter++), CMD_segName)) return; // Retrieve and apply action @@ -720,14 +854,15 @@ bool SourceFile::preprocessLine(const std::string &line) } else if (iter->compare("#TAKE") != 0) { - ERROR(std::string("syntax error, unsupported action '") + token + "' in '#LAYOUT#'"); + ERROR(std::string("syntax error, unsupported action '") + *iter + "' in '#LAYOUT#'"); } - // Tell the caller to finish processing the file + // Mark the file - to tell that layout processing is finished - return false; + layoutProcessingDone = true; } + bool SourceFile::nameMatch(const std::string &token, const std::string &name) { return (token.compare("*") == 0) || (token.compare(name) == 0); diff --git a/tools/generate_constants.cc b/tools/generate_constants.cc index 9e45e591..a13866fd 100644 --- a/tools/generate_constants.cc +++ b/tools/generate_constants.cc @@ -202,7 +202,7 @@ std::string toAssemblerString(const std::string &constName, double constValue) outFloat[4], constValue); - std::string outDef = std::string("\n.macro put_const_") + constName + "()\n{\n\t.byte " + buf + "\n}\n"; + std::string outDef = std::string("\n!macro PUT_CONST_") + constName + " {\n\t!byte " + buf + "\n}\n"; return outDef; } diff --git a/tools/generate_strings.cc b/tools/generate_strings.cc index 4a021996..3779c015 100644 --- a/tools/generate_strings.cc +++ b/tools/generate_strings.cc @@ -1229,7 +1229,7 @@ void DataSet::generateConfigDepStrings() // List found - if (GLOBAL_ConfigOptions["CONFIG_SHOW_FEATURES"] || GLOBAL_ConfigOptions["CONFIG_MB_MEGA_65"]) + if (GLOBAL_ConfigOptions["CONFIG_SHOW_FEATURES"] || GLOBAL_ConfigOptions["CONFIG_MB_M65"]) { StringEntry newEntry1 = { true, true, true, true, "STR_PAL", "PAL\r" }; StringEntry newEntry2 = { true, true, true, true, "STR_NTSC", "NTSC\r" }; @@ -1244,13 +1244,13 @@ void DataSet::generateConfigDepStrings() stringEntryList.list.push_back(newEntry); } - if (GLOBAL_ConfigOptions["CONFIG_MB_MEGA_65"]) + if (GLOBAL_ConfigOptions["CONFIG_MB_M65"]) { StringEntry newEntry = { false, true, false, false, "STR_SI_FEATURES", featureStrM65 }; stringEntryList.list.push_back(newEntry); } - if (!GLOBAL_ConfigOptions["CONFIG_BRAND_CUSTOM_BUILD"] || GLOBAL_ConfigOptions["CONFIG_MB_MEGA_65"]) + if (!GLOBAL_ConfigOptions["CONFIG_BRAND_CUSTOM_BUILD"] || GLOBAL_ConfigOptions["CONFIG_MB_M65"]) { StringEntry newEntry = { true, true, true, true, "STR_PRE_REV", "RELEASE " }; stringEntryList.list.push_back(newEntry); @@ -1498,9 +1498,9 @@ void DataSet::encodeStringsFreq() void DataSet::putCharEncoding(std::ostringstream &stream, uint8_t idx, char character, bool is3n) { - stream << "\t.byte $" << std::uppercase << std::hex << + stream << "\t!byte $" << std::uppercase << std::hex << std::setfill('0') << std::setw(2) << +character << - " // " << std::setfill(is3n ? '0' : ' ') << std::setw(2) << +idx; + " ; " << std::setfill(is3n ? '0' : ' ') << std::setw(2) << +idx; std::string petscii; @@ -1530,7 +1530,7 @@ void DataSet::prepareOutput_1n_3n(std::ostringstream &stream) // Export all nibble-encoded characters - stream << std::endl << ".macro put_packed_as_1n() // characters encoded as 1 nibble" << std::endl << "{" << std::endl; + stream << std::endl << "!macro PUT_PACKED_AS_1N { ; characters encoded as 1 nibble" << std::endl << std::endl; idx = 0; for (const auto& encoding : as1n) @@ -1542,13 +1542,13 @@ void DataSet::prepareOutput_1n_3n(std::ostringstream &stream) // Export all byte-encoded characters - stream << std::endl << ".macro put_packed_as_3n() // characters encoded as 3 nibbles" << std::endl << "{" << std::endl; + stream << std::endl << "!macro PUT_PACKED_AS_3N { ; characters encoded as 3 nibbles" << std::endl << std::endl; idx = 0; for (const auto& encoding : as3n) { if (idx == tk__packed_as_3n) stream << std::endl << - "\t// Characters below are not used by any BASIC keyword" << std::endl << std::endl; + "\t; Characters below are not used by any BASIC keyword" << std::endl << std::endl; putCharEncoding(stream, ++idx, encoding, true); } @@ -1571,7 +1571,7 @@ void DataSet::prepareOutput_labels(std::ostringstream &stream, if (!stringEncoded.empty()) { - stream << ".label IDX__" << stringEntry.alias << + stream << "!set IDX__" << stringEntry.alias << std::string(maxAliasLen - stringEntry.alias.length(), ' ') << " = $" << std::uppercase << std::hex << std::setfill('0') << std::setw(2) << +idx << std::endl; } @@ -1584,14 +1584,14 @@ void DataSet::prepareOutput_packed(std::ostringstream &stream, { if (isCompressionLvl2(stringEntryList)) { - stream << std::endl << ".macro put_packed_dict_"; + stream << std::endl << "!macro PUT_PACKED_DICT_"; } else { - stream << std::endl << ".macro put_packed_freq_"; + stream << std::endl << "!macro PUT_PACKED_FREQ_"; } - stream << stringEntryList.name << "()" << std::endl << "{" << std::endl; + stream << stringEntryList.name << " {" << std::endl << std::endl; enum LastStr { NONE, SKIPPED, WRITTEN } lastStr = LastStr::NONE; for (uint8_t idxString = 0; idxString < stringEncodedList.size(); idxString++) @@ -1603,7 +1603,7 @@ void DataSet::prepareOutput_packed(std::ostringstream &stream, if (stringEntryList.type == ListType::DICTIONARY) ERROR("internal error"); // should never happen if (lastStr == LastStr::WRITTEN) stream << std::endl; - stream << "\t.byte $00 // skipped " << stringEntryList.list[idxString].alias << std::endl; + stream << "\t!byte $00 ; skipped " << stringEntryList.list[idxString].alias << std::endl; lastStr = LastStr::SKIPPED; } else @@ -1614,12 +1614,12 @@ void DataSet::prepareOutput_packed(std::ostringstream &stream, if (stringEntryList.type != ListType::DICTIONARY) { - stream << "\t// IDX__" << stringEntryList.list[idxString].alias << std::endl; + stream << "\t; IDX__" << stringEntryList.list[idxString].alias << std::endl; } // Output the source string - as a comment - stream << "\t// '"; + stream << "\t; '"; for (auto &character : stringEntryList.list[idxString].string) { if (character >= 32 && character <= 132 && character != 39 && character != 34) @@ -1639,7 +1639,7 @@ void DataSet::prepareOutput_packed(std::ostringstream &stream, // Output the encoding - stream << "\t.byte "; + stream << "\t!byte "; bool first = true; for (const auto &charEncoded : stringEncoded) @@ -1665,8 +1665,8 @@ void DataSet::prepareOutput_packed(std::ostringstream &stream, if (stringEntryList.type == ListType::KEYWORDS) { - stream << std::endl << "\t// Marker - end of the keyword list" << std::endl; - stream << "\t.byte $FF, $FF" << std::endl; + stream << std::endl << "\t; Marker - end of the keyword list" << std::endl; + stream << "\t!byte $FF, $FF" << std::endl; } stream << "}" << std::endl; @@ -1677,7 +1677,7 @@ void DataSet::prepareOutput() // Convert our encoded strings to a KickAssembler source std::ostringstream stream; - stream << std::endl << "#if ROM_LAYOUT_" << layoutName() << std::endl; + stream << std::endl << "!ifdef ROM_LAYOUT_" << layoutName() << " {"<< std::endl; // Export 1-nibble and 3-nibble encoding data @@ -1685,8 +1685,8 @@ void DataSet::prepareOutput() // Export additional data for the tokenizer - stream << std::endl << ".label TK__PACKED_AS_3N = $" << std::hex << +tk__packed_as_3n << - std::endl << ".label TK__MAX_KEYWORD_LEN = " << std::dec << +tk__max_keyword_len << std::endl; + stream << std::endl << "!set TK__PACKED_AS_3N = $" << std::hex << +tk__packed_as_3n << + std::endl << "!set TK__MAX_KEYWORD_LEN = " << std::dec << +tk__max_keyword_len << std::endl; // Export encoded strings @@ -1705,7 +1705,7 @@ void DataSet::prepareOutput() if (stringEntryList.type == ListType::KEYWORDS) { - stream << std::endl << ".label TK__MAXTOKEN_" << stringEntryList.name << " = " << + stream << std::endl << "!set TK__MAXTOKEN_" << stringEntryList.name << " = " << std::dec << stringEncodedList.size() << std::endl; } @@ -1716,7 +1716,7 @@ void DataSet::prepareOutput() // Finalize the file stream - stream << std::endl << "#endif // ROM_LAYOUT_" << layoutName() << std::endl; + stream << std::endl << "} ; ROM_LAYOUT_" << layoutName() << std::endl; outFileContent = stream.str(); } @@ -1748,21 +1748,21 @@ void parseConfigFile() std::getline(cnfFile, workStr); if (cnfFile.bad()) ERROR("error reading configuration file"); workStr = std::regex_replace(workStr, std::regex("^[ \t]+"), ""); - + // Skip lines which are not preprocessor definitions - if (workStr.empty() || workStr[0] != '#') continue; + if (workStr.empty() || workStr[0] != '!') continue; - // Make sure this is '#define ' + // Make sure this is '!set ' - if (!std::regex_match(workStr, std::regex("^#define[ \t].*"))) + if (!std::regex_match(workStr, std::regex("^\\!set[ \t].*"))) { - ERROR(std::string("only '#define' preprocessor directives allowed in config files - line ") + std::to_string(lineNum)); + continue; } - // Get rid of the directive and trailing spaces/comments + // Get rid of the directive and trailing spaces/values/comments - workStr = std::regex_replace(workStr, std::regex("^#define[ \t]+"), ""); + workStr = std::regex_replace(workStr, std::regex("^\\!set[ \t]+"), ""); workStr = std::regex_replace(workStr, std::regex("[ \t]+.*"), ""); // Add definitin to config option map @@ -1784,7 +1784,7 @@ void printUsage() void printBanner() { printBannerLineTop(); - std::cout << "// Generating compressed messages and BASIC tokens\n"; + std::cout << "; Generating compressed messages and BASIC tokens\n"; printBannerLineBottom(); } @@ -1824,7 +1824,7 @@ void writeStrings() outputString = dataSetX16.getOutput(); } - else if (GLOBAL_ConfigOptions["CONFIG_PLATFORM_COMMODORE_64"] && GLOBAL_ConfigOptions["CONFIG_MB_MEGA_65"]) + else if (GLOBAL_ConfigOptions["CONFIG_PLATFORM_COMMODORE_64"] && GLOBAL_ConfigOptions["CONFIG_MB_M65"]) { DataSetM65 dataSetM65; @@ -1841,7 +1841,7 @@ void writeStrings() outputString = dataSetM65.getOutput(); } - else if (GLOBAL_ConfigOptions["CONFIG_PLATFORM_COMMODORE_64"] && GLOBAL_ConfigOptions["CONFIG_MB_ULTIMATE_64"]) + else if (GLOBAL_ConfigOptions["CONFIG_PLATFORM_COMMODORE_64"] && GLOBAL_ConfigOptions["CONFIG_MB_U64"]) { DataSetU64 dataSetU64; @@ -1887,7 +1887,7 @@ void writeStrings() // Write header - outFile << "//\n// Generated file - do not edit\n//"; + outFile << ";\n; Generated file - do not edit\n;"; // Write packed strings

34#m_rf3;OBly4r`UsWzCp#@g;14QoA)QRhktkK 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≫b$| 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%0DXxr*r5Qq`JN{|FG?G_y z;}s1y(J1AlBg;2bl9s+@P;=$QU+QxLlo~i1SrPymW=$70l2%jP@QJe8bp_XEZJU4# zWLh=#=air;aj`fTA<9CFJGSr~HYZdPfj#sTbkC{cLL7dJUzq4^ldAbPC*)>GWWsli zhlVSy1Qh)moh(j}YfRjUzIH1YMP{57oTb({RLYAPgZviN*4uw3qVzEY`E9YZ}uZi5lm9(nM`j zEpu7LH$zX@{N-v$6sF<)Y0OzlVU@D2X>IEP+y20g{?-(%AqKF1(8Jd>Afjqxm1-R@ zu6@7=H8j-2eKJ^VjRq#8c$8dbr#THy%ce=a8)*D_()12yY|HDa29+EZ9rWp?KYOz0 zwb3>3^V83(`4*I2B1Z2TH5R!n;JN2`!Rg|8&VK~iU|(13@c}Yw>Uv5XT~C$oM2THB z6+9jGn)ot3_~0LUT&<}j{bEc7L7jgchd^KRJCTS6T%?Hg*-|2H$b@xQ1V%fZ4|H4; zoYVPtaqggyp#6;CEKov}RVXWwMSZ1GuB|)*8NJep!&~uh4|lV%5ge$JLvGHo)7M5@+TAu!#s0Jz9~eTy^GpTN^#E3CS}W6Ct`Nz zW|*Za3UvhZ)++#H(nG5hub3ioZW{6o44}?J2?nzpT`U$UBV-5V^h#jAMaU+*BbRla zE2bx&Q4%RPT{m#>nZ+J!gSr`ZED06C$B|JsjypVktD>w^I^LPm@@TrPy|oVKDV=wc zIr=oR!Sq8%(X*sqa=_;(A{E@tZm-Kwy0cq$KI54H3oId5;BCtFrFgChe$?6|=VQOz z8f|ggVR>K{?w(TLf)jXg9hDgbcP5H}))=!;wuQh1+Qzg3(jz52cVXicOeN*smBU3Y z(qoU3IotYq+y|zuZod+IXWN6wzKKl8(`&I*UT444ROw8&#84L1onF3E=6CdgQbBD{q!3-Sv4{KNPnHjC|Hg zj)t7u^yc2tpRA}nAvr5xxLnrOrYq?vO|R#g>{RT(&%#i&GGO)`KSl^XR%SOaNt)>Z zN*yD}%ZQ`QnaW9VFWdhaH|=X<+}FnUwpZ0dL;g)L6qtPMXH?8$`|m!?)VQ(OQAhKx z2p~HP`*`^Z0aprWc$^8N(cRF+iNa$-+dq{{0#F2MO?6~x&$3tMaGqC)70c7*%0b1- zFy$x+1HRRhjjMh^WGO{Mo2|k9v7Dlp>Gq>!w?}qZYY#F~l{rU-=!n$Ej)2ZJU-63% zvl*(by<%m=8tzj~5Up1P7GY;3E*GHQvas%~6WBr&<*RV^MDw5>rrgGeYS6Cwo+|~r zP(SZIMg7q>C3M_vo!qFiU`Qc)z~~G-l>%n~3R|rdVSfS~12W!|0Z-5pg_FP+@7z>8 zG@xt7XxE%49T@NA^jLF}cGGe<=3jWQjCZ(d{(!o?P1|Db)Der zx^Xv(=XkAfDd@70O5T_wSSnhk9LcUSaF$78ic)Tw8D@$$#KmA68Dx8m&1-~ia>iE2 zWRlur8}#Llu=Hh>-MpZa(sx#HSu{x61z&t{@mvb)FD9xLL^CDTvFXAX4uNMDP0$gr zd@(NVkhpZY^a{)>?EJ3~&iq?~@b9C=_(RwK3gLe(_A{|DvHuO>f5oo<(^5I}pP=sl z4&kFJDs~@B<(`>ZKF;!_D!bV>2;A!R@MC0)3XW~{Yl>9yq1TnjzSUgL;e2X~e*j5@&ZxhS3(UqM6-sPhjRggZ37;_4sK+AP#$Enz0J&Yw+} zcOBwUUG8tL*zKRUk6P6F-2!c*-A%?ilo9G189qBousofQ+mb#C%_Rwb8|aFLInM2g8PE_SKjbd!L)lg`6hd z(Aeu_Sg2Hae&`WpyjyN36YS{D<=Jory6VmbNzi;AjuGOi%1#dD3S-PFsete#j6&Ns z5`h(DwQH)3aGFq5$BuFpsji1$ZYl1kj4tyai=7XS&^8(Lcc^2)GUXBytaYol2@3p3 zHB=9#5YmE?9A3-Cmo$h=-GWKeLr;K2ZWpqy!8b+z7d z<_>5x2aMma=K7-Gn5-th&?-+Jsb*52d}huJ#|=gR+!R_b##H*+YNb{#{w@c9f9rB? z=|@s4zjuEOj;~Nb5W)3zHFp-aG*2WDGRZWFL;baBSo@kzXd5DQbV~P+t6joh*s*;Z zfg=kvDxGzat-u>r2w#b5Bt-kI2*1^Bj=pyE3OP} z=56IbheVPMW?9G@wA<#_g|O^G$gt)^7}`;VS1kYn@zECttKRRc%)A#gltSuC@N4xV zCvdTH=$oxEH!qfnXtT_8&?C3%H&m3~BA-;TYjn6IaI7rD{H1R|^9(V_NDuRDqZJA+ zv09C{oLV?0w|LsA%cX)0pOCxSes+G3{9@^YHl>mmS_bO8aj3DX%r!G>OsriTZNFV> zd?e&Z4{`%*9ZQnSWX7938c>6#U?5?%X84~Lj8>MLE02u)^)_&7$z(^E`7AYj) zS6^S|{z0ICj12{*B?aG`qSICc%>Zmdy z&q-Fd5@oH0d}9K?Wp%NWu}DX0ql1d?iqf*72%))Ta`p8Q$pYUST-h35q8TijNNrK) zF8TW4w;*FuN}x;0nVipkQY*WtK#WYgQVhbHZC>8XA5v^a6_#qSJ51IfcqC!(wL{p& zMj?V_J6H@5K3xbqv6UH$#wD#Uk{>&onR5*1kdzQjjJD4bDx_E7rIwd`4qr&Qo0z$m zREm71y`aTe)JAFLDP9t6pdiyzu^GuABe14O9n2$Im%UbzQrY0j9*RS3YaAk!G|Wyl zP20vBqEQjRd6J?vUUiy)n}CWk&NF_5e{=sDENW9BeRqxo2K0I%T*i0P@;iLNnBtT^nB7vBEu5Q=z3}8QKa=C216$S*GG1lwjQ=h`~-XXNag>Gv?S52h;#Q2(L|QJ|u1lAhKVP{wvHQ@taPpd7-N{4jJ7gB1t-&ez^8q)k5^1 z-uB-+0Ai##zSv|{XGu&gXwm+1LSun$xt^>Kn@>~#^IOB8PZvn5tPUY>F;;vk@7P&g zxg|)L?x53k={qA0d^kr1$SvA|_+>&H-b79A`<*yM#3Te)rpu1<^k!$94Js-~qlV2I z_%~jpG#>I2&LyDNhZ%0#wLATjnaId!i;Ji3mx!6MX^_R8Yx>zB&gcU+uGr9PO z^fwW-*d-G68nz+yhf5Msl?*x^30jH5D!#Z0o@Kw4hEw8<3@i|b8-o=o9f|i!XJ5xU zlyUL1izg5|xAgsEj((Tq#dK@TNp3l#A|9A+0@4_VN=By$r^PNlVVno3ADiu_L)*6x z+tgzGd?bA=m=&F&xN}!=#PakHxk%P%qA>#u1w;$=FX1uzDqg}cE(oF<(U|ZktQEUP z!J?jZZ$b~Aw|vL?jC21D2L4mW`0pSCW&X`~|B8Wsi6fbqSpF7*GXFCI{m)qJpD^zK z0RvT+BUgSRdYo4hkby2}-b}O}>2|`KncpF4`(Z45Bc7c27362gmL<57-l`+*tjnWN z#-Plu#<7p5D`o*elSdni6HO*Se=y_^Lrf9~WtA+wRAWqsCby$W%t}eJf~u zf%{VF)Y)fz(i|`gN4DM{dXzaRo`A0mMn{we#k&KgtL)fw5dT7IsKkd%a5KHk9 ztjj?oAaVm+Sw}=ZO-vv39(PDrB!GpHo~icaK8$*EdBEre>V2L5z(9=d5GS}eJF(ML zm6iRCB8GtDk<|Wf^fT}_Awj{Pjr|p6=j6p+6b1YJHK$Q3tb?NhZE;Fv=ti48j;>?F z4c_RFlacK#{f928D)27V8j7wl+4CQ2z1I4oM)&b>ni)AooyIH;b>S5TN?|749=NF?PH0ps6 zROLtJr(r<`@t1g&XSl<36~3Taq7ru58kHn9(L6S-3QQJ6fG&=+m415%dzp9o*i&6tEn&Nf4YpyV-( zaZEmHZKffe(_V_T-Lg0Nwb!nJPeI93?$#6~rP=jTosKh2XSsgV6UiPk)sS_~`&aER zL0y0>I5{B+DOs%++-7$?86GG$uuzbfmYRzx#+*{28U%4tNp`@Z{`j?kRW@@i$6Q+l zWnZfe_hP?W@EL%1Hm|>|TdCd!gEL~X(}mZu_w2ih%RJyx;kl0fy=_L%ddP^wPXu0G z1WtoodmNV9Af0)NE!||JPxjfkv>*X~v2ACJ+pUsOKZn0@g@6||-)fyox+?(=2%?J~6 zF<<4(oIr9nHdGId3_doL@qL^9zKUjrw|vmH0IX{?^FweP@5&J-x3D8g+F&#wggMOW zMlOIiE!*-9AL!LoA?Y}-tt3-ZQgosyWjBtHL^`0PP zIJqMFq*g@p>2rtjR(p|~2+oj}2EW6ZD@)bBa7sy%BZUy?YQQE&X8xD#r>ySPHhyH0 zdGpbEUE29cPEGQCIxIn9Yfel;>*a|G&&l18L)QgVC9H3|1l$G==b!4wSmb5uSa#?e zZTCjFSTsy{pD{G)gJGYe@eoQST8$SL&WzYYpns965C9J>|gD9LmN}A|-U0UNz3>K_b*OSRYgZ ziVyEDuV{WD?31#dL$UkcH-JpB5xfgmz~r>nNMQ|H_wTT>RA<( z+go|VW(HjwUUWYU4pK_D5J9&iGvDEIKUvlv$FM{pDt>zU zNJsT_h)m7>vL*cLhAKW<`0B-(C^B%2B|rwz3_KHRoE77}?99$W6xi%g5kAVlrs22N znMEaNB~z?CWAH4<;hgLA?Gvs0_b{Y`kPRGuP}FDqxh%Gt!>e-eSF=)adoM&Qg#zUX z-^a27a4%Cs{1#oV1`yS3J`h^}Mkg;?K9?^+xWAO%@||c>mEIG+gl*6Abu!Jkb7fIy zB1U@Djz8I^D$ag$W{_k2rl)-4ijP;@ppY3P!*S|#3$flH!}C=d<%X8WP>=U3#L>XL^&-fhySn&CK3+AF}fmP6=FyYSnzZg!ayaR>7 zE8Fiyzm;i+;FY$acwt#TE9-Px^P8Z6%YsE&8`Jb0)aTz#gWZp+Qb}xpL<<}UZWInh z9D`T=TA{E-ycJTgt@G6>tb)~9fxv44$V7pgPFmEVHpusbh2SRE5Xu=y`pkYh+K=BH zkjeGbcZEos$_L+Lg%e!V3w$joJyE0ZclIN(&j-$qbhZ?M+(r-eVTY3(Qaw+v?W3PW zE^Ff32rDj@FXwHxtQVtTLgOlf4~4daCS;NM_HqKJftCsoDrFg-dJ!mhwgB^E8c6#B zMhK~$9o&k^?OVOiy>Fm?4YS%YgA=22ZI*0ZFNjL;DFw!w|-$FHN6?MGDsaas7xr$eKj+2?@vvoRn8gj@inl&O@Lyh0GJ9)1# zgaO_1<5k7xMvtvU$bk?!C}Ya?li}C)U7Lso8;xtGMhWnYAp`B5&h%`2u^%Im7)?S? zQ9g*nzgS#rdDav9C-5a(K6WaZpKko_Buuu^j0tsh79?n}2D(;xrH7iY=Ii657&-e8KJfs)WMKr3 zt~C!#Lc>@GN3x43HlC7H2&*cPpZ+qLr53U=S^B1#ZvaP9f!Y~qqI&#LoyhC3MN@uc zI(HY^Ivq1TO@;cQEUgGAz}+7P1)V?aQN>^6D4DlGw^)flNuIIRaSPS%!sbv5=EtED zh;e zdy$W!dV*E1S2R781yY2|@eXmB0lsJ=;|M=qAekt7894EkSGXdvT*A4iH3!zmjhH%eT%&7jkWD@1== z%SWRf3S}N>m3VSXHRZ@=#@lSi@4DDwd4u`v<RgP?aP&;ORBgmyIXl!^hBHb2|oHX5~9wR{8UHI zyuoBHDvVlj0^2XvY2dDhB3cM=QF2gLTvGY#>3hieO#5I+BBm=9$!cGfHM&{XP?t4+ zGTdPX@muSt?$6SY5_q4DRqh^}abY*kv3dzF;}lVE<|$0>{MO0x!Wj}|&x1TH&4rFoArBk}?N zu;sPOmM)ZZZ0W+~hO>do5cH?0CjyA<$ON=N+X4B|)R+|@-UMD7S7fVu_JLqM=twL1 zO={fRJF|Aeub}LG-?&X~(CDh}x-FyGK~*UXPWh^iWmK+sLs+21M-W`-$wt13AXgF_)b?z$Wnbl$d)W;EplF z$FwP0p3P70HZGAFfY?fz9Rad!p{>K80{+Z=S$K2vTMUe#HiyS;jVK3AnZ4Lem z0S6*$Di4?NwY)v}o%M+il$OZ#zrrNTKQ{^ZcL>A&p~QcI$v=$vM-t1-_;(nV<)6Xl zf5POS2=4zLhCNkXjaz2>>~*izWr?3MqK_H+G^RF1#@=QYH*CP1p4$Aei}_UrmYOXo z2lo3tq^JB3{pYJm&NveIZ~Q1gz8mmB<$UOPL>KR|ui_x^=Mqg&F0_c9VO_~J@m ztoelm-FLu~0*(Cw%Mi*Jx#qk}5MMAyz@N}wYl_gpUiB`Itr!aV!PZ*TqA@qsXG(j& z4YP3o_wDQB3$TZgD~AP*3+^D=*E7-Gx#K|mKknWsJhOG%7LIM(72B!UNyWBp+qP}n zwrwXBr(&~Woy>XGTyyPbum7BNF8_V?J>S(B{nhBby{)$<2leThsGCzS_hW7e?A`rJ zd|8RZeZ%SC&|Rzfc(r=^wY;psY3b_fGr0Pr&DEVnwMzyoz_$ zv=oaAsw~C~r+ucXwILgWr==I2YX`#MXF(s9raT7wPUuiXPeaAGf*~Z2sy$gQ?7hPR z`e3!}lw!N|e&S4+{#oJ>{R>OwM|%{i#ML5nT;dqG7(643Z_Gs3GS&B#0SUo7lKQ_J zr!(@)ZN7K8S4RR73{Ucg&Lenu4@y^~=QRsaN$@5)ysNq&#XIan`9id*kPCI@*kaOB zC=avChuKbl<39gJs9uU0fvkIS3(nL9F%oU8E49XG&@a9#nj8wg!FE17YF4{Z=RB77 z=!<5{cW;a3k|9UgGP1@zaW`BXfEGKapQ=9-KJtr@c`o2U8uyM zx-_gH)&TZRpI9L&3h^g#2odgJK9Ua?8m=Ib4@!Cti8^nJ?7MGnW6OKj-fc+z#Jc%J zc-+`VZ_z7)dji8Fg}@orWEb6J8T$(gKZ}-CtX))`lbe!MNW4%jQ&cfw;d_$mJ!a6x zHl~_N%eUP*&@#LAWG%HXaB>4GAWhQ^tyMTd4gv7205lGXw_b=#RwJ*t&wXU=+fgob zVyoKHfEiACMLwhEBS5xS0S8ff>dqpA$syu(EvYWj&oY=-LqSGO^`HLsg&6ZMDTH(uEN~bVq@T4Z@z3qZ}e|9 z1FY~ac6-oHcMa-H*Nv=J$$a_1uXs%$9Dx%oc68*Q%udb2D5MPpLPd+P@X0XVTUS}F zbe7mkEu5|3XgEqyh)Q_40nrQbisj;q>r$XNYVzVtoGy|v*Y=H8SZGeM747Cq{YKCuqlsT#4m*3B( zfFg_X0!Rq21u1ncXydP1k2?NX}H{P;j zojrC=?{mVIcb@ZqLOc8AGp=M-2*8DzB*M)+wZ4@;obhziC_bRP%)U^Nf6f%@->-kY z-A6ZaDGfZr1an!(1h0AAusmKc2rPz z5yLb9T7Yj_ep&@?Wm4+2fMJxxAmAPmbEmZ~@G$Qv*JQNChOjg|iR$`JYY}1nu?Mf1Z7gXeQbRpARf_93X0aEZTusVDxcT5Ae3EYxtTIr*FQ)PO4QBL3 zQg>wX$CXiXqsbt&&XyoNS-Uyr6-gVS?Wo(!+|56^lE$3qbDpiHMKXLga_Bi>3h_jH z_Tl3{0<|7^I$lrK+_+BQH@>M=m%x#D@qQuHJU0-XqwrJstLrd;p;8P)N3`RT zmX~Vnh3(EfyQs$dxtPElHdL0I9vC-pAUzU;qdnMb57nZoB@~$flmPD5osyX>r(>xt zTffI;m$%@&`~-S2o=B%Wyr-|Jv@wGW|dz*SCY>`B21I3neW(dZ) z!L(vTz^QX7qWe=_Wt-sKft>?~8-VGF4O8IDW%}2ffymo-MsBOsYY;>HESw_%-~j+r zb8Ut<w0kEIgk+>IEx`L-uiWT&XGb;YMGd6b5n zW(c<8_2a>1^c~SvXL|#ix?t+zkLlnKJypeQn+X&sm#F2}qVN6Cxg(FB2D7(sYSs=~ zG?coaDYB;_Zc19Z7);1@o%!#xym| zjo~ry7`)|c^(#9NNbGz<8`(vl#=jMjlPFX&hE>Yqr_=J4s#48yF^v#1acL4>vQ5K% z^ftHtlm`v45O)5^G!a?k!Y>AIwUF?}jY;$KpzTcofT%9iCqbJqa^qXZuYYim3LG*9lc!~Ko}&f~jNOB#(r{S`*gWS_;k?5_@T17%|%yde^0 zm)bHfa1BE*X9T=?0AzA=0-cFzoo#2=Wz?XMNFN^YEY|qj+#Sa8q+rdqs=1rnu2hP{D_IHkabirV#i5si(Olf z2nTN@$DCVNu1q0>B0bn6Bq+QHDawfX)5Q>GjyDbNZkh1Jt1fzJ&U){z_x3lu5LauE|EA*jiyr$w1HS&Vl=!a|$6r+6FBw1PKjQzR z`e6PWwEw%}_=61cpTO5xU+^{it%o;g9Mvqd6o#D5MIOF0`id9MCEO4gIb6m&!Fpst z#2@Ij^T+$t^*8y%3te6o8mwtsb|xHqZN<+{T@qj3mM5wh%&9wnYBqEqN-knGv3$k6 zc;8_?BoIVB23X{JLRv~fmg+jNJiI=-5VRe#+xz@Bh*6n8y6>2&kb2wSg>3`dbnn-P z&?VS}0rqUfdweVDyjy!(Uo#QVVqZt*2C4JKGtsV*<1$4Eqr+o2Y(}qCcoV&vNVXrj zx2esy;$}LGITWoFmY1$ye!<&+o(=I{W^Ib{^WE84-RT5|+qcxhS<56FF~_!yr~T*; z4OU~!YPrl}VcHD>iyH(Kp$t%%#w*TMob4N(n%EX~!FJ7nJ@0x^xyg{be4?534X?`| z4F@VVz0?#Omfmc#F?P}E>_E!b&NWOPslC%!B$j4u)w7cuB>7>A(<>wPT^di%EOU@K z!2wXLj*ozb#EfPZ4;&mfQX^Mxvj2o9mKhS41FG?0w3fAEFnB{?(Y932LA0@MuB36E zdO>K+R+y@B*&^R}o;)@kq+7s*B*K>_H89Ks)WHf`p1lQ4A5tAoOpUbWbQAa4sKKhk z4@M@FI%m9^EJmvXaiwx(eySZ_ZHYNOov&i3A5z4O}ocxY|ttk*-nUq=8m zM`_6pVwf)Td|j)HsN&&Qzz7>PIr7W5FhfbIBHa4c^As(O6-RcM6#ElRZwPTDKj)oH zH_Eh)0v;s==NdM{wBbTa<@h{fZJvT^STlTl51!EH_{B~&c$wB9XQ~8<)nu)m+{5Sesu>-2xRtL>0+;u?9RE+zSC`tP)C}=Lo%9hOgtWBevILsm!TOq@f=#J ziTsGj1#8hfp)tnSHuF>V8luJh9E{vFRcZ&{;kbVurCP&%R9?h>k4nr8^9*v~T3eaO zEbuZ`c%SxYVTc3aKFhqliL56O#Wxw|te6`sGQlDf{Up6&<1Ec2XCHgTuKx-9)tBFF z-hKvtUB_2_$Hh8B@W6*Qsk-l8>Bw&XOgHs>3%2@{M?!Aue=5M2HdvV53EiYS4{yY# zIHhjhZS@M372g>_c+RaEX4_-~>FT6Xj;bVs=Bal1lJj{@+MiX3et6gCq|iCUa54ur_880EQ}3||aKPNe!lrjx-p zF%WDvwR_V^f+xOU>pco^j^t7wIJ!>NV7%Q%bhz_8Sq9A{W640Hh5!J|71mOO2EC>s z0d(RM^JLuGL`Hi2{tz|D7<0naJd9%>Yt z{JCz^(v|6Vi8PrZ=9K+t6}9s1J>??yB@IUPo^fYY>vwp-<{0BrOTw~tXIQhrbgB?F z=cRTt&Thuq#;TE;#S1u=QXl0B6X3{;*x}zDRgQE~r4_@wE2>0i&d=v2W?~D~YRLs^ z)^*{8Dl<|YHX^d@Req=SYFFbdEyu5$w`PGqEDlFv@T(y6GJ(8lbbfsI*D2~C7fT<# z#Z!c*FtkK_o%Es+F4O|3X0evz!->l53Vxe{r%<)-J)`u9tN%%zJE zshEQgL|ojrXE>132);49eeBNl09SX8BQEZlvg{)&^byT+{xtPdp?joaNU3@f-JQ5{ zyw>jb3Eu82BUwn3Fl(4xk*qh8B#R7GSOwHvAR-?FkW8&8EZ2$Te1q%#eb zv6`Rl%`Gh}E==5riK@D>1WFGCrzP4+`! zsGzBzymeElB$?0hAeeTJDW&7Uxm$*K`^k<;M^<%y+X<=Y5j-eSaSpCF1Lsy8Q`k2O zD@`vVOf=))eJ)mSZYs3{$!FBhC1IJMVuELxqFH2H-^u}M?!K?>u%!mPuxr8%ovuEj zEGYH$=-}1a)vU{0xi={Z2FLnCKad6@x!M)qHq&;T-uGV)TS$$*XXXU_yzwuV1QW zFMbv%4t)ip7tsRY59i5BPV5vrErxx=M6p*IZN{I65`@4s$1nt(+1I0_LY3xL&$5+# zVZk+BZn!&Juo-<~x;L|qTpFSH=fo!L8~?7KadXdB;GQAl7}11cX<7^;K_9V=*+ZCb z@IH#aw0~x*IZHlYuh!Ob$HOO!EN0-b45F-GNU0|dk;#)u51zfJKeh?jNV0u$e7>=r zFLMxktRt7cU~a29P1kK8%K=rNb%+5iyEVDX*4@28%n5R?^hE(NSL4Y5t8UPrAr0Hu z!@IdO!b%$-X#91T0$sXbsGZ(FqxDYwozx7#RoM_3mrzol`|#IxWyM9J!Yb6&=mT@J zagqZ2Z`~Gy@86#q9)zl8FT^>JpP{bUD{4|4rWfuqPoKd|nx?+VWfw`aQ=wEp-Gem8 zR;b)rt@1DHcxa~tMt&i|wV@O>9+l62mVIQQIv*r*V!*k<#iDW(kyOWCr|g9srg4IK zWmKe8>QBGLg%omU=7o6e^a^vyath+9feGc}hT4C=xo|4xcZMlEmlESs$)5#@Mk-;< z=9W6`&vGF^nl_y+VlQ)`nSz?sJhNgv-JT49&-?4VHc9x-hskZ2dyJ_B|%g%d~fwSN`!LczyBK?5MEx%RQ8_*FT0! z4_P)J4y<74B9da6@PawK{z)%r0xLOH#G6%jE^y|X1V)O8Ny;szT+B@c0 zv1kYG!rbteIkPNTTs%`;&9$_7_S^)|(TSV%z2|@l?fU;-(u3`Ve$pYW;T+I$R{_jt^6#w+x^^l;+2dVO#e4Y`(I?{{~<~HAKCbSP1^q= zW;3$>E!)fT_vOexlXjLrcqso#(*B2>S}Wq0oLb*HUhF2(MC_tREXe3ODuu0SfW~jx z%&P!PyA=VFiMahumhg{9I2~$OVYe>69uh#>eN*-?Ej1pd!mC$*WH6taC0?^pvvgxa zExK+E4ze%;eoJA*g1k@+XbAYSP%$Y@IU!0GFqXkO&`PCd4I(0rt35KKL+*8Svu+-SyXrN&u|#gmQk z8~r;L?2+{CU`4T{BI0@~TAafKop73^%n)sJSkd-#KWkxyJ$ zML3Wn2^ab@c;z<+QojRhSp$E8;8F8n6U#;uoeely4T)+Z1E3)eKr{L|4!6)xSg9|t z!;E|*PIFM#^|2clf@tSrFfmMN(Q4~r0tcmls-^IkloCDLRKATnzpWb}@xD8pc)(NbA?UfMX?1&?#>N4&B}ptG$#6%?u2(0knj9QN27kkURjR1)zn8OnKF$%T{LF!YWt=_qBz&X#r&G5HL6|xnwMb{Qf#?ijOz}c zQ6FEBJ{ExxozkGZGCJLjJ#wE>C#3~0yb2V1i$}p`pwR5pHudTzL5#&51EhB8tmJ(y zFoBsf2qB9t+jQRkCf$uUiq3=yz9t1q$`m*I^A|%A62zmJTAG7m6@`~$@WU!o1#`h* z3tT-WTG|j2R676k*gPa&Y>30{k*;9l;S<+*tqlIb(~^8dLCvlM6n1h>46f-&-96Kd z%>mrr)Xw*6V(kWs?z;`Pz)|OtIk#{?VUS?KA>U-66R)lKkose`eVWPf?Nfe9H;Bpv z+m0nOH;LpF_tB16nwn7VX!KzyoShLl6>%pj; z$Ms^Bf*L+ze+B#JSo~pWhX|fVBb(@2)ZZEP*dDD_X?@MGT`+>OBa@{C)6VBiSz%i4b(|$+5Z*R@%<>1oZeU z6U2BRz>Xw_<=nG|`~*T?9lS%jW=}>7 z2M(QfKn1>gLqJ|l4)jn?CmC_P*i^=iWj0hUo*todDih?>r%sRrn*H z1TLx5BL|gtj@%{eIeo6|nj-tcrxeQ*`dGvCJduNUsxtIH*Ug2HaNTajAmNJ+yHY;M zw!?fER8c$i%qJSKCDa*8cE!|-wb-g~Jj#WrRZ!#kU^_%M>qT?ib(1@3L?CA$p$$C} z3ZnHy7qkf@f;3Ztgha+^up0Yz#+wB%oxXAY&PCF+k!`6guX8aOTl#Ikuj|&f&9kqu zQ+$xrBQGn^VaJ6QvceDGvLP|BTWkd-wca+Qe#=nfLRu_RYi-_&O8{s{Y$%owS8J-U znQ@IFo>XJFG$(g`phhrWrC!ZqUtY}pFnO!$iQV?$+%L_;>cZ-lx>defvAKiZNEA*g zr`aM^aw#IzrzGq)7hC>D8a7^a*Tz4HX%t5*Bx@a-mVhag+5bLUlOMZbR6SR!2e-jH zW2nnwbhlOM8Eqn?3nRoDAvd99!x zq**D!;Q?ms%f;UP?J%DH4=Wu*U(&B!7Xua}e&F_YQzwt;8Yy z?alF54`HuYd`axo&Rdjn%hdGBex~ubPr9KAbC9ngEbHFr8ndf5enY(XWzbbZEQs6> zU|Nij^!Z3=a`Z$`Q=<>7mBjUK;&OGbQIDNmG94s;l45ZT!P;n3lX#V;R)kbVr4dR#TQ4Gt0P$TCI0WyZ`E-=i(&HmotSk$P- zcw`kj6MI4tX$OMtC>LA(%p5evZY6!|lz4W&))2sMZ>-6{;#lts4C7ytLevk?V&Nfdb3xGBaW>N5-zlYc zfZ|(RUa?B!Hq^_pj}ChL8%&Ypv+7&qdxDU4c*U}{4H%e6CG~#P;^0)Ln8w|$3J2>0 zBY>)9e(O8m^=sI^Pgmlg?`SZ0t2wf$mWmxlMW*7<5^UP>knedalPx(O0lPi>rBc+@ z88~iWOpBQ_nPa{;UHkdegGbMR?B6Cp9Nf{#`>rO1INh7G1d~5z{eGnoBvR=E8HC%{ zuLs-Id8>q;&fwSD%z^*n11y3*&kvKJt2X5-L{3;)>=ci|3(Z%t^L!U=Jx=P%oZP-`9hpJz` zdkN=&=7k;gXGPxCL6lu?1c<^t+df)v@LjQ(*Z(GW{fkcgKO=YjGb#Nqx$B=P>7NuA zX2yRS$FTejv;UpD{y}^BPjXjfDTfStgswX(XGU%k1&w5o`kkMS>Czq(i%cAb_5>o$ zX}7<8OA~yyLG}1_$vCiPFfPp9UY+krTXM+ip{sg&4bCq^%MrX6qkv>7uP+91flSfo;+@^pEq-K!(cBY^ zAykl2V~La!oV`umoqD%ya+IgWUH+c5I~2=VBM>GR3F-#}lu6Y6P4KY0q$#58(mNkj z`_A3u>}D+51LEGjv_Aclf<^*MjLb{A)AcYVih_F9!RDu z3LP9o9lwCX#tueMBlj;vv;0|UtPK2%;%j2<6`)=BQTxRZw7K8?K)86J&a70iztWpX zXwYEb3w8oOkuy(C`z|c2tc)^ju_udX6^(}sM5pWO-|!zQM1(g}xeDH@K1Z!5^ADCP z)p`UBjPdDrsvst9=M$uh06~()C|q$KiNTmsFyrC{tK^@Mro<)rAWiW77xAc)B2jn~6w^aqYXRTsF>J>R7X#J7xD0 z+aE+$&r=-eDAnK5O3t#;>q&8Q-F4afT}Ja^@4E%QIa4K$-%PM(vyXK1v z5#cPBSox!f1}W`Ay$jN=N000zB}M=d8kDZ0c}hsRkO(numGvqt$s#>v*c-$yHrXem zNS%N#@Dxb{iDD}R{l#EUg`SacZ7;)X{T`PO;0dAX@BjTkV)l56(+#V;SQ9wd zR-`k*#r&xc$>#|vG+wSco(O6ID8^!3(jx14Y3m|Do$ERlb5sx^fAs`CDUis?qI^@k zsQy@V6|(=aD=BD(LBb3>kSZk3r%+E!n;5U&835*p(}y2|eoXW1xuhAiUsAE{4W7*c z`KxQC;(Bo3zFbD7hhUQ#II@TIy*Ahm18iueBv)3>x_uVenSJJtK#}u`>xUW6EZ2Qb zL4#kms-`&t6%0aAr0afVA6b$=Ts~UON4BOFyP73?&mVR%=84c_3rjBWDv!MW(u8h5 zRZS-SsKUn?=_FiHP#RG_$=!a&ZC4lUAG+LL$5i0s9Zs*QG_>oGngl_0P39X23=o9u z_@l#Ba`+lSB%B<0_ZZCpUxjM3=u4T#%3%e|B~vcLPt7)+y_cJ3kJcXSFO*kggWtxn z$ap*qE`cx|MwiyQsu~lpPK>mTM#+*At_(Dv!q&~7{tVfOOsT9sR5m(vd z493?_*+tL|2lKFM->vLq6)M%SM!c&0ZuM$D{8_2219M}weYaUJ67h?!a;w4b5m^I$ zu>qc!%cb+GqWR>iuF@#Q|5hNs}`gC&<^Alf7m>Mczr!JW04$^5a4rPxs!EA0Y>XYEj4oa_HweC z7$?0UW{{LoC`C^3^?9n*S##$X$aB%#CykM|udpOP9z8GzM z!(m4GFNKDpAQM)Rct#*mAK*ND zL_yW4Tk=tqbvTR!0+mRJns3sg87Mv&A@Pa0q2TIi_VJdC@F95uIq8%O2x6tpRQ5_%KyfYK1GIB~OY;kh`yB5-za z-q4fNosIrGZ_7@8c2NFMgm#Q%Sm5W3;3%~zW(BeI?;iK5Q5`2f4oR(oz^2g0`Fh)J z=)e$!$DwBgsRE$-a2!Rt`}+^GPCbHLKLDH(kBG9J!m#GDn5Q^c46I#g*9C%&J|(?qtLAh{d9(82@2BQaAzHAo zBPP+sq*b*PuG>U}VO;%HC0eLcl;3*g)Jj(CBCpypOrdeh}+Pa}W45`0*m$FKZ zED;@=($vA`c~%%loMp5zsbTe-H}&b6&axjk>x_*^YojF<**Dm~OA*>iF^DO=_>HQy zpDMl;Q*407o&#U{H}KZ$RQRs{W={fsNwQ$i z^^E00{H#dVx%yH3;;tRNAKk{huW>3#Qlf^IXeXC!mN_MK%igt#8*~LG1xw@fITu=o76TCc(RIsdc-BP9Ki%1N>NFRzEkg_S#4>5!=+!fpAZOj_WSm|p&0*1T745AlUDY&H%9^1nF}>c#fz zWGIj}6ulRp zMT6K?zh2XvjN}BY+;CBs@4D^detYE{Ig_QXD+NtE)n@sub&DJ29TkFVVcVg;{7bg^)O}5T$bLN z_A4HBbnm`P9!S3W29Wo9$-5dlLnzDycXbl#hiGBpt4Vh`U*8@C-`s*P#!^1A@2Txr zoOwoA-XaA?Sx%0y`tta#I*@zA!PA2^4$b9O+D#W`myb=bPn{r7C6Hk4^yIRGwWCQ_ z4<&Hv>6}m6k{9Ql8^K+qkyXCBy9LqrD4d6sP<>U+0Q2`P&7DEnQ(mOuA#jlW;)kjHW#PRtqGU%{~h0iKPhtbh}czPHaWi616<4;|m2m?!1F zVGjPTQpYg{)}N&aCPk$H8Pc7)25}iXEza~Lx$7i90)v#FSzeBRmdbC&74mfpl!zp4 z7{i{-z4Vi3i6ZUqtu=`y_x(hYa6=r`Yms2a0nHDZ!o+S>mV)t&q2j&}OM3 z+BOx!N{G>2=);0*0OWW0U_zYR>@EeWV}xfPxH?mh8YrFn%5ZDeF; z5K%pLXxnBtB_-Hd^k~(^O}G(%3Je`y77cAC=$9yQ2Axchm7w&fr==9%v^jVQj7Tcp z_#SDu@bApQd>CuhjXc-0T#ja&MrNNPUtI@$eN>Kj&@U)j_x}8-Y}^c%X;1UKzMh;t zgUJjY{_#mM;bMRmzQIcZl`1_7%P$91;o1=SHHg^&Vb1MJ6Jq+oY7;r*Za{iD%1jeM zKIe8A@X|L*6g^kN%&f#hb#n%09T$LG{zE#dfWCHc0Ie%m*+k4?jEGRI^MkU6A_<`M zCfbYtDzZtR>)jTWbGsa2_uZ5~4bLe13_( znb%L$xqKu=!It{l#X)_)(DlbBNYbsY7K5(2@K#ZH5t${+*SyWTJoOVw^#Ok&N#~z- z&p}Q@bLRyo#n_~m^dqv24&70gXmhx2+*@&=Z=aXsXPK`CeBLNYs zg-mw%Ohl95Iugou*Yl4Te-OIaA#S&g{k|sxBoKZ85cbzsDIB5ePmg<(l%ZeNE%4Fz zQ&++G;KE3S8Uy16^b)t^KLXgH6SztPD5&5mSwaxPigsoUsdpr<7o;4JL3Os@ZmA+E z0w4~xZ1ULxE#w~Aco8-y0djf2y_W`?p#*iv$nY2C^EeifW!lQ2=mnDTJ|~iyrJ_8) zao)h*4&60@QQZ0ljF-wJa8D9avj5sSyt&Hgh(gPVT81BJpCBvHM9H-2c5Qur13pFp zg(t(06h=a`>)b|v<@SVf8Pk4G0fBeAp0IkmT-o`RkP4y~zec8JdjMofs;G9a>^0C0gOD|F*N;E!S3GOXto`VV(^=Ouu$Ne)G{ioFcNh{52FBc=WAb=dd?7BF;N>m5m@__JfJY1^{0f`S^U2Y%C*7_l7W4C&h8Zw^A>FUmF9#8@&JfkC?Q=8-_Qj-r=! zKR|_$)Jj-G{EmTm=t^?|*(DnGU(?j8w}8Zh?_4hs%cGfn0MA%bk75nFy2+?Ls!aE* z38JodVn1#hW(1I>MhVzvg_@62OP$T*=@L8`?~>~?FxYYCdnaa@d@K{oC7@AnCIyg^ z=l$=v6z%9LbG`XqEzJ~jYr)|hj>EfII!Af@z?wiw-CPiH#o#s8 z_lFsbnRHsCJ2KvuU#dlU>GN?iQJvoj-dq!0C$EE^6WG(#Y|op7AN0;8i_BOl_~U}4 z3(VN9v2WOwzR#BjJILk)xvEo`icD$0^F8c~J`@`d)8!xL3F6B{Gh-sIoWBJI>#R67 znw0l#jw`1m2l(cwUs8WtR*a*?mh%B=MVgm&Ol=ntbZk7Rjba%pOPx+@M>M}FGeQs zOP+AGYyQw?;zPR_;PPLPYW5igSUsGw3dkv5U-ewC-8Ji{IABGIbLPhFznV;XcDBh7 z(ZljHTgX>cn}+PC>A1%NS7gz;NoVtxTkxh$B6b79#5fkK*vI(p7{VR)OagAVUqR%9 z&+vrk^aip*%e*iVI^%p-QEtV7B1YGTT0R7=sW#P{TMJJ)Hy{jawzZv@!Pora51)vc zt;TZeeIc@b__OL-( z3cL-JS7+2f%7_b`PMS&-N4XrV;=v9p_)Hz2Q->iOB>R5iTbfFJ6J&69fctv^t9}-a z75fmS2HC07s37aJE6W8%K3MVzL^WozFj(_m9@0px?Rf!ke)d3~!pW9w@||l2hC-Fa z4(kus{IpBs*F)>$i6}ik3u>$8^%+YMm~0buDi{usNx5okAyeq%s6Ac1BZ6V#`Qt({ ziA{!>s9Em1XWIAES%#;+!q2++)RjI*N$*y(QUqP_R>j^6SG`Q;@RDJKU0%YE% z3{;!0W~DJA3YJ_k--VbNOBA1W7D>+c**xjyufxURcsaHyJ+ITA1$c>37G|mFZ{_!- zOQm6{xbEzY%t9fzlxkerLBr~szH>z_l);*N2WrdwZns*`@7+QHfJh^gLG?k@)tHf+ zg1}VI`i65|wB?FtD6-ju99B%f>`3>6C^|=4SC|s90Km^&p@QvO7}$Ij!GP4mJ!=R_H`>0_wh*z@9OCLmaG_2mbt?>Rlv;g&D6@Xaia;Wvw0?2r@z{{zH z>Y+Of`}*E(@}<+;B;C@ ztM+do2`i%zIdSRU$0Eq7R2{8+CXY*t)ay2_+L$q~0B$v?qbbE)Nk*-jUQ}i5Gtcvju51@{E>~VY}!4 zSaYA|L&_U-FdzEvG{d$-a} zx%`&;$DtBOVy1}}Z5*Ru3NH@Q9Mtv-AXa+s?C-XOm0=)L5wOPtf@y4t_1j4$6OmKM zdS7b^nwq15pX$EW7N-qkiVW;5W4DJ&^lWN65Bks00%#@*7JSKGn;_Jss^HPR!~Dyq zYRnky>|Ql&g_D*%d^uhi!bM5)=SW1#<&;KK*C*8I8-Dg>%W(LMvCGjxh7(2=Od3Bf zGSjE{kEr1Gas!BpjD>TdfSpT^BiDjq7-z-fE=QPJF<70FOSUoND$`1pk4|JoZYN%A zx*>4g0cw11>!gaoh#Z%n=4 zg{1n1bf!>aGV9n-!?euJDm>9H9<Efv5_u&RG_Sma*oMFlN0A~r>&zwhzVJRf^Vsc)0-muHN)2 zgW^mZhO&965B|7YYEP_>^#dZXQ*svYBoc7PBX!1_!8yXeFH7FwKKohr{_hi zDYL?MiMXg41dE3`Euo{%5$z~L%+Up=<@;P4t+i3Z?f<3oOh}#MKeFD_3I8!9=M~Lt-@oo&jY41rvr3vZRh9sgw=~%YF!Zf7Epq3{Q*8iJRbhv z;e)Tb?tj~RXh8j01It6P{!uP|{rp*iLH$|O{EKrl%U{IX|6jum|8Q>pGx-1N+|2sl zsK$R*PJaLqO!Un3f8hme|B4q#8d;k-ni8=6$5dkt8*DbTuM&%(9rTo$QOf=j@OSJK zsc=Uh5Pu|%e>=QESUh-k#CN9pBCzKx57#tIZIR?0G&|_fqwCnCJ;Irw%r__gFJ0*B zK^ZLh%wkM+C3GJ%9$`p9{z^5(KEenHNCa4h2-zS@<-i{d!=|-)puEY{vyaD*5ikC^ zIOAxhev%87R45mN;4FN|35w};ev=#!H+AZ!bU5zav z+0+ecR`_7_VB40==mE(m8mq+{?MfCe^B2xJm|S$IZIWG8()<0%HKyv3H~-=qGktN5 zLm7hwuetkWC+5JwbU;r6%s$8p*U$uV<|EhTY|CGmEWCt zb@86NYFxVytsJ9@6&>4e-!x-~8Z$MP8&9pf=Q>+8SlyK)L25Sq$m$%alMz;fy9jA_ z!&-ay+Je96JPWtdx@pG`Y3kgT3BSz)gx+)y*KD3$*|(e7qjB6KF-0q2*;DCI*0?gg z{mjAkfXzV8NSPcZUoCzJVP{Gp=o@>pISS!$Vrmj2>{okrl$lX@<8i~YnwaRXPS&ZM zG8}0=Ly}%IG=9fA1}Ja(0UrkCg2Ed|i|(RzLCfE#^ZoJQ9a;URH#2JrVk3FWd&euD z6}vZfYJbQRMBI788m39qaY=Biz!ouVXys9g17*?GavhpB6^_0HFu&0qKxF;y>%*S? z@w9|1>fI#36bfX^GDc)BqkV)LB5)Ssa;?Go4zGXf65v8Ha@OwkE%PJP(RhQIW;djB zEeXfT3p(w&P2QIQNIB?*1TJ`%I=~H#Eqem-WpL~)2j(_f#)?Xme0mYZ&y=JXrTVx! zZH@AK)PA)pBWs)>MP4aQjj$#Q!=ge)i`BwzSg@p?Sah3op9KsNo0C{&*4(On&uLKn zQnQ|%(koBM8|iQGT@3AycFYV>h;%`ZDK_CLQAT`?;0shiV&%bV3dOR**Yq^Z@%%IN zVO#6zO$UQhVXKx3a?r2N7Kl_HN|*c9cZePV_*$se3&r6>0IB zo50(PUycp#A&N%h(0@$c?N@(WVS(bA-EWKTta4Ay!#@-{cDZuOsU6IcEy_&fQ6m&e z=ZWl|qpBlL#ppa*t&Ee)1n~_veDQvFUJzuUvvB?u zJ-^T_tKzRQ&KDUTb$+a&rtL4Xs$_3>6o7=**H!-$htL6#+%98L3-@7S*0+#d@}P@L z_G?qVc%)e})I6dVa*smU?-DW}(^I(%kNc+1!t(PgR%W%nIYaF3q^+^&qA-CG5-=19 zr0U6G^&Y0m5h9c+jj11v?`V`Pr)p$lMeulp4^^r$)=1r%c%G9CgNQJ+x*Ng`3vo$I zU+aV~U3<$s_Oksi?%pvm;SFch;kbbsv^K;15f0Zja(3IB) zOKzFE@NQ+B5(OR8O54{sNi9JD*{VeZNsNJ$=YJVpgln(ZyG*M!LyIvS>x?tq&GtQUordAWbsAC-J^u-`q0h?w#^xH$YE46UgXWRC4iEhKSr; z(n~17DGI5t_54|LI+k8??Rd>P8Yl3c7@k7 zDQ|$w0eKkmUrmt-2C-3fbEEJAN#yF^d(l0=dt*3^J?YPw?54)R9sRY)gf^1V8xutB zPM5cXWKUjy1!fpH>%!0G$R=idr*-<5E9p)S*& zd4M0=*rdBA82qIR4?|A58?;Tn1q;{;9BOzu%+IIxBt)`i1p4%4XG^& z^CooSQx1U1K`Q0BDq#WXa?Zn@*vnVrcs3<5EKt2$w=*9@DC>ef&Q(N%$OLa$B_19G{*8GxykBBFkWTC{5s#OQ+z`+WVZiVta(d~Bf`Y; z#DS@qD%oJP>2G|cEBMSa%W3-ko+(70$0#=-uN(Zte!xE(i)BQa)ni8T&rBM!&cEFKSxW z!-dnldoJh+?N?j3wg2iskc&<&8A7W_-)8Y_ICI7c@~#w#6gSvq_2PKVi{>U({%;t? zzofbU8|;#Qkp6$MOa8(6fBf65EPwkYzci$Own_Y3i266e7Rz6g^JVG&Ti9Y?Wu{?Z zVE%7{B7?NZ$&|HRD{<%HgjZ(@I@HS^M2F zHscW1pW}Cuzjao0sxply8LbZ8@k~Q&T}5L#;=(e0HV2@^0f7zlB}BChBPAnJT=>xC;r@&z7hXvADV zKe4qEYGZ?1wP6<^=varV z6=Bw`p3n_1Y{wVcE&sX_lr_PErGPfUHvj{6KzoaUsNhn*3+ebR0qrb*XEwh{_@T^Hb{hQftFR z_GJX20#Edc9pVJj2(W6tAB~$E0^=3s?&*!vmq13bTljm^nI!xMPq?`pf)>z#@?ij( zNaxuWB=ioxV2j@RcD@5!q~&I7{X!-}ZHH;t5AnDw&E`xQBS~3nGyU@TTx0lY{S3g{ z1>2%xcd+|d7|bHDMVyV+#J9Ld;B0y;%8J%l5o!B1s1rADzQ_1KZJ994&^03*^XZgo zhA;wfP10g~s_L9R^gwfneF{t*prGl=6yEU>M~E0=x#X|wN}j%pnN*#c++Ji#c%WXI zh5%DB8aaNuG!+B(q&z*d+Cfxf-S~c>b_l57Pqa;ReG{5c9D9=y4Np6TSFfs8bhB>p2k;92n@rZVcn%0wcg zxZ`|$x$vR!kk~8qZr+`{Ya;ZD>a>_KH=6p}de*G=ySaha!N(%-^G$m8lTw+NlkK4g z;UZaFxF^5!`&3~?lUwS71Fh7)w`-AO+9v#fO&dm-p=F&NH_d8$*cQxkQR85hEx8Z% zWa-Dr0GsqTAD9>hIHW%MdH)jCn9af_^_g}do0GP8mhY>BVsaXl)4Gqs=~#X&jQ7Vt zDNH1QeZDa>YS9%hIcT=o!>pgWf*ooFPL#ar(`q~I^_V^*$-J5q+l-L@RKRkAr#v>S zDz}>fTZ>o0YPEC6)#AKARO){H8mu&5`3e?%*NCO7Q{&_bN8OM`d2%DQhw(&FEA652 ziuE|Kv4t!Hy(SYGSY7-xNXc^k)iXX6IK5TWsrwH<8vL_U6~eh-F$7Kjj?o4DWL zOJSXxg}wCt19Yp@sWpE(sDOp$jljqVzAQ(JMfssCAK*jCQ6@8gaRr7On)a;PnhqrV zPRhuzBmK_|nGx9m%2!(ktG4*n#-WhlHiUWegT~IgRcsMW@3rh49C^c`I-5PO#v3`u z<};^<#n~Y@5cun(A3~kQFYuzorU`L`h*xsNkkQp67Rn7CkqDz>B<`J1;%sn8h~P>O zq4{Eu{0GIS{zG0n#NGNZrLuZWQ?jc#aV+p8tUq&c`(xPHB^@t)ls)RDB0)2 zsgzrCtU+!AMiKcM26IXR5%%G5Zp+}W3u!D8M3A@~nMPI|ZPiErR*XuUHnR}nLFB4K z2L&dyQ!{}l8a_^VQ~IT%7H#QbzxsfFZMztdm{0r85}f%MM_ z;9A3R!HB&q1>Tk+hY#@V!h6*br15w~Q<*DOM1PcOwtaJN zO!})eXN$RZ`Feqs3$;UVOZ)k}lX9WtH=|n2pr4ao(Pdi3{EN-YKctP9aa-iGRJHI@ zBJP3cu_4qS?vmR$UI8#FZIX{!PO-+yw9uXvT7)F6>mGO%l@qPM{C8fj(mwNUQ@>9& zrPCJ{a*AN)BI~>2_O}8lz$dtsVbWx*&`xGr(!(-3S)4E zymoZxYt8rk=Mkqbl12voN!iT5E#h;XaFk-sK*EdV)=|5XXC&UKjsrS-3fg++30HE$ zoq-|CkOK+M^b#@1EKJ$5Rlbuev1@q;pd%d9pcUz5RH5ZwK#-^OsJR-eEcdBtZUIO_ zhjwkQC1EHmRL+#E9<9DRFGdK^(-JU_^aBcS4alji?2_#%l1<>t!OOa9T`@d^Z0(6N zs-t)wi_6+nMGVB?7~)Hr^4KWP$BTyxS0jXSbghU(L&c~iwakfYz$~!+9<^qJv1c6* z>S5kLf4Cm@mq%i;niwv&?|~7)9V0@1+6WvrgafaOefm-0{PTtytHsI<#HHEncTfc^ zO?r<>cr=FsoOns&cItuwS!5&vd--Wq9{9B@r9*pxaHl^UF(a6ppdQr0u+aW9jBJ3D z6#g$inxD{|zlOpf1J%HMY%wF@tI$*hf2iR7a094W-cW5#BQGb=qjij=!^{qb$;%E* z5$VP0$`I27U>75{9M40lhkRVKzkUffD7NMDy$D=!a7OB_e`;#7~ZK&PGxlMpuQLY%+iK?V~ZGXP-7aeUC zZ7vfv)ZAM}`b;kFCuuV@-|ori+8ZQ-lkbYOP8A$V24X@tVb6{J{R|nhLb9ng8Kjy$ zS&y1wIljw^C}Y&zf#sj8q*pxx5nc@_{suQq1hIek&mA0xyL_?Ncuv2wT`8Uv_4gu1 zN2xy;WwJS(iOu6Treos6?UgZ9*St$Zbi>V@K4^3m1EBySE5wj!UR5bFQ|iBcvtv&x zD6GVX8Y)28YJ0}8r8F73$N7DFkc&e&eGH1@r+EmXYTGMdeOH?Z7Tcswjz2pv3z2}S zm{{`QMgoeIEcc<_mI51XF^$YR%;`p441-G<;7n#eN=)yb?F5A9cDc)@;T-Rnn8|vGj&VvQ+vjtqC{4beL zc?SC4?6Jm5mDfTo!QBMp#I?Xub2N2GPM6zEdJ#x{6CnM{X@9_Pdkvu`5G z-uy7!WWGOWrg?lU@E{*PZ>508c_!K1#JhdnSy#1xoEp%*%y@>D$UpN){~&{%8AluJ z`4FFF$}`qw*QQ59l-;%KYPkKC#b1dCK?EEM=&wDAJtz%49h)+eJ~gteU{gDnRo;d1 zrQFQE(t%PBCP*aqa;LIm#gZgHthg|?$!_Ruhd}ccr3R$x62V~kz^sTOpRZw7W72~-s}B_$6A^vrS4Qvhb|<|WP0)xRg42SkH?j~k zBArt+kSvE0ubwcn5q$na#j}kGc!VhLAMoO9%w;jUAmVx^yxnevB0pIPO4Bn8=v6ys zsr>s>Io;%j%)GIpa5Ba)u$Llo?ly))6>;`pcj-vg$?FO6Zk2{iyR!_c({lmL+L}pN z^|`EMxQJ%u9c|K0biqkEG5sf3;=2C=8`FTHI-VxbJIq8b?ll)Q3I!~aGR<%M&oc@^ zmI94bdsR0tUvi~^k4}#(FcKI6aDRrZW`7lr6mWoBk%Bc4+H?Qwwi$>_^9=G(VgU-Y z)R|80#o#=WQ%_kH&}B3$RZFprIPFd!0__%m9@CCF(GcZV-%Zwm%8e%N`22$t;b0r+ z>tESdLR?JuUh$XST#E6ThY_T)av0wN60fS05QpVfOxicP;A78d720ILClncmrdhQAvhZ@(V=Sp@(%N=Lt!sTxkC)c~Y^Fg^leMvieo>ga=D@ zE{Wlud@PPLV}I9v!L2>ZFyof%AYd${T})e#Y4Dqv7gw0sl-Z2oMvTb~Ak}NYpyIF> z6~21*Yu7UekSn@Vz(m~O2{>*w1qw085t$au3t$^0s5?l3{W#}LF2y6x^L7`XYQQCH z0VS>l;URme&64|w!4DD325QN1#dDEX)9{>;oz;GRcrX**g#d0jS=UTnk-gmjxM3yEmFCI5(MsLhp(Jln=eZ^Q8=Yd z-Gh3CmVIwyyHpC4fG*@pf1OXJV%Yks1om-Xq=~?Ss9& zv?e*C7abxTvb?`~HpilsLf?%cp$x=Gr2e!jYkJ2cqnF9&qfP}hU;8NCO4{zWMZ~V$ zLIBdDG=2lBq`3UakOLvcO%TY;B?fzDxpiRT6&svpgG@r;mH<%_L7+955%ELl!)Xmg zx`p&}vfOY+#{dn`1RTZHU-ISVmgxaUd`pbT2CpH~ff0O^&1)0Sr996p*`%k{JD^4m zISZs5bM#yhIHkH7{JjSi97d=GIFIi2C|6IC_JG(I zLcm7^VUN-1svKW0+DeR$?atOtao>63)A>bsw>n_TWTq8gl=0k&5)Xim2C_lS59|IuhiCV4?z z5SRg;WBvnE8_BPY1wWi31Y` z;tx&~E4QO^AVTxT2eH#nqT3SYQ*mmK*T4vZjh8nrWHeK@ z6@TLi&Z{kl^xRySh~lHDCw8g}P%zfUS-q*5rv6o@hi!&8Y89NAjiI&h$^vC?_RBS4 z$KT!9fdavMr<%OXF8|K{{K`^zVgA`!a z*bh%YYvfKCN4_0)bLQCA#f^OW4GK@}M_m8Z6tT^!K~vckVVEj%`#o2}BRofX`OC5U z{qJR_tNrt#eOX(lGu)d=7*}>Z66Fqj8_R>yuf_$%qNmGf%^>90Z^YJ@8T=O)V?B+_ zXwDwq*@S@LxM$REw@5tOOcU4B^tYO) z+8?kAN}oF#ys7=mCq*iA?l14dOIOc;c+cH98E1ZkJFqBHFNSxoIK>&_RUE(}c*O)K zR9yhST>@>qo`8Y0HhZrOPI-TLYP{jiBTJe8cPPvDFHgy~W;EE7z#)L~Mn(@V9YnwmEfH(I{JJ|6HCql6^tDsdPo73_cp*CB-PrH9xZtxGRX z0ti7qCTB#pAt)dOX_cg1P@Mcc!i{87G>zCN29`uSYIDNh3(~aeziJ3U*X#U*FQiHM z+EgYx2Fd4@=J5>RU<}Z2YlGaFVY4}T-xIizR`NB0zvK=Uou_#Sm0)>B z2g6FiuY(8FX!B2vBCx~Nj?Rry4o8sRk*QhjYBGT~h-@+SSj0mR%$JF~(N}KeaPwRC zKv0~lsEUpvH2djtwp0{>t($Re^0ko}2W~(RQH|O1`xKR#sg28LGlo;C+Z5tmlQvH< zq&hm!Z1t6Hab(L-JgwFCLd@ybtS@_OJ-`}aVH_(|c4rqHDV?M1XA4qoJTdP8T)_G` zNWUeR6C2?AR03PJ$PDbQnv$4!2v|a^8e)VJ5YVg|#0b3vkSp}BV;y>vRA`mQAwk_#g6187-@~)j$)=kwA2`SFmyO(j;QUJ3&Lp% zhK{iZrX8DF$!<*4Lt#WeLz95smN0%R;#ega)#~uTKoJWjWC`JX%Q*Ch8bL4&F+&o} zUOh@=C69F+7&IlGST2J%G$i?U-7vQ^6cv;7?YM1^CH3Ct(DZu@jI73uqnPDnFlZdX zAi``*kmICvRZHJDaYfq*q2C#mCv+??gmLGlrTu~XrrD9RHy9VZWZ_tj?{XK2;$Rfi zu^hzgRl&l4eoT50pclqZ+H+Vf_Zu1a7NYqe;GLU>)om0H&?RKwCL5p%N|oDWF8#kgk=O0RJ;9S{`NZyMR@uTojfBh+Ti_^ z9tp``aN<*A-0tJ}hB0Qm3imf8ZHDMD7WC3R%cTQ95@580^G~@slk6yr4HpSDDM%$2 zLu+qd_$h^c-w?LoTq{D*f2xBHI}v;<`$eHzR;fX=FvCQXW}hlP#%fngv|0m%)h7k+ zJdeo90uRAsjzm4B6~&EkhwAB8+l-;&8T6gIg@c%z)Ih?r6 z?62wm>#9pKyk&pE$Q*CM?(^77DSAs;%}En18m^h%UhFC`Qjbzjdh%{vi$Ks9w%4>0 z2@!6htfbT$N))o7lKRD5xbX<-bm4TN=$w^hGw^$FPmm?BVZ1E4^QnH1k+$0k$L+1$ zX8SO#g9*!fVZ!#IG-E~-SW4il?-U~=dCn3n(wrY|Q;zw|BS83UIowll# zz%mg}bAUdtyAf}0YOjjZB+TE%rlM1I*vhmjNlZFI6VUa+$c8MUXBb=$dzn4c(AHRoJ< zr?+`^heXx8>ORJe(VB87x0O}pmTTV1>7z1k%W1)PFtDW=-&p$yWOdJGd8(TMjGRCN#EE;Wa9!j4hLcYrQ^|1g!AF zy*1vUUs+@{b>_UqUz-|;R&_3}gUVnaB|Xw?-y2^M0xL|NwJc+O4PvTytRBVQ)K9s@ zB^`w+T7o}IkU>x$4mVdr*phIZS71EH$h^^?mdaNGxJ`3iQ#M#CL^n=XRyH*qhccJ$^VA(1=-8?mMSi?fO859_knDnc z2YfJX)pGcg;ixY9P7!Lsd8$GEqUF@OPNhFgA$wwp2HxoPqclJT67{|Q1U z!Nx+gv11Ld??&sdVS^bgHH4yof%q$2&7 zK@u?Sn{$ns-HQMyw#Z6@$-%5BE7f9lPFyKk4#R3`&o(GIUwQ9<^w5nsznTFK03KeR zllS`J+&09sqRRfV>IL2Q+hxemtRjS`kY{|A1`p+Ria>w2X;yV#3G*OEL=s) z<^$P*mch-UTF$MZ6tL^or+BWrcpj@!mEo2xe$&dU7t!wUG8){%xpVILkSGX zqw;u`@N$PV5@VZ!sCqYB%is@qUfWukI+@-9#KyXrojGR>_mH>dki}$@$eUGeq)TN# zGrtYpJ}>c4wG||>Wd&{|vr7{3)+mPZ$L&Fic`diFea*fcnjseAP#(<+e*9jZP{a&o zy>(A;5A-|pi(S$r-HY?XSXFnO5c=Ty)K&N1yb_)X9@9E9aD8zBo`_4GDr;S`jkXY7 zt2#3&=~69s7`-$44Rt!$PIO*6?92Z0YyEiLK26vxr&1;R3;Ou1(i)zSqUL(6AH&5vLS;T9cq@F)EUb+w(*=Dja6F>a;17*nimc9aO#SO6$YNkoHT zVd_%&6HJ&!#~ZE^)de;DzQMVN4P!sZZrC?G249aKpY9lokN5+9fwZm_9_N=_E*klW zC%B3?!2lZ#a0EO5mhVZHQFtH+`JpLjKCPwXSr)7pc+80@ ziEI)wlAU>rD-8{D?)vWw_4gcv*`u7anmGR04>G<$hNl2aA%Ug9G8uF&`Y|sa&)?o- z0_?)V7{FxF{r+`xH%O|0dXbeDhrHLko3y)rg+c#-A zp*(1r(T2T8b?~Sp2|U`hh_r|FQj5wrf}EpHWznGWxwX2&9l+cw+-SKNn^e|QSZEqT zGbSIof3QsQ&k)PBfNFT}msy~UUd+7e20XVICsHD(Qj`T3J>&t z%wZL6O<)h3CDgg0?3GM$1o?KRSxljYBA2|E8H>+NI zz&kQ4A6nG1&m?Cww_}u%?jSe4BF%Y;scP5RJJxV~MuLbUw zj?zs>4fgu=R|HX{S>`$`4uHu^y$`{G^|UJ!_w27T?JOYu#iMZ>^=off&MHiZD9Od* z6H2c#=MG@FfCUx0V+X5mMv-N82oGDyu(`cCgRAwR_3)XNZ4+V5a}?!8?=N`LoO4d} zhqE4!+y2fJvx7d923A3<8Nprm)>QyamJ}K2KR~``-7@{m1X>u2BcZI-hFc$SC}#%m zP7C8c>7mi9gaTqU5WLiDa2rW3qJ?(wR=-3f6=`~a2sA`PJx2d(Q=sk&P06p;FpXtZ zB&efOh&%^66h;tui|+}llEYwEC1ZUu7b0N{@ljn@K7O7@SSkg|!4UIps0qU28(T&B zH@0fa95P!pM=t+(#d6|G#!QaUh9fYtYpR7fm;xPbFeNs#mnhO30VAwfZ1P6v6(Vi< zAZptbJ)!y$mDCDEjYIYc=~=4HBc?LI3n~!^Qm3zE@~l;VsewR$%A8sb{ANNN2j!I; z%<2*xL?QQ!5#>xM@f`*FAJ~a^(7kb4cF)1K&twQCn~Sr25L?|aYk8MW^iRfk){UWX zf>=o5d}%=)@%pBQtAu3!a=dHafC$dA&4T!r6g$(Xq+JM7Uv+YO$W4WDu7#%V+wkAP zegj-1&`$o|5T#^bU<~=_xZ-SUr3l=@RL}*|eV0A9eOz8Muv-l;5ai?bH;dDAmm1fa z0%X4RGig-@$RIb>h>rdolyebT5Fd6&5$Qr%r91hwmk?pih9y=t33iOK&OBQx!C1+5owPs%i#aA!p}HEo*XUO!k9t|Sv17cx1V40 z*U^U>zmD#da#-`k{$p}Xo9Bi)!>Uf)SXP(Ql@xP#^cvj-Y?ip^E+vKi4Y%dRjSgSz z)6K&afYu+Ekd-FF^x2|Xo!0vlocPp*Q#;H z@D|@&*Cz4Rp1+h4^^!EK(4jq@ZL2Ihmsr0BH`ER9k-2_0IhJU`QIXWwoxFBj z%3ymFCRw~WXAfOmKSz3j0?Ts1N1s^^L1o9}+Mk1k^nvA51m^NXYMG!UvwA;UB_gOS zze?t}^DQSG>Zk6bx~K1ljJashHY|RmuZTqLYDArb`^oQwFpM#VVX;RUg2qjh)a1`Z zLh-EBLoy6x$jyk_B6Z2G_-!cKn97NQIjjJpcN7v$+u^+{X*WoS;Vd(2C$G;px0F#L zV!ZWQ3v!&??LL55pL}Pheh#x%5<8iZ?3y}%U0%3#9U$)03Y%-36FVjza;oUAqt7if z7g2sT^$}jT-Y0->WUV$h1HrsJ;7@{S705fAlqIJr13Sy?kY6u3K-y2Bq&b-!I+8h?K~|{cJZk+A8F1KK2>0-rT#uL+(_j_xOxKJ+1eK2U<;EY*_VNnMrz?|iZiP)~mI(c=#qNGeQM{%#TOR7uZpaTY^bQ%A#Mvso1} z))!HitgS(r?0VpiAzGLda`WE+nak8Tf@(u+ne%+{5Z(fU`=ZLr5B zv(c-wh|KE=8A+bPtX%5RIxk+4DhB~Q{h(NxHq+v zzdC^pL5QoHmCS2c%~sfVU7VLvS{*ln0>)4VN#YKq)A5@X{ccSxDP!K60b*-zrYZ8f znDI1dAw;^DZUXZgif=y{G(9?Kv^YqrUVI&DA{fWq@-_?GI3xyh45;Hh!xDSe6fYR^ zEe!Uqt!#ZYA5(D@bQU!{FSEx3<6W{66ZQ9=%Q8^WOSIRxL0Px8(C&zMUF*!Y;+D0w zXl)@bH7rGJI_QaAH3THZCFs}?C)T_YugnUuanMaz=Il&PUD!#@q0Ms9&JyJZ1QR#Z zrcCF(v=+$X{U4;IPW9WezL{DX_@zFs3XfQ476s`sbbnZ zS)_Linf8=O-!I7%rPwpHR?u%o@_g?_|ACjTmtOea@P&U_-T$xP3;!*bneCtMbp}@U zzb!HB|I%IlwzRYV4|AE%wY42qSx~(etGe^KEf@iw)>FBdmK|3!Wxl$YJ99YUnL;M9 zCyFN)7&LWx({_r*APcY57@88BF!Xi+_(5N7T_F$`bQy!_Ke@VY$r=06VY~45 z0Vjr+(HP@JE-3+uts>)zj4ii~EvMUfe$jo^k5cVO)gmxt}zc^@=Gvf7GQJmHYqE?ev^G8jQ{ zNv(!j&l3)&yS8Vrn~01-T0+}GcrFI?toakc#RR}cuG-rhhw7&0MRm)E26z#RpIC$X z5QPw-yL3_Pr1_`_;_c8D3wIZW@ZS@LlwCN40vgHi_Pqv}e4m4rb!p>IQ3R(+z_pb? zv)#Lh%VEEtA|k*7NdaRLNq7Y}^J4>V04vcs8iMdC^9!J8Oa+QM0mA6QKnD_96Q3NV z)mp6OW5(t?$hg4A|I%QYt&+JhTHO4~7bQEZhpDWnfeD~1ebFIi5R8D$W-dc_Y}#zS zfr;kR?ujZ|9q6xSjx3us%wRIyOHXkY@%6~uhD8F7Iad!ESi9v;aqlF%ewrXnS2fG( zc($7eD;R|~q_lq$t~HDY5EmrJz33;l;=^d3f{|DeD6I6xPR!&3Y6Aa_)^pzJ`@pzm zmi0hJbhr5nxfg`5^`3#i+{MsuiswKFNJF&OgL2ypy91=85gL9i8S8Tej%Yw9iLg}K zL^rPZ0m8Z}w5)2;B8gf;Y5lMSd9>0o=y?<#tTI;R3MJAV0BEreP)v0*T*&xnHYc3l z=e6Sd)Fi?5JS@vP4JmnY0`ECzY? zNV6y~+RB#bp6)UhP+FN6_zS~zH#c5KM~w+;K1*xbbp{El)S&aRs*k~{+*8*~<)e-h zrIg>R;>9yZL3k__XENzjezGNJ|ak@H_ng1*^aX{Ngk{ zPRF+n(s8MZ6TruT1{GzMd}SwRYxL0A%4KCv^U|`j*ZNkgCdSFKu{$KBo5k>uT|#yY znAej45F49i!CJlBI~w&&47a;;r!xud-_3Qd#roUSuNQ9 zdg7jWidI?G?@HC?ia$c0+L||ADv-H@I|q&S<4)dKC^{=EWoqdcnvj)-=9R}(RX@ql z%aJcjZL3Lcp;9UXHWn&5uJ!@xd|Bxd2iE$ zeoG`66Uvq?X=k8wxst&$h>kCU#qnROjStOzlxnuO$XIH(}FLw z9kSe2{+y;gQaKr>{N(8}8F($gPL6K`IwdE26p(=$Xx=du%;pokS=C2KjQ>IG6q=aq zF3D%qDlkFIaldT)mHRO7$HhAn7;Vy$y?9zmWkRtKq)zizi;Nb&=41dede>=P4D z3za{#RkTY`W@}VasX!O(Y8+`%C7)YKLIs0!;=zeB6N>bcBic zemzpteP_YmA;}p`r~;PuAjt-KtH{eNFRF!O7-e08N0!-&)3HV-#mNyPjBP(UcSqT32%F-ITl8Q6sOkvLX8G^?k4_h z!+)^l$NkFH~QXRBob8?A$97Wc-?Ef~PW8EJOMJA4l=*7TNswLm%vG}sd;*zXIFroXX3OX}8n6O1>mB=O`n z7%7mS+kGgnW_b0^yHeK|njKjlPcvw0^igUaSj19S44Iu-B?t7t(gEJF*}tw}bM4P~iae-o^FM9pXesPP5MITBjt zBtK`*rLuZb?Uills>IqlZL|V4u#axOW*xh=!wQ?Zi;gBsa5kKmDfZg0Ixay9j2h#bTEAV6 zbRfoE@r$>25-s~!FGe50*?`h&e&E;N+Ln_cDfq}>mhy!v!Wv&PW?*}Hoh6rodGfdg zd+#4h9G+ht>Zi?Wv8yVab`cYzha+S*)4#&L%kpXQd+t*JR^$mn648<>fl|aKBeiu4 zy6Jt=Nn@u!q@BjPeCto}0Ux@hISCXe+5i63LIT0~Lr&p`E$301h zGsHY>U%vn7rg92!om&^B^@>;&{St*V_a3K{X_G}c)f6`v3eJAthOW? z=qx7Yljz7e+&i;t;tLbc+r_QtnfFZxH;Xx=xT6_0IXRBecnh-fj(2v=EL^Ig!bxd< zypjsl=%j!@U3+~wp;cEXlG#$8tUud-a_vhM+Ys6Yz%db`drN2v>LLT0W7fD{KW>>< z^cYY(RS42yBCY9TztD{~_D#bJMvd?R6V?<}8;_rCz*h^nY9SQh$*Daj+6rpp(TViM z5Mt?R)71x=slpxDq*G@UEuj^=&1og%3tOs2;SxKSNWa8FSrDqt=SZlh5m}{JwY8dP zb_#;`NDXv@w+YqJ3hVnIfU4TaBekLfO5$9vl|@x%!{4oc{KnKi^}3XLX_y1~ei8jd zxbr(S-`dHeIhcHI8t$pOMwtAn@*FyX=$Teq_~U%Fp%G>TwM>sT_3PO0bql|WzNii)pzol5xKnbKLV0Il~( zxa0j!da~|Fi{U^#K33e>YPSkcq1C()nk_>&OWJK&3tFC$cX7xW!ODe#^Rk(1nuL*O zZbYSI<4J+gygG{OVdeeN8Z99r+ko>xwoU7N%fhr#l}vm_7N%O6TJm$D^D-t( z0AGXpUr-xx=lii-5I*MkZ8&2pmQKBK#3w=G4jnqbh47nMfVcbq40^~*Z&Vm#veNKILV;AYdDMJG7ocN3%B#X-RhxPg-6=!5uZ z=g_;^TiSb#L;48Gw#oO?<>*^i)x1K<60p>?BL#^1o$0&)eS|3FM^J)2*w6dONSzJ= zygX{btB3V$k1-$ESM**#+2&6r`HnQ}UjUV85C#}nK0z<#M!~hUC{pvxj7DeoQXJD`Pqvad; zFXN05QKA*KBY^MI*l39TIePnj;+|Y&;`)aO(z<9Q8?}pmAr#7yH?2MCNCYO!#F7gp zJH@GFs$GHrLyLcFL+}o{$Rnb$EpAyZ(RmOqYQUo4VMIkK{f66SXkJf07e_go06EPA z!)ZQrvM=6A9Cuw#=BGiIP;J6$&+iFMmU7SelAw}9vJ)pXa(zVLH4~oTH z>3WUHTfkJ}g`mkw0{Q!>z^ZrorXOG2R%RjDF~?!WPjI^Z#5P~(jgd3JGKU3cS%D$$ zMOeK6Dg?qP625@y(cL1=xnj}vad;Q&(;m`i5Xux&1jErI|k`eHZBDgz>N zRryM3N0PpTtDkv=Ae9p=y14_`-iv0P&E4m(vxhdrAFqr6xDS?Nd0Cd9)@hQU`|#nc z&o1W!3LFUd9%Nr;zl2*>0-8n~S{Of(_Qpd~8x;h4^u`pv(TR?PauE_60$==x!D_=^ znQ8Rn@SO#qMKM}?B8z;>?PV?GKB@WtBNQtV!!ndQ&8#%9Do%+nJ=US$>0xE@! z!Ugu7ae}q+7aSPS{e1nqvj>Te0gl@ofv)o zaQukA+z`1WW_2z_0pJ?idLWT=I%tvIZ$TB%1(MyxlTqu7CjNMJ#ukffl^TefH1Z)4 z=O*ZW&uso#D8C9DddOjo@RG~eqZ)uq9&OTj5_zwAV;cRzRLv7R{NU&5je5(AYQ8DU zn38+MF|PNaE2;ZIe^qKnv3LYMtr6V^TfqE5pw0*Mk!NixuiB%t+6C*}G3QVX&jQrd zQ8Rzx&fRj_Va*FR?b0##h@bdI)Qj}>y$gZgUHhpQ=D>2d_GN?fYH`;oH%0{YwaoT) z`ziOOJMXv5PXnXd4sM(ruWvAr;H7r+ALGto7hd^BEh)V9oBQl@yqIAnw{S~WD%WHx z^TH}Dn`~eO`)1no^(mJ(45e|Ljm-#~y?oD@+*^GS2O2$o4DQDDjQRH%)RVF~Oo{|f zMfJr(X2KBwR^rYXJ!$Jd-E2KB#2Dgx0OZN&QgUNB7?+R?tK*--S45J=4x@+|pUcB! zwrK?koDQnU26cTKHItN&^nZ4)bq{M$FwbFjhiGKOi&XrHzX$z_e)UGKi@N}nh6A|v zX&>g`Nk$f*ZZSyiwxrXi{GBlB?a)|0j4^o`979T2-632@7m_};|F!6Vz`h$f0YGM9 z7&-1dCI;G}Ta83*iGrh?Gc6t(T4tV}S-(vK1&jT}#xNsJhv{mYlV{pc_EZ+HmN0y% zD~mk2H_dXZ4Ck|VU#-ml;_jQGV{O-LV`Ig(wPM@0ZQHhOJ6W-v72CFLuGq=R{`>6y zcc0T^bYJhA8g)^1QQ!BCx8^gSiHN(47?fnMC7BZ;=u}~6fq4t^UsKZONERCV9;0&c$BT8^EvA|7k;lJ* zN2P!a#XYimq=FaHd!)!}JC44H1Um(1+U!yH;q~k51;kbAG*zT#(+rQYbB^K27|o-6 zJv6Zm=>-v-P3Y& zPKxFP>tSTwzGvGEVADtYE{5h`~n3jTDCY0E zj@%Q(TYw1Z*VTacH33}!9=ML(;4di6%-b}ioY%W%-|v%TG|G;jSei8au%<>rCimL(AI`xlDh8Ve z1`RY{E!-QzZ5rreB$lIsrf8gPID>-1`zoUa>%nL9c`<|(2>#s4H`z zN_qW^UK)K_lWW||`$8$xm`{5cd zlOoZj3d+kLsSeMAYTvS*yu(=K;|lP7qU2C3+H=F+AY~bmMKE;#46s!jB#ofv)3Z8d z@s+RKp7Kl`DSo{d3l8fsFrT42;q0%HhASlT5Cb*PxW5P;nbOP|yZ;Cs=L&6w4G>zA zB`PiL(huK~&k8L_`_r=Oku$#rD(ozpS&gb_(PY~g>hwTg5TNq=Wy`Fyy`w|wc@4hM zZ=CPqy-cuAuijayZ>$j(r)PUqoj~8zjFe445hD`i6vwwc>-kEr_kw<_sBrQ%gzOFK z!<#{lwTzW(20wLz@Rx}SdReKQ4ro|-<_6PUVUKJ8s=YDH9y-tcE{2g-YXsWnQ!|}A zrePmaIOL*q746(76y(-B@kELxF^JQ8fqo9C{SQ1289C;OflW%V#8UY|8L>f|_oQ(_ zkBT&ka$q(mxNNdo2A6Ha0zguQ!kFx^nA5PYqSe=jEDAkfHZ{0xytuZe#}@CdWZ;N} zQcbb~O@>d6kjSDe%*E}>vK{CbdB2>sUlRpChR5@XKo!UON>h`1g)EZlkrL{iE^Ab_ zD~;ho*h1jEm!J+BPdVUTxvl|`%j}yQ!CkwNYJB%jpk*1Di_Gbn9$X>w_1$la#f~aRE?QPW@_Wkcn49*lggl$>KOt!sJv%2hh>C@y?*gi*_gMS z*pDLpgqvN_?w~g}RBt6IP)0MfYE$}I%UtIrue!`dhDsA-T}|FX1I#F&AwS0?(fA3K zZVe#x4!`YfrgJ_`fjifCT@%&hP@xE%lvr*gkBb*5ZWZ4EG_Qu%Qi zq45PNYjpb;Yb{IcA*nFKqZxz%O098R`R|8aB@pE<53PY95)0%yWW+i}oFfS_O+$Lf2Mpc$z@Uo5d&^$&b~%q> z19}F`5g2y#>okgS@Fk%6cmxE7R6lbYA(%X^HB17vj=_UU98jr(io`zX%(p2VI0b#W z`s!>`Ti~JC32gaOJ9>#PTRZA>E37M_2kNzp?jB$=RFT|PGD?_jYTPw|sWMy-jx!(% zsw*g6a57ILzLI6{#%TBF+$IsWU(erAWQ~Pd#b3H)^x++88q+4o>*@GYXohS|+;f7l zwca5{qM&kVtT5-)C1vK%5jiZ2>c!%Pjh<$?;-7N(Y4nXcp(8a`{VgPqD`xeYY6US_ z*bd_4t(!;sSj-#cjSj7uF6B8v0LGF#lAOBq{pV{~u?xb>o8;S`C8bd=k4*KKPdR}( z)`;E`Gi;OJH$Es6Lpv}B3Rq?tm3od);q8uVBBAej9)SVx4AW@N;nP`FKr|Ha!h-9p z=PZOPdPIFMQUyBjo9DUK>S1KDtuumHCfvq}a-P#$LGGQ_E=gbdGL=`FdxOYwLM?O9 zU3VqKVlT6fr;)~e!wtHXe058Q)g_2To&z|Z1(0)cM_o??Iy1aL!J-eG{u}u5PhID~ z3GMa|T=8Gw$3Hcy-*NZ>L3L;(3?Xq9tv!7T7%h9)SRck$r!}nV0kLH%c(?_I>+RS&0o231=G3$3 z`uTt8Nltj}Cy8Q90o8cx^oO_-+0!xsFXCQd>N6q zN|CZbS4~w{PwV*lrBOR|R@x2$Xso&*gUW-H*ohH7#^#;Vync`n)O_+S^X7DRU-hpU zc|19SQw0qwJFoE%^Z^p1b?(nF0T>(k)30t`FWomsIUa=TSW0ULcneUEKXT9BQ zWdEWPn#a0VOxf(KYppbmv+f&OjqtKN0`KedO&H8QL1}~G#?DW@jv(BcV%_Obs4|y_ zj-;l!vr?q8N#N2+8r803rd)2UERwE-j9slpwQ)7>zm--XRWHXFn|pos!LdZV49`;` z$%uX?(770U7HMZ$403ka#yE^?95R!f7gZu%M<*cx+8-koSw3$KLzpz2*|afB2q+{L zKE%|Z8DKJC#^EAk_xt_@>$s#7SpL|%wdRO*UBfD~aMrzo1%b=bE_7~XG zP!W%QmzOwR)-!CICv3HlY$DTNP1Ig`Y!d8u>NOxJ%Zr<%l-SFVgegTTrMd{;8RbKY zmqWI=H;S(POxNNbe-0$c0T*t z*s{VNuhw&#=*(a?{LVV(%pgNf5V@(Llom9A6F@`UCduOgNHG>PaE*gz5!(@okMx4( z{~;-smI_C#x-^0i-8?ff=x-t zL76g}5Tz3br&rp@>?K^ zFu!fN%{xwP>2`pYYW#lN;c&aWe%`^Y>GnE1v1BeADunTirG(WhCq5MB)rJYUWVuEo z!Fx`)?RaF|gvP2vN^Ze$XHD<8=H7riB@PO|hW}6~NE-x-JXi^U9DwD_fexao53ay7 z7!jr%Ky;v*w3P!i%%zcc8F%naX~-Xo*Md^xNMd*KpX6VSj;HpJUZn2-F!UI3dfzn)+@+U z$#bjT8r*^HdYqr!2nJ{^7C4@Z2r=A$4~_qZimzn)9Bu!qn_<>s#V}F;y{{jEoens` zuZeYqafK7k^Lmgd4vc#k(q8X(s0sIQliFQiJlfiH1edW7@2!S^kPCR&bbvJQM8Dt5 zb*tLJC{1Bdr)STe9DCO8oQ0vKb2>+Zab ztP1kzjjZ-Y=0?&42|qtlU$I5Q0;0tIEr#ElE_ug4K%_brvUT%_($cP_ZddoNV;002 z>aOq7QtWxA`eE`&AxjnajxO0?8N=wq%;#%cJk?f&=nd6Y2K+i)ajkVo?p?1GY;A^~{uE|J{5X>Z; zaE99;y0;_T#O;gSP%vpQ>EVl`%fc9>!TCQfItvHU)6uPFcpLYvIcPRju#=E|(qF(J z<3st6;1B{yzJB;1<+(Go3GLnz6L5K{0RlkwS+O>64^IQ6BMqy~E=H>{ls1nx{p4ka z`+k>fLyPv>PeSHGi{$oRNVM*Cj3ki}277Fq*85!QN)FmUQW_@qEmJCc8C$TP`HS*( znP?rgSxmn#E`hU6UFoX_p4^n73y`zfbY{A)e{kDhkWev+a;+;5A$r}`QF9x zR;aR3aw)gAk?S7>bk0c|owUf^af4Jo+uma>{A|twKQ?s6ysPeoD z(acRQD#N^74TBXfJ%55HX^inYE!pj!W0f#@7$};wwIp1ZzoJbmicMZ<3^o6ylX4ug z;@U?JLEY&#ueCUuF`2Pg59K0(I(oL{q7$UudKrcm(ne1hojuLd*;vIo@Ood)BC3&G z2Uf2;Qr@Q_zvEetIj^kTA7e`3V>xGYN~VE4N@=a)W#nq7tYzB>kz_0A^F$CIl(S3? zBz#6FSN<+uahnJ)KH{21j&J6BL$;K*_{A`o>oFl)(>lPa{C+BjU;g1IPmQP;XzF10 z4z+Q5_bT;}3pW+$0NmR%-E%!E!G{CI)3k0!{w#$;9ym!>0dxrb{I2tT$kb(fjNco* z6(qioy&9^-bWPIhWss)Hgs0!lva*2DgVEy*%*>`TCn+c>@zIGh*GM#yKz~YK@SLpNl z0{UczIsZ5K{hvC^e-r%v4`BXZ@cVzj^1t@xENsmGxB&lnPfzzZZTc?={x9sRLF$i2K z$VggCK}_X2hWW=Pgb#ZMT{kgrb`n|C`{lv0uAiw4dWWlXp9_R)flh8my%i%2U6=GD zeLa`Ei_h(I4Z&_y7A+WBWZDpy#C%dPalXQ@XQGjpjCZdu_3Y$^@dB-c%B(~*0%ImPxFeMA{-yJQDlYVFJwo`-`G zeC>9#5t1Lnzw;8vqIw^Neoc+`d5Gci5a-aZBCD)MQUQ%g7aS;fbsS%C}H?)J#fYSx2C-{N98L4FnRFNgDDI}r&YUJdS`L5{blas4FyN?>hhTWJ(l zmSL&Nz8{TiN3kPCq_y$8U)`xhx>hg1Ywa*!R&yqbTY?0TeRjbZ>*8^hklhA@rdWQA z$;h?N2~ARTcy2y3Gx9VNbKZP&%FIENHnPCw_6yziG+(db^0mG<< zfSh53!vh~pTSrR`>Pm5w=!&%rtre*zb_q3)VDwXAnpm+#oudck*`9DhO=k9{J|7QI ztvCqO%wIc8_zW)!Q;;Xb>!i7f$~P=zm&UVR>*E0=!{Pvw$7RIy3ohv3`clF$A0~cJ z4eV8wnz8KW~Q5hglJ1$s3HbS&+{#sDcXEfZq0zi4sHwY{D_aBQZC z55uMA2bw||`3oUm<(mn7$-S~ej!y0?8*>Dx_b73E{!IT|$A0DCCUB*U#ufFIy>_%R z3a+cz7WJGSdc>&}R3j)T$#H#sdrA6L2qGnbNe>d7c79TH-H>5avB+M$i4^ysT^IC= zt$RXZ3jO8PGJ)H-CHTTk1ecf86juHPQXTTUjin+&OKFjET7vd)E)0xXWOk{m9xgvOS6)=)5}TWUQ-rp2XRFO-ckDQ3 z#{fV3tzfHdts)uDoujjnntw*LnRnvsEBL_!uIEICRe~Wqi#F%(>Y}SBtO7*Vp`=OOI{m&jkmsBMX9sKv;0a6GauxpeKfRJ8 zJ9ufy0g4z*;Xk!!M#e!^r393_%O5v1yX9U_W-HCH4c?MR-Izwse@Ztw%N2omwEJ*Q zv}MgQX6t!uG{ym_bK{X`wrMP_dPL`P!vnQ({Q|x$Dd@yDNhe7qau>bOT|G3>Ids9qbNsgv4g?Xr3@ z1OJLt1Z937b&u6Hulwx6{>HU6U6&pD1~aUkao}ztTSFiu!R~{F4=ddO==|Zlm0&pm z(nBDYZ8;Gqx#;jixr6PFQNEZd7-(9^Ov7d%fc2^7Yh*POJjfs*{+tZ|hwu9`k&GY{ zFzQ<74Wc4i`6WtOL-FK!v)YsPBo+Z1&#OE)dng$ng0~Bn(c{CwGexjo)^Oihm6rI7 zLD|?&clJnp!#$yB2p7Iw|H$>Rl+-h%9TzBqxD`jWFDvuQFy-5yCu_wCE|*dKzL_e0 z;zx_DVqVk%eL{>bT@l7Av@swhz!q2`~{S=@)m*?ez$+kxP zRX~+NBiwI=fW$t|xGO4)s~RB-rY1M*?JxL?M(}xRbV^0VB;YR{4_Xk426SFk}lKc5ZmI%1zwL>Cmd9`PG<6a-H zO!WgCv`Qv&$zB5H;X|42F&P8!$sRi^XCG*DEi8o+Rd4uRdm=&u_`N;65;8X zxShg?UYl)fv8+cnPnpnAtm#Ok(>CnF*hq>IVy?hyE-&-+cClnmf0u54DWP(Au)O%_ z&(=qRrEPQlIS83)@r>l5>Lng|wWu@817C&?cAktB$+s1$u5S~vJN@~DJWNTOx&UOt=C1zcjs$dc13S(2_5S@uWZ#e1U5#`85X zN6}{Hw<9>&b_dhD!eJM6vw8S-#4ng2EN-HYkgF8V?VpyuqFC(Bw{~?6-p1sHte0iZ zJz%gzri3z;aHusi(4cU>3ZfIoapVV@n^(JTvi#OSH}VI80l|)Z9NT(qNX=zau8B)-N2dVFPXG)u zf{AyL5=eI#Pikbsp!9mb((s|ugcAgj?OMK0Zcw*i{>n~dw?*barU9%Y16Vb&6ZG1c zV)}JJ>n;aGb{mjT91d_l0UYU->3#XBERNq&%cF;Y4LPW#*-88GO>DuVb-6Ujx2XA} z`v=#TIBoP$fza!cj6=?(yo*#dnmYWiuA=z69UQf*Vt(df^rUq@`T@s{0-@jwN}l09 z!f2Z5$A_S8f@qobTC}mZKm<AVs=gHFqlr+CH1yVVL;K4rdtH2F-K(~M$ zkUoWjPus{a_!%e+Mh82k9(84yaJk$sUv+_=dz;hfh}Il}!Ej~^n$)++z>Ht4_(zzm zcJAl7mnv&Gi0}0wY_5N3^=X#2T`MGtn<^iWlmZ*PXj;Sc;rzg+aDmf|)sGl9dzthY zBFFok<1ar)A}Zb8Rxa<}RlSxmP_LDi++SfCsukRB#zlW=$yMi^S+#UGA%ZcY*DxCb zs&K#}mo?ns!_0V5$^TIkkgk`g&bUx_vF9oe?i6K%>_dNMWPy1zU9y_xbONTQ#ey)- zuojxX0(K2C{C%B4mDXZzb0DK)KJR&Gr&ii7v({4Y!zW*Dy!ez;?x0vCoIi!B9pu!q zT7snxo^AXo5)@5Y*Wy8JaCM;hhZ+n8P)&W_^){$o#C|eQ@6=-L{`mI<3h+7I! z{3<1ez9>$zVrjNk0`5gM2n;_n$@<4#0>D;$+LXzKVt_LcQP?K22&P7wjJ|K-_b?E> zIeJOZoP$Z>_@4jWWykT@@Sr3=D#T6GPE^P9(=>bdoPEe$$06InJW;i5xlz^67TF&? z=!hH8=1VoXmuj&KrroJB)%ZAabf>!TsUoLbh+F8;S#_U!Mn{a9o zc_za1a)U&lQ9uN@EXIs4QKD52>0488S*ZV6^kct_(o70kV%4js2)~I%u4~(wsDcyt zxr3BSzdf(^nrLVUanzGJHywyNdw`pxQrhWF9?jqq1t$+*^% z_j0My`qp(h!*sUSYxBIz*S<+d&Hy>Q`AyRJ?rs~l0&M>-p`2+&7rZgi__yvDj=^3r zR%Fm);uc#(j^r_#gYy6bn>@o>MV3lx#GX&>HiTA(Agh(|+krTSuKmeK&-`+qeJ2Ic zn_xs3$RI<1k4!k_|xgUy!r9o@dN9Wt!~OIAV8q0XJRq$s!=!>e?P%rWfK>^GK4 zMmkO2UB{`gw~x6ruii%AcSp#eB>vP1)LDS9AEd8}6hAQW=~lSyAN%$lM#udQ)S{yc z+m{A#*<0l&x`5fXR;)~eg`Ok@E3vZ!bP6&t6dwm%yT1z@eg#iM_9}n~MdFN%G^gF8 zDRYtj2mu&_2O)hGOGao{nIzL`odtuiAp02hiXRbo=X{p3bM^<9Q1=B~N=Bf?OIs{` z+2I+8eEh5muxw6}aF2cnvznr~xdfcCCAOVOXB~0*HEQ4J;&@FR(TlL3_gysZzN*n7h!G@0=27TGLB`|@@ zO0~x#f%W?QRiDID&pYciHJxQaPrB};MONq-1t7e@wQ5!oo+jhpEdqYe0SV8#p1Wa3 zDbf^0ce z0$c~Aa^!ssT^G!OQah*iAF%hiYUE{pN11DtsTxrl*z+w^g+bo>>NpYNa|7;!vb#=) zyCDwjU_{ow$)=}dpr)R^S2qgJmh)000)j^|=`VDjZM=O#BE!6k3ylnDANvpn;uliB z*M5>c&tLemWBx+_?~vp_wVwYTY&1RHU-8IL|B{17PxnvdDgz_ke|9p`)BR1u{|l1* zi_HFCAW0SJZzI=_&O6l|6;BZnelg@x!+G=9%^1zegSZ2L#JF&JadHsyp^pb`073wH zg{fxvHEn9tYwpYH4-#<%|84L)c`F4iWRmi>gK>(Sf~-E&)Ay6H~MKAeg%lWac*I-Mk(I>eG=a%=ON#M2DyoH;#qq6Oc zOO^t5H%nr?8eu6#y^z|8$LyrlnNu+gZ9`1cDaZ2N!ej(C2$k9}gm6*p9Q(CSI6Vzv zMAtmF^(1IU;u8<`pxZF5>zk>9Dj6xpIw^KRkqwW9t1TXvleL~5Cny$n?sLr)%Y1aC zaAn9fiaXk4Dmd+ zm+GWIa%q{X@s*bRkt4Ijl`-NQ?Y^~G5J_iOi1b(0!2aDQQzG^X3u+G~FvsP5=2gJt z&HI?F{DFH&Av3#~`v)Cc4zISJ-BGFIG3GDhYlu8}^fWk%K*6%ti5pGYk$nNCCQcCrhSjn?*|AlM zmRZ7wD@Q9Vr^pKj*dLbu5ey{q<*;N0@mzqNFh%o z1HeC@1rGnT-FCUO?-E3LNf9ip4>wIZJmqM@pfMB^>y{d-vXc~(edwfpm?2~fTydMe zZ93i-O58p665OZ4uv~m#F=zki%@tY)yQXMk?!8z~&#@GF0Q`;>M?ZaWn^1S*Qb7ph z`MIJMPfLS#o6Q8R0Eop1Opu3FjNqgMZ8kYtISHliaL2UH2oBjRg-#m<+_rjo>hYWI zbGK3?k5KeNyicalEQS0St#!T21j{?FKhoU-v5kMT6ypNe$>?$tNVEU3XG&FSV z8ae>+*_Fx{C2OaEeAc4-d2*Hd@h^6<=zIv=Nk^q91o9jO(gyLjQCd4-F zm~}GZDM?|Rc4Xdqbr90PFq;f2HSbpt9WR*!zpI3GBHwuT`lN1~II?QQgU+JOgSC%% z-}?Oau{Y_erxIA;v=AhSc9%VWQgOA3@bfAJ z*Pk9jvup42n~1Edva{C=O@}WP4MSt7Qtn&KCK1o%Esen|Tw0JS@@+)JFNb1yRJ67I z&54$)Kex#(=VOk_YX zO+JQqDLQe?LQ6g+M~A{P!rj2iY?RVW9yMXKb&?-j-?W_C0az3&I%Vl*~a-K^cN8!8zfd$Y|c$ z38&oea+nYk+u>P~z$e`T_fESy_}Ro^4{s!eTzPJgg}xy>IzDosA4mfyw{l#8kqbuy zp-bcn8EsdePeS6K$}e)`J{4fRs>O2&F@E3dY<9DHq9hSSIaa zs&h*6uf~IW|)Su43X=KR*?8bHwaNxdkf8kz~!|x`$7|Oq%YUZ`k5?- ztgAq%!NQD>5p5tRuf046^7cz0x#SpHxD7y$>NyK^TnE@TU_EMFyE&Y$A6<+p*5@;I zJ0^=37_yg5P8d6f)UkGTh!Swq)R1SuhYprC&hGi*O(b2JhL2(*i-GN3B}b-Kj^k*7 zAu}VD&i^QB)-NLuqW+$REksXq`%Q8y$M6dv4~>H`rB^U9fJJ1&I(%Zm`I+>&uzyZ1}R4tJ5j| z7DPi_wwwa%wlW$;UKV$dPP%+i;{Jn4m6ngO8q3Y}l1kko8^?|j7YDHT$LXlkWJc%f z5_{p;;l_eN%a!&f+&EJz_0z}} z`-fNlK1_jz!1iS)uyHQy9o#|Gj)3jsRFvS;R3VX8Hl(f3jo;YjnfMQLtW(CK{j6vV zCeIG?{)G5Lil2tJ6*SJ28oyR&v?t?#&li+YUD^0uM0x*wA&gTXHa1o}C9PLIC5-Gi z36Y19>d-pnN@Ah_ISG~+{_Rb6OYPPfUTvExo7r|Anwy8Ac}2+`hUdr?tP0b?8<}7- zJ1-gT9ydwrNd`7MdOV}>`Q+2I8R^l4!pWZL?rqn@&ugiE#9fs~C~!K5_uaL5dud=v z){(n4D$T8M*}PQ!dMV}wSc77hP4^}|jr67Xc0K7@j+%`oTXdjimmZwf7LY7w-i%01 z0j~;a_D49jb-G+EU#JK`I)|+6X^yZ}^%lABtNb+(%*%nV+?|$hv=o59XqnS6NYZ^T{ zo@q$9x4fIXWfEW-;h}C0|IXM-Or!ze$B%$4kXAuk<#$7w6!0{187w=!tUXM|J3=nq zFSNW|gK%>MZ0g{XqJGes0<7dE_Qt z{%yC>KgPYM)!L@fxon__p|@WAtktOP?c3?`@sn>wcsa8=+94qpvn6I)4*BIaZ z^EMfk)NSK3NfQreg81kNh-@p+`{<2$1rhnts4xib;esE0EQ>|8rDuGEKct0vve6*% zK7Lh_wv-AONopsYk|tIg(+j#LBzw2VBZb0UCc_lZs>OVp^WXT19YW2pd_c>rW=^ zy)piNh&p(pQGTQaODro8nWPZ}g@8@Q`u1YqQ6IBS2JDEzx6N4Pug011rhct-jH~4= zH83?OsY6fZAWc5D!&mNcNv@JosYS2|cp>o>4vfj%7g3F=b{fs#g^Gvfh3 zE18E*wTQ$;nJ}F#?%W%9z*(`E&K0V$E1NZ3=hbO+Y}LaXeOU)$boypV!J6jIdHncX zwKBe61X88PyujoXF%>`@J*j+_95KMD7#(fReR~8k{FHPJsATii;KrNu9nRm&`*wD^ z5BJ(uwlJs2f>Vb3^_VbrDqKERlG9YyuMhVrmjY_AQ!?APuU(D%e9*oIWN#=2OKusK zsOgB*DJ<}F$~G!OIKo1EMa(S?B7QhXpirJN78Sg&HmT-AiD@hziByPTr^ za-CuMk$BU@#w~Tny48G6ids4j*Ryl&Qmtf?Y~@XytDlnxZM5`tj!Z^A6-wvnyh0QHB!p zDl&#H*3r;oz#R*g38qx;2%J4oFXAHm)ktjJuG0Md)xgiRv5q6qtyO6+r>?`pijre{ zAf0`)4klx~z|DAcZ*)e3TG4!rLU=SGHUnOE6`cN$`s7V=&mVQos`@h{@Ru&sBK;;_Q37jr2R%hCJf06fN6Wd^w^(Wbes8B9iiT{}bF8CsO=e&nqhL~uy6O{x zlL-5xMfIlkA3(_g&SnHV`21NxVP>bZbdF*b7SG*&KCa2=6^{e$;%7a)`uW>@M(}pz z+x{e@*R&`2=e(!0^3x^>y-OB*3_Mhc3@o=f93!0{CMR{IqxguUz3gPFMJXvKN0sg1 z@zl+HjK}2zCzAf)x`ICz_1*x+ptV-?qGYH%F<;lka(NtAWaH90JpcIkA6HvAc*gY#03f$DV;N-E%tO(CD(4=P2H9bc$=G zPPQQ^RbGZxrTTskDs<1rP9JYIU;rY3Iz^d{Zp)9@P92Qag>ZVO^%eNZC#qo^twvg9 zFuH=C_s!!UlikXY*5H0mDa(|(!~NmMPa21#7FNqwvXBYXv?@PoRd{+Mlj)E`RnU<( zZ}TQdH`MFU`KsG8JV8elglQxJsC};<1m89)cHq_8R)sw=$j+8q% z$eaIg6MbC(wT0di!F$cUAJ|sWrip97c2JcCWIxkb-S2YBR)=J_{}RQA(;eZYKLDx< z$C^NxR*0t=XvlK2ooj4|-%bMZsT5nkHvYpIplB5-K*hP1T1~FG`bavxyvP5DJw?5^ z7|>wq*FZeY`OCW8Av8hYr%YD9`iX~%O98F6oXT9Kw;azXy(UVN-GoETsqXu(1gAY0 z>fXwj&s~w^s6>FWmFiZ*izrxggoS_F!;gI+tj>IvK|0#T`f0CIiTVWnhfAM^QCak` z??0qq{S?NFT+aug9lF8=5d(56xnyJtDf)3r<3;2}AOmBv*SRKRl0{0F>GD^Q@_&56 zVmik{!T(MT+K}o^+4yA%&vZ`Oemu=3((BYTljqJ;Ka}rC@9A{gA%fTaT}5S*>xdd< z^=3L~kaRysBjhFv?4h+$@qt-LEMPX_;=^S{S$!1ks=wz3zNTV4=#!_bafB8-%E)>< zIkoITUHu?dyKUuKEqT)^mcUy%D>{OJFT+$S+t6V_XAv~~Rzn#cAvFu?$G%5DR- zw~ScrS#CTKQ^)tgB?3e$cL@>~q>`#Wo|xeF@F}LbJl^r0fV~U8%X>eZQ3!#)bi#6} zq3lx*%`|JeEWE-LBGd}x>3b2PA@#|l=%VGLy_BLT`S)Q?*aGluX?no#?H4N{UeC|& z(9{|PK~8X04uBj-&-%|g3o~^9_OHcx18h`nt5s>g5DVk-&O4p$K`IK8;^@NVLog-> z@r0L|U%eih(V_13Ph{427j8aZ(40P67G;-nI-`DMdD|X!rBX_~1?BvpHP0|8*c-`= zpy+3cF1eHW#mS7;bsa_1uMZ_;Xkrs-ll> zdY&tkBFo)hw83_8&DC)8P5rz2CY4?Tj06~1yI-GTkQ$`@j#}Y}G)@1$?(%Bv2$egj zAMj(J2{|*O@C$j-T&e?-DABLaSCdE{C;Js#FcYk?w3s>wyh^ zXwuyirkYGSE|XPca-6fPAz`mM>&=rrnfb$fLoPg{IFeXM$~k> z+sKQUa-g=v0R&?Nn<^FKMfN*^EvCG_a54kEj4VG!wc@NGExIt(QNEm@fjl4>zvc3` zp#1=%P`}jk1{q))R=T3>ajJ#DFk9*AW-@txa_}_uTlSu|q^o2^HxaQIUu>nsF9QP3 zSx>~^O;R@Y6SSX(rE5&-at_ikrCbRL0UH0P&nm!3QOorZ-Sb~&{EiG6@GZ}xYwaxq zne8{6eL`JJe&fDwO)8UrtFEH?1sxBh#A4BNXbTlgz`>c=;W*;rrOVd$zpR=d02eDr^~d#C8k+ALZ)X2rHuv7J=xRBYR}ZQEAGwr$(C?VR-Y zk3L`b89m0|*L}S&-o2mk?!D%kYpyvb%~)$i=qIcWdov_8nyE|0GoXG6K}y%#nKkn= zujN``g=4_hnwgYX^)waE^6TdOQ2VvS89oijB8_I&C(;syzUgQgO#P#w*gmf%6g7&`2M=Aa_H^ngK-M`@BDY0;RRNP8@Yvcm5LQB`v# zC=u#Y!W6#0z5x~_H|nsO!M{1bG8zfsMvd-nErhuTqBQ?PTsnHH>9*z3OmYZ3X$k-t*ah=A!i(p&pS>c8-x)CAd4XTt@r*p%}6l-Jq3r$EM?5bh$RU#LrF&IQqm0oMO zJ9HTb4wE)nfikMKGDr2O1hZ*ix52qv#sLXF@u0dHrZ5QaseZrEpn!17e8z(OPN$tgxq&0}e*s<@zltMMp&PaC2GgCSw+f|99>OxPv$CrrNqXM0%LWf{7>b8K~ ziJehtLT*tVDIbwbv)U;<%Z%if*~HORVi=ozgXN$;)|x|!EcOO;_Wd@y{RK9%&!p5_ z>~Eb)035~S^>xE7p6=(hm>=z<VfGzbauD70 z3%mmOV(Flh?vj4I!I0eG!SZkYV($MMYa%n;4w1|3YhJ}*eedygXjE->97(GK<^w7N zhl7bWwV-ForG}LrH1-F!<}%G_GmFxU1#?s{AkZYL_IIOhw7s09%WRf!5m_e!8LKtb zxx4TJiO(bE6y4EY_`di2k{NK~R>&_oqTh-#A~yjM3xJK>`Z+0>K*<-Npi+xsa$Qf~9sqe$R6TF3RZV z>_YRN_V1jM0|0j`-?Sx5XBK?oLPbcsKNew^Tw4v~S!`lgYHK0X(fwZDCPT3n=Lez> z53v)F>|76}g$dnSosoh+gVywUf&6uw81p+TVB&#kFQ>i%YZtd-;Iv5Rqhw&&5*@om zw18^z7o$g1J21*Af5)BZ{NOdW(g3PM=9>W5nd>KjZZ9lbhP`13pk#}Tj;?S~imA;H z8Vi{!cSePiqCqKH^==rdz*t|yoKFY$u{XX}L&9M@G^f#KO$FBkou#sg`MuKYE<<{@ z<|H8Dj?=(f`W*T`EOCLMAA!h5Awx74bX{Drz4!_sB{fih%vM+ro8*8G<2i%72RCf! z({~A|7FqAabTb#`Jmf`+cXvz zDw*iZgghfD)7{S|Q}cawlS8r?oLuMVBB^Jthl10wZ&ACE zpVK`Va#g-jaGE1mEdwbcN-$;E(>`8u`mOhzJ`h!g2uhI7Vyb+X9{{i#j0YIZ4c*}`cq>hh_o+%*VYcJC(>ZC=E1LrD8LXO z9=;&*3X>VFH9pbljOcElJaGIHs~4md$DS_6Xpw|V-oQmSkhmv=>cLGjsLS#!fCH{i z%3euQyJ8Ea2L#h)YFw}fv+<}r0B;ro+r=Up(%o9>?C z?8MtXYPx--D^JFOrDu0Wx7fxa4|gZ#HLrIsF*=Yzm4P#4B>6q{A|f0|{UR-dm>CrJ za6qY( zDd@Dp`GkBmMw!V5ipP1=fb)nL#XF5KX?t+v4e1e0oe&CU;VpR9HnDmHD_<3NY_<1po%B@p1q}B}TK=E`DLkdt1S)wNP;6FQZ#Z zC@w@HdJRib>&SKB$?j|{Sy8cWesRxhpkDsvU-HPkYLm8@%N;a2`kCx)`-wR8QprSY+~r^>UZjk#Cl^ zw^b}!D^DlyO{Zj?=konBOUwdCa}EF}zCF+r?p*Y$LB!DLUMHi^AX7XeRlO2gkO(hr zq3w69(7u-(STA)tQTsi{<8KF!rFE8@*H7Xq?`U7smoI5xNT}RPA9IhH6dPCCq{1$M z6>A{W1=t_7nk+Hs5iRo$&>%^s9UTOn~hA4sp}^ zN#^h>cO6LDhqx|3hhHrGyc{H+vLKZ~jV!O)@y49@YZ)q1Bn=Hi!9YHJfW`(E`d+4+C?=8%2+ z=H!9TuMQV7nx$ARwZ;CZ`enH7b5@k5*0}oT;M#32Be6=K10C>!mac>8;{XoM@X_72Pc(*Q!JpbD%SV9mozyKJsN1!ur@$$?i$7u&V)0-PT=L3hiebG z8Py<*>p9;ylh?FLVQa$#Q2HIv<1^~G^;Ij_RwdfTjS8tkBBj`(Ulz_%N|hRkq$1^H zPfRm^$@$7dHtZ$gRNMPNC&b1pP@k#DO~qLT2-?Fa2U*QgF|VLoxz<{=bWz_J&U`A> zx`B4)<`94GbPCh+dfKU5qf~Ocpo^;X@Kt|$3gNKUS_(27>%}?!QID%;9UiC95vVVO z*1nKX3x8IqpZf;8V zVL5Cl$e(L-a_^9{k%SD&pSFGt=j*J_5k9j!2}U5<_=^NU_q;`oPC@e63yuSMt`J%Y zW|f=!wo;Y3olc|6Ej+OlprTJQ%Tu3#dBr7$h2Mo;E`OEnsf9& zA?V>y6m%k<4TnC!*}sH;TjZFmpw_nPS1n34{Y==vr~$xMUO&ChHXBmq3B(jNke&3ig@~_&aE}kiaN$5Us#Mg>_(dA%}Lim z9kqWo%a2_}o;=dZCR&Psv)98D$GC=KJ7&}PFjD*?k`$we-=xiZ3+D-7SF^Gi5>M`w z@e8XG|K&@a=T@K1Vb8Ad40d!>35I*LR<5_QnuK`R`%QeTcRqQ{qwS=M{9wy_#`5j@ zKUM30iv9jas`Xz*_}|&Sze@056`FwgUI<^Bt{Pj%xT(bwKj+I-uv z1D6A1G4p7S&Tn=d^~nNnF=IeN2uFP8Gv>Lq`{H&Pma$(SL3oH_p;|}uYe0(;hkHX9 zc19)dop~YM-p;qdL&)}7`4_qmZ9DP_^vH!liSXEU0WlCW=yf1CF;n6))Q%b8EId8Y zWYG7xAGKymARo=I*9ZpUg1@fX3DF`b<*$^luq}iEvbsn-XnI57$Gf{pUls@}K=2d3T)SwmD3avfb060ZYzL~X&2$9M7zUD70 z2}OF9{mR|IaO5HtLMeh^d9i>4V2xxLrV3?_`yn4ubl;gEk13QQ2UJWFRexD^0g380 zlncVI6h4T^0h{FIM6y;##4glbd(Y6k)vAh3gkWrhdh#=2y7XuRQ})-kTOSY;%G+Wl8m&D|r~d()b&6=?5GG#vQgm z;(jr(NTSI*^gW6_+WAv zmzZ(e00_3HeT<3Z5Of?q5Z%rI$)Chj+f#HEU7(#e3xIzPRK*}9;A0K7A`_7h?o=Yj z5yFoabE+}!;`aDjcQaek`R2Tki=<=og?vT%==|h_;x(-0xU3{qUBV_NT7Cw9xY3pt ze^j>!dDA?(ChcjYg~-e6!@uuH|0u5H6aTPQ^Zb)GHkimJvOmTjgb;>A5#PU#|E}P0 z%-G5bkk7ofPP0JX7pt%r%BPqN`U*`_Rj<^3n6K3QUPB(p)!SZe65159gD#H5rTjq` zS9)AhTx5BPn+;As`#TRolU`wBZurJ6Z8ycND68gKVg4-CkH-j7v|3}f$x_U{ z)gQ8Iok$)YaK$LiHk7=1-+8K=m*vn-)(wrj&C8;pA{bG%f{rV1?pQMiI(|NL(jQ~f zh1L0W5Uu3H%YxpOtibv z??8^agJXyK$X{%Iz7|wAv>2W&pR=w&^^Pk3++=a}UmyxcdoyRrap(_Djd$(1M;eEY zjoop5r#&yF$Dq+ns0p41D)sBcjoQI_2BhWReGing|KQUBz-4kh`A=V2uz$gnJ*9NVnn4M?@lvl9KHUI6DPyujUx5ZlAvm7)r)8Mn0-D6yVxo z={VkwDky~;@3Of9sM^I(%U!ZJh2gd|g&s}A1H$UHqz=0zn_gWP-LQdR#8kOV&`y<7 zJud7VFA{93?>VuUV1bdl`P3?10im*PAx;Ao{MN9ww!{(%IsX3iE%g>xZ?5`;Pfwqq zrqk+xqM=Yit9+@9@m}@uaZxabp|IJJ2D(u>q>G9xb4_yeialZt-n-^vhHgog8-8eU z!Bw9K#2=#QN--g@jM9(!Ax-|1?#CGm zHJtTevLNpo1uA$pU^5>z^;#RM`HD1VAnWeUI}!`ShBZDkYp|i zp(h79aCr62H>dB&AksP&m|G&~cQ|=L#XL*(uxptZI`(}s_TL-1_`7VR*F){8__`Wy zv9(&tw$EBqb{1t>J2T4eDfOeS%jrAd9Opt2)vk~UKgEsF<=F@bK9}?y-M)IChMhfW z5!RZDp4@I3tdi+k-_LG9P9m^)v%W&FCO`l+tg?0%6+ez!oyEQ~n{Y!)8Tc`AC%au3ONK^{sZBHaKyo_t;vblcgK%9bk*}-Hn)D zrydOTW{l^LMZKM@>3b>-&{xQmi|$loE^xpM?7;BKDbnmuFC=i#*U2t(Qh9ZqTEiR#Mv z^3*}2`P)-h%^4o+mNs~LRN(f@QsdEYVWB#)d87=|F$S7)Mo{_Ch?eoV7cN^?hP@kM z|K(i({luO>I&k*WKhbr*JvE<3Ho^vsKsU~2fx9pdq&c<06cE_7m5}KM?z-Q0k4d!O z%$%M~cPJ4bfJo{zdM0^uaDR?;_bJGd7s=6pdJry}I)O_l=HY`(WB^crfXt4^ErNAy z!{-EU0YxhkAHDsW6$G=x7Cl(DXe{l|@(l4sDh!&)oDRywUP>dv(BrmbsX@YQPTh1I4I>lNC)Z4WdNJ|$HLSu*PthCcqyt5zNLHl`Bud8K)}Z-cWE z&svh>MqR1#1t5}(Dp5}s_i-h73~MHb{d_ES?U5yW)Lv{QDp`^FD$vf*sBSsQZ)1eD@*OV{IQNA_bJK4pcz zxQI7P_h~c*&utsEui)CU(KR(%SSkr4u(gx6Qd^GhoqQoSiKA#v#A~+vt|gDmOy8WU1dvNqwbe9hX0)AU0ep%D8bO3|F#bDrleF z1`Tv4xzf|?7P!?4&A>J`PNcP^2YiiIA;JU@1%yUSM*|(Y=~Hx$?JC8vM5(B3W1Jv( zL`?%)#Fzj*ScV81#+M4&-^Cxf3-zf8EA^IDP)|b^YE*i<)Rg5=QEPE{VmhW%##`^P zr~NmiPtdogR*_nSTjCkxudewPR8CPc?%uhM+_I{OeOsu^bpIrqi6h&R!=>EKDJvz4 z_8yRn1p<84NOYDtu4r0viXyRIZ9p;;HAQw}Nyw!rw^r0OpIup==Tj!U%|PO{S* zkxz)oxSo zx4TADNicGlKyoKas*hn45P5+tcNdfLukdAMcK}}8{UILu2fxT>o1%rGCIJve!h~;s z9qyQL5bXCDiTJoAI?c|u&6^e~F8v(7BcJct@-A-$%YVNo` z9lzYZDnC;jC>g(h)xC?Ek2C?n6EONpGes<;blDz*4pR^Gy2wk ziw#aqua$w@4IrEy6$A;+9z`&>(MU8X205ba*|lgc@@|#_3@~4+mR*wFte#a*(|Zm` zMiw<5);{^Im_e(*&(--ImCuS#lg4|C+M65K6s1US zB8Dww>@d57jbV2 z&75#+xpQ&eV$Ric)s0sU3&t6 z%JvQeI3-q1KD;)MCN6deK#U79nK>oYD&NsAqx9@Z9mBm*c$CxUymtg$Nlqy_h!tE1PMhHwaydL)j zemgU76!VL9#j3gL^?^>Bu-fp);`mgsEuvVK`f4`<1dk14?;5r}K(-@i0qRRyJ!BUm zGMS^KF3R?Sq>u?;Jj%T}Gf7Wt4A*Yxeqrle0W^wuBq?Vu9$z*qF}!h0B0>o64BtHs zb6zng??7tUkv?m6oWR77d;a6yDK48ofDiIZw)tgUzR%4DF6;j-!d%nkp>mMx znQ{;Z^cb$PXusp>j(uemx}QU3H_@id*O88q;v@wFW%{)cFAmx$t?7;NPR{qlgg41* zWog*f8N&(fBA**PsTHPEYpQYT$lq#@i$1RD9-2@|FAj#ot}h;P&j*$D!dpFy!f$jp zXbU|w?hYX&_?^!G98TQXVUaa+H4deTK5KAOz10@PvF2;Z3k%dZXItjAzpf(ldAQac!_y zE@H8Y07R*?P5Epm*s9KGm%&%x_oo|ATVks&p=^eIyn6kjXeS`UD-+`+a|t6SP55yr z({^Hmtu~3SuNpM9V5y-65q-GhE4{|*`jE+YN=qL}eeP6Dze)!mFtUM(d;V*hu%yKG z!TS353hjo|qH=)@ibAf@l0SMJ&LaxLG36}NZeStIPvjo(h3IP*6mp-bB!Pk?GpW@8 zZHjp^M=FLaw2}5-+5BBf^0T~D#L+HbyX$HYNIXYp&N-0+6UeT)Ud7LL zXa_>LC^u$jnwO0~5S2h4AUg{xyeXwz!rtA@6U397b6Kwvc^zVO#@BGW_?BAx74FA+IGB7j!?UcswH_`hyY-ap#15-5Ktk;GS zJ~zAvfY@_b%&e2foPCgo4?Il6NKFwNTJAmAWDqUu5=FB`g=E7&uQEMpv*kQ&`HAd& zT%6f5Qa3)HFZ%Z1o%Zp8z9yHym*H%X2TU5dUZqBHkmdHl~~Ky3AT-x`eNyZi)P|a6aClkH-;w-&jNnhQ9Ms9*-MP(iMDeQ+A1tPmkY5 zX8Q0v_u-jZm^9B3v4f7sTJqs)%&Pv94Y=USJj%Vki}Krn=H z>)#^=c3ueZ$HVpEUI^3*j}b3#Jm9jpX^3?;OZ`|Fr-%F+*CJ<4!eupp zv19#m_^38G*Mky;?t}`()x)Q!Rs z%F~UffygfL+`eCaIvo=BpZO%t_MbXdDQF~YDGU;n6>z=HjIPN;@2c>rny*)UbAPDshn)YaC{UE1ZD zi%SlK6*fMiU*{Fzt_t!FJRwJ_QKkDfY6piq_5JmIAp8z5i#IjH8CY7f58*`hDbkO= z>+!J{HPB32p>V6Cw(US#1-#bW?(_aY%OyND6>s!BD-G_~n_$k&R7iczIRTIBqS0L? zTOf8ClSo*_rdWLR8JeJWGqjtNhBI`>ps;7awE1K~!t(MN%U(CrZ*G;AShlEn+>{UQ zT(9Oz)Kn6^;Fouec9rg*^kY?EQv-kS_+wygxvIRVr0L!AxT+}up*FU@B;f>3czA~-%?Y`QL68F`8<3-F-R#DhAIVCjLayd>EA6q8i40hA;36bdamd*stSeB58DoGXj%J^iKnP4$OAgA2#tUGFY(=-39tf!*vnuMrW z6E^3NR6h22WRQi&`s&}J*CL#x;~W_0s7OU%mh@~8erTFF`Ln)7+CDWeznx|=oIS0` zWMVe{Iwv(ywZ<>1o#K|=JpPhwF|`>11S=6N>Zg(e2c0X26|HLeWNeZ#&X zOR+Yq7|T=Wh$9r!R3WExq|{tBVMUHG3sk6UmWueNGepwEQF3kdLX8Dt1vNvpgJ5FH z@oERoK%|q=m?6hh+^Ab%dT<%9D8P?+`F{QsH1aa|A#Kq7_hGk(RRe+B&|rbxTIa2b zdeL85uMNtvI1uwCGG%0l47YAZg!)dtr&f<6D*cijMEt5oIc^d7 z&Tac|gJwszX0J+iYtEc{_KF8?wGXOY4+AD+&QD|}Z=LsZ*R%%@8ZsBn=eAZ+#*C92 zEqP`eBtjEen4&lboIFKLK0|~F!~wj-l=bVUWcT#7Sxe!oTV2vCNO?}Pjk1_JN!w&U z7NA?gUG>)XRWq{y@sdL{UAIe?wpxv0x14o45dFlIjhfw5Z9Z)U&U@Qql+Y4pXGIqY zi{nZ}cM(tqwrfj6$PlzI)mTxAxPH^ttvBk1N$ZTxl`|wtG9WFp^fFXb|LLfcOj4|^ zz09)0+8j8af2`VVQcqX70EAo@2G`;{I@*0puuxQD0ZqHoTR!0WP|2kdft0)pVV*I= zxIFBk>*bR~f2YFzA({!wH-aD@>0qX|IXqPq8CKk1c@^74-J7*^AvMa$IOI5l-fU|e z;cGrHkM`C{wR}%~z`RuvQc)IXY4$p8?Mc75&-oT_I)w9KI$}<>9970LIdNk#*a8l{ zxD( z`mcJFlER0gElEMmE%hyu!3H4|w*vmOyQ}bIGwWF`^M1r5A4fZLhH&VtEMrF-?$}qj zJkf8}e~J{3@r(=NF2fP+F3!R@-Fa+_MCxv1p9pzebSx9E$tfE~yp}35nM)9m(>ThG zgXU?FO325i5*7s3-UaC;Y8uih>QK8{Q5i4bjaHhB|Ey!}j6{)Fb8JODll3e#d1Cs_ zZsxp^aPoG(r)nyeP*qoEu9<2@X&>k;{|2^TM!j8=k#?5TzG_g|qOTwJrIwsnY4Bo^ zIGQ9OW*C?k4!bDSQXJ>BGGFlX;Pud`<{~1++Q(?Heqo2-Mz#J<4-CQ5AxDGtnTJEk znmmgIl(&KSD)E<9n2Id#;cHsQ(g9-U!a(Vxv{kxC)?2JIAg#57pq=?(n5mpmxMdq( z&5}us#!!OA5;f@^;>bmML!qww^A~VV4qelK>M;H(4*Xx~F#htu`?n6`ueRYY=L0sT z|C`82&-nL5;$J$9zi9pcf|ysaG~W}3|GddpPU?aRg=Mgu2V=}F4n?^77ZVer!9u3 z-`1u5b{Y773t;D;Q~*Gi^8lR0hnjVVINMcJG^}^LWN9GYTc2-H=rQ2u-Bn|d207)u zX)b?QaRXd!A@KsG573qkOl1S-fGC~O4`jH=3I@Wb%q;IomcaQd0&3In;EmQ#l-2qc zjBh^?SCk#zQkHwEd#I`M+4HwQcMNze$)5WuaMhUPk>7^UkeH>kO@ z&TLGW1yX2LLT<_lmxgx&#$298GHC-+zD#cW7kmoF~XEq8qmNzvBG51NI4b@s;}!}V2mJBP89skg$D|oa!{tN)@jrqQ4H$9r|L33 zKp~y~{39K}FEFf`DJ1?>`{S-Rl7wb?d*Umpxo#Co`LX`CFn`iTA84z4b4IGn+j1(tCz(uCr4ik@EgCOTP0$CY zfB#OvE3uH!Lj;A{>3yk`nMj&oKu-?OSqh=SM3kj-mJnvGm_a-fscI2rWN%_CU3)W30rGV#vuUhbj| z)0Eg>%J%qq2w4Uje7aHcD4n?==;50(Kw;VXU+B@;xs*X<5p>B2yiVU4w1NFVGnpvj z7)?+k^p7=d^y{_1BHc6MFh7+YeV8bArbSJf5Wg;OuTEL4D}&Gg?MoRDaMR1_H3alv z6hSfF8dlZ@LMd1=7c$p1va^Xp9yQ|)650;eA)_>e4z`E=r@0?KX_f7PetSOIjXg!w z+|+0LpyJ*+h2@j*rvDCfk}?vok~(CkHP0@7V?S{9l2bpK%~LJX!dS@=j0ejNc2L6^ zU8I*}kE{{0K?t^uUP3w((Bl20^%iUM9=4ydd{aPiZ{|{P_DDKrw!$Qy8Q(&K7O$1l z#;GT}2W(i=r~Ra7k>x3IL^N4$3)8EjqaJ_J zEd8p)EMEEmsW@S;f(yP%-W|k5g$px~sgeE&SHW6&*;LE)aWK)$a79gOI-Alyy434B zvUcHtbZs~^sU04V{7L|I?2^qCIi6FY;0?;%tDCa(T-JZqZl#9qk*8MH%T7K~0GMfR zy{p-v!(e&*G%RPUv^5f}^N{z%T^`wP&X=^rV0mXOa0EUXEXzk$0zT%bwL0vkp-2mc z44z8GXzDULR#XAE(Zw#jL*rc@&yhUwJOA7;y?71jM_Nb1%DZ9;SbPHZ3Cwoh61t`?vQhH9RQ_YcLqgTWrs5arw!)f4jO~oIRdSOMEW35*a1uI#y7is$HD&NcLsASYgZS9*0SYwj*gZn(m z4Lh)|Yl#>3V@B4;!A0j5l$Q1$%bE1<)%-${&y#biQ+`>tv`+CD=qWM9*=L9I1gfkb z(u;7zKj{6t-dfjL8>s3h*?#l@&Y)Cq-HR%_e%OrTiHDu9eJVwdHdL}*_=E+`K_HSxw$!W%)FG`&>1LNKriM;A3*nF(!M6JreJH(nf0_Qw5LZGh}F zG4kW%;-oG6a?^tqTCp3ER;fAEZ+go(9-cm+xr0@>B`zCgPF*Q&b$SRk-#_Uz^!?L_ z@OSMN_38*K*2>u6k6uUYVXS3IsWsjw(Akn-ldsz8t#pTNMufWg6GSKmS_O}{x=ZmD zAZ;CLsg|9|iQ{WqS&;|kY^?%pVC_FKAk+Tr@hNvkfF-ok^u&p?ksWU=eR#?{CZFoY zkn6~F15aL%Xav(^lYU~FQIrc9vt0~8utW+aS5G|FHd?^S;+$;O)|p2w3}Sx!Yl5(V zWKyBZHE2m$_Lxxdc5qY3m&Pg=reUH2O()%VTi|_ z4a?{GwIo_DAvN?{){#Mp&741(2`J{2J8WY`ofqX643|MUyTh2^J$sWxsK%-TC4Fm-H)kc$YQ_dz&p45$JS9GP3m_AC`N|9)LK(JdrZNr zYd;yJwB&cePU$)9EARa&2aA2&ds(_g$c*OSvs+xz{*8Bp!nM98O`axXX7&VfV~%c2 zaBn?*AS_8XSNtv^y_kKQ^e&H@t?h)Pc&|p5Anqrj7;%>{DAui#AZT)RkRlSJPLcs> zvzS`}vA)7o;7HIA;SCKls=bhrKGy{iI zF-S3K%j6nsg+H61D`8A^oWL<3x!QQCE@cQ3rR3}qn8?{VwI;I6;%><~)2}bNUFxZHGYgXZ+xp~lWpzUnvUO7aE)Z3N=|tfiI? zEBBqrw9+yN0b_knCm4RM?0g+AaX{@!5KK={=;>?&umKpj=pj;}TUaQD6?s~H`E!#% z0_+VR;+3pu_HC;+!*Z|Cl|+k)_cDP#SyY};n~!4h6-m{!7fo6xd+)&Na+(v6W_cSy zf(k;>^ps{*n>Z`KCYe2Ti#!_Dnt&F^`vOO9eZ0j=dJ?TdO&z*`4~pA`CVCK4CL~_? zY-u@TRldh92Y4y(NtzLpVh*aURPR|XuwrbX7l_O;vNB#^N8D!^dv|5BA{nXLe!w2T z6ijY>C}K&MYB?uHN7+T3+o2IUX-1G3X>Eki-bPGWn=S!sDFp^D0`6!h(Vl!?Atp|5 zAer>`=ubV(jV;*xYgICz2n=mnFuAS8^Qz!>oUFPzG9Z;4-}FnApKd z;Vy_D;~z_*{e$NFR{M*7MbLat9&w%=uz@(KH#dNq3*l_VLloQw9@%P@)YF#=HZlo)=ARaZSLy^`vU_$ zz$rq$`^yP@*6L{)&icMj-$gp5F|rJ4a||30z#ScKvXChtU&McDCCy zL4Q?wdO4a!9KNtupGym@H*$$nWRB*v;AIWcgmXJxxys4HM2n7KgVB*0Z=Q=1_Oo*| z0h!Frbr6_$q>PJgdzf4vEY-hTI>R#=TB&8F)-IhirXxKCFQP*Ik ze$}5D-*ldH)zOl?60i-I^br#F~(ha5x1&c?A}F^aLm}@hBiO{AGlNMuDHI zTNNbZ>HGzNF5@x2BhTRUb8ODC0WS?R;hc4kqX3_5VBr-lk%^l6_6pMAb8x)gF*y_+ zU#YuDNNs<~A1^Z&KLo^e$_OUVh-f-vVYal5L|U#Juy}jU`8y%gy3gGfCU6DI7AREz zk{TIsk^WREcdEJejJ8_~&MXq>cF2+nsNl5%Xa6klyG{yxR}gAV!C2)06VM-N%m4sh=6LcEGqC z+NyFpdJp=-{I*K5MsFXlEZZA28%Fnf{S74@f=1w@+RadR4%ViF*dwA{le<%e`&}45 zIySt_D#SnF)wVxn2nbO=o9sC{J{;%e<#X(3+n-TKr6ohhSIU;>qtlbXIn``>OxlX7 zDq_JE_I^l%(7X@^A;P1iZJvYJR;gBqb}m}6JYrvUCMT7naP~^-BIhbFjhztaU&6Kk+`IzVz9Bxkd~qOx zf(4_)C|pP(KEk8J`0WcI)<2??E-8v9INImoxHiEfEB!cY9OZ|U%oe6vh>UsOXLtZQ zvXvW;5YvwiLRxmH6VGdpBP0v;l@@_j3mQj@TdFx1YN-iA1z2JLuz|ra(I|p8#u{Hx zUc_d`Z|`IPK0tIOc!9o-r4rF#*k4WzwkMHJN1FNTZO<&W56PHfW%CWtAB9$8mf(i5 z;!v>|;($xgMuIU|*~6r~3g3m5P=BZ*Pfs6pFOn-oYiJnn<2pRssaI|-7-XXEGY|I~i;qo!xSb*-o2}VfgKVF7|C2<4iKRP*Baxxx) zwOzSeOCRPL?So#$r8LC&F*klIt)~)Po!H;08vN_=Zs*j9o~j?+pj&P8_|@h3l%)C` z-vIqBv#P^t>cG#_1E^?cj^`dGTl(AEix}-PgjJ!Lr*}7$my9TDds^xmN$h;roBJMy z-2nyuS(YiP3t&Um(}f!uhxS&awMyY`BE$@gXanc>P&%@7Ao^ff~w|w1Hsu@y-Paa{MsQ0?IsVtt9<;|`B@MX$x7iB z!)$l{nO%G=RmEL7zk6aKmKngX8nVmU9(gny75p;Qd%rxoPF3#y+J=-Wb4;kl!CHCN zg%FTBUqrYdx+d)i#ZE%}n`_PHC1AW&5#9EZj}+^fopuGIHvWsN$Vq`r33 z=CYxuD{ZomlzqJNO6!RCR7p)c#gk=o{Y0GA8EP4}kp7iiAMvh2!5V7*IMccm#uZH8 zTYF2=TwV{L7^g=5TKW|vW@t=LiP{@hJEZOUCYQ0hfOe$^PGS9d6s&qpAtJ|xe{001 zU!?KeW2~k=qCWYr2~e$8^gbU_{YU*8wYL@grkb^u;E=X9H(uL!+w~&4)yKX)NLltd zSGSjjjg=!|o0Yru>?xkfKF&-=jn#R)KdBXyM+Ay;=3$(5guk=4c*bbU>RSs+yHJU21kYSwg+ocdY_ zxJ~Up&}D|0hRC>@GzP+i$i!M6DojSRqxc}Q+$-(Z=4~pMw3`aZQ6%gqzhQVv$ISYwpqj_jrCYWN^Rb@#C{2HIY>`u2Z_r;ht95?{%mHIX6{6ON%zz1tP|2gH%3=sZ3^funtd@q0fuIG9+$6IIa z^Lg&`x!31B2W#K$<1t{kS9?!=ivm}w;583aeR5d)hH_!eTAytL$RFYlNn#bQJ`o(d z#%cJia^p7hqGxOsEws*b4Jo_Y`&ts!AN+_uV)1S3OrUN${nwI#!Eau^^3QgvB}*r6 z$Z$RR_5kxvSDm(fCEkr!lViGck@2oFp;w>1yOeNP*yw+)n1{P<8~#B~?h>^-rI zpRO&9!x8Oyo|HYT;@JcV)yDR&EtB(9ZKuAzcz^Z2gRT(m{$`S~DS!SwfY_N6p?q-!xdqt9{CP(2_OJrQAEmijhQ zduUrLvtdKPck0WVKSbHLcBj}$R?cXluGE(~JTatB5i{aTH9E!3uwOK6FBw(u`@AY) zn9ysA2am3%_J8_h+pWqfF@CR``S8gl8YSQ3A^aVbHfbb>CP--WY3kj0{1>)cH`gpu z&wuE*d))qYZs=PK`HLG@&5u{)P|xoFx#XW%?d9x#v^ebSZLywj_5PDX!)af9F&b*-1-G;^StW8XhW^~6Y(Hxx zI2e6M1~=8P>j&O!W*YP6ch5sZ7u^*yTsJn` z-%R25KkxU>aC}fYrY*c8W#pCCo#gj1H=TzX$g@6IL^D{sKMp_idZTvj93{u7QUk|z z%8AKF2hO(5kM?BRs>4t6s&ywVys#)Eshto^jhcHB3Ux>xli z-bW;N=8aO(p0XHGxQxh&A?5Reymn*;O%uAho&8_5#`(~v#2EvTDh`$&jmLSkI(KyX zZkqZ(sRZ}f2irHsESKCJ~lUr z33$Kcz9D)%6`Q8Cv9&hPHT&&UEw|YHfAJO|J~P?cbEITu)S}I zWV6413L--J^=MaVwfDk!^_@^&VKVCJi5{Om)y8o_23cnv((GG%C4N4m%HDFk_VD}D z0XO2jqhooj&vCR|rhA>|5gx?j&-=+!yY}EWiIEzkkMsvO4HZn5k#<$o=C(0%XNYf1 zlD+Hm%)6~4Wop8KPHhW0`+2(KOfCBkzCS=QmLi)yA9-0&BHUh{1}5G4=xmK()7-t= z?mr)Rg4ZI6rx>XxStxrQMbooiy9K)~NfDv`SlUeHX-h)G#ppU^>)qEwF(-UU4#pd! z`Mn*lAtl3H7IWbmpQQr6WoJAxlCg{zD?Ncp6Eq4rx%;Pa>?;y2RRmiu3N#MV2g;~l ziQ|>hGHu#iwJ~C||91XQ%?fd!RGf}J7twkhe1IeCC^ac-y0Afn+J_sDeBYf3lMlCN z4+ySmeO=jOTkqe%pSaPGyqZ;=0dtqi{8GVgN$uyer#tf$ZrHZ8k(KxFQ{DT`QcFdt z^#Ypv_8CV0#J>0^#}2Y4UW(F>4?!iMEx2Ardk?%ZwF-5~VcL3UufbcD=amdQj>`|U zneSEHR*^t<=e0-Yn*x1~&kTE{#|Kgyw_m!L`OJ~`vMYze!VZQ0qD7i4+V31Y4ArR4 zNYCW)7t-2HZA>JuYz^p@VrnIc4QOYjz4o$|&eZ!dlT3hq+%rBzhjQO*9mxxn+ijLO zUq6Vnx;ww!jD&`k{j$c*xD$Q4LOJi^voX=1A78oXJSYf%oV(#%XsrQTkU*`$F*{-T zo8dc(wNZN9p21nC7&h(KdM`zKB-xEYGc)Ry1gk@}!JxpYZ6@8Lr8SwMriN@47hciN zr7M@zUsv#vW{h`!mbEQB_^eft^!3xD6GC1tGyHct@8qZ`+4i038Y?l=G{4DY{83rE zb}^;Wv64oN>1M#0?Ycq^-MVyJtpWHJ#F#1YR(#C{SFP&o_Rf;Z*Gt=tYPX+fA zd?$0i`+Rp~y3k``W&QXYMi zntK)ITC~qLyVpn=2dJb<=xf;=^Y)WT)|trbxz)NQ`WoVvR9sG+9jStB5WepHb({?*a(gsV36Ost9{`+ z7wz{~TSYcp`C#)=BAJpZmEQ2f$p;ud1ByP1PTJ!eD8(_{uL`(#GzF0EyVh*Qd^ti{ zS~vFQ>s|1}wS&C9WEspS6l^~G@6*hAe}gu_#`ey5kVyKDeSB=ZCSsD=>8IRYO<&p^ z$TO#h^`}6mW%)SLtC*8T( zf4Ll!NTD9$Ygv1U12dW;%khC~cn^kGCO0v%t7wY%V--cS)8cG$jf%UF=-z!S=`n$r z)WeK)vee@8;k`8bD|>046eRB1`~W@Oc`dE}fp=0V_n?%pkIK0oF)f|QSFJwqjKZD< zQ6p!?2`hJ<^O;=d#2I(=o(p^bwCu>&GeTz$Uete54GY@bQGM~)8NP-Z)>iYD8(R~@ z-g+b`Z#aH@`f%k9vrk1DSYF0%=L5ePuh}`NqfF9)82cr zoo&NWaovZ8zK(k)CK6u1zf==_*iiR0lb%?A@qxZ@&rOa`^rBdD1p@a=sP8%*#@%#H z6@}LKt=N)t$);k0HH=+W$iPYKjpfY#n){zrh4$HQ@-?Rj7VwmvvTEEyxx1gD;&tg~ z^7f}$2Dx?FZ*`9b2rygl;D+A|UsPD}ynCIAq-f5{VGZ;-hSt^s3Q!vcN3I4|Zcu(;QR-cQ{Q=qK5T?Wfw ze(^u2a%HX>PRK2);|}L*a!Dv$iCOygH|C^W6eQadfcn=sC&1ami8`bM~T*38^7JL*Sr-q zkY)drC7C>1F|pT8xG0hQ*^W~NvxU!pm`<4{2Y=lu(J1Ai6#9bZ~J0jA1mw^5-54&FfDV6@Av8GrTZmlcKU0oRU(x!~62K?oJ*iWdzk8 zYUq@dfdV0lw1c;_(<6`Wm8JKN5R`r0A0zARFMK4JdnQh(Y*E$xQnHT5cIyv(Rp%ag zyy73{$~!m}Qgbg)La8R|sp&D&(AR!SBQm$^KRKCmmOeDSZ5*qKu$ydhOfO`rH*+N~ z8LlfW7sc_-`;Gq6)2I1F|AID2Gs|{2h52*ii zNV?<35&YKbnc|C5yX*kFrRfK9z9icpZGL8&&=*}GvH|0CWNP3-x z#|}ntY@yz|m11k@me0AHD+>BfjKpHnhc~{~)wyDJMw=7;YRtudt{{4oc=ol&RWHlB zxeYLF_rPm@0#dJ9z|NX@jMbKUja?R7G)|b7dl%r!nB8~$#GsHcRl2o2OQ$_~Bzqyf zd~NTC>8CTOG4QPUt+zcrj$zg4D#ojgrpK?Gql$||aGX^jCzX?+E#l#}c0I=N5H=%T zz;0z}uD0deNrR2#cN7Dg3+d3X zgck<`r7dO5$hseTh$Pr>@fxOD=5Vt%y;D9S9HM^g*d4cPhCREE%J`-Yw_Hi%4G(3n zH%F>E3^i3?3M^3P(Pcx27|24NsD7m;-fG@`+|e`(Ayu8?C(4$MD{3-L-@k3 z!ZefdmRom=pDW4Jd?WP}s=KgwFYZoCvpx((!=>dE#h}Mz+7m613;XOf+Hjx0>U^9^ z@6Tf%Qi2q=?RO)YnJ_=^)yY@O@`_bX=qiRBZ@j>4A6K0g?yO86|K;{|{bJMdYkeQz zDQ4`dq7m41RmoAgFS3>V;~iGHoOt6a`SNbC=Kdk!Z#w(hT~!mBPrT&6WxA19@H}J7 z)`aFS@y)S}CR#pI%-JgEnOg4F<x>w?#c-AU;MM1>Tcm!%A~d%5(WH#oa?0LvP~W1j&hMQRIp2w^cl(e9cd&%a8IE#h4V$ z0VyNug;_-%)@#X~I}4d!j2FDooGn&;T6t+mh>t%%eV4?A8q>yHi;Vj`5r(rV4*bqL z$UXH-X%UE;x(^PcU*O1l6n`;yn5yB1OXwa3tjN@%`VOOsf}?w6`fv8=^6_nBW9=Zzo3=RkR^~0Nr&BULc~6|1MEYn@j(E5v zzjsSxm*>kPnuksxixM4jn-8I5B(|uuG-^66C5d|M4?P*4XC^JT|&`27LkXi1nKQ=)lbT& zKb{NGH5)(-R9V<;zZ^4@hB~ODm&LiahAW18IJdF%iQ&^WpHZ?#o$~TudU<}bd{j$rE!gWMwHU=MZKw~s-E}3U!Fj&soBIa$ zEhWbZxrfUgZU0YFLHyVw@cwA`=3j2lgTn=WKTyj5I|sJHJ;WxG{=2YPNpAw)2t1Yx z&SBvUGNZOReAj7fF3I328uIzJl8i&??I4)w0sdF-lb@Fd{OR~nB0ymxC+v^zA$9D_Cz7R2(tvRQc=RDFw+F^hF z(UsG0$J3QhcF|hj>qSePyM1K?i-*%~`!{(H_}YcYsm_H+9WXymvfJmiC3ALkr`PRE z=E?qSvKd>Odn(R#Ka`lc6cWi|T1EFUFtOu3%!>cW$NFwH12)D(OlfiZcNz_*exlRg zazIz|1%*nwxV(MkPK7;Ne|mh7$$1uB))Nrv$TVSJer|YhPgyb*$xRy1xGx9Glno~s z@@EqVN^~rij!fMzKJ%6K@VTmdjf-fR8CnQcwIb-Fx^|=!zld@Ga|vf%?>f( zM{Bg>Cdb{VET%JiM^8o@i#~HLo{iw0ijnkE;bQew^Vs3vAtdj=-G=A6#kFml9%%m< zm)d+osOZBXQ#85lf@ehHqTwFbx@M0Ls==P*!?`5&;X51q8}}x4zV#qQ2wh_yx@tx> z7de87?4~s?FoxK{=G0hq@50yt#5;k~mu>1&8i+RL7VCtZ zjM(_mOCMXS?k#COp4#Sw*qP8&n^3xKDxj`4GO@)zo+0nY?G!`vYd5p|0;n=%rA~35 zrBiioZ2dMidue|HWiqwZYt}81sLh?HEyZGuDeSh+MKT=zeEvGCAk%T%(tXd;THr!9 z)B*+CZHQoR)T-N%pji!dG(r~76hVec&~ zKA+E_pcDL@gS2m8C%L86=B&r3Iy{aZG&H+ClE8HSnBg8Iw@FUMQBRW_H$LnuiC{MS z;vX%Lbflu-)g}4eavMCaGiPcwAqQ@~Ve9xXyX~sy3yBX0Wb}`pD;t;o`e~^*x~k!u zxc|Xe!@N;1y7Wk7PVm_1tF(t(U=JMkl*AqDjxb{W@qG!Avd^q3$++Xh4<`C5=L6Nq z?{|3j2st*q(%bSp*zd4|#^lZmv)8$~Nv;b&{&DRM%aPk6BlpjYT(v2`u|eqC@vC9) z?B3J$II;STGN|1l^{mSo&e^;Z<$A6S5zEFRs&!BxK)T> zd{w!`n)9jhj%y9O+Pxw^%&QLtKRmD8MrhX`>?@In-v#Aj%@f>tHreSny~$!W>*Nht z$El?y$ac^Tcl4P??I`BIIn9=IpZ|_!!L=n*jl^wlYZ8AvFt64#xu8|c?BoSrIL$m? zeAPNmH)7($1ZQ52=(Ih0KuD)LJ2db(DZA#b9*O>^Z64h)IS$(ftEeDv3mx~};-6<- z#kM~s_t!nU`*4Wff}m)lQNusn4>=3x8%MU$v<=Lt3Rcyr_n_tK4iJD`7lfNzHZI~BF?7`wIjbPS%iNS z-Lol(CS>E8fNghrAC{1J(aah%Qib2y_KAx@UA9hSrrR>pHou`eIADjF2<4rH6J^!z z!JBu*4`9gF zl`Hx8ktb_PZ2iVKPS8^6!X8iE zj%ntmK7ae`2IFU=NTm{yY_`QLp`ZDc2kJMN{3w-pZ172&{<415P)=l)kUW!ip8mH8 z#CH9lZK+AS-bom%OBvgRS#vQuksBX8%yCb7e$OY48YOYR@?Fh)KlzpKTUs)EayzHB z?+0zb?DJQH{iXRmU1@Hqs0EHQwtEchD7)15oI7~xLGsn?ryCqiWged8K?~JdCbtDW zy+AqCdgdN!$Gy*%7hX2+Jw4pW-CVYHZ@C^ulYcAYgw=j&dlCwuO0j);S&;bFcZeU+2%Znid)-E=g3(oK%4Q3xC{xNz=T@!7|guwI|L zZu=k9TSfNim?xO~97Z#9Mnx5_pDvu-%)H}J znwO8)_2Idy{FmD-%cY*@vu3-gy!d={Tz!tW)l|fxj7?$pl_%Gu;;uLy)L|A68COAF z-jvCHWA9!Qa@+m~+c?Nf3^5f>P7b@h>Rr=!XO$X%VZ7`#YFp0z$WOHKYweZ3qpb`w z$e>h?-5C}EDtZG>nD8G<&4Q`dPp9ruA#aQ8k6zb5@?FPjQpoTleZ!4UF2 zpd+B`z8KwMLA2Lij+>7Z91PBxTvkbSGGXh<{z{*EF>!mnHE+oK{c@lEOELYoj<`SR zP4<)H{BY%@Tul+@t-pFFGR8z-QVV{^%O7B5_F-l~GN`ZPLy66Fb$Xq# zqi`!tTfHtac#k$RSng0Cbyo`ack5T*_eLq$XoOu6@Vj|};f*{T$=i6S;pF)UpT%u5 z2X{*FY>#VwbJ5Y>EXNHq>!3x>-addJSMq%;%fRNr=i|E3Qr+#_jI8wb9sd3w1AR{h zk{|f0TEKBwSho@4rHi&s=U8bh3EPf+=$W`GGx@}-g!9c;YRuA_OQ{HeNk*|62IoXm8dSRB)8Wp3Gc-gDc6 z=1@zAYTeL}c@^8an%>F8Ok=t2JcSt&g>_VuM|aDWG3?*MrZ3=l65aLWju4Z>SS9__ z9)^u92CVdNWA|H->pE=tCRtMKv&5SeaLW7euzDBmyzv`uqwo#fQZHx~-%;`8PjroG zCb=Txof&&bm9jQOaUfJ@9>06kvkA`S2S0i1&EfqOXWJu=KMCrg-_x~sBd=WMwYyB` z9n_iBe!Rb=y{VVppyQaoag~s0^uR3rcdi|JK1qVA*6F%dWS2EZ(aQCQ%I{OQr&DWa zZrpIg>)zS3J1-Z%Vly_o*>jFI`t{?pPHJSD5eGYOpF|noO+UdrAbV-rHtD85m*&c1hiv+x-e@n;y) zw03?vmV!k2mTJF?J1_A~)-qRj zrs>vhqquLD5#F*$opS%&ryCA2^rNLjdDG&uaKN*eRc)bF6Vg@ zljRQ!@u}@lu-NfEk>bf`#biUu7r}ZgXNFEmsVohrEhWt@4x{b_P(XOKWTd@sxe878G+750;68f885!^_HXj%nD) z%Vy!k=sV=yh_j(+b&kF#+XXePD@qx%+^(Cuxr{TEXls@p-pt9fg^NG%UCiJTxv*k_ z_~_3R*;@5ST{2N};Bo%BGa98d63^}LQk|}tI2A1%@%|3G$BSY_4bS!C(zhO$Z{U1r zn6^movd zs!|rwr}~;;E7f#CME1N$7y9Cn&`l+aN0Lnh!vc2Stqd7EUp#A;5J;zbG(T1qR+1{< zVoSEwFk4(}NO9Z8^G&6DYtQ?5Xsh{~GH>=|yu>iNOWKkm4<1I%BTe-n&X?4O%ip^H znN_zNyt<_HlJ(p`IeBvpZ1+_S5!*mML;B)dvsoN2_oU=##@O}kB==94b%%{?PemBt z{aoXj#jQKh9Y3nvEQE5~v~+s-k;FYrOP{6a$&i6d9k)zqB_16+xko`n@WyeD7hKaa z7muWU&3^wOmyxZ^qqt_v#!cOF8>7oT0{chV?9$lD&c8d>)YSFmQ`NQeuHUYtUAw$R zwOY6AYR0vz?<`#-+iBj~P|YPgd?=DK^>daobI(0(N;^B{24*|iIF{K0;gFBd!W5`A z>!Z(x=L#6Tc;2nyI&kY%qw3aGY=gH5^14g?pd$xaY&62JTRe7+x^kjQm`o$O8 z)}I};zHO{tV4)xKF;f%3LX`|5LYKzZ$Fcn*eVB?UaITJ!9oZ@W)ZujS9PhdL`+=LYN5yxk_x3XPRI9RY z-udh#X_)+$y-g2%Zsu{MY&dcFF~X`-zi{gwr)W%4>bQ=`T*IaQ+1Yj#m2aX$-=B-_ zv^-sGe{1`m{>D1wkZSt->zi`#DEJ#t-7TzwS#At2uG_2}7L01pkiEhb_{QZ;M~0RP zNz1(8j^JUw^pOd&)+88s3kJYy7Y03QsjHVVY$ePNok0Si7-BB$gx|VM){4i%Y z)_Oe5Fs#nwr;oAw7uhbIjNH~sI;AzXJj$xPoo6lzo?X}*n_1<(&~@C-O)E+*{bM-d z=!@3yV_v1vTX_`?(B2CyRBYZ|@dY(nOTrud%_N<}-os(s&y_4Fci39rezjrt4j030 zx?ZWpJv)Zih2?_HM^(wbbuZDJJhBrbG0KtVbxQwKRnoQ=x(%8!3aC@3cb)3nd1KGh zH@-QiJk7*5z4-E^*Aqio{V9C=RFLH9630DDhm^Vx@1Yf0fE&AIyd6iqj-#UWGuxxxe>?4tp(X=S(;wXc0D1wf;UHGQz8}qcC<8LVFc7z}zGPs%@;73vFeJ1DMN;0g zth|z>e~9wi@%^>7e-i}>=i}iQguWdo4HAyTkJm+-m08d=0|OJp0mIMFgGTWKv`}jX z28n%igAgvu-m;L;+Hrv)Sy6alu(&|ubrI(G&if?{0R_Y!Vh-H)UkWH7$j<`F8bpB<5C#rqT$Tm`8arMe zX;z-Pf|q73Nb{ovc=*wTkS4$#|F*xdNDH9(aY*xl`^N{Z6|r`t1+e|21XNmpNY=q3 zEr4cSmIjM77_XBwL=q1U7(u|RkP3pE&IgXJ7eK>^00!G^LkJimSqB1!4?Hp^fR_dW z20LCKX^3PVtf>(|;piC7hXNdkViiEGosL&m7y`8OZ@P=a1^V*ewt)|^PQsuFP!^$` z`A;J(02GHH2cn219-IOq@wP?)#v{mwU=e zv{oXl4GLNUL7gU&#;`~Ohe-f04Hju=ygt$ppfUnTV>jYTqy-@D6GZ)uv>*XG`nN5M zLmG}ZUuXmm67V8|2PaF+E)SubQ(>7jQ$&G)N=48zyk+i zD-tpRYvm3!v;;!t5X6SW=`_$D$ZbX9rGb#fj@L&T0!+3Rq~XA3@FNIhw9o{|=)aK` zz?nlBSR)D`j6@M(4}li0f;5pth6G3>;D9~w(qP#G8n2Hu1h|Y4(pWcYg-%0Uh6b4Y z#U5w^boAdyBk}eStPu?yMk6Ib=Lf+Qcyr1>bs7#d@_#@Yj!#FzVLULH09fnVEg~F*bOd!8 z4xB}zM1hdz18YL!rGb#fj@L&TBDoBk3qr#11`HBS5D*!B?FI~+BP6JS1bFP*U%oPf_T0R`kMoKrE@^rTImw>mv;T4qOY;2q@(F+j_xaL=qVmXnr)#dLh6PVIU6X2aLUDP6Y`m z!aE%pS0Z;hh?Bu=%hF)uX6$%fr1@VckRJ-Wz&fCO5CUi*zu?-9&1xw!ILNsWi3<|M z*Z>#2FpvUb$Lk^t0RkkTf7ooy%HWG1iQqv2ME){0Fd}&jr+@;>xkym?0x3j(6cMHd zn5I<}kN}JQJEa064q{_|yfj#&4vp7G8UhqZ2x+Y0T*0Xb7;q^;hVn0@;Y1P{4rwGl z7YXv~D3l;r>)LG>9ENo`{x0yq;RIOhzmVn!Hh~{64USX6czvWHz=3N)8U}4FkWTs= zX(E{nhcy3k@C9YK!S+QGVZCsbW8BZTxn9aRWv zI6nbL^^dn@uc26tLwdP!LjVdi!Pe3M4G6G0r6Ec7BG%)2b0yQJ}A1_#3Gt$eQAcBIRZVr$pqWJ<2U(F-?^?nv2kcNXK z3IB>#5bSt;q#?j%gpkIrW(7~L){F%I<3%%TKpGok@Z)O9Qb7cDz2)5a6=4AiZjo0aDULc~)5V0Dc|L#{)}2dmGptFVF~_i5&t-*cMUp? zLmJ=C0Tblo0d+sHRw67Su*-zKJU|3Q-E<^O0N7)GR>ZI768v~wq*-zN&cAh%{f#tC zK#&I{MZXGeOoT~X zT^a&j89}9nXyy;427ZD7fwoaN_F-~j`zR309V?(@0~2IL5YZw6=f^txgpekZ$snbM zgXY?0VW4aocDz2)5FoQPAq@v&@d2^^@~HoK8h_17z1*<^*aYO!5Ja?yz(M|*FnxeV zU!v&)hJ>>sel@Is+YXJ_M;ZcTMi6N%8?MFs_~ZGrH6xAh5kY_guK@6<5k&NeKz==8 zsDCwoubDphdH6xg0^(Q43Vysk(yT2?gkkfAE9qlZM-STrP6T~m9X$lTO9Te#6EJcJ zBDzH2K<`$8nt*HdU+xF65v zNy;M#W>1n7())c;H~AwdopO0xe& z)!4>zBD5L{HGH{m1*Dny1%Oo~qEiIC4`LOqCbp{{R}V$AE=vPxHI#N*Cu!CeC_<&P zKmCtY2?X0HOf=N^RuQP}2(;J1iRcu8W1kHmRE+|KB_fp?RG&cV7yhen1wURNX$Y_x zL8bmD(g^T;1{~yM{!(fI0*v&Z`~k^$a@%l(Zz%yHuR`Y{RB>)2AzxYFt03-dI1A>Jb zhHr@hwGrN<_5R{&sM!2JK)u{*BLKQ$AqRwr<`(DyYJvoU_+Ps3 zL7AQvwxZPrJ6<1Y2+$cpsG+~NGFF5R$KfYX!3Bxk{{`yhUYljE2Ku$uUK<1-R<^(E z0tjpaIuXfSY_JG%^NL;@ELX3OGz92uO;AIwC+OVzrvn127ykp&%g3&OpbU7Wpo5GE zoS_8}Vh<2s6Scb_ocX{%!pj2jG&Ec%VF*weL71_tSz!_pa6tg`-;N%F*e-f3Pvcu# z;NVY?t7IjjvjrlsRd6Pf#h?dM1ORdUYO}!&*GHC>E}4vhxsmN%b&w|LnW#0_oswS2@a(*1_gdEvc7^KE29u zFV3YqeTt#uVoURlL6n=i#j1}FlvZwJJA3L9XIN<3p2yTPP8;5D-qjJ<+q*Q5nrpS6 zA6e2|Lg^QVBSzZhCxVw|Cg$Bx6dSv7xb%UcZ*%#rfdE#V(7*>B&%_YluX`!_}&wc89M{A6a zkIpqtovfjx2Xm>DT@n}N+L4D(+LmHJ(%Lu5RPshvpo7c*ii$7pB26 zmbS*41!XF{qhl#q?HZVn7ux&mm*D%Td}KS1S_KO350mI*8@(y$a7Thq!m|CQW&3-} z_AOTJr>xp zBNq_LbzF@ijp-7)%-Xl-5JoZpcO3~ZpuwcwF=%?9HmIj&pURc18gL-sg_pq*JvCCb z3uy_L)XL#y(3SSc;2`F7zyP8~@40NR?1gqA|at*Kr*wJBf zybW55(}wlbyjAND1f)MSIE;}Bc+7PJe=({Fq?ul7Do^t>V8@6B+~6Vs;)Ps7ms|T9 zK-XOZQ$6}%)e^RV)H?=)di1%fB|HJ=-ox*zp58AVG`FSF)uUHL%qCp0t)&`S^#IK~ zpc8I%=EIyS$kvy5-zPogDckdz z;DK{YNJOUf%v~L3S9F;<^-~*`Ku<0DOYQqu++T`)ITS|4;vOZ&w2RWKffXQ|&YC19 zP@Bt_B$iRTDSKO!B3Tc^rIT9aX};Lii3LE{eJ*HigMY3~4!bsZIrb{HCQo~@2ZJoT z?L-HD2B>p^*^N^*Z3Pa#`kc6)O%W7`gEAaVhD6< z3%M{bw=$3VZq()6y<;AE?*{-uTa;no_C zxzRiFqC!HV)A2qmEN-(kK9npxhMMDU{yAomnr_$nijqI%{Ome(z(jkWomuVH(VJHj z8}o!I?vT7U$?hGpdYmO4LPbfO%F6mqui1-ZKlg5_t_wt!9^W2j!fW9p_CwRr(MI#c4^0P0XD*NPTjIB0px%kU zz+|UV?tsa7JhZ@M6#tYFNH|sjNl2&Cw(rK*?AO@YZ#_npZrxIC@Hn&dfa|v2Sl4-FmEzTW6oWm3{uA$I?%yg{`8s zknTW#KJJ&ZlLEhHF#nJ=Oo4Kc%U&eTu9(eHd zz>VbwaX<>3Sf-)B1YJ!yrol0mJ&v&+Vj0Vi3wJ54rl5NCx4=}Nzp!5(rs1DLdzzQt z`6^&wZddii$y_6Os6uGSy4OCh!5M86-}k{xwiEzbIp@$`xG>&FDUT`K7w)3II63`Q zCD1+Hsqk^va^^<$33?o+J3-!Fyy#eSOl z2jhyZ@85sc2K|fz8(hF6$E$~dQBoGa#+_-n3lLvf8aKvji(?N-Lwf2X>|HShJNkIt zkx4G_1 z|AQX295?`naZ)}9NNPDlpW`V3VcIP`|Fv*d40J*Es3q-#S@1!NIHi8=SaW6hxKcSg z1>vYL#=6JGfOMZimtHoHj6cBe#T|ta@L3M}+;c~PE>)9`LyF+dc?7Hyq=JxD`iIdx z5-?C90dBNbE>lrIv;0zq9;qC0OqhnUqKA0T>SyLOuV6S!^XCsFj61|C z^}B|?k#6G(_fNLDT3$3JHgoKLV2I3=c&sz5&iG}Wa(vuv>?NRN7Tqk9{?r&%Xa2HP z*)xtpi8=b1tX)t)f8CXr&?WiO#Nbd*R8IYAsRHm4R%S_bT+-wtUphrC&O=8~e@u2e z4w^1UZq^9XWRiba$7sRVv**T`T_>+&dY(p@f3lx@d2mm35OhW51js4My)+qx<_?gD zK5l%`eM`AvmsEvpdXO;^J9CjTbOmGQZI(?B#)?^l6*Ckorg0GV@-;S%VqlCbIsG!# z&v-D3;dtEX{dF8s47ZdcpZuDtVTfM6<-u4pvX3XZ~`~Dcr(0Kns zU@rN{)X;F9j_dSzU--T@*V+C!(ZzvkN?!I4CTuy6)6DExRJ14JBa>y$XfU^2P%pIp zn*Keud!X66Jie!OEXqYohsW`ii(&x}Ebz;3xn&5*4d8{YLv=Q}V&#&PUo5G{LY1qz zNe;8u+0=-Yk;R3zP)M0$Z`1`Pa{L9|D!ZW*(-RJ}s9F;e@mS!jO*UVr!nttT$En0y zW7#l=z(tF(0sp&r?8|j3<5VFB)|={F)y&&1lD$>Kz~5Td-~=pzu8l&$KYzXl%=)fn zKnt1+J6QgTUrs|$^L5JyAG&UQOtGv)4XBp|wWRylm=&lsT)4&k>gP{`0=4koU<0k> z#i?-j*_y81-SYA-ON&MF$)Z{xPz~+~(fCh26*FlE^o3u-Bz;-2n7XVB@ndU@KfuN{nW}Uf8YhdpfWcpy{Bkusj`@taT$a zf#@}8GUiRt=QGzJ&E?tXAN)(%2xzYE%fB?&x4&8Bnzf=9<8}qPm%6WBq%X9JfzvPT*z0oqj9Vqs_b4XbQa0INr!Irv#kwz{tMboXjKe}sX~i!7dk>e$y*zgo zNg8+hH)rh=rFbCEVUsX9k{KRWoD1V2yStSBa8KQs zxuc?6$T>xbI$4bT!3{-Vi4jt+KeVAn8M^$G8=UAWB<&I%9=QNLXuAdO<$xBX65u1y zDs_m;o?tIXs~`{{CH)7Oq05w5p9|Cgk_BkiB#%F!+mQo~`w2|;1grDQ_Xe-?f83iD za{T%zF(&@El7$XvskdZ2QHr)R$(D{QoYgIPys>MRY>IAk$)YXnq86F4+uUr;Kr+i> z|FzL+f%XSFhE?YPgetsNRu|hcshWTlQGWx*wBN3H~T z1S#_(L|LD`u2B+cuXtY^($TwE4uS4=f3y0fcyxoF>|U9$28yKfVa}SzEw$;RlQ^$w z?^G)7;+qtd6&86n(w6VI)Y{_U?q>CE)_I{Z(=6Pv2U&1zvB!$Uk+allK&GoRD^SN1 z`8+FMdoyV)XI*H&zmpb;6xO~()A-VSbL^rlBYPBvT6`FyP|fImLK|l``Rbqxr)vUO zUHi3|m^j>q!!2eqZ`89p%BgL7Gh})g-OtLs?7J_@$_xGKm4f-Z*vH1WxE)2El zQHXN2#&u}6$`jbxC{F#F4T%+QSv=fUSRr1sYFx8sT=T`a=1XzSm*biVQXxTxw8;>b zHXJy9|3P)j0i#NErisl!9{fucrsejB(!}i*IlSfV3lrmWl;Ld!bK~PmEbZ=#KYBZ6 zMuVr?g*ETBbr!sKY2N;$^P~`qv(=ZZ5tGet1(IBi15c(`LP{)jM6~J?hed#Vg^vw? zMUnL~6|A%~Y;pVCr`6jmlbxI#J3%&5ykHVbdHGL(I$ ziZwoHj1{P9bB_eD_e82fyi?semhuHlFIa-+Sex+Yjsw2kUpo%kb6N@VfC{`P54ZpR3|aG3kschsu2iZP z#mb@SnPcV^eq-8P&pK#a^XoI<1iAsGKQSdI z=pHYligS+#^js?>kphbM@2^4%cC9f;9~a)oY4Tl$`-GUBb@kSLoGRC;}~!W($@n66Hd*)JJgE`yMrqAeYfjh*V6V#6D% z`L?J$HIXBtZWfAiu_nWujySLRAI?3_YyO9GzwCb^rvRBXd{Ke4>q{WeD;phP&njL2 z;o4*4gn<4sbcUN!nE#X>L_;F>7>MY|MF)E%vVkpmz2%>kDK);2jG2+BH*(@ z6otD@c!&NGb^KJ4)Py1#dbprInEcFlJk1UKdF=iw&Z9u zTu5eiFmpLFGs=A$QXA2N;*33|DzVkUI2Q21uDcDpZbw|il#7d)R;mOxW^#ezq|q0U z(HT7qtXN4P*u@Mw|I418_64`4OS;?v`U!5%ecr>o*a?aEHh}=i*|$-dbocA&NISb=i-+@X%+H=g{3oDR48weMYPa;Zn&nj zk6ov5Zg}Rcj<&ngcu^7Ne4pbW_c^krh71sAz%4IJfNe`iH-GxG$kRD{nH;5Hd6KV>qi&+0`rUx0ES;K z4YJNvX@{1B_~k$oZ%F=Czx!0Btrdk!)gO*TIXy@}1ftf2!@&CMbC)j%?`wAZ`_c7~ zOsRXoUV$c%oMbW)(>@D+O5(^kDYafC)759c{xd;2nzRNp-Uf=6u1?n_$G2}V+4YN) z(QbuvI->4Zr>93jr9|cDWUv~dG)zUi*S#=VCm7UW#1S)40S}G#JS}rw-;YmVK40J8Fsf?x~e-kdge-7{%l_ZOIyJrl!*t?rHx5^p?q>U z&tq4Y{_l!Sr6fx|T}7UKX9``X7l(2^lNZNFbU^i_G*G`goy&;D(WU>D)=X5GPk~@k z8;ixajG<}6eCsbgj_Saz(s3{gz-lh|6GAyTS3nxdL#@WDt`vYu>-)|^nW*rSVCznz zp(rW*WH#ObU*TOrE--6vS0O%6s^GGN%yc+AjzrNwksL zfK9VoNaSRCQBkp#ihNBk#_U07fe6n>HFvSBBrfNrajYZXJ$m8wVwzxI=i!25^F3CM z?jc@g8d@mYe8J(K23@m=ZBU6V-(KMclnPEhd=?vPcV`E%o|B8{Yny*a2N#~|1&O1E z#VajkrmlrYk^>wteq-sVLaZV-2kSsCRNKF$!TPhoUk1uoNeQV<+dQN;_}}mn4-q5| z*qQk=``bZ^Dp&{X_^Dn`fDtt3pT5@`%sG&X7i<#eap~Wpi9#BkKXVv$emUFGw=1g2 z=Ri_Vp$J-A`eC!W2Y&|00Oe~{Wi;dl2fiA*nlo*i%i@r{xHv9P3AA#i|Eas%LRTLq zf7+*}8P=RJl&B37NEC(e5w3AT2^Lpv^pEB|KVS?-g(Yz|ogEMC%1G(2P~?{z0;MW@ zLxGkBIY0@}AP2~Twn1jYk^LV&4Ww}mdI@S7`Q7ObDh<7%zRAU^Se7w?1$0AuoV&y~ zPu(2kP;kiu6)|X<7|2NglR@7DMW*9&|3hS2c^ryNN1|4XOegc`t{7HX4Ke>ruBNCC zepKbgo&)(K}_p1vXpfb&}PefZrut9Kg^i>Gp(fGitR$r{Z zJ2Fo-*DoAOVwxH=u?qPv9jZ7|dPk%OGPG6^@>p!;CXTSzI*W^+xR1vLgept#uTwmmPWxv<1s9VJeQ*7o zkXh@Bt*`ii`U+Id4!hNV8mYzxuIS|gGYux^4!*$bkeVRDWkQWnFTL zt3WyXWh=6#u%x~gC~XcB3G~WbRu(9lhLW`QS-aMtptXkMf9!#b0w_?Z&xB&8<_*tbK~ zILc&Em&qTqA10?$dZtrsOjNXg#7FAvb8yMM_cVLYRvo6FV1puUX1`Y9ky|J)d}T*=(AqTk_J zw){tYffM)Zs*NV)=?eeH-CG7^wM1>hSRgIk4Fb|2B`pHd4blzL-6_&3lF}t82uL?b zmy~palz?>ixAzTtj^~``#Pj`npFi&Kp4r3f*)!L=*0t8yWk)P>>Lvl!QV0#qhOCGSS)Gel}4u(fP%C3UAHDRsoh?y+^&JR%;Db!G+sVi?#F2 zQbdo#dT~|a7YxWJK40?c%Erf$17SEwo&ISJ{uPsIm~sNMR%uKmVBlPz%7bhK-ETAN ze_;yp7J=z+L{$p3lzy%G2gLmkPA{Mh0MxL7IK8@n>E7=*GX83`+HJUxpOkHm8K^p1 zxU1Sutc}a>e61*|{Z?*U@Xa!#EmS&u2K5y1fL?5!OeGK{=cjnOt?pNE0zG?iewq?~ zd9q`6s;Na*rAoG9-Z#mt8gE-_G zbTNVVL9!G0)jv+DBk4~8ctaN)1#;AkpfxE@2AYtVB7ZPP|INH&It1|sN`lMaBIHy` z4478(k~4p}QhwpM{>d|A9}NOH70@KRa@_$gI}n*7{saWG#rQMNEBn7$A@UxgaJIDr z;t`we*2|iK$*zv&3pVo9sXxGW`Q}=azmu(j<0%xY+$qiS6 ziL(6mdhRV7I~54g*7lwbSht)P&Z%_kDfpz!slmmm@S26o16a5}EKxsvKv&E52&y#L zpWEPQyFQHqk>gj<9~kQotp61Z{R8X&!-b+D&JBJ9&GH}+{k7)*Zc71e0A_lMWMG#5 zl{5L_Tv|!A%MWfe-F(Q!J>s;qZQaV2kMCqZ$f;$qHn!0fE4$2q6`6ABad~j6b#Y!@ zPDD8E=5oq_jD^-azs4~#owO!j@3gKJRv*U_bIP+;W^O9%YCXF6tO%r`q|_k&*k-(z z+=f-MF;bTrd$op%KG0gkEFDt6k% zOjSqFH#MSxN%iY|@c+|-`mvaOJ+fxpITBtgZCGFoEB2`xN?ad@q2BLoX3^Rx8rxW# z_g&YUasYS}KDV>IgY)WTBM+DJIZtjrm(%l0>%tye^VE3viB&3P&CBCan#k5iVOqPx zZASHNE0rn&zNDPk8%Yo}&xcE=xKlC5` zX5;hVobIX)u2qoppOfd$uU`H3n9YQkG|onz;;Y53r@K29sLH~Ti#r><^^-G{DI$@} zFHh^wwhr0~2rpNyb|xEX!aYqikMH&}SXocj%-Ha5tUEhTF5a~$2hDUM!z(}Wv9+*> zbMfS_X7(SJcr`At<4i?>8Pj|ne93tP;M!B>@V{Fx@(94mvNQvlq5Qk*{(~p~ zFDe5^;K*=TR6@>=^_~^^yHq!?WD{^*g| zZhq>qDDTXB@b#lJA0U(VSpV2Hkd|~MczPZU3ZA6ihZE%j$h8Bap8cV`{3%n)zYz&= zq!`+uOey~o)MyQ9fik5LkH6NC{k=>Hl>w9~%~AmRsjg~3k7jR;1-q-9tPQwKaJ1OR&xz@V9Mx-(8fPx>pxC7F>CX2`>h+kyB>ePR{1ON~M_U7H{Y~ z*BsXEyw<91?3!QbDfSmT9}_u7@-(R_`|NX- zI|J>eR-FZjJX{a<(_fifV&Ll^*j9M`8$!LN+x-p{G(KcP#Qbl`J!AqLUq zuQmU=n*0TMT$(0V`d+TIP_DF6uCzg}v_r16U+%{g_b08#?~S26oI_f=W&D@WZPpfY z&Tgqp1^CJ*EqIsJ&lwzP*A7qT?|4qQPu89=5D@|T&Xe_~L(3T+x5KmMg0Q-g8q=~m z^S0AY8lnY2Ul*n}LQAOi{yBgy6ZH{0!&4NmKjQ7;Akcq)cBCRy33xO9FyEIBU;y8j zL)B{#JpMQb(9ZZu&>sxHYlB>d$3xqq(&O9Zg!2r<=+}c7{nDLA01CJw;{i=sHVrT# ztlJ3z6GBox_?iZy!7oor`R9`KU%Xg98}_?Kf^X|*b<3^(dJ|#0>ThuKDo5DL+xB)U za$go)*zkRr?>Z=HFD`Ju@Vq>j&n_Um*j*#y(~_tRvpxT2J0V7QWm4joA27UI>q%X! zDhmciuHx{)9hvOG)A3qaU#s3`MgfR2q z?;)ayzau8mw1KXX^aA~zl3u`U$9f|M=l{^3|LO00ra6>*OLWw$?Z7cb3oGu*KDA`k2U*0dTj9E|HRE|iB&`<3!@C_@p5o!;vFG2L zqItQpeE}0LtxkZl>AucWXg;CY86AG)w%2ld;RutnPCAT1tr}pDKV@E#^mrzKqA+r2 z-%k|)K~Fs_SV4+WtsA5mm3Be)bBG(H81t4Wete`qI1~`)*w?0o@f3e|7O$I@xpp0` zAzrzTTm*k{9sO1t;H3Da{+d59q5npCF=?U+aH-|-{=jgx&2X^%63KDOJ1zDyP(K+e+^X zq>sM}r2ss;#bhk5>F$xoVnr~^ap?njh{q$mhEOQCe8E&P3&JLEV|s(Iu`d58`XBAb zUK$TTm$)0G)$Sv1@> z`;xE5V|VVnMc-yBjsDPlVzpxD1QgF5+9}$N%>(6^_q6iu>zOWX@=o)>N#N=P5WHRt zc}TM_ltMHeS2Bc47orxmf1Ci$4S`?T$bknu0A<&YiEPItLJoewJivZRHGMrueqh8a zh3q*{Io?jep==GL%e6K$oUX?-gvLqUP$#+0Qd{4GFc0TR zRnyx0+W@ZB^dRVgAF#;pUHf8DfHx$+x|?1yu?FbxYg1w~1vKd>d)&!--6{LrDf`_i zztp~3(Y$NVkmaKJ+5w$nRr1Q#2Y(3~SKtxsi@)VQ=PW@=yKQH z{X^sNul>j-Q%_4RGF92-^0?j)Cn>B+ftpm+r=TG9SMC7!O7Z>&q13Mwj~?JC{oynH zgVOJZD(w->oHM$+csxsifD@Ng?IG%V=L=<+xosP@>1{i{jJB5P%dPFXUB}H7qRZ~n z6u{Qss1DYk3u9?|w0mSkM_BLFtu-_Bl|v|zj;Oq%mV3iSca)B=?$!EH$?&ub`$8Kv zDa5xTD+6|8xcn1P^=$K3ZsmtkL7_yh5OmT`ZOX|+t9gC{Z#3J&BWw!iFK1Y`?E`bWMsh6f4MX_-*!l( zi9gYG{%+oQ`+G~S+deKs_}Zbp`Qq?=rw&8?y*8rM^0qdjlzZ%fl+A5KiTC`QZ+)E) zmk7vhCXFMluzXxmCKIE2Zv?ti4t{=|7iX39l_?ZMsZ9R1s|HtJvyx?pDTK5NzhYO| zy8f~ALuWv&<`E05>8u{0zU)W?v^LJ9{&I;tIASyIDeao9PdbD=ffw=wAcg>Rm;KPG zwQd5Pg@@z?(!>bh(^wc{I(tx$C4>Ltyk>nRjq^4l5(vM$6+EJ|K9Wo{|Fe5>}ytC=I|I zJ~1HXknZTENdtj}*mDT5@Bvo2pLhNjIud7!62SMZ35y8&zN7mpPA363m3ciIW91_y9ENhl zBxyYFd_2Dog`ElIGwwLKiM?lw{v#=XN9A}9P)&(g0x)BH*Aa*-zMlCzNdh;$MiYCRlzKpB8DzNRO-p#Ajx#ePXqO~tPepU z&d+l!Ii8Wer$4^WU&2T7(%!7ENQGWH)B)9k6UzuL?sfD^URuO&2HG-kTXbJtkPJX* zz@q`2iiimICF{eV;N!m-XtqGJ!3Mqn5%2Z+Rl~2VTkC0T!`VxmC^i0E&?DTVBF#5# za_F*Nkz1U6Y-3b&T(Ue>mCU%Ic|Il0SAV&+Vm!XPH+g93=~nTKu2?vpCp>(rpmtRm z0A{0`B82t1OH|58H5{>g(@>%wH8;{BGRbKuS;$n%&QGQ{;bP8yrJ^JRX1n9en)Mhk zR_Sk%!AK(~$onTof>x$g7+^=iFN2dKaQdrj`rl~%F?(cz&w4HqB(i*Mf$vNCnS%z4s?jF80 zXm8@$aNPD>7As8Aa3BibN(l0?h1mMQ3>c9H%z#gX!D;@9A82vnfJUwUADH*Q;7Wcf zmwtwyk%B^>z!0#b0ug{^=sq*J009;L>K^$Q=m~7V&$eB)3bccPT7THV_SAX@iA=^W z*7=q+YWWGdnt=N8iJ@m@#9)nO_@Q0W;UW+pR_}Q^-?Zk~D_wJWJlC`)y~(F8p&nL_ zWFGukc05|y-Qz{@{0{H3D)z_$O`AqyC($O!m3aK{UKBXU=6P;|L$C5GtnF`wTR;3E zE@z)ofl>E+jPxTY=Jy8eKbc7O00@l$fzlNS1%T4yoYGe&beXEb|5-o<>YX7d=?4z| zQ}9v`t5%-5+Gpy4s@?k^_m%l1))`LL^J8Pxau(;Em^Rh`y@|{2#j<~RZ}^pj6bNBj znVat|m{HH)cvROh&MlQ*E?eN{wX9shLBCOMbCz@HuwD@yc{1PaztEO|42c8d-r)$U zdCNQP`gH1DvK)~mcP3Jf|DbusRlMlmIr5V|L2crQ= zYNf2k`wfNcK@~_e?4fyi;={vG4kDPLS7_fV7nE#BHE7JKDF;ixDDC_{a`a#MIljaI zpFUW8sPy_2++D%Lo(!FHnDTpW+3fYXVF#g<4ptojjjc&sbq(tvy5p*?Kh zrJ=z3iR8heW>ajz&Jaxvcm9ke=dj7FHNd|JScuggBtlgBTAoAX5R%Yyg50?jh}rRN z*0@203uKLlwQZ813%RKOJn}*au5X4SmpU|0n1x~M)WvaC#pmy?y zXYVRD6j)gP7#n&YP`nPUB69x4p*{&q?%W}F2=C|8{vWXR$+}W5`$8so0DxBHYPnk8 z^s8SFziRidBbO-1U&?I@)5$r zia&oIEpWFP@e_GXq=nWAD$z!P_zqBqssa#5Ki6cZC%~FKhXSm|ej=caLMRGoKoG-! zF7N+kQ8K-%ECO8Me_y5SuK@O6#W!t%&YmVR&_~lm2FwO`J_+bd^M|6xq$C(_oVBjq|JzzCoGbXsOI==uBoY7 zx>wpw-PMAZ&+T&Vcm_c9JQ|4#gfmfkUEkF-kKK~BX1`Xr5akhS4ff~bJ34QS10MSD zO{uH!r|L-1@*xCFJJ3A|2{Ts9DJ+8>wd^>BL?{sf5lUe2DR1y%x6O5MtwyXafDzZ^ zXn{XOBM5Yrh!=u?4t-1d|4M5kUI?Hcd+Hdlqp!~~fj9WGIv!7aZVam(thQd?I<^8_ z)B5z_c@y3PAk&fM#rDz6CGs#c#tfW+g}$wwje(9icm`&7V}fkO0-mV>=U0h4nIPNK z$N|@o%(=kvYDW_$$Ob0B{p)=A&Dpc_Pbvq&XI>GC!azM6xNO>SL^!4%TIn0o>gK}`p*U9pjA!+)+ z>+5n?8~?yv?OqPtha^1%kJsfPTV{jTSM6j5_E`hl$qd;789ZJ;7uc%m>i%^($ab>e z|6iAbYafPE*fo_jq`m?7Jifd7Bh z|IF9pgZX-VfVtiv?Ytfzz!o9b*Vpa49v@eU?16f&$H!H+b@2MSeb?gy*v;jt{Pp+% z6VyTKzaAezcH-;n>vGrQgZX-V0Q>G-|Nm9FtE8iHa90^W!Q)l?uF_J1*H`^;l{*o* zz8)7WkQ{&D_0@A&uE&MOZyzDpkgH^iaKyw6at5}R_BMJ3w!~KjfLm8vpULPL8Gt{K zG|)HJd2H!KtOlkrWCeDqVFtb-j)%Z*4;-8t;4cJiEUo_b2anAR4D|o@7Ya7U=70MG z866t~3p?Vgmj*mj0L+zbOMEq@$U$0RX<-Na1o%6yKLH?--H$)|D&ZYu4&r2FWc%$l z*y&e&LCo+oIUeK<07>!wDLI~sdH6&H%Eg8jQ~SQ4%?Km8P>{YCR4`$@X0Z4KF+6(9 zq6}4;+nQ3$0eLmva^K~2+EX>Rh~ZPF1T(YHp2%+NUqPfj2TOOh4Y#$?C6q+cbUzD7z7&V)DrB62n z(IfC8?d$CG&Mw_JIye0)G8a2UWT9LzEvAibQ7#|gEE<&luvPmND|JO7AHD^U8)g@I zZKIAb)r5U(#6%1EaHxt<^9-TfQ{{Y{ZKoRUng${|@xzjzm#a;RL8OnH2|@@p&~ znm2XG!)jZGufq}GC{w%)UP;^_Q7#>B$i5dG77VO&EQ6&&H^3G zJ-NBBSgm)p<1F0~)%KPRUewu&McrCQxgTKjQFJmyw}1z6j9-5aRYmTu9WU(W*lTJd zI_K@mo}MoOcF#zX)LZsGB=)wabPnV^HjL~Ds96{YhW9C%jmq-pjK%s~bMZqrEh9LwdwPQK_h?yUIvY`@8l5(XXR?(-cH}12BEYPTr-v=r??RG5?mQW4`$fw4*q?TV3+g z0Q$WeR)!RDpk&QM4yN$~73*Va)_#^9N?SyD8Ix1>g2xli1WD7$@caSg7}_uN$m=!d ztrc==lbY*dMSQ83F}iIZrBL^-y`_eWEl@JfBz!L^5$!YP{UE4ir@?N;fsrEXj5Ob5 z%FT~Gj>fmWG=wy#S=c{_Iae!y<4Z@+sTu+0HsVika^X6vyjF(?<$EaTK56%H44 z9fBVLy{8`_{4Jz3*e(AytyOcd1IZes8C=*_ZaFlcvX>B#P(_ctyt+eVt^j;W~Gh z7~a&#?^)7K>mz#`sjmMvtf()&LXcwDDS|S0fjKAT?d&mZZtE;_a{1C?v8hXP2D(d3 z2D-`DlIHV3mAJ8kopy&-4yQF`SD&^DI_r=H<#}U~w=CNT3$mC?HR;Y$%Pfn|Jn$J- zoU)kj+lu;TXGg>34bN^Y4wY|Vmg7~BlenEe;2V|^#$J7H%R6$kus&{I_a44ApiubX zeuv2Su;Ju_o!O}sk@A7XoI9-uif^>B6jPS1(3ZK+*lf>GNv(Sih~3>e4(LAO(;IwM zns&bnta-+w{~Hl1Z3zh!l9g5=g@DZHN33_I+d*IJBy%z?}6Qx?Fy z;J@qPJ%#z9w=IpZV7K+O4yk(Va&Z1_s^bSdS%D^a$@2X8OE_;7QIl&Z@7pX zoVh)XSM-r*3V-fPHp<3K&@9}|QOmC}W1^oSt}@3O)6wEA~NAcfn>yi99D<(Wd;)+<%p*| zTtX(%02(8qrTm3dgkeDL3vyUY3Diauj5yH}0TR*l&Q2!=vrFi3FRWJfZz(Mf0)0fm z$SGb%zIWT#G4&0t%Lh+e-WpAOg4zu4;PvKZ@TgTiJF9*Ym72T8)GVRX6U_weov70j za<22ueO=}+A?O|)T zQ3^D@SZIIiC-ffgJ+!@N`8>Fr^cm_p!}N@DMmM?n${p^$Cu#Cwx+yCrE1zz94^>Wk zN*?yZCgO{ZH~ON<>ionR9dYoTSq^GS9o|F!a~}JIRiveOc0F^2%Qs<2r+DV#4w_Ku z?a&Aatz2@TYcoeg-G(S1a(=S^DgixBAlFNbrcXHgA{3g$XO(xVZ%aPUBb72!nkPI- z)o!8HWp*^Ts;)MmBCcUD?}0&u$;9F}>KAW{i6ZW?k5;@b6@~4{ytk0<@Yv_AkAmD& z0sRj$tqNjKDSaQV@r+`+z#gA>u>=Z6xJvcCLzp2!H01WbU&Euvud&Sb}3V5H1bn31=kvb84v3{1;0XM%u7hsMZ zbC{%doA>68&b4hGhEKV}3Dw)!di@WyVlW8XEc4qAPfslHy^>ght0-FMOs1lQ$}f2J zW^!r>Z*Ezg_85+?W41Izy5ZKi1;OlOG2|J|c6f~ka9n{$IiDXo^zSmlk)Z}BJ!8JaCTX!0?HLP`t8 zH+v0x^3r@?d_v)nAK6X>)3sO-1@4H%!j=tsFLJwNQWeqV<~fXu43=KCw|nx&@?g(^ zBFkN6=^#@3Oh38j!O^K@sd2^_-Tjf_A%&9{q6+dy>9-d+7D@A;5T1R!b!`sxdPv{^Rh2EYhX`XP zUrN6fw*;(3Z4h#WUs^+k=#|j9rxGyHDzI2A)F+TR8J3a>32~M zCZ;^Hixgz_AsvlMuqmd+J54T7YR4pZDrH6V3(cG8+Ntu}`Ql(-Jni8i&&C?jEy-Po z_7MK2v*Tez!PGy;9rNZH*-No?eMu)oFT(&3BQBsq>jL1Kd0rP4jZ=IMGJH^MT zD^Egof?pavRRxcZ7ak|tUOb!nM9_R+OfS<_`p~`&GrU;P81Be?a>;COC3_xraoDYBOganHWbPOOT31Jf%_P^P(ZKqmS-210XJ zZKYFzQ~0wDRHR2E?`MR+eqP7IVeHWk?Pu6H(=J>#NA$;EfO;#m&w4_`5MNdAepXGl zsbnu}$;N0BE|771Dz)Qz4l_|&s(&mhi>sNfj6L?Ul%$iPa8@VGPd2_%a z)Yh_gU8g=j$Hj;MmyrXpM(!TMgr%L;vo!qi+rc#t_%&gDA_dqwubxLPJOm9G{Sir&}>XvMKc#4+#9?$LbnMXP?^wNV;NrO^RQ{?p^W%>zwrdzI;r}mvq?k{8+>^qU`MO!FCYkn68k>{L9VI2-$M`xuDF6Atjxbb5Rgmy z69j<}U;l#kP?oivV7upWSiqru>vcM!U_?5V;Zzgc2h(6({yr%8=ewz+cIlEa>K&q( z2R1PLbk;Do z&N=5YtZJQX3pw0rh|{bJ3FSXCH#%oUHIgs;uo!qC(6enV9t{+Yts(`v-0{T3n=%i6 zyP>Jx*y7)^i6t!3xKHjcCS5nyZb9HTj@Zh;TW>dtBB0|j(bNNj_6x~4c zkpK&s=SJuobXz*q2(v?x_Z|&+3g?y4wK8^EIBAqsjjmwe+{R*`{$6Xe*Eboa)Pk+8 zQ_PFt$UaUnGLavpBWx>%_NF2##y(H&o!>e2_k5@&lUv`Q;wLne^S8#v=iZGDj?2@n zLT9VdaN?~J(5UNbs53}$+!e_DOoD;xs*s})blNSdixlLe)P$S6>7(~Hom8*|F(>P} zuA-}ofq~g8Q5w7?7Y zPk0O`KE~U)zH=*`ABPZ%V)BO9g~;czOBXlg5}6Az&lfwaESFk!XD2r=e7_NsMBE=N zaZC31_*|fhu_cd#xA>Z>m_yRpY;b*YOi!y*yvQsk%l%C=y@FJxb;CeM)ePB?PrvAg z;q$S}FxEL(=-@CHcFf5)SPw!aw;FRLJVqs4Br^F5`sO~%dF!}6r?g?ho6#X{To8*U zd3ygqB9l-r-Nt>7>Xa0T?`K6kn8Cm&+t^N5pGX>m4G_~}mGoK5cEf)&P zkX<&Lp*I9v>v^>+%vKdEY4CbS3-et^9EI#npF0zNkeuasn1ZeMNitEmrq9RN4(Y`G z%VpG5zUv(!MG~@n`&`pWw@-I8n7Jz0qP^c*4;meoZOGf*t}?e)gRK!{q3T{nI-y~k z5bND#5|`XW&oVwq1o~&>mM!}p=bO1&fk%s}yRJK4%G}Fk^)U04&aKbqIg?e)U-f>R zB?;l~3cROsx9{$X!ch|yk71b7`r>>JO5eFcZ(zp#`zDwpRBp`n!qEe?Jzgl#3)})I z-xuuKZfZ*p*uFxegd5nt%g4ga{YCTGpdH`SyzHa1Q~mw2;}#KdxJJpvEN4rjsNPR@ zsv{=|KJ!rzzSyRx1L-3=U46ppIom2cvUkwc6xesTAPl=R$w2drDglo{728tX|3 z&gfl|o`R0TLpX(A783XU%~Z+F0KKmgl5*P>mr+u3jLiz{6VC|h37gQlH+aPFH+UTK z`uAd8-q5&9=SMWI+AQO*M_!~A*mo>rt8)`IhhGmTtQGXWiaH`S-t6J$ zJ37-b5^kDn!r7U7dQp-d@Ts0=KT-(YNF{7|Xmvn4o5~=7@+I|s4qYY^{QkSe*ossS zTiz+?alZ&fJ-c0(y4mlkv>%kZsZ>tXVD$2C2v=VFo7qQ${zIgQqD4b-oK>#eLL8{*LJve6zU)N7J7ZBiD(m6m3o9Vl17dJeCp zah7G&Sg@gncQSPMj|;8eDP=k=if@}~HX6jPw-jQiycI1HQqy92r=Zttv z^Pmk)cnw*CPME>Xi6x&P!oWzUPmwZKuZ^Q_^a}et+2&_sKYeV#)MItiwGWLXSz&Y! zlfbMLqn=^-P|119zNm_3KR?kKj%F%w|6H_$p3to6iJHw8PT3|Vm1d!WC{O$zumFHr^MQKtZ7{z4vVipm-pQAa({0! zv#+h#g=bO_s!#l@V>c#xrgOIz$`rV8teF~`Vk8*0dW_)v`4zZ0` zUQ0LDL|8@bW4?t|s#)u(ZtW17avc{wNT;fm6{>d}ujAxw(TnJ>G~Q%LQth0k7U?a( zIwZuN3w<8%y7_{=Mt_0@@a?~=GbzLYJKRAI~hgX*&GNh1t=+}3<2{KyMC)_pWeu&| z-l2>uMeAnNTFK@g!x`GTo_WhAwgqEz9x^61U0^G*-Z$*BMLy8pz|q|__TB5e<=H;L z8S>)1!!75X8A(dA`xAB{rdhaE?!0C6Wi+QzeJ-2G<0GL}2T1MAdPRfUWn}507ZG^=es(zP1F)M?|#$QnTaP{C=^d=Lnua=P9sZpj&g~f zYj-G8C8QdnTDs^XEzw)jkT7i&yS3bX3z48Orc2mNy{}fCkf#hQ5@$M~=NLh}&aNWt zyfH52W{D<4-hS4Bl9QETY(yhxxOsPgyJj4DeCBXX+6Uh%lSfl1CNaac+B954^s3N) z2YK&Cmfi>;BHo8m_ypDRo=SX>A7+kpQh+yREI!)`X4mJ{sL>j_dcaA*y;o&Bp&^z| z-;;RAF|a1^O|(4Y^*?cS#2Ddy7e{x3*2|n$box+t^A2{#Q+LKU6DgrXl*=oVFL~lz z{YG6Mz0#XScINVD`pEZ2dJ%C_e+hP}{J^VZxx)LA^crW&@k3*n73M6JEJ70Vhwn6N7l|-!?9?+ z-?DAhiirrXUsQK+bSCGPcfaf&_M(VrNQ3VypEh`{<-z+OXX;BxJM*o_lkAGlXR}zH zZde7agq?0ve0svVzMG2CfL?26O5EDZ9H1On*VMBUzP;FddkgB+$sdc%NCyA-?klMB zxNKGTdgPr_O!FDcgrp}Yr~zIsYo{zpHc<^~_ENjF+m*2q2=e>2j}Y6HIpyc^3AK!n zI~wk=`wxty+=t)tb1&hT(AG*XV!@8&Zc*vE+a(yX{JpnzHS)XNMg!sJx&8zrBIA+X zg@<~nFcHaFv}DkpLOFH3)+VcJIfrG@ubKLw!2rqFVm9OYf;DVW0rbL$vl6ML+JNc zC(|W+s*%lmpK&FEmT#f5@rdt=j-f>wx)pxRx@&vL9gk_jOQ97fcUiu0Iz&VxXP5JSh;qJk5!0nL9?-BtS0r#yF4UFR=qIMV~ z>t9Xcx3?*eEKa4F`CaT&+U!m&W#hHU_Fzlav+?m!p+)O`k$M_ME=tvO+r}^b)c|AQ z(!5fT3Yl;|?JU(TSX?rHe4-^<+;30&oX@IP>2?zh$_hM&-C0}nDAjKkdlPrPrhQ2g z{|JY&S-$dM$my`5D_Um!j`02WP`wOq2}s3=o1VnLHj+KSK70HnS|3JSi2S*?9zw}8 zT8VBelf33>q_8*~EGjGkjzdAI(8nU-hUPp@FX?ctiDU5{ii}>`(hQG&&HjK}9zvGa zq?p%|p}}&iLtdPxh%Gp}4r-s+qb-tGPE(aUW|cR1;*fW-ekkQP(TB z`8|#w!4jw1yHjDzx$3p_iQ1Z}-Nv3jO~CbOYKWluOtoK4LD}I#&SqDWxrPH4c}gb| z5)-BU5OU^JgrM_tl0u6$2Ui9j6HyH$23NWAb)F8G6?J4qHT!dZBkPFx8_71%SjyPh zN;-}9n1USEYk|s-5P~ax_B6(#H1cg>h4dszDQ{U+v>oVUb38Vkp4Odqv;3C6+PN;{ z-kKvYR^8BdI>}7QuFtnHWu=42>SqxyIK<{`PA+MY@V)?v08!;Y)9?;T${iU>BdEju zT*2w7wKE0o@qoSM96Tv!$sdiIJCxp$VZ^ywAqUREfI=c)S_Z%ERkEf4f`%{TOxQ!|1p6UNXi} z)>+kFiTapo?9atroXf|~J?q@zU5Qr4UToomk$36ddX;0Ny{EsK?%9{s9_;OFhW@JD zvZI?Y2+0)jq~TerL*Tvoo}#EMsiaW63tNuY?6XD3$FCTD%6-%khL-3(c55Hs7}ou` zsXASgWzwJi>g;@Vu-&xm=(M!p1o6qqG9m8 zPHed(d%*p4IHL%`rb7E6Eb22B}l6DNyr4QKxyw zURYI6THMPQ+uhYrmQ63B{~`1_VG46OQ;9I6%b5A;n6ANQomG}<_3B7~;p#Z@Bl3K- z20g^PmBi*5#NWG!w&9#OZ?@d2Y14BW?l?5Yg|&s#N!>bFz}Q(uc%_i~*!R})L|fn! z#|XldD8?yT0_zEK0R`WOgtxu~+!}Fo*A?Hl!jYU(^2Ko;Rfh9>M1K+?`BLSXwn$(V z`Y7)BCT1FRZ-p5&%R3Y}XPtN1eu%72(B)yzp3e(!lszuyEF(?eo59s#>xwCn+bt_{ ziWly%XBY2MfW($4I!}B{h?jcDh{=hD#F1XKQhIVl$lPCt_1(g+Vvgo^K|eBA8s4&z z$in+Z?fKP?g1GAPlxD#wvE}Yy3)T*u*0TsETyG?&?r%u^tFv5{y0-)1EgJTs+tC-X zJRR_#sR}X3jLA9Lu!@+>Z~{xc@U+L^guS7rln7O2#4WQ)6;;;%UsHZ zjC86XrJGDby;`?6zbslkulZi^G;-fby~&nfyx$xNX`+%!E!~XWOJ_?y>hf_IR3+bt z<4ky*fsxx`F&$FT@=;yL!PkH$0vsbz=9nff-v}q+W1omuZx~UF<_{4ULZpTLX73rl zlqk_YBd$noKk<9vtvB5us87XZDtMmvIKi+TMINU^>oiBR=wS)neg+)QB6O<_iJ0sV z<2MElDr~->xpyv{5+C-5(C>`D@QseSr25FaMLq2{+tiYmrYI`cq=jQM(YeX;^6hh< zm39&dk?~ND&IiGDw}AL%rk6&Qc*Sremaz7>CXiPtYI?&zZr}VC%2L4wB}p!uNklWS zY<$D&nJ_iceP|NuFGu}2D}<(w`ih9scqM3W67Hax4Uu8K*FVYWC-bz zW7{Ro^N`^5Cu;{wjuhdtQZlcpWpQ=HzEFwDNHB@Y2D`}y9k_)E-ji(b)YO`F{1%(A zasRPrt@GJ!cN6r6iUCPGfl8VE?WLD5CGDY3)EcqU*1N0y6UseBW%1MeL+!2OzjAkV z774xE!8xhjssA9pzJx^D&1t6T$FoL)Fa~JN9AHJ?pCP9~ufx z-rOoR7XY>k_1Dm&{QAm%Q(H4>QI)Gd`3Vc9qWzSennIc&t5-`PBH3&Cll>vG)}w)f z0uf||do;XJy;J@i*MAd^)=7q>h~9+y2jk9kTMN!&aAzdEfl}YbF8SmGp&;U{quL4N?~@9G^@%r zF12>fPMYTd_5PXUR*`|Y6c1`sQApxvITm5ksTQ31S2x$yntMmxt-R%A=!KgL`EIW5 zZub_8t$njj%+Wd7KE-yppqygpi_7MaB!LptOcr$FYwW;xJZD^Y(qB1wA0JFr|MHUqtZwRu&kPlmi68K*@!#kXI=~S^J*VD3yDhLvFK%_?g_JR~ zxBZYx*5-jxSDt#jiYoNlI6;|1eB1OF=GF&Us{7JNt|kYrUFLY@>x_H*{fevU`b|*q zy6cKYgbD-+(Jb|9^Tld3X04x&nZl)#M^-N?##u5AgG;-Fd}E?^YYAQ&;x;(N8`*Fx z+(OULazOC5ni?d{Ic!_8O6)7UoG+$%)-0nS(-)o7yzOyomMk$%dHLdVedm4 zce?hbPs#BY946EGRoY{*IXvITDpKX?f>L#+OBFTW%ysLp2N*C1RcXrGq(3Vrl57$^ z5@edBBRR3xDze&}HXb-#ySn;cSN-x3< z&yTaM@m1inEk6lg5Id%RA?6`|L$@|6BMEQeb?^!Cc~kG_b*{LPUPcCP_ZRKNaDvnA z*<9%!^TXO?!fu}LybZ%z!ImK@%Dy7$4EDZBKplvr=Zp1ITFjB*k-$NCm zkY&G>9NsF7ZjJUx(I~mF%q-rCbn$&)tjrljnm757rGHMe3bF~wy)c+E3pS(YHNMR2 zd`$<#bt1IOv~c@?^jT)_kqS+4jhT?nr9pZ)7Hr-qe6dnSfIYn{>o=Qd3Y8M_7I@e> z)GAtyC$TCVSp4;jj@|1fg?jAGCb)`WR<5>28vL>Dp~z`08e3^7uEsP^7Cx++9UDRw zP|}YGi81f?*h<53+eI6rFTz$@8DF6B!H3&qUmi_W%^WrbAU7RUZNi_c?;wIJ5A%_5=NS3HQ z%rZIO=4Skc((clzslY%eTCPdAQv5Sk4T@x)JLM7OQUYsgHQx*}4^AjY52tQo+hZwB zx+oLi6Za?#!r!5s%g^X2BWm~4G$GfWu<1UC&G)Z+xk8?k#PSHS zyE!H}szib$RA9KhrrO@mb{n>pM#)Kw^wj0JH^Q}YsGsit()yx;-n##SbbD-MUvXgJsJWuCH!ZKd-+3n7J z3AmG;vF`g4A)^|H&u$a8+O&F{&SG*~r6yr1R3kZOId3B0lez6n>Rm`EjS{>!B6E*K zEtN;;UR369>I=Dx!f2z2{A9sRH3!W}Nx74&7)mrDecKdL%Vlq@uPa0hEX?4<9} zk&8lONrcgniy>yf0{XgFThl03l{!BIDXbCA=Tf&PGg_JUZ6MZxN4jUY3cLFW?j)Ulu8kw0Pgs05n$-%r~Tc~b3p-&!K9A@r0OkQxi5^zu|&C~FblCXd^cv4!j$ts5j{B#ezJ z%l3>^1sdKkH6~=qXTc(4VaAv z(wQ&b98t(|5VicsuOOa9d~f=EId?nr7($x(h_By~~eBq#V%~J^!|;gb~co zsfmc8#-(j;`Dm_hfqd(}DImIg|LEAz;m#f|q1&)g!Zyo9T-<<(F^BQXc21Wv-9-O3#L+3 zV_QPeLNH-&Co93Kn!zuxIn%fuc5#p+6eAPf?HJ1>Qlel{M%;jvH3xRE&6q$5CVIkv z%eom{U02SetZzQAR6T5SH&2*YvI|O)l)v;vf^u*7bn9eZYvO z12_L-ri(u%$Q0p^k08OAhbLpJwsob9V9PcPI=&`d&*=y{KFHjWdq{`ue4-T1aSpo& z7>rJOOjec(UY>H?%)WXv_1>QH*M}W~T67%BjTOpxHV-ucdnJA?DhaYP$7t_1#!4D?6k1uO|u{#fU2D-bEFti_5)lOM|R7Zw4g^Fx ztF643fCU96^ASgIfQH>|s^1JJvao8{H6&4SJ2fH+=wQx}?;tq@*x9iE!4;bIcb4YO zRcht*P;P4tR~dYGy@WAc(KT&wjLM9=As*~<5xUSzX}l+C1b3M>VfZ_GYXJ<<=M4{a zOPXIiv7gd-S2AIgONTBz1{trImvBro|(K$%Qh=cE;kb(vJRDm;aE`uq0Ooc(Z1q)!1ONUS>6UQNZe)<08W($F( zi4+2DHCGG2aMbKq_IfrBC-uqm0RCbn59OeCF=;74)1=ppse))PcZsQIkKioBIZQ-k z_w!i{ot0P|r|z~~zf)WXV#rA^sFMIjSS=wUw+WVC!ZdwZpjirWce-uIvqShnQ}MLE zuBAm9wk5>w6q{vVYj%atj7%`0DRR5D)P1fnV&^q(xDVKWdq+KX9gn-7ueeOzyF*=H z7=Dj-g-eYyFhHkNb5M@6Hw5eXDiRLPMW;nB%oz03hy@$oD&Rt`yX3lP)M z20)&?q}6$2czzu?CAEgzevV)4YDhlriRm|l?IC5>rC0LmDH~WcTH!)IdsAfm3=^a> zlAWlO;%;(2kIZ5cqd<^=q5xDL26L71;aIlIpjb$QDo!ytRR-yGS3_ORjQ)BJQ7YG{iTF*aq z`H8GHww$87h{(ap-Wzdo#)HQ}qz{>#84yn9ZMV(dUEbWhmV>YDmiwNwqX@$J43+sh z5-)+-;WODK`qkLa3%)!<4!z?J`zEv#aUGjgwcY_xHV%0}y`Z<@ia3-R+t;%;DqczD z0Il%CcN%8E$sjVb((0|5`wRZ+XWb_dO=Ndt@z4VMePjZ29!|SL;^Xe&@exmXied4; zJ4^p=?D}t!!~VYn|G%82e|M>U)m6~{<1GD$4)~9=l<9xc@$&z{S*k8!zt)V{Ia$q1 zUKZCtGW|^qA)wr0=)$-uLx6&&G|qn!Vgg2_FF;@-4rh3zT80$}2|kYTm-<$N5ETf_f6d3U{r*?<0j}fO+&$R%)PK{Nb(`&T20&bOC%I?))a5F%e5MAu(2)%bYfhXQhs>*uUDcaQU%SsA>$bTD=J)DyHbLYNpY zP}qU?cmZah>dLACy)AnwuzUfq8wXK zy)X`wSaBf8#RIqayA@;DIcT;IA6DRz*OP~}L#JqM;!L0fy`sH{Bl_SZ0z@Hq3#fAcl~kHCKxWU{-Vjy2zgkOVb+D zEBw|6_RHw%RD|r5`0!raX<26^8XOKd`SRF6RT`3IUi~c6EctHSBpSCEhV@S8$0?7) z3^ootYe|fx;0AI{H!p@>=HjL19l(y$5A!zBsV91^XPAqf@*TjkHg)9%`4XT)sKgT2 zy_r1utmt7AJdPe+d63qN*pu#WMe_}IGlWxOYb{T(>zOvs!y*a8J?im8g@18Sms$mq&)t!8brYRVqDco0NGr^TLoodtjZEDiAYyH3qb<@ zf;RuiFtsGzOKke8hiRFmxU(XB;=$2m@PyKAhq;=%!IM#nQL2OK@)n&9v|#m*loBG0 z-|z5(0P4+*GU`}{C$6-`v?HAIxg9((=glEX=$)iBpENs8XngN@Plyc7>a{6ie=iDu z23|*8pom@I9)lKYr{~g>`(+~YC&f=L=L%Ekdq$A6-Bz}@yj$s9IU@WhrB1mvk!hp# z#0L+nAh&9bx=fO$^%b+1L99z^PybgU0Ra6B1A#!+NoR%e`t>(Uldwxb*;<0<{Q*YM zq;bm=gfjN(?y=WauhcpgrCLY)AuN0=l`U&mS&UW4SG=Yvd+?(V+#Y(LW;}ps zNq4Eu5VToBQ9!NC5SQ-H6I`o$D+%1MJE1wDW8$o)qG!hDu05h=l&gr{scXdNX_(LT zPW6tV{>B52Mp8VD`c`+FJwj^Ewktt12#lhyf z!3+9V*ND4dJ|*Fc-=(*Gv&Xj(IJgd#(x?rs$O~MlLasO!nkjp7St2*6#ddvG3)Q9# zjFk6etx-uvE3upa`U(e$xrD^|4NTBVhdB+HP-LZCJLOapZVM>`PPejmLgp~s$+Usf zcdbn!8)1O0`Fb}~$Dskr4+ zZbgVuM7+RR&^-+6z5?D$%n;q_?fwEjo)H#0SVx>e%|Hf;l^(&`L!HWvB1>evHCLNx z`>^t2*Ijvk_Pyx7E8C9w(dD`nH+EC(@SSWa;s^*S=t~#YKS|>@%#Hjym_k3LFx%JP zNIRHRd>6vkqm|t=$%-bQTVelj_iVWOt?$0I+E|R2t`-Rq#d%;kERycco=uPmWeKR| zxxvjyyB__R_;|c~Z;w!rZe<#soWslrLq@A%f)(gNvw@!2baHV+3LCZKU*I4N9K=n|+34CT7((vfYB>x}(Cz?kz1^ zU2#6K@4gvYeQCY46?;f)7RwVMhGI)Ro}${WqDo=Kr=lV&8+Rk{PBpPzmtenPY|+oT zI8`KONFuf(V5*ceL*V4lUr)|tP^yv!JPgZfvTtpW-srUc zr?iNYo5-LoeBes0wyOC(m%|lub)+%L1ACH~L@CADE#4m?6EPMJ5sSFlZ#LuOr6XwC zax$5IO>kGbKon~T>}uIgZNQrZz6=T@qzQmaUcM8JTPy1c4t2AdzgH>zj$ebBav#o6fS#&|`#kyNj9znOcKzc3pG8lqA zDML?JyzL>XH;0@SB;>GU&A4@A&Z{#lPeMtxqYJ}?mRq?%oSF;I^<^k~nZLk1?B>Xy z{Ib=z#}u4*_RA+1mH2pu;S~@i$8e#FPswf>h!%zFPY+_#2S73o^iueJ>#M<=i0iY; z_nTeGS15Q+&`-zQE)-{>efBVD8P|D5OOo>QEJ=P!Ke;A|SWuGwI&QS)}#lRaR zPU`01r|T8aku%D)+Og$K_aEA!sP&N;r0EKGoUOsUN^-M<7KLxmYa_FsU~9~}D45O( z)aY}fdsf?(U@}mjG^o%kJ{E*-o7xX9H6M#a-8=A5{XRGSEmd(}hAg|g(MW#k8>)L5 zV=p^4voxB(%}KI>ui+syk?Wb>Lc(x{OSDv~R)O9L{L{c|?;K7&?{K9h8SWE<$l7P( z9G<5$q02$yo-Q+#I0qA%(-oqKk?o)q$w{u~N^6XML}|R~cogHCx)7(e)a@aHT@OI< ziU5>5;X6QN55V~5{Ay;zOQhRat&0ZUw8T-rB7`Q9AlYSSXnFpM7pZs4 z#(9y1YGcf*SvoRQgY#x_xqNL*Zz)+q=QB!#ty*cP8-F-sEYyjK$jgBPaPB=%w1?U| zeo8=3(Z9p#zdPstTX6cX8YSp|#_7Kp`LF3R^FK|O|7r;Pzs-S6f3;El2RN;^{#A&8 zkYfkN5OpG}f33L(^=j?aCs4oUHr zYk^>n=xM(K>;>w*)=U}W-Twahdj&Z{kS73D8-Yg9Q{D5Ag~E5;H?HO2>D`m}_mlHU zs2>>Xml5Id#6vSolcp&|Sb};J-uw<-BH7hEiP5ihm@i+0n)fbco^=k0NIJNqN2iJC zUO`(rE7EV`Nk+g)zoYUd)xb$1GD;< zHA~#(_>P;AwxhtwJrw*moTK(B&?U&W^jzrXo8!maZna2uZAtJ_{Io3_*;D3%zY+3I zw@YyVuXdYG#%7aQfNOgdW&yQ`yX(@jap8r>eJ=%-@!jzuj)q{{wdDPZUN7BsI{9-e zr|GV8E4G?6U5jDl0lk9qjTCv6=t!fZskBntJLrJn(Z&(a5K`@xKfy)1TL>{d+AC$e z@Ak_mHsbwQie9+Cf*OmdpSGVASwbwEj5cr8tlqm>9H09zcSzNalNF82(ft`XT;e1*TF= znezopt)pXU+h@ZDx`&+FxTkhjQIj9al+Q`T8S~{!joOpSj4dKN-4A9q3x19)uX*r# zwh0utRb~SVPEs(kXv#x_X}dE~-3!R)pTxDUnoq zIT5F8=s}nFU}=qJrKaXjDrN#Ln*`cU?D5T9@r_GS+5cVE?%6kyo|}?QF_J zX$ONO`auyIRz}(6e+2!aTfxpZ>Ej0<+xHx8q~H|6x-@R;gWSyw)MXw$r5ttU;Lj2a z?EC2!E58#n59AMi^PP>Z&-xQZvSOPrTaZthUlcoY*4(JSZC%#s$J&qOnN?}cq#vxL zjCf1g?bVp-2Vul!KRxnF^465pkImD5ujBV-K;`x z(21@vS*Z1day`voOp(m^!CNW{9VxcH@QbgI(BYO0cr9+F21Q%4{R-5jX4(`IBY30% zZmaeQE~U=!yXfu|`ZTJJ)Kx}fERX+dl0`%>lPJ4)Sgx;(@zbV7IhZKdI#$<8tEZx+ zF*DttMSH_$-7j*Ac+zu>Fu=dT?(|pjY|C)Z+W6|s7)_bCP4=r*kjdn$BviBt`SJiN zz{2dyW$3+12{qFxv0YR(SF-YtCR*zU+yc?z27zYK%Zb9G z7i|0nm|fqJaO}{2$I+N@0jx@a1g_CUg%L_L|M(`aV9-`-8ijcYOr{83Br&l>jE*9P zQcWtMaXK7Gr&VqA5P z;$`(-p?dqH@bTp8pV$BMy#a+yvXCT$mEST!=Iws|V(#%q^_+p(%BLu+Nquu=UvLwy zC(B{sVDIT{4@VqIF68&HOCQWln!~K(NA`wWh7{X161A-22~WRWqYPpUPy##mo7JWx z{~@+45QEILf}jhw8^9ztG~5pyQ=w}+z-Plr(>KorR~P4j@_|(yLV>1s-VFl2&!_&@ zPMqFqLX(N^@Bl;L?GYOcR}t66p%36_?YWCBPD|URs9{)Bc=i3>{(imW%^F z#z12jpY84eoi6_UO(+}2C7VM!68+F9Cb3&DdPC61R2uvb!Q?_o7h_5DejgI2G95bt~2I{1mTs5@sBscQ2|IPM01_7%?j)=uA<{L?LjeM^<| zW<42SO&tDa-7s%9k!3aBOE21uXt5#(TBq|73 z!Z(BBlvf%nFCsyr2RfLCHG>D;T5F?xvUH}pe*B0o{{*J{r2+Ui{QFm7?0?Z{_HV_v z|H8k2_fdYe-m?F%ocvcK?*GHTe~Hom3IC4UuQnoeomO|VW!cV*zyKi;AEn}CDX>bJ ztSt6l+#wwD#>Vt>hbfAU;J=@4g5-$$5LDvq;sj{v^3*<2cfZvWK=yS>Joka_*y80o ze91k#$S87q!MNdiv^g*a__5vjFy}Gj`Xw<8gFbj7R|b_}Zs8y53Ev~QsX9FZnK63_ z9-F%vM-t0c2T1#xtbilBNI&UTsH!f}ti6pxbRC-Tx_0E=)C6<1&k7C24q9BtiSTKrjpLQAi0ReD@!W7V-itoT73mCqJL9<70j-cLKf z;*7jbTC7}h_dO%R1t?ZWoCgGrFA&TYhX9E_+JLHI4y2NgMb{VoSPaG(CQdN-@U$Ut zr|lONH(uV=o6nRjnH_n4Qeo5|DpQp72ZLZ5&nctIV1z@?x+mI}1@nQ5dd9lV>*$Th zj-$8U6*~5v-45F4?&g<)wUKxQu*5{5gwxDz%;eypRoCu)roo_`GUR0Xrk z_?jF#5krYQ$VmQ#{Z(pk`(QFJ$M;;aM_#~{Ad5Sw#Shd0bv@;ZKQhjTTaamq8tP+U9X2~3ZtrtSlXOo=#d{M)AFfx`Rl_gxS zrW`(4qh1N?uAzsen4IHl`}@X@vHl5UtvTg-8zh77;6W_&Opx+q5IY5bk>=ZzMMCqp z$}oy|{FRVKzWH3s8%cuW!Jpm;B}`OPAq|1?DLOm`W3?%9a@PWHt{ zbKdome>AwPoqicuPUQzFy z>;9Dvjuo~=+P?=Cd-WiNutbO;@1ueriwmTt(C3jhGmC2+LbnPY`u3oLPVZmJ-Cx+) z;IeEFqE~#Hk|0hqY)XNN?jERHV~f87a~6Qii?tv^+DI)ob57>nzmRy`0c&Hfv4|l! z1#u@Kp_hmN`IluLg)*56&MLTaz(8E&BAyCN$7Au%%O;HH;w6yyM*<(BbV%X-Og~5G2h%nkQ{AHdAj@#K){U#Oi@kJ$|J&97h*0&<{lzq*-N{^w;@5qDS{BCs%s_CKl2%_CL9RkrIF+SIE<&G8X+j~i@QB}VkNn8&p6at*rX^LB^(JY`W; zvfZ^g@0d*gam>O4X4=Ct`$PpLseI@kNs$d%RKOCuXLBvN8Poh-dI_YCoc;NlPN))Y zm{Ydm0CjWAIhCiW;`pn&ksGDe)v;_LC|2*c=3?+r<~uwYwh`={9NG_?m~N+$4zr>< zT-oSg#6jQ9^^(h9=&64is>1TzID@(!6fNI5W1__v5ytfzMpqjp*cs&~#*R=4J5HdK z#DkR9-I)`W+d6*VvQ&@wnnrDIe*9rjg5A{to73Z(S`@35fEk8&yr~h3`(=L%rE7Ay zk9Tr){1It!34F_6uxa6@szS{xJUjbKmTO@kAE2e17GldY)?b8{hv~4132o@i9o1I0 z7(ju+H8(tG&@j&hhF-H1Gyb%|t^Drd0w!HbZ;=Z9aBmDrLmR;ADhHWkQ|pnTiVg;C zW91F0$VCK66n#9PJW2ng%)^*ao~1ucik&ex@@{I5>z#K$@r*GzePu@Hk+JJtUp<)F zUAulwjV-Le@}#BG$iO~)J6a-5$?=o&G1 z?dxuiVa_Qan`oLSl|vY8?t9kYwd9$9ntp8!MK(2#A+UInMt^{#GgJ8HcO}x{>I~k6 zH}{abnuh7?B{K$*q(V#ytk?PJVSmfv7Chk}3hx-fF9NuUC;m=d``Gn%cnd+DEakav zz>Ql7Kxpr1iTC>`$f06%RUz1oHsv{*nofPWayt+YvOw9HOI~?hJWi7KC^EX~2rt$S zU9k$9_$Vod)dc!UC9wXD0Q@N}XYp29NAnqUP?LT<} z{*pld6Nvj?5z_{itz(cu%oAcr0GrJcTJr+wG8bML?+=o*N~H3N_(}!r8oqZQd}sk# zrMtDQPYPp3G=6a3w(N(w5JHf5)0+ws06SRp}alj1SfFo=_-3M@#Ts$j#T?8Gb^M+ zLBkV>pbs_LICy0Z`BW4N+IWAsJ=D46$!p`dn=-MCzVTehE2~Hyv+RS}MqNaw3B)Y$ zD%*j2N8s3Dx(~6z4wCQWPU^K@Q1UNxa;M5x-Cw#=phczGRa^n0*UPu00Dj;0dVd*~ z^EW{F&MawJ0%jjb1hReooQbsDn{E&YRG*KafEmp8XMglp@X@>ATq}27vBb3Go0yAm z6EkQ-x16YF2pHK@>?vCB4RWFt4^WHg3)f0=8`lcwV}-pl62y04dGoEtm~vtMR529N z`jlYmcaO5^(u+|u$?7_R#Tw(+i`c;I9YIjnvQJ*vr(Y z)XFWe*slZ`ADFV2m<~!Tj?Pbrz}5ch;r)4i@vHk&No@qcST3{m$DWb!+C&yDg}6#u z9L;YUZhUgxefqc0SOJo3nhReT;R<(bt4%55Nv^l2fn_3Yv{8ougwyX8lRu?tZ>PGG zEf~4{a*(!1ed8EU6yV-xYLQ-oO-xsiZiz~XKLZ-1XU7*1=K7>rYzJ{P`O=PlIV~wx zxL97DnDmut3OD8G)MV{*QF4yIEd7B1a+@A(VN$81>`IM^0IP4bRBwU{IwqD(k5?tQ z?!f49vyx65Dr6S}syL_+3zT4-Aj!CiJ$aNwX60A0Jc&HOuV>-lMNpTyU3jgVOXG8*{R_h?;VblX|K0&6Jw)7MaDd0Um3rV1` zh7df#C3f^nU>wZGlid?_;hNuzq zf)S_3hZA%*x9ZPvQeR8uT-qwq-(*k_=&S#>Hk)H~qQM9r>~=781mAE)(g*FKY~ zfs}BK-)X$;ddhf1@J!}%oi!s;=G+!h#w?>ej)>5ASTxP}*Odai?6_e*UEI$}ry?~y zOE|!}ZnA@S6U(!v0`L9US|6ImEIB-mNDOSm-gIZ2*z$n?gxy{v9N9%mH|noeey8{8 zwB=^u*XWS6}&?MCC#^C3{1^zDR36>T z1tD-}W4qcj^|PILqbzTSJIRmDFBqnW4Rex(mgwnWMW#uEDM4C=cK_1dYqsREgG^=A zi+>FNX-fnhT&~LM`4f1Cd32umO-*L&90f^$8NI9}`X|`Fye%YXC$nrOf%wcE#57-U zCwe4TEpeUH?Kna3hOJ>n=5F^*#^lZYlx*Ut51ov*I>8O^PN#a4ssUnAOlEcLA z65r=14ZM_`)hK71qccGSsov>m5n3ku0WD@p&19cyXHGwzHC%d~@c?h~Jzbm^D)I(8 zgmQu!&kd6q--YV9dI}z_WtIs{=~IZUT;r8pJS}Yx+oc2|8sAyHmGI^n_Znn3=tflc z6N{f!(c@2O&iOcu6Z#BwtWsLKgZxw;kkTQ9_bJr7D1?$&MHrB#ny>Aa~SyDTdgB(adyR! zSz!Jh(~U{E3yr{$_pb<453#!EL*ixKnmAXK@4AZn6jJTf&%>o_+Bw!Vo(fref_Dyo20;Ld>_!lZ zO^24iFC?ibM^7`mK0ebM;%(ExT1zL{VW#{|lfk>};=bwkA2@}+xI{yKFxN6#%zgt6 z6^t)t9}tC~z&%btss9e|{_cnTZ^6623J3pnM*Vkl=hw!pf7BKJwUz4s*65i3TIuxv zk9X(l|BH8`-`U9ZgYr6I_i|0swc!@?_%u;|BYmqYSf6)PktepqJ*@7+^b##7xqq=6 z?t!nxPr`vU@nXcW6E4`O=Iq`2#PN>n&KHY|^XPJ`KEexSza|ob#)NelN|9;zxrsRo zm4Y6I17N^bXZ0$fP*WTu9l85ufDDd}H=qFCU`9T4k zGN<@aOEJ7ydpL)iE6Fq)7P*xQ&`nq)*4VnvY8FQxL~w}!(+)yW(W;Rs>4HmG%;mYU z^cU+ZoB6ru$iwvm0^>2+RUF?OC8-2U<1#xOtYXIEb|ST}V7nX|9jxIx^F0v#Y)rlL zNJSZ`niLaRoz*Wt1j*Im-`A4(WBgchXu{2f?(*B0p3C>d5UGn=%n4)_C!+RR(ek`{ zGArwP_S(Leo1AaC9COcT$NMp}tkGAtT?2?d7`0^Dan|)ts)F0DI48m|qr6}d{L^#oZjp-*ae`lNwjvI!UmMam|F;=NTB20Bn;GE?b(K8T6 zZmUJ_pZiXP0V}oSs0fRE+@2E;ojisZ$***h^*wH7FPF%fh*q=&U8Z#MsB8`bT7mIC z^LEuf8>Mn4n@C!zjj?s$Scoah6ny4K5)r}$@dn=ye8|n5OBC#suUDI}i-!TWmbYSz zY?YpHVn{EQw*3q>TM3zB07LQMP!)3MPJj%i1c^xvJHPQkd1fOl7Pv22V9{bg;6?}_ zYy$lF^y?Yw65b^h+WkauK4|x{J9;mgEr0$vVvKfEeHL_vXB^2!Bz$I5gLpTHmGzAQtNs2xy|CRqm{XhF8R*EWESg=YA8c2-J-JI4$` zuv8bEfCDdTD5IFX>*`2B|U93NNQ< zc7d;WWBz_)6vp~YkbTwUGy2_Pui3$YCr6>NG3%0+IU z=8)8B4ZuN3X2Ipj>mvdROhRi`67*;!XC%OmH@ohX2NuhR8BWN#BPjl2@V%rv&xNoB-LS z9#3*Ktf&#D^du6S5)tB3&@?WFSP737B3nYhV_Q~Lc( zdflpIT9D-;4$JCS$EW`0MOizRF#krPPjLz;*6ZRbMK-bJT*T0ZlzoarM5PvEb5y8* zszF)<8>u2m9Y0#-vXZ2-jI{w9DQQV z1sXdzn=ZOM{v`V-C{6;UowmM}RNpfX(**;vhn#+!`~d~G?W9`Xr-g1}yvQ6?(whEz ziivjBmW0m|W5p<{;lAJeuaoSd1?pa6Rh+Z*_4s7yA(*@*Cb64dBLKa_nt!Q37fEW* zZjN=Rmq^AS?wDr%&-65{=2-CGKolX;sy$CEjNWET(+<4*M05BRnO2@zf&vuTjjt zN8}MY-=Dt>h9nSvvR1A~TBRrBOIjKHa1C>sKULmLa!ovUK&J&2{*bGp6K@#z^!j-U zGtQmgY7XRo)>`21^C!+R5VS?dhp~{3waEaj!Q+QBbA@1YJoz`NN$~lAL#g8QRI5GM zv$%aG(KX5vr}|E*cB4>vHtxAcE|=}QYN1%+mxjX3mPUi9KNgn~u^^CV@9Y-uZ7@t@ z58h=&XQIBl#oX-;`jKcP3ckoY+B#89A>(=}jrXhkELS<2`Y_6_Na=*%!+BD|piqiU zjU&Xu=!)>${0X;CjOnr+4A+?H3awg{O(4KO61qYI{+daE>OJKyEtZ<&%vZJSur{c?ViC#TUE2feylDb zR!I{Al*^{OY{PFo&2D6TgG zkR(o^L{KNGS?v&D%;%-BlT&|=F#r~b2OxiF0rW_BiL$?$iKe>`1x~=<@B?-X#QA94 zVsXv&`+}%Lby;-Ps=(0gs8_Qex+&8%F48NbOv>g8S^S!uDIKF|UTY1~=V@uiJ2K1A zrmnvSX_xSisQ!>Zk%*$Uv$D0=VT+pt4`-UT?{-(nDMIc9x}S=xcXm_4d1l&a>(?cH z3Z$ z*RUN{RZt6s#%ahOZFF$G+EpK*G-kYm{|3bW+LroXG%Wwy*4Ka5S^uKzzjRg>hJS4A z{A(TT{{!Ox;p&QWtyAl-Dx%M#o{2_pIoo;bCh(nHY)K zW5^^+-SCwly&w8|X8GTasjvqsBJKG0QQxM&q}Dv|%mPyIm)qe}R)Ttd@IP%F^xz39 zWmPiTn=|3l5>t$&bafsbB^qU111}I+&BXz5h#05QqMt=o>z&oSk}b1Wl<<-h zpm5GX>oYG?KU@5|;5C&)Q`cEx@Jav1eWnb|qB9mr7^*jN^*= zQ|$w|1IEdtimVPLj)d8BAz$1jc6v4^Bq>w)j9w`cri=wzjmYd;_(-kwgvr5j168H@ag%P+3yNj?(`!h1 zyCyzs_5`io1i_%kYgKf%7yB`Q%*Ct!s@7zwqA5x=NUjxT8rj8%E^&I-t{kBWf28L3 z5P`}C>gzg9RBz%6)8s>X<&SKZMLG2#SEQ=E9L2<|4+^QBC)sqZ7zi;)XOzjLvQiBp z7o7mgwHR9Y%HmADpD?B?R~7Ya6Bl_7{=JWUb>V&XC^&Drb2Eg*9 z3!$sbnzoj@a_?QuiG~Z@0>zxRcs@cnySt9QR|;*zU5%?=xo}%sL%o)XH`!&`%OBz4 z%py3)?u|0;IxyF30npyFH)WfwPWJh#W7G7QMbD`YHR}3k0qCg6umw?ec)VL(_V{f0 zi)kOJuC&06Y*sQgW#iK;TFhPC?5TEm8)>J_Q#2>_tWeR5DP?c9dYSZfvpQpaE6XAY zgBsUwJuK8@ol^xRwM+U!{HK*%+BPkEap(gLrem?_P{~Kd6a(%*4c*b`Er#+P6Sf7B z_N=kR9ddrNIm@+JmgKZ(1`1);V#JcK66NoUlenZRm6@UC6az#r)tzq-uF zG?l%Sqc8Gky}u9eWM^hR8ftej|1goE{d_=X=cqgY1ohY>6%Sx2E*ceKpvK6iC9U#0{*YDY zN0Zxcb@fjxV3xe}bD6|KtY;agt@l7KmXjwSwh~+*V1PZcGcKP~mM~&49|1!pt;peY!1B>yiPod=NA0s&q~;f> zg+N&~{F=3+4g@;4SEE*^^q@v3Yb{r;n1-+ijV~&gR3E<_*7WCYMQMYZqb}Gdx-!N8 zRMkn$SgECcE<3LRjBCZtGP$x?32>La_3c8{2{CVhvuB1H0&51YRCsiHvXE=i{vSNlnosXH!KE0!Y<+~Al?-NZqL9(12i z;$(n^Dq+C`)U!DJZEQulus|wI3UdpRQlC!>;QY0vua`#)B?)?kH zR7eHP){sf1W-53Kv{BZnZ&pLS`j z9h7Eg%Lry38Wz&+vdWbsRrtQdrdQIq;iCK&3x+reci;2kCTiZOR6l@$$|mn`>7T+Q z0-=G(8)^^PEv}s%LO@oyCiU`au?JX*T@;7?cFybjom zndA-Q^KM%JGjV_{Xyu!2RaM$&7OwRx09M7_4FIQ{e=G0Qw-_8Cw!H?!^ZpF?LX`XS z_{xW439cVXm212-R&yLUK0u_8@eU9$1ZI*uJ3@`^m78V)Jp%@I8U`A4x{}hl*sL!{ zgFQb%^kPQpx&fl@^1PO!rQVTc-gC%>)ccH`qKZW#-xt* zTh`JkRbDiqx8R_Jvor3>34GexReDAqESfKB2{2S_ zKM~7I7gNQ%TboLW=bbsXS&0b>m;4@7(KDtAV@|-OPW6=<7BRT;?l=aaETc*fqO%P? zFTmoc&`qeMkR{-uQ++bYU!Jv605>(Oyz^}NCc=}&`63IE3PO{*>m@s;K}(?gXK{QL zzpw=~MGf)XGHlz=^BnA(l_j6PG6AAzp9x^q^%e$kr)k!n!#7hJ7K}7Sq2Ul(BXzsv zyA3lDX_(BOB`s_ujY84@iNa7nlMVg!U%gcVAJ?c4P?-n2j2ULQ188d&p3QzpZXxHC z`0+i^r;7kq4X-OTy07jmlVIoNh56$hFnUkP<>#G~ddk|~mHp+P@NxWlwV+MGkIP;* zRIbWbi==&EIhHUT%h`fM#|<%y{NOs(e;x4 zX|BYFnI>`$h!0i7pA|I6-_JslhR;sRfeRtfoSPi^70(=$87ZF4uDd3S!s}?k?i>~# zEwJ5h(+NKU`Jw|5FtG&eFxh5QxnjhMu@313u^#JLS53bN^N<$ z^?-S%;@v{{igARANBPX-m~ftJ`|+n|*-gP_XpW`sJ~wVvtO9s&>mSDxFDRzFC5uRZ z(cf6edmt8ww4H8kzU@+1IBW5PR7=A1*0yPqcNvsuIz-?aEgEfs8>y*VORr;*rQxM8 zP9WHha~$}bag2IN=GF3@19i`Ru(@n z=~^8hn{Zi$q|yU|m|camI~^rr$H_Ud7x;@uQb|4DW+f6Hn4y{L1a^ zVo0+{%n87t>>zs;fBJS$y3QH5& z--cx0w-}ly--D#$*zai>ltoqTN6q~DqTPNM&Q<<+tdCAz_1C`9Rh=?1L-Ov7N}WcnA~;BUd?Z(9iK zU#i1@pc`b4+pKe-ggp5`^_>ubS_T(hLer;PaGwAKTExK=3(N*vjyEfeJCL@@Zuz(+ zifW=$mmxDUVCRy>QrzO45kEvGeHaA+koY3M?rM%)^WabH&B7aq_YC$p1&xM;1Y1MM z`q2Qd6M(5E!YCv4?`lMt?ro9b;G2ud~rl)e7!z=(^Q1SZ5a=B|wBuMCUS5W(ijhP;G}Ql~Yn zP$e&}2lgx?ae#TsH8HfjFB%NiU0mkb1=rY~=|UZp`2DaHT+|8vi0Z_mLp#(~Wu>Bx zcbYHBtM|Ha3Rnp$j4d|!+a7)xw$JMK3K}MD^I+)suq zV2955U6zGM2y~V1e3pfvRx`OXo`=#|#96Ge>rPmxB?2F0D%M!GLKk#{CYJRb#VQNc zO8%?ZQBvAWtvYaMnjBjm>R)GxpjJR3zFGQ#o-##8QU24qO)JWxwO&zpuN1VLPfjH_ zA;Z>(1W75alFCRG$jdA>^^b8f?#V?wl8D zKvazq_C?!xeQAF=q30zFU&*EAoI*MjY8i%8jFiiZ>cTAmIZM+2e;UpzfUC{;)or;k)>R)UmrL77FNDScV0BX>jXt{R8}KJYDZ->k7frj)jAEM`rkr0G=*(`(sZBZL-wVQ`k0> z?Y?&RwF{i?sJGCi*#a{gQWD>-__r%qYJ+N=sX@%uwf$iUMP1dLys3r}FToN%d&7eb z-Yu-;!OTOwbvn&FK?+Tz!_Xfhz7YYOAxRJTuByboUlK>V*w-=Uoy23(vJs89O1P|=?gqnzp}nA~^25n!%j)+s zp%A|1Gjk*<^^#qC^zq?5y=}wH;Kbe1jkDqy4+{KGMf>P4M_po)qDf$+WRXX_DMu_E zSea;c#YSC6Vz=Tf8R-b8(MpSw$m!7+K|;WQ&4aDeGr_w|sWfAa#$JUOJlvOAu;`E_q za4WKDcjyyVN>{q-H#mXvW6&0hDo%Jy=xt}WR4Y~P-UG1R8ZL=2GB%PgJn_sG*UwsO zOs|+W0&Xp`{WRzAoG@0@tn2JYCsPS4B6?T{-ihzCz8X1I#Xd{0N>2)n50DQV8_%Hj6|?Aq zUfNWWBQA>Pf>rXgE+JF8ScBuOsTCd$OZ@QA+JjrDiWoo*unk}=iyo9PG;*9rv zUbi+Jq+L@<-7d_Wu}uh$^5@&GA?z1H^S;0GeNHH7{C5NRpQgqCmI3@%a^e3T!2fh$ zGO}|1?aO5QM=aC-tQ*3}U9B?bR>H0&FU%&uo2p z4$KQzDJ+;f@o2n{P+}k<5l1HVxM^!U!&{>fYu+HtZV_eU_En}19W1qrdwr^5l47I; z@J_Hm6$k*1@zI3Y=Hf~PzQtx5s#zF-fJzy2i-Ry6tmWgm!%M|#_4uHnxOIOr!w(JDop*)?zivB`-L==^gf z5VxVGwxDROz^?YkyboXvrr|Y=xqN@SjqND$h500yJcb?TjFn!4=}GDa3Zflyp&;6c z-^WyFphh@zg(6JyFe{@&nm$i6IWvugQAo)a)O&QQ%R@z%*+a9EK4{>hi!s;-fI+e9 zIz!3)X{tMLOg+bXa~sRRt)mJbou;(me}{)a>jmud(T=B+Pa*^9c~ z^hT;A&%@1jW7#hsQwz0KHKM4_{S~Vxw|pv%e6z`^3}Cw^ad(W; z8cla`MR;8GlF=D(T|6F{G1v%wJ43HkTI{k%GP#ahgpD2KbBBDe*r;fi+j} z4?iWccQ%xn9RfM7#)mpBT@j8 zUV)6sfQ#5@G!lxoi;SpC`wI5Sb5PR8h||8UuWcE~$v)BOD+RDoLZPIz8b>m`pV|ty zJ+1pvn@1wUl-q4mC&>qP?Ce9eN@_P1OeB+E$dr^3UAtZ6&Ta!`-PK!2R|V!0FFPxA zHS%7)scONIgSnb$-)Nj(2qm?eInBTwwHK6{Id&GP{t7u28)Id8a^TVM4v!h;L} zCN3Xt6uy}-6pbhF=x29pz#|*HefAJS2Sz5YDMLiw+O7=ST^#BO9@aqxM7?U5m{KFy zE{2)ZN*(nm94`0rpLo3W@_mXB4Ea~*3QAZsR?22~WBNXfDnxj=lMcvVebhaU((n9X z$~2OFqLb;ob3B3PlS>jdpSBpy3Y^i3WAC{jQ&+;NY z_3g?w9>KR@@w-*+a+UUiKyv*Kql|BZbvF8+0`@j|`Jb3hv@RW7{d0bQ<*RJm9PLFiAf+zL?~S!F zw#>3SG6HV~KbInzUfw3EXa5{(bqf*xRr5>^hR&^5cB_cEM>ILu`!wc7u?-lE@#?G# zF)Zb#Ersi=64xHH!H2dr_IQ$bFEx|M^+EGi@Ke#}obC9yw3ydq6js?tX^N%1?$E z6Bz~~SQ!gA_odq_N|PX9m%9@ino}-CEk-~ z&7K=-v^=~$*nO`V>Mb=((ING%IDj*N!P*)(S5Fjcs}Ko6#w_DZ+lAbHfY4Y-h_Ub5)| zp8`D+jF2n7XT%=%sFUgktIB9lPjp%u#?)wCzkS3mAqCBdV5dx>l@omTX;e=%W#|xn z5vz`Tu;PM!CYh+wRfc=hTcubV4O3?r1MZ( zM0tim0IxZ~oS2n0Y4S%O5d^xms5!Xw2XBH^Y~9LN7Z0hDdId6jB|$y@1XX+`)vZyT z+e<7e5ZoK@u`dvMF9AfaNBgVr4dOK;LAIeHcv~759N)KRD2KD;HQQ= zrZ=#U-h~?6v-`sh@;EYZXmYzACvb9PIbY=#W?LBy4KMizj$P;L`r%m(zoH+GU8_Yp zM*B>GE=C9o2p|c^0Y8SeP4BRo?e-T8n?*_z!P?+X@^OH=#Y^k^F7og9x3j&u`V0;@ zm?P6i?!5fk#Pd+JIKwrdd9L6{hs~2{mv} zxHrXST`_e{AcO#jfSi?FBcm#bB~_19zZOMA>qIKb^gQxHBk)(4cnAXtg&mGcLwFR( z6^u3gWW=8*+0Zfdp@=HYi1VQy`7vx|=~4Dc2&*c`ZXJ`xi{-0aiK}dGCo)o9+^@^WT90p&Za1X>{;--xzy!wrtMPQGc?MVd$?4$&8b_P#eTO{Gf<;MdlhVJ(WfD$@G3Yb$8$cL|4 z9qFW3^iusDUf~c%9=9gCO|yXm$Aw^6Demal_8LQW8+Zww6}`HiT+LA+n_Gd6Vr_=Z zs7H)~6^7-vj6zD|_G|A=-9*lnwz(7O2VkfE9N}g_iRRuZr9ne@J=5uv02Ra!fd;=L z2)zR0l3#s8a78dNkcFT>c3cC^ryp=!u zGS#}yHv8r;&aMI#YX+Qxq@6-Hq-=fZdVEpD-t7Hp0r%Mec^Z6JHSb|n27m?ACf`od zQecBLNo9xJkpO-HQ=yscFO82Q7ifq&H$$q=s8krn=XzM|eMh%ZTa4iOlv8!1St}3y za6@U_IhXL-6$e>iZ_(nx&O~$8ZrZWvowvU{9b8py!;Wn-g(}~jteSyql!I-*MmUn` zl#6U#dfb9xd?G9xFh$J+3E9Dn?ZuL^wLFc5$(hOhLN&4Qa{C#HPA#ZHBETVIuh$su zkXQ3NN3yTBiuuOi1bO&IH5ft=9SD!>mbzq8heJ~@cJo~dw@8LI6hCZ^>^{ooo`d;PPWxr<->gAd;0Z&E>}1fSD_1_C>3MamBH6th2&vmC;h-bG5T;M zdJOV98SVIyvL4(uVSUZqJDje!JUJs^rDXtwl&ZM|7LtP2_A!T|S5T*iUV%~!W0p5A zTkkYr1Mz|PX{_Up8S!R9-9_47P)S3PX^I}rB8 zS-nLW3!i4PX7F|{$O$SjFqkobkp2(iT9T=0zl~bJ59`Nn#?V0C*f&A&8^~N2jtzH@ zomKC6HOV~6Isi2bcc&iZ*55gZCe!Eg*jZxP_Sv5?w^_^wohEBry!JuSsUWPEa}K= zEZH{qdn#?4$D+v#gKVN*7b@-3HZ|u!+@*;%u3SYEXs8Q!0ftFlMTtW2e#4rx}q$hTs(gwn8~(%i<> z=*cW!aHULb#^{@qRr_b7>B~ajn+ca@rwE=o(-aef!e#V$Sx&uDF&CUYO0a&+C6~d( z%CX$4>`n@({TO$`))^NNn@b4~HrdjTep7Qy-xN@+fK^6R{quZ@hOJM~T?Npf89UQX z(Jnjoi4f>UC$e{$f@v5B(01$WhiQlqDq%4N1NpQ#odLrnKS~tCqS@}?7NHsBE|U3ErxNAS992Y%e9W74 zWLC;7jpKD|*(6AM;$!^Yk-7SS^k-5^q^zzQWknoUD%CCN!sPx$Oc&WLtz#A+-DQu& zYFkSm3ze4X{Lt*tRnpQ$kxJU%>lL@1TY0G!MICM@t{TG5rx&3gF$Id3Y*tf9T zcnY$cNHb*KZhmzed}pb}&))sM62pG5(y>lU)|v9J&&tlMxXRzx7BcGFvDo#R`kC(T zT(IY65Abc|Q`UtG8?;!SoBPksOdcKE`PV)0Tr|`iDb?DG#Bk8qdtnEDsynS1@q#Bf zzl?+KNRtdn?4z5l^q$b0?I54T(AtZf1^df~y#G4)oPqR0<8X6}5QY{;1F8Qb^2U!h z!T>)Y)F_o%dU01T^D-{j?|Sn?EP3ly!g*!(3ohP}tr7T7Eoj2JM_8Du#%fI9{hjcb zcKERp+a7$kz=3^&9ZIa5`ztHANcIj`zv4BvwZi2YXF1Gmfl7gil_ zapV_4SO2M@KNnK!nX_awi?9*R4dElzh)}Quu(_5INND9UH;J(o`(EnaD`pmhHAN}5 zmkE2STK9$(a7SovlSsPq;rabnaOev(r7sTK%EQXcqO&`yw8-kv3)yg%x41<48aQoZ zsbLWb!-wfJHHfUVu@tC9HMWcR1=+~QkJeRh?`+5=%U<0`JmZtn013{>o0uxUD%+>A z!=ZuqYQ^Bf_zqHs$*c_errpjDP%FC0##rQ{v@^IUClgLNE+QN|Q#hPOdZ84dAZ<&` zKU#|~4-H~TsuQ?cC$Bu<0SJx$w37Ysf1s~6Wi0Y)Ie*gZT3#@N z+qY#y7nwv-BnObYDwr&K>rTDoU$fOPOWvnvH;c$WJUyDoBeR`!FYQX~OC&Pi4=?{L zx2d@<{O!h$M7XP;GEO>Zpy-5cg2InC=JbFodjP(v&b7{Y8UHUsUQm(PNhpX#6cXB} z`1v$jj%NZRHWrO%5=mYjGK1Mim_GK72-CNvu6x|w9zw|3m{l19R!oho6fKh% zcj`Vv<}uGbff5q3Hzef>*@Nk}wBi_6*|SBS*E^R4rRgGLm?i-kbu<=iG>_k)MLrs? zi}}<&4%El&kWX@tgI-oQ(+s)!_L2QG1|0_yJ23ADbc5ZZd?yE^W>?Iv(^*9-t={i_ zHR{`M*8H=sU$)x-FM#+Uzp|p zfSZ3NJTP&x{cX!-`&(c57jW|zN&g?{+}h{1-<1eom)!v^6#6B#?kEp%bodD?qc7Ex zbajFG5&=S6haQW6q&yRFaun}B zdg|;Dg3Q~vo^@_$50s5PBMy=ND5N4_Yr+-NY2|T^i%R>%+6z9QzL$*xbqe_MOTa;R zxL@xgk4zx=zuCY`$RFmHM+UZpSW5v^hZ^GxE`v|g!TWga5=G{YyDttb^k$z28=Qnt z^svFcz>B6*-|wEZxYEz^=+@(W+tRW;;JBjire6x=Pi|8K8^+VO*$6o>(${T+!~5iI z$ajXGyk$tTEk)^?7#}uGTm3l-3iqI)t-d1>SVGVjz04Elda%T~zU_z}(ppnU^UG`y z;6~c~pI&kGmEZ6NA;L}pIQQJTZ%x0$bG;Ah(8azaIO*9$6J=dZ0KzFYlquwBh&M?( z6M}Ph29oyb2O)v>DFjR0c{o*i;dkbyROtP2kd2FsT9wyN)e@o~fqIFJJb&0(fGg%x z@Q_`~yG+7q5Ul&x)x!PTtuG?xw}DJRu~n7_MH*D4{y$(bnHPhW7{{z$ncE+-jlm`o zi#)#`xhS>6HJOb-rC|n(Hd#%>sA@+HPC0bgl@%z24-?@Mx~a&0hRtPud#JE?9Xpzx ztY=UVFN4<15Qo?#eN@bWjxEJjbj4rD`arB&k~YnqY6kv;Y*wOR#vL?%3DMT$p)hlL z))H84AfeyH@JvvP!`S+hWTHf~gKm%IR7TtRA}bDCgrh(Zn!RW32gm$k3r##|8*n4W z^ZHUX2X=;l`f^1Z9huT^DM~i|g}^eMs8WM5m2F;RqKg;#OaZnQ<5~12Nb;Y&_K;)aF)#1w%bRXhTV_4M%UfBfo7phY zyovJytBys4##??wW~1V)Y#~eb|KZHX0V=8P6{q(|}NuHfdk~ljgtmFzZ!@Y6B6DUq9PHZA7tyR2qHhh-B zU_JxmmjG7X!$WSa({K;A$CtTz9@dc)s!qnp#j)i4YE6fF@8Ad%#a`1rHVWw3 zc!>cjrgU@~<`at{qOS0;AFAtca8^LHSS$5svEt~WNvNeG`KQN5Neve9reUbc?>Dm{ zyb^}6_DFdgbk?xIsh74GCucuWMgrO@s~qXPL7PsYa!J=*D5r{nU3EOnJ-y89(qAt| zx7C2t3&d2syX{~wjOd?7ckT{Yrr2!dViel(7f$f%#Ja((-U3iRBJ?|WIdN`S_AI*N z%QseW$m%_iC1xwWg#WCr`DE<^f-M(YZ2<@})NP4bF zr)PG)FB3&11@T0{g?Lawt(pJPXgp{TQ=KP$=QOwgt#n7D<6m^gIj+$sZBtKKJ72hw z=%bwut8fDhu7jVs5~juGA_%Yd-LNj>O%8)A!i(-mwvszlmF<^?K&Ipdx(D}|>^7(e z#aH!QeYBjM{5;$Ytd$-p@Uy_Dg>7(|xMn?NO(zE5kjkrk{p1<&k^7nZyOi7BqQz#g z=F~>hDyc8*ID7dZZ}Ziv@}{MkJQdEnsHC|2AT_?yAh^C_X?pV0YOQq;Z_O{!xJj$r z%br?f@!sts&>IswNhjm}9-NX1q9^8x?qoK~mR%GyG8|p3;O@xr>6AQqYpdXje znz-})qy{!^VY0La8{x~CZMFa=__7%P?IN#i1PY@P$oqO-rW1O6-?-BNfwlj^b^KH3 zen0;Cr?=Mv9Cq^++nVSYpO`(9sP8Yqo}b&uZoJQ5%a+lf9)>N*sC%}~%~&ov)m&zZa+C{OmQIhIakGu@attAz4@HY0U!J%~Y-fR1$bSwCv0mHp7paEa+b-Cs4 z&Mx*h_lLjuKxebkIrBmZrJ;l)wH7}gi4U}{{kYSMC3^?*s|!U9sp$)DBlwG@h^EHJ zHPcnRFak%NogI}nd*CUmS7>4)q_kK^>_>m=49ts4>I~~?Y#EHw22Cf7mEFXr;$T7S)EZWQ4FLp)5 zPkE9Y+ozzLY7Rvyg?Sd6bKb>ssgY44{jtIQRtD`v3I-gS2{qNNer;h@>!q`zL~>*_ zt;Z&az4d~G{H%N7jqi$+TUiUf)xxq;KZ+O^O`5!apaB+0dLV6pyWx}}i4YYRTm*Gl z1$1uT88ui7X1yVrlv+KkFE}GR!h*7y|I>hjk`NUs+J3s@KO2Vm)bH3)^yUmkbryC&gL=f2sT?U1;MiAWq z_`uII=Wgk89&!3^@8dXtim{*LCs1vR^|jHn(kZnxT4SKe&PIZw zG>$z%bB+MfF|s3c_&wJIoc^a9&yZ34!xlq?zCiu&67e^%Q98RC*}CgN5?nsX`gUpW zVE4a1UKzIgRyZ-vzVk0$#qKZ8Gcei%YItN@h@XdSjiOdI)>{~PmX8T=H}KvCrp(f5 zq>pu8BYe(BCu_VI^H_|(Y)MaaO0!%yUyN<<&LN07lYs2i^F7fg+j8 z;{Q9e@K4L=e~T3I4-oKw(853cuT1Qm|00F_tpWXw7TEv80=0{bP1_6!gr4mW^-4F( zBDZ$@9-&2^`}F2Esm`BT(u8ni{oPEUg+`NM)uW2Bt1g zE&XXTw!{$-?=gqs2g*32jBRPLU6{P00fcy1ssgpsKtde(e5Qcu1;tbXtsO&L`iqEO zELMVDLVDtnh=Nz*X2<%>q9E08j6}Rs$rbbk%GB&e0K=h4_=2egdSnIYS3n|==@Vy^ zrhIUL3^DrzVu(jHDf}?9M<;()OQx@8X~yS)NFyn^AibRuP?rbq99do%Jh&~QGLQob zgs~sXq!go-k03W72pML1Smi*YjK~5W-6J{9WvbLM?W%yI<;1crqw;9aK(MiR-9A>i zwf10AR*akpdD0GEUy$`hEpQ?^LXD{&`Ia`g@>V0#bkZwpehDUw z83Qv-?MCy6 zi|iTEd&RtpjjNFAWC;;mFnrK)|50yh1N*uuHIrs-CztBvC%FT-{LH$MT`(1RwJEA6 zIkH!gCV*tjsO4xImLDa#4$IhW7R4UFxhR?$&I~MbNU&s9ciX$65TBqGn*ChpRcTM9Kc-7jgBev}+@7*tUJZEZ9eJA{d~SDZG~-uY zoDBGsw{K@Gi85_(1;Wzc5=qO4M;%*Rw}I({>2G{TEqpw_9ayt-s`fjl9o(~N$9_6l z_WZoM3aTeO>rAFxCgdHk*)k6rk9HHV5y5Bg(=jJ32P@(Nvdt$Oo0R^eb(qU62d0KJBkz&DSXF;%u$Oz4I%{ zlvr2(KT@9)MaXa-xaBJnqg>vth#eN`p5jd!h1(s(!@N)S1CSFo1677J^hPMAC%;^k zE3NHe8t09{(peL0L+8x@y3mOl@g;CVbh7NTG$A zj^L<>wMC6z1V|8F#pOx7N}8A#J*A{L9*JN-U7TGT<%*%-r%W-8(!A2zLT|l4go#RmvWL@&|snp|_$%KKgq%c^B zBg4Zkl8F|jW07%_5=GIWuQK4blyvHXSxE#^NgSY}rrJX6)}M{M5(*SnJXu(n?RxSw zF0YGF8&fK_8g@ovnH5Y#AG%f>s(ChEowv>DKgVTECP&>hYipxhMI)p8;K7zsowXYy zlO`LPk_EZeQI1>SqG+hCFNXnu3yx)8`Gj+O)MEOy8{1MJb8@!Z%1&E4ROf_=@zYa8@&W%*~Nam*cT`=W_79c!aLDBi4lj ztRyX9nF4L-hJR^t&*`3?C(A$d-_75DI!6Cn=I=ko>i?d1OZHM#16?Pkz(3`Z>B#jl3Xuj^gz#q2koqQpwg7| zOkit%JLmR7)FY{0{z$>G+l?yy^&M6^L2UEM5&rFr)eY~yCFyh5%{B494P6qaD4;Oa zN=C|@Ns7Y|g)F8lkFSxMRqNP?IpGNC?r0^jouMb6gcS7UeYtQ=YY+n2YUd^dkCIl- zk>}%Fxd-`Pbf2|@7zsJPZUCUd9OgmgR{rwFa$oUESwvZ+$mMXi?()=mgcGQ7%}_Ax z#kYi%l>&HRHMu=J^)4o?8cMn`4>`RU^dLHUI@mkkzS8Owomg7K8-X?Cmr~T{`-yXu z1V0PUsz&>G#vjr9imUr_yE~$eHQ}2&=a{w%fzmacU?>JKQ_x-Z8CZgi1^6*`Zj8fz zCpCoMplzlAYu)%4l*hxZ^G;|KJT2a0b6vgFcde%2;sK5j zWAwYosYz4B7_A)9NTP&=?Lid8c3f2)q3JX`(?tdL$dC<)QaQAf~MSQnU(IC+2PRG^4YvBWJ^YyXg9Z zTT}H`S-}xhuBWlNS*&FP_uOWW;7sZ|Qw?8Jnd;xCW>5OKDxu0RT}4rhz%f#lbjqXM z6g?7ZKrHMlYvBa-RZwaH&ZlA>*u2=HL^e~#nPW%Pz~dj~OZu2&fFulMOd-i!S|O=O zLSe{}7>eyos@3oBj%s8drkq*c$~qxuS8Vpjeqk+Xm3M@nd? z#m9v#49~I&zEoNm9s<3g2*ig8rc%EP4 z0uNP%&tux6ooVk4TJD#(j^v=YcTUISD~z zL=zYgLl8`pucYhhR=M?1n~7>ohrq5~|_5tJW1RqiKZ{ zN=W=jDA<_jx{dT!P+cMDRPX~4Zk@_crz)t;2kHB!tC>3p^K(Q?$w(AsAk%zAQU&RV z_@fa4Rr>M}SNIca(BOwUE?n_AHFu$Wl4X+H&1-T^a^?|oiXhr+ex0KvF+?8Lt>%bA z%5ZjgH4XJk={Vx4pBr$)SfN#x2ez-WW;7P*@g#Z;wQN%b@P5+bJwR*h(!Gb;@^Hns zJ}1u(wGkPic~0M|+p5hFOV)r~;0US7BH)P5XFB&it1D%_qB$Ae@LLy57YUzyl!>dR z(%oQPE_Xc6o%J@D?C;{Yvu-s%9;nG1HMUD3hy%0bG(fIcqs;G&2uH|HXcxSh)TfRu z>v6m7$ldcsg6phdJPU6_rF=5?hoxCh=M6?G>I!mv+6zNA>He)oz8Nbx1DSk^Fvf5k znb2DPI>srlpPk2^AuI0Xo{8-EdoBZWvLZc5G4Z=M8rPvDP{QpQsceXcbsrCt2d?2GBgNm~2{hBV z``U+CQFi#;RQfzaHs(|EKs%NE4m)&KnVOprc(c&EBEhhb2d)@zyTJR-l_CMe1H7Of zeOOECR}NYZu!lz0SO%TNM;CMa$j1T(ih%UKBv~mtGTBhU0#+*O_o2&3$&(}m{b0ubH(w6lq>Ao<*@b&D>v-aNm=x@ z0SH}FhO+1w@O_lQU)`sOg-AJj`_%Oq|{e1~MMgUJX;31@fTfFrCm(O&> znMi3JhetGOD=u3HT^9J+oB>+}z8gEo_a-ezUasUs3IgJ#5k2;kcPj~8wk!*30+~Cw zisL9a;l9fv(zL?#_huE;UOG5tdN96ms8eiNcU*~}30o#&@*~q>sx`BneS0i=Bz5QdjS3#PyPN8}~cW4LAeiFLfRR7p#bqMNbw6zwyog`BF># zb$>TnVwH)T>tmU4#MbAB5wj6mtM6;_2v7UyG+VcD5l7Nn63~I8o#Y1#D?yn$KV~A` zTDfp2>r2B_9v9kGNxPgX3)x32wQLtL+6UKN6M#qd|xJr*lgT!WVLe*Q+Fs(1YW8aqjGl7r^=XBijkgY0PV5PtS(~zZqW+ z@Ntjn&hrE}qIZjYYEsghDa0Wa#e^{wUOLr<#zuQxB+f!UCLnm&hPf>oNoA;}gr3L{OUj$$ zxj{`%G!#KKBX56Hwr)ik@2=(>gs4Xx1J#GP0QjkS_r`rMq>CroZHN2#$njU5rl7Ta zI_$onh$2K&&PKGWr$0dk3W!MV9a0m~3)(fz+#WSo+|4H24+jN20uyq3wd_^!wMl^( z&?kMlu@R6%!mlNU&d>9IeLfr$gR?)6_Cy`97zx``Vwln41(4aO|ZBTK8`B zj`Ruc6iBze?%w-fe5<$KKlVfKD%b-$Pr3ktim)uZxIO9W%?Lj&q&3;T_E=|rIRizE zyR5q?6*Eqv-#JYg!d$eC6o|BopnJVsG$Zq8jHLFiJEn^QQVrZ<90$dx%}nG8?PI2C z$62s$Ik!xsC89>t>VB?Q%9DQqt5W4;{Tmp<{*T*e|3#*OztF}1fg%6&J~MG}{Czo| z{cryBUtq{zB;tQ!8u;P3&W7f*T+`!mM?lU79q{z$h_HEoA(}l^%NoC2E;NM#l2x>v z#ALX=;maGIjzkbCDKnCNO_P(E(GDOJn?D;kfalXup9tnFW|e-M4R#xT#+dV2c~15K z(YQ6?K);_1ZU~LZI*`LWJe>r5&?ILj(f&ikYpvxfM?*oBFD_<`ZeOxsi zl|rWYWKn#H=N&fM2crXvm8O}2?OliY8CX63$H+a%fLpeizJK9RoG{I`-#ngrZE@6s zQ?);-xd7r=ZC(iMMYTe$AmUKucIVPwOr1tk6Lfc$Vl}=y-UJh%yDmac+%9|WF-S&j zGxL)7iGDCcr-0;iOYf~wap=W&Xcaevl?c$f9pn3NipUw5rL`DqH$#L#j3Q~EVTQqt zwE1=(EGO+B1{%$hYsIx?a265?n;|5KQ}-S;vvr^ySa-bxe9>6%!sW`ZDEa z-e|JSc5emzv@~t&(|&?ZObvN-{V7q^4bo)91ENQch3BrQ>VbH+q@M{3eY?n2XXsho zmu9q}i!LF2Jx3nDsMOAwqu&xFmolT@U!I-whlkc)6e z!@MiyfFx)C)?Ufy=UL<$ZWMrF=O01XGJEEK=GM*KcnaPq{w%_7+_+8UkX4^%WeEKd zE9)dvF}j*ogoy=j+Yd8~{%jlexf$}6&5Mnn@9Vq@Vj3G+m`XN*&mS^wc7KZeJ2;ll zMFYX=@wvz$I`$^yf$a2Vw!7WY;AfsVtSn0=ZTqnJvSiS2quBOHtCC@2UmEoj3)imm z<^{7n!+_qqu~^0e`zVwF9oc#csh&FZ`y9mn^>`O2o+V$W+z0SKVKY z9mSBcM_QNidgh$a@F|^?llhW@wgnrd<^^kh*K9@eHc-Sa<3@uY5oLnNAbAFuXb=#J zF%c}Hr;NqM4a1w1-pCmyo#t!T!rI) zfmzRIH%&+2&`R(xTr3g~2Cus^Cj$FzyW$v~33lXCBrVkqP6dW7!d_zEvM4kzYwA6V zGQG@Yy#U}EWe_mw5PRCx4|OCj4)-S*So{(RlwkbrdxYE$3}mZm8*B>aS#Sl>u13k- zhFz0*dikL7bpwQ-Ie&OD2&uJ=qF!s(4kk>?!-M7o8|;7SpOncz#{zU-8u{SgYelRS z1`mh>9pn9i7e3MiX(wu`T5C&9&FUQLl0ah({`v4@p#FNg>{PHr> zL6`b^?Fw@!!Z(dSDl9LO_7PUEFxSd*DfueYqTt=5&Iu*$i545m9uW@gkWr^4vmfpy{Z%UNzgr9Zr*}3i38&Kw+qOxI9^+9qsXUBH#tR$K4FrH5KY3yMxysrYz&FGc)A3toMZ@)O*HcX$dmDupN(!P~L=#`fdm5iNEvzP26u;k;N}jhTQ@7YQ zetGiJU1?^9;tpgdicQZsV~IiCJxEIj;s6wwB=tQ1rlD$;M9jX8i@5G95)g^pW63Ir zH#2@se?fdR%0@q-D- z{#Yt4l-$0OOS{xil$Gi#VwYTH@%**i>chM4X-jWw)gqO+ma`^*c!c0j{bbNa${)wB z-aAE8at-=43+)Wa9{fV*!NcR8En+}83>O>kzPF{#waY=Keo#04Ed3}Gjfr9VYD!x3 z=BA(uFN>Ar9wX-w-jc*l$Bj)7v^_ui+|*D8cThVH}}n~|Q2yFjI9fxbwC9g@NY zktcK`Gi=oFtB64KS>4`wSr(Ncq>$E+vkH+x4A>%}~9Dp?$g%v`sdkpC{{T`e{eQI>;B8>%}gVS6*a=*cpe#A1nz^r1@nvWV_ zhDc0S?GXr3TGdjq&KC6Xh2&aC0kyw$;TX2BHTiCTd%LXBZaztjgYNG>J9p_DOdR2Z zeq{}XFz6svpEO+c%xg_ZzRwwZt1A&c$e^Ib``opuLCl-Txlfis7SPEzlv->vrJGZI zo$(a+H{rqhn4Je(tyfr~^-hr}kc8;ug1U~IH5+uKK(a-t{)u^oTVZC9apW>tmf%f( zXLy0T`*eJCte2?=3K<3Rx!1+v`$XOJ<$pa=janI6 zxs!o@X>?W)rTF*@$s2@_TqX!GGnh;}(RKSR6r#6Nbj%#?T|U7u3>;lc zpdap;62%mo!eDEuWw>d*!&A@WqT527QQYEaYk97#$wu68Sw2_NVMAqImuxDIT*&uQ zoF0ldcRY~>FSL@M@l~gBcHKhw&MwZSHzv@avu-jy3*w)3=`2)#jy4WC0XtcgOaWOMB z;-^^D^i@tdBCiw@kxA^~3y6177uF|{6#EHf9dGzYxw_bEeyyBa*uF;^PVDPD5%lq3 zekVlK&CH0~{bN4j5$xoLJr1b?FPAnAQ_k`C$ zj{OuEPFMJ)YT9$7nn9Y1=x(h7XWa1|fE`R$0#OfD1a0#giqET7>PRG+ zEar~-=D1>n4<%Xt(0dzukhCh`bPXOxx}30H(GMq`R!qAcctNc9>KDK>GQnEbQ=I6j zQ_gg~`FfyP6g04yKm)i_9AFjnsSnMm3Wq0*{G;D?&!!!w6&{`YQe1IjA52Knl!YIu zMmECHm#q0_Uoo+^O(CiFNxotC;mOq*s`ksD%xC^SGZ)k?F#`}f1{^eU#8_dWuXq#*R8x;uQ zQ>2J@_r0%82oJ{L5h#x<3Z}%4fzMNiJthtcmM$WW)9 z##Iwl)M%kzI(-?}E!jI2GW`ZOW((z)Fpb94kod>1iK{%DSM}zNcz$peR7G^&u7TdJ z{y0e86=Q6~*Vp1)PPGY*4;uz1B-w{rQ|SB3rW9Fp%BCDYN6~LVJ7$>R)HvJP+hmip zH^`9DP1yHPeI!ixfN42?>tw}sX36nRk7RgWVK65ylN=0rOv-cUxKG;adJ(WeTN96; zwGxkuvn9nbH1D2`AOi{$x)`wZV_ud7E|b@1z_!WIlpn{^5o^d0&>fAItH;e{{7P$^ z$=GdpI`glQJ7zt@($Jj7)fK(d#QS9Q%{TpXQ=&~d3P;^02TE*#3@IdMKD%~^uSeG= z*y@~9cwyWa25$Nd%Km!zXG|mp2^SH~D^LW;+I(w`Mjbpacj#KE7$-j*n7GdbupJd2 zzk{1m>2rWLuBsFB_tY6P@&&MsS<<7r5h4#T;4*z#OU?=X#j|y#_Qky^CU)cUTJb$< z$B}A94wbEq)oj2u*b?a@T{e+m)SKrHdk7wdGF99@lJ85*7k)P_xb9h9T}x=iqES}H zvrZ4FBT}}#@hVRJQauf{6rbX2*b31gaVx0|nGdy2F!dIQgCecrzACgBR>{=pqIKnY zygc)nv#zleOZF#yO~l_WTHUgwx%k3F%1kmeRDcH$hypIY=7xh4TIvJ2ecm<29$&U` z<@8%xk*VK`PDM1`^*1cA89iT50bhOau`$vW-SMNWxFpkZvwELj$}lRzVlEBhAyw7xi4Z_;+PLK|D83AB1h#lB)=UXes)VdWK5 z6noTAxCNjZdux10;dkDJ|K5uV!?E-{su15lS?R}ZXP@U z^vNjDd=4U82uy35C+cU@aQqcUORynBC`a|C>jm#y$8b0SGVOt9PnVnjd2|Tf@g&!W zrsdjx!SMsxUUNs5OT|`RA?Ji!SY2;nHOuc2dAy!+Khf3oYBRbga7RMqSew2!BXNe5 zSieW?f?fu+p6Gd8K#?~7H-SdIB;yU!^7h5zoQCbd`&$H50NA)=0E-!T8%>@q0|$H&49WwjZ*e!Y>4G;);JaK4(1c(erPRGNGm%ZL z*sJtXe;|^Neb>)XkU?vB`2Gnj)u@?oDx-G3%f!olK?$ZSqFO^SSzR8fec}GD_1iwW zJa3S>mW^s>&W#@xLCgk8OeT>{1l!DPu1S~@1t9*>JUsG)D~+%XKva_43)u7}Hg#H7x8afgwOr$+{@Zdc7RdUMljrgN-LDAiE2fKBgO9!(pU5fK_O z>?r^sr;Yo=fBVoPMGli$7=L;}=o16rEsI^Oa|g*H7|%4?YuhS9E&+7JRmvdY=FyYTEK;sWTj@Z{jbP_Qg-tuQ1zEx_ zq%*g@%c1%+;61%PtL@SW%;4|&Jf+TG@YkoqZ}%*k%d0Fee{$^|N=D~h!LYZvt{-ec za^2!>&dAKIwY;Y)9Gq$DV)$f5r>L;EW$=V>-f%3Rj$X2j1sA7SzZIpDlM1GwpUu5E z*~0E+qnNQID33qUBwl9hTrNXY4e|_GNrPrA9l`3V;nTskFFYG8`+(3I7-n2Rc_oui zE+=`Qpt`5)HQvqE&qI(OE9tR=eazTQMkOI&$R3)x8%H}Z*HgOZYH!m-7zrgKZ{fH$ zetb~Py#ng=j^?$ycke;Q<)QcgUJ%ga@g)|P zvB8)Mu5Z@GWjp}6pbam6;6$$8mLS_4KmdT2hF#71%1r2EV{W)9-d_Ld=97izHaNtu zl!W26`(*Z}qLjx!PPDmra`j-Dc^wtj0eP_lNp1^OqLeMP9BaE|p|J#xPnm|Ud*c2S zFq74m;Jf_Eqfm=(>qpQX1eE=We(w1QuMtWA_HX(b$KR2e{}qRr|7uhJdy4T_llsdR z$->C~k6ZAUEt2E!@y);Vv;TCr5Vn=wy69cI-{9WP)5X#jP3koZ-ON!2TPKP*c43&X z4oJffjSl$&NyS>&jkxY~AA9^F620{Y?Hyx+jC9NLGrpuU}JobEb`JdKp3 z)w2_H5qR-2i8Knu3G)G?At9t6$-~AX+KSSa-a|kwp*!QdpxzQ+4h?*U2j_*kzF;|= z1~(g*i0g#f;hs(pohF%v056QI!y}Wksi|Uex&tKo2aX2XIHt*^f;q=Kf3_O&48xPB zQs2#wjxUy2cqvvMA5?II$oY|_ZsYm5oKA2UN1Mjk^ld{U55mmKhNrQ}P$nfDzzp($ zzz=-2pjs`3=R-paNdQN(fQ4mozLc@dwgL<3z-18W#vohX!5iT%kaCRRP*0g+&1m$nUKW%I~Y(KJS( z#;vv#S#tFNqlijt2#$f}%F{rxAPgQRriU@eOxlRhEF(SPG?porLHd$Ah zd<#?}3tIN1=vl)$;$VE7DWJ1$ivl?K&B#4%L6AI9dvwia!r6^cAIdoya=?PG{$6m& zJ}BeS+dzr@3N9-_6n+}aSlyuA<^7qQg#_`KoYkQXv*S~byJMpUXWz|ogL*8XqcdIM zO2C?l_hHbI3An+s*p`b0AanF;=j(m%Eubo5@*^O{af$u%bG0bu-W2x8zR*CUgT8cO zvq{Ac?99}MnINj1Zh5f$;$-B|Vz2E|WIpk(THWUC?o__%0xP~3>rnmdLbFFHR7gKO-nvP?F#n0f@Mu|~-mijQ7{apPqdfqP*y-%dXSd_sp4|3S|LIAKRD!qM<@hj0B;Ytk)SR&$pJr2xM53kz>JkzVtlsm5fR59O$!yFd77@~^Iw>%|M)i<0A&#DpaJwrXviWfLp$ zianiG%!V^qZM4nK-ht4nophFQ1lweX&^q(XpRBsHFo9yLfUnC(L!J;#@3xx77mg^7 zI(gUNDCOCtg%)Ze+X_}oU>nNyzUwLbs&V8w`=+35T!P}j@@jDUuoXH};3!ySrUH?G zik4s>J_>fQu0H(!j;csQ0-l$=Ei2V#D_yezjuyPNdNI7fGt8XXhHTV?WJgL(g7IpT zP1x^L6Fhnr)Pr*&X`bZwj!MhMwoU1XcC}!F z>!r6YZbN~sN@kXvtyqUGG%<7EI`%fcp^xGK`NAr@v)*fNSKYo|=29p*Og zJf3x;t`XhUg^$~`vd#bZHkwi83lXU`v$rv((Jpw)OM-nvRz`pW`;h275 zP;7=)=C2X9*3@#O@Xt%Pnk_>cB9Gz@FFSIK=Z(%rJX(F`X2uU*sN&e{< z`BsGB`)fU~n1#i5#ePfb@d44cHI(`Q=<~eL%t4UutUM3*;wMG9Mw(BcWOh&>8XDFh z9hv%B`^Kxcx-_L2J*-aIY!M*U)mvKe5#C|zHPfyTplGF&9UQqM5j|=A>3)h5PF;R3 z@L&}6-*q9fCc<0dcWsFrV@FAg;V`>!p!m^ z--2u!&(mtO^qAM$hM%KNmGxNGKHO`Y`$fZiU#byX?xjy19^jpyn;eW&>!-dv-(2zN zd}7-dREn;D@h;Lw-=?tiaSs45!ruV}3%}=@b~nC+ScqbVk39qg7^>hJ-ZL!M+yyZeL0nksvTyRw zqQDl4VC5uZgHGI&)bc%GojqT*`MR--Fv8NZxY{;cq-tRnWL10O=CbiI?XQ zt)O3nIWk6{A1OF$FNYRmkBAC`yN>tKs;^~UmMhE9AnRyedD)?e zsLp6*g}}3_kFs%GbccO|pxFRVojnu?ua;FfW>FqRsvFWM;9IK6n#wE&h zJ$4h*EQfoRDwO?@aIyyh4TD1;D;bTFYDJQjj0*;E)JE5T3AVkb9Tud2&ljNtkQY55 z{DcSlc4Axv5YN7ag~(7|(sI0j9vpiY#}>h%D+!)nO6>8*-K0L+2Q0G_J&*}{@DyEB z!SPPUNvn%~y*}XgP?C|(Hay5F9^|&_rlY`tppJjMx6k@QsGLa*-p{SXw6t~*wLw$j zxUsGtLw{pqNp;ffTHWkTP-{2k#5vkbtwNai+90MYP6+E6H%8FeWk3NM@%Rl;$OJ)J zGZu%VtgC?no`BE*FSSO6t4~X+XVV=MZ|{5C*-hErkreL682l?7|IE_)H58xnnpFd% zXg47qf7*pc#!y#+>^%Mz)%N{67wWb`FXLL)axT0u{Ew#bKTqCF?nrj2WL%+N9(VT2 z3Y}T@=i|dA&qf62AHg!A^vT(fQHnBZkEdS`B~%thQxeF9$s05q*jucyBXV&12c(gP zd7}we_Q#a8pq)r)#1qWetT@TEIZ(<06Tyqm?iN9r1j-H#n)lMYi62cHRm;K3Vj4tr8AM3%p(j zawFC8;7oi45xnTIJBUT_b3a%mqLv`yyZ&W8BnQq_L~EvmqMXyz5M!l5)Eqi!iXn9| zm(Pcz$R=Yz*u?1D-RCFtMNJ#vaX8ufuD z0ofjqlf%5NgPDd67&ST$oHyV=L|YK%w#z>@7xt)JZwL@+#T1ezn>JZ=IBQiQA07y| zzH7xTJ_^EkPdwLyG%wsHE*);W$}DHy{p}tzMq50}g_%XtzpzmVlfz+Ri6tthR8obY zE{X_Asr39%q`rix>s|RMm?S_>v4oyTg74G73X8 z6-v;U`l&X2x;4>1@adTLqs1Os@R`u?{M+Svd5ITS9G|GXM32sNUoFzE!lOGY zmQ<%7&w`^>O)vqA!T`zPAp0vT^TsDjDM;fAeGU9Buafl4*!wBxC(!`DNEkxmU z0!WICq>IVyj2&F7p2i`VuQ}R13r$7l;e+2SCe#KoZ0#l}-KSB7mL~;}O?zd? z8-U6*^=(|o+31d!{Az#qHvmtgI>x^vc>i=`{+A3a|Ke@`hv5CwTFT7yFUw;&{+`tS z3&Hzq-1#5K)LL3j8%?Ob+j;?>cfVz6F+h4V%|7%wT`!s>jI<)wM~?#5iW{O^i-a6q z(q+HB;B7$!9O;{iJ$Vy&jCOJG_HY33yMPg9@R8vWU)%=#1}FL*vhrRn@51K1C<;d4 ze^L>o&H5wYd%(;CRK-_7$@gy8LMf;2q#8lrA$8^^BL{Zne!O9?&>#dnSCbhF{|Tvb zOJY~G9s?K)L%|n3PTEfz-A@I)gW%$1*0~r?6V**5nJHv^vgq@p;L^y~E3HvOSJ^CR z(9T0&?s&OjcfM;LjY2LR&%x*n z?@8sF8PR_sE`{|`06Q@^-aovKsUi&;LTaxPe!-Qt&rCoM_z6A|l?Z~jyAq&#V%NXc z+i*1rK%G21h)r8L;Fk=xaxa`_I0CJZozHxZJ4PEDoNYdXc)6uThyXN;07dXo!Fse3E6-A%2Ctpr8WtcXODOl#Lr28heQ5Y95#V>NG$p z??rC(^mU!7?lC&A{*yR@C4R_;4#9chYU~j3hX2{pimV!c_z%7r;JnGaPT_0G`bKDH z7i^t&)4-i*CF@>u;F2fEzTV_ZU+-*z(2Ah@%1_GfsmRrbx7o>yU5*lzBwVseZOeKV zwwbSsmG?vhugu2tHtQMTE@7zI1|3tK*URT&omVE>r6UO!wzob|a4YiSDi3*9PP0K- zK=+|+d+kQ42peieNv{OmDA+YvNy4AG$Eg|-cSw+Nuv-&N(YLak4Ho$<(J%eluFX)6q{yS?i*z_;}BozTaFK z09g}Xuf@OD7v4w(UV5nLn!1cfJVS)93(v2hkXB%}R!MWR4vOY2jsP`_@_>S1TTE6} zQKf#OyD{5m=AdDgUKaWr;>&!SM0yyFC1!CmHsTeRloci^w(4e^HYS+Omx|6FhX6I=30yjZbyEaMMNsHrZ|Hsve-Dm z*0E3`*6tKFM#GajHb5jrR5MZ_`{&M21~pLsx+$6|Mxh*wCK~6;rx+b0FPU?!Z4&dAounm*Og7c1B&Qvh1O;m~N8TE58jxWMV)+2Zq)d z4>1@U#fi;IwuE?JnbZc0o17a~No}PqE&*SgJXP*l-0UUo5=uiizc*3siC~HFEEIC2 zGN{Rd-IUIQ)i{MnS1Vj(C>xH<$S?7BPXzSvs*w0Y+9&6pKv@5wD|8lY2k6Dm7Jy*e z#LOd|c4oX|1WV(2gy){(4(Tg^GgMuJh}t{1S&9(_X5LnUG{hsj*kvM8Ai^^u*io0Jt6j zXD%LLB?A<(1W^hplwi`;3_y(Udkx$)hea!Z@TQW9Yq% zRrWys93o+|`qLmK1U_wLk5#soPFwt&BGxq1iGIi$dTAgP1F(6i#qdFID#@}76;%{e zPrb##y#UiCho?dV09+6jsdg)5{*Q<0X7XuYo>%DHJIHPEuH<()h0x@BFn;!Ipgr62 zI*$cPl=p}`6*>=bi17!ebCA|onFG8fMS2+zQH!)3%yzIAtFDV56461;M~jxlFOnmm zMS%Bk>Pu>^hw(~NzY7URTRI(cerjYxWuV&tVR6%zzlK={%tkqZ$7uU_Y3E!a7{ZDv+yDY8)+M~z#^reR*kx^Y{q z;MLJtnPne88-qe8AugjQb}j1{ypvct&rv2pAW_UpmkS^M8b3d#A7YNW287cuNE(=; z!9#iNEFf{bi@F{JfHAmWNG^7JnJ(A9i6g!~5Z1NAiSbf;Lu}eYA&%0270*}5!6sgQ zCw}WRYP=iiX`bWm0!P%6LyhBpnz73?bbjD|PtpQUxSPMPd64zR96F44^5c1TxSFDu zb(2`kD{VSJ&n4q9j*k*DBu|@v>n}CM;J;xoiN7h^&7nv_{;m#b>>-Wci-SqFt1dq~t*zsr_ z!GpQ{EMu1~I3gDo?wYC1?DaxwayZEZ%{Mm3Be8wi=)f+|_xK?ScJ{moinMF3MfQ7O zILkh~RHsvKY?6UsB}}BJjRtj73iMcu_*5n=S-B}CaBx0b)=s2|Wga>>q1mHNN2Pe| zHO7Nr8LB=kjxCHtjZEi5R6W&3*BaWbWgQf!b+ccMfcCoJ0?Sp;(hE4@D4tDB(MN!? z(%wKpLY;)#{iop8=qp(HNT%v_`lD{WVEmIx8!~n!x#t6su8!RU(2zY+uOk^DRR{9d zBtD)&=pfuHdacC#at#)>0uU*vAVicYfP2TVNe{t}&hDlj_y^aOs?Xpu;B#p48%8&3 z`oovz&Szr}cMBRu&ss=q;1xkE?zM+qH}KH3(BhUDk5;-}@C+P^7WOpybyiy!5rD5m zmc~Tm;h&9I!`OF+ye^wcYVeAiVBM3|>$uHCaH#6f9WFZ^gVXNyqSnC%``3_V3M&p; zrD1z)4!UfZ-{W#5U7zgZAC;SZPK4hO&i?j12t}*q;z_Y|K5St82>|T^wz;1LaU#X9 zO|98aaHwXP7W8l5j=Bxdp|09X=9_@%PvPGHtv8RZvFolOWX6!O5<&n`Z$L8Pi`ygj zaV_8Ca<48-`YI0Eky{b>9QMf|vqy*5(BwT^>F=D3gLR5$lNh7;U!#2l=0|MB`H%-6**lFfYQ#eL{T=RFTU zyboDs@5BB%L44_jQR`7YHH+i5_2>0zcx-=X-aV!nlbi1T^FLn14y*ec_|v{w?bFX$ zSBmAnayFcQ^a6OVWRe8*AxF{67NeaADX`9T)7rkw(Qg25(@pn($4dU`Ed6g`CI28B z|A&?Q(audfVTug!4aLQTIPK3XD9!3>1d(FbYXPM{}T3@yw`M5ifD4 znQ9X+9g9Qpx@?iz@2z}si6V;2tJx`o(Kz8L_I?lf*Cs=O+wG7q2_n%%k`SBLH&X|& z$e?gq63U2{B4vOmh*bGNcnOLJJhPs6#4qFqkMOx!` ztCo-IFuSh4x8}vewR&}V$;4FC8x^tIdinc-a0N+3OQKP&MD0BA1Lw^MRx^_UZm>T6 za118T(Ru?eRuJ9+3_D-+s^Wm!g+^AGZggQ=&N~!I#%P|OB`rUY=pXh@)GIqN&Z`5} zcQcmjW~0G1o;s+ZS|*=8vKu)Y+&DKbB5^X#YPXJ}S;CNVu2~XUWpr&LH@{MPjyr7f zM&YtQn%0_MyF$)Nwn5vEE_Vc+(1nq@d1r+cyU&y$!o;A|h;a6S5t&p>)y26bh!zoMx(|z>6eLbHel_Y~;730**NLXj;8heB?SOYV`YuEa5Z}YlmoYyOa;ivn*TRz>^|~yW-CblnT1X>iZ5Mhh zn7T<>IAdmw7Yd5H3vIE9x%C7vN=XJK!#JNE-ihjlgT)5PLD6W-&zBzkoIOO|9bX4Hw^PLk|hkq|!xC0nxxd#cb2m<>k~3C^zH zpSGgXMQgu9yBXuM*n;LM#MuX=rBWx3rhSy)Js6Lya)UO}aZHbsqogIql6@K0C(P9M z!aqqCf8DQ=;Fj#<=JILdNm*3iIHi&$mk%^eJ%hUkQ8C2n^0U4D_AR-u#V_=@owv;_ zEY5^teRO}Exhnr;;8l+6ch8J*-(t+>U0sSY_=Od^%0MJnD4@nO6jbM`x@(&J>;A%X z0KT52VOg~9&?uo%MW*k4!1ILrniy^U!%LNqMujFnw*u-qw$&tR@P~_@fbJy{ik`pd zk`xB`^V}?FyA-UQFB5Mg%f8bZn0JXgjpG2hM&%6aX)y7gH5`9xh0+qxChyf59A;ca zQ>FXenw=Dm&PM}(>la^>C)peA)z5ZJ-78+XYp1b$=hOQQll)($u|7i#f;Z^`j9ZuF z{XS30r)}ulW~?7w>tFX$^9a1I+&=P@L*IifnxF8u0zqH@uGRe0&h}r@YX0gV|GU-v z)j$4nI50E*9n;SF_vG(iTFrmBgKAPu%5I$lq3c}jW=6P9yv6%u5U8`^y@xJdSRQz= z;7ai4sk#oYwnnu9%KNq(g(4B@tV65>+>v({rZ00A=Gr#!pUB1Sia3@c4jIs~ik)H(M35{dc+cD{9}jIkO>lh4^}_O3Kr%sW`X zKav!*k}!@6$T$R@Z{F?=8;lWYZuN%b>1sl81m$|)Rc_Aldm{1{m)MMeG?SqcAON*E zOoToe8_H*nGdbEm16BRNyKB4~pDYW!v=^Y1I)?H%4ME5mv^RPLSpnq{>`nVVe~&+9 zTO%HFS&Ok7bC^aWV2Noy=dYry3pIgPosH6%P__OTuoucQuaFaI7H&St(GRdK?;YHP z$j;nvnX30J_rx2#u#aC{R z3F}6!nrPn(^KN>h{CzlM5D0sJklTgezF<~GZ`X-8t`+r$^sq+j5(86QU2JNlGOVJZ zEOMNYEThLbRP?CP9+u-OV^J*ZWbH%^_gGV`a-T@y4Tt_LR_LBW?~>g1#GzW{#KRFt zsZ6V1Y;G0|#@06$FF_Eb}-;@Wt|~- zT8r&zncmHjeP}m{;llx6h(+R#UZ;qvblrU&T{%hhtAsD==4Gw-J*9}S1OIu3fO1d) zLr5#1L2^e+lHvzM*lv*@72?D^Ef4=QP7YPERD&((8lh}-)8IIs8Co2ex98Feh9RC1 z^Q7*;EeqL4DW>-e(fKh`BNC;oaCM4OtiKcfmtyr8nc-JG_y(`n=*pFokj z$UFu+jpjBV`xs_2w@MW%7rGQ=+84cYv&=2hoyDH=m18vcpWih;5vwkIoW|dfoMqaMchfYfni6daE4wzFA z4FUBDQxVmX@=+6^Ry%+hV)XLo(9B@p^=tSHjr<{%ACShX!M$yz%&r2hiY`u1ok5cj zJug;$$3!p~g{RBl2!!RrVp;Zm5{dF9a$A{^KLkXOWRA1jcPG@lgb>W}>{&3f?w%M( zSq0(>*=xReTeR5LX|(vFciX&KcQ9J{z1+N99|0K{9ow6F)BI76HByW*rDv6mU&u!; zQ$E}ghiiO^n*I3R`!DBo-Ys39KQF2w23T#m2m)t85~JE35M=z*8Rboz-hGpo(;f{cOCh9O?1|xJoeqBJ-$ z%h$z|5#m6vELR9dE8Q)7Q%mU9jL==P7ilE<5=$&!tP53-OXBtS6Rt4jm}+ET{QS0j zIzZi}gdG)0Sl)lpecH!(gg0uCC-x5r5J&+*Z3zH~mtq?1vN5rNU6qNhES*!>uLkwc z?H$-0+^i6xVfgOVe>7ftZ#x+;x!Q_m$GLJ&47E4Y?Uw+djG0G}jSf}-N~fHtiw_ST zD*9;*+kEK)z>YlFg0>z=fRl{o{PJ@TdOQxi%g(gpodseyoD7gb6FSJmDwKbr%7o^t zoTEen>X|lOAEZltuN#HBI%1&iGT?eGhq$R;tHAAQtZ*C7!1=ZG6LL;L|3dl#`^(=p z(y-?+=l+4GltXR@G3ne`T}duRf|j^m8qrjlLHvM-Nh0!U4GHKRM>x2H@c6)O05VM@ zai5WdN*Q5rLych|US&^o@fS>rU_lHg$utEvb6Vbk&el)R*Wv2(`zG?-^`oxI=Ha`P z9mdH(3`GMBE0Jc{AI<}e1#Wja&Owj1HTSEz%JkA$W$b`P znSp3R{8==umKcFK*@3y?|d4;>u?9sdm=G>%NG zi9CS9p97)SJXOkCL!uaS>c53?xZ`cl+lum}q-FsF*{@<6m z&D;gncol(yAhZGD^(<1->D`|%m`e5t214)ZZi*&~GDof)%1|QchE<5l;=n+9#B7)WBHfaz;*%V<`E{=+@`NwMhUs%qS?vTSkTf+hxW(V3EumIy4`YZ6SWOs5uIGpIT|qTX1^QlXA7G zNZy?!Q6d$$s@JjIp(DKrM$aJDk__5`@(n>q)7|PtE>hAmuLEy4@`_oT$yh!g%-V%9 zw0+EfMc)L)*6y$3zv_-^{Lc%RiZiVf%KEsFkcjLk%SK7= zQryZ1(?iP8D~#98vK(emX2mpJ@J+lN_Hr5?L1WaPnh}@gKxiFQTd1;Ms_i2%8*FR0 z_&aH?j@@+w)uy$cIuuV2v7|q@N9#FPud~!^-OpOODMny&^rt)#p}B4<(H4r{(b@f8!0@$Qt1p)k$qHS zEIyl}4;^xH1v|yjZoq|cW0TWlxi)|M{LpEJJfGf9CVC9nlM8fB%oNs&#A9XSIh~kf zZY-YNotT&rGaSC9dy%@7>Jekj6I|0{fqWqjJADHpiov#o$>)l4oTJF2he3$#(C&@B zoHKtOzE@;C!e(73jz!r_Y@Uv>e{{oYHCdOqM%;kU>xq0`p>SDNU>V;TM6$;)r znOo@{{~2jw5~Gpe*?I*_(7pWL_W4MMpagPp6d)!zBdnr3me(}$M+9&#d0*5R26arz zn)9tuO|%d%2Jm*JlhxXhp&wJ{Y+e)Aj40jY?R# z?e64Hsnhwg@C#H$yIG}Ig4>Q8fCv`2=lN#-HTPy8+_!B+LdEs-X0ZQMx~V+7pNr2G zs|4Gj%VMYI>l+j^mM{0;LEe9QVE$XC9DgOl{jYP0oc}cRFtM=z3*`NKyz@VhmxbX! zT`!TXsRIOFvl=E=F+dlcd$YC2??@xy;13RW^Y-kLK~sA+~)HLt|4>i`$Pl=A!40^9a#7EYe@ zpp?_s^R!CD8AYSMNDZ*Dk96_Ed%3owha}qxV>br}R#?-D35}67d-IJP84hFV(A6r6 zJKDMt#38NT7u*$-xbvz}FC?02^!@QgcfRqS;nqJU9cWf3V#EWgiP#%LZ}z~NXB&=A zmY~~L?g1@VFtq>?gJ`k7kF4ypdKUQ8W`d2eBzREif~HUt58yQw zcGD!);1oD6RfK?%pxFmPOkZ4p(ev#m_$ak{}ix+Hkh?#ms+F zHVCBc34{n_cwIV;gvS;vwv5`$S`?EukIJt5l1FI1qwJ(q(jf#h$y>{F%lA9M)gKDCQKzR1;J)YnMGh?R($>c+FZ-R#W1V;nOgkoHmu?@acTfV!oCu2J8HcVjwLWjYsFrEZ|r+70yZR5@d&Qx4>6ZT zpD@l>mre)*)f{?y{4 zPO7kEQQae0wrO0Nb5^T}WVh1NB%#@33Pf~ii5ffN>7B+$y~?8QqHe0SoZ~Ti1Ck$U zMnnC_&;h%SC1<=E^^j0omsahnfB<9=;z?>Obw1q=HRVR%^AqiaI;H2{5|MH^WhXvU zD~gnmK09t9#rNEenk~jcG=)}^Te`eNJyJEbOE=rBgyOx|yuX8b*^x=Vr*V&7tdwNu zHdE47J!7*(J5JShYesT4ndnfHwKoQm+%bE6gg&2}dnoRBw zakv_h_zPZ0XVV^#eBNv4X>pB(9}pxGB(kmFE~?)w^)O%cMT;+TN$1msK|4QSAp{C! z3xAkg@$sGB+bdw6R5cHp`Ha^FiVOa8gcLNbYHS-)h1;r9D zc5D7R3-S4#p3nLov$=h;64Bq1fGOn0X?oPHVD{%095i@Nr((@tyN=ykUSDJ{i{;)s z+v>Hxy+PriTD6o&lZ6z#umM&_pauFu`U@2bym9m@3Zh)lMy z9pojlzvcN0lEjX6_W8i@W&vMRY}Z=B-G^Pqh{ubwdU=oR)3g$cApo=vk=y}f?{wwTc~%HVdg z5nE4vzjgFxw?iR;LsNluG)pW;@Pt!JC&kKLV!t_o+ab_`IRZOnu}H|tO3dB8q0C_9 zsxY4+!M+(jUkpv@Bx4ZslF-d*!_2+u(!PJG8&f^1$9AK6TEWlxhcdw})l?ha^Xe1X2q%>95>IKXC0(v6>%ly$}I84lfjsY*BlGl+2_)=Io?#c-kdmfcahE=y%{x zrQpNC_hNu*V;-`64aCn27EljAZ?_WO1LL~0-ao+_)DV9>b#m(=jsH~c&g2wnJNY5& zEXE^TCDYZ)>h>zY%SwnwGXekR?;c4i2K{bu8YcLOw68DV>`nJ^mYN%itv?zctqlU66oKiP5Pk_aGZ9Y-A-gu2R-K@k1b3WGoZ|5QH||9gIg+ z)38RoBaV}p5_N+SEr{lB-P=cQU(c-Z0qzL_#vevnMF`;F`*m;Nc|!kqzliN3A0mq}5lzd_49Dk+(niooq0& zbg#^z0ab~Xtz$u8MfGG#_=+x{*hA}dNR8iA7{P_}PFcaxU4>9IYWbX#klIHtHTeW;38nElA_XolQNvt~fhD zQ2t9{=?8x^Ww?FoXisJ?>cCjoV*6xfNn0I9Sw|T{$XNw*(&BOM*{XlZXk99NGkFQ`s34Affm~3JckUXUv4f^VIp_Vh#6f_8#?}aaDSBJ-a{wjb+0s`w;jk#T=ih^#~Hf`LRE^(KQc+L_>_^zBEzCF7m7!T-VL% ztigkzvy1{SP5|=Ny74%P&rnj~YK&H8(HV#;W9m@h?Y%baV~991+QG>UbSpnpf4)W_ z=Z%uQ7p`h2pwXif@id&r75a)H=)&Cl?|Jhhbrzoir85tsmeB>W>lHi#9KnbUoybBc zo?iiX4_kuDD%pVIxk_CtZ)=WUfg)RUVx!m06$7AlF2#p1))4`lDW*W6!0Pi%3u>7T z3g_vt1YE)vT8!Ra%kZybOz%t|!f zBN)+J{I&Qj{3g}91f?_tD?|(z*kOc|x{DJ>9zE?zW9kh6e$&y#0^6-(hs2*ly61_3 z8U&U$js+8n%D(M!~Un{ookpZ)89-Af*tp837bj z9`CNP;NrHLwNB27HSi^Wg(Lo$PYoV?YPEV0Jam`cx2ZZc<=mvBMQEYmHIF^5G zu7sXg2jL)_HwWlG-QC)z=x`7Yi1IE0SqYHRgEo-@U&IY3_EplO*^^uj?kX`?i&_cdNABH!T!BZl*mo0U$In~)8JH+^@2nf z>+Bz$cXAAZ9fIZTzu-)$LszMTR`3yMGKj+eqzT=Q^9rm@s`HC2$0bOFj18i2Dhz!L zCA&L-!Vy_&Xh{JpB-4$H7)WNdD>HA@NZD%1NyUo$m%=~;h0_Z>jGV?X9DuZg8H0i3y?h!@xWw+$av#OLE}Y8&!L( z3f3xJyJ=4 zPxbZM-)5972oG$21|BPYPpwsXC$9Tvtozq-S9K*LmEy9rN031oGH5vN%ZK~HcPAZi zoctqVWNZy{p6tyNjwn1sRz-VwZ`O?(R7(0as`lIyvjb734?N6@jE${|2lL1}MI^I1 zYucmZoW!?{r_gSb6Qh|Vu=;BV%lh)OuN_VIJ-*&DUu)#IH(55fRq$UAw~oz6QY(c0 zn<)Cbg!<)#E$bY@ryaV!tld&6>Rh1TuhSrqH2@No{)m0jDTPRd}gnt=Q zY?9z`3NSkHZYkS)c8_+kkGA=q(uPB_HVfO!?JH?nS2l!b)Kh(ZjNn)xmJtmC^r`rIk=53W}~MRom}YSEEW2w5G{lsupghHyG$!le$-4b$i}RlIUzK&*Kl#<^k47 zs1m(m(Ig6~CRGyiVjUsY{eUR88#d}?%EEuV`ejx>zUzHTCH2xKX=9@tF)EAv1TE*d z>7lfuyyn>1)fWhTqmcHf)Y|A2ie#=@zH(Yc{m1Ekt1RXg^>0f8T28Ml>rDQ3y=gQc`>3R=m*YIGt&+wp{CO|pS9qHO|U zo_RuUu0mT@q5Y3K-nB~ua|-pWQgvu_E?6PCi$y_xiJJ&y#}Cc*Tn>0r+vL8uy&m2D zbhe#Z&xX#)S*`rYvNAcP1Mg1eN3gu|tkc;^C}%WtbX@@` zDTe}I=LKxyiKrTCa7=o&YHcIo9^8nf6>5qQwQPO_H35SUugHuBg1sAlhG2F|b0DC! zXe|@H=49D+TayIxkec7py|SN1$Q)^PGL1?LBZ=KikZLc9eejX>qJOG+!6AicB;!Xs zNA-^9WQiPJ5`(Tw&{!nT%OF>Yg(TQq6BfcS>J+@Ei=Nb*WJ+QUKN2l+#{wb2YH>~L zt{}E#a{{ujrNTGg(tFoerun8mgmGUxRk)2B^5beElzd=+!`LED`*5Cq2ab8?SO$NxX1k>7GT@JEtNy78O%@(N=8E zK|6talc^W$~?^k*YiChPCA1F&Xy>sf)5Jd`_y zUu#SiNiLYY9rl0XgDKLuE+>JyCw`ggIrWX#f&F|&GBgh4@6G^TWoSV^?d#z%%s}*g zj6Kia-`&0<1*6e+>o3|jv`$_&N*1^vgVcMUwpZ={qO-3f^1jY z*+;W*I89XO#}u8}@xH;Kv6@af;9!++Lp%5YOanmv(-%z;L9?zG^Y+~oY4Ha`y9-qX ztutqtTWOJpK-K$D2rf$G# zTdL}JQ@<75Dr3X#U{Mt6^rB&lzQ&u>^!?9Y9Rm(MYMd(WW91L#>P0J%FVJ9Gp{Onl z;A#N9JtSE4z=B(Dx_EV%h!59mam%#*F6w_gkt@6@ct3zdcdfoG6+a2di`?870F3vJ z17?Cv?Q@CgiC{T=L1T$ zB1`lj%daM3O*u$ibCT%5=FVEi=hjB_JlVsigl~pMOC{f zJkp0`WEbFx7@h|wOTikd{>H8IwtKx~def|Opld7l8DWsUzcQu=treDJWn|v|jek6m# z3X0^2mklSjW2rhzSXbX-m{Zm(Gst|)wrdIr+}#Vtg9jCmTtyDK5)ojk!5Ig9xTccW z2Zb@9`f+Dvp^_OTksETRq=klb)Fsy@0KYsCnr@>1z~OOtcHZ_qerayz*0Nz86*xGo zY7^b}=CM=Y+Ja!BAAqBV00YR-0s@^eko${RO?%KtY8twRlgWUpZUOYvAh;d-j>xm& zV_PR1ferG?i_{&#+m?oh;InhvhSkmL5QdHqQ}i-Gt%)1V={qLpO-YVZ2;gv2H1jNo zY?8RyB}tCWV~sx9+?{u?;mkrKIenP5el)PPcEThsQ#ZK8#Fn#IOa90y7a>szIZWyy z)d%8DDD}=GbYr!Mv0a1}v`>kwu5(nvR93g-$*o4cQRGa(Sevg$cT~sMw-*(;W?&1W(r4b5P26aIH&;)G-Yy=h8T4kb)5mJ=XcIgUitV0k1(w(* zO$5dU=tS2i6Nm3hYdFF=m0T&*h(A_ABbcqN2{|0-*McxE=@BAPn58bxx87f#J)_8;SFK5q*8&8MiTGG;eui97zD9-Et^|co-bmOsHY$6I zL6i<&xA-9Gk*v8d=07waL(xvzirb7GB^;H6ih;CK?vzk$bZY>r$@XPYkjz~YGo79m7&9sd9YQjAJcT6YU4pknLYs`Qyzu`p5-&M zPmH+)t;Uia>>gIaArvhR&FFcjXC60TPCAxUboS1ho<szSM2IHyA~h(;sDC&>bDGBHNV(08^eLB zy?jgsYZQWJ;2*(}z0y+g8=%|YX0Pygz?R*5ID-B)5#9M&%jKBqOg}BGGc2miYYg1F z^u18^KOYMN<;+U%8Sg2)H-Oiie}7n68qSSkcfeOB?J}mACEy0fy1!Bv`k~?Rbo}7a z!Gzg$xm4dxK#NsGYlw^U+2ekspFElKF3P@6HKuhouC8z>Fe}(bt*$b-#A-^KNwBl5yHLLw&1PGh`Ui`k3vq|| zTnf?}N>bC1Ys$nQ!Sw~}8GvW<6y3lRmG zSXIJf*+b7t@EZo^v8nDL#~l_TwSLy#dr-Ngkt$m({Lb8(-eRNt>$TbuYvV0MwzHP5 zLKlJ7GHne!MvrmjfK~iLRdE1IP0x)Yi+FJlj5ij!8Qn2Dz%e?w+;rZpiLmr?@>p6w zLlnzj+rWBcJO5NW{qAn6`M&JNpzq6$x>bIt(lc0I1vXFheNAtfsrDrmIkZ{`jmpf1 z77hOM8>o~81k?0l=JET@!cD%!R{fz@q$|Q$eQVj2ot!>?h)u85!>E8F#Nl~fVh+tL zq=pJZpY>C;C|J!8)~)SffNkAmlUq5M^S#sHx-{0CL}q%z&n2c-rXSsdH`dF61(J*; zp_-_9}-ukk6xsJyk8{t7ISlsPFd zi;&XfSZM1k{^~2_DUCsvmA*4I77KC4hH}}VBbANun#)e?Ok&O=*d{Sf+%yp&&VNo1 zA8uS4krq;znJAp4fPb9}dMYi4snpae@-7apXfKCV#$_hs|Age&No~@7BZuKvx_;gr zc=r2h^jxX8f?^boJ5muJ$#A%|+yJl{k_MX6$D$*kjqeW0lv`QwLi2-_d-P_ zo?W4OW68{RUbE~(iH4daSC$7;`k6Ka_x+l|TwvQHu~<*Wq^NCDk3L=1Zd!<@=wzB~ z8NqBWOx%oq)uy@sS^j{m0YX+yL+^X+#5uu0KV?rpCjSse144scUxtXs7!4P)mEhrP z^Q~IfB=_Do&#In4C-h0a;~?ND`$#CG9UO#K+_Ky$fG5;BDK~QSTi6SJE-4?*4nEon z{xR=N*&@0T;?H5aHYMYi-Q(xOOC-Iyj~~Z}A%EVY2_FH{{9QR+&v8w|8R`-g7YWzM z@m2vmu$Y-&gSoTyLiZuY@@1@iL^|O9+2KJ9R9t($%A?D~O+>7w6DF1c$DMrKga(Jq z{=gs>Lr8*=(+e`wOg36#5-pQ+vf-f@d8r;ae6dWQzinCXUvCXcAmHV4?So)Io%ip! z(?5&p|1-p^|Dr_ygFF4RGk}5iU&X7xRl9%TPXCa;{@>hbLRsS5loP(|PURdQY$O?v z6Wrf4USh6@A*%z+qNuVD3qGuAWk=w*>5_8sS0_|#)3YQ^R^-VIyeehahw~F~e>Dzp zxR1meq?d57Y#+&87qjzsGcq`4LP7sgygcAIsV4sqt%Sh&OEZ|~K5!juolKoR8|_QE z=Yh9-46i0$yDc4@EC3hTqfNC4jXmGJ;{KT4q^G@Ajn3phWEC_q#E)zUiDuXY-l8B& zk2^J!+jHlhXf}umy=TjcEJhtUKEV&wn^R}fz5eou+>M@7SVAee2Vwr-t;p(7rS(Lu zc$y=h?h@veN%anh?o_Mbi*geyd{KibH72tF7g z6{B_6^3K}wJk6ZfF{-^+aUuY6jf_2|pc%3$Yj`?Cd%Y@Qbp4ao7*jCjndWl z>ZQO_?)NY*59QG}DZ=?4J_WrP=ur!|A%=(5=@BjxH(~yaZH2|ksKd=Q^#c_^Mu?o> zv|2X+-Xwbal^!J)@QOrC(DXGk-b+Mt;vlMxtWyCy%+1!13MExsJcIR#<4>;!l|E;y z`U`PucZgRiD)oXn-G~(CUMZ3?!IWD#5v(y(sapLDS}Uk`G>>BGBU97V#W#JLDXP}B zt1OAk=}a~n1nOS2YPmPZx-RQXJG^n|?rcyk6XoDz7;u1Nz+aRk8m|(THT_C_EyS4h zT)3Wg0coNr+#cG&B?jU0Qs?@JH4|VrF$(z*Jh^}z%O)R`6Y9iFZGC_3@NkvKxfO@8 z0k_EIDgWXqQs&rk88LcGzb`rR8KPU|0RdO%akNRD>g&h^U2#-9>>|ncwsj!dpuVYy zzE6s8x_tUcw=A(8xew3MA2ESMg^kl75w^3hM&){9BIP-W!=L9*2>oDA*n~&%ndu{B z3aaK0s4mqy(4TXGi(92Emv1-YZ)j_2_!|E%GXAsX@;@aq{uS{4M`ZkG0Vx{`+y7DZ z>Hf~9{T&$T{*wCt7pne*x>d|t3&Lktw?8;+3(mF?*(uj&qIR{AI&#ZBG*-9}_b_wk zVwN_R*rpcn#|?IuD3<)Kdz_3|o%Zcc?42zu7VL>ug7bYhj zIjNq0Zt6_vP-GBMC|Qh{lqMNT(s=-+CuI+f2PM7a^Htq3~=TH@N zRq*S@CBv>UNbWn=O&_$tpy}fWLL%})os3J#|2ZRn#-Go7fBShi*+$)vfIVh;dc zzg&FcbB4V}d&1{zvx4%HsL&=hmCN-1*vsUd@wvtH4~&&w2-*0}#y9AC)Er#2Ry?Y1 zCV!hxOk(3q=mm&iL<5PXk>js)ak+5NF<1|BtznId-y^>c_?d>tXp>I^ zNZS8GJK9-xR#v^47pkQJTfg_Tv}!dCE~Qs}pKp{o&|ap~4z5Zy|9EjUZ`X?pRWsG< zIpcKRz@{>jC_@rrN_<#XciUH!aLke)>d6@zm^t{Ig&r7Ft7UwWz~Z_PBST%u_^}Pe8u+xKNTYp}Q}`cq`IhPg z6Li9m1bxVIIPS-*=_OeV7pW+5%t?bSG_P$9>^zbo$XF6)sC>)aA#Ox$Fm5C<;oqa+ zTSIk$d}kH2Y(dt~0E!2_z)2-z4Q+49S1=0*)1zmRw8=d&jWF8@s;W+)^YuU+9%1S8 zsfsDJW|?;kK3m5JE|Q3C83D6hu>j$cubb_Yy!5*&Jo;-d*$mdyk+>WvX)c_j2nTJ} zkP7cj5(UzrT{8IcMm{Z((N7;1kUF0fSm9J3#yV+} zw_GDtyZ{5IpogxeT+9xcbE|Ped69f+r3e8$Q@F7gi<1PfyvRz!#?}sY5nV#1nB`kh zbOgaN%kHn@)YO(^;t*!-XBm=Si$HQi?q14+JHnVq*q53S85LGvywM5dXa|m}?3gRv zTBnj{he>Y4@YJKxIRGC5Pibima6_JRgz%wIK{hgO6Tv#mW@xH3PT{znwO(S?e{bT_ zQ$!`IKMt@ZeWkqaJv*;1p1O0sw;MOY+mf#q#Kk#ejBn0k9qlInY{@9-N(JGw-c%7# z0BZ7m(}IsusfcQo0%44IigG%)X`30wHABo-es0ox`>P(p}yVk{tC3qCMI!1&_ ztsp9zxli0Dw~>1j18OeEoN7)&L{)m(zf^w=R$Gkfa0n&1YRm&CX?Cu5qUb0@bsq(9 zt@exO(nYIPskK2kJEl;a+G!$|5rtv_V))O`S{*6TnEmw9lFG`ly|7%1-NF(X6mzAf zC8L(O#{*QR%{)F*!vJLIqlh#MavLKk=TZ47>Da4gL(NSTIgBPJ-yM4(4?mgT8MonB zzvBRySf$42lk+=0;ld7ke{sik;AE zFB)G5ZM#JoVDZHTxuv&b5l^CBvp5Lpc@?c~M_*zX%$xU?5yCmQ56<-1tSX3$)Xwak zu(Tju9(_Ak{o`lGvCeTgJ3TI69r#8Ij@KAe5mBo>0`MKKpl}iOqzjPiuEw`qKYuaDM2O0 z25G-VH($T**@Q5~wO7M5ipAe2q{*!F-h+oXzxpDOa;=Nz9W__^EchV(K`a zvlE+`#jwIMocwwiXM(EZlF94xtXhCmzwD9~bP&B`y}NqE*GWNL;W9pFp<&F{7=aXu zX%{+}O!}$~Eu>Z|pkj=ya9Bv+ROyTKq=-UH1SH7i`j&XmLQXVFX<(~#IM;Hza?NeP zh`R+ZW#npYWdtU`-9$gECTWsbR4lE|qq@H&eLlcz8^OHQKS6I-$}_v6VBft5b|| zjNuJ%wLi1zH7etZ-x+^5mcxg7Y4WZoz{E0_nwrby9g7Q<|Sr+x-&;ldkq}7kqz35HS<@OCkwV%cKg{hm4Vg zMCp|}<^Y-kXBD==TMphyAR0aCyv!nrXN}gp0*9jij-%%B+#=em7nmZETTP^qke3w? zuCFkcMEOu1*X(a+CwCoLk?e=`u{NbD@iQRw-QdhZ@IO{qI=PndK33fliDD&tJZlQ6~ljBPlo#^O*XL2IpALhb6rgDhxN68e7ijoGm-`TfEl-=vP`Q zCblI$y`l&WOEI?j&h0=rHG8*4QLZ?3oa90r@5?mhn{z9$U-72nr4;vBSH{~8tU z)}<$+?|?DfJa554A9AJ#-xH11E%R}R{le2JF#TO~?D^y~H@i&#Z;&tD--EjTBlOgN zAlm;M`ThgX{-dCkk(Kdp==*mv_Kv;~wYU%g%7#;#5UhU8iaH|m)uA9DQz0%V>Xn>tNSlNUy3N z;}p(olBw}S2dI&gW-OjEK!O!Jm*xgeZz65RD^+*k$eRjo^^O$kLdQvEAG%Y}I~3_Y zZ!Puqz=!6|e&%t&YfQPwdjst%0&K3y2(IFHA#n=jQN;4S!$L~-sh7^A*+R<6D0*Je zPO`F$gL`|1h`LitiZyfcm+}k_l~=BinA`A7x;rVBH&yNRTzlZumMJ?h9BB=EJtgeE z=VmB%2e=1%r&%+n=YuL@Gc~krta~8u9c^D4Bo3W9y1ItT9Ga7tE}o43g}5m)4sR&Y zU@x*qm|rIGui>CDW`f_&2e^Zo=juJyvswC?ao)0X5q9)-&}C{msG6*$Z(*dj{;5B4 z{1utdFX!84DW`b1dI0D8%=K3z<(xb!GK?oWZccK+4C&FWm*>hkFsd)n^#!qjQN@V( z)sgwxAQ#w+HH<--aAft_%8&q0gt%?&;1fPwKni_?4{-SpRJNzOs*Cw({VhoX6DK1~ z@Sa&#Yv0=3>U7cJ;ehYK!(@W=c!AEdAo(*QyMe)rBRfEP;|PEA^zOU(pJ3!Opo3Pw zPlJsMognA))HBZhConPnT>)Y@jspD>%82BqpuBC&aHe!q!^$vA=Xc zrpwQ&nn8!o(t9A(dw6`(+Hlmr`^h)NN&j#F)KpsSeo}SG+*xC>99|hAZvARBW=?!# zmUj0M*V?qn!X|JLeK62AoU+0wg=)`6O0ZqO!4m0GFS2}J9^Xi#H|O)@$~jzaqR19j zh6|BR*l|jxkLvc&euXnt!w#Wr<10cHzpuDTU7sbwPde9p6pg2Ha;aV*w-i!GCgo;g z+6qAx!ZxKeoGCVCr)f9)^Wr+1K1U`~vL>4&GSjdNY_UONYTKiW19()7_d|639F_-L zw&IA)cCzA#wauCtx^y`3lxepbPVOO3-@*6Uzkh`2td%Fy<@T+&uEoMsq2@)fthkGz zATw}2MsU(>{;yrPaM+`(e%_RwD+Mdu_j=-z9dH{zq_3e}Jt}>5RnKSLSL(r1v8y{> zT#Nw+Vv0x~+DvgVIoOl7{=)n`eCeYT<}w%+lWgryb3|r6nkd*i-i<6vyBCd(7na`| znZIZ?7#3R$m~ON<&1|&Vc=sd#&b~Py>RLD974dU0<{g?bV#vj=ks24t6x*a6w3TY720{@X$PO> zxAP0*T6fuHQ8hL3iRt0|wOhA&4U7gu3j-~lxi?8ZR-Y*M=cTFKBZ~}2)Sos<|8U5p zZH<6in2jEjhzGks-x2t43toQ_fag$fU1mvz6EvbjZs9MzhVyVL0gFLp7sjv1MXAm# zj}SK;azGy|%IiAHc@gZc@}J&Bg5h5GyS3yk4xNF^R~x=`+?_vwK3$qfjqdXV4kWW1qI9rUq{JKrB^)R+Dqdghe=u;jW5>4wY(wS}aU z=gU%>!v@NWu6e0ge=j7(7$qIc_TXw5fU3oF@pJ}*I!f+(l|@=LC(lINgz~YIbV$4_ zOliHRhJb0_@?z`04ISY95_JrYMdSzZ3M^kH9H&8qpC+u)4E(#imD4UlbI$8a<*eJ) zL}l=JK^;}>%1*-g0%MX=Y(wg%k}KiT;`lxUOJlccIyBZ1Z&60@y^#o)6~@oc$uA_S_G6rL~dZhP@X#N?3|UG%_*NIe81T z+z-07u+15IayUOi@OekbEHI~6_&6EEz*KM$^$qJoMr6rq`w+(^YkN&%4h1s|?MqE* zmZ7)SUG>Lk^zR=X)!EwgE^2NLz|>r^a!GK)ou_Edq`D8rN*skKns0AI{K|<&?{C5HF4jCXK zAf1T#{s*R5ZFjuotI97ifHqQvqN3ELHLVeLW36)+9O0o7(Gkbyfn=)ZjIq7pL?Q)j z;*Ms{D+~oEQ63qjT3X`#kyCTJU_6wekgGxo`B`f6k+R}?eF=ri$lQ(;ex5b?`T9!s zjT*D+iH;deMDREXjWVz1wXv7j@So+}IRJzQ4Yfb3tZ)_S@q{KP?>@DpiW%-i=F}F> z0hiVI(WY)41o0k0YBICcY$BXO0TsO95>Tv zr(`$tV!VBUr;B%nMWmq|UKP9=hh6nG&aBoHVkVS?f&*SXHlndhj!YW~Xa_@BnSi7ZieZXt(tl*S zqm=Pj;-S?iI>si?;)zNuL^D?^=};Mvr$&V&qO_BXfzp!?KUdMD+RODkDp(sgbSe+R zlPfE8aKCabz_}J&){<2Yx{Noe(pmQJ5M3K5pd$lr!J1fu&L_BtdY4D-*L(7{!kj%y z71AIdP7Pss*di9j7JA^^h$241Ndvv43V#rTwRXmF;k3=r-PmCj1oFNzJ-=i=S7smj zlIF|F;3UppAub4&cl^Q$Px4eP(r{KD>k*(Sb?;_An0(|f))yaVX`qw0YRoGF-=93h zZhv<*)2eyhm_2mhSW_FoAz zOzUqIw^Ya#oXp3WyCGSJ`F3NPy$DL7(z`XhXHoSy;I~29 zE{r{q_5zX;7?H(1@DCPjD4@oHe9uXWkev$R((DnYP9^oa5po;3z7K zMynoiZpuz^?sE(*DHOB|@91KjCKho9=Y8Hogdy(7&O}$Sg6wr4Mb$fQDZ4aYchDp; zWTM5q$4>%o&ld#Aj6y(ZF410Kn$LJ+j6ikMQs_i}n2vdic-6S_XPn*1zfD--^(`(8GVoD*p?~SY0A!of)y~sT$870}TDUIJ;zg zB*N9Db6DTt9FGm!bK0@I81$YZe(>@AjVe5`Kc#@1{YTM&jL_nczEUmOVKs~p$Y-#4C*S_{n23u{&7x5 zF%4e50LZJ?T5MX++wafjmvh^CpzC+S8^U9wyQiUvtxtRe;$u6Wv{a;VBk9}#K}ZMX z<1ch~&fmo@xT{U*ZOLq0a#-0lg7fw~X*6E6-jwK)Zc5Yh=p zY$Ste9V+p5-t4>fEqKPyxkb8q8ENp+C;%CJs@=fT0z$&_;6)EhN~dvN!O3l{ zd4c*kq+%EQEDTQ%8b|uk9Qf2k)g#0YqpUKVEfX5~vqJN3`B=4RCYdHp+iU?$-zYVhmp;_Y5a0t=DapPrR3hw<=~#ZCa}^l14M?QieRinFlMHMOA*QKWD3Pl zx(3_hinwr86;U?OrmQIH+DDjc}qPR2f-yb3#2eoIMfV-2|#aXMgjfR*eKMnW=;O zXL+B>OqO(x>~tJJE(jOS)ad*!cAVnH#3*^L_Iv2jJL}7Viq$jFTS+f(yHL&b=o@Zg zLEZh+btaqGs@SGn<5hx;WV%;d;f1GLN6^>U`N2q&TNAE?wUTk#Bl)A+g?(XSc&0k< zOvx79pt)rd*!4$uMSn&)ax22@Q49wxJ(~$vVQ?r`AZdl?O3e*R)KeT=6_;^WcMd}~ z740>v==_N4ZxyAr&K>9j^{HNSd`#=emP;V}%x#h(C5T^winxukFP#}5gQ=%yp|dT7 zhq1d@;PO-^N){R<3nPU8vV`4sOwYQQzTRW9&Db5 z_BGci&g(}x4Sw%|ZrhLmmocIiW)HM4={~%u3a_+@`hDdkEZ0@F^4!bAy(Sa7S3k|k ze(!w`y8(zI`v|Cc^Y|DA<&>_+*#PI1qwUmHmYzrV-D;n395aRqHW9HPiVv!H`gQVo}RIWvL|-2N*G7NsP{EN#|N3ZaeRxr{%kvAw6B%k z)}uw)%=d)=hp`}mWZRBb8PnEdXjSrxtH6P_K`jw zb#O5;5B*$=R0d!8gCeaW3zN#_gSp>zRnqLWtWr*bod$%MqMs;R+Y<2I)7sx*^=wac~$Z5w9yHv!){$;ac+9ia5F&qOZg)5+<%4 zww(n0ZIcte-GX|wDF-9h7hqKAa$9i1vXdy0(M|E;LC;Y&MSBY^Efqi^`~XRLqy zsoojZDDj_mjl|y`48dVyI`(OhE75cV>i9loXk0-DRA6(UX{vl#o zTF4rR#F&rOYuoYz>;}uzxzIOM%1at ze15*)KfbT?DsvBW&vmYI-S2CApZi?;5cX*6`cO?>IYrskU+$=GeD^5w=$wYmWaoR9 zVsC~1a=_hed!Bwh{nn+#C9~cCvb(j)dbXM8#~7Q3&DAkUd&}?_%KcHc)-Qrr=6AoY@uP0N z|9I&lcdb)}YtFyKm6_)~q{)BI&zoPrsy$`t9`V0?wr*Ce`b4{2fb-rmuxIPS#G!wb z-7N*{mzTdvuRDFYHMcQA+gE#MR-z+=Z+Mav?S%G;g9vha_!Zdu!2iAS?~Xq z;1b4+KLwX;<{_T&_{Ew!~kKhtN-lwA+(6K0#T;dXuP?3bpoA#1=z4YQ!BIPY>lM) zhv?5k;*tsrx5*H12uL12zrgeOS-;KGtX7`0>h|bY`{LDk zYmIk^dmdOlWVx~Y>CMUQ%T9Sre(>(eO5?fA$hBVu96APiTTI>^kA1DzEcuuIoaFv0 z_s!Qnt-g9|>g7`{+x3?Ox+ieOrv&VNDxUrK4n@mJ8#4<{{#v-@`ZVQ50^BuEbk;?z zk$y?><%#^Ve)GDQH+#PrrzmTi(?_Bv zE7r*1Rd2j?@AbQ-SH!N(`upDgf*lQS#drCcm`w&Bw14_B*R#@#T=KP>&=vec&L(ir#PDM#?t$&-Vx zJXwBb_mw+aW?7di{3W#b+d-dwcLyEjo^0l|iuluQnx~)eGv`8kw?iPDJ2f?Ftebac>%mKTmp3z#H z@Z@FHnd@>#rBpw!JJ#UsjXxibH-0^bLYwiH(8p7EprB{ZJ=KrRH=52KT<|W3vcdKC zpnBq~9ju=l0j)OV$o)8otE9V2|T6;l8(-Mq2uY6Y;*N_rEfD~$70;$){7c8 zo>HD4((h>R_-Z*dP`%nTxlAOtgkGE2hO0gD+~Q1PS{(5BEA$h?b~!pfq!d`3N~-m+ zFLmi*G$IF5ja=zX$lxaD$ z+uErlG$ba!>R{!S;PYySO=pQyr+V`pB;Hzd{bFX}JnPP!PtA7J-fIfR3ZkW^B_E!( z5R_lO zHvdNB1Bu=7_U2{J%~y1F-ri!>tYo_U^X8=a2gLTjeST71`jbmd3vrKwWuO52yB`RDly&%Ez$+n> zEMcYN2UHdAC3V;H%#pejQ)hA~@@5-fl8x8$`42;1NOtC!Tl1JXl?Dq0&3s7t==yJv ziNq^vPkg&ZNP|_KHA4R}o-JT}gY?Y(-fh1JpXB)K62o1JHysG8OP2}QyydU9$#pko zZ=Cl@<|yM+UeKdEpWhuz^vLr2x+1h_DKJ3U*`HqBR+{0op`u=L?W3Iol0A}t<%NDr zIMk~8&8GK7l;eB5WvzlAeY8P1aJ-h6@75{OQ50L2{6YR*^6lA&l|Iqcrdc{Qb#~5n zHnCYDU4PPXFtCBO&eV+#cJj!G(mD#5;DuF5bz~8=7kwd`2@K9kex3 zG_jvlZ8f7Z=ZtN1_4H?pg_@3r%sfUapZTykCAw*^(%|NqF?vrfZwzYJCY1|Z7uxXd zbk^RuJ>e$RZ6YP&Ng3s_mA+yPn;jwo_xBZcm-A3QZ+bg5_M7e3$o|q2tBedjFCj1d z>^6&xnrE3^+yvZ*Yb#W7(i@k(51*T;N7KpB7M9-FMr%n}u};sjYTkp_8>c2a-A<-& zOuBT^|2yBA1mjzq7gR7Fz%*uq06jA(d+-Il2pw9SQ_qn==;q@--oXm zJi9t`x%EteCxvT*HKv`yUy7+Rn$`rKNOaQK&>`!|RUsw4QX@}a53v<NtbecKeG*QTJVg`Qi8v$t9gH2J?IpPg09LJYJ$$yCmA=pj&;ckhOb+P6}_+twf~PqFGx@_HhMuq63CpuN#TBM z1&04o6BH2BvOi@cAhyNu^a%^|*dIR`AOCXC*_ZycgP ztHwzJt45`PR*j4&Mw)Q~$S9OBYD6{+s3vd-WzeXJQX~PkG|;G#@x(}jfo9`VHTZfQF!f*XgNT7he^NC9 z)nqBQSCkZ$k_0C!&Vg41(2i}@L=K^h&fMx{Xj1db<0 z8VoqYQZ?esM`JaaKoFG#V*F~=7?AYeswSge5jY|uc;Y4*AUF(2#uZi*;W=QrMG}Wt z230LCE+IfhrGctO#uFnA2Aqvc)p+R6uwp$D1|N3C+#&%uTLeIe9Joai zJO@mx<`BzZ215W52pN?I27AbOVx+-Oo^pxP)~uX#=*3l2%s9rfmbB|E?FdV2xTN3SrjnX$fz(RJZm^H zvS47@xD*XMmncaBqy9n0z@z_EG)W3g6{RG>tRScs=fEeDf0rtfIYctVCrS_m*wP?A z5sW8D8VoSQR5jvvMgcWRiXckD3O^(;0O`L~ErF(r65^ubAkss?3CupONDl~ zIgXGFs+s_NIxrz*g+Wy#V+fW1|E0kIGfY(@j%T#0C2+ujU|2P<0*=lPfe#WHb&A0K zkU&+BB*B4G1gqdTs^$>M5T^(tJGL~4Q-tG*kp=_I#-(Z;P>wh_$zPnJ1O_Diw^fr+ zrzj2(8nhrtWDcC7#P3o?2@bIg0TAFPNT@UjfWYy@NP_`qSgJ;{t}*cknS`B{1N{CU zteS|XieL$oKn4WJa=BVa_;p#I6x`LVDXhq^^j)e#38B7sC^+>S^RaoJc_%^{XSRpUW?NJ6E7 zsz$~WBMk-fDQ33*N<22=xt;nRAt4WB!PGQHaP=oqSnz=pAdVv2;6Zz5 zf~3I!GfYh*sqd)xgI&-48L3HN@pI&fSV)cXTX2$iQK)GS=q)6$2C&g%)aF&=Mh{pM z2C*jMHV~kO{kxzVh|8H#BSAG`glq#k@F2@3 zazJkZS;z0JnnNf<@B^GFTbdE8o)~E`&}>|)h6EHWUK0s~B%I?10j0MPKvD)NfCMo6 zc!O#Zi;4VePz{o6&P0K!A`$eq*wVmM5gAX2G-GZH`vcqe7pn$whA8wHzd-c}ftwQm zA)xdYJXpGtp!ZGSfZjqvS>(S02#EPPy6VuXA=QE{4YX=xJTcN>z!|1hBa3ttR^y0d zQ8K8@{HkgUNcxl4N4z3P$Pg>WgD#gOs2veFptq1%^jHk5#&d{e2v&m*J6jqgsD|T- zkp=_KuvCo{BS&L3Y;yu?42G&PAnCtVJwmo2h)RJ*A%O#W3uv_d2CG3alw+&Lfl?)5 z4A};ZCq^0!IKxymayp}|nhdIpm=OpTEB?P#jnZ52M9@P6)hYr9^cL71!w&X9ql!aS z6GbIK)dbwIfJPwbcw(f%fU|L_8VB+zDXgrVfB{MWt!g&g2F4?RL_*+z-$G(B2{8bK zQ#w6#ixME$C5&R*AmfRV1_RD8RgGBAD61wR#D0uqk$?e7|E+3RPy-GL4^9%cUiIU*kN9Z=_cw(f%fU|L_8WM6b<7$Lb&Vj0t2n0XEw*lQQ zu!1?D+mKlFHVpg#l~@j;8Z@^+DUdA;lEHxS1WAJtnPF-gS)-%ya5G-A{s z7f0{|M*@CGf+zrX8$-t9q1%vq~71c+>DpsJDa#7KjIX5&)zZ<9rY zQO<#?Sw_vK+khwwk0XPVcwmjt z{(eao5k@)3szwPeIKTn~T|IEJ=miH3lU8XRL=u2`)G(aBm*S%kdl#Tu3A&yTY<+jOgl5q9Cey)FR-*(LJorfj+$cN;1Q!x=TL6|-bIPYj00hLU zPzo62Bh@B2o)~Gymn;&Ie#ZDzjR8r2QZ*|AK?yE62}w~h#A*%*E+kgZ6T_-G<Is9H-(fOF-*DI&K8 zU}>6DK0VCJA*%}5H3}c-cw(d(U#dv_Mbmg30Tin-3LprjoMTO+^cFm5;eq>Kz{zsZ zSY-7qFyMnzK0OPm2?DrLWE*i%JDVVB#+NG+K~M*hgwgQ_4D~>e^@~v>lyZ($%_iG` zTQej<3WVc;-a-PoC3XVCDW4vyngFsMc!v+$DI(*Ekp=_JF!AFTRf7sD5vziVP|7(_ zH4YfExBx83B6U63+XHnyc;hJ?k1H=n?hC*~5RB;RPY#;p6@jit(`|qh6C({4r+!?z zCW3TM0{<)DmxOT2IoCBxalzvN3lMZ=ahwotkdwgDHK&YvMAsm6#El}{!27Q!NE(dL zY+Sm=gVrLJrZFJtPnLvQHG6X#@KXY0FgQ*qF057@23T`Ss7Evn%m)NkBM1UEfte_2 z#+NMq3f4Fr=)r*Mt}?^4m~S&>T&O+#&`}7K9J=bZmbS* z?dp-BWmPikGl#t%_O~6`RLqE}JgINr*%j{68{j(7VmP>jCzILxy~Aw2>rk#flPNLW zVNsTqAv?qzq=misPB}9*u^HGQ+pi&jt>D&`V- zXJEggBXcl>;XK%4Yi=Pge}3S5Vy%b<|NDU`G3K0nemUo}`e}8I^M}6=>oW?>ZCyXN zcF8w0^k2D3@Ryei_joWY-5Gr=B&Z!aUR~~)E*2GO{qhW>LEA3MU|4FVu#xkjVK-N6 z%U%r;{=wQTS4kIZcZywKeY-xRx_f?zER&wp?&83xZjA3}F8E?sZfs8L*lwHOTUuru z*;5-Y(bOSTPH{h@RI4^UPbw1Liq(t!l}u_2=O+>%7gBS1IQX z(>FhB6WDLN;OVBB#k^BZC%-zl`PtHiPgm`S!d*d+#jn<$SDTtT^9&GAa{H+(RSST4 zd!~i~@l@flV2zaJ%(RN@Vnus`c`%A(Y1^5-m}KOUFZ}@Il^e6UGzK5qhD-V z>4|T1oxOlYcmG~{w%y!CDzCq;V<27Dsf(-9WpE(NO~PW>&at2}bFilfsQS>9y!lC# z_KZx%0KcB|Ad_yK+1u1=n>1s%uev+GGJUXz?j_G>;Uc$C31;pll1s` zsKsD;>i##PKC$jbOJc9D^4a|sOtXesn_znNW_+$Y*Ij+*j-|W#c1o4Wiuq)_4A67YEC!!urr8BGxR>bh55{xFXjlw%XE%qrWoFnpI}ClV>254>?P_DRzH&`tbcPIn zuXig+a+6PU>@A>2mXJ)O^$N@=yBirZ>~$QIPRiv~Bt|Jzh^6v>Z`Ybpw5{p$lV~m5 zh&@gFo|tQiQQwxUIB%ibMqFrG+0FjV0q`4dqg&v(W<-A-XKrvnBKB#({$gF>W>Ki1 zgRh}>E(vcuurKZ@&<*}AJmPK|LEQuiZ$fk<^%l{MGNPNc2jCHks^#R*YI%*HjZ9^q zmRR|~%+bSrAkq!r+^}G<+%qfbW4o_Hvb>MZo-|{Ml|3JoSFEKe-Y_{#g5e4 zhXS~Eh+H-u{3~3+((JH6f@HMFoO`0HlF7Im{{Mqf1bd%(lHD2jJTt8V{@5ns)9{Gb zBvwYKb(c3dJ*ck>$g$!8hPDF7YRmf5yoCM1-aWo0so)2DVo?Ko^|Jd|x>tS}tP&rr zk`=5{5Uf%gtkM;%G9^T1afpgwhzcP@Wm|~Ko)8to5Ebi?d&wFf%7u=%EhhHP@*kX< z>wLamZp+Va2d1uhU)#Q~aeaKdjlaRsr?#4HB?{?|e#6g1T^OsR^$0DQ=6z*+8U3kA z`~b_^8Z6{9?0b9q&pwy0KS`;{sFcq)*098FFl#>e!X~tao)Wn`yfCQg_CTMIpv^-E z73U%Eo6=ACG_{e1_Y)|w7T!;wgqS2W%7>c3o;_6VSHS-tFQt+;+yNH#M9Tzgsz2ge zvf^W4hTM0yro;b%d7Em@wpj=#WMBT}M_C83Y={c#2r3|!4N+k=6`}$>_6T3VP~tDT z?Rp;D@>V7zH)l!b3FA`1Hj(xcT@RHK7sq_1$8|h+qC*sAoVrqNfv4%mYNa~ zVTF_=$#95-5YypegqSY%4iAs)&OSHQg#A8h!ql}sMqJc5ccaqmxFxZ|3c@>AqKkT8 z+#KXUmb3`$}%!!Edk*lYX)mS=n%HCnTkTwcX?6=D;=b+811v zicU?=O&@DAx0EY&WjcDSYiy-kEoB_M>0_qTq|blhaE)kg_ z7xYzvuPai!I>t3h*2~7QT%H2JL4=x+Tl2Ohs$9&GsVu4Ya0^6)-r9fs3q6|FcX!NI zYr5yKLwBl`*s5f%`{mR)8PEBK7Gh6Kfj^af>=^`qOD9J_m_=M>oHyb!FQ6`yt=_nk z1_#Ko!U6kzbcLy+sD{@YB%7}i9E-p|c^ZJ0KYNdkduGoGCZinEi5@(80*zEfh&%lZcx&9toc3MX5~Zyg#T zjJ(tkdFJ;n3awT?W6-tj7_JW2+4ohEE>_WD)<{n|<3z6apQ9g@%HOY=Q^LD?&3x*N zy5_aFZfR3f>y-ObZa(@FDy>F>hq6u3QzfbJ=z{KbLPa+J^3^>`Q7`pQyU`?l!pmw; zROmsq1b-7!kvMW3i^$aq2tTu@HMC4EA)raT=txACR#>?Do}f^F)&V}<@GwxTWR~-- zcJR6pzE*a=?cF3D^<%obCh#B>jh@ctE;3!g=;C z?SR~R{nS)tKA-tHCDSc{{(g7f4(7dUrNV<(WNgXsZc45T`0~iXd;q>f%TQ*Cx^K^1 zs<3@uEjNIuzE^aDN0C(Q#sP2#MhJwVOm z$vlMy_U4m%JHh&d16G8&hAMy_7%?V$!LVXX@ZlN2(Sa`o?sEF6U2x8FYV#^&z{Uczpdf%>uaeKDPv1h$WiU)ExZ0ufOj}lg@v#to&v=G0oY1QC)L2K2g*I}V-PAsZ~Z=!7YySwp_S)!`ex)p$U| z;stMjjI5lOT5!5=LZs5W+8601XF8bX?(M}uaxu?498f!yy_aIh8e=^v2S#nTV>|IGv3Twt= zboL@YlJq6lYL6N`G^198M>95q6`mk?<;$k&Zg(rPyTCamLDQ+T~s95vH{Za#(=T z-CAYG@S(lP$&^+(aN&NSlB3=pt0d7k*@vI#wsgycOy5?EL&BL#=C>}}5SP56@1eH* z!`}xOt<`SLx%W!u#ZeaO*1xstFgI^*FXqitO73PDl+y1zH*19znifulQB8Wi>Mod? zkdB`BN8AD{j+P1A3G7-*#{n)GsRQQ^3g;((LTp@X)=yE(4J7yYDJo~@W$0{fN^mx5 zIL)htVEK7^=;?9A%D5?xgqiHHd`y@b^lMNKUAHxHDp-FP?jwPw;Ytv}^2~;7amP%S zXq`iiFYQt~HmPdnrOW5|lqRL^=jt-xDHJ1n=Z2-r=Upw}s=XH`Aul$-{zo!rs9Bv``u($&^+eizSeKQK zTvlG>vNjQmPDH>%Il^=`^al3>p_Rn)0Q;D34K47Y6nb4vB95R3bOnizxoH_u@qWWj z6}HG%d=`%Jv88%<9uT$w-vh1XR+E3}ZeSTEaNcBIFymTVIAi>#kr_ELJpU#*S+r0; z_&*L#SqfcNsN?Mb#D<&0dI@-?X1sv=6$+z7_gs6iu6o~_?6wTbaBu~Mezv_jV7^AL zdrnMV&w$|y$NCnod0ih{{G^gr9)U4e`fpptEVksRAwOUS1Cte7-o) z)fsLd;NHtj?^^9iDAoLYa{bA~)8>*+JQZJpwI3$MT&Luu#P-837KAZPR zRym~r^`+d3iq6k2YilvDrpFGZ z+*Sh?mvUE)h3WcS&y_2LLvCv$Aq7d5bs(BJHde9Xh+*LyM{yVI)`-chjU) zIicmz!84j7m$Y`SEYeg(0+X?@rK_D;#3*pq8+OVNb@fg=SRn$ycFif)h1?+dE(--j z0ExQ2dmz9vmaMK+wxMgB16Pav&N>MM4I{%ZBL{+p@Tx&H{LQk7y=ijt5%-GlH|i0w z-X<-NxHp9>u7n;X8w4r)_Q-n9tJfpwv=ZMQ>MAZPOSJIg`dhHQA*%UsuS>_9tI1&GOht*IW-oTK&A%7frH%1gpHn7!^$FL`TZg3*(y=SJ(a?}S4b)ehB!2xFFbTF)dU@36mz;{Jy0(9H6H?=JMZ zs;EQdYicCd$+$W8pANX<6;nCfH;^h3BbSkp-fe0-TUPFTaZbnSQqkbSM5ei}>w6ph z>v~PuDT9;uX}UP&--qF^d`81A82);-OWg+H?-=L?g^3lgY%nMJq{_5lTYR(W`_;sl1l*}XC5=RX8b-*2Y7vTsm6 zJww)Ri1@;x7o=P(G99~^-JlFJ)ZFa;PQBDqn@M}Z)&8|-Dwkkz@tc&JTQm3Dl4|Zd z?UEy-=eZO)Pht_VXmt_z4Y+t$+`vf+@`2^$VYgcBQA)--G@*g3lp8q^N1+p8P4nV1 z5qmdy%swGaC-}CPfqlG_rX29Lqo9mE5m=`lc5vylzXNN@|9PD%%D{EnfvnRGxK3Xq z>$C=4ryi|1#o^PIRa9d^)7J!Qd1CFfkJ%~Ig&K#3?VVnCo6za!hNPJnop@bUkOZrv;jUloF8v#< zELEC$8%e(?A>;7BYrKKjDMvM-|3zQlvVxuhjBbr~I*7}$8M1fsmT%w1yd|?io0&UgY$LGkT!zDu&71;DO`H8 zuAf6vn~8&9Ki3MqbOD%!WPbkEG|hg$+`3_dtVpgeMZlmm8CLM+qk+21+OBey%H7nt zF?u(=n|$GCgo?x@(j2yM9?)c#gD;W_cS)`;3dy$}`yFD)cZt1aWesDa%RdG-SfZ&% z=$qShH*{@9ex65Ni>?3g=@PlSdNQp<`9x>_Is-ag^4O*rV>_}(X^8r28h>+^#BiTJ zv!|zOP(nV9dCIX5X$fVvc9dR_;AhsE3&fjur{<-V9ZR)~Ny@fuuCb)XnHhPy+t|9b z&3O1_My(H}!$rqC94N8V++Ne=@E#cJB+)ycIqji9>RfpoEHm{62x-t?}KagyPafv*y9<#m+rE z`SZg|PIxK>Sig6_WUExwOjLRYi&WCNyP@ND3aVcRZ8Qce#b?DXzo|qy=xyBy>My<@ zwgOLLKPw7UWZ3VhaBjo-JCCmsD(YHv@U5+;tl0fKfm-05m14-8oO|=jxjz3M+j%7Z z@iR06UqaTI9UyXP%-bhCj2q5#_I=1q-awIkDdfWV}uxV#! z?WEhRxMslfjYi|M!+o|!JZ9BQ*v6WL z#74Rj5eH*t)xY)q;*21x7xE1<>qD|Tk0qlO9X_#k5uu`#niVhnQ zSOFIdRgtp9=zt5UV}eTNFEyQqH^#uL_0CK|ex=D->EMOF*xpPXTaxD?3CYwIO2uK8 zNA-QfT~q2>3NB>YcV!uSxeO*a=0@l0C)yO7#BjA&0q()py{Ltl3rZSbmvR;=Qv z>~do_T>Vep%C(7n!pAtCn+xb%6}!7z9pwl@iAFg@RGQnSXs zQUq3T4dYn>zj18Z0dsb~&I3`yQUIU^du|ZlcuZN(&SAy`VC)e*wV)_#Sr1#7WH?oeV~qqo?GnLqH3>cjru7%FM1<>okcsiM(zUuI7WO%i4?F zb>2J=>!@&gpTE|j;i2nLlZZpf)%$+5eS_K76~R^JrFJ~l<}}N<&arK6k}mY~T5ydH zZT1%=G&w0}m~YttLqX&xus;1HfjiJV{;WtMh>COzc0ffI>;Q^X6I=rn8G7?4f5TeB zBSk>gY8z7o1Z5pXXusSrK02`)m|y5kn2&&2*{+;@RmNmWzo{ppldXq-5KhTTo-b)- zp(y#OAe-WN%p)@Sv$mU~1{Z%jjhq;1Yc1t@-QBV1yME8s_xaHhdGZ9$a=v`;^^_Ja z4F|`|?zm&`4XY2i7N*+RDs`Gx&F$y5+X*XRLUpE9B8c+TLvNRZq9-b%Dn`i@lxA3g zd)HBwcgo!|ev3ei3BCh*gQF^M{|*lp+Vhh?L94Sts#4Z8Q+`mKeRmrPVQuh_Sph-@ z_}U*!xB>hccqs78M-IWN>w(V_+Ot(}2ly(@|HT@A%mMx0m|0OdqdV%>(f0L54n@Yl zw024+^S9{eJvC(*IF*W;*WrWT_!`kg>SJ7(-#X}CNtDcBU3XMcz?*Bkl$H7yu zG+GbuYO~fx@BSf`JaSB^k(o?$QrFJH_?rj&Tby2I4t9juw#!%WWjYMfTVLr9w|58R z2X{((hFGh0zsa_CwOM92^!HQ4AdMG2>oRqEh6=2Qrd)K8XHM2c(r(wYAnk?$QOEon zR$J*_u4gF{L1B)KX#(s&VY>w##4U`eQjXPobhRj0rU;II?Ogl5)wl9nSoB5O z0;0-^w}am=X9CJ$H*f-J!?pSH87_kzS*>dPmCilQ^3KJ~Hd?QRi-R1WX!F5pM&GvQ zce(g0%)03*HYw(`;GUK=9b4DH*aLbZ`eDsXE7yBmUzGdpKZ<_=RW{`3k^Xx_X~&m! znk0i->qv(M?N33Y8`Gb{ijMvWt!ODxF#=Q-ky0Y4D(>DvnjNmlGU1YZ$p;PB6Q&hX z_1{ubcwP)yZOlux@m0dvCtY>1A3E)m(<7NFxwFn`2&RU^ow+pa_TknZyVg@SuCw;b z<((PYD9PNbmzG4UX=pB9SQ@j*mLBEET(2Wf36lW@pA$$>!(aJ)9gI3C5+XUQ`rwat z+}iNyklH<uNZfmFi$pMVa0nBOatQ!A=J%JMeMV9;yXiyBE z5a9FVDZap>;J2`Ra>@=<-KN_QsfEWGJgxx*W1mPH?ZwZ!(rz{^el|dyyve1(eb(px zzJjSOL*4DnwxpyPzO^y6@zTa8X&pIzHM;brl^(gplnMgvBv*5rXM4#3>sz4K4E~4B z0-NGM7Sf~H-{^34q&`>{9|#0<^w|k;dgL_--dYc+k3D4)t7Y)VLV2_-6;}9-rNEWw z5r$_UTnGKJqt708vcoP_jOjr9wxLl6E^Jx+A*7+fdd-p+OouGVAm6GMXPT$jcYKF* zueJ#xKFK~dx-R>xc_uABP3BF(*JwE(o9tYgt22XH8y0ygxS}Ts5MIBBNmN#ZgeA%! z18w3A#~Ru|O@Q+WISqd1akjXj^ zVX`6&)FrQ$yqfyT+P|lB+0=aHGWS~Esrl>6sD=wY5{sc z25L#5a6_U+okG9AH>GVgT4~BQ9KFSATQ%rjs|i1Qu0Tp?Q$|yu@h5srbDe?u zzF>>v)@cUE8vCYgW9fk zj4U@=ZPzc)dS{asi(P& zw&Qf@R-HkHljU>9_fXo$o`PD92GPJwriE*-wkxA0JurY^QQMd0K8I={iF&rUVbFwwbzt$uN$En=q_FbefecrhF;P8MI-pT!q0F+%vlETV6m3{&@jy8obJU~|ZyXeiXew|PoEIDvb=e=^)_XNYD)}fE7 zm(uC!ovv3bli~-@F`vgfx?b0qGVGcv%WMtkjmc#6)$5CyzueE4RO@HuY2WcY$@s49e{6oq1X88nAyjD=J98ew&a{F=bwE|Gqk|KS1wY_C?e&5FOZ-FKj_k*YK4)PS%{#>yb zPvS``g~Yd`8qgIVg@q7r*>`^<88R!BDZA!kwm!tncX=sy%N?7A{XDgx!hP7n@rr%Y zVnzXjySH|)s%u}pt$aGOCpVH`&XHP~=F;8K&}(a$et@q*Qm@t`N>`@QxH%+d6O)G$ zVP?^7K=0CcKOp_B)4_T9SxCp!3-d(MkrJ-SApcsOqRtBf^hPP7j}!fKZJ$Q2Z(&1F zi=G}N<8&Q6BNhW#n}B?rcArjdRwRwR=iw(lT7~Zvz;A2MnG9GlyNLe^mu+(y&ee&T~7^fqu4g?)t$GGTH@Cm_dmd9DED9sA6=fM=6NoBmS?oHZT! zPxR8xwD9SG^HZT&Th}e>(=eBGZz;9w47XT}`~F~wg0ud@Cm^v~N+{Ehmf;(DuBfEp ziRpKpowT0XD~$$6+HJ+?{AFisg*^IBt2dObU{(hVe{Z6cBq_yIxBxC^L8O;!imXE~ zqqPKZpGy7bXI7}y8YJ%O$>=$^j*I_o>vGZ1IXA60$!+1HMu*PP)CkYFE`VyD(i8?? zuo%LkJ{k?7>1j);$b0T}1<5DGqA_l==qi5>ZXbyh3(+>5&NAI08Hu?_85sV2RzAXK z3CUBt5U2(IceDp^3FZSmpdbIUVwRuEJAbU50Kq`}2#Ocn{%GK|IX7rAoi;C{f=&$( z9c?K^^M2Ji>LXY8mXTIu%u6dCC|WpNch-QhEQK#7m*SH-Z(UA-LKw~e+)!QQe2a{9 z*`XMD=f1us2I$E$I~b|*8Lr*6T@RbP@`QAbwYAnbm-|#gM!-|~SJ@G%+xosP5_%nl z+&a~Z+&U#gzN&!ShO{2J4JmYH=*+b9zqh8g177BE5xA2;F2iB4!^QDA16SX#I+z^~ zi;lW7$KK1x<7}yI^FDZGZF=HWn|fWwb5qa216J|5B+6_x>>heOl+6L8GJDK=BfFrC z5_fi>#GOq@x8R1!`bP(^p?s9_pFH3&{@=*3_abeWV6x`mX+y)ip|WO=mTEMF(PL5r zCq>K31ZzwR>CxQ83=UbG$qz%vE{eY2r0CR!Tz{z&(t6u`2gmd7?~b%L7w4qwKTYMI zd>Lee7w)hU3|8;HVl)BlH=$z5+ZzDq1-HREt>89r%{}HozmET@O@L-{KP84NY8snC z6@3%wC|-uS1y34gl$wS* z@I;wEJ|xrHx;$8Hlcz<}N4(=9;nYpHVN^EQ!6Lgvdip|Q~l#waW&dwXI zLE>6}Ip_ni?nZ$3BeZtHevB>?f*kubfVu=KKdW@})7=O^kp#vX!pH<*GEAPg#-NLF zkA3&8{>W`vq_5@1^d5ihtT(Zh>EB$B*S2{sX)O>Tl!PQEI+EnO(KT7Q_3f#3KR9+{b?8trX&=bJ zEhfWWwZu7?iPK)f>VMk8r(f7TZw{KE-DyHkL0(v~cqwdCIR2{wvP0P;uvroO3@tWr z;<(|bKo>z{Kg?O%XF(x*FJ1yZ2fPK7)`(o6yjkTwG(LjSMH}_1RaSgE#Q^2Ds-Esa zE(>$~*V8O0w@+U$bD+95fM36|qLa~FQpu<;N*eAg)u{lr@t&`>A#(2e&e8`u7};C8 zTKr0TtU9)UcA+_)TPj9}9-Z1lk4lw4Oh<{u)?elz>)tbPB{Z6G6G?yEJOH}Q$jt+w z+YFilD~k@Y$u~dgw(T}BtHG5c zMV%ivq9E1zKX8%Zr+@`97OVu7t2FS{z_jKs1c@bh3$4PiX|m&SAS1$of*SU0`Lg#t zxfYpa`cHQ@Qtf&!SlD5*hL-&xa?75|ww?_ZA?BA~#4KL#5=3%#_+H(eq^;u}!|QAK z^!}$8b~*XQ^746d^8%Y&l*&5|s_94iEvr-^_w!UJ!u_0)$7-e6W8Cd9*6#(eY4I$- zm++4~2;uU+c{>3L=4F1?Yp@8Uvwrl8S%nDJZB1t3iGk_GZ018uNU92}>lnYk0&P{T zE~=FP)Ccxt5Js1~z^z0D;`e0&Z#n&4N+I+sZflv$;(_h@4}Ip#@srzvXT3NLa$|vHvLEw8jq(r>)k=aYO=W zeh@%|8k@NfB%GqRoIs9<`J;mp2uCDHs~KtU9o&%sJTQx6&8}3Ahlw|$E^rT!5PA;~ zpyBNxvBJ_6vTcM;-berI=YkWpL;RuuXTdi<(jhk8!Ktj`1Vi;(bpWWky7dCKojs$v zCp1Pa#xwIeWih-3T_{5&GhmXL7p1xH{qaG-r9HPBA#U=|SaKWk3@MYRAt(0}=Ra8s zI8kX|6`16Yyxtnod}zZ+J7qNIpKr#J#}+gn!?e}%^VYH2G+ve4x_h0DROIk5H#nc$epP1N;#SYr^=(f9mF zndL4yaL*5@;+PJ6j|r*Y-9XF0dr4>fbNzsP`f#c-(43B~lS7Y)b>fTtfU)F%J7(L| zcks>?>Fqbr>|^EmFF)9s^dL|0<+fpP`Oq6dkYHmg4N4=?sRjSr*^SHr!tSxN{&W$> zQ@>8x1aEd}Q->v>=C;$|@}_JGf+Q30Ev(QxKed22+j7zxZ(nNztv8AMi$Hl+NU_!6 z0;BIaAbc71RtLB`4G)C%wr4mqs;2v`0y!bgX!RX20`U_~@#cs>7oH2_t0^ISKn@m&@*UrwSO|5xB z(q$IC4aCQ}HZUem_JjsiFAeECAaM<92)$l=>GeKt)n~=w>+71SiicFo>+3Q;Fd7X) zJNARMN6$=W^fkFw^0}IQCG+cSV#Zm->&i5n^=IERbxirt-1IP+`}A(P^%e*Mr&$05 zhTH?pJAJ3?0=00TMhfbuVM*hI0uXEq*Z&Zv&rN~FjIXzVMUcKil)ASQ7Oy}2R3jNz zBNPY#?pkBXhDfyrmifP;W&WtplzM}Oer96$qtY`Bm69y93AR-S*fMdA7 z8~llW54!(6kpy?%g72g9A$y{OF}jmC*xHlzdvw2PA{qT2bXQ~|vI#QydvxnwBC=C2 z9HXB@wv&Zp^mAbUW90kLeLCT0?yNB?AF_EQ_bXYdsxq{1wUE4tb?B{`B;xO zh3~Vzhs4_37mU&GK^_tbevdp%5&lF!huQ3V29DA5LLQ9*$1MGkkmq-RF=`iZ*FHoZ z)GkOQ^m|adAR*iJgTF`Zf&?BGkNiDq7bIlkbNGAobIA7GV2s)Y3E4y%j?vE{I~~I@ zDj%{PFC3%tAzQ|RF=`hiuq!F@eW+cKkj*#Y?@_%Y8$^OJY8NDAA451sKZicQorKzj zE?mB>MGG$wYa_nd0s>;1M%ETKR)$8_0xUtnTdap`?mA*@1ph$I=;(mlJ_ z+r9tVe(&H;>vHmMz%rx){lOlAep7N9}VxE~l_?n@pkb zmQydMuH^YRiEwVim$<1L>Xt>my1aDA>gc(Ohxw6N*Y3H-xD4_h#cw}cUVBY=UHe|= zgA9}Y&}sJ=vi-)6Z)d&g=xw-nI#&O5qtMe+OBC)txnr9$wf3%pL77GC+(^nd$N4X6 zCM!t^rUpu>D%ai1+U>2K$z{AV?cJ^Z>}82m+ghG2y^*eF`z&1k3Yl5fqKa1(P&jdG zyYgSUlES$7l;SlKS7BwmRV{f zbtX6^MJ3fBz^AU@WqEPfHi?Igry|;}`#Tux?3(8lxUI+adgWsUKjVCpu2ox$W})xqR2) zySn|1vd$RFS__?c^{xXN3KyqMmi%Ys-fMDPbiFp)oX-pRipaAnybWEvcoJ^z)iFC7 zwcYqeSjS2cjmu4f(f&SNc1J7rs|a}M>@@P$F(>ziZID0RI{&g!U>?nE4^Q1dlv?jA z{Y-Jci`g%pD_RY|96CE~;n}FkykT)!wT)96)RxRR+fee%2}dD%&YHDrQtYvX!UxYD z?*HpE&&5~!pI@l0@}H8jYxAvL@Ae7sR_##M8H#I&KPTTLdehWYCQy9-VLu_E!s8;< zUByJ#b;1qKmWsIP>y~YMy{bg%&AO$8A+Es`r2)T9oePrI@bfZD z?Nl1?nr`xB+?2PI=-xV5_q6M@Y?w=MhnrfWw}Jgl?nuw6_RG9a@$7!GYWtIop4Hb~ zbE98ZuD8$9i~0EB;=YS%G6qwZDla`*^*C(XT(_GB#{~YlOFegFf%y>QlM$f8R7O;HjfIdj+aZA*oKQFBs(6^6XPBPX4HUPnPiIxLs8@UM~{OH+XXU zu}X37)+}4=@~``(jukXm^F2zwn-tn_edT$Tpl|6aji3+RyF1^_8P3iq+b@+6)$eJR zZy2d!)rB3I^>JX2x+sC%j{63dB&DiFg8E6w6-B6g{wXEsl&e*gavKQ_PpO3p< zu-bE)b}6o^PG{+n^OMe3m7Lw&^HTESwq-9RF0TGCrIdD$f7O?nQ`i6VpqF3XrSFQl z%a(RIXNO@+>#k~F?HIlOoJIDwQ^n_QZOvYO(dloOBXRZL#CE+AUCT4Y|L=b`H1N3X zo@)DH`}Kb|SZ~mp^_R$od16s}lMmyWO;J0<6tbM^^)pDH-9bg%R+FSRJoxe9y*Yon}Qe4=$0%j_xO5d|B!JWcv0 zGw00}W$M73z1GYB?z8_eO=iYnjY*%)K3r<$mbTlN{nwiMV^6D7?G6`4I6ZId>YMcG z2+=~VtKoy`E6V1IPXj`$ODJb&o>d4LHqbXa6jWC1L`iIjEsC_vz3KKsr2p%;{5N}4 zlx`;0e&+9=S25rs)hwf%A0E=sQ9R2R*q_663;Q_==Vs2FR&JT2m{6xrwG|)W-a=Qd z*j3Z8^VV5~zUA3FANuj7@1(A*uK&25R26Y&tASfYZ7MLec^s*%n2Le zxguiuryqT~y{F?z8tf-Fu8aU;F$6_qf+sYt8Yy<~8SBh*Xg(M^EM0t0K`q z%!Wh~u<4_tr@pafpzyZ5g-?39S)W~eZ~v~~QJ(?VmIfvl(o?Nupc+@p*kDoBYuJ=v zN96K#+a~uCUb@c~@qT&|hNv)t`rB3guuRlyy7a#jtZQcknw}AJpJ+S{=R-4Zk_dqs< zrtAoxDL3ZnrwRSzQ&0I1-Z%&OHa07qa&smIC};{~T_3Q+BbQtTj9}kHF&0R}GwWx^ zz4$O^ZEnp1rJ;Us2Hbbh^q|k$E2~09IE<#3k_5=r&T#WI)6m2dFuc! zT{Sq-JvT7z5vyM%1`9++aK;7OLP!M%Z1nICDxZhk0RO&(QSe#+W1ykH3njRh!Bs7YWA z7;ysp>T5B6xVNxx*I#;AKb%#$91z>e@bkPk{!Z4WUT~#&WZxD--DWh;E z+Eu1wRG!I;h}Wd(RUP!coi3@!W`8B5X+-;gm!=8q0oF1zK!2DL!9Z4md+H`Ta$qTx zqq!RyL<4x_in2vRvI#>?#ObzTB3cGTwjL0cJ(~jw)YO>OjFT8~1!6M+i53ceT7J99 z1X9*V-ztl@ciY-N%7XPeL9t(^jF{s)dpHD6+yGj+T}%!09Laqrn(=-i%1S>cn(^^? z@fb-zbn?d;uKMaCfQD7r4a5#qdV7m2$VL>5EQS@7+x+Hp#!|iZfLXbj_V`>bw*Y|6 zFCIL*EZL$?BhWgcc1EhNdQ>CkfHSYCST1mjRTG$$+JTV&StLTgjakz{W-|p%@a;-B}Tx&8&Ne^LHF7EZ+YPjLO4 zh5sAisv+aFz=YKEra=b)H$zcFTyOBAEjIO^c4l$kQS@YrxWn2jYR+bXyV=&_Ly>VM z;A`R2d~MqLaBa>#;Dvyr`b1nJg~pajL>o4}v2cJ$3<{@5Q$o27R|cjd;|)adrV1?f z9KpW1gd)tLpFX~!*91r72XlL}U{}Nwy!RHiae=y;1#e7?p1GNO6u|;m`r(0EVixr$nj!6KxoZW zy&RrbEum&e7_{QTCOmJ(Oxi44rq%r|oX7&re3uW6DvshsC%b^uM#iiPF8jMXpGcaM zye3RE!$nL-uDYF=6OCVnM0mJUHHH)L%jJYXPM>HdnsRgkHU?^4;s^`U6whI%H(UFQ z4+n=)D5;er%|@U_OdbR1Qgl&9u8G`&bhT`e-X8Z&l+4z3Iy&pX^&?04toa)U6lro8 z8lt9U2A*JcC0vga0pMY1B(w6Vc875XS$5`b%zqwO8X{CA3JrpJ!2aE_3$tBPts+*( zc4NzzLMJuCRSFP*Q+Mfa2MGc>{IuH4FFR*S8AL@vog`h%0g90n-zTPr`LlyCudKpF z4PXqu|4_8zc`ijrOG7$fDg0nlsJBVyi!nP1JKD^dMpt3HL6@Ve*y*NzYuX*^p)Z24 z;G$Mwy4A;JVBA9qKQ*m6z*N>*!$D2%K8RmJ#RyP5NE7tKD! zo7#G(s&!N>+IO z!!)NZBk=0+IE#BcVb$l={zQOvqwM^4g#4`UqPY25MWGS!RPK`;A(yW&eBMglWi=rpjbwWS?n|us~OU*4&Qp zHH=xAzvR$xF7y#XOYK0Db}E(?X3NWmB9(lVEln5mPmN<4H?()isZ3VHe-{`3((?b4 z;^IG&8vi9O{uS*0S|T?m=fA?@U&)yND=hw<4)||`MeK>#b*|g1TB4%{=y)@#NY6`R zL5fT|PYC$$D2RbW-w`6GT7IUGOC+!D_ih(Nl9Y$7`^ZxIYYlleYKkcfr~@0_T#J7d zk>pusBup7S0CqqV?NNpy(3xr62Q?)@ggitMzDGw&mV0yo6N=xk7J$1e^i)-#lYZ%a zJaEohLxc7#MCu`JMZI>t0ve}~`ku`jW?GrPN0$iX2CNPG&NXM(4M-&_hSCaTM7m3Q zpvWC}Z`_#S^|TU+;u+3j@v+|;!4w3L!tuoQVs@Ldny=m(!=2tPV2zC0KAd|#yn?O_ zj=pZ$41<*g5=|u11yN_*%6>UC@W=P+lZ{REj=i=ny*((`e6VeOFi)V@TsFvu1+!)d zI{e0moCk}?1~nSqbbEVW8Hb>lwTV-=$8nn0M3Rui<?QtGcBjusI%ysMig^Dla;RE&8K@6pg%SfhH zkqSTbLcOha`^Qr>lOeGw@Bs-bwzBUbFOE77>FM)85 zBDRPl$^=B#k$6p_?3@^9IwkFzSiB1>*duz~^j9-M%?AbTQe~O6?;)!VTkhZMQnW|S z`pt+fXcD)6o3HWiKhwEsPh~4PZaxE5L?RIdz}8#$k9vmO=H8OTTA&0Cl1b;B4n^HUr#wz_i5i757~?~u$TSvF(P>6HRswONe-7O1 z_#79I12KPn12*A`M%dBK5?&HB^dIUSahI$Dw$o#kXTgc!a2{H*e%XYKVdM!7qGLf}nr(+atm+5GB*W+ULN)Qa zVkb1hjKaui>Y&;KcfZxxQjUmuf9lJwkiwNcILyJ~n7EBbhmy^78eS4e0eoPK1AU;q zTm%Y;OtH2qSX$fSu;J)KI7Orc;v!!ShAxqA)6DZ+9>rsUcKqsw9xS&dSY+O&!^XZ% z6DJ9TAQe71meDp-jqk*(AaNegT%hnb9muOI_5Ea%A^T?FFt#l-6!zUi`fi9bjY$kdfBm!#tSO7NY*)nR5MFf7(E ztJG+`Z>Y)Az-k=NbIa|?V~*gGHJ;%{-OXyNNs<>!^8NQwKgZ4A$$%Yf*b%So zg9O{_`{tc9VD(>jhL=uf;5W~aKL{3*V@x8|+-x3wfv{op{cXkrhLypXGPthl_|qb~ zdATHyi@@vdHCZ5&Jv3|{5nKZ}qR*h$`j-Qi_N_W9SWI1oDtj5iUtafA>epNA7B~^_ z3T>d~@P;m?N^3~$mX=eOwIgSj_t9<~4zyuP50WlfEfYypu3Qx3x7ulnT-eKV;Yqx)3Bdh=W}UW z_u}N>CpL5?1$p>ZpsLL_fKh$L? zYCnz(SyMw~k=^qx?G3j|knz_A&VzK&Aeg--=MQI_CwUJdd9-o#*c)*s8TZ#NUAVwKHYB>g%x(ZyuMPAjHHx!vH}<`F>rn3X!G1N>8I*ey9gtnMUbgj_ zd`R~jrOOVT-wWe<2^8|=g$vCKws#=UOVr_9U;fU7WNTdPCONZ|Sr%QWSc#WNq=uJ% zz&fF%LzWSr`^`Oxf>K3Zo84b+2#kH)E&@}`gQK+jFZRl{CKVS;p5hbq+c8u#Vk`GHTfETj#@Ua0J&nA&nj}s zAwdzJmgGS6hI<(@UXxom@F~Be=9-}Nu{Rm$V5;yimRE|u3=u}CK|qP?)`MtJD=Ij( zU}^)=t4hhZf)&<>ey0D&H$yP_KsSr@Z7KHs$oawHZg4lL%V}9rssK;iX_y<=gCi-I zRa|CLT&!KAE&r|&OBu7z_SE}$p2f}d@XN?>0MFSRT&4qECKjRrod?^x(y zIa zYIYiSbk@>9J-uY!$Q?R9z53nn+#(Lazgj5pKGDxkEl=L|5Vdc|rj z1^5dLPWi;bj@&g`0Z~sDALnPK&HJt>Vr}p9UB0A5Fr3`-D;#1HP;#^Q7~TEnuDi_&M3z|Ya zNpgLc5y8T^S-EIr2HB-i;hmA3(eQH3RC zKN2>7+3@|+i@I8|C_9fj$NYk8A_F@HQB1L9=Zqr-4O^vb;f}p{-8)lQ!{a^{^y)D8 zcYemv`&a~F2u*utFXfTjsdMlbBUk&P7c-lO8sw_APrf@ypgnzv&Br`pnQ(|@ko9J> zl7JM6M$9G#+N)Uy5uZBMw%TheEX*eoPa)XfO?*#*Oy&lpT=5wIPcYfE!cwU^(~CWX z!`E*uJ_cA(;4WM2~DGp4d*gO;~L6;$(2d5aV@Mg!P3s zwuF7amqBvC<3ou2`sFs$mu2c*_7oPXg;66eqp*zdz%<<{G(}lOLs!7QXd48j9)Z~} zB#Sd^vrKx`ta;YaEfUuAt7Z1z5>&465!7(G9f&+pC44s;o<+>+%QlHE>?6fL$#Y@8k+Bu!dKjKYR!00k;73VkYhbp@24ZHhF#K}`~d z{>E9 zE<3v^eErZm_h{2Z;nIFdKEaKvTQz-!X`Q$iqS!)%Q2Rv=C9yC_v1A?9QH5kXNF{u0 zPa&hODN1(Irte9DrK{efMqArxWLz+^2dZRa(*`7A1jWMT>X7P+vBALWzT(nQCk{!=UwA6P<(~#TO@y= zooLoZL+nMaRp3a!>7D0RH?zvLSFV6s>H(ER7|_$Ovv4PCD!_HBCs2UMZh;L^Ey%I; z9NSz~3a_sB6+M9G>CY0g*HpzXli#K@c|yAr9MltjpfFE~H*|Z;RtR6AIk_1#PuWh} z>;Z0dbc-gTkG2^|nS?tp<(y{gW^^jE!*e`rcf{Yy7XohUXxk?!L;QqM!2{4 zV?XD?r`vRQ2^}ZDZN*UnZY5!%0KEHR(Jt3UqmawjV5-Iq#zzSW0adC882t0(V{(HAK28#AoNl~J zF~_>Q0n9TZxc5X<`nc~ z1>iPOq(nQBESJleNd!OU^eba;2K|9NS}f2h-0wm!lS?3HUjV&w)AqTAvd89|sI_=0 z$6(5_gU*1(-OLDTQIhoEJGmYj{Lh;K?=VoT`DY`Wh_UaHk)e{RRL#YHD&Jd|Aoi?;@;;9Pr?*a?~B0fV#YnEqJYv3B{RTovb@(OnxV@ zVb=~}^)b|u>Cs7}^@0|;yU2@xw}GEy{nN0>x#{5SjF9rHLyzf6*F{|@{Eq5@r1|vm z%|yrUev<(s-u-$Y^f-gLE{19}gP61mf;cpz?R?OygzS09msv#li-)^M``ZZJkLK#p#iYKUD`4-d zlz6^mhgbhlzwDt;(-pNlM(i!OL^&pX+stE)%#taYP1_F;l4RrP=UEd(NkPB zj|^d-Wow^9UNGd?H_PmW+VgyC6McnXpPNzG*2^)WZ*OV3`1Zn259KkHSH0_e76%!q zcolwKUN~=Zs{rXJ+hjPrRr$IF6$tCaD&yzF3-ZbYGz-cNe6s2TFNfM%;z`A&bQ@wN zf%wkLf1w#gKy1|vH=xtnn(dCZ(2DapDDL6J^()gv#Or|&zV2aUo3ru@7|I6huF7*ooamZnW2c{gK@(2T=QAWE*n=unh=|D>%NzQ$Wo){)MLd z@yoTL-KM^|USq8foc8_()4MU%A@KViTZoAKe7`{!!9WIkx7RixQsF~68$$6lTfVcY z(id$$li^VB!PxxF9icpN+k+rMh$Emp+_&zSb%RXZV==%(yIG%YN)~I9Tl0dP31;x zNc{$*;Nw=Zd_lr$G92_m@W2x|^cC8gl1f{7aP*PrJ%VWmv0W6uuZA8@9^5vNkg`P+ z+91HlI`W;$GlqmM&3Od;ie6-pl<-7i>2l>gX-%a z179qz1lO@{r>7YzA*g1bcWTSbVcntR;1L~V7TxuDng?lH%i3h5&>-IxMn?q*Mbpi1 zWAyF+t~CXpQk*B_?lw#^7q=VzOoZhVGfd@f$o7iQHGUQca2QFTI?2CN0(w)OeT8ph zV|-f{xr4X8?O2H~pm`Dp?($p)jlUAvH1R**(uKU6WpFOJ0ytz>^&CSB5Y-0IL3~`c z^5ZjuHFWfsbPi#4pNivyN`cnl?2AIGo87&E$^e(k^Lpr@JB8z-Y)j30aOCzD=l4Cl zKq@b+>Jez}myFpOW~7ErAgbvcKMQDi1pTZpS$l}`yBaCk5!KmUHI)JwgFLpIJa-B| z9D2)(Y)DCqY*eX|MCtz=Cb1@NIMG8hMmA%$pRceO4VgEiS8~+;~(^ zQ>yPHpP5g4aS2BVmR&|IufQ2$5>LgCNWb3rh)Zm2-z?S+Msj#Nw(*-g?_{c$k6Jg# z@7JtxDuMB@ltAnFFG9X|A7RP&8h8hLXId9VsKz)2S7y%LhFE@B5XDVw8h#3~DLxYsDmA1}9A zYKWGLl@FF^n-tG-IZxux;q6_MwXpnoZ))~>m;0U&Vdft{DjM?l0brnm3=>r6Tybv2 zDzx4_f%+u)v;8M#cTbZJJMzXNWNfjCmBn1RWE!X*Gx*Wl=uW+J#cZE_gbj<@<)%Nq zb}IS`v|MX`hN|Kg=46wBHu_YY&5+)rR_?J{4Z@0?R8Gc1O)1Gk1G>r_ zK_ehp9X*}nwPSi5G<+lK5-=J4R&P0>zL=c@ZS6<#oSH`JjZpzh#c@{t3o{Oq#Jyv- zMa!!cy*@_FA{`?WemY95KZh{bQsqHqwY$8M8tV=8bY3gUks7lhB9mfI4D*K5 z4Eb96lCMS;Q%C=Si_UTznVlvY7$RW#SVC%9IV&4wy@j&HZ}6t5FFYm)VT$|=K`do# zahzLUv%nHjYVLkFo~-iPV*qjVoH$Cz@2whkqMtZ^37%t$9CY?eJTc~Rl#*p4bkH*_SgEk&EPlZ&$pRKOD*F(r!*j|JU6r~ijj@YM7f$uH z(99XS`5$~aqDGhUyo@f&*{*wQ6=_S@IzQquRy_l7N0wI|1x)FlMN_2RogXa$>#*7)d3)5O=)9};v4x%>xWMP=Sm2sfwc9Si6ZF4Q} zN19Ea)J&V9)d+tZO2h7ri#dpw1qjTTLsQ$GXu5-9hdf~4VQ-^!+?9a_^(7F;FV(PJ zA2{F%wL_zp?2d$=Mx#!UZI{+>*FU@r2Aa`-P!9O81jD{_9(qrZ%eCs7Thk5}b6C|J zb`)vXK$l$R4tux`Mp|mw%uzMKUrb(VHxQX-7>{`?-}btcpV6ku{i#;$HN)9{6G!q| zdLaP*q){xiz^amh)Z%J!pkH#AlC;(V2H`M3 z`P0nuBC$_T44NfkP?Ao;5UqLAVTp&ETk?CT)Y5lG{c@CXL3RPGhKLJKJZBWRp>|a9 z2olEpdoFS@+W8brt-~sJ?1Rz%0{aGucfyaDAryc9uM~{giqSTEF>m`&TE>`Q*w%2V z2wKz59HZAMEX$q3YOCpS4}p4w)XMb_EwyTU^#;}6>p4u@?Rqg(224|t1{U+{Y^SIb z{-nm&615-zo#Uxwa<#J(d39qK#|1k97xzN*nb5<%n;%?UEnKeaxNA*3K?A|_z6 zKEUWa7XI?QK)bqvKF;E_Wi507+mF~K1ywaUszTq~+6t{R{vOUX;LG7eh1Up+tDLa2 zCN=ci_8ze0by(v&ngZ5PABYf+NS@2R4sTN(rmOcc5Qt4h3ANchAQpY)+-B~+b?kn7l|1}%GCzT>I;U5e z0>v28Q8D2dQFf9tl2_?~!F^lxGTP4UaNePy3EhCQz#ByrI_`?ui(W&@2|=iQoD4=q zG&FFml?A(xtpz?IDnq|mY_5ud-EE*^0VH-uX@R z#C6Xrb^|aVwhymbG7%G~oAmaWPQtBG=6%hXD)$SWBFXg-J8rmB>4zznG4z3)3XPPa z^tLyvH#sq_1VK*Bg4Z@d?XxlTp)qkRk%^2Dr|j_QS8Bw9NgCS+3&SQU)BUvbcV-cZ z`^|J&7?f0D^aH%pR+}`c2yW%t1Ew)DQ#1GIV9<{*LaT&?gMTA#{_e5)pCoSn(L(ZH z#La&csD!Boopf} zhPr(vZ-qK#YC|lFV~U#XbnbiILW{_h=X;(Lb-#bdCpv;F-;MWtjvmZ^-<>3e`_$X3 z9d)um8~WbE^OpC30L|?HT78TC&^D7MgBRzRTNPe?D;2to1-_NMle&a)fO~u0_#T~b zJ+svn!~r|7)6vP=0%&7DhE?i2w3BIvC z%b&O144|s<{0*>16vaqk{gBtgn#ZEAmVjvSJ_dv))Nci*ea_m1@IXaDm0=uhbOH54 z#nzON&SUH6>R@072*IF|o01uSK8?M2!oTRw@bVczy-<;v&n;%{)4engZLxBWty$SyWNR7Jg|M8ozSyw;uwL}w327(zA+o_WUv%}4Kw}mdY(=Ni*qZE`0k zLgl+m<#DA;_t3diBBP{s6iay&3c9mf@Qo=@#@g%0TIvxS>0o2QD45_EMY;aLgMzVM zBn(j24(sTyB(q#mHp$Q;>Cn$n7O7|1`6Cyd4UEhd-qh%-als6mRmD;d`ji6e!}A8s zW?_0u?VqOM`PI+w>dEVX-^ANhX5$^_3yM0YqL+Cnzf9{_CS$Z4mEWYk#mIP28aCl* z^579{bSn`dls==mt-;nm2_uLG#Cg8(`tnV8P~GU&2ZU9>K?GU`+L#kPU+54ZLM0fW zxzivC0txO(@QW2Fj0y+FOY%tIXxw+3D-1f6J`>$Gi&))$f9haZ@b)lh$fR16w|){_ ztx2Tnf?RL^HjhBr@~wW8pk?9u^{J%Oa^OA5t`uC9WwGx!4C2 zKI0L%SV`6g0snct164V$BiS(WZ0OurWqL?Kst1g?R?H)tZ9Q^-+7V-x>SmwI8UM0+ zLqx3dV54D~YGK&6k~;HHt+}FzzB-C#NX=Y#8^fxwR@!wb^3Isp&F<%YQ>XZQqT%$E zMcWugHQPB&1KTy2zk!=jiW0&-#y`Fbc6kxQ^C7Co6>1z?5l2I!9*%|3xe11ip{AvL zm~`?RaTy&X9Ih72xc6Bgfx>eS-ieHhFkK^a77zpxZe@{mItQrNRTr++Vg5paH8&FJap<;<0{MST4YuJG=Ja{AcoIa}T@_A0tlhmQb&ph^0tVD}4q`tBBHQryY zCDl(X)Snk?q8~nLsrNMq(73h}lsfFNgoT-%+}^Cbx0}`|W#r3PR?QZxO6h1zp;mK= z=rp0{uAx`6G2Tk!BP%uVKF@RNElI7iOJTs?4A>JJIMYX|9bZ}NxDAk$C-D#U(}B`e zYrWtqb3x!4E>pM%Dm>^3-2)YWq4TC3xUYa=Ik)@-OH=)+ImMzBdzXV7%;xGnY@GB& z0=WYzkTB%6@=L|0`lrcBwTtCS%K1PdVvUM5KG=S@@JX-wT=eIaxCUav_rpXhB5Hpi5I1ieY6PzX3 z58qeDL*_QS&=RXVK3gTUmEJ2tlovBuwofZp>(;)rU!r|g1TXE{-vZh=Q@3eKV|MQ8 zMRmqn7;}zgyxUI#(Iz8*$U8ciC$Zbu8m+`N61~E0spD(r2UG%X)dI)VpjvMV+8Af0 zL&Js+OnP9u;y@gqC-AH%yHDTE zpmiS)`kf@WGE||Z)9^81unMO^NtZ8K^}V#~qmqc$h4jR+TEVvg#zV`ZeRF(>C>_ zreco-Q{yc>@`!c2aW!P~{e~B9h4Nog+UiZ{a$yG>&9W6Dg-=EUd zgXnjFdUqQsAnaCM;Tzu@Uxk(M;pavS4ul}~Rl$!gIhH8K8tCUFDC~RNUhDcZw9+TH z_bH#XUI`TBik93<7;gN7@dOa6W${TA0>{S}jdV1cn;rQ=x5mk^TTCfN5)sW(>Y53o z|3nK?kJ@a02!59=|KDZDCOdP6vVK*y;^MZmZiSq01fCm9XVGa(1jjb1aV4KO-Vjin zn{i8im8~o;q`v7-?S2Apz68^YS_{Q$AL(mJ<*@Hi(X7KklIDtAJ8M3-C)ax%Q-pf) z->GwMZUQ%Uq^WWj55>FIWmJ*t7~-%H*Ehn)(O!DqClFuVlTr?PoR_FG$X94!3SBy_ z<(#bcfB2lqK<}kCRa71!idm5J%1f$aRm3=9-NuPHi{FJT)fKNz5MvJM+g&_gkoe>Y z-nEJ3#hxv3PNf5Tyc+5sw2~-@@sCIrmK=0YMMzfA+e0!H0}%{r7Jbz~CRa44l`fy^ zI%W&WJTLEjA|h(<{9B#zAGOlFy#F7!eE+LW=6}y1_%Ax+KPtajxY)S=WupAcJ^Gi4 z!tz(skn(?1XKHWvhy3`7)Wa9l(``Axe+9z zd)61ECat-42i8K?L66tH7lNN@+KDrTy-j@gQkJE9F}gjsGi0Sid)<^fiS0jBw4=nN z;;;d_WFC?jdpKA>Js1)I*;8iGbC#JbLuKI%@I#KkKZ;P_OE`^u_Z+O?_DE8n;(KB4 zmK)>Q)-@ONdB;uvds`ah5K`ggVvu5voBkE{&d6SU#xoA12BE z?aEwahrtzri#!91ml`4kGK(lRGzK!XXDLDmcPO1L9g_nO6`)J3Ac{J{{92GvJZnMu zBVWGzgSI48-8K|JJ$!LaFT?3vkYlcB6Jsg?g^1&e6wyJnEN)F?1F?Ybxty^{JBv^^ z(riPKTJ2O}huC3haoCymC@u(@gdD3EEaxSn+zt;)n1}rglX2XomEzQd4t`|Jo(Y*h z8`a0V1}j=CVmwNK9gzbr#`HU3LZ9YZG$ zn%i?n+8crSi8}9L(vfh&5kevtM0Fh%kw=!ZW}M~NQt0`u%9bH+i$hIaH>sH`>I-`0 z_u+5XG)q@p>Uryqw=CYr;GJiU0^9MsE{fH_BA6c}m!yY*Y%=mSjXL`AAjvSv&5fC- z1MVZIJTN79d%#VC4;Hg507Mcc%t?3_Gp6l)x9ZhSFtfJo8XHzA+w28MrcIH+I;OBq zKc)rzq=gmeu{n0T9`L2!d2fKu9xJ8}2(P8u$ETBTg?~hrr~b?-$>u?fV|}iaMC3uX zY-IgMG2o+C^kJrJRaJ~$@f4H_Jm8FCpwbSB-b0<%-!?28?d6A%eVs}0X(D0hTb4{; zQdQ_NF)~(eQWa5S(^23SafTc)NBZn`q+Wg4dXjx|`%o&vqmtv>M7ck86v+ss#Jdk5 z$|HuYHfrkZaND3;m}Uc59>geLA@KUPsm4Iw0AKuDn0%M?5MTv*4pNeMCYpNg+iq!9 z0DbBaz4s3hh^%aTk0 z@f)_Udg87*xm-dv#FJ61FPbaD3e{aIWA`BEc;ua%Y0h1`WQGBazAyP`htC`Bb9)aj zkLW0=*oM=g$H7l?kMetJSxyas>i*7*jL5- znmtkiE~0U?F{{^h)S%LeL+C1DTe{2X!duE|!ylWPpC{Q3>RE@=&Z7^0!&j03+DaZu z2`~5?HfAAipPNHZg6?dkI!X4olpy%~MooscuW&@}Jz(MHh~4+vX7%2|Lc;Wanhu6Q z=FQLk*53PRGZtK3)aGIMU8!wx!*t5A(o*J7Iq`dJJcCGz0FJTLJnVW@+J2Zr;&aXC z-bzeXAMqZNdypSYv+4XECPBpUELQ;=)D(p(p=>|VW>8S#4>hpCR1eC@#-TtB-IUR0 z=`XZOl_K;jqTcA9J*U!z>{Rx%T7Gv+pK2aUr6UiIFbHuavr3oPjVhJj!oANW3w`q& zZu3=i8Ek;Y4qC`Cib7wzboJX~hzDqDSa}T7Vg&^ujdB{f@?%y9sj4JxSVxbd9?r7o zPC0e0rApL+%ybckxZT<8R>19(cZ=mh;mta zY;dkaaVciBH}E&nI1q%7ocBvrzS1sz_R$ghTp7pnH;xuBo^OFx5+)>kz26!P=?{A2 zIhP!MA#zg6;Bgi}#~T(56N|##__V?j7oU**uGzB#C>f5Bk))+H2W_OR>Rtnfl{i+9$y~5dueV&ZB{&;#}xrC6$yZY z$)=x9lC%swhPjP_sx%3Qw&A6v4o$+YStHpk@Z+as8zbjW{PP>55b}g>^+&zr%^*$h zt%7GP>NC^!F?z99L+N}hTxw-Hxa*+#ZTfbep(eNm!FiVMAxxuygzqU5Qc=;zXN8>A zD~lbv^-H?jmHj9$Z1t%p%4y@)FDI3EUd>iL%2tPCwU-&IhxH4Q$CeJ;FlV;oC65g2 zo7uJB7D%pNjV`3b)>Ui|*!^w1z>V2-1M{$hqerkLLp{Z1e zmOz;}DWx*?p1Q$RHhe1l>=&a$U`XioLY5BF3(G2Ptnikk!4r(d1W?Df`K};4xsgHt zkR6joNKHMIle@hLMNJ^JQ%EWNa|8#9GFbzmgZ`PG&*DU8t*V+-1KBQQT0hP-;pHj=2 znswz;!9BP4#1QmM>CT7ko_>BtMqL2jC*$nHffGd0o5u)?w% z%34Kt(B_XmiD6QF7j>e#xt-GbhMhsrLh6sqLikmTkVeFG6#QRq)~hxa?Xyl(lMM{4 z8&=^xKKRjx0%{`|Ota#(9om^H;D(~^1RzgD;Z%5E6y}r*j>?=u6uaj z7wsR0=ffL;mgbBSVBZo!7Nc7%^Eb?e2xdBXNrSKm(pB}Bt{>5!^#%9C)AnCJ*)PyW zxv9&f z9pgB%$p}J&xWOom@*He3@@4EfzTA_!(4G4XgYF3*22olxogcwP0}qPq9Kln8xeKHc zZF^p&iS7}!wc5{N!euB$D(k}(swlzoqUmh)XL8dXmc)s1p;j}5OPO2YH6*Cp`3BHK z&H7ab!wlTn?(88(t(uA*+~8Eh)Iv=eZPfBvczn~eqjg{F^KYo#3WfeEtr7ItZD+} zSNcTo{0Df<7316&r4nHPR(opj55_=00o@6v9HbGru)s8r9C_rfGT*Fta{fmVkP672 zT`g5=&m3f)!!u;bi@<73ve3`CDGcaG6-UP4eUP_s3;ItUHBjD!WfTWt4C>pjF}!P) z3lWqR>k029jZObu!1%Zd%y0X&D-|h4Vl`W3t8c{T^lGV`v^nF!HHvP(LQRJ_U*-#P zOfwHF3uv4lW|J@JOlvAR6gNJ1+J zS5M~)KXrT121SuO^UZH;4RMcXnyjC_^FY~6?&jHi8Q}5f5`!Rb&CBnh zGx-g4(_q8k(`uXs+MZ04oETR#q6fk{-fv<-FLm4Cz0;yI*Vfk5?NQs=RG=^hcn$O9 zsJCk)f?j7!&;pPSc54HErm)U0EsPf*jD+*J%9)z%^s00+kWPd^vOU(#0UsrCH2X_V zW~;?1G(7{&+xJJ9jf(f7UM#6ehKU0TrRwsuhN%wdlWxhh^HeJlL_ctt5a`pp83n%K*t=44Mn8G$F(n~IqBoj|)PuMAeZWg}gyoJBCLj2EQv5*KpOPvS{r2QAU{!Pp zzq4a-@JG;~z=QC@l=m_m#Fq+NIKY56b+nnz4aw?|)v$PLO-oA#yw;X*`q9ABjq@4w z>ZoGxB0NeXa4iuc6l>8#&1C#38rPuOt7#kLsj?M?W{#OTW@g9C%*@Qp%*@OT-*nbmd!O@uyXrkv_x`!(Pgl)RV|J@0wWRK$)W86 z=54S^Rfj!lwVi6AD&G=s&y1&J`9@cjCo9{B=N%73T~v@n&fCwi%dsflc6|F8=h&Is z4cGQC-mfxO(zkp(+xon@SPxzz8I{Et5sk|mcIH}|(pYS-AX_a*2WOo^SzRjNd@VZf;AmIR;rM+#iWL3_K zt;#m3lQfW|P?TE7y;UjG`|-f|UF|9d{|Kp$mNq- zuk9*T`cMP|Q?!Bt>+_>%)avVb<5(L__ zvSZ`{TF+uD1lQU|LhfUps~Q2?qSE8m2}9#Z$Jw^O%7NO@|Jvlq6 z=SsK{e{$HM{+0z?6)rMsbWB?8U#&Y!a208ayQ)&f{$n~icPRd$@ZV^cgx?aFc9VBa zGCjiNE{=7Se-qe+Cc2!>rZ~W2)H`n?U<6%Bx_p(~FUn{6yO!;Li%$PZ%cp1fuhHqh57__9IrE=Num6MSR7Ko!g%zm{Q0He7 zNSB&i>8N}26(J+g0H6Q35SJ^l&--wLnSsIq&_EvEO;sZm# zhdc;L%+Zbhs18cmY)XC>@SEMxS!}!1`BUU4CeMLMYtN={LwmCJ(*SMi*pgUSW2jH+j$NPZDqlMK^ii>BL4nKy}05oJjG4E*YgN(L1t z6X$RM{3%$9^kLX(X6q}IoeKQ~6Y$R4(0P+o*B(YM%pjn0q%SYTMLa30C zhX}(!Gd@rKv=+=Tn5lkA|0)8zjzuyO85lEi79d;B)w2*LiXp|hWjCtH-Q=vscXf1L zqQ`Z`xMVO5&125+HzV)i7<9hUFy%bSvR*>pl{Xd}wOAoFdE%y+((JZ0clX=v?0~%)j`{q)K00@-kZomvPLsFR(P)sDOS8%DyK?V=_Q+e~vH`-b>FWHqoU- zLPS*7ZyirIe4^E3xadjn;yCDUavD$z;;yxqS<9s78KC2i3Ljswj6IbyydEc8KSxC> zC?NprVAPYr49NB-Gqz2OkyqS(&Sn>CBa1@vA~NSfqRMntI@ztRGG?Z|rf(BUlmSx& zPlPn+oK7XfLJ&gnW+Xw#iPRgtim-v5kZJbuRhz$Q+`BeRiTpzpzCd%mp*1PWUV{ruhM(jowBQ+ zjI%X8%m$OAia=x@$Majqh}Jv5VPsz?G~w40N0g;j@a*`jz-k=+0UqIHT8U8hq^yg)r@VgH*|^>Psa~!w>Kx}>$~lC z>aw*g8jNk0_;e3}d31a)ushPwb_xCO6udM6`bY-Ui3O+U)SjN=-KXXK24GJtMGmBx z_^07$jsnREmwaE29jbd*rMFq}bErZ0`?hnXyZL>%lB2$S2ao*S5_;oIDt-e6#3N*s zmdJs&Q*bNE%vCBY!=i|qM|wtJ&L%3v*4QnsD>ogH2YKMfT1#O*1bcRfjenONQ!$K> zGs&&^`p_nAE+nF`TuD6rQ#(md3lea{LRu1u_19HjxO8D7wq>T>jqh@h>soWsSwFqj zxeG7_FAJy|qhv65+w4pP)}rL8yh850CX<9U2c!|wQ1Cpv2gdJZ;66dYdrT={?r2(e^D$s z$F-kiy!zC4`-ul_=>b@C`M2}l14PyfKJ52mkU$aZQ@?>!*K-o zli03)bIRXN(>$BHmrI>Y+ID@RcfUAXBlQo6%ZY^9R9qkx(6Go1KsqRi>&H5%I%Ug~ zPq3a}!=NZA@He0+N-Zl6&?QP16@`C%`n zYscW{^V1bhpuoZ)OS6Z3gkBf|ozWOx2R(qKB+j{5lgcg>k0!KO&Xu#4tB|qftWb`K zl*RsB&V{i4-3z)xO|>yG8~iKH{tPpfHYY1e)8SEGkqcZ4GxOP?<62$V&uiWF(B_+j zeh|G`8)#Ha-ukAYy#OLcoek)t9}Tt=c`&#n*}i1szR#*Ds^dA43V;jM1@j!Uz#7k5 zOnIwnp124bYm9a0dT$!3^2pJ-tctL9hlr?l(@SGPaT0vo z?4j+9PM5_DJ4U;;Y8gj3z5S<@aws+!p9unN&c4Txd!8R*DGD>W=bDKBumH1HK@h}HyT zPNbzA3H?}5E1E_ub)D_2i*D(+leVI>$+m`ggx%f|Dl$KDo3As)4;$v+7}bxEzIrD} z7Iv(Zz_xU4gLCf>&W&?spu0<#lKd1?8&406R0+j&g1&HO>|pH&%!I~4q=}=gygLLd z!ZMqrVrN1(_>P!LMB>vxmA`UYP?EemEkT+VSh`DD+Edjeo7S|*B&+d;sgE2&AGtl% z1J4@IK$E|r?G^*FU)7iIf-e!|nxTn-NpO`x2@;uXp@Hc@k#C=??szlWkL$tF?NfOk zW2Q5cZT$HR6QDNozizr!Kf2`kYH(@n9yiH;A@PGiTXGf_t|hONs!BtR>D7boE{{7c zq^@niZ!LetSM&th=hjyKPci5}3CI6SPDuYQaR1+8(0^*7&@(Xq`@-lSV1@s`6VgBD ztN)W2^w@Hz4)MLs^YdmME57zLiqKJ19p5UW66+|FV}(~%;5A?K*3yv4M^d#J%Ii9Z z+xIPj{_vLpbgpo=(bMvgFKVD{R7AxIXN!sj`NDLtu zxp0R8Vr%(frnz6?L=U?cT`!2QX0s&_PtQmDTEFrILFc&22M{;KW=@Z){YGg!9?ZH# zCc2Nx9gBf+8~jXmtgE@!)=YFmt^zaylXWVpIC;_lLUqW zE9_x&w;{#E8<53P?uoxj1<5Ra((2FsF#C(+%!AxYXv4!Kt(!E3?Jd4?-tDw_adp2# zsi5aG!E|Wn7!5I8pWFp)+&+wqKk^J@jh{j&Ly9Rq(C4{W8yqiS(aL!?6necrx{v~R z^(vdA?<{ge8vE2*$8Z{b6>ArtUZkrtTk_P0wXX_R!pNrzT<7#_kV>OjlcWx09u-UT zSJswx9NC6&>wWYIsQ4g)WKYc?GT%)ss}sH?B5tc^DgN-+>x=+G%TDkz^R^XCdOkxO zYbZUwYc$3CaVKan8#F4-1$m=B%Y=m|1k!dPed}{D(S(aP*&iR#n`b678Edl=H+v^! z=LGe6xtz6M9qfnUvr_Dayx-)3{!m$m7-O+57Q-Ujx=IB*n5)axh!>k-ND_>5=XrRB zIQdwvXkiH4z)vqgzOW+BgA4599JY2U4_16_W2dsn#Ntj2Gw7Z#Hg1`zfWsCkuYP)w zqZ?kwbd*8zcR9D?79>MaZz5Eql;eyJ61Xw2NqEDl?W|=^{vS6F+rzbhI~bX0!wWWk zdu-v+g2G9VYY`PRrG#mzImo{rY||92!>a;+R5rFCnpWqM>bz zyC#s13o%fFXyGSSq3I~*VBUmkd&C(m>3^nIi(Z(_GxyIj)t~w%O@7zA2fb7n%UlBw zOs@&v2#eOY69aP!8f1}`MGE3q|ynC2PF(s9(HHd zyb_aVW;Q+ue5x9+7OI-)s_VymfKIeNnDbkJ^(r$$Ex8Nb)?|K0;kNF@7Y5)|!x?yK zsNgafcwn10Gk??iaz92@I{8u?9NL*3uUw%7f7J-Q_v|IN#xvJSwRzL-q$jhk3DMgbunj_)2%MJxJ97-u|#t*>S*F$u9s zJ`CstIAMqnl*LpF1*c$#sW!(XIc+MG*FrnH1O@ z*D-#4HnwdgqZ8<2b9AAxy&)Ln)wHb*4-(;KWN|7ZHU;lp&Q?iYodm};ix6q3E<{Z7-h;t z=E-5dd5)Gws_G9qTOc1?n+Toubt>GH?Bm{vR!&F&ku%O{JmxLV97*(7%Fs7VN;#wIp)3}P$iqGL)uq~9tGaqZ#oV}SK3+-e8*(kTGV||41Obm60+UG6bnf^ zb1`uCq!wDOUVh+~{cw%kAE)lkV7wWOZZo*gsA80?OFBWk8O<`a_g^N`TvR~xcBJX0OKy-_9UZ|Xz1hB6s&rpDDwM~bC&jijaK(_hTS+P_56 zxIy1%)jq|JIMCGOvS-rpwb6UCZl;wv0m%&5!_MnB;CLaawRI76@NEbeTg+{cL`n$< zibs>j>U@A0cms-MromOU9Cm@|P!YSAleoiwoc3cot4EgabUL(xN%^gd?&& zvpC#E1Bcm+-Z|Ys}`Kws;V9h;K-n^r>&aIW>$~ zIq5u+mx~H#1dwBUob#T%rFH8jtXCMV?wfGgWlrR)X1a;OKC2_nr0dBRz)CJwITvW{ zq*9+g!0{u0t<-8WsGd-e>Loz<^m|u$Z%`^Sp!<~MXQr=fF(J`Aa`0l8?pT~-(Hqi} z^R1`JLL29Q3IYGg1^wR=0{$sr{NJj=|3Ovz^N}171ODqH`5!E;|1$*q3vliK9s-_f z9NVU_BE6rr^Z%wvp6R8uOo)&?SzT&wZ5lGTt1DxE_5vDBpfBIu?DzDHRs{wE@xg5_ z`4*F7Iuj;cKLKxFJWJ-8ius+?bNn#E5W6+~%I-muIeU`@VfWk* z@Z5rN8)^RYD5yNLsB}#Yey!~F@hS$~SGT+V^c+cFJDc^@MD9sev!mlhbWs*fuULgC zskwd50T|(cQ59jE=KSmrrOo4I?`l|m}2%BZksdjMDHbIKlKYP zqr6_OIdZ=Q)p_zXFX443(YHR+cLj^ynsS&EPLo{2o~o9gv(v+l-f(HmYoG(L=22Kf zwp{HpGifAn)-pV|xu~ttbe&LYn3gVOAqd?AV1Q(1=5dV;uuqUeC2NHG0=UA%$}!`lZkCO)-UdW>nf@M08h z7~|#jeH_PFUx1Liy!fg`)ihcBkp}xG?tBq2nr&@85Hd};!?X7u+&DJwO|i=MV80^I z$!L(sE6==qM{ejygLTh$W|~^9v>QwG05%6<$aOA zV-?&aN*mHC&cfJkX?9hpquNfKA+Af3S(oNhb0u-I_bM;qGET;Y->=3j8%zosYt*<) zD>0k}b)N>%hh~vF(!?Rac?dXaG(FE7|vGHX}ZngCFeBG2QRIMrora3&u)N)n#%?isXUd#qg<%ZqWHnZr!=`kQF{p zVFf7Sn5(6H{n=`g#CUu1y2?adDLCIKSmSkgcT}rhzkfeoT0~xBq?nvn`t5MTI@~P6 z>S$>^K<+PY3#(@Hl|&8`g#M1_N;*fzXuqX2H;sDvOyTvik%*pL5x zg=?lE>C%pJRdLFEABX-Gb{|g7v#n8pk!K2&I*>*B&z$SgIe{lvat=J0_Ezlp(Vf`E zV-F-K02+ot>77>~8ls|P0-Zgk{1cm7GBhlcw^80wRFQp!b$^4y%NH^ao}@MPf;eT^Ua~22AW{PmD7h^ApN_mJTw;3af7`_M^0tcHlVn3TZ4z-#6U9S zH3ZR~H;$G6@UI^ozCDL267{nyX)eby%uJ3@z7jl`UCKJSBqf@-TpZzevD_8AD=)%c zMYO6cP$>ON^8~$-3&L{aMRf~f+EhmUz&O%vX4m@%8Y)VZ@T06E=KA|`DYFF>Rv72_ z2OeCvRP;sP+l+PxRgftwjmQtDY{FT_fG*SMz1p@Y-5QiShlOyG@8%zKDqm7JkCHk(~DU`u_HK!8U$($@kpC(~?}> z6Rc}8h2*-;Schs={;6S|qVCQPfPaU7iP9iykSC)gcU9B+8tEnM zvRQ?3%`?8WldX&bR_9|qyz21V5{l5(M6_FcceL&!FX%Swqto=KFQ1rwVH_0F7@6Xf zg`~ASV-H$lkKrlA^n;MEAS}>NV0qJgbQ)|RKnf@L_)R(lOIKqXZDg{Kb1vFumD5kX7gFhP%kk`EhEOM`wqaFy6z=)JI#P3h&F z7NlR;{h*)^s+_5=n9hL}Q5l()B2gJ@)6x$R?71lwB@3Pe6E@dC#7~G#4kEOncvj9! z8P_Y_w%s-dc|uqhg5U(tg|HpRve>`&bUqVAbHbqEfOo)U3R(9#uo67*P9qqOH0xoC zHT9-k8}c|PTwlLHoNxd1NZ0!uoAgWe6U)KX(X=Jcc!HxsWwl3IIcoh<&)yywwEd`D^i6jZL6Va=-^#YHgovY zQ(ALEXlvYt_<0HLu*S74rS?^&Y`lMx$g( zIJ!!|Xq#pm539;DMs((0Jx8u|A1+<(bG7M%KfTFgk$)x-n}rNmZ{plL>zcBeH1 z?ALDWG{ZXZ8fc31q0>hyUNDVIhM%w?UehFyrfC{utT)z_19(PKLq`24-4K*SNCs?xCv(@zFV4bB9$OeMXw{{mli`+9EQ?mpFg%Rf`-XG z#N4{5yujM*q4ccNxH?28XEyfGblmobBfWu0Z}p%Dq1p*~t8T7+@*zzLibM1Ly43xN zD-N$O{K)4^1DN#L3wXxkGIDKb-WSPE?;854J@~EFXQ0k^Eh1O=oAdWiRra3){zIVu z2SfIMQNF?7Sh)Z7toKj!{wL69p{M^R(5L$YO8ift{})^0FWtRVqpdaK%mvLBTyq?U}L0a0-!xJve8nr z0%{^M(Xmi}pguFQ0R{m4)_|fB0KE1wKJCX3eoGsD1DpT)gpc5_X~;s+d?%n0h5B#v z`}dyk-x(TzVNL(vw??DNtCq{m2%h&^d>QWFgOf-KrO*}xuo!#iP6^E_xES5F4cHaG zsg!-~hxC6v=Ln7!3XYS5!A2kr9NfNab9z~&TQ@>Md`K)VXUt)hU>h1*bQH)Z(;*9l zCI7;zk4OlVMQDgf5hWfhoq4AWG8eHiyy^Fd^~$z90^!2*e1qu}7ueDE8u|m`T+ls5 zL#+-I41>m7l7=VwI~U8kWM`jCu1; z|H=xJ5f6voE@Ym_G~U0x&#CXRjaz7Y8od7*nmpF*yXh-ChCHSNnJ>BZIbZg4k=5}u z7fQ~-D@qj0d)wAP1cNwIn{b~{H*_1t0_%Grv1;cUt@m<1I%Gj*9whA?=nb}u<>~^I9{S{7 zB#|OlW~;!lBviZ{MXnw(=<6#_i^L`x#U&!F%jE$us`D}$((f-vmrLaCpj)kp4mk_ACy)^BxUnOECcEqNk>{&1_?|GLu{m(5&s~e8k zF(a9~u+VZ@{VSwdzqf*vp$o^)8vb5CHJ#0?H4CCn5{}b?Qn}x1>4HWWh{mvuzKBi! z@fvBgKEakmiW6{fLZC-bD#Y-khnBL)Awj-aCq==4oLM}CVf{PcF4Ep?U$nECxVb|G zrtBr}0M%IYi>5^hu^A_nZ3jj;f7f)N?D~GlsiH;PqtEXBab-cT0w|MW?~+}Tn3#M-e?&L|V-H{#!Ie|CJ2_GbjlAL_4zf62H9Hb~!A7c`W3T9P z|4Y4EY?3aV>gu0COLMatR6|}B^M?wQP1BGnRn2QXi9Cy#Rp#a_p({SaX0(=oX~mskR>7(j)GR;xyZ-U`bJ`}E=UB66 zcFS8s*6XaLZy+Pg9A5H85*aR7w=9$Vw*EgmqzmL8vFk#(j#plwUz) za1nljUFEZ1r`}KL-)F142A5uiizji8V)r}3(FW55x5^y3wzr5}ZgwK{8u172$euy@ z)!3-Nsz&WvJ+Ng36u-|szOw~{XJ4^0>-~cZ??{$==X6p;^SfM08X03wUm&^_TP9|J zmKO^Dkc4ZI8?RAFVHao;#*YTSH09s0LBbB1Wz8tY-!_W7N6deJ!vOgthptJ7xl_(= z2S`k@g3UPLTK~Nj7=fb2+gwP{B2!+~^jz1|9t55Hwrv6!=F^kKUnntpujUTe0co-j-~m> z-+xS+j)nH$SBn@w0*Ze^pMS740fET>tVlqritTb8TL1bhIqhk;grTW_^Y`(c%{m8$ zQ#%sT?d50bd!Q@=NMvdXQRl}y^l#`g-p2i9$Y!1 zSGeDTbz}97Jd2&cN7Z-yC@3nZ)?t4x3xr!X0u4#?Q1Ft!{~+BsLU^7OA3kAvI#=;9 z%!W7eeCwT}j2z{5bTq^tP}jfRJ+aNVpa6mvC`u1gG~&@rZ+&Lt4G$}eKczCfpHCnC zxooYAqLPMv%|qQZHj!@0ZE13a`YIWh^VOMu?ai;uldHMutaiTI{G0dO%6L|AmU~ND zX#C<&!^P5 zwSWt+!WEq}LrPRV>a!$rtb{ptyo#+WmrLOg`7NIQh*D)jtgPq^gM9{S zDQoJfAh6Wt(S7=!P+sPq2uh>5x?;T|herkt|DWTHW)=w}sVD*@6G^AB zBUyKIyS%8v20R5pEd*zv0`MT5%om>v0juNodad*xe?u9QAX78ORNsl|lUXpXuyK;nI6H zSrF!5Te&ftid|F8r^=)@7Q=TJPNZ19*~jlFjlSBhQonvqz`i>UNLVfmJU=6N;Fp*D z9xiYdEiWqS$kB~kY0!8s1Se>@Ck$etJX3vZ$o|YHvGe&AdSX!7H6XVbW1DJX5tp(l z{Rf1JTET4R!6!LAib=g9wHFW189bNFeetBc>j0Pc4w2(MP!z!oUMrs!0#@3{%_H!b zlvG4H?CC1T&D$g=cS3u=wXDeT%$CCW97yP$n#$6FEC~fhzOlVEDJAR_yQ?qz(JPV? z>W=v&x449CL*Er+;je4Hws^)-X! z%DYd1RPPiw?ku9=Gkdd-(0vT#sW~(*VGn>(qBgac2RNqO>(5kS^qiZZh@_up2!>sh zW<%BwRtS1&5823isicr~%Yzn(Ri;v`n7H9NhlMPyu=Q_#H@F!SF*j(|&#flK<}l?V z9jg~1ZmC86OpA{895V3m9j}U=DjTgKYjY?sOH`~UDdiB>kX?i_NB6nnS`X%2u1g(= z*+s{W!*47XP283bbT^QGCi``8oYsU5ZM%?)_APrxijq(Nur`YCBpt(M=DwEiP^XIl zw#f_mt}w@$ia5G4I80MKdtolwe6=zj9BHelcZD5;ZIiV|0LZvU6NFO15_SB|+Sg7^n8{qu+us-o;{CmqVGGC-1ST%_#t6qK z5?CC?^ni*N&+1;-5jKiXHbZZ-4l_!TcA1LUDpY}@mR*0~(EM1Q*zKvYo=6zWfigLO) z^h=NQ4n)zmiS6m$F~l+i2{@+czn14o*S{3`Eh-%Ih3bmgRC1?#K*AT)rU!wYyb5L? z+IM)CnaJ7PC3vu!C{XgKup3hDhj^8!HGe~ZN$fNvMWi&Jj>w4ttkG8I#Lm{9F!h{D z!_bpb_`Mwq3x(R+=p_t{DlE#7Xt7t!bMx097Tb3{3{vJ+yJ&? z9X8pqXe3NAQ@|p}&_v>71}7K0x+{>wB7seaPSX-iC9~D?Lwi!h5eQ4pV%NV#rMo|6 zjTh(wJAN|R;KtAS+m;p2{hzkX*jViVf)7_N2(NW@3xAT1TmSkC7dLBKg7*N5zFlld z7wCRQNgbJlT`P$O{&&qS)lp`VN+d8-fY6{s$-x%z` z)dk@5A=58qyJfV9ioIe)ozBQ<^^-3Lu{2kQZZHq4T^** zhO-v)$d36kJsRW+M$oB@MUmQ0%-Qi{4PYl|xNlqWXdQEFqpfaICLq5BDtBgr7q*>i zV4JzXV3A2pw=r!@xGzTfQqNWZ377$ z86r!ur>`Yc^DI_EMBT~KieTuLKQ`|@lGY)JESRLtpWTB;LJ!{i)~hAKWX*JzVx?*> z`yvflI34io3tY13sUbl`5tn_qcF`)8fdCqtwLV%aBt@XKm!XIW{tp|HQ;_g^@MvVV z>~NXjeZjVGz?ZfyZx6fq-(o)X0sPVNjE*b3Hv=sEJ{5Bu)u3&BC{YF&OByZ^+ zc}GQk82G9&Iz8-G&O4$7sxlbQa13F+C!#mtLQyOx)>K$331imZeOas6$aKP4mE5XB z5gOxrur)gyz}!+Q50ZUW%$U=8t`be<4~utl^%SiGaS2OO2=>s8cq6XA!E20|NXj?RtFd*)g%a*RVyBtrj5V-5DsQ1522ev2&3*|Gr21 zv+?=Z4KdI%{2N#sa1Q$)_DKIzG@4Ykm?cFt;q_-FVeqB+!fwvLflw} zZH$^)p5@lhI7~KtgWAaNR>%UmXzX4FV0DcSan?{cLaw;Opn)`G-#L_(G(7iT?k(*1 z*?87o@0wMO_MDD9JXf7@;WfEtXdErEmh+UPvGbVXPAtpo2udvF>H)=EsM!|+wu^7U@K$8c z-Cp0vT5lyC=FHBH3*CM)mn}ETm*%DnPjf1Tteo(+P}Vl~8J@4DG$6$;E1cQYD&FGr z46UkvOJYs#ayDKeC7X9rC{;S0DDGIXJS_NT-AW|0_jKsdj-_<#Awq z5MHTRv+gykc+Br z`L@rQYaL~J^+ll4`~~9o6G_7Pn*}D(4G&hD%{jb zF}@Sm8tZcJUqMQsTPJS8+2=X?v^pB6LEPhQMX-@Ri$G}(h>@}V7@Y5QXiDTc+dEb` zcJsz-RbWFCsUG0CB)LjEHx`EXtRlVz2Ieg;eC2Y#Gwu-Qg`a<%2`E+|I(`#f^%usK zgk1~-$xo76=jOYW%+J+A4>5mMK?qBX49fn&nOZ2qnbwDs%6w|M$N^evQ8-(^th?7@ zC##hT<;mc@fSUYT`@8Ys_N7yOt#q{a)S_y!wp6Rhv}}cDZu-8qF^me*JDck9c-8Gm za`jLFp|SCL)UCN)-HkF&s@YV)P(}uonE8d@Y*KBf_rK(CLk)=&y@erNauA2 z9=W#H;(h~9NeceG zhJd0bX=#1hXue)q3)rP$ET3Dw6zkwlid}mKy9yCJiz(gX0jR`iz()*6p{bH?j7RhR z;kPQ1!=r^{d2Q&%M5Z!C~>6 z?L1~Ly@;sBn!6`f(U{(|B(?kaK5JtPx8=681Dh6i84JfVO~fX$NIHh`w%aYO7K#_g zB6WM!D|KQ%FYB_t#bP_fVBOJI+fuO3Fu91DT${Sd@p0C%%N(iogfs(1|JxL^F0we` zN(7N~8#r7D=Oo{2slBF2-UnG{`BbeVps2EQaA8|H1;*o$+eah!$B4%Op#AjTA#!eR zi{MkmbQ?5$l8}7S#2=1kM)l5Ba2<%lbp)$gV;~nz$8tD^5dLyFsaqxCc-GFrK8W#+ z8axtf)6Ku8_SC#*eh)gRQJ$mEUKCp{wWaeolyJE({S2Nh^BgG^wq!CLcN}XDV&B*J z89aCrW2;rr*`U~(uqeFBxW`(nzh!lum*UUcbkpnLxo7p0dFQcz>*XZ-aN1PyCIzg! z;u;1zO{Vg_8N`?>b{btjQEZlrdw(7`<(hjxY1v+7KirTECiS^dxr_&87Tdi$J2%3S!($CHj7PA30u=0m~-ShI}E<-3K}$; z6P~EuBjGA^3e2d$z$Wh!00g-CYfeJtYbwny82M-r>j)Lb#&u7!N)2FCi0j}%To)Wl8f+UHWcKqZtzs6%%uYK6G z`bU{ZE*KzrA5#$d=LI_|*wqoG{OnHc`Kg8$a6l&@>d!M)R2TFta8;e8*+-kk_JLrN zCCIhy$>6mFP^$!2SDd&fswl;-4_2^cuvVuV8F6`Ks*Ep6xO_?Rj=xN$OOtQ23`Gq6{PV~8EisnX_5|wY($Lnp!DRITC7rT-kO>A6yuu(_bglsfg^mg`upTU9`po8@+wo<47Xe{B=o2}jDN9U&5s42Q zAl)HfEj_d8a*dpTr6{Df9Ha`cyOEt_U7{VF_(##xLKkCv7?6v~dASXDj9>^oo-rwZ z%K=_3BFyPV9!k3aO_T4BQF%URBva`E{0&!%opZ7gF^M-uEaqBr-&E zMWsx9NcHY=YHKb9!lxXXuNQ4}5^`3yij~(m#h2?|k)!07HsG;6E!dYYNJ^8W(|kzu z<^XR4Jtjn@TkC&6`P1(da(g#2h53d4NLo!CGXc6!N)~2h2%qFD^dB;UbosU|9qo=p~r{4Bpd= zknat$BO96Q-3`wMHKtICq4{E4{# zc(!RMMCN$7K&6CFMa{kee{=z8=>`f>ff_M(W`cjYjSP$@T-&=1a(pInqBoRU0!9uD zA(Zrj{9vG05WWp)-ts8au%FC{wOP2X^Yu@m;l^6jPJHG!^#>=uQiz^h1Qr0ddkH>B z){Xp!Od!A*nksLuv(T3$hz<0Fb8 zSrAK?eC4bjFRC!af9UQ@hlb~h1&9L5ItI`MjLnBY{t|-sivHis{+nU{lJ(*rS^v#E zfUK*=0kTeWH>^8}@%x8W{eDc(9Ut^N9b^JnD;t>nFUtR-8D)p$UzGnf?B~Wm(gJ7$ z0kuEthaP;8;4u*8US`^Rak9N!C6#779H2|Qndr`ZUb+bWR&lwX2aZ|(N+3`Qkrb*D zGp7jp!JU8c9%U!*9|-`aW-9c-5feZQ)@UL0F~&bC?J+PJY{Am`4ZY8lyxNT{j%EDh zI&=G+cMdSd#pQliKlHzO3f@Q!;Ot*57#k|ihqj{s(*m>%3hqN&(Q!Vs74ZDe6M-Ev zR)DrXU|;GD=ez6HLXU`LD2pZ-rkDP|&7_#6st7E`gk6Ek=!y~UX}{NL?hmud!Zq-a zcq+b@F<8K4V*bH_kL3)Y4X}^_YvNza8K7VQ76O*=A4USeT0Yjq-wM4IfKz(lfZSrE zlhX4c<+UHx<0F5q2aCeNkVLL$-WWQwsigl0YII8CwA;lB-SC^YvL(?lz40&ZtjNZo zSN^}&`}jY-!_S?7eAsqz3C)$|YIsJ>Y7&4>{a@GEU(4j**6TxSUm}T~S1i1hsDHd9 zs6nC(CmY?VaQ|cKBG8*QemxWf!Na>xx7>E{E`kG`!ct7bD)MSDz=0IDlhkx0<0fnj z7I2wB|KQ~|{mYqY<ko(*{V)X;CY z>+4VhlL$a!V0lt=9iV^v%g-bq{*qx0ei1q0&p?NeKmPbCFp`gj4NCH%e!$2dwgq4Y zKO85UmXx;lhhL23jOmF|#~&XaB= zR8YD*l zXa+<4Lo<}8KD# zY%i%0axu>?O9Lzy$$otx_-~er*jWBrHTmDMTm*gJ=D$3M#P;WLdp1@UuD^B@vi;e5 zz{mIZZaX&U5Ay%tyY03UHLMn2x(Ll()1B$+LdeyB$=317dC7i8aE{6F7AsOkC}Dum zZAuqz|FG{X#QKm^C^L~6#>V?_bQI#~rKFKzIJjD+xO6|WQ43E^;Oew_+TNjftwx}> zq46xfzVYWIOYTG0F&3TSWtP6&ysw1IEVX@(yXr=e6<5kz>SdkQp5B_)vE))gEk4bq ziAL?KbEZ}vPT*4{bMl1eNyy~n8;wjJ3Fh%ydS?)ssc7S5#+&oS?}FD|EOZB3i`$!p zPG{Gn7V)cM1I9CHw62GZESFBn*XO5#9y6M^?3abd+ZU$S*7Y~7IwhgE9{cT~yq6lw z=V>1-Af6=)=T5GROa`_C#~dDyrA^e5&sD#P z+h*bAFJQmXVRuqP*AVD8Ey;Fp1qi*Fbcc0$wb2`U&r}_N3XKYK(BZx>Ox) zO>Qrly>Zu^o0GW_LTbI}C}ex4ITE8J+8McOTkxU=c&3*3C@$^l`+I)Af+PW160-}j zAr8wcH11IXBPEj7V)zh?on5N;_~(0N0^OyU7fMS#RZn~#tEv_yH_BY+T!?*%cJ^qi z%X<(K{NCX;`gcs)6N?R14ThRus*jmMt@E_v9Bk0rF?mkh7gS>*9}Fi*ZLGQZKC9ht z#@=drv9-GXNO^Q5E$^_w3OHFCbCZDU{aa+xDWbMXM`n7Sl?btk6C))&(PH@E{DP!x zjda>Wv+9eC=@lx;;W^25U3zK`<%FkF353B^Abl zhOOGCMsJl=ur_U7$lEb{e~@Ltej_8x?uu{q84=?waEj2iun}lpD#k*osKv0@SFY62 z5!&K4pBuX9ojP59U2nM>qUV>FH#eD&IX8E2#@?HEah$a2_a%gB?l{AK zksW#&R`iUwFrf6?gL!qYDQh%qh9(O!#44QmH|($lh*h#5VaDL5kp#WyU>T1wfK#j# z9@LfZRcN8kOL<9C1!JCBa^`r%Kl8(7+=-cUQWW``NoqK)CMe*)fCt_sJCc17OpKg z^vv>Pz|m$@>7ure6r4A94=QZ+P@-ar4MHiV*xo;TssC(0`TTRzdkPedg-z1|*zD{c z2!a^_W*>p!9V7Bne3}6+5C1SSG@tKRnZfKug?@F`8t8y4^A=#nm!c9NVu}uB;Rg&L zbG{~2W;*aZzx7{9@{T1?9%QgiRZB3GL5($>AXrm0W%7$5C!Da&Aq>)+M}7JJvb^l6 zh5VezHj1l$vGMHN(0StH$C52!XFm8%Qvf)`Reh1Eo}j{gEu>v;*I0;d^_ z4V*IfgVf3Fm&GDxQzT4u6)vguLa*BpPiYbHt>BZ#!-FAgI|zdQ(8=W_84G=FkR@@V z+6W=wET4Emo_~;ncCtYR301*^rksWaOo;=Ya>lXKq=9Bd4D=DI+7j2ia3L%4qp|+( zglgLg(!8BjhrqsO5gTNH_toyV{@ZMO$}Ji^7$E0~NZ^EW@Sw;;FaYOMrXbC2HW>K_ zXDH+XWvdu-7SqjPehm9$o~eN)RPEFug$T;ctP z3e+g6@@y9g&Sgci_kj7O@qDTtE>xfjYhu{M`#&o1ud;s}nETkW6}xQ&yVCI90u8R< zO@eML@(^}hMqW@h2COEAHE{rVqF>Tkpn}UvJa!0L?vs*}YywC`=IV|SK0W^$?gs&5 zGKP#J7(TuEc5?m#m)q=CX)+O9Hs(0`>$sN+K#z#6dNMu8kD5(V71t`z$El@F-sy(A z4&FCc#l(kl<@{|ZWmsK5f^4^mEv}q4Fl59wksh>d00J537WnCGtpAywY@H1Q&q7=I zIi^9ozk~6em@gM6D|IzRlU0wn4^1B1V9cYy3;yCNM{j3m6UI%K#0@bs2`i$Ul|$P1 z3reMJNdcTG%MrFdXaEH z_WjY^wLpc!m3T2r!qG3sGUZiI^Ht`2k5S$A2Ufe&{fF-`EGlvQwS_g&Y`&?0BscKyNHSmTD*=)&lGub&ayaWrwnRB?;A7KU@rjlL|l6g=m=Pn1dkNjTnUl2A>Rr@!dtDbKsM@}%iN1D#2u@KMt9ecT`Z z@MGGkC~@d<^rt3I0OB~K;32?l!*qdWj~S0q7f^5o^+KHHC+PsSuu4p)2j#1%h80oF zx**z6v}x4`hj1OgYfxLNDzbXI8T-ygLamUDtPx=o|Dr9eFHfP%p-TG?hvnGO*oZa^ zZJ9K}nkY775g-{h3XqH}%7Rp2Egu4K&|)37ieUbY%cBCnDmwmw``Jg`oRzF-UBA{F zK6c(KuS%!q50$^MJF7TK`3=wkq6L4ob%n^5w|L0?J}mUkuS+Sz`fLTOG+^y6_r zNEXrv^BFEs@pqg{3}xMH z7zFO%)6-JY`Lrt^5R+)E!40#W{U}H*SOcdfT7rrU zH6zMvY!#7dc2H!?LolX955j{=Tn`H2$~11MPE=DJ&94sn35fZWfxnrvTQu3^D0V2U zi%-*~=$W2$T_*B^dZ6^WcNM|H9}R)Pkiu#Mbo+ZQ@LywEL zxR9}&G^6xwq|TeaR0ASa)1+?Er%M#DsW0USnQR74s$@%?Q#=l+pezty0QmUy7O1-K zkKM4MKjl#X6<9LEZnj9>vL?YGYW+KKxYnE;21hK5@PejwL? zhydisq~ckKNIG9}1mxiSBgYXRvNRUxoC#5y9KQyA!Tij?|8HRgV$A=KF+hw}W`fxZ z1R!Xy7ZM4BtaH=7^m%bCe**jY29K&sKNW#{FQ59$GFYdUrcim;&DmSBH*Z`3U4NwP z+T$IB2ApXi#>L@4W89rd0N0%LZuX}JG~}D0)MQp<@lvsu)J!Ko}VdK7wY(6&I1Cclvk|@JdohX$?ahok?;uieaDiuz@d&6 z-p}l4W_B?+kzhcW>}WvbB?9dcD}lCd08~`d4lIFGGFN`AxUyB@P!A2iOQ&i`w@vdr zL?9|SoquOO`Is{lyEY(?fG3`b;DK=yaAm-N3PAFaHElpiRa4~@Gl+Z*SSNn)R98Xd zcT$%{0R_xLfM)Q96iiME09y(VPE4Kv@gK-^Q~#QR?lK*zr4%%uXCVM3+MiUF_Eb(G z&Pv3DVASGw`9K{%*hTA>hy#TgGA`Y1t$g*nK$QRG+da|n$xFwFou|7cy$9I?KWDT9jsUg@o zSH~ZN4Gg$bQ4s})kUi}$7PrN!ywKi+S;G=$F#qy#A=GqlLDc-r=#N(Q=sPOmaP7Q0 z0pq++zUEgi)WJq;;d-=!k7BDWvn-=VjYVhT%Q zv!hc17iZ3i*N-pznFy6mE|@Feh#wgOeurKBQB$~Mn5(mUVSDN@m#&q+OXeBpcDUHH;%HaT5`S9fRDZj;+Ou?@ zqc*hS`dG%ZUg>ZJVq4mvzUTcyY2%a~axmtW!#!lstB-0@=(KI}r@kDV1+6 z>5+Ck=D%DwJuGoPi@3J5xn4FqX*AODq~e>bG{68}4E9>ZV$Q+P*g5Zgdyj|euwI?# zl@oK^Fk6?{>s5CvO47nkWBJXk6AKTEIKB5gB-IV%kcw)nRr%{4l}0D7i*`4oxb^eZ z?PG|g*JY;fCkXIGIr*vLtYgA5!K;j!c4J3bF<}f$Kqz$Cix0O9D2mHG+WC>3&7=yEPQ8v%K4}K;rbs<0v%tL0ZSG9 zxh~<+hgWOP@d&1hqUEhQvVxaoCUoJ2hp&?sHA|a`$E>%D%;u;HBAq!`_TOTOTgXbV zz2N0~ed)~eHPWG+`jhVVK*5B1s9BZcczL35zJ=_R;EiHH-2<4BSKFW8<>s!tsw;_A zo5cO7dv`rP^zP(4Qq_C20IkakJETf2MJe^Y55h9{F}v|MWs< ztbPK|Qbiez&SS{+Ydf6wb^=2(@j=GWqdEUR@G!xGj~t<#)4S^9Qie?IE;_x{Dd z*Jas%KhiC3YHklaP|YN6u4ixf!tkw?f#D-yN;`X7Lp=*rr-bc9GpnheMB?vfh)%A_{2?sB-vE85HZc=^|7scsXt-66z>8W|3} z5~6Pc2Cv+{P>5WgO5G0OsZFw3l+@RsO=u=jl*=4+YAOboea^&o4#WROA3kN^_BwWY zt&!;J(K^*}pNZD-rF=&t;|}ACgVhh@9*Ucqz%(;Vg!&7ewYeAV-#44xS?Rtei`IBP zafa+)auPOPD#RK*0p9UF1U!;Amsa5avxLKRP_yE~lf~IC{%UV~6KibhmeO;ser6j2 znVNwJQd-^E?zeNMx5uM>;Yj759-GnHB1>*a?u@P}P#AD!Q&;Tdi*#_Va?_pE?a1z` zb^UxA{Z0CUH=XbkS?jODYf=)eLBX?|xef`sBz{$9x4gb(w3S|2SC!oI2s?|Jig&Lk zKem~vC!00%)r|FNe!1{iN1n+axz;JD>mKG;vClDRl%B=Bd9i`7?U3sbx*A#L=@|c2 zr*p? z19X`JZkd5Q$FB)CmR}QGZ@zVPWq0zXZk=pa*uZ5hJjxMRUQ+LsdJ0wm@cdxpsxMp~>g_(r_OoUrSA?0G zBYk}3K<}(Tm2xO2=g775(CUMszk22Sx7OyP#n}VAg${9?`UA{{+GX#wsFA)K;S*cZ z9ExY9MOu{VTG3mfmNU-I2D~kGeG6&zQvAAU`huNF^$Yt<@CSt4(qn}5%_LlNH}Z|G zSC!F(*e5+xm2)#(mjYV3Lk#F|vN7i}x*y(D$>ZGblgF5t-kMo`e`H8};-}w-8uqcb zVx5lFNut|zKV>g|VUU~p743V9`x-28mMsikcCePTv|g;Ra!R;O)i9hv_rbOqt0@*H z`vPfR)9aK5y{>wXLkkrgk;5a|v*GM)l*94C<=9y>=A(W*K8VS>Gi~8+gA7vZeCr>? zJ5S2IyKEzIwung|G>)S(4QtKVBnz~ZO*A_&T!izKf3>*tco3Kbv^{|xFHXW)a2y=* zfe)#&tC``ce}!?y0;Ryd^HOKVTOf6<^gvf{0~3_RdFIPa4ZQS|iZ&&13Tp+RMX}D| zh3Q4C`u10gz%@b&vkF&N$UEQTUkQ!_BZ>1~={pIQm2ymZolUmn8k2gXiS?(h6T0%$ zCwY9zF;(!h_YbwnAhe#--hiGKf}zs|K`;IePB-25r!|I4Sil5yINMITx6(2NjDsU` z)=l>za+Mm{gd8)s$j=Y}3O^FFk#(lM`BTSB4^;IQ?nIcLxcL9Aqaq8qTz7L*WFkmG z#qPgYp~sKY;UP@ugR}eWg^pudi%C}1NXvCb$S zB5ig=D}8f|`}w}P4f4c~0`iIm4kUM<0psO?mNsTUSqU2t0^4QW&QsfZliO2J*aqV2 zj!&6Qa7rl)gpd}PaRv1+e=!*Vzgyc+VR=6BrR>ijmc9Cf4(!UZWZM^K0odY^zKTST zYs(9w3-^~GN!+qWE}3cJL(5Aj`A%v;RXgF-_z3#~A-%6N9npaWFu=4U3-+o=LKtD7 z-DA09)V5gcN}#RA&c;Su&ifU}`&vmk@BVQiCKhXqu?#Ka%Xnu#3uA}^@)2tk4* zbJd>LZ>A+};1-M5mhLPjD^10|gb1&`sHq)9+e`l|z;4R8vYCO$OC#+!$TEl3sDmLo{bh+z+Z6?E zz+lv}2eBO`DUxk*T%ve^5;9kT+wI-ib-yK-cm6H;?+)&*fm#tll!>%agUEfTuEP=k zvStM))S5m(`V0Of>TV{D~GgjA4CuHP{(hQ za-dGgWQ_oQdQ-Zv?L$EHlu@uIqW>#BmsCYw0v2je(voogv+Rey0?j~ZG12280(@C6 z5xwm#rAOPT&IK=E7&Tm#1GxQ|ASUt$>bH4%zkv$y!fdu6rTvJEb^j?6lIMXB`2SZx zPe@fLuOIdLbNPSW3w-(_(K6r_Q$+PWdRYLhMu9ccQdU7ef~jYv2iC$Ar~s5a+O{lq z!V}CJd?@dmEzm$N-8tzaax5I(ry?K_+l&7?;E* zBWY-RYTdu&>#-m#Q8NJ~=G!XOt#L?-JoQB$pZcqHFz{NG!2+P5ne+lcfoCCJV?y1V-+0*HSQ_Hj5+*ek$+a~EI7#7f)) zfqos+@3(;u1ww4B8#u%tCu5=?Mo8~XF^O}kGB5?e<;iHepU zAP12KCA|&?w6y^PU<%OdaXqPgDT-cbumDg6-Gx`px^19C4)Q3Ma7C@)7Uk!?iYnhN zgV1?#1ECCPvk*Yt0-=nf?Q#%)o*75G33wxaI0mIKn^AN9WPp5h|t(|l$XY(}gS(nDn|f;3aoRlyKa8-W9{Xy5?Sb6`N` zp)cwy?+Zdr-CZAsx6Reh)qZR&nHd&OGIj1@=F@Zv<6On1*;^T|NK#_Wc6M*l<7X;D zav3g9SsLZ-j&%+KIB&P+2JP$Ma|$S|Hp*z@E0k`>ZfD|?9XlYB%2{Fu`4?|5507VB z7jIfmfLq^Q?UN$cGC`}|T{6yh6t2yS^TA|foDh}x>k+F$D@(^+4o*j5B~(+->iVgf z**PsML9O=7c&r_|y6Kte+kQ&q3q2T0IPlA{(|UWRep+!vbJi|hmTe{7 zEEOIVZMk-l&Wq%zxXcF1U|fBt!VSM>baqu0JFcmo)Nm3YIl{L*LghQ#E|my6oYqY+ zDYZT;=HlIP+j%fg0#mZ2C5SM*6Ze|HA{UE;7o)OL#WyaM#OzX{`oTKk7bzDysJOb9e!a6 zY#}#-3=3c)v#TwAqkl0q`az5JK50R7x$~H~ue#ReQo~g~=DVX;7&$%PDym65Mii4e z%5rGkk@g2GN4mLTKyGSJ*j$h+c!9wAFr{J5d@1j6lt1}a67)4N6@Efu;;?AK1=v%J@*_Et6Wl1vXSC48NmuP!s;_aMFK7bS7}y;N z5X6V&CS0ljT4Hd!FF+93Y}$)h4Q#dSMFO^*KI(;THU)@Rr0so9$4|6GmS>{h;3;!+ za+&p&e!e+>h;3hg`u@>_@;2&oTPZ}YidRp3(D<}e$wGr;oe+GT9xioDeTHQjpGP2i zrBe&~MOhi*5&0<&}?l=V=oY~b+i_RYRaZG2V8)dZfuVQgsfmzkkO zk8tyXf|J?+WPZuin$*M^SpKnJyvOretPgIoU03SDA4HYQ#H&}xPT(y{qUWOcuzk{- z_*pinvsD<%F{qB$(MIy#<+}`NjLXXN2t!C2%T@8I%5_$u^ZuTGp^F>)^`?PStd{RH z&PoIAXX#UkRouHHpDb;z2HgZmK3cgBsLt1MtMHa{8YOKo5tAjnZ6%bEqmD0oB^^~2 zfmXYbA$#EO5VmK!jnPHe!>Ow5LZ(tLrm6pGVy#>c+t~L<>AjrAl2evXW@pK+N5y%1SV{A$vhihT;TQ%d4*z=By-;j)geCY9sQzYp*~!# z-XN2rPHH$d?r&t#@8sB!mp_zKFy;6Qdw2t-p%|@aI%OcibwiHxlV;8R@OMG#qyT(P z_#%_&KPa*-59Y@xB44L9hp^fCiraP5;v3{TW)MEiz`Qg>^L9dGi#w5HV4AG6h%>Yj zGk%jFLTWmS^ogpp>yR>Ez5Ho?e~QT0k>aO4lPUWz?46Y|^I!1}qG9Abtmi>rFz-KJ zBVDg!7?O$jP^rH$E{Hq+1>ms#bn*4q&(3jlRs@#qsK?ZY=CLA5wBOO_3|yo#8OVO5dR4sIGtw4q8n56s|D!qtTQttT z2E!zYu4j4f?W^)$LbgOUc*F*vA`Cc>z@STFwx?e z`^!iPxYC;>|4ZA4zk2`B`;7M=Qp!4B%-Q z>%cbIwUl0yh_AdD16k1wmRtWPo(Zq?Wr^O& ztdNxewj7Z}fUV3IS*hD)V&mAr_6jcfI}*}bKk)rb3cOUB?k`0rj4^}l1u82VwTf7!|lT?d9P8MCtg{Y?S(zxOcz zW62o05%~XNEANbKIB~ms`~GDEDv7N%rq8OgS8i^Y;&PUs5_gr`yugG^Swx)_ZHcyf z7V|YZoPN4-%GdB6@&?C9m8HBB?_?ccQ4hk+MuFklcNe>yJKs}tPXk(QPLEFZRBjKC zEzKRb=RI=@PqcBjgxQd=>Uev! z*DfeqcvzR4<+qc~^dqKbEGYGv(aXiK1O`{oRIQhal0$aCvvdHHzxdiijuYwp(c^j9+Z&9Bz) zt5eD&H=n1nFSpl4`P@Br786cbLKYk1Aoe!jtR~%APk^7wD#}XfbUbd3?w1|*$qKT1 zKHnMqzPi^%-b+6Jy{|j@>gr&_Si}9eLwPlMb8N9|#kaPh*2X2@)UJKsDS>eti?Eef zxj5hOaKim^MET*VO||^Rk$U#6>5pqwhgz5M`o=BoKJ7*ul}7IR-u3YFEVY}&%9$hI znzi>1;VqXZ%uwj`RHERGRoodBOJnu9tWHDh`M~DYYSh@*fNQ6dq%3leV~@hR z+O_yvr_e+BBmtdDja%BGY`gQ>tIz^Z$F4@VM{g;_wj5IR4wFqYj3sQvP;Uf$M27`f5_Z;n2BlmY^fYP%=+$IdMXbou|NCu2a5* z#zZV*uASQA#DYQ$V|&ly=KOt9rq!W7LM-lf8^Mo@`&Ad8?fB#hf9CINF|A%PXU7Vx zwWg}w_T%$jxo%iZq>SSbkQC zW(An$W=U`*>pizp-nOsjt!Qu6GvuvFo>SlML- zPr~6OZDAB(h8p%@WDsR;%VB__US~3CSZTTy@Ms`L7F^bDC)gcEGfIt# zXYHDEC~WRr@U=jKulic~?O@A2e=)arl4Iw|Dqp@qL1KBRgL2km>!0q%-`_M1LX-ir z`K3PJytsibKE1m!q5|v?MEN=5bLi+gFI^03j2-k`9Ox0Bn)uIGq31e)-M=`2c1vG%ZznngI*y_v2^q_}Lbez&>uY~<%hSc08I!(Ej5NJR zVmqf+j8}A&hz}@dGY`}g&_$GgHbo4(?DD-ba@`RhS_46s&nceJV9L4>e9C#ts zO!-g=+AxbJcBu?hvO6IBE}e zRaDrdfzKLf35u7RVWOqfX4OjwXqlTqBEyrSSjKiH#cS!Nu(?)7wVLso%60%Htqf`n zDE1%C-~+(kEHI%pQHO{r2-&Uw=?V`)Q~(%8?||eTRM_y@@@vz+rI^m(_lU4pLdM#i zAU(RU_G4wIKeIo~G}q5(01}ngIu7h~av+3MJAfDG*8=Zds3clw_V^~R$GGM z{nirTA3#d!^ zpp8t=YUwP@u=^tRYYojlO=gs%@>t5q&H@w{@*h_m`(KJHsU06qbZwTDmyR`tTpuMD zZ*{Wa$yN6i=tc!sUqg;snVk~ca}8lH&`erxJ!c4a!cY$kCD5Ja6N1rl`=y$;i>`H79Os7d*zx>_(ma?v3 ziy4!#lrfn7K~|$Wmt?Xm!Z~Z{G;|=Mn+-v(I@16I3aT#v6a;M$D7hd|)EPjayaRy( z?M6YtiU=6HJ2M5;IU)!{Dl+q1hb1g?{HPhqSUCx{+ToKjL3wgr21Ak?NJmC6NDCa?W?O~f~KN_XR zaq?x1{W>(KiADJ-KhMqQohir)dyc}#-=0j@jj%+u=Vl1kU|$Mzjp%pl*0^Lt`DzWp z$C(6xAl-}!L5_24s~xU~Qw3iy0&1cVb*QnIB$+&|d(Aj{er;!}taPj)nWqPeCxo(V zQ6{}#!K3wb6;+UFCXNSWAe9djNG6(;ei+^}K#wdf-sCgo*^y0UccvfzH$inoUYvL1^fWEz)m8^!z%i0S%#+wG_QO zmrfIFdN08?w?!8Szt@HAHD|2(YF;;R%1Nd@fTaEH$)?a*pHrl(eODKbafc1Q`%YMZ33b^BjoN9tk?XS=oE&nZ^D; zso^&l^XxY=W(2R+;C%iezo$6hvTs;Ge1rk`prDEbqT}Xh{d|8`W;YAPt?Sk8P@E}s zf~}4}n6H!`08tUG4hX-!`2;d3GIQ?+BKnW=2>^YXm77EX*2VqUstgamAkT|6T zg4uN`dfgmI;a_JZr&bgn3j6+stR3cn6koNqwtA0Msk4u*nIOF zpY6Z^Zhvyq+uvunee|TWpiB|;ZeOb$G=hZ`d7S}&;WFhO#k2!Fl<|c?am@$4j@kh( zH7g00QkMVQ(YpQ=#tvct2ZLdh^VQ|46PfWtxa{czt{8uP%SOT61?L3NtQ4W32Mq7? z^@13C9{L9j&IzFLwL73t9g!k42C(sU@vmz@n|CjQC?t~rLOL;7lF9)WF10;eDjz`J znGYn-%eF)Nn|wgy6n6;EY0A5nA4rZ+pFkDRF%fiZb6#&2k;_gn(hi#|3(7@VL;Q7HwCF}JX&0Lb! zrIVu}tUu$U2xtHY42l{jPzw}X;N^(G^8Vv&@Q`r`nB@Mwu$55L_ z1JGlKmnkuuoYI06^Pk*_mNao(dseCyE1sI|=IZDU>}&x+Dl!4aGzu_}te1in9yHQ{ z^LhPqY9Let8SZb|>W*Lz0yz9T;LSJ?)?OU>h{i{;3~fDhub>;EK8~>JD|pLRTjKSG z5c?;zZUC+mvFk0+mD0TcX!vFILGwL0I%Eu16RUtwaG)eWVe$7U*cAp|r$q9+qrlV( zGV{HFy9ye~)r`hYE8A%&wI<#-F<1J5#TSJl=(9KY_eUPMnQPb3K`jkb9B_YC5i}`x zH32kxuGjvZQ~xAnK%qbe_sVh@Lw~;ho8aaQ8W<`xYt2aiOGXATx?6B81u=y4mwPn) z|B(Oj0CI7#lt78GT~IrYQGOSo%^((OGm#eeNbI2Hg*pTgtb%9C)z+ce#t*0kP-B2v z<~Or<_0(Oe-~GED`BTdP>I0;M1BxHkrVJoGf!5le*S0npdb2XAHDv-ZB!+9BhSnEA zjRs^WSBQnme@c1l1RYw-V5Ix+^%-~zu``)(uL9;Tk^hHk5b&!_z^?}H{K{RcmJm!V z)sABVqW~ycm`|Z|0wobWJ|NTf;!GqoWCGGf)iMWY)5PVQvHJV}AsKi@Pfop|EcFyB7YdYJ`@$s6gf20~5Xzcj7pv zwH45LXQ`6fo3k^#o&w+&E<(c*3cbvo0`~O?kCv4#adk9`9FV zeK6sCNs1Tt#pDvF(Ad()cXOgDcF6_3n`j5`CWbM9Vr6Q#0*g*w+6eSP#eA>^fAb@vOb!Gp@daGeLn6n$u+2i_6<(+9~lAdz4o8{2t!;{)0J*9shJ z-S)_xPO!523XRXu(jRa&AU^-;0`d9p+nm2DaOhnO5T9p&_*?^x&o*D>3%l;DTYo@` zz5?9705@cS2Lm^gJE%tAVy0?0fqNZ8FpKtUHAgf7w@hGC|Ks?6S-S;bo$$wXfIBuI zcKsd&yFS1P+<*K-)UF0v{QCF^ z*xrS)%YREr`#(m>#+qqotA7%!JrOJQME;g;Ug!SXXe?dto1WqJnQbD+KqJ+xgJl)v z?dGNp`X4nv2rQUKS!QQ#b(GZ^yZY6|srU8i&CQny4fG7qS{`jaVM=@ebi3Lgp*_9K z`B+@Aj}tFUAYOrlQS!Vb)AY0dmwZ*uLYRFl|ch7=LJYY~OvTEDsy;{U^~A-r-+IkYYf|saQ`>?$zo}Op?CkGLu?L&l@l z&pRwWNKUB~Z)IcCUFY->OFfExS2E8$$2r}Ggrfr9_!yNR#BA5E7@jq2E^Zq~1yX8y zV2`tljG3AfkfzWmTMgWr(F=Y~t4Z51V*fspn^ei5=lovBEQnHL`-F`uzhFTBOGjw5 z4P9`5t7!%0n`?>6YioJCo+nqEUmxP?ILLZUa;hJTP1a2C+#4-YI@sMku(I9I3J{U! z?fRBXpUu8yqsz4n8SnaRaUg;dyodJI&-*DPyS$Jht6)Gyv{Wk1Uc2?jF?t_{3E!M( z2yv0EP_I)*P;}QrPVct}WV7(H^ZOz&JtnE=B?ZiH)hhH{l1z6Nf0Sq{V>c18a>+Z` zu9e{qsbyDNdA;Q}_duHeNR-g$U|rX5?H0c?haA#pY2MWD)V9>7^DsK0pObG6tF=Bl z;dut4o(bPO+l?_28D3HZC(oi5dn|@~OCO^X)&z3H7kSBdchui?QniK zeVtzJZ|_wXO~PZ-{@9Dv$aGwU+3AJbPCi>t!lRQSQ8(3k`#B~B7^-sgNP?b{UX z%)bXC=r@*}lJ3VrFK5z4^iJ3h!{yw0G?i+mn#KD_ePE*2um#4sZOKiIvyca~0%HpO zw4E-1EZG7>xSh4=yk#wrmSS!AAp?gQUOl>^kmByy>NmU8*J>72Ox8-=OFRi-0isO< z^*BA|g@RpCryhN%Yz?zW{agcGqFU0$a7bmtLej<05zF{qGa&24>h#nwbuXjhKAL}l zViKrEe*web(Elc{6^7XXTY>%)3^O}+sb)Tm{>Gy$RUzSFbx=*S5tJHHjDudfrkT-mXiZK>r;-6dtc5Y5w z$+Hl+M_bk~^Dki6idu!GG0Nx@EwB}knbE=@mJJI_>)lO$Wduqqz4-vtz%MwEpxT3) zluRV`s9E~JZ@w`t@ra-nol2paipOso7Lw5`rA?t2&kG=3D@jc1y3-7Pxmx2-bLB^( zzIK{iS>Oby?RcPl0+>AaNY>%oguG4=&iE1VX6a$9(_rkK?eSbV>YrHc4+B>AX$5EFDy-3hWDNkI(I)J zh!8e=;ci^~Ln2?w>QpqSl4t2nzIjJw0!9Rovu7kML)r$g|3@qApjJ>#P-eIEkZa71 z9~31*Szxc9klE^SWio#f%Hd zCEn1$x$zN=3t_fFSbOqIWiG9`+qI`?obOU4>F!}rrHpVTX(`$f4}_*yzPBpNsjB8* ztpA>6s)~7yP0GXdc>BFsTvXhGlCR}=N&zfgr}$M(Ux4&MUt#qYr`$j zdeCaFElWooT0SSPB>ZG}&)zj^yWU^Um6FP)&S*sb1wIJt)ni|R9=Xw;% zG?_MzCbGl=G>$?!V+5wkFwCC2VhT{Z8XjLxOsxm{LSFGH;ovQaqG*Z*N0h5B32;Oijg!{F~NN&Zpv8{ed4S_t%?`=@=mq2#ph?;nJv zY;f^E<)$d`J94T2ko!RgbFAb-Sw5IFbIp+1rEYsvEaZreI(O5eM(tz!K+XWHumivo z$yhvjckz9O1?SUy7Q|}aR20rU0vv(ct37q_~BZ9}Au|@QfGb!f0f? zyI=9s#Bcn`CUYf!dMw2DT~`|RTf^DLfUHf(dKx~ZoG(n zGsRdgkqL3cucN-OMPogMp{DSD<3()mAzebEwyJW*>o#&-@Paw*72cDWLOQug4a|qc zZ=B?qQvwfY_hZZ}JBD~D)Wp*bl(-}-ARLW_3D#9qxC?eRd<^i#Rn0BLF2VK`nOTs8e(%owcZdE~? zH~W~V-`Oc@9sBX!)KqNMOBLbjC^c7tBmS!YmK2GB3pC(3PXcCpNR^BW!Yo_)SO_T!J z`mMyvk1R_eqF)S*PLSz8_K{-+p*pYRRTs zm(2czC+p96CfoiV>3X9Y7q=@dF>T39dfUh7701R~xT z1h2}y*w2^@$>}lWBi1G9eJQ2Po#xjil4nfI{TY`#WFl>pStn%jH_A`$P@V{@Bdn%n zHPoZem!td%^Iowi&p=c4?A2cGazyCt(rW^*H#pRYRl=eBY@SsjSkICKm)5XapWje@ zs0j`mCU&5!fT?`D;CT3gGQRF!ZG|E6vIuFhR-S79U`Jk5jHQmdYS%~PI?jb-^U{S> zw^$hzSH(!jE^$H#VJUT&qzk0FXF<4r9B)-D_6m<-(x(1ccT?OYe%!E-T467b=<>N@ z5BDKk?~<7rEET&A4-fm+!2=#P86CIhjx3|ErEVG5m6%vRhAIhQoRvBWj}CZspk4FP z(0<0aub7ETxf1;JN>nO1Td9B8?p58#6$EAuLvQ@k`WA&Cx?d(U=*;)Xa57RY z_6A1So)j3DRA?^2CGfMk3trpwMTr8G>xvaEqYlGv?yKX-a=~&GL~;iy$b2*%L;J-< z1gCi4kttn+S(OWl46(G41R8ha%y$U=zNqxo*IK`$X*j8sa-0Re;8ijHd28nl!5eq> zxe4wQz1X<$mnCt}hMd@=C6t7uBr_r&AtxG#N9^I9JCtgNA88Wk;ftXdMFk)Jm>cUG z<&Y&yV~bmQCPv|1qWd7n`P5_U*|&%2oYKyZ5bhwDA{aJ;FJ;8~E%GZhKlUY_M4n3; z#Zyxm&ajD-34#d`(!Qfe67x@q6k_RfvyeeJ`F98QZsz^xv>gL{l3AW#dTtaE?>$Lb zh_E0W%IkmsLnuPrMm)<^2YyqJeXfb?MC16~Iq-4BC`l?kdw0I0MQZ~nJ(8sfW#vD{gcb#vt0c{ zgynBXDlskvaaJZImk;CyVyP&k$sAy*C_wwJt@jK;k{hGz)r6HCb$h>Y>2f}q-M=gd zXVYH&dcjUvGQRrlJWgCp+~PQ|2>r$KC}-$ugDpqR_RlVPu~uW9@o@!_1M7Q!{Nc~9 zd;$}vBfR0ij}q}{Hx(ohk}D5{)p6^1tn{Vl51pUis0oR$NSAb$a;^$KQ?T`)6?3+~ zc})Pp_b>B&Pkd87G-XZRdh9_O^(&FP!3SMsNIP1od#>V@`D?ezDYrNc^V#;??TUGw zXM+aSvUp6=v=yuS*|4R0B_hk;UXjBWHQpjevKSfuyY+@Yuc_qY`(Lqr54w!-U)CG` zymOP4i|g-?TeAPXZ}A`N4baVh|2OLmyH-sVFx%q2Q6}EZ{KWc(aYBg5eIfQGM{{T+<$MvUogUcGWj2z#n;u)J(+WicaX zs8wH}b=HJekX-vYQ@@*`<+~55?TYI>Ls1a>^YY7nJ;X!XeJSu0mrSZ$X#Q*H_{{32 ztGY@0PX>cfWv%VB-^VaV;-jpD5LO%y$|w~+$~*jg9II>heJN9Eh9_EqVN&=?Tgqz1 z51G64D^=H^g5T@t-G~=t*r)I3G$KDLRmRr_uQ$T~AMUO)Dyy~IlG0t$-QC^Yjevw8 z-2&36ba!`mgMc*BAzji)H_{FFh2y#B+M zOhbbhbQ9%zfGoi>1_{zjRDPIF`VVsVI{Zlu=V2tX*<5d%cQ{k~?*_yaHX52&LJZ`r zCv-p5S&c1p&j|{GxP4fHQ8bOfnMUn0R3S;C%D9Z;^}pJdCj#6c(tZrjPP1K9ZFIWE zO&S5QO`k5;wLLqa-TB;F(7kS<7;teUttH^T?_igBEM_n3{mA@izIMQ$>)7m=0HEQhz0 z4M(EYp{zkxMFTaX#A;2ZS(b_&&ZL+VM;#XgLy=ZN{-+zyS2qa@CjE6cLN5t8k%!6O zd^@4GLHuqe1ghN$X65&-_0|P;>XGAo$^58_D+fCSu{qBx+olJCGiQysggm-Y^%1Oi zuQ#f*ID40Egns`Px-tl94B;JfN?{Mbk>1n0rFldvFoJ5zl33Ur`JJB2CNG%PL&ZRCzVNfRJ2w zP+!V^&TVF`aC(WVe||ddn)~W@dz@k&oy?yBHw6>@_8IBo887}S7JL-WjwopN4!Ib{ z)Br>A=}X@uO9yO>5Xxj@%*J`ifwYAS#!*)(jDqsvP&32 zzE>QlhcNM=WxahgZn32PG`N@vNkQFRuz1EgS zjiAC)7=f#0CRTElVP}q@N`SM{iqz)o9gX^mRZg4bD-hZ)x{m$iK+freHHO6?MK}!> zm@il+34q%V5$(-@4Ft1*+Pr(3F+h_)Y68)ZsL1VnD~o5^7WojQx7G7qJhGE2M(S2m zk!x2+%F_MTw;|V#hHSlWN;@ZFZtY`uX=$(mUkMYQiFx>17>q5JdsaNW-!xgWmW%}dFz7Sbgc>1H^xWo@0+$GL&Wq%3gLWm;fPKCv( zQQIItPGEj5m8hKSD~g@LU}2FFRpM-SNVkC6>t9!oRIt2;{gL+dNr(_nZ$A}Te`=1Z zN(nk5cX=Kk2dK-3xqhX?HJ7Rdc`}i*0ef$dP|6NG4VSYa z%TANU#Di)e&0GN{a79E^+e}pw?yRQ=*-K{DEm1YWOIfnv-++L z#-dzKxcu}zgx@9dTa$?eyqW-;%C=}Dp^Yc6H{YFAmrX$4@J|z)>fVE;@0Q-ja?M!B zq^_+EUE8yNvhA-%F50m*b=>X-H(gV*4!Dx z4gV=0o8Nu?5JZf`x~=vN%4+F5>=yH=F`kVbhM?*MLsU~CO3ZHwN!J*_@Pubx@=ZZ7 zW3)pODhkInQ0V0T9Jpy%C&ZLdn`zjLpHJ8IJFa^K6f5z#Y!+rt*}GpSC|<2VVH8{pFfws=yH#P?AHM7Eb6J zHa$-RRSXWx7q;&;DH~GDXzg-}9opx(^m8ypV2%x|SPb>D9jN8q z)4|p`4nEP^(kc-|cnZoj@$U~)^$QSIW;M1-nzI9Ty+|sJe=r^uKv+fbQSOG!eP%^e zb)gYUP-$;quyAy#oLitQP*GtEkxW~Wi$*!JW4+kS2APa-H2t{%L7^2#XFhwjp`$S- zbPb9`9;jS!O6 z&VscECPh~2w`s1ls(v$5Gu2SJ}q=8LbMKn9NhgdT;nD2++9dOV~?0QjH=aYaUWXEhU55z*@Jn%u)wrGXNaNDG$e^e9T5TZ8G<%m}N6nR#~tAe&xeObc|TB2~ew z(pgKI#RB@^et6L%^7%BGi)z`=liOgT$*xV%IBfT>GhKHRR)-<#mh%HS&(>93qFEjK!&v|h>hTpiq`XUmz;lJK$aH*=RAy2Jj18<_1$n6xdPkLc%xpoCxh)FuI zjP%aDI@X*>w%pB~Os-#@xrnv*T;`S_ppaIw8uAik=ewqyeA9B@{T)Qb0IU2{ZN$ST z?EjONEg!mr|J6qP`H3hd4#vMu0kQqHUi()Y!S--8Na?5A2)iT>tnS6@GQd&G+(DT( z4on&y-C_G$)Bb;eV$Jpre=p3(Cw8FOE^l##SPd+j|&(mf{FE92=sjBr!Y z97b~T{aQkp>bB|Cy@jx{#jN0h%ZV#e86ga@yQWA&q5dmn)wkK0&}<`E6In8-<>pin zpLjCw%}h<5eD1iR#i_0~Hdn|KjXYFb=Hnt}A~}b)Z#OM-tVBUvU<=++)#Khe@m|fE zqnJ|F>+D-IHnsQ~78K@k_NdwKmg5JPPHnENTCTgMjc`|zFhcR#onYEG#gahiw<}T{&M}>CA4V_^R<%>C~sI6qqE`H0!?gqFK2Lb zM(35|`;rn>>=4x=OUpKhT-&`l4Hh)R!3rF|RHa=kr%*b5IGLRVHucZNI>jSAX!lu| zq06ZLa*8s;m9}t3lypv93+XV84OSs0tzWS9zXlrZ&8kA7?=clu1~>9zsLz%2>||Po z>;~fP5j4jtB~eWZ_Ofi7XloYQD4m5Qu99Cg>7Ca|h$YR^H2IshfHuH_iB3fw&eqU> zyl|qz*IXMs*dZzQm@$E+R;O-ZpZs<%wzh~qmadCF*3&{8_fDp9yrsxt81}2_+CDVp zxXc&iAc2k{38GkvcPN2jA4;$4-Z4AAc_5 zm%plnt#8QUX8+W~SrQ#|C|HN7ID`I|zuup+);PRas1*{XwVn+ioi zB)LD2VCysO`huV?>;22m>gi<+m}V1G#`r=~!*U>dw;24VY9xXxT=NW4FG$3|T|t18 z%@9NCGVH)KfiMgx#{~jVMY2DHNA)jtle}FySwpbsJB<>6*2^TxLFBNGGuZM|ftp7F z8?GeKd?^~7!M4dbo|l#PrCBlRM&uGRy4S=tDF>T;&XcKOGIOW*)A}9^uON_ofe2iY z*&)JySEdXPWVD2!2sA2ZCR9}Y&DQ~@sUol=yys zE?EXv2Hxf%{k->)fV%!P7#6Ec0#PJ$LN0v?aO<7i6pe`0QUjEx7^91z#%wOVh^Dcp zmeg}DL4|6oS;msa9W5{-7=XPCtc`}x47(kW!oNy<1|6KdBgBJFI9LE{E0CG}V4@0_f*&t*Zny@4 zTa|zeD40&=2i%tLg_SpqH;XbU+SYjD!6YX@L#N+yh8_EQQp`ZwBNS1Ite915L>AF> z8#hsz70|~h9e-esJ!p_X6s8qCmXs;X0je)=K-|K91f7UHV6M$Ui_YH8LJ^fA7Mj3^TwZwPF>~g-~ zTqRWSfLt*TqRD-M!2$wZ&#cUIqX}J!XU`b?f$GHhD zr0&Dw>^Ici>>UW!=YssZ3#~nDgbp zLPw{dNkR=j#Z6bwiP!UOwClM3d~eE$A;bH-`L8mt7hCpSRMeTkqYC&&E=g@MIQfoy zog|@@tZr=FLc3Nj6C_+bGD$F^J&xJ>F+w9SdJ4b05A@R@|U*(R!oO2eG0{stLOFRD!Ll}PuBwUX0-?hIpdhR0B& zmsGTUQsDVF!5qmzLYq}13k+^MpxQ;?G(WSjs_2M)zPB9>b=u+9m}nFfYJyni!r}7 z1|Dpj9z=}evs!1p&C-G2fQ=7sMbFihK){jnn>)iRg?(&NNSpIW?lOg;JcLMM5IIa` zNwbSHN`W(=#*7z-1w9KqOn3ci^`WA9JXQiQ<20*1k#(9=Z1{B(^vj-sz zWu(DPRpD^)^10%imu25YlE(vR8c4dvNxl@}?p|iZQ*g;%02VK<0Vk4{2)6b63X|)l zvEiM^3vOxzOjw9z7!#<1$D3GftB_Bq@JGKjBlVV$)a9=kB` zs^UY~?zw6e^jG;J#{<1Dso)F;jnI6=T0t%iSAfqz!vbANj}A>Sz=Nc|cZQ}yJI$r$ z)$^;OSpnX^SyjgBpDTX2o1t3j}r4BZ?tUg0B|C%f@+87H4bZXUSF6b=+)gaw@w% zI3gOSo53)0u*9()Jl@f2sCuE1I;^{lu2_aV`eE-V9r1BoCeJGu)GF`sY}GkyD4nY>=n{sU0gcF~ z8m*?l2Fa_j@J%J)P^quJb2`Qzps; zI&WH=n@;OvZ>y*%q6ig5OpplqwAF5(!*0UY8UoXFpt;vTObiuzDX6ZKY;(R@gLQ{Q zH9?+!m>mx4*`HeN@Prh+qD+|YXzO(6_abR(hXxe0COm! zToI?Axan%>f}y{6=2DDOFuLX$uT}(BH`l6B7Pl)Xs|oW$v#g>wvXbkJh{+?@qOiP| z_JTK5J`?9@8DoVvoIZ`hIVoe~yux^@C>3CQr>C9`_9wkq?u!gd7loGV;9%jGs(aH0IIkB=^3juU zbH06{G}x-8;?ASuwquP6zu4ElBDp7XL2kasDiy6y=%&wQGnt8fDMA(>*PiY*8-j+$ zG$4EkmWG&vL1J(O;#q$oE@X-O;2dr6l>Fkaov?u#iF zu@=#(^8Qzwrz<(Hc66FgRAUF-a%|~$?ot5mB*3=P0o3I1@<`eLYI`i3>8HM+1G# zI~Kw>vOZ?X3iTMfH}WGLAyb;$4lPIhe+jbZ_I|kyy{wxfpX&(bXjd?QhZNcsf##gF{1vo{IK1ZV07Tt;aj3lv({m6{R3N$jc8}23hDG ztQXN@$9ODRa+8^WP@VBTIA`STQr|J?P!=|Pbs+`vwVT0Oeq5{;E4dWoaeCI9hS`u5 zFSZS0CR6;+CmF2_mURp(FU4nL+oA}J%r0QQ;SLuYSY12Jlu%IXEtcEb^=`o5PKJfc z?7O|mF(yiF?aU>U6;oUrXNiAiKfJJ$CbZp2<{_l40h;J_!YVSj%tN5rEN$1aYb zrX+K6NItU&0$a(>=~jAZWh*^@-fSE0W>97EA(AH1RX!y$#P&)tA75w^{pjLVmO%A>TmKDC>49k`>QaT?Ny{^=CPS z7u`<*vZ#u%qJ!Mw6`cdDEHZt33Fh`fm#K#{vWu0E;EFk}Cp+HQ={h$?Y8ICLuv$)B~BuR?p1N^bU0!_HyKE-+Im}|RiLLC9tOGKt`cm=aHKCkC5 zvf@6+K0Bsad>tWmie|=P8&qmBqF}96$%XXXq-_}L*gUuyJq=sB0bh1hG9cv(+cSaE zJl2uVVi?kW@4qM;S2TD+n90I52**jXwtmZ zEb1X|^?<@qOaP1MxUbZtIp=ujipAWn#d+i2CVZIz+Y-e^<9C)gzqVJk8{Isb@#WWW z&8Rr9Hkvu=b^1QLVW0dR|0EA9Mf-bRckRqTHG_-nnR9cR9WVYcd7=+WC3P z8@8xihMMn-dy(Yp(E8iQV=Yxsubso$uv0z!d8pcYal0Td`Wf$%isE+#|4Z3d&yxyW8QAA2I+lE3kdUIaJEQpt2I-~;JB(~ z*jNEdw;6W|1;Qs{x$Z!cL9l|TyK9;E0|n6q~LL!8D>t}DdDr`>OJIniWLsTTu>JxQ5vWVLwC^nL3dyDt@^-XE&PW)fzc2m5olb~JB@ zR|pMs^KuCig=MC?)U}x&t^@9L1WMn~@Rgr;X%^pyPiDChIZJ-)-oIAf+h+L=C~{mn zGkBDMabHOuUxV6N8h$q*igp9e^s<1q0X}~$V-8nh09r0PKaZYBoY1hY%Bc zC{Yax|PXVkSW*RgdRCqU*Dx5V|Qr+^WdWZCt_Qow*=0iNzC~uLEVm zM-Qvl42HHVsS=RwA#x}$Zzo1&1rePD@e~rp7@HY1566^XjwFg0`|>x0C1m5J0wa>H zk#gwrDW)6xm!w7%HTV9)5|-8tXGkv(4PEJ7a~pti`1} zKq1V%Pu#&1JIh6ox;4^}0dy(CY;62R@yD7z^W<;{}^ko&acu>M3x(JTU z0_w@t=C})_)AnynWag7JA7#1@DPI{Xhklb8WW=F{ja-vPN%`2K9XylIGM?rZOx!hc)h21(te9Xj|-wV8w1wRGl=KH61 zFOU_1*YyMQR_xN5AHLN)efeO4(hnVuqmmLEYr0DqOYL{Jy`8i?hKGz0x8-W5FfJ)i zGF9gU6R#QiNWOhVM5;p(ciPU?18m-Y#_Q<@tY!YZnnX_X7KussbI=+j8Yv>yE791F ztxF`cg40rKheD-S$>eo$k^S%U+sMTiRDccMjZ}Z1+-eC%&b2lO9t!7NjuCv;Ued~KxW?C9XoF=}Xu<5FhnQ{UVoLS)9k%t*)besOtK0UwP=6-o8_2=edwR5IZ z<%nlSqEc!vT|CQ>IksdghL7OtWGgHP=n#ph%QPvJsK0iFzsdDuhi_;ttYwqyAcXxo zJ~YM>IvD0IO^XA#1%eV16L^ev_&o0Xg@JV@jv0lQP@gJj-YZPcLH!DSC0N2pFy~nC z=}Rc%f>Zgi)(ff>-J3OigLoX%&A9Wm;~oU0(Bx+p`ScgN5}DXmzFG5|4yQ&lg_?%S zaopY=`I3=(R2G7Q;aB_GVkX+AT4 zUab_w%;e8JN<7$uz(EWVgvdW&1?lMKMshEouZWo;R___fXzR~9dOH%qoeLX>wpaOy zK0?BTK^TN56aNCbC*V#BQyJQE<3^%#{OaO(-fyzOispebC15fFtYL%NId`{Hg z{M>rwc5M+XZa_4T|Gh)5-v`rYdEmz}LU6@qo?Qr5`ISmzk+4L8WX@8c_cw?Y<1Xj? zrQkg2&0jYQrYmzN3GH4D2G#-hyn43#{k3nzw21fa?ON|U8BHsj{lQWnQM>`UTzMeX zPE?W-GHu>sl%_o@(UF>= zZ~S`{z8h!4+@#)|7dAon483T%2j;>?Zv8Z-YSZGW{h3nfVn=*l&ao}i(qg->h# zK01&6}Gk;r(yD8X>=XYB98 z{d7y;xy66sg9p)cvyQq?7wVX9NIPoyA&eAt_>1e#jsavciikJmU@;vy4 zC80gJ6Nnr+ndgp|d$u*nVrg(q1VX2VerUQ)&CTvMh-FTvfi%$>dJdTB34 zqU-IuQ4hx@sX*rHJmw?&g$dR=LPtqS6x;bj+5@MC^`@B5hd8E2y>~ep0ax!_Ev7(| zSFe3bxZk|rynI7EnQ5xtP|+9jx(tncN{@bE8t<-lJDhPz zd$WHQ|20Lt?7hn88%H;S#vPHVsFFj>=lr1sJACZQ}0^tombTw0l!Ksr{Aq*APC{A-SKjoWnIlKcE(Nd}*3UqvwP zvl$UH(s;>%O%=1j)lsCqLh^+)+~KM&Lqf^H+WMJ2zbiu`Wb*y(56lb2W>Z}XtSEl7 z0VALX0zeHWd!dS{H()u3G=fbW4&?#XdM2oS9z`n*qnnUhyvFkM#I;7JSL)1lY1fMC z(-AQ-Y~7~|ng+M6B_rKC_-Pt;`IkwGC+U?1)!a3B>bM~wp);W%yLjz9y~w7|qr|Yq zwQhQc#A64KGC+A$+f#2eOZX!kXB5OEyOY4fdrVRVk;2jys6g*M_l6^4)0QagZ$fG# z+6nRu>9om=$muN%bYYH0-+(yBM-# zl6dHdN)jMTZaaM~7t9D>)p^g?heOCLv}{iM$`90!a}p7v+S-bhI!vAX70Q`e zgX9QDiDIu*@ZlubVaIk>fRhvF_XTkTRd$es!Nyk8F6rLyA7z-7u(mBIpvN*KCb0tB z#yg*7h(UFQhX_nSh@O_Wj29@(1tO3SiVH*Vo$M6WA57uCU=s(mLx=|z#Uq@WPdvS8 zE=au;Q-U$=5l$4WpdVB4a;c1dCclHP3gdhLF$p)?z=cx=nV!o-Xd|%c(h$|4y*FSs z6&Pxb-WZ2Ot530@ftNXN-`kK!iUh1DRUd5v^UBd+n3kbuPs&K{Kx&9ISqdw=vKwBB zC6@NnNp-fg7wc^W7RSZ*h-$aIHY=fxK6!W*D1R)t$|zDR%zRe>@Ay&x zX7A#Td?KfN_)s<}lcL`wa;^N<3pVQlJA~rWwHntIw|t@HBd9A|?u|Lzmt3G74QN?I z9J!$pZKTm27ETFf=`*-?beQSW)M{==6?0Qz{a&cXIz$RQ;tX3TPS z(5HuY-56Hyf~!T^GmrC=oo$+{2bq#>XQS)KnX!_hZm)4HT#~T&dt>!sD>dA!ehVHK zW76AGI*0S^T}qga+)Da)yTYqIEX0skxNVavZ)@SM!Ip@w1X(k(xocpISwoR225emV z1lm_z=QM0o>+aC{37Kl%G9XtSkXY7~XD8(KhI*N#w|I)dT#J(4f&tBj&6y6B7>{V$ z4VDNUD){VCoP&C$d~$3oy(l$vcA_(i!wq%%~=SY)gQDwt{R&@+$syk!zidaDx%-=u03SN&uWeKk?V zvnYsG&EK-p>3?9}{erU!C0*MlNvFs_OzBJ(G5QJ<>n277!EqKIi+mtd9Bq0ch|DQR zkZ62D;7)ZzJ!$&IEZ_@Lr4X%ZC8D&Nh2Z!h=i5r({lojdO3`S&S!POE6K2!9CAF7a zvQiZ>)rgK85#8>}=blarb*sF_oi#g`y$H$^G|RiJWT(~TC^CK>ykvxExBw-a{=rcC z$U0;~5NW73qM`ZLfA58RAo+j04mBg1>b$w!L%vyw7}qd(e45N?&NHKxV8t$V2$g|3Bv#^85zD_;6-DDLOjL2&?ofH`~o-)8O@T? zgao!17P!`B(-f=y42@5b@|lNZME6~O5)RH=9NIU&^5T(JnhX9ln%FuYQ~4nVQRxW- zvDR-LKA#3uzx#^y?3TQT1#irY)pmS17&h-ZRgoY|Vd!}x|JfYVmqUg?$AIU3l@vQUF+{U3Mi<^^YyO2An)tHa1LXhVJ-jN2UBJ87zyllDH z>K$d|9quYJMe(Rrd=ve`7fVU`bsn6Bab-;<9Vnv>1y7!p2t!4?du46}}0z4?Mu`q%drJU_4&#ZmE*ICo1U7Qg)G@Ioo zZwfCAc5+1Me#sk`LqFQ;AxGTrX4QC%s+(t!j$=MV^vb$E-!ogSkoR-yO(Q67o%Zna zE3+v-W*Q=6pzle_-N}48=Dw%Eg5SuR=hdm2ooKsO#%eQY)qcJf8qyN(WVM!-xe_)t zR7+p08~a6s5YBL1Ff)ryDkz3TcC26u0*(>=?!>j6qzhf~7)#6Jxgv;jo}g$=X;H{! zz7FZ>r;((5_QbZu*;u%cA)cs$cqnd5}(sou4EDfwTx3J z8G=b(Klf{dpKw$8=Imu78PT=Dk=@qo-Rs= zCVw1xrZhZ@V*6KT#5KBa_0l%`8&iTtVsr<|O^gf9n2*cWqI_Qy(mAGV>;SeL+O{)F z#-R@|pT=NNeo9%6sp>hs{M15zpZY4fgYA^>`lU?T?J?Shji78lkMwDokTuq!h>qaM zducX{SG6#&l}v1xl(4(>-i(-5uAhoYhmU%bz>U|3g}r$ByKGwl0tT$m5P4PG+Y6-qFMU*Hr%B zT9=1yK0njCXh_?wvcWf>m%UmWJ&PR}xsFhQpO)ld?KNE<%&l3*F$tJgq6xs|o!OV# zd$0SQFd}-qCX6|i3WWd?1n~km`+nh5k4M_eJ8CGcWD?50?SaL>gUqkO@3Pf1yg=#g zaq#Pa&xBNnlh85)%NU<6aCqv*(hP%NxsO@koR}VWrx8RELrn5oC&Tpl6kZQtw6l={ zt(5ihLEy68FIe);`SiRUwki|;;&{dbf&Pi&b93C$d%T&6&9EZ*Vheba#Y(JOzZ&gc ztko5aac0z48&~olubq#_29FjTagyCE2j3%+Nm=XR8pz{xe~r*El=VpsYvM>A!ge