Files
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

295 lines
4.5 KiB
NASM
Executable File

DEVICE ZXSPECTRUM128
Start_addr = 0x4200
use_emulator = 1
include "../../include/estex_h.asm"
include "../../include/head_short2.inc"
include "../../include/macro.s"
Counter = 0xfe5b
LoaderStart:
main: di
ld sp,stack_buff
jp begin
;-------------------------------------------------------------------------------
init0: SYS ESTEX_getvmode ;ïîëó÷èòü òåêóùèé ðåæèì ýêðàíà
ld (vmode.mode),a ;ñîõðàíèòü ðåæèì
ex af,af
ld a,b
ld (vmode.screen),a ;è ñòðàíèöó (ýêðàí) ðåæèìà
ex af,af
ld b,_VMODE._T80 ;òåêñòîâûé ðåæèì 80 ñèì.â ñòðîêå
cp b ;òåêóùèé ðåæèì ñîâïàäàåò?
; jr z,.next_init0 ;äà
ret z
ld a,b
ld b,1 ;èíà÷å
ld c,ESTEX_setvmode ;óñòàíîâèòü åãî
rst 0x10
ret
WaitMsCallibration:
di
ld a,WaitMS_IntVector
ld i,a
im 2
ei
halt
call WaitMS_LockCounter
di
im 1
ld de,(WaitMS_LockHL)
ld hl,20
call WaitMS_DIV_DE_HL
ld l,e
ld h,d
call WaitMS_NOT_HL
ld (walcx0+1),hl
ret
;HL=-HL
WaitMS_NOT_HL: ld a,l
cpl
ld l,a
ld a,h
cpl
ld h,a
inc hl
ret
;DE = DE/HL
WaitMS_DIV_DE_HL:
push hl
call WaitMS_NOT_HL
ld c,l
ld b,h
ld hl,0
ld a,e
add a,a
rl d
call wmdi08
call wmdi08
ld e,a
pop bc
srl b
rr c
or a
sbc hl,bc
ret c
inc de
ret
wmdi08: call wmdi04
wmdi04: call wmdi02
wmdi02: call wmdi01
wmdi01: adc hl,hl
add hl,bc
jr c,$+4
sbc hl,bc
rla
rl d
ret
;One MS Delay
WaitMS_LockCounter:
push hl
walcx0: ld hl,Counter
walcx1: inc hl ;6 = 26
ld a,l ;4
or h ;4
jr nz,walcx1 ;12.7
pop hl
ret
;HL = Milliseconds Number
DelayMS:
DEMSCx1: ld a,l
or h
ret z
push hl
call WaitMS_LockCounter
pop hl
dec hl
jr DEMSCx1
SysPrint: ld a,(hl)
inc hl
or a
ret z
push hl
call SysPrintChar
pop hl
jr SysPrint
SysPrintChar: push bc
ld c,0x5b ; print char
rst 0x10
pop bc
ret
; IN:HL=VALUE
SysPrintDEC: LD C,255
LD DE,10000
CALL SYPDCx0
LD DE,1000
CALL SYPDCx0
LD DE,100
CALL SYPDCx0
LD DE,10
CALL SYPDCx0
LD A,L
JR SYPDCx2
SYPDCx0: XOR A
DEC A
SYPDCx1: INC A
SBC HL,DE
JR NC,SYPDCx1
ADD HL,DE
INC C
JR NZ,SYPDCx2
DEC C
OR A
RET Z
SYPDCx2: INC C
ADD A,48
PUSH HL
push DE
push BC
CALL SysPrintChar
POP BC
pop DE
pop HL
RET
SysPrint0D0A: LD A,10
LD C,05BH ; Print Char
RST 16
LD A,13
LD C,05BH ; Print Char
RST 16
RET
;-------------------------------------------------------------------------------
;errors handles
quit: ld b,0
.err: ld c,0x41
rst 0x10
jr $
;-------------------------------------------------------------------------------
begin: call init0
ld hl,SomeText
call SysPrint
; CALL WaitMsCallibration
; ld hl,(walcx0+1)
; call SysPrintDEC
ld bc,(10000/250)*256
lomx1: push bc
ld a,c
and 3
jr nz,lomx4
ld a,b
rra
rrca
dec a
ld l,a
ld h,0
call SysPrintDEC
ld a,' '
call SysPrintChar
lomx4: ld hl,250
call SysPrintDEC
ld hl,TextMS
call SysPrint
pop hl
push hl
ld h,0
ld a,l
and 3
ld l,a
call SysPrintDEC
ld a,'.'
call SysPrintChar
ld hl,250
call DelayMS
pop bc
inc c
push bc
ld a,c
and 3
ld a,' '
ld hl,SysPrintChar
jr nz,lomx2
ld hl,SysPrint0D0A
lomx2: ld (lomx3+1),hl
lomx3: call SysPrintChar
pop bc
djnz lomx1
ld a,(vmode.mode)
cp _VMODE._T80
jr z,.exit
ld a,(vmode.screen)
ld b,a
ld a,(vmode.mode)
SYS ESTEX_setvmode
.exit ld bc,0x0041
rst 0x10
jr $
;Interrupt For Callibration Delay
align 256
WaitMS_IntVector = $/256-1
org $-1
dw WaitMS_IntCallibration
WaitMS_LockHL dw 0
WaitMS_IntCallibration:
ld (WaitMS_LockHL),hl
ld hl,65535
ei
ret
;===============================================================================
vmode:
.mode: db 0
.screen: db 0
align 256
str_buff: ds 256
stack_buff = $+255
stack_buff_size = 256
;===============================================================================
SomeText: db "Test For Wait Milliseconds ...",cr,lf,0
TextMS: db "ms.",0
;===============================================================================
Loader_End:
display "Loader start: ", LoaderStart
display "Loader end: ", Loader_End
display "Loader size: ", Loader_End-LoaderStart
savebin "delayms.exe",EXEHeader,$-EXEHeader