Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Программирование (http://zx-pk.ru/forumdisplay.php?f=14)
-   -   Чтение файла в tr-dos (http://zx-pk.ru/showthread.php?t=16902)

hippiman 27th September 2011 10:34

Чтение файла в tr-dos
 
Прошу помощи. Пишу на z88dk и только начал изучать ассемблер. Потребовалось мне сделать загрузку файлов с дискетки. Т.к. ни в z88dk ни в spritepack подобных функций я не нашел, то пришлось вооружаться поиском, книгами и получилось вот это
Code:

void tr_dos_load (char *filename,char* dest)
{
        sprintf(asm_filename,"%s",filename);
        asm_adres=&asm_dat[0];
        asm_len=0;
        #asm
        di
        .LOAD
        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
        ei
        #endasm
        sprintf(dest,"%s",asm_dat);
}

С выключенными прерываниями функция работает, но когда я включаю прерывания функцией sp_InitIM2(0xf1f1) сбрасывает спектрум при обращении. Помогите мне разобраться что не так и довести ее в работоспособное состояние.

jerri 27th September 2011 11:34

при обращении к ТР-Дос и переходе по адресу #3dхх происходит подключение РОМ ТРДос
Далее происходит отработка программы именно в этом РОМе
при приходе прерывания РОМ ТРдос отключается и соответственно
возвращение из Прерывания происходит непоймикуда и потому РЕСЕТ!

null_device 27th September 2011 11:36

Как было написано в книге Ларченко-Родионова (стр. 196). Работа tr-dos с прерываниями реализована плохо (точнее, никак не реализована). В частности, это относится к работе во втором режиме прерывания (насколько я понял, речь шла о im2).
Проблема в "аппаратном переключении" ПЗУ tr-dos в стандартное ПЗУ sos (стандартное spectrum ПЗУ) в момент прихода прерывания. И его "невозврат" в tr-dos по завершении обработки прерывания (т.е. вместо выполнения кода tr-dos будет выполняться, что-то из sos). В книге, для корректной работы в режиме IM2, используют "разницу" в этих ПЗУ для значения вектора прерывания (а значит и определения, с каком из ПЗУ, в данный момент работает компьютер). Там же приводится пример программы, работающей во втором режиме прерывания, независимо от того, "находитесь" вы в sos или tr-dos.

jerri 27th September 2011 12:08

Quote:

Originally Posted by hippiman (Post 418706)
Помогите мне разобраться что не так и довести ее в работоспособное состояние.

1. для чего тебе вообще загрузка с включенными прерываниями?
если для понтов то подумай как это будет выглядеть в ТАПке

2 если загрузка действительно нужна, то посмотри загрузчик в
http://www.worldofspectrum.org/infos...cgi?id=0012860 в этой игрушке -
он работает везде, во всяком случае нареканий не было.

3 ну и пара советов
1 загрузку стандартными средствами трудно переделать под ИМ2 изза того, что Дос периодически лазает в ПЗУ басика
2 отследить какое ПЗУ включено невозможно, можно только предположить

hippiman 27th September 2011 12:26

Все разобрался. Спасибо подтолкнули в нужное русло :). Прерывания во время загрузки мне не нужны вообще. Теперь перед обращениями к тр-дос просто переключаю на 1й режим, а после на 2й.

newart 27th September 2011 14:00

Quote:

Originally Posted by hippiman (Post 418730)
Все разобрался. Спасибо подтолкнули в нужное русло . Прерывания во время загрузки мне не нужны вообще. Теперь перед обращениями к тр-дос просто переключаю на 1й режим, а после на 2й.

Йожег, сабж милион раз обсосан в электронной ZX прессе. (там процедуры как правило актуальнее реликтовых книг)

jerri 27th September 2011 14:40

newart, Общение с живыми оно же завсегда лучше

ZXMAK 27th September 2011 16:38

Quote:

Originally Posted by hippiman (Post 418730)
Все разобрался. Спасибо подтолкнули в нужное русло :). Прерывания во время загрузки мне не нужны вообще. Теперь перед обращениями к тр-дос просто переключаю на 1й режим, а после на 2й.

может просто запретить их?

jerri 27th September 2011 16:56

Quote:

Originally Posted by Alexander Makeev (Post 418808)
может просто запретить их?

прерывания трдос само запрещает
а потом снова разрешает... и привет:v2_dizzy_messed:

hippiman 27th September 2011 17:38

что-то все равно не выходит. Теперь функция отрабатывает после вызова
Code:

sp_InitIM2(0xf1f1);
sp_CreateGenericISR(0xf1f1);

но вылетает с криками "out of memory" если ее вызвать после любой функции spritepack'a.
А вылетает она на этих строчках.
Code:

LD    C,10     
CALL  15635

Может быть нужно какую-то область памяти предварительно сохранять, а потом восстанавливать?


All times are GMT +4. The time now is 21:03.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.