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

1175 lines
28 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.
; ”㭪樨 ¯à®¢¥à¥­ë.
;
; ‚室ï騥 ä㭪樨:
;
; errno - ï祩ª 
; open
; close
; creat
; read
; write
; sleep
; chdir
; getcwd
; strerr - ¢ ‘¨ ª ª strerror
; perror
; isatty
; unlink
; remove
; mkdir
; rmdir
; rename
; getenv
; putenv
; sysenv
; seek
; lseek
; tell
; ltell
; ioctl - ­¥ £®â®¢ 
;
MODULE errno
;---------------------------------------------------------------------
; errno variable
;---------------------------------------------------------------------
dseg
errno_::
db 0 ; ­®¬¥à á¨áâ. ®è¨¡ª¨
ENDMODULE
MODULE open
;
; "io.h"
;---------------------------------------------------------------------
; creat() ”ã­ªæ¨ï ­¨§ª®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
; ”ã­ªæ¨ï creat á®§¤ ¥â ­®¢ë© ä ©«.
; …᫨ ä ©« 㦥 áãé¥áâ¢ã¥â, ã१ ¥â ¥£® ¤® ­ã«¥¢®© ¤«¨­ë.
; ‡­ ç¥­¨¥ attr á®á⮨⠨§ ®¤­®© ¨«¨ ­¥áª®«ìª¨å ª®­áâ ­â:
; S_IWRITE ¨ S_IREAD, ®¡ê¥­­ëå ¢ "stat.h". …᫨ § ¤ îâáï ®¡¥
; ª®­áâ ­âë, ®­¨ ®¡ê¥¤¨­ïîâáï ¯à¨ ¯®¬®é¨ «®£¨ç¥áª®£® ˆ‹ˆ "|".
; ”ã­ªæ¨ï ¢®§¢à é ¥â ­®¬¥à ¤¥ªáਯâ®à .
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 (0FFFFh) ¨ errno
; ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
;
; uint creat(char *name, int attr)
; uint creat(char *name, char attr)
;--------------------------------------------------------------------------
; "io.h"
;---------------------------------------------------------------------
; open() ”ã­ªæ¨ï ­¨§ª®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
; ”ã­ªæ¨ï open ®âªà뢠¥â ä ©«, ®¯à¥¤¥«ï¥¬ë© ¯® path-¨¬¥­¨ ¨ ¯®¤£®â ¢«¨¢ ¥â
; ¥£® ª ¯®á«¥¤ãî饬ã ç⥭¨î ¨«¨ § ¯¨á¨, çâ® ®¯à¥¤¥«ï¥âáï ¯®á।á⢮¬
; oflag. €à£ã¬¥­â oflag ï¥âáï æ¥«ë¬ ¢ëà ¦¥­¨¥¬, á®áâ®ï騬 ¨§ ª®¬¡¨-
; ­ æ¨¨ ®¤­®© ¨«¨ ¡®«¥¥ ¬ ­¨ä¥áâ­ëå ª®­áâ ­â, ®¡ê¥­­ëå ¢ "io.h".
; …᫨ § ¤ ­® ¡®«ìè¥ ®¤­®© ª®­áâ ­âë, â® ®­¨ ®¡ê¥¤¨­ïîâáï ¯à¨ ¯®¬®é¨
; «®£¨ç¥áª®£® ®¯¥à â®à  ˆ‹ˆ "|". ‡­ ç¥­¨ï  à£ã¬¥­â  oflag ¯à¨¢®¤ïâáï
; ­¨¦¥:
;
; O_RDWR ” ©« ®âªàëâ ®¤­®¢à¥¬¥­­® ¤«ï ç⥭¨ï ¨ § ¯¨á¨.
; …᫨ § ¤ ¥âáï íâ®â ä« £, ¬®¦¥â ¡ëâì ¢ë¡à ­
; «¨¡® ä« £ O_RDONLY, «¨¡® O_WRONLY.
;
; O_RDONLY ” ©« ®âªàëâ ⮫쪮 ¤«ï ç⥭¨ï. …᫨ § ¤ ¥âáï
; íâ®â ä« £, ¬®¦¥â ¡ëâì ¢ë¡à ­ «¨¡® ä« £ O_RDWR,
; «¨¡® O_WRONLY.
;
; O_WRONLY ” ©« ®âªàëâ ⮫쪮 ¤«ï § ¯¨á¨. …᫨ § ¤ ­ íâ®â
; ä« £, ¬®¦¥â ¡ëâì § ¤ ­ â ª¦¥ «¨¡® ä« £ O_RDONLY,
; «¨¡® ORDWR.
;
; O_TRUNC ‘ãé¥áâ¢ãî騩 ä ©« ®âªàëâ ­  ç⥭¨¥ ¨ § ¯¨áì, ¨
; ãá¥ç¥­ ª ¤«¨­¥ 0. â®â ä ©« ¤®«¦¥­ ¨¬¥âì à §à¥-
; 襭¨¥ ­  § ¯¨áì. ‘®¤¥à¦¨¬®¥ ä ©«  ã­¨ç⮦ ¥âáï.
;
; O_CREAT ®¢ë© ä ©« á®§¤ ­ ¨ ®âªàëâ ¤«ï ç⥭¨ï/§ ¯¨á¨;
; íâ® ­¥ íä䥪⨢­®, ¥á«¨ áãé¥áâ¢ã¥â ä ©«, ®¯à¥-
; ¤¥«ï¥¬ë© ¯® path-¨¬¥­¨.
;
; O_EXCL ‚®§¢à é ¥âáï §­ ç¥­¨¥ ®è¨¡ª¨, ¥á«¨ áãé¥áâ¢ã¥â
; ä ©«, ®¯à¥¤¥«ï¥¬ë© ¯® path-¨¬¥­¨. ਬ¥­ï¥âáï
; ⮫쪮 ¢¬¥á⥠á O_CREATE.
;
; O_APPEND “ª § â¥«ì ¢ ä ©«¥ ¯¥à¥¬¥áâ¨âì ­  ª®­¥æ ä ©« .
; „«ï ०¨¬®¢ O_RDONLY, O_TRUNC ¨ O_CREAT ­¥
; ¨¬¥¥â á¬ëá« .
;
; ‡ ¬¥ç ­¨¥! O_TRUNC ¯®«­®áâìî ã­¨ç⮦ ¥â ᮤ¥à¦¨¬®¥ áãé¥áâ¢ãî饣®
; ä ©« , ¯®í⮬㠭㦭® ¢­¨¬ â¥«ì­® ¨á¯®«ì§®¢ âì íâã ª®­áâ ­âã.
;
; ”ã­ªæ¨ï ¢®§¢à é ¥â ­®¬¥à ¤¥áªà¨¯â®à  ä ©« , ¥á«¨ Ok.
; ਠ®è¨¡ª¥, ¢®§¢à é ¥â §­ ç¥­¨¥ -1 (0FFFFh) ¨ ï祩ª  errno ᮤ¥à¦¨â
; ­®¬¥à ®è¨¡ª¨.
;
; in: hl = *pathname (㪠§ â¥«ì ­  ¨¬ï ä ©« )
; de = oflag (⨯ ®¯¥à æ¨©)
; out: hl = ­®¬¥à ¤¥áªà¨¯â®à , ¥á«¨ Ok
; hl = -1 ¯à¨ ®è¨¡ª¥
;
; uint open(char *pathname, int oflag)
; uint open(char *pathname, char oflag)
;
creat_::
open_::
; e=oflag
push ix
ld a,3
and e ; mask 1,0 bits
xor 3
ld d,a ; save "a"
; a=0..2
dec a
jr z,open ; O_RDONLY
ld a,0Ch
and e ; 3,2 bits ?
jr z,open ; no (O_WRONLY and O_RDWR)
; O_CREAT or O_TRUNC
ld c,0Ah ; create file
bit 4,e
jr z,trunc ; no O_EXCL
inc c ; create new file
trunc: ld a,20h ; attr "archive"
rst 10h
jr op24
;
open: push de
ld a,d ; O_RDONLY, O_WRONLY, O_RDWR
ld c,11h
rst 10h
pop de
jr c,op24 ; file not found
bit 5,e ; O_APPEND
jr z,op24 ; no
; ãáâ. 㪠§ â¥«ì ¢ ª®­¥æ ä ©« 
push af ; save file descriptor
ld hl,0
push hl
pop ix
ld b,2 ; SEEK_END
ld c,15h ; move_fp
rst 10h
pop bc
ld a,b
;
op24: ld l,a ; file descriptor
ld h,0
pop ix
ret nc ; Ok
ld (errno_##),a
ld hl,-1 ; error
ret
;
; "io.h"
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ­¨§ª®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
; ”ã­ªæ¨ï § ªà뢠¥â ä ©«.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 0, ¥á«¨ ä ©« ãᯥ譮 § ªàëâ.
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 (0FFFFh) ¨ errno
; ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
;
; uint close(FD fd)
;
close_::
push ix
ld a,l
ld c,12h
rst 10h
pop ix
ld hl,0
ret nc ; Ok
ld (errno_##),a
dec hl ; -1
ret
ENDMODULE
MODULE read
;
; "io.h"
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ­¨§ª®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ç¨â ¥â ç¨á«® ¡ ©â count ¨§ ä ©«  ¢ ¡ãä¥à buff.
; ޝ¥à æ¨ï ç⥭¨ï ­ ç¨­ ¥âáï á ⥪ã饩 ¯®§¨æ¨¨ 㪠§ â¥«ï ¢ ä ©«¥.
; ”ã­ªæ¨ï ¢®§¢à é ¥â ç¨á«® ॠ«ì­® ¯à®ç¨â ­­ëå ¡ ©â®¢, ª®â®à®¥
; ®¤­ ª®, ¬®¦¥â ¡ëâì ¬¥­ìè¥ § ï¢«¥­­®£® ¢ count (­ ¯à¨¬¥à ¢áâà¥-
; â¨âáï ª®­¥æ ä ©« ). Œaªá¨¬a«ì­o¥ ç¨á«o ¡a©âo¢, ªoâoào¥ ¬o¦­o
; ¯àoç¨âaâì ¨§ äa©«a §a o¤¨­ àa§, àa¢­o 65534; ¯oáªo«ìªã 65535
; (OxFFFF) ï¥âáï ­¥oâ«¨ç¨¬ë¬ oâ -1, ¯oíâo¬ã ¡ã¤¥â ¢o§¢àa饭a
; o訡ªa.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 0, ¥á«¨ ¤¥« ¥âáï ¯®¯ë⪠ ç⥭¨ï ª®­æ  ä ©« .
; ਠ®è¨¡ª¥ ç⥭¨ï, ¢®§¢à é ¥âáï -1 ¨ errno ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
;
; size_t read(FD fd, void *buff, count)
;
read_::
push ix
ld a,l ; file descriptor
ex de,hl ; hl = buffer address
ld e,c ; de = number of bytes to read
ld d,b
ld c,13h
rst 10h
ex de,hl ; hl = number of bytes actually read
pop ix
ret nc
ld (errno_##),a
ld hl,-1
ret
ENDMODULE
MODULE write
;
; "io.h"
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ­¨§ª®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
; ”ã­ªæ¨ï § ¯¨á뢠¥â ç¨á«® ¡ ©â count ¨§ ¡ãä¥à  buff ¢ ä ©«.
; ޝ¥à æ¨¨ § ¯¨á¨ ­ ç¨­ îâáï á ⥪ã饩 ¯®§¨æ¨¨ 㪠§ â¥«ï ¢ ä ©«¥.
; …᫨ ä ©« ®âªàëâ ¤«ï ¤®¡ ¢«¥­¨ï, ®¯¥à æ¨¨ ¢ë¯®«­ïîâáï ¢ ª®­¥æ
; ä ©« . ®á«¥ ®áãé¥á⢫¥­¨ï ®¯¥à æ¨© § ¯¨á¨, 㪠§ â¥«ì ¢ ä ©«¥
; 㢥«¨ç¨¢ ¥âáï ­  ª®«¨ç¥á⢮ ॠ«ì­® § ¯¨á ­­ëå ¡ ©â®¢.
; Œ ªá. ç¨á«® § ¯¨á뢠¥¬ëå ¡ ©â®¢ ¢ ä ©« à ¢­® 65534; ¯®áª®«ìªã
; ç¨á«® 65535 ï¥âáï ­¥®â«¨ç¨¬ë¬ ®â -1, â® ¢®§¢à é ¥âáï ®è¨¡ª .
; ”ã­ªæ¨ï ¢®§¢à é ¥â ç¨á«® ॠ«ì­® § ¯¨á ­­ëå ¡ ©â.
; ਠ®è¨¡ª¥ § ¯¨á¨ ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ ¢ errno ãáâ ­ ¢«¨-
; ¢ ¥âáï ­®¬¥à ®è¨¡ª¨.
;
; out: hl=ç¨á«® ॠ«ì­® § ¯¨á. ¡ ©â
;
; size_t write(FD fd, void *buff, count)
;
write_::
push ix
ld a,l ; file descriptor
ex de,hl ; hl = buffer address
ld e,c ; de = number of bytes to write
ld d,b
ld c,14h
rst 10h
ex de,hl ; hl = number of bytes actually write
pop ix
ret nc
ld (errno_##),a
ld hl,-1
ret
ENDMODULE
MODULE sleep
;
; "dos.h"
; ”ã­ªæ¨ï ¯à¨®áâ ­ ¢«¨¢ ¥â ¢ë¯®«­¥­¨¥
; ¯à®£à ¬¬ë ­  seconds ᥪ㭤.
; ®á«¥ ¢ë¯®«­¥­¨ï ä㭪樨, ¯à¥à뢠­¨ï
; ®áâ îâáï ¢ª«î祭­ë¬¨.
;
; void sleep(uint seconds)
;
sleep_::
ei
@1: ld a,l
or h
ret z
ld a,49 ; 1/50 ᥪ㭤ë
@2: halt
dec a
jr nz,@2
dec hl
jr @1
ENDMODULE
; MODULE pid
;
; char getpid() -- MISIX only
; char getppid() -- MISIX only
;
;getppid_::
; ld c,49h
; db 21h
;getpid_::
; ld c,48h
; ld a,(_os_ver_##)
; cp 2
; ld a,0
; ret nz
; push ix
; call 5
; pop ix
; ret
;
; ENDMODULE
MODULE chdir
;
; "direct.h"
; ”ã­ªæ¨ï ¨§¬¥­ï¥â ⥪ã騩 ª â «®£ ¨ ⥪ã騩 ¤¨áª, ¥á«¨ ®­ 㪠§ ­
; ¢ pathname. …᫨ ¯ãâì ­ ç¨­ ¥âáï á "\" - íâ® ®§­ ç ¥â ¯ãâì ®â
; ª®à­¥¢®£® ª â «®£ , ¨­ ç¥ ®â ⥪ã饣®. Pathname ¤®«¦¥­ ááë« âìáï
; ­  áãé¥áâ¢ãî騩 ª â «®£.
; ”ã­ªæ¨ï ¢®§¢à é ¥â §­ ç¥­¨¥ 0, ¥á«¨ à ¡®ç¨© ª â «®£ ãᯥ譮 ¨§¬¥­¥­.
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï -1 (0FFh) ¨ errno ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
;
; char chdir(char *pathname)
;
chdir_::
;push ix
ld c,1Dh
rst 10h
ld (errno_##),a
;pop ix
ld a,0
ret nc
dec a
ret
ENDMODULE
MODULE getcwd
;
; "direct.h"
; ”ã­ªæ¨ï ¯®«ã砥⠯®«­®¥ (á ¡ãª¢®© ¤¨áª ) path-¨¬ï ⥪ã饣® ª â «®£ 
; ¨ á®åà ­ï¥â ¥£® ¢ ¡ãä¥à¥ pathbuff. ‚ ª®­æ¥ path-¨¬¥­¨ ⥪ã饣® ª â -
; «®£  á⮨â ᨬ¢®« "\" á § ª«îç¨â¥«ì­ë¬ ­ã«¥¬ ¢ ª®­æ¥ áâப¨.
; €à£ã¬¥­â len ®¯à¥¤¥«ï¥â ¬ ªá¨¬ «ì­ãî ¤«¨­ã ¤«ï path-¨¬¥­¨, ª®â®à ï
; ¤®«¦­  ¡ëâì ¤®áâ â®ç­®©, çâ®¡ë ¢¬¥áâ¨âì ¨­ä®à¬ æ¨î ¢¬¥áâ¥ á § ª«îç¨-
; ⥫ì­ë¬ ­ã«¥¬. Œ ªá¨¬ «ì­ ï ¤«¨­  path-¨¬¥­¨ ¢ „Ž‘ à ¢­  256 ¡ ©â®¢.
; …᫨ ¤«¨­  path-¨¬¥­¨ ¯à¥¢ëè ¥â len, â® path-¨¬ï ®¡à¥§ ¥âáï ­  ¤«¨­ã
; len, ¯à¨ í⮬ ᨬ¢®« "\" ¢ ª®­¥æ áâப¨ ­¥ áâ ¢¨âáï.
; …᫨  à£ã¬¥­â pathbuff à ¢¥­ NULL, â® getcwd ¢ë§ë¢ ¥â malloc ¤«ï
; ¢ë¤¥«¥­¨ï ¡ãä¥à  à §¬¥à®¬ len ¡ ©â®¢. â®â ¢ë¤¥«¥­­ë© ¡ãä¥à ¯®§¦¥ ¬®¦¥â
; ¡ëâì ®á¢®¡®¦¤¥­ ¯®á।á⢮¬ ä㭪樨 free.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  pathbuff.
; ਠ®è¨¡ª¥ ¢®§¢à é ¥âáï NULL ¨ errno ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
;
; char *getcwd(char *pathbuff, int len)
;
getcwd_::
;push ix
ld (@6+1),de
ld a,l
or h
jr nz,@1
ex de,hl ; hl=len
inc hl
call malloc_##
ld a,l
or h
ld a,30 ; ENOMEM (Not enough memory)
jr z,@4
;
@1: ld (@5+1),hl
ld hl,4100h ; exe-header as temp buffer
push hl
inc hl
inc hl
; get current directory
ld c,1Eh
rst 10h
jr c,@3
ex de,hl ; hl=end string
ld a,"\"
dec hl
dec hl
cp (hl)
jr z,@2
inc hl
ld (hl),a
inc hl
ld (hl),0
; get current disk
@2: ld c,2
rst 10h
pop hl
jr c,@4
ld c,"A"
add a,c
ld (hl),a
inc hl
ld (hl),":"
dec hl ; hl=4100h
;
@5: ld de,0
push de
@6: ld bc,1
ldir
xor a
ld (de),a
pop hl
;pop ix
ret
;
@3: pop hl
@4: ;pop ix
ld (errno_##),a
ld hl,0 ; NULL
ret
ENDMODULE
MODULE strerr
;
; "string.h"
; (¢ ‘¨ á⮨⠪ ª "strerror").
; ”ã­ªæ¨ï ¯à¥®¡à §ã¥â errno ¢ áâàoªã á¨á⥬­®£® áoo¡é¥­¨ï o¡ o訡ª¥
; ¨ ¢o§¢àaéa¥â ãªa§aâ¥«ì ­a íâã áâàoªã.
; ”ã­ªæ¨ï, ¢ ®â«¨ç¨¥ ®â perror, ­¥ ¢ë¢®¤¨â ­¨ª ª¨å áoo¡é¥­¨©. „«ï ¢ë¢®¤ 
; á®®¡é¥­¨ï âॡã¥âáï ¢ë§¢aâì äã­ªæ¨î ¢ë¢o¤a (­ ¯à¨¬¥à printf).
; ®¬¥à ®è¨¡ª¨ åà ­¨âáï ¢ ¯¥à¥¬¥­­®© errno, ª®â®à ï ®¡ê¥­  ­  ¢­¥è­¥¬
; ã஢­¥ ¨ ¨á¯®«ì§ã¥âáï ª ª ¨­¤¥ªá ¢ ¬ áᨢ¥ á¨á⥬­ëå á®®¡é¥­¨©.
; ‘¨á⥬­ë¥ á®®¡é¥­¨ï ®¡ ®è¨¡ª å ¤®áâ㯭ë ç¥à¥§ ¯¥à¥¬¥­­ãî _errlst_,
; ïîéãîáï ¬ áᨢ®¬ á¨á⥬­ëå á®®¡é¥­¨© ®¡ ®è¨¡ª å.
; —â®¡ë ¢¥à­ãâì ¯à ¢¨«ì­ë© १ã«ìâ â, äã­ªæ¨ï strerr ¤®«¦­  ¡ëâì ¢ë§¢ ­ 
; áà §ã ¯®á«¥ ¡¨¡«¨®â¥ç­®© ä㭪樨, ¢®§¢à â¨¢è¥© ®è¨¡ªã. ˆ­ ç¥, §­ ç¥­¨¥
; errno ¬®¦¥â ¡ëâì ¯¥à¥§ ¯¨á ­® ¯à¨ ¯®á«¥¤ãîé¨å ¢ë§®¢ å ¡¨¡«¨®â¥ç­ëå ä㭪権.
; „«ï «î¡®£® §­ ç¥­¨ï errno, ­¥ ¨á¯®«ì§ã¥¬®£® ¢ „Ž‘, äã­ªæ¨ï strerr ¢®§¢à -
; é ¥â 㪠§ â¥«ì ­  ¯ãáâãî áâபã.
;
; in: a = ¨­¤¥ªá áâப¨ ®è¨¡ª¨
; out: hl =  ¤à¥á áâப¨
;
; char *strerr(char errno)
;
strerr_::
cp 50+1
jr nc,@2
ld e,a ; errno
ld d,0
inc de
ld hl,_errlst_ ; array of system messages
ld bc,__nerr ; size of array
@1: xor a
cpir
ret po
ret nz
dec de
ld a,d
or e
jp nz,@1
ret
;
@2: ld hl,@3
ret
;
@3: db 0Dh,0Ah,0
; array of system messages
_errlst_::
db 0
db "No error",0 ; 0
db "Invalid function",0 ; 1
db "Invalid drive number",0 ; 2
db "File not found",0 ; 3
db "Path not found",0 ; 4
db "Invalid handle",0 ; 5
db "Too many open files",0 ; 6
db "File already exists",0 ; 7
db "File read only",0 ; 8
db "Root overflow",0 ; 9
db "No free space",0 ; 10
db "Directory not empty",0 ; 11
db "Can't delete current directory",0 ; 12
db "Invalid media",0 ; 13
db "Unknown operation",0 ; 14
db "Directory exist",0 ; 15
db "Invalid filename",0 ; 16
db "Invalid EXE-file",0 ; 17
db "Not supported EXE-file",0 ; 18
db "Access denied",0 ; 19
db "Not ready",0 ; 20
db "Seek error",0 ; 21
db "Sector not found",0 ; 22
db "CRC error",0 ; 23
db "Write protect",0 ; 24
db "Read error",0 ; 25
db "Write error",0 ; 26
db "Drive failure",0 ; 27
db "Extended error: 28",0 ; 28
db "Extended error: 29",0 ; 29
db "Not enough memory",0 ; 30
db "Invalid memory block",0 ; 31
db "Extended error: 32",0 ; 32
db "Extended error: 33",0 ; 33
db "Extended error: 34",0 ; 34
db "35",0 ; 35
db "36",0 ; 36
db "37",0 ; 37
db "38",0 ; 38
db "39",0 ; 39
db "40",0 ; 40
db "41",0 ; 41
db "42",0 ; 42
db "43",0 ; 43
db "44",0 ; 44
db "45",0 ; 45
db "46",0 ; 46
db "47",0 ; 47
db "48",0 ; 48
db "49",0 ; 49
db "50",0 ; 50
_endlst_:
__nerr equ _endlst_ - _errlst_ ; size of array
ENDMODULE
MODULE perror
;
; "stdlib.h"
; ”ã­ªæ¨ï ¢ë¢®¤¨â á®®¡é¥­¨¥ ®¡ ®è¨¡ª¥ ­  stderr.
; ‚ í⮬ á®®¡é¥­¨¨  à£ã¬¥­â string ¢ë¢®¤¨âáï ¯¥à¢ë¬, § â¥¬ ¢ë¢®¤¨âáï
; ¤¢®¥â®ç¨¥, á¨á⥬­®¥ á®®¡é¥­¨¥ ®¡ ®è¨¡ª¥ ®â ¯®á«¥¤­¥£® ¡¨¡«¨®â¥ç­®£®
; ¢ë§®¢ , ¢¥à­ã¢è¥£® ®è¨¡ªã ¨ ­®¢ ï áâப .
; …᫨  à£ã¬¥­â string à ¢¥­ NULL, â® äã­ªæ¨ï ¯à®¯ã᪠¥â á®®¡é¥­¨¥ string,
; § ¤ ­­®¥ ¯®«ì§®¢ â¥«¥¬ ¨ ¢ë¢®¤¨â ⮫쪮 á¨á⥬­®¥ á®®¡é¥­¨¥ ®¡ ®è¨¡ª¥,
; ¨ ­®¢ãî áâபã.
; —â®¡ë ¢ë¢¥á⨠¯à ¢¨«ì­ë© १ã«ìâ â, äã­ªæ¨ï perror ¤®«¦­  ¡ëâì ¢ë§¢ ­ 
; áà §ã ¦¥ ¯®á«¥ ¡¨¡«¨®â¥ç­®© ä㭪樨, ¢®§¢à â¨¢è¥© ®è¨¡ªã. ˆ­ ç¥ §­ ç¥­¨¥
; errno ¬®¦¥â ¡ëâì ¯¥à¥§ ¯¨á ­® ¯à¨ ¯®á«¥¤ãîé¨å ¢ë§®¢ å ¡¨¡«¨®â¥ç­ëå ä㭪権.
; ”ã­ªæ¨ï perror ­¥ ¢®§¢à é ¥â ­¨ª ª®£® §­ ç¥­¨ï.
;
; void perror(char *string)
;
perror_::
;push ix
ld a,l
or h
jr z,@1
call cputs_##
ld hl,@2
call cputs_##
@1: ld a,(errno_##)
call strerr_##
call cputs_##
ld a,0Ah
call putch_##
;pop ix
ret
;
@2: db ": ",0
ENDMODULE
; MODULE fcntl
;
; „«ï MISIX.
;
; int fcntl(FD fd, int mode, int arg)
; char fcntla
;
;fcntl_::
;fcntla_::
; ld a,(_os_ver_##) ; this function works ONLY in MISIX
; cp 2
; jr nz,@1
; ld h,e
; ld e,c
; ld d,b
; ld c,3Eh
; call 5
; ld (errno_##),a
; or a
; ret z
;@1: ld a,-1
; ld l,a
; ld h,a
; ret
;
; ENDMODULE
MODULE isatty
;
; "io.h"
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ­¨§ª®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ®¯à¥¤¥«ï¥â, ¯à¨­ ¤«¥¦¨â «¨ ¤ ­­ë© ¤¥áªà¨¯â®à
; áâ ­¤ àâ­ë¬ ¯®â®ª ¬ (â¥à¬¨­ «, ª®­á®«ì,...).
; ”ã­ªæ¨ï ¢®§¢à é ¥â:
; true - ¤¥áªà¨¯â®à ¯à¨­ ¤«¥¦¨â â¥à¬¨­ «ã, ª®­á®«¨.
; false - ¤¥áªà¨¯â®à ¯à¨­ ¤«¥¦¨â ä ©«ã.
;
; in: l = ­®¬¥à ¤¥áªà¨¯â®à 
; out: a = true
; a = false
;
; BOOL isatty(FD fd)
;
isatty_::
xor a
cp l
jr z,@1 ; stdin
bit 7,l ; stdout, stderr, ... ?
ret z ; no
@1: inc a
ret
ENDMODULE
MODULE unlink
;
; "io.h"
; ”ã­ªæ¨ï 㤠«ï¥â ä ©«, ®¯à¥¤¥«¥­­ë© ¯® pathname.
; ƒ«®¡ «ì­ë¥ ᨬ¢®«ë * ¨ ? ¢ ¨¬¥­¨ ä ©«  ­¥ ¤®¯ã᪠îâáï.
; ” ©«ë á  âਡã⮬ "⮫쪮 ¤«ï ç⥭¨ï" ­¥«ì§ï 㤠«¨âì ¤ ­­®©
; ä㭪樥© - ¯à¥¤¢ à¨â¥«ì­® ­ã¦­® ¨§¬¥­¨âì íâ®â  âਡãâ.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 0, ¥á«¨ ä ©« ãᯥ譮 㤠«¥­.
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï -1 (0FFh) ¨ errno ᮤ¥à¦¨â
; ­®¬¥à ®è¨¡ª¨.
;
; char unlink(char *pathname)
; char remove(char *pathname)
;
unlink_::
remove_::
push ix
ld c,0Eh
rst 10h
pop ix
ld (errno_##),a
ld a,0
ret nc
dec a
ret
ENDMODULE
MODULE mkdir
;
; "direct.h"
; ”ã­ªæ¨ï á®§¤ ¥â ­®¢ë© ª â «®£ á § ¤ ­­ë¬ path-¨¬¥­¥¬.
; ‡  ®¤¨­ ¢ë§®¢ ä㭪樨 ¬®¦¥â ¡ëâì á®§¤ ­ ⮫쪮 ®¤¨­ ­®¢ë©
; ª â «®£, á ¨¬¥­¥¬ ¯®á«¥¤­¥© ª®¬¯®­¥­âë pathname.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 0, ¥á«¨ ­®¢ë© ª â «®£ ãᯥ譮 á®§¤ ­.
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï -1 (0FFh) ¨ errno ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
;
; char mkdir(char *pathname)
;
mkdir_::
push ix
ld c,1Bh
rst 10h
pop ix
ld (errno_##),a
ld a,0
ret nc
dec a
ret
ENDMODULE
MODULE rmdir
;
; "direct.h"
; ”ã­ªæ¨ï 㤠«ï¥â ¯ãá⮩ ª â «®£, ®¯à¥¤¥«¥­­ë© ¢ pathname.
; ¥«ì§ï 㤠«¨âì ⥪ã騩 ª â «®£ ¨«¨ ª®à­¥¢®©.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 0, ¥á«¨ ª â «®£ ãᯥ譮 㤠«¥­.
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï -1 (0FFh) ¨ errno ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
;
; char rmdir(char *pathname)
;
rmdir_::
push ix
ld c,1Ch
rst 10h
pop ix
ld (errno_##),a
ld a,0
ret nc
dec a
ret
ENDMODULE
MODULE rename
;
; "io.h"
; ”ã­ªæ¨ï ¯¥à¥¨¬¥­®¢ë¢ ¥â ä ©« ¨«¨ ª â «®£, ®¯à¥¤¥«¥­­ë© ¢ ¨¬¥­¨
; newname. Oldname ¤®«¦­® § ¤ ¢ âì path-¨¬ï áãé¥áâ¢ãî饣® ä ©« 
; ¨«¨ ª â «®£ . Newname ­¥ ®¯à¥¤¥«ï¥â ¨¬ï 㦥 áãé¥áâ¢ãî饣® ä ©« 
; ¨«¨ ª â «®£ .
; ”ã­ªæ¨î rename ­¥«ì§ï ¨á¯®«ì§®¢ âì ¤«ï ¯¥à¥¬¥é¥­¨ï ä ©«  ¨§ ®¤­®£®
; ª â «®£  ¢ ¤à㣮©, 㪠§ ¢ ¤à㣮¥ path-¨¬ï ¢  à£ã¬¥­â¥ newname.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 0, ¥á«¨ ®¯¥à æ¨ï ¯à®è«  ãᯥ譮.
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï -1 (0FFh) ¨ errno ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
;
; char rename(char *oldname, char *newname)
;
rename_::
push ix
ld c,10h
rst 10h
pop ix
ld (errno_##),a
ld a,0
ret nc
dec a
ret
ENDMODULE
MODULE getenv
;
; "stdlib.h"
; ”ã­ªæ¨ï ¢®§¢à é ¥â ¤«ï § ¤ ­­®£® ¨¬¥­¨ ¯¥à¥¬¥­­®© ®ªà㦥­¨ï
; varname 㪠§ â¥«ì ­  §­ ç¥­¨¥ (áâபã) í⮩ ¯¥à¥¬¥­­®©.
; Œ ªá¨¬ «ì­ ï ¤«¨­  áâப¨ §­ ç¥­¨ï ¯¥à¥¬¥­­®© ®ªà㦥­¨ï ¤®«¦­ 
; ¡ëâì ­¥ ¡®«¥¥ 255 ¡ ©â.
; ‚®§¢à é ¥âáï §­ ç¥­¨¥ NULL, ¥á«¨ § ¤ ­­ ï ¯¥à¥¬¥­­ ï ­  ⥪ã騩
; ¬®¬¥­â ­¥ ®¯à¥¤¥«¥­ .
; ਠ®è¨¡ª¥ â ª¦¥ ¢®§¢à é ¥âáï NULL, ­® ¢ errno ¡ã¤¥â ᮤ¥à¦ âìáï
; ­®¬¥à ®è¨¡ª¨.
;
; in: hl =  ¤à¥á ¨¬¥­¨ ¯¥à¥¬¥­­®©
; out: hl =  ¤à¥á áâப¨ §­ ç¥­¨ï ¯¥à¥¬¥­­®©
;
; char *getenv(char *varname)
;
getenv_::
;push ix
ld de,4000h ; exe-header as buffer for value
push de
ld bc,0146h ; get environment item
rst 10h
pop hl ; pointer to buffer for value
;pop ix
jr c,@1 ; error
or a
jr z,@1 ; not found
ret
@1: ld (errno_##),a
ld hl,0
ret
ENDMODULE
MODULE putenv
;
; "stdlib.h"
; ”ã­ªæ¨ï ¤®¡ ¢«ï¥â ­®¢ãî ¯¥à¥¬¥­­ãî ®ªà㦥­¨ï.
; €à£ã¬¥­â envstring ¤®«¦¥­ ¡ëâì 㪠§ â¥«¥¬ ­  áâபã á«¥¤ãî饣®
; ä®à¬ â :
;
; VARNAME=VALUE
;
; £¤¥: "VARNAME" - ¨¬ï ¤®¡ ¢«ï¥¬®© ¯¥à¥¬¥­­®© ®ªà㦥­¨ï
; "VALUE - §­ ç¥­¨¥ í⮩ ¯¥à¥¬¥­­®©.
;
; «¥¬¥­âë áâப¨ ¤®«¦­ë à §¤¥«ïâìáï ᨬ¢®«®¬ "=" ¨ áâப  ¤®«¦­ 
; ®ª ­ç¨¢ âìáï ­ã«¥¬.
;
; ”ã­ªæ¨ï ¢®§¢à é ¥â 0, ¥á«¨ ®­  ãᯥ譮 ®âà ¡®â « .
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
;
; in: hl =  ¤à¥á ¨¬¥­¨ ¯¥à¥¬¥­­®©
; out: hl =  ¤à¥á §­ ç¥­¨ï ¯¥à¥¬¥­­®©
;
; uint putenv(char *envstring)
;
putenv_::
;push ix
ld bc,0246h ; set environment item
rst 10h
;pop ix
ld hl,0
ret nc
ld (errno_##),a
dec hl
ret
ENDMODULE
MODULE sysenv
;
; "stdlib.h"
; ”ã­ªæ¨ï ¯®«ãç ¥â á¨á⥬­®¥ ®ªà㦥­¨¥.
; €à£ã¬¥­â sysenv ¤®«¦¥­ ¡ëâì 㪠§ â¥«¥¬ ­  ¡ãä¥à, ¯à¥¤­ §­ ç¥­­ë©
; ¤«ï ¤ ­­ëå á¨á⥬­®£® ®ªà㦥­¨ï.  §¬¥à ¡ãä¥à  ¤®«¦¥­ ¡ëâì ¤®áâ -
; â®ç­ë¬, çâ®¡ë ¢¬¥áâ¨âì ¢á¥ ¤ ­­ë¥ á¨á⥬­®£® ®ªà㦥­¨ï. ”®à¬ â
; ¤ ­­ëå ¢ ¡ãä¥à¥ á«¥¤ãî騩:
; ‘âப  ª ¦¤®© ¯¥à¥¬¥­­®© ®ªà㦥­¨ï § ª ­ç¨¢ ¥âáï ­  ­ã«ì.
; ‚ ª®­æ¥ áâப¨ ¯®á«¥¤­¥© ¯¥à¥¬¥­­®© ®ªà㦥­¨ï, á⮨⠤®¯®«-
; ­¨â¥«ì­ë© ­ã«ì, ¯®ª §ë¢ î騩, çâ® ¤ «ìè¥ ¯¥à¥¬¥­­ëå ­¥â.
; ਬ¥à (¢  á¬®¢®¬ ¢ à¨ ­â¥):
;
; sysenv: db "PATH=c:\fn;c:\zx",0
; db "SOLID=H",0
; db 0
;
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ¡ãä¥à sysenv.
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno ᮤ¥à¦¨â ­®¬¥à
; ®è¨¡ª¨.
;
; in: hl =  ¤à¥á ¡ãä¥à  sysenv
; out: hl =  ¤à¥á ¡ãä¥à  sysenv
;
; char *sysenv(char *sysenv)
;
sysenv_::
;push ix
push hl
ld bc,0046h ; set system environment
rst 10h
pop hl
;pop ix
ret nc
ld (errno_##),a
ld hl,-1
ret
ENDMODULE
; MODULE dup
;
; "io.h"
; ‘®§¤ ¥â ¢â®à®© ¤¥áªà¨¯â®à ¤«ï ®âªàë⮣® ä ©« .
; ‘®§¤ ­¨¥ ­®¢®£® ¤¥áªà¨¯â®à  ­¥ ¢«¨ï¥â ­  ⨯ ¤®áâ㯠 ª ä ©«ã.
; ”ã­ªæ¨ï ¢®§¢à é ¥â ­®¬¥à 2-£® ¤¥áªà¨¯â®à .
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï -1 (0FFFFh) ¨ errno ãáâ ­ ¢«¨¢ ¥âáï
; ¢ ®¤­® ¨§ á«¥¤ãîé¨å §­ ç¥­¨©:
;
; EBADF - ­¥¢¥à­ë© ¤¥áªà¨¯â®à ä ©« .
; EMFILE - ¤à㣨¥ ¤¥áªà¨¯â®àë ä ©«  ¤«ï
; ­¥£® ­¥ ¤®áâ㯭ë, â.ª. ¬­®£®
; ®âªàëâëå ä ©«®¢.
;
; FD dup(FD fd)
;
;dup_:: ld a,(_os_ver_##)
; or a
; ret z
; push ix
; dec a
; jr z,du1
; ld h,0
; ld c,3Eh
; call 5
; pop ix
; ret
;du1: ld b,l
; ld c,47h
; call 5
; pop ix
; ld l,b
; ld h,0
; ret
;
; ENDMODULE
; MODULE dup2
;
; "io.h"
; ”ã­ªæ¨ï ä®àá¨àã¥â § ¤ ­­ë© ¤¥áªà¨¯â®à fp2 ¤«ï áá뫪¨ ­  â®â ¦¥ á ¬ë©
; ä ©«, ­  ª®â®àë© ááë« ¥âáï ¤¥áªà¨¯â®à fp1. …᫨ ¢® ¢à¥¬ï ¢ë§®¢  í⮩
; ä㭪樨, fp2 á¢ï§ ­ á ®âªàëâë¬ ä ©«®¬, â® íâ®â ä ©« § ªà뢠¥âáï.
; fp1 - ¤¥áªà¨¯â®à ®âªàë⮣® ä ©« 
; fp2 - «î¡®¥ §­ ç¥­¨¥ ¤¥áªà¨¯â®à 
; ”ã­ªæ¨ï ¢®§¢à é ¥â 0 ¢ á«ãç ¥ ãᯥå .
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï -1 (0FFFFh) ¨ errno ãáâ ­ ¢«¨¢ ¥âáï ¢ ®¤­®
; ¨§ á«¥¤ãîé¨å §­ ç¥­¨©:
;
; EBADF - ­¥¢¥à­ë© ¤¥áªà¨¯â®à ä ©« 
; EMFILE - ¤à㣨¥ ¤¥áªà¨¯â®àë ä ©«  ¤«ï ­¥£® ­¥ ¤®áâ㯭ë,
; â.ª. ¬­®£® ®âªàëâëå ä ©«®¢
;
; char dup2(FD fp1, FD fp2) -- MISIX only
;
;dup2_::ld a,(_os_ver_##)
; cp 2
; ret nz
; ld h,1
; ld c,3Eh
; push ix
; call 5
; pop ix
; ret
;
; ENDMODULE
MODULE seek
;
; "io.h"
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ­¨§ª®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ãáâ ­ ¢«¨¢ ¥â 㪠§ â¥«ì ¢ ä ©«¥ ­  ­®¢®¥ ¬¥áâ® à á¯®«®¦¥­¨ï,
; ª®â®à®¥ ®¯à¥¤¥«ï¥âáï ª ª ᬥ饭¨¥ offset. ’¨¯ ¯¥à¥¬¥é¥­¨ï ®¯à¥¤¥«ï¥âáï
;  à£ã¬¥­â®¬ type. ‘«¥¤ãîé ï ®¯¥à æ¨ï ¢ ä ©«¥ ¢ë¯®«­ï¥âáï ­  ­®¢®¬ ¬¥áâ¥
; à á¯®«®¦¥­¨ï 㪠§ â¥«ï. „¨ ¯ §®­ ¯¥à¥¬¥é¥­¨ï 㪠§ â¥«ï ­¥ ¬®¦¥â ¡ëâì
; ¡®«ìè¥ 65534. …᫨ ­ã¦­® ¯¥à¥¬¥áâ¨âì 㪠§ â¥«ì ­  ¡®«ì襥 §­ ç¥­¨¥,
; ­¥®¡å®¤¨¬® ¨á¯®«ì§®¢ âì äã­ªæ¨î lseek.
; €à£ã¬¥­â type ¬®¦¥â ¡ëâì ®¤­®© ¨§ á«¥¤ãîé¨å ª®­áâ ­â, ®¯à¥¤¥«¥­­ëå ¢
; "io.h":
;
; SEEK_SET ®â ­ ç «  ä ©« 
; SEEK_CUR ®â ⥪ã饩 ¯®§¨æ¨¨ 㪠§ â¥«ï ¢ ä ©«¥
; SEEK_END ®â ª®­æ  ä ©« 
;
; ”ã­ªæ¨ï ¢®§¢à é ¥â §­ ç¥­¨¥ ­®¢®£® ¯®«®¦¥­¨ï 㪠§ â¥«ï.
; ਠ®è¨¡ª¥ ¢®§¢à é ¥âáï -1 ¨ errno ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
; “áâ ­®¢ª  㪠§ â¥«ï §  ¯à¥¤¥« ¬¨ ä ©« , ®è¨¡ª¨ ­¥ ¢ë§ë¢ ¥â.
; „«ï ãáâனáâ¢, ­¥ ¯à¨á¯®á®¡«¥­­ëå ª ¯®¨áªã (â ª¨å ª ª â¥à¬¨­ «ë
; ¨ ¯à¨­â¥àë), ¢®§¢à é ¥¬®¥ §­ ç¥­¨¥ -1.
;
; uint seek(FD fd, uint offset, int type)
; uint seek(FD fd, uint offset, char type)
;
seek_::
bit 7,l ; std... devices ?
jr nz,@1 ; yes
push ix
ld a,l
ld hl,0
push de
pop ix
ld b,c
ld c,15h
rst 10h
push ix
pop hl
pop ix
ret nc
ld (errno_##),a
@1: ld hl,-1
ret
ENDMODULE
MODULE tell
;
; "io.h"
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ­¨§ª®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ¢®§¢à é ¥â ⥪ãéãî ¯®§¨æ¨î 㪠§ â¥«ï ¢ ä ©«¥.
; ®§¨æ¨ï ¢ëà ¦ ¥âáï ª ª ç¨á«® ¡ ©â®¢ ®â ­ ç «  ä ©« .
; ‡­ ç¥­¨¥ ¢®§¢à é ¥¬®£® 㪠§ â¥«ï ­¥ ¬®¦¥â ¡ëâì ¡®«ìè¥ 65534. …᫨
; ­ã¦­® ¯®«ãç¨âì ¡®«ì襥 §­ ç¥­¨¥, ­¥®¡å®¤¨¬® ¨á¯®«ì§®¢ âì äã­ªæ¨î
; ltell.
; ਠ®è¨¡ª¥ ¢®§¢à é ¥âáï -1 ¨ errno ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
; „«ï ãáâனáâ¢, ­¥ ¯à¨á¯®á®¡«¥­­ëå ª ¯®¨áªã (â ª¨å ª ª â¥à¬¨­ «ë
; ¨ ¯à¨­â¥àë), ¢®§¢à é ¥¬®¥ §­ ç¥­¨¥ -1.
;
; uint tell(FD fd)
;
tell_::
bit 7,l ; std... devices ?
jr nz,@1 ; yes
push ix
ld a,l
ld hl,0
push hl
pop ix
ld b,1
ld c,15h
rst 10h
push ix
pop hl
pop ix
ret nc
ld (errno_##),a
@1: ld hl,-1
ret
ENDMODULE
MODULE lseek
;
; "io.h"
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ­¨§ª®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ãáâ ­ ¢«¨¢ ¥â 㪠§ â¥«ì ¢ ä ©«¥ ­  ­®¢®¥ ¬¥áâ® à á¯®«®¦¥­¨ï,
; ®¯à¥¤¥«ï¥¬®¥  à£ã¬¥­â ¬¨ high ¨ low, ᮮ⢥âá⢥­­® áâ àè ï ¨ ¬« ¤-
; è ï ç áâì 32-å ¡¨â­®£® §­ ç¥­¨ï ¯¥à¥¬¥é¥­¨ï.
; ’¨¯ ¯¥à¥¬¥é¥­¨ï ®¯à¥¤¥«ï¥âáï  à£ã¬¥­â®¬ type. ‘«¥¤ãîé ï ®¯¥à æ¨ï ¢
; ä ©«¥ ¢ë¯®«­ï¥âáï ­  ­®¢®¬ ¬¥á⥠à á¯®«®¦¥­¨ï 㪠§ â¥«ï.
; €à£ã¬¥­â type ¬®¦¥â ¡ëâì ®¤­®© ¨§ á«¥¤ãîé¨å ª®­áâ ­â, ®¯à¥¤¥«¥­­ëå
; ¢ "io.h":
;
; SEEK_SET ®â ­ ç «  ä ©« 
; SEEK_CUR ®â ⥪ã饩 ¯®§¨æ¨¨ 㪠§ â¥«ï ¢ ä ©«¥
; SEEK_END ®â ª®­æ  ä ©« 
;
; ”ã­ªæ¨ï ¢®§¢à é ¥â áâàãªâãàã f_point, ®¯à¥¤¥«¥­­ãî ¢ "types.h"
; ਠ®è¨¡ª¥ ¢®§¢à é ¥âáï -1 ¨ errno ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
; “áâ ­®¢ª  㪠§ â¥«ï §  ¯à¥¤¥« ¬¨ ä ©« , ®è¨¡ª¨ ­¥ ¢ë§ë¢ ¥â.
; „«ï ãáâனáâ¢, ­¥ ¯à¨á¯®á®¡«¥­­ëå ª ¯®¨áªã (â ª¨å ª ª â¥à¬¨­ «ë
; ¨ ¯à¨­â¥àë), ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1.
;
; Usage:
;
; static f_point *p; // ¨«¨ "f_point *p" ¢­¥ ä㭪樨
;
; p = lseek(FD fd, p->high, p->low, type);
; printf("value: %X %X\n", p->high, p->low);
;
;
; struct fpoint *lseek(FD fd, uint high, uint low, int type)
; struct fpoint *lseek(FD fd, uint high, uint low, char type)
;
lseek_::
bit 7,l ; std... devices ?
jr nz,@1 ; yes
ld a,l ; descriptor
push ix
push bc
pop ix ; low
ld hl,4
add hl,sp
ld b,(hl) ; type
ex de,hl ; hl=high
ld c,15h
rst 10h
ld (high),hl
ld (low),ix
ld hl,low
pop ix
ret nc
ld (errno_##),a
@1: ld hl,-1
ret
low: dw 0
high: dw 0
ENDMODULE
MODULE ltell
;
; "io.h"
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ­¨§ª®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ¯®«ãç ¥â ⥪ãéãî ¯®§¨æ¨î 㪠§ â¥«ï ¢ ä ©«¥.
; ®§¨æ¨ï ¢ëà ¦ ¥âáï ª ª ç¨á«® ¡ ©â®¢ ®â ­ ç «  ä ©« .
; ”ã­ªæ¨ï ¢®§¢à é ¥â áâàãªâãàã f_point, ®¯à¥¤¥«¥­­ãî ¢ "types.h"
; ਠ®è¨¡ª¥ ¢®§¢à é ¥âáï -1 ¨ errno ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
; „«ï ãáâனáâ¢, ­¥ ¯à¨á¯®á®¡«¥­­ëå ª ¯®¨áªã (â ª¨å ª ª â¥à¬¨­ «ë
; ¨ ¯à¨­â¥àë), ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1.
;
; Usage:
;
; static f_point *p; // ¨«¨ "f_point *p" ¢­¥ ä㭪樨
;
; p = ltell(FD fd);
; printf("value: %X %X\n", p->high, p->low);
;
;
; struct fpoint *ltell(FD fd)
;
ltell_::
bit 7,l ; std... devices ?
jr nz,@1 ; yes
push ix
ld a,l
ld hl,0
push hl
pop ix
ld bc,0115h
rst 10h
ld (high),hl
ld (low),ix
ld hl,low
pop ix
ret nc
ld (errno_##),a
@1: ld hl,-1
ret
low: dw 0
high: dw 0
ENDMODULE
MODULE ioctl
;
; "io.h"
;---------------------------------------------------------------------
; ”ã­ªæ¨ï ­¨§ª®-ã஢­¥¢®£® ¢¢®¤ /¢ë¢®¤ 
;---------------------------------------------------------------------
;
; int ioctl(FD fd, int cmd[,*argdx, argcx]) -- MS-DOS
;
; ”ã­ªæ¨ï ¯à¥¤­ §­ ç¥­  ¤«ï ã¯à ¢«¥­¨ï ãáâனá⢠¢¢®¤ /¢ë¢®¤  ¨«¨ ä ©«®¢.
; ˆá¯®«ì§ã¥âáï á¨á⥬­ë© ¢ë§®¢ 0å44 MS-DOS.  à ¬¥âà cmd 㪠§ë¢ ¥â
; ®¯¥à æ¨î ¤«ï ãáâனá⢠:
;
; ------+------------------------------------------------------
; cmd | ޝ¥à æ¨ï
; ------+------------------------------------------------------
; 0 | ®«ãç¨âì ¨­ä®à¬ æ¨î ®¡ ãáâனá⢥. (rst 08h, 58h)
; 1 | “áâ ­®¢¨âì ¨­ä®à¬ æ¨î ®¡ ãáâனá⢥. (rst 08h, 59h)
; 2 | à®ç¨â âì argcx 1 ¡ ©â ¯®  ¤à¥áã, 㪠§ ­­®¬ã ¢ argdx.
; 3 | ‡ ¯¨á âì argcx ¡ ©â ¯®  ¤à¥áã, 㪠§ ­­®¬ã ¢ argdx.
; 4 | €­ «®£¨ç­® 2, ⮫쪮 handle ¨­â¥à¯à¥â¨àã¥âáï ª ª
; | ­®¬¥à ãáâனá⢠ (0=⥪ã騩, 1=A ¨ â.¤.).
; 5 | €­ «®£¨ç­® 3, ⮫쪮 handle ¨­â¥à¯à¥â¨àã¥âáï
; | ª ª ­®¬¥à ãáâனá⢠ (0=⥪ã騩, 1=A ¨ â.¤.).
; 6 | ®«ãç¨âì áâ âãá ¢¢®¤ .
; 7 | ®«ãç¨âì áâ âãá ¢ë¢®¤ .
; 8 | Test removability; DOS 3.x only.
; 11 | Set sharing conflict retry count; DOS 3.x only.
; ------+------------------------------------------------------
;
; ‘¤¥« âì ¢®§¢à é¥­¨¥ 㪠§ â¥«ï ­  ®¡éãî áâàãªâãàã ... ª®­âà®«ï ¤¥¢ ©á /ä ©« .
; ਠ®è¨¡ª¥, äã­ªæ¨ï ¢®§¢à é ¥â -1.
;
; int ioctl(FD fd, char func, int arg)
; ;char ioctla(FD fd, char func, int arg) -- DOS2 only
;
;ioctla_::
ioctl_::
ret
push ix
ld a,e ; func
ld e,c ; de=arg
ld d,b
ld b,l ; FD fd ­®¬¥à ¤¥áªà¨¯â®à 
ld c,4Bh
call 5
pop ix
ex de,hl ; ¢¥à­ãâì hl = .. ?
ret
ENDMODULE