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>
295 lines
4.5 KiB
NASM
Executable File
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 |