Вход

Просмотр полной версии : Загрузка файла по имени



newart
01.03.2017, 04:06
Gogin ищет процедурку для будущего Mario:


нужна процедура загрузки файла с диска!
:)

На вход:
- HL - указатель на имя файла (9 символов) в памяти,
- DE - адрес в памяти, куда грузить,
На выходе:
- в регистре C флаг ошибки или код ошибки.

Вот типа такого:

ld hl, filename
ld de, #8000
call trdos_lib.load_file

ld a, c
and a
jr nz, load_failed

так, чтобы это можно было легко адаптировать под .tap
хотя хз как это сделать :DD
а длину файла можно брать из дескриптора файла....
потому что хардкодить длину всех файлов мне не хочется
хочется просто по имени грузить, как в бейсике:
LOAD "game" CODE 32768

drbars
01.03.2017, 04:53
Держи мою процедурку из Диззи редактора

Для работы процедура использует два буфера. Один длинною в 256 байт используется под нужды парсера, второй содержит переменные
о параметрах нашего файла. Для работы с драйвером нужно работать со вторым буфером напрямую, итак переменная NAME длнна 9 байт.
Первые 8 байт - имя файла, последний байт - тип файла. Переменная SYSTEM содержит по смещению +0 адрес загрузки нашего
файла или адрес откуда будет производиться запись (тип word). По смещению SYSTEM+2 содержится длина нашего файла в байтах,
эта переменная актуальна для режима записи на диск. Далее по смещению SYSTEM+4 содержится информация о секторе (тип byte)
и по SYSTEM+5 о положении файла на диске (тип word). Эти переменные используются драйвером для внутренних нужд.


; TRDOS --------------------------------------------------------------------------------
INIT: LD A,(#5D19) ;Считываем номер дисковода из переменных
AND #03
OR #2C
LD (DRIVE1+1),A
SET 4,A
LD (DRIVE2+1),A
RET

LOAD: SUB A ; обнуляем регистр A (A=0 - режим загрузки)
LD HL,адрес_загрузки
LD (SYSTEM),HL
CALL LOADER
OR A
JR NZ,файл_не_найден
RET

SAVE: LD A,#FF ; (A<>0 - режим выгрузки)
LD HL,адрес_выгрузки
LD (SYSTEM),HL
LD HL,длинна_файла
LD (SYSTEM+2),HL
CALL LOADER
OR A
JR NZ,нет_места_на_диске
RET

LOADER DI
OR A
JR NZ,SAVER
SUB A
LOOP PUSH AF
LD HL,BUF
PUSH HL
LD E,A
SUB A
LD D,A
INC A
LD B,A
DEC A
CALL DRIVER
LD B,16
POP HL
CHECK PUSH BC
LD B,9
LD DE,NAME
CHECK1 LD A,(DE)
CP (HL)
JR NZ,CHECK2
INC HL
INC DE
DJNZ CHECK1
POP BC
POP AF
INC HL
INC HL
LD E,(HL)
INC HL
LD D,(HL)
PUSH DE
INC HL
LD B,(HL)
INC HL
LD E,(HL)
INC HL
LD D,(HL)
DEC B
JR NZ,CHECK3
LD HL,BUF
PUSH HL
INC B
SUB A
CALL DRIVER
POP HL
LD DE,(SYSTEM)
POP BC
JR CHECK4
CHECK3 PUSH BC
LD HL,(SYSTEM)
SUB A
CALL DRIVER
PUSH HL
INC B
LD HL,BUF
SUB A
CALL DRIVER
POP DE
POP BC
LD C,0
POP HL
OR A
SBC HL,BC
LD B,H
LD C,L
LD HL,BUF
CHECK4 LDIR
SUB A
RET
CHECK2 LD A,B
ADD A,7
LD C,A
LD B,0
ADD HL,BC
POP BC
DJNZ CHECK
POP AF
INC A
CP 8
JR NZ,LOOP
RET

SAVER LD HL,BUF
LD E,8
SUB A
LD B,A
LD D,B
INC B
CALL DRIVER
LD A,(BUF+228)
LD C,A
CP 128
RET NC
LD DE,(SYSTEM+2)
DEC DE
INC D
LD B,D
LD A,B
LD E,B
LD D,0
LD HL,(BUF+229)
LD (SYSTEM+4),A
OR A
SBC HL,DE
LD A,H
CP #FF
RET Z
LD A,C
OR A
EX AF,AF'
LD (BUF+229),HL
LD A,(BUF+228)
INC A
LD (BUF+228),A
LD DE,(SYSTEM)
LD HL,(BUF+225)
LD (SYSTEM+5),HL
EX DE,HL
CALL DRIVER
LD (BUF+225),DE
SUB A
INC A
LD B,A
LD HL,BUF
LD DE,8
CALL DRIVER
LD E,0
LD HL,BUF
LD BC,2048

SLD3 EX AF,AF'
JR Z,SOHRAN
DEC A
EX AF,AF'
LD A,L
ADD A,#10
LD L,A
JR NZ,SLD4
INC E
SLD4 DEC BC
LD A,B
OR C
JR NZ,SLD3
SOHRAN LD D,0
PUSH DE
PUSH HL
LD HL,BUF
SUB A
LD B,A
INC B
CALL DRIVER
POP DE
LD HL,NAME
LD BC,16
LDIR
POP DE
LD HL,BUF
SUB A
INC A
LD B,A
CALL DRIVER
SUB A
RET

DRIVER PUSH BC
PUSH HL
INC E
OR A
LD A,#A0
LD HL,#3FCA
JR NZ,TR_DOS1
LD A,#80
LD HL,#3FE5
TR_DOS1 LD (TR_DOS0+2),HL
LD (TR_DOS3+1),A
TR_DOS5 CALL TRECK
LD IX,#2F59
CALL TR_DOS
LD B,4
WAIT CALL #3DFD
DJNZ WAIT
TR_DOS4 BIT 6,B
JR NZ,TR_DOS5
POP HL
POP BC
NEXT PUSH BC
PUSH HL
LD C,#5F
LD A,E
CALL PORT
LD C,#7F
TR_DOS3 LD A,0
CALL TRRDOS
TR_DOS0 LD IX,0
CALL TR_DOS
PUSH DE
SUB A
LD C,#3F
CALL PORT
LD A,#A
LD C,#5F
CALL PORT
LD D,1
LD IX,#3F33
CALL TR_DOS
POP DE
LD A,D
SRL A
LD C,#3F
CALL PORT
SUB A
OR B
JR NZ,TR_DOS4
POP HL
INC H
POP BC
INC E
LD A,E
CP #11
CALL Z,TRECK-3
DJNZ NEXT
DEC E
RET
LD E,1
INC D
TRECK LD A,D
SRL A
LD C,#7F
CALL PORT
DRIVE1 LD A,#2C
JR C,TRECK0
DRIVE2 LD A,#3C
TRECK0 LD C,#FF
CALL PORT
LD A,#1C
TRRDOS LD IX,#2FC3
TR_DOS PUSH IX
JP #3D2F
PORT LD IX,#2A53
JR TR_DOS

NAME DEFB "********C"
SYSTEM DEFW #C000 ; START
DEFW 0 ; LENGHT
DEFB 0 ; SECTORS
DEFW 0 ; TRK/SEC
ORG #5B00
BUF DEFS 256 ; BUFFER

Sayman
01.03.2017, 05:48
drbars, делать сегодня всякие турболоадеры это зло. нельзя было 3d13 использовать?

SaNchez
01.03.2017, 06:00
;загрузка файла
;вх - de - адрес загрузки
; hl - указатель на имя файла

load_file push de
ld c,#13
call #3d13
pop hl
xor a
ld (#5cf9),a
cpl
ld c,#0e
jp #3d13

Ошибки не обрабатываются.

drbars
01.03.2017, 09:40
drbars, делать сегодня всякие турболоадеры это зло. нельзя было 3d13 использовать?
Нет :) Это полностью автономная поцедура. Ошибки кстати зацикливает в бесконечный Retry, не зависает.

Sayman
01.03.2017, 09:46
Это полностью автономная поцедура
Каким образом это полностью автономная процедура, если лезет в область ПЗУ трдос для работы с портами ВГ93?
на дворе 2017год. 3d13 использовать выгоднее, т.к. на большинстве сегодняшних машин можно вгонять образ на рам диск и гонять от туда (а то и сразу с винта/sd карты), а своим турболоадером ты во1х, на этом поставил крест, а во2х, снижаешь возможность и шанс портирования продукта на другие платформы/системы, отличные от "трдосной". в общем и целом, турболоадер на сегодня это одно слово - понты.

Shiny
01.03.2017, 09:50
в общем и целом, турболоадер на сегодня это одно слово - понты

Помнится, что в древних релизах игр защита засирала всю память, так что турболоадер уместен. Другое дело - эмуляторы плохо эмулируют такое обращение с ВГ93, например Spectaculator.

Sayman
01.03.2017, 10:02
Помнится, что в древних релизах игр защита засирала всю память,
вот именно, в древних релизах. тогда это было уместно. а сегодня уже нет. и игры те старые (многие) давно перерелижены (перерелизены, как правильно? :biggrin:).
тем более там речь не про древний релиз была, а про современный.

Shiny
01.03.2017, 10:50
вот именно, в древних релизах. тогда это было уместно. а сегодня уже нет.

в любом случае отказываться от треклоадера неумно. Как вариант, использовать стандартную точку входа TR-DOS.

Sayman
01.03.2017, 11:01
Шынни, вот объясни мне. новый проект, под трдос. запускается с трдос диска. формат диска стандартный, без всяких защит. Зачем делать "трекосекторный" лоадер для файлов, если с этим легко можно справляться через 3d13 (стандартная точка входа в трдос). при этом явные преимущества - можно грузить с образа, а не с реальной дискеты (исключение только ТС конфа, где не ведомым мне способом турболоадеры работают); возможность легко перетащить проект под другие платформы (и расширить аудиторию); компактный код - появляется место для прочих важных процедур (компактность кода SaNchez примерно в 10 раз, чем у dr.bars, а задачи те же самые - загрузить файл).

Gutten
01.03.2017, 11:06
Кого нынче хотите удивить турболоадером? Тех стариков, что их уже повидали или молодых, которым наше старье и даром не нужно? Большинство с флэшек-винтов грузит игры за секунды, им этот турболоадер только проблемы доставит. Хотя, если запускать в эмуле, то проблем нет, но тут вроде как за "железные машинки" некоторые авторы активно агитируют?

Shiny
01.03.2017, 11:11
я выше невнятно написал что ли?

- - - Добавлено - - -


Кого нынче хотите удивить турболоадером? Тех стариков, что их уже повидали или молодых, которым наше старье и даром не нужно?

Внезапно мне напомнила ситуация с NEC PC-88: инфы по работе с дисководом мало, но примеры или не работают, или читают файлы медленно. Я нашел шуструю загрузку в Tetris, дизассемблировал процедуру и использовал.
Поэтому отказываться от турболоадера глупо, я выше сказал, что достаточно использовать тот вариант, что предложил SaNchez.

Gutten
01.03.2017, 11:15
Да эти мысли вслух не только к данному вопросу, а вообще. Иногда появляются темы как сделать "быструю загрузку без переменных" и одно из решений - как раз прямой доступ к ВГшке. Но на сегодня это худшее решение.

Sayman
01.03.2017, 11:15
в любом случае отказываться от треклоадера неумно.
в каком контексте это сказано? если ты имел в виду историческую ценность, то этого не отнять в любом случае. если с практической точки зрения для Спектрумов и его клонов, то нет смысла, ибо винты и карточки решают лучше. Если в общем смысле, с позиции пользователя не только Спектрума - я не знаю как там на других платформах, но уверен, что на многих из них есть свои подобия "дос" со стандартными точками входа для чтения файлов. Вариант SaNchez, кстати, это стандартаная 3d13, это не турболоадер. прям совсем не турбо.

Shiny
01.03.2017, 11:40
я сталкивался с дисковой адаптацией, когда доступ через 3d13 был просто невозможен, потому что программа работала некорректно. Вариант - использовать треклоадер.

Странно, что newart. владелец сайта zxpress.ru, не вспомнил о наличии литературы.

newart
01.03.2017, 14:39
Странно, что newart. владелец сайта zxpress.ru, не вспомнил о наличии литературы.
Читай внимательно первый пост. Процедуру просил Gogin. Статья TR-DOS для начинающих ему не помогла, что-то все равно не работало.

drbars
01.03.2017, 14:55
Sayman, Ты новый тролль?)) Тебе какая в опу разница...?))) Топикстартеру были предложены варианты - сам выберет.
Напиши и выложи свою процедуру, языком чесать мастер только?:)

- - - Добавлено - - -

вот древняя тема, берите какой нравится http://zx-pk.ru/threads/14967-zagruzka-fajla-v-tr-dos-(assembler)-ne-poluchaetsya.html

Sayman
01.03.2017, 19:27
dr.bars, ты первопост читал или просто понтануться решил на старости? Тебе же сказали, что бы просто под tap перегнать потом можно было.

- - - Добавлено - - -

newart, пояснительная к функции от SaNchez: http://zxdn.narod.ru/coding/bc05strd.txt

Faster
08.05.2017, 17:01
Gogin ищет процедурку для будущего Mario:
так, чтобы это можно было легко адаптировать под .tap

Я бы это сделал так. Есть, например, файлы:

Mario.B
Code1.C
Code2.C
В бейсик файле размещаем 0 RUN USR VAL "PEEK 23628*256+PEEK 23627" <CODE> - универсальный вариант для TR-DOS/TAPE.
В коде прописываем:

;начало бейсик-программы (#5D3B - для TR-DOS, #5CCB - для +3DOS и TAPE)
PROG EQU #5C53 ;адрес начала бейсик-программы

CODE LD A,(PROG) ;проверяем запущена ли программа в TR-DOS
CP #3B
JR Z,TrDos ;запущена в TR-DOS
... ... ;запущена не в TR-DOS, например в TAPE
;далее следует загрузчик для TR-DOS (хоть #3D2F, хоть #3D13) и Tape
Поясню как это работает (http://zx-pk.ru/threads/21217-basic-loader-creator.html?p=613748&viewfull=1#post613748). При запуске Mario.B запускается код, который определяет с какого устройства запущен бейсик файл и в зависимости от этого запускается загрузчик либо для TR-DOS, либо для Tape. Удобство данного способа в том, что файлы без переделки можно записать как на диск, так и на ленту.