ок
компилирую для запуска с адреса 24676
Код:
unsigned char asm_dat[512];
unsigned char asm_filename[9];
unsigned short asm_len;
static unsigned asm_adres;
void tr_dos_load (char *filename,char* dest)
{
	sprintf(asm_filename,"%s",filename);
	asm_adres=asm_dat[0];
	asm_len=0;
	#asm

	

    IM   1
	.LOAD
		call 	15649 
		ld c,0
		CALL   15635
        CALL   SET_NAMEL   ; готовим сист.
                         ; переменные
       LD     C,10       ; ищем файл
       CALL   15635
       LD     A,C
       BIT    7,C
	   JR     Z,LD_1
	   jp ext
       RET
    
		
	.LD_1                     ; грузим...
       LD     A,C
       LD     C,8
       CALL   15635
       XOR    A
       LD     (23801),A
       LD     (23824),A
	   LD	  A,3
	   LD     HL,(_asm_adres)
       LD     C,14
       CALL   15635
	   
       JP	ext
	.SET_NAMEL
     LD     HL,_asm_filename    ; перекидываем
       LD     DE,23773   ; имя файла
       LD     BC,8
       LDIR
       LD     A,67    ; тип файла м.б.
       LD     (23781),A  ; любой, кроме
       LD     A,9        ; поиск файла
       LD     (23814),A  ; по 9 символам
       RET
	 .ext
	IM	2
	
	#endasm
	sprintf(dest,"%s",asm_dat);
	printf("%d",asm_dat[0]);
	sp_WaitForKey();
}
сама функция. Вызов call 15649 , подготавливает переменные. Я правильно понимаю?
Код:
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <sound.h>
#include <game.h>
#include <malloc.h>
extern uchar boxx[];
extern uchar *lastk;          /* system variable LAST_K */
#asm
   ._lastk  defw 23560;
#endasm 
#pragma output STACKPTR=61439
struct window mine;     /* Window structure */



void *my_malloc(uint bytes)
{
   return sp_BlockAlloc(0);
}
void *u_malloc = my_malloc;
void *u_free = sp_FreeBlock; 

int clock_isr(void)
{
 ....
 ....
}
  struct sp_SS *tmp;
  
  uint key_left, key_right, key_up, key_down,key_pause,x,y,lx,ly,a,b,c,kn;
  
  struct figure fg;
  struct game_field fld;
  short sx,sy;
  uchar rotflag;
  uchar kl='o';
  uchar kr='p';
  uchar ku='q';
  uchar kdd='a';
  uchar kp=' ';
uchar main_menu()
{
		uchar buf[32];
	uchar lvl[512];
	uchar a,b,c,d,submenu,curspeed,keypressed;
	uint ka,kb,kc,kd,ke,k1,k2,k3,k4,k5,k6,k7,k8,k9,k0,chkk,chkh;
	ka = sp_LookupKey('a');
	kb = sp_LookupKey('b');
	kc = sp_LookupKey('c');
	kd = sp_LookupKey('d');
	ke = sp_LookupKey('e');
	kn = sp_LookupKey('n');
	chkk=sp_LookupKey('k');
	chkh=sp_LookupKey('h');
	
	k1 = sp_LookupKey('1');
	k2 = sp_LookupKey('2');
	k3 = sp_LookupKey('3');
	k4 = sp_LookupKey('4');
	k5 = sp_LookupKey('5');
	k6 = sp_LookupKey('6');
	k7 = sp_LookupKey('7');
	k8 = sp_LookupKey('8');
	k9 = sp_LookupKey('9');
	k0 = sp_LookupKey('0');
	tr_dos_load("level   ",lvl); // этот вызов срабатывает

	sp_Border(BLACK); 
	ps.bounds = sp_ClipStruct;
	ps.colour=PAPER_BLACK|INK_WHITE|BRIGHT;
	ps.colour=PAPER_BLACK|INK_WHITE|BRIGHT;
	sp_ComputePos(&ps, 7,2);
	sp_PrintString(&ps, "tetris 2 returns"); 
	sp_ComputePos(&ps, 10,4);
	sp_PrintString(&ps, "main menu"); 
	
	sp_ComputePos(&ps, 7,10);
	sp_PrintString(&ps, "a: new game"); 
	sp_ComputePos(&ps, 7,12);
	sp_PrintString(&ps, "b: set controll"); 
	sp_ComputePos(&ps, 7,14);
	sp_PrintString(&ps, "c: enter password"); 
	sp_ComputePos(&ps, 7,16);
	sp_PrintString(&ps, "d: select speed"); 
	sp_ComputePos(&ps, 7,18);
	sp_PrintString(&ps, "e: autorepeat"); 
	if(autorepeat==0)
	{
		sp_PrintString(&ps, " false"); 
	}
	else
	{ 
		sp_PrintString(&ps, " true"); 
	}
	c=1;
	d=0;
	submenu=0;
	curspeed=255;

	tr_dos_load("level   ",lvl); // а на этом вызове уже слетает
	....
        тут уже не работает
        ....
}
main()
{
 
   uchar a,cntr;
   uint kk1;
   
   #asm
   di
   #endasm
   sp_InitIM2(0xf1f1);
   sp_CreateGenericISR(0xf1f1);
   sp_RegisterHookLast(255, clock_isr); 
   #asm
   ei
   #endasm
   time.lspd=8;
   
   sp_Initialize(bgcolor, ' ');
    prepare_tile(&fg);
   //-----------------

   unlimited_lives=0;
   autorepeat=1;
   while(1) 
   {
   fld->lives=3;
   fld->cur_level=1;
   main_menu();
...
дальше неинтересно