Просмотр полной версии : Помогите начинающему с кодами.
Black1980
10.03.2006, 07:38
Имею вот такой код, назовем его cod для проигрывания компилированного AY музона:
ORG 30000
CALL 40000
LOOP CALL 40006
HALT
XOR A
IN A,(#FE)
CPL
AND #1F
JR Z,LOOP
CALL 40000
RET
Музон откомпилирован в ProTracker с плеером, назовем его muz.
Бейсик загрузчик всего этого добра следующий:
5 CLEAR 29999
10 RANDOMIZE USR 15619: REM: LOAD "cod" CODE 30000
20 RANDOMIZE USR 15619: REM: LOAD "muz" CODE 40000
30 RANDOMIZE USR 30000
Помогите, в чем подвох??? Не хочет играть не под эмулятор, не на реальном спектруме. Заранее спасибо!
Имею вот такой код, назовем его cod для проигрывания компилированного AY музона:
ORG 30000
CALL 40000
LOOP CALL 40006
HALT
XOR A
IN A,(#FE)
CPL
AND #1F
JR Z,LOOP
CALL 40000
RET
Музон откомпилирован в ProTracker с плеером, назовем его muz.
Бейсик загрузчик всего этого добра следующий:
5 CLEAR 29999
10 RANDOMIZE USR 15619: REM: LOAD "cod" CODE 30000
20 RANDOMIZE USR 15619: REM: LOAD "muz" CODE 40000
30 RANDOMIZE USR 30000
Помогите, в чем подвох??? Не хочет играть не под эмулятор, не на реальном спектруме. Заранее спасибо!
Дело в том, что плееры обычно играют не сами по себе, а вызываются из цикла, чаще всего из цикла обработки прерывания.
У Вас же CALL 40000 - насколько я помню, инициализация плеера? Затем начинается цикл, и в нем команда HALT. Процессор останавливается и ждет прерывания. При этом он в режиме обработки прерываний 1го типа. По этому по приходу прерывания он переходит по адресу 38Н. Т.е. командой CALL 40006 Вы один раз вызвали плеер, и всё - больше процессор туда не попадает. Ради прикола попробуйте убрать HALT :).
Вам нужно:
1) записать некоторое число в рег-р I (это число будет старшим байтом адреса, откуда возьмется адрес перехода по прерыванию. Младший байт - всегда ff)
Например при I=EEH адрес, по которому передастся управление по прерыванию будет взят с адресов EEFFh и EF00h
2) перевести процессор в режим обработки прерываний 2 (IM 2)
3) программа должна быть расположена по определенному адресу в памяти, который определяется в соответствии с числом из п1.
Очень хорошо и подробно описано использование прерываний в книге "Программирование в машинных кодах и на языке ассемблера", которая есть на trd.speccy.cz. Очень рекомендую, как и другие книги Инфоркома.
ORG 30000
CALL 40000
LOOP CALL 40006
HALT
XOR A
IN A,(#FE)
CPL
AND #1F
JR Z,LOOP
CALL 40000
RET
ORG 30000
CALL 40000
EI
LOOP HALT
CALL 40006
XOR A
IN A,(#FE)
CPL
AND #1F
JR Z,LOOP
JP 40000
Будет играть.
кста, судя по адресу проигрывания (START+6) это PT2.
имхо лучше компилить музоны под 49152 (#C000)
а саму прогу под 32768 (#8000)
Black1980
10.03.2006, 12:11
кста, судя по адресу проигрывания (START+6) это PT2.
имхо лучше компилить музоны под 49152 (#C000)
а саму прогу под 32768 (#8000)
У PT2, ST и PT3 адресса одинаковые... Не скажешь чем лучше, чтобы уж делать, так на верника...
Black1980
10.03.2006, 12:39
ORG 30000
CALL 40000
EI
LOOP HALT
CALL 40006
XOR A
IN A,(#FE)
CPL
AND #1F
JR Z,LOOP
JP 40000
Будет играть.
Не работает... :((
mishutka
10.03.2006, 14:14
Не работает... :((
а так
ORG 30000
CALL 40000
LOOP
EI
HALT
CALL 40006
XOR A
IN A,(#FE)
CPL
AND #1F
JR Z,LOOP (здесь может быть nz - не помню)
JP 40000
Не работает...
А так?
ORG 30000
CALL 40000
LOOP
EI
HALT
CALL 40006
XOR A
IN A,(#FE)
CPL
AND #1F
JR Z,LOOP
JP 40000
У PT2, ST и PT3 адресса одинаковые... Не скажешь чем лучше, чтобы уж делать, так на верника...
у PT2 играть - START+6
у PT3 - START+5
у ST зависит от компилятора, точно не помню, но вроде START+5
где START - куда компилировался музон (обычно #C000 или 49152)
и ещё, приаттачь свой музон сюда, а то телепаты в отпуске.
Black1980
10.03.2006, 19:46
и ещё, приаттачь свой музон сюда, а то телепаты в отпуске.
Бес проблем, музон PT2... В архиве оба музоны, компиленный и нет.
Black1980
10.03.2006, 19:50
А так?
ORG 30000
CALL 40000
LOOP
EI
HALT
CALL 40006
XOR A
IN A,(#FE)
CPL
AND #1F
JR Z,LOOP
JP 40000
Неа, в эмуле пишет CPU HALTED, на реальном просто в подвисшем состоянии, если строку JR Z,LOOP менять на JR NZ,LOOP эффект остается такой же. :o
SAM style
10.03.2006, 20:16
Бес проблем, музон PT2... В архиве оба музоны, компиленный и нет.
Погоди, ты ж говорил что он с плейером... В упор плейера не вижу. Сама по себе музака играться не будет.
Black1980
там нет компилированного музона.
если взять ProTracker v.2.101 с сайта Virtual TR-DOS (http://zx.da.ru)
загрузить туда музон AGATA.M (SONG: LOAD) и откомпилировать его (COMPILE SONG) с плеером (на вопрос "Include Player" надо ответить "Y") под адрес (ENTER START CODE: ) 49152. далее ответить Y (IS THIS CORRECT Y/N?) и сохранить под именем AGATA (тогда он сохранится как AGATA.C) то следующий код (для ассемблера ALASM)
ORG #C000
INCBIN "AGATA"
ORG #8000
CALL #C000
LOOP HALT
CALL #C006
XOR A
IN A,(#FE)
OR #E0
INC A
JP Z,LOOP
JP #C000
будет играть музон.
у ST зависит от компилятора, точно не помню, но вроде START+5
+6. Это начиная с pt3 адрес на +5 поменяли.
И еще. У плееров от этого самого pt3 замечена одна черта- они глюкаво работают на им2 в басике. Наткнулся на такое безобразие на заре своей кодерской деятельности. С pt2 & st все в порядке
Black1980
11.03.2006, 01:31
Black1980
там нет компилированного музона.
если взять ProTracker v.2.101 с сайта Virtual TR-DOS (http://zx.da.ru)
загрузить туда музон AGATA.M (SONG: LOAD) и откомпилировать его (COMPILE SONG) с плеером (на вопрос "Include Player" надо ответить "Y") под адрес (ENTER START CODE: ) 49152. далее ответить Y (IS THIS CORRECT Y/N?) и сохранить под именем AGATA (тогда он сохранится как AGATA.C) то следующий код (для ассемблера ALASM)
ORG #C000
INCBIN "AGATA"
ORG #8000
CALL #C000
LOOP HALT
CALL #C006
XOR A
IN A,(#FE)
OR #E0
INC A
JP Z,LOOP
JP #C000
будет играть музон.
Объясни чайнику пожалуйсто в чем мой трабл.
Вобщем делаю следующее: Откомпилил музон, в Alasm набираю код который ты привел, асемблирую, запускаю, играет :) Захожу в дебагер, нажимаю S (для сохранения), ввожу имя, адресс он выставляет сам #8000, длин #0001, отписываю, пытаюсь запустить через бейсик загрузчик по адрессу 32768, сбрасывает комп... Что я не так делаю???
P.S. Не руугайтесь сильно, я только учусь! И так этого хочется... :)
Вобщем делаю следующее: Откомпилил музон, в Alasm набираю код который ты привел, асемблирую, запускаю, играет Захожу в дебагер, нажимаю S (для сохранения), ввожу имя, адресс он выставляет сам #8000, длин #0001, отписываю, пытаюсь запустить через бейсик загрузчик по адрессу 32768, сбрасывает комп... Что я не так делаю???
Нафига же ты из дебагера сохраняешь? Тем более 1 байт. В 1 байте, конечно, пользы больше, чем в 0, но меньше, чем в (хотя бы) двух ;-) Из ассемблера надо сохранять.
Black1980
11.03.2006, 02:00
Нафига же ты из дебагера сохраняешь? Тем более 1 байт. В 1 байте, конечно, пользы больше, чем в 0, но меньше, чем в (хотя бы) двух ;-) Из ассемблера надо сохранять.
Подскажи какием образом, все облазил, по S сохраняет только исходный текст, но ни код. Всю документацию в долль и поперек прошол, ничего не на рыл... :(
Black1980
11.03.2006, 06:06
Вобщем смог я его сохранить через дебагер с нормально длинной (156 байт), теперь проигрывается через бейсик загрузчик.... :) Но мне очень бы хотелось узнать, если возможно из самого ассемблера ( ALASM ) сохранять откомпилированный код, то подскажите пожалуйсто. :) ВСе БОЛЬШОЕ СПАСИБО! И все таки сообщество спектрумистов замое дружное... ;)
из ALASM-а код можно сохранить только в последних версиях с AlCo-вскими извратами, и то вроде как-то хитро через макросы.
но в большинстве случаев это не надо.
я допустим делаю так
ORG #8000
START
.... your programm ....
LAST
DISPLAY "START=",START
DISPLAY "LENGTH=",LAST-START
и в конце он выведет данные для сохранения.
Black1980
11.03.2006, 16:27
из ALASM-а код можно сохранить только в последних версиях с AlCo-вскими извратами, и то вроде как-то хитро через макросы.
Значит все таки так и получается, что из дебугера сохранять надо ( Alasm 5.03)... Кстати, на сколько я понял, то длину можно и в Real Commander посмотреть...
Значит все таки так и получается, что из дебугера сохранять надо ( Alasm 5.03)... Кстати, на сколько я понял, то длину можно и в Real Commander посмотреть...
Alasm имхо для начинающих не лучший вариант, лучше попробуй Zasm (более нагляден) или Storm (relez forever!! =)
Black1980
11.03.2006, 20:37
Alasm имхо для начинающих не лучший вариант, лучше попробуй Zasm (более нагляден) или Storm (relez forever!! =)
Я начел с Zasm, но он не поддерживает команду INCBIN для загрузки файла, а это как нельзя удобно. Если как то можно в нем подгружать файл, то был бы благодарен за подсказку...
+6. Это начиная с pt3 адрес на +5 поменяли.Ага, а Асм музон тама помойму инициализация была + 11, а проигрывание + 14 - но он подлец(плейер) тактов жрал туеву хучу....
Я начел с Zasm, но он не поддерживает команду INCBIN для загрузки файла, а это как нельзя удобно. Если как то можно в нем подгружать файл, то был бы благодарен за подсказку...
Наверное там сокрашение INCB?
Глянь в дизасме тело асма, там должны быть видны все директивы.
Подскажи какием образом, все облазил, по S сохраняет только исходный текст, но ни код. Всю документацию в долль и поперек прошол, ничего не на рыл...
Аласмом никогда не пользовался, не знаю. Я привык в ксасе - assemble, потом save code.
Black1980
12.03.2006, 02:01
Вот сижу определяюсь в каком ассемблере оставаться (достатки и недостатки ищу). В аласме вроде удобно, да и ни так пугает сохранение в дебагере, в засме намного все наглядней и проще+сохранение из самого ассемблера. В другие если честно не очень то хочется лезть, голову забивать. Если с засмом разберусь (подгрузка файлов), то в нем и останусь, нет так в аласме и продолжу свою писанину... :)
А я привык к GENS4. Это вовсе не означает совет :) . Просто в 1993 году я сделал 128К-версию GENS с поддержкой RAM-диска со всеми (абсолютно!) функциями компилятора и пользуюсь им, так и не переучившись на что-то более новое ;) .
http://wlodeks.narod.ru/zxnet/soft/soft.htm
mishutka
12.03.2006, 03:37
Я начел с Zasm, но он не поддерживает команду INCBIN для загрузки файла, а это как нельзя удобно. Если как то можно в нем подгружать файл, то был бы благодарен за подсказку...
а почитайте внимательно приложенную к zasm инструкцию - там описаны директивы include и insert
А я привык к GENS4. Это вовсе не означает совет :) .
В оригинале вешчь крутая, а с добавками и тем более Wlodek не зря старался. GENS4 очень прост в освоении, четко известно в каких адресах он сам сидит, где находится набираемый текст, куда компилится код и многое другое, обязательно скачай один из "букварей синклериста":
http://trd.speccy.cz/ раздел [book] "Как написать игру на ассемблере"
С ALASM очень удобно работать в плане текста, практически полноценный текстовый редактор, но с сохранением кода и адресами куда он компилит прогу (текст не обязательно начинать с директивы ORG)я долго разбирался, не говоря уже о сохранении объектного кода.
:)
А вообще, каждому свое. Каждая прога по-своему ценна и интересна (зря чтоли делали?), так что полезно уметь работать во всех асмах (имхо).
Alexander Bondarenko (500:3432/3)
27.03.2006, 00:15
*Здравствуй, Wladimir!*
Лови мои идеи по поводу сабжа "Помогите начинающему с кодами.", о котором трещала в 12 Mar 2006 твоя портянка к тов. All.
А я привык к GENS4. Это вовсе не означает совет :) . Просто в 1993
году я сделал 128К-версию GENS с поддержкой RAM-диска со всеми
(абсолютно!) функциями компилятора и пользуюсь им, так и не
переучившись на что-то более новое ;)
Вот это я понимаю - дань тpадиции... ;)
/Вот и всё, Wladimir, можешь листать дальше.../
... Все сценеры - газетчики!
Black1980
30.03.2006, 00:25
GENS4 очень прост в освоении
Я начинал с него, потом решил перейти на более продвинутые проги... :)
обязательно скачай один из "букварей синклериста":
Качать мне нет необходимость, он у меня живьем есть... :)
Rubts0FF
11.04.2006, 07:28
Если с засмом разберусь (подгрузка файлов), то в нем и останусь, нет так в аласме и продолжу свою писанину... :)
Блин! INCLUDE - text, INSERT - code block!. здесь (http://zasm.nm.ru) и руководство пользователя и все, все. все ... зеркало (http://zasm.hut1.ru)
Пользуйтесь.
--- Директива INSERT ---
~~~~~~~~~~~~~~~~
Директива insert "a:FileName.fnt" генерирует код, считываемый с дискового
файла с именем FileName, который может содержать произвольные данные ( к приме-
ру, подготовленный знакогенератор).
Буфер для INSERT открывается только при компиляции на диск и равен буферу
INCLUDE. При компиляции в память, файл просто считывается в адрес расположения кода.
Powered by vBulletin® Version 4.2.5 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot