Чего то у меня диск еррор пишет,запускаю из WC 0.94 и tr-dos материться.
Сам диск не надо запускать. В этом диске от TR-DOS только разметка 256х16х80. Файловая система там совсем другая.
Запускать надо SNA-файл
Смотри видео, там все есть.
- - - Добавлено - - -
Да, она принимает команды во входном потоке.
Код:echo "cd bin
get hello
chmod 777 hello" | ucp filesystem-zx128.trd
В прошлый раз я добавил программку cpuspeed. Думаю, результат её работы и так виден невооружённым взглядом. Но для объективного контроля изменения производительности решил запилить bogomips. Алгоритм не аутентичный, но по смыслу похож: замеряем количество пустых циклов в тике. А тик у нас = 1/50 секунды.
Цикл следующий:
занимает 26 тактов.Код:loop dec bc
ld a,b
or c
jr nz,loop
Результат даже похож на правду: для 3,5 МГц 2759*26=71734. :)
- - - Добавлено - - -
Кстати, обратил внимание:
1) printf() не умеет печатать числа с плавающей запятой,
2) консоль не умеет CSI коды.
- - - Добавлено - - -
Замечание: если кто будет использовать ассемблерные вставки, то пусть уберёт опцию --peep-asm - иначе компилятор в вашем коде накуролесит - заколебётесь баги искать.
Кроме того, в большинстве случаев добавление опции --reserve-regs-iy делает код более быстрым, и нередко более коротким.
Eltaron, не терпится увидеть фузикс в нормальном текстовом режиме на тсконфе: вот переписал модуль zxvideo (исходный взял с гитхаба Алана Кокса).
Задействовал аппаратный скролл. Написал функцию _vtattr_notify (я так понял, это установка атрибутов экрана). Курсор теперь выделяется не подчёркиванием, а сменой атрибутов. Переписал процедуру _do_beep, - четверть секунды должна звучать нота "ля" средней октавы.
Предполагается, что с адреса 0x0000 будет включена видеостраница, а перед обращением к дисководу необходимо временно включать ПЗУ (48?).
Поскольку, максимально поддержана память до 512кБ, предлагаю использовать для текстового экрана страницу 32, для шрифта - 33 (32xor1).
И, да, при загрузке системы, надо как-то загрузить 2кб шрифта - любой понравившийся стандартный спектрумовский шрифт (не в формате экрана) на 256 символов.
Может, сделаешь спецсборку на досуге? :v2_rolley
Процедура включение в CPU0 видеостраницы:
Процедура включение в CPU0 ПЗУ:Код:di
ld bc,#0x21af ;_MemConfig
ld a,#0xCE
out (c),a
ld b,#0x10 ; #_tsPage0
ld a,#RAMPGNUM ; 32/33
out (c),a
ei
Код:di
ld bc,#0x21af ;_MemConfig
ld a,#0xC0
out (c),a
ld b,#0x10 ; #_tsPage0
ld a,#ROMnum
out (c),a
ei
ret
Процедура включения текстового видеорежима:
Собственно, модуль zxvideo. Увы, не тестировал.Код:ld bc,#0x01af ; #_tsVPage
ld a,#32
out (c),a
dec b ; #_tsVConfig
ld a,#0x43 ; %01000011, text mode in 320x240pix window.
- - - Добавлено - - -Код:;
; PentEVO/TS-Config text mode 320x240 (80x30 chars) vt primitives.
; Modified from original by Amixgris / Red Triangle. 18/08/2016.
;
.module zxvideo
; exported symbols
.globl _plot_char
.globl _scroll_down
.globl _scroll_up
.globl _cursor_on
.globl _cursor_off
.globl _clear_lines
.globl _clear_across
.globl _do_beep
.globl _vtattr_notify
.globl _vtink
.globl _vtpaper
.area _VIDEO
; colors are ignored everywhere for now
videopos: ; video page vith text mode must be mapped on cpu0
ld a,(#_tsconfig_topline_offset)
add a,e
and a,#0x3f
ld e,d
ld d,a
ret
_plot_char:
pop iy
pop hl
pop de ; D = x E = y
pop bc
push bc
push de
push hl
push iy
call videopos
;
; TODO: Map char 0x60 to a grave accent bitmap rather
; than fudging with a quote
;
ld b,#0 ; calculating offset in font table
ld a, c
cp #0x60
jr nz, nofiddle
ld a, #0x27
nofiddle:
ld (de),a ; set char code to text videomemory.
; set char attributes:
ld a,(_tsconfig_screen_mix_color)
set 7,e
ld (de),a
ret
_clear_lines:
pop bc
pop hl
pop de ; E = line, D = count
push de
push hl
push bc
clear_next_line:
push de
ld d, #0 ; from the column #0
ld b, d ; b = 0
ld c, #80 ; clear 80 cols
push bc
push de
push af
call _clear_across
pop af
pop hl ; clear stack
pop hl
pop de
inc e
dec d
jr nz, clear_next_line
ret
_clear_across:
pop iy
pop hl
pop de ; DE = coords
pop bc ; C = count
push bc
push de
push hl
push iy
call videopos ; first pixel line of first character in DE
push de
pop hl ; copy to hl
ld b,#0
ld (hl),#" "
push hl
push de
push bc
ldir
; clear attributes:
ld a,(#_tsconfig_screen_mix_color)
pop bc
pop de
pop hl
set 7,l
set 7,e
ld (hl),a
ldir
ret
copy_line:
; HL - source, DE - destination
; convert line coordinates to screen coordinates both for DE and HL
push de
ex de, hl
call videopos
ex de, hl
pop de
call videopos
ld bc, #80
push hl
push de
push bc
ldir
pop bc
pop de
pop hl
; copy attributes:
set 7,e
set 7,l
ldir
ret
_scroll_down:
ld bc,#8
_scrldn:
ld hl,(#_tsconfig_topline_offset)
add hl,bc
ld (#_tsconfig_topline_offset),hl
ld bc,#0x04af ; GYOffsL
out (c),l
inc b
out (c),h
ld a,l
srl h
rra
rra
rra
and a,#0x3f
ld (#_tsconfig_topline_offset),a
ret
_scroll_up:
ld bc,#-8
jr _scrldn
_cursor_on:
pop bc
pop hl
pop de
push de
push hl
push bc
ld (cursorpos), de
curs: call videopos
set 7,e
ld a,(de)
or a,a
rrca
rrca
rrca
rrca
ld (de),a
ret
_cursor_off:
ld de, (cursorpos)
jr curs
_do_beep: ; do 440Hz dure 1/4s
di
ld bc,#0x00fe
ld h,#110
loop_beep1:
ld de,#298
loop_beep:
dec de
ld a,d
or a,e
jr nz,loop_beep
ld a,l
cpl
ld l,a
and a,#0x10
out (c),a
dec h
jr nz,loop_beep1
ei
ret
_vtattr_notify: ; void vtattr_notify(void)
ld a,(#_vtink)
and a,#0x0f
ld (#_vtink),a
rrca
rrca
rrca
rrca
ld c,a
ld a,(#_vtpaper)
and a,#0x0f
ld (#_vtpaper),a
or a,c
ld (_tsconfig_screen_mix_color),a
ret
.area _DATA
_vtink:
.db 7
_vtpaper:
.db 0
_tsconfig_screen_mix_color:
.db 0x07
_tsconfig_screen_offset:
.dw 0
_tsconfig_topline_offset:
.db 0
cursorpos:
.dw 0
Сам шрифт можно наживую в снапшот засунуть, в экранную область, а в инит добавить копирование его в 33-ю пагу.
можно просто лдиром, включив пагу вместо ПЗУ с помощью представленной процедуры.
- - - Добавлено - - -
Есть ещё идея обойтись без переключения паг в области ПЗУ, а копировать данные в экран с помощью ПДП, - но не продумал пока, есть ли в этом преимущество.
Собрал, не работает. Проблема в том, что вот тут
на входе DE = 0, после set 7,d оно превращается в 8000, куда и пишется рандом из аккумулятораКод:; set char attributes:
ld a,(_tsconfig_screen_mix_color)
set 7,d
ld (de),a
Но 8000 - это начало секции DISCARD. Туда очень скоро произойдет переход и всё завалится из-за попытки исполнить записанные данные.
Ты, наверное, планировал какую-то другую страницу в 8000 подставлять, или я чего-то недопонимаю в организации памяти тсконфы?
Лять! Голова моя садовая! Нужно не D, а E! SET 7,E. Установленный старший разряд младшего байта адреса знакоместа "переносит" нас к его атрибуту! В общем, везде, где устанавливается 7-й бит в модуле, нужно поменять старший регистр регистровой пары на младший.
Поправил исходник в сообщении.
Кстати, а почему в аккумуляторе рандом? - там должен лежать код атрибутов. по девфолту #0x07 (или наоборот :) )
- - - Добавлено - - -
если ты запускал bogomips, то видел результат его работы - число в BogoMIPS. Например, для 3,5MHz - 0,002759. Это означает, что за однин тик (одно прерывание в нашем случае) успело выполниться 2759 циклов. Цикл занимает 26 тактов. Умножая количество циклов на их длительность, получим количество тактов в прерывании.
У пентагона 71680 тактов в прерывании, у меня получилось 71734, - всего на 54 такта погрешность.
- - - Добавлено - - -
Не рандом, а НОЛЬ! Пофикил исходник:
_tsconfig_screen_mix_color: .db 0x07
это понятно что под цикл подобрали количество проходов в прерывании ,мне интересно понять как сравнить с современными процессорами,там считаются тоже нопы по такой же схеме?запуск на смарте меня шокировал своими цифрами,вот и интересуюсь насколько сравнимы эти тесты,вот некоторые x86 процессоры, выпущенные в 2010-х, способны исполнять до 4 операций nop каждый такт.получается у них жульничество.Извиняюсь за глупые вопросы ,никогда не интересовался такими вещами.
Я ничего не "подбирал" - всё вычисляется.
Как реализовать оригинальный алгоритм, я не понял.
В оригинале используется такой цикл:
Я решил, что более близкий по смыслу цикл на z80 будет такой:Код:1: decl ax
jns 1b
А, вообще, bogomips - это не тест производительности, хотя определённое представление о производительности он даёт, а сугубо прикладная задача - калибровка задержек, необходимых системе.Код:loop: dec bc
ld a,b
or c
jr nz,loop
Результат будет зависеть и от скорости процессора и от длительности тиков. Какой длительности тики используются в Linux, я не знаю.
- - - Добавлено - - -Код:/*
* Standalone BogoMips program (a la BogoMips)
* Amixgris / RT 08/2016
*
*/
#include <stdio.h>
long rd_cmos_hms_w(void) __naked;
long rd_cmos_hms(void) __naked;
long iBCDlong(long n) __naked;
int dtime,m,n;
long t1,t2;
void main(void)
{
printf("Calibrating delay loop.. ");
fflush(stdout);
t1 = rd_cmos_hms_w();
__asm
ld bc,#0x00
di
.rept 80
.db 0x0b,0x78,0xb1,0x20,0xfb ; loop: dec bc
; ld a,b
; or c
; jr nz,loop
.endm
ei
__endasm;
t2 = rd_cmos_hms();
t1 = iBCDlong(t1);
t2 = iBCDlong(t2);
dtime = t2-t1;
m = 0x500000/dtime/50;
printf("ok -\n0,00%u BogoMIPS\n",m);
}
long rd_cmos_hms(void) __naked
{
__asm
ld bc,#0xeff7
ld a,#0x80
out (c),a
ld b,#0xdf
xor a,a
out (c),a
ld b,#0xbf
in l,(c)
ld b,#0xdf
ld a,#2
out (c),a
ld b,#0xbf
in h,(c)
ld b,#0xdf
ld a,#4
out (c),a
ld b,#0xbf
in e,(c)
ld b,#0xef
xor a
out (c),a
ld d,a ; result in dehl
ret
__endasm;
}
long rd_cmos_hms_w(void) __naked
{
__asm
ld bc,#0xeff7
ld a,#0x80
out (c),a
ld b,#0xdf
xor a,a
out (c),a
ld b,#0xbf
1$: in a,(c)
jr nz,1$
ld l,a
ld b,#0xdf
ld a,#2
out (c),a
ld b,#0xbf
in h,(c)
ld b,#0xdf
ld a,#4
out (c),a
ld b,#0xbf
in e,(c)
ld b,#0xef
xor a
out (c),a
ld d,a ; result in dehl
ret
__endasm;
}
long iBCDlong(long n) __naked
{ n;
__asm
pop af
pop de
pop bc
push bc
push de
push af
push de
xor a,a
ld d,a
ld e,a
ld h,a
ld a,c
rrca
rrca
rrca
rrca
and a,#0x0f
call 4$ ; mul 10
ld d,a
ld a,c
and a,#0x0f
add a,d
ld d,#0
ld l,a
call 2$ ; 10*DEHL
call 3$ ; 6*DEHL ; mul hours by 60 = minutes.
pop bc
ld a,b
rrca
rrca
rrca
rrca
and a,#0x0f
call 4$ ; mul 10
ld d,a
ld a,b
and a,#0x0f
add a,d
ld d,#0
call 1$ ; add A to DEHL
call 2$ ; 10*DEHL
call 3$ ; 6*DEHL ; mul minutes by 60 = seconds.
ld a,c
rrca
rrca
rrca
rrca
and a,#0x0f
call 4$ ; mul 10
ld d,a
ld a,c
and a,#0x0f
add a,d
ld d,#0
call 1$ ; add A to DEHL ; add seconds.
ret
1$: add a,l ; add8to32
ld l,a
ld a,h
adc a,#0
ld h,a
ld a,e
adc a,#0
ld e,a
ld a,d
adc a,#0
ld d,a
ret
2$: push bc ; 32b*10:
add hl,hl
ex de,hl
adc hl,hl
ex de,hl
push de
push hl
add hl,hl
ex de,hl
adc hl,hl
ex de,hl
add hl,hl
ex de,hl
adc hl,hl
ex de,hl
pop bc
add hl,bc
ex de,hl
pop bc
adc hl,bc
ex de,hl
pop bc
ret
3$: push bc ; 32b*6:
add hl,hl
ex de,hl
adc hl,hl
ex de,hl
push de
push hl
add hl,hl
ex de,hl
adc hl,hl
ex de,hl
pop bc
add hl,bc
ex de,hl
pop bc
adc hl,bc
ex de,hl
pop bc
ret
4$: add a,a
ld d,a
add a,a
add a,a
add a,d
ld d,#0
ret
__endasm;
}
Ну, и, как бы целью написания мной богомипсов было не замерить производительность, а получить возможность проверки результата работы cpuspeed.