ALKO, ТехЗадание же
с него родного все начинается
можешь даже сюда писать но нежелательно - закидаю(т)
ALKO, ТехЗадание же
с него родного все начинается
можешь даже сюда писать но нежелательно - закидаю(т)
С уважением,
Jerri / Red Triangle.
Ну для начала можно писать "быдло-код", но на ассемблере. Примерно так:
Для каждой переменной заводим байты памяти и метку:
А затем оперируем постоянно с ними, как на Бейсике:Код:var_i defb 0 ; однобайтовая переменная var_j defb 0 ; однобайтовая переменная var_x defw 0 ; двухбайтовая переменная var_y defw 0 ; двухбайтовая переменная
Проверка условий:Код:; LET i=i+j ld a,(var_i) ld c,a ld a,(var_j) add a,c ld (var_i),a ; или вот так, но тут портится регистр HL: ld hl,var_i ld a,(var_j) add a,(hl) ld (hl),a ; LET x=x+y ld hl,(var_x) ld de,(var_y) add hl,de ld (var_x),hl ; сложение однобайтовой и двухбайтной переменной LET x:=x+i: ld a,(var_i) ld c,a ld b,0 ; превратили регистр a в регистр bc ld hl,(var_x) add hl,bc ld (var_x),hl
Цикл со счетчиком:Код:; IF i>j THEN LET i=i-j ELSE LET i=i+j ; т.к. в асме нет проверки условия "больше", то заменяем на "меньше": ; IF j<i THEN LET i=i-j ELSE LET i=i+j ld a,(var_j) ld hl,var_i cp (hl) jp c,label01 add a,(hl) jp label02 label01 ld a,(hl) ld hl,var_j sub a,(hl) label02 ld (var_i),a
Цикл со счетчиком и с принудительным выходом из тела цикла:Код:; повторить 45 раз ld b,45 loop01 push bc ; запомнить b в стеке ... pop bc ; достать b из стека djnz loop01 ; если внутри цикла регистр b не изменяется, то можно убрать push bc и pop bc.
Код:; FOR i=0 to 20 ; ... ; IF i>15 THEN <выход из цикла> ; NEXT i ; ... ld b,20 loop01 push bc ld a,20 sub a,b ld (var_i),a ; получили значение i ... ld a,(var_i) cp 16 ; if i>=16 jp nc,label01 ; then goto label01 pop bc djnz loop01 jp label02 label01 pop bc ; возвращаем стек в исходное состояние, т.к. до этого мы туда втолкнули bc label02 ...
Последний раз редактировалось Andrew771; 16.01.2012 в 11:07.
Andrew771, подожди физикой грузить
пусть сначала лирику опишет
С уважением,
Jerri / Red Triangle.
Процедура вывода спрайта (без масок):
Код:; подпрограма вывода спрайта ; входные параметры: HL=адрес спрайта, D=вертик.координата вывода на экране, E=гориз.координата вывода на экране ; выходных параметров нет PUTSPR LD A,(HL) AND A RET Z ; выход, если пустой спрайт LD B,A PUTS1 PUSH BC ; B = количество знакомест в спрайте INC HL LD A,(HL) ADD A,D LD B,A INC HL LD A,(HL) ADD A,E LD C,A INC HL PUSH DE ; DE = координаты спрайта на экране EX DE,HL ; DE = адрес нахождения в спрайте, HL = свободно LD A,B ; расчет адреса первого байта знакоместа в HL LD H,A RRCA RRCA RRCA AND A,224 ADD A,C LD L,A LD A,H AND 24 OR 64 LD H,A ; HL = адрес вывода знакоместа на экране, DE = адрес изображения в спрайте ; вывод знакоместа (8 строк) LD A,(DE) LD (HL),A ; вывели байт спрайта INC DE INC H LD A,(DE) LD (HL),A ; вывели байт спрайта INC DE INC H LD A,(DE) LD (HL),A ; вывели байт спрайта INC DE INC H LD A,(DE) LD (HL),A ; вывели байт спрайта INC DE INC H LD A,(DE) LD (HL),A ; вывели байт спрайта INC DE INC H LD A,(DE) LD (HL),A ; вывели байт спрайта INC DE INC H LD A,(DE) LD (HL),A ; вывели байт спрайта INC DE INC H LD A,(DE) LD (HL),A ; вывели байт спрайта EX DE,HL ; HL = адрес нахождения в спрайте POP DE ; HL = адрес нахождения в спрайте, DE = координаты спрайта на экране POP BC ; B = цикл по количеству знакомест в спрайте DJNZ PUTS1 RET ; спрайты SPRITE01 DEFB 14 ; количество знакомест в спрайте DEFB 14,3, 0,0,0,0,0,0,255,255 ; знакоместо 1: координата y, координата x, 8 байтов изображения DEFB 15,3, 0,23,20,243,0,0,0,0 ; знакоместо 2 ... и так 14 знакомест ...
---------- Post added at 10:32 ---------- Previous post was at 10:30 ----------
ALKO уже умеет игры на Бейсике и Дельфи писать, к асму надо приучить.
---------- Post added at 10:46 ---------- Previous post was at 10:32 ----------
Код:LD B,Y LD C,X LD A,B LD H,A RRCA RRCA RRCA AND A,224 ADD A,C LD L,A LD A,H AND 24 OR 64 LD H,A ; HL = адрес вывода знакоместа на экране
Последний раз редактировалось Andrew771; 16.01.2012 в 10:35.
Тогда попробуй кросс-компилятор ccz80, удобный, но не оптимальный: http://zx.pk.ru/showpost.php?p=450358&postcount=4
все вопросы решаются тут - http://zxpress.ru/
z88dk оптимизированее...Только с ним не могу разобраться.
---------- Post added at 19:45 ---------- Previous post was at 19:43 ----------
Спасибо за код перевода XY в 2 байта.
Теперь то же самое нужно для перевода address (формата DEC) в 2 байта.
---------- Post added at 20:53 ---------- Previous post was at 19:45 ----------
На бейцыке это будет примерно так:
add= 40000
x=int(add/256)
y= add-(x*256)
---------- Post added at 20:55 ---------- Previous post was at 20:53 ----------
x - старший байт
y - младший байт
---------- Post added at 20:57 ---------- Previous post was at 20:55 ----------
хотя проще будет выбирать фрейм
40000+k*n, где n - номер фрэйма
k - объём фрейма в байтах
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)