Pouzivam kdyz zkoumam jak to na Z80 resi nejlepsi soucasny prekladac C. Tedy z88dk.
Ale ten vubec neumi delit konstantou.
Krome nasobku 2 a to jeste jen nejake nasobky dvou.
Konkretne umi delit beznamenkove inline 2, 4, 256 a 512.
Pak dokaze volat funkci pro bitovy posun pro deleni 8,16,32,64,128.
1024 a vyse uz radsi vola obecnou funkci pro deleni.
Bojim se psat dal abych nebyl prilis kriticky... muselo to dat spoustu prace a je to zdarma.
Vcera jsem zkousel jak umi kopirovat 16 bitovou hodnotu z jednoho pointeru na druhy pointer.
void copypointer(int *adr1, int *adr2) { *adr2 = *adr1; }
._copypointer ld hl,2 ;const call l_gintspsp ; ld hl,6 ;const add hl,sp call l_gint ; call l_gint ; pop de call l_pint ret
https://godbolt.org/z/fdxGKabfr
Kdyz si to projdete vcetne neukazanych pomocnych rutin tak ten kod vypada
._copypointer ld hl,2 ; 3:10 call l_gintspsp ; 3:17 .l_gintspsp add hl,sp ; 1:11 inc hl ; 1:6 inc hl ; 1:6 ld a,(hl) ; 1:7 inc hl ; 1:6 ld h,(hl) ; 1:7 ld l,a ; 1:4 ex (sp),hl ; 1:19 jp (hl) ; 1:4 ld hl,6 ; 3:10 add hl,sp ; 1:11 call l_gint ; 3:17 .l_gint ld a,(hl) ; 1:7 inc hl ; 1:6 ld h,(hl) ; 1:7 ld l,a ; 1:4 ret ; 1:10 call l_gint ; 3:17 .l_gint ld a,(hl) ; 0:7 inc hl ; 0:6 ld h,(hl) ; 0:7 ld l,a ; 0:4 ret ; 0:10 pop de ; 1:10 call l_pint ; 3:17 .l_pint ld a,l ; 1:4 ld (de),a ; 1:7 inc de ; 1:6 ld a,h ; 1:4 ld (de),a ; 1:7 ret ; 1:5 ret ; 1:5 ;[41:285]
a rucne to jde napsat jako
ldi ; 2:16 __INFO [DE++] = [HL++], BC-- ldd ; 2:16 __INFO [DE--] = [HL--], BC-- ; seconds: 0 ;[ 4:32]
HL a DE nebude zmeneno a BC se zmensi o 2.
Jde to napsat i hure, ale neverim ze kdokoliv by to napsal tak slozite jako neironicky opravdu nejlepsi prekladac C na Z80.
10x delsi kod a 9x pomalejsi.
K tomu ocekavejte ze vam to automaticky pribali ke kodu 4 kb asi pro runtime knihovnu.