а стек где? и код где?
а переменные ДОС инициализированны?
память до #6100 лучше не трогать
Вид для печати
а стек где? и код где?
а переменные ДОС инициализированны?
память до #6100 лучше не трогать
ок
компилирую для запуска с адреса 24676
сама функция. Вызов call 15649 , подготавливает переменные. Я правильно понимаю?Код: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();
}
Код:#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();
...
дальше неинтересно
может не мучаться, а сделать через функцию чтения сектора?, вычитываешь каталог, ищешь файл, находишь трек/сайд/сектор и читаешь по секторам...
Друг, ты забыл сохранять перед вызовом доса HL`
После возврата восстановить.
ex hl,hl`
push hl
call 15635
pop hl
ex hl,hl`
Ну типа того...
---------- Post added at 21:15 ---------- Previous post was at 20:53 ----------
Ага, только она один раз вызывается в самом начале( если, конечно не затираешь область сис переменных потом)
второй раз вызывать её не обязательно.
дальнейшее изучение показало, что :
вешается на любом вызове функции 15635
после вызова функции sp_PrintString из движка spritepack. У меня есть ее исходники, но асм я еще практически совсем не знаю. Выложить их сюда?
Все! Разобрался. Эта функция меняла данные в IY. Вернул туда 23610 и все заработало.