Альтернативная система на 68000 :)

Motorola 6800, 6809, 68HC05, 68HC08, 68HC11 и m68k, а также компьютеры на них (Amiga, Macintosh, Palm etc.)

Moderator: Shaos

Annett
Senior
Posts: 137
Joined: 30 Mar 2017 00:55

Re: Альтернативная система на 68000 :)

Post by Annett »

Скорость отрисовки прямоугольников без заливки (рисует тем же обычным Брезенхемом в ПЛИСке, что и произвольные линии):
You do not have the required permissions to view the files attached to this post.
angry_troll
Doomed
Posts: 449
Joined: 08 Apr 2013 04:04
Location: 213.247.249.139

Re: Альтернативная система на 68000 :)

Post by angry_troll »

Какая версия гцц? И можно пример кода, который он генерирует (с сорцом :)?

Спрашиваю потому, что пробовал собирать гцц 4.*.* под таргет 68к и увидел, что кодогенерация у него хреноватая... Не косячит вроде, но много лишних действий.
привет засранцу лавру :)
Annett
Senior
Posts: 137
Joined: 30 Mar 2017 00:55

Re: Альтернативная система на 68000 :)

Post by Annett »

версия кажется 3.4.6, не самая новая :)

вот, вчерашнее, там есть и код (main.bin) и дизассемблерный листинг.
Здесь скомпилено без оптимизации, можно сделать gcc -O1 .. тогда будет получше.

(это всё пока только заготовка...)
You do not have the required permissions to view the files attached to this post.
angry_troll
Doomed
Posts: 449
Joined: 08 Apr 2013 04:04
Location: 213.247.249.139

Re: Альтернативная система на 68000 :)

Post by angry_troll »

Эммм... Дизасм от ГЦЦ лучше всего делать или так:

Code: Select all

gcc -S main.c
или так:

Code: Select all

objdump -dS main.o
А дизасм голого бинарника... :)
привет засранцу лавру :)
Annett
Senior
Posts: 137
Joined: 30 Mar 2017 00:55

Re: Альтернативная система на 68000 :)

Post by Annett »

Зато в голом бинарнике всё уже в том виде, в каком это попадет в память машины...
Ничего, всё там более-менее понятно :)
Annett
Senior
Posts: 137
Joined: 30 Mar 2017 00:55

Re: Альтернативная система на 68000 :)

Post by Annett »

По-немножку кодю.
Вот это уже реализовано (сами функции на асме):

void sys_enable_interrupts();
void sys_disable_interrupts();
void sys_restart();
void sys_halt(uint32 halt_code);
void sys_install_irq_handler(uint8 irq_num, uint8 mode, irqcb *cb_function);
void sys_uninstall_irq_handler(uint8 irq_num);
uint32 get_rnd32();
void init_rnd32(uint32 s);
void clear_keyboard_buffer();
uint8 key_pressed();
uint8 get_key();
void mouse_show();
void mouse_hide();
void set_mouse_crosspointer_control_word(uint16 cw);
uint16 get_mouse_crosspointer_control_word();
uint8 mouse_in(uint16 x1, uint16 y1, uint16 x2, uint16 y2);
uint8 mouse_pressed();
uint8 get_mouse_buttons();
uint16 get_mouse_x();
uint16 get_mouse_y();
void set_mouse_window(uint16 x1, uint16 y1, uint16 x2, uint16 y2);
void set_mouse_window_fullscreen();
void mouse_goto_xy(uint16 x, uint16 y);
void gfx_load_led_register(uint8 led_data);
void gfx_initialize();
void gfx_reset_vertical_retrace();
uint8 gfx_is_vertical_retrace();
void gfx_clear_screen(uint8 color);
void gfx_ramdac_set_pixel_mask(uint8 p_mask);
void gfx_ramdac_set_rgb_palette(uint8 *pal, uint8 start_color, uint16 n_colors);
void gfx_set_draw_mask(uint32 draw_mask);
void gfx_draw_pixel(uint16 x, uint16 y, uint8 color);
void gfx_move_to(uint16 x, uint16 y);
void gfx_line_to(uint16 x, uint16 y, uint8 color);
void gfx_line(uint16 x1, uint16 y1, uint16 x2, uint16 y2, uint8 color);
void gfx_rectangle(uint16 x1, uint16 y1, uint16 x2, uint16 y2, uint8 color);
void gfx_bar(uint16 x1, uint16 y1, uint16 x2, uint16 y2, uint8 color);
void gfx_bar_x2(uint16 x1, uint16 y1, uint16 x2, uint16 y2, uint8 color);
void gfx_draw_char(uint16 x, uint16 y, uint8 color ,uint16 mode, char c);
void gfx_draw_text(uint16 x, uint16 y, uint8 color, uint16 mode, uint16 offset, char *string);
void gfx_copy_picture_to_vram(uint16 dest_x, uint16 dest_y,
uint16 size_x, uint16 size_y,
uint8 *picture);
void gfx_copy_vram_block(uint16 source_x, uint16 source_y,
uint16 dest_x, uint16 dest_y,
uint16 size_x, uint16 size_y);
void rhytm_gen_load_k(uint32 k);
void rhytm_gen_set_clk_mux(uint8 s);
void rhytm_gen_start();
void rhytm_gen_stop();
void rs232_clear_rx_buf();
void rs232_clear_tx_buf();
uint8 rs232_is_rx_bytes();
uint8 rs232_is_tx_complete();
uint8 rs232_get_byte();
void rs232_send_byte(uint8 a);
void midi1_clear_rx_buf();
void midi1_clear_tx_buf();
uint8 midi1_is_rx_bytes();
uint8 midi1_is_tx_complete();
uint8 midi1_get_byte();
void midi1_send_byte(uint8 a);
void midi2_clear_rx_buf();
void midi2_clear_tx_buf();
uint8 midi2_is_rx_bytes();
uint8 midi2_is_tx_complete();
uint8 midi2_get_byte();
void midi2_send_byte(uint8 a);
You do not have the required permissions to view the files attached to this post.
Annett
Senior
Posts: 137
Joined: 30 Mar 2017 00:55

Re: Альтернативная система на 68000 :)

Post by Annett »

Подключила библиотеку FatFs от ChaN: http://elm-chan.org/fsw/ff/00index_e.html
Пришлось поразбираться и помучиться. Но в результате получилось!)
Еще добавила много всяких низкоуровневых функций (конечно же, они на ассемблере).
Заодно по-немножку привыкаю к Си. Нравится.

Теперь у нас есть SDшки и FAT16/32, можно читать и записывать всякие файлы :)
Можно подключить и другие устройства, если вдруг захочется.

Тест - загрузка картинки 640*480 c SDшки. Заодно - тест 256-цветного режима видео ПЛИСки и RAMDAC.
Видео (11Мбайт): http://disk.karelia.pro/veiC5l5/
You do not have the required permissions to view the files attached to this post.
Annett
Senior
Posts: 137
Joined: 30 Mar 2017 00:55

Re: Альтернативная система на 68000 :)

Post by Annett »

User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Альтернативная система на 68000 :)

Post by Shaos »

видео уже недоступно - можно на ютуб его?

интересует как быстро такие картинки грузяцо с карточки на экран?
Я тут за главного - если что шлите мыло на me собака shaos точка net
Annett
Senior
Posts: 137
Joined: 30 Mar 2017 00:55

Re: Альтернативная система на 68000 :)

Post by Annett »

Видео:
http://disk.karelia.pro/3B9CaJS/

...а залить на ютуб я не умею :)

Грузится с карточки через буфер примерно 1.5сек. Картинка не сжатая (то есть там 1 байт на пиксель, и получается 307200 байт на 640*480).
Узкое место - SPI до карточки. Такт 16МГц и SPI 1-битный :)
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Альтернативная система на 68000 :)

Post by Shaos »

да - быстро
Я тут за главного - если что шлите мыло на me собака shaos точка net
Annett
Senior
Posts: 137
Joined: 30 Mar 2017 00:55

Re: Альтернативная система на 68000 :)

Post by Annett »

68K + ILDA интерфейс на мелкой GPIO плиске (наконец-то и она пригодилась :)
ЦАПики 572па1 + дифференциальные драйверы на TL074, TL072.


код:

Code: Select all

module ILDA_port(ADDR, DIN, nAS, nUDS, nLDS, RW, nRESET, CLK,
                 DOUT, DEN, ILDA_X, ILDA_Y, ILDA_B, ILDA_G, ILDA_R, ILDA_I, ILDA_EN, DTA);
input wire [23:1] ADDR;
input wire [15:0] DIN;
input wire nAS,nUDS,nLDS,RW,nRESET,CLK;
output wire [15:0] DOUT;
output wire DEN;
output reg [9:0] ILDA_X;
output reg [9:0] ILDA_Y;
output wire ILDA_B,ILDA_G,ILDA_R, ILDA_I, ILDA_EN;
output wire DTA;

wire SEL,WORD,X_WSTB,Y_WSTB,C_WSTB,C_RSTB;
wire [9:0] TMPXY;
reg [7:0]  CR;
reg [20:0] TIMEOUT_CNT;
reg TIMEOUT;
reg EN_BEAM; 

assign SEL = ~nAS & (ADDR[23:4] == 20'hFFFA0);
assign WORD = ~nUDS & ~nLDS;
assign DTA = SEL & (~nUDS | ~nLDS);
assign DEN = RW & SEL & (~nUDS | ~nLDS);

assign X_WSTB = ~RW & SEL & WORD & (ADDR[3:1] == 3'h0);  //=x0
assign Y_WSTB = ~RW & SEL & WORD & (ADDR[3:1] == 3'h1);  //=x2
assign C_WSTB = ~RW & SEL & ~nUDS & (ADDR[3:1] == 3'h7);  //=xE

assign C_RSTB = RW  & SEL & ~nUDS & (ADDR[3:1] == 3'h7);  //=xE

assign TMPXY = DIN[9:0] + 10'd512;

always@(negedge X_WSTB)  ILDA_X <= TMPXY;
always@(negedge Y_WSTB)  ILDA_Y <= TMPXY;

assign DOUT = ((CR & {8{C_RSTB}}) << 8);

always@(negedge C_WSTB or negedge nRESET) 
  begin
    if (~nRESET) CR <= 8'h0;
	   else CR <= DIN[15:8];
  end

assign ILDA_EN = CR[7] & EN_BEAM;
assign ILDA_I = (CR[0] | CR[1] | CR[2]) & ILDA_EN;  
assign ILDA_R = CR[2] & ILDA_EN;  
assign ILDA_G = CR[1] & ILDA_EN;  
assign ILDA_B = CR[0] & ILDA_EN;  

always@(posedge CLK or posedge X_WSTB or posedge Y_WSTB)
  begin
   if (X_WSTB || Y_WSTB) TIMEOUT_CNT <= 21'h0;
	   else TIMEOUT_CNT <= TIMEOUT_CNT + 1'h1;
  end
  
always@(posedge CLK)  TIMEOUT <= (TIMEOUT_CNT == 22'h1FFFFF);

always@(posedge TIMEOUT or posedge X_WSTB or posedge Y_WSTB or negedge nRESET)
  begin
    if (~nRESET || TIMEOUT) EN_BEAM <= 0;
	   else
		  if (X_WSTB || Y_WSTB) EN_BEAM <= 1;
  end
  
endmodule 
You do not have the required permissions to view the files attached to this post.
Last edited by Annett on 06 Nov 2017 01:36, edited 2 times in total.
Annett
Senior
Posts: 137
Joined: 30 Mar 2017 00:55

Re: Альтернативная система на 68000 :)

Post by Annett »

еще картинки :)
это просто первые тесты, еще на асме.
синусы и косинусы :)
Наверное нужно будет закодить С-шные функции для вывода координат и цвета...

видео (загрузка случайных векторов): http://disk.karelia.pro/psp7npf/
You do not have the required permissions to view the files attached to this post.