Кое-что есть в техническом описании
Кое-что есть в техническом описании
Manwe(16.04.2020)
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Последний раз редактировалось LeoN65816; 17.04.2020 в 11:46.
Турбо АГАТ-9/16 (ЦП 65C802, 5 Махов, dual-port SRAM).
vladtru(05.05.2020)
Очень интересная таблица, показывающая хотя бы в частном случае разницу между 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 КиБ.
Последний раз редактировалось LeoN65816; 06.05.2020 в 00:26.
Турбо АГАТ-9/16 (ЦП 65C802, 5 Махов, dual-port SRAM).
vladtru(07.05.2020)
LeoN65816,
Благодарю за разъяснения и листинг программы. То есть в универсальном случае копирования блоков памяти во всем адресном пространстве развернутый цикл имеет длину 13 тактов – это до 76,7 Кбайт/с при частоте 1,021 МГц (я, как человек, давно и близко имеющий отношение к компьютерам, всегда под К подразумеваю 2 в 10 степени – думаю, так привычнее для всех ретрокомпьютерщиков). Команда цикла BNE здесь занимает всего 3 такта, правда для числа повторений не больше 256. Соответственно, заполнение произвольной области памяти константой имеет развернутый цикл 8 тактов – при достаточно большой длине такой цепочки скорость стремится к 124,6 Кбайт/с. На организацию цикла также требуется всего 3 такта.
Конечно, если сравнивать эти показатели с 8080 (как наиболее актуального для советских домашних ПК) и Z80 (популярные английские и японские ПК), 6502 очень сильно проигрывает – у 8080 на частоте 2,5 МГц (Корвет, Орион-128) максимальная скорость копирования через стек почти в 2 раза больше (около 150 Кбайт/с, насколько я помню), без стека – почти в 1,5 раза больше (чуть больше 100 Кбайт/с), а скорость заполнения памяти через стек почти в 4 раза (!) больше – около 450 Кбайт/с (все данные, конечно, с развёрнутыми циклами, которые, однако, не всегда применимы и дают большое преимущество в основном на ПК со «столбцовой» организацией видеопамяти – типа «Вектора-06Ц», «Специалиста» или «Ориона-128»). У компьютеров на Z80 предельные скорости копирования и заполнения, естественно, ещё выше – хотя бы за счет более высокой частоты (копирование стеком – примерно до 250 Кбайт/с, без стека – более 200 Кбайт/с, заполнение памяти через стек – до 600 с лишним Кбайт/с, в 5 раз быстрее, чем у 6502 на 1 МГц). У БК-0010 максимальная скорость копирования тоже почти вдвое выше – порядка 136 Кбайт/с.
Вторые варианты («Развернутый цикл») в таблице для 6502 получились почти вдвое и втрое быстрее – и это очень хорошие показатели, сравнимые с 8080, однако не понятно, как их применять на практике, если используется стековая команда, то есть копируется только в стек или из стека, который не выходит за пределы одной страницы (256 байт) в начале адресного пространства. А что будет, если всё же использовать не Push, а обычные команды пересылок, чтобы задействовать всё адресное пространство – насколько упадет скорость в этих двух быстрых вариантах?
Как вообще можно было ускорить, скажем, вывод на экран у таких ПК, как «Агат», Apple II, Acorn Electron и т.д. (без аппаратных спрайтов, скроллингов и т.д.) – использовали копирование из стека или нулевой страницы (к которой доступ быстрее)? Или хватало и таких небольших скоростей? Особенно у Яблока (а как у Агата в агатовских режимах?) – у него строчная организация видеопамяти (у Электрона и BBC Micro – вроде бы строчно-столбцовая, когда внутри знакоместа память растет по столбцам, а между знакоместами – по строкам, зато объем видеопамяти до 20 Кбайт). Насколько быстро работал с графикой Агат, имевший видеорежимы с 16 Кбайтами видеопамяти (у Apple II в обычном режиме – вроде всего 7.5 Кбайт).
Процессор 65816, конечно, был намного быстрее, чем 6502, за счет 16-битности, дополнительных команд и большей частоты – я, например, читал, что Apple II GS (65816 на 2,8 МГц) был во многих тестах быстрее, чем классический Macintosh (68000 на 8 МГц, но эффективная около 5 МГц).
Последний раз редактировалось vladtru; 07.05.2020 в 23:07.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)