c71e249a4e
First substantive commit: the entire Sprinter C compiler tree on top of
the bare README+gitignore initial commit.
What's in here:
bin/sprinter-cc — driver script invoking SDCC + linker + mkexe
libc/ — Sprinter-specific libc layer over ESTEX/BIOS
(conio, gfx, io, mem, stdio + headers)
runtime/ — crt0 variants (default/small/banked/minimal)
+ heap + bank trampolines
toolchain/ — mkexe (SprintEXE packer, C + tests)
examples/ — 30 demo programs (gfx, file I/O, env, time, …)
lib/Makefile — builds the libc archive (sprinter.lib)
docs/ — converted Sprinter manuals + asm reference samples
third_party/ — solid-c reference compiler dump + sdcc setup script
release_docs/ — packaging / release notes
gitignore overhaul:
• Drop dangerous blanket patterns: *.asm (would hide docs/samples/*.asm)
and *.exe (case-insensitive match was hiding third_party/solid-c/*.EXE
on macOS APFS). Replaced with examples/*/*.{asm,exe,…} and lib/*.lib.
• Restore tracking of toolchain/mkexe/tests/{one,big}.bin — those are
INPUT fixtures, not build outputs.
• Collapse the duplicated SDCC/C/Sdcc sections into one section per
concern (build outputs / vendored / OS-junk).
• Add .sprinter-cc-*/, build/ (catches lib/build/ too), .claude/.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
181 lines
3.6 KiB
Z80 Assembly
181 lines
3.6 KiB
Z80 Assembly
;[]=======================================================================[]
|
|
;
|
|
; Draw text string to the screen 640x256 in 16colors
|
|
; Input:
|
|
; hl - pointer to the C string (0 - end string)
|
|
; de - x position
|
|
; bc - y position
|
|
; a - background and foreground color
|
|
; d7 - d4 background color (0-15)
|
|
; d3 - d0 foreground color (0-15)
|
|
;
|
|
; Output:
|
|
; hl - pointer to the next byte behind string
|
|
;
|
|
; Destroy registers:
|
|
; 'hl, 'de, 'bc
|
|
|
|
TextOut:
|
|
push iy
|
|
ld yl, c ; y position
|
|
ld b, a ; store colors
|
|
in a, (YPORT) ; store Y_PORT
|
|
push af
|
|
in a, (PAGE1)
|
|
ld yh, a ; store PAGE1
|
|
call PreparePrintColors
|
|
push de ; x position
|
|
exx
|
|
pop bc
|
|
srl b
|
|
rr c ; start address for x position
|
|
set 6, b ; print address start from 0x4000
|
|
ld hl, BackgroundBuffer ; background buffer
|
|
ld de, ForegroundBuffer ; foreground buffer
|
|
exx
|
|
ld c, l ; pointer to the string
|
|
ld b, h
|
|
; now:
|
|
; bc - pointer to the C string
|
|
; 'hl - pointer to the background buffer
|
|
; 'de - pointer to the foreground buffer
|
|
; 'bc - x position
|
|
; yl - y position
|
|
|
|
di ; disable interrupts
|
|
ld d, d ; set acceleration work lenght
|
|
ld a, 0x08
|
|
ld b, b
|
|
ld a, (bc) ; test on null string
|
|
inc bc
|
|
or a
|
|
jr z, .exit
|
|
.loop1:
|
|
ld l, a ; font is always aligned to 256 bytes
|
|
ld h, FONT_BASE/256 ; pointer to the specialy font
|
|
push bc
|
|
ld b, (hl) ; character size x
|
|
inc h
|
|
ld e, (hl)
|
|
inc h
|
|
ld a, (hl) ; offset to character image
|
|
add a, FONT_BASE/256
|
|
ld d, a
|
|
ld hl, 0x0008 ; line lenght in character image
|
|
ex de, hl
|
|
ld a, VPAGE
|
|
out (PAGE1), a ; set video memory to 0x4000-0x8000
|
|
.loop2:
|
|
ld l, l ; linear load
|
|
ld a, (hl) ; read 8 bytes to accel memory
|
|
ld b, b
|
|
exx
|
|
ld a, yl
|
|
out (YPORT), a ; set y position out
|
|
ld l, l ; linear or
|
|
or (hl) ; with BackgroundBuffer
|
|
ld b, b
|
|
ex de, hl
|
|
ld l, l ; linear exclusive or
|
|
xor (hl) ; with ForegroundBuffer
|
|
ld a, a ; vertical write
|
|
ld (bc), a ; write 8 bytes from accel memory to vram
|
|
ld b, b
|
|
ex de, hl
|
|
inc bc ; next vertical line in video ram
|
|
exx
|
|
add hl, de ; next line in character image
|
|
djnz .loop2
|
|
pop bc
|
|
ld a, yh
|
|
out (PAGE1), a
|
|
ld a, (bc)
|
|
inc bc
|
|
or a
|
|
jr nz, .loop1 ; end string ?
|
|
.exit:
|
|
ei ; enable interrupts
|
|
ld l, c ; return pointer to the end string
|
|
ld h, b
|
|
pop af
|
|
out (YPORT), a ; restore YPORT
|
|
pop iy
|
|
ret
|
|
|
|
;[]=======================================================================[]
|
|
;
|
|
; Prepare text colors for accel text out
|
|
; Input:
|
|
; b - background and foreground color
|
|
; d7 - d4 background color (0-15)
|
|
; d3 - d0 foreground color (0-15)
|
|
;
|
|
; Destroy registers:
|
|
; a, bc, 'hl
|
|
|
|
PreparePrintColors:
|
|
ld a, b
|
|
.prev_color: cp 0x00 ; color is prepared ?
|
|
ret z
|
|
ld (.prev_color + 1), a
|
|
and 0x0F ; foreground color
|
|
ld c, a
|
|
rlca
|
|
rlca
|
|
rlca
|
|
rlca
|
|
or c
|
|
exx
|
|
cpl
|
|
ld hl, ForegroundBuffer ; foreground buffer
|
|
ld (hl), a
|
|
inc hl
|
|
ld (hl), a
|
|
inc hl
|
|
ld (hl), a
|
|
inc hl
|
|
ld (hl), a
|
|
inc hl
|
|
ld (hl), a
|
|
inc hl
|
|
ld (hl), a
|
|
inc hl
|
|
ld (hl), a
|
|
inc hl
|
|
ld (hl), a
|
|
exx
|
|
ld a, b
|
|
and 0xF0 ; background color
|
|
ld b, a
|
|
rrca
|
|
rrca
|
|
rrca
|
|
rrca
|
|
or b
|
|
exx
|
|
xor (hl) ; exclusive or with foreground color
|
|
ld hl, BackgroundBuffer ; background buffer
|
|
ld (hl), a
|
|
inc hl
|
|
ld (hl), a
|
|
inc hl
|
|
ld (hl), a
|
|
inc hl
|
|
ld (hl), a
|
|
inc hl
|
|
ld (hl), a
|
|
inc hl
|
|
ld (hl), a
|
|
inc hl
|
|
ld (hl), a
|
|
inc hl
|
|
ld (hl), a
|
|
exx
|
|
ret
|
|
|
|
ForegroundBuffer:
|
|
times 8 db 0
|
|
BackgroundBuffer:
|
|
times 8 db 0
|
|
|