Просмотр полной версии : Имитация GOTO из машкода
Допустим, у нас есть две строки:
1 PRINT "AAAA"
5 PRINT "BBBB"
10 RANDOMIZE USR 30000: PRINT "A"
20 PRINT "B"
По адресу 30000 необходимо поместить процедуру, которая бы передавала управление сразу на строку 20. Я попробовал увеличить на единицу системную переменую NEW PPC, а PPC в ноль. Но при этом почему то несколько раз выполнлась строка 5, хотя никакого намёка на цикл даже нет. Пробовал и через 1B7D, как описано в ZX/Ревю 94/2, но тот же глюк.
Southern Bear
15.09.2006, 23:36
ld HL,#0014
ld (#5C42),HL
ld A,1
ld (#5C44),A
Darkman007
16.09.2006, 07:50
чё, думаете умные такие? :biggrin:
Southern Bear
16.09.2006, 08:51
типа прикидываемся
}{а-ха-ха. Вот и не угадали. На самом деле надо изменить лишь одну переменную - CHADD 23645 (она указывает на следующий интерпретируемый символ). Необходимо, чтобы она указывала на символ возврата каретки в строке 20. Тогда всё будет тип-топ.
Southern Bear
16.09.2006, 10:51
Никто и не гадал. Не уж то ты думаешь, что я написал сюда не проверив?
Спасибо. Нашёл ошибку. Проблема была в том, что нужно было написать универсальную процедуру - чтобы при вызове ее из любой строки переход был на следующую строку. Моим первым вариантом было:
ld hl,(#5c42)
inc hl
ld (#5c42),hl
xor a
ld (#5c44),a
ret
Но как теперь выяснилось, переменная 5С42 содержала не номер строки с RANDOMIZE, а номер строки, с которой была запущена программа. Поэтому несколько раз выполнялась вторая строка программы. Правильно:
ld hl,(#5c45)
inc hl
ld (#5c42),hl
ld a,1
ld (#5c44),a
ret
klondike
01.10.2006, 15:12
Допустим, у нас есть две строки:
1 PRINT "AAAA"
5 PRINT "BBBB"
10 RANDOMIZE USR 30000: PRINT "A"
20 PRINT "B"
По адресу 30000 необходимо поместить процедуру, которая бы передавала управление сразу на строку 20. Я попробовал увеличить на единицу системную переменую NEW PPC, а PPC в ноль. Но при этом почему то несколько раз выполнлась строка 5, хотя никакого намёка на цикл даже нет. Пробовал и через 1B7D, как описано в ZX/Ревю 94/2, но тот же глюк.
Посмотри любой мой загрузчик.
http://zxaaa.untergrund.net/RIP.html
Там в защите богато на тему перехода в бейсике между строками, операторами и по RETURN.
Например, выполнение бейсика после REM
Все достигается путем подмены системных переменных и адреса в RETURN стеке.
Powered by vBulletin® Version 4.2.5 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot