PDA

Просмотр полной версии : срочно нужна прога для вывода спрайтов на экран компьютера zX spectrum 48 k(sinclair)



ALKO
02.02.2010, 10:35
в данный момент разрабатываю графический макер для спрайтов.
Размеры сделал фиксированные 8*8 символов.
такую шнягу я уже делал когда-то (но размеры можно было менять в процессесе создания рисунков), данные были потеряны, еще в машинных кодах писал подпрограмму вывода этих спрайтов на экран.
По новой расчитывать эту процедуру не охота, может кто знает,как нарисовать на экране спрайт 8*8 знакомест в машин. кодах ( 64*64 пикс.)
Сам графический редактор сделал так, что он поочередно заливает в память посимвольно (сверху вниз сканирует каждый символ побайтно) и так идет в ряд в первой строке (из 8-ми символов) затем во второй,третьей....................... .... и восьмой.
так сделал , чтоб при переходе по координатам знакомест не было белиберды,а то на спеке организация памяти экранной области довольно рахитная.

jerri
02.02.2010, 10:38
тебе в каком виде?

VNN_KCS
02.02.2010, 13:54
Вот самая простая, исходя из твоих параметров 8х8:
ld hl,адрес спрайта
ld de,адрес экрана
ld b,64
n1 push bc
push de
dup 8
ldi
edup
pop de
call de_inc
pop bc
djnz n1
ret
de_inc inc d
ld a,d
and 7
ret nz
ld a,e
add a,32
ld e,a
ret c
ld a,d
sub 8
ld d,a
ret

ALKO
02.02.2010, 16:53
а что означает эта мнемоника?
dup 8
ldi
edup

boo_boo
02.02.2010, 17:03
dup 8
ldi
edup
повтор ldi 8 раз (директива асма, не мнемоника)

ALKO
02.02.2010, 17:09
а как бы мне это вдесятичных кодах написать.
А то проги пишу по таблице из книжицы.

---------- Post added at 17:09 ---------- Previous post was at 17:06 ----------

ldi значит LDIR ?
а dup 8 ; edup ; - это обычный цикл ? (какие регистры он использует ? или можно на свое усмотрение ?)

SoftLight
02.02.2010, 17:14
обожемой! Ldi это значит Ldi - тоже самое что LDIR тока без цикла - как бы без хвоста ld a, b; or c; jr nz, ... . edup говорит сколько раз дублировать блок. тоесть берешь и пишешь код LDI 8 раз подряд. А вообще для программирования ассемблеры существуют

null_device
02.02.2010, 17:15
а как бы мне это вдесятичных кодах написать

Расписать всю программу? Или как 8 раз набить LDI (#237, #160 dec)?!

данная команда ассеблера траслируется в что-то типа..
---
..
ldi 237, 160
ldi 237, 160
ldi 237, 160
ldi 237, 160
ldi 237, 160
ldi 237, 160
ldi 237, 160
ldi 237, 160
..

Если есть анреал, можно в мониторе набить мнемокоды (развернув спецкоманды ассемблера), а потом списать соответствующие им числовые значения. Так быстрее получится (ну если не брать в расчет асм и т.п.).

ALKO
02.02.2010, 17:32
а так можно ?
push af
FUCKING_LOOP ld a,8
ldi
dec a
djnz FUCKING_LOOP
pop af
(правда в ущерб процессорного времени)

null_device
02.02.2010, 17:38
Теоретичеки можно. А зачем такие сложности? Тогда уж проще сохранять регистровую пару bc и использовать ldir. Команда ldi используется для быстродествия и ненужных опереций с регистрами..

Vitamin
02.02.2010, 17:57
А вообще для программирования ассемблеры существуют
Тиха! Здесь раздел для начинающих. Любой опытный может рассказать стопиццот способов наступить себе на яйца :-)

bigral
02.02.2010, 21:00
можно попробовать "выдрать" отсюда http://www.zxdesign.info/software/tzx/firstContact-demo1.sna или попросить исходник у автора

rasmer
02.02.2010, 21:34
а так можно ?
push af
FUCKING_LOOP ld a,8
ldi
dec a
djnz FUCKING_LOOP
pop af
(правда в ущерб процессорного времени)
Пристрелите меня если ЭТО правильно написано.... особенно заLOOPление в виде DJNZ по декременту аккумулятора

GM BIT
03.02.2010, 06:02
а так можно ?
push af
FUCKING_LOOP ld a,8
ldi
dec a
djnz FUCKING_LOOP
pop af
(правда в ущерб процессорного времени)

Нельзя!

Можно так:

push af
ld a,8
FUCKING_LOOP ldi
dec a
jr nz,FUCKING_LOOP
pop af

ALEXEY.GORDEEV
03.02.2010, 07:23
Памойму так :)


PUSH AF
PUSH BC
LD A, 8
LD B, A
FUCKING_LOOP: LDI
DJNZ FUCKING_LOOP
POP BC
POP AF


По идее должно повторить LDI 8 раз... Ведь нужно именно это?

psb
03.02.2010, 08:08
мдя... кодеры, блин...
1.
LD A, 8
LD B, A
зачем вообще тут юзать А?
2. не стоит забывать, что LDI уменьшает ВС, а это значит, что и иногда В. однажды одного цикла можно не досчитаться, или того хуже;)

3. если не важна скорость - уже сказали, сделайте LD BC,8:LDIR и не парьте моск.

ALKO
03.02.2010, 09:31
Извиняюсь за неправильную организацию цикла, писАл наспех.

---------- Post added at 09:30 ---------- Previous post was at 09:25 ----------

http://foto.ex6.ru/01/7550277721.jpg (http://foto.ex6.ru/v.php?id=7550277721.jpg)

в строке 150 процедура сканирования спрайта.

---------- Post added at 09:31 ---------- Previous post was at 09:30 ----------

m=адрес,куда залиавть.

Sinus
03.02.2010, 11:33
я вот тут почитал тему немного, и появился у меня вопрос к ALKO:
почему ты так не хочешь использовать ассемблер? для 48го спека существует прекрасный ассемблер ZEUS (я в нём раньше писал). а если на спеке есть дисковод, то ассемблер PASM (тоже для 48го).

jerri
03.02.2010, 17:15
У него нет дисковода
у него тока кассеты

ALKO
03.02.2010, 18:40
Поправка:в строке 150 значение роке нужно заключить в скобки

Sinus
06.02.2010, 22:06
У него нет дисковода
у него тока кассеты

и что? когда у меня были кассеты, меня не ломало загрузить ZEUS с кассеты.

Kurles
07.02.2010, 22:59
и что? когда у меня были кассеты, меня не ломало загрузить ZEUS с кассеты.а меня gens. Хотя ломало, но удобства того стоили :)