Files
Sprinter-SDCC/docs/samples/edit_sor/GRAPHIC.A80
T
snark13 c71e249a4e Add full compiler toolchain, libc, examples and reference docs
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>
2026-06-03 16:13:21 +03:00

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