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

1672 lines
38 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
; _fopen_ ª®¤ ¤«ï "t" ¢ëª¨­ãâì ?.
;
;
; ‚室ï騥 ä㭪樨:
;
; _main_
; exit
; atexit
; fclosall
; fflush
; fgetpos
; fsetpos
; rewind
; fseek
; ftell
; clearerr - ¯à®¢¥à¨âì ¯¥à¥¤ îâáï «¨ ¢á¥ 9 ᨬ¢®«®¢ ¨¬¥­¨ "clearerr_"
; fdopen
; freopen
; fopen
; fclose
; gets
; ungetc
; fputc
; fputs
; fgetc
; fgets
; fwrite
; fread
;
;////////////////////////////////////////////////////////////////////////
;
; C root MODULE - open standart i/o
;
;////////////////////////////////////////////////////////////////////////
MODULE root2
;
;
; in: hl = ª®«-¢®  à£ã¬¥­â®¢ (¬ ªá.32)
; de =  ¤à¥á ¬ áᨢ  _argv_ (ᯨ᮪  à£ã¬¥­â®¢ ª®¬. áâப¨)
;
cseg
_main_::
xor a
ld (atxcount),a ; á¡à. ç¨á«® § à¥£¨áâ. ä㭪権
push de
push hl
ld hl,fclosall_ ; func
call atexit_ ; set as "exit function"
;---------------------------------------------------
; initialize standard streams (without buffer)
;---------------------------------------------------
; stdin "read only"
ld iy,_iob_## ; FILE stdin
ld hl,-1
ld (iy+6),l ; descriptor
ld (iy+7),h
set 0,(iy+0) ; set "read only"
set 1,(iy+1) ; set "stdin" (keyboard)
; stdout "write only"
ld iy,_iob_##-14 ; FILE stdout
dec hl ; -2
ld (iy+6),l ; descriptor
ld (iy+7),h
set 1,(iy+0) ; set "write only"
set 2,(iy+1) ; set "stdout" (screen)
; stderr "write only"
ld iy,_iob_##-28 ; FILE stderr
dec hl ; -3
ld (iy+6),l ; descriptor
ld (iy+7),h
set 1,(iy+0) ; set "write only"
set 3,(iy+1) ; set "stderr" (screen)
; stdaux "write only"
ld iy,_iob_##-42 ; FILE stdaux
dec hl ; -4
ld (iy+6),l ; descriptor
ld (iy+7),h
set 1,(iy+0) ; set "write only"
set 4,(iy+1) ; set "stdaux" (serial port)
; stdprn "write only"
ld iy,_iob_##-56 ; FILE stdprn
dec hl ; -5
ld (iy+6),l ; descriptor
ld (iy+7),h
set 1,(iy+0) ; set "write only"
set 5,(iy+1) ; set "stdprn" (printer)
pop hl ; count arguments (max.32)
pop de ; addr list of arguments (_argv_)
call main_## ; func main()
;
; "stdlib.h"
; ”ã­ªæ¨ï § ¢¥à蠥⠢맢 ­­ë© ¯à®æ¥áá. ¥à¥¤ § ¢¥à襭¨¥¬ ¯à®æ¥áá ,
; äã­ªæ¨ï á¡à á뢠¥â ¢á¥ ¡ãä¥àë ¢ ä ©«ë ¨ § ªà뢠¥â ¢á¥ ®âªàëâë¥ ä ©«ë.
; ¥à¥¤ ¢ë室®¬ ¢ ®¯¥à æ¨®­ãî á¨á⥬ã, äã­ªæ¨ï ¯à¥¤¢ à¨â¥«ì­® ¢ë§ë¢ ¥â
; ­  ®âà ¡®âªã § à¥£¨áâà¨à®¢ ­­ë¥ ä㭪樨 "exit function" (®âà ¡ â뢠-
; î騥 ¯¥à¥¤ ¢ë室®¬ ¢ „Ž‘).
; ‡­ ç¥­¨¥ code ®¡ëç­® ãáâ ­ ¢«¨¢ ¥âáï ¢ 0 ¤«ï 㪠§ ­¨ï ­®à¬ «ì­®£® ¢ë-
; 室  ¨ ãáâ ­ ¢«¨¢ ¥âáï ¢ «î¡®¥ ¤à㣮¥ §­ ç¥­¨¥ ¤«ï ®¯à¥¤¥«¥­¨ï ®è¨¡ª¨.
; ®áª®«ìªã ¢ë§®¢ exit ­¥ ¢®§¢à é ¥â §­ ç¥­¨ï, â® ¬«. ¡ ©â code ï¥âáï
; ª®¤®¬ ¢®§¢à â  ¤«ï த¨â¥«ì᪮£® ¯à®æ¥áá .
;
; in: hl = §­ ç¥­¨¥ code
; out: ­¥â
;
; void exit(int code)
;
exit_::
push hl ; §­ ç¥­¨¥ code
@2: ld a,(atxcount) ; ç¨á«® § à¥£¨áâà. ä㭪権
dec a ; --atxcount
jp m,@1 ; ç¨á«® ä㭪権 < 0
ld (atxcount),a
ld l,a
ld h,0
add hl,hl
ld de,atxtable ; ᯨ᮪  ¤à¥á®¢ § à¥£¨áâà. ä㭪権
add hl,de
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld de,@2 ;  ¤à¥á ¢®§¢à â  ¯®á«¥ ®âà ¡®âª¨ ä㭪樨
push de
; ¢ë§¢ âì ¯®á«¥¤­îî ¢ ᯨ᪥ § à¥£¨áâà. äã­ªæ¨î
jp (hl)
;
@1: pop hl ; §­ ç¥­¨¥ code
jp _exit_## ; ¢ë©â¨ ¢ „Ž‘
;
; "stdlib.h"
; ”ã­ªæ¨ï ॣ¨áâà¨àã¥â (§ ­®á¨â ¢ ᢮© ᯨ᮪) äã­ªæ¨î *func
; ª ª "exit function", â.¥. ®âà ¡ â뢠îéãî ¯¥à¥¤ ¢ë室®¬ ¢ „Ž‘.
; ‚ á«ãç ¥ ­®à¬ «ì­®£® ®ª®­ç ­¨ï ¯à®£à ¬¬ë, exit ¢ë§ë¢ ¥â (¡¥§
;  à£ã¬¥­â®¢) "exit function" ª ª à § ¯¥à¥¤ ¢®§¢à â®¬ ¢ ®¯¥à -
; 樮­­ãî á¨á⥬ã.
; Š ¦¤ë© ¢ë§®¢ atexit ॣ¨áâà¨àã¥â ¤àã£ãî § ¢¥àè îéãîáï äã­ªæ¨î.
; ¥£¨áâà¨àã¥¬ë¥ ä㭪樨 ­¥ ¬o£ãâ ¨¬¥âì ¯ à ¬¥âào¢. Œ®¦¥â ¡ëâì
; § à¥£¨áâà¨à®¢ ­® ­¥ ¡®«¥¥ 8 ä㭪権, ª®â®àë¥ ¢ë¯®«­ïîâáï ¢ ¯®à浪¥
; "¯®á«¥¤­¨© ¯à¨è¥« - ¯¥à¢ë© ã襫" (LIFO).
; ”ã­ªæ¨ï atexit áoo⢥âáâ¢ã¥â áâ ­¤ àâã ANSI ¨ ¤o«¦­  ¨á¯o«ì§o-
; ¢ âìáï ¢¬¥áâo onexit, ¥á«¨ âॡã¥âáï áo¢¬¥á⨬oáâì á ANSI.
; ”ã­ªæ¨ï ¢o§¢à é ¥â 0, ¥á«¨ ¢á¥ ­oଠ«ì­o ¨ ­¥­ã«¥¢o¥ §­ ç¥­¨¥
; ¯à¨ o訡ª¥ (¥á«¨ 㦥 o¯à¥¤¥«¥­o ¬ ªá. ç¨á«® exit-ä㭪権).
;
; in: hl =  ¤à¥á ॣ¨áâà¨à㥬®© ä㭪樨
; out: a = 0, ¥á«¨ Ok
; a = ­¥ 0 ¯à¨ ®è¨¡ª¥
;
; char atexit(*func)
;
;
; ਬ¥à:
; main()
; {
; atexit(func1); // "Exit Function 1 called"
; atexit(func2); // "Exit Function 2 called"
; printf("Main quitting ...\n");
; }
; ‚뢥¤¥âáï:
; Main quitting ...
; Exit Function 2 called
; Exit Function 1 called
;
atexit_::
ld a,(atxcount) ; ç¨á«® § à¥£¨áâà. ä㭪権
inc a ; ++atxcount
cp 8+1 ; ¬ ªá. ç¨á«® ä㭪権
ret nc
ld (atxcount),a
ex de,hl ; de =  ¤à¥á ¯¥à¥¤ ¢ ¥¬®© ä㭪樨
ld l,a
ld h,0
add hl,hl
ld bc,atxtable-2 ; ᯨ᮪  ¤à¥á®¢ ä㭪権
add hl,bc
ld (hl),e ;  ¤à¥á ä㭪樨 ¢ ᯨ᮪
inc hl
ld (hl),d
xor a ; Ok
ret
;
; "stdio.h"
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ¢ë᮪®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
; ”ã­ªæ¨ï á¡à á뢠¥â ¢á¥ ¡ãä¥àë ¢ ä ©«ë
; ¨ § ªà뢠¥â ¢á¥ ®âªàëâë¥ ä ©«ë.
;
; in: ­¥â
; out: ­¥â
;
; void fclosall()
;
fclosall_::
ld hl,_iob_##+14 ; ­ ç «® FILE-áâàãªâãà ä ©«®¢
ld b,8 ; max. count FILE-structurs
@fca: push hl
push bc
call fclose_##
pop bc
pop hl
ld de,14 ; size FILE-structure
add hl,de ; next
djnz @fca
ret
dseg
atxcount:
db 0 ; ç¨á«® § à¥£¨áâà. ä㭪権
; ᯨ᮪  ¤à¥á®¢ § à¥£¨áâà. ä㭪権
atxtable:
ds 16 ; 8*2
ENDMODULE
MODULE fflush
;
; "stdio.h"
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ¢ë᮪®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ®á¢®¡®¦¤ ¥â (§ ¯¨á뢠¥â) ¡ãä¥à ®âªàë⮣® ä ©« .
; ਬ¥­ï¥âáï ¤«ï á®åà ­¥­¨ï ¤ ­­ëå ­  ¤¨áª¥, ¯¥à¥¤ ¢ë¯®«­¥­¨¥¬
; ®¯¥à æ¨¨, ¬®£ã饩 á«®¬ âì á¨á⥬ã.
; …᫨ ä ©« ®âªàëâ ¤«ï § ¯¨á¨, ¡ãä¥à á¡à á뢠¥âáï ¢ ä ©«.
; …᫨ ä ©« ®âªàëâ ¤«ï ç⥭¨ï, ¡ãä¥à ®ç¨é ¥âáï.
; ®á«¥ ¢ë§®¢  ä㭪樨, ä ©« ®áâ ¥âáï ®âªàëâë¬.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 0, ¥á«¨ ¡ãä¥à ãᯥ譮 ®¡­®¢«¥­. â® ¦¥ §­ ç¥­¨¥
; ¢®§¢à é ¥âáï, ª®£¤  ¯®â®ª ­¥ ¨¬¥¥â ¡ãä¥à  ¨«¨ ª®£¤  ®­ ®âªàëâ ⮫쪮
; ¤«ï ç⥭¨ï. ‚ á«ãç ¥ ¢®§­¨ª­®¢¥­¨ï ®è¨¡ª¨, ¢®§¢à é ¥âáï §­ ç¥­¨¥ EOF.
;
; in: hl = FILE *fp
; out: a = 0 - Ok
; -1 - error
;
; char fflush(FILE *fp)
;
fflush_::
xor a
ld (@3+1),a
push hl ; fp
pop iy
bit 1,(iy+1) ; stdin ?
ret nz ; yes, a=0 !
bit 7,(iy+0) ; data is incoming ?
jr z,@1 ; no
; flushing input file:
; lseek file to curren position;
; invalidate buffer
ld hl,0
push iy
ld bc,1 ; SEEK_CUR
push bc;
ld e,(iy+2) ; level of buffer
ld d,(iy+3)
or a
sbc hl,de
ld c,l
ld b,h ; bc=low
sbc hl,hl
ex de,hl ; de=high
ld l,(iy+6) ; file descriptor
ld h,0
call lseek_##
pop bc;
ld (@3+1),a
jr @2
;
@1: bit 0,(iy+1) ; data is outgoing ?
jr z,@2a ; no
ld l,(iy+6) ; file descriptor
ld e,(iy+8) ; addr data transfer buffer
ld d,(iy+9)
ld c,(iy+2) ; level of buffer (bytes)
ld b,(iy+3)
push iy
push bc
call write_## ; write to file
pop bc
;or a
;sbc hl,bc ; ¢á¥ § ¯¨á «¨ ?
;jr nc,@2
or a;
jr z,@2;
ld a,-1 ; error
ld (@3+1),a
@2: pop iy
@2a: xor a
ld (iy+2),a ; set empty level of buffer
ld (iy+3),a
ld a,(iy+8) ; current active pointer
ld (iy+4),a ; to begin buffer
ld a,(iy+9)
ld (iy+5),a
res 0,(iy+1) ; data is outgoing
res 7,(iy+0) ; data is incoming
@3: ld a,0
or a
ret z ; Ok
set 4,(iy+0) ; error indicator
ret
ENDMODULE
MODULE fgetpos
;
; "stdio.h"
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ¢ë᮪®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
; ”ã­ªæ¨ï á®åà ­ï¥â ⥪ã饥 ¯®«®¦¥­¨¥ 㪠§ â¥«ï ä ©«  ¢ ®¡ê¥ªâ¥,
; ­  ª®â®àë© ãª §ë¢ ¥â position. ®§¤­¥¥, äã­ªæ¨ï fsetpos ¨á¯®«ì§ã¥â
; §­ ç¥­¨¥, åà ­¨¬®¥ ¢ position ¤«ï ¯¥à¥ãáâ ­®¢ª¨ 㪠§ â¥«ï ¢ ä ©«¥
; ¢ ­®¢®¥ ¯®«®¦¥­¨¥. ‡­ ç¥­¨¥ position åà ­¨âáï ¢o ¢­ãâ७­¥¬ äoଠâ¥
; ¨ o­o ¤o«¦­o ¨á¯o«ì§o¢ âìáï âo«ìªo á äã­ªæ¨ï¬¨ fgetpos ¨ fsetpos.
; ”ã­ªæ¨ï ¢o§¢à é ¥â 0.
; ਠ®è¨¡ª¥, ¢o§¢à é ¥âáï -1.
;
; char fgetpos(FILE *fp, fpos_t *position)
;
fgetpos_::
inc hl
ld a,(hl)
and 00111110b ;+1 std.. devices ?
dec hl
jr nz,@0 ; yes
push hl
push de
call fflush_## ; flushing file buffer
pop de
pop hl
or a
jr z,@1 ; Ok
@0: ld a,-1
ret
;
@1: ld bc,6
add hl,bc
ld l,(hl) ; file descriptor
ld h,b
push de
call ltell_##
pop de
ld a,l
and h
inc a
jr z,@0 ; error
ld bc,4
ldir
xor a
ret
ENDMODULE
MODULE fsetpos
;
; "stdio.h"
;---------------------------------------------------------------------
; ”㭪樨 ¢ë᮪®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
; ”ã­ªæ¨ï rewind ¯¥à¥¬¥é ¥â 㪠§ â¥«ì ¢ ä ©«¥ ª ­ ç «ã ä ©« .
; ‚ë§®¢ ä㭪樨 íª¢¨¢ «¥­â¥­ ¢ë§®¢ã á«¥¤ãî饩 ä㭪樨:
;
; fseek(FILE *fp, 0, 0, SEEK_SET);
;
; á ãç¥â®¬ ⮣®, çâ® ¢ FILE-áâàãªâãॠfp ®¯¨á â¥«ï ä ©«  äã­ªæ¨ï rewind
; ®ç¨é ¥â ä« £ ®è¨¡ª¨ ¨ ¨­¤¨ª â®à ª®­æ  ä ©« ,   fseek í⮣® ­¥ ¤¥« ¥â.
; ”ã­ªæ¨ï ­¥ ¢®§¢à é ¥â ­¨ª ª®£® §­ ç¥­¨ï.
;
; void rewind(FILE *fp)
;
rewind_::
ld de,@4
res 4,(hl) ; error indicator
;
; ”ã­ªæ¨ï fsetpos ãáâ ­ ¢«¨¢ ¥â ¯®«®¦¥­¨¥ 㪠§ â¥«ï ¢ ä ©«¥ à ¢­ë¬
; §­ ç¥­¨î, ­ å®¤ï饬ãáï ¢ position, ªoâoào¥ ¯o«ãç ¥âáï ¯à¨ ¢ë§o¢¥
; ä㭪樨 fgetpos ¤«ï ¤ ­­®£® ä ©« . ”ã­ªæ¨ï oç¨é ¥â ¨­¤¨ª âoà ªo­æ 
; ä ©« . ‡­ ç¥­¨¥ position åà ­¨âáï ¢o ¢­ãâ७­¥¬ äoଠ⥠¨ o­o ¤o«¦­o
; ¨á¯o«ì§o¢ âìáï âo«ìªo á äã­ªæ¨ï¬¨ fgetpos ¨ fsetpos.
; ”ã­ªæ¨ï ¢o§¢à é ¥â 0.
; ਠ®è¨¡ª¥, ¢o§¢à é ¥âáï -1.
;
; char fsetpos(FILE *fp, fpos_t *position)
;
fsetpos_::
inc hl
ld a,(hl)
and 00111110b ;+1 std.. devices ?
dec hl
jr nz,@2 ; yes
push de
push hl
call fflush_## ; flushing file buffer
pop hl
pop de
or a
jr z,@3 ; Ok
@2: ld a,-1
ret
;
@3: res 5,(hl) ; EOF indicator
ld bc,6
add hl,bc
ld l,(hl) ; file descriptor
ld h,b
ld c,b ; bc=SEEK_SET
push bc
push hl
ex de,hl ; hl= &pos
ld c,(hl)
inc hl
ld b,(hl) ; bc=low
inc hl
ld e,(hl)
inc hl
ld d,(hl) ; de=high
pop hl
call lseek_## ; move_fp
pop bc
ld a,l
and h
inc a
jr z,@2 ; error
xor a
ret
; for rewind_
@4: dw 0
dw 0
ENDMODULE
MODULE fseek
;
; "stdio.h"
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ¢ë᮪®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ãáâ ­ ¢«¨¢ ¥â 㪠§ â¥«ì ¢ ä ©«¥ ­  ­®¢®¥ ¬¥áâ® à á¯®«®¦¥­¨ï,
; ®¯à¥¤¥«ï¥¬®¥  à£ã¬¥­â ¬¨ high ¨ low, ᮮ⢥âá⢥­­® áâ àè ï ¨ ¬« ¤-
; è ï ç áâì 32-å ¡¨â­®£® §­ ç¥­¨ï ¯¥à¥¬¥é¥­¨ï.
; ’¨¯ ¯¥à¥¬¥é¥­¨ï ®¯à¥¤¥«ï¥âáï  à£ã¬¥­â®¬ type. ‘«¥¤ãîé ï ®¯¥à æ¨ï ¢
; ä ©«¥ ¢ë¯®«­ï¥âáï ­  ­®¢®¬ ¬¥á⥠à á¯®«®¦¥­¨ï 㪠§ â¥«ï.
; €à£ã¬¥­â type ¬®¦¥â ¡ëâì ®¤­®© ¨§ á«¥¤ãîé¨å ª®­áâ ­â, ®¯à¥¤¥«¥­­ëå
; ¢ "stdio.h":
;
; SEEK_SET ®â ­ ç «  ä ©« 
; SEEK_CUR ®â ⥪ã饩 ¯®§¨æ¨¨ 㪠§ â¥«ï ¢ ä ©«¥
; SEEK_END ®â ª®­æ  ä ©« 
;
; ”ã­ªæ¨ï ¢®§¢à é ¥â áâàãªâãàã f_point, ®¯à¥¤¥«¥­­ãî ¢ "types.h"
; ਠ®è¨¡ª¥ ¢®§¢à é ¥âáï -1 ¨ errno ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
; “áâ ­®¢ª  㪠§ â¥«ï §  ¯à¥¤¥« ¬¨ ä ©« , ®è¨¡ª¨ ­¥ ¢ë§ë¢ ¥â.
; „«ï ãáâனáâ¢, ­¥ ¯à¨á¯®á®¡«¥­­ëå ª ¯®¨áªã (â ª¨å ª ª â¥à¬¨­ «ë
; ¨ ¯à¨­â¥àë), ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1.
;
; struct fpoint *fseek(FILE *fp, high, low, type)
;
fseek_::
inc hl
ld a,(hl)
and 00111110b ;+1 std.. devices ?
dec hl
jr nz,@1 ; yes
push de
push hl
push bc
call fflush_## ; flushing file buffer
pop bc
pop hl
pop de
or a
jr z,@2 ; Ok
@1: ld hl,-1
ret
;
@2: push bc
ld bc,6
add hl,bc
ld l,(hl) ; file descriptor
ld h,b
pop bc
jp lseek_##
ENDMODULE
MODULE ftell
;
; "stdio.h"
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ¢ë᮪®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ftell ¯®«ãç ¥â ⥪ãéãî ¯®§¨æ¨î 㪠§ â¥«ï ¢ ä ©«¥.
; ®§¨æ¨ï ¢ëà ¦ ¥âáï ª ª ç¨á«® ¡ ©â®¢ ®â ­ ç «  ä ©« .
; ”ã­ªæ¨ï ¢®§¢à é ¥â áâàãªâãàã f_point, ®¯à¥¤¥«¥­­ãî ¢ "types.h"
; ਠ®è¨¡ª¥ ¢®§¢à é ¥âáï -1 ¨ errno ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
; „«ï ãáâனáâ¢, ­¥ ¯à¨á¯®á®¡«¥­­ëå ª ¯®¨áªã (â ª¨å ª ª â¥à¬¨­ «ë
; ¨ ¯à¨­â¥àë), ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1.
;
; struct fpoint *ftell(FILE *fp)
;
ftell_::
inc hl
ld a,(hl)
and 00111110b ;+1 std.. devices ?
dec hl
jr nz,@1 ; yes
push hl
call fflush_## ; flushing file buffer
pop hl
or a
jr z,@2 ; Ok
@1: ld hl,-1
ret
;
@2: ld bc,6
add hl,bc
ld l,(hl) ; file descriptor
ld h,b
jp ltell_##
ENDMODULE
MODULE clearerr
;
; "stdio.h"
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ¢ë᮪®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
; ”ã­ªæ¨ï á¡à á뢠¥â ¢ FILE-áâàãªâãॠ䠩«  4-© ¡¨â "¨­¤¨ª â®à  ®è¨¡ª¨"
; ¨ 5-© ¡¨â "¨­¤¨ª â®à  ª®­æ  ä ©« ".
; ˆ­¤¨ª â®àë ®è¨¡®ª  ¢â®¬ â¨ç¥áª¨ ­¥ ®ç¨é îâáï: ¥á«¨ ¤«ï ä ©«  ãáâ -
; ­®¢«¥­ ¨­¤¨ª â®à ®è¨¡ª¨, â® ®¯¥à æ¨¨ ­ ¤ ä ©«®¬ ¡ã¤ãâ ¢®§¢à é âì
; §­ ç¥­¨ï ®è¨¡®ª ¤® â¥å ¯®à, ¯®ª  ­¥ ¡ã¤ã⠢맢 ­ë ä㭪樨 clearerr
; ¨«¨ rewind.
;
; in: hl =  ¤à¥á áâàãªâãàë ®¯¨á â¥«ï
; out: ­¥â
;
; void clearerr(FILE *fp)
;
clearerr_::
ld a,(hl)
and 11001111b ; 0CFh (clear 5,4 bits)
ld (hl),a
ret
ENDMODULE
MODULE fheap
;-----------------------------------------------------------
; ¢ë§ë¢ ¥âáï ¨§ fopen_
;-----------------------------------------------------------
; ˆé¥â ᢮¡®¤­ãî FILE-áâàãªâãàã.
; ஢¥àï¥â ­  ­ã«¥¢®¥ §­ ç¥­¨¥ ¯®«¥ flags (áâ âãá)
; ã 8-¬¨ FILE-áâàãªâãà.
; ‚®§¢à é ¥â 㪠§ â¥«ì ­  ¯¥à¢ãî ­ ©¤¥­­ãî áâàãªâãàã.
; ‚®§¢à é ¥â NULL, ¥á«¨ ­¥â ᢮¡®¤­ëå áâàãªâãà.
;
; in: ­¥â
; out: hl =  ¤à¥á ­ ©¤¥­­®© áâàãªâãàë
; hl = NULL, ¥á«¨ áâàãªâãàã ­¥ ­ è«¨
;
_fpheap_::
ld hl,_iob_+14 ; ­ ç «® FILE-áâàãªâãà ä ©«®¢
ld de,14 ; à §¬¥à áâàãªâãàë
ld b,8 ; ¬ ªá. ç¨á«® áâàãªâãà
@1: ld a,(hl) ;+0
inc hl
or (hl) ;+1
dec hl
ret z ; found
add hl,de
djnz @1
; no structs available
ld hl,0 ; NULL
ret
dseg
; 182 bytes
; FILE structs std.. devices
ds 14 ; stdprn (descriptor -5)
ds 14 ; stdaux (descriptor -4)
ds 14 ; stderr (descriptor -3)
ds 14 ; stdout (descriptor -2)
_iob_:: ds 14 ; stdin (descriptor -1)
; FILE structs of files
ds 14*8
ENDMODULE
MODULE fdopen
;
; "stdio.h"
; ”ã­ªæ¨ï à §à¥è ¥â ä ©«ã, oâªàëâo¬ã ¤«ï ­¨§ªo-ãào¢­¥¢o£o ¢¢o¤ /¢ë¢o¤ ,
; ¡ëâì ¡ãä¥à¨ào¢ ­­ë¬ ¨ äoଠâ¨ào¢ ­­ë¬, â.¥. ¯à¥®¡à §ã¥â ¥£® ¤«ï ¢ë᮪®-
; ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ . ®á«¥ í⮣®, ¤«ï ¢á¥å ¯oá«¥¤ãîé¨å o¯¥à æ¨© á
; ä ©«®¬, ­¥®¡å®¤¨¬® ¨á¯®«ì§®¢ âì ä㭪樨 ¢ë᮪®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ .
; ‚ á«¥¤á⢨¨ í⮣®, § ªà뢠âì ä ©« ­¥®¡å®¤¨¬® ä㭪樥© fclose,   ­¥ close.
; ‘¨¬¢®«ì­ ï áâப  mode ®¯à¥¤¥«ï¥â ⨯ ¤®áâ㯠 ª ä ©«ã:
;
; r,w,a - ०¨¬ ⥪áâ. ä ©« 
; rb,wb,ab - ०¨¬. ¡¨­ à­®£® ä ©« 
; r+, w+, a+ - r/w, "­  ®¡­®¢«¥­¨¥" ⥪áâ. ä ©« 
; r+b, w+b, a+b - r/w, "­  ®¡­®¢«¥­¨¥" ¡¨­ à­®£® ä ©« 
;
; ‚ ¤o¡ ¢«¥­¨¥ ª ¢ë襯ਢ¥¤¥­­ë¬ §­ ç¥­¨ï¬, ¬®¦¥â ¡ëâì ¤®¡ ¢«¥­ ᨬ¢o« "b"
; ¨«¨ "t", ¤«ï § ¤ ­¨ï ०¨¬  âà ­á«ï樨 ­o¢ëå áâàoª. ޝæ¨ï "t" ­¥ ®â­®á¨âáï
; ª ANSI-áâ ­¤ àâã ¤«ï fopen. âo à áè¨à¥­¨¥ Microsoft ¨ o­o ­¥ ¤o«¦­o ¨á¯o«ì-
; §o¢ âìáï, ¥á«¨ âॡã¥âáï ANSI-áo¢¬¥á⨬oáâì.
; …᫨ "b" ¨«¨ "t" ­¥ § ¤ ­ë ¢ áâàoª¥ "mode", ०¨¬ âà ­á«ï樨 o¯à¥¤¥«ï¥âáï
; ª ª "t".
;
; ”ã­ªæ¨ï ¢o§¢à é ¥â 㪠§ â¥«ì ­  oâªàëâãî FILE-áâàãªâãàã.
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï NULL.
;
; in: hl = ­®¬¥à ¤¥áªà¨¯â®à 
; de =  ¤à¥á áâப¨ type
; out: hl =  ¤à¥á FILE-áâàãªâãàë ®âªàë⮣® ä ©« 
; hl = NULL, ¯à¨ ®è¨¡ª¥
;
; FILE *fdopen(FD fd, char *mode)
;
fdopen_::
ld a,l
or h
cp 8+1 ; max number of descriptors
jp nc,@err
push hl
push de
call _fpheap_## ; get any FILE structs available
pop bc ; mode
pop de ; file descriptor
ld a,h
or l
ret z ; hl=NULL, structs not available
push hl
pop iy ;  ¤à¥á FILE-áâàãªâãàë
ex de,hl ; de= ¤à¥á áâàãªâãàë
ld a,(bc)
and 5Fh
inc bc
cp "R" ; read
jr z,@10
cp "W" ; write
jr z,@20
cp "A" ; append
jp nz,@err
;
ld (iy+6),l ; file descriptor
ld (iy+7),h ;
set 1,(iy+0) ; "write only"
push bc
push iy
ld bc,2 ; SEEK_END
push bc
;ld l,(iy+6) ; ¤¥áªà. ä ©« 
ld h,b
ld c,b
ld e,b
ld d,b
call lseek_## ; move_fp
pop bc
pop iy
pop bc
jp @4
;-----------------------------------------------------------
; ¢ë§ë¢ ¥âáï ¨§ freopen_, fopen_
;-----------------------------------------------------------
;  §¡®à ¨ ãáâ ­®¢ª  ०¨¬®¢ ®âªàëâ¨ï ä ©« .
; ®-㬮«ç ­¨î ¡¨â "binary file" á¡à®è¥­.
;
; in: hl =  ¤à¥á FILE *fp ä ©« 
; de =  ¤à¥á path-¨¬¥­¨ ä ©« 
; bc =  ¤à¥á mode-áâப¨:
; r,w,a - ०¨¬ ⥪áâ. ä ©« 
; rb,wb,ab - ०¨¬. ¡¨­ à­®£® ä ©« 
; r+, w+, a+ - r/w, "­  ®¡­®¢«¥­¨¥" ⥪áâ. ä ©« 
; r+b, w+b, a+b - r/w, "­  ®¡­®¢«¥­¨¥" ¡¨­ à­®£® ä ©« 
;
; ª¢¨¢ «¥­âë:
;
; "r" O_RDONLY
;
; "w" O_WRONLY (®¡ëç­® O_WRONLY | O_CREAT | O_TRUNC)
;
; "a" O_WRONLY | O_APPEND (®¡ëç­® O_WRONLY | O_CREAT | O_APPEND)
;
; "r+" O_RDWR
;
; "w+" O_RDWR (®¡ëç­® O_RDWR | O_CREAT | O_TRUNC)
;
; "a+" O_RDWR | O_APPEND (®¡ëç­® O_RDWR | O_CREAT | O_APPEND)
;
; ‚ ¤o¡ ¢«¥­¨¥ ª ¢ë襯ਢ¥¤¥­­ë¬ §­ ç¥­¨ï¬, ¬®¦¥â ¡ëâì ¤®¡ ¢«¥­ ᨬ¢o« "b"
; ¨«¨ "t", ¤«ï § ¤ ­¨ï ०¨¬  âà ­á«ï樨 ­o¢ëå áâàoª. ޝæ¨ï "t" ­¥ ®â­®á¨âáï
; ª ANSI-áâ ­¤ àâã ¤«ï fopen. âo à áè¨à¥­¨¥ Microsoft ¨ o­o ­¥ ¤o«¦­o ¨á¯o«ì-
; §o¢ âìáï, ¥á«¨ âॡã¥âáï ANSI-áo¢¬¥á⨬oáâì.
; …᫨ "b" ¨«¨ "t" ­¥ § ¤ ­ë ¢ áâàoª¥ "mode", â® ¯®-㬮«ç ­¨î ¨á¯®«ì§ã¥âáï
; ०¨¬ âà ­á«ï樨 ­o¢ëå áâàoª, â.¥. ¢ª«î祭  ®¯æ¨ï "t".
;
; out: hl =  ¤à¥á FILE *fp ä ©« , ¥á«¨ Ok
; hl = NULL, ¯à¨ ®è¨¡ª¥
;
_fopen_::
inc hl
ld a,(hl)
and 00111110b ;+1 std.. devices ?
jr nz,@err ; yes
dec hl
push hl
pop iy ; FILE *fp
xor a
ld (iy+2),a ; set "empty level of buffer"
ld (iy+3),a
ld (iy+8),a ; res "data transfer buffer"
ld (iy+9),a
;ld (iy+7),-1 ; áâ. ¡ ©â file descriptor
ld a,(bc) ;+0 mode-áâப 
and 5Fh
inc bc
cp "R" ; read
jr z,@read
cp "W" ; write
jr z,@write
cp "A" ; append
jr z,@append
; ®è¨¡ª 
@err: ld hl,0 ; NULL
ret
;
; "R" ®âªàëâì "­  ç⥭¨¥"
@read: push bc
push iy
ex de,hl ; hl=path-¨¬ï ä ©« 
ld de,3 ; O_RDWR
call open_##
pop iy
pop bc
bit 7,h ; return -1 ? (file not found ?)
jr nz,@err ; yes
@10: ld (iy+6),l ; ­®¬¥à ¤¥áªà¨¯â®à  ¤«ï low-level i/o
ld (iy+7),h
set 0,(iy+0) ; "read only"
jr @4
;
; "W" ®âªàëâì "­  § ¯¨áì"
@write: push bc
push iy
@21: ex de,hl ; hl=path-¨¬ï ä ©« 
ld de,4 ; O_TRUNC
call open_##
pop iy
pop bc
@20: ld (iy+6),l
ld (iy+7),h
set 1,(iy+0) ; "write only"
jr @4
;
; "A" ®âªàëâì "­  ¤®¡ ¢«¥­¨¥"
@append:push bc
push iy
ex de,hl ; hl=path-¨¬ï ä ©« 
ld de,23h ; O_RDWR | O_APPEND
push hl
call open_##
pop de
bit 7,h ; return -1 ? (file not found ?)
jr nz,@21 ; yes
pop iy
pop bc
ld (iy+6),l ; ­®¬¥à ¤¥áªà¨¯â®à  ¤«ï low-level i/o
ld (iy+7),h
set 1,(iy+0) ; "write only"
;
@4: ld a,(bc) ;+1 mode-áâப 
cp "+"
jr nz,@5
set 0,(iy+0) ; "read only"
set 1,(iy+0) ; "write only"
inc bc
@5: res 6,(iy+0) ; clear "binary file"
ld a,(bc) ;+2 mode-áâப 
cp "b"
jr nz,@6
set 6,(iy+0) ; binary file
@6: push iy;
pop hl;
ret;
;
;bit 7,(iy+7) ; ?
;jr z,@7 ; ¡¥§ ®è¨¡®ª
;ld hl,0
;ld (iy+0),l ; clear status FILE *fp
;ld (iy+1),h
;ret
;
;@7: push iy
;ld l,(iy+6) ; file descriptor
;ld h,0
;call isatty_## ; std.. devices ?
;pop hl
;or a
;ret z ; no
;inc hl
;set 1,(hl) ;+1 set "std.. device" in FILE *fp
;dec hl
;ret
ENDMODULE
MODULE freopen
;
; "stdio.h"
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ¢ë᮪®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
; ”ã­ªæ¨ï § ªà뢠¥â ⥪ã騩 ä ©«, á¢ï§ ­­ë© á ¤¥áªà¨¯â®à®¬ (FILE-áâàãªâãன)
; fp ¨ ¯¥à¥­ §­ ç ¥â íâ®â ¤¥áªà¨¯â®à ­  ­®¢ë© ä ©«, ®¯à¥¤¥«ï¥¬ë© path-¨¬¥­¥¬.
; Žè¨¡ª¨ ¯à¨ § ªàë⨨ ä ©«  ¨£­®à¨àãîâáï. â  äã­ªæ¨ï ®¡ëç­® ¯à¨¬¥­ï¥âáï ¤«ï
; ¯¥à¥ ¤à¥á æ¨¨ ¯à¥¤®âªàëâëå ¯®â®ª®¢ stdin, stdout, stderr, stdaux ¨ stdprn
; ¢ ä ©«ë, ®¯à¥¤¥«ï¥¬ë¥ ¯®«ì§®¢ â¥«¥¬. ® ¯®áª®«ìªã „Ž‘ Estex ­¥ ¯®¤¤¥à¦¨¢ ¥â
; í⨠¯®â®ª¨, â® ¯à¨ ¯®¯ë⪥ ¯¥à¥ ¤à¥á æ¨¨ stdin, stdout, stderr, stdaux ¨
; stdprn, ¡ã¤¥â ¢®§¢à é¥­ NULL. ®¢ë© ä ©« ®âªà뢠¥âáï ¢ ०¨¬¥ mode.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  fp ¢­®¢ì ®âªàë⮣® ä ©« .
; ਠ®è¨¡ª¥, äã­ªæ¨ï ¢®§¢à é ¥â §­ ç¥­¨¥ NULL.
;
; in: hl =  ¤à¥á pathname
; de =  ¤à¥á áâப¨ mode
; bc =  ¤à¥á FILE *fp
; out: hl =  ¤à¥á ¤¥áªà¨¯â®à  ¢­®¢ì ®âªàë⮣® ä ©« 
; hl = NULL, ¯à¨ ®è¨¡ª¥
;
; FILE *freopen(pathname, mode, FILE *fp)
;
freopen_::
ld (@1+1),hl ; pathname (¨¬ï ­®¢®£® ä ©« )
ld l,c ; hl=FILE *fp
ld h,b
inc bc
ld a,(bc)
and 00111110b ;+1 std.. devices ?
jr nz,@2 ; yes
push hl
push de ;  ¤à¥á áâப¨ mode
call fclose_##
pop bc ; mode
pop hl ; FILE *fp
@1: ld de,0 ; pathname
jp _fopen_## ; ®âªàëâì ­®¢ë© ä ©«
;
@2: ld hl,0 ; NULL
ret
ENDMODULE
MODULE fopen
;
; "stdio.h"
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ¢ë᮪®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ®âªà뢠¥â ä ©« á ¨¬¥­¥¬ pathname.
; ‘¨¬¢®«ë ¢ áâப¥ mode ®¯à¥¤¥«ïîâ ⨯ ¤®áâ㯠 ª ä ©«ã.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ®âªàëâë© ä ©«.
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï NULL.
;
; in: hl =  ¤à¥á pathname
; de =  ¤à¥á áâப¨ mode
; out: hl =  ¤à¥á FILE *fp
; hl = NULL, ¯à¨ ®è¨¡ª¥
;
;
; FILE *fopen(pathname, mode)
;
fopen_::
push hl ;  ¤à¥á pathname
push de ;  ¤à¥á áâப¨ mode
call _fpheap_## ; ­ ©â¨ ᢮¡®¤­ãî FILE-áâàãªâãàã
pop bc ;  ¤à¥á áâப¨ mode
pop de ;  ¤à¥á pathname
ld a,l
or h
ret z ; hl=NULL
jp _fopen_##
ENDMODULE
MODULE fclose
;
; "stdio.h"
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ¢ë᮪®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
; ”ã­ªæ¨ï á¡à á뢠¥â ¡ãä¥à ¢ ä ©« ¨ § ªà뢠¥â ¥£®.
; „ ­­®© ä㭪樥© ¬®¦­® § ªà뢠âì ⮫쪮 ⥠䠩«ë, à ¡®â  á ª®â®à묨
; ¯à®¨§¢®¤¨âáï ¢ à ¬ª å ¢ë᮪®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ .
; „«ï § ªàëâ¨ï ä ©«®¢ ¢ à ¬ª å ­¨§ª®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ , ­¥®¡å®-
; ¤¨¬® ¯à¨¬¥­ïâì äã­ªæ¨î close.
;
; in: hl =  ¤à¥á FILE-áâàãªâãàë
; out: a = 0, ¥á«¨ Ok
; a = EOF, ¯à¨ ®è¨¡ª¥
;
; char fclose(FILE *fp)
;
fclose_::
ld a,(hl) ; test status current FILE *fp
inc hl
or (hl)
ld c,(hl)
dec hl
ret z ; free structure (­¥ ­ §­ ç¥­  ä ©«ã)
ld a,c
and 00111110b ; std.. devices ?
jr nz,@24 ; yes
push hl
call fflush_## ; á¡à®á¨âì ¡ãä¥à ¢ ä ©«
ld (@23+1),a ; 0 ¨«¨ -1
pop iy ; fp
push iy
;bit 1,(iy+1) ; stdin ?
;jr nz,@22 ; yes
ld l,(iy+6) ; file descriptor
call close_## ; close file
ld a,l
ld hl,@23+1
or (hl)
ld (hl),a
@22: pop iy
bit 2,(iy+0) ; malloc'ed Buffer data ?
ld (iy+0),0
ld (iy+1),0
jr z,@23 ; no
ld l,(iy+8) ; addr data transfer buffer
ld h,(iy+9)
call free_## ; free memory of buffer
@23: ld a,0 ; return value
ret
@24: ld a,-1
ret
ENDMODULE
MODULE gets
;
; "stdio.h"
; ”ã­ªæ¨ï ç¨â ¥â ¨§ áâ ­¤ àâ­®£® ¯®â®ª  stdin áâப㠨 § ¯®¬¨­ ¥â
; ¥¥ ¢ ᢮¥¬ ¡ãä¥à¥ buffer. ‚室­ ï áâப  ç¨â ¥âáï ¤® â¥å ¯®à, ¯®ª 
; ­¥ ¢áâà¥à¨âáï ª®¤ ­®¢®© áâப¨ "0x0D" ¨«¨ ç¨á«® ¢¢¥¤¥­­ëå ᨬ¢®«®¬
; ­¥ ¯à¥¢ëá¨â 254. ‚ ª®­¥æ áâப¨ ¢¬¥áâ® ª®¤  0x0D § ­®á¨âáï ­ã«ì,
; ¢ ®â«¨ç¨¨ ®â ä㭪樨 fgets, ª®â®à ï á®åà ­ï¥â ᨬ¢®« 0x0D.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ¡ãä¥à.
; ‚ á«ãç ¥ ®è¨¡ª¨, ¢®§¢à é ¥¬®¥ §­ ç¥­¨¥ ­¥ ®¯à¥¤¥«¥­®.
; ”®à¬ â áâப¨ ¢ ¡ãä¥à¥ á«¥¤ãî騩:
;
; +0: - ¡ ©â, ᮤ¥à¦ é¨© ¤«¨­ã ¯à®ç¨â ­­®© áâப¨, ¡¥§ ª®­æ¥¢®£® ­ã«ï.
; +1: - ­ ç «® áâப¨.
;
; in: hl =  ¤à¥á ¡ãä¥à 
; out: hl=  ¤à¥á ¡ãä¥à 
;
; char *gets(char buffer[255])
;
gets_:: ;push ix
ld b,254 ; max len string
__gets_::
ld c,0 ; counter
push hl
inc hl
@1: push bc
push hl
@2: ld c,8Eh ; get curs
rst 08h
push de
ld c,32h ; echokey
rst 10h
pop de
cp 8
jr z,@4
cp 0Dh
jr z,@5
cp " "
jr nc,@3
ld c,84h ; set curs
rst 08h
jr @2
;
@3: pop hl
pop bc
ld (hl),a ; save symbol
inc hl
inc c ; ++counter
djnz @1
jr @6
;
@4: pop hl
pop bc
dec c
inc c
jr z,@1
dec c
dec hl
inc b
jr @1
;
@5: pop hl
pop bc
@6: ld (hl),0
push bc
ld a,0Ah
call putch_## ; ¢ë¢®¤ ᨬ¢®«  ¯àאַ ­  íªà ­
pop bc
pop hl ; buffer
ld (hl),c ; len string
;pop ix
ret
ENDMODULE
MODULE fgetc1
;-----------------------------------------------------------
; ¢ë§ë¢ ¥âáï ¨§ fgetc_, fread_
;-----------------------------------------------------------
; ”ã­ªæ¨ï ¢ë᮪®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ .
; —¨â ¥â ᨬ¢®« ¨§ ä ©«  fp ¨«¨ stdin.
;
; in: hl =  ¤à¥á FILE *fp
; out: a = áç¨â ­­ë© ᨬ¢®«, ¥á«¨ Ok
; a = EOF (0FFh) ¯à¨ ®è¨¡ª¥
;
; char _fgetc(FILE *fp)
;
_fgetc_::
ld a,(hl)
and 00110000b ; 4,5 bits (Error/EOF)
ld c,a
inc hl
ld a,(hl)
dec hl
;and 1
and 00111100b ; mask stdout...stdprn
or c
jr z,@45 ; stdin, no errors, not EOF
@46: ld a,-1 ; Error/EOF or not stdin
ret
;
@45: bit 0,(hl) ;+0 read only ? & ?
jr z,@46 ; no & ?
inc hl
bit 1,(hl) ;+1 stdin ?
jr z,@47 ; no
call getche_## ; echokey
cp 0Dh
ret nz
ld a,0Ah ; '\n'
ret
; file
@47: dec hl
push hl ; fp
pop iy
ld a,(iy+2) ; empty level of buffer ?
or (iy+3)
jr nz,@48 ; no
ld a,(iy+8) ; data transfer buffer
or (iy+9)
jr nz,@49 ; != NULL
; first time
ld hl,512 ; size buffer
call malloc_## ; alloc memory
ld (iy+8),l ;  ¤à¥á ­ ç «  ¢ë¤¥«. ¡«®ª 
ld (iy+9),h
ld a,l
or h
jr nz,@50
; hl=NULL
set 4,(iy+0) ; Error indicator
jr @46
;
@50: set 2,(iy+0) ; malloc'ed Buffer data
@49: ld e,(iy+8)
ld d,(iy+9)
ld (iy+4),e ; de=current active pointer
ld (iy+5),d
ld l,(iy+6) ; file descriptor
push iy
ld bc,512 ; size buffer
call read_## ; read file
pop iy
ld (iy+2),l ; fill level of buffer
ld (iy+3),h
ld a,h
or l
jr nz,@48 ; Ok
; hl=NULL
xor a
set 5,(iy+0) ; EOF indicator
ld (iy+2),a ; empty level of buffer
ld (iy+3),a
dec a ; a=EOF
ret
;
@48: set 7,(iy+0) ; data is incoming
ld e,(iy+2) ; level of buffer
ld d,(iy+3)
dec de
ld (iy+3),d
ld (iy+2),e
ld e,(iy+4) ; current active pointer
ld d,(iy+5)
ld a,(de) ; get byte from buffer
inc de
ld (iy+5),d
ld (iy+4),e
ret
ENDMODULE
MODULE ungetc
;
; "stdio.h"
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ¢ë᮪®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ¢®§¢à é ¥â ᨬ¢®« ch ¢ ä ©«.
; ®á«¥¤ãîé ï ®¯¥à æ¨ï ç⥭¨ï ¨§ ä ©«  ­ ç¨­ ¥âáï
; á ᨬ¢®«  ch.
; ਠ㤠筮¬ § ¢¥à襭¨¨, äã­ªæ¨ï ¢®§¢à é ¥â ch.
; ਠ®è¨¡ª¥ ¢®§¢à é ¥âáï EOF, £®¢®àï饥 ® ­¥ã¤ ç­®¬
; ¢®§¢à é¥­¨¨ § ¤ ­­®£® ᨬ¢®« .
;
; in: a = ¢®§¢à. ᨬ¢®«
; l = .. ?
; de =  ¤à¥á áâàãªâãàë ¤¥áªà¨¯â®à 
; out: a = ¢®§¢à. ᨬ¢®«, ¥á«¨ Ok
; a = EOF (0FFh) ¯à¨ ®è¨¡ª¥
;
; char ungetc(char ch, FILE *fp)
;
ungetc_::
;ld a,-1 ; EOF
;cp l
;jr z,@51 ; error
cp -1;
ret z;
push de ;  ¤à¥á fp
pop iy
ld (?132+1),a ; ¢®§¢à. ᨬ¢®«
ld e,(iy+2) ; ç¨á«® ¡ ©â ¢ ¡ãä¥à¥
ld d,(iy+3)
inc de
ld (iy+3),d
ld (iy+2),e
ld hl,1
call ?cpshd## ; §­ ª®¢®¥? áà ¢­¥­¨¥ hl á de
jr nc,@52 ; ¢ ¡ãä¥à¥ 1 ᨬ¢®« ¨«¨ ®­ ¯ãáâ ?
?132: ld a,0 ; return value
ld e,(iy+4) ; ⥪ã騩  ¤à¥á ¢ ¡ãä¥à¥
ld d,(iy+5)
dec de
ld (iy+5),d
ld (iy+4),e
ld (de),a ; ¢¥à­ãâì ᨬ¢®« ¢ ¡ãä¥à
ret
;
@52: ld a,(iy+2) ; ç¨á«® ¡ ©â ¢
dec a
or (iy+3) ; ¡ãä¥à¥
jr nz,@53
push iy
pop bc
ld hl,10 ;+10 ᬥé. ­  ï祩ªã hold ¢ FILE-áâàãªâãà¥
add hl,bc
ld (iy+4),l ; ⥪.  ¤à¥á ¢ ¡ãä¥à¥
ld (iy+5),h
ld a,(?132+1) ; return value
ld (hl),a ; ¢¥à­ãâì ᨬ¢®« ¢ ¡ãä¥à (ï祩ªã hold)
ret
;
@53: ld a,(iy+2) ; ç¨á«® ¡ ©â ¢
sub 1
ld (iy+2),a
jr nc,@51
dec (iy+3) ; ¡ãä¥à¥
; ®è¨¡ª 
@51: ld a,-1 ; EOF
ret
ENDMODULE
MODULE fputc1
;-----------------------------------------------------------
; ¢ë§ë¢ ¥âáï ¨§ fputc_ ¨ fwrite_
;-----------------------------------------------------------
; ‚뢮¤¨â ᨬ¢®« ch ¢ ¯®â®ª, § ªà¥¯«¥­­ë© §  fp.
;
; in: a = ¢ë¢®¤¨¬ë© ᨬ¢®«
; de =  ¤à¥á FILE *fp
; out: a = ¢ë¢®¤¨¬ë© ᨬ¢®«, ¥á«¨ Ok
; a = EOF (0FFh) ¯à¨ ®è¨¡ª¥
;
; char fputc(char ch, FILE *fp)
;
_fputc_::
ex de,hl
ld (@59+1),a ; ¢ë¢®¤¨¬ë© ᨬ¢®«
bit 1,(hl) ;+0 write only ?
jr nz,@54 ; yes
@55: ld a,-1 ; EOF
ret
;
@54: bit 7,(hl) ;+0 data is incoming ?
jr nz,@55 ; yes
res 5,(hl) ;+0 clear EOF indicator
inc hl;
bit 2,(hl) ; stdout ?
jr nz,@60 ; yes
bit 3,(hl) ; stderr ?
jr z,@56 ; no
; stdout, stderr
@60: ;push ix
push af
ld c,5Bh ; putchar
rst 10h
pop af ; return symbol
;pop ix
ret
;
@56: bit 4,(hl) ; stdaux ?
jr nz,@55 ; yes
bit 5,(hl) ; stdprn ?
jr z,@61 ; no
;push ix
ld c,5Fh ; print
rst 10h
;pop ix
jr c,@55 ; not ready
ld a,b ; return symbol
ret
;
@61: dec hl
push hl ; fp
pop iy
ld a,(iy+2) ; level of buffer
or (iy+3)
jr nz,@57
ld a,(iy+8) ; addr data transfer buffer
or (iy+9)
jr nz,@57 ; not NULL
ld hl,512 ; size buffer
call malloc_## ; alloc memory
ld (iy+8),l ; new addr data transfer buffer
ld (iy+9),h
ld a,l
or h
jr nz,@58
; hl=NULL
set 4,(iy+0) ; error indicator
jr @55 ; eof
;
@58: set 2,(iy+0) ; malloc'ed Buffer data
ld (iy+4),l ; current active pointer
ld (iy+5),h
@57: ld e,(iy+4)
ld d,(iy+5)
ld a,(@59+1) ; symbol
ld (de),a ; put symbol to buffer
inc de ; ++pointer
ld (iy+5),d
ld (iy+4),e
set 0,(iy+1) ; "data is outgoing"
ld l,(iy+2) ; level of buffer
ld h,(iy+3)
inc hl ; ++level
ld (iy+2),l
ld (iy+3),h
bit 1,h ; full buffer ?
jr z,@59 ; no
push iy
pop hl
call fflush_## ; flushing file buffer
or a
jp nz,@55 ; eof
@59: ld a,0 ; return symbol
ret
ENDMODULE
MODULE fputc
;
; "stdio.h"
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ¢ë᮪®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
; ‡ ¯¨á뢠¥â ᨬ¢®« ch ¢ ä ©« fp.
; ”ã­ªæ¨ï ¢®§¢à é ¥â § ¯¨á ­­ë© ᨬ¢®«.
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ EOF.
;
; in: a = ¢ë¢®¤¨¬ë© ᨬ¢®«
; de =  ¤à¥á FILE *fp
; out: a = ¢ë¢®¤¨¬ë© ᨬ¢®«, ¥á«¨ Ok
; a = EOF (0FFh) ¯à¨ ®è¨¡ª¥
;
; char putc(char ch, FILE *fp)
; char fputc(char ch, FILE *fp)
;
putc_::
fputc_::
ld h,d ;  ¤à¥á FILE-áâàãªâãàë
ld l,e
bit 6,(hl) ; binary file indicator
jp nz,_fputc_##
; ¤«ï ä ©« , ®âªàë⮣® ¢ ⥪áâ. ०¨¬¥
cp 0Ah
jp nz,_fputc_##
push de ; fp
ld a,0Dh
call _fputc_##
pop de
cp -1 ; EOF
ret z
ld a,0Ah
jp _fputc_##
ENDMODULE
MODULE fputs
;
; "stdio.h"
; ”ã­ªæ¨ï ª®¯¨àã¥â áâப㠢 ª®­¥æ ä ©«  fp.
; ã«¥¢®© ᨬ¢®« ®ª®­ç ­¨ï áâப¨ '\0' ­¥ ª®¯¨àã¥âáï.
; ”ã­ªæ¨ï ¢®§¢à é ¥â ¯®á«¥¤­¨© § ¯¨á ­­ë© ᨬ¢®«.
; ;…᫨ ¢¢®¤¨¬ ï áâப  string ¯ãáâ ï, ¢®§¢à é ¥âáï §­ ç¥­¨¥ 0.
; ਠ®è¨¡ª¥ ¢®§¢à é ¥âáï §­ ç¥­¨¥ EOF.
;
; char fputs(char *string, FILE *fp)
;
fputs_::
push hl
push de
ex de,hl ; hl=FILE *fp
ld bc,2 ; SEEK_END
push bc
ld c,b ; bc=low
ld e,b ; de=high
ld d,b
call fseek_##
pop bc
pop de
pop hl
ld a,l
and h
cp -1
ret z
@1: ld a,(hl)
or a
jr z,@2
ld (@2+1),a
push hl
call fputc_##
pop hl
cp -1
ret z ; error
inc hl
jp @1
;
@2: ld a,0 ; return symbol
ret
ENDMODULE
MODULE fgetc
;
; "stdio.h"
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ¢ë᮪®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤  (¨á¯®«ì§ã¥âáï fgets_)
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ç¨â ¥â ⥪ã騩 ᨬ¢®« ¨§ ¯®â®ª  fp ¨ áâ ¢¨â 㪠§ â¥«ì
; (¥á«¨ ®­ ¥áâì) ­  á«¥¤ãî騩 ᨬ¢®«.
; ‚®§¢à é ¥âáï áç¨â ­­ë© ᨬ¢®«.
; ‚ á«ãç ¥ ¢®§­¨ª­®¢¥­¨ï ®è¨¡ª¨ ¨«¨ ¤®á⨦¥­¨ï ª®­æ  ä ©« , ¢®§¢à -
; é ¥âáï §­ ç¥­¨¥ EOF. ޤ­ ª®, §­ ç¥­¨¥ EOF ¬®¦¥â ¡ëâì ¢®á¯à¨­ïâ®
; ª ª 楫 ï ¢¥«¨ç¨­ , ⮣¤  ­ã¦­® ¨á¯®«ì§®¢ âì ä㭪樨 ferror ¨ feof
; ¤«ï ¯à®¢¥àª¨ ®è¨¡ª¨ ¨«¨ ª®­æ  ä ©« .
;
; in: hl =  ¤à¥á áâàãªâãàë ¤¥áªà¨¯â®à 
; out: a = ¯à®ç¨â ­­ë© ᨬ¢®«, ¥á«¨ Ok
; a = EOF (0FFh) ¯à¨ ®è¨¡ª¥
;
; char getc(FILE *fp)
; char fgetc(FILE *fp)
;
getc_::
fgetc_::
bit 6,(hl) ; "binary file" ?
jp nz,_fgetc_## ; yes
; line-buffered file (CR-LF translation)
@41: push hl ; fp
call _fgetc_##
pop hl
cp 0Dh ; ⮫쪮 ¨§ ä ©«  (­¥ ¨§ stdin)
jr z,@41
cp 1Ah ; EOF text file
ret nz ; no
set 5,(hl) ; EOF indicator
push hl
inc hl
inc hl
ld e,(hl) ;+2 level of buffer
inc hl ;
ld d,(hl) ;+3
inc de ; ++level
ld (hl),d
dec hl
ld (hl),e
inc hl
inc hl
ld e,(hl) ;+4 current active pointer
inc hl ;
ld d,(hl) ;+5
dec de ; --pointer
ld (hl),d
dec hl
ld (hl),e
pop hl
jr @41
ENDMODULE
MODULE fgets
;
; "stdio.h"
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ¢ë᮪®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ç¨â ¥â áâப㠨§ ¢å®¤­®£® ¯®â®ª  fp ¨ à á¯®« £ ¥â
; ¥¥ ¢ string. ‘¨¬¢®«ë áç¨â뢠îâáï, ­ ç¨­ ï á ⥪ã饩 ¯®§¨æ¨¨
; fp ¨ ¤® ᨬ¢®«  ­®¢®© áâப¨ '\n' ¨«¨ ¤® ª®­æ  ¯®â®ª , «¨¡®
; ¯®ª  ç¨á«® áç¨â ­­ëå ᨬ¢®«®¢ ­¥ áâ ­¥â à ¢­ë¬ maxlen-1.
; ‘âப  à §¬¥é ¥âáï ¢ string, § â¥¬ ¢ ¥¥ ª®­¥æ áâ ¢¨âáï ­ã«ì.
; ‘¨¬¢®« ­®¢®© áâப¨ â ª¦¥ ¢ª«îç ¥âáï ¢ string. …᫨ ¢ ­ ç «¥
; áç¨â뢠­¨ï maxlen à ¢­ï«®áì 1, â® string ¡ã¤¥â ¯ãá⮩ "".
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  áâபã string.
; ਠ®è¨¡ª¥ ¨«¨ ª®­æ¥ ä ©« , ¢®§¢à é ¥âáï NULL.
;
; in: hl =  ¤à¥á ¡ãä¥à  string
; de = ¤«¨­  áâப¨
; bc =  ¤à¥á áâàãªâãàë ¤¥áªà¨¯â®à 
; out: hl =  ¤à¥á ¡ãä¥à  string, ¥á«¨ Ok
; hl = NULL, ¯à¨ ®è¨¡ª¥ ¨«¨ ª®­æ¥ ä ©« 
;
; char *fgets(char *string, int maxlen, FILE *fp)
;
fgets_::
ld (?105+1),bc ;  ¤à¥á FILE *fp
ld (@40+1),hl ;  ¤à¥á ¡ãä¥à  string
ld (@39+1),de ; maxlen
ld (?107+1),hl ; ⥪.  ¤à¥á ¢ ¡ãä¥à¥ string
@39: ld hl,0 ; maxlen
dec hl ; --maxlen
ld (@39+1),hl
ex de,hl
ld hl,0
call ?cpshd## ; áà ¢­¨âì hl á de
jr nc,@38
?105: ld hl,0 ;  ¤à¥á fd FILE-áâàãªâãàë
call fgetc_## ; ¯à®ç¨â âì ᨬ¢®« ¨§ ä ©« 
cp -1
jr z,@38 ; eof
?107: ld hl,0 ; ⥪.  ¤à¥á ¢ ¡ãä¥à¥ string
ld (hl),a ; save symbol
inc hl
ld (?107+1),hl
cp 0Ah
jr nz,@39
@38: ex af,af' ; save "a"
xor a
ld de,(?107+1) ; ⥪.  ¤à¥á ¢ ¡ãä¥à¥ string
ld (de),a ; ­ã«ì ¢ ª®­¥æ áâப¨ ¢ string
ex af,af' ; rest "a"
inc a
jr nz,@40
; end of file
ld hl,(@40+1) ;  ¤à¥á ¡ãä¥à  string
ld a,e
cp l
ret nz
ld a,d
cp h
ret nz
; empty string ""
ld hl,0 ; NULL
ret
;
@40: ld hl,0 ;  ¤à¥á ¡ãä¥à  string
ret
ENDMODULE
MODULE fwrite
;
; "stdio.h"
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ¢ë᮪®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
; ”ã­ªæ¨ï § ¯¨á뢠¥â ®¡ê¥ªâë à §¬¥à  size ¯® áç¥â稪ã
; count ¨§ ¡ãä¥à  buffer ¢ ¢ë室­®© ä ©« fp.
; ‚®§¢à é ¥â ç¨á«® ॠ«ì­® § ¯¨á ­­ëå ®¡ê¥ªâ®¢.
;
; in: hl =  ¤à¥á buffer
; de = size
; bc = count
; sp+2 =  ¤à¥á FILE *fp
; out: hl = ç¨á«® § ¯¨á ­­ëå ®¡ê¥ªâ®¢
;
; uint fwrite(buffer, size, count, FILE *fp)
;
fwrite_::
push ix
ld ix,0
add ix,sp ; ix = ¡ §  á⥪ 
ld (?86+1),hl ; ⥪.  ¤à¥á ¢ buffer
ld (?87+1),de ; size (à §¬¥à ®¡ê¥ªâ  ¢ ¡ ©â å)
ld (@34+1),bc ; count (ª®«-¢® ®¡ê¥ªâ®¢)
ld hl,0 ; á¡à. ç¨á«® § ¯¨á ­­ëå ®¡ê¥ªâ®¢
ld (@31+1),hl
@34: ld hl,0 ; á®åà. ª®«-¢® ®¡ê¥ªâ®¢
ld a,l
or h
jr z,@30 ; ¢á¥ ®¡ê¥ªâ®¢ § ¯¨á ­ë
dec hl ; --count
ld (@34+1),hl
?87: ld hl,0 ; á®åà. size (à §¬¥à ®¡ê¥ªâ  ¢ ¡ ©â å)
ld (@32+1),hl ; ⥪. à §¬¥à size
@32: ld hl,0
ld a,l
or h
jr z,@31 ; ®¤¨­ ®¡ê¥ªâ § ¯¨á ­
dec hl ; --size
ld (@32+1),hl
?86: ld hl,0 ; current pointer
ld a,(hl) ; get symbol from buffer
inc hl ; ++pointer
ld (?86+1),hl
ld e,(ix+4) ; de =  ¤à¥á FILE *fp
ld d,(ix+5)
call _fputc_## ; put symbol to file
inc a
jr nz,@32 ; not EOF
; ®è¨¡ª , ª®­¥æ ä ©«  - ¢¥à­ãâì ç¨á«® ãᯥ譮 § ¯¨á. ®¡ê¥ªâ®¢
@30: ld hl,(@31+1) ; ã§­ âì ç¨á«® § ¯¨á. ®¡ê¥ªâ®¢
@33: ld sp,ix ; ¢®ááâ. á⥪
pop ix
ret
;
@31: ld hl,0 ; ç¨á«® § ¯¨á ­­ëå ®¡ê¥ªâ®¢
inc hl
ld (@31+1),hl
jp @34
ENDMODULE
MODULE fread
;
; "stdio.h"
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ¢ë᮪®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ç¨â ¥â ®¡ê¥ªâë à §¬¥à  size ¯® áç¥â稪ã count ¨§ ¢å®¤­®£®
; ä ©«  fp ¨ à á¯®« £ ¥â ¨å ¢ ¡ãä¥à¥ buffer.
; ‚®§¢à é ¥â ç¨á«® ॠ«ì­® ¯à®ç¨â ­­ëå ®¡ê¥ªâ®¢.
; ਬ¥ç ­¨¥:
; ਠç⥭¨¨ ¨§ stdin, ª®¤ 0x0D § ¬¥­ï¥âáï ­  ª®¤ 0x0A (¯ào£o­ ¡ã¬ £¨)
; ¨ ­¥â ¢®§¬®¦­®á⨠। ªâ¨à®¢ âì ¢¢®¤¨¬ë¥ ¤ ­­ë¥.  ¦ â¨¥ ­  ª®¬¡¨­ æ¨î
; ª« ¢¨è Ctrl+Z ¨«¨ Ctrl+C ¢®á¯à¨­¨¬ ¥âáï ª ª ª®­¥æ ¢¢®¤  ¤ ­­ëå.
; „«ï ¢¢®¤  áâப¨ ᨬ¢®«®¢ ¨§ stdin «ãçè¥ ¨á¯®«ì§®¢ âì äã­ªæ¨î gets,
; ¤®¯ã᪠îéãî । ªâ¨à®¢ ­¨¥ ¢¢®¤¨¬ëå ¤ ­­ëå.
;
; in: hl =  ¤à¥á buffer
; de = size
; bc = count
; sp+2 =  ¤à¥á FILE *fp
; out: hl = ç¨á«® ¯à®ç¨â ­­ëå ®¡ê¥ªâ®¢
;
; uint fread(buffer, size, count, FILE *fp)
;
fread_::
push ix
ld ix,0
add ix,sp ; ix = ¡ §  á⥪ 
ld (@26+1),hl ; ⥪.  ¤à¥á ¢ buffer
ld (?75+1),de ; size (à §¬¥à ®¡ê¥ªâ  ¢ ¡ ©â å)
ld (@29+1),bc ; count (ª®«-¢® ®¡ê¥ªâ®¢)
ld hl,0 ; á¡à. ç¨á«® ¯à®ç¨â ­­ëå ®¡ê¥ªâ®¢
ld (@25+1),hl
@29: ld hl,0 ; á®åà. ª®«-¢® ®¡ê¥ªâ®¢
ld a,l
or h
jr z,@24 ; ¢á¥ ®¡ê¥ªâ®¢ ¯à®ç¨â ­ë
dec hl ; --count
ld (@29+1),hl
?75: ld hl,0 ; á®åà. size (à §¬¥à ®¡ê¥ªâ  ¢ ¡ ©â å)
ld (@28+1),hl
@28: ld hl,0 ; ⥪. à §¬¥à size
ld a,l
or h
jr z,@25 ; ®¤¨­ ®¡ê¥ªâ ¯à®ç¨â ­
dec hl ; --size
ld (@28+1),hl
ld l,(ix+4) ; hl =  ¤à¥á FILE *fp
ld h,(ix+5)
call _fgetc_## ; ¯à®ç¨â âì ᨬ¢®« ¨§ ä ©« 
cp -1
jr nz,@26 ; not EOF
; ®è¨¡ª , ª®­¥æ ä ©«  - ¢¥à­ãâì ç¨á«® ãᯥ譮 ¯à®ç¨â. ®¡ê¥ªâ®¢
@24: ld hl,(@25+1) ; ç¨á«® ¯à®ç¨â. ®¡ê¥ªâ®¢
@27: ld sp,ix
pop ix
ret
;
@26: ld hl,0 ; current pointer
ld (hl),a ; save symbol to buffer
inc hl ; ++pointer
ld (@26+1),hl
jr @28
;
@25: ld hl,0 ; ç¨á«® ¯à®ç¨â. ®¡ê¥ªâ®¢
inc hl
ld (@25+1),hl
jr @29
ENDMODULE