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>
522 lines
5.9 KiB
Plaintext
522 lines
5.9 KiB
Plaintext
;Part 2. Graphic samples. Subprograms of low level.
|
|
|
|
;Print string (text line) at the screen
|
|
;IY- addr. of the text line
|
|
;HL-x
|
|
;b-y,c- colour
|
|
pline
|
|
ld (plinex),hl
|
|
ld a,c
|
|
cp #ff
|
|
jr z,pline
|
|
rlca
|
|
rlca
|
|
rlca
|
|
rlca
|
|
or c
|
|
ld (printcol),a
|
|
pline1
|
|
ld a,(IY)
|
|
cp 0
|
|
ret z
|
|
cp #16
|
|
jp z,plinecoor
|
|
cp #0d
|
|
jp z,pline_cr
|
|
cp #0A
|
|
jp z,pline_lf
|
|
cp #17
|
|
jp z,pline_tab
|
|
call print
|
|
inc hl
|
|
inc hl
|
|
inc hl
|
|
inc hl
|
|
|
|
inc IY
|
|
jp pline1
|
|
|
|
|
|
|
|
|
|
pline_tab
|
|
push bc
|
|
ld b,24
|
|
pline_tab1
|
|
inc hl
|
|
djnz pline_tab1
|
|
pop bc
|
|
jp pline1
|
|
|
|
pline_lf
|
|
inc b
|
|
inc b
|
|
inc b
|
|
inc b
|
|
inc b
|
|
inc b
|
|
inc b
|
|
inc b
|
|
|
|
inc IY
|
|
jp pline1
|
|
|
|
pline_cr
|
|
ld hl,(plinex)
|
|
inc IY
|
|
jp pline1
|
|
|
|
plinecoor
|
|
inc IY
|
|
ld a,(IY)
|
|
ld b,a
|
|
ld a,(IY+1)
|
|
ld l,a
|
|
ld a,(IY+2)
|
|
ld h,a
|
|
inc IY
|
|
inc IY
|
|
inc IY
|
|
jp pline1
|
|
|
|
|
|
|
|
|
|
|
|
plinex defw 0
|
|
|
|
|
|
|
|
print_tab
|
|
;Print to symbol positions
|
|
;B-y. C - x
|
|
;A - symbol
|
|
;Colour - last
|
|
|
|
push af
|
|
push bc
|
|
ld b,c
|
|
ld hl,0
|
|
ld de,6
|
|
print_tab1
|
|
add hl,de
|
|
djnz pline_tab1
|
|
pop bc
|
|
ld c,#ff
|
|
pop af
|
|
jp print
|
|
|
|
|
|
|
|
|
|
|
|
;Print to the screen (Pixels coordinates).
|
|
;6x8 pixels
|
|
print
|
|
;HL-x
|
|
;B-y
|
|
;C-colour, #FF - no change
|
|
;A-symbol
|
|
|
|
push ix
|
|
push hl
|
|
push de
|
|
push bc
|
|
push af
|
|
ld ix,printchar
|
|
ld (ix),a
|
|
srl h
|
|
rr l
|
|
ld (ix+1),l
|
|
ld (ix+2),h
|
|
ld (ix+3),b
|
|
bit 7,c
|
|
call z,prncolor_change
|
|
call open_video_mem
|
|
ld a,(ix)
|
|
ld h,0
|
|
ld l,a
|
|
add hl,hl
|
|
add hl,hl
|
|
add hl,hl
|
|
ex de,hl
|
|
ld hl,font
|
|
add hl,de
|
|
ld (ix+4),l
|
|
ld (ix+5),h
|
|
; Loop of 8 pixels at the screen
|
|
ld a,8
|
|
print_lines
|
|
push af
|
|
ld d,(ix+2)
|
|
ld e,(ix+1)
|
|
ld hl,#4000
|
|
add hl,de
|
|
ld (pcuradr),hl
|
|
ld (pcuradr1),hl
|
|
ld a,(ix+3)
|
|
out (port_y),a
|
|
ld l,(ix+4)
|
|
ld h,(ix+5)
|
|
ld a,(hl)
|
|
ld c,a
|
|
ld a,3
|
|
print_point
|
|
push af
|
|
ld hl,(pcuradr1)
|
|
ld a,(hl)
|
|
sla c
|
|
jr nc,ppoint1
|
|
and %00001111
|
|
ld b,(ix+6)
|
|
push af
|
|
ld a,b
|
|
and %11110000
|
|
ld b,a
|
|
pop af
|
|
or b
|
|
ppoint1
|
|
sla c
|
|
jr nc,ppoint2
|
|
and %11110000
|
|
ld b,(ix+6)
|
|
push af
|
|
ld a,b
|
|
and %00001111
|
|
ld b,a
|
|
pop af
|
|
or b
|
|
ppoint2
|
|
ld (hl),a
|
|
inc hl
|
|
ld (pcuradr1),hl
|
|
pop af
|
|
dec a
|
|
jp nz,print_point
|
|
ld a,(ix+3)
|
|
inc a
|
|
ld (ix+3),a
|
|
ld h,(ix+5)
|
|
ld l,(ix+4)
|
|
inc hl
|
|
ld (ix+5),h
|
|
ld (ix+4),l
|
|
ld hl,(pcuradr)
|
|
ld (pcuradr1),hl
|
|
pop af
|
|
dec a
|
|
jp nz,print_lines
|
|
pop af
|
|
pop bc
|
|
pop de
|
|
pop hl
|
|
pop ix
|
|
|
|
ret
|
|
|
|
prncolor_change
|
|
ld a,c
|
|
rlca
|
|
rlca
|
|
rlca
|
|
rlca
|
|
or c
|
|
ld (ix+6),a
|
|
ret
|
|
|
|
|
|
|
|
pcuradr defw 0
|
|
pcuradr1 defw 0
|
|
printchar defb 0
|
|
printx defw 0
|
|
printy defb 0
|
|
printfnt defw 0
|
|
printcol defb 0
|
|
|
|
|
|
|
|
|
|
;Paint the point (dot).
|
|
set_point
|
|
;HL-x D-y, E-colour
|
|
|
|
push hl
|
|
push de
|
|
|
|
push de
|
|
ld a,e
|
|
sla e
|
|
sla e
|
|
sla e
|
|
sla e
|
|
or e
|
|
ld (modcolor),a
|
|
pop de
|
|
ld a,d
|
|
ld (pointy),a
|
|
push hl
|
|
srl h
|
|
rr l
|
|
ld (movex),hl
|
|
pop hl
|
|
bit 0,l
|
|
jp z,set_point_p
|
|
jp set_point_np
|
|
set_point_p
|
|
ld a,%11110000
|
|
ld (set_point_cm),a
|
|
xor #ff
|
|
ld (set_point_sm),a
|
|
jp set_point_put
|
|
|
|
|
|
set_point_np
|
|
ld a,%00001111
|
|
ld (set_point_cm),a
|
|
xor #ff
|
|
ld (set_point_sm),a
|
|
jp set_point_put
|
|
|
|
|
|
|
|
set_point_put
|
|
|
|
call open_video_mem
|
|
ld a,(pointy)
|
|
out (port_y),a
|
|
ld hl,(movex)
|
|
ld d,h
|
|
ld e,l
|
|
ld hl,#4000
|
|
add hl,de
|
|
ld a,(hl)
|
|
and 0
|
|
set_point_sm equ $-1
|
|
ld e,a
|
|
ld a,(modcolor)
|
|
and 0
|
|
set_point_cm equ $-1
|
|
or e
|
|
ld (hl),a
|
|
call close_video_mem
|
|
pop de
|
|
pop hl
|
|
|
|
ret
|
|
|
|
modcolor defb 0
|
|
pointy defb 0
|
|
movex defw 0
|
|
|
|
;Paint horizontal line
|
|
horline
|
|
call open_video_mem
|
|
|
|
push de
|
|
ld d,h
|
|
ld e,l
|
|
ld hl,#4000
|
|
srl d
|
|
rr e
|
|
add hl,de
|
|
pop de
|
|
ld a,d
|
|
out (port_y),a
|
|
ld a,e
|
|
sla a
|
|
sla a
|
|
sla a
|
|
sla a
|
|
or e
|
|
ld (hl),a
|
|
ld d,h
|
|
ld e,l
|
|
inc de
|
|
srl b
|
|
rr c
|
|
ldir
|
|
|
|
call close_video_mem
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
verline
|
|
;HL-x, D-y, E-colour, B-length
|
|
call set_point
|
|
inc d
|
|
djnz verline
|
|
ret
|
|
|
|
|
|
box
|
|
;HL-x,D-y,E-colour, BC-length, A-height
|
|
push af
|
|
push hl
|
|
push de
|
|
push bc
|
|
call horline
|
|
pop bc
|
|
pop de
|
|
pop hl
|
|
pop af
|
|
push af
|
|
push hl
|
|
push de
|
|
push bc
|
|
add a,d
|
|
ld d,a
|
|
call horline
|
|
pop bc
|
|
pop de
|
|
pop hl
|
|
pop af
|
|
push af
|
|
push hl
|
|
push de
|
|
push bc
|
|
ld b,a
|
|
call verline
|
|
pop bc
|
|
pop de
|
|
pop hl
|
|
pop af
|
|
add hl,bc
|
|
ld b,a
|
|
call verline
|
|
ret
|
|
|
|
|
|
|
|
fbox
|
|
;HL-x,D-y,E-colour, BC-length, A-height
|
|
push ix
|
|
call open_video_mem
|
|
ld ix,box_x
|
|
;Loading of variables
|
|
res 0,c
|
|
srl b
|
|
rr c
|
|
ld (ix+3),c
|
|
ld (ix+4),b
|
|
res 0,l
|
|
srl h
|
|
rr l
|
|
ld (ix+1),h
|
|
ld (ix),l
|
|
ld (ix+2),d
|
|
ld (ix+5),a
|
|
ld a,e
|
|
rlca
|
|
rlca
|
|
rlca
|
|
rlca
|
|
or e
|
|
ld (ix+6),a
|
|
|
|
fbox1
|
|
ld a,(ix+2)
|
|
out (port_y),a
|
|
inc a
|
|
ld (ix+2),a
|
|
ld d,(ix+1)
|
|
ld e,(ix)
|
|
ld hl,#4000
|
|
add hl,de
|
|
ld d,h
|
|
ld e,l
|
|
inc de
|
|
ld b,(ix+4)
|
|
ld c,(ix+3)
|
|
ld a,(ix+6)
|
|
ld (hl),a
|
|
ldir
|
|
ld a,(ix+5)
|
|
dec a
|
|
jr z,fbox2
|
|
ld (ix+5),a
|
|
jp fbox1
|
|
fbox2
|
|
pop ix
|
|
call close_video_mem
|
|
ret
|
|
|
|
box_x defw 0 ;+0 +1
|
|
box_y defb 0 ;+2
|
|
box_l defw 0 ;+3 +4
|
|
box_h defb 0 ;+5
|
|
box_c defb 0 ;+6
|
|
|
|
|
|
putspr
|
|
;HL-x, D-y, E-empty, BC-length, A - height, iy - address
|
|
call open_video_mem1
|
|
ld (spr_adr),iy
|
|
ld iy,spr_cox
|
|
srl h
|
|
rr l
|
|
ld (iy),l
|
|
ld (iy+1),h
|
|
srl b
|
|
rr c
|
|
ld (iy+4),b
|
|
ld (iy+3),c
|
|
ld (iy+2),d
|
|
ld (iy+5),a
|
|
|
|
putspr1
|
|
ld a,(iy+2)
|
|
out (port_y),a
|
|
ld d,(iy+1)
|
|
ld hl,#4000
|
|
ld d,(iy+1)
|
|
ld e,(iy)
|
|
add hl,de
|
|
ld d,h
|
|
ld e,l
|
|
ld hl,(spr_adr)
|
|
ld b,(iy+4)
|
|
ld c,(iy+3)
|
|
|
|
ldir
|
|
ld (spr_adr),hl
|
|
ld a,(spr_hei)
|
|
dec a
|
|
ret z
|
|
ld (spr_hei),a
|
|
ld a,(iy+2)
|
|
inc a
|
|
ld (iy+2),a
|
|
jp putspr1
|
|
call close_video_mem
|
|
ret
|
|
|
|
|
|
|
|
spr_cox defw 0 ;+0 +1
|
|
spr_coy defb 0 ;+2
|
|
spr_len defw 0 ;+3 +4
|
|
spr_hei defb 0 ;+5
|
|
spr_adr defw 0 ;+6 +7
|
|
|
|
|
|
|
|
getspr
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|