nedoPC.org

Community for electronics hobbyists, established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 06 Oct 2024 23:06



Reply to topic  [ 9 posts ] 
Библиотека графических функций 
Author Message
Junior

Joined: 23 Nov 2004 14:47
Posts: 8
Reply with quote
Code:
;Библиотека пока не оптимизированна и не везде вставлена проверка на выход за границы области вывода.
; при компиляции небудут определены некоторые переменные
; но их нетрудно восстановить по смысловому названию (страница экрана, порт Y)
;Переменные в начальном заголовке - вообще не актуальны до выхода операционной системы и утверждения стандарта для заголовка библиотек
; На реальном железе не проверялась :-( - написана под эмулятор
;include system.a
;include graph.h
;include object.asm

   db TLIB
   db 0
   dw 0
   dw 0
   dw 0
   dw nameLib
   db LibGraph/256,10h
   db 0
   dw 0
   db 0ffh ; - количество функций
   dw _GrExec
   dw _GrExit
   dw _GrTime
   dw _GrMain
   dw _GrError
   dw 0
   dw 0
   dw 0
   dw _GrLineOx
   dw _CanLineOx
   dw _GrLineOy
   dw _CanLineOy
   dw _GrRect   ;debug
   dw _CanRect
   dw _GrFullRect   ;ok
   dw _CanFullRect
   dw _GrLineXY   ; ok
   dw _CanLineXY
   dw _GrCircle
   dw _CanCircle

namelib db 'Graph библиотека графических функций',0

_GrExec
   nop
   ret
_GrTime
_GrError
_GrExit
_GrMain
   ld bc,SysExitGos
   rst gos
   ret

_CanLineOx
_CanLineOy
_CanRect
_CanFullRect
_CanLineXY
_CanCircle
   ret

;*****************************************************
;Рисует окружность
; а - цвет
;hl,e - координаты центра - x,y
;d - радиус

_GrCircle
; инициализируем переменные по алгаритму
   ld (cir_col),a
   ld a,d
   ld (cir_y),a
   xor a
   ld (cir_x),a
   ld d,a
   ld (cir_yc),de
   ld (cir_xc),hl
; определяем переменную приближения D=3-2*r   
   ld hl,3
   ld de,(cir_y)
   sla e
   rl d
   sbc hl,de
   ld (cir_d),hl

   in a,(PAGE3)   ;запомнить окно 3
   ld  (cir_sp3+1),a
   ld a,VPAGE
   out (PAGE3),a   ;подключить видеостраницу
 

lop_cir
   ld a,(cir_x)
   ld c,a
   ld a,(cir_y)
   cp c
   jp c,end_cir
; вывод точек на экран
;**********************************
   ld hl,(cir_xc)
   ld de,(cir_x)
   add hl,de
   ld de,Screen_offset
   add hl,de

   ld a,(cir_yc)
   ld c,a
   ld a,(cir_y)
   add a,c
   jr c,c1_n1
   out(PORT_Y),a
   ld a,(cir_col)
   ld (hl),a

c1_n1   ld a,(cir_y)
   ld c,a
   ld a,(cir_yc)
   sub c
   jr c,c1_n
   out(PORT_Y),a
   ld a,(cir_col)
   ld (hl),a
;***********************************
c1_n   ld hl,(cir_xc)
   ld de,Screen_offset
   add hl,de
   ld de,(cir_x)
   sbc hl,de

   ld a,(cir_yc)
   ld c,a
   ld a,(cir_y)
   add a,c
   jr c,c2_n1
   out(PORT_Y),a
   ld a,(cir_col)
   ld (hl),a

c2_n1   ld a,(cir_y)
   ld c,a
   ld a,(cir_yc)
   sub c
   jr c,c2_n
   out(PORT_Y),a
   ld a,(cir_col)
   ld (hl),a
;*********************************
c2_n   ld hl,(cir_xc)
   ld de,(cir_y)
   add hl,de
   ld de,Screen_offset
   add hl,de

   ld a,(cir_yc)
   ld c,a
   ld a,(cir_x)
   add a,c
   jr c,c3_n1
   out(PORT_Y),a
   ld a,(cir_col)
   ld (hl),a

c3_n1   ld a,(cir_x)
   ld c,a
   ld a,(cir_yc)
   sub c
   jr c,c3_n
   out(PORT_Y),a
   ld a,(cir_col)
   ld (hl),a
;***********************************
c3_n
   ld hl,(cir_xc)
   ld de,Screen_offset
   add hl,de
   ld de,(cir_y)
   sbc hl,de

   ld a,(cir_yc)
   ld c,a
   ld a,(cir_x)
   add a,c
   jr c,c4_n1
   out(PORT_Y),a
   ld a,(cir_col)
   ld (hl),a

c4_n1   ld a,(cir_x)
   ld c,a
   ld a,(cir_yc)
   sub c
   jr c,c4_n
   out(PORT_Y),a
   ld a,(cir_col)
   ld (hl),a
c4_n

; определяем напрвление приращения D
   ld a,(cir_d+1)
   and a
   jp m,cir_dmin
   ld hl,(cir_x)   ; d=d+4*(x-y)+10
   ld de,(cir_y)
   sbc hl,de
   add hl,hl
   add hl,hl
   ld de,(cir_d)
   add hl,de
   ld de,10
   add hl,de
   ld (cir_d),hl
   ld a,(cir_y)      ;уменьшаем y
   dec a
   ld (cir_y),a
   jr cir_dpl
cir_dmin         ; d=d+4*x+6
   ld hl,(cir_x)
   add hl,hl
   add hl,hl
   ld de,(cir_d)
   add hl,de
   ld de,6
   add hl,de
   ld (cir_d),hl
cir_dpl         ;увеличиваем x   
   ld a,(cir_x)
   inc a
   ld (cir_x),a
   jp lop_cir
end_cir
cir_sp3   ld a,0      ;восстановить окно
   out (PAGE3),a   
   ret

cir_col   dw 0
cir_x   dw 0
cir_y   dw 0
cir_yc   dw 0
cir_xc   dw 0
cir_d   dw 0


;*****************************************************
;Рисует вертикальную линию
; а - цвет
;hl,de - координаты начала - x,y
;hl`,de` - координаты конца - x,y
_GrLineOy
   ld (loy_col3+1),a
   in a,(PAGE3)   ;запомнить окно 3
   ld  (loy_sp3+1),a
   ld a,VPAGE
   out (PAGE3),a   ;подключить видеостраницу
    ld a,e
   out (PORT_Y),a    ;определить переменные y,
   ld bc,Screen_offset
   add hl,bc      ;определить переменные x,
   exx
   ld a,e
   ld (loy_yl+1),a
   exx
   di
   ld d,d   ;команда ускорителя - длинна операции
loy_yl   ld a,0
   ld b,b   
loy_col3   ld a,0
   ld e,e   ;команда ускорителя - тело операции
   ld (hl),a
   ld b,b
   ei

loy_sp3   ld a,0      ;восстановить окно
   out (PAGE3),a   
   ret

;*****************************************************
;Рисует горизониальную линию
; а - цвет
;hl,de - координаты начала - x,y
;hl`,de` - координаты конца - x,y
_GrLineOx
   ld (lox_col1+1),a
   ld (lox_col2+1),a
   in a,(PAGE3)   ;запомнить окно 3
   ld  (lox_sp3+1),a
   ld a,VPAGE
   out (PAGE3),a   ;подключить видеостраницу
    ld a,e
   out (PORT_Y),a    ;определить переменные y,
   ld bc,Screen_offset
   add hl,bc      ;определить переменные x,
   ld (loxkor_x+1),hl
   exx
   ld a,l
   ld (loxkor_xl+1),a
   and a
   jr z,inclox
   ld a,h
inclox   ld (loxblop+1),a
loxkor_x   ld hl,0
   di
loxblop   ld a,0
   and a
   jr z,loxmop
   ld d,d   ;команда ускорителя - длинна операции
   ld a,0
   ld b,b   
lox_col1   ld a,0
   ld c,c   ;команда ускорителя - тело операции
   ld (hl),a
   ld b,b
   inc h
loxmop   ld d,d   ;команда ускорителя - длинна операции
loxkor_xl   ld a,0
   ld b,b   
lox_col2   ld a,0
   ld c,c   ;команда ускорителя - тело операции
   ld (hl),a
   ld b,b
   ei
lox_sp3   ld a,0      ;восстановить окно
   out (PAGE3),a   
   ret

;**************************************************
;Рисует контурный прямоугольник
; а - цвет
;hl,de - координаты начала - x,y
;hl`,de` - высота ширина - dx,dy
_GrRect
   ld (rec_col1+1),a
   ld (rec_col2+1),a
   ld (rec_col3+1),a
   in a,(PAGE3)   ;запомнить окно 3
   ld  (rec_sp3+1),a
   ld a,VPAGE
   out (PAGE3),a   ;подключить видеостраницу
    ld a,e
   out (PORT_Y),a    ;определить переменные y,
   ld (rec_y+1),a
   ld bc,Screen_offset
   add hl,bc      ;определить переменные x,
   ld (reckor_x+1),hl
   exx
   ld a,e
   ld (rec_yl+1),a
   ld (rec_dx+1),hl
   ld a,l
   ld (reckor_xl+1),a
   and a
   jr z,inchtr
   ld a,h
inchtr   ld (recblop+1),a
   ld b,2
reckor_x   ld hl,0
   di
recblop   ld a,0
   and a
   jr z,rsmop
   ld d,d   ;команда ускорителя - длинна операции
   ld a,0
   ld b,b   
rec_col1   ld a,0
   ld c,c   ;команда ускорителя - тело операции
   ld (hl),a
   ld b,b
   inc h
rsmop   ld d,d   ;команда ускорителя - длинна операции
reckor_xl   ld a,0
   ld b,b   
rec_col2   ld a,0
   ld c,c   ;команда ускорителя - тело операции
   ld (hl),a
   ld b,b
   ei
   in a,(PORT_Y)
   add a,e
   out (PORT_Y),a
   djnz reckor_x
   ld hl,(reckor_x+1)
   ld b,2
rec_y   ld a,0
   out (PORT_Y),a      
   di
   ld d,d   ;команда ускорителя - длинна операции
rec_yl   ld a,0
   ld b,b   
rec_col3   ld a,0
   ld e,e   ;команда ускорителя - тело операции
   ld (hl),a
   ld b,b
   ei
rec_dx   ld de,0
   add hl,de
   djnz rec_y
rec_sp3   ld a,0      ;восстановить окно
   out (PAGE3),a   
   ret

;**************************************************
;Рисует заполненный прямоугольник
; а - цвет
;hl,de - координаты начала - x,y
;hl`,de` - высота ширина - dx,dy
_GrFullRect
   ld (fulr_col1+1),a
   ld (fulr_col2+1),a
   in a,(PAGE3)   ;запомнить окно 3
   ld  (fulr_sp3+1),a
   ld a,VPAGE
   out (PAGE3),a   ;подключить видеостраницу
    ld a,e
   out (PORT_Y),a    ;определить переменные y,
   ld bc,Screen_offset
   add hl,bc      ;определить переменные x,
   ld (frkor_x+1),hl
   exx
   ld a,l
   ld (frkor_xl+1),a
   and a
   jr z,inch
   ld a,h
inch   ld (rbiglop+1),a
   ld b,e
lopfrect
frkor_x   ld hl,0
   di
rbiglop   ld a,0
   and a
   jr z,smallop
   ld d,d   ;команда ускорителя - длинна операции
   ld a,0
   ld b,b   
fulr_col1   ld a,0
   ld c,c   ;команда ускорителя - тело операции
   ld (hl),a
   ld b,b
   inc h
smallop   ld d,d   ;команда ускорителя - длинна операции
frkor_xl   ld a,0
   ld b,b   
fulr_col2   ld a,0
   ld c,c   ;команда ускорителя - тело операции
   ld (hl),a
   ld b,b
   ei
   in a,(PORT_Y)
   inc a
   jr z,fulr_sp3
   out (PORT_Y),a
   djnz lopfrect
fulr_sp3   ld a,0      ;восстановить окно
   out (PAGE3),a   
   ret


;*****************************************************
;Рисует линию
; а - цвет
;hl,de - координаты начала - x,y
;hl`,de` - координаты конца - x,y
;*****************************************************
_GrLineXY
   ld (line_col1+1),a
   ld (line_col2+1),a
   in a,(PAGE3)   ;запомнить окно 3
   ld  (lxy_sp3+1),a
   ld a,VPAGE
   out (PAGE3),a   ;подключить видеостраницу
   ld a,e
   out (PORT_Y),a    ;определить переменные y,
   push de
   push hl
   ld bc,Screen_offset
   add hl,bc
   exx       ;определить переменные x в hl`
   pop bc
   and a
   sbc hl,bc
   jr nc,l_xok
   ld a,255   
   xor h
   ld h,a
   ld a,255
   xor l
   ld l,a
   inc hl
   ld (line_dx1+1),hl    ;определить переменные dx
   ld (line_dy2+1),hl
   ld hl,-1
   jr l_xno
l_xok   ld (line_dx1+1),hl
   ld (line_dy2+1),hl
   ld hl,1
l_xno   ld (line_sx1+1),hl   ;определить знак прироста  sx
   ld (line_sx2+1),hl
   pop bc
   ex de,hl
   and a
   sbc hl,bc
   jr nc,l_yok
   ld a,255   
   xor h
   ld h,a
   ld a,255
   xor l
   ld l,a
   inc hl
   ld (line_dy1+1),hl    ;определить переменные dy
   ld (line_dx2+1),hl
   ld a,-1
   jr l_yno
l_yok   ld (line_dy1+1),hl   
   ld (line_dx2+1),hl
   ld a,1
l_yno   ld (line_sy1+1),a    ;определить  знак прироста  sy
   ld (line_sy2+1),a
   ld hl,(line_dx1+1)
   ld de,(line_dy1+1)
   and a
   sbc hl,de
   jr c,CH_NZ   ; определить направление прироста координат
CH_Z   ld hl,(line_dy1+1)
   ld de,(line_dx1+1)
   srl d
   rr e
   and a
   sbc hl,de
   exx       ;определить переменную приближениея E - в hl`
   ld bc,(line_dx1+1)    ; инициализвция цикла
   ld a,c
   ld c,b
   ld b,a
   and a
   in a,(PORT_Y)   
   jr z, l256
linelop   ; в начале цикла в hl - x
line_col1   ld e,0
   ld (hl),e
   exx
   bit 7,h
   jr nz,E_min   ; нужно ли уменьшать Е ?
line_dx1   ld de,0      ;(line_dx)
   and a
   sbc hl,de      ;уменьшаем Е
line_sy1   add a,0      ;приращение координат y
   out (PORT_Y),a
E_min   exx
line_sx1   ld de,0      ; (line_sx)
   add hl,de
   exx
line_dy1   ld de,0      ; (line_dy)
   add hl,de      ; увеличиваем Е
   exx
   djnz linelop
l256   dec c
   jr z,linelop
line_exit
lxy_sp3   ld a,0      ;восстановить окно
   out (PAGE3),a   
   ret
CH_NZ
; определить переменную приближениея Е
   ld hl,(line_dy2+1)
   ld de,(line_dx2+1)
   srl d
   rr e
   and a
   sbc hl,de
   exx ; E - в hl`
; цикл прорисовки
   ld bc,(line_dx2+1)
   ld a,c
   ld c,b
   ld b,a
   and a
   in a,(PORT_Y)
   jr z, l256z
linelop2   ; в начале цикла в hl - x
line_col2   ld e,0
   ld (hl),e
   exx      
   bit 7,h
   jr nz,E_min2    ; нужно ли уменьшать Е ?
line_dx2   ld de,0       ;(line_dx)
   and a
   sbc hl,de   
   exx
line_sx2   ld de,0      ;(line_sx)
   add hl,de
   exx
E_min2   
line_sy2   add a,0
   out (PORT_Y),a
line_dy2   ld de,0       ;(line_dy)
   add hl,de
   exx
   djnz linelop2
l256z   dec c
   jr z,linelop2
   jr line_exit



Поправлено Shaos-ом


23 Nov 2004 14:59
Profile
Retired

Joined: 03 Aug 2003 22:37
Posts: 1474
Location: Moscow
Reply with quote
iret wrote:
;Библиотека пока не оптимизированна и не везде вставлена проверка на выход за границы области вывода.

Это мелочь :) Очень рад что ты выложил библиотеку! В ней давно ощущалась потребность, теперь есть чем пользоваться :) Одно только интересует - чем компилировать ? :)

P.S. Когда публикуешь код заключай его в теги CODE, он будет выглядеть и читаться значительно лучше.


23 Nov 2004 23:23
Profile
Junior

Joined: 23 Nov 2004 14:47
Posts: 8
Reply with quote
асемблируется и редактируется следующим bat фалом в среде SPRINTSDK
notepad graph.asm
cls
..\..\shjob.exe graph.shj

graph.shj - представляет собой следующий файл

$name=graph
$target=C:\Work\sprinter\FDD\GOS\LIB\
$abin=04000

#проаслмблировать файл по одресу 04000h
${EXEPATH}zmac -o ${name}.bin ${name}.asm
#собрать файл
\need ${name}.bin
${EXEPATH}addbin ${name}.lib ${name}.bin ${abin}
${EXEPATH}leadzero ${name}.lib
\need ${name}.lib
\del ${name}.bin
#перенести файл в место назначения
\copy ${name}.lib ${target}${name}.lib
\del ${name}.lib


25 Nov 2004 05:07
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23357
Location: Silicon Valley
Reply with quote
iret wrote:
асемблируется и редактируется следующим bat фалом в среде SPRINTSDK
notepad graph.asm
cls
..\..\shjob.exe graph.shj

graph.shj - представляет собой следующий файл

$name=graph
$target=C:\Work\sprinter\FDD\GOS\LIB\
$abin=04000

#проаслмблировать файл по одресу 04000h
${EXEPATH}zmac -o ${name}.bin ${name}.asm
#собрать файл
\need ${name}.bin
${EXEPATH}addbin ${name}.lib ${name}.bin ${abin}
${EXEPATH}leadzero ${name}.lib
\need ${name}.lib
\del ${name}.bin
#перенести файл в место назначения
\copy ${name}.lib ${target}${name}.lib
\del ${name}.lib


Если код собирается ZMAC-ом то надо сделать DLL-версию :)

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


25 Nov 2004 17:27
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23357
Location: Silicon Valley
Reply with quote
iret wrote:
Переменные в начальном заголовке - вообще не актуальны до выхода операционной системы и утверждения стандарта для заголовка библиотек


А что за операционная система можно узнать? Для Спринтера? Есть сайт, скриншоты, дока какая?

iret wrote:
На реальном железе не проверялась :-( - написана под эмулятор


Рад, что моим эмулятором кто-то пользуется - надо бы выпустить новую версию, адаптированную к Windows XP ;)

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


25 Nov 2004 23:24
Profile WWW
Doomed
User avatar

Joined: 11 Dec 2003 14:34
Posts: 413
Reply with quote
iret wrote:
асемблируется и редактируется следующим bat фалом в среде SPRINTSDK
notepad graph.asm
cls
..\..\shjob.exe graph.shj

graph.shj - представляет собой следующий файл

$name=graph
$target=C:\Work\sprinter\FDD\GOS\LIB\
$abin=04000

#проаслмблировать файл по одресу 04000h
${EXEPATH}zmac -o ${name}.bin ${name}.asm
#собрать файл
\need ${name}.bin
${EXEPATH}addbin ${name}.lib ${name}.bin ${abin}
${EXEPATH}leadzero ${name}.lib
\need ${name}.lib
\del ${name}.bin
#перенести файл в место назначения
\copy ${name}.lib ${target}${name}.lib
\del ${name}.lib


Что-то в коде библы я не вижу юзание акселя. Графические библы
просто обязаны юзать аксель! ;). А иначе слайд-шоу и т.д... ну вы поняли.

_________________
Vasil Ivanov
vasil-i@yandex.ru


27 Nov 2004 01:42
Profile
Junior

Joined: 23 Nov 2004 14:47
Posts: 8
Reply with quote
Vasil Ivanov wrote:
Что-то в коде библы я не вижу юзание акселя. Графические библы
просто обязаны юзать аксель! ;). А иначе слайд-шоу и т.д... ну вы поняли.

Ну если не видешь - это очень плохо. он там есть.
При прямых линиях и залитых прямоугольниках.

А как ты предлогаешь использовать акселератор при построении окружности?. При наклонных линиях тоже затруднительно, хотя можно при малых углах. Я попробовал - рачсет угла и определение длинны и координат отрезков, из которых состоит прямая, занимает гораздо больше тактов, чем вывод этой наклонной прямой попиксельно в цикле


27 Nov 2004 07:41
Profile
Junior

Joined: 23 Nov 2004 14:47
Posts: 8
Reply with quote
Shaos wrote:
А что за операционная система можно узнать? Для Спринтера? Есть сайт, скриншоты, дока какая?
конечно же нету :-)
Пишется она с переменным успехом уже пол года, в зависимости от настроения. Рабочее название GOS.
Что бы узнать почему G - можно посетить мою домашнюю страничку
http://grey.boom.ru
Shaos wrote:
Рад, что моим эмулятором кто-то пользуется - надо бы выпустить новую версию, адаптированную к Windows XP ;)

ну я не вижу необходимости адоптации, у меня под Хомячком он прекрастно работает. Из за отсутсвия железного спринтера операционка пишется под эмуль. И ОЧЕНЬ хотелось бы новой версии с поддержкой следующих вещей.
1. - несколько дисков a: b: c: d:
2. - корректная работа второго экрана и области атрибутов (как я понял, спринтер может иметь одновременно на экране разные окна с разным режимом - но задается это областью атрибутов -а в эмуляторе там одни нули)
3. работа прерываний (пусть хоть вызвает мой обработчик по адресу 56 из нулевого окна- а то я написал резидент и не пойму - почему он не вызывается (ну хоть иногда - хоть раз в секунду))


27 Nov 2004 08:19
Profile
Doomed
User avatar

Joined: 11 Dec 2003 14:34
Posts: 413
Reply with quote
iret wrote:
Vasil Ivanov wrote:
Что-то в коде библы я не вижу юзание акселя. Графические библы
просто обязаны юзать аксель! ;). А иначе слайд-шоу и т.д... ну вы поняли.

Ну если не видешь - это очень плохо. он там есть.
При прямых линиях и залитых прямоугольниках.

А как ты предлогаешь использовать акселератор при построении окружности?. При наклонных линиях тоже затруднительно, хотя можно при малых углах. Я попробовал - рачсет угла и определение длинны и координат отрезков, из которых состоит прямая, занимает гораздо больше тактов, чем вывод этой наклонной прямой попиксельно в цикле


Сорри, тормознул - не разглядел аксель при первом взгляде ;).
При построении наклонных и окружностей аксель маловероятен.

_________________
Vasil Ivanov
vasil-i@yandex.ru


29 Nov 2004 01:49
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 9 posts ] 

Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.