User Tag List

Страница 7 из 9 ПерваяПервая ... 3456789 ПоследняяПоследняя
Показано с 61 по 70 из 82

Тема: Вопрос по ассемблеру Z80

  1. #61

    Регистрация
    29.12.2010
    Адрес
    Москва
    Сообщений
    1,869
    Спасибо Благодарностей отдано 
    142
    Спасибо Благодарностей получено 
    110
    Поблагодарили
    66 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от reddie Посмотреть сообщение
    А зачем оно в ассемблере? За редким исключением, переменные можно хранить прямо в регистрах, либо модифицировать код.
    Посчитал очки или координаты спрайта и будешь пол-игры в регистрах хранить? Так регистров не напасёшься

    - - - Добавлено - - -

    Цитата Сообщение от Lethargeek Посмотреть сообщение
    лучше было бы, если бы компилятор переупорядочил операторы
    это бы да. Только если выражения посложнее написать (к примеру, три операнда или скобки ввести), то уже куча частных случаев возникает. Всё не предусмотришь.

  2. #61
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #62

    Регистрация
    27.02.2005
    Адрес
    москва
    Сообщений
    14,288
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    202
    Спасибо Благодарностей получено 
    1,456
    Поблагодарили
    946 сообщений
    Mentioned
    18 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    наверно речь о том что
    Код:
    varA ld hl,#xxxx
    (varA+1) это и будет адрес переменной

  4. #63

    Регистрация
    03.07.2021
    Адрес
    г. Кировск
    Сообщений
    922
    Спасибо Благодарностей отдано 
    87
    Спасибо Благодарностей получено 
    211
    Поблагодарили
    156 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    Посчитал очки или координаты спрайта
    В таких случаях да, либо блок данных с переменными, либо прямо в коде, чтоб сэкономить память.
    Но конструкции, как из компиляторов на предыдущей странице, в любом случае проигрывают чисто ассемблерной реализации.

  5. #64

    Регистрация
    29.12.2010
    Адрес
    Москва
    Сообщений
    1,869
    Спасибо Благодарностей отдано 
    142
    Спасибо Благодарностей получено 
    110
    Поблагодарили
    66 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    За сколько напишешь на голом ассемблере такую процедуру вывода окна с динамическим списком опций из разных массивов и выбора одной из них? И стОит ли оно столько времени? Я на Паскале за один день написал и отладил:

    Код:
    procedure window_dialog_sub1;
    begin
    
    case w_items[w_dialog_i,1] of
    	view_science_1: write(s_text[w_items[w_dialog_i,2]]);
    	view_civ_1: write(civ_text[w_items[w_dialog_i,2]]);
    	view_city_1: write(c_text[w_items[w_dialog_i,2]]);
    	view_unit_1: write(u_text[w_items[w_dialog_i,2]],'  ',u[w_items[w_dialog_i,2],u_at],'/',
    			u[w_items[w_dialog_i,2],u_def],'/',u[w_items[w_dialog_i,2],u_speed]);
    	view_building_1: write(b_text[w_items[w_dialog_i,2]]);
    	view_tax_1:
    		begin
    			tax_view:=(w_items[w_dialog_i,2]-1)*10;
    			write(tax_view,'%');
    		end;
    end;
    
    end;
    
    
    procedure window_clear_put;
    
    {
    w_dialog_center - окно по центру
    w_dialog_x - x левого верхнего угла окна, если w_dialog_center=0
    w_dialog_y - y левого верхнего угла окна, если w_dialog_center=0
    w_dialog_w - ширина окна
    w_dialog_h - высота окна
    w_dialog_color1 - цвета рамки
    w_dialog_color2 - цвета окна
    }
    
    begin
    
    if w_dialog_center=1 then
    	begin
    		w_dialog_x:=(32-w_dialog_w)/2;
    		w_dialog_y:=(24-w_dialog_h)/2;
    	end;
    
    color(w_dialog_color2);
    
    WindowSet(w_dialog_x,w_dialog_y,w_dialog_w,w_dialog_h);
    WindowClear;
    
    for i2:=0 to w_dialog_w-1 do
    	begin
    		SpritePutClear(FRAME_H,w_dialog_color1,i2+w_dialog_x,w_dialog_y);
    		SpritePutClear(FRAME_H,w_dialog_color1,i2+w_dialog_x,w_dialog_y+w_dialog_h-1);
    	end;
    for i2:=0 to w_dialog_h-1 do
    	begin
    		SpritePutClear(FRAME_V,w_dialog_color1,w_dialog_x,i2+w_dialog_y);
    		SpritePutClear(FRAME_V,w_dialog_color1,w_dialog_x+w_dialog_w-1,i2+w_dialog_y);
    	end;
    SpritePutClear(FRAME_LU,w_dialog_color1,w_dialog_x,w_dialog_y);
    SpritePutClear(FRAME_RU,w_dialog_color1,w_dialog_x+w_dialog_w-1,w_dialog_y);
    SpritePutClear(FRAME_LD,w_dialog_color1,w_dialog_x,w_dialog_y+w_dialog_h-1);
    SpritePutClear(FRAME_RD,w_dialog_color1,w_dialog_x+w_dialog_w-1,w_dialog_y+w_dialog_h-1);
    
    end;
    
    
    procedure window_dialog;
    
    {
    Параметры процедуры window_dialog:
    
    вход:
    
    w_dialog_center - окно по центру
    w_dialog_x - x левого верхнего угла окна, если w_dialog_center=0
    w_dialog_y - y левого верхнего угла окна, если w_dialog_center=0
    w_dialog_w - ширина окна
    w_dialog_h - высота окна
    w_dialog_items - количество элементов
    w_items[] - параметры элементов: номер таблицы, номер элемента
    w_dialog_text1 - заголовок 1 окна
    w_dialog_text2 - заголовок 2 окна
    w_dialog_color1 - цвета рамки
    w_dialog_color2 - цвета окна
    w_dialog_color3 - цвета окна и элементов
    w_dialog_color4 - цвета окна и курсора
    w_dialog_cancel - возможность отказа от выбора (1=да/0=нет)
    
    выход:
    w_dialog_case - выбранный элемент (0, если отказ от выбора)
    
    промежуточные:
    w_dialog_i1 - первый видимый элемент
    w_dialog_i2 - последний видимый элемент
    w_dialog_cursor - вертик.координата курсора
    }
    
    
    begin
    
    w_dialog_case:=1;
    w_dialog_cursor:=1;
    w_dialog_i1:=1;
    if (w_dialog_h-4)>w_dialog_items
    	then w_dialog_i2:=w_dialog_items
    	else w_dialog_i2:=w_dialog_h-4;
    
    window_clear_put;
    
    color(w_dialog_color2);
    
    gotoxy((w_dialog_x+1)*2,w_dialog_y+1);
    writeln(w_dialog_text1);
    gotoxy((w_dialog_x+1)*2,w_dialog_y+2);
    writeln(w_dialog_text2);
    
    repeat
    
    	color(w_dialog_color3);
    
    	WindowSet(w_dialog_x+1,w_dialog_y+3,w_dialog_w-2,w_dialog_h-4);
    	WindowClear;
    
    	for w_dialog_i:=w_dialog_i1 to w_dialog_i2 do
    		begin
    			gotoxy((w_dialog_x+1)*2,w_dialog_y+3+w_dialog_i-w_dialog_i1);
    			window_dialog_sub1;
    		end;
    
    	color(w_dialog_color4);
    	gotoxy((w_dialog_x+1)*2,w_dialog_y+2+w_dialog_cursor);
    	for w_dialog_i:=1 to (w_dialog_w-2)*2 do
    		write(' ');
    	gotoxy((w_dialog_x+1)*2,w_dialog_y+2+w_dialog_cursor);
    	w_dialog_i:=w_dialog_case;
    	window_dialog_sub1;
    
    	repeat
    		readkey(key1,key2,key3);
    
    		if key1=81 then
    			if w_dialog_case>1 then
    				begin
    					w_dialog_case:=w_dialog_case-1;
    					w_dialog_cursor:=w_dialog_cursor-1;
    					if w_dialog_case<w_dialog_i1 then
    						begin
    							w_dialog_i1:=w_dialog_i1-1;
    							w_dialog_i2:=w_dialog_i2-1;
    							w_dialog_cursor:=w_dialog_cursor+1;
    						end;
    				end;
    		if key1=65 then
    			if w_dialog_case<w_dialog_items then
    				begin
    					w_dialog_case:=w_dialog_case+1;
    					w_dialog_cursor:=w_dialog_cursor+1;
    					if w_dialog_case>w_dialog_i2 then
    						begin
    							w_dialog_i1:=w_dialog_i1+1;
    							w_dialog_i2:=w_dialog_i2+1;
    							w_dialog_cursor:=w_dialog_cursor-1;
    						end;
    				end;
    
    		if key1<>0 then delay(10);
    
    	until key1<>0;
    
    if key1=32 and w_dialog_cancel=1 then w_dialog_case:=0;
    
    until key1=13 or w_dialog_case=0;
    
    color(0);
    clrscr;
    
    end;
    Нажмите на изображение для увеличения. 

Название:	Civ-screen.jpg 
Просмотров:	1143 
Размер:	23.6 Кб 
ID:	77644

  6. #65

    Регистрация
    08.09.2005
    Адрес
    Воронеж
    Сообщений
    4,963
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    319
    Спасибо Благодарностей получено 
    312
    Поблагодарили
    236 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    а на голом и не будут писать такое, макросы + шитый или байт-код
    Прихожу без разрешения, сею смерть и разрушение...

  7. #66

    Регистрация
    06.11.2020
    Адрес
    г. Санкт-Петербург
    Сообщений
    167
    Спасибо Благодарностей отдано 
    80
    Спасибо Благодарностей получено 
    30
    Поблагодарили
    23 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    То есть word по сравнению с byte использует более короткий код при математических операциях и присвоении результата, довольно неожиданно. Затраты на хранение переменных покрываются размером кода даже при одиночном использовании, при последующих использованиях X,Y уже не надо тратиться на word вместо byte, а код для word опять будет короче.

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    a,b,c,x,y: byte;

    Выдало:
    Код:
          ld    a,(_X)
          ld    (_A),a
          ld    a,(_Y)
          ld    (_B),a
          ld    a,(_X)
          ld    l,a
          ld    h,0
          ld    a,(_Y)
          ld    e,a
          ld    d,0
          and   a
          sbc   hl,de
          ld    a,l
          ld    (_C),a
    Если все переменные типа word (а не byte), то еще лучше:
    Код:
          ld    hl,(_X)
          ld    (_A),hl
          ld    hl,(_Y)
          ld    (_B),hl
          ld    hl,(_X)
          ld    de,(_Y)
          and   a
          sbc   hl,de
          ld    (_C),hl

  8. #67

    Регистрация
    23.10.2012
    Адрес
    г. Красноярск
    Сообщений
    206
    Спасибо Благодарностей отдано 
    47
    Спасибо Благодарностей получено 
    63
    Поблагодарили
    29 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от reddie Посмотреть сообщение
    В вышеприведенном примере - да. Но есть способ попроще, хотя с некоторыми ограничениями.
    Через переменную SEED Бейсика (RND- генератор). Командой Randomize NN (до 65535) заносим туда число, а в кодах забираем оттуда значение: LD RP, (23670), где RP - нужная регистровая пара, 23670/23671 - два байта числа.
    Ограничения, думаю, понятны: при запуске кодов через Randomize Usr значение сменится по возврату в Бейсик. Обычно удобней запускать командой вида LET X=USR NN, по возврату X будет равно значению рег. пары BC, то есть можно передавать и обратно из кодов в Бейсик.
    Эксперимент не прекращается. И вот с последней частью вышла запарка. Хотя я разобрался. Оказалось, что при вызове подпрограмм ПЗУ для вывода 16-битного значения на экран через стек калькулятора (11563 и 11747) они вычищают рег. пару BC. Ну и в итоге по возврату в бейсик мы видим в ней 0. А вот если их убрать, то все нормально. Всем спасибо за помощь, я еще зайду ). Просто для вас, возможно, такие действия со стороны процессора очевидны, а вот я в ступор минут на 20 впал )

    Этот пользователь поблагодарил Zidane за это полезное сообщение:

    Reobne(27.07.2022)

  9. #68

    Регистрация
    29.12.2010
    Адрес
    Москва
    Сообщений
    1,869
    Спасибо Благодарностей отдано 
    142
    Спасибо Благодарностей получено 
    110
    Поблагодарили
    66 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от vlad-kras Посмотреть сообщение
    То есть word по сравнению с byte использует более короткий код при математических операциях и присвоении результата, довольно неожиданно
    Да, потому что ZX Like Pascal использует 16-битную математику при расчетах. Поэтому приходится сначала преобразовывать byte в word. Однако, если используются длинные массивы, то byte выгоднее по памяти, если не требуется word.

  10. #69

    Регистрация
    23.10.2012
    Адрес
    г. Красноярск
    Сообщений
    206
    Спасибо Благодарностей отдано 
    47
    Спасибо Благодарностей получено 
    63
    Поблагодарили
    29 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Доброго времени суток. Снова вопрос нуба. Циклы на ассемблере организуются только через DJNZ? Ну я имею ввиду, что для организации цикла длиной более 255 итераций нужно создавать вложенные циклы? Или можно, к примеру, грузить в регистровую пару DE число итераций, затем грузить содержимое регистра D в аккумулятор и сравнивать его с регистром E. Пока сравнение ложно, флаг Z равен 0. И тогда JR NZ,nn снова запускаем выполнение блока кода? Или где-то я ошибся?

  11. #70

    Регистрация
    03.07.2021
    Адрес
    г. Кировск
    Сообщений
    922
    Спасибо Благодарностей отдано 
    87
    Спасибо Благодарностей получено 
    211
    Поблагодарили
    156 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Zidane Посмотреть сообщение
    грузить в регистровую пару DE число итераций, затем грузить содержимое регистра D в аккумулятор и сравнивать его с регистром E
    Обычно так и делают, только не сравнение, а OR - LD BC/DE/HL,NN: DEC Rx: LD A,R_high: OR R_low: JR NZ,REPEAT
    Можно и без использования аккумулятора, но тогда значение нужно пересчитать вручную/средствами ассемблера, на выходе будет что-то типа

    LD DE,NN
    ....
    DEC E
    JR NZ,REPEAT
    DEC D
    JR NZ,REPEAT


    в общем, вложенный цикл, где счетчик рассчитан так, чтобы работал корректно, т.к. регистры уменьшаются независимо друг от друга

    Этот пользователь поблагодарил reddie за это полезное сообщение:

    Zidane(01.08.2022)

Страница 7 из 9 ПерваяПервая ... 3456789 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Книга по ассемблеру Z80
    от Shwartz в разделе Пресса
    Ответов: 11
    Последнее: 06.07.2018, 14:29
  2. Книги по бейсику и Ассемблеру Z80
    от stepmotor в разделе Программирование
    Ответов: 3
    Последнее: 30.01.2018, 19:53
  3. вопрос по z80 stealh
    от scl^mc в разделе Эмуляторы
    Ответов: 11
    Последнее: 17.08.2007, 15:32
  4. ламерский вопрос о временных диаграммах шин Z80
    от boo_boo в разделе Несортированное железо
    Ответов: 3
    Последнее: 30.01.2006, 13:14

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •