Просмотр полной версии : Загрузка файла в TR-DOS (Ассемблер) не получается
Приветствую!
Пишу демо-прогу, соответственно требуется загрузка файла с дискеты (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.
----
Гружу 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"
как то так - не тестировал :)
дергать это самое ГПУ без надобности - не вижу смысла :)
Я в свое время юзал такую процедуру загрузки файла:
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"
Я потестирую вариант jerri как мне, начинающему, более понятный (похож на тот, что из книги Поморцева). Второй вариант про запас будет :)
В Unreal Speccy код не глючит, буду смотреть на реале.
Похоже, я, действительно, не тот код скопировал вначале. Тот был для монолитной сборки Basic-файла с кодом.
Там еще вопрос у меня есть
;
ld hl,0c000h
ld de,0
ld bc,1000h
ldir
;
вот этот кусок кода копируется в одни и теже адреса
как у тебя определялось что и куда будет адресоваться?
как у тебя определялось что и куда будет адресоваться?
Спасибо, я уже поправил. Забыл вставить переключатель страниц. Файл, кстати, грузится :v2_dizzy_roll:
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot