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:
+660
@@ -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
|
||||
Reference in New Issue
Block a user