PDA

Просмотр полной версии : Имитация GOTO из машкода



Jukov
13.09.2006, 21:42
Допустим, у нас есть две строки:
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
типа прикидываемся

Jukov
16.09.2006, 10:45
}{а-ха-ха. Вот и не угадали. На самом деле надо изменить лишь одну переменную - CHADD 23645 (она указывает на следующий интерпретируемый символ). Необходимо, чтобы она указывала на символ возврата каретки в строке 20. Тогда всё будет тип-топ.

Southern Bear
16.09.2006, 10:51
Никто и не гадал. Не уж то ты думаешь, что я написал сюда не проверив?

Jukov
16.09.2006, 12:47
Спасибо. Нашёл ошибку. Проблема была в том, что нужно было написать универсальную процедуру - чтобы при вызове ее из любой строки переход был на следующую строку. Моим первым вариантом было:
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 стеке.