OldComp.cz

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


Právě je 28.03.2024, 23:45

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 4 ] 
Autor Zpráva
 Předmět příspěvku: Místo kruhu, zmije...
PříspěvekNapsal: 24.05.2016, 14:47 
Offline
Radil

Registrován: 21.10.2013, 09:25
Příspěvky: 286
Has thanked: 161 times
Been thanked: 116 times
Jako obvykle, přijde na mě jednou za čas chuť posunout mé znalosti s i8080 na PMD o krok dále.

V jiném vlakně jsem se pokoušel o výpočet souřadnice x,y http://oldcomp.cz/viewtopic.php?f=50&t=2715 a pro zkoušku jsem chtěl nakreslit kruh. Přiznavám že jsem použil kod Z80 z HP kalkulatoru, jenže kruh ne a ne...viz obr.
Výpočet souřadnic je dobrý, protože jsem si to ověřil i pomoci rutiny z ROM. Výsledek stejný...

Zajímá mě kde jsem udělal chybu, pochybuji že původní rutina kreslila kruh takhle :)

Původní rutina http://www.ticalc.org/pub/85/asm/source/routines/circle.asm
Příloha:
jako_kruh.png
jako_kruh.png [ 46.81 KiB | Zobrazeno 9942 krát ]


Kód:
    .ENGINE pmd
    .ORG    0


xold:   .equ   0xc170h   ;x souradnice
yold:   .equ   0xc172h ;y souradnoce
mod:   .equ   0xc1fah ;mod bodu
attr:   .equ   0xc03ah ;atribut

;------------------------------
; Bresenham's circle algorithm
;
; * parameters :
;    - D : x coordinate of center
;    - E : y coordinate of center
;    - B : radius - allow djnz's             
;

;------------------------------
; test procedure
;------------------------------

Start:                         
        lxi      D,0x8080h     ;coordinates of center
        mvi      B,0x80h       ;radius
LoopE:
        call   Circle
        dcr      b
        jnz      LoopE
      ret

;------------------------------
; beginning of circle
;------------------------------

Circle:                         
        push    B              ;can be removed
        push    D              ;can be removed
        mvi      H,0
        mov      L,B
;      mov      a,b            ;rlc  B - puvodni
;       rlc
;       mov      b,a
      mvi     A,0x06
        sub     B
        push    PSW
Loop:
        mov     A,D             ;Point #1
        add     H
        mov     B,A
        mov     A,E
        add     L
        mov     C,A
        call plot_vypocet
       
        mov     A,E             ;Point #2
        sub     L
        mov     C,A
        call plot_vypocet
       
        mov     A,D             ;Point #4
        sub     H
        mov     B,A
        call plot_vypocet
       
        mov     A,E             ;Point #3
        add     L
        mov     C,A
        call plot_vypocet
       
      mov      A,D             ;Point #5
        add     L
        mov     B,A
        mov       A,E
        add     H
        mov     C,A
        call plot_vypocet
       
        mov     A,E             ;Point #6
        sub     H
        mov     C,A
        call plot_vypocet
       
        mov     A,D             ;Point #8
        sub     L
        mov     B,A
        call plot_vypocet
       
        mov     A,E             ;Point #7
        add     H
        mov     C,A
        call plot_vypocet
       
        mov     A,H             ;is the circle finished ?
        sub     L
        jnc      EndCircle       ;yes
        pop     PSW
        mov     B,A
        rlc
        jnc      Pos
;        mov     A,H         ;puvodni
;        bit     7,B         ;puvodni
;        jz      Pos            ;původni
Neg:                            ;case d<0
      mov      A,H
      ral
        ral
        add     B
        adi     0x06
        push    PSW
        jmp     EndC
Pos:                            ;case d>=0
      mov      A,H
      sub     L
        ral
        ral
        add     B
        adi     0x0a
        push    PSW
        dcr     L
EndC:                           ;one loop has been performed
        inr     H
        jmp     Loop           
EndCircle:
        pop     PSW            ;MUST NOT BE REMOVED
        pop     D              ;can be removed
        pop     B              ;can be removed
        ret


plot_vypocet:         ;vypocet s pouzitim ROM rutiny
   push   h
    push   d
    push   b
    mvi      a,0xb0h
    sta      mod
    mov      a,b         ;x do
    sta      xold      ;xold
    mov      a,c         ;y do
    sta      yold      ;yold
    call   0x8c7dh
   pop      b
    pop      d
    pop      h
    ret
   
plot_vypocet_old:      ;vypocet pomoci meho verku

   push   h
    push   d
    push   b
    lxi      h,0xc000h   ;poèáteèní adresa videoram
   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
   
   ; zacatek vypoctu souradnice X
   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      plot
rotace_ne:
   mvi      a,0x01h
   ; konec vypoctu souradnice X

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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Místo kruhu, zmije...
PříspěvekNapsal: 24.05.2016, 16:09 
Offline
Radil
Uživatelský avatar

Registrován: 12.05.2013, 20:32
Příspěvky: 457
Bydliště: Kladno
Has thanked: 46 times
Been thanked: 118 times
...to je boží.... :)

_________________
>>eLeMeNt, MB03+, Amiga 1200, ZX Spectrum 128 +2A, ZX Spectrum+, Didaktik Gama, LnxSpectrum, LnxTracker, LnxAmigaImageConvertor, https://www.ilnx.cz <<


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Místo kruhu, zmije...
PříspěvekNapsal: 25.05.2016, 11:04 
Offline
Radil

Registrován: 07.05.2014, 10:29
Příspěvky: 366
Has thanked: 11 times
Been thanked: 39 times
no. ono to vyzera ze funguje OK pre male priemery (stred). pri malom displeji/rozliseni kalkulatora to bolo zrejme v poriadku, takze mozno nejake pretecenie hodnoty?


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Místo kruhu, zmije...
PříspěvekNapsal: 30.05.2016, 12:58 
Offline
Radil

Registrován: 21.10.2013, 09:25
Příspěvky: 286
Has thanked: 161 times
Been thanked: 116 times
Příloha:
kruh.png
kruh.png [ 37.31 KiB | Zobrazeno 9779 krát ]


Takže zas tak složité to nebylo, ponejprve jsem vyhodil bitový posun RAL ze sekce Neg: a Pos: Nespíš to bylo použito s ohledem na kalkulátor HP a pak upravil ve stejných sekcích ADI na hodnotu 0x04h jak to tak chápu je to nějaká korekce...

s ADI 0x04h
Příloha:
kruh_kor.png
kruh_kor.png [ 9.2 KiB | Zobrazeno 9779 krát ]

bez ADI
Příloha:
kruh_nekor.png
kruh_nekor.png [ 9.15 KiB | Zobrazeno 9779 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ů: 4 ] 

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 2 návštevní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