Код:
void circle3(unsigned char cx, unsigned char cy, unsigned char r) __naked
{ cx,cy,r;
__asm
ld hl,#2
add hl,sp
ld b,(hl)
inc hl
ld c,(hl)
inc hl
ld l,(hl)
ld (xcyc+1),bc ; b = x, c = y. , переменная в коде команды.
xor a,a
ld c,l ; y = r;
ld b,a ; x = 0;
ld h,a
add hl,hl
ld de,#5
ex de,hl
or a,a
sbc hl,de
ld (var_d+1),hl ; d = 5 - 2r;
loop:
ld a,b
cp c
jp c,q0
call z,pixels
ret
q0: call pixels
var_d:
ld de,#0 ; _d переменная в коде команды.
bit 7,d
jp z,q1
; d < 0:
ld h,#0
ld l,b
add hl,hl
add hl,hl
add hl,de
ld de,#6
add hl,de
ld (var_d+1),hl
inc b ; ++x
jp loop
q1: ld a,b ; x-y
sub c
ld l,a
sbc a,a
ld h,a ; sign is extended
add hl,hl
add hl,hl
add hl,de
q3: ld de,#10
add hl,de
ld (var_d+1),hl
dec c ; --y
inc b ; ++x
jp loop
pixels:
;xc+x, yc+y
xcyc: ld hl,#0 ;(xcyc)
ld a,b
or a,a
jp z,p1
add a,h
jp c,p1
ld d,a
ld a,c
or a,a
jp z,p1
add a,l
cp a,#192
jp nc,p1
ld e,a
call plote
; xc+x, yc-y
ld hl,(xcyc+1)
p1: ld a,b
or a,a
jp z,p2
add a,h
jp c,p2
ld d,a
ld a,l
sub a,c
jp c,p2
ld e,a
call plote
; xc-x, yc-y
ld hl,(xcyc+1)
p2: ld a,h
sub a,b
jp c,p3
ld d,a
ld a,l
sub a,c
jp c,p3
ld e,a
call plote
; xc-x, yc+y
ld hl,(xcyc+1)
p3: ld a,h
sub a,b
jp c,p4
ld d,a
ld a,l
or a,a
jp z,p4
add a,c
cp #192
jp nc,p4
ld e,a
call plote
; xc+y, yc+x
ld hl,(xcyc+1)
p4: ld a,h
or a,a
jp z,p5
add a,c
jp c,p5
ld d,a
ld a,b
or a,a
jp z,p5
add a,l
cp #192
jp nc,p5
ld e,a
call plote
; xc+y, yc-x
ld hl,(xcyc+1)
p5: ld a,c
or a,a
jp z,p6
add a,h
jr c,p6
ld d,a
ld a,l
sub a,b
jr c,p6
ld e,a
call plote
; xc-y, yc-x
ld hl,(xcyc+1)
p6: ld a,h
sub a,c
jr c,p7
ld d,a
ld a,l
sub a,b
jr c,p7
ld e,a
call plote
; xc-y, yc+x
ld hl,(xcyc+1)
p7: ld a,h
sub a,c
ret c
ld d,a
ld a,b
or a,a
ret z
add a,l
ret c
ld e,a
call plote
ret
plote: ; (C)SATSOFT, Body #07.
push bc
; LD D,10 ;КООРДИНАТА Х
; LD E,11 ;КООРДИНАТА Y
LD A,#0xAF ;РАСЧЕТ АДРЕСА ПО КООРДИНАТАМ
SUB E
jp c,exit
LD E,A
AND A
RRA
SCF
RRA
AND A
RRA
XOR A,E
AND #0xF8
XOR A,E
LD H,A
LD A,D
RLCA
RLCA
RLCA
XOR A,E
AND #0xC7
XOR A,E
RLCA
RLCA
LD L,A
LD A,D ;КООРДИНАТА Х
AND #0x07 ;МАСКИРОВАНИЕ
LD B,A ;ОСТАТОК ОТ ДЕЛЕНИЯ Х НА 8
INC B ;+1
LD A,#0xFE ;ВВЕЛИ БАЙТ 11111110
PLOOP:
RRCA ;ВРАЩЕНИЕ N+1 РАЗ
DJNZ PLOOP
LD B,#0xFF ;ИНВЕРСИЯ,ЧТОБЫ ПЕЧАТЬ ТОЧКИ БЫЛА ЧЕРНЫМ
XOR A,B ;ПО БЕЛОМУ
LD B,A ;ЗАПОМНИЛИ В РЕГИСТРЕ 'B'
LD A,(HL) ;В 'А' ГРУЗИМ ЗНАЧЕНИЕ ИЗ ЭКРАНА
OR A,B ;ВКЛЮЧЕМ ТРЕБУЕМЫЙ БИТ
LD (HL),A ;ГРУЗИМ В ЭКРАН ПОЛУЧЕННЫЙ РЕЗУЛЬТАТ
exit:
pop bc
RET ;ВЫХОД ИЗ ПРОЦЕДУРЫ :)
__endasm;
}