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.asmPříloha:
jako_kruh.png [ 46.81 KiB | Zobrazeno 9528 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