Files
arti 41b0979aef c-hello: first C program on the VT1200, running on real hardware
The 1987 TI K&R toolchain already compiled and linked a fib test, but nothing
had ever been executed on a VT1200. This is that program: hello.c draws HELLO
into video RAM (1 bpp, bit 0x04000000, no X11) and is loaded through the COFF
loader with hostload.py, on the real unit and in MAME.

Two runtime traps shaped the design, both recorded in the README:

  * boot.obj's exit() is `for(;;)` and _c_int00 ends in `reti`.  That is a
    standalone-ROM runtime, not a process: the child spun forever, and because
    the VT1200 OS is cooperative it took the whole terminal down (illegal
    opcode on hardware).  entry.asm replaces boot.obj -- set STK/FP, call
    _main, `rets` back to the create_process trampoline, the same return
    xhello uses -- and the image carries no .cinit (tables are built in code).
  * Pointers are bit addresses and pointer arithmetic scales by object size,
    so p + n on a char * is n bytes.  The pre-fix frame in evidence/ is that
    bug: 32 one-byte bars spread across a row.

Framebuffer geometry is not portable: the real unit is 1280 px wide at a
256-byte row pitch, MAME's canvas is 1024 px at 128.  build.sh builds both
(ROW_BYTES), and the README records how the real pitch was measured from a
real-unit frame rather than taken from MAME.

Evidence: real-unit frames in harness/c-hello/evidence/ (the pre-fix stripes
and the working HELLO), and dwt/loader/evidence/real-unit-xhello/ for the X
window that ran on the unit earlier.
2026-10-29 18:25:38 +02:00

266 lines
4.1 KiB
ArmAsm

*******************************************************
* GSP C COMPILER, Version 2.01, 87.300 *
*******************************************************
FP .set A13
STK .set A14
.bss STATIC_1,224,16
.bss STATIC_2,40,16
.bss STATIC_3,18432,16
.file "HELLO.c"
******************************************************
* FUNCTION DEF : _build_font
******************************************************
_build_font:
MOVE A12,-*SP,1
MOVK 17,A12
MOVB A12,@STATIC_1
MOVB A12,@STATIC_1+8
ADDK 14,A12
MOVB A12,@STATIC_1+16
SUBK 14,A12
MOVB A12,@STATIC_1+24
MOVB A12,@STATIC_1+32
MOVB A12,@STATIC_1+40
MOVB A12,@STATIC_1+48
ADDK 14,A12
MOVB A12,@STATIC_1+56
SUBK 15,A12
MOVB A12,@STATIC_1+64
MOVB A12,@STATIC_1+72
ADDK 14,A12
MOVB A12,@STATIC_1+80
SUBK 14,A12
MOVB A12,@STATIC_1+88
MOVB A12,@STATIC_1+96
ADDK 15,A12
MOVB A12,@STATIC_1+104
SUBK 15,A12
MOVB A12,@STATIC_1+112
MOVB A12,@STATIC_1+120
MOVB A12,@STATIC_1+128
MOVB A12,@STATIC_1+136
MOVB A12,@STATIC_1+144
MOVB A12,@STATIC_1+152
ADDK 15,A12
MOVB A12,@STATIC_1+160
SUBK 17,A12
MOVB A12,@STATIC_1+168
ADDK 3,A12
MOVB A12,@STATIC_1+176
MOVB A12,@STATIC_1+184
MOVB A12,@STATIC_1+192
MOVB A12,@STATIC_1+200
MOVB A12,@STATIC_1+208
SUBK 3,A12
MOVB A12,@STATIC_1+216
SUB A12,A12
MOVB A12,@STATIC_2
ADDK 1,A12
MOVB A12,@STATIC_2+8
ADD A12,A12
MOVB A12,@STATIC_2+16
MOVB A12,@STATIC_2+24
ADDK 1,A12
MOVB A12,@STATIC_2+32
EPI0_1:
MOVE *SP+,A12,1
RETS 0
.globl _main
******************************************************
* FUNCTION DEF : _main
******************************************************
_main:
MMTM SP,A3,A5,A7,A12,FP
MOVE STK,FP
ADDI 288,STK
CALLA _build_font
MOVI 1212501068,A12
MOVE A12,@0018A8000h,1
CLR A12
MOVE A12,*FP(192),1
JRUC L1
L4:
CLR A12
MOVE A12,*FP(160),1
JRUC L5
L8:
MOVE *FP(192),A7,1
SLL 8,A7
ADDI STATIC_3,A7
MOVE *FP(160),A5,1
SLL 3,A5
ADD A5,A7
CLR A5
MOVB A5,*A7
MOVE *FP(160),A7,1
ADDK 1,A7
MOVE A7,*FP(160),1
L5:
MOVE *FP(160),A7,1
CMPI 32,A7
JRLT L8
MOVE *FP(192),A5,1
ADDK 1,A5
MOVE A5,*FP(192),1
L1:
MOVE *FP(192),A7,1
CMPI 72,A7
JRLT L4
CLR A12
MOVE A12,*FP,1
JRUC L9
L12:
CLR A12
MOVE A12,*FP(32),1
JRUC L13
L16:
MOVE *FP,A7,1
SLL 3,A7
ADDI STATIC_2,A7
SETF 8,0,0
MOVE *A7,A7
MOVI 56,A12
MPYS A12,A7
ADDI STATIC_1,A7
MOVE *FP(32),A5,1
SLL 3,A5
ADD A5,A7
MOVE *A7,A7
MOVE A7,*FP(224),1
CLR A12
MOVE A12,*FP(64),1
JRUC L17
L20:
MOVK 16,A7
MOVE *FP(64),A5,1
NEG A5
SRA A5,A7
MOVE *FP(224),A5,1
AND A5,A7
JRZ L18
CLR A7
MOVE A7,*FP(128),1
JRUC L22
L25:
CLR A12
MOVE A12,*FP(96),1
JRUC L26
L29:
MOVE *FP,A7,1
MOVE A7,A5
SLL 5,A7
SLL 4,A5
ADD A7,A5
ADDK 8,A5
MOVE *FP(64),A7,1
SLL 3,A7
ADD A7,A5
MOVE *FP(96),A7,1
ADD A7,A5
MOVE A5,*FP(160),1
MOVE *FP(32),A7,1
SLL 3,A7
ADDK 8,A7
MOVE *FP(128),A5,1
ADD A5,A7
MOVE A7,*FP(192),1
SLL 8,A7
ADDI STATIC_3,A7
MOVE *FP(160),A5,1
SRA 3,A5
SLL 3,A5
ADD A5,A7
MOVE *FP(160),A5,1
MOVK 7,A12
AND A12,A5
MOVK 1,A3
SLL A5,A3
SLL 24,A3
SRL 24,A3
SETF 8,0,0
MOVE *A7,A5
OR A3,A5
MOVB A5,*A7
MOVE *FP(96),A7,1
ADDK 1,A7
MOVE A7,*FP(96),1
L26:
MOVE *FP(96),A7,1
CMPI 8,A7
JRLT L29
MOVE *FP(128),A5,1
ADDK 1,A5
MOVE A5,*FP(128),1
L22:
MOVE *FP(128),A7,1
CMPI 8,A7
JRLT L25
L18:
MOVE *FP(64),A7,1
ADDK 1,A7
MOVE A7,*FP(64),1
L17:
MOVE *FP(64),A7,1
CMPI 5,A7
JRLT L20
MOVE *FP(32),A5,1
ADDK 1,A5
MOVE A5,*FP(32),1
L13:
MOVE *FP(32),A7,1
CMPI 7,A7
JRLT L16
MOVE *FP,A5,1
ADDK 1,A5
MOVE A5,*FP,1
L9:
MOVE *FP,A7,1
CMPI 5,A7
JRLT L12
CLR A12
MOVE A12,*FP(192),1
JRUC L30
L33:
MOVE *FP(192),A7,1
ADDI 800,A7
SLL 10,A7
ADDI 67108904,A7
MOVE A7,*FP(256),1
CLR A12
MOVE A12,*FP(160),1
JRUC L34
L37:
MOVE *FP(256),A7,1
MOVE *FP(160),A5,1
SLL 3,A5
ADD A7,A5
MOVE *FP(192),A7,1
SLL 8,A7
ADDI STATIC_3,A7
MOVE *FP(160),A3,1
SLL 3,A3
ADD A3,A7
MOVB *A7,*A5
MOVE *FP(160),A7,1
ADDK 1,A7
MOVE A7,*FP(160),1
L34:
MOVE *FP(160),A7,1
CMPI 32,A7
JRLT L37
MOVE *FP(192),A5,1
ADDK 1,A5
MOVE A5,*FP(192),1
L30:
MOVE *FP(192),A7,1
CMPI 72,A7
JRLT L33
MOVI 1146048069,A12
MOVE A12,@0018A8020h,1
CLR A8
EPI0_2:
ADDI -288,STK
MMFM SP,A3,A5,A7,A12,FP
RETS 0
.end