forked from arti/vt1200
dwt: xtext draws text in a real X window on the VT1200; TFTP retarget fetches the COFF
This commit is contained in:
1 parent
3c16824f5b
commit
225394e1ae
38 files changed
+3680
No files matched your search
Binary file not shown.
@@ -0,0 +1,879 @@
|
||||
GSP COFF Assembler, Version 2.00, 87.300 Sun Oct 18 17:23:19 2026
|
||||
(c) Copyright 1985, 1987, Texas Instruments Inc.
|
||||
|
||||
PAGE 1
|
||||
|
||||
0001 ; xtext.asm -- open a window on the live DWT X server a
|
||||
0002 ;
|
||||
0003 ; Run as a first-class process created by the COFF load
|
||||
0004 ; in the rdebug dispatcher's context: a connect made fr
|
||||
0005 ; accepted at the service layer but the server never re
|
||||
0006 ; XOpenDisplay returns an unusable Display. A fresh pr
|
||||
0007 ;
|
||||
0008 ; This is xhello.asm plus the text path:
|
||||
0009 ; XLoadFont(d,"fixed") 3FD4AE80
|
||||
0010 ; XCreateGC(d,win,mask,&values) 3F997000
|
||||
0011 ; XSetForeground(d,gc,1) 3FD99A60
|
||||
0012 ; XMapWindow(d,win) 3FD645B0
|
||||
0013 ; XSync(d,0) / XDrawString(...) loop 3FD9F6B0 / 3
|
||||
0014 ;
|
||||
0015 ; The GC is created with a zero value-mask, so the serv
|
||||
0016 ; screen's default GC (which carries the server's defau
|
||||
0017 ; draw is repeated with an XSync between iterations so
|
||||
0018 ; WM has framed/reparented/mapped the window; a single
|
||||
0019 ; when the window is reparented.
|
||||
0020 ;
|
||||
0021 ; Calling convention (the one the firmware itself uses;
|
||||
0022 ; 07F57044 and the TM at 07E5D2B4):
|
||||
0023 ;
|
||||
0024 ; MOVE A14,-*SP,1 ; reserve the slot the ca
|
||||
0025 ; MOVI argN,A0 / MOVE A0,*A14+,1 ; last argument
|
||||
0026 ; ...
|
||||
0027 ; MOVI arg0,A0 / MOVE A0,*A14+,1 ; first argumen
|
||||
0028 ; CALLA target
|
||||
0029 ;
|
||||
0030 ; The callee's `rets 2` pops the return address and the
|
||||
0031 ; restored by the call itself; A14 is restored from tha
|
||||
0032 ; entry SP/A14 in RAM and restore them after each call:
|
||||
0033 ; Xlib data structures use the same free heap, and a cl
|
||||
0034 ; turns the next call into a wild push. That exact pat
|
||||
0035 ; version of this payload at XCreateGC.
|
||||
0036 ;
|
||||
0037 ; Xlib clobbers the CPU's SETF field state, so the ABI'
|
||||
0038 ; re-established after every call. The Display pointer
|
||||
0039 ; are kept in callee-saved registers (a11/a10/a12).
|
||||
0040 ;
|
||||
0041 ; Markers live in 224 bytes of zero padding at the end
|
||||
0042 ; NOT in the free heap: the first version's cells at 01
|
||||
0043 ; by the OS heap (the string "Exiting\n" landed on them
|
||||
0044 ;
|
||||
0045 ; 01842000 stage (1 start, 2 display, 3 window, 4 fo
|
||||
0046 ; 7 map, 8 synced/drawn, 9 flushed,
|
||||
0047 ; 01842020 display pointer
|
||||
0048 ; 01842040 font id returned by XLoadFont
|
||||
0049 ; 01842060 window id
|
||||
0050 ; 01842080 GC id returned by XCreateGC
|
||||
0051 ; 018420A0 XSetForeground return
|
||||
0052 ; 018420C0 XMapWindow return
|
||||
0053 ; 018420E0 last XSync return
|
||||
0054 ; 01842100 first XDrawString return
|
||||
0055 ; 01842120 second XDrawString return
|
||||
0056 ; 01842140 final XSync return
|
||||
GSP COFF Assembler, Version 2.00, 87.300 Sun Oct 18 17:23:19 2026
|
||||
(c) Copyright 1985, 1987, Texas Instruments Inc.
|
||||
|
||||
PAGE 2
|
||||
|
||||
0057 ; 01841760 strlen("0::0") -- must be 4
|
||||
0058 ;
|
||||
0059 ; Scratch: 01894000 argument area
|
||||
0060
|
||||
0061 00000000 .text
|
||||
0062 00000000 _start:
|
||||
0063 00000000 0550 setf 16, 0, 0
|
||||
0064 00000010 0740 setf 32, 0, 1
|
||||
0065 00000020 098F mmtm sp, a0,a1,a2,a3,a4,a5,a6,a7
|
||||
00000030 FF00
|
||||
0066
|
||||
0067 00000040 09E0 movi 1, a0, L
|
||||
00000050 00000001
|
||||
0068 00000070 0780 move a0, @01842000h, 1 ; stage = 1
|
||||
00000080 01842000
|
||||
0069
|
||||
0070 ; ---- convention check: strlen("0::0") == 4 ---------
|
||||
0071 000000A0 A3CF move a14, -*sp, 1
|
||||
0072 000000B0 09EE movi 01894000h, a14, L
|
||||
000000C0 01894000
|
||||
0073 000000E0 09E0 movi 3FACE948h, a0, L ; ROM "0::0"
|
||||
000000F0 3FACE948
|
||||
0074 00000110 920E move a0, *a14+, 1 ; arg0
|
||||
0075 00000120 0D5F calla 3FB458D0h ; strlen
|
||||
00000130 3FB458D0
|
||||
0076 00000150 0550 setf 16, 0, 0
|
||||
0077 00000160 0740 setf 32, 0, 1
|
||||
0078 00000170 0788 move a8, @01842160h, 1 ; MARK strlen
|
||||
00000180 01842160
|
||||
0079 000001A0 09E0 movi 4, a0, L
|
||||
000001B0 00000004
|
||||
0080 000001D0 4808 cmp a0, a8
|
||||
0081 000001E0 CB00 jrne failed
|
||||
000001F0 0126
|
||||
0082
|
||||
0083 00000200 09E0 movi 2, a0, L
|
||||
00000210 00000002
|
||||
0084 00000230 0780 move a0, @01842000h, 1 ; stage = 2
|
||||
00000240 01842000
|
||||
0085
|
||||
0086 ; ---- display = XOpenDisplay("0::0") ----------------
|
||||
0087 00000260 A3CF move a14, -*sp, 1
|
||||
0088 00000270 09EE movi 01894000h, a14, L
|
||||
00000280 01894000
|
||||
0089 000002A0 09E0 movi 3FACE948h, a0, L
|
||||
000002B0 3FACE948
|
||||
0090 000002D0 920E move a0, *a14+, 1 ; arg0 = name
|
||||
0091 000002E0 0D5F calla 3F9C2570h ; XOpenDisplay
|
||||
000002F0 3F9C2570
|
||||
0092 00000310 0550 setf 16, 0, 0
|
||||
0093 00000320 0740 setf 32, 0, 1
|
||||
0094 00000330 4D0B move a8, a11 ; Display * (callee-saved)
|
||||
0095 00000340 078B move a11, @01842020h, 1 ; MARK display
|
||||
00000350 01842020
|
||||
0096 00000370 4D6B move a11, a11
|
||||
0097 00000380 CA00 jreq failed
|
||||
GSP COFF Assembler, Version 2.00, 87.300 Sun Oct 18 17:23:19 2026
|
||||
(c) Copyright 1985, 1987, Texas Instruments Inc.
|
||||
|
||||
PAGE 3
|
||||
|
||||
00000390 010C
|
||||
0098
|
||||
0099 ; ---- root = *(*(display+0x480)+0x40) ---------------
|
||||
0100 000003A0 B76A move *a11(0480h), a10, 1
|
||||
000003B0 0480
|
||||
0101 000003C0 B74A move *a10(040h), a10, 1
|
||||
000003D0 0040
|
||||
0102
|
||||
0103 000003E0 09E0 movi 3, a0, L
|
||||
000003F0 00000003
|
||||
0104 00000410 0780 move a0, @01842000h, 1 ; stage = 3
|
||||
00000420 01842000
|
||||
0105
|
||||
0106 ; ---- window = XCreateSimpleWindow(d,root,100,100,400
|
||||
0107 00000440 A3CF move a14, -*sp, 1
|
||||
0108 00000450 09EE movi 01894000h, a14, L
|
||||
00000460 01894000
|
||||
0109 00000480 09E0 movi 0, a0, L
|
||||
00000490 00000000
|
||||
0110 000004B0 920E move a0, *a14+, 1 ; background = 0 (black)
|
||||
0111 000004C0 09E0 movi 1, a0, L
|
||||
000004D0 00000001
|
||||
0112 000004F0 920E move a0, *a14+, 1 ; border = 1 (white)
|
||||
0113 00000500 09E0 movi 2, a0, L
|
||||
00000510 00000002
|
||||
0114 00000530 920E move a0, *a14+, 1 ; border width
|
||||
0115 00000540 09E0 movi 200, a0, L
|
||||
00000550 000000C8
|
||||
0116 00000570 920E move a0, *a14+, 1 ; height
|
||||
0117 00000580 09E0 movi 400, a0, L
|
||||
00000590 00000190
|
||||
0118 000005B0 920E move a0, *a14+, 1 ; width
|
||||
0119 000005C0 09E0 movi 100, a0, L
|
||||
000005D0 00000064
|
||||
0120 000005F0 920E move a0, *a14+, 1 ; y
|
||||
0121 00000600 920E move a0, *a14+, 1 ; x
|
||||
0122 00000610 934E move a10, *a14+, 1 ; parent = root
|
||||
0123 00000620 936E move a11, *a14+, 1 ; display
|
||||
0124 00000630 0D5F calla 3FD41B90h ; XCreateSimpleWindow
|
||||
00000640 3FD41B90
|
||||
0125 00000660 0550 setf 16, 0, 0
|
||||
0126 00000670 0740 setf 32, 0, 1
|
||||
0127 00000680 4D0A move a8, a10 ; window id
|
||||
0128 00000690 078A move a10, @01842060h, 1 ; MARK window
|
||||
000006A0 01842060
|
||||
0129 000006C0 4D4A move a10, a10
|
||||
0130 000006D0 CA00 jreq failed
|
||||
000006E0 00D7
|
||||
0131
|
||||
0132 000006F0 09E0 movi 4, a0, L
|
||||
00000700 00000004
|
||||
0133 00000720 0780 move a0, @01842000h, 1 ; stage = 4
|
||||
00000730 01842000
|
||||
0134
|
||||
0135 ; ---- font = XLoadFont(display, "fixed") ------------
|
||||
0136 00000750 A3CF move a14, -*sp, 1
|
||||
GSP COFF Assembler, Version 2.00, 87.300 Sun Oct 18 17:23:19 2026
|
||||
(c) Copyright 1985, 1987, Texas Instruments Inc.
|
||||
|
||||
PAGE 4
|
||||
|
||||
0137 00000760 09EE movi 01894000h, a14, L
|
||||
00000770 01894000
|
||||
0138 00000790 09E0 movi FONTNAME, a0, L
|
||||
000007A0 000015E0'
|
||||
0139 000007C0 920E move a0, *a14+, 1 ; arg1 = name
|
||||
0140 000007D0 936E move a11, *a14+, 1 ; arg0 = display
|
||||
0141 000007E0 0D5F calla 3FD4AE80h ; XLoadFont
|
||||
000007F0 3FD4AE80
|
||||
0142 00000810 0550 setf 16, 0, 0
|
||||
0143 00000820 0740 setf 32, 0, 1
|
||||
0144 00000830 4D09 move a8, a9 ; Font (callee-saved)
|
||||
0145 00000840 0789 move a9, @01842040h, 1 ; MARK font
|
||||
00000850 01842040
|
||||
0146 00000870 4D29 move a9, a9
|
||||
0147 00000880 CA00 jreq failed
|
||||
00000890 00BC
|
||||
0148
|
||||
0149 000008A0 09E0 movi 5, a0, L
|
||||
000008B0 00000005
|
||||
0150 000008D0 0780 move a0, @01842000h, 1 ; stage = 5
|
||||
000008E0 01842000
|
||||
0151
|
||||
0152 ; ---- gc = XCreateGC(d, window, 0, NULL) ------------
|
||||
0153 ; mask 0 -> server default GC values (no value-list to
|
||||
0154 00000900 A3CF move a14, -*sp, 1
|
||||
0155 00000910 09EE movi 01894000h, a14, L
|
||||
00000920 01894000
|
||||
0156 00000940 09E0 movi 0, a0, L
|
||||
00000950 00000000
|
||||
0157 00000970 920E move a0, *a14+, 1 ; arg3 = values
|
||||
0158 00000980 920E move a0, *a14+, 1 ; arg2 = mask 0
|
||||
0159 00000990 934E move a10, *a14+, 1 ; arg1 = drawable
|
||||
0160 000009A0 936E move a11, *a14+, 1 ; arg0 = display
|
||||
0161 000009B0 0D5F calla 3F997000h ; XCreateGC
|
||||
000009C0 3F997000
|
||||
0162 000009E0 0550 setf 16, 0, 0
|
||||
0163 000009F0 0740 setf 32, 0, 1
|
||||
0164 00000A00 4D0C move a8, a12 ; GC (callee-saved)
|
||||
0165 00000A10 078C move a12, @01842080h, 1 ; MARK gc
|
||||
00000A20 01842080
|
||||
0166 00000A40 4D8C move a12, a12
|
||||
0167 00000A50 CA00 jreq failed
|
||||
00000A60 009F
|
||||
0168
|
||||
0169 ; ---- XSetForeground(display, gc, 1) ----------------
|
||||
0170 00000A70 A3CF move a14, -*sp, 1
|
||||
0171 00000A80 09EE movi 01894000h, a14, L
|
||||
00000A90 01894000
|
||||
0172 00000AB0 09E0 movi 1, a0, L
|
||||
00000AC0 00000001
|
||||
0173 00000AE0 920E move a0, *a14+, 1 ; arg2 = pixel 1 (white)
|
||||
0174 00000AF0 938E move a12, *a14+, 1 ; arg1 = gc
|
||||
0175 00000B00 936E move a11, *a14+, 1 ; arg0 = display
|
||||
0176 00000B10 0D5F calla 3FD99A60h ; XSetForeground
|
||||
00000B20 3FD99A60
|
||||
0177 00000B40 0550 setf 16, 0, 0
|
||||
GSP COFF Assembler, Version 2.00, 87.300 Sun Oct 18 17:23:19 2026
|
||||
(c) Copyright 1985, 1987, Texas Instruments Inc.
|
||||
|
||||
PAGE 5
|
||||
|
||||
0178 00000B50 0740 setf 32, 0, 1
|
||||
0179 00000B60 0788 move a8, @018420A0h, 1 ; MARK setfg
|
||||
00000B70 018420A0
|
||||
0180 00000B90 09E0 movi 6, a0, L
|
||||
00000BA0 00000006
|
||||
0181 00000BC0 0780 move a0, @01842000h, 1 ; stage = 6
|
||||
00000BD0 01842000
|
||||
0182
|
||||
0183 ; ---- XMapWindow(display, window) -------------------
|
||||
0184 00000BF0 A3CF move a14, -*sp, 1
|
||||
0185 00000C00 09EE movi 01894000h, a14, L
|
||||
00000C10 01894000
|
||||
0186 00000C30 934E move a10, *a14+, 1 ; window
|
||||
0187 00000C40 936E move a11, *a14+, 1 ; display
|
||||
0188 00000C50 0D5F calla 3FD645B0h ; XMapWindow
|
||||
00000C60 3FD645B0
|
||||
0189 00000C80 0550 setf 16, 0, 0
|
||||
0190 00000C90 0740 setf 32, 0, 1
|
||||
0191 00000CA0 0788 move a8, @018420C0h, 1 ; MARK map
|
||||
00000CB0 018420C0
|
||||
0192 00000CD0 09E0 movi 7, a0, L
|
||||
00000CE0 00000007
|
||||
0193 00000D00 0780 move a0, @01842000h, 1 ; stage = 7
|
||||
00000D10 01842000
|
||||
0194
|
||||
0195 ; ---- sync + draw, repeated: the WM needs time to fra
|
||||
0196 00000D30 09E9 movi 4, a9, L
|
||||
00000D40 00000004
|
||||
0197 00000D60 draw_loop:
|
||||
0198 00000D60 A3CF move a14, -*sp, 1
|
||||
0199 00000D70 09EE movi 01894000h, a14, L
|
||||
00000D80 01894000
|
||||
0200 00000DA0 09E0 movi 0, a0, L
|
||||
00000DB0 00000000
|
||||
0201 00000DD0 920E move a0, *a14+, 1 ; discard = 0
|
||||
0202 00000DE0 936E move a11, *a14+, 1 ; display
|
||||
0203 00000DF0 0D5F calla 3FD9F6B0h ; XSync (flush + round trip)
|
||||
00000E00 3FD9F6B0
|
||||
0204 00000E20 0550 setf 16, 0, 0
|
||||
0205 00000E30 0740 setf 32, 0, 1
|
||||
0206 00000E40 0788 move a8, @018420E0h, 1 ; MARK last sync
|
||||
00000E50 018420E0
|
||||
0207
|
||||
0208 ; ---- XDrawString(display, window, gc, 20, 80, msg1,
|
||||
0209 00000E70 A3CF move a14, -*sp, 1
|
||||
0210 00000E80 09EE movi 01894000h, a14, L
|
||||
00000E90 01894000
|
||||
0211 00000EB0 09E0 movi 12, a0, L
|
||||
00000EC0 0000000C
|
||||
0212 00000EE0 920E move a0, *a14+, 1 ; arg6 = length
|
||||
0213 00000EF0 09E0 movi MSG1, a0, L
|
||||
00000F00 00001520'
|
||||
0214 00000F20 920E move a0, *a14+, 1 ; arg5 = string
|
||||
0215 00000F30 09E0 movi 80, a0, L
|
||||
00000F40 00000050
|
||||
0216 00000F60 920E move a0, *a14+, 1 ; arg4 = y
|
||||
GSP COFF Assembler, Version 2.00, 87.300 Sun Oct 18 17:23:19 2026
|
||||
(c) Copyright 1985, 1987, Texas Instruments Inc.
|
||||
|
||||
PAGE 6
|
||||
|
||||
0217 00000F70 09E0 movi 20, a0, L
|
||||
00000F80 00000014
|
||||
0218 00000FA0 920E move a0, *a14+, 1 ; arg3 = x
|
||||
0219 00000FB0 938E move a12, *a14+, 1 ; arg2 = gc
|
||||
0220 00000FC0 934E move a10, *a14+, 1 ; arg1 = window
|
||||
0221 00000FD0 936E move a11, *a14+, 1 ; arg0 = display
|
||||
0222 00000FE0 0D5F calla 3FDA0000h ; XDrawString
|
||||
00000FF0 3FDA0000
|
||||
0223 00001010 0550 setf 16, 0, 0
|
||||
0224 00001020 0740 setf 32, 0, 1
|
||||
0225 00001030 0788 move a8, @01842100h, 1 ; MARK draw1
|
||||
00001040 01842100
|
||||
0226
|
||||
0227 ; ---- XDrawString(display, window, gc, 20, 120, msg2,
|
||||
0228 00001060 A3CF move a14, -*sp, 1
|
||||
0229 00001070 09EE movi 01894000h, a14, L
|
||||
00001080 01894000
|
||||
0230 000010A0 09E0 movi 10, a0, L
|
||||
000010B0 0000000A
|
||||
0231 000010D0 920E move a0, *a14+, 1 ; arg6 = length
|
||||
0232 000010E0 09E0 movi MSG2, a0, L
|
||||
000010F0 00001588'
|
||||
0233 00001110 920E move a0, *a14+, 1 ; arg5 = string
|
||||
0234 00001120 09E0 movi 120, a0, L
|
||||
00001130 00000078
|
||||
0235 00001150 920E move a0, *a14+, 1 ; arg4 = y
|
||||
0236 00001160 09E0 movi 20, a0, L
|
||||
00001170 00000014
|
||||
0237 00001190 920E move a0, *a14+, 1 ; arg3 = x
|
||||
0238 000011A0 938E move a12, *a14+, 1 ; arg2 = gc
|
||||
0239 000011B0 934E move a10, *a14+, 1 ; arg1 = window
|
||||
0240 000011C0 936E move a11, *a14+, 1 ; arg0 = display
|
||||
0241 000011D0 0D5F calla 3FDA0000h ; XDrawString
|
||||
000011E0 3FDA0000
|
||||
0242 00001200 0550 setf 16, 0, 0
|
||||
0243 00001210 0740 setf 32, 0, 1
|
||||
0244 00001220 0788 move a8, @01842120h, 1 ; MARK draw2
|
||||
00001230 01842120
|
||||
0245
|
||||
0246 ; DSJS has a short range; trampoline to the long backw
|
||||
0247 00001250 3829 dsjs a9, draw_next
|
||||
0248 00001260 C001 jruc draw_done
|
||||
0249 00001270 draw_next:
|
||||
0250 00001270 C0AE jruc draw_loop
|
||||
0251 00001280 draw_done:
|
||||
0252
|
||||
0253 00001280 09E0 movi 8, a0, L
|
||||
00001290 00000008
|
||||
0254 000012B0 0780 move a0, @01842000h, 1 ; stage = 8
|
||||
000012C0 01842000
|
||||
0255
|
||||
0256 ; ---- final XSync flushes the last PolyText8 --------
|
||||
0257 000012E0 A3CF move a14, -*sp, 1
|
||||
0258 000012F0 09EE movi 01894000h, a14, L
|
||||
00001300 01894000
|
||||
0259 00001320 09E0 movi 0, a0, L
|
||||
GSP COFF Assembler, Version 2.00, 87.300 Sun Oct 18 17:23:19 2026
|
||||
(c) Copyright 1985, 1987, Texas Instruments Inc.
|
||||
|
||||
PAGE 7
|
||||
|
||||
00001330 00000000
|
||||
0260 00001350 920E move a0, *a14+, 1 ; discard = 0
|
||||
0261 00001360 936E move a11, *a14+, 1 ; display
|
||||
0262 00001370 0D5F calla 3FD9F6B0h ; XSync
|
||||
00001380 3FD9F6B0
|
||||
0263 000013A0 0550 setf 16, 0, 0
|
||||
0264 000013B0 0740 setf 32, 0, 1
|
||||
0265 000013C0 0788 move a8, @01842140h, 1 ; MARK final sync
|
||||
000013D0 01842140
|
||||
0266
|
||||
0267 000013F0 09E0 movi 9, a0, L
|
||||
00001400 00000009
|
||||
0268 00001420 0780 move a0, @01842000h, 1 ; stage = 9 (text drawn and flu
|
||||
00001430 01842000
|
||||
0269 00001450 C006 jruc done
|
||||
0270
|
||||
0271 00001460 failed:
|
||||
0272 00001460 09E0 movi 0FFh, a0, L
|
||||
00001470 000000FF
|
||||
0273 00001490 0780 move a0, @01842000h, 1
|
||||
000014A0 01842000
|
||||
0274
|
||||
0275 000014C0 done:
|
||||
0276 000014C0 09AF mmfm sp, a0,a1,a2,a3,a4,a5,a6,a7
|
||||
000014D0 00FF
|
||||
0277 000014E0 09E8 movi 0, a8, L
|
||||
000014F0 00000000
|
||||
0278 00001510 0960 rets
|
||||
0279
|
||||
0280 00001520 48 MSG1: .byte "HELLO VT1200", 0
|
||||
00001528 45
|
||||
00001530 4C
|
||||
00001538 4C
|
||||
00001540 4F
|
||||
00001548 20
|
||||
00001550 56
|
||||
00001558 54
|
||||
00001560 31
|
||||
00001568 32
|
||||
00001570 30
|
||||
00001578 30
|
||||
00001580 00
|
||||
0281 00001588 74 MSG2: .byte "text works", 0
|
||||
00001590 65
|
||||
00001598 78
|
||||
000015A0 74
|
||||
000015A8 20
|
||||
000015B0 77
|
||||
000015B8 6F
|
||||
000015C0 72
|
||||
000015C8 6B
|
||||
000015D0 73
|
||||
000015D8 00
|
||||
0282 000015E0 2D FONTNAME: .byte "-DEC-Terminal-Medium-R-Normal--14-140-
|
||||
000015E8 44
|
||||
000015F0 45
|
||||
GSP COFF Assembler, Version 2.00, 87.300 Sun Oct 18 17:23:19 2026
|
||||
(c) Copyright 1985, 1987, Texas Instruments Inc.
|
||||
|
||||
PAGE 8
|
||||
|
||||
000015F8 43
|
||||
00001600 2D
|
||||
00001608 54
|
||||
00001610 65
|
||||
00001618 72
|
||||
00001620 6D
|
||||
00001628 69
|
||||
00001630 6E
|
||||
00001638 61
|
||||
00001640 6C
|
||||
00001648 2D
|
||||
00001650 4D
|
||||
00001658 65
|
||||
00001660 64
|
||||
00001668 69
|
||||
00001670 75
|
||||
00001678 6D
|
||||
00001680 2D
|
||||
00001688 52
|
||||
00001690 2D
|
||||
00001698 4E
|
||||
000016A0 6F
|
||||
000016A8 72
|
||||
000016B0 6D
|
||||
000016B8 61
|
||||
000016C0 6C
|
||||
000016C8 2D
|
||||
000016D0 2D
|
||||
000016D8 31
|
||||
000016E0 34
|
||||
000016E8 2D
|
||||
000016F0 31
|
||||
000016F8 34
|
||||
00001700 30
|
||||
00001708 2D
|
||||
00001710 37
|
||||
00001718 35
|
||||
00001720 2D
|
||||
00001728 37
|
||||
00001730 35
|
||||
00001738 2D
|
||||
00001740 43
|
||||
00001748 2D
|
||||
00001750 38
|
||||
00001758 2D
|
||||
00001760 49
|
||||
00001768 53
|
||||
00001770 4F
|
||||
00001778 38
|
||||
00001780 38
|
||||
00001788 35
|
||||
00001790 39
|
||||
00001798 2D
|
||||
000017A0 31
|
||||
000017A8 00
|
||||
0283
|
||||
GSP COFF Assembler, Version 2.00, 87.300 Sun Oct 18 17:23:19 2026
|
||||
(c) Copyright 1985, 1987, Texas Instruments Inc.
|
||||
|
||||
PAGE 9
|
||||
|
||||
0284 ; 224 bytes of padding: marker cells 01842000h..018421
|
||||
0285 000017B0 00 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
000017B8 00
|
||||
000017C0 00
|
||||
000017C8 00
|
||||
000017D0 00
|
||||
000017D8 00
|
||||
000017E0 00
|
||||
000017E8 00
|
||||
000017F0 00
|
||||
000017F8 00
|
||||
00001800 00
|
||||
00001808 00
|
||||
00001810 00
|
||||
00001818 00
|
||||
00001820 00
|
||||
00001828 00
|
||||
0286 00001830 00 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
00001838 00
|
||||
00001840 00
|
||||
00001848 00
|
||||
00001850 00
|
||||
00001858 00
|
||||
00001860 00
|
||||
00001868 00
|
||||
00001870 00
|
||||
00001878 00
|
||||
00001880 00
|
||||
00001888 00
|
||||
00001890 00
|
||||
00001898 00
|
||||
000018A0 00
|
||||
000018A8 00
|
||||
0287 000018B0 00 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
000018B8 00
|
||||
000018C0 00
|
||||
000018C8 00
|
||||
000018D0 00
|
||||
000018D8 00
|
||||
000018E0 00
|
||||
000018E8 00
|
||||
000018F0 00
|
||||
000018F8 00
|
||||
00001900 00
|
||||
00001908 00
|
||||
00001910 00
|
||||
00001918 00
|
||||
00001920 00
|
||||
00001928 00
|
||||
0288 00001930 00 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
00001938 00
|
||||
00001940 00
|
||||
00001948 00
|
||||
00001950 00
|
||||
00001958 00
|
||||
00001960 00
|
||||
GSP COFF Assembler, Version 2.00, 87.300 Sun Oct 18 17:23:19 2026
|
||||
(c) Copyright 1985, 1987, Texas Instruments Inc.
|
||||
|
||||
PAGE 10
|
||||
|
||||
00001968 00
|
||||
00001970 00
|
||||
00001978 00
|
||||
00001980 00
|
||||
00001988 00
|
||||
00001990 00
|
||||
00001998 00
|
||||
000019A0 00
|
||||
000019A8 00
|
||||
0289 000019B0 00 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
000019B8 00
|
||||
000019C0 00
|
||||
000019C8 00
|
||||
000019D0 00
|
||||
000019D8 00
|
||||
000019E0 00
|
||||
000019E8 00
|
||||
000019F0 00
|
||||
000019F8 00
|
||||
00001A00 00
|
||||
00001A08 00
|
||||
00001A10 00
|
||||
00001A18 00
|
||||
00001A20 00
|
||||
00001A28 00
|
||||
0290 00001A30 00 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
00001A38 00
|
||||
00001A40 00
|
||||
00001A48 00
|
||||
00001A50 00
|
||||
00001A58 00
|
||||
00001A60 00
|
||||
00001A68 00
|
||||
00001A70 00
|
||||
00001A78 00
|
||||
00001A80 00
|
||||
00001A88 00
|
||||
00001A90 00
|
||||
00001A98 00
|
||||
00001AA0 00
|
||||
00001AA8 00
|
||||
0291 00001AB0 00 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
00001AB8 00
|
||||
00001AC0 00
|
||||
00001AC8 00
|
||||
00001AD0 00
|
||||
00001AD8 00
|
||||
00001AE0 00
|
||||
00001AE8 00
|
||||
00001AF0 00
|
||||
00001AF8 00
|
||||
00001B00 00
|
||||
00001B08 00
|
||||
00001B10 00
|
||||
00001B18 00
|
||||
00001B20 00
|
||||
GSP COFF Assembler, Version 2.00, 87.300 Sun Oct 18 17:23:19 2026
|
||||
(c) Copyright 1985, 1987, Texas Instruments Inc.
|
||||
|
||||
PAGE 11
|
||||
|
||||
00001B28 00
|
||||
0292 00001B30 00 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
00001B38 00
|
||||
00001B40 00
|
||||
00001B48 00
|
||||
00001B50 00
|
||||
00001B58 00
|
||||
00001B60 00
|
||||
00001B68 00
|
||||
00001B70 00
|
||||
00001B78 00
|
||||
00001B80 00
|
||||
00001B88 00
|
||||
00001B90 00
|
||||
00001B98 00
|
||||
00001BA0 00
|
||||
00001BA8 00
|
||||
0293 00001BB0 00 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
00001BB8 00
|
||||
00001BC0 00
|
||||
00001BC8 00
|
||||
00001BD0 00
|
||||
00001BD8 00
|
||||
00001BE0 00
|
||||
00001BE8 00
|
||||
00001BF0 00
|
||||
00001BF8 00
|
||||
00001C00 00
|
||||
00001C08 00
|
||||
00001C10 00
|
||||
00001C18 00
|
||||
00001C20 00
|
||||
00001C28 00
|
||||
0294 00001C30 00 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
00001C38 00
|
||||
00001C40 00
|
||||
00001C48 00
|
||||
00001C50 00
|
||||
00001C58 00
|
||||
00001C60 00
|
||||
00001C68 00
|
||||
00001C70 00
|
||||
00001C78 00
|
||||
00001C80 00
|
||||
00001C88 00
|
||||
00001C90 00
|
||||
00001C98 00
|
||||
00001CA0 00
|
||||
00001CA8 00
|
||||
0295 00001CB0 00 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
00001CB8 00
|
||||
00001CC0 00
|
||||
00001CC8 00
|
||||
00001CD0 00
|
||||
00001CD8 00
|
||||
00001CE0 00
|
||||
GSP COFF Assembler, Version 2.00, 87.300 Sun Oct 18 17:23:19 2026
|
||||
(c) Copyright 1985, 1987, Texas Instruments Inc.
|
||||
|
||||
PAGE 12
|
||||
|
||||
00001CE8 00
|
||||
00001CF0 00
|
||||
00001CF8 00
|
||||
00001D00 00
|
||||
00001D08 00
|
||||
00001D10 00
|
||||
00001D18 00
|
||||
00001D20 00
|
||||
00001D28 00
|
||||
0296 00001D30 00 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
00001D38 00
|
||||
00001D40 00
|
||||
00001D48 00
|
||||
00001D50 00
|
||||
00001D58 00
|
||||
00001D60 00
|
||||
00001D68 00
|
||||
00001D70 00
|
||||
00001D78 00
|
||||
00001D80 00
|
||||
00001D88 00
|
||||
00001D90 00
|
||||
00001D98 00
|
||||
00001DA0 00
|
||||
00001DA8 00
|
||||
0297 00001DB0 00 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
00001DB8 00
|
||||
00001DC0 00
|
||||
00001DC8 00
|
||||
00001DD0 00
|
||||
00001DD8 00
|
||||
00001DE0 00
|
||||
00001DE8 00
|
||||
00001DF0 00
|
||||
00001DF8 00
|
||||
00001E00 00
|
||||
00001E08 00
|
||||
00001E10 00
|
||||
00001E18 00
|
||||
00001E20 00
|
||||
00001E28 00
|
||||
0298 00001E30 00 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
00001E38 00
|
||||
00001E40 00
|
||||
00001E48 00
|
||||
00001E50 00
|
||||
00001E58 00
|
||||
00001E60 00
|
||||
00001E68 00
|
||||
00001E70 00
|
||||
00001E78 00
|
||||
00001E80 00
|
||||
00001E88 00
|
||||
00001E90 00
|
||||
00001E98 00
|
||||
00001EA0 00
|
||||
GSP COFF Assembler, Version 2.00, 87.300 Sun Oct 18 17:23:19 2026
|
||||
(c) Copyright 1985, 1987, Texas Instruments Inc.
|
||||
|
||||
PAGE 13
|
||||
|
||||
00001EA8 00
|
||||
0299 00001EB0 00 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
00001EB8 00
|
||||
00001EC0 00
|
||||
00001EC8 00
|
||||
00001ED0 00
|
||||
00001ED8 00
|
||||
00001EE0 00
|
||||
00001EE8 00
|
||||
00001EF0 00
|
||||
00001EF8 00
|
||||
00001F00 00
|
||||
00001F08 00
|
||||
00001F10 00
|
||||
00001F18 00
|
||||
00001F20 00
|
||||
00001F28 00
|
||||
0300 00001F30 00 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
00001F38 00
|
||||
00001F40 00
|
||||
00001F48 00
|
||||
00001F50 00
|
||||
00001F58 00
|
||||
00001F60 00
|
||||
00001F68 00
|
||||
00001F70 00
|
||||
00001F78 00
|
||||
00001F80 00
|
||||
00001F88 00
|
||||
00001F90 00
|
||||
00001F98 00
|
||||
00001FA0 00
|
||||
00001FA8 00
|
||||
0301 00001FB0 00 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
00001FB8 00
|
||||
00001FC0 00
|
||||
00001FC8 00
|
||||
00001FD0 00
|
||||
00001FD8 00
|
||||
00001FE0 00
|
||||
00001FE8 00
|
||||
00001FF0 00
|
||||
00001FF8 00
|
||||
00002000 00
|
||||
00002008 00
|
||||
00002010 00
|
||||
00002018 00
|
||||
00002020 00
|
||||
00002028 00
|
||||
0302 00002030 00 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
00002038 00
|
||||
00002040 00
|
||||
00002048 00
|
||||
00002050 00
|
||||
00002058 00
|
||||
00002060 00
|
||||
GSP COFF Assembler, Version 2.00, 87.300 Sun Oct 18 17:23:19 2026
|
||||
(c) Copyright 1985, 1987, Texas Instruments Inc.
|
||||
|
||||
PAGE 14
|
||||
|
||||
00002068 00
|
||||
00002070 00
|
||||
00002078 00
|
||||
00002080 00
|
||||
00002088 00
|
||||
00002090 00
|
||||
00002098 00
|
||||
000020A0 00
|
||||
000020A8 00
|
||||
0303 000020B0 00 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
000020B8 00
|
||||
000020C0 00
|
||||
000020C8 00
|
||||
000020D0 00
|
||||
000020D8 00
|
||||
000020E0 00
|
||||
000020E8 00
|
||||
000020F0 00
|
||||
000020F8 00
|
||||
00002100 00
|
||||
00002108 00
|
||||
00002110 00
|
||||
00002118 00
|
||||
00002120 00
|
||||
00002128 00
|
||||
0304 00002130 00 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
00002138 00
|
||||
00002140 00
|
||||
00002148 00
|
||||
00002150 00
|
||||
00002158 00
|
||||
00002160 00
|
||||
00002168 00
|
||||
00002170 00
|
||||
00002178 00
|
||||
00002180 00
|
||||
00002188 00
|
||||
00002190 00
|
||||
00002198 00
|
||||
000021A0 00
|
||||
000021A8 00
|
||||
0305 000021B0 00 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
000021B8 00
|
||||
000021C0 00
|
||||
000021C8 00
|
||||
000021D0 00
|
||||
000021D8 00
|
||||
000021E0 00
|
||||
000021E8 00
|
||||
000021F0 00
|
||||
000021F8 00
|
||||
00002200 00
|
||||
00002208 00
|
||||
00002210 00
|
||||
00002218 00
|
||||
00002220 00
|
||||
GSP COFF Assembler, Version 2.00, 87.300 Sun Oct 18 17:23:19 2026
|
||||
(c) Copyright 1985, 1987, Texas Instruments Inc.
|
||||
|
||||
PAGE 15
|
||||
|
||||
00002228 00
|
||||
0306 00002230 00 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
00002238 00
|
||||
00002240 00
|
||||
00002248 00
|
||||
00002250 00
|
||||
00002258 00
|
||||
00002260 00
|
||||
00002268 00
|
||||
00002270 00
|
||||
00002278 00
|
||||
00002280 00
|
||||
00002288 00
|
||||
00002290 00
|
||||
00002298 00
|
||||
000022A0 00
|
||||
000022A8 00
|
||||
0307 .end
|
||||
|
||||
No Errors, No Warnings
|
||||
@@ -0,0 +1,34 @@
|
||||
*****************************************************
|
||||
GSP COFF Linker, Version 2.00, 87.300
|
||||
*****************************************************
|
||||
Sun Oct 18 17:23:19 2026
|
||||
|
||||
OUTPUT FILE NAME: <XTEXT.out>
|
||||
ENTRY POINT SYMBOL: 0
|
||||
|
||||
|
||||
SECTION ALLOCATION MAP
|
||||
|
||||
output attributes/
|
||||
section page origin length input sections
|
||||
-------- ---- ---------- ---------- ----------------
|
||||
.data 0 00000000 00000000
|
||||
|
||||
.bss 0 00000000 00000000 UNINITIALIZED
|
||||
|
||||
.text 0 01840000 000022B0
|
||||
01840000 000022B0 XTEXT.obj (.text)
|
||||
|
||||
|
||||
GLOBAL SYMBOLS
|
||||
|
||||
address name address name
|
||||
-------- ---- -------- ----
|
||||
00000000 .bss 00000000 edata
|
||||
00000000 .data 00000000 .bss
|
||||
01840000 .text 00000000 end
|
||||
00000000 edata 00000000 .data
|
||||
00000000 end 01840000 .text
|
||||
018422B0 etext 018422B0 etext
|
||||
|
||||
[6 symbols]
|
||||
@@ -0,0 +1,307 @@
|
||||
; xtext.asm -- open a window on the live DWT X server and draw text in it.
|
||||
;
|
||||
; Run as a first-class process created by the COFF loader (create_process), NOT
|
||||
; in the rdebug dispatcher's context: a connect made from the rdebug process is
|
||||
; accepted at the service layer but the server never reads the X11 setup, so
|
||||
; XOpenDisplay returns an unusable Display. A fresh process works.
|
||||
;
|
||||
; This is xhello.asm plus the text path:
|
||||
; XLoadFont(d,"fixed") 3FD4AE80
|
||||
; XCreateGC(d,win,mask,&values) 3F997000
|
||||
; XSetForeground(d,gc,1) 3FD99A60
|
||||
; XMapWindow(d,win) 3FD645B0
|
||||
; XSync(d,0) / XDrawString(...) loop 3FD9F6B0 / 3FDA0000
|
||||
;
|
||||
; The GC is created with a zero value-mask, so the server fills it from the
|
||||
; screen's default GC (which carries the server's default font, "fixed"). The
|
||||
; draw is repeated with an XSync between iterations so that it lands after the
|
||||
; WM has framed/reparented/mapped the window; a single early draw can be lost
|
||||
; when the window is reparented.
|
||||
;
|
||||
; Calling convention (the one the firmware itself uses; see the WM at
|
||||
; 07F57044 and the TM at 07E5D2B4):
|
||||
;
|
||||
; MOVE A14,-*SP,1 ; reserve the slot the callee restores A14 from
|
||||
; MOVI argN,A0 / MOVE A0,*A14+,1 ; last argument first, upward via A14
|
||||
; ...
|
||||
; MOVI arg0,A0 / MOVE A0,*A14+,1 ; first argument last
|
||||
; CALLA target
|
||||
;
|
||||
; The callee's `rets 2` pops the return address and the reserved slot, so SP is
|
||||
; restored by the call itself; A14 is restored from that slot. Do NOT keep the
|
||||
; entry SP/A14 in RAM and restore them after each call: the app's own stack and
|
||||
; Xlib data structures use the same free heap, and a clobbered saved-SP cell
|
||||
; turns the next call into a wild push. That exact pattern crashed the first
|
||||
; version of this payload at XCreateGC.
|
||||
;
|
||||
; Xlib clobbers the CPU's SETF field state, so the ABI's 32-bit field 1 is
|
||||
; re-established after every call. The Display pointer and the window/GC ids
|
||||
; are kept in callee-saved registers (a11/a10/a12).
|
||||
;
|
||||
; Markers live in 224 bytes of zero padding at the end of .text (01842000h),
|
||||
; NOT in the free heap: the first version's cells at 01895000h were overwritten
|
||||
; by the OS heap (the string "Exiting\n" landed on them).
|
||||
;
|
||||
; 01842000 stage (1 start, 2 display, 3 window, 4 font, 5 GC, 6 setfg,
|
||||
; 7 map, 8 synced/drawn, 9 flushed, 0FFh failed)
|
||||
; 01842020 display pointer
|
||||
; 01842040 font id returned by XLoadFont
|
||||
; 01842060 window id
|
||||
; 01842080 GC id returned by XCreateGC
|
||||
; 018420A0 XSetForeground return
|
||||
; 018420C0 XMapWindow return
|
||||
; 018420E0 last XSync return
|
||||
; 01842100 first XDrawString return
|
||||
; 01842120 second XDrawString return
|
||||
; 01842140 final XSync return
|
||||
; 01841760 strlen("0::0") -- must be 4
|
||||
;
|
||||
; Scratch: 01894000 argument area
|
||||
|
||||
.text
|
||||
_start:
|
||||
setf 16, 0, 0
|
||||
setf 32, 0, 1
|
||||
mmtm sp, a0,a1,a2,a3,a4,a5,a6,a7
|
||||
|
||||
movi 1, a0, L
|
||||
move a0, @01842000h, 1 ; stage = 1
|
||||
|
||||
; ---- convention check: strlen("0::0") == 4 --------------------
|
||||
move a14, -*sp, 1
|
||||
movi 01894000h, a14, L
|
||||
movi 3FACE948h, a0, L ; ROM "0::0"
|
||||
move a0, *a14+, 1 ; arg0
|
||||
calla 3FB458D0h ; strlen
|
||||
setf 16, 0, 0
|
||||
setf 32, 0, 1
|
||||
move a8, @01842160h, 1 ; MARK strlen
|
||||
movi 4, a0, L
|
||||
cmp a0, a8
|
||||
jrne failed
|
||||
|
||||
movi 2, a0, L
|
||||
move a0, @01842000h, 1 ; stage = 2
|
||||
|
||||
; ---- display = XOpenDisplay("0::0") ---------------------------
|
||||
move a14, -*sp, 1
|
||||
movi 01894000h, a14, L
|
||||
movi 3FACE948h, a0, L
|
||||
move a0, *a14+, 1 ; arg0 = name
|
||||
calla 3F9C2570h ; XOpenDisplay
|
||||
setf 16, 0, 0
|
||||
setf 32, 0, 1
|
||||
move a8, a11 ; Display * (callee-saved)
|
||||
move a11, @01842020h, 1 ; MARK display
|
||||
move a11, a11
|
||||
jreq failed
|
||||
|
||||
; ---- root = *(*(display+0x480)+0x40) --------------------------
|
||||
move *a11(0480h), a10, 1
|
||||
move *a10(040h), a10, 1
|
||||
|
||||
movi 3, a0, L
|
||||
move a0, @01842000h, 1 ; stage = 3
|
||||
|
||||
; ---- window = XCreateSimpleWindow(d,root,100,100,400,200,2,1,0) --
|
||||
move a14, -*sp, 1
|
||||
movi 01894000h, a14, L
|
||||
movi 0, a0, L
|
||||
move a0, *a14+, 1 ; background = 0 (black)
|
||||
movi 1, a0, L
|
||||
move a0, *a14+, 1 ; border = 1 (white)
|
||||
movi 2, a0, L
|
||||
move a0, *a14+, 1 ; border width
|
||||
movi 200, a0, L
|
||||
move a0, *a14+, 1 ; height
|
||||
movi 400, a0, L
|
||||
move a0, *a14+, 1 ; width
|
||||
movi 100, a0, L
|
||||
move a0, *a14+, 1 ; y
|
||||
move a0, *a14+, 1 ; x
|
||||
move a10, *a14+, 1 ; parent = root
|
||||
move a11, *a14+, 1 ; display
|
||||
calla 3FD41B90h ; XCreateSimpleWindow
|
||||
setf 16, 0, 0
|
||||
setf 32, 0, 1
|
||||
move a8, a10 ; window id
|
||||
move a10, @01842060h, 1 ; MARK window
|
||||
move a10, a10
|
||||
jreq failed
|
||||
|
||||
movi 4, a0, L
|
||||
move a0, @01842000h, 1 ; stage = 4
|
||||
|
||||
; ---- font = XLoadFont(display, "fixed") -----------------------
|
||||
move a14, -*sp, 1
|
||||
movi 01894000h, a14, L
|
||||
movi FONTNAME, a0, L
|
||||
move a0, *a14+, 1 ; arg1 = name
|
||||
move a11, *a14+, 1 ; arg0 = display
|
||||
calla 3FD4AE80h ; XLoadFont
|
||||
setf 16, 0, 0
|
||||
setf 32, 0, 1
|
||||
move a8, a9 ; Font (callee-saved)
|
||||
move a9, @01842040h, 1 ; MARK font
|
||||
move a9, a9
|
||||
jreq failed
|
||||
|
||||
movi 5, a0, L
|
||||
move a0, @01842000h, 1 ; stage = 5
|
||||
|
||||
; ---- gc = XCreateGC(d, window, 0, NULL) ----------------------
|
||||
; mask 0 -> server default GC values (no value-list to misparse).
|
||||
move a14, -*sp, 1
|
||||
movi 01894000h, a14, L
|
||||
movi 0, a0, L
|
||||
move a0, *a14+, 1 ; arg3 = values
|
||||
move a0, *a14+, 1 ; arg2 = mask 0
|
||||
move a10, *a14+, 1 ; arg1 = drawable
|
||||
move a11, *a14+, 1 ; arg0 = display
|
||||
calla 3F997000h ; XCreateGC
|
||||
setf 16, 0, 0
|
||||
setf 32, 0, 1
|
||||
move a8, a12 ; GC (callee-saved)
|
||||
move a12, @01842080h, 1 ; MARK gc
|
||||
move a12, a12
|
||||
jreq failed
|
||||
|
||||
; ---- XSetForeground(display, gc, 1) --------------------------
|
||||
move a14, -*sp, 1
|
||||
movi 01894000h, a14, L
|
||||
movi 1, a0, L
|
||||
move a0, *a14+, 1 ; arg2 = pixel 1 (white)
|
||||
move a12, *a14+, 1 ; arg1 = gc
|
||||
move a11, *a14+, 1 ; arg0 = display
|
||||
calla 3FD99A60h ; XSetForeground
|
||||
setf 16, 0, 0
|
||||
setf 32, 0, 1
|
||||
move a8, @018420A0h, 1 ; MARK setfg
|
||||
movi 6, a0, L
|
||||
move a0, @01842000h, 1 ; stage = 6
|
||||
|
||||
; ---- XMapWindow(display, window) -----------------------------
|
||||
move a14, -*sp, 1
|
||||
movi 01894000h, a14, L
|
||||
move a10, *a14+, 1 ; window
|
||||
move a11, *a14+, 1 ; display
|
||||
calla 3FD645B0h ; XMapWindow
|
||||
setf 16, 0, 0
|
||||
setf 32, 0, 1
|
||||
move a8, @018420C0h, 1 ; MARK map
|
||||
movi 7, a0, L
|
||||
move a0, @01842000h, 1 ; stage = 7
|
||||
|
||||
; ---- sync + draw, repeated: the WM needs time to frame/map -----
|
||||
movi 4, a9, L
|
||||
draw_loop:
|
||||
move a14, -*sp, 1
|
||||
movi 01894000h, a14, L
|
||||
movi 0, a0, L
|
||||
move a0, *a14+, 1 ; discard = 0
|
||||
move a11, *a14+, 1 ; display
|
||||
calla 3FD9F6B0h ; XSync (flush + round trip)
|
||||
setf 16, 0, 0
|
||||
setf 32, 0, 1
|
||||
move a8, @018420E0h, 1 ; MARK last sync
|
||||
|
||||
; ---- XDrawString(display, window, gc, 20, 80, msg1, 12) ------
|
||||
move a14, -*sp, 1
|
||||
movi 01894000h, a14, L
|
||||
movi 12, a0, L
|
||||
move a0, *a14+, 1 ; arg6 = length
|
||||
movi MSG1, a0, L
|
||||
move a0, *a14+, 1 ; arg5 = string
|
||||
movi 80, a0, L
|
||||
move a0, *a14+, 1 ; arg4 = y
|
||||
movi 20, a0, L
|
||||
move a0, *a14+, 1 ; arg3 = x
|
||||
move a12, *a14+, 1 ; arg2 = gc
|
||||
move a10, *a14+, 1 ; arg1 = window
|
||||
move a11, *a14+, 1 ; arg0 = display
|
||||
calla 3FDA0000h ; XDrawString
|
||||
setf 16, 0, 0
|
||||
setf 32, 0, 1
|
||||
move a8, @01842100h, 1 ; MARK draw1
|
||||
|
||||
; ---- XDrawString(display, window, gc, 20, 120, msg2, 10) ----
|
||||
move a14, -*sp, 1
|
||||
movi 01894000h, a14, L
|
||||
movi 10, a0, L
|
||||
move a0, *a14+, 1 ; arg6 = length
|
||||
movi MSG2, a0, L
|
||||
move a0, *a14+, 1 ; arg5 = string
|
||||
movi 120, a0, L
|
||||
move a0, *a14+, 1 ; arg4 = y
|
||||
movi 20, a0, L
|
||||
move a0, *a14+, 1 ; arg3 = x
|
||||
move a12, *a14+, 1 ; arg2 = gc
|
||||
move a10, *a14+, 1 ; arg1 = window
|
||||
move a11, *a14+, 1 ; arg0 = display
|
||||
calla 3FDA0000h ; XDrawString
|
||||
setf 16, 0, 0
|
||||
setf 32, 0, 1
|
||||
move a8, @01842120h, 1 ; MARK draw2
|
||||
|
||||
; DSJS has a short range; trampoline to the long backward jump.
|
||||
dsjs a9, draw_next
|
||||
jruc draw_done
|
||||
draw_next:
|
||||
jruc draw_loop
|
||||
draw_done:
|
||||
|
||||
movi 8, a0, L
|
||||
move a0, @01842000h, 1 ; stage = 8
|
||||
|
||||
; ---- final XSync flushes the last PolyText8 -----------------
|
||||
move a14, -*sp, 1
|
||||
movi 01894000h, a14, L
|
||||
movi 0, a0, L
|
||||
move a0, *a14+, 1 ; discard = 0
|
||||
move a11, *a14+, 1 ; display
|
||||
calla 3FD9F6B0h ; XSync
|
||||
setf 16, 0, 0
|
||||
setf 32, 0, 1
|
||||
move a8, @01842140h, 1 ; MARK final sync
|
||||
|
||||
movi 9, a0, L
|
||||
move a0, @01842000h, 1 ; stage = 9 (text drawn and flushed)
|
||||
jruc done
|
||||
|
||||
failed:
|
||||
movi 0FFh, a0, L
|
||||
move a0, @01842000h, 1
|
||||
|
||||
done:
|
||||
mmfm sp, a0,a1,a2,a3,a4,a5,a6,a7
|
||||
movi 0, a8, L
|
||||
rets
|
||||
|
||||
MSG1: .byte "HELLO VT1200", 0
|
||||
MSG2: .byte "text works", 0
|
||||
FONTNAME: .byte "-DEC-Terminal-Medium-R-Normal--14-140-75-75-C-8-ISO8859-1", 0
|
||||
|
||||
; 224 bytes of padding: marker cells 01842000h..0184217Fh live here.
|
||||
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
.end
|
||||
Reference in new issue
Block a user