aboutsummaryrefslogtreecommitdiffstats
path: root/resources/asm/monitor.atk16
blob: f0026edc4ad7c049180ad5b42a7c66dfb5f6418e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
@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
  ldi cursor_p RA
  ldr RA RA
  ldi vt_text_mem RB
  ldr RB RB
  str RB RA                 ; cursor_p := text_mem

  ; use memset to clear the text buffer
  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 1024
  ldr RB RB                 ; RB := 1024
  ldi 0 RC                  ; RC := 0
  calli memset

  set_graphics_mode gr_text_mode

  calli cursor_newline
  ldi 65 RA
  calli cursor_put_char

; @data test_char ${ord('A')}
;   ldi test_char RA          ; RA := 'A' pointer
;   ldr RA RA                 ; RA := 'A'
;   calli log_term_char

  ; ldi hello_string RA        ; RA := hello string pointer
  ; calli log_term_string

; loop forever
@label loop
  jpi loop

@label cursor_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 cursor_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 cursor_put_string
  ; put a string at the current cursor position
  ; parameters:               RA = string_p
  ; returns:                  none

  stack_stash RB RC
  ldi cursor_p RB
  ldr RB RB
  ldr RB RC

  ; TODO: implement
  return