Autor Wątek: Amstrad GX4000 - Asembler - Początki programowania.  (Przeczytany 2472 razy)

siudym

  • **
  • Wiadomości: 83
  • Miejsce pobytu:
    IŁAWA
Amstrad GX4000 - Asembler - Początki programowania.
« dnia: 2023.01.06, 13:33:38 »
Czy mógłbym otrzymać w pigułce informacje dotyczące programowania w ASM na GX4000?
Chciałbym spróbować coś napisać na ten system, ale w necie spory śmietnik informacyjny i ciężko doszukać się do czegoś konkretnego.

Czy GX4000 i Amstrad Plus to dokładnie to samo, ale GX to tylko wersja "konsolowa" bez klawiatury? Czy są jakieś inne różnice?

Znalazłem taki kod, jest to init Cartridga dla Amstrad Plus/GX4000.
Nie wiem tylko czym to kompilować, doczytałem, że używany jest często PASM - skompilowałem nim i wyszedł 102 Bajtowy plik, wiec pewnie coś trzeba jeszcze dodać jako opcja podczas kompilacji, ale nie wiem co i jak aby wyszedl 16KB plik ROM:)

;; This example shows a suggested startup for a cartridge

;; cartridge page 0 exists at &0000-&3fff
;; execution starts at &0000
;;
org &0000

start:

di ;; disable interrupts
im 1 ;; set interrupt mode 1
ld bc,&f782 ;; setup initial PPI port directions
out (c),c
ld bc,&f400 ;; set initial PPI port A (AY)
out (c),c
ld bc,&f600 ;; set initial PPI port C (AY direction)
out (c),c

ld bc,&7fc0 ;; set initial RAM configuration
out (c),c

;; unlock ASIC so we can access ASIC registers
ld b,&bc
ld hl,sequence
ld e,17
seq:
ld a,(hl)
out (c),a
inc hl
dec e
jr nz,seq

;; set initial CRTC settings (screen dimensions etc)
ld hl,end_crtc_data
ld bc,&bc0f
crtc_loop:
out (c),c
dec hl
ld a,(hl)
inc b
out (c),a
dec b
dec c
jp p,crtc_loop

ld hl,&c9fb
ld (&0038),hl
ei

;; enable asic ram (will be visible in range &4000-&7fff)
ld bc,&7fb8
out (c),c

;; your code here
loop:
jr loop

;; your crtc setup values here; these are examples
crtc_data:
defb &3f, &28, &2e, &8e, &26, &00, &19, &1e, &00, &07, &00,&00,&30,&00,&c0,&00
end_crtc_data:

;; sequence to unlock asic
sequence:
defb &ff,&00,&ff,&77,&b3,&51,&a8,&d4,&62,&39,&9c,&46,&2b,&15,&8a,&cd,&ee

end start

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4537
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Amstrad GX4000 - Asembler - Początki programowania.
« Odpowiedź #1 dnia: 2023.01.06, 14:50:17 »
Odnalazłem wątek, w którym był podany w/w listing (tj. https://www.cpcwiki.eu/forum/programming/create-good-cpr-for-gx4000/)

Gdzieś dalej był link do archiwum pokazujące jak wygenerować obraz carta. Zip dodałem do tego postu.

Nigdy się tym nie zajmowałem, więc jeżeli to pomogło, to chętnie bym poczytał jak co trzeba zrobić aby móc w pełni developować na CPC+.

siudym

  • **
  • Wiadomości: 83
  • Miejsce pobytu:
    IŁAWA
Odp: Amstrad GX4000 - Asembler - Początki programowania.
« Odpowiedź #2 dnia: 2023.01.06, 18:49:50 »
Nie wiem o co biega z tym "rominject" ?
Trzeba wykonac jakies klejenie pewnych danych w kompilowany ROM dodatkowo?

W katalogu cart_setup/fs/ mam boot.bin - rozumiem trzeba go zawsze dolaczyc do swojego kodu aby zadzialalo to na GX4000 ?
Nigdzie nie ma binarki "cartfs" - na stronie cpcwiki nie moge doszukac sie :/

Skompilowalem ten kod, dodalem zmiane koloru ramki na YELLOW.
Niby dziala, plik byl ponad 400 bajtow, ale dodalem na koncu:

org &3FFF
defb &00

I skompilowal sie idealnie na 16KB - nie wiem czy poprawnie to robie ;)
Dzialaja oba pod emu, albo przynamniej mi sie wydaje bo nie wiem jak dokladnie ustawic WinAPE.

Moze ktos sprawdzic te dwa pliki CPR czy sa poprawne?

pasmo cart.asm cart.bin
python mkcpr.py cart.bin
pause


; This example shows a suggested startup for a cartridge

;; cartridge page 0 exists at &0000-&3fff
;; execution starts at &0000
;;
org &0000
jp start
org &0038
ei
ret
start:

di ;; disable interrupts
im 1 ;; set interrupt mode 1
ld bc,&f782 ;; setup initial PPI port directions.
out (c),c
ld bc,&f400 ;; set initial PPI port A (AY)
out (c),c
ld bc,&f600 ;; set initial PPI port C (AY direction)
out (c),c

ld bc,&7fc0 ;; set initial RAM configuration
out (c),c

;; unlock ASIC so we can access ASIC registers
ld b,&bc
ld hl,sequence
ld e,17
seq:
ld a,(hl)
out (c),a
inc hl
dec e
jr nz,seq

;; set initial CRTC settings (screen dimensions etc)
ld hl,end_crtc_data
ld bc,&bc0f
crtc_loop:
out (c),c
dec hl
ld a,(hl)
inc b
out (c),a
dec b
dec c
jp p,crtc_loop

ld hl,&c9fb
ld (&0038),hl
ei

;; enable asic ram (will be visible in range &4000-&7fff)
ld bc,&7fb8
out (c),c

;; your code here
loop:

LD        BC,#7F10 ; I add this little code in the loop: for adding color border, just for testing
OUT      (C),C
LD        A,$4A ; yellow border
OUT      (C),A


jr loop

;; your crtc setup values here; these are examples
crtc_data:
defb &3f, &28, &2e, &8e, &26, &00, &19, &1e, &00, &07, &00,&00,&30,&00,&c0,&00
end_crtc_data:

;; sequence to unlock asic
sequence:
defb &ff,&00,&ff,&77,&b3,&51,&a8,&d4,&62,&39,&9c,&46,&2b,&15,&8a,&cd,&ee

org &3FFF
defb &00

end

« Ostatnia zmiana: 2023.01.06, 19:03:05 wysłana przez siudym »

McArti0

  • ***
  • Wiadomości: 113
Odp: Amstrad GX4000 - Asembler - Początki programowania.
« Odpowiedź #3 dnia: 2023.01.16, 23:17:29 »

McArti0

  • ***
  • Wiadomości: 113
Odp: Amstrad GX4000 - Asembler - Początki programowania.
« Odpowiedź #4 dnia: 2023.01.17, 18:51:39 »
sprawa wydaje się w miarę prosta.

Cartridge w najprostszej postaci to pierwsze do 16kB ROM

W WinApe ASM piszesz:
WRITE DIRECT 0,-1,&C0

i wtedy kompiluje Ci ASM właśnie do LOWROM (to pierwsze zero decyduje, że LOWROM jest włączony)

Czym innym jest wytworzenie pliku CPR, on zaczyna się od 28 bajtowego nagłówka.

siudym

  • **
  • Wiadomości: 83
  • Miejsce pobytu:
    IŁAWA
Odp: Amstrad GX4000 - Asembler - Początki programowania.
« Odpowiedź #5 dnia: 2023.01.28, 19:44:34 »
Coś tam udało się ogarnąć, ale jakaś ciężka ta architektura..., a może za mało zagłębiłem się  8)

Jakieś baaardzo proste "grywalne hello world" napisałem, ale jeszcze muszę sporo posiedzieć nad tym. Pewnie wrócę jeszcze do tematu aby pociągnąć dalej.

https://www.youtube.com/watch?v=i5BmS-mBugM

Plik ".CPR" w załączniku. Nie mam pojęcia czy zadziała na prawdziwym Amstrad CPC+, na razie odpala się na WinAPE i Arnold.

McArti0

  • ***
  • Wiadomości: 113
Odp: Amstrad GX4000 - Asembler - Początki programowania.
« Odpowiedź #6 dnia: 2023.01.29, 11:12:36 »
Ciężka? pracujesz na gołym sprzęcie. Jak chce sie biosu to trzeba go sobie napisać...  :D

można też ukraść pierwsze 16kb z Amstrada CPC+ i mieć ekosystem jak w komputerze.

siudym

  • **
  • Wiadomości: 83
  • Miejsce pobytu:
    IŁAWA
Odp: Amstrad GX4000 - Asembler - Początki programowania.
« Odpowiedź #7 dnia: 2023.01.30, 11:55:11 »
Oczywista sprawa, że na gołym sprzęcie - zdecydowanie zawsze taką opcję preferowałem. ;)
Ciężki gdy porównać go do C64 czy Atari 8Bit, które bardzo szybko udało się ogarnąć podstawy. Tutaj jest sporo niejasności, których jeszcze nie załapałem.
Widocznie wymaga czasu.

Update demka w załączniku.

ZbyniuR

  • *****
  • Wiadomości: 3333
  • Miejsce pobytu:
    Carlisle w UK
  • CPC AGA PSX
Odp: Amstrad GX4000 - Asembler - Początki programowania.
« Odpowiedź #8 dnia: 2023.01.30, 16:50:09 »
A te MOSowe platformy też zaczynałeś rozgryzać od asemblera czy może od Basica?
Albo czy próbowałeś już pisać na inne konsole, np NES albo Master System?
- Jeśli masz w domu światło i wodę, tzn. że masz światłowód. ;)

siudym

  • **
  • Wiadomości: 83
  • Miejsce pobytu:
    IŁAWA
Odp: Amstrad GX4000 - Asembler - Początki programowania.
« Odpowiedź #9 dnia: 2023.01.30, 19:48:41 »
Wyłącznie ASM. Jak mam jakieś BIOS CALL'sy to i tak zawsze staram się je obejść. NES/SMS coś tam już kiedyś dłubałem.

siudym

  • **
  • Wiadomości: 83
  • Miejsce pobytu:
    IŁAWA
Odp: Amstrad GX4000 - Asembler - Początki programowania.
« Odpowiedź #10 dnia: 2023.01.31, 11:55:59 »
Drobny Fix bo miałem Stack Pointer na $8000 powinien być lepiej na $C000 (uzywanie 4000-7FFF przez ASIC).
Sprawdzone na 3 emulatorach jak Arnold, WinAPE oraz RetroVirtualMachine i tam odpala się.