PDA

Просмотр полной версии : Помогите новичку с ассемблером!



Ares
01.05.2012, 12:50
Добрый день,подскажите пожалуйста.Как в ALASM`е загрузить кодовый файл ?
Например:load "adg" code 23650,3400 Как его запустить в ALASM`е ?

Vitamin
01.05.2012, 12:52
Добрый день,подскажите пожалуйста.Как в ALASM`е загрузить кодовый файл ?
Например:load "adg" code 23650,3400 Как его запустить в ALASM`е ?



org 23650
incbin "adg",3400


Только непонятен смысл...

GriV
01.05.2012, 12:54
Пожалуйста, детализируйте задачу, что Вы хотите сделать.
Вероятно, вы хотите не то, что вам посоветовал коллега Vitamin.

Ares
01.05.2012, 12:57
У меня есть картинка,как мне ее вставить в мою программу в ALASM`е ?
Картинка мультикалорная с расширением code

Vitamin
01.05.2012, 13:13
У меня есть картинка,как мне ее вставить в мою программу в ALASM`е ?
Картинка мультикалорная с расширением code
Вставка готовый блоков с нерелоцируемыми кодами- плохой тон.

GriV
01.05.2012, 13:45
У меня есть картинка,как мне ее вставить в мою программу в ALASM`е ?
Картинка мультикалорная с расширением code
Если это просто картинка, то вставляйте куда угодно, главное программу не перетрите.
Если это код мультиколора, то тут надо осторожно. Вероятно, она заточена под конкретный адрес, так что надо смотреть что и как там работает. Вообще, если Вы новичок, я бы очень не советовал работать с мультиколорами и прочими элементами экстремального программирования. Пока пытайтесь сделать что-нибудь попроще.

Ares
01.05.2012, 14:19
Если это просто картинка, то вставляйте куда угодно, главное программу не перетрите.
Если это код мультиколора, то тут надо осторожно. Вероятно, она заточена под конкретный адрес, так что надо смотреть что и как там работает. Вообще, если Вы новичок, я бы очень не советовал работать с мультиколорами и прочими элементами экстремального программирования. Пока пытайтесь сделать что-нибудь попроще.
Мне 13 лет и это мультиколорная картинка

Vitamin
01.05.2012, 14:29
Мне 13 лет и это мультиколорная картинка
Вопщим так. Возраст, это, конечно, фактор, но не главный (тут каждый второй в 10 лет за спектрум сел). Посему, сразу матчасть (не сложно, но крайне полезно):

http://zxdn.narod.ru/ - куча статей на самые разные темы по программированию.
http://zxpress.ru/ - спектрумовская пресса. Но ходить сюда лучше за конкретными статьями в конкретных журналах, а то есть опасность завязнуть:)

Вопросы задавать лучше с контекстом. А то будет превращение в еврейский форум- на один вопрос десять вопросов в ответ:)

GriV
01.05.2012, 14:34
Мне 13 лет и это мультиколорная картинка
Я не про Ваш возраст говорил, а про опыт в работе со спектрумом. Картинку грузите куда угодно :-)

AER
01.05.2012, 14:57
Например:load "adg" code 23650,3400
чтот адрес интересный. AER бы сделал так -
org 30000
jp start
pict
.incbin adg
enpict

start
ld hl,pict
ld de,23650
ld bc,pict-enpict
ldir
call 23650
ret

MikeV
01.05.2012, 17:24
Я думаю, имеет смысл почитать литературу для начинающих, где все более-менее систематизировано. Например, Как написать игру на ассемблере http://vtrdos.ru/book/WGASM.ZIP

GriV
01.05.2012, 17:55
Я думаю, имеет смысл почитать литературу для начинающих, где все более-менее систематизировано. Например, Как написать игру на ассемблере http://vtrdos.ru/book/WGASM.ZIP
Я рекомендовал автору темы эту литературу в соседней ветке (http://zx.pk.ru/showthread.php?t=19011).

Ares
02.05.2012, 16:10
а как в ALASM`е вставить обычную картинку ?

Vitamin
02.05.2012, 16:22
а как в ALASM`е вставить обычную картинку ?
Также как и мультиколорную. Только чтоб она показалась на экране, нужен код, перебрасывающий эту картинку туда:



org 24576
ld hl,picture
ld de,16384
ld bc,6912
ldir
ret
picture:
incbin "picture"

Ares
02.05.2012, 17:04
Vitamin,Что у меня за ошибка.Пишу:
org 24576
ld hl,picture
ld de,16384
ld bc,6912
ldir
ret
picture:
incbin "BIO-UFO"
ORG 60000
ENT $
LD A,6 ;подготовка экрана
LD (23693),A
XOR A
CALL 8859
CALL 3435
LD A,2
CALL 5633
LD HL,TEXT ;адрес текстовой строки
MAIN1 LD DE,PR_AT ;позиционирование курсора, черный
LD BC,5 ; (совпадающий с фоном) цвет символов
CALL 8252
LD A,(HL) ;чтение очередного символа строки
AND A
JR Z,MAIN3 ;если 0, закончить вывод
RST 16
INC HL
PUSH HL
; Восьмикратное (по ширине символов в пикселях) скроллирование строки влево
LD B,8
MAIN2 PUSH BC
LD A,21
CALL SCRLIN
CALL PAUSE ;задержка для получения более
; плавного смещения строки
POP BC
DJNZ MAIN2
POP HL
JR MAIN1
; Скроллинг, пока вся строка не исчезнет за левым краем экрана (0 = 265 раз)
MAIN3 LD B,0
MAIN4 PUSH BC
LD A,21
CALL SCRLIN
CALL PAUSE
POP BC
DJNZ MAIN4
RET
PAUSE LD BC,1
JP 7997
SCRLIN CALL 3742 ;получаем ее адрес в HL
; Так как строка должна бежать слева направо, то раньше нужно сдвигать
; последние байты, поэтому определяем адрес конца строки
LD A,L
OR 31
LD L,A
LD C,8 ;высота строки 8 пикселей
SCRL1 LD B,32 ;длина строки 32 байта
AND A ;очистка флага CY
PUSH HL ;сохраняем адрес
SCRL2 RL (HL) ;последовательно сдвигаем все байты
DEC HL
DJNZ SCRL2
POP HL ;восстанавливаем адрес
INC H ;переходим к следующему ряду пикселей
DEC C ;повторяем
JR NZ,SCRL1
RET
R_AT DEFB 22,21,31,16,0
TEXT DEFM "Examine yourself how you know the assembler!"
DEFB 0
Запускаю идет только бегущая строка.Как сделать так чтобы картинка была и бегущая строка бежала ?

Vitamin
02.05.2012, 17:07
Запускаю идет только бегущая строка.Как сделать так чтобы картинка была и бегущая строка бежала ?
Ты коряво слил две программы в кучу
1) ALASM адресом запуска считает последний ORG
2) ent $ не нужно
3) коды к кодам, данные к данным (картинка и текст- это данные)

Ares
02.05.2012, 17:12
Vitamin,Вот так ? :
org 24576
ld hl,picture
ld de,16384
ld bc,6912
ldir
ret
picture:
incbin "BIO-UFO"
ORG 60000
LD A,6 ;подготовка экрана
LD (23693),A
XOR A
CALL 8859
CALL 3435
LD A,2
CALL 5633
LD HL,TEXT ;адрес текстовой строки
MAIN1 LD DE,PR_AT ;позиционирование курсора, черный
LD BC,5 ; (совпадающий с фоном) цвет символов
CALL 8252
LD A,(HL) ;чтение очередного символа строки
AND A
JR Z,MAIN3 ;если 0, закончить вывод
RST 16
INC HL
PUSH HL
; Восьмикратное (по ширине символов в пикселях) скроллирование строки влево
LD B,8
MAIN2 PUSH BC
LD A,21
CALL SCRLIN
CALL PAUSE ;задержка для получения более
; плавного смещения строки
POP BC
DJNZ MAIN2
POP HL
JR MAIN1
; Скроллинг, пока вся строка не исчезнет за левым краем экрана (0 = 265 раз)
MAIN3 LD B,0
MAIN4 PUSH BC
LD A,21
CALL SCRLIN
CALL PAUSE
POP BC
DJNZ MAIN4
RET
PAUSE LD BC,1
JP 7997
SCRLIN CALL 3742 ;получаем ее адрес в HL
; Так как строка должна бежать слева направо, то раньше нужно сдвигать
; последние байты, поэтому определяем адрес конца строки
LD A,L
OR 31
LD L,A
LD C,8 ;высота строки 8 пикселей
SCRL1 LD B,32 ;длина строки 32 байта
AND A ;очистка флага CY
PUSH HL ;сохраняем адрес
SCRL2 RL (HL) ;последовательно сдвигаем все байты
DEC HL
DJNZ SCRL2
POP HL ;восстанавливаем адрес
INC H ;переходим к следующему ряду пикселей
DEC C ;повторяем
JR NZ,SCRL1
RET
R_AT DEFB 22,21,31,16,0
TEXT DEFM "Examine yourself how you know the assembler!"
DEFB 0

Vitamin
02.05.2012, 17:21
Vitamin,Вот так ? :
А что поменялось? Я не увидел ни одной исправленной ошибки.

Ares
02.05.2012, 17:27
я что то не врублюсь :v2_conf2:

Vitamin
02.05.2012, 17:29
я что то не врублюсь
Ты понял пункт


3) коды к кодам, данные к данным (картинка и текст- это данные)

?

Ares
02.05.2012, 17:31
Vitamin, не совсем

Vitamin
02.05.2012, 17:38
Vitamin, не совсем
В начале программы пишешь код. Весь- инициализацию и основной цикл.
Потом объявляешь все данные- текст, картинку.

Ares
02.05.2012, 17:42
Vitamin,так ? :
ORG 60000
LD A,6 ;подготовка экрана
LD (23693),A
XOR A
CALL 8859
CALL 3435
LD A,2
CALL 5633
LD HL,TEXT ;адрес текстовой строки
MAIN1 LD DE,PR_AT ;позиционирование курсора, черный
LD BC,5 ; (совпадающий с фоном) цвет символов
CALL 8252
LD A,(HL) ;чтение очередного символа строки
AND A
JR Z,MAIN3 ;если 0, закончить вывод
RST 16
INC HL
PUSH HL
; Восьмикратное (по ширине символов в пикселях) скроллирование строки влево
LD B,8
MAIN2 PUSH BC
LD A,21
CALL SCRLIN
CALL PAUSE ;задержка для получения более
; плавного смещения строки
POP BC
DJNZ MAIN2
POP HL
JR MAIN1
; Скроллинг, пока вся строка не исчезнет за левым краем экрана (0 = 265 раз)
MAIN3 LD B,0
MAIN4 PUSH BC
LD A,21
CALL SCRLIN
CALL PAUSE
POP BC
DJNZ MAIN4
RET
PAUSE LD BC,1
JP 7997
SCRLIN CALL 3742 ;получаем ее адрес в HL
; Так как строка должна бежать слева направо, то раньше нужно сдвигать
; последние байты, поэтому определяем адрес конца строки
LD A,L
OR 31
LD L,A
LD C,8 ;высота строки 8 пикселей
SCRL1 LD B,32 ;длина строки 32 байта
AND A ;очистка флага CY
PUSH HL ;сохраняем адрес
SCRL2 RL (HL) ;последовательно сдвигаем все байты
DEC HL
DJNZ SCRL2
POP HL ;восстанавливаем адрес
INC H ;переходим к следующему ряду пикселей
DEC C ;повторяем
JR NZ,SCRL1
RET
R_AT DEFB 22,21,31,16,0
TEXT DEFM "Examine yourself how you know the assembler!"
DEFB 0
org 24576
ld hl,picture
ld de,16384
ld bc,6912
ldir
ret
picture:
incbin "BIO-UFO"

Vitamin
02.05.2012, 17:44
Vitamin,так ? :
Контрольный вопрос: что делает директива ORG?

Ares
02.05.2012, 17:46
Vitamin, Она устанавливает начало адресов файла

newart
02.05.2012, 17:54
Ares,


R_AT DEFB 22,21,31,16,0
TEXT DEFM "Examine yourself how you know the assembler!"
DEFB 0
org 24576
ld hl,picture
ld de,16384
ld bc,6912
ldir
ret
picture:
incbin "BIO-UFO"

Замени на




ld hl,picture
ld de,16384
ld bc,6912
ldir
ret

R_AT DEFB 22,21,31,16,0
TEXT DEFM "Examine yourself how you know the assembler!"
DEFB 0

picture:
incbin "BIO-UFO"

А ORG 60000 в начале замени 24576

Ares
02.05.2012, 18:04
newart,Спасибо !!!

---------- Post added at 18:02 ---------- Previous post was at 17:56 ----------


Ares,



Замени на



А ORG 60000 в начале замени 24576
Что то не получилось .Надо что бы картинка была и бежала строка

---------- Post added at 18:04 ---------- Previous post was at 18:02 ----------

newart,Так ?:
ORG 24576
LD A,6 ;подготовка экрана
LD (23693),A
XOR A
CALL 8859
CALL 3435
LD A,2
CALL 5633
LD HL,TEXT ;адрес текстовой строки
MAIN1 LD DE,PR_AT ;позиционирование курсора, черный
LD BC,5 ; (совпадающий с фоном) цвет символов
CALL 8252
LD A,(HL) ;чтение очередного символа строки
AND A
JR Z,MAIN3 ;если 0, закончить вывод
RST 16
INC HL
PUSH HL
; Восьмикратное (по ширине символов в пикселях) скроллирование строки влево
LD B,8
MAIN2 PUSH BC
LD A,21
CALL SCRLIN
CALL PAUSE ;задержка для получения более
; плавного смещения строки
POP BC
DJNZ MAIN2
POP HL
JR MAIN1
; Скроллинг, пока вся строка не исчезнет за левым краем экрана (0 = 265 раз)
MAIN3 LD B,0
MAIN4 PUSH BC
LD A,21
CALL SCRLIN
CALL PAUSE
POP BC
DJNZ MAIN4
RET
PAUSE LD BC,1
JP 7997
SCRLIN CALL 3742 ;получаем ее адрес в HL
; Так как строка должна бежать слева направо, то раньше нужно сдвигать
; последние байты, поэтому определяем адрес конца строки
LD A,L
OR 31
LD L,A
LD C,8 ;высота строки 8 пикселей
SCRL1 LD B,32 ;длина строки 32 байта
AND A ;очистка флага CY
PUSH HL ;сохраняем адрес
SCRL2 RL (HL) ;последовательно сдвигаем все байты
DEC HL
DJNZ SCRL2
POP HL ;восстанавливаем адрес
INC H ;переходим к следующему ряду пикселей
DEC C ;повторяем
JR NZ,SCRL1
RET
d hl,picture
ld de,16384
ld bc,6912
ldir
ret
R_AT DEFB 22,21,31,16,0
TEXT DEFM "Examine yourself how you know the assembler!"
DEFB 0
picture:
incbin "BIO-UFO"

Vitamin
02.05.2012, 18:04
Ares, представь себя процессором и сам попытайся выполнить свою программу:)

AER
02.05.2012, 19:47
алгоритм типа-

org xxxxxx

выводим картинку ldir-oм в адресс экрана

программа бегущей строки

конец проги ret

картинка
.incbin pic
текст
defb ......

GM BIT
03.05.2012, 04:44
R_AT DEFB 22,21,31,16,0
Наверное должно быть PR_AT DEFB 22,21,31,16,0

d hl,picture
Наверное должно быть OUT_P LD HL,picture
а вначале CALL OUT_P

---------- Post added at 03:44 ---------- Previous post was at 03:43 ----------


ld hl,picture
ld de,16384
ld bc,6912
ldir
ret
Либо без CALL, если вставить вывод рисунки в начало программы убрав RET. Вообщем AER все правильно объяснил

zebest
03.05.2012, 13:58
ну понятно, зачем просто, если можно сложно. Для одноразовой загрузки картинки...


org 16384
incbin "zastavka.scr"

желательно в конце, чтобы еще раз не переопределять org

Vitamin
03.05.2012, 14:57
ну понятно, зачем просто, если можно сложно. Для одноразовой загрузки картинки...
А ты пробовал это сделать в ALASM?

Shadow Maker
03.05.2012, 15:13
Ares, ты на будущее как-нибудь более говоряще темы называй. А то чего помогите, зачем - непонятно.

Ares
03.05.2012, 17:33
Vitamin, Всё получилось я org не в том месте писал

newart
03.05.2012, 18:36
Ares, демку на DiHalt делаешь? :)

Ares
03.05.2012, 18:44
newart, Да я тока новичок,но постараюсь сделать )

Ares
03.05.2012, 19:43
Ну вот как-то так ):v2_rolley

newart
03.05.2012, 20:08
Ну вот как-то так )
Забыл загрузчик сделать?

zebest
03.05.2012, 21:03
А ты пробовал это сделать в ALASM?
теперь пробовал. Ну компилит. ну кривовато)
кто ж знал, что новичЬки на таких продвинутых асмах кодить учаЦЦо. я-то по-старинке, в SJAsm-e, а там все ровно.

Ares
03.05.2012, 21:20
Забыл загрузчик сделать?
Да нет надо в аласме запускать

VNN_KCS
03.05.2012, 22:05
А ты пробовал это сделать в ALASM?
:v2_thumb:
Так отож!!! Забыли люди спековкий ассемблер.

John North
03.05.2012, 22:05
Ares, если уж выкладываешь поделку на просмотр, то выкладывай так, чтоб можно было её легко посмотреть, а не «через аласм/сторм/етц» грузить..

Vitamin
03.05.2012, 22:30
теперь пробовал. Ну компилит. ну кривовато)
Ну понятно, зачем читать, если можно написать:)

Если бы ты делал что-то выходящее за рамки снапшота, то свой подход не предлагал.

Mdesk
03.05.2012, 23:10
http://mdesk.ru/images/Ares_first.gif
(C) Ares, 2012

VNN_KCS
03.05.2012, 23:15
Ares, если уж выкладываешь поделку на просмотр, то выкладывай так, чтоб можно было её легко посмотреть, а не «через аласм/сторм/етц» грузить..
Парню всего 13 лет. Можно и поблажку сделать. И подсказать, если что. Сейчас пообщались с ним в Скайпе. Очень перспективный малый! Толк будет, точно.

AER
04.05.2012, 03:54
VNN_KCS, - 'Забыли люди спековкий
ассемблер.'

AER пишет в TASM!

VNN_KCS
04.05.2012, 14:35
AER пишет в TASM!
Жень, я имел ввиду ассемблер и написание программ в нём на Спеке.
А TASM и ALASM очень близки. Перевод текста вполне возможен.

Ares
04.05.2012, 17:12
:v2_conf2:а как мне в свою программу музыку вставить:v2_conf2:

Alex Rider
04.05.2012, 17:47
Буквально несколько дней назад задал такой же вопрос, и дядя Griv послал (http://zx.pk.ru/showpost.php?p=501149&postcount=16) меня куда следует.

Ares
04.05.2012, 19:09
Подскажите пожалуйста Пишу:
org #6000
call #c000
ei
loop halt
call #c005
jp loop
org #c000
incbin "Ares"
Пытаюсь воспроизвести музыку.Скажите что я делаю не так ?

Vitamin
04.05.2012, 19:38
Пытаюсь воспроизвести музыку.Скажите что я делаю не так ?
Я же тебе говорил- адресом запуска ALASM считает последний ORG

Ares
04.05.2012, 19:40
org 46000
call 51310 ;ин.музыки
jp start
start ld hl,inter
ld (#66ff),hl
ld a,#66
ld i,a
im 2
ei
ret
inter push hl
push de
push bc
push af
push ix
call 30005 ;воспроизведение музыки,можно
всунуть +еще индикатор или цикл.бег.строку
pop ix
pop af
pop bc
pop de
pop hl
jp #38
imoff di
ld a,63
ld i,a
im 1
ei
ret
Эта тоже не работает у меня

newart
04.05.2012, 20:16
Ares, удаляй Alasm, переходи на Storm.


адресом запуска ALASM считает последний ORG

Он себе таких вольностей не позволяет.

GriV
04.05.2012, 20:31
Эта тоже не работает у меня
А есть уверенность что модуль скомпилирован вместе с плеером? Дело в том, что муз. модули можно собирать и без плеера, в этом случае вызов может ни к чему не привести.
И ещё, может быть он был собран под другие адреса?

Ares
04.05.2012, 21:12
GriV, я отсюда взял http://zx.pk.ru/showthread.php?t=3472&page=3

---------- Post added at 21:12 ---------- Previous post was at 21:05 ----------



И ещё, может быть он был собран под другие адреса?
я отсюда взял http://zx.pk.ru/showthread.php?t=3472&page=3

Vitamin
04.05.2012, 21:59
Он себе таких вольностей не позволяет.
Не бОльшая вольность, чем первый org.


Ares, удаляй Alasm, переходи на Storm.
Поиграться разве что...

newart
04.05.2012, 22:53
Не бОльшая вольность, чем первый org.
Для новичка может разницы и нет.
Но статистически, что более традиционно?

GriV
04.05.2012, 22:58
Ares, Честно говоря по ссылкам ничего не понял. Выложи файлик твой сюда, посмотрим его.

Ares
04.05.2012, 23:01
GriV,Смотри я пишу:
org 46000
call 51310 ;ин.музыки
jp start
start ld hl,inter
ld (#66ff),hl
ld a,#66
ld i,a
im 2
ei
ret
inter push hl
push de
push bc
push af
push ix
call 30005 ;воспроизведение музыки,можно
всунуть +еще индикатор или цикл.бег.строку
pop ix
pop af
pop bc
pop de
pop hl
jp #38
imoff di
ld a,63
ld i,a
im 1
ei
ret
incbin "Ares.pt3"
и пентева зависает ни музыки не чего

BYTEMAN
04.05.2012, 23:34
call 30005 ;воспроизведение музыки,можно
откуда этот адрес взялся???

Ares
04.05.2012, 23:37
BYTEMAN, http://zx.pk.ru/showthread.php?t=3472&page=3 пишет Enigmatic

BYTEMAN
04.05.2012, 23:39
Ares,
по адресу 30000 или люб.другой должна лежать музыка
она там лежит? Точнее, положил ли ты её туда?

ViThor
04.05.2012, 23:59
GriV,Смотри я пишу:
org 46000
...
ret
incbin "Ares.pt3"
и пентева зависает ни музыки не чего

Ares, по твоим же ссылкам выше, не так давно приводился отличный пример, как правильно повесить музыку с плеером на прерывания:
http://zx.pk.ru/showpost.php?p=480205&postcount=38

GibbS
05.05.2012, 05:59
Offtopic - а вышел ли Storm с поддержкой более 128к ? В свое время клевый асм был...

GM BIT
05.05.2012, 06:18
А обязательно писать 500 команд чтобы пустить бегучку с музыкой?
Не пудрите человеку голову, пусть начинает с простого!!!!!

Ares попробуй не заморачиваться с im 2, а сделать по следующему алгоритму

org
ei
call mus_init

loop halt
call play_mus
call scroll

jr loop


Хотя с твоей бегучкой хрен его знает за сколько rst 16 выводит букву, если больше одного прерывания то музыка будет хромать

daniel
05.05.2012, 06:21
+1, а ещё лучше в basic проверить музыку на исправность.

GM BIT
05.05.2012, 06:27
Вот простейшая бегучка (без использования ПЗУ) + играние музыки



org 25000
start
ei
xor a
out (254),a

call 49163

loop halt
call 49166
call scroll
ld a,127
in a,(254)
rra
jr c,loop
call 49169
ret

scroll ld a,1
dec a
and 7
ld (scroll+1),a
jr nz,s_left
new_let ld hl,text
ld a,(hl)
inc hl
ld (new_let+1),hl
or a
jr nz,not_end
ld hl,text
jr new_let+3

not_end ld l,a
ld h,0
add hl,hl
add hl,hl
add hl,hl
ld de,#3c00
add hl,de
ld de,buff
ld b,8
loop2 ld a,(hl)
rrca
or (hl)
ld (de),a
inc l
inc de
djnz loop2

s_left ld hl,16384+31
ld de,buff
ld b,8
loop1 ld a,(de)
rlca
ld (de),a
inc de
push hl
dup 31
rl (hl)
dec l
edup
pop hl
inc h
djnz loop1
ret

buff ds 8
text db "AAA BEST CODER !!!!!!!!!!! "
db 0


Вообще если хочешь делать графику изучи строения экрана
Да и Vitamin все правильно сказал - представляешь себя процессором и шагаешь по своей программе

Почитай
http://zx.pk.ru/showthread.php?t=10442&highlight=scroll.txt
http://zx.pk.ru/showthread.php?t=8586&highlight=aaa+coder

Много лишнего, но для начала может пригодится

Ares
05.05.2012, 12:25
Я написал:


org #6000
xor a
out (254),a
call screen
call music
loop ei
halt
call #c005
di
ld a,254
in a,(254)
and 1
jr nz, loop
jp #c0005

screen: incb "screen"

org #c000
music: incb "music"
Не получилось
Потом написал :
imtab equ #be00 //таблица вектора прерываний (257 байт)
int_jump equ #bdbd //обработчик

start
di:ld sp,#6000
xor a:out (#fe),a
// прерывания
ld hl,imtab:ld a,h,i,a
ld a,low int_jump
ld (hl),a:inc l:jr nz,$-2
inc h:ld (hl),a
ld hl,obrab,e,a,d,a,bc,obrab_len:ldir
im 2
call music // init music
ei

loop
halt
jr loop


obrab //обработчик прерываний (работает с адреса #bdbd)
push af,hl,bc,de,ix,iy
exx
push hl,de,bc
ex af,af'
push af
call music+5
pop af
ex af,af'
pop bc,de,hl
exx
pop iy,ix,de,bc,hl,af
ei
ret
obrab_len equ $-obrab

music incbin "music.cod" //пт3-модуль с плеером

Тоже не помогло
Ну и написал :


org 25000
start
ei
xor a
out (254),a

call 49163

loop halt
call 49166
call scroll
ld a,127
in a,(254)
rra
jr c,loop
call 49169
ret

scroll ld a,1
dec a
and 7
ld (scroll+1),a
jr nz,s_left
new_let ld hl,text
ld a,(hl)
inc hl
ld (new_let+1),hl
or a
jr nz,not_end
ld hl,text
jr new_let+3

not_end ld l,a
ld h,0
add hl,hl
add hl,hl
add hl,hl
ld de,#3c00
add hl,de
ld de,buff
ld b,8
loop2 ld a,(hl)
rrca
or (hl)
ld (de),a
inc l
inc de
djnz loop2

s_left ld hl,16384+31
ld de,buff
ld b,8
loop1 ld a,(de)
rlca
ld (de),a
inc de
push hl
dup 31
rl (hl)
dec l
edup
pop hl
inc h
djnz loop1
ret

buff ds 8
text db "AAA BEST CODER !!!!!!!!!!! "
db 0
И тоже не получилось
Подскажите что я делаю не так

Shadow Maker
05.05.2012, 12:34
Когда пишешь код - пиши в [ code ] [/ code ] (без пробелов), а то тебя читать невозможно.

Vitamin
05.05.2012, 12:40
Ares, ты в который раз игнорируешь замечание по поводу org (это я про первый кусок кода). Плюс туда же- нафига ты бездумно сваливаешь в кучу куски разного кода?

По поводу второго куска- где музыка загружается?

Ares
05.05.2012, 12:44
Vitamin, Вы меня простите я вас не игнорирую просто я не совсем пока понимаю в этих кодах .
Второй кусок мне скинул GM BIT и я не знаю где загружается музыка:(

Vitamin
05.05.2012, 12:46
Vitamin, Вы меня простите я вас не игнорирую просто я не совсем пока понимаю в этих кодах .
Второй кусок мне скинул GM BIT и я не знаю где загружается музыка
Давай на "ты" - в спектрумовском сообществе это хороший тон.

У тебя же есть пример как грузить кодовые блоки.

Shadow Maker
05.05.2012, 12:54
Короче так. Первый вариант:

jp #c0005 - непонятно зачем он туда должен переходить.

screen: incb "screen" - это что вообще? Скроллер скомпилированный? Если экран, то зачем ты делаешь call screen - это всё завесит нафиг.
music: incb "music" - кстати зачем двоеточия после меток? и музыка у тебя точно под #c000 откомпилирована?

Во втором варианте Vitamin правильно говорит - где org? Надо перед музыкой org поставить, под который она откомпилирована и у собственно кода тоже.

---------- Post added at 12:54 ---------- Previous post was at 12:51 ----------

В последнем варианте чего за вызовы call 49163 call 49166 call 49169? Музыка? А она там есть вообще?

Короче не бездумно копируй, а понимай, что оно делает. Если что-то собираешься вызывать - то проверь, что это "что-то" (музыка) там есть и с плеером и откомпилирована под этот адрес.

Ares
05.05.2012, 13:00
incb "music" - зачем двоеточия после меток?
Я не ставлю двоеточия

---------- Post added at 13:00 ---------- Previous post was at 12:59 ----------


У тебя же есть пример как грузить кодовые блоки.
Нет

Vitamin
05.05.2012, 13:02
Нет
Ну ты хоть начало этой темы глянь...

Ares
05.05.2012, 13:02
и музыка у тебя точно под #c000 откомпилирована?
нет под #c86e

Shadow Maker
05.05.2012, 13:11
ну и чего ты ожидаешь тогда увидеть? меняй все #c000 на #c86e, #c005 на #c86e+5 (или 6, не знаю чего у тебя там за плеер).

alone
05.05.2012, 15:03
Цитата:





Сообщение от newart


Ares, удаляй Alasm, переходи на Storm.




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

ViThor
05.05.2012, 16:20
Ares, погоди, а ты вообще используешь дизассемблер (к примеру STS) после того как откомпилишь свой код в ALASMе или в любом другом асме?
Профессионалы возможно и не пользуются дизассемблером, а новичкам (таким как мы с тобой ;) ) - без него никак не обойтись!

Ares
09.05.2012, 13:12
Ares, погоди, а ты вообще используешь дизассемблер (к примеру STS) после того как откомпилишь свой код в ALASMе или в любом другом асме?
Профессионалы возможно и не пользуются дизассемблером, а новичкам (таким как мы с тобой ;) ) - без него никак не обойтись!
нет

Mdesk
09.05.2012, 14:29
Тоже не помогло
Ну и написал :


Код:
org 25000
start
ei
xor a
out (254),a

call 49163

loop halt
call 49166
call scroll
ld a,127
in a,(254)
rra
jr c,loop
call 49169
ret

scroll ld a,1
dec a
and 7
ld (scroll+1),a
jr nz,s_left
new_let ld hl,text
ld a,(hl)
inc hl
ld (new_let+1),hl
or a
jr nz,not_end
ld hl,text
jr new_let+3

not_end ld l,a
ld h,0
add hl,hl
add hl,hl
add hl,hl
ld de,#3c00
add hl,de
ld de,buff
ld b,8
loop2 ld a,(hl)
rrca
or (hl)
ld (de),a
inc l
inc de
djnz loop2

s_left ld hl,16384+31
ld de,buff
ld b,8
loop1 ld a,(de)
rlca
ld (de),a
inc de
push hl
dup 31
rl (hl)
dec l
edup
pop hl
inc h
djnz loop1
ret

buff ds 8
text db "AAA BEST CODER !!!!!!!!!!! "
db 0

И тоже не получилось
Подскажите что я делаю не так

Ares, в этом коде всё нормально. Просто вызовы call 49163, call 49166 и call 49169 - это вызовы блока кодов плейера с музыкой (инициализация, проигрывание ноты в цикле, стоп). Тебе нужно подготовить блок кодов плейера с музыкой.
Если у тебя есть музыка - файл PT3, то такой блок можно сделать, например, с помощью муз. редактора Vortex Tracker II (http://zxtunes.com/software.php?id=12).

---------- Post added at 14:26 ---------- Previous post was at 14:02 ----------

Запускаем на писишке Vortex Tracker. Открываем в нем свою музыку: File | Open | находим свой PT3-файл | Открыть. Файл откроется в редакторе.
Можно его послушать (F6 - старт, Esc - стоп).
Делаем блок кодов плейера и музыки: File | Exports | Save with ZX Spectrum player. Откроется окно, в котором по умолчанию задан адрес компиляции #C000 (49152). Согласимся. Параметр Format выберем Hobeta with player. Нажмем OK. Укажем папку, куда сохранить файл. Нажмем кнопку "Сохранить". Выйдем из редактора. Получили файл <имя>.$c.
Этот файл почти то, что нужно, но не совсем. Это не просто блок кодов, а файл в формате Hobeta (http://speccy.info/Hobeta). Его нужно скопировать в образ Спектрумовской дискеты - в файл *.TRD (или *.SCL), где он станет обычным TR-DOS-файлом. (Я делаю это в Total Commander'e с плагином inTRD.wcx).
Тогда из твоей программы этот блок кодов с плейером и музыкой должен вызываться с такими тремя call: call 49152 - инициализация музыки, call 49152+5 - проигрывание музыки в цикле, call 49152 - повторный вызов означает "стоп".

---------- Post added at 14:29 ---------- Previous post was at 14:26 ----------

Для запуска всего этого хозяйства хорошо бы написать БЕЙСИК-загрузчик:


10 CLEAR 24999
20 RANDOMIZE USR 15619: REM :LOAD "prog" CODE 25000
30 RANDOMIZE USR 15619: REM :LOAD "music" CODE 49152
40 RANDOMIZE USR 25000

где вместо "prog" поставь имя своей программки, а вместо "music" - имя блока кодов плейера и музыки.

Ares
09.05.2012, 15:33
Mdesk,А как скопировать в образ спектумовской дискеты ? Объясните как это сделать ? :(

---------- Post added at 15:33 ---------- Previous post was at 15:01 ----------

Mdesk, У меня Плеер-49152 ,Музыка-51310

baxter
09.05.2012, 15:40
А как скопировать в образ спектумовской дискеты ?
Запусти ESN.EXE из этого (http://vtrdos.ru/pcutilz/SN_114.ZIP) архива

---------- Post added at 15:40 ---------- Previous post was at 15:37 ----------

Или FAR с плагинами (http://plugring.farmanager.com/plugin.php?pid=670&l=ru).

Mdesk
09.05.2012, 15:49
А как скопировать в образ спектумовской дискеты ?
Смотри "Работа с ZX файлами на PC" на Virtual TR-DOS (http://vtrdos.ru/pcutilz.php):
AMD v0.01 by Paul Pavlov; TRD Editor v1.11 by A. Evdokimov; TRX2X Converter v1.2b2 by Alex Makeev. Попробуй что-нибудь из этого. Может кто-то ещё что подскажет?
У меня Windows 7 64-разрядная и, к сожалению, ничего из перечисленного в ней не работает. Поэтому я пользуюсь Total Commander с плагинами SCL и TRD plug-ins v5 для Total Commander by Push_pc/Spectrodyne.

Если не будет получаться, то сообщи. В конце концов в Vortex Tracker'е, можно будет сделать сразу SCL-файл образа дискеты. Правда на нем плейер и музыка будут двумя отдельными блоками. Но это не страшно, просто нужно будет подгружать два блока и немного видоизменить вызов плейера в программе.

-----------
А вот, baxter уже подсказал: Spectrum Navigator v1.14 by RomanRoms. (Но в Win7 64-бит и он не работает).


У меня Плеер-49152 ,Музыка-51310
Хорошо. Это в одном файле всё содержится?

Ares
09.05.2012, 16:20
Зашол в программу BestView v2.19 открыл музыку.Где он показывает Init,play ?

---------- Post added at 16:20 ---------- Previous post was at 16:15 ----------


Смотри "Работа с ZX файлами на PC" на Virtual TR-DOS (http://vtrdos.ru/pcutilz.php):
AMD v0.01 by Paul Pavlov; TRD Editor v1.11 by A. Evdokimov; TRX2X Converter v1.2b2 by Alex Makeev. Попробуй что-нибудь из этого. Может кто-то ещё что подскажет?
У меня Windows 7 64-разрядная и, к сожалению, ничего из перечисленного в ней не работает. Поэтому я пользуюсь Total Commander с плагинами SCL и TRD plug-ins v5 для Total Commander by Push_pc/Spectrodyne.

Если не будет получаться, то сообщи. В конце концов в Vortex Tracker'е, можно будет сделать сразу SCL-файл образа дискеты. Правда на нем плейер и музыка будут двумя отдельными блоками. Но это не страшно, просто нужно будет подгружать два блока и немного видоизменить вызов плейера в программе.

-----------
А вот, baxter уже подсказал: Spectrum Navigator v1.14 by RomanRoms. (Но в Win7 64-бит и он не работает).


Хорошо. Это в одном файле всё содержится?

Да

Mdesk
09.05.2012, 16:38
Т.е. у тебя уже есть некий файл? И ты не делал его в Vortex Tracker'е, а просто файл уже у тебя был?
Если так, то надо понять, является ли этот файл компилированной музыкой с плейером. Что еще о твоем файле сообщает Best View?

Ares
09.05.2012, 16:47
плеер и саму музыку

---------- Post added at 16:47 ---------- Previous post was at 16:39 ----------

Mdesk, Я сделал SCL формат в VORTEX`е ,у меня 2 файла :vtplayer и music.

Mdesk
09.05.2012, 16:51
Я сделал SCL формат в VORTEX`е ,у меня 2 файла :vtplayer и music.
Отлично! Теперь открывай свою программку в ALASM. Будем исправлять команды call.

Ares
09.05.2012, 16:58
Mdesk,я написал
org #6000
xor a
out (254),a
call screen
call #c000
loop ei
halt
call #c005
di
ld a,254
in a,(254)
and 1
jr nz, loop
jp #c000

screen incbin "screen"

org #c000
music incbin "music"
не помогает

---------- Post added at 16:58 ---------- Previous post was at 16:53 ----------

Mdesk,А что надо тут исправлять ?

org 25000
start
ei
xor a
out (254),a

call 49163

loop halt
call 49166
call scroll
ld a,127
in a,(254)
rra
jr c,loop
call 49169
ret

scroll ld a,1
dec a
and 7
ld (scroll+1),a
jr nz,s_left
new_let ld hl,text
ld a,(hl)
inc hl
ld (new_let+1),hl
or a
jr nz,not_end
ld hl,text
jr new_let+3

not_end ld l,a
ld h,0
add hl,hl
add hl,hl
add hl,hl
ld de,#3c00
add hl,de
ld de,buff
ld b,8
loop2 ld a,(hl)
rrca
or (hl)
ld (de),a
inc l
inc de
djnz loop2

s_left ld hl,16384+31
ld de,buff
ld b,8
loop1 ld a,(de)
rlca
ld (de),a
inc de
push hl
dup 31
rl (hl)
dec l
edup
pop hl
inc h
djnz loop1
ret

buff ds 8
text db "AAA BEST CODER !!!!!!!!!!! "
db 0

Shadow Maker
09.05.2012, 17:17
Ты чего-то по моему не понимаешь. Вот тебе оба три твоих варианта в рабочем состоянии (играющие музыку). Форма sjasmplus, ассемблируешь любой из них, на выходе получаешь файл .sna работающий. Как музыку делать под адрес - выше расписали.

Mdesk
09.05.2012, 17:18
Пишем программку, которая начинается с org 25000 и далее.
Если считать, что плейер будет грузиться с адреса 49152, а музыка с адреса 51310, то:
вместо call 49163 напишем:
LD HL, 51310 ; адрес загрузки музыки
CALL 49152+3 ; инициализация, если адрес музыки указан в HL

вместо call 49166 напишем:
CALL 49152+5

вместо call 49169 напишем:
LD HL, 51310
CALL 49152+3 ; повторная инициализация = СТОП.

Shadow Maker
09.05.2012, 17:22
Короче файлы ares1.a80, ares2.a80, ares3.a80 ассемблируешь, на выходе demo.sna

ы. шустрый Mdesk вклинился :)

Mdesk
09.05.2012, 17:31
Shadow Maker, я предлагаю, чтобы Ares довел до победы какой-то один пример. (Этот пример (http://zx-pk.ru/showpost.php?p=502175&postcount=67) ему GM BIT посоветовал). Тогда потом он разберется с другими, и меня ещё научит :)

Shadow Maker
09.05.2012, 17:40
Ну на работающем примере наверное проще разобраться. Пусть доводит :)

Ares
09.05.2012, 21:39
Mdesk,Я зашол в Vortext II открыл этот файл потом EXPORT ZX бла бла бла и справа он мне показал INIT C000 PLAY C005 MUTE C008 может их надо куда-то вписать ?

---------- Post added at 21:39 ---------- Previous post was at 21:36 ----------


Пишем программку, которая начинается с org 25000 и далее.
Если считать, что плейер будет грузиться с адреса 49152, а музыка с адреса 51310, то:
вместо call 49163 напишем:
LD HL, 51310 ; адрес загрузки музыки
CALL 49152+3 ; инициализация, если адрес музыки указан в HL

вместо call 49166 напишем:
CALL 49152+5

вместо call 49169 напишем:
LD HL, 51310
CALL 49152+3 ; повторная инициализация = СТОП.
Он ошибку выдаёт :
DEC 1
DEC 1
DEC 1
DEC 1
DEC 1
DEC 1
DEC 1
DEC 1
DEC 1
DEC 1
В чём ошибка ?

jerri
09.05.2012, 22:07
Mdesk,Я зашол в Vortext II открыл этот файл потом EXPORT ZX бла бла бла и справа он мне показал
INIT C000
PLAY C005
MUTE C008
может их надо куда-то вписать ?


это адрес скомпилированной мелодии

ее надо грузить на адрес 49152(с000)

49152 инициирование
49157 проигрывание мелодии
49160 затыкание мелодии

кстати рекомендую подучить шестнадцатиричную систему счисления
помогает очень

Mdesk
09.05.2012, 22:20
справа он мне показал INIT C000 PLAY C005 MUTE C008 может их надо куда-то вписать ?
Как уже объяснил jerri, ты почти это самое и вписал, только в десятичном виде.

В чём ошибка ?
А на текст программы можно взглянуть?

Ares
09.05.2012, 22:28
Как уже объяснил jerri, ты почти это самое и вписал, только в десятичном виде.

А на текст программы можно взглянуть?
Да конечно :
org 25000
start
ei
xor a
out (254),a
LD HL, 51310
CALL 49152+3
loop halt
call 49152+5
call scroll
ld a,127
in a,(254)
rra
jr c,loop
LD HL, 51310
CALL 49152+3
ret

scroll ld a,1
dec a
and 7
ld (scroll+1),a
jr nz,s_left
new_let ld hl,text
ld a,(hl)
inc hl
ld (new_let+1),hl
or a
jr nz,not_end
ld hl,text
jr new_let+3

not_end ld l,a
ld h,0
add hl,hl
add hl,hl
add hl,hl
ld de,#3c00
add hl,de
ld de,buff
ld b,8
loop2 ld a,(hl)
rrca
or (hl)
ld (de),a
inc l
inc de
djnz loop2

s_left ld hl,16384+31
ld de,buff
ld b,8
loop1 ld a,(de)
rlca
ld (de),a
inc de
push hl
dup 31
rl (hl)
dec l
edup
pop hl
inc h
djnz loop1
ret

buff ds 8
text db "AAA BEST CODER !!!!!!!!!!! "
db 0

Mdesk
09.05.2012, 22:51
Текст нормальный. А ошибка выскакивает при ассемблировании? Не вбил ли ты "DEC 1" вместо "DEC l"?

Ares
09.05.2012, 22:56
Mdesk, Упс

---------- Post added at 22:53 ---------- Previous post was at 22:53 ----------

Ares, всеравно выскакивает при ассемблирование теперь ни DEC 1 а DEC I

---------- Post added at 22:56 ---------- Previous post was at 22:53 ----------

Mdesk, Поставил DEC L теперь без ошибок,но не работает

Shadow Maker
09.05.2012, 23:04
Ares, ты из моего архива возьми уже Ares3.a80 и скомпилируй тогда. Можешь свое музло подключить и #D000 на #C000, #D005 на #c005 поменять.

Mdesk
09.05.2012, 23:05
теперь без ошибок,но не работает
Хорошо. Но запускать эту программу еще рано. Ведь плейер и музыка не загружены в память компьютера. Сохраняй на диск ассемблированный код. Потом добавляй на этот же диск плейер "vtplayer" и музыку "music", или как там они у тебя называются. А потом выходи в БЕЙСИК и пиши БЕЙСИК-программу:


10 CLEAR 24999
20 RANDOMIZE USR 15619: REM :LOAD "prog" CODE 25000
30 RANDOMIZE USR 15619: REM :LOAD "vtplayer" CODE 49152
40 RANDOMIZE USR 15619: REM :LOAD "music" CODE 51310
50 RANDOMIZE USR 25000

где вместо "prog" вставь имя твоей программки, вместо "music" - имя твоей музыки. Сохраняй её и запускай: RUN, Enter.
Должно работать.

Ares
09.05.2012, 23:19
Mdesk,Спасибо всё заработало а как сделать чтобы текст по кругу гонял

Mdesk
09.05.2012, 23:33
всё заработало а как сделать чтобы текст по кругу гонял
Ура-а-а! :v2_thumb: У тебя мелодия играет один раз или как зацикленная? По кругу - это как?

Ares
09.05.2012, 23:42
а как поменять цвет шрифта ?

---------- Post added at 23:42 ---------- Previous post was at 23:41 ----------


Ура-а-а! :v2_thumb: У тебя мелодия играет один раз или как зацикленная? По кругу - это как?
не прикрощая

newart
10.05.2012, 00:02
не прикрощая
Не подсказывайте!

Пусть человек хоть чему то сам научиться.

GriV
10.05.2012, 00:10
Когда дойдёт до конца текста, надо сбрасывать указатель на текст и начинать его печатать заново.

---------- Post added at 00:10 ---------- Previous post was at 00:07 ----------


Не подсказывайте!

Пусть человек хоть чему то сам научиться.
Научится, дай время.

Mdesk
10.05.2012, 00:18
Ares, а разве у тебя текст не бежит бесконечно? Сам останавливается?
У меня (я проверяю в эмуляторе) текст бежит бесконечно, пока не нажму пробел.

Про цвет. Надо цветовые атрибуты менять для той строки, по которой бежит текст. У тебя текст бежит в первой строке экрана. Атрибуты для неё находятся в ячейках с адресами от 22528 до 22528+31 включительно. Если в эти ячейки занести разные числа, то цвет букв и фона изменится. Для примера дополни твою БЕЙСИК-программу строчкой, которая заносит число 33 в эти ячейки:


45 FOR a=22528 TO 22559: POKE a,33: NEXT a

и после запуска твой текст должен быть синим по зеленому. Можно придумать другие числа по такому правилу:
Число = 128*Мигание + 64*Яркость + 8*ЦветБумаги + ЦветЧернил, где:

Мигание = 0 (мигания нет), 1 (мигание есть);
Яркость = 0 (обычная яркость), 1 (повышенная яркость);
ЦветБумаги, ЦветЧернил = 0 (черный), 1 (синий), 2 (красный), 3 (пурпурный), 4 (зеленый), 5 (голубой), 6 (желтый), 7 (белый).

Чтобы нарисовать синими чернилами по зеленой бумаге мы должны рассчитать: Число = 128*0 + 64*0 + 8*4 + 1 = 33.

И да, пора заняться самообучением. По этой теме читаем книги ИНФОРКОМА: "Элементарная графика", "Прикладная графика", "Динамическая графика". В "Элементарной графике" атрибуты описываются в самом начале книги.

AER
10.05.2012, 12:29
Ares, у надо разбиратся с строением экрана zx и вопросы отпадут.

Ares
10.05.2012, 18:35
Вот что получилось с вашей помощью http://zx.pk.ru/showthread.php?p=504011#post504011
Всем огромное спасибо !!!

SfS
16.05.2012, 08:38
Вот что получилось с вашей помощью http://zx.pk.ru/showthread.php?p=504011#post504011
Всем огромное спасибо !!!

Молодчина!

Только один совет. Почитай книжки по ассемблеру. Ну типа "как написать игру на ZX" и подобные. Там всё на пальцах разжёвано. И 9 и 10 твоих вопросов сразу отпадут.

AER
09.06.2012, 23:06
1.хочу релоцируемую программу, - загрузчик кодовых блоков в память компьютера с диска по имени файла. чтоб незаморачиватся про сектора там и тп.
2.хочу релоцируемую программу, - сканирования курсор клавиш, ENTER. чтоб работало при IM2.
3. все хочу уже готовое к работе.

Alex Rider
10.06.2012, 02:46
хочу релоцируемую программу, - загрузчик кодовых блоков в память компьютера с диска по имени файла. чтоб незаморачиватся про сектора там и тп.

В de кладешь адрес строки с именем файла с ноликом после последнего символа, если по возвращению стоит c, то ахтунг.



load ; in
; DE - address of file name (zero byte after last character)
; out
; c - error
ld b,8
ld hl,23773
push hl
ld a," "
clearname
ld (hl),a
inc hl
djnz clearname
ld (hl),"C"
pop hl
copyname
ld a,(de)
and a
jr z,search
ld (hl),a
inc hl
inc de
jr copyname
search
ld c,10
call 15635
inc c
scf
ret z
loadfile
xor a
ld (23801),a
ld (23823),a
ld (23824),a
ld c,14
call 15635
ld a,(23823)
add 255
ret


---------- Post added at 02:46 ---------- Previous post was at 02:17 ----------


хочу релоцируемую программу, - сканирования курсор клавиш, ENTER. чтоб работало при IM2.

В IM2 зовешь keyscan. В переменной keystate получаешь:

0 - не нажато
1 - лево
2 - право
3 - верх
4 - низ
5 - enter



keyscan
ld b,0
ld a,#fe
in a,(#fe)
rra
jr nc,direction
ld a,#bf
in a,(#fe)
rra
jr c,setkey
ld b,5
jr setkey
direction
inc b
ld a,#f7
in a,(#fe)
and #10
jr z,setkey
ld a,#ef
in a,(#fe)
rra
rra
inc b
rra
jr nc,setkey
inc b
rra
jr nc,setkey
inc b
rra
jr nc,setkey
ld b,0
setkey
ld a,b
ld (keystate),a
ret

keystate
db 0

AER
10.06.2012, 12:58
если по возвращению стоит c, то ахтунг.
где стоит? и что ахтунг?

John North
10.06.2012, 14:54
Видимо, если флаг С установлен, то ошибка, нет файла, напр.

AER
10.06.2012, 18:01
загрузчик кодовых блоков в память компьютера с диска по имени файлав конце кода:


call 15635
ld a,(23823)
add 255
ret
не идет в TASM. нет такой команды. сделал так ADD a,255 верно я ?

NEO SPECTRUMAN
10.06.2012, 18:09
сделал так ADD a,255 верно я ?
Да.

AER
10.06.2012, 18:19
загрузчик кодовых блоков в память компьютера с диска по имени файла
а адрес загрузки берется из каталога диска? как грузить куда надо?

Alex Rider
11.06.2012, 14:40
а адрес загрузки берется из каталога диска? как грузить куда надо?
Да, из каталога. Куда надо (hl - стартовый адрес) так:



load ; in
; DE - address of file name (zero byte after last character)
; HL - start address
; out
; c - error
ld b,8
push hl
ld hl,23773
push hl
ld a," "
clearname
ld (hl),a
inc hl
djnz clearname
ld (hl),"C"
pop hl
copyname
ld a,(de)
and a
jr z,search
ld (hl),a
inc hl
inc de
jr copyname
search
ld c,10
call 15635
pop hl
inc c
scf
ret z
loadfile
xor a
ld (23801),a
ld (23823),a
ld (23824),a
inc a
ld c,14
call 15635
ld a,(23823)
add a,255
ret

AER
11.06.2012, 14:46
Да
все данное тобой внес в AERFRAMEWORK. пока ни того ни другого не проверял. Делаю демка, нуна скролл.....

AER
14.06.2012, 11:22
небольшой вопрос, на словах знаю, но обьясните алгоритмом что делает команда EXX

---------- Post added at 11:22 ---------- Previous post was at 11:19 ----------

и верно, ли вот это :
push hl
push de
push bc
push af
exx
push hl
push de
push bc
push af
exx
call куда-то
exx
pop af
pop bc
pop de
pop hl
exx
pop af
pop bc
pop de
pop hl

Vitamin
14.06.2012, 11:44
небольшой вопрос, на словах знаю, но обьясните алгоритмом что делает команда EXX
Меняет между собой содержимое регистров bc,de,hl между основным и дополнительным набором регистров.


и верно, ли вот это :
Нет.
1) Как сказано выше, exx не затрагивает пару af, а значит ее надо переключать явно
2) еще есть ix,iy
3) два лишних exx - догадайся какие

Andrew771
14.06.2012, 12:24
Что же такое делает этот "call куда-то", что портит все значения регистров, и при том на выходе они нафиг не нужны? :)

---------- Post added at 12:24 ---------- Previous post was at 12:23 ----------

теоретически конечно может такое быть, но на практике лучше поменьше push/pop и переключений на альтернативные регистры. Это ИМХО.

Vitamin
14.06.2012, 12:24
при том на выходе они нафиг не нужны
Это ты с чего решил?

Andrew771
14.06.2012, 12:27
Если какое-то значение нужно несколько раз использовать в разных местах, то лучше его загонять в специально выделенный адрес памяти, а не в стек. Это и быстрее, и не нужно заморачиваться с очередью стека.

---------- Post added at 12:27 ---------- Previous post was at 12:27 ----------



Сообщение от Andrew771
при том на выходе они нафиг не нужны
Это ты с чего решил?
значения, полученные в процедуре, не нужны.

Vitamin
14.06.2012, 12:28
Если какое-то значение нужно несколько раз использовать в разных местах, то лучше его загонять в специально выделенный адрес памяти, а не в стек. Это и быстрее, и не нужно заморачиваться с очередью стека.
Это ты к чему?

Аффтар, выдыхай!:)

---------- Post added at 12:28 ---------- Previous post was at 12:28 ----------


значения, полученные в процедуре не нужны.
Предположим. А сам вызов процедуры, например, нужен.

Andrew771
14.06.2012, 12:40
Это ты к чему?

Аффтар, выдыхай!
да, я чё-то в дебри полез. Просто, не помню такого случая в реале, чтобы все-все-все регистры нужно было сохранять перед входом в процедуру, а потом восстанавливать. Обычно A и HL как расходный материал, ничего долговременного в них нету. А что нужно часто и в разных местах, хранится в памяти, а не в стеке.

psb
14.06.2012, 12:44
:v2_lol:

---------- Post added at 14:44 ---------- Previous post was at 14:41 ----------


Просто, не помню такого случая в реале, чтобы все-все-все регистры нужно было сохранять перед входом в процедуру, а потом восстанавливать.
заменить "куда-то" на play_music и добавить в конец ei:ret и получится самое оно!

Vitamin
14.06.2012, 12:45
Просто, не помню такого случая в реале, чтобы все-все-все регистры нужно было сохранять перед входом в процедуру, а потом восстанавливать.
А ты в реале обработчики прерываний использовал?

Andrew771
14.06.2012, 12:48
А ты в реале обработчики прерываний использовал?
Пользовал. Там да, бывало. Альтернативщину только старался не трогать.

Vitamin
14.06.2012, 12:50
Пользовал. Там да, бывало. Альтернативщину только старался не трогать.
А ты уверен, что вызываемый в обработчике чужой код (плеер музыки, например) её не трогает?

Andrew771
14.06.2012, 14:21
А ты уверен, что вызываемый в обработчике чужой код (плеер музыки, например) её не трогает?
чужой пока не использовал.

Vitamin
14.06.2012, 15:00
Т.е. музыку на прерываниях не играл?

Andrew771
14.06.2012, 15:55
Т.е. музыку на прерываниях не играл?
ну только по книжке "Как написать игру...". В книге кстати авторы любят push/pop где надо и где не надо ставить. И еще их любимая команда ex (sp),hl - ненавижу, затрудняет чтение кода!

jerri
14.06.2012, 16:09
Andrew771, самый простой вариант

при таком вызове гарантированно не будет проблем с проигрыванием музыки



push hl,de,bc,af
exx
ex af,af'
push hl,de,bc,af
push ix,iy
call play_music
pop iy,ix
pop af,bc,de,hl
exx
ex af,af'
pop af,bc,de,hl

Andrew771
08.05.2014, 12:18
Опять про прерывания.
Объясните, почему это не работает? Вроде всё правильно нафигачил :(



org 24000

call im_on

ret

; процедура в прерывании

im_procedure push af
push bc
push de
push hl

exx
ex af,af'

push af
push bc
push de
push hl

push ix
push iy

ld a,3
call 8859

pop iy
pop ix

pop hl
pop de
pop bc
pop af

exx
ex af,af'

pop hl
pop de
pop bc
pop af

jp 56


; включение 2-го режима прерываний

im_on di

ld hl,64512
ld de,64513
ld bc,256
ld (hl),253
ldir

ld hl,im_procedure
ld (65021),hl

ld a,252
ld i,a
im 2

ei

ret

Alex Rider
08.05.2014, 12:23
ld hl,im_procedure
ld (65021),hl
Тут беда. В 65021 надо засовывать не адрес обработчика, а сам обработчик. Если хочется, чтобы он был в другом месте, надо сделать JP туда, напримеор, так:


ld a,#c3 ; jp
ld (65021),a
ld hl,im_procedure
ld (65022),hl

PS А главная беда этого примера - десятичные числа.

Andrew771
08.05.2014, 14:03
В 65021 надо засовывать не адрес обработчика, а сам обработчик.
Спасибо, заработало. Понял. Я думал, там просто адрес нужно, а оказыца вот.

Shadow Maker
08.05.2014, 14:14
Прерыванию делаются примерно так (у меня в примере на прерываниях висит музыка). Можно без ldir'а, если сразу туда ассемблировать.


imtab equ #be00 //таблица вектора прерываний (257 байт)
int_jump equ #bdbd //обработчик

start
di:ld sp,#6000
xor a:out (#fe),a
// прерывания
ld hl,imtab:ld a,h,i,a
ld a,low int_jump
ld (hl),a:inc l:jr nz,$-2
inc h:ld (hl),a
ld hl,obrab,e,a,d,a,bc,obrab_len:ldir
im 2
call music // init music
ei

loop
halt
jr loop


obrab //обработчик прерываний (работает с адреса #bdbd)
push af,hl,bc,de,ix,iy
exx
push hl,de,bc
ex af,af'
push af
call music+5
pop af
ex af,af'
pop bc,de,hl
exx
pop iy,ix,de,bc,hl,af
ei
ret
obrab_len equ $-obrab

music incbin "music.cod" //пт3-модуль с плеером

Andrew771
08.05.2014, 16:28
Прерыванию делаются примерно так (у меня в примере на прерываниях висит музыка).
ну практиццки то же самое