masterspammer (masterspammer) wrote,
masterspammer
masterspammer

Category:

Сохранение контекста - z80 vs i8080

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

Вводная - вот у нас есть переключение банков и код прерывания начинает работу в таких обстоятельствах:

1. SP показывает неизвестно куда (стек остался в прошлом банке, а у нас на этом месте что угодно, возможно даже место, где вот этот обработчик прерывания лежит)
2. оригинальное значение SP нужно восстановить при выходе (дальше банк переключится, оттуда считается адрес возврата и всё будет как надо)
3. нужно как-то сохранить все изменяемые регистры, как минимум AF

Для Z80 достаточно сделать вот так:

        LD [VARIABLE_TO_STORE_SP], SP // ED 73 XX XX
        LD SP, INTERRUPT_STACK_VALUE // 31 XX XX
        PUSH AF // F5
.... остальная часть работы
        POP AF // F1
        LD SP, [VARIABLE_TO_STORE_SP] // ED 7B XX XX
        EI // FB
        RETI // ED 4D - ну или RETN


В принципе не большая беда от того, что неизвестно значение SP. Аналогично обрабатываются системные вызовы, кроме того, можно сохранить один контекст, а восстановить совсем другой - с другими регистрами, включая SP и пререключить задачу.

Но я заметил, что команды сохранения и восстановления SP - с префиксом и подумал, а как там у предков? А вот для 8080 aka КР580ВМ80А такое простым способом сделать невозможно - сохранить SP просто так не получится - его можно только прибавить к HL командой DAD SP, испортив флаг C (есть команда SPHL, а вот команды HLSP нет), так что сначала нужно сохранить значение HL, потом A и флаги и только после этого разбираться со стеком.

Не то, чтоб меня сильно радовал 8080, но лежит советский клон 8085, да и вообще задача выглядит как вызов.

Если честно вспомнить школьные годы весёлый синтаксис интеловского ассемблера, то будет вот так.

        SHLD VARIABLE_TO_STORE_HL // 22 XX XX
        STA VARIABLE_TO_STORE_A // 32 XX XX
        MVI A, 0 // 3E 00
        JNC NO_C // D2 XX XX
        MVI A, 1 // 3E 01 - флаг C - нулевой бит
NO_C:  // теперь в A есть флаг C (и только он)
        LXI H, 0000 // 21 XX XX
        DAD SP // 39 - портит флаг C!
        SHLD VARIABLE_TO_STORE_SP // 22 XX XX
        LXI SP, INTERRUPT_STACK_VALUE // 31 XX XX
        // ура, нам можно использовать стек!
        PUSH PSW // F5
        POP H // E1
        // теперь в H - A (с верным флагом C), а в L - остальные флаги с порченым C, ну или наоборот - всегда это путал
        MOV A, L // 7D - тут флаги с порченым C
        ANI 0xFE // E6 FE - сбросить порченый C
        ORA H // B4 - теперь в A - правильные флаги
        MOV L, A // 6F
        LDA VARIABLE_TO_STORE_A // 3A XX XX
        MOV H, A // 67
        PUSH H // E5 - ура, в стеке теперь AF PSW
.... остальная часть работы
        POP PSW // F1
        LHLD VARIABLE_TO_STORE_SP // 2A XX XX

        SPHL // F9
        LHLD VARIABLE_TO_STORE_HL // 2A XX XX

        EI // FB
        RET // C9 - (и тут ещё отличать от возврата где-то внутри кода, префикс приделать)


Получается какая-то фронтальная трансректальная лоботомия ножкой от табуретки; может можно и упростить код, но несущественно - так или иначе, HL за SP, PSW за HL, черт за мертвецом, кошка за чертом, бородавка за кошкой и так далее. А если бы команда DAD SP портила все флаги (особенно частичный перенос), сказка бы была куда страшней и вообще только для взрослых.

Немножко радует, что системные вызовы RST не подразумевают обязательного сохранения регистров, как минимум флагов и там может быть проще.

Но всё же - 8085 откладываю подальше, а Z80 мегагерц так на 20 или кавасакиевский KC80 на 33 (который по тактам быстрее) буду мучать.
Tags: КомпьютерноеЖелезо, ФиксикиПокусали, Философское, ХочетсяСтранного
Subscribe

  • Автотелек (в нарезке)

    Прошлый раз, ковыряя телек, вот, кстати и он, нашёл странное - проволочную соплю от радиоблока до микросхемы 4052 (аналоговый мультиплексор) - вот…

  • Инсинуирую помаленьку

    Когда-то, почти уже в прошлой жизни, пишу поисковый полнотекстовый алгоритм, никого не трогаю. Морфология, индексы, всё как надо. Натыкаюсь на…

  • With a hundred futures cascading...

    На входные были планы и они удались. Так-то я хотел паять, но можно паять оперативно, можно тактически, а можно - стратегически. В данном случае…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments