Názor k článku Specifika instrukční sady mikroprocesorů Intel 8086/8088 (2) od _dw - Pouzivam kdyz zkoumam jak to na Z80 resi...

  • 19. 9. 2024 0:36

    _dw

    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.