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>
This commit is contained in:
Executable
+170
@@ -0,0 +1,170 @@
|
||||
Interrupt_Vector: EQU 0BE00h; Вектор прерываний
|
||||
|
||||
...
|
||||
|
||||
DI
|
||||
LD A, I
|
||||
LD (.SaveInterrupt), A
|
||||
LD A, HIGH Interrupt_Vector
|
||||
LD I, A
|
||||
IM 2
|
||||
|
||||
; Заполним буфер "тишины" для CBL
|
||||
LD A, 080h
|
||||
LD HL, BufNoSound
|
||||
LD DE, BufNoSound + 1
|
||||
LD BC, 128 ; для 16 бит 256
|
||||
LD (HL), A
|
||||
LDIR
|
||||
|
||||
; Прерывание от CBL
|
||||
LD HL, IM2_CBL
|
||||
LD (Interrupt_Vector OR 0FFh), HL
|
||||
|
||||
; Установим в CBL тишину
|
||||
LD A, 2
|
||||
LD (IM2_CBL.NumberPage), A
|
||||
|
||||
...
|
||||
|
||||
EI
|
||||
|
||||
; Включим CBL
|
||||
LD BC, 004Eh
|
||||
LD A, 10011000b ; COVOX-Blaster + Interrupt + 7.8125 KHz
|
||||
OUT (C), A
|
||||
|
||||
...
|
||||
|
||||
LD A, ...
|
||||
LD HL, ...
|
||||
LD BC, ...
|
||||
CALL PlaySound
|
||||
|
||||
...
|
||||
|
||||
; Ожидаем завершения воспроизведения CBL
|
||||
.LoopEndSound:
|
||||
HALT
|
||||
LD A, (IM2_CBL.NumberPage)
|
||||
OR A
|
||||
JR NZ, .LoopEndSound
|
||||
|
||||
; Выключим CBL
|
||||
LD BC, 004Eh
|
||||
XOR A
|
||||
OUT (C), A
|
||||
|
||||
...
|
||||
|
||||
DI
|
||||
|
||||
; Восстановим вектор прерывания
|
||||
.SaveInterrupt+*: LD A, 0
|
||||
LD I, A
|
||||
IM 1
|
||||
EI
|
||||
|
||||
.Exit:
|
||||
LD C, DSS.Exit
|
||||
RST 10h
|
||||
JR $
|
||||
|
||||
BufNoSound: DS 128
|
||||
|
||||
; Проиграть звук
|
||||
; A - Номер страницы с данными для воспроизведения
|
||||
; HL - Адрес начала данных для воспроизведения в 1й странице (4000h..7FFFh)
|
||||
; BC - Длина данных для воспроизведения, должна должны быть кратна 128 байтам
|
||||
PlaySound:
|
||||
PUSH AF, HL
|
||||
; Если нужно ожидать завершение предыдущего воспроизведения, то раскомментировать
|
||||
; LD A, (IM2_CBL.NumberPage)
|
||||
; OR A
|
||||
; JR NZ, .Exit
|
||||
LD (IM2_CBL.NumberPage), A
|
||||
LD (IM2_CBL.AddrSound), HL
|
||||
LD (IM2_CBL.Length), BC
|
||||
.Exit:
|
||||
POP HL, AF
|
||||
RET
|
||||
|
||||
|
||||
IM2_CBL:
|
||||
DI
|
||||
PUSH AF
|
||||
IN A, (0FEh)
|
||||
RLCA
|
||||
JR NC, .NoSound ; Если прерывание не от CBL
|
||||
.NumberPage+*: LD A, 0
|
||||
OR A
|
||||
JR Z, .NoSound ; Если нечего играть
|
||||
PUSH BC, DE, HL
|
||||
CP 3
|
||||
JR NC, .PlaySound
|
||||
DEC A
|
||||
LD (.NumberPage), A
|
||||
|
||||
;SaveAndSetPage1 .Save_Page_1, (Pages.Data)
|
||||
IN A, (PAGE_1)
|
||||
LD (.Save_Page_1), A
|
||||
LD A,(Pages.Data)
|
||||
OUT (PAGE_1), A
|
||||
|
||||
LD HL, BufNoSound
|
||||
JR .CopyData
|
||||
|
||||
.PlaySound:
|
||||
LD D, A
|
||||
;SaveAndSetPage1 .Save_Page_1, D
|
||||
IN A, (PAGE_1)
|
||||
LD (.Save_Page_1), A
|
||||
LD A, D
|
||||
OUT (PAGE_1), A
|
||||
.AddrSound+*: LD HL, 0
|
||||
.CopyData:
|
||||
IN A, (PAGE_3)
|
||||
LD (.Save_Page_3), A
|
||||
LD A, 0FDh
|
||||
OUT (PAGE_3), A
|
||||
|
||||
LD DE, 0C000h
|
||||
; Запись данных с помощью акселератора
|
||||
LD B, E
|
||||
LD D, D ; ACC_On_NoDI
|
||||
LD C, 128 ; BC = 128 байт
|
||||
LD L, L; ACC_CopyBlock_Horizontal
|
||||
LD A, (HL)
|
||||
LD (DE), A
|
||||
LD B, B; ACC_Off_NoEI
|
||||
|
||||
;; Запись данных через порт 4Fh
|
||||
; PUSH BC, HL
|
||||
; LD BC, 804Fh
|
||||
; OTIR
|
||||
; POP HL, BC
|
||||
|
||||
ADD HL, BC
|
||||
LD (.AddrSound), HL
|
||||
OR A
|
||||
.Length+*: LD HL, 0
|
||||
SBC HL, BC
|
||||
JR NZ, .NotEndSound
|
||||
LD A, 2
|
||||
LD (.NumberPage), A
|
||||
LD HL, 512 ; Такая длина, чтобы не было рекурсии
|
||||
.NotEndSound:
|
||||
LD (.Length), HL
|
||||
|
||||
.Exit:
|
||||
.Save_Page_1+*: LD A, 0
|
||||
OUT (PAGE_1), A
|
||||
.Save_Page_3+*: LD A, 0
|
||||
OUT (PAGE_3), A
|
||||
|
||||
POP HL, DE, BC
|
||||
.NoSound:
|
||||
POP AF
|
||||
EI
|
||||
RETI
|
||||
|
||||
Reference in New Issue
Block a user