Помогите с задачкой для i8080

Тема в разделе "WASM.ELECTRONICS", создана пользователем Madziba, 9 дек 2008.

  1. Clear_Energy

    Clear_Energy Алексей

    Публикаций:
    0
    Регистрация:
    3 ноя 2008
    Сообщения:
    375
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Clear_Energy
    То что нужно, благодарим.
     
  3. Madziba

    Madziba New Member

    Публикаций:
    0
    Регистрация:
    9 дек 2008
    Сообщения:
    10
    Спасибо. Но мне с моими знаниями даже это трудно.
     
  4. Madziba

    Madziba New Member

    Публикаций:
    0
    Регистрация:
    9 дек 2008
    Сообщения:
    10
    Напишите пожалуйста, как это должно выглядеть для i8080. я так понимаю это совсем просто.
     
  5. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    тут глянь.
    http://download.referat.su/13624.zip

    погугли: кр580вм80 ассемблер
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Вот рабочий код, потестил на эмуляторе:
    Код (Text):
    1. ;l = x
    2. ;h = y
    3. ;a = z
    4. ;Result in DE, if overflow then de = -1
    5. Calculate:
    6. ld l,10
    7. ld h,5
    8. ld a,5
    9.        push af
    10.        ld a,l   ;x
    11.        call Square
    12.        jr c,Carry
    13.        push bc
    14.        ld a,h   ;y
    15.        call Square
    16.        jr c,Carry
    17.        pop hl   ;x^2
    18.        ld a,l
    19.        sub c
    20.        ld l,a
    21.        ld a,h
    22.        sbc b
    23.        ld h,a
    24.        jr c,Carry
    25.        pop af
    26.        push af
    27.        Call Square
    28. ;bc = z^2
    29. ;hl = (x^2 - y^2)
    30.        ld de,0
    31. Subs:
    32.        ld a,l
    33.        sub c
    34.        ld l,a
    35.        ld a,h
    36.        sbc b
    37.        ld h,a
    38.        jr c,Quit
    39.        inc de
    40.        jr Subs
    41. Carry:
    42.        ld de,-1
    43. Quit:
    44.        pop af
    45.        ret
    46.  
    47. ;IN a
    48. ;OUT in bc = a^2
    49. Square:
    50.        ld d,a
    51.        ld e,a
    52.        ld bc,0
    53. Sqr:
    54.        ld a,c
    55.        add d
    56.        jr c,Sqr_cf
    57. Sqr_Step:
    58.        ld c,a
    59.        ld a,e
    60.        sub 1
    61.        ld e,a
    62.        jr nz,Sqr
    63.        ret
    64. Sqr_cf:
    65.        push af
    66.        ld a,b
    67.        add 1
    68.        ld b,a
    69.        jr nc,Sqr_Step_Jmp
    70.        pop af
    71.        ret
    72. Sqr_Step_Jmp:
    73.        pop af
    74.        jr Sqr_Step
    Madziba
    Тебе таблицу дали, просто поменяй опкоды.
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Clerk
    Нубский кодес, нужно свести умножение/деление к сдвигам и сложению/вычитанию.
    С умножением проблем нет, вот с делением проблемы, регистров не хвотает, проц кривой.
    Код (Text):
    1. ;8080
    2. ;IN b = x, c = y
    3. ;OUT bc = (x * y)
    4. Multiply:
    5.         push h
    6.         push d
    7.         mov e,b
    8.         lxi h,0
    9.         mov d,h
    10.         mov b,1
    11. Mul_Loop:
    12.         mov a,c  ;x
    13.         ana b   ;i
    14.         jz Mul_Next
    15.         dad d
    16. Mul_Next:
    17. ;Rotate de
    18.         xchg
    19.         dad h
    20.         xchg
    21.         mov a,b
    22.         ral
    23.         mov b,a
    24.         jc Mul_Loop
    25.         mov b,h
    26.         mov c,l
    27.         pop d
    28.         pop h
    29.         ret
     
  8. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    умножение: сдвинул - перенос есть? да - сложил / нет - пропустил - цикл...
    деление: здесь есть код, правда, для начинающего сложноват...
    можно было бы и подумать, просто времени сейчас нет

    здесь есть поясняющая картинка к делению

    в начале делимое (31 бит) расположено: старшая часть на верхушке стека, младшая - в паре DE, делитель (16 бит) - в паре BC, после деления результат на месте делимого, а в HL - остаток от деления

    возможно, что HL вначале нужно обнулить (не помню)
     
  9. Ra_Sh

    Ra_Sh New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2008
    Сообщения:
    46
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    shoo
    Это не оптимально, нужно наверно определить номер первого бита слева в делимом и сдвинуть влево на число разрядов до этой единицы слева делитель. Только потом выполнить цикл сдвигов/вычитаний, иначе тяжёлые проверки получаться не нужными. Тут думаю достаточно 16-разрядных чисел, поэтому умножение должно быть 8 x 8 бит, а деление 16 / 16 бит, ибо разность квадратов делится на z^2, если z 8-разрядное, то его квадрат должен быть 16-разрядным.
     
  11. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    Clerk
    мне уже лень шевелить мозгами в этом направлении :) это просто готовый работоспособный код, причем рожденный в творческих муках лет 12 тому назад (ввиду отсутствия тогда у меня соответствующих примеров и литературы). сначала был вариант 1993 года 16/16 без использования стека, но эту берестяную грамоту уже никто не найдет.
    ----
    пока писал - вспомнил. да, я тоже сначала сдвигал все влево, так как приводил механизм деления к делению в столбик, но оно оказалось более громоздким.

    (и тогда я считал такты гораздо тщательней, чем сейчас - 2МГц все-таки ;) )
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Значит с учётом сказанного получаетсо так:
    Код (Text):
    1. Calculate:
    2.     mov b,c ;x
    3.     Call Multiply   ;x^2
    4.     push b
    5.     mov b,e ;y
    6.     mov c,e
    7.     Call Multiply   ;y^2
    8.     pop d
    9.     mov a,c
    10.     sub e
    11.     mov c,a
    12.     mov a,b
    13.     sbb d
    14.     jc Carry
    15.     mov b,a
    16.     push b
    17.     mov c,l
    18.     mov b,l
    19.     Call Multiply   ;z^2
    20.     lxi h,0
    21.     pop de
    22.     push h
    23.     Call Division
    24.     pop bc
    25.     ;de = result.
    26.     ret
    27. Carry:
    28.     lxi d,-1
    29.     ret
     
  13. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    проверял? ;)

    вот вам код. правда, делил не на 15^2 а на 3^2, так как получается 0 (неинтересно), а так - 8 (на экранчике 8h естественно)

    [​IMG]
     
  14. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    Clerk
    позже я подумал - наверное ты прав. просто я сначала сдвигал все влево - и делимое, и делитель, которые выравнивал друг против друга, поэтому и получалось коряво. но я уже не хочу ее дорабатывать :) пока не вижу смысла :)