Прогнал Basic-тесты на реальном железе: БК 0010 и БК 0011М. Результаты БК 0010 немного отличаются от тех, что в таблице (насколько я понял, они получены из эмулятора). БК 0011М в таблице не было, так что встречайте новичка :)
Таблица БК 0010 и 0011
Вид для печати
Прогнал Basic-тесты на реальном железе: БК 0010 и БК 0011М. Результаты БК 0010 немного отличаются от тех, что в таблице (насколько я понял, они получены из эмулятора). БК 0011М в таблице не было, так что встречайте новичка :)
Таблица БК 0010 и 0011
Manwe, а можно было нормально поделиться, без вот этой гейской пропаганды? Она закрывает часть таблицы и её нельзя закрыть не вводя чего либо.
https://jpegshare.net/images/bc/58/b...e6697bd7f7.png
HardWareMan, например
https://pic.maxiol.com/images2/15871...15885.beka.png
F12.
Black Cat / Era CG, ради чего? Кто больше заинтересован в этом? Ответишь на вопрос - сразу всё поймёшь.
HardWareMan, да мне ж пофиг. Вижу фигню - убираю фигню. Все просто :)
Скорость исполнения команды MOV с разными типами адресации на БК 0010 и БК 0011М (частоты 3, 4, 6 МГц, память медленная штатная и быстрая статическая в контроллере дисковода).
Таблица
всё равно в остатке тоже фигня, которую хрен еще сохранишь нормально
- - - Добавлено - - -
я поставил было даже спасибку Manwe, поскольку за цифры никого не западло поблагодарить
- - - Добавлено - - -
но, измазавшись в этом яблочном повидле, забрал спасибку :v2_dizzy_biggrin2:
Очень интересная таблица, показывающая хотя бы в частном случае разницу между 6502 и 65816. Да и 6502 – тоже достаточно загадочный для меня, например, процессор. Известно, что по средней скорости в тестах при частоте 1 МГц он вполне сравним с 8080 на 2,5 МГц (часто даже быстрее) или даже с Z80 на частотах больше 3 МГц. А вот копирование и заполнение блоков памяти – слабая сторона 6502, так как нет ни спец. команд для этого (как у Z80), ни полноценных стековых операций, использующих всё адресное пространство, а не только нулевую страницу.
Подскажите, пожалуйста, подробности, как вы тестировали. Можно ли увидеть сами тестовые фрагменты на ассемблере? Данные по скорости достаточно загадочные – например, не совсем понятно, как реализованы первые два варианта теста (где скорость невысокая) – после копирования каждого байта идут операции организации цикла или всё же цикл в какой-то степени развёрнут? А в быстрых вариантах используются стековые команды (Push)? (тогда копирование возможно только в нулевой странице?)
Вообще, насколько я могу судить, наиболее интересно классическое копирование блоков памяти с произвольного адреса на произвольный адрес (на всем адресном пространстве, конечно) в развёрнутых циклах (обычно копируются фрагменты какой-то определенной длины – скажем, при выводе на экран, и программисты все равно стараются развернуть цикл, насколько возможно), а также наиболее быстрые способы (как у вас в таблице) – с нахождением данных или их адресов прямо в коде (типа LXI/PUSH для 8080) и опять же развернутыми циклами. Хорошо бы также указать, сколько тактов нужно на команды организации циклов (до 256 повторений и больше 256) – тогда можно добавлять их к тактам развернутых циклов и получить точные данные для любого числа повторений одинаковых цепочек команд внутри цикла.
Здесь обновлённые данные.
Очень простой и шустрый процик. А 65816 еще лучше и вкуснее. Это как Z80 является улучшенной версией i8080, так и 65816 является улучшенной версией 6502, но намного значительнее улучшенной про сравнению Z80/i8080. Даже был разработан еще более продвинутый 32-битный 65832, но, к сожалению, он так и не выпускался...
А если i8080 и Z80 дать прикурить на 1 МГц, то будут ли они шустрее, чем 6502 на той же частоте?
А если 6502 дать прикурить на 2.5 МГц или 3 МГц, то будет ли он шустрее, чем i8080 или Z80 на той же частоте?
Таблица и видео всё наглядно показывают. Так что вывод совершенно очевиден!!!
Я бы так не судил. У 6502 подпрограмма копирования блока памяти работает быстрее (16 такт/байт, а если совсем точнее: 16 + (5+5+5+3)/256 = 16.0703125 такт/байт), чем инструкция копирования блока памяти у Z80 (LDIR: 21 такт/байт). Предвижу вопли спектрумистов: "Ну как же? А LDI нам даёт 16 тактов, а не 21!". На что еще раз обращу внимание: копирование блока памяти (да хоть 64КиБ!!!), а не одиночного байта одной инструкцией LDI!
Ну а заполнение блока памяти еще шустрее - 11 такт/байт (точнее 11 + (5+5+3)/256 = 11.05078125 такт/байт).
65816 имеет инструкции копирования блока памяти MVN/MVP - полный аналог LDIR/LDDR у Z80, только втрое (!!!) шустрее - 7 такт/байт против 21 у Z80. Вообще-то даже 7 такт/байт - это медленно... Можно было бы уложиться и в 3 такт/байт!
Инструкция копирования, подпрограмма копирования, подпрограмма заполнения
Код:zp00 = $00
zp02 = $02
zp04 = $04
zp10 = $10
Tick = $80
Pos = $90
Screen = $4000
SizeOfScreen = $4000
NMI_On = $C040
NMI_Off = $C020
.ba $F800
.cpu 65816
Reset
sei
cld
ldx #$FF
txs
sta $C100
sta $C111
sta $C122
sta $C133
sta $C144
sta $C058
sta $C05A
Main
bit NMI_Off
ldx #0
lda #" "
- sta $800,x
sta $900,x
sta $A00,x
sta $B00,x
sta $C00,x
sta $D00,x
sta $E00,x
sta $F00,x
inx
bne -
sta $C786
stz zp10
lda #$A
sta zp10+1
ldx #0
stx Pos
- lda Mes1,x
beq +
jsr Send
inx
bra -
+
stz zp10
lda #$C
sta zp10+1
ldx #0
stx Pos
- lda Mes2,x
beq +
jsr Send
inx
bra -
+
jsr Delay5s
; 65816 MVN
sta $C720
clc
xce
rep #$30
.al
.rl
lda #$FFFE
sta Tick
-
lda Tick
bne -
lda #64
sta zp04
-
lda zp04
and #3
tax
lda ColorTable,x
sta Screen
ldx #Screen
ldy #Screen+1
lda #SizeOfScreen-2
;----------------------
;main cycle, 7 ticks/byte
mvn 0,0 ;7
;----------------------
dec zp04
bne -
bit NMI_Off
sec
xce
.as
.rs
sta $C786
lda Tick+1
jsr PrintTwoDigits
lda Tick
jsr PrintTwoDigits
stz zp10
lda #$D
sta zp10+1
ldx #0
stx Pos
- lda Mes3,x
beq +
jsr Send
inx
bra -
+
jsr Delay5s
; 6502 MoveMemory
sta $C720
lda #$FF
sta Tick+1
lda #$FE
sta Tick
-
lda Tick
bne -
lda #64
sta zp04
MM01
lda zp04
and #3
tax
lda ColorTable,x
sta Screen
lda #1
sta zp02
ldy #0
sty zp00
lda #>Screen
sta zp00+1
sta zp02+1
lda #>SizeOfScreen
sta zp04+1
;----------------------
;main cycle, 16 ticks/byte
-
lda (zp00),y ;5
sta (zp02),y ;6
iny ;2
bne - ;3
;----------------------
inc zp00+1 ;5
inc zp02+1 ;5
dec zp04+1 ;5
bne - ;3
dec zp04
bne MM01
bit NMI_Off
sta $C786
lda Tick+1
jsr PrintTwoDigits
lda Tick
jsr PrintTwoDigits
stz zp10
lda #$E
sta zp10+1
ldx #0
stx Pos
- lda Mes4,x
beq +
jsr Send
inx
bra -
+
jsr Delay5s
; 6502 FillMemory
sta $C720
lda #$FF
sta Tick+1
lda #$FE
sta Tick
-
lda Tick
bne -
lda #64
sta zp04
FM01
ldy #0
sty zp00
lda #>Screen
sta zp00+1
lda #>SizeOfScreen
sta zp04+1
lda zp04
and #3
tax
lda ColorTable,x
;----------------------
;main cycle, 11 ticks/byte
-
sta (zp00),y ;6
iny ;2
bne - ;3
;----------------------
inc zp00+1 ;5
dec zp04+1 ;5
bne - ;3
dec zp04
bne FM01
bit NMI_Off
sta $C786
lda Tick+1
jsr PrintTwoDigits
lda Tick
jsr PrintTwoDigits
jsr Delay5s
jsr Delay5s
jmp Main
ColorTable .by 0, $55, $AA, $FF
Delay2s
bit NMI_Off
stz Tick
stz Tick+1
bit NMI_On
-
lda Tick
cmp #100
bne -
rts
Delay5s
bit NMI_Off
stz Tick
stz Tick+1
bit NMI_On
-
lda Tick
cmp #250
bne -
rts
PrintTwoDigits
pha
lsr
lsr
lsr
lsr
jsr PrintDigit
pla
and #15
jsr PrintDigit
rts
PrintDigit
tax
lda HexDigit,x
jsr Send
rts
Send
ldy Pos
sta (zp10),y
inc Pos
rts
; .PETSCII
HexDigit
; .tx "0123456789ABCDEF"
.db $B0, $B1, $B2, $B3, $B4, $B5, $B6, $B7
.db $B8, $B9, $C1, $C2, $C3, $C4, $C5, $C6
Mes1
; .tx "Filling 64 screens 256x256x4colors (1MB) in NMI ticks:"
.db $C6, $49, $4C, $4C, $49, $4E, $47, $A0
.db $B6, $B4, $A0, $53, $43, $52, $45, $45
.db $4E, $53, $A0, $B2, $B5, $B6, $58, $B2
.db $B5, $B6, $58, $B4, $43, $4F, $4C, $4F
.db $52, $53, $A0, $A8, $B1, $CD, $C2, $A9
.db $A0, $49, $4E, $A0, $CE, $CD, $C9, $A0
.db $54, $49, $43, $4B, $53, $BA
.db 0
Mes2
; .tx "65816 MVN instruction (7 clocks/byte) - $"
.db $B6, $B5, $B8, $B1, $B6, $A0, $CD, $D6
.db $CE, $A0, $49, $4E, $53, $54, $52, $55
.db $43, $54, $49, $4F, $4E, $A0, $A8, $B7
.db $A0, $43, $4C, $4F, $43, $4B, $53, $AF
.db $42, $59, $54, $45, $A9, $A0, $AD, $A0
.db $A4
.db 0
Mes3
; .tx "6502 MoveMemory Sub (16 clocks/byte) - $"
.db $B6, $B5, $B0, $B2, $A0, $CD, $4F, $56
.db $45, $CD, $45, $4D, $4F, $52, $59, $A0
.db $D3, $55, $42, $A0, $A0, $A8, $B1, $B6
.db $A0, $43, $4C, $4F, $43, $4B, $53, $AF
.db $42, $59, $54, $45, $A9, $A0, $AD, $A0
.db $A4
.db 0
Mes4
; .tx "6502 FillMemory Sub (11 clocks/byte) - $"
.db $B6, $B5, $B0, $B2, $A0, $C6, $49, $4C
.db $4C, $CD, $45, $4D, $4F, $52, $59, $A0
.db $D3, $55, $42, $A0, $A0, $A8, $B1, $B1
.db $A0, $43, $4C, $4F, $43, $4B, $53, $AF
.db $42, $59, $54, $45, $A9, $A0, $AD, $A0
.db $A4
.db 0
NMI_Native
inc Tick
rti
NMI
inc Tick
bne +
inc Tick+1
+
rti
IRQ
rti
.ba $FFEA
.wo NMI_Native
.wo 0
.wo IRQ
.ba $FFFA
.wo NMI
.wo Reset
.wo IRQ
[свернуть]
Да. Я же расписал аналог от Z80.
Разумеется (только не в нулевой, а в первой). Однако, 65816 умеет полностью 64 КиБ.