Вот я про то и говорю: читать до просветления :D
Вид для печати
Да просто удобно... Так, скажем в DEFB удобно забивать 8-байтные шаблоны, для последующего вывода на экран. DEFM, это вывод строк. А DEFW - двухбайтное слово. В моем случае адрес. Я, конечно, рад за тех, кто легко может всю программу набить на DEFB или DEFM... А я хочу чтобы мне мой код понятен был. Сказано, DEFW для двухбайтных слов, значит так и есть. Т.е. смотрю на свои записки 3-недельной давности, так я даже без вспоминания того, зачем писалась программа, легко вижу где какой блок данных... А если все будет состоять из DEFB/DEFM... Да там сам черт ногу сломит и никакие комментарии не спасут...
Имхо, что написано, то и должно быть. Ну за исключением случаев, когда критична скорость выполнения программы. Мало ли, может кому-то придется еще мою программу читать (маловероятно конечно, но все-таки)...
Это как в библиотеке, можно книги все вперемешку хранить, но, как-то предпочитают сортировать: журналы отдельно, книги отдельно, многотомные сборники отдельно...
Во всем должен быть порядок.
Zidane, это всё известно и понятно :)
Я имел в виду как так случилось что ты понимаешь как общатся с DEFB, и не догадался как быть с DEFW ?
Потому и спросил - почему так? (может какой-то частный, особый случай, что не подходят очевидные методы - ну например два INC adr)
Вот я например сейчас мучаюсь с 3D (raycasting) - а там нужно задавать три байта на каждый луч. Вот и ломаю голову как будет лучше - один DB + один DW или просто три DB.
А возможно - два DW...
Такой вот частный случай и хз как лучше это всё хранить/выбирать:)
Речь не об этом.
Речь о том, что в памяти что DEFB, что DEFW, что DEFM хранятся одинаково. И поэтому непонятно, почему вы ждете, что для работы с DEFB предусмотрены одни команды, а с DEFW другие. Все эти типы существуют только на уровне ассемблера, процессор про них и знать не знает. Да, через DEFW можно определять адреса. Но это лишь свойство, а не предназначение.
Адрес - это всего лишь 2 байта, которые хранятся в памяти задом наперед. Читаются из памяти точно так же, как и одиночные байты,
LD HL, IMG
LD E, (HL)
E потому что, напоминаю, адрес лежит задом наперед. Грузим старший
INC HL
LD D, (HL)
Все, адрес в DE. Берем значение, которое лежит по этому адресу, и делаем с ним что хотим:
LD A, (DE)
Если все сделали, переходим к следующему элементу (младшему байту следующего адреса) - INC HL, JP ....
Ну и все, получили тот же код, который SAM style написал еще во втором сообщении.
Читать память сразу словами через переустановку стека и POP - это красиво, но это хак. Хотя асм, конечно, такой язык, что там практически все - хак :)
Однозначно. В общем, пишу разного рода программки на бейсике и перевожу в ассемблер. Со временем сейчас несколько напряг, но полчасика в день выковыриваю... Суть вопроса вот в чем. Написал на бейсике махонькую демку (даже и на махонькую с трудом тянет, меня больше волновала реализация алгоритма) но все же. Файлик прилагается. Основная проблема в том, что нужно генерить рандомные числа в заданном диапазоне (строки 220-290). Вот тут я собственно и встал... Инфу раскопал и вроде даже работает... Но все же хотел бы узнать, кто как генерит эти числа для личных нужд? ) Или все пользуются одним приемом? В общем, собираю полезные идеи, если кому не жаль поделиться.
Зависит от того, насколько быстро и насколько случайно тебе это надо. На спеке источниками энтропии могут быть либо R, либо число прерываний до запуска программы, где-то бейсик его считает. А потом уже каким-либо ГСЧ.
Ну, как-то так:
Способов несколько. Основной - брать R и XOR-AND-OR-ADD-SUB-ИТД его со всем, что попадется под руку.Код:RANDOM push hl
ADDR ld hl,0
inc l
ld (ADDR+1),hl
ld a,r
xor (hl)
pop hl
ret
START ...
call RANDOM
and 15 ;тут в А будет число от 0 до 15
...
call RANDOM
and 31 ;а тут - от 0 до 31
...
Тема о генераторах случайных чисел с примерами: http://zx.pk.ru/showthread.php?t=13188
Подскажите пожалуйста, как исправить ошибку?
Делаю, чтобы был вывод по одной букве. Но никак не выходит.
Что то с NUM не так...Код:LD D,10
L1 LD HL,(NUM)
LD A,(HL)
RST #10
INC HL
LD (NUM),HL
DEC D
JR NZ,L1
RET
NUM DEFB $+1
TEXT DEFB "prosto text"
И еще вопрос как в Alasm сделать, чтобы текст(строка TEXT) располагался с определенного адреса, например с 50000?
DEFB резервирует один байт. когда та берёшь число оттуда захватывается первая буква текста. скорее надо defw (два байта) или defb 1,0