привет, напомните как из бейсика загрузить файлы по нужному мне адресу?
---------- Post added at 20:05 ---------- Previous post was at 20:05 ----------
файлы с дискеты
Вид для печати
привет, напомните как из бейсика загрузить файлы по нужному мне адресу?
---------- Post added at 20:05 ---------- Previous post was at 20:05 ----------
файлы с дискеты
randomize usr 15619: rem: load "name" code <куда надо>.
Перед этим сделать CLEAR <адрес кодового блока-1>.
например код грузится 25000, КЛЕАР надо делать 24999.
Пишешь прямо в Basic что-то типа такого:
Потом пишешь RUN и вуаля!PHP код:10 CLEAR 24499
20 RANDOMIZE USR 15619: REM: LOAD "code1" CODE 24500
30 RANDOMIZE USR 24500
Если прога перемещаемая,то code при загрузке может-быть любой.
Да, такое часто бывает с упаковаными экранами. Грузить можно в любой адрес. Главное, чтоб в память и не выше стека.
Бейсик ведь не даст слишком низко клир сделать.
А вот интересно, почему в бейсике нужно CLEAR <адрес кодового блока-1> а на ассемблере - LD SP,<адрес кодового блока> (то есть без "-1"). Давно вопрос этот в голове, а всё руки не доходят выяснить?
когда выполняется CLEAR xxxxx, интерпретатор по адресу xxxxx заносит байт #3e (это маркёр для стека Go-Sub),далее стек опускается ещё на еденицу.если дальше загрузить код по адресу xxxxx он этот байт естественно затрёт, что повлияет на работу GoSub/Return. в принципе если не использовать подпрограммы в бейсике про этот момент можно забыть.
Стек конечно нужно из машкода устанавливать. А из бейсика вроде ниже #5cf4 (без ТР-ДОСа) не установить. Да и то зависит есть бесик программа или нет.
Из всего этого следует что стек госуб действует по какому-то другому принципу. Иначе нафига "стек опускается ещё на еденицу"? Ведь асмовский PUSH сперва декрементирует SP, а потом пихает байт и так два раза. А госубом занимается видимо интерпритатор и "стек" там не совсем стек, а что-то с наворотами. Так или не так?
Именно так, там еще идет очистка 5 байт ниже Go-Sub. И изменение кое-каких переменных.
Посмотрел ПЗУ, там или #3С или #01 или #ff, если стек сделать #3FFF, то возврат по RET можно организовать в зависимости от ПЗУ использующемуся в данный момент. Например Бейсик 48 #xx3c Бейсик 128 #xx01, ТР-ДОС #xxff. Чем не поле для деятельности? xx первый байт картинки для тех кто не понял.
Так ведь бейсик не даст туда стек поставить, а коды юзать - это уже неинтересно, в кодах можно ещё и не того наворотить...
Вот если бы заставить бейсик ставить стек куда угодно в ПЗУ - тогда да! Это круть! Можно всяких замуток придумать. Даже самонастраивающихся на конкретное ПЗУ :)
Где-то ведь хранится значение для CLEAR?
Или не? Прямо в SP? Да ну чушь порю, какое SP, в пзу куча call и т.д. SP при первом прерывании ласты склеит (точней не SP а то, на что он там указывает).
Бейсик ниже переменных не установит. Надо кстати насчет ПЗУ поэксперементировать)))
А какое-нибудь "POKE адрес значения CLEAR, нужный адрес"?
Так чтоб после отработки команды и попытки вернутся со стека снималось что-то из пзу (а можно и и озу, допустим строки с REM к о д ы) и прыгало куда надо?
Т.е. интерпритатор сделал наше поке и пытается разобрать следующую команду. Но стек уже в другом месте и возврат идёт куда нам надо.
Так не выйдет? (понимаю что тут нужно хорошо знать ПЗУ, да и всё равно рыть придётся, но мысль вроде занятная :) )
P.S. Как вариант - отлавливать не обработчик команды а прерывание (они ведь никогда не выключаются при бэйсике?). Тогда после поке стека в пзу - следующий-же фрейм начнётся с нужного адреса (если к этому времени система не ресетнётся нафик :) )
В загрузчике SiLN4 есть ксорка с использованием ПЗУ и ретом в конце обработки, надо дизассемблер ПЗУ читать. Скорее всего чтото есть.
---------- Post added at 22:47 ---------- Previous post was at 22:45 ----------
В Бейсике прерывание обрабатываются по IM 1. Тут вряд ли что можно изменить, разве что подмену ПЗУ.
Именно внятно, но по адресу #003c белиберда полная, надо вектор прерывания менять. Это в Бейсик 48. В Бейсике 128 #c300. Вылет гарантирован если там ничего нет. Но там хитрая связка Старт ПЗУ с 0.
Вектор прерывания в бейсике 48 на этот адрес
Так и бог с ним. Обработчик там есть. Пусть отработает и RET. А рет - уже куда нужно (стек-то уже там где надо, заранее выставлен POKE ).
В общем видимо нечего велосипед изобретать, подобный финт ушами использовали с переменной ERR SP (23613/14 IY+3 (#5C3D/3E)) чтоб на свою прогу прыгало прям из бейсика.