MSX'te DC-600 ile SPIDER FLASH KARTA ROM ATMAK

Başlatan unay, 24 Ekim 2025, 21:04:27

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

unay

Deneme yanılma ve öğrenme yöntemi ile muvaffak olduğum şey.
Yine saçma bir giriş yaptım, 20 sene önce sadece 1 sene sözlük olaylarına girmiştim.
Oradan kalan alışkanlıkla tanımlama yaptım.

Öncelikle bununla ilgili webde yeterli bilgi yok, yoktan kastım sıfır bilgili insanın yapacağı şekilde bir kaynak yok maalesef.
DC-600(floppy controller) ve Spider Flash(kartuş) dışında ekte yüklemiş olduğum WSTRRT.COM dosyası ve yine ekte yüklediğim Disk Manager uygulaması gerekiyor.

Öncelikle Disk Manager uygulaması ile bir MSX DOS disketi ya da imajı hazırlıyoruz (MSX DOS da gerekiyor yazmayı unuttum).
Ben MSX DOS imajı hazırladım ve gotek ile tek disket üzerinden tüm işi halledebilmek adına bu disketin içine hem WRTSST.COM dosyasını hem de Spider Flash karta yüklemek istediğim rom dosyalarını ekledim. Bu imajı da ekliyorum, Disk Manager ile imajı açıp içindeki rom dosyalarının yerine başka rom dosyalar yükleyerek zahmetsizce kullanabilirsiniz.



Sonrasında hem DC-600'ü hem Spider Flash'ı MSX cihazımıza takıyoruz (evet çift kartuş yuvası gerekli). Bu aşamada DC-600'e goteki bağlayıp hazırladığımız MSX DOS imajını gotek üzerinde seçmiş olmamız gerekiyor.
Spider Flash karta rom yazmak için kart üzerindeki switch'in on konumunda olması gerekiyor ama açılışta kartın devreye girmemesi için off konumuna alıyoruz. Ve cihazı açıyoruz.
Herşey yolunda ise bizi aşağıdaki gibi bir MSX DOS ekranının karşılıyor olması gerek.



Sonrasında "DIR" komutu ile disk imajının içeriğini kontrol ediyoruz ve WRTSST.COM uygulaması ve romlar görünüyor ise Flash kartın switchini on konumuna alıp aşağıdaki komutu giriyoruz ve birkaç saniyede yazıyor.

WRTSST dosyaism.rom



Ben 16-32-48-64kb çeşitli romlar denedim, bir kısmı çalışmadı. 128kb rom denediğimde ise direkt hata verdi.
Normalde projenin sayfasında 48kb a kadar olan romların çalıştığı yazıyordu ama 64kb romları da çalıştırabildim.
Kart üzerinde kullanılan çip 39SF010 kodlu bir çip, bu çipin 39SF020 ve 39SF040 olarak daha yüksek kapasiteli olanları da mevcut.
Bu çipleri kullanarak daha yüksek kapasiteli romları yüklemek mümkün olabilir.
Bir sonraki adım, 39SF040 alıp 128kb ve 256kb rom denemek olacak.

64kb romlu oyundan bir iki görsel;





Edit: DC 600 ve Spider Flash görseli ekledim.

Amstrad CPC az anlar, çok sever.

Ref

buyrun size spider flash'a atılacak bir rom :)  "the inevitable end"

el emeği göz nuru. BlueMSX ile denedim çalışıyor ama MSX1 only çünkü ColecoVision geliştirme kitini kullandım (libCV). 8bitworkshop'ta hazır var, incelemek isteyenler için kodu da ekliyorum.

[attachment=0,msg15691]

MSX'ten zerre anlamadığım için teyp kasedi dosyası üretmeyi bilmiyorum. Öyle birşey var mı onu da bilmiyorum. Hangi format? Nasıl paketlenir? derlenmiş kod ~3KB civarı, teyple de rahat yüklenecek bir boyut.

Neyse sonuçta KARTUŞ haliyle ekte veriyorum. BlueMSX'de standard MSX açıp, file>cartridge  slot 1> insert seçip zip'in içindeki binary dosyayı verin.


// Ref 2025  -- https://zx.tr/ret
// "the inevitable end"

#include <stdlib.h>
#include <cv.h>
#include <cvu.h>
#include "common.h"

byte b;
word pg;
byte logo_y, logo_x;


byte draw_y;
byte draw_x;

//  LUT çünk RND komutu ~1 frame sürüyor, saçmalık
byte random_color_table[256];
byte random_index = 0;

//  Sprite pattern isimleri
#define SPRITE_NAME_ref           0
#define SPRITE_NAME_BALL_ROUND     4
#define SPRITE_NAME_BALL_STRETCH   8
#define SPRITE_NAME_BALL_SQUASH    12

//  üşendim 16x16 sprite kullandım bu yüzden boş spritelara ihtiyacım var
const unsigned char blank_pattern[8] = {
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

void setup_random_table() {
    int i;
    for (i = 0; i < 256; i++) {
        random_color_table[i] = (rand() & 14) + 1;
    }
}

void vdp_setup() {
  cv_set_screen_active(false);
  cv_set_screen_mode(CV_SCREENMODE_STANDARD);
  cv_set_image_table(IMAGE);
  cv_set_character_pattern_t(PATTERN);
  cv_set_color_table(COLOR);
  cv_set_sprite_pattern_table(SPRITE_PATTERNS);
  cv_set_sprite_attribute_table(SPRITES);
  cv_set_sprite_big(true);
}


const char *all_logos[3][5] = {
    { "RRR  EEEE TTT RRR   OOO    J EEEE N   N", "R  R E     T  R  R O   O   J E    NN  N", "RRR  EEE   T  RRR  O   O   J EEE  N N N", "R R  E     T  R R  O   O   J E    N  NN", "R  R EEEE  T  R  R  OOO  JJ  EEEE N   N" },
    { " SSSSPPP  I DDD  EEEEERRR  FFFFFL     A   SSS H   H", "S       P I D  D E       R F    L    A A S    H   H", " SSS PPP  I D  D EEE  RRR  FFF  L   AAAAA SSS HHHHH", "   S P    I D  D E    R R  F    L   A   A   S H   H", "SSS  P    I DDD  EEEE R  RRF    LLLLA   ASSS  H   H" },
    {
        "TTTTT H   H X   X    222    U   U N   N  AAA  Y   Y",
        "  T   H   H  X X        2   U   U NN  N A   A  Y Y ",
        "  T   HHHHH   X       22    U   U N N N AAAAA   Y  ",
        "  T   H   H  X X     2      U   U N  NN A   A   Y  ",
        "  T   H   H X   X    2222    UUU  N   N A   A   Y  "
    }};

const byte logo_x_positions[3] = {12, 7, 8};

//ref bitmapı
const unsigned char ref_sprite_pattern[16] = {
    0x06, 0x18, 0xA0, 0xC1, 0x92, 0xAA, 0xBA, 0xA7, 0x32, 0x1A, 0x02, 0x04, 0x04, 0x08, 0x30, 0x00
};

//animasyon bilgimizi konuşturalım yani
const unsigned char ball_round_pattern[8] = {
    0x00, 0x3C, 0x7E, 0x7E, 0x7E, 0x7E, 0x3C, 0x00
};
const unsigned char ball_stretch_pattern[8] = {
    0x18, 0x3C, 0x7E, 0x7E, 0x7E, 0x7E, 0x3C, 0x18
};
const unsigned char ball_squash_pattern[8] = {
    0x00, 0x00, 0x00, 0x3C, 0x7E, 0xFF, 0xFF, 0x7E
};

//bu colecovision structu
struct cvu_sprite my_sprite_attributes[2];

void setup_my_sprite_pattern() {
  // Ref (16x16) aslında iki tane 8'lik kullanmak vardı, chetçipiti'ye kandım yanlış başladım, şimdi ceremesini çek işte
  cvu_memtovmemcpy(SPRITE_PATTERNS + (SPRITE_NAME_ref * 8), ref_sprite_pattern, sizeof(ref_sprite_pattern));
  cvu_memtovmemcpy(SPRITE_PATTERNS + (2 * 8), blank_pattern, sizeof(blank_pattern));
  cvu_memtovmemcpy(SPRITE_PATTERNS + (3 * 8), blank_pattern, sizeof(blank_pattern));

  // YUVARLAK TOP Bloku
  cvu_memtovmemcpy(SPRITE_PATTERNS + (SPRITE_NAME_BALL_ROUND * 8), ball_round_pattern, sizeof(ball_round_pattern));
  cvu_memtovmemcpy(SPRITE_PATTERNS + (5 * 8), blank_pattern, sizeof(blank_pattern));
  cvu_memtovmemcpy(SPRITE_PATTERNS + (6 * 8), blank_pattern, sizeof(blank_pattern));
  cvu_memtovmemcpy(SPRITE_PATTERNS + (7 * 8), blank_pattern, sizeof(blank_pattern));

  // UZAMIŞ TOP Bloku
  cvu_memtovmemcpy(SPRITE_PATTERNS + (SPRITE_NAME_BALL_STRETCH * 8), ball_stretch_pattern, sizeof(ball_stretch_pattern));
  cvu_memtovmemcpy(SPRITE_PATTERNS + (9 * 8), blank_pattern, sizeof(blank_pattern));
  cvu_memtovmemcpy(SPRITE_PATTERNS + (10 * 8), blank_pattern, sizeof(blank_pattern));
  cvu_memtovmemcpy(SPRITE_PATTERNS + (11 * 8), blank_pattern, sizeof(blank_pattern));

  // YAYILMIŞ TOP Bloku
  cvu_memtovmemcpy(SPRITE_PATTERNS + (SPRITE_NAME_BALL_SQUASH * 8), ball_squash_pattern, sizeof(ball_squash_pattern));
  cvu_memtovmemcpy(SPRITE_PATTERNS + (13 * 8), blank_pattern, sizeof(blank_pattern));
  cvu_memtovmemcpy(SPRITE_PATTERNS + (14 * 8), blank_pattern, sizeof(blank_pattern));
  cvu_memtovmemcpy(SPRITE_PATTERNS + (15 * 8), blank_pattern, sizeof(blank_pattern));
}


void multicolor_fullscreen_image_table(word ofs) {
  byte x,y;
  for (y=0; y<48; y++) { for (x=0; x<32; x++) { cvu_voutb(x + (y>>2)*32, ofs++); } }
}
void setup_multicolor() {
  cvu_vmemset(0, 0, 0x4000);
  cv_set_image_table(IMAGE);
  cv_set_character_pattern_t(PATTERN);
  cv_set_screen_mode(CV_SCREENMODE_MULTICOLOR);
  multicolor_fullscreen_image_table(IMAGE);
}
void set_pixel(byte x, byte y, byte color) {
  if (x >= 64 || y >= 48) return;
  pg = (x>>1)*8 + (y & 7) + (y & ~7)*32 + PATTERN;
  b = cvu_vinb(pg);
  if (x&1) b = color | (b & 0xf0); else b = (color<<4) | (b & 0xf);
  cvu_voutb(b, pg);
}

// şu anda 25FPS'e göre ayarlandı. 50fps için bunu 20 yapın
#define PIXELS_PER_FRAME 35

const char bounce_table[16] = {
    0, -3, -6, -9, -12, -14, -15, -16, -16, -15, -14, -12, -9, -6, -3, 0
};
const byte ref_base_y = 20;
const byte ball_base_y = 175;
byte bounce_step = 0;


#ifdef __MAIN__

void main() {
 
  byte current_logo_index = 0;
  word display_counter = 0;
  byte pixels_drawn_this_frame;


  byte ball_x = 120;
  char ball_direction_x = 1;

  vdp_setup();
  setup_multicolor();
  setup_random_table();
  setup_my_sprite_pattern();


  my_sprite_attributes[0].y = ref_base_y;
  my_sprite_attributes[0].x = 240;
  my_sprite_attributes[0].name = SPRITE_NAME_ref;
  my_sprite_attributes[0].tag = CV_COLOR_LIGHT_BLUE;
 
  my_sprite_attributes[1].y = ball_base_y;
  my_sprite_attributes[1].x = ball_x;
  my_sprite_attributes[1].name = SPRITE_NAME_BALL_ROUND;
  my_sprite_attributes[1].tag = CV_COLOR_WHITE;

  logo_x = logo_x_positions[current_logo_index];
  logo_y = 21;
  draw_x = 0;
  draw_y = 0;

  cv_set_screen_active(true);

  while(1) {

    my_sprite_attributes[0].y = ref_base_y;

    my_sprite_attributes[1].y = ball_base_y + bounce_table[bounce_step];
    ball_x += ball_direction_x;
    if (ball_x >= 248) {
        ball_direction_x = -1;
    } else if (ball_x <= 0) {
        ball_direction_x = 1; 
    }
    my_sprite_attributes[1].x = ball_x;

    if (bounce_step >2) {
        my_sprite_attributes[1].name = SPRITE_NAME_BALL_ROUND;
    } else if (bounce_step == 0 || bounce_step == 15) {
        my_sprite_attributes[1].name = SPRITE_NAME_BALL_SQUASH;
    } else {
        my_sprite_attributes[1].name = SPRITE_NAME_BALL_STRETCH;
    }
   
    bounce_step = (bounce_step + 1) & 15;
   
    // VDP güncelle -- Daha fazla bilgi için retroskop'un yeni sezonunu izleyiniz! :) YAKINDA!
    cvu_memtovmemcpy(SPRITES, my_sprite_attributes, sizeof(my_sprite_attributes));

    // V-Sync bekle ki bu zx spectrumdan arakladığım bir taktik oldu
    __asm__("EI");   
    __asm__("halt");


    display_counter++;
    if (display_counter >= 180) {
        display_counter = 0;
        current_logo_index = (current_logo_index + 1) % 3;
        logo_x = logo_x_positions[current_logo_index];
        draw_x = 0;
        draw_y = 0;
        cvu_vmemset(PATTERN, 0, 0x1800);
    }
   
    pixels_drawn_this_frame = 0;
    while (pixels_drawn_this_frame < PIXELS_PER_FRAME) {
        if (all_logos[current_logo_index][draw_y][draw_x] == '\0') {
            draw_x = 0;
            draw_y++;
            if (draw_y >= 5) { draw_y = 0; }
            continue;
        }
        if (all_logos[current_logo_index][draw_y][draw_x] != ' ') {
            set_pixel(logo_x + draw_x, logo_y + draw_y, random_color_table[random_index]);
            random_index++;
            pixels_drawn_this_frame++;
        }
        draw_x++;
    }
  }
}

#endif

//bu satırın bir altında boş bir satır olmalı, gerekirse basın enter'a burda altı boş olsun

unay

Şahaneymiş, benim kızlar bayılacak :)
Eline sağlık.
Amstrad CPC az anlar, çok sever.

unay

2. Parti kartuş ve dc 600 malzemelerinin bir kısmı geldi.
Bu sefer eprom olarak 256kb hafızaya sahip 39SF020 almıştım. Derdim 128kb kartuş romlarının da çalışıp çalışmayacağını test etmekti.

Maalesef olmadı, komutu girdiğimizde direkt olarak kartuş bulunamadı hatası veriyor. Hemen peşine 64kb başka rom yüklemek istediğimde problemsiz yüklüyor.
Aslında yazma sırasında kartuş tipini simple64k olarak belirtiyormuş. Bu benim gözümden kaçtı. Şimdi hevesim de kaçtı. Bir de 020 ve 040 epromlara fazladan 1-2 şer usd ödedik, o kaçtı :)
Amstrad CPC az anlar, çok sever.