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>
1672 lines
38 KiB
NASM
1672 lines
38 KiB
NASM
; ‚ _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ଠâ¥
|
||
; ¨ oo ¤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ଠ⥠¨ oo ¤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 ¨ oo ¥ ¤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 ¨ oo ¥ ¤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
|