так вот про то и речь, а говорят, что попадает в 0 страницу.
конечно, фиг знает, может ли это где помешать...
Вид для печати
ИМХО как раз тот случай, когда не баг, а фича =)
помешать вряд ли, потому что вроде как компиляция в ПЗУ при желании сохранить только снапшот выглядит странной...:confused:
Но чисто теоретически вот такое:
дает неожиданный результат ( вместо "abcd" имеем "test" в нулевой банке ).Код:device zxspectrum128
main
org 0xc000
page 0
db "abcd"
org 0
db "test"
savesna "test.sna", main
С директивой page все ок. Вот тока "test", который компилится позже, затирает "abcd".
Вот более показательный пример:
Код:device zxspectrum128
main
org 0xc000
page 0
db "abcd"
abcdLen equ $ - 0xc000
page 1 // does not matter
org abcdLen
db "test"
savesna "test.sna", main
В компиляторе с 0х0000 по 0x3FFF находится по умолчанию 0-ая страница. Или нужно было там разместить дамп ПЗУ? Не вижу смысла, ведь режим ZXSPECTRUM128 и прочие созданы только для упрощения разработки программ для спектрума. Компилятор не эмулирует спектрум ;)
Страницу с 0х0000 по 0x3FFF можно изменить следующим образом:В снапшот формата SNA, ПЗУ сохранить нельзя.Код:SLOT 0
PAGE страница
SLOT 3 ; по умолчанию - пространство с 0xC000 по 0xFFFF.
Теперь понятно зачем это. Руль!:)
SAVETAP нужен однозначно. Сэкономит кучу времени.
Только вот фиксированного загрузчика кодов не надо. Иначе смысл какой делать?
Тогда уж и на savetrd такой-же загрузчик прикручивать надо
идею поддерживаю, только надо бы иметь возможность записывать тап без заголовка
в полученном снапшоте с адреса 0x5c00 - мусор ( системные переменные и какой-то загрузчик? а зачем? )Код:device zxspectrum128
org 0x6000
start
savesna "output.sna", start
Писание чего-либо в скобках дает лишний ноль:
ld a, (1+2)
Результате дает #3e, 3, 0
Зачем?
До кучи вопрос - а округлять как? Скажем мне надо из #0124 получить #02. Ну или целочисленно поделить на 256.
Проверил, такого результата не бывает. Возможно два варианта:
3e,NN - ld a, N
3a,NN,NN - ld a, (N)
Судя по всему, признаком первой команды для компилятора является отсутствие внешних скобок, хотя возможно, что есть какие-то нюансы.
Можно как предлагает Vitamin, но возникнет сложность с адресами, большими чем #ff00 - результат не влезет в байт. Тут можно обрезать результат , используя and или mod, но проще через оператор high - high (addr + 255).
Целочисленно поделить на 256 - high N.
Что меня смутило в документации SjAsMPlus'а, так это опраторы сдвига:
x>>y shift right signed
x>>>y shift right unsigned
В чем состоит суть signed сдвига? Не меняется старший бит или что? Я этого не заметил. Назовите значение, на котором эти операторы будут работать по-разному.
Везде, где установлен старший бит.
Например:
0x8000 - это 32768 для беззнаков и -32768 для знаковых
Делаем сдвиг к младшим разрядам (делим на 2) двумя способами:
беззнаково- получаем 0x4000- 16384 в обоих нотациях, что неверно для знаковых
знаково- получаем 0xc000- 49152 для беззнака, что неправильно и -16384 для знаковых, что правильно :)
Ладно, ага. Спасибо. У меня тупилово-режим включился.
2Aprisobal
наскока реально имплементировать нечто похожее в макросах?
имеется ввиду ##.Код:#include <iostream>
#define MY_MACRO( arg ) arg##_test();
void ff_test()
{
std::cout << "ff_test";
}
void main()
{
MY_MACRO( ff );
}
Antipod, пока ничего дельного не придумал.
2Aprisobal
реализовано... правда, не через ##, а через '_'.
измененные сорцы ( по отношению к 1.07-rc7 ) прилагаются - tables.zip.
из ридми:
там уже, ессесна, на твое усмотрение включать в проект или нет.Цитата:
short sample:
-----
macro MyMacro arg
call arg_f
endm
MyMacro test
-----
will be expanded to:
-----
call test_f
-----
комментарии приветствуются.
Как средствами SjAsmPlus сохранить басик с автостартом? А то монолоадер без автостарта - это не гут.
2Aprisobal
расширена функциональность:
сорцы, исходник на котором тестировалось, и виндозный бинарник прилагаются.Код:short sample:
-----
macro MyMacro arg0, arg1
call arg0_f
call arg0_arg1
call arg1_arg0
endm
MyMacro abc, def
-----
will be expanded to:
-----
call abc_f
call abc_def
call def_abc
-----
2All
прошу протестировать бинарник на совместимость с оригинальной версией и сообщить о багах. Спасибо заранее.
2Aprisobal
пофиксил некоторые баги, файлы обновил. Теперь работает как мне надо.
Мож мне кто-то ответит на мой вопрос?
если мне не изменяет память, автозагрузка зависит от адреса в описателе файла, вот кусок от Doors где генериться 100% автозагружаемый басик:
Код:DEVICE ZXSPECTRUM128
DEFINE KERNEL_KAY
;DEFINE KERNEL_SCORP
;DEFINE KERNEL_ATM
EMPTYTRD "../bin/doors.trd"
;MODULE MonoLoader
org #6000
bootBegin
include "bootloader/boot.asm"
bootEnd
org #4000
DISP 23867
Basic db #00,#00 ; basic number string [#00,#01]
dw EndBasic-Begin ; size of basic string
Begin db #FD ; "CLEAR" token
db #30 ; "0" fake numeber
db #0e,#00,#00
dw #5fff ; real stack (CLEAR) [#5fb3]
db #00
db #3a ; ":"
db #f9 ; "RANDOMIZE" token
db #c0 ; "USR" token
db #30 ; "0" fake numeber
db #0e,#00,#00
dw #5d53 ; real call (USR) [#5d53]
db #00
db #3a ; ":"
db #ea ; "REM" token
include "bootloader/basicboot.asm"
db #D
EndBasic
ENT
SAVETRD "../bin/doors.trd","boot.B",16384,EndBasic-Basic
SAVETRD "../bin/doors.trd","bootcode.C",bootBegin,bootEnd-bootBegin
У меня тоже не работает. У тебя работает скорее всего потому, что бут у тебя запускает басики не "LOAD "name"", а "RUN "name""
boo_boo прав, именно в этом и проблема - вручную я могу проставить автостарт, а средствами сьясма - хрен. В итоге занимаюсь извращениями в стиле - сначала отассемблировали и записали на диск с автостартом в теле программы, потом всё удалили, убрали автостарт из тела и опять записали. Поскольку сьясм трдшки не чистит, получается как бы с автостартом.
Ну короче мировые флуктуации космоса мы не учитываем. Вопрос открыт.
билд-скрипт проще написать, чем код чужого немаленького проекта править. другое дело, что доработка сжасма общественно-полезное дело, а написание билд-скрипта нет..
(мне, правда, не очень понятно, за что народ любит совмещать билдинг и кодинг в одном ассемблерном файле, но любит, эт факт.)
приделал к сжасму версии 1.07 RC7 запись в трд с автостартом, во вложении измененные файлы.
как работает: в SAVETRD к старту и длине добавил необязательный параметр -- номер строки автостарта. если оно есть, то к концу файла дописываюца заветные 4 байта, длина файла в байтах остается прежней, длина в секторах при надобности увеличиваеца. тип файла пофиг. пример на основе кода breeze:
ЗЫ LUA-интерфейс не менял, бо ломает разбираться с toloa, просто отключил там доп. параметрКод:DEVICE ZXSPECTRUM128
EMPTYTRD "test.trd"
org #4000
DISP 23867
Basic db #00,#01 ; basic number string [#00,#01]
dw EndBasic-Begin ; size of basic string
Begin db #FD ; "CLEAR" token
db #30 ; "0" fake numeber
db #0e,#00,#00
dw #5fff ; real stack (CLEAR) [#5fb3]
db #00
db #3a ; ":"
db #f9 ; "RANDOMIZE" token
db #c0 ; "USR" token
db #30 ; "0"
db #0e,#00,#00
dw #0000 ; сброс!
db #00
db #3a ; ":"
db #ea ; "REM" token
db "FUCK"
db #D
EndBasic
ENT
SAVETRD "test.trd","boot.B",16384,EndBasic-Basic,1