PDA

Просмотр полной версии : Загрузка блока(Bytes) из aссемблера



amfirifma
12.03.2017, 21:56
Как загрузить блок (с заголовком!) стандартным способом из ассемблера,
т.е. аналогично команде BASIC
LOAD""CODE ?

пробовал вариант:

LD IX,30000
LD DE,1000
LD A,0 ;0 - блок с заголовком, 255 - без
SCF
CALL 1366 ;(или 2050)
RET

при 0 - происходит щелчок, но не выбивает имя блока, (если загрузить его в экранную область, - рисует линии, т.е. воспринимает заголовок, как блок данных. Сразу после этого склеивается с самими блоком данных и загрузка продолжается, но мне нужно высветить заголовок блока!
Методом "тыка" нашел такое:
если поставить вместо call 1366 - call 1568,
тогда заголовок выбивается на экране, но не идет загрузка последующего блока :(
Я не знаю ассемблера, но очень хочется :)
Помогите пожалуйста.
Пробовал в EmuZWin
и чуток в Spectaculatorе.

goodboy
13.03.2017, 00:07
тут два варианта

1 пользоваться встроенными процедурами, но тогда надо подготовить хотя-бы адрес для загрузки заголовка,
кроме того для печати необходимы системные переменные, то есть бейсик функционирует.
непонятно зачем тогда нужно грузиться именно из маш.кода
2 делать всё самому.
в том числе и печать заголовка

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


LD A,0 ;0 - блок с заголовком, 255 - без
SCF
CALL 1366 ;(или 2050)

неправильное понимание ситуации.
у любого блока данных (при сохранении стандартными процедурами) есть два невидимых байта.
первый это тип данных, последний - контрольная сумма.
у заголовка это #00, у данных #ff / 255

call 1366 тупо грузит (или сверяет) данные,
напечатать заголовок она не в состоянии

amfirifma
13.03.2017, 02:05
Когда мы вводим в бейсике LOAD""CODE (после проверки что это за команда и какие у нее параметры) происходит же переход по какому-то адресу в памяти к процедурам ее обслуживающим? Можно как-то узнать какой это адрес и из машинных кодов перейти по этому адресу?
После LOAD""CODE блок будет грузиться по адресу по которому он записан, и мы же не указываем его длину, а тем более куда записать его заголовок. Или я чего-то не понимаю.
самое смешное что пару раз заголовок и данные грузились, но в следущий разы (после закрытия эмуля) уже почему-то нет.
Адрес в IX - это только адрес для данных? Как подготовить адрес для заголовка? Есть ли процедура печатающая заголовок?
Как-то же печатается заголовок, если запускать call 1568 вернее 1569 (SA-SPACE). Может можно дернуть начало из этой процедуры, а потом перейти к call 1366?
Сделал весь "загрузчик" на ассемблере и споткнулся на вроде бы ровном месте.
Простите за словесный поток :)

Spectramine
13.03.2017, 03:04
http://zx-pk.ru/threads/14994-kniga-quot-polnyj-dizassembler-pzu-zx-spectrum-quot-na-russkom.html?p=422404&viewfull=1#post422404

amfirifma
13.03.2017, 11:56
Спасибо, посмотрел, но в деле не продвинулся, не хватает знаний. Может кто-нибудь поможет собрать такую процедуру, а я вам интересную темку представлю :)

jerri
13.03.2017, 13:44
amfirifma, в книге смотри адрес 0605 Save-etc это точка загрузки\записи и тд

amfirifma
13.03.2017, 13:56
C Nonsense in Basic :(
Может надо задать какие-то входные параметры перед call 1541 ?

Spectramine
13.03.2017, 14:25
Если нужна полная копия команды бейсика (с проверкой и выводом заголовка и т.п.), проще выйти из машкода в бейсик, загрузить блок командой бейсика, и вернуться в машкод. Использовать код ПЗУ команд бейсика слишком муторно, легко не получится.

Из машинного кода обычно грузят блоки с заранее известными параметрами - адресом начала загрузки, длиной и флаговым байтом. Где-то так:

LD IX, адрес начала загрузки
LD DE, длина блока кодов
LD A,#FF (или другой флаговый байт в самом начале блока. бейсик использует 0 для заголовков, 255 для собственно блоков)
SCF
INC D
EX AF,AF'
DEC D
DI
CALL #0562 (#0556 в случае ошибки загрузки выйдет в бейсик)
JP NC, обработка ошибки загрузки. например, повтор


Если точно известно, что перед блоком кодов идёт заголовок, нужно написать сначала подобный код для заголовка:
LD IX, адрес буфера для заголовка
LD DE, 17
LD A,0
SCF
INC D
EX AF,AF'
DEC D
DI
CALL #0562
JP NC, обработка ошибки загрузки

Gutten
13.03.2017, 15:47
а для чего в этих примерах дёргать регистр D?
INC D
EX AF,AF'
DEC D

Spectramine
13.03.2017, 16:05
Чтобы обнулить флаг ZF - ZF=0 индицирует необходимость сверки флагового байта в процессе загрузки. После сверки флагового байта ZF =1, и остальные байты грузятся в память. Т.е. если ZF=1 перед EX AF,AF', флаговый байт будет загружен в память, как и все остальные, без его сверки.

amfirifma
13.03.2017, 16:23
если так:
LD IX,50000 ;не знаю подходит ли этот адрес под буфер?
LD DE,17
LD A,0
SCF
INC D
EX AF,AF'
DEC D
call #0562
;JP NC, обработка ошибки загрузки. например, повтор - не знаю что тут писать и в принципе мне не надо проверок на ошибки
LD IX,30000
LD DE,16198
LD A,255
SCF
INC D
EX AF,AF'
DEC D
call #0562
;JP NC, обработка ошибки загрузки
RET

то - есть нормальный щелчок заголовка, но нет самого заголовка на экране. (Загрузка дальше продолжается нормально.)
Может можно что-то добавить, чтобы он все таки выводился? Как-то ж он выводится при call #0621 (1569)?!

Spectramine
13.03.2017, 16:49
Выводится примерно так, если убрать все лишнее из ПЗУшного кода.

LD A,#FE ; Обеспечивается откры-
CALL #1601 ; CHAN-OPEN тие канала 'S'.
LD IX, адрес буфера заголовка
LD A,(IX+0)
LD DE,#09C0 ; таблица сообщений типов блоков на ленте
CALL #0C0A ; PO-MSG
LD B,10
L1 INC IX
LD A,(IX+0)
RST #10
DJNZ L1
LD A,#0D
RST #10

krt17
13.03.2017, 19:27
А если не секрет зачем вам это? Просто никогда ни у кого не видел подобного. И не потому что это какая то сверх задача, это никому не было нужно.

amfirifma
13.03.2017, 19:41
Заработало !!!!!:v2_dizzy_roll: со "скрипом":v2_dizzy_punk:

в таком варианте:
LD IX,50000
LD DE,17
LD A,0
SCF
INC D
EX AF,AF'
DEC D
call #0562

LD A,#FE
CALL #1601
LD IX, 50000
LD A,(IX+0)
LD DE,#09C0
CALL #0C0A
LD B,10
L1 INC IX
LD A,(IX+0)
RST #10
DJNZ L1
LD A,#0D
RST #10

LD IX,30000
LD DE,16198
LD A,255
SCF
INC D
EX AF,AF'
DEC D
call #0562

RET

Не на всех заголовках, правда, но получилось выкрутиться. Буду проверять в разных условиях.
БЛАГОДАРЕНЬ ВСЕМ ОТКЛИКНУВШИМСЯ!

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

Постараюсь нам показать в ближайшее время :)

Black Cat / Era CG
13.03.2017, 20:44
Ваще адреса можно из заголовка брать.

amfirifma
15.03.2017, 14:30
Спасибо, но я не знаю, как это сделать... и уже так намучился, что оставлю последний вариант. Если у Вас есть желание оптимизировать этот код, буду благодарен. В принципе люди правы, что можно было просто вернуться в бейсик и сделать LOAD""CODE, но мне очень хотелось почувствовать себя "олдскулхацкером" :v2_dizzy_punk: А может это еще кому-то пригодится.

Gutten
15.03.2017, 15:03
Так а что там делать - заголовок ты в буфер уже загрузил, вот из этого буфера и бери адрес и длину загрузки файла.

Alex Rider
15.03.2017, 15:45
Имитация LOAD "" CODE. Не грузит не bytes, выдает Tape loadgin error, читает начало и длину из заголовка.



load_code:
ld ix,header
ld de,#0011
ld a,#00
scf
call #0556
jr nc,error

ld a,#02
call #1601
ld a,(header)
ld de,#09c0
call #0c0a
ld de,header + 1
ld bc,#000a
call #203c
ld a,#0d
rst #10

ld a,(header)
cp #03
jr nz,load_code

ld de,(header + #0b)
ld ix,(header + #0d)
ld a,#ff
scf
call #0556
ret c
error:
rst #08
db #1a

header: ds #11

Spectramine
15.03.2017, 16:13
В случае ошибки или BREAK процедура load_codе вернется в бейсик.

Alex Rider
15.03.2017, 17:19
В случае ошибки или BREAK процедура load_codе вернется в бейсик.
Да :) Просили аналог LOAD "" CODE, она выдает Tape loading error. Прежде, чем упасть в BASIC, оно придет на метку error, там можно сделать все по-своему.

Spectramine
15.03.2017, 17:23
Но если нажать BREAK, не получится сделать по-своему, вернется в бейсик с ошибкой Break- CONT repeats. А так да, аналог LOAD "" CODE.

Alex Rider
15.03.2017, 20:26
Но если нажать BREAK, не получится сделать по-своему,
Ну, допилим по требованиям закачика ;-)

amfirifma
17.03.2017, 22:26
Всем спасибо! Вот, что получилось:
http://zx-pk.ru/threads/27516-pilotonika-muzx!-ili-muzyka-na-pilot-tone.html

Spectramine
17.03.2017, 23:34
Мда, я лажанул конкретно. Прерывания запрещать надо перед загрузкой, если #0562 вызывать.
amfirifma, перед вызовом процедуры загрузки надо поставить команду DI. Без неё у меня ни в одном эмуле Pilottonika не заработала. А перед выходом в бейсик или чтением клавиатуры через системные переменные надо включить прерывания командой EI.

amfirifma
17.03.2017, 23:55
У меня в 2х эмулях работает, правда, есть странность - если менять заголовок у программы может развалиться заголовок(герб) у Bytes, или из-за управляющих символов или это я там так "напрагромиравал". :)

Spectramine
18.03.2017, 00:00
Нет, это именно из-за включенных во время загрузки прерываний)

Bedazzle
18.03.2017, 10:47
Всем спасибо! Вот, что получилось:
http://zx-pk.ru/threads/27516-pilotonika-muzx!-ili-muzyka-na-pilot-tone.html

Прикольно. :)

amfirifma
18.03.2017, 14:51
Прикольно. :)

Спасибо! Мне кажется Вас может заинтересовать еще эта тема:
http://amfirifma.livejournal.com

Bedazzle
18.03.2017, 23:52
Спасибо! Мне кажется Вас может заинтересовать еще эта тема:
http://amfirifma.livejournal.com

Неплохая подборка, спасибо!
:)