OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů

Reklama!

Právě je 13 pro 2018, 13:44

Všechny časy jsou v UTC + 1 hodina




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 8 ] 
Autor Zpráva
 Předmět příspěvku: Mandelbrod set PMD
PříspěvekNapsal: 20 čer 2016, 13:08 
Offline
Kecálek

Registrován: 21 říj 2013, 08:25
Příspěvky: 247
Has thanked: 98 times
Been thanked: 87 times
Pouze jsem chtěl vyzkoušet tento prográmek http://www.retroprogramming.com/2014/03/plotting-mandelbrot-set-on-zx-spectrum.html na PMD a to se zadařilo...tak přikládám kód (amaterský) pro někoho kdo by se v tom chtěl ještě pokoukat či dále zkoušet :P

binarka a kód pro pmd: JUMP 0000
Příloha:
mandelbord_set_pmd.zip [2.54 KiB]
105 krát

iterations 15
Příloha:
mandelbrod_set_15_pmd.png
mandelbrod_set_15_pmd.png [ 16.63 KiB | Zobrazeno 3439 krát ]

iterations 40
Příloha:
mandelbrod_set_40_pmd.png
mandelbrod_set_40_pmd.png [ 13.96 KiB | Zobrazeno 3439 krát ]


a kód k prohlížení :)
Kód:
   .org 0
    .engine   pmd
   
      lxi      d,0xFFBF   
XLOOP:
        push   d
        lxi    h,0xFF4Ch   ;-180   ; x-coordinate
        mov    e,d
        call   SCALE
        sta      ZALA
        mov      a,c       ;(XPOS),bc
        sta      XPOS
        mov      a,b
        sta      XPOS+1     ;---
        lda      ZALA
        pop    d
YLOOP:
        push    d
        lxi      h,0xFFA0   ;-96    ; y-coordinate
      call   SCALE
        sta      ZALA
        mov      a,c         ;(YPOS),bc
        sta      YPOS
        mov      a,b
        sta      YPOS+1      ;---
        lda      ZALA
        lxi    h,0
        shld   IMAG
        shld   REAL
        mvi    b,40      ; iterations
ITER:
        push   b   
        lhld   IMAG      ;bc,(IMAG)
        mov      c,l
        mov      b,h
        lhld    REAL      ;hl,(REAL)
        ora      a
        sta      ZALA      ;sbc hl,bc
        mov      a,l
        sub      c
        mov      l,a
        mov      a,h
        sbb      b
        mov      h,a
        lda      ZALA
        mov      d,h
        mov      e,l
        dad    b
        dad      b
        call   FIXMUL
        xchg
        lhld   XPOS
        xchg            ;de,(XPOS)
        dad      d
        sta      ZALA
        xchg
        lhld   REAL
        xchg            ;de,(REAL)
        mov      a,l
        sta    REAL
        mov      a,h
        sta      REAL+1
        lhld   IMAG      ;hl,(IMAG)
        lda      ZALA
        call   FIXMUL
        ral
        dad      h         ;adc hl,hl
        xchg
        lhld   YPOS
        xchg            ;de,(YPOS)
        dad    d
        shld   IMAG      ;(IMAG),hl
        call    ABSVAL
        xchg
        lhld    REAL      ;hl,(REAL)   
        call   ABSVAL
        dad    d
        mov      a,h
        cpi      0x2E        ; 46 ≅ 2 × √ 2 << 4
        pop      b
        jnc      ESCAPE
        dcr      b         ;djnz ITER
      jnz      ITER
      pop    d
        call   PLOT
        db 254       ; trick to skip next instruction
ESCAPE:
        pop      d
        dcr      e
        jnz      YLOOP
        dcr      d
        jnz      XLOOP
        ret

FIXMUL:        ; hl = hl × de >> 24
        call   MULT16BY16
        mov      a,b
        mvi    b,4
FMSHIFT:
        ral
        sta      ZALA   ;adc hl,hl
        mov      a,l
        add      l
        mov      l,a
        mov      a,h
        adc      h
        mov      h,a
        lda      ZALA
        dcr      b   ;djnz FMSHIFT
      jnz      FMSHIFT
      ret

SCALE:         ; bc = (hl + e) × zoom
        mvi      d,0
        dad    d
        lxi    d,0x30     ; zoom

MULT16BY16:    ; hl:bc (signed 32 bit) = hl × de
        xra    a
        call   ABSVAL
        xchg
        call   ABSVAL
        push    PSW
        mov    c,h
        mov      a,l
        call    MULT8BY16
        mov      b,a
        mov      a,c
        mov      c,h
        push    b
        mov      c,l
        call    MULT8BY16
        pop    d
        dad      d
        adc    b
        mov      b,l
        mov      l,h
        mov      h,a
        pop PSW
        rar
        rnc
        xchg
        xra    a
        mov      h,a
        mov      l,a
                       ;sbc hl,bc
        mov      a,l
        sub      c
        mov      l,a
        mov      a,h
        sbb      b
        mov      h,a
       
        mov    b,h
        mov      c,l
        mvi      h,0
        mvi      l,0
                       ;sbc hl,de
        mov      a,l
        sub      e
        mov      l,a
        mov      a,h
        sbb      d
        mov      h,a
        ret

MULT8BY16:     ; returns a:hl (24 bit) = a × de
        lxi      h,0
        mvi      b,8
M816LOOP:
        dad      h
        ral
        jnc      M816SKIP
        dad    d
        aci    0
M816SKIP:
        dcr      b   ;djnz M816LOOP
        jnz         M816LOOP
        ret

ABSVAL:        ; returns hl = |hl| and increments
        sta      ZALA
      mov      a,h      ;bit 7,h
      rlc            ; a if the sign bit changed
        lda      ZALA
        rnc            ;rz
        mov      b,h
        mov      c,l
        lxi      h,0
        ora    a
        sta      ZALA   ;sbc hl,bc
        mov      a,l
        sub      c
        mov      l,a
        mov      a,h
        sbb      b
        mov      h,a
        lda      ZALA
        inr    a
        ret
       
PLOT:          ; plot d = x-axis, e = y-axis
   push   h
    push   b
    push   d
    mov      a,d
    sta      x
    lxi      h,0xc000h   ;poèáteèní adresa videoram
    mov      b,e
   mov      e,b
   ; začátek výpočtu souřadnice Y

   mov      d,e         ;5T
    ;--- reg E
    mvi      a,0x03h      ;7T
   ana      e         ;4T
    rrc               ;4T
    rrc               ;4T
    mov      e,a         ;5T
    ;--- celkem 25T
    ;--- reg D
    mov      a,d         ;5T
    rar               ;4T
    rar               ;4T
    ani      0x3fh      ;7T
    mov      d,a         ;5T
    ;--- celkem 25T

   dad      d         ; sečíst adresy
   ; konec výpočtu souřadnice Y
   
    lda      x
    mov      d,a
   ; zacatek vypoctu souradnice X
    mov      c,d
   mov      a,c
   mvi      c,0x06h
   cmp      c
    jc      minus_ne
   
minus:
   sbb      c
    inr      l
   cmp      c
   jnc      minus
minus_ne:
   mov      c,a
    mvi      a,0x00
    cmp      c
    jp      rotace_ne
   
   mvi      a,0x01
rotace_bod:
   rlc
    dcr      c
    jnz      rotace_bod
   jmp      plotbit
rotace_ne:
   mvi      a,0x01h
   ; konec vypoctu souradnice X

plotbit:
    ora      m
   mov      m,a
    pop      d
    pop      b
    pop      h
   ret
   ; konec plot


XPOS:   .equ 0x0FA0h
YPOS:   .equ 0x0FA2h
REAL:   .equ 0x0FA4h
IMAG:   .equ 0x0FA6h
ZALA:   .equ 0x0FA8h      ;zaloha registru A
x:      .equ 0x0FAA         ;zaloha reg d pro x souradnici


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Mandelbrod set PMD
PříspěvekNapsal: 21 čer 2016, 09:12 
Offline
Pan Generální

Registrován: 22 kvě 2013, 20:14
Příspěvky: 2042
Bydliště: Bratislava
Has thanked: 224 times
Been thanked: 378 times
Skvele :) Ako dlho to kreslilo ?


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Mandelbrod set PMD
PříspěvekNapsal: 21 čer 2016, 09:49 
Offline
Kecálek

Registrován: 21 říj 2013, 08:25
Příspěvky: 247
Has thanked: 98 times
Been thanked: 87 times
Tu iterations 15 nevím, ale při 40 jsem se podival a cca 23min. Používám emulator IDE80.

PS: Jen jsem nepřišel na to jak ušetřit nějaký ten takt u SBC HL,BC, na z80 15T a i8080 28T a ještě musím zálohovat reg A :?:


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Mandelbrod set PMD
PříspěvekNapsal: 21 čer 2016, 11:04 
Offline
Pan Generální

Registrován: 22 kvě 2013, 20:14
Příspěvky: 2042
Bydliště: Bratislava
Has thanked: 224 times
Been thanked: 378 times
mmartinka píše:
Jen jsem nepřišel na to jak ušetřit nějaký ten takt u SBC HL,BC, na z80 15T a i8080 28T a ještě musím zálohovat reg A :?:
Napriklad tak, ze vynechas ora a pred implementaciou SBC HL,BC pouzivajucou sub c (usetris 4 takty) :) Dalsich 5 taktov usetris ak A budes zalohovat nie ukladanim a citanim ZALA ale klasicky pomocou push/pop. Tiez som si vsimol, ze v niektorych pripadoch mas volne 8bit registre, tak A odzalohuj do takehoto registra - vtedy usetris dokonca az 16 taktov.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Mandelbrod set PMD
PříspěvekNapsal: 21 čer 2016, 11:36 
Offline
Kecálek

Registrován: 18 říj 2014, 22:10
Příspěvky: 190
Has thanked: 12 times
Been thanked: 42 times
V podprograme "MULT16BY16:" by podľa mňa mala byť namiesto "sub e" použitá inštrukcia "sbb e".

mmartinka píše:
PS: Jen jsem nepřišel na to jak ušetřit nějaký ten takt u SBC HL,BC, na z80 15T a i8080 28T a ještě musím zálohovat reg A :?:

V pprg "MULT16BY16:" aj v "ABSVAL:" sa "sbc hl,bc" a "sbc hl,de" používa len na zmenu znamienka.
Ja by som skúsil pre 16bit (ABSVAL):
mov a,l
cma
mov l,a
mov a,h
cma
mov h,a
inx h

a pre 32bit (MULT16BY16):
mov a,c
cma
mov c,a
mov a,b
cma
mov b,a
mov a,l
cma
mov l,a
mov a,h
cma
mov h,a
inr c
rnz ;rnc
inr b
rnz ;rnc
inx h
ret

Pozabudol som na to, že "inr" asi nenastavuje Carry, tak som opravil "rnc" na "rnz".


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Mandelbrod set PMD
PříspěvekNapsal: 21 čer 2016, 15:23 
Offline
Kecálek

Registrován: 21 říj 2013, 08:25
Příspěvky: 247
Has thanked: 98 times
Been thanked: 87 times
Tohle přece nemůže fungovat, on tam potřebuje obrácenou hodnotu z 255 ne bitovou negaci?

Antony/DTA píše:
V podprograme "MULT16BY16:" by podľa mňa mala byť namiesto "sub e" použitá inštrukcia "sbb e".

mmartinka píše:
PS: Jen jsem nepřišel na to jak ušetřit nějaký ten takt u SBC HL,BC, na z80 15T a i8080 28T a ještě musím zálohovat reg A :?:

V pprg "MULT16BY16:" aj v "ABSVAL:" sa "sbc hl,bc" a "sbc hl,de" používa len na zmenu znamienka.
Ja by som skúsil pre 16bit (ABSVAL):
mov a,l
cma
mov l,a
mov a,h
cma
mov h,a
inx h

a pre 32bit (MULT16BY16):
mov a,c
cma
mov c,a
mov a,b
cma
mov b,a
mov a,l
cma
mov l,a
mov a,h
cma
mov h,a
inr c
rnz ;rnc
inr b
rnz ;rnc
inx h
ret

Pozabudol som na to, že "inr" asi nenastavuje Carry, tak som opravil "rnc" na "rnz".


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Mandelbrod set PMD
PříspěvekNapsal: 21 čer 2016, 16:25 
Offline
Kecálek

Registrován: 18 říj 2014, 22:10
Příspěvky: 190
Has thanked: 12 times
Been thanked: 42 times
Citace:
Tohle přece nemůže fungovat, on tam potřebuje obrácenou hodnotu z 255 ne bitovou negaci?

zmena znamienka z 1 na -1 (doplnkový kód):
complement 1=254
increment 254=255 ;255=-1


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Mandelbrod set PMD
PříspěvekNapsal: 21 čer 2016, 21:29 
Offline
Kecálek

Registrován: 21 říj 2013, 08:25
Příspěvky: 247
Has thanked: 98 times
Been thanked: 87 times
Dal jsem 4 průchody za sebou se změnou barvy. Jednoduší by byl jeden průchod a změna barvy podle iterace. Ale i tak to vypadá zajímavě :)

iterations 3-6-9-12
Příloha:
Mandelbrot_set_4x_pmd.png
Mandelbrot_set_4x_pmd.png [ 19.41 KiB | Zobrazeno 3265 krát ]


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 8 ] 

Všechny časy jsou v UTC + 1 hodina


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 1 návštěvník


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz