PC-01 Lviv http://pc01.lviv.ua/forum/ |
|
Учимся писать на MADL2021 http://pc01.lviv.ua/forum/viewtopic.php?f=20&t=397 |
Page 1 of 1 |
Author: | als [ 03 May 2021, 16:46 ] |
Post subject: | Учимся писать на MADL2021 |
Поскольку я о своей разработке, которая МАДЛ, был почему-то не лучшего мнения, то написав и выложив МАДЛ, я решил попробовать XDev, чтобы писать программы для ПК-01 "Львов". Создал тему посвященную этому "Учимся писать на Обероне" viewtopic.php?f=8&t=396&sid=9a73f75f1cb ... 5952a62c38 Однако я понял, что постоянным проблемам и заморочкам с этой XDev, пока я начну что-то писать, у меня не будет ни конца ни края! Я решил бросить то всё и вернуться к МАДЛ. ============= Для начала нужно ознакомится с темой MADL2021 viewtopic.php?f=20&t=394 и установить MADL2021 себе. Как я уже писал в теме "MADL2021", - данная разработка предназначена, для любителей паскалеподобных сред программирования. И расcчитана на пользователей которые имеют представление о данных средах. Данная тема предназначена для примеров, проб, экспериментов, частей кода, черновиков (кода), вопросов от пользователей касающихся написания кода на МАДЛе. Я как автор MADL2021, буду сюда выкладывать примеры использования. MADL2021 очень хорошо документирован, поэтому глупых вопросов о возможностях МАДЛа возникать не должно! Также доступен декомпилятор для МАДЛ, который проверенный более чем на 90 программах для ПК-01. Примеры будут предоставляться с использованием МАДЛ-мнемоники. Для чего её нужно было выдумывать, думаю Вы поймёте когда выйдет версия с макросами! Освоить МАДЛ-мнемонику не сложно, обо всем, как я уже говорил, есть в документациях, в теме "MADL2021". Лишнего там ничего нет! Примеры опубликованные здесь, будут выкладываться в виде архивов в теме "MADL2021". Внимание! При создании собственных проектов, проб на МАДЛе, избегайте названия файла проекта "Project.dpr", во избежании случайной порчи данных того файла, так как разные пробы и примеры, тесты, bat-файлы, предоставленные мной, используют (и будут использовать) это имя, "Project.dpr". Обратите внимание на содержимое bat-файлов декомпиляторов и я думаю вы поймёте о чём это я! |
Author: | als [ 03 May 2021, 16:49 ] |
Post subject: | Re: Учимся писать на MADL2021 |
Кратко о будущих возможностях МАДЛа. Есть конечно MD02 (который возможно выложу намного позже), в котором реализованы TTextLV,TByteLV,TWordLV,TProcedureLV и т.д. Ну оно для кого-то может оказаться настолько специфическим, что лучше делать это все самому для себя, с самостоятельно придуманными названиями. Для тех у кого бурная и широкая фантазия и высокий полёт ума, как у меня например... Предлагаю вспомнить, такое как "Overload;" И вот если, создать типы вот так вот (как пример): Quote: type TByteLV=record LabelLV:TLabelLV; end;
А далее написать процедуры с одним названием и "Overload;" для обработки разных типов (данных), - такого можна "нагородить" что вы даже себе не представляете!type TWordLV=record LO,HI:TByteLV; end; type TProcedureLV=record LabelLV:TLabelLV;{старт процедуры}EndProc:TLabelLV;end; type TArrayByteLV=.... type TArrayWordLV=.... type TSpriteLV=.... {Регистры} type TrgA=.... type TrgD=... ......... {Регистровые пары} type TrpBC=............ type TrpSP=............ type TrpPC=........... type TENDProc=record end;{RET в макросах} Var A:TrgA;F:TrgF; B:TrgB;C:TrgC; D:TrgD;E:TrgE; H:TrgH;L:TrgL; mHL:TrgmHL; Var BC:TrpBC; DE:TrpDE; HL:TrpHL; SP:TrpSP; AF:TrpAF; PSW:TrpPSW; PC:TrpSP; ENDProc:TENDProc; ............... Вот сейчас и обзор сделаю... Например, принимаем "p" за "плюс" (+) "городим"... Quote: procedure p(Var L1:TByteLV; c:Cardinal);Overload;
и т.д.procedure p(RgB:TRgB; Var L1:TByteLV; c:Cardinal);Overload; procedure p(RgC:TRgC; Var L1:TByteLV; c:Cardinal);Overload; procedure p(Var L1:TByteLV; Var L2:TByteLV; c:Cardinal);Overload; procedure p(Var W1:TwordLV; c:Cardinal);Overload; И получается - что хочеш, с чем хочешь (точнее с чем не поленишься написать) сплюсует одна единственная процедура с названием "p". Так можна делать со всем! Про "минус", "равно" и прочие арифметические и логические писать не буду, - ежу понятно! Смотрим далее, чего я еще интересного "нагородил" то в MD02 ... А как вам такое... Quote: procedure Ifis(Var b1:TByteLV; c1:Cardinal; Var l:TLabelGLV);Overload;
Одно название у процедуры-макросы, "разруливает" разные типы.procedure Ifis(Var b1:TByteLV; c1:Cardinal; ENDProc:TENDProc);Overload; procedure Ifis(Var b1:TByteLV; Var b2:TByteLV; Var l:TLabelGLV);Overload; procedure Ifis(Var b1:TByteLV; Var b2:TByteLV; ENDProc:TENDProc);Overload; procedure Ifis(Var w:TWordLV; c:Cardinal; Var l:TLabelGLV);Overload; procedure Ifis(Var w:TWordLV; c:Cardinal; ENDProc:TENDProc);Overload; (процедура аналогично ЕСЛИ_РАВНО_ТО) Ну и понятно так далее IfisNot, IfMore, IfLess, IfMoreOrIs А как вам вот такое... Quote: procedure CaseOf(Var B1:TByteLV; C1:Cardinal;var L1:TLabelGLV;C2:Cardinal;var L2:TLabelGLV;C3:Cardinal;var L3:TLabelGLV;C4:Cardinal;var L4:TLabelGLV;C5:Cardinal;var L5:TLabelGLV;C6:Cardinal;var L6:TLabelGLV;C7:Cardinal;var L7:TLabelGLV;C8:Cardinal;var L8:TLabelGLV;ELSE_:TLabelGLV);Overload;
Конечно это CaseOf явно отличается по эффективности такой же в Дельфи Просто заменяется "набором" Ifis , но все таки, удобно. А такое как вам... Quote: procedure ProcABC(Proc1:TProcedureLV;gA:Cardinal;var gB:TByteLV;var gC:TByteLV);Overload;
Вызов процедуры передавая в регистры A,B,C параметры (указанные в параметрах процедуре).PROCs - вызов нескольких процедур подряд (указанные в параметрах процедуре). А как вам такое... Quote: DrawText($FF,5,4,3,'Л А Б И Р И Н Т 2018'+#0);
Макрос все разрулит! И расположит!ну такое и подобное не удивительно... Quote: Var ArrConstDATALEVELS:array[0..1971+61] of Byte=( $00,$01, $39,$A5,$2F,$7B,$......);
VarByte, VarWord и т.д............ VarArrayByte(abLevels{DATA уровни},'abLevels{DATA уровни}',ArrConstDATALEVELS); Ну и напоследок самое "вкусное" как по мне... А как вам такое... Code: VarSprite(SPRITE241,'SPRITE241',' ','1','2','3',{Человечек} '2 2'+ ' 233332 '+ ' 2222 '+ ' 322223 '+ ' 322223 '+ ' 2222 '+ ' 2 33 2 '+ '2 2' );Параметры в процедуре, которые "пробел", "1","2","3" задают соответственно цвета 0,1,2,3, далее сам спрайт в виде строки String! "Рисуй" себе спрайты на здоровье, как говорится "не отходя от кассы", причем соответствие символ-цвет вибирай сам! Далее процедура-макрос VarSprite все сделает как надо! И это все не фантазии мои! Это всё у меня реально работает! Подготовлю выложу! Когда нибудь... |
Author: | als [ 03 May 2021, 17:14 ] |
Post subject: | Re: Учимся писать на MADL2021 |
Для начала "пробегусь" по примерам которые опубликовал Zelya на форуме https://www.old-games.ru/forum/threads/ ... -01.50209/ в теме "Ассемблер i8080: уроки, практика, ПК-01". для "PC Lviv Studio" (Windows) , viewtopic.php?f=20&t=21 (Надеюсь Zelya не обидеться ) и вы увидите как они выглядят МАДЛ-мнемоникой. Для сравнения с АСМ-мнемоникой, внизу кода, после "END.", опубликованы оригиналы кода, той темы. Дело еще и в том, что данные примеры будут полезны и мне, так как я хочу "освежить" свою память. МАДЛа был написан "давно", а выложен недавно, и я уже так сказать призабыл его! Это мне поможет быстрее перейти к выкладыванию макросов (МД02). Пока примеры будут с использованием МД01 (uMD01u.pas). Если же Вам подавай примеры прям "целых" игр для МАДЛ, а не коротких примеров, вы можете воспользоваться декомпиляторами "LVTtoMD01D(e)" "LVTtoMD01M(e)" и получить исходный МАДЛ-код в мнемонике АСМа или МАДЛа. Как я уже говорил, декомпиляторы проверены на более 90 лвт-файлах. Список тех файлов есть в документации к МАДЛ. |
Author: | als [ 03 May 2021, 17:40 ] |
Post subject: | Re: Учимся писать на MADL2021 |
Пример "MD01\Lviv Studio\LS1" Вывод байта (4 пиксела красным цветом в видеопамять) Code: //Пример "MD01\Lviv Studio\LS1" // Вывод байта (4 пиксела красным цветом в видеопамять) // Подробное описание данного примера - https://www.old-games.ru/forum/threads/assembler-i8080-uroki-praktika-pk-01.50209/ //Пример взят из примеров для "PC Lviv Studio" (Windows) на сайте //https://www.old-games.ru/forum/threads/assembler-i8080-uroki-praktika-pk-01.50209/ // В теме "Ассемблер i8080: уроки, практика, ПК-01" // Оригинал примера смотрите в этом файле после "END.". // Скопируйте этот файл (Project.dpr) в каталог МАДЛа и запустите CompileFPC_RUN.bat // результат компилирования будет файл _res.LVT program Project; uses uMD01u in 'uMD01u.pas'; BEGIN INITCompiler; // Инициализация компилятора МАДЛ (обязательно) SetAddrRAM($8000); // установить адрес компилирования StartProgram; // точка старта программы REM('StartProgram;'); // для диагностики ошибок кода Ar($00);OUT_($C2); // Влючить вывод в Видео-ОЗУ Ar($00);_rA($BE38); // $BE38 - код заполнения ( в данном случае экранного ОЗУ) CALL($EBBC); //Очистка экранного ОЗУ Ar(255);_rA($5010); // 4 пикселя красным цветом FINALCompiler; // Финализация компилятора МАДЛ (обязательно) END. // оригинал примера { MVI a, 0 OUT 0C2h MVI a, 0 STA 0BE38h CALL 0EBBCh MVI a, 255 STA 5010h } |
Author: | als [ 03 May 2021, 17:52 ] |
Post subject: | Re: Учимся писать на MADL2021 |
Пример "MD01\Lviv Studio\LS2" Регистры. Некоторые операции над ними. Code: //Пример "MD01\Lviv Studio\LS2" // Регистры. Некторые операции над ними. // Подробное описание данного примера - //https://www.old-games.ru/forum/threads/assembler-i8080-uroki-praktika-pk-01.50209/#post-841117 //Пример взят из примеров для "PC Lviv Studio" (Windows) на сайте //https://www.old-games.ru/forum/threads/assembler-i8080-uroki-praktika-pk-01.50209/ // В теме "Ассемблер i8080: уроки, практика, ПК-01" // Оригинал примера смотрите в этом файле после "END.". // Скопируйте этот файл (Project.dpr) в каталог МАДЛа и запустите CompileFPC_RUN.bat // результат компилирования будет файл _res.LVT program Project; uses uMD01u in 'uMD01u.pas'; VAR m1,LoopEND :TLabelLV; BEGIN INITCompiler; // Инициализация компилятора МАДЛ (обязательно) SetAddrRAM($8000); // установить адрес компилирования // назначение уникального имени меткам (для диагностики ошибок компилирования) SetNameLabelLV(m1,'m1');SetNameLabelLV(LoopEND,'LoopEND'); StartProgram; // точка старта программы REM('StartProgram;'); // для диагностики ошибок кода Ar($00);OUT_($C2); // Включить вывод в видео-ОЗУ Ar($00);_rA($BE38); // $BE38 - код заполнения ( в данном случае экранного ОЗУ) CALL($EBBC); //Очистка экранного ОЗУ HLr($5010); // позиция в видео-ОЗУ DEr(63); // смещение (на нижнюю позицию) Ar(8); // Размер по Y LabelA(m1); REM('LabelA(m1);');// для диагностики ошибок кода mHLr(255); HLp1; mHLr(255); HLpDE; Am1; GotoUnNot0(m1); LabelA(LoopEND);GOTO_(LoopEND);// бесконечный "пустой" цикл в конце программы. FINALCompiler; END. // оригинал примера { MVI A, 0 ;32768 OUT 0C2h ;32770 Video Memory MVI A, 0 ;32772 ------------ STA 0BE38h ;32774 CALL 0EBBCh ;32777 Clear screen LXI H, 5010h ;32780 ------------ LXI D, 63 ;32783 Preapre Data MVI A, 8 ;32786 MVI M, 255 ;32788 ------------ INX H ;32790 MVI M, 255 ;32791 Cycle 1 DAD D ;32793 DCR A ;32794 JNZ 32788 ;32795 ------------- JMP 32798 ;32798 Cycle 2 } |
Author: | als [ 03 May 2021, 18:42 ] |
Post subject: | Re: Учимся писать на MADL2021 |
Пример "MD01\Lviv Studio\LS3" Метки. Переменные. Процедуры. Code: //Пример "MD01\Lviv Studio\LS3" // Метки. Переменные. Процедуры. // Подробное описание данного примера - //https://www.old-games.ru/forum/threads/assembler-i8080-uroki-praktika-pk-01.50209/#post-842936 //Пример взят из примеров для "PC Lviv Studio" (Windows) на сайте //https://www.old-games.ru/forum/threads/assembler-i8080-uroki-praktika-pk-01.50209/ // В теме "Ассемблер i8080: уроки, практика, ПК-01" // Оригинал примера смотрите в этом файле после "END.". // Скопируйте этот файл (Project.dpr) в каталог МАДЛа и запустите CompileFPC_RUN.bat // результат компилирования будет файл _res.LVT program Project; uses uMD01u in 'uMD01u.pas'; VAR LoopEND, draw, draw_cycle:TLabelLV; const BORDER = $BE38; CLEAR_SCREEN = $EBBC; BEGIN INITCompiler; // Инициализация компилятора МАДЛ (обязательно) // назначение уникального имени меткам (для диагностики ошибок компилирования SetNameLabelLV(LoopEND,'LoopEND'); SetNameLabelLV(draw,'draw'); SetNameLabelLV(draw_cycle,'draw_cycle'); SetAddrRAM($8000); // установить адрес компилирования StartProgram;REM('StartProgram;');// точка страта программы, REM -для диагностики ошибок кода Ar($00);OUT_($C2); // Включить вывод в видео-ОЗУ Ar($00);_rA(BORDER); // в ЯП $BE38 - код заполнения ( в данном случае экранного ОЗУ) CALL(CLEAR_SCREEN); //Очистка экранного ОЗУ Br(255);HLr($5001);CALL(draw);// Вывод кубика на экран (красного) Br(15);HLr($5007);CALL(draw);// Вывод кубика на экран (синего) Br(240);HLr($500D);CALL(draw);// Вывод кубика на экран (зеленого) LabelA(LoopEND);GOTO_(LoopEND);// бесконечный "пустой" цикл в конце программы. LabelA(draw);REM('LabelA(draw);'); DEr(63); // смещение (на нижнюю позицию) Ar(8);// // Размер по Y LabelA(draw_cycle);REM('LabelA(draw_cycle);');// для диагностики ошибок кода mHLrB; HLp1; mHLrB; HLpDE; Am1; GotoUnNot0(draw_cycle); RET; FINALCompiler; // Финализация компилятора МАДЛ (обязательно) END. { BORDER = 0BE38h CLEAR_SCREEN = 0EBBCh MVI A, 0 ; OUT 0C2h ; Video Memory MVI A, 0 ; ------------ STA BORDER CALL CLEAR_SCREEN MVI B, 255 LXI H, 5001h CALL draw MVI B, 15 LXI H, 5007h CALL draw MVI B, 240 LXI H, 500Dh CALL draw main_cycle: JMP main_cycle draw: LXI D, 63 MVI A, 8 draw_cycle: MOV M, B INX H MOV M, B DAD D DCR A JNZ draw_cycle RET } |
Author: | als [ 03 May 2021, 19:42 ] |
Post subject: | Re: Учимся писать на MADL2021 |
Пример "MD01\Lviv Studio\LS4" Стек. Сравнения. Стартовое поле. Code: //Пример "MD01\Lviv Studio\LS4" // Стек. Сравнения. Стартовое поле. // Подробное описание данного примера - //https://www.old-games.ru/forum/threads/assembler-i8080-uroki-praktika-pk-01.50209/#post-847656 //Пример взят из примеров для "PC Lviv Studio" (Windows) на сайте //https://www.old-games.ru/forum/threads/assembler-i8080-uroki-praktika-pk-01.50209/ // В теме "Ассемблер i8080: уроки, практика, ПК-01" // Оригинал примера смотрите в этом файле после "END.". // Скопируйте этот файл (Project.dpr) в каталог МАДЛа и запустите CompileFPC_RUN.bat // результат компилирования будет файл _res.LVT program Project; uses uMD01u in 'uMD01u.pas'; VAR init1, init2, init_put127, init3, init5, init4, LoopEND, draw, draw_cycle:TLabelLV; BEGIN INITCompiler; SetAddrRAM($8000); StartProgram; Hr(33); LabelA(init1); Lr(33); LabelA(init2); PushHL; ArL; Acmp(0);GotoUn0(init_put127); Acmp(33);GotoUn0(init_put127); ArH; Acmp(0);GotoUn0(init_put127); Acmp(33);GotoUn0(init_put127); GOTO_(init3); LabelA(init_put127); mHLr(127); GOTO_(init4); LabelA(init3); Br(15); ArL; Acmp(3);GotoUnm(init5); Acmp(31);GotoUnp(init5); ArH; Acmp(3);GotoUnm(init5); Acmp(31);GotoUnp(init5); Br(0); LabelA(init5); mHLrB; CALL(draw); LabelA(init4); PopHL; Lm1; GotoUnp(init2); Hm1; GotoUnp(init1); LabelA(LoopEND);GOTO_(LoopEND);// бесконечный "пустой" цикл в конце программы. LabelA(draw); Ar(0); OUT_($C2); Lm1; Hm1; ArL; shlA; LrA; ArH; shlA; HrA; Ar(64); ApH; HrA; DEr(63); Ar(8); LabelA(draw_cycle); mHLrB; HLp1; mHLrB; HLpDE; Am1; GotoUnNot0(draw_cycle); Ar($02);OUT_($C2); RET; FINALCompiler; END. // оригинал примера { MVI H,33 init1: MVI L,33 init2: PUSH H MOV A,L CPI 0 JZ init_put127 CPI 33 JZ init_put127 MOV A,H CPI 0 JZ init_put127 CPI 33 JZ init_put127 JMP init3 init_put127: MVI M, 127 ;(7F) JMP init4 ;Don't draw init3: MVI B,15 ;Temporary use 15 (0F) MOV A,L CPI 3 JM init5 ;Don't put 0 CPI 31 JP init5 ;Don't put 0 MOV A,H CPI 3 JM init5 ;Don't put 0 CPI 31 JP init5 ;Don't put 0 MVI B, 0 init5: MOV M,B CALL draw init4: POP H DCR L JP init2 DCR H JP init1 main_cycle: JMP main_cycle draw: MVI A, 0 ;Video on OUT 0C2h ;Video on DCR L ;Coordinate -1 DCR H ;Coordinate -1 MOV A,L RLC MOV L,A MOV A,H RLC MOV H,A MVI A, 64 ADD H MOV H,A LXI D, 63 MVI A, 8 draw_cycle: MOV M, B INX H MOV M, B DAD D DCR A JNZ draw_cycle MVI A, 2 ;Video off OUT 0C2h ;Video off RET } |
Author: | als [ 03 May 2021, 19:54 ] |
Post subject: | Re: Учимся писать на MADL2021 |
Архив 4-х примеров (LS1 - LS4) опубликованных выше находятся в теме MADL2021 viewtopic.php?f=20&t=394&p=5447#p5447 |
Author: | als [ 04 May 2021, 10:20 ] |
Post subject: | Re: Учимся писать на MADL2021 |
Пример "MD01\Lviv Studio\LS5" Персонаж на поле. Работа с координатами. Анимация перемещения. Code: //Пример "MD01\Lviv Studio\LS5" // Урок 6. Персонаж на поле. Работа с координатами. Анимация перемещения. // Подробное описание данного примера (начинается с)- //https://www.old-games.ru/forum/threads/assembler-i8080-uroki-praktika-pk-01.50209/page-2#post-848916 //Код примера ( для Pretty 8080 Assembler) - //https://www.old-games.ru/forum/threads/assembler-i8080-uroki-praktika-pk-01.50209/page-2#post-1085290 //Пример взят из примеров для "PC Lviv Studio" (Windows) на сайте //https://www.old-games.ru/forum/threads/assembler-i8080-uroki-praktika-pk-01.50209/ // В теме "Ассемблер i8080: уроки, практика, ПК-01" // Оригинал примера смотрите в этом файле после "END.". // Скопируйте этот файл (Project.dpr) в каталог МАДЛа и запустите CompileFPC_RUN.bat // результат компилирования будет файл _res.LVT program Project; uses uMD01u in 'uMD01u.pas'; const ENEMY_X=$9C40; ENEMY_Y=$9C41; ENEMY_SPD_X=$9C42; ENEMY_SPD_Y=$9C43; VAR init1, init2, init_put127, init3, init5, init4, main_cycle, pause1, pause2, enemy_move, en_mov_fin, enemy_speed, back_xy, back_y, speed_back, speed_back1, draw, draw_cycle :TLabelLV; BEGIN INITCompiler; SetAddrRAM($8000); StartProgram; Ar(4);_rA(ENEMY_X); Ar(3);_rA(ENEMY_Y); Ar(1);_rA(ENEMY_SPD_X); Ar(1);_rA(ENEMY_SPD_Y); Hr(33); LabelA(init1); Lr(33); LabelA(init2); PushHL;ArL; Acmp(0);GotoUn0(init_put127); Acmp(33);GotoUn0(init_put127); ArH; Acmp(0);GotoUn0(init_put127); Acmp(33);GotoUn0(init_put127); GOTO_(init3); LabelA(init_put127); mHLr($7F); GOTO_(init4); LabelA(init3); mHLr($0F); ArL; Acmp(3);GotoUnm(init5); Acmp(31);GotoUnp(init5); ArH; Acmp(3);GotoUnm(init5); Acmp(31);GotoUnp(init5); mHLr(0); LabelA(init5); CALL(draw); LabelA(init4); PopHL; Lm1;GotoUnp(init2); Hm1;GotoUnp(init1); LabelA(main_cycle); Ar(20); LabelA(pause1); Br(255); LabelA(pause2); Bm1;GotoUnNot0(pause2); Am1;GotoUnNot0(pause1); CALL(enemy_move); GOTO_(main_cycle); LabelA(enemy_move); Ar_(ENEMY_X);LrA; Ar_(ENEMY_Y);HrA; mHLr(0);CALL(draw); CALL(enemy_speed);ArmHL;Acmp(0);GotoUn0(en_mov_fin); CALL(enemy_speed);ArmHL;Acmp(0);GotoUn0(en_mov_fin); CALL(enemy_speed);ArmHL;Acmp(0);GotoUn0(en_mov_fin); Ar_(ENEMY_X);LrA; Ar_(ENEMY_Y);HrA; LabelA(en_mov_fin); ArL;_rA(ENEMY_X); ArH;_rA(ENEMY_Y); mHLr(255); CALL(draw); RET; LabelA(enemy_speed); Ar_(ENEMY_X);LrA; Ar_(ENEMY_Y);HrA; Ar_(ENEMY_SPD_X); ApL; LrA; Ar_(ENEMY_SPD_Y); ApH; HrA; ArmHL; Acmp(0);RetUn0; DrL; Ar_(ENEMY_X); LrA; BrmHL; LrD; Ar_(ENEMY_Y); HrA; CrmHL; Ar_(ENEMY_X); LrA; ArB; AcmpC; GotoUn0(back_xy); Acmp(0); GotoUnNot0(back_y); Ar_(ENEMY_SPD_X); CALL(speed_back); _rA(ENEMY_SPD_X); ApL; LrA; Ar_(ENEMY_SPD_Y); ApH; HrA; RET; LabelA(back_xy); Ar_(ENEMY_SPD_X); CALL(speed_back); _rA(ENEMY_SPD_X); LabelA(back_y); Ar_(ENEMY_SPD_Y); CALL(speed_back); _rA(ENEMY_SPD_Y); ApH; HrA; Ar_(ENEMY_SPD_X); ApL; LrA; RET; LabelA(speed_back); Acmp(1); GotoUnNot0(speed_back1); Ar(255); RET; LabelA(speed_back1); Ar(1); RET; LabelA(draw); BrmHL; Ar(0);OUT_($C2);// Video on Lm1; Hm1; ArL; shlA; LrA; ArH; shlA; HrA; Ar(64); ApH; HrA; DEr(63); Ar(8); LabelA(draw_cycle); mHLrB; HLp1; mHLrB; HLpDE; Am1; GotoUnNot0(draw_cycle); Ar(2);OUT_($C2);//;Video off RET; FINALCompiler; END. // оригинал примера { begin .equ 08000h ;start address .org begin-16-6 .db "LVOV/2.0/" .db 0D0h .db "XONIX " .dw begin,end-1,start start: ENEMY_X equ 9C40h ;40000 ENEMY_Y equ 9C41h ;40001 ENEMY_SPD_X equ 9C42h ;40002 ENEMY_SPD_Y equ 9C43h ;40003 MVI A, 4 STA ENEMY_X MVI A, 3 STA ENEMY_Y MVI A, 1 STA ENEMY_SPD_X MVI A, 1 STA ENEMY_SPD_Y MVI H,33 init1: MVI L,33 init2: PUSH H MOV A,L CPI 0 JZ init_put127 CPI 33 JZ init_put127 MOV A,H CPI 0 JZ init_put127 CPI 33 JZ init_put127 JMP init3 init_put127: MVI M, 127 ;(7F) JMP init4 ;Don't draw init3: MVI M,15 ;Temporary use 15 (0F) MOV A,L CPI 3 JM init5 ;Don't put 0 CPI 31 JP init5 ;Don't put 0 MOV A,H CPI 3 JM init5 ;Don't put 0 CPI 31 JP init5 ;Don't put 0 MVI M, 0 init5: CALL draw init4: POP H DCR L JP init2 DCR H JP init1 main_cycle: MVI A, 20 pause1: MVI B, 255 pause2: DCR B JNZ pause2 DCR A JNZ pause1 CALL enemy_move JMP main_cycle enemy_move: LDA ENEMY_X ;Draw empty MOV L,A LDA ENEMY_Y MOV H,A MVI M, 0 CALL draw CALL enemy_speed ;First attempt to move MOV A, M CPI 0 JZ en_mov_fin CALL enemy_speed ;Second attempt to move MOV A, M CPI 0 JZ en_mov_fin CALL enemy_speed ;Third attempt to move MOV A, M CPI 0 JZ en_mov_fin LDA ENEMY_X ;No move MOV L,A LDA ENEMY_Y MOV H,A en_mov_fin: MOV A,L ;Save position. Draw enemy STA ENEMY_X MOV A,H STA ENEMY_Y MVI M, 255 CALL draw RET enemy_speed: LDA ENEMY_X MOV L,A LDA ENEMY_Y MOV H,A LDA ENEMY_SPD_X ADD L MOV L, A LDA ENEMY_SPD_Y ADD H MOV H, A MOV A, M CPI 0 RZ MOV D,L LDA ENEMY_X ;====== MOV L,A ;Store B MOV B,M ;====== MOV L,D LDA ENEMY_Y ;====== MOV H,A ;Store C MOV C,M ;====== LDA ENEMY_X MOV L,A MOV A,B CMP C JZ back_xy CPI 0 JNZ back_y LDA ENEMY_SPD_X CALL speed_back STA ENEMY_SPD_X ADD L MOV L,A LDA ENEMY_SPD_Y ADD H MOV H, A RET back_xy: LDA ENEMY_SPD_X CALL speed_back STA ENEMY_SPD_X back_y: LDA ENEMY_SPD_Y CALL speed_back STA ENEMY_SPD_Y ADD H MOV H,A LDA ENEMY_SPD_X ADD L MOV L, A RET speed_back: CPI 1 JNZ speed_back1 MVI A, 255 RET speed_back1: MVI A, 1 RET draw: MOV B, M MVI A, 0 ;Video on OUT 0C2h ;Video on DCR L ;Coordinate -1 DCR H ;Coordinate -1 MOV A,L RLC MOV L,A MOV A,H RLC MOV H,A MVI A, 64 ADD H MOV H,A LXI D, 63 MVI A, 8 draw_cycle: MOV M, B INX H MOV M, B DAD D DCR A JNZ draw_cycle MVI A, 2 ;Video off OUT 0C2h ;Video off RET end: } |
Author: | als [ 04 May 2021, 10:31 ] |
Post subject: | Re: Учимся писать на MADL2021 |
Архивный файл с примером "MD01\Lviv Studio\LS5" будет выложен позже. Пожалуй данным примером, я завершу примеры для МАДЛ01, так как МАДЛ02 уже "дышет в спину"! Вчера начал подготовку для выложить_МАДЛ02_на_люди, оказалось не все так мрачно как думалось! Видимо, я "остыл" с тех пор когда последний раз его дорабатывал! Пока не хочу обещать, что будет и чего не будет в МАДЛ02 так как и сам не знаю окончательно, что в него войдет. Готовлю заключительный архив МАДЛ01, чтобы все, что было выложено до сих пор отдельными архивами, было в одном файле. Правда, тот архив будет скорее всего на хранилище с ограниченным временем хранение, если же я не придумаю, что-то другое. Посмотрим. |
Author: | als [ 04 May 2021, 11:07 ] |
Post subject: | Re: Учимся писать на MADL2021 |
При создании примеров для МАДЛ01, использовался "PC Lviv Studio" (Windows), автор которой, является Zelya, также использовалась примеры, которые публиковались в теме в теме "Ассемблер i8080: уроки, практика, ПК-01" форума https://www.old-games.ru ( Более подробно об этом здесь:viewtopic.php?f=8&t=397&p=5450#p5442 ) Автор МАДЛа выражает благодарность Zelya , его разработке "PC Lviv Studio" и его опубликованным примерам. По сути, брался пример компилировался "PC Lviv Studio", далее результат компиляции "PC Lviv Studio" ЛВТ-файл, декомпилировался декомпилятором MD01\LVTtoMD01M(e), ну а далее уже обработка названий меток шла в ручную. |
Author: | als [ 04 May 2021, 15:46 ] |
Post subject: | Re: Учимся писать на MADL2021 |
Внимание! Все, что есть на сегодняшний день по МАДЛу (и не только) все предыдущие архивы этой темы и новое, теперь будет в одном архиве! Этот архив далее будет базовым для будущих обновлений МАДЛа Размер распакованного архива = 13 888 151 байт. Распаковывать в корневой каталог диска "C:\" (папки "MADL2021", "MD00", "MD01") См здесь - viewtopic.php?f=20&t=394&p=5452#p5452 |
Page 1 of 1 | All times are UTC+03:00 |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |