<< Вернуться к содержанию





О многозадачности на Пълдине. Простой пример.

Исходник от 2-задачного монитора для ненастоящей мультизадачности,
но примерно подобно Windows95, основанный на том, что когда программа
стоит, она дает системе знать, и система дает работать другой задаче.

В этот монитор можно с лёгкостью добавить несколько задач и
принудительное переключение по таймеру и получить полноценное ядро.


        org     $100

        section 0
rega    ds      1
regb    ds      1
regx    ds      1
regp    ds      1
regsp   ds      1
regpc   ds      1
regs_size = *
        ends

        jmp     init
task1
        ldx     #text1
        int     $23
        jsr     peekMSG
        bra     task1
text1   db      10, 'Task 1',0

task2
        ldx     #text2
        int     $23
        jsr     peekMSG
        bra     task2
text2   db      10, 'Task 2',0

init
        ldx     #rtask1
        ldab    #/task1
        ldaa    #task1
        lds     #stack1
        psha
        pshb
        sts     x, regsp

        ldx     #rtask2
        ldab    #/task2
        ldaa    #task2
        lds     #stack2
        psha
        pshb
        sts     x, regsp

        ldx     #tasklist
        stx     ctask
        ldx     0, x
        jmp     peekMSG1

peekMSG
        stx     tempx
        ldx     ctask
        ldx     0, x
        staa    x, rega
        stab    x, regb
        ldaa    tempx
        staa    x, regx
        ldaa    tempx+1
        staa    x, regx+1
        sts     x, regsp

        ldx     ctask
        inx
        inx
        stx     ctask
        ldx     0,x
        bne     peekMSG1
        ldx     #tasklist
        stx     ctask
        ldx     0,x
peekMSG1
        lds     x, regsp
        ldaa    x, rega
        ldab    x, regb
        ldx     x, regx
        rts

tempx   dw      0
ctask   dw      tasklist

tasklist dw     rtask1, rtask2, 0

rtask1  ds      regs_size
rtask2  ds      regs_size
        ds      $100
stack1  ds      $100
stack2  ds      $100