PDA

Просмотр полной версии : Ассемблер. Первые шаги.



Titus
16.04.2007, 15:20
Лично для меня основная польза от этих регистров в том, что это все-таки регистры, а не память, хоть и с более медленным временем доступа, чем основные регистры.

Сам же смысл индексной адресации, для которого они изначально и предназначались, несколько нивелирован громоздким мнемокодом и сравнительно медленным временем выполнения.

Jukov
16.04.2007, 15:48
Эти регисты очень ценны для обращения к переменным, особенно флагам. Преимуществом их перед другими способами обращения к переменным является то, что при этом не портятся другие регистры, например команда BIT 0,(IY+118) сразу выдает нам результат, а обычным способом это было бы:
PUSH AF
LD A,(23728)
OR A
...
POP AF

А если флагов несколько, то они одновременно могут устанавливатся так, опять же без порчи других регистров:
LD (IY+128),255

NovaStorm
16.04.2007, 16:27
По своему небольшому опыту, обобщая, могу сказать что пользовал их как замену HL, когда сохранить/загрузить его выйдет дороже, как буфер для POP/PUSH, и половинки как счётчик для довольно большого цикла, когда других регистров нехватало.

maximk
16.04.2007, 16:33
Можно обратить внимание на то, как используется IY обычным BASIC-48: как указатель на область своих переменных. Так как его переменные им часто используются, то имеем выигрыш в размере кода. Например, первое что приходит в голову - драйвер опроса клавиатуры, где уменьшаются счетчики задержек начала повтора/повтора символа. Это будет одной командой:



DEC (IY+xyz)
JR NZ, ...

Без индексных регистров (например, в i8080) было бы так:


LD A,(VAR)
DEC A
LD (VAR), A
JR NZ,...

в этом случае портится регистр A
или


LD HL,VAR
DEC (HL)
JR NZ,...


тогда портится регистровая пара HL.

valker
16.04.2007, 17:23
Никто не желает быть начинающим. Я буду первым :)
А интересует меня практическая польза от использования индексных регистров IX и IY. Но интересует не столько теория (с ней я первично ознакомился благодаря книжке Инфоркома), сколько практика, т.е. в данном случае немного простеньких примеров, благодаря которым можно оценить их (IX и IY) преимущества.


Компиляторы с языка C активно ими пользуются для указания на автоматические (выделенные в стеке) переменные. Преимущество в данном случае то - что экономится память для переменных (по сравнению со статически распределёнными), а также появляется возможность писать рекурсивные функции (естественно, следя за размером стека).

GriV
16.04.2007, 17:36
Когда надо большой объём информации переправить, то очень эффективно используются IX и IY - но только как регистры данных (не как указатели). Для моих быстрых программ вывода звука и изображения - когда все регистры забиты предустановленными данными - я их использовал именно таким образом. Фактически, я не видел чтобы эти регистры использовали как указатели, прежде всего потому, что (как уже было сказано) слишком медленно оно работает и ограничение таблицы на 256 байт. Плюс невозможно косвенно (через другие регистры) адресовать смещение в таблице. Единственный раз я работал с структурами через IX и IY - это когда делал в своей View окошки - их дескрипторы передавались через IX, но не факт что так было быстрее - удобней, да.
Очень часто я использовал половинки IX и IY для хранения каких то важных медленно меняющихся данных - например, номера текущей страницы. Т.е. оно быстрее чем память - адресуется напрямую - но медленнее чем обычные регистры.
Длительность работы с половинками индексных регистров следующая:
8 тактов для ld <index8>,<reg8>
11 тактов для ld <index8>,N

(4 такта для ld <reg8>,<reg8>
7 тактов для ld <reg8>,N)

Длительность для работы с целой парой:
14 тактов для LD IX,NNNN
20 тактов для LD (ADR),IX

14 тактов POP IX
15 тактов PUSH IX

Фактически (кроме работы с памятью через смещение типа LD A,(IX+3)) команды отличаются наличием префиксов #DD и #FD, длительность каждого префикса 4 такта, вот и получается указанная математика (специально привёл для сравнения).

psndcj
16.04.2007, 22:40
в основном использую для переменных цикла в громоздких конструкциях с кучей вложенных циклов, либо как переменные, которые не часто изменяются. еще удобно иногда бывает использовать ix/iy для хранения/вычисления адреса перехода jp (ix)/(iy), если HL занят (как обычно и бывает).

Vitamin
17.04.2007, 17:12
Я знаю - этот код ужасен, и именно по этой причине хочу услышать конструктивную критику.


Легким движением руки превращается во что-то вроде (адаптировано под данную ситуацию, за точность не ручаюсь- могут быть глюки):



ORG 40000
COUNT LD A,0
INC A
AND 7
LD (COUNT+1),A
DEC A
CALL Z,FILBF

MAIN LD HL,BUF1
LD DE,BUF2
LD B,08
MET1 XOR A
RL (HL)
RLA
LD (DE),A
INC HL
INC DE
DJNZ MET1

LD HL,471FH
LD DE,BUF2+7
LD B,08
MET2 LD A,(DE)
OR (HL)
LD (HL),A
DEC DE
DEC H
DJNZ MET2
INC H

SCRLIN
LD B,08
SCRL1
LD L,#1F
AND A
DUP 31
RL (HL)
DEC L
EDUP
RL (HL)
INC H
DJNZ SCRL1
RET

FILBF LD HL,MESS
LD A,(HL)
INC HL
AND A
JR NZ,NOSETM
LD HL,MESS
NOSETM
LD (FILBF+1),HL
ADD A,A
ADD A,A
ADD A,A
LD L,A
LD H,#3C
LD DE,BUF1
LD BC,08
LDIR
RET

BUF1 DEFB 0,0,0,0,0,0,0,0
BUF2 DEFB 0,0,0,0,0,0,0,0
MESS DEFB " Hello all members of zx.pk.ru!!!",0

sinn_dtr
17.04.2007, 18:48
Всегда избегал эти регистры из-за их тормознутости.

Vitamin
17.04.2007, 19:12
...
FILBF LD HL,MESS
LD A,(HL)
INC HL
AND A ;тут, вроде, флаг Z сбрасывается,
;если A==0, то Z=1
JR NZ,NOSETM ;след. условие NZ выполняется
LD HL,MESS ;и сюда мы не попадаем никогда. Или нет?
NOSETM
LD (FILBF+1),HL ;не понял ничего вплоть до RET :-)
;ошибочка тут:) должно быть так:
LD L,A
ADD HL,HL ;HL=sym*2+#xx00
LD H,#0F ;HL=sym*2+#f00
ADD HL,HL ;HL=sym*4+#1e00
ADD HL,HL ;HL=sym*8+#3c00 <- что и требовалось :)
LD DE,BUF1 ;а здесь копируем
LD BC,08
LDIR
RET
...




Я тут подумал, что можно было бы обойтись и без BUF2 выводя старший бит скроллируемого влево байта прямо на экран :v2_blush:
Можно и так. Еще у тебя есть ошибка- программу надо зациклить. Ну и добавить в цикле проверку на выход (клавишу там нажать надо или еще что).

James DiGreze
17.04.2007, 19:18
AND A ;тут, вроде, флаг Z сбрасывается,
JR NZ,NOSETM ;след. условие NZ выполняется
LD HL,MESS ;и сюда мы не попадаем никогда. Или нет?
По AND A определяется нулевое значение А, т.е. if (A==0) Z=1 else Z=0


Можно и так. Еще у тебя есть ошибка- программу надо зациклить. Ну и добавить в цикле проверку на выход (клавишу там нажать надо или еще что).И HALT перед входом в SCROLL иначе будет "рвать" строку

jim
18.04.2007, 11:17
Вопрос, назревавший в другом, не совсем подходящем для него разделе:
Как правильно рассчитывается количество задержек HALT для отрисовки на бордюре командой OUT(#FE),A фиксированной полосы определённог цвета.

одного HALT достаточно для синхронизации с обратным ходом луча. это и будет PAUSE 1

Vitamin
18.04.2007, 11:29
Вопрос, назревавший в другом, не совсем подходящем для него разделе:
Как правильно рассчитывается количество задержек HALT для отрисовки на бордюре командой OUT(#FE),A фиксированной полосы определённог цвета.
Вопрос поставлен несколько некорректно.
Команда HALT ждет прихода прерывания. Согласно структуре ULA спектрума, данное событие (приход прерывания) совпадает с началом отрисовки видеокадра. Так что, выполнив эту команду, всего лишь синхронизируешься с лучом- HALT применяется для организации задержек, кратных периоду кадра (50мс). Для более мелких задержек (с более высокой точностью) надо действовать иначе- например, просто организовать цикл или выполнение "ненужных" команд.
Вообще, сначала прочитай все на http://www.zxdn.narod.ru/ - большая часть вопросов отпадет сама.

Jukov
18.04.2007, 20:28
А вот аналогичная бегущая строчка, которую я хотел встроить в Бобика, но не успел. По адресу 40000 грузится русский фонт или любой другой. А можно и вообще использовать ПЗУшный, если вместо INCBIN "fontrus" вставить EQU 15616. Выход из процедуры по BREAK:



ORG 40000
FONT INCBIN "fontrus"

ORG 30000
R4 LD IX,TEXT
R3 LD A,(IX)
OR A
JR Z,R4
INC IX
ADD A,A
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
LD DE,FONT-256
ADD HL,DE
LD DE,BUFER
LD BC,8
LDIR
LD C,8
R2 HALT
LD DE,BUFER
LD H,#50
R0 LD B,32
LD L,#FF
LD A,(DE)
RLCA
LD (DE),A
INC DE
R1 RL (HL)
DEC L
DJNZ R1
INC H
BIT 3,H
JR Z,R0
CALL 8020
RET NC
DEC C
JR NZ,R2
JR R3
BUFER DEFS 8
TEXT
DEFB "HELLO WORLD!"
NOP

SAM style
18.04.2007, 22:11
Прикольно, но вот этот фрагмент кода мне не очень ясен:


BIT 3,H ;Это я понял. Проверка на достижение восьмёрки.
JR Z,R0 ;это понятно
CALL 8020 ;что выполняет эта процедура? 8)
RET NC ;ну это тоже понятно

Я вроде как начинающий, мне простительно ;)

Если мне память не отшибло (редко пользуюсь процедуринами из ПЗУ), call 8020 - это тест на нажатие break (CS+Space). Возвращает CY=1 когда он не нажат, и CY=0 когда нажат.

Jukov
19.04.2007, 16:41
Если мне память не отшибло (редко пользуюсь процедуринами из ПЗУ), call 8020 - это тест на нажатие break (CS+Space). Возвращает CY=1 когда он не нажат, и CY=0 когда нажат.
Память тебе не изменяет. Ассемблер - это низкоуровневый язык, и очень удобно пользоваться уже готовыми процедурами, когда пишешь какие-нибудь тестовые процедуры. Это экономит время. В конечном же продукте процедуры ПЗУ лучше не использовать из соображений совместимости.

Vitamin
21.04.2007, 19:43
Может, кто-нибудь поможет разобраться?
Демку не видел, поэтому ориентируюсь по коду
Чувствуется давность кода :) В экранной области #5100-#5700 циклически скроллируются байтики. По два пиксела за раз. Если скроллируемый байт будет равен %01111110 (хранится в ячейке 51933), то в нижней трети увидем двигающиеся вправо квадратики размером 6х6 пикселов.
Как работать со стеком, смотрим в цикле статей от Alco на вышеуказанном сайте :)

Vitamin
21.04.2007, 22:34
Всё, ушёл штудировать ZXDN :)
[несмотря на всю мою нелюбовь к электронным изданиям; ничего не могу с собой поделать: книжкам (печатным) всегда отдавал и буду отдавать предпочтение]
Дык, распечатай! :) Там не такие уж и большие статьи

TomCaT
24.04.2007, 14:36
А, да-да. Много таких демок в Волгодонской коллекции, в играх. в нижней трети сроллируются квадратики, потом только успевать к ним атрибутами пририсовывать восьмикратно увеличенные символы.

klondike
15.05.2007, 21:46
Всегда использовал IX только в системных утилитах.
Например как ссылку на массив констант/переменных при отрисовке меню.
По принципу:

CALL drawcells
cell1: DB xx,yy,l,h,(etc)
cell2: DB xx,yy,l,h,(etc)

***

drawcells: POP IX

budder
20.05.2007, 23:15
Какое-то уродство, не правда ли? ;)
Наверняка есть более изящный способ реализации алгоритма.
Его мне и хотелось бы увидеть. Вопрос не праздный, ответ на него поможет мне разобраться с ветвлением в программе (а интересует в первую очередь именно оно).

Вот вариант немного получше:


ORG #6000
LD HL,#093E
LD DE,#5800
LD BC,#2001
L0 LD A,C
AND (HL):INC HL
JR Z,$+2+2+2:LD A,#57:JR $+4
LD A,#47
LD (DE),A:INC E
DJNZ L0
RET


В данной ситуации лучше отказаться от CALL'ов... Также передачу правильней делать через аккумулятор, т.к. иногда нужно брать значения из переменных...

Можно ещё упростить, но проца уже будет без ветвлений. ;)

SAM style
20.05.2007, 23:29
PO/PE - это совсем не та чётность, которую бит 0 показывает...
Можно так сделать:


LD HL,#5800
LD DE,#093E
LD B,32
L0 LD A,(DE)
AND A
LD A,#57
JP PO,L1
LD A,#47
L1 LD (HL),A
INC L
INC DE
DJNZ L0
RET

budder
21.05.2007, 00:15
PO/PE - это совсем не та чётность, которую бит 0 показывает...


само собой... ;)

budder
21.05.2007, 07:24
Я стесняюсь спросить.. Но что это значит? :v2_blush:

собственно по биту 0 проверяется кратность числа 2-ке...

флаг P/V же принимает значение от P при командах and, xor, и т.д. (он также может принимать значение от V)
P - индицирует "чётность" в результате операции, т.е. принимает значение 1, если кол-во включенных битов кратно 2 (в том числе 0) и 0, если кол-во включенных битов не кратно 2...

PE - чётность (P/V=1)
PO - нечётность (P/V=0)

Vitamin
21.05.2007, 09:15
ld hl,#5800
ld de,#093e
ld b,32
cyc:
ld a,(de)
and 1
rla
rla
rla
rla
xor #47
ld (hl),a
inc l
inc de
djnz cyc
ret

jim
23.05.2007, 08:56
у меня простой вопрос, что будет в регистре H после выполнения:
..
push af
pop hl
..
?

caro
23.05.2007, 08:57
у меня простой вопрос, что будет в регистре H после выполнения:
..
push af
pop hl
..
?h = a; l = f

SAM style
22.06.2007, 21:17
Как понимать IXL и IXH?Это младший (IXL) и старший (IXH) байты IX. То же самое, как H и L составляют HL.

SAM style
22.06.2007, 22:01
Тогда мне не совсем понятно действие команды ADD IXL. Что она прибавляет к содержимому младшего байта рег. пары IX?
И ещё, при загрузке двухбайтового значения в рег пару IX, означает ли, что в I загружается старший байт, а в X - младший? Собсно смущает то, что I активно используется при обработке прерываний..
Это эмуль сокращает. На самом деле это ADD A,IXL (A=A+IXL)
Не путай - IX это не I и X (это Index register X). IX=256*IXH+IXL. Кстати, IXL и IXH бывает ещё обозначаются как LX и HX

Retrograd
08.07.2007, 01:42
А подскажите, плиз:

push af
ld a,#02
call #1601
ld de,text

print:
ld a,(de)
inc de
rst #10
and a
jr z,print
ret

text defb "ZX-Spectrum",0

Почему после RST#10 в АF появлется значение 38h? Как сделать проверку "конец строки" в таком случае?

psndcj
08.07.2007, 08:06
rst #10 выводит символ в канал/поток (ну в данном случае на экран) и видимо в процедуре регистры по ходу портятся... надо просто переставить местами операторы:

print:
ld a,(de)
inc de
and a
ret z
rst #10
jr print

выглядит конечно неочень красиво такая конструкция...

а такто если уж печатать с помощью ПЗУ, то проще пользоваться готовой процедурой по адресу 8252 - в регистрах DE - адрес текста, в BC - длина строки. Длину строки може посчитать сам ассемблер:

message1 db 'пример'
message1_len equ $-message1

Retrograd
08.07.2007, 11:23
2 Mig'95
Для безопасного вызова функции. Грешу, забыл в конце, перед RET добавитб pop.

2 psndcj
Спасибо! Все стало ясно.

Добавлено через 1 минуту

а такто если уж печатать с помощью ПЗУ, то проще пользоваться готовой процедурой по адресу 8252

А какие способы печати еще есть?

Shadow Maker
08.07.2007, 15:27
В смысле? Вот там у тебя LD D,40H;(2) Вот XPOS поставь 0, и будет у тебя печатать с 4000, с самого начала экрана.

Retrograd
08.07.2007, 16:48
а с точки зрения оптимизации кода и быстродействия: разве через RST печатать не красИвее?

Retrograd
08.07.2007, 21:18
А как можно взглянуть через STS что происходит при вызове RST#10?

Shadow Maker
08.07.2007, 22:05
Дык к моменту полного заполнения экрана там уже будет не LD D,40H, а LD D,50H.. При каждом переходе в следующий сегмент экрана туда будет засылаться значение равное текущему+8..
Ой бедаааа... :) :)
Вместо LD D,40H ;(2) пишем:

L1 LD A,#40
CP #51
JR C,L2
LD A,#38
L2 ADD A,8
LD (L1+1),A
LD D,A

Добавлено через 5 минут

а с точки зрения оптимизации кода и быстродействия: разве через RST печатать не красИвее?
Есть оптимизация по размеру, есть оптимизация по скорости. В зависимости от назначения и от требований, твоя меньше по размеру, но медленнее идет печать. Если уж пользоваться ПЗУ, то пользуйся процедурой, которую CJ сказал, вот уж реально оптимизация ;)

Vitamin
08.07.2007, 22:13
Взять и протрассировать. Главное ловить момент физической записи на экран- может перезатираться обновлением экрана у СТСа и нифига не будет видно

psndcj
09.07.2007, 01:18
лучше не смотреть как RST#10 работает =) уж больно жутко с точки зрения оптимальности... просто в ПЗУ совсем другая тема - эта процедура печатает символ в любой поток/канал открытый - учитывая что обычно ей пользуются только для вывода на экран смысла в ней особого нет (ну разве что для экономии памяти)... хотя тут тоже вопрос - учитывая что надо атрибуты, номер канала (или потока) устанавливать, нельзя в нижние 2 строки (по умолчанию) печатать... на любителя короче - лично я всегда использую хотя бы самую простейшую, но свою печаталка =)

делал на minigame игрушку - CBOX 1k - там блочный экран (типа текстового, 7 видов спрайтов вроде) - так даже в 1к нет особого смысла использовать ПЗУ...

Shadow Maker
09.07.2007, 08:07
А разве в этом случае уже второй символ строки не уйдёт из позиции 4001H в позицию 4801H?
И правда, беда какая-то.. :)
Ну блин, ты ж написал сам что буш проверять на переполнение A, я тебе и написал только ту часть, которая у тебя непонятки вызывала...

Splinter
12.07.2007, 13:41
Люди, дайте оптимизированую процедурку UP_HL 8)

SAM style
13.07.2007, 09:24
Хех... вот только концовки у них перепутаны.


DHL
...
ret c
ld a,h
sub 8
ld h,a
ret

UHL
...
ret c
ld a,h
add a,8
ld h,a
ret


а иначе, например, DHL после 7й строчки перепрыгнет на 72ю.

tiboh
13.07.2007, 20:26
Так будет быстрей:

...
A,H
DEC H
AND 7
CALL Z,UH
...

UH A,L
ADD A,#E0
L,A
SBC A,A
AND 8
ADD A,H
H,A
RET

Или так (если нельзя делать Call):

A,H
DEC H
AND 7
JR NZ,$+11
A,L
ADD A,#E0
L,A
SBC A,A
AND 8
ADD A,H
H,A
RET

Splinter
14.07.2007, 08:49
Довн ХЛ оч распространенная процедура, в каждом кодерском журнале есть (спековском) почти, а вот UP HL я не встречал, а иногда нужно...

psndcj
14.07.2007, 22:39
когда я писал скроллеры, которые меняют позицию по горизонтали - обычно использовал таблицу адресов экранных линий - опять же смотря по различным демам - так все и делают

DownHL - распространенная процедура конечно, но если она вызывается порядочное число раз на кадр - от нее надо отказываться... UpHL - хотя практически одно и то же - но на практике встречается довольно редко потому, что на практике обычно бывает изменить алгоритм и перейти к старой знакомой процедуре =)

ничего личного...

Splinter
16.07.2007, 08:18
таблица адресов рулит ! 8)

brian4ever
27.08.2007, 13:06
Ковыряюсь вот помаленьку. Нубский вопрос, как в alasm перейти из режима редактирования в режим комманд?

Vitamin
27.08.2007, 13:56
Ковыряюсь вот помаленьку. Нубский вопрос, как в alasm перейти из режима редактирования в режим комманд?
ExtMode. RTFM!

Nomy Graphics
04.09.2007, 22:45
Вот у меня теоретический вопрос. Применяются ли реально команды OTDR OTIR и подобные, или это сделано по соображениям совместимости или "зеркальности" по отношению к внутренней памяти? простите если туплю..

Максагор
04.09.2007, 23:13
Вот у меня теоретический вопрос. Применяются ли реально команды OTDR OTIR и подобные, или это сделано по соображениям совместимости или "зеркальности" по отношению к внутренней памяти? простите если туплю..

INIR применяется в драйвере винта в процедуре чтения. OTIR там не применяется только из-за особенностей устройства контроллера (там используются пары OUTI, OUTD). А так, эти команды вполне можно использовать при работе с высокоскоростными внешними устройствами передачи данных...

tmp_online
18.09.2007, 17:57
Друзья спектрумисты, кто мне подскажет, как объявлять матрицу в ассемблере? Желательно с примерами. Ну и как работать с ними. Спасибо

Vitamin
18.09.2007, 18:28
Друзья спектрумисты, кто мне подскажет, как объявлять матрицу в ассемблере? Желательно с примерами. Ну и как работать с ними. Спасибо
Обычной таблицей. Потом просто использовать функцию преобразования двумерных матричных координат в одномерные координаты массива. Для ускорения можно воспользоваться следующей формулой:
Elem_Addr=256*(row+high(matrix_base))+col*sizeof_e lement.
Т.е. ряды по секторам, выровненным по 256 байт. Но это если очень быстро надо, ибо весьма расточительно (хотя остатки секторов также можно исползовать для своих целей

himik
18.09.2007, 20:54
дайте справочник по асму в эл. виде.
забыл все команды, такты и фичести...
:)

rasmer
19.09.2007, 23:55
дайте справочник по асму в эл. виде.
забыл все команды, такты и фичести...
:)Илья.... для девичьей памяти уже поздно, а для старческого склероза ещё рано :). Где то от Alex\AT пролетал... но мне ближе и милее инфоркомовский самомучитель.....

psndcj
20.09.2007, 22:01
а по мну - самый здравый справочник по командам - в книге Родионова Zx-Spectrum и Tr-Dos для пользователей и программистов --- а растактовка - опять же в ПИТЕРской книжке - как написать игру на ассемблере... сам уже больше 10 лет пользуюсь =)
обе книги есть на виртуал тр-досе...

himik
20.09.2007, 22:26
а мну так написал, чтоб тему обновить :)

ser_13
15.11.2007, 16:18
Доброго времени суток!
Прошу прощения за вопросы. Я скачал SjASMPlus Z80 кросс ассемблер. Как его запустить. Как им пользоваться. У меня стоит Windows XP. ZX Spectrum работает через эмулятор US0365. Когда был реальный ZX Spectrum а пользовался ассемблером Gens, Mons. Может есть другие ассемблеры для эмуляторов под Windows XP.

breeze
15.11.2007, 16:33
Я скачал SjASMPlus Z80 кросс ассемблер. Как его запустить.

На самом деле SjASMPlus это не редактор (как тот же Gens) это компилятор. Ты создаёшь в любом текстовом редакторе (Блокнот, FAR итд) текст своей программы и компилируешь с помощью SjASMPlus.

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

moroz1999
16.11.2007, 09:19
я пользуюсь sjasm примерно по такой схеме:
1. есть bat-file, который запускает процесс компиляции, а потом автоматом стартует unreal со сгенерированным trd файлом.
его содержимое:

sjasmplus.exe main.asm
pause
unreal\unreal main.trd

2. внутри main.asm перед самой программой идут вот такие директивы:

DEVICE ZXSPECTRUM128

EMPTYTRD "main.trd"

org 23867
INCBIN "boot.bin"
SAVETRD "main.trd","boot.B",23867,161
это - включение модели памяти zx128, создание пустого трд диска и запись первым файлом заранее приготовленного бута (в качестве бута идет real commander).

3. в конце main.asm, после кода самой программы идут вот такие строки:

END_ADDRESS
PROGRAM_LENGTH EQU END_ADDRESS-START_ADDRESS

SAVETRD "main.trd","code.C",START_ADDRESS,PROGRAM_LENGTH


ORG 45056
INCBIN "file1.bin"
SAVETRD "main.trd","file1.C",#b000,4096

ORG 39680
INCBIN "file2.bin"
SAVETRD "main.trd","file2.C",39680,768
здесь автоматом вычисляется длина скомпилированной программы, которая потом используется для сохранения блока скомпилированного кода на диск.
ну и далее к trd цепляются еще 2 файла, нужные для моей проги.

редактирую asm-файлы в Scite редакторе с подправленными правилами раскраски текста.

ser_13
19.11.2007, 22:02
Я отыскал ZX-Ревю за 1993г. Там есть перевод книги Стюард Николс. Применение Ассемблера для создания быстроработающих программ. На реальном ZX-Spectrum я прорабатывал эту тему, но так и не закончил. Поскольку сейчас появился эмулятор, то имеется возможность продолжить изучение. Как то давно продавали «типа китайских игрушек тетрис и др.», но только советские. Была на мой взгляд неплохая игра. Волк из «Ну погоди», сидящий посередине экрана ловил яйца. Яйца прокатывались по 4 наклонным, как бы, палочкам и подали вниз. Игрок должен был клавишам направить волка с корзиной, чтобы поймать яйцо. Если оно падало, то вылуплялся цыпленок и с писком убегал. При этом число попыток уменьшалось на 1.
Я давно хотел написать такую программу на ассемблере, но я не знаю как прокатывать яйца. По мере увеличения набранных очков увеличивалось и количество прокатываемых яичек. Как их двигать я не знаю.

Kurles
20.11.2007, 06:51
Я отыскал ZX-Ревю за 1993г. Там есть перевод книги Стюард Николс. Применение Ассемблера для создания быстроработающих программ. На реальном ZX-Spectrum я прорабатывал эту тему, но так и не закончил. Поскольку сейчас появился эмулятор, то имеется возможность продолжить изучение. Как то давно продавали «типа китайских игрушек тетрис и др.», но только советские. Была на мой взгляд неплохая игра. Волк из «Ну погоди», сидящий посередине экрана ловил яйца. Яйца прокатывались по 4 наклонным, как бы, палочкам и подали вниз. Игрок должен был клавишам направить волка с корзиной, чтобы поймать яйцо. Если оно падало, то вылуплялся цыпленок и с писком убегал. При этом число попыток уменьшалось на 1.
Я давно хотел написать такую программу на ассемблере, но я не знаю как прокатывать яйца. По мере увеличения набранных очков увеличивалось и количество прокатываемых яичек. Как их двигать я не знаю.Всё уже написано до вас ;) http://trd.speccy.cz/full_ver/KOOLEGGZ.ZIP

CityAceE
20.11.2007, 07:09
Ну и что же, что написано! Как я понимаю, человек хочет написать своё для изучения языка и тренировки.

Vitamin
20.11.2007, 17:39
Классика жанра- "Как написать игру на ассемблере" (с робокопом на мотоцикле на обложке). И изучение языка и основ работы с графикой (спрайты и так далее).

Kurles
20.11.2007, 20:45
Я давно хотел написать такую программу на ассемблере, но я не знаю как прокатывать яйца. По мере увеличения набранных очков увеличивалось и количество прокатываемых яичек. Как их двигать я не знаю.Ну а если просто для тренировки - у нас в кулегсах алгоритм простой - за "прокатку" яиц отвечали 2 байта: первый - скорость перекатки яйца с позицию на позицию в прерываниях, второй - через сколько прерываний появляется новое яйцо. Ну и на каждое яйцо описатель - номер лотка, номер текущей позиции в лотке, "время жизни" яйца в прерываниях на текужей позиции. Не много совсем подумать-то и надо :) Блин, жаль исходников не сохранилось, поделился бы.

ser_13
21.11.2007, 22:57
Доброго времени...!
Vitamin: "Как написать игру на ассемблере" я слышал о такой книге, но не видел. Хотел бы почитать. Я читал книгу «Как написать игру для ZX Spectrum».
CityAceE:. У меня по части программирования ничего не получается.
Kurles: Я скачал “KOOLEGGZ.ZIP” внутри находится файл “KOOLEGGZ.SCL”. У меня
эмуляторы Unreal, EmuZWin. В эмуляторе EmuZWin есть Debug Window так, что дизассемблер Вашей программы можно увидеть.
В EmuZWin программы, которые я набираю на Basic записываются *.ezx
В EmuZWin “All supported file types ” поддерживается *.SCL. При выделении файлов *.TAP появляется изображение кассеты и игра загружаются и сама запускается. При выделении файлов *.SCL появляется изображение дискеты, но ничего не загружаются. Я не знаю как с этим бороться. Я все программы скачивал с расширением *. TAP. Я записал файл “KOOLEGGZ.SCL” на дискету и загружал его с дискеты не загружаются.

Добавлено через 27 минут
Мне удалось найти книгу Евдокимов А. А. Капульцевич. Как написать игру на ассемблере для ZX Spectrum.

Vitamin
22.11.2007, 10:32
Мне удалось найти книгу Евдокимов А. А. Капульцевич. Как написать игру на ассемблере для ZX Spectrum.
Судя по trd.speccy.cz, это она и есть. Читать от корки до корки :) Хотя там есть и спорные моменты, помощь этой книги переоценить трудно.

CityAceE
22.11.2007, 11:18
У меня по части программирования ничего не получается.
Главное - желание! И не бояться задавать вопросы. Здесь обязательно помогут!

ser_13
23.11.2007, 09:59
Может это глупое желание. Я бы хотел посмотреть код очень простой игры.

CityAceE
23.11.2007, 10:45
В комплекте с sjasm в качестве примеров идёт несколько исходников програм, в том числе и исходник игры Питон.

ser_13
23.11.2007, 10:58
А кто знает ассемблер ARTICASM. При запуске заставка "SPECTRUM-ASSEMBLER"
1982 ARTIC Computing Ltd. Если нажать H появляется help:
A......Assemble current Source C... Copy block of memory D...Damp (to printer)
E...go into the EDITOR и т.д. Если нажать E появится редактор. 1. В каком формате вводить программу, которую хочу ассемблировать? 2. Как выйти из редактора (пока самое главное)? Можно скачать http://zx-spectrum.narod.ru/soft00.htm
Articasm - ассемблер (82) - 7 kb

Добавлено через 1 час 31 минуту
Я все равно не пойму как работать с sjasm. Имеем файл Sjasmplus я понимаю, что *.exe который должен запустится. Он запускается, но с экрана картинка сразу исчезает. Возможно sjasm не под ХР. Я запускал под VC (Волков). Там такая картина:
Option flags as follows:
-- help Help information <you se it>
-- i <path> or I <path> or – inc=< path > Include path и т.д.
А у Вас как? Как он вообще запустится?

NovaStorm
23.11.2007, 15:34
Дык, так и запустится... Знаешь что такое консоль? Пуск->Выполнить->cmd
Вот оттуда или из коммандеров(тот же VC) и нужно запускать.
Например "sjasmplus -mbq game.a80", из директории с исходниками. В зависимости от содержимого входного файла может получиться дамп памяти например или образ диска.

ser_13
23.11.2007, 16:13
Я наконец, понял как использовать эмулятор EmuZWin для ассемблирования и дизассемблирования программ в кодах. Ввод их в Spectrum и выполнение.
С Articasm много возни и бестолку.

Добавлено через 2 часа 35 минут
ORG 61A8 (1)
LD A, 02 (2)
CALL 5633 (3)
LD DE, MESS (4)
LD BC, 10 (5)
LOOP LD A, B (6)
OR C (7)
RET Z (8)
LD A, (DE) (9)
RST16 (10)
INC DE (11)
DEC BC (12)
JR LOOP (13)
MESS DFEB «I love you» (14)
DFEB «I love you»: DFEB I love you:
MESS DFEB 73,32,108,111,118,101,32,121,111,117
MESS DFEB 73 32 108 111 118 101 32 121 111 117
MESS DFEB 49h,20h,6Ch,6Fh,76h,65h,20h,79h,6F,75h
MESS DFEM »I love you»: MESS DFEM I love you:
От такой код, сообщает 14:Syntax invalid. Как правильно написать?. Я пробовал разные варианты не получается. Какие еще есть варианты? Вариантов много главное выбрать правильный.

Vitamin
23.11.2007, 19:41
К чему столько строк с объявлениями?

К тому же неправильными. DEFB надо использовать для вставки набора байт/строки (не все ассемблеры поддерживают вставку строки в DEFB, надо использовать директиву DEFM).

ser_13
23.11.2007, 20:24
ORG 25000
LD A,2
CALL 5633
LD DE,MESS
LD BC,10
LOOP LD A,B
OR C
RET Z
LD A,(DE)
RST 16
INC DE
DEC BC
JR LOOP
MESS DEFB "I love you"
Вот верный код, теперь и у меня получилось. Спасибо

ser_13
27.11.2007, 11:33
А почему такая программа не получается ? Так после метки MESS можно написать целое меню.
ORG 40000
LD A,2
CALL 5633
LD HL,MESS
REP LD A,(HL)
CP FFH
RET Z
RST 16
INC HL
JR REP
MESS DEFB 22,5,2
DEFB "Sinclair Research Ltd. 1982"
DEFB 22,10,4
DEFB "······Program··W·I·N·D·O·W"
DEFB 255

TomCaT
15.12.2007, 19:54
ExtMode. RTFM!

А где этот самый M, который R, можно найти?

tmp_online
17.12.2007, 15:20
у кого-нибудь из здесь присутствующих есть опыт по написанию искусственного интеллекта? Он вообще много памяти занимает? И что посоветуете, анализировать ситуацию сразу после действий игрока (ну двинулся он направо, например, а потом происходит анализ на нахождение врагов в каком-либо радиусе он героя) или через определенное количество времени?

SAM style
17.12.2007, 20:38
Как-то делал игру типа шашек. "ум", выбирая свой следующий ход, перебирал все возможные его варианты и выбирал тот, после которого человек может нанести минимальный урон (а то и сам оказаться в плачевном положении).

axor
18.12.2007, 16:59
"Абзац" 23 (http://www.abzac.retropc.ru/files/23.zip)
Статья Вячеслава Медноногова "Интеллект компьютера в стратегиях реального времени".

himik
10.01.2008, 12:27
LD A,2
CALL 5633

можно свободно заменить на
CALL #0DAF - экономим пару байт, цель и функции теже :)

она за одно, если память не изменяет, очистит экран и установит текущие атрибуты из басика, + 2-й поток для печати через ПЗУ.