Просмотр полной версии : срочно нужна прога для вывода спрайтов на экран компьютера zX spectrum 48 k(sinclair)
в данный момент разрабатываю графический макер для спрайтов.
Размеры сделал фиксированные 8*8 символов.
такую шнягу я уже делал когда-то (но размеры можно было менять в процессесе создания рисунков), данные были потеряны, еще в машинных кодах писал подпрограмму вывода этих спрайтов на экран.
По новой расчитывать эту процедуру не охота, может кто знает,как нарисовать на экране спрайт 8*8 знакомест в машин. кодах ( 64*64 пикс.)
Сам графический редактор сделал так, что он поочередно заливает в память посимвольно (сверху вниз сканирует каждый символ побайтно) и так идет в ряд в первой строке (из 8-ми символов) затем во второй,третьей....................... .... и восьмой.
так сделал , чтоб при переходе по координатам знакомест не было белиберды,а то на спеке организация памяти экранной области довольно рахитная.
Вот самая простая, исходя из твоих параметров 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
а что означает эта мнемоника?
dup 8
ldi
edup
dup 8
ldi
edup
повтор ldi 8 раз (директива асма, не мнемоника)
а как бы мне это вдесятичных кодах написать.
А то проги пишу по таблице из книжицы.
---------- 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
..
Если есть анреал, можно в мониторе набить мнемокоды (развернув спецкоманды ассемблера), а потом списать соответствующие им числовые значения. Так быстрее получится (ну если не брать в расчет асм и т.п.).
а так можно ?
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 используется для быстродествия и ненужных опереций с регистрами..
А вообще для программирования ассемблеры существуют
Тиха! Здесь раздел для начинающих. Любой опытный может рассказать стопиццот способов наступить себе на яйца :-)
можно попробовать "выдрать" отсюда http://www.zxdesign.info/software/tzx/firstContact-demo1.sna или попросить исходник у автора
а так можно ?
push af
FUCKING_LOOP ld a,8
ldi
dec a
djnz FUCKING_LOOP
pop af
(правда в ущерб процессорного времени)
Пристрелите меня если ЭТО правильно написано.... особенно заLOOPление в виде DJNZ по декременту аккумулятора
а так можно ?
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 раз... Ведь нужно именно это?
мдя... кодеры, блин...
1.
LD A, 8
LD B, A
зачем вообще тут юзать А?
2. не стоит забывать, что LDI уменьшает ВС, а это значит, что и иногда В. однажды одного цикла можно не досчитаться, или того хуже;)
3. если не важна скорость - уже сказали, сделайте LD BC,8:LDIR и не парьте моск.
Извиняюсь за неправильную организацию цикла, писАл наспех.
---------- 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=адрес,куда залиавть.
я вот тут почитал тему немного, и появился у меня вопрос к ALKO:
почему ты так не хочешь использовать ассемблер? для 48го спека существует прекрасный ассемблер ZEUS (я в нём раньше писал). а если на спеке есть дисковод, то ассемблер PASM (тоже для 48го).
У него нет дисковода
у него тока кассеты
Поправка:в строке 150 значение роке нужно заключить в скобки
У него нет дисковода
у него тока кассеты
и что? когда у меня были кассеты, меня не ломало загрузить ZEUS с кассеты.
и что? когда у меня были кассеты, меня не ломало загрузить ZEUS с кассеты.а меня gens. Хотя ломало, но удобства того стоили :)
Powered by vBulletin® Version 4.2.5 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot