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;
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;
...............
А далее написать процедуры с одним названием и "Overload;" для обработки разных типов (данных), - такого можна "нагородить" что вы даже себе не представляете!

Вот сейчас и обзор сделаю...

Например, принимаем "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,$......);
...........
VarArrayByte(abLevels{DATA уровни},'abLevels{DATA уровни}',ArrConstDATALEVELS);
VarByte, VarWord и т.д.

Ну и напоследок самое "вкусное" как по мне...
А как вам такое...
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/