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>
141 lines
3.0 KiB
NASM
Executable File
141 lines
3.0 KiB
NASM
Executable File
; Библиотека работы с клавиатурой
|
|
keybLibrary
|
|
|
|
COM_A EQU 19h
|
|
DAT_A EQU 18h
|
|
|
|
;From z84c15 SIO instruction
|
|
;COM_A Read
|
|
;d0 - Rx Character available
|
|
;d1 - Int panding (Ch.A only)
|
|
;d2 - Tx buffer empty
|
|
;d3 - DCD
|
|
;d4 - Syan/Hunt
|
|
;d5 - CTS
|
|
;d6 - Tx Under.../ EOM
|
|
;d7 - Break/Abort
|
|
;Note: d3-d7 used with "External Status Interrupt" Modes
|
|
|
|
; Установка портов режима
|
|
; в соответствии с описанием
|
|
; последовательного порта z84c15
|
|
; use: a
|
|
keybLibInit
|
|
ld a,#00
|
|
out (COM_A),a
|
|
ld a,#01
|
|
out (COM_A),a
|
|
ld a,#00
|
|
out (COM_A),a
|
|
ld a,#03
|
|
out (COM_A),a
|
|
ld a,#c1
|
|
out (COM_A),a
|
|
ld a,#04
|
|
out (COM_A),a
|
|
ld a,#05
|
|
out (COM_A),a
|
|
ld a,#05
|
|
out (COM_A),a
|
|
ld a,#62
|
|
out (COM_A),a
|
|
ret
|
|
|
|
|
|
; Считывание с клавиатуры пр прерываниям
|
|
; use: hl,de,af
|
|
keybIntHandler
|
|
ld hl,keybBufferSize
|
|
ld de,(_keybBufferPosWrite)
|
|
_keybIntHandlerLoop
|
|
in a,(COM_A)
|
|
bit 0,a ; проверить наличие байта
|
|
ret z ; вернуться, если нет байта
|
|
in a,(DAT_A) ; считать байт
|
|
ld (de),a
|
|
inc e
|
|
ld (_keybBufferPosWrite),de
|
|
inc (hl)
|
|
jp _keybIntHandlerLoop
|
|
|
|
|
|
; Очистка буфера
|
|
; use: hl,af
|
|
keybClearBuff
|
|
di
|
|
xor a
|
|
ld (keybBufferSize),a
|
|
ld hl,keybBuffer
|
|
ld (keybBufferPosRead),hl
|
|
ld (_keybBufferPosWrite),hl
|
|
_keybClearBuffLoop
|
|
in a,(COM_A)
|
|
bit 0,a ; проверить наличие байта
|
|
ret z ; вернуться, если нет байта
|
|
in a,(DAT_A) ; считать байт
|
|
jp _keybClearBuffLoop
|
|
|
|
|
|
; Читаем и декодируем данные из буфера
|
|
; use: hl,de,af
|
|
; ret:
|
|
; a - code (0 if no data)
|
|
; carry=1 if release =0 if presseed
|
|
keybGetKey
|
|
ld hl,keybBufferSize
|
|
ld de,(keybBufferPosRead)
|
|
ld a,(hl)
|
|
ld b,a
|
|
or a
|
|
ret z
|
|
ld a,(de): inc e
|
|
cp #f0
|
|
jr z,keybGetKeyF0; release
|
|
cp #e0
|
|
jr z,keybGetKeyE0; prefix E0
|
|
ld (keybBufferPosRead),de: dec (hl)
|
|
keybGetKeyHasKeyPressed
|
|
and a
|
|
keybGetKeyHasKey
|
|
ld h,#40
|
|
ld l,a
|
|
ld a,(hl)
|
|
ret
|
|
keybGetKeyF0; release
|
|
dec (hl)
|
|
jr z,keybGetKeyNoData
|
|
ld a,(de): inc e
|
|
ld (keybBufferPosRead),de: dec (hl)
|
|
scf
|
|
jr keybGetKeyHasKey
|
|
keybGetKeyE0; prefix E0
|
|
dec (hl)
|
|
jr z,keybGetKeyNoData
|
|
ld a,(de): inc e
|
|
cp #f0
|
|
jr z,keybGetKeyE0F0; prefix E0, release
|
|
ld (keybBufferPosRead),de: dec (hl)
|
|
add a,#80
|
|
jr keybGetKeyHasKeyPressed
|
|
keybGetKeyE0F0; prefix E0,release
|
|
dec (hl)
|
|
jr z,keybGetKeyNoData2
|
|
ld a,(de): inc e
|
|
ld (keybBufferPosRead),de: dec (hl)
|
|
add a,#80
|
|
scf
|
|
jr keybGetKeyHasKey
|
|
keybGetKeyNoData2
|
|
inc (hl)
|
|
keybGetKeyNoData
|
|
inc (hl)
|
|
xor a
|
|
ret
|
|
|
|
keybBufferSize db 0
|
|
keybBufferPosRead dw keybBuffer
|
|
_keybBufferPosWrite dw keybBuffer
|
|
|
|
align 256
|
|
keybBuffer ds 256,0
|