PDA

Просмотр полной версии : Программа для последовательной смены изображений



RTeh
24.07.2013, 04:19
Здравствуйте.
Потребовалось написать небольшую программу для последовательного вывода на экран Спектрума изображений (стандартные 256х192). Программа будет загружаться с кассеты, поэтому требуется прогрузить изображения в память заранее, а выводить их уже из памяти, чтобы избежать длительных загрузок.
В Бейсике я не силен, поэтому полет фантазии ограничился лишь

10 LOAD "0000" CODE 40000,6912
20 LOAD "0001" CODE 30000,6912
Т.е. попыткой загрузки в память этих картинок, что вроде бы проходит успешно. А вот с выводом возникает проблема, т.е. всевозможные комбинации операторов ничего не дают.
Посоветуйте разумные способы решения поставленной задачи.:)

null_device
24.07.2013, 05:08
RTeh, вывести изображения из памяти на экран средствами бейсика можно, но врятли это получится с приемлимой скоростью:


...
30 FOR I=0 TO 6911
40 POKE 16384+I, PEEK (30000+I)
50 NEXT I
...
60 FOR I=0 TO 6911
70 POKE 16384+I, PEEK (40000+I)
80 NEXT I

---------- Post added at 09:08 ---------- Previous post was at 08:42 ----------

Обычно, данную задачу решают с помощью ассемблера. Например, так:

текст курсивом, от точки с запятой не набирать, это комментарии

10 FOR I=0 TO 11
20 READ N : POKE m+I, N ; здесь m - адрес с которого удобно расположить подпрограмму в кодах
30 NEX I
40 DATA 33, 0, 0 ; LD HL, (nn)
50 DATA 17, 0, 64 ; LD DE, (16384)
60 DATA 1, 0, 27 ; LD BC, (6912)
70 DATA 237, 176 ; LDIR
80 DATA 201 ; RET
...
100 RANDOMIZE n ; здесь n - адрес с которого лежит картинка, которую будем выводить
110 POKE m+1, PEEK 23670 : POKE m+2, PEEK 23671 ; здесь m+1 и m+2 - непосредственно значения, зависящие от числа в операторе 20
120 RANDOMIZE USR m ; вызов подпрограммы в кодах

Текст программы по 80 строку выполняется один раз. Для удобства, после выполнения, его можно сохранить командой SAVE "name" CODE m,12 и подгружать в случае необходимости (вместо выполнения этих операторов).
Текст с 100 строки можно выполнять сколько угодно раз, меняя значение n на нужное.

breeze
24.07.2013, 13:22
А не проще ли воспользоваться паковщиками картинок? Во первых и места меньше занимают (можно в память больше загрузить сразу) и не надо мучатся с кодами, вызываешь сразу процедуру RANDOMIZE USR 49152 (например) и красиво проявляется на экране.

RTeh
24.07.2013, 15:27
null_device, спасибо за развернутый ответ. С первым вариантом разобрался, пробую второй (пока вывод хотя бы одного изображения). Программа выполняется, но на экране ничего не появляется, моментально выводится OK.

10 LOAD "0000" CODE 40000,6912
20 LOAD "0001" CODE 30000,6912
30 FOR I=0 TO 11
40 READ N : POKE 50000+I, N
50 NEXT I
60 DATA 33, 0, 0
70 DATA 17, 64, 0
80 DATA 1, 27, 0
90 DATA 237, 176
100 DATA 201
110 RANDOMIZE 30000
120 POKE 50001, PEEK 23670 : POKE 50002, PEEK 23671
130 RANDOMIZE USR 50000
Пока лишь предположение, что переменная N нигде не вводится.

null_device
24.07.2013, 16:25
RTeh, Адрес был "шиворот-на-выворот". Сперва должен идти "младший байт" (давно не пользовался этими операторами). :)

---------- Post added at 20:25 ---------- Previous post was at 20:20 ----------


А не проще ли воспользоваться паковщиками картинок?

Проще, но для начала, лучше потренироваться "на кошках". ;)

RTeh
24.07.2013, 17:07
Попробовал, пока результат тот же: ОК и пустой экран.

null_device
24.07.2013, 17:18
RTeh, Как оказалось, накосячил в других операторах. Проверьте листинг. :v2_dizzy_facepalm:
Снапшот в анреале запускается с адреса 30000, картинка лежит с 40000. Все работает. :v2_conf2:

RTeh
24.07.2013, 17:50
null_device, еще раз большое спасибо! Все работает.