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

948 lines
15 KiB
NASM

; ‚室ï騥 ä㭪樨:
;
; puts
; printf
; fprintf
; cprintf
; sprintf
; scanf
; fscanf
; sscanf
;
MODULE puts
;
; "stdio.h"
; ”ã­ªæ¨ï § ¯¨á뢠¥â ¢ë¡à ­­ãî áâபã string ¢ áâ ­¤ àâ­ë© ¯®â®ª
; ¢ë¢®¤  stdout, § ¬¥­ïï ¢ ¢ë室­®¬ ¯®â®ª¥ ­ã«¥¢®© ᨬ¢®« ®ª®­ç ­¨ï
; áâப¨ ('\0') ᨬ¢®«®¬ ­®¢®© áâப¨ ('\n').
; ”ã­ªæ¨ï ¢á¥£¤  ¢®§¢à é ¥â ¯®á«¥¤­¨© § ¯¨á ­­ë© ᨬ¢®«, ª®â®àë¬
; ï¥âáï ᨬ¢®« ­®¢®© áâப¨ '\n'.
;
; in: hl =  ¤à¥á áâப¨
; out: a = ¯®á«¥¤­¨© ᨬ¢®« áâப¨
;
; char puts(*string)
;
puts_::
ld a,(hl)
or a
jr z,@1
push hl
call putch_##
pop hl
inc hl
jp puts_
;
@1: ld a,0Ah
push af
call putch_##
pop af
ret
ENDMODULE
MODULE frmts
;-----------------------------------------------------------
; call from ..printf
;-----------------------------------------------------------
; in: hl =  ¤à¥á ­ ç «  ¯ à ¬¥â஢
; de =  ¤à¥á ®¡à ¡®â稪 
; bc =  ¤à¥á ¯¥à¥¤ ¢ ¥¬ëå ¯ à ¬¥â஢
; out: hl = ç¨á«® ¢ë¢¥¤¥­­ëå ᨬ¢®«®¢, ¥á«¨ Ok
; hl = ®âà¨æ â¥«ì­®¥ §­ ç¥­¨¥, ¯à¨ ®è¨¡ª¥
;
; int @spr@(char *fmt, char (* callback)(), int param)
;
;
mk_num: ld (mn0+1),a ; base
ld (chars+1),bc
exx
ld hl,number
exx
call mn0
exx
ld (hl),0
exx
ld hl,number
ld a,(sign)
or a
ret z
dec hl
ret
;------------------------------------
mn0: ld bc,200Ah
xor a
mn1: add hl,hl
rl e
rl d
rla
cp c
jr c,mn2
sub c
inc l
mn2: djnz mn1
; DEHL-quot; A-rem
push af
ld a,d
or e
or h
or l
call nz,mn0
pop af
push hl
chars: ld hl,char1 ; save char1 or char2
ld c,a
ld b,0
add hl,bc
ld a,(hl)
pop hl
exx
ld (hl),a
inc hl
exx
ret
;-------------------------------------------
scan_length:
xor a
ld (flong),a ; false
ld (fladj),a
ld (flen+0),a ; make length = 0
ld (flen+1),a
ld a," "
ld (padch),a ; space padding by default
ld a,(hl)
cp "-"
jr nz,sl1
ld (fladj),a ; all will be LEFT adjusted, not right
inc hl
sl1: ld a,(hl)
cp "0"
jr nz,sl2
ld a,(fladj)
or a
jr nz,sl1a
ld a,"0"
ld (padch),a ; pad numbers with '0's, not spaces
sl1a: inc hl
sl2: ld de,0
sl2a: ld a,(hl)
sub "0"
jr c,sl3
cp 9+1
jr nc,sl3
ex de,hl
ld c,l
ld b,h
add hl,hl
add hl,hl
add hl,bc
add hl,hl
ld b,0
ld c,a
add hl,bc
ex de,hl
inc hl
jr sl2a
;
sl3: ld (flen),de ; set explicit length
ld a,(hl)
cp "l"
jr z,sl4
cp "L"
ret nz
sl4: ld (flong),a ; true
inc hl
ret
;--------------------------------------------
_pad: dec hl
bit 7,h
ret nz
push hl
ld a,(padch)
call outch
pop hl
ld de,(nprtd+1)
inc de
ld (nprtd+1),de
jp _pad
;=====================================================================
;
; int @spr@(char *fmt,char (* callback)(), int param)
;
;=====================================================================
@spr@:: ld (outch1+1),bc ; optional parameter
ld (outch2+1),de ; callback pointer
push hl
pop iy ; at (iy+2) we have current parameter
ld hl,0
ld (nprtd+1),hl ; clear return value
ld l,(iy+0) ; at iy we have pointer to format string
ld h,(iy+1)
loop: ld a,(hl)
inc hl
or a
jr z,nprtd
cp "%"
jr z,loc3
loc4: call outch
ld de,(nprtd+1)
inc de
ld (nprtd+1),de
jp loop
;
nprtd: ld hl,0 ; return value
ret
;
loc3: ld a,(hl)
inc hl
cp "%"
jr z,loc4
dec hl
call scan_length ; scan [-][0][0-9*][lL]
ld a,(hl)
inc hl
cp "c"
jp z,prt_c
cp "C"
jp z,prt_c ; print single character
cp "d"
jp z,prt_d
cp "D"
jp z,prt_d ; signed decimal
cp "u"
jp z,prt_u
cp "U"
jp z,prt_u ; unsigned decimal
cp "o"
jp z,prt_o
cp "O"
jp z,prt_o ; octal
cp "x"
jp z,prt_x1
cp "X"
jp z,prt_x2 ; hexadecimal
cp "s"
jp z,prt_s
cp "S"
jp z,prt_s ; string
jp loop
;
; %c symbol
prt_c: ld a,(iy+2)
call outch
ld de,(nprtd+1)
inc de
ld (nprtd+1),de
prt_q: inc iy
inc iy
ld a,(flong)
or a
jp z,loop ; false
inc iy
inc iy
jp loop
;
; %s string
prt_s: ld a," "
ld (padch),a
push hl
push iy
ld l,(iy+2)
ld h,(iy+3)
fmt0: push hl
call strlen_##
ex de,hl
ld hl,(flen)
or a
sbc hl,de
ld (flen),hl
ld a,(fladj)
or a
call z,_pad
pop hl
fmt1: ld a,(hl)
inc hl
or a
jr z,fmt2
call outch
ld de,(nprtd+1)
inc de
ld (nprtd+1),de
jp fmt1
;
fmt2: ld hl,(fladj)
ld a,(flen)
or a
call nz,_pad
pop iy
pop hl
jp prt_q
;
; %u unsigned decimal
prt_u: push hl
push iy
call getnum
jr fmt4
;
; %d signed decimal
prt_d: push hl
push iy
call getnum
ld a,(flong)
or a
jr nz,fmt3 ; true
bit 7,h
jr z,fmt3
ld de,-1
fmt3: bit 7,d
jr z,fmt4
ld a,"-"
ld (sign),a
xor a
sub l
ld l,a
ld a,0
sbc a,h
ld h,a
ld a,0
sbc a,e
ld e,a
ld a,0
sbc a,d
ld d,a
fmt4: ld a,10 ; base
ld bc,char1
call mk_num
jp fmt0
;
; %o octal
prt_o: push hl
push iy
call getnum
ld a,8 ; base
ld bc,char1
call mk_num
jp fmt0
;
; %X hex
prt_x2: ld bc,char1
prt_x: push hl
push iy
call getnum
ld a,16 ; base
call mk_num
jp fmt0
;
; %x hex
prt_x1: ld bc,char2
jr prt_x
;---------------------------------------
getnum: xor a
ld (sign),a
ld l,(iy+2)
ld h,(iy+3)
ld a,(flong)
or a
jr z,gnu1 ; false
ld e,(iy+4)
ld d,(iy+5)
ret
gnu1: ld de,0
ret
;---------------------------------------
outch: push hl
push iy
outch1: ld de,0 ; optional parameter
outch2: call 0 ; callback pointer
or a
jr z,och1
ld hl,8000h ; -32768
ld (nprtd+1),hl
och1: pop iy
pop hl
ret
char1: db "0123456789ABCDEF"
char2: db "0123456789abcdef"
dseg
flen: dw 0
fladj: db 0
flong: db 0 ; false/true
padch: db " "
;
sign: db 0 ; §­ ª ç¨á« 
number: ds 16 ; ¡ãä¥à ç¨á« 
ENDMODULE
MODULE xfputc
;-----------------------------------------------------------
; call from printf_, fprintf_
;-----------------------------------------------------------
; ”ã­ªæ¨ï ¢ë¢®¤¨â ᨬ¢®« ¢ ä ©« *fp.
; ਠ®è¨¡ª¥ ¢®§¢à é ¥âáï EOF (0FFFFh)
; in: a = ¢ë¢®¤¨¬ë© ᨬ¢®«
; out: hl=0 - Ok
; hl=EOF (0FFFFh) - ®è¨¡ª 
;
; int @fputc(c, FILE *fp)
;
@fputc::
call fputc_## ; ¢ë¢®¤ ᨬ¢®«  ¢ ¯®â®ª (ä ©«)
ld hl,-1 ; ®è¨¡ª 
cp l
ret z
xor a
inc hl ; Ok
ret
ENDMODULE
MODULE printf
;
; "stdio.h"
; ”ã­ªæ¨ï ¢ë¢®¤¨â ¤ ­­ë¥ á ¯à¥®¡à §®¢ ­¨¥¬ ä®à¬ â  ¢ áâ ­¤ àâ­ë©
; ¯®â®ª stdout ¨§ ¯¥à¥¬¥­­ëå, ®¯à¥¤¥«ï¥¬ëå  à£ã¬¥­â ¬¨ args.
; Š ¦¤ë©  à£ã¬¥­â ¤®«¦¥­ 㪠§ë¢ âì ­  §­ ç¥­¨¥ á ⨯®¬, ª®â®àë©
; ᮮ⢥âáâ¢ã¥â ⨯ã, § ¤ ­­®¬ã ¢ áâப¥ ä®à¬ â .
;
; in: ¯ à ¬¥âàë ¢ á⥪¥
; out: hl = ç¨á«® ¢ë¢¥¤¥­ëå ᨬ¢®«®¢, ¥á«¨ Ok
; hl = ®âà¨æ. §­ ç¥­¨¥ (¨§ @spr@) ¯à¨ ®è¨¡ª¥
;
; int printf(char *format, arg1, arg2, ...)
;
printf_::
ld bc,_iob_##-14 ; FILE-áâàãªâãà  ¯®â®ª  stdout
ld de,@fputc## ;  ¤à¥á ®¡à ¡®â稪 
ld hl,2
add hl,sp ; ï祩ª  á  ¤à¥á®¬ arg1
jp @spr@##
ENDMODULE
MODULE fprintf
;
; "stdio.h"
; ”ã­ªæ¨ï ¢ë¢®¤¨â ¤ ­­ë¥ á ¯à¥®¡à §®¢ ­¨¥¬ ä®à¬ â  ¢ ä ©« *fp
; ¨§ ¯¥à¥¬¥­­ëå, ®¯à¥¤¥«ï¥¬ëå 㪠§ â¥«ï¬¨  à£ã¬¥­â®¢ args.
; Š ¦¤ë©  à£ã¬¥­â ¤®«¦¥­ 㪠§ë¢ âì ­  §­ ç¥­¨¥ á ⨯®¬, ª®â®àë©
; ᮮ⢥âáâ¢ã¥â ⨯ã, § ¤ ­­®¬ã ¢ áâப¥ ä®à¬ â .
;
; in: ¯ à ¬¥âàë ¢ á⥪¥
; out: hl = ç¨á«® ¢ë¢¥¤. ᨬ¢®«®¢, ¥á«¨ Ok
; hl = ®âà¨æ. §­ ç¥­¨¥ (¨§ @spr@) ¯à¨ ®è¨¡ª¥
;
; int fprintf(FILE *fp, char *format, arg1, arg2, ...)
;
fprintf_::
pop hl
pop bc ; bc =  ¤à¥á ä®à¬. áâப¨
push bc
push hl
ld de,@fputc## ;  ¤à¥á ®¡à ¡®â稪 
ld hl,4
add hl,sp ; ï祩ª  á  ¤à¥á®¬ arg1
jp @spr@##
ENDMODULE
MODULE cprintf
;
; "conio.h"
; ”ã­ªæ¨ï ¢ë¢®¤¨â á ¯à¥®¡à §®¢ ­¨¥¬ ä®à¬ â  ­ ¡®àë ᨬ¢®«®¢
; ¨ §­ ç¥­¨© ¯àאַ ­  íªà ­.
; Š ¦¤ë©  à£ã¬¥­â ¤®«¦¥­ 㪠§ë¢ âì ­  §­ ç¥­¨¥ á ⨯®¬, ª®â®àë©
; ᮮ⢥âáâ¢ã¥â ⨯ã, § ¤ ­­®¬ã ¢ áâப¥ ä®à¬ â .
;
; in: ¤ ­­ë¥ ¢ á⥪¥
; out: hl = ç¨á«® ¢ë¢¥¤. ᨬ¢®«®¢, ¥á«¨ Ok
; hl = ®âà¨æ. §­ ç¥­¨¥ (¨§ @spr@), ¯à¨ ®è¨¡ª¥
;
; int cprintf(char *format, arg1, arg2, ...)
;
putch@: call putch_##
xor a
ret
cprintf_::
ld de,putch@ ;  ¤à¥á ®¡à ¡®â稪 
ld hl,2
add hl,sp ; ï祩ª  á  ¤à¥á®¬ arg1
jp @spr@##
ENDMODULE
MODULE sprintf
;
; "stdio.h"
; ”ã­ªæ¨ï ¯à¥®¡à §ã¥â ä®à¬ â ¨ ¢ë¢®¤¨â ­ ¡®àë ᨬ¢®«®¢ ¨ §­ ç¥­¨©
; ¢ buffer. ‚ ª®­¥æ ¢ë¢®¤¨¬®© áâப¨ § ¯¨á뢠¥âáï ­ã«ì.
; Š ¦¤ë©  à£ã¬¥­â ¤®«¦¥­ 㪠§ë¢ âì ­  §­ ç¥­¨¥ á ⨯®¬, ª®â®àë© á®®â-
; ¢¥âáâ¢ã¥â ⨯ã, § ¤ ­­®¬ã ¢ áâப¥ ä®à¬ â .
; ”ã­ªæ¨ï ¢®§¢à é ¥â ª®«¨ç¥á⢮ ᨬ¢®«®¢, § ¯¨á ­­ëå ¢ buffer.
;
; int sprintf(char buffer, char *format, arg1, arg2, ...)
;
; in: de=ï祩ª , åà ­ïé ï  ¤à¥á ¡ãä¥à 
@sspr@: ex de,hl
ld e,(hl)
inc hl
ld d,(hl) ; de= ¤à¥á ¡ãä¥à 
ld (de),a ; á®åà. ᨬ¢®«
inc de
ld (hl),d ; á®åà. ⥪.  ¤à¥á ¡ãä¥à  ¢ á⥪¥
dec hl
ld (hl),e
xor a
ret
sprintf_::
ld hl,2
add hl,sp ; ï祩ª  á  ¤à¥á®¬ ¡ãä¥à 
ld c,l
ld b,h
ld de,@sspr@ ;  ¤à¥á ®¡à ¡®â稪 
ld hl,4
add hl,sp
call @spr@##
ex de,hl
pop bc
pop hl
ld (hl),0 ; to end string
push hl
push bc
ex de,hl ; hl=return value
ret
ENDMODULE
;[]============================ scanf ==================================[]
MODULE xxscn
;
; call from _scn_
;
@igs@: ex de,hl
@41: ld l,e
ld h,d
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld a,(hl)
cp " "
jr z,@40
cp 9 ; Tab
jr z,@40
cp 0Ah
ret nz
@40: ld l,e
ld h,d
push de
ld e,(hl)
inc hl
ld d,(hl)
inc de
ld (hl),d
dec hl
ld (hl),e
pop de
jr @41
; ¢ë室: hl= ¢®§¢à. ¡ ©â
@bc@: ld hl,@46+1
ld (hl),e ; ¡ §  ç¨á¥«
call toupper_##
cp "A"
jr c,@42
cp "Z"+1
jr c,@43
@42: cp "a"
jr c,@44
cp "z"+1
jr c,@43
@44: cp "_"
jr nz,@45
@43: sub "7"
jr @46
;
@45: cp "0"
jr c,@47
cp "9"+1
jr nc,@47
sub "0"
jr @46
;
@47: ld hl,-1 ; ¢®§¢à. §­ ç¥­¨¥
ret
;
@46: ld l,0 ; á®åà. §­ ç¥­¨¥
cp l
jr c,@48
ld a,-1
@48: ld l,a ; ¢®§¢à. ¡ ©â
ld h,0
ret
dseg
?95: dw 0
?99: dw 0
?100: db 0 ; false/true
?102: db 0
?103: dw 0
?104: dw 0
?105: dw 0
cseg
;
; call from ..scanf
;
_scn_::
ld (?95),hl
ld l,e;
ld h,d;
inc de
inc de
;ld hl,-2
;add hl,de
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld (?99),hl
ld l,e
ld h,d
ld (?105),hl
xor a
ld (?102),a
@50: ld hl,(?99)
ld a,(hl)
inc hl
ld (?99),hl
or a
jp z,@49
cp " "
jr z,@50
cp 9 ; Tab
jr z,@50
cp 0Ah
jr z,@50
cp "%"
jp nz,@51
push hl
ld hl,1
ld (?103),hl
ld a,l ; a=true
ld (?100),a
ld a,10
ld (?101+1),a ; ¡ §  ç¨á¥«
pop hl
ld a,(hl)
inc hl
ld (?99),hl
cp "*"
jr nz,@52
xor a ; false
ld (?100),a
ld a,(hl)
inc hl
ld (?99),hl
@52: call toupper_##
cp "X" ; hex
jr z,@53
cp "O" ; octal
jr z,@54
cp "D" ; decimal
jr z,@55
cp "U" ; unsigned
jr z,@56
cp "S" ; string
jp z,@57
cp "C" ; char
jp z,@58
jp @49
;
@53: ld a,16
ld (?101+1),a ; ¡ §  ç¨á¥«
jr @56
;
@54: ld a,8
ld (?101+1),a ; ¡ §  ç¨á¥«
jr @56
;
@55: ld hl,?95
call @igs@
cp "-"
jr nz,@56
ld hl,-1
ld (?103),hl
ld hl,(?95)
inc hl
ld (?95),hl
;
@56: ld hl,0
ld (?104),hl
ld hl,?95
call @igs@
?101: ld e,0 ; á®åà. §­ ç¥­¨¥ (¡ §  ç¨á¥«)
call @bc@
ld a,l
and h
inc a
jp z,@49
@60: ld a,(?101+1) ; ¡ §  ç¨á¥«
ld e,a
push af
ld hl,(?95)
ld a,(hl)
inc hl
ld (?95),hl
call @bc@
ld a,l
pop de
ld e,d
cp 0FFh
jr z,@61
push af
ld d,0
ld hl,(?104)
call ?MULHD##
pop de
ld e,d
ld d,0
add hl,de
ld (?104),hl
jr @60
;
@61: ld hl,(?95)
dec hl
ld (?95),hl
jp @62
;
@57: ld hl,?95
call @igs@
ld hl,(?105)
ld c,(hl)
inc hl
ld b,(hl)
@65: ld hl,(?95)
ld a,(hl)
inc hl
ld (?95),hl
ld e,a
inc e
dec e
jr z,@63
ld hl,(?99)
ld a,(hl)
cp e
jr nz,@64
inc hl
ld (?99),hl
jr @63
;
@64: ld a,(?100)
or a
jr z,@65 ; false
ld a,e
ld (bc),a
inc bc
jr @65
;
@63: ld hl,?100
ld e,(hl)
inc e
dec e
jp z,@50 ; false
ld hl,(?102)
inc l
ld a,l
ld (?102),a
xor a
ld (bc),a
ld hl,(?105)
inc hl
inc hl
ld (?105),hl
jp @50
;
@58: ld hl,?100
ld e,(hl)
inc e
dec e
jr z,@66 ; false
ld hl,(?95)
ld a,(hl)
ld hl,(?105)
ld c,(hl)
inc hl
ld b,(hl)
inc hl
ld (?105),hl
ld (bc),a
ld hl,(?102)
inc l
ld a,l
ld (?102),a
@66: ld hl,(?95)
inc hl
ld (?95),hl
jp @50
;
@62: ld a,(?100)
or a
jr z,@51 ; false
ld de,(?103)
ld hl,(?104)
call ?MULHD##
ex de,hl
ld hl,(?105)
inc hl
inc hl
ld (?105),hl
dec hl
dec hl
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld (hl),e
inc hl
ld (hl),d
ld hl,(?102)
inc l
ld a,l
ld (?102),a
@51: ld hl,(?95)
ld a,(hl)
or a
jp nz,@50
@49: ld hl,(?102)
ld h,0
ret
ENDMODULE
MODULE scanf
;
; "stdio.h"
; ”ã­ªæ¨ï ç¨â ¥â ¤ ­­ë¥ á ¯à¥®¡à §®¢ ­¨¥¬ ä®à¬ â  ¨§ áâ ­¤ àâ­®£®
; ¯®â®ª  stdin ¢ ¯¥à¥¬¥­­ë¥, ®¯à¥¤¥«ï¥¬ë¥ 㪠§ â¥«ï¬¨  à£ã¬¥­â®¢ args.
; Š ¦¤ë©  à£ã¬¥­â ¤®«¦¥­ 㪠§ë¢ âì ­  §­ ç¥­¨¥ á ⨯®¬, ª®â®àë© á®®â-
; ¢¥âáâ¢ã¥â ⨯ã, § ¤ ­­®¬ã ¢ áâப¥ ä®à¬ â .
; ”ã­ªæ¨ï ¨á¯®«ì§ã¥â ¡ãä¥à ¢ ®¡« á⨠á⥪ , à §¬¥à®¬ 128 ¡ ©â.
; ”ã­ªæ¨ï ¢®§¢à é ¥â ç¨á«® ¯®«¥©, à §¤¥«¥­­ëå ᯥæ-ᨬ¢®« ¬¨.
;
; int scanf(char *format, arg1, arg2, ...)
;
scanf_::
ld (@1+1),sp
ld hl,-128 ; à §¬¥à ¡ãä¥à 
add hl,sp ; hl= ¤à¥á ¡ãä¥à  ¢ á⥪¥
ld sp,hl ; à á¯®«®¦¨âì á⥪ ­¨¦¥ ¡ãä¥à 
call gets_## ; ¢¢¥á⨠áâபã á ª®­á®«¨
ex de,hl
ld hl,128+2
add hl,sp
ex de,hl ; hl=㪠§ â¥«ì ­  ¡ãä¥à
call _scn_##
@1: ld sp,0
ret
ENDMODULE
MODULE fscanf
;
; "stdio.h"
; ”ã­ªæ¨ï ç¨â ¥â ¤ ­­ë¥ á ¯à¥®¡à §®¢ ­¨¥¬ ä®à¬ â  ¨§ ä ©«  *fp,
; ¢ ¯¥à¥¬¥­­ë¥, ®¯à¥¤¥«ï¥¬ë¥ 㪠§ â¥«ï¬¨  à£ã¬¥­â®¢ args.
; Š ¦¤ë©  à£ã¬¥­â ¤®«¦¥­ 㪠§ë¢ âì ­  §­ ç¥­¨¥ á ⨯®¬, ª®â®àë©
; ᮮ⢥âáâ¢ã¥â ⨯ã, § ¤ ­­®¬ã ¢ áâப¥ ä®à¬ â .
; ”ã­ªæ¨ï ¨á¯®«ì§ã¥â ¡ãä¥à ¢ ®¡« á⨠á⥪ , à §¬¥à®¬ 128 ¡ ©â.
; ”ã­ªæ¨ï ¢®§¢à é ¥â ç¨á«® ¯®«¥©, à §¤¥«¥­­ëå ᯥæ-ᨬ¢®« ¬¨.
; ਠ¤®á⨦¥­¨¨ ª®­æ  ä ©« , ¢ë¤ ¥âáï EOF.
;
; int fscanf(FILE *fp, char *format, arg1, arg2, ...)
;
fscanf_::
ld (@68+1),sp
; ld (?137+1),hl ;  ¤à¥á áâàãªâãàë ¤¥áªà.
ld c,l; ; bc= ¤à¥á áâàãªâãàë ¤¥áªà.
ld b,h;
ld hl,-128
add hl,sp
ld sp,hl ; à á¯®«®¦¨âì á⥪ ­¨¦¥ ¡ãä¥à 
;?137: ld hl,0
; call ?LAUHL;##
; dw 132
; ;
; ld c,l ; bc= ¤à¥á áâàãªâãàë ¤¥áªà.
; ld b,h
ld de,127 ; ¬ ªá.¤«¨­  áâப¨ + 1
ld hl,0
add hl,sp ; hl= ¤à¥á ¡ãä¥à  ¢ ï祩ª¥ á⥪ 
call fgets_## ; ¯®«ãç¨âì áâப㠨§ ä ©«  (¯®â®ª )
ld a,l
or h
jr nz,@67 ; ¡¥§ ®è¨¡®ª
dec hl ; hl=EOF
jr @68
;
@67: ex de,hl
ld hl,132
add hl,sp
ex de,hl ; hl=㪠§ â¥«ì ­  ¡ãä¥à
call _scn_##
@68: ld sp,0
ret
ENDMODULE
MODULE sscanf
;
; "stdio.h"
; ”ã­ªæ¨ï ç¨â ¥â ¤ ­­ë¥ á ¯à¥®¡à §®¢ ­¨¥¬ ä®à¬ â  ¨§ buffer,
; ¢ ¯¥à¥¬¥­­ë¥, ®¯à¥¤¥«ï¥¬ë¥ 㪠§ â¥«ï¬¨  à£ã¬¥­â®¢ args.
; Š ¦¤ë©  à£ã¬¥­â ¤®«¦¥­ 㪠§ë¢ âì ­  §­ ç¥­¨¥ á ⨯®¬, ª®â®àë©
; ᮮ⢥âáâ¢ã¥â ⨯ã, § ¤ ­­®¬ã ¢ áâப¥ ä®à¬ â .
; ”ã­ªæ¨ï ¢®§¢à é ¥â ç¨á«® ¯®«¥©, à §¤¥«¥­­ëå ᯥæ-ᨬ¢®« ¬¨.
;
; int sscanf(char *buffer, char *format, arg1, arg2, ...)
;
sscanf_::
ld hl,2
add hl,sp
ld e,(hl)
inc hl
ld d,(hl)
inc hl
ex de,hl
jp _scn_##
ENDMODULE