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>
661 lines
9.7 KiB
NASM
661 lines
9.7 KiB
NASM
; ‚室ï騥 äãªæ¨¨:
|
|
;
|
|
; 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
|