Šta je novo?

Galaksija

ali kako idem sve dublje u otkrivanje sta sve treba za jedan obican zvucni dodatak za galaksiju 2024 sve je vise komplikovano, znaci evo primer samo da bi ubacio taj asembler program za nove komande u BASIC u eeprom fles morao bi da skidam sa ploce eeprom SMD fles ili da ga ostavim pa da dodam ISP header sa 6 pinova i programiram ga preko USB-SPI programatora na primer CH341A i opet ima jos svasta ma to uopste nije lako... mozda najbolje da ja eksperimentisem samo sa arduinom i tim AY-3-8910 cipom :)
Ne treba mešati 8-pinski EEPROM čip (sa dva "E") u koji se snimaju programi za izvršavanje na Galaksiji, i 28-pinski EPROM čip (sa jednim "E") u kojem je BASIC.
 
ROM sa stare Galaksije ne može da radi na Galaksiji 2024 - video rutina je promenjena, druga je frekvencija slike i linijska frekvencija. Ako bi uopšte bilo slike, ona bi bila znatno izobličena. Takođe, u starom ROM-u nema naredbi za snimanje i čitanje iz EEPROM-a.

Osim EPROM programatora, potreban je i UV brisač EPROM čipova.
Razumem al jednostavnije mi da kupim a vec imam u rezervi jedan nov prazan 27C512 eprom cip nego da koristim UV brisac za eprom cipove.
 
Ključne razlike u odnosu na kompajler:

  • Vreme izvođenja:
    Kompajler ceo program prevede pre nego što ga izvršite, dok interpreter prevodi i izvršava program u isto vreme, liniju po liniju.
  • Izlaz:
    Kompajler generiše zaseban izvršni fajl (mašinski kod), dok interpreter direktno izvršava izvorni kod.
  • Brzina:
    Kompajlirani programi su generalno brži pri izvršavanju jer je sav prenos već obavljen, dok interpretedni programi mogu biti sporiji zbog stalnog prevođenja.
  • Otklanjanje grešaka:
    Interpreteri olakšavaju pronalaženje i ispravljanje grešaka jer ukazuju na tačnu liniju koda koja je izazvala problem.
    e ovako napisano razumem malo bolje :)
  • U programskom jeziku, interpreter (prevodilac) je program koji direktno izvršava instrukcije napisane u izvornom kodu, bez potrebe da se ceo kod prethodno prevede u mašinski jezik. Za razliku od kompajlera koji stvara samostalnu izvršnu datoteku, interpreter čita i izvršava kod liniju po liniju ili umanjim blokovima, što omogućava brže pokretanje i lakše otklanjanje grešaka.
 
https://dejanristanovic.com/refer/galrom2.htm ovde je objasnjeno inicijalizacija ROM 2 al na staroj galaksiji nema objasnjeno kako to na novoj galaksiji izvesti posto nije isto a i eksperimentisanje sa masinskim jezikom i taj asembler u novoj galaksiji nije bas tako lako za pocetnike jer mozes slucajno nesto usnimiti gde ne treba al bi trebao prvo usnimiti originalni ROM operativni sistem i taj CHAR GEN sa galaksije 2024 na posebna 2 nova eprom cipa u slucaju da nesto zabrljam u tom masinskom jeziku,,,
 
https://dejanristanovic.com/refer/galrom2.htm ovde je objasnjeno inicijalizacija ROM 2 al na staroj galaksiji nema objasnjeno kako to na novoj galaksiji izvesti posto nije isto a i eksperimentisanje sa masinskim jezikom i taj asembler u novoj galaksiji nije bas tako lako za pocetnike jer mozes slucajno nesto usnimiti gde ne treba al bi trebao prvo usnimiti originalni ROM operativni sistem i taj CHAR GEN sa galaksije 2024 na posebna 2 nova eprom cipa u slucaju da nesto zabrljam u tom masinskom jeziku,,,

Već smo odavno utvrdili da se ova nova Galaksija razlikuje od originalne i na hradverskom i na softverskom planu, ubuduće možemo samo detaljnije da beležimo u čemu se te razlike ogledaju.
Zbog čega ti treba inicijalizacija Rom-a 2 ? Valjda su u ovoj novoj Galaksiji oba Rom-a prisutna i verujem da je inicijalizacija automatska.
Kod stare je ovo jednostavno, ali retko ko je to stalno radio ručno, malom izmenom u Rom-u 1, inicijalizacija se radi automatski.
Pominjao si ranije par puta i ROM C, on nema veze sa originalnom Galaksijom, romovi C i D su za Galaksije Plus.
Inače kad već pišem, evo i jedne bitne informacije vezano za projekat Galaksija emulatora za Pi Pico, koji sam pominjao ranije.
Kako sada stvari stoje rad na emulatoru će biti obustavljen, jer se u međuvremenu pojavio sličan emulator španskog kolege ackerman-a, tako da nema potrebe da se duplira angažovanje na istoj stvari.
Emulator podržava Pico i rp2040 bazirane ploče, već sad radi u punoj brzini, mada još nije potpuno završen.
Više detalja ovde:
Kolega Microjack i ja ćemo se najverovatnije pozabaviti dodatnim unapređenjem našeg FPGA jezgra za Galaksiju i apgrejdom na Galaksiju Plus, kad nam obaveze dozvole.
 
onda pretpostavljam da ne treba inicijalizacija ROM 2 u galaksiji 2024. Voleo bi da ima vise uputsva za novu galaksiju 2024 ... i sta sve moze
 
Pa što se tiče razlika
LPRINT, LLIST, LDUMP, INP i OUT sada ukinute i kod je uklonjen iz operativnog sistema. Ostale komande iz ROM-a B, kao što su matematičke funkcije, asembler i pretraživanje, funkcionišu normalno

+evo sem toga što nema slot za proširenje, koje je zapravo magistrala procesora. Možda ne bi bilo loše da se napravi adapter, tako da i G40 dobije identični izlaz kao o stara.

I memorijska mapa je izmenjena:
Screenshot-2024-04-19-at-9.44.40%E2%80%AFAM.png


Za većinu ostalih stvari uputsva su tačna.

Ključne razlike u odnosu na kompajler

Galaksijin Bejzik je intepreter, ali ima i kompajler (ako ga možemo tako nazvati) koji će prevesti mnemonike u byte kod koji prepoznaje procesor i smestiti u memoriju. Zavisno o direktive OPT n (https://galaksija.epizy.com/Help/ROM_2/23_rom2.html) će taj kod biti i odštampan.

Naravno, mnogo je lakše i udobnije programirati na modernom računaru i koristiti moderna razvojna okruženja, tipa VS Code.

Evo par hintova iz ličnog iskustva. Za kompajliranje z80 mašinca koristim z88dk. Iako nativno razvijen kao kompajler za C i finalni fajlovi su nešto veći, za početnike je veoma lak za korišćenje, jer ne moraju da brinu kako postaviti direktivu ORG tj. početak program.

Instaliranje z88dk je veoma lako, skinuti https://github.com/z88dk/z88dk/releases kompatiblne egzekutabilne fajlove za vaš operativni sistem i dodati folder folder u sistemske promenljive, tako da imate direktna pristup iz terminala.

Za da biste kompajlirali mašinac za galaksiju, dovoljno je da pozovete:
Kod:
zcc +gal -create-app -o PUTANJA_IZLAZNOG_FOLDERA VAS_KOD.asm

Evo primera:
zdravosvete.asm
Kod:
ROMPRINT  EQU     0x0937      ; ROM routine: prints zero-terminated string

PUBLIC _main:
; --- Main program ---
_main:
        LD      DE, message   ; DE = address of string
print:  CALL    ROMPRINT      ; print it
        ;JP      $             ; infinite loop (stay here)

; --- Data section ---
message:
        DEFM    "ZDRAVO SVETE!"
        DEFB    0             ; zero terminator (end of string)
Posle kompajliranja, dobićete hex, gtp i wav fajl koje na razne načine možete da preneseta na galaksiju, što je jako praktično.

Napomena: Ukoliko se piše samo kod u asembleru, neophodno je da je upisana direktiva PUBLIC _main i odgovarajuća labela. To je zbog toga što je neophodno da kompajler generiše dodatne instrukcije kako bi pozvao automatski generisani fajl.

Za pisanje koda, ja koristim Visual Studio Code, jer ima proširanja koji olakšavaju stvari pri pisanju i učenju, jer nudi objašnjenje instrikcija direktno u kodu, kao i neke druge stvari. Preporučujem Z80 Instruction set, ASM Code Lense, Hex Hover Converter, Binary File converter itd.
Screenshot 2025-08-24 at 17.09.23.png

A sada za šta je ono z88dk napravljen a to je C. Iz iskustva, pisanja u mašinskom kodu može da bude vremenski zahtevno, pa zato ja vidim kao alternativu neki hibrid C+ASM, što z88dk omogućava.

Primer koda u C-u:
zdravosvete.c
Kod:
#include <stdint.h>
#include "zgalaksija.h"
// === Main Loop ===
void main() {
    gal_cls();
    gal_gotoxy(0, 0);
    gal_puts("ZDRAVO SVETE!");
    //while (1) {}
}
zgalaksija.h
Kod:
/* Header file with specific GALAKSIJA low-level functions */

#define z80_bpoke(a,b)  (*(unsigned char *)(a) = b)
#define z80_wpoke(a,b)  (*(unsigned int *)(a) = b)
#define z80_lpoke(a,b)  (*(unsigned long *)(a) = b)
#define z80_bpeek(a)    (*(unsigned char *)(a))
#define z80_wpeek(a)    (*(unsigned int *)(a))
#define z80_lpeek(a)    (*(unsigned long *)(a))

#define SCREEN_ADDR 0x2800
#define RND_ADDR 0x2AA7

unsigned char _scr_x, _scr_y;


// Low-level clear the screen and reset internal cursor position
void gal_cls() { 
	int z;
	for (z = 0; z <512; z++) {
		z80_bpoke(SCREEN_ADDR + z, 32);
	}
	_scr_x = 0;
	_scr_y = 0;
}

// Set internal position of cursor for low-level putc and call gotoxy
void gal_gotoxy(char x, char y) {
	_scr_x = x;
	_scr_y = y;
}

// Low-level write character to internal cursor position
void gal_putc(char ch) {
	z80_bpoke(SCREEN_ADDR + (_scr_y << 5) + _scr_x, ch);
	_scr_x++;
	if (_scr_x > 32) {
		_scr_x = 0;
		_scr_y++;
	}
}

// Low-level write string to internal cursor position
int gal_puts (char *str) {
	char ch;
	int len = 0;
	while ((ch = *str) != 0x0) {
		z80_bpoke(SCREEN_ADDR + (_scr_y << 5) + _scr_x, ch);
		str++;
		len++;
		_scr_x++;
		if (_scr_x > 32) {
			_scr_x = 0;
			_scr_y++;
		}
	}
	return len;
}


// Fast single-key reader (returns 0 if no key pressed, or one of 1–4 for directions)
extern unsigned char get_key_fast(void) __z88dk_fastcall;

// Bitmask-based key reader for multi-key support (up to 8 bits)
extern unsigned char get_keys(void) __z88dk_fastcall;

// Bitmask return values
#define KEY_LEFT     0x01  // bit 0
#define KEY_RIGHT    0x02  // bit 1
#define KEY_UP       0x04  // bit 2
#define KEY_DOWN     0x08  // bit 3
#define KEY_Z        0x10  // bit 4
#define KEY_X        0x20  // bit 5
#define KEY_SPACE    0x40  // bit 6

// Diagonal directions (combinations)
#define KEY_UP_LEFT      (KEY_UP   | KEY_LEFT)   // 0x05
#define KEY_UP_RIGHT     (KEY_UP   | KEY_RIGHT)  // 0x06
#define KEY_DOWN_LEFT    (KEY_DOWN | KEY_LEFT)   // 0x09
#define KEY_DOWN_RIGHT   (KEY_DOWN | KEY_RIGHT)  // 0x0A


Na slican nacin kao asm mozete da kompajlirate fajl.
Kod:
zcc +gal -create-app zdravosvete.c

Ukoliko recimo vam treba DOT x,y, možete da koristite Vojinu implementaciju ili fast dot odavnde https://galaksija.epizy.com/Help/Tajne/korisne.html#fastdot

dakle prvo upišite mašinski kod funkcije
zdot.asm
Kod:
; Galaksija DOT routine by Voja Antonić, optimized for Z88DK
; Fills screen from (0,0) to (63,47) rapidly using _dot

    PUBLIC _dot
    PUBLIC _undot
    PUBLIC _ifdot


_dot:
    LD D, H       ; X (C passes it in L)
    LD E, L       ; Y (C passes it in H)
    LD A, 0x80
    JP pt1

_undot:
    LD D, H
    LD E, L
    LD A, 1
    JP pt1



_ifdot:
    LD D, H       ; X (in L)
    LD E, L       ; Y (in H)
    XOR A         ; mode 0 for ifdot
    CALL pt1
    ; result of AND (HL) was done in pt1; we now use Z flag
    LD H, 0          ; Return z flag.Place result in L for return
    LD L, 0       ; assume OFF
    RET Z         ; if Zero (pixel is OFF), return 0
    LD L, 1       ; else ON
    RET



pt1:
    PUSH DE
    EXX
    POP DE
    OR A
    PUSH AF
    LD C,D
    PUSH BC
    LD BC,0x20
    INC E
    LD HL,0x2800
goY:
    LD D,3
    LD A,1
y3:
    DEC E
    JR Z,gotov
    RLCA
    RLCA
    DEC D
    JR NZ,y3
    ADD HL,BC
    RES 1,H
    JR goY
gotov:
    LD B,A
    EX (SP),HL
    RES 7,L
    RES 6,L
    SRL L
    JR NC,parni
    RLCA
parni:
    LD H,0
    POP BC
    ADD HL,BC
    LD B,A
    POP AF
    LD A,B
    JR NZ,sres
    BIT 7,(HL)
    JR Z,exret
    AND (HL)
exret:
    EXX
    RET

sres:
    PUSH AF
    BIT 7,(HL)
    JR NZ,sr
    LD (HL),0x80
sr:
    POP AF
    JP M,setxy
    CPL
    AND (HL)
    LD (HL),A
    EXX
    RET

setxy:
    OR (HL)
    LD (HL),A
    EXX
    RET

Zatim je pozvite iz vašeg C koda:
zdravosvete_plus_asm.c
Kod:
#include <stdint.h>
#include "zgalaksija.h"

extern unsigned char dot(unsigned int packed_xy) __z88dk_fastcall;
// Elegant macro for use with x, y
#define DOT(x, y) dot(((x) << 8) | (y))

void main() {
    gal_cls();
    

    // Box coordinates
    int x0 = 0;        // left
    int y0 = 0;        // top
    int x1 = 30;   // right (12 chars * 8px + margin)
    int y1 = 8;    // bottom (char height + margin)

    // Top and bottom lines
    for (int x = x0; x <= x1; x++) {
        DOT(x, y0);    // top
        DOT(x, y1);    // bottom
    }

    // Left and right lines
    for (int y = y0; y <= y1; y++) {
        DOT(x0, y);    // left
        DOT(x1, y);    // right
    }

    gal_gotoxy(1, 1);
    gal_puts("ZDRAVO SVETE!");

    while (1) {}  // keep program alive
}

Stvar u tome je da iskoristite fascall z88dk, koji omogućuje ne samo pozivanje funkcije, već i prosledjivanje promenljivih
Kod:
extern unsigned char dot(unsigned int packed_xy) __z88dk_fastcall;

U načelu samo jedne, ali možete napisati makro da vam upakuje recimo dve, kao što sam ja
Kod:
extern unsigned char dot(unsigned int packed_xy) __z88dk_fastcall;
// Elegant macro for use with x, y
#define DOT(x, y) dot(((x) << 8) | (y))

Za kompajliranje
Kod:
zcc +gal -create-app zdravosvete.c zdot.asm

Ovo delim ovde pošto je po meni vrlo korisno, posebno kada je kritično vreme izvrašavanje nekih komandi, recimo mašinska grafika, skeniranje tatature (kako biste imali recimo odziv kad su više od jednog tastera pritisnuti, itd.)

Postavio sam zip sa primerima za eksperimentisanje. Nadam se će nekom koristiti.
 

Prilozi

  • z88dk_galaksija_examples.zip
    3.4 KB · Pregleda: 1
Poslednja izmena:
Nazad
Vrh Dno