Загрузка BASIC программы
Модератор: Spectre
Загрузка BASIC программы
Подскажите пожалуйста, как из Васика загрузить и запустить Васиковскую программку.
Пользуюсь эмулятором EmuZWin v2.5
Вариант типа
randomize usr 15619:rem:load"vasic" line 1
не покатил (((.
Задача такая - нужно вначале загрузить кусок кода (тоесть музыка, спрайты, или что то в этом роде) потом загрузить основную васик программу, которая будет обращаться randomize usr-ами к загруженным кодам. Управлять ими можно будет с помощью poke-ов.
Пользуюсь эмулятором EmuZWin v2.5
Вариант типа
randomize usr 15619:rem:load"vasic" line 1
не покатил (((.
Задача такая - нужно вначале загрузить кусок кода (тоесть музыка, спрайты, или что то в этом роде) потом загрузить основную васик программу, которая будет обращаться randomize usr-ами к загруженным кодам. Управлять ими можно будет с помощью poke-ов.
Не понимаю, а почему бы сначала не загрузить Бейсик а потом коды ? В принципе так более распостранено ![Smile :)](./images/smilies/icon_smile.gif)
![Smile :)](./images/smilies/icon_smile.gif)
http://trd.speccy.cz
ZX-Spectrum Rulez Forever!
ZX-Spectrum Rulez Forever!
Bally писал(а):потому что команда Clear которая обычно при загрузке кодов присутствует обнуляет все переменные и массивы васика, хранить их еще где то влом - легче вначале коды загрузить
Погоди, так обычно ж по правилам такую команду ставят в начале бейсик - программы, а потом объявляют переменные и массивы. Я конечно не сильный кодер, но на васике чё та писал
![Smile :)](./images/smilies/icon_smile.gif)
http://trd.speccy.cz
ZX-Spectrum Rulez Forever!
ZX-Spectrum Rulez Forever!
Prusak
возможно если с автозапуском сохранить покатит - попробую, без автозапуска,не катило.
Striker
Погоди, так обычно ж по правилам такую команду ставят в начале бейсик - программы, а потом объявляют переменные и массивы. Я конечно не сильный кодер, но на васике чё та писал
команда Clear - просто очищает область для васика.
Да, - но при загрузке любого кода в память, ее тоже надо ставить, она еще и устанавливает верхнюю границу васик программы (RAMTOP кажется так наз-ся), тут надо тоже смотреть, чтобы загружаемый код, не перехлестнулся с васиком, который есть.
возможно если с автозапуском сохранить покатит - попробую, без автозапуска,не катило.
Striker
Погоди, так обычно ж по правилам такую команду ставят в начале бейсик - программы, а потом объявляют переменные и массивы. Я конечно не сильный кодер, но на васике чё та писал
команда Clear - просто очищает область для васика.
Да, - но при загрузке любого кода в память, ее тоже надо ставить, она еще и устанавливает верхнюю границу васик программы (RAMTOP кажется так наз-ся), тут надо тоже смотреть, чтобы загружаемый код, не перехлестнулся с васиком, который есть.
Re: Загрузка BASIC программы
LOAD - просто загружает программу, если она записана без автостарта она не запустится. Используйте RUN:Bally писал(а):Подскажите пожалуйста, как из Васика загрузить и запустить Васиковскую программку.
Пользуюсь эмулятором EmuZWin v2.5
Вариант типа
randomize usr 15619:rem:load"vasic" line 1
не покатил (((.
randomize usr 15619:rem:run "vasic"
В этом случае неважно есть ли автостарт. Но на всякий случай автостарт делают всегда.
Никаких проблем. На кассетах я такое раньше часто встречал: одна прога грузит картинку и основную прогу.Bally писал(а):Задача такая - нужно вначале загрузить кусок кода (тоесть музыка, спрайты, или что то в этом роде) потом загрузить основную васик программу, которая будет обращаться randomize usr-ами к загруженным кодам. Управлять ими можно будет с помощью poke-ов.
Как правило переменные и массивы бэйсика задают в начале работы программы. Устанавливать им значения, а потом надеятся что они нигде не потеряются - несколько сложнее. Тем более что без CLEAR'а вам не обойтись - по умолчанию стэк установлен на конец памяти (~65000) и ваши кодовые программы могут им затерется.Bally писал(а):потому что команда Clear которая обычно при загрузке кодов присутствует обнуляет все переменные и массивы васика, хранить их еще где то влом - легче вначале коды загрузить
Код: Выделить всё
; (C) fk0@fk0.pp.ru ~1997-2003
; basic-loader
; set HAVE_TRDOS=N, there N is not 0 if beta-disk present
STDPROG equ 0x5ccb ; при отсутствии TR-DOS адрес другой (!), но тут
; всегда такой, но это может быть не совсем совместимо
; с чиста-кассетными программами.
di
im 1
ld bc, 0x7ffd
xor a
out (c), a ; включается нулёвая банка
ld a, 0x3f
ld i, a
ld iy, 0x5c3a ; iy жизненно нужен для IM1
; обнуляет редактор командной строки и переменные бейсика...
ld hl, 0x5b00
ld de, 0x5b01
ld bc, 0x6000-0x5b00
ld (hl), l
ldir ; самоочевидно
; установка жизненно важных системных переменных
ld hl, 0x3d00+'A'
ld (0x5c7b), hl ; UDG into ROM...
ld hl, 0x0040
ld (0x5c38), hl ; PIP & RASP
ld hl, 0x3c00
ld (0x5c36), hl ; CHARS
ld hl, 0xffff
ld (0x5cb4), hl ; P-RAMT
ld hl, resident - basic ; рамтом меньше FFFF за счёт коротенького
; ассемблерного куска в верхней памяти
; (99% программ нормально пускаются...
; а кто не проверяет RAMTOP сам мудак).
; кусок нужен для окончательного запуска бейсика (см. ниже)
ld (0x5cb2), hl ; RAMTOP
ld (hl), 0x3f ; end marker
; ставиться стек и адрес обработки недопустимых ошибок
dec hl
ld sp, hl
ld hl, 0x1303 ; MAIN-4
push hl
ld hl, 0
add hl, sp
ld (0x5c3d), hl ; ERRSP
; атрибуты экрана и бордюра по-дефолту -- чёрный на сером.
ld a, 0x38
ld (0x5c8d), a ; ATTR_P
ld (0x5c8f), a ; ATTR_T
ld (0x5c48), a ; BORDCR
; скорость ввода с клавитуры
ld hl, 0x0210 ; 0x0523 -- standard
ld (0x5c09), hl ; REPDEL & REPPER (fast)
; какая-то хуета не помню для чего.
dec (iy-0x3a)
dec (iy-0x36) ; KSTATE0,4=0xff
; установка адреса начала бейсик-программы и её переменных --
; кто не понял -- читайте MOA.
ld hl, STDPROG
dec hl
ld (0x5c57), hl ; DATADD
inc hl
ld (0x5c53), hl ; PROG
ex de, hl ; адрес куда её (см. ниже) скопировать
ld hl, basic ; своя бейсик-программа, можно с диска загрузить
ld bc, basic_end-basic ; TODO: real length бейсик программы своей
ldir ; копируетсяа из фиг знает куда куда следует.
ex de, hl
ld (0x5c4b), hl ; VARS
ld (hl), 0x80 ; end of variables marker
inc hl
ld (0x5c59), hl ; E_LINE -- редактор командной строоки
if 0 ; можно свою строку туда загнать
ld (hl), 0x0d
inc hl
ld (hl), 0x80
inc hl
ld (0x5c61), hl
ld (0x5c63), hl
ld (0x5c65), hl ; SET-MIN analog
endc ; ^^^ видимо нах не надо, не помню уже ибо делается вызовом
; SET-MIN из ПЗУ
; короткий кусок копируется в самый конец памяти (ему там отведено путём
; уменьшения RAMTOP) и пускается. Сам он потом пускает бейсик.
ld hl, resident
ld de, resident - basic
push de
ld bc, basic - resident
ldir
ret
; окончательный запуск бейсика.
resident:
ld bc, 0x7ffd
ld a, 0x10
out (c), a ; 0-я банка и 48кб ПЗУ
ld b, 0x1f
xor a
out (c), a ; точно 0-я (для скорпа и кая).
ei ; iy готов, переменные готовы, можно опрашивать клаву
; установка каналов ввода-вывода (экран, принтер и т.п. -- нужное продублировано
; в ПЗУ -- просто копируется в область описателей).
ld hl, 0x5cb6
ld (0x5c4f), hl ; CHANS
ex de, hl
ld hl, 0x15af ; chans in rom-48
ld bc, 21
ldir
ld hl, 0x15c6
ld de, 0x5c10
ld bc, 14
ldir ; initial STREAMS
set 1, (iy+1)
call 0x0edf ; initialize printer
ld (iy+0x31), 2 ; DF_SZ (lower screen size)
call 0x0d6b ; CLS
; хуй знает что оно делает, раньше знал, теперь C#^H^H ктулху сожрал мой моск.
call 0x16b0 ; SET-MIN
dec (iy+0x00) ; ERRNO -- ашибак нет!
set 7, (iy+1) ; running program, not single line
; ! см. выше! так можно и строку запустить вместо
; программы. юзер потом хуй узнает что пускали.
; во! ахтунг. в hl -- команда для интерпретации тр-досом.
; выполняется понятно когда. напоминаю, что адрес начала программ
; всё равно такой как при наличии TR-DOS, так что для абсолютной
; совместимости с 48-м без тр-доса его надо понизить... (см. выше STDPROG)
#if HAVE_TRDOS
; initialize TR-DOS
ld hl, resident - basic + trd_op
ld (0x5c5d), hl
call 15619
trd_op:
db 234, ":", 0x0d ; REM <CR>
#endif
; по-моему сюда доходит только при неопределённом HAVE_TRDOS.
; не знаю уже...
jp 0x1b76 ; start basic program
; моя могучая бейсик-программа. может быть любая. можно хоть с диска
; посекторно загрузить самому... Да, принципиально, что она копируется
; куда надо LDIR'ом. По этому адрес всей этой хренотени должен быть либо
; (включая конец) меньше, либо строго больше STDPROG (уже не включая
; конец, но выше #6000 ибо там (см. выше) всё обнуляется нахрен).
basic:
*Include shadow.s
; пример...
; hello world!
#if 0
BASNUM MACRO _marg1
db "0"
db 0x0e
dw 0
dw _marg1
db 0
ENDM
db 0, 10 ; line no. 10.
dw bsline_end - bsline_start
bsline_start:
db 0xf5, 0x22 ; PRINT
db "Hello World!"
db 0x22
db ':'
db 0xec
BASNUM 10 ; GOTO 10
db 0x0d
bsline_end:
db 0x80
#endif
basic_end:
end
[ZX]
Re: Загрузка BASIC программы
Бугагагага. LOAD, RUN -- последняя вообще смертельна (для состояния программы и переменных). Для того MERGE.Spectre писал(а):Пользуюсь чиста реальным пентагоном... (а вообще уже ничем не пользуюсь).Bally писал(а):Подскажите пожалуйста, как из Васика загрузить и запустить Васиковскую программку.
Пользуюсь эмулятором EmuZWin v2.5
Мануал по бейсику почитать?Вариант типа
randomize usr 15619:rem:load"vasic" line 1
не покатил (((.
[qiuote]
LOAD - просто загружает программу, если она записана без автостарта она не запустится. Используйте RUN:
На кой ляд автозапуск, ежели ОНО ИЗ БЕЙСИКА загружается, то не сложно
и GOTO сделать куда нужно...
... (слов цензурных нет). А ты clear не давай с адресом выше начала кодов.Bally писал(а):потому что команда Clear которая обычно при загрузке кодов присутствует обнуляет все переменные и массивы васика, хранить их еще где то влом - легче вначале коды загрузить
Можешь вообще коды выше RAMPTOP положить. Ты их из бейсика CLEAR'ом
ну никак вообще стереть не сможешь. Только если через POKE.
Ахтунг! А если стек значить ниже #6000 то ничего не трётся только потому, что он (стек) короткий? Так разницы вобщем никакой где он лежит. Ну хорошо, вообще, если в ~#FFxx, а не в #8000 например. А какая в ()() разница. Стек не более чем область памяти в ~>=512 байт. И чего? Пихать стек первым делом в #6000 и ниже не более чем ламерство. Да потому, что потом LIST из TR-DOS не работает хотя бы...Тем более что без CLEAR'а вам не обойтись - по умолчанию стэк установлен на конец памяти (~65000) и ваши кодовые программы могут им затерется.
Адекватная "кодовая" программа прекрасно размещается в сверхдлинной REM-строке бейсик-программы. Откуда и запускается (через USR и, подчеркну особо, PEEK <PROG>, ибо куда бейсик загрузили в общем случае неизвестно --
кто не согласен что так -- злобные ламеры и должны умереть). Далее перемещается
LDDR'ом (ибо вверх всегда) в нужный адрес, гробиться бейсик (точней -- усекается
до 0 строк и переменных -- ибо при вызове TR-DOS'а он её будет по памяти, бейсик-программу всмысле, вверх-вниз таскать, а это вовсе ни к чему) и запускается (ассемблер). Опционально в этой-же стадии распаковывается. Да, ещё до копирования/распаковки стек через, ДА CLEAR, ставится в #FFFF, после чего он ничему не мешает, если не заставлять его расти бесконечно вниз -- но >4килобайт рекомендую таки взять и отдать под это дело, да и под бейсик больше сектора (256 байт) тоже (ибо TR-DOS). Всё. Ассемблер между бейсиком и стеком прекрасно живёт. До тех пор, пока юзер не надумает сделать LOAD. Что в принципе можно обойти, только надо ли. Главный плюс -- запускается что при наличии TR-DOS, что с микродрайва, что с ленты. Опять же кто по существу не согласен -- ламиры и должны умереть. В деталях может можно и лучше.
[ZX]
Re: Загрузка BASIC программы
А вы merge в деле пробовали? Сначала попробуйте и с удивлением узнаете для чего она нужна и случаи когда merge не работает.fk0 писал(а):Бугагагага. LOAD, RUN -- последняя вообще смертельна (для состояния программы и переменных). Для того MERGE.Spectre писал(а): LOAD - просто загружает программу, если она записана без автостарта она не запустится. Используйте RUN:
Заменять же LOAD/RUN на merge мне вообще непонятно зачем.
Ага, теперь понял зачем merge - чтобы потом GOTO сделать переход?.. Только зачем так сложно, если проще сделать тот же RUN и знать что загруженная basic программа всегда загрузится и стартанет с первой строки?fk0 писал(а):На кой ляд автозапуск, ежели ОНО ИЗ БЕЙСИКА загружается, то не сложно и GOTO сделать куда нужно...
С первым советом согласен, второй же выглядит странным: как я уже писал выше, RAMTOP при инициализации установлен примерно на 65000, много Вы кодов в 500 байт запихнете?fk0 писал(а):... (слов цензурных нет). А ты clear не давай с адресом выше начала кодов.Bally писал(а):потому что команда Clear которая обычно при загрузке кодов присутствует обнуляет все переменные и массивы васика, хранить их еще где то влом - легче вначале коды загрузить
Можешь вообще коды выше RAMPTOP положить. Ты их из бейсика CLEAR'ом ну никак вообще стереть не сможешь. Только если через POKE.
Вы, Кирилл, не путайте понятия стек и RAMTOP (буквально переводя "верхняя граница памяти"). Я веду речь отталкиваяь от RAMTOP'а, который и устанавливается при помощи комманды CLEAR. Стек - вы можете пихать куда угодно, заботясь лишь о том чтобы пресловутые "~>=512 байт" под ним ничего ценного не затерли. А вот на RAMTOP завязано много вещей, в том числе и очистка памяти, которая выполняется до этого порога, открытие разных буферов (в том числе и для упомянутого LIST). Если вы хотите "не по ламерски" знать что с вашими данными в памяти ничего не случится, ставьте первыми же коммандами вашей программы RAMTOP (при этом и стек выставится) ниже ваших данных.fk0 писал(а):Ахтунг! А если стек значить ниже #6000 то ничего не трётся только потому, что он (стек) короткий? Так разницы вобщем никакой где он лежит. Ну хорошо, вообще, если в ~#FFxx, а не в #8000 например. А какая в ()() разница. Стек не более чем область памяти в ~>=512 байт. И чего? Пихать стек первым делом в #6000 и ниже не более чем ламерство. Да потому, что потом LIST из TR-DOS не работает хотя бы...Spectre писал(а): Тем более что без CLEAR'а вам не обойтись - по умолчанию стэк установлен на конец памяти (~65000) и ваши кодовые программы могут им затерется.
Кивание на LIST с выводом про ламерство выглядит не слишком профессиональным.
В современных условиях и наших реалиях, все что доверяют basic/tr-dos - это загрузить программу на асме и запустить её. Все остальное (к сожалению) приходится делать самому.
Ваше право, можете и так делать. Но считать этот способ единственно верным - довольно самонадеянно.fk0 писал(а):Адекватная "кодовая" программа прекрасно размещается в сверхдлинной REM-строке бейсик-программы. Откуда и запускается (через USR и, подчеркну особо, PEEK <PROG>, ибо куда бейсик загрузили в общем случае неизвестно --
кто не согласен что так -- злобные ламеры и должны умереть). Далее перемещается
LDDR'ом (ибо вверх всегда) в нужный адрес, гробиться бейсик (точней -- усекается
до 0 строк и переменных -- ибо при вызове TR-DOS'а он её будет по памяти, бейсик-программу всмысле, вверх-вниз таскать, а это вовсе ни к чему) и запускается (ассемблер). Опционально в этой-же стадии распаковывается. Да, ещё до копирования/распаковки стек через, ДА CLEAR, ставится в #FFFF, после чего он ничему не мешает, если не заставлять его расти бесконечно вниз -- но >4килобайт рекомендую таки взять и отдать под это дело, да и под бейсик больше сектора (256 байт) тоже (ибо TR-DOS). Всё. Ассемблер между бейсиком и стеком прекрасно живёт. До тех пор, пока юзер не надумает сделать LOAD. Что в принципе можно обойти, только надо ли. Главный плюс -- запускается что при наличии TR-DOS, что с микродрайва, что с ленты. Опять же кто по существу не согласен -- ламиры и должны умереть. В деталях может можно и лучше.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя