PDA

Просмотр полной версии : Компилирование готовых программ



CityAceE
31.10.2005, 14:41
В то время, как я ещё активно писал TRDN, для меня собрать новую версию было целой мукой: скомпилировать, скопрессировать, прислюнить сектор состояний, и все это присовокупить к бейсик-загрузчику... И совсем другое дело на более современных платформах - там на выходе после компиляции сразу получаешь исполняемый файл. Дима Быстров научился делать тоже самое и на Спектруме, то есть всё то, что я делал вручную, собирая очередную версию TRDN, AlCo полностью автоматизировал... Хотелось бы научиться делать так же... Как минимум я смог бы скомпилировать очередную версию коммандера, так как я в него вносил изменения, но в то время поленился собрать новую версию.

Но вот гляжу я на исходники самособирающегося AcEdit и АБСОЛЮТНО ничего в них не понимаю :( Не понимаю как программа сама собирается, как запускается компрессор, как всё это присоединяется к Бейсику и делается моноблок и т.д. и т.п. Наверняка же кто-то,кроме AlCo разбирался со этими вещами и сможет доходчиво пояснить как сделать всё то же и в своей программе! Поделитесь подробным рецептом! Не думаю, что это будет интересно только мне одному.

bugsy
31.10.2005, 15:38
а мне лень было разбираццо и я всё ручками.
ну для автоматизации применял модуль аласмовый savebas.h

captain cobalt
31.10.2005, 16:45
Inferno Guide #5 -> code -> Автосборщики

Spectre
02.11.2005, 12:42
Я разбирался. Вкратце: при запуске mk*.b он загружает файл аласма, в котором перехватывает процедуру опроса клавиатуры и имитирует нажатие кнопок "загрузить проект *.H, скомпилировать его", потом опять с помощью перехвата забирает себе управление и подгружает с диска упаковщик hrust2!4 (он работает в экранной области) и запускает его, потом сохраняет бэйсик и код на диск и склеивает их.

Мне самому показалась такая система слишком громоздкой и я для сборки Quick Commander'а делаю так:

В исходнике есть переменная compile=0 и подпрограмма (переделка SAVEBAS.H и SAVECOD.H из комплекта аласма):



IFN compile
KUDABAS=#6000
KUDACOD=#7000
ORG #C000,1 ;грузим упаковщик хруста в #11 страницу
HRQC
INCBIN "HRQC" ;#500 упаковщик Hrust 2.1, работает с адреса #4000
HRQClen=$-HRQC
ORG #5B00
QCSAVER
DI
LD BC,#7FFD
LD A,#11
OUT (C),A
LD HL,HRQC
LD DE,#4000
LD BC,HRQClen
LDIR
LD HL,QCSTART
LD DE,KUDACOD
LD BC,QCLENGTH
CALL #4000 ;PACK, на выходе: HL-где упакованный блок, BC-длина
PUSH BC ;TOTAL LENGTH
ADD HL,BC
XOR A
LD (HL),A ;затираем нулями мусор в конце
INC HL
INC H
DEC H
JR NZ,$-4
LD A,H
INC L
DEC L
JR Z,$+3
INC A
LD (LENGTH),A ;длина кодового блока для загрузчика
LD HL,#5D3B ;сюда компилируется basic часть QC
LD DE,KUDABAS
LD BC,#100
LDIR
LD HL,BASNAME
CALL SETNAME
;СОХРАНЯЕМ СИСТЕМНЫЕ УКАЗАТЕЛИ
PROG EQU #5C53 ;начало BASIC программы
SVARS EQU #5C4B ;конец программы, начало переменных
E_LINE EQU #5C59 ;конец переменных (начало буфера строки)
ARUN EQU #5CD1 ;Здесь TR-DOS хранит номер строки старта
LD HL,(SVARS)
PUSH HL
LD HL,(PROG)
PUSH HL
LD HL,(E_LINE)
PUSH HL
;ПЕРЕИНИЦИАЛИЗИРУЕМ ИХ, ЧТОБЫ ПОСЛЕ ТОГО,
;КАК ТР-ДОС СОЗДАСТ БУФЕР ДЛЯ ОПЕРАЦИЙ С КАТАЛОГОМ,
;ОНИ УКАЗЫВАЛИ НА НАШУ ПРОГУ, КОТОРУЮ МЫ ЗАПИСЫВАЕМ.
LD HL,KUDABAS-#101
LD (PROG),HL
LD HL,BASEND-#5D3B+KUDABAS-#101
LD (SVARS),HL
INC HL
LD (E_LINE),HL
LD HL,1
LD (ARUN),HL
LD C,#C
CALL #3D13
;ВОССТАНОВИМ УКАЗАТЕЛИ НА СТАРУЮ ПРОГУ
POP HL
LD (E_LINE),HL
POP HL
LD (PROG),HL
POP HL
LD (SVARS),HL
LD HL,CODNAME
CALL SETNAME
LD HL,KUDACOD
POP DE ;длина
LD C,#B ;Create
JP #3D13
BASNAME DB "QC B" ;имя basic
CODNAME DB "QC C" ;имя code
SETNAME LD C,#13 ;УСТАНОВИМ ИМЯ ФАЙЛА
CALL #3D13
LD A,9 ;ПОИСК ПО 8+1 СИМВОЛАМ
LD (#5D06),A
LD C,#A ;Find
CALL #3D13
INC C
LD C,#12 ;Delete
CALL NZ,#3D13
RET
DISPLAY "Warning! After RUN project have been saved."
ENDIF


(здесь выкинута basic часть, считается что она скомпилирована в #5D3B, конец обозначен меткой BASEND).

Если мне нужно собрать QC, я устанавливаю в исходнике compile=1 и компилирую, потом запускаю (RUN) и на диске появляются файлы QC.B и QC.C. Можно переделать чтобы сразу моноблок появлялся, но мне нужно было чтобы именно 2 файла получались.

Чем мне удобен такой вариант, что я подправив что-то в исходнике, нажав 2 кнопки (A и R) получаю готовую версию на диске не выходя из аласма.

yevrowl
22.09.2025, 00:12
Какими способами можно компилировать код на Sinclair Basic?

Или, возможно, есть способ сделать автозагрузку для программы (https://zx-pk.ru/threads/36358-brain-teaser.html) при загрузке образа кассетной ленты?

Shiny
25.09.2025, 09:35
Какими способами можно компилировать код на Sinclair Basic?

Или, возможно, есть способ сделать автозагрузку для программы (https://zx-pk.ru/threads/36358-brain-teaser.html) при загрузке образа кассетной ленты?

bas2tap или zmakebas (https://github.com/z00m128/zmakebas)

yevrowl
11.10.2025, 14:51
Что-нибудь можно сделать, если после заставки пробел сбрасывает?


BREAK - CONT REPEATS

При этом другие клавиши нормально запускают основную программу.

Shiny
11.10.2025, 16:25
что-что?(:

yevrowl
11.10.2025, 18:11
что-что?(:

См. вложение — 82940

Shiny
11.10.2025, 18:30
Как вариант
75 IF INKEY$=" " THEN GO TO 75
или после заставки продолжать загрузку и вывести сообщение "press any key" после завершения.

yevrowl
11.10.2025, 19:00
Как вариант
75 IF INKEY$=" " THEN GO TO 75

Спасибо, этот вариант прокатил. Что интересно, пытался перенаправить пробел на LOAD "", однако при таком варианте снова BREAK.

SlashNet
11.10.2025, 21:41
Не понимаю этого желания вставлять принудительное требование нажать клавишу для продолжения загрузки.

Если, например, человек загружает игру с кассеты.
То он должен в процессе загрузки неотрывно следить когда загрузится картинка чтоб успеть нажать любую клавишу.
Если не успел, то ему придётся отматывать кассету назад на несколько секунд. И после этого догружать основную часть программы.

Почему нельзя сделать "press any key" уже после окончательной загрузки программы?

yevrowl
11.10.2025, 22:15
Если, например, человек загружает игру с кассеты.
То он должен в процессе загрузки неотрывно следить когда загрузится картинка чтоб успеть нажать любую клавишу.
Если не успел, то ему придётся отматывать кассету назад на несколько секунд. И после этого догружать основную часть программы.
Разумно, и в голову не пришло — видимо немного отвык от кассетной загрузки с незабываемыми звуками. =)


Почему нельзя сделать "press any key" уже после окончательной загрузки программы?

А как это можно реализовать?
Есть загрузчик, картинка в SCR и основная программа. Собираю вместе, и грузятся по очереди...

SlashNet
11.10.2025, 22:34
А как это можно реализовать?
Есть загрузчик, картинка в SCR и основная программа. Собираю вместе, и грузятся по очереди...

Попробовать перенести опрос нажатия любой клавиши в самое начало основной программы (перед командой очистки экрана). Я бы так сделал, но я мало что смыслю в программировании под Спектрум.

yevrowl
12.10.2025, 00:10
Попробовать перенести опрос нажатия любой клавиши в самое начало основной программы (перед командой очистки экрана). Я бы так сделал, но я мало что смыслю в программировании под Спектрум.

Способ хороший, спасибо. Один только недостаток — теперь часть заставки перекрывает надпись.

82942

SlashNet
12.10.2025, 01:59
Вроде, есть какой-то способ не выводить данную надпись.

null_device
12.10.2025, 07:01
yevrowl, есть "костыльные" методы.
* Делать перед загрузкой блока PAPPAR 8, INK 8, OVER 1: PRINT AT y,x; в строке, где ничего не нарисовано.
*Использовать в имени блока управляющий код позиции печати, который дополнительно скроет идентификатор блока, напечатав поверх него имя файла.
* Переключить канал вывода данных. Обычно, это принтер. Но в случае кривой реализации интерфейса, можно получить зависшую машину.
* Использовать машинно-кодовую процедуру загрузки файла без заголовка.

- - - Добавлено - - -

https://zx-pk.ru/threads/340-load-troubles.html

breeze
12.10.2025, 13:44
Способ хороший, спасибо. Один только недостаток — теперь часть заставки перекрывает надпись.

82942


Был такой один хитрый POKE ;)

POKE 23743,80 приводит к тому, что мы не можем получить на экране никакой информации, в том числе и листинга.

yevrowl
12.10.2025, 14:21
Был такой один хитрый POKE ;)

POKE 23743,80 приводит к тому, что мы не можем получить на экране никакой информации, в том числе и листинга.

Спасибо, для заставки этот метод помог.
А вот как возвращать печатание текста на экран:
POKE 23743,83

Shiny
12.10.2025, 15:25
Спасибо, для заставки этот метод помог.
А вот как возвращать печатание текста на экран:
POKE 23743,83

использовал POKE 23739,CODE "o". Понятно, что нужно восстановить значение, но не пользовался процедурами ROM.