Загрузка BASIC программы

Помощь новичкам в программировании процессора Z80. Обмен исходниками, идеями.

Модератор: Spectre

Ответить
Bally
junior
Сообщения: 6
Зарегистрирован: Ср янв 10, 2007 11:37

Загрузка BASIC программы

Сообщение Bally » Пт янв 19, 2007 10:12

Подскажите пожалуйста, как из Васика загрузить и запустить Васиковскую программку.
Пользуюсь эмулятором EmuZWin v2.5
Вариант типа
randomize usr 15619:rem:load"vasic" line 1
не покатил (((.
Задача такая - нужно вначале загрузить кусок кода (тоесть музыка, спрайты, или что то в этом роде) потом загрузить основную васик программу, которая будет обращаться randomize usr-ами к загруженным кодам. Управлять ими можно будет с помощью poke-ов.

Striker
activist
Сообщения: 189
Зарегистрирован: Пн июн 26, 2006 13:31

Сообщение Striker » Пт янв 19, 2007 12:47

Не понимаю, а почему бы сначала не загрузить Бейсик а потом коды ? В принципе так более распостранено :)
http://trd.speccy.cz
ZX-Spectrum Rulez Forever!

Bally
junior
Сообщения: 6
Зарегистрирован: Ср янв 10, 2007 11:37

Сообщение Bally » Пт янв 19, 2007 13:43

потому что команда Clear которая обычно при загрузке кодов присутствует обнуляет все переменные и массивы васика, хранить их еще где то влом - легче вначале коды загрузить

Prusak
junior
Сообщения: 8
Зарегистрирован: Вт июн 27, 2006 11:57

Сообщение Prusak » Пт янв 19, 2007 14:26

Так если сохранить BASIC-программу с автозапуском (типа SAVE "filename" LINE 1), то при загрузке она сама запустится, поэтому RANDOMIZE USR 15619:REM: LOAD "filename" должно прокатить.

Striker
activist
Сообщения: 189
Зарегистрирован: Пн июн 26, 2006 13:31

Сообщение Striker » Пт янв 19, 2007 15:41

Bally писал(а):потому что команда Clear которая обычно при загрузке кодов присутствует обнуляет все переменные и массивы васика, хранить их еще где то влом - легче вначале коды загрузить

Погоди, так обычно ж по правилам такую команду ставят в начале бейсик - программы, а потом объявляют переменные и массивы. Я конечно не сильный кодер, но на васике чё та писал :)
http://trd.speccy.cz
ZX-Spectrum Rulez Forever!

Bally
junior
Сообщения: 6
Зарегистрирован: Ср янв 10, 2007 11:37

Сообщение Bally » Пт янв 19, 2007 16:02

Prusak

возможно если с автозапуском сохранить покатит - попробую, без автозапуска,не катило.

Striker

Погоди, так обычно ж по правилам такую команду ставят в начале бейсик - программы, а потом объявляют переменные и массивы. Я конечно не сильный кодер, но на васике чё та писал

команда Clear - просто очищает область для васика.
Да, - но при загрузке любого кода в память, ее тоже надо ставить, она еще и устанавливает верхнюю границу васик программы (RAMTOP кажется так наз-ся), тут надо тоже смотреть, чтобы загружаемый код, не перехлестнулся с васиком, который есть.

Аватара пользователя
Spectre
Добрый и отзывчивый
Сообщения: 253
Зарегистрирован: Пн июн 26, 2006 1:16

Re: Загрузка BASIC программы

Сообщение Spectre » Пт янв 19, 2007 22:35

Bally писал(а):Подскажите пожалуйста, как из Васика загрузить и запустить Васиковскую программку.
Пользуюсь эмулятором EmuZWin v2.5
Вариант типа
randomize usr 15619:rem:load"vasic" line 1
не покатил (((.
LOAD - просто загружает программу, если она записана без автостарта она не запустится. Используйте RUN:

randomize usr 15619:rem:run "vasic"

В этом случае неважно есть ли автостарт. Но на всякий случай автостарт делают всегда.
Bally писал(а):Задача такая - нужно вначале загрузить кусок кода (тоесть музыка, спрайты, или что то в этом роде) потом загрузить основную васик программу, которая будет обращаться randomize usr-ами к загруженным кодам. Управлять ими можно будет с помощью poke-ов.
Никаких проблем. На кассетах я такое раньше часто встречал: одна прога грузит картинку и основную прогу.
Bally писал(а):потому что команда Clear которая обычно при загрузке кодов присутствует обнуляет все переменные и массивы васика, хранить их еще где то влом - легче вначале коды загрузить
Как правило переменные и массивы бэйсика задают в начале работы программы. Устанавливать им значения, а потом надеятся что они нигде не потеряются - несколько сложнее. Тем более что без CLEAR'а вам не обойтись - по умолчанию стэк установлен на конец памяти (~65000) и ваши кодовые программы могут им затерется.

Bally
junior
Сообщения: 6
Зарегистрирован: Ср янв 10, 2007 11:37

Сообщение Bally » Сб янв 20, 2007 1:01

Спасибо - получилось, - run "vasik" не ставил - помогло просто запуск с автораном.

fk0
junior
Сообщения: 3
Зарегистрирован: Пн ноя 26, 2007 22:49

Сообщение fk0 » Пн ноя 26, 2007 23:26

Код: Выделить всё

; (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]

fk0
junior
Сообщения: 3
Зарегистрирован: Пн ноя 26, 2007 22:49

Re: Загрузка BASIC программы

Сообщение fk0 » Пн ноя 26, 2007 23:46

Spectre писал(а):
Bally писал(а):Подскажите пожалуйста, как из Васика загрузить и запустить Васиковскую программку.
Пользуюсь эмулятором EmuZWin v2.5
Пользуюсь чиста реальным пентагоном... (а вообще уже ничем не пользуюсь).
Вариант типа
randomize usr 15619:rem:load"vasic" line 1
не покатил (((.
Мануал по бейсику почитать?

[qiuote]
LOAD - просто загружает программу, если она записана без автостарта она не запустится. Используйте RUN:
Бугагагага. LOAD, RUN -- последняя вообще смертельна (для состояния программы и переменных). Для того MERGE.
На кой ляд автозапуск, ежели ОНО ИЗ БЕЙСИКА загружается, то не сложно
и GOTO сделать куда нужно...
Bally писал(а):потому что команда Clear которая обычно при загрузке кодов присутствует обнуляет все переменные и массивы васика, хранить их еще где то влом - легче вначале коды загрузить
... (слов цензурных нет). А ты clear не давай с адресом выше начала кодов.
Можешь вообще коды выше RAMPTOP положить. Ты их из бейсика CLEAR'ом
ну никак вообще стереть не сможешь. Только если через POKE.
Тем более что без CLEAR'а вам не обойтись - по умолчанию стэк установлен на конец памяти (~65000) и ваши кодовые программы могут им затерется.
Ахтунг! А если стек значить ниже #6000 то ничего не трётся только потому, что он (стек) короткий? Так разницы вобщем никакой где он лежит. Ну хорошо, вообще, если в ~#FFxx, а не в #8000 например. А какая в ()() разница. Стек не более чем область памяти в ~>=512 байт. И чего? Пихать стек первым делом в #6000 и ниже не более чем ламерство. Да потому, что потом LIST из TR-DOS не работает хотя бы...

Адекватная "кодовая" программа прекрасно размещается в сверхдлинной REM-строке бейсик-программы. Откуда и запускается (через USR и, подчеркну особо, PEEK <PROG>, ибо куда бейсик загрузили в общем случае неизвестно --
кто не согласен что так -- злобные ламеры и должны умереть). Далее перемещается
LDDR'ом (ибо вверх всегда) в нужный адрес, гробиться бейсик (точней -- усекается
до 0 строк и переменных -- ибо при вызове TR-DOS'а он её будет по памяти, бейсик-программу всмысле, вверх-вниз таскать, а это вовсе ни к чему) и запускается (ассемблер). Опционально в этой-же стадии распаковывается. Да, ещё до копирования/распаковки стек через, ДА CLEAR, ставится в #FFFF, после чего он ничему не мешает, если не заставлять его расти бесконечно вниз -- но >4килобайт рекомендую таки взять и отдать под это дело, да и под бейсик больше сектора (256 байт) тоже (ибо TR-DOS). Всё. Ассемблер между бейсиком и стеком прекрасно живёт. До тех пор, пока юзер не надумает сделать LOAD. Что в принципе можно обойти, только надо ли. Главный плюс -- запускается что при наличии TR-DOS, что с микродрайва, что с ленты. Опять же кто по существу не согласен -- ламиры и должны умереть. В деталях может можно и лучше.
[ZX]

Аватара пользователя
Spectre
Добрый и отзывчивый
Сообщения: 253
Зарегистрирован: Пн июн 26, 2006 1:16

Re: Загрузка BASIC программы

Сообщение Spectre » Чт дек 06, 2007 16:53

fk0 писал(а):
Spectre писал(а): LOAD - просто загружает программу, если она записана без автостарта она не запустится. Используйте RUN:
Бугагагага. LOAD, RUN -- последняя вообще смертельна (для состояния программы и переменных). Для того MERGE.
А вы merge в деле пробовали? Сначала попробуйте и с удивлением узнаете для чего она нужна и случаи когда merge не работает.

Заменять же LOAD/RUN на merge мне вообще непонятно зачем.
fk0 писал(а):На кой ляд автозапуск, ежели ОНО ИЗ БЕЙСИКА загружается, то не сложно и GOTO сделать куда нужно...
Ага, теперь понял зачем merge - чтобы потом GOTO сделать переход?.. Только зачем так сложно, если проще сделать тот же RUN и знать что загруженная basic программа всегда загрузится и стартанет с первой строки?
fk0 писал(а):
Bally писал(а):потому что команда Clear которая обычно при загрузке кодов присутствует обнуляет все переменные и массивы васика, хранить их еще где то влом - легче вначале коды загрузить
... (слов цензурных нет). А ты clear не давай с адресом выше начала кодов.
Можешь вообще коды выше RAMPTOP положить. Ты их из бейсика CLEAR'ом ну никак вообще стереть не сможешь. Только если через POKE.
С первым советом согласен, второй же выглядит странным: как я уже писал выше, RAMTOP при инициализации установлен примерно на 65000, много Вы кодов в 500 байт запихнете?
fk0 писал(а):
Spectre писал(а): Тем более что без CLEAR'а вам не обойтись - по умолчанию стэк установлен на конец памяти (~65000) и ваши кодовые программы могут им затерется.
Ахтунг! А если стек значить ниже #6000 то ничего не трётся только потому, что он (стек) короткий? Так разницы вобщем никакой где он лежит. Ну хорошо, вообще, если в ~#FFxx, а не в #8000 например. А какая в ()() разница. Стек не более чем область памяти в ~>=512 байт. И чего? Пихать стек первым делом в #6000 и ниже не более чем ламерство. Да потому, что потом LIST из TR-DOS не работает хотя бы...
Вы, Кирилл, не путайте понятия стек и RAMTOP (буквально переводя "верхняя граница памяти"). Я веду речь отталкиваяь от RAMTOP'а, который и устанавливается при помощи комманды CLEAR. Стек - вы можете пихать куда угодно, заботясь лишь о том чтобы пресловутые "~>=512 байт" под ним ничего ценного не затерли. А вот на RAMTOP завязано много вещей, в том числе и очистка памяти, которая выполняется до этого порога, открытие разных буферов (в том числе и для упомянутого LIST). Если вы хотите "не по ламерски" знать что с вашими данными в памяти ничего не случится, ставьте первыми же коммандами вашей программы RAMTOP (при этом и стек выставится) ниже ваших данных.

Кивание на LIST с выводом про ламерство выглядит не слишком профессиональным.

В современных условиях и наших реалиях, все что доверяют basic/tr-dos - это загрузить программу на асме и запустить её. Все остальное (к сожалению) приходится делать самому.
fk0 писал(а):Адекватная "кодовая" программа прекрасно размещается в сверхдлинной REM-строке бейсик-программы. Откуда и запускается (через USR и, подчеркну особо, PEEK <PROG>, ибо куда бейсик загрузили в общем случае неизвестно --
кто не согласен что так -- злобные ламеры и должны умереть). Далее перемещается
LDDR'ом (ибо вверх всегда) в нужный адрес, гробиться бейсик (точней -- усекается
до 0 строк и переменных -- ибо при вызове TR-DOS'а он её будет по памяти, бейсик-программу всмысле, вверх-вниз таскать, а это вовсе ни к чему) и запускается (ассемблер). Опционально в этой-же стадии распаковывается. Да, ещё до копирования/распаковки стек через, ДА CLEAR, ставится в #FFFF, после чего он ничему не мешает, если не заставлять его расти бесконечно вниз -- но >4килобайт рекомендую таки взять и отдать под это дело, да и под бейсик больше сектора (256 байт) тоже (ибо TR-DOS). Всё. Ассемблер между бейсиком и стеком прекрасно живёт. До тех пор, пока юзер не надумает сделать LOAD. Что в принципе можно обойти, только надо ли. Главный плюс -- запускается что при наличии TR-DOS, что с микродрайва, что с ленты. Опять же кто по существу не согласен -- ламиры и должны умереть. В деталях может можно и лучше.
Ваше право, можете и так делать. Но считать этот способ единственно верным - довольно самонадеянно.

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость