PDA

Просмотр полной версии : Загрузка файла в TR-DOS (Ассемблер) не получается



IanPo
30.01.2011, 12:52
Приветствую!

Пишу демо-прогу, соответственно требуется загрузка файла с дискеты (TRDOS), помогите с процедурой.


;-------------------------------------------------
; LOADFILEMEM - load 60K "file5" file to GPU RAM
;-------------------------------------------------
LOADFILEMEM:
push af
push bc
push de
push hl
;
ld hl,Name
ld c,13h
call GPUDISABLE
call 3d13h
call GPUENABLE
xor a
LOADFILEMEM1:
ld (sMP),a
inc a
push af
;
xor a
ld (5cf9h),a
ld c,0eh
ld a,3
ld de,1000h
ld hl,0c000h
call GPUDISABLE
call 3d13h ; <-------получаю noncence in basic
call GPUENABLE
;
ld hl,0c000h
ld de,0
ld bc,1000h
ldir
;
pop af
cp a,15
jp nz,LOADFILEMEM1
;
pop hl
pop de
pop bc
pop af
ret
;
Name defm "file5 C"

Гружу 60К файл 15-ю кусками по 4К и копирую их в свой видеоконтроллер (запись в область ПЗУ 0..4095).
Исходник брал из книги Поморцева про TRDOS. Раньше в TRD0S не программировал, где ошибка, непонятно.
TRD-шку прилагаю. Тестил на реале и в UnrealSpeccy.

jerri
30.01.2011, 14:55
----
Гружу 60К файл 15-ю кусками по 4К и копирую их в свой видеоконтроллер (запись в область ПЗУ 0..4095).
Исходник брал из книги Поморцева про TRDOS. Раньше в TRD0S не программировал, где ошибка, непонятно.
TRD-шку прилагаю. Тестил на реале и в UnrealSpeccy.

это какая-то ересь
перечитай внимательнее книжку Поморцева

ТР Дос не дает простых способов загрузки произвольного куска файла



;-------------------------------------------------
; LOADFILEMEM - load 60K "file5" file to GPU RAM
;-------------------------------------------------
LOADFILEMEM:
push af
push bc
push de
push hl
;
call GPUDISABLE

LD C,#18 ; настройки на тип дискеты
CALL #3D13

ld hl,Name
ld c,13h
call 3d13h
;копируем имя
ld c,#0a
call #3d13
;проверяем наличие файла

ld a,c
inc c
jp z,file_not_found

ld c,#08
call #3d13
;считываем его данные
;теперь можем грузить

ld de,(#5ceb)
;берем физический адрес на диске
ld bc,#0f05
;определяем количество 4х кб блоков (15)
;с=5 для загрузки блока
LOADFILEMEM1:
push bc
ld hl,#c000 ;адрес загрузки
ld b,#10 ;длина в секторах =16
call 3d13h ;
ld de,(#5cf4) ;берем физический адрес на диске следующего блока

push de
call GPUENABLE
;
ld hl,0c000h
ld de,0
ld bc,1000h
ldir
;
call GPUDISABLE
pop de
pop bc
djnz LOADFILEMEM1
;
file_not_found
call GPUENABLE
pop hl
pop de
pop bc
pop af
ret
;
Name defm "file5 C"


как то так - не тестировал :)
дергать это самое ГПУ без надобности - не вижу смысла :)

Дмитрий
30.01.2011, 15:13
Я в свое время юзал такую процедуру загрузки файла:


start
ld hl,#f700 ; буфер для загрузки каталога
ld de,0
ld bc,#0805 ;грузим каталог дискеты
call 15635
ld de,NameFile ;имя файла
ld hl,#f700
call SearchFile ;ищем файл в каталоге и берем инфу о его расположении (трек, сектор)
jpc Exit ; а нет такого файла - выход!
ld hl,#9700 ;грузим 1 сектор файла по адресу #9700
ld bc,#0105
call 15635
...
;routines
SearchFile ld b,128
ld (S_file1+1),de
S_file1 ld de,0
ld a,(hl)
or a
jrz No_file
ld a,(de)
cp (hl)
jrz found_symb
N_file2 ld a,b
ld bc,16
add hl,bc
ld b,a
djnz S_file1
No_file scf
ret
found_symb
ld (N_file1+1),hl
ld c,10
inc hl
inc de
S_file2 ld a,(de)
cp (hl)
jrnz N_file1
inc de
inc hl
dec c
jrnz S_file2
inc hl
inc hl
ld b,(hl)
inc hl
ld e,(hl)
inc hl
ld d,(hl)
or a
ret
N_file1 ld hl,0
jr N_file2
NameFile db "Levels dat"

IanPo
30.01.2011, 22:25
Я потестирую вариант jerri как мне, начинающему, более понятный (похож на тот, что из книги Поморцева). Второй вариант про запас будет :)
В Unreal Speccy код не глючит, буду смотреть на реале.
Похоже, я, действительно, не тот код скопировал вначале. Тот был для монолитной сборки Basic-файла с кодом.

jerri
31.01.2011, 11:40
Там еще вопрос у меня есть

;
ld hl,0c000h
ld de,0
ld bc,1000h
ldir
;
вот этот кусок кода копируется в одни и теже адреса
как у тебя определялось что и куда будет адресоваться?

IanPo
01.02.2011, 19:54
как у тебя определялось что и куда будет адресоваться?

Спасибо, я уже поправил. Забыл вставить переключатель страниц. Файл, кстати, грузится :v2_dizzy_roll: