4004. Прыжок в подпрограмму.

8-битные микроконтроллеры и микропроцессоры от Intel и их клоны, а также компьютеры на них построенные

Moderator: Shaos

bigdemounter
Junior
Posts: 6
Joined: 24 Jan 2017 08:26

4004. Прыжок в подпрограмму.

Post by bigdemounter »

Вот проверяю эту программу (в которой осуществляется переход в подпрограмму) в этом эмуляторе в пошаговом режиме.
Вот код программы

Code: Select all

000 D0    LDM 0
001 B0    XCH R0
002 50 0A JMS $00A
004 50 0A JMS $00A
006 50 0A JMS $00A
008 40 10 JUN $010
00A A0    LD R0
00B F2    IAC
00C F2    IAC
00D F2    IAC
00E B0    XCH R0
00F C0    BBL 0
После команды

Code: Select all

001 B0    XCH R0
в стек загружается адрес 3. По адресу 3 лежит байт 0A, но при возвращении из подпрограммы мы пропускаем байт 0A, и переходим сразу на адрес 4. Это, наверное, команда BBL так устроена (на схемотехническом уровне) чтобы выгружать из стека число, прибавлять к нему 1 и переходить на этот адрес?
Также команда BBL загружает в аккумулятор непосредственное число, записанное в команде (BBL 0 загужает ноль в аккумулятор). Подскажите, зачем это нужно и где применяется функция загрузки числа в аккумулятор при возврате из подпрограммы.
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: 4004. Прыжок в подпрограмму.

Post by Lavr »

bigdemounter wrote: Подскажите, зачем это нужно и где применяется функция загрузки числа в аккумулятор при возврате из подпрограммы.
Обычно такой способ применяется в микропроцессорах, где нет средств косвенного обращения к массиву чисел.
В частности, это характерно для микроконтроллеров PIC.
Но в них в большей мере это происходит из-за разделения памяти на память программ и память данных.
Чтобы считать массив из памяти программ как раз и используется возврат из подпрограммы с числом
в аккумуляторе - инструкция retlw byte.

Под спойлером пример кода для PIC16F84:

 Код для PIC16F84

Code: Select all

; Pitch lookup function
; w - аккулулятор PIC16F84, retlw - Return and Load W
pitchtable    clrf    PCLATH           ; Clear PCLATH for zero page
        addwf PCL,F
        retlw 0x11               ;C5  // Midi Code 60
        retlw 0x1F               ;C#
        retlw 0x2B               ;D
        retlw 0x37               ;D#
        retlw 0x42               ;E
        retlw 0x4D               ;F
        retlw 0x57               ;F#
        retlw 0x61               ;G
        retlw 0x6A               ;G#
        retlw 0x72               ;A (440)
        retlw 0x7A               ;Bb
        retlw 0x81               ;B
        retlw 0x89               ;C6 // Midi Code 72
        retlw 0x8F               ;Db
        retlw 0x96               ;D
        retlw 0x9C               ;Eb
        retlw 0xA1               ;E
        retlw 0xA7               ;F
        retlw 0xAC               ;F#
        retlw 0xB0               ;G
        retlw 0xB5               ;Ab
        retlw 0xB9               ;A (880)
        retlw 0xBD               ;Bb
        retlw 0xC1               ;B
        retlw 0xC4               ;C7 // Midi Code 84
        retlw 0xC8               ;Db
        retlw 0xCB               ;D
        retlw 0xCE               ;Eb
        retlw 0xD1               ;E
        retlw 0xD3               ;F
        retlw 0xD6               ;F#
        retlw 0xD8               ;G
        retlw 0xDA               ;Ab
        retlw 0xDC               ;A (1760)
        retlw 0xDE               ;Bb
        retlw 0xE0               ;
        retlw 0xE2               ;C8 // Midi Code 96

Аппаратное воплощение такой функции довольно несложно.
Я, к примеру, использовал его в своём самодельном 4-bit Processor.
В системе команд у меня там есть команда RET NIBBL - это как раз возврат из подпрограммы
с константой NIBBL в регистре A.
iLavr
bigdemounter
Junior
Posts: 6
Joined: 24 Jan 2017 08:26

Re: 4004. Прыжок в подпрограмму.

Post by bigdemounter »

Спасибо)