плз, ткните носом, откуда берется "длина программной части" BASIC, та самая, что записывается в 11-12 байтах заголовка файла в трдос-каталоге.
в смысле, как её выкопать из бинарного бейсик-файла?
Вид для печати
плз, ткните носом, откуда берется "длина программной части" BASIC, та самая, что записывается в 11-12 байтах заголовка файла в трдос-каталоге.
в смысле, как её выкопать из бинарного бейсик-файла?
Вроде бы это длинна всей программы в байтах (те каждая команда=1байт и каждый символ=1байту + еще нумерация строк).
ну я фиг его знает :rolleyes: ну я лично блал экзамплы из sjasmplus, немного подкорректировав получил такую картинку своего загрузчика для дверей:
сохранял брав разницу EndBasic-Basic, кроме того она указана в 2-м и 3-м байте :rolleyes:Код:DISP 23867
Basic db #00,#00 ; basic number string [#00,#01]
dw EndBasic-Begin ; size of basic string
Begin db #FD ; "CLEAR" token
db #30 ; "0" fake numeber
db #0e,#00,#00
dw #5fff ; real stack (CLEAR) [#5fb3]
db #00
db #3a ; ":"
db #f9 ; "RANDOMIZE" token
db #c0 ; "USR" token
db #30 ; "0" fake numeber
db #0e,#00,#00
dw #5d53 ; real call (USR) [#5d53]
db #00
db #3a ; ":"
db #ea ; "REM" token
include "bootloader/basicboot.asm"
db #D
EndBasic
а после EndBasic ниче в файле нет?? там же должно быть че-то типа то ли 0х80, то ли 0хАА.. за которым идет адрес строки автозапуска..
Одно из них (из START/LENGTH) -- длина всей области от переменной PROG до VARS. Второе -- длина в байтах обоих этих областей. В файле сохраняются обе области, т.к. в памяти они все равно лежат подряд. Что есть что легко проверяется однострочной программкой, в которой перед сохранением любой переменной присвоили любое значение между последним CLEAR и сохранением на диск. А т.к. заголовок кассетный длиннее дискетных 16 байт, TR-DOS выдумали цеплять в конце файла-с-автозапуском еще 3 байта -- AA и 2 байта номера LINE-строки. Имо, очень неудобно, т.к. с вероятностью 3/256 это займет целый сектор! Но раз уж иначе никак...
Кроме того, существуют условия, когда эти байты не добавляются, не проверяются -- условия без автозапуска. Точно знаю, что если START больше 32767, автостарта не происходит.
то есть, я правильно понял, что способа определить по имеющемуся бинарнику длину BASIC-программы, не перекапывая эту самую программу построчно, науке неизвестно?
Если в этом бинарнике -- только бэйсик файл, то отчего же?
Не самый надежный, но простой способ -- проверить последние 3 байта на предмет AA -- но есть шанс, хоть и маленький, что в программе сохраняли переменные. Тогда более надежно -- назначить поиск с конца байта 0x80 -- марекр конца переменных. Если AA есть, то этот байт лежит сразу за ним.
Ну, а случай, когда в конце последнего сектора бэйсик-файла кто-то умышленно навалил мусор из 0x80-байтов можно не рассматривать :)
Интересный текст можно обнаружить в ZX-Ревю.
http://trd.speccy.cz/book/REVU9645.ZIP
файл - Dos_tx.txt
"РАЗДЕЛ TR DOS ДЛЯ НАЧИНАЮЩИХ"
ГЛАВА 2 "ВНУТРЕННЯЯ ОРГАНИЗАЦИЯ ДИСКА"
(c) В.Сироткин, г.Краснокаменск.
Продолжение (начало см. ZX 96/1-2)
зы:
Можно в тексте задать поиск: "Давайте теперь посмотрим как лежит на диске в секторе блок файла"
(то же и здесь - http://trd.speccy.cz/book/REVU3_96.ZIP)