1INIT
2UTF8 1
3WANTSTATE se
4
5!ICH
6RESET
7  erase 0..25,0..80
8  ?cursor = 0,0
9PUSH "ACD"
10PUSH "\e[2D"
11  ?cursor = 0,1
12PUSH "\e[@"
13  scrollrect 0..1,1..80 => +0,-1
14  ?cursor = 0,1
15PUSH "B"
16  ?cursor = 0,2
17PUSH "\e[3@"
18  scrollrect 0..1,2..80 => +0,-3
19
20!ICH with DECSLRM
21PUSH "\e[?69h"
22PUSH "\e[;50s"
23PUSH "\e[20G\e[@"
24  scrollrect 0..1,19..50 => +0,-1
25
26!ICH outside DECSLRM
27PUSH "\e[70G\e[@"
28  # nothing happens
29
30!DCH
31RESET
32  erase 0..25,0..80
33  ?cursor = 0,0
34PUSH "ABBC"
35PUSH "\e[3D"
36  ?cursor = 0,1
37PUSH "\e[P"
38  scrollrect 0..1,1..80 => +0,+1
39  ?cursor = 0,1
40PUSH "\e[3P"
41  scrollrect 0..1,1..80 => +0,+3
42  ?cursor = 0,1
43
44!DCH with DECSLRM
45PUSH "\e[?69h"
46PUSH "\e[;50s"
47PUSH "\e[20G\e[P"
48  scrollrect 0..1,19..50 => +0,+1
49
50!DCH outside DECSLRM
51PUSH "\e[70G\e[P"
52  # nothing happens
53
54!ECH
55RESET
56  erase 0..25,0..80
57  ?cursor = 0,0
58PUSH "ABC"
59PUSH "\e[2D"
60  ?cursor = 0,1
61PUSH "\e[X"
62  erase 0..1,1..2
63  ?cursor = 0,1
64PUSH "\e[3X"
65  erase 0..1,1..4
66  ?cursor = 0,1
67# ECH more columns than there are should be bounded
68PUSH "\e[100X"
69  erase 0..1,1..80
70
71!IL
72RESET
73  erase 0..25,0..80
74  ?cursor = 0,0
75PUSH "A\r\nC"
76  ?cursor = 1,1
77PUSH "\e[L"
78  scrollrect 1..25,0..80 => -1,+0
79  # TODO: ECMA-48 says we should move to line home, but neither xterm nor
80  # xfce4-terminal do this
81  ?cursor = 1,1
82PUSH "\rB"
83  ?cursor = 1,1
84PUSH "\e[3L"
85  scrollrect 1..25,0..80 => -3,+0
86
87!IL with DECSTBM
88PUSH "\e[5;15r"
89PUSH "\e[5H\e[L"
90  scrollrect 4..15,0..80 => -1,+0
91
92!IL outside DECSTBM
93PUSH "\e[20H\e[L"
94  # nothing happens
95
96!IL with DECSTBM+DECSLRM
97PUSH "\e[?69h"
98PUSH "\e[10;50s"
99PUSH "\e[5;10H\e[L"
100  scrollrect 4..15,9..50 => -1,+0
101
102!DL
103RESET
104  erase 0..25,0..80
105  ?cursor = 0,0
106PUSH "A\r\nB\r\nB\r\nC"
107  ?cursor = 3,1
108PUSH "\e[2H"
109  ?cursor = 1,0
110PUSH "\e[M"
111  scrollrect 1..25,0..80 => +1,+0
112  ?cursor = 1,0
113PUSH "\e[3M"
114  scrollrect 1..25,0..80 => +3,+0
115  ?cursor = 1,0
116
117!DL with DECSTBM
118PUSH "\e[5;15r"
119PUSH "\e[5H\e[M"
120  scrollrect 4..15,0..80 => +1,+0
121
122!DL outside DECSTBM
123PUSH "\e[20H\e[M"
124  # nothing happens
125
126!DL with DECSTBM+DECSLRM
127PUSH "\e[?69h"
128PUSH "\e[10;50s"
129PUSH "\e[5;10H\e[M"
130  scrollrect 4..15,9..50 => +1,+0
131
132!DECIC
133RESET
134  erase 0..25,0..80
135PUSH "\e[20G\e[5'}"
136  scrollrect 0..25,19..80 => +0,-5
137
138!DECIC with DECSTBM+DECSLRM
139PUSH "\e[?69h"
140PUSH "\e[4;20r\e[20;60s"
141PUSH "\e[4;20H\e[3'}"
142  scrollrect 3..20,19..60 => +0,-3
143
144!DECIC outside DECSLRM
145PUSH "\e[70G\e['}"
146  # nothing happens
147
148!DECDC
149RESET
150  erase 0..25,0..80
151PUSH "\e[20G\e[5'~"
152  scrollrect 0..25,19..80 => +0,+5
153
154!DECDC with DECSTBM+DECSLRM
155PUSH "\e[?69h"
156PUSH "\e[4;20r\e[20;60s"
157PUSH "\e[4;20H\e[3'~"
158  scrollrect 3..20,19..60 => +0,+3
159
160!DECDC outside DECSLRM
161PUSH "\e[70G\e['~"
162  # nothing happens
163
164!EL 0
165RESET
166  erase 0..25,0..80
167  ?cursor = 0,0
168PUSH "ABCDE"
169PUSH "\e[3D"
170  ?cursor = 0,2
171PUSH "\e[0K"
172  erase 0..1,2..80
173  ?cursor = 0,2
174
175!EL 1
176RESET
177  erase 0..25,0..80
178  ?cursor = 0,0
179PUSH "ABCDE"
180PUSH "\e[3D"
181  ?cursor = 0,2
182PUSH "\e[1K"
183  erase 0..1,0..3
184  ?cursor = 0,2
185
186!EL 2
187RESET
188  erase 0..25,0..80
189  ?cursor = 0,0
190PUSH "ABCDE"
191PUSH "\e[3D"
192  ?cursor = 0,2
193PUSH "\e[2K"
194  erase 0..1,0..80
195  ?cursor = 0,2
196
197!SEL
198RESET
199  erase 0..25,0..80
200  ?cursor = 0,0
201PUSH "\e[11G"
202  ?cursor = 0,10
203PUSH "\e[?0K"
204  erase 0..1,10..80 selective
205  ?cursor = 0,10
206PUSH "\e[?1K"
207  erase 0..1,0..11 selective
208  ?cursor = 0,10
209PUSH "\e[?2K"
210  erase 0..1,0..80 selective
211  ?cursor = 0,10
212
213!ED 0
214RESET
215  erase 0..25,0..80
216  ?cursor = 0,0
217PUSH "\e[2;2H"
218  ?cursor = 1,1
219PUSH "\e[0J"
220  erase 1..2,1..80
221  erase 2..25,0..80
222  ?cursor = 1,1
223
224!ED 1
225RESET
226  erase 0..25,0..80
227  ?cursor = 0,0
228PUSH "\e[2;2H"
229  ?cursor = 1,1
230PUSH "\e[1J"
231  erase 0..1,0..80
232  erase 1..2,0..2
233  ?cursor = 1,1
234
235!ED 2
236RESET
237  erase 0..25,0..80
238  ?cursor = 0,0
239PUSH "\e[2;2H"
240  ?cursor = 1,1
241PUSH "\e[2J"
242  erase 0..25,0..80
243  ?cursor = 1,1
244
245!SED
246RESET
247  erase 0..25,0..80
248PUSH "\e[5;5H"
249  ?cursor = 4,4
250PUSH "\e[?0J"
251  erase 4..5,4..80 selective
252  erase 5..25,0..80 selective
253  ?cursor = 4,4
254PUSH "\e[?1J"
255  erase 0..4,0..80 selective
256  erase 4..5,0..5 selective
257  ?cursor = 4,4
258PUSH "\e[?2J"
259  erase 0..25,0..80 selective
260  ?cursor = 4,4
261
262!DECRQSS on DECSCA
263PUSH "\e[2\"q"
264PUSH "\eP\$q\"q\e\\"
265  output "\eP1\$r2\"q\e\\"
266
267WANTSTATE -s+m
268
269!ICH move+erase emuation
270RESET
271  erase 0..25,0..80
272  ?cursor = 0,0
273PUSH "ACD"
274PUSH "\e[2D"
275  ?cursor = 0,1
276PUSH "\e[@"
277  moverect 0..1,1..79 -> 0..1,2..80
278  erase 0..1,1..2
279  ?cursor = 0,1
280PUSH "B"
281  ?cursor = 0,2
282PUSH "\e[3@"
283  moverect 0..1,2..77 -> 0..1,5..80
284  erase 0..1,2..5
285
286!DCH move+erase emulation
287RESET
288  erase 0..25,0..80
289  ?cursor = 0,0
290PUSH "ABBC"
291PUSH "\e[3D"
292  ?cursor = 0,1
293PUSH "\e[P"
294  moverect 0..1,2..80 -> 0..1,1..79
295  erase 0..1,79..80
296  ?cursor = 0,1
297PUSH "\e[3P"
298  moverect 0..1,4..80 -> 0..1,1..77
299  erase 0..1,77..80
300  ?cursor = 0,1
301