Кодинг для Спектрум и 8бит

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Кодинг для Спектрум и 8бит » Программирование » Процедуры работы с экраном


Процедуры работы с экраном

Сообщений 1 страница 12 из 12

1

Камрады, а есть ли у кого-то набор процедур для взаимодействия с экраном? Вот мой:

подсчет экр.адреса для знакоместа

Код:
; подсмотрено в Venom
; вход: D.E = координаты y.x
; выход: HL=adress
sub_999E:
    ld	hl, 4000h
    ld	a, d
    and	18h
    or	h
    ld	h, a
    ld	a, d
    and	7
    ld	d, a
    srl	d
    rr	l
    srl	d
    rr	l
    srl	d
    rr	l
    add	hl, de
    ret


или

Код:
; Get screen address
; D = Y character position
; E = X character position
; Returns address in DE
; Title:    ZX Spectrum Standard Output Routines
; Author:   Dean Belfield
; Created:  29/07/2011
; Last Updated: 02/07/2012
Get_Char_Address:   LD A,D
	            AND %00000111
	            RRA
	            RRA
	            RRA
	            RRA
	            OR E
	            LD E,A
	            LD A,D
	            AND %00011000
	            OR $40
	            LD D,A


Вычисление адреса экранной линии

Код:
;L=y 
py2saddr:
	ld a,l
	and $07
	ld h,a
	ld a,l
	and $c0
	rra
	inc a
	rrca
	rrca
	or h
	ld h,a
	ld a,l
	add a
	add a
	and $e0
	ld l,a


Вычисление адреса атрибутов из адреса экрана

Код:
;вход: DE=экран
;выход: HL=адрес атрибутов
;$40=010 00 000
;$48=010 01 000
;$50=010 10 000

;$58=010110 00
;$59=010110 01
;$5A=010110 10
	ld a,d
	and %000111000
	rra
	rra
	rra
	add a,$58
	ld h,a
	ld l,e

2

Классно было бы сделать библиотеку приемов программирования на Z80 под Спектрум, чтобы не изобретать велосипед и не оптимизировать уже оптимизированное.

Отредактировано Jack (2018-08-25 04:19:45)

3

Подобная попытка была сделана. "Библия демомейкера" на гф вроде как. Закончилось тем, что по инициативе psb народ ушел на speccy.info, где рупор всех перебанил.

4

Понадобилась процедура определения адреса атрибута по XY экранного символа, написал велосипед.

Может быть как-то можно это оптимизировать?

Код:
; в DE позиция на экране: D - x, E - y
    LD A, D
    LD (set_pos_x+1), A
    LD D, 0
    SLA E; x2
    SLA E; x4
    SLA E; x8
    SLA E; x16
    RL D
    SLA E; x32
    RL D; в DE теперь y * 32
    LD H, #00
set_pos_x:
    LD L, #00
    ADD HL, DE
    LD DE, ATTR_ADDR
    ADD HL, DE

5

Ван Дерер написал(а):

Понадобилась процедура определения адреса атрибута по XY экранного символа, написал велосипед.


Навскидку так:

Код:
y*32
;D.E=y,x
 ld l,d
 add hl,hl; *2
 add hl,hl ; *4
 ld h,11
 add hl,hl ;*8
 add hl,hl; *16
 add hl,hl; *32
 ld d,0
 add hl,de

6

У меня такое

Код:
charAttr
    	; вычисление адреса атрибутов по координатам знакоместа
    	; b-x c-y char; hl attr addr
    	ld	a, c
    	rrca
    	rrca
    	rrca
    	ld	l, a
    	and	0x03
    	add	a, 0x58
    	ld	h, a
    	ld	a, l
    	and	0xe0
    	add	a, b
    	ld	l, a
    	ret

Но оно мне не нравится чето.

7

ld l,b например

8

Нет.
Есть чуть покороче в столько же тактов

Код:
    	ld	a, b
    .3	rrca
    	ld	h, a
    	and	0xe0
    	ld	l, a
    	xor	h
    	ld	h, a
    	ld	b, 0x58
    	add	hl, bc

Но прибито hreg - y, lreg - x и нет отсечения переполнения по y. Мне это тоже не нравится.

9

я в xor h не врубился(

10

xor h в данном случае делает ld a, h: and 0x1f. Да все это кривизна, будет часик причешу свой файлик. Раньше думал на пенсии покодю, а теперь что делать, как жить.

11

Вычисление адреса по координатам точки в пиксельном экране

Код:
pixBC
; вычисление адреса в пиксельном экране по координатам точки
; in	b - y
;	c - x
; out	hl - pix addr
    	ld	a, c
    	rlca
    	rlca
    	rlca
    	xor	b
    	and	0xc7
    	xor	b
    	rlca
    	rlca
    	ld	l, a
    	ld	a, b
    	and	0xc0
    	rra
    	scf
    	rra
    	rra
    	xor	b
    	and	0xf8
    	xor	b
    	ld	h, a
    	ret

12

Shinny написал(а):

Навскидку так:

ADD HL, HL просто и понятно,  LD H,11 чтобы не прибавлять потом указатель на атрибуты - интересное решение. Благодарю, забрал !


Вы здесь » Кодинг для Спектрум и 8бит » Программирование » Процедуры работы с экраном