@include %bootstrap @include %std_mem @include %std_term ; Constants @data text_buffer_size 2048 ; Global variable pointers ; 0xE800 - 0xEFFF: sprite buffer space that is unused in this program @data cursor_p 0xE800 @data title_string " »» ATK16 monitor v0.1 »»" @data subtitle_string " Run [help] for a list of commands" @label main ; initialize global variables ; BEGIN cursor_p := text_mem ldi cursor_p RA ldr RA RA ldi vt_text_mem RB ldr RB RB str RB RA ; END ; use memset to clear the text buffer ; BEGIN memset(text_mem, 0, text_buffer_size) ldi vt_text_mem RA ; RA := text buffer address pointer ldr RA RA ; RA := text buffer address ldi text_buffer_size RB ; RB := pointer to text_buffer_size ldr RB RB ; RB := text_buffer_size ldi 0 RC ; RC := 0 calli memset ; END set_graphics_mode gr_text_mode calli newline ; BEGIN put_string(title_string) ldi title_string RA calli put_string ; END calli newline ; BEGIN put_string(subtitle_string) ldi subtitle_string RA calli put_string ; END ; loop forever @label loop jpi loop @label newline ; move cursor to the beginning of the next line ; parameters: none ; returns: none stack_stash RA RB ldi cursor_p RA ldr RA RA ldr RA RB slri RB 6 RB ; cursor = cursor / 64 addi RB 1 RB ; cursor = cursor + 1 slli RB 6 RB ; cursor = cursor * 64 str RB RA stack_restore RA RB return @label put_char ; put a character at the current cursor position ; parameters: RA = character to put ; returns: none stack_stash RB RC ldi cursor_p RB ldr RB RB ldr RB RC str RA RC inc RC str RC RB stack_restore RB RC return @label put_string ; put a string at the current cursor position ; parameters: RA = string_p ; returns: none stack_stash RA RB RC ldr RA RB ; RB := string length addi RA 1 RC ; RC := pointer to first character @label put_string_loop subi RB 0 RB ; exit if RB has been decremented to 0 bri zero put_string_done ; i.e. no more characters to put ldr RC RA ; RA := character to put calli put_char inc RC subi RB 1 RB jpi put_string_loop @label put_string_done stack_restore RA RB RC return