PC-01 Lviv

It is currently 20 Apr 2024, 13:39

Forum Games WEB Tape Loader Twitter RSS

All times are UTC+03:00




Post new topic  Reply to topic  [ 12 posts ] 
Author Message
PostPosted: 03 May 2021, 16:46 
Offline

Joined: 18 May 2016, 19:55
Posts: 426
Поскольку я о своей разработке, которая МАДЛ, был почему-то не лучшего мнения, :-) то написав и выложив МАДЛ, я решил попробовать 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-файлов декомпиляторов и я думаю вы поймёте о чём это я! :-)


Top
   
PostPosted: 03 May 2021, 16:49 
Offline

Joined: 18 May 2016, 19:55
Posts: 426
Кратко о будущих возможностях МАДЛа.
Есть конечно 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 все сделает как надо!

И это все не фантазии мои! Это всё у меня реально работает!
Подготовлю выложу!
Когда нибудь... :-)


Top
   
PostPosted: 03 May 2021, 17:14 
Offline

Joined: 18 May 2016, 19:55
Posts: 426
Для начала "пробегусь" по примерам которые опубликовал 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 лвт-файлах. Список тех файлов есть в документации к МАДЛ.


Last edited by als on 04 May 2021, 10:58, edited 1 time in total.

Top
   
PostPosted: 03 May 2021, 17:40 
Offline

Joined: 18 May 2016, 19:55
Posts: 426
Пример "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
  }


Top
   
PostPosted: 03 May 2021, 17:52 
Offline

Joined: 18 May 2016, 19:55
Posts: 426
Пример "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
}




Top
   
PostPosted: 03 May 2021, 18:42 
Offline

Joined: 18 May 2016, 19:55
Posts: 426
Пример "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
}


Top
   
PostPosted: 03 May 2021, 19:42 
Offline

Joined: 18 May 2016, 19:55
Posts: 426
Пример "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
}


Top
   
PostPosted: 03 May 2021, 19:54 
Offline

Joined: 18 May 2016, 19:55
Posts: 426
Архив 4-х примеров (LS1 - LS4) опубликованных выше находятся в теме
MADL2021
viewtopic.php?f=20&t=394&p=5447#p5447


Top
   
PostPosted: 04 May 2021, 10:20 
Offline

Joined: 18 May 2016, 19:55
Posts: 426
Пример "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:

}



Top
   
PostPosted: 04 May 2021, 10:31 
Offline

Joined: 18 May 2016, 19:55
Posts: 426
Архивный файл с примером "MD01\Lviv Studio\LS5" будет выложен позже.
Пожалуй данным примером, я завершу примеры для МАДЛ01, так как МАДЛ02 уже "дышет в спину"! :-) Вчера начал подготовку для выложить_МАДЛ02_на_люди, оказалось не все так мрачно как думалось! :-) Видимо, я "остыл" с тех пор когда последний раз его дорабатывал! :-)
Пока не хочу обещать, что будет и чего не будет в МАДЛ02 так как и сам не знаю окончательно, что в него войдет.
Готовлю заключительный архив МАДЛ01, чтобы все, что было выложено до сих пор отдельными архивами, было в одном файле. Правда, тот архив будет скорее всего на хранилище с ограниченным временем хранение, если же я не придумаю, что-то другое.
Посмотрим.


Top
   
PostPosted: 04 May 2021, 11:07 
Offline

Joined: 18 May 2016, 19:55
Posts: 426
При создании примеров для МАДЛ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), ну а далее уже обработка названий меток шла в ручную.


Top
   
PostPosted: 04 May 2021, 15:46 
Offline

Joined: 18 May 2016, 19:55
Posts: 426
Внимание! Все, что есть на сегодняшний день по МАДЛу (и не только) :-)
все предыдущие архивы этой темы и новое, теперь будет в одном архиве!
Этот архив далее будет базовым для будущих обновлений МАДЛа
Размер распакованного архива = 13 888 151 байт.
Распаковывать в корневой каталог диска "C:\" (папки "MADL2021", "MD00", "MD01")

См здесь - viewtopic.php?f=20&t=394&p=5452#p5452


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 12 posts ] 

Forum Games WEB Tape Loader Twitter RSS

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
cron
Powered by phpBB® Forum Software © phpBB Limited