User Tag List

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

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

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

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

    По умолчанию

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

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

  3. #2

    Регистрация
    29.12.2010
    Адрес
    Москва
    Сообщений
    1,870
    Спасибо Благодарностей отдано 
    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 
Просмотров:	1149 
Размер:	23.6 Кб 
ID:	77644

  4. #3

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

    По умолчанию

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

  5. #4

    Регистрация
    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 снова запускаем выполнение блока кода? Или где-то я ошибся?

  6. #5

    Регистрация
    03.07.2021
    Адрес
    г. Кировск
    Сообщений
    924
    Спасибо Благодарностей отдано 
    88
    Спасибо Благодарностей получено 
    220
    Поблагодарили
    158 сообщений
    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. #6

    Регистрация
    18.07.2021
    Адрес
    г. Хмельницкий, Украина
    Сообщений
    105
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    33
    Поблагодарили
    25 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Так ещё можно:
    Код:
            ld de, 1000       ; будем делать 1000 итераций
    	
    	ld b,e            ; подготовка регистров
    	dec de            ; подготовка регистров
    	inc d             ; подготовка регистров
    	ld hl,0           ; после выполнения цикла, в hl должно быть значение 1000
    Loop:
    	inc hl
     	djnz Loop
    	dec d
    	jp nz,Loop
    О, вот тебе и раз - опоздал. Ну и ладно.
    Последний раз редактировалось 0xDEAD; 01.08.2022 в 20:07.

    Эти 2 пользователя(ей) поблагодарили 0xDEAD за это полезное сообщение:

    Evgeny Muchkin(07.08.2022), Zidane(01.08.2022)

  8. #7

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

    По умолчанию

    В общем решил так:
    LD BC,nn ;количество итераций, 2 байта
    LD HL,nn ;число с которым выполняются операции
    LOOP
    LD A,n ;константа в регистр
    ; Код программы
    DEC BC
    LD A,B
    OR C
    JR NZ,LOOP
    Если использовать CP C, то выполняется почему то 253 итерации. И все. А вот с OR пошло как надо. Всем спасибо )

  9. #8

    Регистрация
    02.05.2015
    Адрес
    г. Таллин, Эстония
    Сообщений
    1,698
    Спасибо Благодарностей отдано 
    305
    Спасибо Благодарностей получено 
    226
    Поблагодарили
    160 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Zidane Посмотреть сообщение
    В общем решил так:

    LD BC,nn ;количество итераций, 2 байта
    LD HL,nn ;число с которым выполняются операции
    LOOP
    LD A,n ;константа в регистр
    ; Код программы
    DEC BC
    LD A,B
    OR C
    JR NZ,LOOP

    Если использовать CP C, то выполняется почему то 253 итерации. И все. А вот с OR пошло как надо. Всем спасибо )
    LD A,n не имеет смысла, т.к. чуть ниже идёт LD A,B

    Ну и попробуем сравнить:


    Код:
       ld bc, 1000
    loop:
       dec bc         ; 6t
       ld a,b           ; 4t
       or c             ; 4t
       jr nz, loop    ; 12t
                          ; итого 26 тактов
    или так

    Код:
       ld bc, 1000
    loop:
       djnz loop    ; 13/8t
       dec c           ; 4t
       jr nz, loop    ; 12/7t
                          ; итого 29 тактов (чуть меньше, т.к. последний виток быстрее переход)
    или так

    Код:
       ld bc, 1000
    loop:
       dec c           ; 4t
       jr nz, loop    ; 12/7t
       dec b           ; 4t
       jr nz, loop    ; 12/7t
                          ; итого 32 такта (чуть меньше, т.к. последний виток быстрее переход)
    и предложенное выше

    Код:
       ld de, 1000
    loop:
       dec de         ; 6t
       bit 7,d         ; 8t
       jr z, loop     ; 12t
                          ; итого 26 тактов

    Первый вариант быстрее, и чуть короче, но использует регистр А.
    Третий вариант медленнее второго, но зато не привязан к B, можно использовать два любых регистра.
    Четвёртый не привязан к А, но имеет ограничение на 32765 значений.
    Что лучше - выбирать нужно по конкретной задаче.
    Последний раз редактировалось Bedazzle; 02.08.2022 в 13:01.
    Heavy on the disasm
    Eric and the disasm
    Mask 3: Venom strikes disasm
    Bard's disasm

  10. #9

    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,104
    Спасибо Благодарностей отдано 
    1,349
    Спасибо Благодарностей получено 
    323
    Поблагодарили
    152 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Bedazzle Посмотреть сообщение
    Код:
       ld bc, 1000
    loop:
       djnz loop    ; 13/8t
       dec c           ; 4t
       jr nz, loop    ; 12/7t
                          ; итого 29 тактов (чуть меньше, т.к. последний виток быстрее переход)
    На самом деле 13+11/256. Потому что 255 из 256 раз djnz цикл заворачивает с затратой 13 тактов, и лишь один раз из 256 до jr дело доходит

    Цитата Сообщение от Bedazzle Посмотреть сообщение
    Код:
    ld bc, 1000
    loop:
       dec c           ; 4t
       jr nz, loop    ; 12/7t
       dec b           ; 4t
       jr nz, loop    ; 12/7t
                          ; итого 32 такта (чуть меньше, т.к. последний виток быстрее переход)
    Аналогично 16+11/256

  11. #10

    Регистрация
    02.05.2015
    Адрес
    г. Таллин, Эстония
    Сообщений
    1,698
    Спасибо Благодарностей отдано 
    305
    Спасибо Благодарностей получено 
    226
    Поблагодарили
    160 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Reobne Посмотреть сообщение
    На самом деле 13+11/256. Потому что 255 из 256 раз djnz цикл заворачивает с затратой 13 тактов, и лишь один раз из 256 до jr дело доходит

    Аналогично 16+11/256
    Это если мы знаем, что у нас 1000 циклов, а если будет 50 или 100, то получится иная раскладка.
    Heavy on the disasm
    Eric and the disasm
    Mask 3: Venom strikes disasm
    Bard's disasm

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

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

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

Эту тему просматривают: 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

Ваши права

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