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>
This commit is contained in:
2026-06-03 16:13:21 +03:00
parent f542608b3f
commit c71e249a4e
404 changed files with 75155 additions and 58 deletions
+452
View File
@@ -0,0 +1,452 @@
; ”㭪樨 ¯à®¢¥à¥­ë.
;
; ”㭪樨 _getscon, _getcon (­ã¦­ë ?), putdec (¢ë¢®¤ ç¨á«  ¢ ¤¥áïâ¨ç­®¬
; ä®à¬ â¥ ­  íªà ­) § ª®¬¬¥­â à¨­ë.
;
;
; ‚室ï騥 ä㭪樨:
;
; putch
; getch
; getche
; cputs
; clrscr
; home
; gotoxy
; kbhit
; cgets
; inp
; outp
;
MODULE putch
;
; "conio.h"
; ”ã­ªæ¨ï ¢ë¢®¤¨â ᨬ¢®« ¯àאַ ­  íªà ­.
;
; in: a = ᨬ¢®«
; out: ­¥â
;
; void putch(char *c)
;
putch_::
cp 0Ah
jr nz,cputc
call cputc
ld a,0Dh
cputc: ;push ix
ld c,5Bh
rst 10h
;pop ix
ret
ENDMODULE
MODULE getch
;
; "conio.h"
; ”ã­ªæ¨ï ç¨â ¥â ᨬ¢®« á ª« ¢¨ âãàë
; ¡¥§ ®â®¡à ¦¥­¨ï ­  íªà ­¥.
;
; in: ­¥â
; out: a = ¯à®ç¨â ­­ë© ᨬ¢®«
;
; char getch()
;
getch_::
;push ix
ld c,30h
rst 10h
;pop ix
ret
ENDMODULE
MODULE getche
;
; "conio.h"
; ”ã­ªæ¨ï ç¨â ¥â ᨬ¢®« á ª« ¢¨ âãàë á ®â®¡à ¦¥­¨¥¬ ­  íªà ­¥.
; ਠ­ ¦ â¨¨ ­  Ctrl+Z ¨«¨ Ctrl+C, ¢ë¤ ¥â §­ ç¥­¨¥ -1.
;
; in: ­¥â
; out: a = ¯à®ç¨â ­­ë© ᨬ¢®«
;
; char getche()
;
getche_::
@1: ;push ix
ld c,32h
rst 10h
ld a,e
;pop ix
bit 7,d
jr z,@3 ; normal input
bit 5,b
jr z,@3 ; not Ctrl+..
ld a,d
cp 0AAh ; Ctrl+Z (d = 7 bit "1")
jr z,@2
cp 0ACh ; Ctrl+C
jr nz,@1
@2: ld a,-1 ; end of input
ret
@3: cp 0Dh
ret nz
push af
ld a,0Ah
call putch_##
pop af
ret
ENDMODULE
MODULE cputs
;
; "conio.h"
; ”ã­ªæ¨ï ¢ë¢®¤¨â áâப㠯àאַ ­  íªà ­.
; ‘âப  ¤®«¦­  ®ª ­ç¨¢ âìáï ­ã«¥¬.
;
; in: hl =  ¤à¥á áâப¨
; out: ­¥â
;
; void cputs(char *str)
;
cputs_::
ld a,(hl)
or a
ret z
call putch_##
inc hl
jp cputs_
ENDMODULE
MODULE clrscr
;
; "conio.h"
; Žç¨é¥­¨¥ íªà ­ .
;
; in: ­¥â
; out: ­¥â
;
; void clrscr()
;
clrscr_::
ld de,0 ; «¥¢ë© ¢¥àå. 㣮«
ld hl,2050h ; Y/X à §¬¥àë ®ª­ 
ld bc,0756h ; b= âਡãâ ä®­ 
ld a," " ; ᨬ¢®« § ¯®«­¨â¥«ì
rst 10h
ret
ENDMODULE
MODULE home
;
; "conio.h"
; Šãàá®à ¢ «¥¢ë© ¢¥àå­¨© 㣮«.
;
; in: ­¥â
; out: ­¥â
;
; void home()
;
home_::
ld de,0 ; Y/X position cursor
ld c,52h
rst 10h
ret
ENDMODULE
MODULE gotoxy
;
; "conio.h"
; “áâ ­®¢¨âì ªãàá®à ­  X,Y ¯®§¨æ¨î.
;
; in: l,e = X,Y ª®®à¤¨­ âë
; out: ­¥â
;
; void gotoxy(int x, int y)
;
gotoxy_::
ld d,e ; Y ¯®«®¦.
ld e,l ; X ¯®«®¦.
dec d
dec e
ld c,52h
rst 10h
ret
ENDMODULE
MODULE kbhit
;
; "conio.h"
; ”ã­ªæ¨ï ¯à®¢¥àï¥â ­ ¦ â¨¥ ª« ¢¨è¨ ­  ª« ¢¨ âãà¥.
; ‚®§¢à é ¥â BOOL.
;
; in: ­¥â
; out: a=true - ª« ¢¨è  ­ ¦ â 
; a=false - ª« ¢¨è  ­¥ ­ ¦ â 
;
; BOOL kbhit()
;
kbhit_::
;push ix
ld c,33h
rst 10h
;pop ix
or a
ret z ; false
ld a,1 ; true
ret
ENDMODULE
MODULE cgets
;
; "conio.h"
; ”ã­ªæ¨ï ç¨â ¥â áâபã ᨬ¢®«®¢ ¯àאַ á ª®­á®«¨, § ¯®¬¨­ ¥â áâப㠨 ¥¥
; ¤«¨­ã ¢  à£ã¬¥­â¥ str. €à£ã¬¥­â str ¤®«¦¥­ ¡ëâì 㪠§ â¥«¥¬ ­  ¬ áᨢ
; ᨬ¢®«®¢. ¥à¢ë© í«¥¬¥­â ¬ áᨢ  - str[0] ¤®«¦¥­ ᮤ¥à¦ âì ¬ ªá¨¬ «ì­ãî
; ¤«¨­ã (¢ ᨬ¢®« å) ç¨â ¥¬®© áâப¨. Œ áᨢ ¤®«¦¥­ ¡ëâì ¤®áâ â®ç­® ¡®«ì訬,
; çâ®¡ë ¢¬¥áâ¨âì áâப㠨 § ª«îç¨â¥«ì­ë© ­ã«ì. ”ã­ªæ¨ï ¯à®¤®«¦ ¥â áç¨â뢠âì
; ᨬ¢®«ë, ¯®ª  ­¥ ¡ã¤¥â ¯à®ç¨â ­ ª®¤ ­®¢®© áâப¨ (0x0D) ¨«¨ § ¤ ­­®¥ ª®«¨-
; ç¥á⢮ ᨬ¢®«®¢. ਠí⮬, ª®¤ ­®¢®© áâப¨ § ¬¥­ï¥âáï ­  ­ã«ì. ‘âப  § ¯®-
; ¬¨­ ¥âáï á str[2] í«¥¬¥­â  ¬ áᨢ . ‚® ¢â®à®¬ í«¥¬¥­â¥ ¬ áᨢ  str[1] § ¯®-
; ¬¨­ ¥âáï ¤¥©áâ¢¨â¥«ì­ ï ¤«¨­  áâப¨.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ­ ç «® áâப¨, ­ å®¤ï饩áï ¢ str[2].
; ‚ á«ãç ¥ ®è¨¡ª¨, ¢®§¢à é ¥¬®¥ §­ ç¥­¨¥ ­¥ ®¯à¥¤¥«¥­®.
;
; char *cgets(*str)
;
cgets_::
;push ix ; for _gets_
ld b,(hl) ; str[0] max len string
inc hl
call __gets_##
inc hl
ret
ENDMODULE
; MODULE putdec
;
; "conio.h"
; ‚뢮¤¨â ç¨á«® ¢ ¤¥áïâ¨ç­®¬ ä®à¬ â¥ ­  íªà ­.
;
; in: hl = §­ ç¥­¨¥
; out: ­¥â
;
; void putdec(int num)
;
;putdec_::
; bit 7,h ; ¯à®¢¥à¨¬ §­ ª ç¨á« 
; jr z,@1
; ; ®âà¨æ. ç¨á«®
; call ?NEGHL##
; ld a,"-"
; call putch_## ; ¢ë¢®¤ ᨬ¢®«  ¯àאַ ­  íªà ­
;@1: ld de,0
; ld c,e
; ld b,16
;@2: add hl,hl
; ld a,e
; adc a,a
; daa
; ld e,a
; ld a,d
; adc a,a
; daa
; ld d,a
; rl c
; djnz @2
; ld hl,mystr ; ¡ãä¥à ç¨á« 
; call @fhexw
; ld e,c
; call @fhexb
; ld (hl),0
; ld hl,mystr
; ld bc,4
; ld a," "
; cpir
; jp cputs_## ; ¢ë¢¥á⨠áâப㠯àאַ ­  íªà ­
;
; de ¢ ¡ãä¥à
;@fhexw:push de
; ld e,d
; call @fhexb
; pop de
;@fhexb:ld a,e
; push af
; rrca
; rrca
; rrca
; rrca
; call @3
; pop af
;@3: and 0Fh
; add a,"0"
; cp "9"+1
; jr c,@4
; add a,7
;@4: ld (hl),a
; inc hl
; ret
;
; dseg
;mystr: ds 6 ; ¡ãä¥à ç¨á« 
;
; ENDMODULE
; MODULE getscon
;
; ®«ãç¨âì áâபã á ª®­á®«¨.
; Œ ªá. ¤«¨­  áâப¨ 128 ᨬ¢®«®¢, ¡¥§ ª®¤®¢ ª®­æ®¢ª¨ áâப¨.
; in: e = ?
; out: hl =  ¤à¥á ¡ãä¥à  áâப¨, ¥á«¨ Ok
; hl = NULL ¯à¨ ®è¨¡ª¥
;
;_getscon_::
; push ix
; ld a,e ; ¯¥à¥­¥á á
; ex de,hl
; ld hl,-130
; add hl,sp
; ld sp,hl
; ex de,hl ; hl= ¤à¥á ¡ãä¥à  ä㭪樨
; push hl
; ld (?23+1),hl
; dec a
; dec a
; ld hl,2
; add hl,sp
; ld (hl),a
; ld hl,2
; add hl,sp
; ex de,hl ; de= ¤à¥á ¡ãä¥à 
; ld c,0Ah ; ç⥭¨¥ ¢ ª®­á®«ì­ë© ¡ãä¥à
; call 5
; ld e,0Ah
; ld c,2 ; ¢ë¢¥á⨠ᨬ¢®« ­  §ªà ­
; call 5
; ld hl,4
; add hl,sp
; ld a,(hl)
; pop hl
; cp 1Ah ; ª®­¥æ ¢¢®¤  áâப¨
; jr nz,@5
; ld hl,0 ; hl=null
; jr @6
; ;
;@5: push hl
; ld hl,3
; add hl,sp
; ld c,(hl)
; ld hl,4
; add hl,sp
; ex de,hl
; pop hl
;@8: dec c
; ld a,c
; inc a
; jr z,@7
; ld a,(de)
; inc de
; ld (hl),a
; inc hl
; jr @8
; ;
;@7: ld (hl),0Ah
; inc hl
; xor a
; ld (hl),a
;?23: ld hl,0 ; hl,(?23)  ¤à¥á ¡ãä¥à  áâப¨
;@6: ex de,hl
; ld hl,130
; add hl,sp
; ld sp,hl
; ex de,hl
; pop ix
; ret
;
; ENDMODULE
; MODULE getcon
;
; ®«ãç¨âì ᨬ¢®« á ª®­á®«¨ á í宬.
; Ž¡à ¡ â뢠¥â ª®¤ 0Dh.
;
;_getcon_::
; push ix
; ld c,1 ; ¢¢®¤ ᨬ¢®«  á ª« ¢¨ âãàë
; call 5
; cp 0Dh
; ret nz
; ld a,0Ah
; push af
; ld c,2 ; ¢ë¢®¤ ᨬ¢®«  ­  íªà ­
; ld e,a
; call 5
; pop af
; pop ix
; ret
;
; ENDMODULE
MODULE inp
;
; "conio.h"
; ”ã­ªæ¨ï ç¨â ¥â 1 ¡ ©â ¨§ ¯®àâ  port.
; €à£ã¬¥­â port ¬®¦¥â ¡ëâì «î¡ë¬ ¡¥§§­ ª®¢ë¬
; æ¥«ë¬ ç¨á«®¬ ¢ ¤¨ ¯ §®­¥ ®â 0 ¤® 65535.
; ”ã­ªæ¨ï ¢®§¢à é ¥â ¯à®ç¨â ­­ë© ¡ ©â ¨§ port.
;
; char inp(uint port);
;
inp_::
ld c,l
ld b,h
in a,(c)
ret
ENDMODULE
MODULE outp
;
; "conio.h"
; ”ã­ªæ¨ï § ¯¨á뢠¥â §­ ç¥­¨¥ value ¢ ¯®àâ port.
; €à£ã¬¥­â port ¬®¦¥â ¡ëâì «î¡ë¬ ¡¥§§­ ª®¢ë¬ 楫ë¬
; ç¨á«®¬ ¢ ¤¨ ¯ §®­¥ ®â 0 ¤® 65535. €à£ã¬¥­â value
; ¬®¦¥â ¡ëâì «î¡ë¬ æ¥«ë¬ ç¨á«®¬ ¢ ¤¨ ¯ §®­¥ ®â 0
; ¤® 255.
; ”ã­ªæ¨ï ¢®§¢à é ¥â § ¯¨á뢠¥¬ë© ¡ ©â.
;
; char outp(uint port, char value);
;
outp_::
ld c,l
ld b,h
ld a,e
out (c),a
ret
ENDMODULE
+357
View File
@@ -0,0 +1,357 @@
; ‚室ï騥 ä㭪樨:
;
; tolower
; toupper
; isdigit
; isupper
; islower
; isascii
; isalnum
; isxdigit
; isspace
; iscntrl
; ispunct
; isalpha
; isgraph
; isprint
;
MODULE xtcty
;
; Table for ctype functs
; 255 bytes
@ctype::
db 1,1,1,1,1,1,1,1,1,3,3,3,3,3,1,1
db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
db 2,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
db 20,20,20,20,20,20,20,20,20,20,8,8,8,8,8,8
db 8,48,48,48,48,48,48,32,32,32,32,32,32,32,32,32
db 32,3,32,32,32,32,32,32,32,32,32,8,8,8,8,8
db 8,80,80,80,80,80,80,64,64,64,64,64,64,64,64,64
db 64,64,64,64,64,64,64,64,64,64,64,8,8,8,8,1
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
ENDMODULE
MODULE tolower
;
; "ctype.h"
; ८¡à §ã¥â ¯à®¯¨á­®© ᨬ¢®« ¢ áâà®ç­ë©.
; in: a = ᨬ¢®«
; out a = a..z ᨬ¢®«
;
; char tolower(char ch)
;
tolower_::
cp "A"
ret c
cp "Z"+1
ret nc
add a,20h
ret
ENDMODULE
MODULE toupper
;
; "ctype.h"
; ८¡à §ã¥â áâà®ç­ë© ᨬ¢®« ¢ ¯à®¯¨á­®©.
; in: a = ᨬ¢®«
; out a = A..Z ᨬ¢®«
;
; char toupper(char ch)
;
toupper_::
cp "a"
ret c
cp "z"+1
ret nc
sub 20h
ret
ENDMODULE
MODULE isdigit
;
; "ctype.h"
; ஢¥àª  ᨬ¢®«  ­  æ¨äàã.
; in: a = ᨬ¢®«
; out: true - æ¨äà 
; false - ­¥ æ¨äà 
;
; BOOL isdigit(char ch)
;
isdigit_::
cp "0"
jr c,@1
cp "9"+1
jr nc,@1
ld a,1 ; true
ret
@1: xor a ; false
ret
ENDMODULE
MODULE isupper
;
; "ctype.h"
; ஢¥àª  ­  ¯à®¯¨á­®© ᨬ¢®«
; in: a = ᨬ¢®«
; out: true - ¯à®¯¨á­®©
; false - ­¥ ¯à®¯¨á­®©
;
; BOOL isupper(char ch)
;
isupper_::
cp "A"
jr c,@1
cp "Z"+1
jr nc,@1
ld a,1 ; true
ret
@1: xor a ; false
ret
ENDMODULE
MODULE islower
;
; "ctype.h"
; ஢¥àª  ­  áâà®ç­ë© ᨬ¢®«
; in: a = ᨬ¢®«
; out: true - áâà®ç­ë©
; false - ­¥ áâà®ç­ë©
;
; BOOL islower(char ch)
;
islower_::
cp "a"
jr c,@1
cp "z"+1
jr nc,@1
ld a,1 ; true
ret
@1: xor a ; false
ret
ENDMODULE
MODULE isascii
;
; "ctype.h"
; ஢¥àª  ᨬ¢®«  ­  ASCII ¯à¨­ ¤«¥¦­®áâì
; in: a = ᨬ¢®«
; out: true - ascii-ᨬ¢®«
; false - ­¥ ascii-ᨬ¢®«
;
; BOOL isascii(char ch)
;
isascii_::
cp 0Dh
ret z
cp 0Ah
ret z
cp " "
jr c,@1
cp "~"+1
ret c ; true
@1: xor a ; false
ret
ENDMODULE
MODULE isalnum
;
; "ctype.h"
; ஢¥àï¥â ᨬ¢®« ­  ¯à¨­ ¤«¥¦­®áâì ª  «ä ¢¨â­®-æ¨ä஢®¬ã
; ⨯ã (A..Z, a..z, 0..9)
; in: a = ᨬ¢®«
; out: true -  «ä ¢¨â­®-æ¨ä஢®© ᨬ¢®«
; false - ­¥â
;
; BOOL isalnum(char ch)
;
isalnum_::
ld l,a
ld h,0
ld de,@ctype##
add hl,de
ld a,4+32+64
and (hl)
ret
ENDMODULE
MODULE isxdigit
;
; "ctype.h"
; ஢¥àï¥â ­  è¥áâ­ ¤æ â¥à¨ç­ë¥ æ¨äàë (0..9, A..F, a..f)
; in: a = ᨬ¢®«
; out: true - hex-æ¨äà 
; false - ­¥â
;
; BOOL isxdigit(char c)
;
isxdigit_::
ld l,a
ld h,0
ld de,@ctype##
add hl,de
ld a,10h
and (hl)
ret
ENDMODULE
MODULE isspace
;
; "ctype.h"
; ஢¥àï¥â ­  ¯à®¡¥«ì­ë¥ ᨬ¢®«ë (0x09, 0x0D ¨«¨ 0x20)
; in: a = ᨬ¢®«
; out: true - ¯à®¡¥«ì­ë© ᨬ¢®«
; false - ­¥â
;
; BOOL isspace(char ch)
;
isspace_::
ld l,a
ld h,0
ld de,@ctype##
add hl,de
ld a,2
and (hl)
ret
ENDMODULE
MODULE iscntrl
;
; "ctype.h"
; ஢¥àï¥â ­  ã¯à ¢«ïî騩 ᨬ¢®« (0å00..0å1F ¨«¨ 0x7F)
; in: a = ᨬ¢®«
; out: true - ã¯à ¢«ïî騩 ᨬ¢®«
; false - ­¥â
;
; BOOL iscntl(char ch)
;
iscntrl_::
ld l,a
ld h,0
ld de,@ctype##
add hl,de
ld a,1
and (hl)
ret
ENDMODULE
MODULE ispunct
;
; "ctype.h"
; ஢¥àï¥â ­  §­ ª¨ ¯ã­ªâã æ¨¨
; in: a = ᨬ¢®«
; out: true - §­ ª ¯ã­ªâã æ¨¨
; false - ­¥â
;
; BOOL ispunct(char ch)
;
ispunct_::
ld l,a
ld h,0
ld de,@ctype##
add hl,de
ld a,8
and (hl)
ret
ENDMODULE
MODULE isalpha
;
; "ctype.h"
; ஢¥àï¥â ­  ¯à¨­ ¤«¥¦­®áâì ª ¡ãª¢ ¬ (A..Z, a..z)
; in: a = ᨬ¢®«
; out: true - ¡ãª¢ 
; false - ­¥ ¡ãª¢ 
;
; BOOL isalpha(char ch)
;
isalpha_::
ld l,a
ld h,0
ld de,@ctype##
add hl,de
ld a,32+64
and (hl)
ret
ENDMODULE
MODULE isgraph
;
; "ctype.h"
; ஢¥àï¥â ­  ¯à¨­ ¤«¥¦­®áâì ª ¯¥ç â ¥¬ë¬ ᨬ¢®« ¬,
; ¨áª«îç ï ᨬ¢®« ¯à®¡¥«  (0å21..0å7E)
; in: a = ᨬ¢®«
; out: true - ¯¥ç â ¥¬ë© ᨬ¢®«
; false - ­¥â
;
; BOOL isgraph(char ch)
;
isgraph_::
ld l,a
ld h,0
ld de,@ctype##
add hl,de
ld a,0FCh
and (hl)
ret
ENDMODULE
MODULE isprint
;
; "ctype.h"
; ஢¥àï¥â ­  ¯à¨­ ¤«¥¦­®áâì ª ¯¥ç â ¥¬ë¬
; ᨬ¢®« ¬ (0å20..0å7E).
; in: a = ᨬ¢®«
; out: true - ¯¥ç â ¥¬ë© ᨬ¢®«
; false - ­¥â
;
; BOOL isprint(char ch)
;
isprint_::
ld l,a
ld h,0
ld de,@ctype##
add hl,de
ld a,0FEh
and (hl)
ret
ENDMODULE
+618
View File
@@ -0,0 +1,618 @@
; ”㭪樨 ¯à®¢¥à¥­ë.
;
; ‚室ï騥 ä㭪樨:
;
; bdos
; bdosh
; enable
; disable
; _setargv
; setdisk
; getdisk
; absread
; abswrite
; setdate
; getdate
; settime
; gettime
; intdos
; ffirst (findfirst)
; fnext (findnext)
;
MODULE bdos
;
; "dos.h"
; ‚믮«­ï¥â á¨á⥬­ë© ¢ë§®¢ „Ž‘, ­®¬¥à ª®â®à®£® ®¯à¥¤¥«¥­ ¢ n.
; €à£ã¬¥­âë doshl ¨ dosa à §¬¥é îâáï ᮮ⢥âá⢥­­® ¢ ॣ¨áâà å HL ¨ A.
; ”ã­ªæ¨ï ¢ë¯®«­ï¥â ª®¬ ­¤ã RST 10h ¤«ï ®áãé¥á⢫¥­¨ï á¨á⥬­®£® ¢ë§®¢ .
; ”ã­ªæ¨ï ¬®¦¥â ¡ëâì ¨á¯®«ì§®¢ ­  ⮫쪮 ¤«ï á¨á⥬­ëå „Ž‘-¢ë§®¢®¢, ª®â®àë¥
; ­¥ ¯à¨­¨¬ îâ  à£ã¬¥­â®¢ ¨«¨ ¯à¨­¨¬ îâ ¨å ⮫쪮 ¢ ॣ¨áâà å HL ¨ A.
; ”ã­ªæ¨ï ¢®§¢à é ¥â §­ ç¥­¨¥ ॣ¨áâà  A, § ¯®«­¥­­®£® á¨á⥬­ë¬ ¢ë§®¢®¬.
; ਬ¥ç ­¨¥: âã äã­ªæ¨î ­¥«ì§ï ¨á¯®«ì§®¢ âì ¤«ï ®áãé¥á⢫¥­¨ï á¨á⥬­ëå
; ¢ë§®¢®¢, ¢ ª®â®àëå ®è¨¡ª¨ 㪠§ë¢ îâáï ¯®á।á⢮¬ ãáâ ­®¢ª¨ ä« £  ¯¥à¥­®á .
; ’.ª. ‘¨-¯à®£à ¬¬ë ­¥ ¨¬¥îâ ¤®áâ㯠 ª í⮬ã ä« £ã, áâ âãá ¢®§¢à é ¥¬®£®
; §­ ç¥­¨ï ®¯à¥¤¥«¨âì ­¥¢®§¬®¦­®. ‚ í⮬ á«ãç ¥ ­¥®¡å®¤¨¬® ¨á¯®«ì§®¢ âì
; äã­ªæ¨î intdos.
; ”ã­ªæ¨ï bdosh ®â«¨ç ¥âáï ®â bdos ⮫쪮 ⥬, çâ® ¢®§¢à é ¥¬®¥ §­ ç¥­¨¥
; ᮤ¥à¦¨âáï ¢ ॣ. ¯ à¥ HL.
; Ž¡¥ ä㭪樨 ¬®¦­® ¨á¯®«ì§®¢ âì ¤«ï „Ž‘-¢ë§®¢®¢: 02h,0Ah,0Bh,0Eh,11h,1Bh
; 1Ch,1Dh,1Eh,5Ch ä㭪権.
;
; in: a = ­®¬¥à ä㭪樨
; de = ¯¥à¥¤ ¢ ¥¬ë¥ ¯ à ¬¥âàë
; c =  âਡãâ
; out: a = §­ ç¥­¨¥ á¨á⥬­®£® ¢ë§®¢ 
;
; char bdos(char n, int doshl, char dosa)
; int bdosh(char n, int doshl, char dosa)
;
bdosh_::
bdos_::
ld b,c
ld c,a ; c = n
ld a,b ; a = dosa
ex de,hl ; hl = doshl
push ix
rst 10h
pop ix
ld l,a
ld h,0
ret
ENDMODULE
MODULE diei
;
; "dos.h"
; Enable and disable interrupts.
;
; in: ­¥â
; out: ­¥â
;
; void enable()
; void disable()
;
enable_::
ei
ret
disable_::
di
ret
ENDMODULE
MODULE setarg
;-----------------------------------------------------------
; ¢­ãâ७­ïï: ¢ë§ë¢ ¥âáï ¨§ xmain ¤«ï ä㭪樨 _main_
;-----------------------------------------------------------
; ‘®§¤ âì ᯨ᮪  à£ã¬¥­â®¢, § ¤ ­­ëå ¢ ª®¬ ­¤­®© áâப¥.
; ‚®§¢à é ¥âáï ç¨á«®  à£ã¬¥­â®¢. ‘¯¨á®ª à áç¨â ­ ­   ¤à¥á 
; ¬ ªá¨¬ã¬ 30  à£ã¬¥­â®¢.
;
; in: hl =  ¤à¥á ª®¬. áâப¨
; out: hl = ç¨á«®  à£ã¬¥­â®¢ (argc)
;
; int _setargv(*string)
;
_setargv::
ld c,(hl) ; ¤«¨­  ª®¬. áâப¨
inc hl
ld b,0
ld e,l ; ­ ç «® ª®¬. áâப¨
ld d,h
add hl,bc
ld (hl),b ; ­ã«ì ¢ ª®­¥æ ª®¬. áâப¨
;  ¤à¥á ¨¬¥­¨ ¯à®£à ¬¬ë
push de
inc hl
inc hl
ld b,122
@6: ld a,(hl)
inc hl
or a
jr z,@8
cp "\"
jr nz,@7
ld e,l
ld d,h
@7: djnz @6
@8: ld (_argv_),de ;  ¤à¥á ¨¬¥­¨ ¯à®£à ¬¬ë
pop de
;
ld hl,_argv_+2 ; ᯨ᮪  ¤à¥á®¢  à£ã¬¥­â®¢
ld b,1 ; b=1 argc!
@1: ld a,(de)
inc de
cp " "
jr z,@1
cp 9 ; Tab
jr z,@1
or a
jr z,@2 ; ª®­¥æ áâப¨
dec de
ld (hl),e ;  ¤à¥á  à£ã¬¥­â  ¢ ᯨ᮪
inc hl
ld (hl),d
inc hl
inc b ; ++argc
@3: ld a,(de)
cp " "
jr z,@4
cp 9 ; Tab
jr z,@4
or a
jr z,@2 ; ª®­¥æ áâப¨
inc de
cp '"'
jr z,@5
jr @3
;
@4: xor a
ld (de),a ; ­ã«ì ¢ ª®­¥æ  à£ã¬¥­â  ¢ ª®¬. áâப¥
inc de
jr @1
;
@5: ld a,(de)
cp '"'
jr z,@3
or a
jr z,@2
inc de
jr @5
;
; ª®­¥æ  à£ã¬¥­â®¢
@2: ld (hl),0 ; null
inc hl
ld (hl),0
ld l,b ; hl=ç¨á«®  à£ã¬¥­â®¢
ld h,0
ret
dseg
_argv_::
ds 32*2 ; ᯨ᮪  ¤à¥á®¢  à£ã¬¥­â®¢
ENDMODULE
MODULE setdisk
;
; "dos.h"
; “áâ ­®¢¨âì ⥪ã騩 ¤¨áª
;
; in: a = ­®¬¥à ¤¨áª 
; out: ­¥â
;
; void setdisk(char diskno)
;
setdisk_::
push ix
ld c,1
rst 10h
pop ix
ret
ENDMODULE
MODULE absread
;
; "dos.h"
; €¡á®«îâ­®¥ ç⥭¨¥ á ¤¨áª .
; ”ã­ªæ¨ï áç¨â뢠¥â ¢ ¡ãä¥à ®¤¨­ ¨«¨ ­¥áª®«ìª® ᥪâ®à®¢
; á § ¤ ­­ë¬ ­ ç «ì­ë¬ ®â­®á¨â¥«ì­ë¬ ­®¬¥à®¬. ‘¥ªâ®àë
; ­ã¬¥àãîâáï á 0 ®â ­ ç «  «®£¨ç¥áª®£® (­¥ 䨧¨ç¥áª®£®!)
; ¤¨áª . Š ¯à¨¬¥àã, § £àã§®ç­ë© ᥪâ®à ¤ ­­®£® «®£¨ç¥áª®£®
; ¤¨áª  ¨¬¥¥â ­®¬¥à 0, ¤ «¥¥ ¯¥à¢ ï ª®¯¨ï FAT ­ ç¨­ ¥âáï
; á ᥪâ®à  ­®¬¥à 1 ¨ â.¤.
; ”ã­ªæ¨ï ¢®§¢à é îâ 0 ¯à¨ ãᯥ譮¬ § ¢¥à襭¨¨ ®¯¥à æ¨¨.
; ‚ á«ãç ¥ ®è¨¡ª¨ ¢®§¢à é ¥âáï -1 (0FFh) ¨ errno ᮤ¥à¦¨â
; ­®¬¥à ®è¨¡ª¨.
;
; in: a = ­®¬¥à ¤¨áª 
; de = «®£. ­®¬¥à ᥪâ®à 
; bc = ª®«-¢® ç¨â ¥¬ëå ᥪâ®à®¢
; á⥪ =  ¤à¥á ¡ãä¥à 
; out: a = 0 - Ok
; a = -1 - Error
;
; char absread(char disk, int nsect, char count, char buffer)
;
; disk - ­®¬¥à ¤¨áª 
; nsect - ­®¬¥à ­ ç «ì­®£® ᥪâ®à 
; count - ª®«-¢® ç¨â ¥¬ëå ᥪâ®à®¢
; buffer -  ¤à¥á ¡ãä¥à  ¯®¤ áç¨â뢠¥¬ë¥ ¤ ­­ë¥
;
absread_::
ld (@1+2),ix
ld lx,e ; ix=nsect
ld hx,d
pop hl
pop de ; de= ¤à¥á buffer
push de
push hl
ld hl,0 ; áâ.à §àï¤ ­®¬¥à  ᥪâ®à 
ld b,c ; count
ld c,55h
rst 08h
jr c,@2
xor a ; Ok
@1: ld ix,0
ret
@2: ld a,25 ; EREAD (read error)
ld (errno_##),a
ld a,-1
jr @1
ENDMODULE
MODULE abswrit
;
; "dos.h"
; €¡á®«îâ­ ï § ¯¨áì ­  ¤¨áª.
; ”ã­ªæ¨ï § ¯¨á뢠¥â ¨§ ¡ãä¥à  ®¤¨­ ¨«¨ ­¥áª®«ìª® ᥪâ®à®¢
; á § ¤ ­­ë¬ ­ ç «ì­ë¬ ®â­®á¨â¥«ì­ë¬ ­®¬¥à®¬. ‘¥ªâ®àë
; ­ã¬¥àãîâáï á 0 ®â ­ ç «  «®£¨ç¥áª®£® (­¥ 䨧¨ç¥áª®£®!)
; ¤¨áª . Š ¯à¨¬¥àã, § £àã§®ç­ë© ᥪâ®à ¤ ­­®£® «®£¨ç¥áª®£®
; ¤¨áª  ¨¬¥¥â ­®¬¥à 0, ¤ «¥¥ ¯¥à¢ ï ª®¯¨ï FAT ­ ç¨­ ¥âáï
; á ᥪâ®à  ­®¬¥à 1 ¨ â.¤.
; ”ã­ªæ¨ï ¢®§¢à é îâ 0 ¯à¨ ãᯥ譮¬ § ¢¥à襭¨¨ ®¯¥à æ¨¨.
; ‚ á«ãç ¥ ®è¨¡ª¨ ¢®§¢à é ¥âáï -1 (0FFh) ¨ errno ᮤ¥à¦¨â
; ­®¬¥à ®è¨¡ª¨.
;
; in: a = ­®¬¥à ¤¨áª 
; de = «®£. ­®¬¥à ᥪâ®à 
; bc = ª®«-¢® § ¯¨á뢠¥¬ëå ᥪâ®à®¢
; out: a = 0 - Ok
; a = -1 - Error
;
; char abswrite(char disk, int nsect, char count, char buffer)
;
; disk - ­®¬¥à ¤¨áª 
; nsect - ­®¬¥à ­ ç «ì­®£® ᥪâ®à 
; count - ª®«-¢® § ¯¨á뢠¥¬ëå ᥪâ®à®¢
; buffer -  ¤à¥á ¡ãä¥à  ¤ ­­ëå
;
abswrite_::
ld (@1+2),ix
ld lx,e ; ix=nsect
ld hx,d
pop hl
pop de ; de= ¤à¥á buffer
push de
push hl
ld hl,0 ; áâ.à §àï¤ ­®¬¥à  ᥪâ®à 
ld b,c ; count
ld c,56h
rst 08h
jr c,@2
xor a ; Ok
@1: ld ix,0
ret
@2: ld a,26 ; EWRITE (write error)
ld (errno_##),a
ld a,-1
jr @1
ENDMODULE
MODULE getdisk
;
; "dos.h"
; “§­ âì ­®¬¥à ¤¨áª 
;
; in: ­¥â
; out: a = ­®¬¥à ¤¨áª 
;
; char getdisk()
;
getdisk_::
;push ix
ld c,2
rst 10h
;pop ix
ret
ENDMODULE
MODULE getdate
;
; "dos.h"
; “§­ âì á¨á⥬­ãî ¤ âã ¨ § ¯®«­¨âì áâàãªâãàã date.
;
; in: hl =  ¤à¥á áâàãªâãàë ¤ âë
; out: ­¥â
;
; void getdate(struct date *date)
;
getdate_::
push ix
push hl ;  ¤à¥á áâàãªâãàë ¤ âë
ld c,21h
rst 10h
pop hl
push ix
pop bc
ld (hl),c ;+0 £®¤
inc hl ;
ld (hl),b ;+1
inc hl
ld (hl),d ;+2 ¤¥­ì
inc hl
ld (hl),e ;+3 ¬¥áïæ
pop ix
ret
ENDMODULE
MODULE setdate
;
; "dos.h"
; “áâ ­®¢¨âì á¨á⥬­ãî ¤ âã.
;
; in: hl =  ¤à¥á áâàãªâãàë ¤ âë
; out: ­¥â
;
; void setdate(struct date *date)
;
setdate_::
push ix
ld c,(hl) ;+0 £®¤
inc hl ;
ld b,(hl) ;+1
inc hl
ld d,(hl) ;+2 ¤¥­ì
inc hl
ld e,(hl) ;+3 ¬¥áïæ
push bc
pop ix
ld c,22h
rst 10h
pop ix
ret
ENDMODULE
MODULE gettime
;
; "dos.h"
; “§­ âì á¨á⥬­®¥ ¢à¥¬ï ¨ § ¯®«­¨âì áâàãªâãàã time.
;
; in: hl =  ¤à¥á áâàãªâãàë ¢à¥¬¥­¨
; out: ­¥â
;
; void gettime(struct time *time)
;
gettime_::
push ix
push hl
ld c,21h
rst 10h
ex de,hl
pop hl
ld (hl),e ;+0 ¬¨­ãâë
inc hl
ld (hl),d ;+1 ç áë
inc hl
inc hl ; ®¡®©â¨ ï祩ªã "ti_hund"
ld (hl),b ;+3 ᥪ㭤ë
pop ix
ret
ENDMODULE
MODULE settime
;
; "dos.h"
; “áâ ­®¢¨âì á¨á⥬­®¥ ¢à¥¬ï.
;
; in: hl =  ¤à¥á áâàãªâãàë ¢à¥¬¥­¨
; out: ­¥â
;
; void settime(struct time *time)
;
settime_::
push ix
ld e,(hl) ;+0 ¬¨­ãâë
inc hl
ld d,(hl) ;+1 ç áë
inc hl
inc hl ; ®¡®©â¨ ï祩ªã "ti_hund"
ld b,(hl) ;+3 ᥪ㭤ë
ex de,hl
ld c,22h
rst 10h
pop ix
ret
ENDMODULE
MODULE intdos
;
; "dos.h"
; ”ã­ªæ¨ï intdos ®áãé¥á⢫ï¥â ¢ë¯®«­¥­¨¥ á¨á⥬­®£® „Ž‘-¢ë§®¢  (á ¢®§¢à â®¬
; ä« £®¢ ãá«®¢¨©), ª®â®àë© ®¯à¥¤¥«¥­ §­ ç¥­¨ï¬¨ ॣ¨áâ஢, ®¡ê¥­­ëå ¢
; union REGS *ri ¨ ¢®§¢à é ¥â १ã«ìâ â á¨á⥬­®£® ¢ë§®¢  ¢ union REGS *ro.
; ’¨¯ ®¡ê¥¤¨­¥­¨ï union REGS ®¡ê¥­ ¢ "dos.h".
; „«ï ®áãé¥á⢫¥­¨ï á¨á⥬­®£® ¢ë§®¢  intdos ¢ë¯®«­ï¥â ª®¬ ­¤ã RST 10h.
; ¥à¥¤ ¢ë¯®«­¥­¨¥¬ ª®¬ ­¤ë äã­ªæ¨ï ª®¯¨àã¥â ᮤ¥à¦¨¬®¥ union REGS *ri ¢
; ᮮ⢥âáâ¢ãî騥 ॣ¨áâàë. ®á«¥ ¢ë¯®«­¥­¨ï ª®¬ ­¤ë RST, äã­ªæ¨ï intdos
; ª®¯¨àã¥â §­ ç¥­¨ï ⥪ãé¨å ॣ¨áâ஢ ¢ union REGS *ro. Ž­  â ª¦¥ ª®¯¨àã¥â
; ¢®§¢à é ¥¬ë© ä« £ ãá«®¢¨© á¨áâ¥¬ë ¢ ¯®«¥ flag, à §¬¥é¥­­®¥ ¢ union REGS *ro.
; …᫨ íâ® ¯®«¥ ï¥âáï ­¥­ã«¥¢ë¬, ä« £ 㪠§ë¢ ¥â ­  ãá«®¢¨¥ ®è¨¡ª¨.
;
; union REGS *ri - §­ ç¥­¨ï ॣ¨áâ஢ ¯à¨ ¢ë§®¢¥
; union REGS *ro - §­ ç¥­¨ï ॣ¨áâ஢ ¯à¨ ¢®§¢à â¥
;
; in: hl =  ¤à¥á union REGS *ri
; de =  ¤à¥á union REGS *ro
; out: ­¥â
;
; void intdos(union REGS *ri, union REGS *ro)
;
intdos_::
push ix
push de ; de=REGS *ro
inc hl
ld a,(hl) ;+1 a
inc hl
ld c,(hl) ;+2
inc hl
ld b,(hl) ;+3
push bc
inc hl
ld e,(hl) ;+4
inc hl
ld d,(hl) ;+5
push de
inc hl
ld e,(hl) ;+6 l
inc hl
ld d,(hl) ;+7 h
inc hl
ld c,(hl) ;+8 xl
inc hl
ld b,(hl) ;+9 xh
push bc
pop ix
inc hl
ld c,(hl) ;+10 yl
inc hl
ld b,(hl) ;+11 yh
push bc
pop iy
ex de,hl ; hl
pop de
pop bc
rst 10h ; á¨á⥬­ë© „Ž‘-¢ë§®¢
ex (sp),hl ; hl=REGS *ro
push bc
push af
pop bc
ld (hl),c ;+0 flag
inc hl
ld (hl),b ;+1 a
pop bc
inc hl
ld (hl),c ;+2
inc hl
ld (hl),b ;+3
inc hl
ld (hl),e ;+4
inc hl
ld (hl),d ;+5
inc hl
pop de
ld (hl),e ;+6 l
inc hl
ld (hl),d ;+7 h
push ix
pop bc
inc hl
ld (hl),c ;+8 xl
inc hl
ld (hl),b ;+9 xh
push iy
pop bc
inc hl
ld (hl),c ;+10 yl
inc hl
ld (hl),b ;+11 yh
pop ix
ret
ENDMODULE
MODULE ffirst
;
; "dos.h"
; ”ã­ªæ¨ï ffirst ¯à®¨§¢®¤¨â ¯®¨áª § ¤ ­­®£® ¢ pathname ä ©«  ¨§ £à㯯ë
; ä ©«®¢. €à£ã¬¥­â pathname ¬®¦¥â ᮤ¥à¦ âì ¨¬ï ¤¨áª  ¨ ª â «®£ ¤«ï ¯®¨áª .
; ‚ ¨¬¥­¨ ä ©«  ¤®¯ã᪠îâáï £«®¡ «ì­ë¥ ᨬ¢®«ë ? ¨ *. ˆ¬ï ­ ©¤¥­­®£® ä ©« 
; ­ å®¤¨âáï ¢ ä®à¬ â¥ DOS "filename.ext".
; ”ã­ªæ¨ï _ffirst ®â«¨ç ¥âáï ®â ä㭪樨 ffirst ⥬, çâ® ¢®§¢à é ¥â ¨¬ï
; ­ ©¤¥­­®£® ä ©«  ¢ ä®à¬ â¥ "FilenameExt".
; …᫨ ä ©« ®¡­ à㦥­, äã­ªæ¨ï § ¯®«­ï¥â áâàãªâãàã (®¯à¥¤¥«¥­­ãî ¢ "dos.h"),
; ­  ª®â®àãî 㪠§ë¢ ¥â  à£ã¬¥­â ffblk.
; €à£ã¬¥­â attr ᮤ¥à¦¨â  âਡãâ(ë) ä ©«®¢ ¤«ï ¯®¨áª  ¨ ¬®¦¥â ¯à¨­¨¬ âì
; á«¥¤ãî騥 §­ ç¥­¨ï, ®¯à¥¤¥«¥­­ë¥ ¢ "dos.h":
;
; FA_NORMAL Ž¡ëç­ë© ä ©«
; FA_RDONLY ’®«ìª® ç⥭¨¥
; FA_HIDDEN ‘ªàëâë© ä ©«
; FA_SYSTEM ‘¨á⥬­ë© ä ©«
; FA_LABEL Œ¥âª  ⮬ 
; FA_DIREC Š â «®£
; FA_ARCH €à娢­ë©
;
; Œo¦­o § ¤ ¢ âì ªà â­ë¥ §­ ç¥­¨ï  âਡã⮢, ¨á¯o«ì§ãï ᨬ¢o« "|"
; (®¯¥à â®à OR).
; ”ã­ªæ¨ï ¢®§¢à é ¥â 0 ¯à¨ ãᯥ譮¬ § ¢¥à襭¨¨ ¯®¨áª .
; …᫨ ä ©« ­¥ ­ ©¤¥­ ¨«¨ ¢ ¨¬¥­¨ ä ©«  ¢áâà¥â¨« áì ª ª ï-«¨¡® ®è¨¡ª ,
; ¢®§¢à é ¥âáï -1 ¨ errno ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
;
; char ffirst(char *pathname, FIND *ffblk, char attr)
;
_ffirst_::
ld b,0 ; format "FilenameExt"
jr @1
ffirst_::
ld b,1 ; format "filename.ext"
@1: ld a,c ; attr
ld c,19h ; f_first
push ix
rst 10h
pop ix
ld (errno_##),a
ld a,0
ret nc
dec a
ret
ENDMODULE
MODULE fnext
;
; "dos.h"
; ”ã­ªæ¨ï ¯à®¨§¢®¤¨â ¯®¨áª á«¥¤ãî饣® ᮢ¯ ¤ î饣® ä ©« .
; ਠª ¦¤®¬ ¢ë§®¢¥, äã­ªæ¨ï ¢®§¢à é ¥â ®¤­® ¨¬ï ä ©« , ¤® â¥å ¯®à, ¯®ª 
; ¯ à ¬¥âàë ä ©«  ¡ã¤ãâ ¯®¤å®¤¨âì ¯®¤ § ¤ ­­ë¥ ¯ à ¬¥âàë ¯®¨áª .
; €à£ã¬¥­â ffblk ¤®«¦¥­ 㪠§ë¢ âì ­  áâàãªâãàã (®¯à¥¤¥«¥­­ãî ¢ "dos.h"),
; ¯à¥¤¢ à¨â¥«ì­® § ¯®«­¥­­ãî ä㭪樥© ffirst.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 0 ¯à¨ ãᯥ譮¬ § ¢¥à襭¨¨ ¯®¨áª .
; …᫨ ä ©« ­¥ ­ ©¤¥­ ¨«¨ ¢ ¨¬¥­¨ ä ©«  ¢áâà¥â¨« áì ª ª ï-«¨¡® ®è¨¡ª ,
; ¢®§¢à é ¥âáï -1 ¨ errno ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
;
; char fnext(FIND *ffblk)
;
fnext_::
ex de,hl
ld c,1Ah ; f_next
push ix
rst 10h
pop ix
ld (errno_##),a
ld a,0
ret nc
dec a
ret
ENDMODULE
File diff suppressed because it is too large Load Diff
+660
View File
@@ -0,0 +1,660 @@
; ‚室ï騥 ä㭪樨:
;
; sbrk (¢ë¤¥«. ¡«®ª  ¯ ¬ï⨠¬¥¦¤ã 㪠§. ᢮¡. ¯ ¬ï⨠"$MEMRY" ¨ á⥪®¬)
; brk
; free
; malloc
; calloc
; realoc
;
MODULE sbrk
;
; "malloc.h"
; ‚뤥«ï¥â ¡«®ª ¤«¨­®© n ¢ ¯à¥¤¥«ïå ¬¥¦¤ã 㪠§ â¥«¥¬
; ᢮¡®¤­®© ¯ ¬ï⨠¨ 㪠§ â¥«¥¬ á⥪ .
; ‡­ ç¥­¨¥ n ¬®¦¥â ¡ëâì ®âà¨æ â¥«ì­ë¬, ⮣¤  ª®«¨ç¥á⢮
; § å¢ ç¥­­®© ¯ ¬ï⨠㬥­ìè ¥âáï ­  n ¡ ©â®¢.
; ਠãᯥ譮¬ ¢ë¤¥«¥­¨¨ ¢®§¢à é ¥â 㪠§ â¥«ì ­  ¢ë¤¥-
; «¥­­ë© ¡«®ª.
; …᫨ ¯ ¬ï⨠­¥¤®áâ â®ç­®, ¢®§¢à é ¥â -1 (0FFFFh).
;
; in: hl = à §¬¥à ¡«®ª 
; out: hl = 㪠§ â¥«ì ­  ¢ë¤¥«. ¡«®ª, ¥á«¨ Ok.
; hl = -1 ¯à¨ ­¥¤®áâ âª¥ ¯ ¬ïâ¨.
;
; char *sbrk(int n)
;
sbrk_::
ld de,($MEMRY) ;  ¤à¥á 㪠§ â¥«ï ᢮¡. ¯ ¬ïâ¨
add hl,de
jr c,sbrkerr ; ¯¥à¥¯®«­. ç¨á« 
call brk_
ld a,h
and l
inc a
ret z ; ®è¨¡ª 
ex de,hl ; hl=­ ç «® ¢ë¤¥«. ¡«®ª 
ret
; Set free memory pointer.
; int brk(int n)
brk_::
push hl
inc h
inc h ; + 512 bytes reserved
or a
sbc hl,sp ; ¢ë¤¥«¨âì ¯ ¬ïâì
pop hl
jr nc,sbrkerr ; ¬ «® ¯ ¬ïâ¨
ld ($MEMRY),hl ; ­®¢®¥ ¯®«®¦. 㪠§ â¥«ï ᢮¡. ¯ ¬ïâ¨
ret
;
sbrkerr:ld hl,-1 ; EOF ®è¨¡ª 
ret
; 㪠§ â¥«ì ­ ç «  ᢮¡®¤­®© ¯ ¬ï⨠(¤® á⥪ )
$MEMRY::
dw 0 ; § ¯®«­ï¥âáï «¨­ª¥à®¬!
ENDMODULE
MODULE free
;
; "malloc.h", "stdlib.h"
; ”ã­ªæ¨ï ®á¢®¡®¦¤ ¥â ¡«®ª ¯ ¬ïâ¨.
; €à£ã¬¥­â ptr 㪠§ë¢ ¥â ­  à ­¥¥ § å¢ ç¥­­ë© ¡«®ª
; ¯ ¬ï⨠¯®á।á⢮¬ ¢ë§®¢  malloc, calloc, realloc.
; ‚®§¢à é ¥¬®£® §­ ç¥­¨ï ­¥â.
;
; void free(char *ptr)
;
free_::
dec hl
dec hl
dec hl
dec hl ; ­  ­ ç «® § £®«®¢ª  ¡«®ª 
ld c,l
ld b,h
ld hl,(_alloc_)
ld (?49+1),hl
ex de,hl
@22: ld a,e
sub c
ld a,d
sbc a,b
jr nc,@19
ld l,e
ld h,d
ld a,c
sub (hl)
inc hl
ld a,b
sbc a,(hl)
jr c,@20
@19: ld l,e
ld h,d
ld a,e
sub (hl)
inc hl
ld a,d
sbc a,(hl)
jr c,@21
ld a,e
sub c
ld a,d
sbc a,b
jr c,@20
ld l,e
ld h,d
ld a,c
sub (hl)
inc hl
ld a,b
sbc a,(hl)
jr c,@20
@21: ex de,hl
ld e,(hl)
inc hl
ld d,(hl)
ld (?49+1),de
jr @22
;
@20: ld l,e
ld h,d
ld (?48+1),bc
ld c,(hl)
inc hl
ld b,(hl)
push bc
?48: ld bc,0 ; á®åà. §­ ç¥­¨¥
ld hl,2
add hl,bc
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
add hl,hl ;1+1=2
add hl,hl ;2+2=4
add hl,bc
ld (?48+1),bc
pop bc
push de
ld a,l
cp c
jr nz,$+4
ld a,h
cp b
jr nz,@23
ld hl,(?48+1)
push hl
inc hl
inc hl
ld e,(hl)
inc hl
ld d,(hl)
push hl
?49: ld hl,0 ; á®åà. §­ ç¥­¨¥
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
inc hl
inc hl
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
add hl,de
ex de,hl
pop hl
ld (hl),d
dec hl
ld (hl),e
ld hl,(?49+1)
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld c,(hl)
inc hl
ld b,(hl)
pop hl
ld (hl),c
inc hl
ld (hl),b
jr @24
;
@23: ex de,hl
ld c,(hl)
inc hl
ld b,(hl)
ld hl,(?48+1)
ld (hl),c
inc hl
ld (hl),b
@24: pop de
ld hl,2
add hl,de
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
add hl,hl
add hl,hl
add hl,de
push de
ld bc,(?48+1)
ld a,l
cp c
jr nz,$+4
ld a,h
cp b
jr nz,@25
ld hl,2
add hl,de
push de
ld e,(hl)
inc hl
ld d,(hl)
push hl
ld hl,2
add hl,bc
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
add hl,de
ex de,hl
pop hl
ld (hl),d
dec hl
ld (hl),e
ld l,c
ld h,b
ld c,(hl)
inc hl
ld b,(hl)
pop de
ex de,hl
ld (hl),c
inc hl
ld (hl),b
jr @26
;
@25: ex de,hl
ld (hl),c
inc hl
ld (hl),b
@26: pop hl
ld (_alloc_),hl
ret
; ï祩ª   ¤à¥á  ¢ë¤¥«. ¡«®ª  ¯ ¬ïâ¨
_alloc_::
dw 0
dseg
; áâàãªâãà  § £®«®¢ª  ¡«®ª 
_base_::
dw 0 ; addr next free block
dw 0 ; size of this free block
ENDMODULE
MODULE malloc
;
; "malloc.h", "stdlib.h"
; ”ã­ªæ¨ï § å¢ â뢠¥â ¡«®ª ¯ ¬ï⨠ࠧ¬¥à®¬ ¢ size ¡ ©â®¢.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ¢ë¤¥«¥­­ë© ¡«®ª ¯ ¬ïâ¨.
; …᫨ ᢮¡®¤­®© ¯ ¬ï⨠­¥¤®áâ â®ç­®, ¢®§¢à é ¥âáï NULL.
;
; char *malloc(int size)
;
malloc_::
inc hl
inc hl
inc hl
srl h ; hl/4
rr l
srl h
rr l
inc hl
ld (units+1),hl ; à §¬¥à ­®¢®£® ¡«®ª 
ld hl,(_alloc_##)
ld a,l
or h
jr nz,@0
ld (_base_##+2),hl ; á¡à. à §¬¥à ¢ë¤¥«. ¡«®ª 
ld hl,_base_## ; áâàãªâãà  § £®«®¢ª  ¡«®ª 
ld (_alloc_##),hl ;  ¤à¥á ¢ë¤¥«. ¡«®ª 
ld (_base_##),hl ;  ¤à¥á á«¥¤. § £®«®¢ª 
;
@0: ld (prev+1),hl
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld (tp+1),hl ; hl=_base_
@3: ld hl,(tp+1)
ld c,(hl)
inc hl
ld b,(hl)
ld a,l
cp c
jp nz,@1
ld a,h
cp b
jp z,@1
inc hl
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
add hl,hl ; *4
add hl,hl ;
ex de,hl
ld hl,(tp+1)
add hl,de
ld a,l
cp c
jp nz,@1
ld a,h
cp b
jp nz,@1
ld hl,(tp+1)
ld e,l;
ld d,h;
ld c,(hl)
inc hl
ld b,(hl)
ld hl,(_alloc_##)
ld a,l
cp c
jr nz,@2
ld a,h
cp b
jr nz,@2
;ld hl,(tp+1)
ld l,e;
ld h,d;
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld (_alloc_##),hl
@2: ;ld hl,(tp+1)
ex de,hl;
ld c,l;
ld b,h;
inc hl
inc hl
ld e,(hl)
inc hl
ld d,(hl)
push hl
;ld hl,(tp+1)
ld l,c;
ld h,b;
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
inc hl
inc hl
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
add hl,de
ex de,hl
pop hl
ld (hl),d
dec hl
ld (hl),e
;ld hl,(tp+1)
ld l,c;
ld h,b;
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
;ld c,(hl)
;inc hl
;ld b,(hl)
;ld hl,(tp+1)
;ld (hl),c
;inc hl
;ld (hl),b
ld a,(hl);
ld (bc),a;
inc hl;
inc bc;
ld a,(hl);
ld (bc),a;
jp @3
;
@1: ld hl,(tp+1)
inc hl
inc hl
ld c,(hl)
inc hl
ld b,(hl)
units: ld hl,0 ; à §¬¥à ­®¢®£® ¡«®ª 
ld a,c
sub l
ld a,b
sbc a,h
jp c,@4
ld hl,(tp+1)
ld e,l;
ld d,h;
inc hl
inc hl
ld c,(hl)
inc hl
ld b,(hl)
ld hl,(units+1) ; à §¬¥à ­®¢®£® ¡«®ª 
ld a,c
cp l
jr nz,@5
ld a,b
cp h
jr nz,@5
;ld hl,(tp+1)
ex de,hl;
ld c,(hl)
inc hl
ld b,(hl)
prev: ld hl,0 ; á®åà. §­ ç¥­¨¥
ld (hl),c
inc hl
ld (hl),b
jp @6
;
@5: ;ld hl,(units+1) ; hl=(units+1) à §¬¥à ­®¢®£® ¡«®ª 
add hl,hl
add hl,hl
ex de,hl
;ld hl,(tp+1)
add hl,de
ld (_alloc_##),hl
ex de,hl
ld hl,(prev+1)
ld (hl),e
inc hl
ld (hl),d
ld hl,(tp+1)
ld c,(hl)
inc hl
ld b,(hl)
;ld hl,(_alloc_##)
ex de,hl;
ld (hl),c
inc hl
ld (hl),b
;ld hl,(tp+1)
;inc hl
ex de,hl;
inc hl
ld c,(hl)
inc hl
ld b,(hl)
;ld hl,(units+1) ; à §¬¥à ­®¢®£® ¡«®ª 
ld de,(units+1)
ld a,c
sub e ;l
ld c,a
ld a,b
sbc a,d ;h
ld b,a
ld hl,(_alloc_##)
inc hl
inc hl
ld (hl),c
inc hl
ld (hl),b
;ld de,(units+1) ; à §¬¥à ­®¢®£® ¡«®ª 
ld hl,(tp+1)
inc hl
inc hl
ld (hl),e
inc hl
ld (hl),d
@6: ld hl,(prev+1)
ld (_alloc_##),hl
tp: ld hl,0 ; á®åà. §­ ç¥­¨¥
ld (hl),0
inc hl
ld (hl),0
inc hl
inc hl
inc hl ; ¯¥à¥©â¨ ­  ¢ë¤¥«. ¡«®ª
ret
;
@4: ld de,(tp+1)
ld hl,(_alloc_##)
ld a,e
cp l
jr nz,@7
ld a,d
cp h
jr nz,@7
ld hl,512
call sbrk_##
ld (tp+1),hl
ld a,l
and h
inc a
jr nz,@8
inc hl ; NULL
ret
;
@8: ld (hl),0
inc hl
ld (hl),0
inc hl
ld (hl),128 ; 512/sizeof(FREE)
inc hl
ld (hl),0
inc hl
call free_##
ld hl,(_alloc_##)
ld (tp+1),hl
@7: ld hl,(tp+1)
ld (prev+1),hl
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld (tp+1),hl
jp @3
ENDMODULE
MODULE calloc
;
; "malloc.h", "stdlib.h"
; ”ã­ªæ¨ï § å¢ â뢠¥â ¯à®áâà ­á⢮ ¤«ï åà ­¥­¨ï ¬ áᨢ  ¨§ n í«¥¬¥­â®¢,
; ª ¦¤ë© à §¬¥à®¬ size ¡ ©â. Š ¦¤ë© í«¥¬¥­â ¨­¨æ¨ «¨§¨àã¥âáï ¢ 0.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  § å¢ ç¥­­®¥ ¯à®áâà ­á⢮.
; …᫨ ­¥¤®áâ â®ç­® ¯ ¬ïâ¨, ¢®§¢à é ¥âáï §­ ç¥­¨¥ NULL.
;
; char *calloc(int n, int size)
;
calloc_::
call ?MULHD## ; n * size = à §¬¥à ¢á¥£® ¬ áᨢ 
ld (@34+1),hl
call malloc_## ; ¢ë¤¥«¨âì ¯ ¬ïâì
ld a,l
or h
ret z ; ­¥¤®áâ â®ç­® ¯ ¬ï⨠(hl=NULL)
@34: ld bc,0 ; á®åà. à §¬¥à ¬ áᨢ 
ld (hl),0 ; ¡ ©â § ¯®«­¥­¨ï
push hl
ld d,h
ld e,l
inc de
dec bc
ldir
pop hl ; Ok
ret
ENDMODULE
MODULE realloc
;
; "malloc.h"
; ”ã­ªæ¨ï ¨§¬¥­ï¥â à §¬¥à à ­¥¥ ¢ë¤¥«¥­­®£® ¡«®ª  ¯ ¬ïâ¨.
; €à£ã¬¥­â ptr 㪠§ë¢ ¥â ­  ­ ç «® ¡«®ª . €à£ã¬¥­â size § ¤ ¥â ­®¢ë©
; à §¬¥à ¡«®ª  ¢ ¡ ©â å. ‘®¤¥à¦¨¬®¥ ¡«®ª  ­¥ ¨§¬¥­ï¥âáï.
; …᫨ size à ¢¥­ 0, ¡«®ª ®á¢®¡®¦¤ ¥âáï ¨ ¢®§¢à é ¥âáï NULL.
; …᫨ ptr à ¢¥­ NULL, â® ®â¢®¤¨âáï (¯® malloc) size ¡ ©â®¢ ¯ ¬ïâ¨
; ¨ ¢®§¢à é ¥âáï 㪠§ â¥«ì ­  íâ®â ¡«®ª.
; €à£ã¬¥­â ptr ¬®¦¥â 㪠§ë¢ âì ­  ¡«®ª, ª®â®àë© ¤®«¦¥­ ¡ëâì ®á¢®¡®¦¤¥­
; ¯à¥¦¤¥, 祬 ¯®á«¥¤ãî⠢맮¢ë malloc, calloc, realloc.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ¯¥à¥§ å¢ ç¥­­ë© ¡«®ª ¯ ¬ïâ¨.
; «®ª ¬®¦¥â ¡ëâì ¯¥à¥¤¢¨­ãâ, ¥á«¨ ¥£® à §¬¥àë ¨§¬¥­¥­ë, ¯®íâ®¬ã  à£ã-
; ¬¥­â ptr ¤«ï ä㭪樨 realloc ­¥ ®¡ï§ â¥«ì­® ¤®«¦¥­ ¡ëâì â ª¨¬ ¦¥,
; ª ª ¨ ¢®§¢à é ¥¬®¥ §­ ç¥­¨¥.
; ‚®§¢à é ¥âáï §­ ç¥­¨¥ NULL, ¥á«¨ ¯ ¬ï⨠­¥¤®áâ â®ç­® ¤«ï à áè¨à¥­¨ï
; ¡«®ª  ª § ¤ ­­®¬ã à §¬¥àã. ਠí⮬ ¯¥à¢®­ ç «ì­ë© ¡«®ª ®áâ ¥âáï
; ­¥¨§¬¥­­ë¬.
;
; char *realloc(*ptr, int size);
;
realloc_::
ld a,l
or h
jr nz,@0 ; *ptr != NULL
ex de,hl
jp malloc_##
;
@0: ld a,e
or d
jr nz,@1 ; size != 0
call free_##
ld hl,0 ; NULL
ret
;
@1: push hl ; *ptr
dec hl
ld a,(hl)
dec hl
ld l,(hl) ; hl=à §¬¥à ¡«®ª  ptr
ld h,a
add hl,hl ;
add hl,hl ; *4
dec hl
dec hl
dec hl
dec hl
ld (osize+1),hl
pop hl
push de ; size
push hl ; ptr
push de
call free_##
pop hl ; size
call malloc_##
ld (@3+1),hl ; ­®¢ë© ¡«®ª
pop de ; ptr
pop bc ; size
ld a,l
or h
jr z,@3 ; ®è¨¡ª 
; alloc != ptr
ld a,l
cp e
jr nz,osize
ld a,h
cp d
jr z,@3
osize: ld hl,0 ; á®åà. §­ ç¥­¨¥
; size > osize ?
ld a,l
sub c
ld a,h
sbc a,b
jr nc,@2 ; osize > size
ld c,l ; bc=osize
ld b,h
@2: ex de,hl ; hl = *ptr
ld de,(@3+1)
call movmem_## ; hl=from, de=to, bc=size
@3: ld hl,0 ; á®åà. 㪠§ â¥«ì ­  ­®¢ë© ¡«®ª
ret
ENDMODULE
+156
View File
@@ -0,0 +1,156 @@
; ‚室ï騥 ä㭪樨:
;
; movmem
; memset
; memcpy
; memmove
; memcmp
;
MODULE movmem
;
; "mem.h"
; ”ã­ªæ¨ï movmem ª®¯¨àã¥â len ¡ ©â ¨§ source ¢ destin.
; …᫨ ¨á室­ ï ¨ १ã«ìâ¨àãîé¨ï áâப  ¯¥à¥ªà뢠îâáï,
; ª®¯¨à®¢ ­¨¥ ¢á¥-à ¢­® ¯à®¨§¢®¤¨âáï ª®à४⭮.
;
; ”ã­ªæ¨ï setmem ãáâ ­ ¢«¨¢ ¥â ¯¥à¢ë¥ len ¡ ©â ¡«®ª  addr
; ¢ §­ ç¥­¨¥ value.
;
; void movmem(*source, *destin, len)
; void setmem(*addr, len, char value)
;
setmem_::
ld a,b
or c
ret z
ld (hl),e ; value
ld e,l
ld d,h
inc de
dec bc
movmem_::
ld a,b
or c
ret z
ldir
ret
ENDMODULE
MODULE memset
;
; "mem.h"
; ”ã­ªæ¨ï § ¯®«­ï¥â ¯¥à¢ë¥ count ¡ ©â ¡ãä¥à  dest ᨬ¢®«®¬ "c".
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ¡ãä¥à dest.
;
; void *memset(*dest, c, count)
;
memset_::
push hl
call setmem_##
pop hl ; ¢¥à­ãâì  ¤à¥á dest
ret
ENDMODULE
MODULE memcpy
;
; "mem.h"
; ”ã­ªæ¨ï ª®¯¨àã¥â count ¡ ©â®¢ ¨§ source ¢ dest.
; …᫨ ­¥ª®â®àë¥ ãç á⪨ source ¨ dest ¯¥à¥ªà뢠îâáï, äã­ªæ¨ï
; £ à ­â¨àã¥â, çâ® ¡ ©âë ¨§ ¯¥à¥ªà뢠¥¬®£® ãç á⪠, ¯à¨­ ¤«¥-
; ¦ é¨¥ source, ¡ã¤ãâ ᪮¯¨à®¢ ­ë ¯¥à¥¤ ¯¥à¥§ ¯¨áìî.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  dest.
;
; void *memcpy(*dest, *source, count)
;
memcpy_::
ld a,b
or c
ret z ; count = 0
push hl
ex de,hl
ldir
pop hl ; ¢¥à­ãâì  ¤à¥á dest
ret
ENDMODULE
MODULE memmove
;
; "mem.h"
; ”ã­ªæ¨ï ªo¯¨àãîâ count ¡ ©â®¢ ¨§ source ¢ dest.
; …᫨ ­¥ªoâoàë¥ o¡« á⨠¢ source ¨ dest ¯¥à¥ªà뢠îâáï, äã­ªæ¨ï
; £ à ­â¨àã¥â, çâo ¨áåo¤­ë¥ source ¡ ©â ¨§ ¯¥à¥ªà뢠î饩áï o¡« áâ¨
; ¡ã¤ãâ áªo¯¨ào¢ ­ë ¯¥à¥¤ ¯¥à¥¯¨á뢠­¨¥¬.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  dest.
;
; void *memmove(*dest, *source, count)
;
memmove_::
ld a,b
or c
ret z ; count = 0
push hl
ex de,hl
ld a,d
cp h
jr nz,@1
ld a,e
cp l
@1: jr nc,@2
ldir
pop hl
ret
@2: add hl,bc
ex de,hl
add hl,bc
ex de,hl
lddr
pop hl
ret
ENDMODULE
MODULE memcmp
;
; "mem.h"
; ”ã­ªæ¨ï ¯à®¨§¢®¤¨â ¯®á«¥¤®¢ â¥«ì­®¥ «¥ªá¨£à ä. áà ¢­¥­¨¥
; ¯¥à¢ëå count ¡ ©â®¢ ¨§ buf1 ¨ buf2, ¨ ¯à®¤®«¦ ¥â íâ®, ¯®ª 
; ®­¨ ᮢ¯ ¤ îâ, «¨¡® ¯®ª  ­¥ ¢ë¯®«­¨âáï § ¤ ­­®¥ ª®«¨ç¥á⢮
; áà ¢­¥­¨© count.
; ”ã­ªæ¨ï ¢®§¢à é ¥â §­ ç¥­¨¥, 㪠§ë¢ î饥 ­  ᮮ⭮襭¨¥
; íâ¨å ¡ãä¥à®¢:
; < 0 buf1 < buf2
; = 0 buf1 = buf2
; > 0 buf1 > buf2
;
; int memcmp(*buf1, *buf2, count)
;
memcmp_::
ld a,(de)
sub (hl)
jr nz,@1
inc hl
inc de
dec bc
ld a,b
or c
jp nz,memcmp_
ld h,a ; hl = 0
ld l,a
ret
@1: ld hl,1 ; hl = 1
ret nc
ld hl,-1 ; hl = -1
ret
ENDMODULE
+566
View File
@@ -0,0 +1,566 @@
; ‚室ï騥 ä㭪樨:
;
; ms_init (initMouse)
; ms_show (showMouse)
; ms_hide (hideMouse)
; ms_stat (getStatMouse)
; msgstat (getGStatMouse)
; ms_spos (setPosMouse)
; ms_ybnd (yLimMouse)
; ms_xbnd (xLimMouse)
; ms_scur (setCursMouse)
; ms_tcur (setTxtMouse)
; ms_gcur (getCursMouse)
; ms_gsen (getSensMouse)
; ms_ssen (setSensMouse)
; ms_hard (hardMouse)
; ms_vmod (vmodeMouse)
; ms_ref (refreshMouse)
;
MODULE msinit
;
; "mouse.h"
; Initialization the mouse driver.
; Returns 0 if mouse installed, -1 if not.
;
; char initMouse(void)
;
ms_init_::
ld c,0
rst 30h
ld a,0 ; Ok
ret nc
dec a ; error
ret
ENDMODULE
MODULE msshow
;
; "mouse.h"
; ”ã­ªæ¨ï ¢ë¢®¤¨â ­  íªà ­ ªãàá®à ¬ëè¨, ®âá«¥¦¨¢ ¥â
; ¢á¥ ¯¥à¥¬¥é¥­¨ï ªãàá®à  ¨ ¯¥à¥à¨á®¢ë¢ ¥â ¥£®.
;
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno
; ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
;
; char showMouse(void)
;
ms_show_::
ld c,1
rst 30h
ld (errno_##),a
ld a,0 ; Ok
ret nc
dec a ; error
ret
ENDMODULE
MODULE mshide
;
; "mouse.h"
; ”ã­ªæ¨ï áâ¨à ¥â ªãàá®à ¬ëè¨ á íªà ­ , ­® ¤à ©¢¥à ¯à®¤®«¦ ¥â
; ®âá«¥¦¨¢ ­¨¥ ¯¥à¥¬¥é¥­¨ï ¬ëè¨ ¨ ­ ¦ â¨¥ ­  ª­®¯ª¨.
;
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno
; ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
;
; char hideMouse(void)
;
ms_hide_::
ld c,2
rst 30h
ld (errno_##),a
ld a,0 ; Ok
ret nc
dec a ; error
ret
ENDMODULE
MODULE msstat
;
; "mouse.h"
; —⥭¨¥ á®áâ®ï­¨ï ¬ëè¨.
; ”ã­ªæ¨ï ¢®§¢à é ¥â ⥪ã騥 ⥪áâ®¢ë¥ ª®®à¤¨­ âë ªãàá®à  ¬ëè¨
; ¨ á®áâ®ï­¨¥ ¥¥ ª­®¯®ª.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  áâàãªâãàã MSSTAT, ®¯à¥¤¥«¥­­ãî
; ¢ "mouse.h".
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 (0FFFFh) ¨ errno ᮤ¥à¦¨â
; ­®¬¥à ®è¨¡ª¨.
;
; ¢ë室­ë¥ ¤ ­­ë¥:
; A - á®áâ®ï­¨¥ ª­®¯®ª
; 0 bit - «¥¢ ï
; 1 bit - ¯à ¢ ï
; HL - Y/X ⥪áâ. ª®®à¤¨­ âë
;
; MSSTAT *getStatMouse()
;
ms_stat_::
ld c,3 ; ¯®«ãç¨âì ª®®à¤. ¬ë誨
rst 30h
jr c,@1
ld (button),a
srl h
rr l
srl h
rr l
srl l
ld a,e ; Y ª®®à¤¨­ â  (0-255)
rra
rra
rra
and 1Fh
ld h,a ; hl = Y/X ª®®à¤. ¢ §­ ª®¬¥áâ å
ld (x),hl
ld hl,button ; Ok
ret
;
@1: ld (errno_##),a
ld hl,-1 ; error
ret
dseg
button: db 0
x: dw 0 ; Y/X ⥪áâ. ª®®à¤¨­ âë
ENDMODULE
MODULE msgstat
;
; "mouse.h"
; —⥭¨¥ á®áâ®ï­¨ï ¬ëè¨.
; ”ã­ªæ¨ï ¢®§¢à é ¥â ⥪ã騥 £à ä¨ç¥áª¨¥ ª®®à¤¨­ âë ªãàá®à  ¬ëè¨
; ¨ á®áâ®ï­¨¥ ¥¥ ª­®¯®ª.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  áâàãªâãàã MSGSTAT, ®¯à¥¤¥«¥­­ãî
; ¢ "mouse.h".
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 (0FFFFh) ¨ errno ᮤ¥à¦¨â
; ­®¬¥à ®è¨¡ª¨.
;
; ¢ë室­ë¥ ¤ ­­ë¥:
; A - á®áâ®ï­¨¥ ª­®¯®ª
; 0 bit - «¥¢ ï
; 1 bit - ¯à ¢ ï
; HL - x-ª®®à¤¨­ â 
; DE - y-ª®®à¤¨­ â 
;
; MSGSTAT *getGStatMouse()
;
msgstat_::
ld c,3
rst 30h
ld (button),a
ld (errno_##),a
ld (x),hl
ld (y),de
ld hl,button ; Ok
ret nc
ld hl,-1 ; error
ret
dseg
button: db 0
x: dw 0
y: dw 0
ENDMODULE
MODULE msspos
;
; "mouse.h"
; “áâ ­®¢ª  ⥪á⮢ëå ª®®à¤¨­ â ªãàá®à  ¬ëè¨.
; ”ã­ªæ¨ï ¯¥à¥¬¥é ¥â ªãàá®à ¬ëè¨ ¢ § ¤ ­­ë¥ ª®®à¤¨­ âë.
;
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno ᮤ¥à¦¨â
; ­®¬¥à ®è¨¡ª¨.
;
; ¢å®¤­ë¥ ¤ ­­ë¥:
; HL - ª®«®­ª 
; DE - áâப 
;
; char setPosMouse(int col, int line)
;
ms_spos_::
sla l ; *2
rl h
sla l
rl h ; hl = X pos
ld a,e
and 1Fh
rla
rla
rla
ld e,a ; de = Y pos
ld c,4
rst 30h
ld (errno_##),a
ld a,0 ; Ok
ret nc
dec a ; error
ret
ENDMODULE
MODULE mssgpos
;
; "mouse.h"
; “áâ ­®¢ª  £à ä¨ç¥áª¨å ª®®à¤¨­ â ªãàá®à  ¬ëè¨.
; ”ã­ªæ¨ï ¯¥à¥¬¥é ¥â ªãàá®à ¬ëè¨ ¢ § ¤ ­­ë¥ ª®®à¤¨­ âë.
;
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno ᮤ¥à¦¨â
; ­®¬¥à ®è¨¡ª¨.
;
; ¢å®¤­ë¥ ¤ ­­ë¥:
; HL - x-ª®®à¤¨­ â 
; DE - y-ª®®à¤¨­ â 
;
; char setGPosMouse(int x, int y)
;
mssgpos_::
ld c,4
rst 30h
ld (errno_##),a
ld a,0 ; Ok
ret nc
dec a ; error
ret
ENDMODULE
MODULE msybnd
;
; "mouse.h"
; ‡ ¤ ­¨¥ ¢¥à⨪ «ì­ëå £à ­¨æ ¯¥à¥¬¥é¥­¨ï ªãàá®à .
; ”ã­ªæ¨ï § ¤ ¥â ¢¥àå­îî ¬¨­¨¬ «ì­ãî ¨ ­¨¦­îî ¬ ªá¨¬ «ì­ãî ª®®à¤¨­ âë,
; ¢ ª®â®àëå ¬®¦¥â ¯¥à¥¬¥é âìáï ªãàá®à ¬ëè¨ ¯® ¢¥à⨪ «¨.
;
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
;
; ¢å®¤­ë¥ ¤ ­­ë¥:
; HL - y-¬¨­¨¬ «ì­ ï
; DE - y-¬ ªá¨¬ «ì­ ï
;
; char yLimMouse(int miny, int maxy)
;
ms_ybnd_::
ld c,7
rst 30h
ld (errno_##),a
ld a,0 ; Ok
ret nc
dec a ; error
ret
ENDMODULE
MODULE msxbnd
;
; "mouse.h"
; ‡ ¤ ­¨¥ £®à¨§®­â «ì­ëå £à ­¨æ ¯¥à¥¬¥é¥­¨ï ªãàá®à .
; ”ã­ªæ¨ï § ¤ ¥â «¥¢ãî ¬¨­¨¬ «ì­ãî ¨ ¯à ¢ãî ¬ ªá¨¬ «ì­ãî ª®®à¤¨­ âë,
; ¢ ª®â®àëå ¬®¦¥â ¯¥à¥¬¥é âìáï ªãàá®à ¬ëè¨ ¯® £®à¨§®­â «¨.
;
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
;
; ¢å®¤­ë¥ ¤ ­­ë¥:
; HL - x-¬¨­¨¬ «ì­ ï
; DE - x-¬ ªá¨¬ «ì­ ï
;
; char xLimMouse(uint minx, uint maxx)
;
ms_xbnd_::
ld c,8
rst 30h
ld (errno_##),a
ld a,0 ; Ok
ret nc
dec a ; error
ret
ENDMODULE
MODULE msscur
;
; "mouse.h"
; ‡ £à㧪  ¨§®¡à ¦¥­¨ï ªãàá®à  ¬ëè¨.
; ”ã­ªæ¨ï § £à㦠¥â ­®¢®¥ ¨§®¡à ¦¥­¨¥ ªãàá®à  ¬ëè¨ ¢ ¤à ©¢¥à
; ¨ § ¤ ¥â  ªâ¨¢­ãî â®çªã ¨§®¡à ¦¥­¨ï.
; ¥à¥¤ ¢ë§®¢®¬ ä㭪樨, ¤®«¦­  ¡ëâì § ¯®«­¥­  áâàãªâãà 
; MSCURS, ®¯à¥¤¥«¥­­ ï ¢ "mouse.h".
;
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno ᮤ¥à¦¨â ­®¬¥à
; ®è¨¡ª¨.
;
; ¢å®¤­ë¥ ¤ ­­ë¥:
; H - ¢ëá®â  ªãàá®à 
; L - è¨à¨­  ªãàá®à 
; D - Y  ªâ¨¢­ ï â®çª 
; E - X  ªâ¨¢­ ï â®çª 
; IX - ¨§®¡à ¦¥­¨¥ ªãàá®à 
;
; char setCursMouse(MSCURS *p)
;
ms_scur_::
push ix
ld c,(hl) ; width
inc hl
ld b,(hl) ; high
inc hl
ld e,(hl) ; xpoint
inc hl
ld d,(hl) ; ypoint
inc hl
ld a,(hl) ; *buffer
ld lx,a
inc hl
ld a,(hl)
ld hx,a
ld l,c
ld h,b
ld bc,9
rst 30h
pop ix
ld (errno_##),a
ld a,0 ; Ok
ret nc
dec a ; error
ret
ENDMODULE
MODULE mstcur
;
; "mouse.h"
; “áâ ­®¢ª  ªãàá®à  ¬ëè¨ ¢ ⥪á⮢®¬ ०¨¬¥.
; ”ã­ªæ¨ï ãáâ ­ ¢«¨¢ ¥â ᨬ¢®« ¨  âਡãâ ªãàá®à  ¬ëè¨
; ¤«ï ⥪á⮢®£® ०¨¬ .
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno ᮤ¥à¦¨â
; ­®¬¥à ®è¨¡ª¨.
;
; ¢å®¤­ë¥ ¤ ­­ë¥:
; E - XOR attribut mask
; D - AND attribut mask
; L - XOR simbol mask
; H - AND simbol mask
;
; char setTxtMouse(MSTXT *p)
;
ms_tcur_::
ld e,(hl) ; XOR attribut mask
inc hl
ld d,(hl) ; AND attribut mask
inc hl
ld a,(hl) ; XOR simbol mask
inc hl
ld h,(hl) ; AND simbol mask
ld l,a
ld bc,0Ah
rst 30h
ld (errno_##),a
ld a,0 ; Ok
ret nc
dec a ; error
ret
ENDMODULE
MODULE msgcur
;
; "mouse.h"
; ®«ã祭¨¥ ¨§®¡à ¦¥­¨ï ªãàá®à  ¨§ ¤à ©¢¥à  ¬ëè¨.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  § ¯®«­¥­­ãî áâàãªâãàã MSCURS,
; ®¯à¥¤¥«¥­­ãî ¢ "mouse.h".
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 (0FFFFh) ¨ errno ᮤ¥à¦¨â
; ­®¬¥à ®è¨¡ª¨.
;
; ¢å®¤­ë¥ ¤ ­­ë¥:
; IX - ¡ãä¥à ¤«ï ¨§®¡à ¦¥­¨ï ªãàá®à 
;
; ¢ë室­ë¥ ¤ ­­ë¥:
; H - ¢ëá®â  ªãàá®à 
; L - è¨à¨­  ªãàá®à 
; D - Y  ªâ¨¢­ ï â®çª 
; E - X  ªâ¨¢­ ï â®çª 
;
; MSCURS *getCursMouse(char *buffer)
;
ms_gcur_::
push ix
push hl
pop ix
ld (buff),hl
ld c,0Bh
rst 30h
pop ix
ld (errno_##),a
ld (width),hl
ld (xpoint),de
ld hl,width ; Ok
ret nc
ld hl,-1 ; error
ret
dseg
width: db 0 ; è¨à¨­  ªãàá®à 
db 0 ; ¢ëá®â  ªãàá®à 
xpoint: db 0 ; X  ªâ¨¢­ ï â®çª 
db 0 ; Y  ªâ¨¢­ ï â®çª 
buff: dw 0 ;  ¤à¥á ¡ãä¥à  ¨§®¡à ¦¥­¨ï ªãàá®à 
ENDMODULE
MODULE msgsens
;
; "mouse.h"
; ®«ã祭¨¥ §­ ç¥­¨ï çã¢á⢨⥫쭮á⨠¯¥à¥¬¥é¥­¨ï ¬ëè¨
; ¯® ¢¥à⨪ «¨ ¨ £®à¨§®­â «¨.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  § ¯®«­¥­­ãî áâàãªâãàã MSSENS,
; ®¯à¥¤¥«¥­­ãî ¢ "mouse.h".
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 (0FFFFh) ¨ errno ᮤ¥à¦¨â
; ­®¬¥à ®è¨¡ª¨.
;
; ¢ë室­ë¥ ¤ ­­ë¥:
; H - çã¢á⢨⥫쭮áâì ¯® ¢¥à⨪ «¨
; L - çã¢á⢨⥫쭮áâì ¯® £®à¨§®­â «¨
;
; MSSENS *getSensMouse()
;
ms_gsen_::
ld c,0Eh
rst 30h
ld (errno_##),a
ld (hsens),hl
ld hl,hsens ; Ok
ret nc
ld hl,-1 ; error
ret
dseg
hsens: db 0 ; çã¢áâ¢. ¯® £®à¨§®­â «¨
db 0 ; çã¢áâ¢. ¯® ¢¥à⨪ «¨
ENDMODULE
MODULE mssens
;
; "mouse.h"
; ”ã­ªæ¨ï ãáâ ­ ¢«¨¢ ¥â §­ ç¥­¨ï çã¢á⢨⥫쭮á⨠¯¥à¥¬¥é¥­¨ï
; ¬ëè¨ ¯® ¢¥à⨪ «¨ ¨ £®à¨§®­â «¨.
; ¥à¥¤ ¢ë§®¢®¬ ä㭪樨, ¤®«¦­  ¡ëâì § ¯®«­¥­  áâàãªâãà 
; MSSENS, ®¯à¥¤¥«¥­­ ï ¢ "mouse.h".
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno ᮤ¥à¦¨â ­®¬¥à
; ®è¨¡ª¨.
;
; ¢å®¤­ë¥ ¤ ­­ë¥:
; H - çã¢á⢨⥫쭮áâì ¯® ¢¥à⨪ «¨
; L - çã¢á⢨⥫쭮áâì ¯® £®à¨§®­â «¨
;
; char setSensMouse(MSSENS *p)
;
ms_ssen_::
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld c,0Fh
rst 30h
ld (errno_##),a
ld a,0
ret nc
dec a
ret
ENDMODULE
MODULE mshard
;
; "mouse.h"
; Ž¡à ¡®â稪  ¯¯ à â­®£® ¯à¥à뢠­¨ï ®â ¬ëè¨.
; ® ¯à¨å®¤ã ¯à¥à뢠­¨ï ®â ¬ëè¨, ¢ë§ë¢ ¥âáï ¤ ­­ ï äã­ªæ¨ï ¤à ©¢¥à .
; ‚ á«ãç ¥, ª®£¤  âॡã¥âáï à ¡®â  ¯®¤¯à®£à ¬¬ë ¯à¨ § ¯à¥é¥­­ëå ¯à¥àë-
; ¢ ­¨ïå, ¨á¯®«ì§ã©â¥ ¤ ­­ãî äã­ªæ¨î, ¤«ï ¨§¡¥¦ ­¨ï ¯®â¥àì ¯ ª¥â®¢
; ¤ ­­ëå ®â ¬ëè¨.
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
;
; char hardMouse()
;
ms_hard_::
ld c,80h
rst 30h
ld (errno_##),a
ld a,0 ; Ok
ret nc
dec a ; error
ret
ENDMODULE
MODULE msvmode
;
; "mouse.h"
; ˆ­ä®à¬¨à®¢ ­¨¥ ® ᬥ­¥ ०¨¬  íªà ­ .
; ”ã­ªæ¨ï ¨­ä®à¬¨àã¥â ¤à ©¢¥à ¬ëè¨ ®¡ ¨§¬¥­¥­¨¨ ०¨¬  íªà ­ .
; ®¬¥à  ०¨¬®¢ ᮮ⢥âáâ¢ãîâ ä㭪樨 ãáâ ­®¢ª¨ ०¨¬  íªà ­ .
;
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno ᮤ¥à¦¨â ­®¬¥à
; ®è¨¡ª¨.
;
; ¢å®¤­ë¥ ¤ ­­ë¥:
; A - ०¨¬ íªà ­ 
;
; char vmodeMouse(char video_mode)
;
ms_vmod_::
ld c,81h
rst 30h
ld (errno_##),a
ld a,0 ; Ok
ret nc
dec a ; error
ret
ENDMODULE
MODULE msref
;
; "mouse.h"
; à¨­ã¤¨â¥«ì­ ï ¯¥à¥à¨á®¢ª  ªãàá®à .
; ”ã­ªæ¨ï ¯¥à¥à¨á®¢ë¢ ¥â ¨§®¡à ¦¥­¨¥ ªãàá®à  ¬ëè¨ ­  íªà ­¥
; ­¥ ¤®¦¨¤ ïáì ®ç¥à¥¤­®£® ¯à¥à뢠­¨ï.
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno ᮤ¥à¦¨â
; ­®¬¥à ®è¨¡ª¨.
;
; char refreshMouse()
;
ms_ref_::
ld c,83h
rst 30h
ld (errno_##),a
ld a,0 ; Ok
ret nc
dec a ; error
ret
ENDMODULE
+68
View File
@@ -0,0 +1,68 @@
;///////////////////////////////////////////////////////////////////////////
;
; C LIBRARY FOR SOLID C compiler
; Root module
;
;///////////////////////////////////////////////////////////////////////////
; ‚室ï騥 ä㭪樨:
;
; xmain
; _exit
; abort
;
cseg
db "CLIB v0.01",0
xmain::
; á®§¤ âì ᯨ᮪  à£ã¬¥­â®¢
push ix
pop hl ;  ¤à¥á ª®¬. áâப¨
call _setargv## ; ¢ dos.asm
ld de,_argv_## ; ᯨ᮪  à£ã¬¥­â®¢ (¢ dos.asm)
call _main_## ; ¢ stdio.asm
;
; "stdlib.h"
; ¯¥à¥¤ ¥âáï ã¯à ¢«¥­¨¥ ¨§ ä㭪樨 exit.
; ”ã­ªæ¨ï § ¢¥à蠥⠢맢 ­­ë© ¯à®æ¥áá ¡¥§ ®¡­®¢«¥­¨ï ¡ãä¥à®¢ ¯®â®ª .
; ‡­ ç¥­¨¥ code ®¡ëç­® ãáâ ­ ¢«¨¢ ¥âáï ¢ 0 ¤«ï 㪠§ ­¨ï ­®à¬ «ì­®£®
; ¢ë室  ¨ ãáâ ­ ¢«¨¢ ¥âáï ¢ «î¡®¥ ¤à㣮¥ §­ ç¥­¨¥ ¤«ï ®¯à¥¤¥«¥­¨ï ®è¨¡ª¨.
; ®áª®«ìªã ¢ë§®¢ _exit ­¥ ¢®§¢à é ¥â §­ ç¥­¨ï, â® ¬«. ¡ ©â code ï¥âáï
; ª®¤®¬ ¢®§¢à â  ¤«ï த¨â¥«ì᪮£® ¯à®æ¥áá .
; in: hl = §­ ç¥­¨¥ error code
; out: ­¥â
;
; void _exit(int code)
;
_exit_::
ld b,l
ld c,41h ; terminate with error code
rst 10h
ret
;
; "stdlib.h"
; ”ã­ªæ¨ï ¢ë¢®¤¨â ­  íªà ­ á®®¡é¥­¨¥ "Abnormal program termination."
; (­¥¯à¥¤¢¨¤¥­­®¥ § ¢¥à襭¨¥ ¯à®£à ¬¬ë) ¨ § ¢¥à蠥⠢맢 ­­ë© ¯à®æ¥áá
; ¡¥§ ®¡­®¢«¥­¨ï ¡ãä¥à®¢ ¯®â®ª .
; in: ­¥â
; out: ­¥â
;
; void abort()
;
abort_::
ld hl,@1
ld c,5Ch
rst 10h
ld l,-1
jr _exit_
dseg
@1: db 0Dh,0Ah,"Abnormal program termination.",0Dh,0Ah,0Ah,0
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+947
View File
@@ -0,0 +1,947 @@
; ‚室ï騥 ä㭪樨:
;
; puts
; printf
; fprintf
; cprintf
; sprintf
; scanf
; fscanf
; sscanf
;
MODULE puts
;
; "stdio.h"
; ”ã­ªæ¨ï § ¯¨á뢠¥â ¢ë¡à ­­ãî áâபã string ¢ áâ ­¤ àâ­ë© ¯®â®ª
; ¢ë¢®¤  stdout, § ¬¥­ïï ¢ ¢ë室­®¬ ¯®â®ª¥ ­ã«¥¢®© ᨬ¢®« ®ª®­ç ­¨ï
; áâப¨ ('\0') ᨬ¢®«®¬ ­®¢®© áâப¨ ('\n').
; ”ã­ªæ¨ï ¢á¥£¤  ¢®§¢à é ¥â ¯®á«¥¤­¨© § ¯¨á ­­ë© ᨬ¢®«, ª®â®àë¬
; ï¥âáï ᨬ¢®« ­®¢®© áâப¨ '\n'.
;
; in: hl =  ¤à¥á áâப¨
; out: a = ¯®á«¥¤­¨© ᨬ¢®« áâப¨
;
; char puts(*string)
;
puts_::
ld a,(hl)
or a
jr z,@1
push hl
call putch_##
pop hl
inc hl
jp puts_
;
@1: ld a,0Ah
push af
call putch_##
pop af
ret
ENDMODULE
MODULE frmts
;-----------------------------------------------------------
; call from ..printf
;-----------------------------------------------------------
; in: hl =  ¤à¥á ­ ç «  ¯ à ¬¥â஢
; de =  ¤à¥á ®¡à ¡®â稪 
; bc =  ¤à¥á ¯¥à¥¤ ¢ ¥¬ëå ¯ à ¬¥â஢
; out: hl = ç¨á«® ¢ë¢¥¤¥­­ëå ᨬ¢®«®¢, ¥á«¨ Ok
; hl = ®âà¨æ â¥«ì­®¥ §­ ç¥­¨¥, ¯à¨ ®è¨¡ª¥
;
; int @spr@(char *fmt, char (* callback)(), int param)
;
;
mk_num: ld (mn0+1),a ; base
ld (chars+1),bc
exx
ld hl,number
exx
call mn0
exx
ld (hl),0
exx
ld hl,number
ld a,(sign)
or a
ret z
dec hl
ret
;------------------------------------
mn0: ld bc,200Ah
xor a
mn1: add hl,hl
rl e
rl d
rla
cp c
jr c,mn2
sub c
inc l
mn2: djnz mn1
; DEHL-quot; A-rem
push af
ld a,d
or e
or h
or l
call nz,mn0
pop af
push hl
chars: ld hl,char1 ; save char1 or char2
ld c,a
ld b,0
add hl,bc
ld a,(hl)
pop hl
exx
ld (hl),a
inc hl
exx
ret
;-------------------------------------------
scan_length:
xor a
ld (flong),a ; false
ld (fladj),a
ld (flen+0),a ; make length = 0
ld (flen+1),a
ld a," "
ld (padch),a ; space padding by default
ld a,(hl)
cp "-"
jr nz,sl1
ld (fladj),a ; all will be LEFT adjusted, not right
inc hl
sl1: ld a,(hl)
cp "0"
jr nz,sl2
ld a,(fladj)
or a
jr nz,sl1a
ld a,"0"
ld (padch),a ; pad numbers with '0's, not spaces
sl1a: inc hl
sl2: ld de,0
sl2a: ld a,(hl)
sub "0"
jr c,sl3
cp 9+1
jr nc,sl3
ex de,hl
ld c,l
ld b,h
add hl,hl
add hl,hl
add hl,bc
add hl,hl
ld b,0
ld c,a
add hl,bc
ex de,hl
inc hl
jr sl2a
;
sl3: ld (flen),de ; set explicit length
ld a,(hl)
cp "l"
jr z,sl4
cp "L"
ret nz
sl4: ld (flong),a ; true
inc hl
ret
;--------------------------------------------
_pad: dec hl
bit 7,h
ret nz
push hl
ld a,(padch)
call outch
pop hl
ld de,(nprtd+1)
inc de
ld (nprtd+1),de
jp _pad
;=====================================================================
;
; int @spr@(char *fmt,char (* callback)(), int param)
;
;=====================================================================
@spr@:: ld (outch1+1),bc ; optional parameter
ld (outch2+1),de ; callback pointer
push hl
pop iy ; at (iy+2) we have current parameter
ld hl,0
ld (nprtd+1),hl ; clear return value
ld l,(iy+0) ; at iy we have pointer to format string
ld h,(iy+1)
loop: ld a,(hl)
inc hl
or a
jr z,nprtd
cp "%"
jr z,loc3
loc4: call outch
ld de,(nprtd+1)
inc de
ld (nprtd+1),de
jp loop
;
nprtd: ld hl,0 ; return value
ret
;
loc3: ld a,(hl)
inc hl
cp "%"
jr z,loc4
dec hl
call scan_length ; scan [-][0][0-9*][lL]
ld a,(hl)
inc hl
cp "c"
jp z,prt_c
cp "C"
jp z,prt_c ; print single character
cp "d"
jp z,prt_d
cp "D"
jp z,prt_d ; signed decimal
cp "u"
jp z,prt_u
cp "U"
jp z,prt_u ; unsigned decimal
cp "o"
jp z,prt_o
cp "O"
jp z,prt_o ; octal
cp "x"
jp z,prt_x1
cp "X"
jp z,prt_x2 ; hexadecimal
cp "s"
jp z,prt_s
cp "S"
jp z,prt_s ; string
jp loop
;
; %c symbol
prt_c: ld a,(iy+2)
call outch
ld de,(nprtd+1)
inc de
ld (nprtd+1),de
prt_q: inc iy
inc iy
ld a,(flong)
or a
jp z,loop ; false
inc iy
inc iy
jp loop
;
; %s string
prt_s: ld a," "
ld (padch),a
push hl
push iy
ld l,(iy+2)
ld h,(iy+3)
fmt0: push hl
call strlen_##
ex de,hl
ld hl,(flen)
or a
sbc hl,de
ld (flen),hl
ld a,(fladj)
or a
call z,_pad
pop hl
fmt1: ld a,(hl)
inc hl
or a
jr z,fmt2
call outch
ld de,(nprtd+1)
inc de
ld (nprtd+1),de
jp fmt1
;
fmt2: ld hl,(fladj)
ld a,(flen)
or a
call nz,_pad
pop iy
pop hl
jp prt_q
;
; %u unsigned decimal
prt_u: push hl
push iy
call getnum
jr fmt4
;
; %d signed decimal
prt_d: push hl
push iy
call getnum
ld a,(flong)
or a
jr nz,fmt3 ; true
bit 7,h
jr z,fmt3
ld de,-1
fmt3: bit 7,d
jr z,fmt4
ld a,"-"
ld (sign),a
xor a
sub l
ld l,a
ld a,0
sbc a,h
ld h,a
ld a,0
sbc a,e
ld e,a
ld a,0
sbc a,d
ld d,a
fmt4: ld a,10 ; base
ld bc,char1
call mk_num
jp fmt0
;
; %o octal
prt_o: push hl
push iy
call getnum
ld a,8 ; base
ld bc,char1
call mk_num
jp fmt0
;
; %X hex
prt_x2: ld bc,char1
prt_x: push hl
push iy
call getnum
ld a,16 ; base
call mk_num
jp fmt0
;
; %x hex
prt_x1: ld bc,char2
jr prt_x
;---------------------------------------
getnum: xor a
ld (sign),a
ld l,(iy+2)
ld h,(iy+3)
ld a,(flong)
or a
jr z,gnu1 ; false
ld e,(iy+4)
ld d,(iy+5)
ret
gnu1: ld de,0
ret
;---------------------------------------
outch: push hl
push iy
outch1: ld de,0 ; optional parameter
outch2: call 0 ; callback pointer
or a
jr z,och1
ld hl,8000h ; -32768
ld (nprtd+1),hl
och1: pop iy
pop hl
ret
char1: db "0123456789ABCDEF"
char2: db "0123456789abcdef"
dseg
flen: dw 0
fladj: db 0
flong: db 0 ; false/true
padch: db " "
;
sign: db 0 ; §­ ª ç¨á« 
number: ds 16 ; ¡ãä¥à ç¨á« 
ENDMODULE
MODULE xfputc
;-----------------------------------------------------------
; call from printf_, fprintf_
;-----------------------------------------------------------
; ”ã­ªæ¨ï ¢ë¢®¤¨â ᨬ¢®« ¢ ä ©« *fp.
; ਠ®è¨¡ª¥ ¢®§¢à é ¥âáï EOF (0FFFFh)
; in: a = ¢ë¢®¤¨¬ë© ᨬ¢®«
; out: hl=0 - Ok
; hl=EOF (0FFFFh) - ®è¨¡ª 
;
; int @fputc(c, FILE *fp)
;
@fputc::
call fputc_## ; ¢ë¢®¤ ᨬ¢®«  ¢ ¯®â®ª (ä ©«)
ld hl,-1 ; ®è¨¡ª 
cp l
ret z
xor a
inc hl ; Ok
ret
ENDMODULE
MODULE printf
;
; "stdio.h"
; ”ã­ªæ¨ï ¢ë¢®¤¨â ¤ ­­ë¥ á ¯à¥®¡à §®¢ ­¨¥¬ ä®à¬ â  ¢ áâ ­¤ àâ­ë©
; ¯®â®ª stdout ¨§ ¯¥à¥¬¥­­ëå, ®¯à¥¤¥«ï¥¬ëå  à£ã¬¥­â ¬¨ args.
; Š ¦¤ë©  à£ã¬¥­â ¤®«¦¥­ 㪠§ë¢ âì ­  §­ ç¥­¨¥ á ⨯®¬, ª®â®àë©
; ᮮ⢥âáâ¢ã¥â ⨯ã, § ¤ ­­®¬ã ¢ áâப¥ ä®à¬ â .
;
; in: ¯ à ¬¥âàë ¢ á⥪¥
; out: hl = ç¨á«® ¢ë¢¥¤¥­ëå ᨬ¢®«®¢, ¥á«¨ Ok
; hl = ®âà¨æ. §­ ç¥­¨¥ (¨§ @spr@) ¯à¨ ®è¨¡ª¥
;
; int printf(char *format, arg1, arg2, ...)
;
printf_::
ld bc,_iob_##-14 ; FILE-áâàãªâãà  ¯®â®ª  stdout
ld de,@fputc## ;  ¤à¥á ®¡à ¡®â稪 
ld hl,2
add hl,sp ; ï祩ª  á  ¤à¥á®¬ arg1
jp @spr@##
ENDMODULE
MODULE fprintf
;
; "stdio.h"
; ”ã­ªæ¨ï ¢ë¢®¤¨â ¤ ­­ë¥ á ¯à¥®¡à §®¢ ­¨¥¬ ä®à¬ â  ¢ ä ©« *fp
; ¨§ ¯¥à¥¬¥­­ëå, ®¯à¥¤¥«ï¥¬ëå 㪠§ â¥«ï¬¨  à£ã¬¥­â®¢ args.
; Š ¦¤ë©  à£ã¬¥­â ¤®«¦¥­ 㪠§ë¢ âì ­  §­ ç¥­¨¥ á ⨯®¬, ª®â®àë©
; ᮮ⢥âáâ¢ã¥â ⨯ã, § ¤ ­­®¬ã ¢ áâப¥ ä®à¬ â .
;
; in: ¯ à ¬¥âàë ¢ á⥪¥
; out: hl = ç¨á«® ¢ë¢¥¤. ᨬ¢®«®¢, ¥á«¨ Ok
; hl = ®âà¨æ. §­ ç¥­¨¥ (¨§ @spr@) ¯à¨ ®è¨¡ª¥
;
; int fprintf(FILE *fp, char *format, arg1, arg2, ...)
;
fprintf_::
pop hl
pop bc ; bc =  ¤à¥á ä®à¬. áâப¨
push bc
push hl
ld de,@fputc## ;  ¤à¥á ®¡à ¡®â稪 
ld hl,4
add hl,sp ; ï祩ª  á  ¤à¥á®¬ arg1
jp @spr@##
ENDMODULE
MODULE cprintf
;
; "conio.h"
; ”ã­ªæ¨ï ¢ë¢®¤¨â á ¯à¥®¡à §®¢ ­¨¥¬ ä®à¬ â  ­ ¡®àë ᨬ¢®«®¢
; ¨ §­ ç¥­¨© ¯àאַ ­  íªà ­.
; Š ¦¤ë©  à£ã¬¥­â ¤®«¦¥­ 㪠§ë¢ âì ­  §­ ç¥­¨¥ á ⨯®¬, ª®â®àë©
; ᮮ⢥âáâ¢ã¥â ⨯ã, § ¤ ­­®¬ã ¢ áâப¥ ä®à¬ â .
;
; in: ¤ ­­ë¥ ¢ á⥪¥
; out: hl = ç¨á«® ¢ë¢¥¤. ᨬ¢®«®¢, ¥á«¨ Ok
; hl = ®âà¨æ. §­ ç¥­¨¥ (¨§ @spr@), ¯à¨ ®è¨¡ª¥
;
; int cprintf(char *format, arg1, arg2, ...)
;
putch@: call putch_##
xor a
ret
cprintf_::
ld de,putch@ ;  ¤à¥á ®¡à ¡®â稪 
ld hl,2
add hl,sp ; ï祩ª  á  ¤à¥á®¬ arg1
jp @spr@##
ENDMODULE
MODULE sprintf
;
; "stdio.h"
; ”ã­ªæ¨ï ¯à¥®¡à §ã¥â ä®à¬ â ¨ ¢ë¢®¤¨â ­ ¡®àë ᨬ¢®«®¢ ¨ §­ ç¥­¨©
; ¢ buffer. ‚ ª®­¥æ ¢ë¢®¤¨¬®© áâப¨ § ¯¨á뢠¥âáï ­ã«ì.
; Š ¦¤ë©  à£ã¬¥­â ¤®«¦¥­ 㪠§ë¢ âì ­  §­ ç¥­¨¥ á ⨯®¬, ª®â®àë© á®®â-
; ¢¥âáâ¢ã¥â ⨯ã, § ¤ ­­®¬ã ¢ áâப¥ ä®à¬ â .
; ”ã­ªæ¨ï ¢®§¢à é ¥â ª®«¨ç¥á⢮ ᨬ¢®«®¢, § ¯¨á ­­ëå ¢ buffer.
;
; int sprintf(char buffer, char *format, arg1, arg2, ...)
;
; in: de=ï祩ª , åà ­ïé ï  ¤à¥á ¡ãä¥à 
@sspr@: ex de,hl
ld e,(hl)
inc hl
ld d,(hl) ; de= ¤à¥á ¡ãä¥à 
ld (de),a ; á®åà. ᨬ¢®«
inc de
ld (hl),d ; á®åà. ⥪.  ¤à¥á ¡ãä¥à  ¢ á⥪¥
dec hl
ld (hl),e
xor a
ret
sprintf_::
ld hl,2
add hl,sp ; ï祩ª  á  ¤à¥á®¬ ¡ãä¥à 
ld c,l
ld b,h
ld de,@sspr@ ;  ¤à¥á ®¡à ¡®â稪 
ld hl,4
add hl,sp
call @spr@##
ex de,hl
pop bc
pop hl
ld (hl),0 ; to end string
push hl
push bc
ex de,hl ; hl=return value
ret
ENDMODULE
;[]============================ scanf ==================================[]
MODULE xxscn
;
; call from _scn_
;
@igs@: ex de,hl
@41: ld l,e
ld h,d
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld a,(hl)
cp " "
jr z,@40
cp 9 ; Tab
jr z,@40
cp 0Ah
ret nz
@40: ld l,e
ld h,d
push de
ld e,(hl)
inc hl
ld d,(hl)
inc de
ld (hl),d
dec hl
ld (hl),e
pop de
jr @41
; ¢ë室: hl= ¢®§¢à. ¡ ©â
@bc@: ld hl,@46+1
ld (hl),e ; ¡ §  ç¨á¥«
call toupper_##
cp "A"
jr c,@42
cp "Z"+1
jr c,@43
@42: cp "a"
jr c,@44
cp "z"+1
jr c,@43
@44: cp "_"
jr nz,@45
@43: sub "7"
jr @46
;
@45: cp "0"
jr c,@47
cp "9"+1
jr nc,@47
sub "0"
jr @46
;
@47: ld hl,-1 ; ¢®§¢à. §­ ç¥­¨¥
ret
;
@46: ld l,0 ; á®åà. §­ ç¥­¨¥
cp l
jr c,@48
ld a,-1
@48: ld l,a ; ¢®§¢à. ¡ ©â
ld h,0
ret
dseg
?95: dw 0
?99: dw 0
?100: db 0 ; false/true
?102: db 0
?103: dw 0
?104: dw 0
?105: dw 0
cseg
;
; call from ..scanf
;
_scn_::
ld (?95),hl
ld l,e;
ld h,d;
inc de
inc de
;ld hl,-2
;add hl,de
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld (?99),hl
ld l,e
ld h,d
ld (?105),hl
xor a
ld (?102),a
@50: ld hl,(?99)
ld a,(hl)
inc hl
ld (?99),hl
or a
jp z,@49
cp " "
jr z,@50
cp 9 ; Tab
jr z,@50
cp 0Ah
jr z,@50
cp "%"
jp nz,@51
push hl
ld hl,1
ld (?103),hl
ld a,l ; a=true
ld (?100),a
ld a,10
ld (?101+1),a ; ¡ §  ç¨á¥«
pop hl
ld a,(hl)
inc hl
ld (?99),hl
cp "*"
jr nz,@52
xor a ; false
ld (?100),a
ld a,(hl)
inc hl
ld (?99),hl
@52: call toupper_##
cp "X" ; hex
jr z,@53
cp "O" ; octal
jr z,@54
cp "D" ; decimal
jr z,@55
cp "U" ; unsigned
jr z,@56
cp "S" ; string
jp z,@57
cp "C" ; char
jp z,@58
jp @49
;
@53: ld a,16
ld (?101+1),a ; ¡ §  ç¨á¥«
jr @56
;
@54: ld a,8
ld (?101+1),a ; ¡ §  ç¨á¥«
jr @56
;
@55: ld hl,?95
call @igs@
cp "-"
jr nz,@56
ld hl,-1
ld (?103),hl
ld hl,(?95)
inc hl
ld (?95),hl
;
@56: ld hl,0
ld (?104),hl
ld hl,?95
call @igs@
?101: ld e,0 ; á®åà. §­ ç¥­¨¥ (¡ §  ç¨á¥«)
call @bc@
ld a,l
and h
inc a
jp z,@49
@60: ld a,(?101+1) ; ¡ §  ç¨á¥«
ld e,a
push af
ld hl,(?95)
ld a,(hl)
inc hl
ld (?95),hl
call @bc@
ld a,l
pop de
ld e,d
cp 0FFh
jr z,@61
push af
ld d,0
ld hl,(?104)
call ?MULHD##
pop de
ld e,d
ld d,0
add hl,de
ld (?104),hl
jr @60
;
@61: ld hl,(?95)
dec hl
ld (?95),hl
jp @62
;
@57: ld hl,?95
call @igs@
ld hl,(?105)
ld c,(hl)
inc hl
ld b,(hl)
@65: ld hl,(?95)
ld a,(hl)
inc hl
ld (?95),hl
ld e,a
inc e
dec e
jr z,@63
ld hl,(?99)
ld a,(hl)
cp e
jr nz,@64
inc hl
ld (?99),hl
jr @63
;
@64: ld a,(?100)
or a
jr z,@65 ; false
ld a,e
ld (bc),a
inc bc
jr @65
;
@63: ld hl,?100
ld e,(hl)
inc e
dec e
jp z,@50 ; false
ld hl,(?102)
inc l
ld a,l
ld (?102),a
xor a
ld (bc),a
ld hl,(?105)
inc hl
inc hl
ld (?105),hl
jp @50
;
@58: ld hl,?100
ld e,(hl)
inc e
dec e
jr z,@66 ; false
ld hl,(?95)
ld a,(hl)
ld hl,(?105)
ld c,(hl)
inc hl
ld b,(hl)
inc hl
ld (?105),hl
ld (bc),a
ld hl,(?102)
inc l
ld a,l
ld (?102),a
@66: ld hl,(?95)
inc hl
ld (?95),hl
jp @50
;
@62: ld a,(?100)
or a
jr z,@51 ; false
ld de,(?103)
ld hl,(?104)
call ?MULHD##
ex de,hl
ld hl,(?105)
inc hl
inc hl
ld (?105),hl
dec hl
dec hl
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld (hl),e
inc hl
ld (hl),d
ld hl,(?102)
inc l
ld a,l
ld (?102),a
@51: ld hl,(?95)
ld a,(hl)
or a
jp nz,@50
@49: ld hl,(?102)
ld h,0
ret
ENDMODULE
MODULE scanf
;
; "stdio.h"
; ”ã­ªæ¨ï ç¨â ¥â ¤ ­­ë¥ á ¯à¥®¡à §®¢ ­¨¥¬ ä®à¬ â  ¨§ áâ ­¤ àâ­®£®
; ¯®â®ª  stdin ¢ ¯¥à¥¬¥­­ë¥, ®¯à¥¤¥«ï¥¬ë¥ 㪠§ â¥«ï¬¨  à£ã¬¥­â®¢ args.
; Š ¦¤ë©  à£ã¬¥­â ¤®«¦¥­ 㪠§ë¢ âì ­  §­ ç¥­¨¥ á ⨯®¬, ª®â®àë© á®®â-
; ¢¥âáâ¢ã¥â ⨯ã, § ¤ ­­®¬ã ¢ áâப¥ ä®à¬ â .
; ”ã­ªæ¨ï ¨á¯®«ì§ã¥â ¡ãä¥à ¢ ®¡« á⨠á⥪ , à §¬¥à®¬ 128 ¡ ©â.
; ”ã­ªæ¨ï ¢®§¢à é ¥â ç¨á«® ¯®«¥©, à §¤¥«¥­­ëå ᯥæ-ᨬ¢®« ¬¨.
;
; int scanf(char *format, arg1, arg2, ...)
;
scanf_::
ld (@1+1),sp
ld hl,-128 ; à §¬¥à ¡ãä¥à 
add hl,sp ; hl= ¤à¥á ¡ãä¥à  ¢ á⥪¥
ld sp,hl ; à á¯®«®¦¨âì á⥪ ­¨¦¥ ¡ãä¥à 
call gets_## ; ¢¢¥á⨠áâபã á ª®­á®«¨
ex de,hl
ld hl,128+2
add hl,sp
ex de,hl ; hl=㪠§ â¥«ì ­  ¡ãä¥à
call _scn_##
@1: ld sp,0
ret
ENDMODULE
MODULE fscanf
;
; "stdio.h"
; ”ã­ªæ¨ï ç¨â ¥â ¤ ­­ë¥ á ¯à¥®¡à §®¢ ­¨¥¬ ä®à¬ â  ¨§ ä ©«  *fp,
; ¢ ¯¥à¥¬¥­­ë¥, ®¯à¥¤¥«ï¥¬ë¥ 㪠§ â¥«ï¬¨  à£ã¬¥­â®¢ args.
; Š ¦¤ë©  à£ã¬¥­â ¤®«¦¥­ 㪠§ë¢ âì ­  §­ ç¥­¨¥ á ⨯®¬, ª®â®àë©
; ᮮ⢥âáâ¢ã¥â ⨯ã, § ¤ ­­®¬ã ¢ áâப¥ ä®à¬ â .
; ”ã­ªæ¨ï ¨á¯®«ì§ã¥â ¡ãä¥à ¢ ®¡« á⨠á⥪ , à §¬¥à®¬ 128 ¡ ©â.
; ”ã­ªæ¨ï ¢®§¢à é ¥â ç¨á«® ¯®«¥©, à §¤¥«¥­­ëå ᯥæ-ᨬ¢®« ¬¨.
; ਠ¤®á⨦¥­¨¨ ª®­æ  ä ©« , ¢ë¤ ¥âáï EOF.
;
; int fscanf(FILE *fp, char *format, arg1, arg2, ...)
;
fscanf_::
ld (@68+1),sp
; ld (?137+1),hl ;  ¤à¥á áâàãªâãàë ¤¥áªà.
ld c,l; ; bc= ¤à¥á áâàãªâãàë ¤¥áªà.
ld b,h;
ld hl,-128
add hl,sp
ld sp,hl ; à á¯®«®¦¨âì á⥪ ­¨¦¥ ¡ãä¥à 
;?137: ld hl,0
; call ?LAUHL;##
; dw 132
; ;
; ld c,l ; bc= ¤à¥á áâàãªâãàë ¤¥áªà.
; ld b,h
ld de,127 ; ¬ ªá.¤«¨­  áâப¨ + 1
ld hl,0
add hl,sp ; hl= ¤à¥á ¡ãä¥à  ¢ ï祩ª¥ á⥪ 
call fgets_## ; ¯®«ãç¨âì áâப㠨§ ä ©«  (¯®â®ª )
ld a,l
or h
jr nz,@67 ; ¡¥§ ®è¨¡®ª
dec hl ; hl=EOF
jr @68
;
@67: ex de,hl
ld hl,132
add hl,sp
ex de,hl ; hl=㪠§ â¥«ì ­  ¡ãä¥à
call _scn_##
@68: ld sp,0
ret
ENDMODULE
MODULE sscanf
;
; "stdio.h"
; ”ã­ªæ¨ï ç¨â ¥â ¤ ­­ë¥ á ¯à¥®¡à §®¢ ­¨¥¬ ä®à¬ â  ¨§ buffer,
; ¢ ¯¥à¥¬¥­­ë¥, ®¯à¥¤¥«ï¥¬ë¥ 㪠§ â¥«ï¬¨  à£ã¬¥­â®¢ args.
; Š ¦¤ë©  à£ã¬¥­â ¤®«¦¥­ 㪠§ë¢ âì ­  §­ ç¥­¨¥ á ⨯®¬, ª®â®àë©
; ᮮ⢥âáâ¢ã¥â ⨯ã, § ¤ ­­®¬ã ¢ áâப¥ ä®à¬ â .
; ”ã­ªæ¨ï ¢®§¢à é ¥â ç¨á«® ¯®«¥©, à §¤¥«¥­­ëå ᯥæ-ᨬ¢®« ¬¨.
;
; int sscanf(char *buffer, char *format, arg1, arg2, ...)
;
sscanf_::
ld hl,2
add hl,sp
ld e,(hl)
inc hl
ld d,(hl)
inc hl
ex de,hl
jp _scn_##
ENDMODULE
+554
View File
@@ -0,0 +1,554 @@
; ‚室ï騥 ä㭪樨:
;
; memchr
; strcpy
; strncpy
; strcat
; strncat
; strcmp
; strncmp
; strchr
; strcspn
; strpbrk
; strlen
; strrchr
; strlwr
; strupr
; strspn
; strstr
; strtok
;
MODULE memchr
;
; "string.h"
; ”ã­ªæ¨ï ¨é¥â ¯¥à¢ë¥ count ¡ ©â ¢ buff á æ¥«ìî ®¡­ à㦥­¨ï
; ¯¥à¢®£® ¯®ï¢«¥­¨ï ᨬ¢®«  "c". ®¨áª ¯à®¤®«¦ ¥âáï ¤® â¥å ¯®à,
; ¯®ª  ­¥ ¡ã¤¥â ­ ©¤¥­ 㪠§ ­­ë© ᨬ¢®« ¨«¨ ­¥ ¡ã¤ã⠯஢¥à¥­ë
; ¢á¥ count ¡ ©âë.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  à á¯®«®¦¥­¨¥ ᨬ¢®«  "c" ¢ buff.
; …᫨ ᨬ¢®« "c" ­¥ ®¡­ à㦥­ ¢ ¯¥à¢ëå count ¡ ©â å buff, ¢®§¢à -
; é ¥âáï NULL.
;
; void *memchr(char *buff, c, count)
;
memchr_::
ld a,e ; ᨬ¢®«
cpir
dec hl
ret z ; ­ ©¤¥­
ld hl,0 ; NULL
ret
ENDMODULE
MODULE strcpy
;
; "string.h"
; ”ã­ªæ¨ï ª®¯¨àã¥â s2 ¢ s1 (¢ª«îç ï 0-© ᨬ¢®« ®ª®­ç ­¨ï áâப¨).
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  s1.
;
; char *strcpy(*s1, *s2)
;
strcpy_::
ex de,hl
push de
@1: ld a,(hl)
ldi
or a
jp nz,@1
pop hl ; ¢¥à­ãâì  ¤à¥á s1
ret
ENDMODULE
MODULE strncpy
;
; "string.h"
; ”ã­ªæ¨ï ª®¯¨àã¥â â®ç­® count ᨬ¢®«®¢ áâப¨ s2 ¢ áâபã s1.
; …᫨ count ¬¥­ìè¥ ¤«¨­ë s2, ­ã«¥¢®© ᨬ¢®« ®ª®­ç ­¨ï áâப¨
; ­¥ ¤®¡ ¢«ï¥âáï ª áâப¥ s1. …᫨ count ¡®«ìè¥ ¤«¨­ë s2, â®
; s1 § ¯®«­ï¥âáï ­ã«¥¢ë¬¨ ᨬ¢®« ¬¨, ¢¯«®âì ¤® ¤®á⨦¥­¨ï ¤«¨­ë
; count.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  s1.
;
; char *strncpy(*s1, *s2, count)
;
strncpy_::
ex de,hl
push de
@2: ld a,(hl)
@3: ldi
jp pe,@4
or a
jp nz,@2
dec hl
jp @3
;
@4: pop hl ; ¢¥à­ãâì  ¤à¥á s1
ret
ENDMODULE
MODULE strcat
;
; "string.h"
; ”ã­ªæ¨ï ¤®¡ ¢«ï¥â s2 ª s1, § ¢¥àè ï áâபã s1
; ­ã«¥¢ë¬ ᨬ¢®«®¬.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  s1.
;
; char *strcat(*s1, *s2)
;
strcat_::
xor a
ld b,a
ld c,a
push hl
cpir
dec hl
ex de,hl
@1: ld a,(hl)
ldi
or a
jp nz,@1
pop hl ; ¢¥à­ãâì  ¤à¥á s1
ret
ENDMODULE
MODULE strncat
;
; "string.h"
; ”ã­ªæ¨ï ¤®¡ ¢«ï¥â count ᨬ¢®«®¢ áâப¨ s2 ¢ ª®­¥æ áâப¨ s1,
; § ¢¥àè ï áâபã s1 ­ã«¥¢ë¬ ᨬ¢®«®¬.
; ‚ s1 ¤®«¦­® ¡ëâì ¤®áâ â®ç­® ¬¥áâ  ¤«ï à §¬¥é¥­¨ï १ã«ìâ¨àã-
; î饩 áâப¨.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  s1.
;
; char *strncat(*s1, *s2, count)
;
strncat_::
xor a
push hl
ld bc,0
cpir
dec hl
ex de,hl
@4: ld a,(hl)
or a
jr z,@5
ldi
jp po,@4
@5: xor a
ld (de),a
pop hl ; ¢¥à­ãâì  ¤à¥á s1
ret
ENDMODULE
MODULE strcmp
;
; "string.h"
; ”ã­ªæ¨ï ¯à®¨§¢®¤¨â ¯®á«¥¤®¢ â¥«ì­®¥ ॣ¨áâà®-§ ¢¨á¨¬®¥
; áà ¢­¥­¨¥ ᨬ¢®«®¢ áâப s1 ¨ s2, ¨ ¯à®¤®«¦ ¥â íâ®, ¯®ª 
; ®­¨ ᮢ¯ ¤ îâ, «¨¡® ¯®ª  ®¤­  ¨§ áâப ­¥ § ª®­ç¨âáï.
; ”ã­ªæ¨ï ¢®§¢à é ¥â §­ ç¥­¨¥, 㪠§ë¢ î饥 ­  ᮮ⭮襭¨¥
; íâ¨å áâப:
; < 0 s1 < s2
; = 0 s1 = s2
; > 0 s1 > s2
;
; int strcmp(*s1, *s2)
;
strcmp_::
ex de,hl
@6: ld a,(de)
sub (hl)
jr nz,@7
inc de
inc hl
ld a,(de)
or a
jp nz,@6
@7: ld h,a
ld l,0
ret
ENDMODULE
MODULE strncmp
;
; "string.h"
; ”ã­ªæ¨ï ¯à®¨§¢®¤¨â ¯®á«¥¤®¢ â¥«ì­®¥ ॣ¨áâà®-§ ¢¨á¨¬®¥ áà ¢­¥­¨¥
; ᨬ¢®«®¢ áâப s1 ¨ s2. Š®«¨ç¥á⢮ áà ¢­¨¢ ¥¬ëå ᨬ¢®«®¢ § ¤ ¥âáï
; ¢ count. …᫨ ®¤­  ¨§ áâப § ª ­ç¨¢ ¥âáï, áà ¢­¥­¨¥ ¯à¥ªà é ¥âáï.
; ”ã­ªæ¨ï ¢®§¢à é ¥â §­ ç¥­¨¥, 㪠§ë¢ î饥 ­  ᮮ⭮襭¨¥ íâ¨å áâப:
; < 0 s1 < s2
; = 0 s1 = s2
; > 0 s1 > s2
;
; int strncmp(*s1, *s2, uint count)
;
strncmp_::
ex de,hl
@6: ld a,(de)
sub (hl)
jr nz,@7
ld a,(de)
or a
jr z,@7
inc de
inc hl
dec bc
ld a,b
or c
jp nz,@6
@7: ld h,a
ld l,0
ret
ENDMODULE
MODULE strchr
;
; "string.h"
; ”ã­ªæ¨ï ­ å®¤¨â ¯¥à¢®¥ ¢å®¦¤¥­¨¥ "c" ¢ string.
; ‘¨¬¢®« "c" ¬®¦¥â ¡ëâì ­ã«¥¢ë¬ ᨬ¢®«®¬.
; ã«¥¢®© ᨬ¢®« ®ª®­ç ­¨ï string â ª¦¥ ¢ª«îç ¥âáï ¢ ¯®¨áª.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ¯¥à¢®¥ ¢å®¦¤¥­¨¥ "c" ¢ string.
; ‚®§¢à é ¥âáï NULL, ¥á«¨ ᨬ¢®« ­¥ ­ ©¤¥­.
;
; char *strchr(*string, c)
;
strchr_::
ld a,(hl) ; string
cp e ; ᨬ¢®« "c"
ret z
inc hl
or a
jp nz,strchr_
ld h,a ; NULL
ld l,a
ret
ENDMODULE
MODULE inrange
;
; ¢ë§ë¢ ¥âáï ¨§ ¤à. ¯/¯à®£à ¬¬
;
@inran::
ld a,(hl)
or a
ret z
cp e
inc hl
jp nz,@inran
or 0FFh
ret
ENDMODULE
MODULE strcspn
;
; "string.h"
;  å®¤¨â ¯¥à¢ãî ç áâì áâப¨ ¢ s1, ­¥ ¢å®¤ïéãî ¢ áâபã s2.
; ‚®§¢à é ¥â ¤«¨­ã ç á⨠áâப¨ s1, á®áâ®ï饩 ¨§ ᨬ¢®«®¢, ­¥
; ­ ©¤¥­­ëå ¢ áâப¥ s2. …᫨ ­¨ ®¤¨­ ¨§ ᨬ¢®«®¢ áâப¨ s1 ­¥
; ­ ©¤¥­ ¢ s2, ¢®§¢à é ¥âáï ®¡é ï ¤«¨­  áâப¨ s1 ¡¥§ § ¢¥àè -
; î饣® ­ã«ï.
;
; size_t strcspn(*s1, *s2)
;
strcspn_::
ld b,h
ld c,l
ld hl,0
@1: ld a,(bc)
or a
ret z
push hl
ex de,hl
push hl
ld e,a
call @inran##
pop de
pop hl
ret nz
inc hl
inc bc
jp @1
ENDMODULE
MODULE strpbrk
;
; "string.h"
; ”ã­ªæ¨ï ­ å®¤¨â ¯¥à¢®¥ ¢å®¦¤¥­¨¥ ¢ áâப¥ s1 «î¡®£®
; ᨬ¢®«  ¨§ áâப¨ s2. ã«¥¢®© ᨬ¢®« ®ª®­ç ­¨ï ¯à¨
; ¯®¨áª¥ ­¥ à áᬠâਢ ¥âáï.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ¯¥à¢®¥ ¢å®¦¤¥­¨¥
; ᨬ¢®«  ¨§ s2 ¢ áâப¥ s1.
; ਠ®âáãâá⢨¨ ®¡é¨å ᨬ¢®«®¢ ¢ s1 ¨ s2, ¢®§¢à -
; é ¥âáï NULL.
;
; char *strpbrk(*s1, *s2)
;
strpbrk_::
ld a,(hl)
or a
jr z,@2
@1: push hl
ld l,(hl)
push de
ex de,hl
call @inran##
pop de
pop hl
ret nz
inc hl
jp @1
;
@2: ld h,a ; NULL
ld l,a
ret
ENDMODULE
MODULE strlen
;
; "string.h"
; ”ã­ªæ¨ï ¢®§¢à é ¥â ¢ ¡ ©â å ¤«¨­ã áâப¨ string,
; ¯à¨ç¥¬ ­ã«¥¢®© ᨬ¢®« ®ª®­ç ­¨ï áâப¨, ¢ à §¬¥à
; áâப¨ ­¥ ¢å®¤¨â.
;
; size_t strlen(*string)
;
strlen_::
xor a
ld b,a
ld c,a
push hl
cpir
pop de
scf
sbc hl,de ; hl = ¤«¨­  áâப¨
ret
ENDMODULE
MODULE strrchr
;
; "string.h"
; ”ã­ªæ¨ï ­ å®¤¨â ¯®á«¥¤­¥¥ ¢å®¦¤¥­¨¥ ᨬ¢®«  "c"
; ¢ áâப¥ string. ã«¥¢®© ᨬ¢®« ®ª®­ç ­¨ï áâப¨
; string â ª¦¥ ¢ª«îç ¥âáï ¢ ¯®¨áª.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ¯®á«¥¤­¥¥ ¢å®¦¤¥­¨¥
; ᨬ¢®«  "c" ¢ string.
; …᫨ § ¤ ­­ë© ᨬ¢®« ­¥ ­ ©¤¥­, ¢®§¢à é ¥âáï NULL.
;
; char *strrchr(*string, c)
;
strrchr_::
ld b,h
ld c,l
ld hl,0 ; NULL
@1: ld a,(bc) ; string
or a
ret z
cp e ; ᨬ¢®« "c"
jp nz,@2
ld h,b ;  ¤à¥á ¢å®¦¤¥­¨ï
ld l,c
@2: inc bc
jp @1
ENDMODULE
MODULE strlwr
;
; "string.h"
; ”ã­ªæ¨ï ¯à¥®¡à §®¢ë¢ ¥â «î¡ë¥ ¡ãª¢ë ¢¥àå­¥£® ॣ¨áâà 
; áâப¨ string, § ª ­ç¨¢ î饩áï ­ã«¥¬, ¢ ¡ãª¢ë ­¨¦­¥£®
; ॣ¨áâà . „à㣨¥ ᨬ¢®«ë ­¥ à áᬠâਢ îâáï.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  áâபã string.
;
; char *strlwr(*string)
;
strlwr_::
push hl
@1: ld a,(hl)
or a
jr z,@2
call tolower_## ; A..Z -> a..z
ld (hl),a
inc hl
jp @1
;
@2: pop hl ; ¢¥à­ãâì  ¤à¥á string
ret
ENDMODULE
MODULE strupr
;
; "string.h"
; ”ã­ªæ¨ï ¯à¥®¡à §®¢ë¢ ¥â «î¡ë¥ ¡ãª¢ë ­¨¦­¥£® ॣ¨áâà 
; áâப¨ string, § ª ­ç¨¢ î饩áï ­ã«¥¬, ¢ ¡ãª¢ë ¢¥àå­¥£®
; ॣ¨áâà . „à㣨¥ ᨬ¢®«ë ­¥ à áᬠâਢ îâáï.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  áâபã string.
;
; char *strupr(*string)
;
strupr_::
push hl
@1: ld a,(hl)
or a
jr z,@2
call toupper_## ; a..z -> A..Z
ld (hl),a
inc hl
jp @1
;
@2: pop hl ; ¢¥à­ãâì  ¤à¥á string
ret
ENDMODULE
MODULE strspn
;
; "string.h"
; ”ã­ªæ¨ï ¢®§¢à é ¥â ¤«¨­ã ᮢ¯ ¤ î饩 ç á⨠áâப¨ s1, ª®â®à ï
; ¯®«­®áâìî á®á⮨⠨§ ᨬ¢®«®¢, ­ ©¤¥­­ëå ¢ áâப¥ s2. ã«¥¢®©
; ᨬ¢®« ®ª®­ç ­¨ï áâப¨ s2 ­¥ à áᬠâਢ ¥âáï.
; …᫨ áâப  s1 ­ ç¨­ ¥âáï á ᨬ¢®« , ­¥ ¢å®¤ï饣® ¢ áâபã s2,
; ¢®§¢à é ¥âáï 0.
;
; size_t strspn(*s1, *s2)
;
strspn_::
ld b,h
ld c,l
ld hl,0 ; ­ ç. ¤«¨­  ¯®¤áâப¨
@1: ld a,(bc)
or a
ret z
push hl
ex de,hl
push hl
ld e,a
call @inran##
pop de
pop hl
ret z ; ¢¥à­ãâì ¤«¨­ã ¯®¤áâப¨
inc hl
inc bc
jp @1
ENDMODULE
MODULE strstr
;
; "string.h"
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ¯¥à¢®¥ ¢å®¦¤¥­¨¥
; áâப¨ s2 ¢ áâபã s1.
; ”ã­ªæ¨ï ¢®§¢à é ¥â NULL, ¥á«¨ s2 ­¥ ¡ë«  ­ ©¤¥­ .
; …᫨ ¤«¨­  áâப¨ s2 à ¢­  0, ¢®§¢à é ¥âáï s1.
;
; char *strstr(*s1, *s2)
;
strstr_::
ld a,(hl)
or a
jr nz,@1
ld l,a ; NULL
ld h,a
ret
@1: push hl ;  ¤à¥á s1
push de ;  ¤à¥á s2
@2: ld a,(de) ; s2
or a
jr z,@3
cp (hl) ; s1
inc hl
inc de
jp z,@2
pop de
pop hl
inc hl
jp strstr_
;
@3: pop de
pop hl ; ¢¥à­ãâì  ¤à¥á s1
ret
ENDMODULE
MODULE strtok
;
; "string.h"
; ®¨áª ⮪¥­ (®¢).
; ”ã­ªæ¨ï ­ å®¤¨â ¢ áâப¥ s1 ⮪¥­, ®â¤¥«¥­­ë© ®¤­¨¬ (¨«¨ ¡®«¥¥)
; ®£à ­¨ç¨â¥«¥¬ ¨§ ¬­®¦¥á⢠ ᨬ¢®«®¢-®£à ­¨ç¨â¥«¥© áâப¨ s2.
;  ©¤¥­­ë© ⮪¥­ ¢ áâப¥ s1 ®ª ­ç¨¢ ¥âáï ­ã«¥¬.
; „«ï ⮣®, çâ®¡ë ¯à®ç¨â âì á«¥¤ãî騩 ⮪¥­ ¨§ s1, äã­ªæ¨ï strtok
; ¤®«¦­  ¢ë§ë¢ âìáï á NULL-§­ ç¥­¨¥¬ ¤«ï  à£ã¬¥­â  s1.
; €à£ã¬¥­â NULL s1 ¢ë§ë¢ ¥â strtok ­  ¯®¨áª á«¥¤ãî饣® §­ ª  ¢
; ¯à¥¤ë¤ã饩 áâப¥ ᨬ¢®«®¢.
; Œ­®¦¥á⢮ ®£à ­¨ç¨â¥«¥© ¢ áâப s2, ®â ¢ë§®¢  ª ¢ë§®¢ã, ¬®¦¥â
; ¡ëâì à §«¨ç­ë¬, â ª çâ® s2 ¬®¦¥â ¯à¨­¨¬ âì «î¡ë¥ §­ ç¥­¨ï.
; ਠª ¦¤®¬ ¢ë§®¢¥, äã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ­ ©¤¥­­ë©
; ⮪¥­ áâப¨ s1, ª ¦¤ë© à § ¯à®¤¢¨£ ïáì ¢¯¥à¥¤ ¯® áâப¥ s1.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì NULL, ª®£¤  ¡®«ìè¥ ­¥â ⮪¥­®¢
; ¢ áâப¥ s1.
;
; char *strtok(*s1, *s2)
;
strtok_::
ld (@4+1),de ; s2
ld (@2+1),hl ; s1
ld a,l
or h
jr nz,@0
@3: ld hl,0 ;  ¤à¥á á«¥¤. ¯®¨áª  ¢ s1
ld (@2+1),hl
@0: ld (@1+1),hl ; s1
@2: ld hl,0 ; ⥪.  ¤à¥á ¢ s1
ld a,(hl)
inc hl
ld (@2+1),hl
or a
jr z,@1
ld e,a
@4: ld hl,0 ; á®åà.  ¤à¥á s2
call @inran##
jr z,@2
ld hl,(@2+1) ; ⥪.  ¤à¥á ¢ s1
dec hl
ld (hl),0 ; ­  ¬¥áâ® ­ ©¤¥­­®£® ᨬ¢®«  ?
inc hl
ld (@3+1),hl ;  ¤à¥á á«¥¤. ¯®¨áª  ¢ s1
@1: ld hl,0 ;  ¤à¥á ­ ©¤¥­­®£® ᨬ¢®« 
ret
ENDMODULE