//// song = 18 positions
 
 
 
//// imported
 
PROC halt FORWARD();
 
PROC border FORWARD(BYTE col);
 
FUNC BYTE random FORWARD();
 
 
 
PROC pokenet FORWARD(BYTE row, BYTE col, BYTE data);
 
FUNC BYTE peeknet FORWARD(BYTE row, BYTE col);
 
PROC pokenetcolor FORWARD(BYTE row, BYTE col, BYTE data);
 
FUNC BYTE peeknetcolor FORWARD(BYTE row, BYTE col);
 
PROC testcube FORWARD();
 
PROC cubecolumn FORWARD();
 
FUNC BYTE getayreg FORWARD(BYTE reg);
 
PROC decay FORWARD();
 
PROC clearnet FORWARD();
 
PROC drawcubetexture FORWARD();
 
PROC jumpay FORWARD(BYTE tonereg, BYTE volreg, BYTE mask);
 
 
 
PROC prch FORWARD(UINT addr, CHAR c);
 
 
 
EXTERN UINT _timer;
 
 
 
////
 
 
 
VAR UINT _wastimer;
 
VAR UINT _curtimer;
 
VAR UINT _logicframes;
 
VAR UINT _textlogicframes;
 
 
 
VAR BOOL _frameready;
 
 
 
CONST BYTE _wid = 0x20;
 
CONST BYTE _hgt = 0x18;
 
CONST BYTE _scrhgt = 0x14;
 
 
 
CONST BYTE _netwid = 0x20;
 
CONST BYTE _nethgt = 0x20;
 
 
 
VAR PBYTE _net;
 
CONST BYTE _net35[768];
 
CONST BYTE _nettort[768];
 
/**= {
 
0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,B-L,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,
 
0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,LLL,0x4,BBB,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,
 
0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x0,0x4,0x3,0x4,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,
 
0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x0,0x4,0x2,0x2,0x2,0x4,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,
 
0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x0,0x4,0x1,0x1,0x1,0x1,0x1,0x4,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,
 
0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x0,0x4,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x4,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,
 
0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x0,0x4,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x4,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,
 
0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x0,0x4,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x4,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,
 
0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,LLL,0x4,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x4,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,
 
0x6,0x6,0x6,0x6,0x6,0x6,0x6,LLL,0x4,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x4,0x6,0x6,0x6,0x6,0x6,0x6,0x6,
 
0x0,0x0,0x0,0x0,0x0,0x0,T-L,0x4,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x4,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,
 
0x2,0x2,0x2,0x2,0x2,0x2,0x4,TTT,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x4,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,
 
0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x4,TTT,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x4,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,
 
0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x4,0x0,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x4,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,
 
0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x4,0x0,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x4,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,
 
0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x4,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x4,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,
 
0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x4,0x7,0x7,0x7,0x7,0x7,0x4,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,
 
0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x4,0x6,0x6,0x6,0x4,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,
 
0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x4,0x3,0x4,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,
 
0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x4,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,
 
0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,
 
0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,
 
0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,
 
0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6
 
};
 
*/
 
CONST UINT _netaddr = 0xd000; //запорчено ещё 256 байт ниже
 
//CONST UINT _net2addr = 0xd040;
 
CONST UINT _netcoloraddr = 0xd080;
 
CONST UINT _attrbuf = 0xf000;
 
CONST UINT _attrbuf2 = 0xf300;
 
 
 
VAR UINT _curattrbuf;
 
VAR UINT _readyattrbuf;
 
 
 
CONST BYTE _clBlue = 0x01;
 
CONST BYTE _clRed = 0x05;
 
 
 
VAR UINT _position;
 
VAR UINT _tact;
 
VAR UINT _quarter;
 
VAR BYTE _noteintact;
 
VAR BYTE _noteinquarter;
 
 
 
VAR BYTE _jump;
 
VAR BYTE _jumptime;
 
VAR BYTE _row;
 
VAR BYTE _picrow;
 
VAR BYTE _col;
 
//VAR BYTE _curhgt;
 
//VAR BOOL _backslash;
 
//VAR BOOL _rowstep;
 
//VAR BYTE _curcolor;
 
//VAR BYTE _oldcolor;
 
//VAR BYTE _y;
 
VAR UINT _addr;
 
 
 
VAR BYTE _stage;
 
VAR BYTE _wasstage;
 
 
 
VAR BYTE _dotext;
 
 
 
CONST PCHAR _text =
 
"It's a boy!!!                   "
 
"                       Ho-ho!   "
 
"        Hello, LVD!             "
 
"                                "
 
 
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
 
 
" ALONE CODER, SAND, NQ & others "
 
"       WISH U ALL DA BEST!      "
 
"    b  happy, don't  worry      "
 
"          und HBD!!             "
 
 
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
 
 
" This iz the first demo made in "
 
"            NedoLang            "
 
"da  programming  system         "
 
"            of  da  future ;)   "
 
 
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
 
 
"        okay                    "
 
"    some     wishes             "
 
"          right       now       "
 
"                 !!!            "
 
 
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
 
 
"SAND/MAYhEM:\n"
 
"Ну что!  С  Днюшечкой,   Бро!!! "
 
"Ты  стал   уже  совсем  большой "
 
" и сам знаешь,  что тебе нужно! "
 
 
 
" Вот именно этого тебе и желаю!!"
 
"А от себя  лично  пожелаю  тебе "
 
"стандартный  набор   из счастья,"
 
"успехов, здоровья и, конечно же,"
 
 
 
" какую-нибудь дельную хрень типа"
 
"лазерного   мешка    или  робота"
 
"   |   | на  батарейках,  |   | "
 
" | чтоб  пиликал  и   катался!  "
 
 
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
 
 
"NQ/SKRJU:                       "
 
"Вадя,   пишу  тебе  из  вот этих"
 
"своих  жарких  югов  в эту  твою"
 
"Москву!  Тебе   и твоим близким,"
 
 
 
"чтобы  хорошо  было  и  все друг"
 
"другу  улыбались  и  радовались,"
 
"потому  что  хорошие люди вокруг"
 
"и  ничего  не  болит ни  у кого,"
 
 
 
"а один  лишь достаток и радость,"
 
"  | вот  такая |   |   |   |   |"
 
"           прошивка-установка!  "
 
"  |   ! ! !|   |   |   |   |   |"
 
 
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
 
 
"ALONE CODER/Conscience:         "
 
"   Желаю,    чтобы    схемы     "
 
"всегда  разводились  с  первой  "
 
"             попытки,           " 
 
 
 
"cигналы всегда успевали вовремя,"
 
"эффекты кодились  самые быстрые," 
 
"а  пакер  паковал  круче  всех! " 
 
"   |   |   |   | ...            "
 
 
 
"    ...            И на всё это "
 
"хватало времени до, после       "
 
"              и вместо работы :)"
 
"     ! ! !                      "
 
 
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
 
 
"LOUISA/Conscience:              "
 
"Поздравляю тебя с днём рождения,"
 
"     наш   дорогой   LVD!    :) "
 
"  Всего самого расчудесного  и  "
 
 
 
" привлекательного!   Счастья,   "
 
"     здоровья и всего того, что "
 
"пожелаешь  сам!  Достатка       "
 
"    финансов, творческих идей   "
 
 
 
"и  времени  на  их  исполнение! "
 
"Ах да, карапузиков в твой дом!:)"
 
"                 Ура!           "
 
"           ! ! !                "
 
 
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
 
 
"HIPPIMAN/Conscience:            "
 
" Я тоже  хочу  присоединиться  к"
 
"   всеобщим    поздравлениям.   "
 
" Не, ну  а  как  не  поздравить "
 
 
 
" человека, который  даровал миру"
 
" |   |   | BASECONF!  |   |   | "
 
" Вадим,   всяческих благ  тебе, "
 
"  здоровья  и  побольше денег.  "
 
 
 
"Денег столько, чтобы у тебя было"
 
" побольше свободного  времени и "
 
"ты мог посвятить  его творчеству"
 
"и  новым  разработкам,  которыми"
 
 
 
" |   радовал  бы  уже  нас,|   |"
 
" | простых любителей Спекки :)  "
 
" |   |   |  ! ! ! |   |   |   | "
 
"   |   |   |   |   |   |   |   |"
 
 
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
 
 
"FYREX/MhM:                      "
 
"        Всего наилучшего!       " 
 
"   И поддерживай отечественную  " 
 
"          демосцену ! )         "
 
 
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
 
 
"DIMON\"ШМЕЛЕ\"MEDVED-ER:          "
 
"Сколково, инновации... руссиано "
 
"            ...                 "
 
"      НAHOтехнологии, знаете ли!"
 
 
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
 
 
"-HBD---#-----#---#--###---------"
 
"-------#-----#---#--#--#--------"
 
"-------#------#-#---#---#-------"
 
"-------#####---#----####----!!!-"
 
 
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
 
 
"idea .... ALONE CODER & SAND/MhM"
 
"kodes .............. ALONE CODER"
 
"soundtrakk ............ NQ/SKRJU"
 
"some gfx, etc ......... SAND/MhM"
 
 
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
 
 
"                                "
 
"                                "
 
"                                "
 
"          read  again?!         "
 
 
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
"   |   |   |   |   |   |   |   |"
 
;
 
//" Und now play-on da Allegrowa's "
 
//"song  'S Dnem Rozhdenija!' )))))"
 
//"  start  dancin' and boozein'   "
 
//"make volumemax! komon! doit now!"
 
 
 
 
 
/**
 
PROC pokenet(BYTE _row, BYTE _col, BYTE data)
 
{
 
  POKE *(PBYTE)(_netaddr + ((UINT)_row<<8) + (UINT)_col) = data;
 
}
 
 
 
FUNC BYTE peeknet(BYTE _row, BYTE _col)
 
{
 
  RETURN *(PBYTE)(_netaddr + ((UINT)_row<<8) + (UINT)_col);
 
}
 
 
 
PROC pokenetcolor(BYTE _row, BYTE _col, BYTE data)
 
{
 
  POKE *(PBYTE)(_netcoloraddr + ((UINT)_row<<8) + (UINT)_col) = data;
 
}
 
 
 
FUNC BYTE peeknetcolor(BYTE _row, BYTE _col)
 
{
 
  RETURN *(PBYTE)(_netcoloraddr + ((UINT)_row<<8) + (UINT)_col);
 
}
 
*/
 
/**
 
PROC testcube()
 
{
 
VAR BYTE hgt;
 
 
 
      //определяем цвет и двигаем _row (_col)
 
      //если hgt==_curhgt, то пол и _row++ (_col--)
 
      //если hgt>_curhgt, то стена
 
      //если hgt<_curhgt, то _row++ (_col--) и крутимся
 
      //_row,_col указывают на то, что мы видим в этой клетке, или на яму
 
        IF (_rowstep != _backslash) { //чётность не соответствует, так что границы не будет
 
          _curcolor = _oldcolor;
 
          //_curhgt++;
 
        }ELSE { //чётность соответствует
 
 
 
         invisloop:
 
          IF (_rowstep) { // \ - пересечение _row, дальше идём по _col
 
            hgt = peeknet(_row, _col);
 
            IF (hgt==_curhgt) { //пол (только при правильной чётности!)
 
              IF (_rowstep==_backslash) {
 
                _curcolor = peeknetcolor(_row, _col); //clWhite; //новый наравне
 
                DEC _col;
 
                _rowstep = !_rowstep;
 
              }ELSE {
 
                IF (_oldcolor != _clBlue) _curcolor = _clRed; //новый выше
 
              };
 
            }ELSE IF (hgt>_curhgt) { //стена пересечение _row
 
              IF (_oldcolor != _clBlue) _curcolor = _clRed; //новый выше
 
              IF (_rowstep==_backslash) INC _curhgt;
 
              //теперь чётность _rowstep может не соответствовать _backslash!
 
            }ELSE { //яма
 
              DEC _col;
 
              _rowstep = !_rowstep;
 
              IF (_rowstep==_backslash) {
 
                DEC _curhgt;
 
              };
 
              goto invisloop;
 
            };
 
          }ELSE { // / - пересечение _col, дальше идём по _row
 
            hgt = peeknet(_row, _col);
 
            IF (hgt==_curhgt) { //пол (только при правильной чётности!)
 
              IF (_rowstep==_backslash) {
 
                _curcolor = peeknetcolor(_row, _col); //clWhite; //новый наравне
 
                INC _row;
 
                _rowstep = !_rowstep;
 
              }ELSE {
 
                IF (_oldcolor != _clRed) _curcolor = _clBlue; //новый выше
 
              };
 
            }ELSE IF (hgt>_curhgt) { //стена пересечение _col
 
              IF (_oldcolor != _clRed) _curcolor = _clBlue; //новый выше
 
              IF (_rowstep==_backslash) INC _curhgt;
 
              //теперь чётность _rowstep может не соответствовать _backslash!
 
            }ELSE { //яма
 
              INC _row;
 
              _rowstep = !_rowstep;
 
              IF (_rowstep==_backslash) {
 
                DEC _curhgt;
 
              };
 
              goto invisloop;
 
            };
 
          }; //!_rowstep
 
 
 
        }; //_rowstep==_backslash
 
}
 
*/
 
/**
 
PROC cubecolumn()
 
{
 
VAR BYTE b;
 
    _curhgt = 0x00;
 
    _backslash = (((BYTE)_addr&0x02)==0x00); //_backslash - пересечение _row
 
    _rowstep = _backslash;
 
    _oldcolor = 0x07;
 
    _y = _hgt;
 
    REPEAT {
 
      testcube();
 
      //_row,_col указывают на то, что мы видим в следующей клетке, или на яму
 
      //чётность _rowstep должна соответствовать _backslash, кроме случая, когда нашли стену
 
 
 
      //рисуем цвет
 
      IF (_y <= _scrhgt) {
 
        b = (_curcolor<<0x03) + _oldcolor;
 
        POKE *(PBYTE)(_addr) = b;
 
        POKE *(PBYTE)(_addr+1) = b;
 
      };
 
      _addr = _addr - 0x0020;
 
      _oldcolor = _curcolor;
 
      _backslash = !_backslash; //привязано к "y"
 
      DEC _y;
 
    }UNTIL (_y == 0x00);
 
}
 
*/
 
PROC fillworm()
 
{
 
      _picrow = 0x04/**0x00*/;
 
      WHILE (_row < 0x15) {
 
        pokenet(_row, _col, 0x01);
 
        pokenetcolor(_row, _col, _net[((UINT)_picrow<<5)+ (UINT)_col + 31]);
 
        INC _row;
 
        INC _picrow;
 
      };
 
};
 
 
 
PROC fillwormforth()
 
{
 
      _picrow = 0x00;
 
      WHILE (_row < 0x15) {
 
        pokenet(_row, _col, 0x01);
 
        pokenetcolor(_row, _col, _net[((UINT)_picrow<<5)+ (UINT)_col + 31]);
 
        INC _row;
 
        INC _picrow;
 
      };
 
};
 
 
 
PROC fillwormback()
 
{
 
      _picrow = 0x13;
 
      WHILE (_row != 0xff) {
 
        pokenet(_row, _col, 0x01);
 
        pokenetcolor(_row, _col, _net[((UINT)_picrow<<5)+ (UINT)_col + 31]);
 
        DEC _row;
 
        DEC _picrow;
 
      };
 
};
 
 
 
PROC clearworm()
 
{
 
      _row = 0x01;
 
      WHILE (_row < 0x16) {
 
        pokenet(_row, _col, 0x00);
 
        pokenetcolor(_row, _col, 0x00);
 
        INC _row;
 
      };
 
};
 
 
 
PROC unfillworm()
 
{
 
VAR BYTE c;
 
VAR BYTE cnew;
 
VAR BYTE h;
 
VAR BYTE hnew;
 
      _row = 0x00;
 
      h = 0x00;
 
      c = 0x00;
 
      WHILE (_row < 0x16) {
 
        hnew = peeknet(_row, _col);
 
        cnew = peeknetcolor(_row, _col)
 
        pokenet(_row, _col, h);
 
        pokenetcolor(_row, _col, c);
 
        h = hnew;
 
        c = cnew;
 
        INC _row;
 
      };
 
};
 
 
 
PROC unfillwormback()
 
{
 
VAR BYTE c;
 
VAR BYTE cnew;
 
VAR BYTE h;
 
VAR BYTE hnew;
 
      _row = 0x16;
 
      h = 0x00;
 
      c = 0x00;
 
      WHILE (_row != 0xff) {
 
        hnew = peeknet(_row, _col);
 
        cnew = peeknetcolor(_row, _col)
 
        pokenet(_row, _col, h);
 
        pokenetcolor(_row, _col, c);
 
        h = hnew;
 
        c = cnew;
 
        DEC _row;
 
      };
 
};
 
/**
 
PROC jumpay(BYTE tonereg, BYTE volreg, BYTE mask)
 
{
 
VAR UINT frq;
 
VAR BYTE vol;
 
VAR INT x;
 
VAR BYTE y;
 
VAR BYTE hgt;
 
  frq = (UINT)getayreg(tonereg) + ((UINT)getayreg(tonereg+0x01)<<8);
 
  IF ((getayreg(0x07)&mask)!=mask) {
 
    vol = getayreg(volreg);
 
    IF       (vol>=0x10) {vol = 0x04;
 
    }ELSE IF (vol==0x0f) {vol = 0x06;
 
    }ELSE IF (vol==0x0e) {vol = 0x05;
 
    }ELSE IF (vol==0x0d) {vol = 0x04;
 
    }ELSE IF (vol==0x0c) {vol = 0x03;
 
    }ELSE IF (vol==0x0b) {vol = 0x02;
 
    }ELSE IF (vol>=0x09) {vol = 0x01;
 
    }ELSE vol = 0x00;
 
  }ELSE vol = 0x00;
 
  IF (volreg!=0x09) vol = vol + vol; //low center, high left&right
 
  frq = frq + 8; //против бесконечного цикла
 
  y = 0x02;
 
  WHILE (frq < 1000) {
 
    frq = frq + (frq >> 2);
 
    INC y;
 
  };
 
  IF (volreg == 0x08) {
 
    x = - (INT)(y>>0x02);
 
  }ELSE IF (volreg == 0x0a) {
 
    x = (INT)(y>>0x02);
 
  }ELSE x = -0;
 
  _row = (BYTE)((INT)y + x);
 
  //IF ((_row<0x02)||(_row>=0x40)) _row = 0x02;
 
  _col = 0x19 - (BYTE)((INT)y - x);
 
  //IF ((_col<0x02)||(_col>=0x40)) _col = 0x02;
 
  hgt = peeknet(_row, _col);
 
  IF (hgt < vol) {
 
    pokenet(_row, _col+0x40, vol);
 
  }; //ELSE pokenet(_row, _col, hgt-0x01);
 
}
 
*/
 
PROC demo()
 
{
 
VAR PCHAR ptxt;
 
VAR CHAR c;
 
VAR UINT scrtxt;
 
VAR UINT addry;
 
VAR UINT addr;
 
VAR UINT addrbase;
 
VAR BYTE x;
 
VAR BYTE y;
 
VAR BYTE suby;
 
VAR BYTE b;
 
VAR UINT w;
 
VAR BYTE hgt;
 
VAR BOOL cleared;
 
 
 
  _readyattrbuf = _attrbuf;
 
  
 
  _wastimer = _timer;
 
//  border(0x00);
 
/**
 
  y = 0x00;
 
  WHILE (y < _scrhgt) {
 
    x = 0x00;
 
    WHILE (x < _wid) {
 
      addr = _attrbuf + ((UINT)y<<5) + (UINT)x;
 
      POKE *(PBYTE)(addr) = 0x00;
 
      INC x;
 
    };
 
    INC y;
 
  };
 
  WHILE (y < _hgt) {
 
    x = 0x00;
 
    WHILE (x < _wid) {
 
      addr = _attrbuf + ((UINT)y<<5) + (UINT)x;
 
      POKE *(PBYTE)(addr) = 0x07;
 
      INC x;
 
    };
 
    INC y;
 
  };
 
*/
 
/**
 
  addr = _netaddr;
 
  _row = 0x00;
 
  WHILE (_row < _nethgt) {
 
    _col = 0x00;
 
    WHILE (_col < _netwid) {
 
      pokenet(_row, _col, random()&0x03);
 
      pokenetcolor(_row, _col, (_row&0x07)|0x04);
 
      INC _col;
 
    };
 
    INC _row;
 
  };
 
*/
 
//draw cube texture  
 
  //drawcubetexture();
 
/**
 
  addr = 0x4000;
 
  y = 0x00;
 
  WHILE (y < _scrhgt) {
 
    addry = 0x4000 + ((UINT)y<<5)&0x00e0 + ((UINT)y<<8)&0x1800;
 
    x = 0x00;
 
    WHILE (x < _wid) {
 
      addr = addry + (UINT)x;
 
      IF ((((x>>0x01)^y)&0x01) == 0x00) {
 
        w = 0x0001;
 
        suby = 0x00;
 
        WHILE (suby < 0x08) {
 
          POKE *(PBYTE)(addr) = (BYTE)(w>>8);
 
          POKE *(PBYTE)(addr+1) = (BYTE)w;
 
          w = (w<<2) + 0x0003;
 
          addr = addr + 0x0100;
 
          INC suby;
 
        };
 
      }ELSE {
 
        w = 0x8000;
 
        suby = 0x00;
 
        WHILE (suby < 0x08) {
 
          POKE *(PBYTE)(addr) = (BYTE)(w>>8);
 
          POKE *(PBYTE)(addr+1) = (BYTE)w;
 
          w = (w>>2) + 0xc000;
 
          addr = addr + 0x0100;
 
          INC suby;
 
        };
 
      };
 
      x = x + 0x02;
 
    };
 
    INC y;
 
  };
 
*/
 
  scrtxt = 0x5080;
 
  ptxt = _text;
 
  _dotext = 0x00;
 
 
 
//  _frameready = +FALSE;
 
  
 
  cleared = +TRUE;
 
  
 
  _jumptime = 0x00;
 
  
 
  _net = _net35;
 
 
 
  _stage = 0x00;
 
 
 
loop:
 
  
 
  //halter();
 
 
 
  IF (!_frameready) {
 
    x = 0x00;
 
    _curattrbuf = _attrbuf + _attrbuf2 - _readyattrbuf;
 
    addrbase = _curattrbuf + ((UINT)(_scrhgt-0x01)<<5);
 
    IF (_jumptime!=0x00) {_jump = 0x01;
 
    }ELSE _jump = 0x00;
 
    WHILE (x < _wid) {
 
      _col = 0x12 + (x>>0x02) + _jump;
 
      _row = (x>>0x02) - _jump; //0
 
      _addr = addrbase + (UINT)x;
 
      cubecolumn();
 
      x = x + 0x02;
 
    };
 
    IF (_jumptime!=0x00) DEC _jumptime;
 
    _frameready = +TRUE;
 
    _readyattrbuf = _curattrbuf;
 
  };
 
  
 
  _curtimer = _timer; //однократное чтение гарантирует синхронность
 
  _logicframes = _curtimer - _wastimer;
 
  _textlogicframes = _curtimer - _wastimer;
 
  WHILE (_logicframes != 0) {
 
    _wasstage = _stage;
 
    _quarter = _wastimer / 12;
 
    _tact = _quarter >> 2;
 
    _position = _tact >> 2;
 
    _stage = (BYTE)(_position - (_position/18)*18);//(_tact >> 2)&0x0f; //song = 18 positions
 
    _noteintact = (BYTE)(_wastimer - (_tact * 48)); //max 47
 
    _noteinquarter = (BYTE)(_wastimer - (_quarter * 12)); //max 11
 
    IF (_stage == 0x00) { //очистка колбасками
 
 
 
      IF (cleared) {
 
        _row = 0x00;
 
        WHILE (_row < _nethgt) {
 
          _col = 0x00;
 
          WHILE (_col < _netwid) {
 
            pokenet(_row, _col, 0x01);
 
            INC _col;
 
          };
 
          INC _row;
 
        };
 
        cleared = +FALSE;
 
        _col = 0x06; 
 
        clearworm();
 
        _col = 0x07; 
 
        clearworm();
 
        IF (_net == _net35) {_net = _nettort;
 
        }ELSE _net = _net35;
 
      };
 
      _col = 0x08 + ((BYTE)_quarter & 0x0f); 
 
      IF ((_col&0x01)==0x00) {
 
        _row = 0x0b - (_noteinquarter & 0x0f);
 
        unfillworm();
 
        unfillworm();
 
      }ELSE {
 
        _row = 0x08 + (_noteinquarter & 0x0f);
 
        unfillwormback();
 
        unfillwormback();
 
      };
 
      
 
    }ELSE IF (_stage < 0x04) { //очистка и заполнение кубиками
 
      IF (!cleared) {
 
        clearnet();
 
        cleared = +TRUE;
 
      };
 
      IF ((_noteinquarter == 0x00)&&(((BYTE)_quarter&0x01)==0x00)) {
 
        badrnd:
 
        x = (random()&0x07) + 0x01;// + 0x01; // + (random()&0x01); //0x00..0x10
 
        y = (random()&0x07) + 0x01;// + 0x08; //0x08..0x18
 
        _row = 0x00 + y + x; // + random()&0x01;
 
        _col = 0x0f - y + x + random()&0x01;
 
        IF (peeknet(_row, _col) == 0x01) goto badrnd;
 
        IF (peeknet(_row+0x01, _col) == 0x01) goto badrnd;
 
        IF (peeknet(_row, _col+0x01) == 0x01) goto badrnd;
 
        IF (peeknet(_row-0x01, _col) == 0x01) goto badrnd;
 
        IF (peeknet(_row, _col-0x01) == 0x01) goto badrnd;
 
        pokenet(_row, _col, 0x01);
 
        pokenetcolor(_row, _col, 0x07);
 
      };
 
    }ELSE IF (_stage == 0x04) { //медленное заполнение колбасками
 
      //pokenet(0x0a, 0x07, 0x01); //top left
 
      //pokenetcolor(0x0a, 0x07, _netpic[((UINT)0x0a<<5)+ (UINT)0x07]);
 
      IF (_wasstage != _stage) {
 
        _col = 0x06; 
 
        _row = 0x04/**0x00*/;
 
        fillworm();
 
        _col = 0x07; 
 
        _row = 0x04/**0x00*/;
 
        fillworm();
 
      };
 
      _col = 0x08 + ((BYTE)_tact & 0x03); 
 
      _row = 0x0f/**0x0b*/ - ((_noteintact>>0x2) & 0x0f);
 
      fillworm();
 
    }ELSE IF (_stage == 0x05) { //быстрое дозаполнение колбасками
 
      _col = 0x08 + 0x04 + ((BYTE)_quarter & 0x0f); 
 
      IF ((_col&0x01)==0x00) {
 
        _row = 0x0b - (_noteinquarter & 0x0f);
 
        fillwormforth();
 
      }ELSE {
 
        _row = 0x08 + (_noteinquarter & 0x0f);
 
        fillwormback();
 
      };
 
      cleared = +TRUE;
 
    }ELSE IF (_stage < 0x08) { //прыгающая доска
 
      IF (cleared) {
 
        _row = 0xff;
 
        WHILE (_row != _nethgt) {
 
          _col = 0x00;
 
          WHILE (_col != _netwid) {
 
            pokenet(_row, _col, 0x01);
 
            IF (_row == 0xff) pokenetcolor(_row, _col, 0x04);
 
            INC _col;
 
          };
 
          INC _row;
 
        };
 
        cleared = +FALSE;
 
      };
 
      IF ((_noteinquarter == 0x00)&&(((BYTE)_quarter&0x01)==0x00)) {
 
        _jumptime = 0x04;
 
      };
 
    }ELSE IF (_stage < 0x0a) { //заваливание квадратами
 
        x = (random()&0x0f) + 0x01;// + 0x01; // + (random()&0x01); //0x00..0x10
 
        y = (random()&0x0f) + 0x00;// + 0x08; //0x08..0x18
 
        _row = 0x00 + y + x;
 
        _col = 0x10 - y + x;
 
        hgt = peeknet(_row, _col);
 
        IF ((random()&0x01) == 0x00) {
 
          IF (hgt!=0x00) DEC hgt;
 
        }ELSE INC hgt;
 
        pokenet(_row, _col, hgt);
 
        pokenet(_row+0x01, _col, hgt);
 
        pokenet(_row, _col+0x01, hgt);
 
        pokenet(_row+0x01, _col+0x01, hgt);
 
    }ELSE /**IF (_stage < 0x0f)*/ { //анализатор музыки
 
 
 
      IF (!cleared) {
 
        _row = 0x00;
 
        WHILE (_row < _nethgt) {
 
          _col = 0x00;
 
          WHILE (_col < _netwid) {
 
            pokenet(_row, _col+0x40, 0x01);
 
            pokenet(_row, _col+0xc0, 0x01);
 
            INC _col;
 
          };
 
          INC _row;
 
        };
 
        cleared = +TRUE;
 
      };
 
/**
 
  _row = 0x01;
 
  WHILE (_row < 0x13) {
 
    _col = 0x04;
 
    WHILE (_col < 0x18) {
 
      hgt = peeknet(_row, _col)+0x01;
 
      IF       (hgt < peeknet(_row+0x01, _col)) {pokenet(_row, _col+0x40, hgt);
 
      }ELSE IF (hgt < peeknet(_row, _col-0x01)) {pokenet(_row, _col+0x40, hgt);
 
 
 
      }ELSE IF (hgt < peeknet(_row-0x01, _col)) { pokenet(_row, _col+0x40, hgt);
 
      }ELSE IF (hgt < peeknet(_row, _col+0x01)) { pokenet(_row, _col+0x40, hgt);
 
      //}ELSE IF (hgt == peeknet(_row+0x01, _col)) {
 
      //}ELSE IF (hgt == peeknet(_row, _col-0x01)) {
 
      }ELSE IF (hgt != 0x01) {pokenet(_row, _col+0x40, hgt-0x02);
 
      }ELSE pokenet(_row, _col+0x40, hgt-0x01);
 
      INC _col;
 
    };
 
    INC _row;
 
  };
 
    
 
  _row = 0x01;
 
  WHILE (_row < 0x13) {
 
    _col = 0x04;
 
    WHILE (_col < 0x18) {
 
      pokenet(_row, _col, peeknet(_row, _col+0x40));
 
      INC _col;
 
    };
 
    INC _row;
 
  };
 
*/
 
      jumpay(0x00, 0x08, /**mask*/0x09);
 
      jumpay(0x02, 0x09, /**mask*/0x12);
 
      jumpay(0x04, 0x0a, /**mask*/0x24);
 
      IF ((_noteinquarter&0x01) == 0x00) {
 
        decay();
 
        goto quitlogic;
 
      };
 
    };
 
  
 
    
 
    INC _wastimer;
 
    DEC _logicframes;
 
    //_logicframes = 0;
 
  };
 
quitlogic:
 
  _wastimer = _curtimer;
 
 
 
  WHILE (_textlogicframes != 0) {
 
    INC _dotext;
 
    IF ((_dotext&0x03) == 0x00) {
 
  REPEAT {
 
    c = *(PCHAR)ptxt;
 
    IF (c == '\n') {
 
      scrtxt = (scrtxt&0xffe0) + 0x0020;
 
    }ELSE IF (c == '|') {
 
      prch(scrtxt, ' ');
 
      INC scrtxt;
 
    }ELSE {
 
      prch(scrtxt, c);
 
      INC scrtxt;
 
    };
 
    IF (scrtxt >= 0x5100) scrtxt = 0x5080;
 
    INC ptxt; IF (*(PCHAR)ptxt == '\0') ptxt = _text;
 
  }UNTIL (c != ' ');
 
    };
 
    DEC _textlogicframes;
 
  };
 
  
 
  goto loop;
 
}