Важная информация
Показано с 1 по 8 из 8

Тема: Имитация GOTO из машкода

  1. #1
    Activist Аватар для Jukov
    Регистрация
    03.12.2005
    Адрес
    Серов
    Сообщений
    471
    Благодарностей: 65

    По умолчанию Имитация 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, но тот же глюк.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2

    По умолчанию

    ld HL,#0014
    ld (#5C42),HL
    ld A,1
    ld (#5C44),A

  4. #3

    По умолчанию

    чё, думаете умные такие?
    Развивайся, эволюционируй.

  5. #4

    По умолчанию

    типа прикидываемся

  6. #5
    Activist Аватар для Jukov
    Регистрация
    03.12.2005
    Адрес
    Серов
    Сообщений
    471
    Благодарностей: 65

    По умолчанию

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

  7. #6

    По умолчанию

    Никто и не гадал. Не уж то ты думаешь, что я написал сюда не проверив?
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	next_ln0.PNG 
Просмотров:	291 
Размер:	3.1 Кб 
ID:	3783   Нажмите на изображение для увеличения. 

Название:	next_ln1.PNG 
Просмотров:	288 
Размер:	2.4 Кб 
ID:	3784  

  8. #7
    Activist Аватар для Jukov
    Регистрация
    03.12.2005
    Адрес
    Серов
    Сообщений
    471
    Благодарностей: 65

    По умолчанию

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

  9. #8
    Member
    Регистрация
    08.02.2006
    Адрес
    Москва
    Сообщений
    30
    Благодарностей: 3

    По умолчанию

    Цитата Сообщение от Jukov
    Допустим, у нас есть две строки:
    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 стеке.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •