Из журнала Deja Vu #05, Кемерово, 01.07.98 (C) Max/CYBERAX Software __________________________________________ Загрузка и запуск бейсик-файлов. Думаю все знают, как в boot'ах обычно запускаются программы. Имя файла кидается в строку бейсика (вместо пробелов в коман- де RUN " " ), затем эта строка за- пускается. В данной статье я расскажу, как можно загрузить и запустить бейсик-программу без использования подобного рода фокусов. Программа в листинге написана с актив- ным использованием фрагментов ПЗУ TR-DOS, поэтому не удивляйтесь ее корявому виду. Пусть есть конкретный файл,который нуж- но запустить. Также допустим, что мы зна- ем заголовок этого файла (16 байт). Для загрузки будем использовать некий драйвер, умеющий читать 'B' секторов в адрес 'HL' с дорожки и сектора 'DE' (метка LOAD). Опос- ля загрузки, драйвер должен заносить пос- ледний трек и сектор в переменную #5CF4. CLEAR желательно иметь установленным на 65367. Первым делом перекинем заголовок в ад- рес HEADER, равный 23773. Номер файла же- лательно занести в #5D1E. Затем запускаем следующую прогу: BAS_RUN LD DE,(23635);начало бейс. пр. LD HL,(23641);обл. ред. строки DEC HL PUSH HL PUSH DE AND A SBC HL,DE ;в HL получили длину старой беисик-проги, ;т.е той, что находится (или не находится) ;в памяти до загрузки. LD DE,(HEADER+9) ;в DE взяли из заголовка длину нового бей- ;сика, т.е. того, который нужно грузить. PUSH DE PUSH HL LD HL,5 ADD HL,DE ;длину новой проги увеличили на 5 байт. LD (23771),HL ;засунули в переменную, как в TR-DOS. POP HL POP BC POP DE POP HL PUSH BC CALL #19E5 ;удаляем старый бейсик, сдвигая память. POP BC CALL #1655 ;резервируем место для нового. INC HL LD BC,(HEADER+11) ;взяли из заголовка длину нового бейсика ;без программных переменных. ADD HL,BC ;прибавили адрес начала. LD (23627),HL ;установили системную переменную VARS. LD HL,(23635) ;HL - куда будем грузить. LD A,(23772) ;старший байт длины. LD B,A LD DE,(HEADER+14) ;DE - трек и сектор. LD (#5CF4),DE DEC B INC B CALL NZ,LOAD ;если есть что грузить - грузим. LD A,(23771) AND A JR Z,NOLOW ;равен ли нулю младший байт длины? PUSH HL LD DE,(#5CF4) LD HL,BUF LD B,1 CALL LOAD ;грузанули последний сектор в буфер. POP DE LD BC,(23771) LD B,0 LD HL,BUF LDIR ;остаток перебросили куда надо. NOLOW LD HL,(23641) DEC HL LD (HL),128 ;занесли на всякий случай маркер конца. INC HL INC HL LD E,(HL) INC HL LD D,(HL) ;взяли строку автостарта LD (23618),DE ;и занесли ее в соотв. переменную. XOR A LD (23620),A ;занулили номер оператора в строке. LD (23824),A CALL #16B0 ;точно не помню что такое, кажется очистка ;стека калькулятора. LD HL,(23635) DEC HL LD (23639),HL ;сделали RESTORE. LD HL,(23613) LD (23827),HL EXX LD HL,10072 EXX LD IY,#5C3A LD (IY),255 SET 7,(IY+1) RES 5,(IY+1) ;прочие установки. JP 7037;запуск... BUF DEFS 256;буфер загрузки. Располагать сию программу лучше в эк- ранной области. Неплохо бы почистить скрин перед передачей управления в ПЗУ, как это делает TR-DOS. Например, вместо JP 7037: LD HL,7037 PUSH HL JP 3435 В заключении хочу выразить благодар- ность Федину П.Ю. за книгу "Полное описа- ние и полный дизассемблер TR-SOS 5.04T (5.03)".