Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
180 / 181 / 55
Регистрация: 08.04.2009
Сообщений: 1,309
1

Переделать прогу под эмулятор z80

07.06.2010, 11:37. Показов 2136. Ответов 5
Метки нет (Все метки)

Доброго всем времени суток.

Помогите переделать прогу написанную для "чемодана" КР580 под эмулятор z80
прога: в массиве определяет четные и нечетные числа, перебрасывает их в разные области памяти и четные сортирует по возрастанию, а нечетные по убыванию

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
     LXI H, 8060h          ; массив с четными                  
     SHLD 8100h
     LXI H, 8080h                   ; массив с нечетными
     SHLD 8200h
     LXI  D, 8040h                  ; исходный массив
     MVI C,10h
M1:  LDAX D
     ANI  01h
     JNZ M2
     LDA 8101h
     LXI H, 8000h
     MOV L, A
     LDAX D
     MOV M, A
     INR L
     MOV A,L
     LXI H, 8101h
     MOV M, A
     INX D
     DCR C
     JNZ M1
     JMP M3
M2:  LDA 8201h
     LXI H, 8000h
     MOV L, A
     LDAX D
     MOV M, A
     INR L
     MOV A, L 
     LXI H, 8201h
     MOV M,A
     INX D
     DCR C
     JNZ M1
M3:  MVI C, 10h ; сортировка по возрастанию 
go:  MOV D,C
     LXI H, 8060
Loop: MOV A,M
     INX H
     CMP M
     JC go0
     MOV B,M
     MOV M,A
     DCX H
     MOV M,B
     INX H
go0: DCR D
     JNZ Loop
     DCR C
     JNZ go
     MVI C, 10h ; сортировка по убыванию
go1: MOV D,C
     LXI H, 8080
Loop1: MOV A,M
      INX H
      CMP M
      JC go2
      JMP go3
go2: MOV B,M
     MOV M,A
     DCX H
     MOV M,B
     INX H
go3: DCR D
     JNZ Loop1
     DCR C
     JNZ go1
     HLT
Вот я пытался переделать:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
    jmp start
array:  db  01h, 02h, 03h, 04h, 07h, 0Fh, 0Dh, 06h, 0Ah, 0Bh, 09h, 05h, 08h, 00h, 0Ch, 0Eh;8040
array1: db  00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h;8060
array2: db  00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h;8080
index1: db  00h, 00h;8100 выдел 2-е ячейки
index2: db  00h, 00h;8200
 
start:
     LXI H,index1
     LXI H,index2
     LXI H, array1                            
     SHLD index1
     LXI H, array2
     SHLD index2
     LXI  D, array
     MVI C,10h
M1:  LDAX D
     ANI  01h
     JNZ M2
     LDA index1
     INC A
     LXI H, array1
     MOV L, A
     LDAX D
     MOV M, A
     INR L
     MOV A,L
     LXI H,  index1
     INX H
     MOV M, A
     INX D
     DCR C
     JNZ M1
     JMP M3
M2:  LDA index2
     INC A
     INX 
     LXI H, array2
     INX H
     MOV L, A
     LDAX D
     MOV M, A
     INR L
     MOV A, L 
     LXI H, index2+1
     MOV M,A
     INX D
     DCR C
     JNZ M1
M3:  MVI C, 10h
go:  MOV D,C
     LXI H, array1
Loop: MOV A,M
     INX H
     CMP M
     JC go0
     MOV B,M
     MOV M,A
     DCX H
     MOV M,B
     INX H
go0: DCR D
     JNZ Loop
     DCR C
     JNZ go
     MVI C, 10h
go1: MOV D,C
     LXI H, array2
Loop1: MOV A,M
      INX H
      CMP M
      JC go2
      JMP go3
go2: MOV B,M
     MOV M,A
     DCX H
     MOV M,B
     INX H
go3: DCR D
     JNZ Loop1
     DCR C
     JNZ go1
 rst 07
hlt
end
Одна из проблем, по-моему вот здесь:
При работе на "чемодане" так работает, а на эмуляторе нет, прога не хочет перебрасывать четные и нечетные
Assembler
1
2
LDA index1
     INC A
Assembler
1
2
  SHLD 8100h
LDA 8101h
Assembler
1
2
LDA index2
     INC A
Assembler
1
2
  SHLD 8200h
LDA 8102h
Народ, помогите пожалуйста, очень-очень нужно
Заранее спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.06.2010, 11:37
Ответы с готовыми решениями:

кто может переделать прогу с под С++ билдера на ВинАпи?
кто может переделать прогу с под С++ билдера на ВинАпи? если кто-то сможет тогда дам саму прогу...

Выручайте! Нужно переделать прогу под двусвязный список.ничего не понимаю)
#include <iostream> #include <conio.h> struct Node { int memSize; Node *Next; };...

возможно ли переделать код алгоритма под Borland C переделать под Borland Delphi?
Подскажите возможно ли переделать код алгоритма под Borland C переделать под Borland Delphi? У меня...

Переделать прогу
Вот дана прога, которая переводит римские числа в арабские: Program Lab_3; Uses crt; Const ...

5
69 / 74 / 0
Регистрация: 15.12.2008
Сообщений: 302
07.06.2010, 13:22 2
могу ошибаться, но один раз писал под 80 эмулятор и команды LDA и STA нельзя было использовать
может ваш случай
0
4198 / 1790 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
07.06.2010, 13:49 3
Цитата Сообщение от vet Посмотреть сообщение
При работе на "чемодане" так работает, а на эмуляторе нет, прога не хочет перебрасывать четные и нечетные
не в этом деле, а в том, что регистры Z80 A, B, C, D, E, H, L, F имеют разрядность 8 бит, а 16 бит, например, HL.

Добавлено через 3 минуты
Цитата Сообщение от vet Посмотреть сообщение
MOV M, A
спектрумовский ассемблер этого не поймёт, надо писать LD вместо MOV и числовые адреса вместо имён переменных и процедур. Но может ли крос ассемблер перевести это в в спектрумовский код - не заню.
0
69 / 74 / 0
Регистрация: 15.12.2008
Сообщений: 302
07.06.2010, 14:09 4
http://www.codenet.ru/progr/asm/z80i8080.php
0
180 / 181 / 55
Регистрация: 08.04.2009
Сообщений: 1,309
07.06.2010, 14:52  [ТС] 5
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
jmp start
array:  db 10h,10h,3h,7Fh,9Ah,4Bh,50h,90h,4Fh,6Ah
start:
    lxi h,array
    lxi d,8000h
    mvi b,5
m0: mov a,m
    inx h
    add m
    inx h
    xchg
    mov m,a
    inx h
    xchg
    dcr b
    jnz m0
    ;hlt
     rst 07
     end
Эта небольшая прога (попарные суммы элементов массива) работает на эмуляторе z80

Не по теме:

Как нам объясняли этот эмулятор, по умолчанию, работает в режиме эмуляции i8080


но блин ни как разобраться не могу с той прогой =(
0
180 / 181 / 55
Регистрация: 08.04.2009
Сообщений: 1,309
09.06.2010, 12:34  [ТС] 6
Помогите, пожалуйста с другой прогой:

Ввести через запятую последовательность чисел (произвольной длины), нажать "=" и вывести на экран попарные суммы элементов массива

я ее сделал, но остался один глюк (мозги просто уже не варят не фига) надо вывести все суммы,а у меня выводит тока 1-ю, т.к. нада как-то зациклить вывод массива с суммами

Assembler
1
2
3
4
5
6
7
out:        
 
    call    pair_sum
; ----- здесь надо добавить цикл для вывода всего массива сумм arr
    lda arr            ; Вывод результата
    call to_decimal
    call    print
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
jmp start
array:  db  00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h
arr:  db  00h,00h,00h,00h,00h,00h,00h,00h,00h,00h
start:
    mvi b,0
    lxi h,array
enter:
    call read   
    sui '0'
    mov m,a
    inx h
    inr b
 
    call read
    sui ','
    jnz exit
    
    call read
    sui '0'
    mov m,a
    inx h
    inr b
 
    call read
    sui '='
    jnz enter
    jmp out
out:        
 
    call    pair_sum
; ----- здесь надо добавить цикл для вывода всего массива сумм arr
 
    lda arr            ; Вывод результата (пока выводит тока 1-ю ячейку)
    call to_decimal
    call    print
 
    jmp exit
 
;----------------------------------------------------------------------------
;   Перенос курсора на новую строку
 
next_line:
    push    D       ;сохранение в стеке
    mvi E,0Ah       ;Перевод строки
    call    out_char
    mvi E,0Dh       ;Возврат каретки
    call    out_char
    pop D       ;извлечение из стека
    ret
 
;----------------------------------------------------------------------------
;   Вывод символа в консоль
 
 
out_char:
    push    H
    push    B
    push    D
    mov B,A     ;Сохранение значения в аккумуляторе в стек
    push    B
    mvi C,2     ;2 - номер функции BDOS.
                ; Функция извлекает код символа из регистра E
                ; и выводит его в консоль.
    call    0005h
    pop B       ;Извлечение значения в аккумуляторе из стека
    mov A,B
    pop D
    pop B
    pop H
    ret
 
;----------------------------------------------------------------------------
;   Считывает 1 байт с клавиатуры (Записывает в A)
 
read:
    push    b
    push    h
    mvi c, 01h
    call    0005h
    pop h
    pop b
    ret
 
;----------------------------------------------------------------------------
;   Печатает 1 байт (Берётся из A)
 
print:
    push    b
    push    d
    push    h
    push    psw         ;сохранить счетчик
    mov e, a
    mvi c, 02h
    call    0005h
    pop psw         ; восстаовить счетчик
    pop h
    pop d
    pop b
    call next_line
    ret
 
;----------------------------------------------------------------------------
;   Перевод байта в десятичное число 
;   сумма не должна быть больше 9
 
to_decimal:
    push    b
    mvi b, 30h
    add b
    pop b
    ret
 
;----------------------------------------------------------------------------
;   Попарное сложение
 
pair_sum:
 
    lxi H,array
    lxi d,arr
    ;lxi d,8000
m0:     mov a,m  ;1-е число из память в А
    inx h    ;+1 ячейка
    add m    ;2-е число из пямяти + 1-е число которое в А
    inx h    ;+1 ячейка (для слудующего шага)
    xchg     ;обмен данными между регистрами
        mov m,a ;записывает результат в другую область памяти
        inx h ; +1 ячейка
    xchg     ; меняем обратно
    dcr b    ;уменьшаем счетчик b
    jnz m0   ; если b != 0 то переход на m0
 
 
    ret
exit:
    mvi a, 13h;
    call    print
    jmp start
hlt
rst 07
end
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.06.2010, 12:34

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Как переделать прогу из С++ в С#
Только начал изучать C#?Нужно в переделать из С++ Вот прога: #include <stdio.h> #include...

Нужно переделать прогу
Пожалуста, помогите переделать програму с одного задания на другое... Нужно сделать что бы...

Нужно переделать прогу
Собственно есть некая программа, она написана еще на QBASIC, на старой 16разрядной винде,...

Переделать прогу. Серия
Даны целые числа K, N, а также K наборов целых чисел по N элементов в каждом наборе. Для каждого...

Нужно переделать прогу!
Нужно переписать код, чтобы не было меток)))) #include<math.h> #include<stdio.h>...

Как переделать прогу??
Вот программа на языке си++. как её переделать в си??? там надо вроде cout изменить....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.