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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
type screen-position-state {
nrows: int # const
ncols: int # const
toprow: int
botrow: int
leftcol: int
rightcol: int
row: int
col: int
}
fn init-screen-position-state _self: (addr screen-position-state) {
# hardcoded parameters:
# top-margin
# page-margin
# page-width
# page-height (temporary)
var self/esi: (addr screen-position-state) <- copy _self
var nrows/eax: int <- copy 0
var ncols/ecx: int <- copy 0
nrows, ncols <- screen-size
var dest/edx: (addr int) <- copy 0
# self->nrows = nrows
dest <- get self, nrows
copy-to *dest, nrows
# self->ncols = ncols
dest <- get self, ncols
copy-to *dest, ncols
# self->toprow = top-margin
dest <- get self, toprow
copy-to *dest, 2 # top-margin
# self->botrow = nrows
dest <- get self, botrow
copy-to *dest, 0x22 # top-margin + page-height
# self->leftcol = page-margin
dest <- get self, leftcol
copy-to *dest, 5 # left-margin
# self->rightcol = self->leftcol + page-width
dest <- get self, rightcol
copy-to *dest, 0x45 # left-margin + page-width
#
start-drawing self
}
fn start-drawing _self: (addr screen-position-state) {
var self/esi: (addr screen-position-state) <- copy _self
var tmp/eax: (addr int) <- copy 0
var tmp2/ecx: int <- copy 0
# self->row = self->toprow
tmp <- get self, toprow
tmp2 <- copy *tmp
tmp <- get self, row
copy-to *tmp, tmp2
# self->col = self->leftcol
tmp <- get self, leftcol
tmp2 <- copy *tmp
tmp <- get self, col
copy-to *tmp, tmp2
#
reposition-cursor self
}
fn add-char _self: (addr screen-position-state), c: byte {
$add-char:body: {
var self/esi: (addr screen-position-state) <- copy _self
{
compare c, 0xa # newline
break-if-!=
next-line self
reposition-cursor self
break $add-char:body
}
# print c
print-byte c
# self->col++
var tmp/eax: (addr int) <- get self, col
increment *tmp
# if (self->col > self->rightcol) next-line(self)
var tmp2/ecx: int <- copy *tmp
tmp <- get self, rightcol
compare tmp2, *tmp
{
break-if-<=
next-line self
reposition-cursor self
}
}
}
fn next-line _self: (addr screen-position-state) {
var self/esi: (addr screen-position-state) <- copy _self
var tmp/eax: (addr int) <- copy 0
var tmp2/ecx: int <- copy 0
# self->col = self->leftcol
tmp <- get self, leftcol
tmp2 <- copy *tmp
tmp <- get self, col
copy-to *tmp, tmp2
# self->row++
tmp <- get self, row
increment *tmp
# if (self->row > self->botrow) next-page(self)
tmp2 <- copy *tmp
tmp <- get self, botrow
compare tmp2, *tmp
{
break-if-<=
next-page self
}
}
fn next-page _self: (addr screen-position-state) {
var self/esi: (addr screen-position-state) <- copy _self
# TMP
var tmp/eax: (addr int) <- get self, row
increment *tmp
}
fn done-drawing? _self: (addr screen-position-state) -> result/eax: boolean {
var self/esi: (addr screen-position-state) <- copy _self
# TMP
var r/eax: (addr int) <- get self, row
var tmp/ecx: (addr int) <- get self, botrow
var max/ecx: int <- copy *tmp
$done-drawing?:check: {
compare *r, max
{
break-if->=
result <- copy 0 # false
break $done-drawing?:check
}
{
break-if-<
result <- copy 1 # true
}
}
}
fn reposition-cursor _self: (addr screen-position-state) {
var self/esi: (addr screen-position-state) <- copy _self
var r/eax: (addr int) <- get self, row
var c/ecx: (addr int) <- get self, col
move-cursor *r *c
}
|