ALKO, ТехЗадание же
с него родного все начинается
можешь даже сюда писать :) но нежелательно - закидаю(т)
Вид для печати
ALKO, ТехЗадание же
с него родного все начинается
можешь даже сюда писать :) но нежелательно - закидаю(т)
Ну для начала можно писать "быдло-код", но на ассемблере. Примерно так:
Для каждой переменной заводим байты памяти и метку:
А затем оперируем постоянно с ними, как на Бейсике:Код: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, подожди физикой грузить
пусть сначала лирику опишет
Процедура вывода спрайта (без масок):
Код:; подпрограма вывода спрайта
; входные параметры: 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 = адрес вывода знакоместа на экране
Тогда попробуй кросс-компилятор 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 - объём фрейма в байтах