Autor Wątek: Modyfikacja ROM-u w CPC  (Przeczytany 3653 razy)

McArti0

  • **
  • Wiadomości: 66
Odp: Modyfikacja ROM-u w CPC
« Odpowiedź #15 dnia: 2021.08.23, 18:46:25 »
Cytuj
KEY 140,STRING$(8,CHR$(224))+CHR$(250)+"run"+CHR$(34)+CHR$(13)
Teraz tylko po cat najeżdżasz kursorem na 1szy znak nazwy pliku i wciskasz ctrl+enter a plik sie uruchamia.

mam to zrobione tyle, że tylko dla pierwszej kolumny bo dałem 250 również na początku żeby nie trzeba było ustawiać pierwszego znaku. ... i chyba to nie działa.

Cytuj
Do kompletu na ctrl ze strzałkami <- i -> dodać kody które przeskakują kursorem o całą kolumnę na wyświetlanym katalogu, co by łatwiej trafić w pierwszy znak nazwy pliku w sąsiednich kolumnach. :)

mam skrupuły ;) zastępować ctrl+ArrowLeft może większe mniejsze to powinno być?  ctrl+Arrow wraca do początku linii tak włączałem BASy. Copy potem CTRL ArrowLeft ENTER

Cytuj
Nie czaję na czym polega ta kompresja obrazka. Jaki duży może być ten obrazek w osobnym ROMie, jaką metodą go skompresować i jak wyświetlić?

jest to metoda RLE

[1-127*][DN]...[128+(1-127*)][DN1][DN2]....[DNx]...[0]

bajty identyczne są pogrupowane w dwubajtowe pary NxBajt czyli krotność takiego samego bajtu, w porywach 127 bajtów tła zapisze się jako 127, 0

drugi rodzaj grup to bajty które nie daja sie skompresować pierwszy bajt podaje ile jest takich bajtów 1-127 i ma ustawiony bit 7 potem następuje sekwencja tych bajtów. Bajt sterujący o wartości 0 kończy obrazek.

Kompresja jest wydajna o ile mamy znaczną część ciągów bajtów identycznych. puste 16Kb ekranu to 259 bajtów :)

przygotowuje jakiś util do tego. niemam jeszcze dorobione żeby ta procedura w ROMie sama czytała rozdzielczość tego obrazka. narazie tam jest na sztywno miejsce na ekranie i wielkość 10x5 znaków mode 1. Jeżeli zostajemy w romie dodatkowym i nie kisimy sie w tym jednym kilo AMSDOSa to obrazków pełnoekranowych zmieścimy tam kilka. Nawet animacje można zrobić.

Załączam pierwsze wersje tego Utilu. jest w basicu z procedurą maszynową.

Kolejne procedury S2O, O2K, K2O, O2S gdzie S to screen, O to Obrazek rozkompresowany, K obrazek skompresowany.

Obrazek rozkompresowany jest zapisany linia po linii, inaczej niż w pierwszych wersjach w tym wątku.

;z pamieci na ekran
org #9200
;call&9200,&AdresOnScreen,@tablica_nieskompresowana
ld h,(IX+3)
ld l,(IX+2)

;ld de, ;src

;ld hl, ;trg

ld c,0
ld b,5   ;Y bajtow
nextL2:
push bc
ld b,8
push hl
nextL:
push bc
ld bc,20  ;X bajtow
push hl
ex de,hl
ldir
ex de,hl
pop hl
ld bc,2048
add hl,bc

pop bc
djnz nextL
pop hl
ld c,80
add hl,bc
pop bc
djnz nextL2
ret


;z ekranu do pamieci
org #9230
;call&9230,@tablica_nieskompresowana,&AdresOnScreen
ld h,(IX+3)
ld l,(IX+2)

ex de,hl

;ld de,#4000;trg
;ld hl,#c000;src;

ld bc,#0500   ;Y bajtow
nextS2:
push bc
ld b,8   
push hl
nextS:
push bc
ld bc,20  ;X bajtow
push hl

ldir

pop hl
ld bc,2048
add hl,bc

pop bc
djnz nextS
pop hl
ld c,80
add hl,bc
pop bc
djnz nextS2
ret


;############### RLE dekompresor #################
org #9260
;call&9260,@tablica_nieskompresowana, @tablica_kompresji
ld h,(IX+3)
ld l,(IX+2)

;ld hl,kompres ;
;ld de,dekompres ;
ex de,hl
NextD:

ld a,(hl)
add 0

ret z
ld c,a

inc hl
bit 7,c
jp z,rle

res 7,c
ld b,0
ldir

jr nextD

rle:

ld b,c

ld a,(hl)

p1:
ld (de),A
inc de
djnz p1
inc hl
jr nextD


;################### RLE kompresor ###############
org #9290
;call&9290,@tablica_kompresji, @source, wielkosc_obrazka,@wielkosc_po_kompresji
di
ld iY,0
add iY,SP
ld SP,IX
pop bc
pop IX
pop HL
pop de
ld sp,iy
ei
push bc ;adres w 4 parametrze
push de ;adres w 1 parametrze tabl_kompr
;ld hl, ;obrazek linia po linii
;ld de, ;obrazek skompresowany
ld bc,#ffff ; -1
push bc
;ld ix,  ;wielkosc obrazka-1
dec ix

start:
EX (SP), HL ;|
ex de,hl ;|
inc ix ;|
add ix,de ;|-- takie jazdy z dekrementacja licznika
ex de,hl ;|   w rejestrze, ktory nie obsluguje flag
EX (SP), HL ;|   nie mozna od niego odejmowac,
jr c,not_end ;|   nie mozna dodawac rejestru HL

xor a
ld (DE),A
inc de
pop bc ; -1
ex hl,de  ;
pop de ;adr tablicy_kompr
cp a
sbc hl,de
ex de,hl
pop hl
ld (hl),e
inc hl
ld (hl),d

ret

not_end:

ld B,0

LD A,(HL)

tesame:
inc b
bit 7,b
jr nz,end127
;+++++++++++++++++++++++++
EX (SP), HL
ex de,hl
add IX,de
ex de,hl
EX (SP), HL
jr nc,end_tsame

inc hl
ld c,(hl)
cp c
jr z,tesame
jr end_tsame

end127:
dec b

end_tsame:
;push bc ; b -licznik , c -ostatnia dana

dec b
jr z,licz_rozne
inc b

push AF
ld a,b
ld (de),A
inc de
pop af
ld (de),A
inc de

jr start

;***********************************************

licz_rozne:
ld b,1

push de
pop iY
inc de
ld (de),A

p2:
bit 7,b
jr nz,end_rozne
inc b
ld A,c
inc de
ld (de),A
;+++++++++++++++++++++++++++++++
EX (SP), HL
ex de,hl
add IX,de
ex de,hl
EX (SP), HL
jr nc,set_rozne

inc hl
ld c,(HL)
cp c
jr nz,p2

jr set_rozne

end_rozne:
dec b
;jr z,start
set_rozne:
set 7,b
ld (iY+0),b
ld a,c
inc de

jr start

ret

« Ostatnia zmiana: 2021.08.23, 18:56:51 wysłana przez McArti0 »

ZbyniuR

  • *****
  • Wiadomości: 3191
  • Miejsce pobytu:
    Carlisle w UK
  • CPC AGA PSX
Odp: Modyfikacja ROM-u w CPC
« Odpowiedź #16 dnia: 2021.08.24, 14:59:53 »
Kod 250 w edytorze Basica nie cofa do lewego marginesu, tylko do początku linii którą wpisujesz. Możesz przesunąć kursor daleko od marginesu i jak tam wpiszesz pierwszy znaczek (lub skopiujesz go drugim kursorem) to tam będzie początek linii do którego cofnie jak użyjesz tego kodu. Dzięki temu ten trik kopiujący nazwę pliku i run działa także w innych kolumnach. :)

Co do tych kodów przesuwających kursor o kolumnę STRING$(20,243) to miałem przed laty takie ustawienie w programiku startowym, i choć też sie lekko niepokoiłem że trafię na program w którym to przeszkadza, ale nie przypominam sobie. Wciąż zostają kody na ctrl + góra lub dół co przeskakuje na początek i koniec edytowanej linii Basica (nawet jak jest dłuższa niż szerokość ekranu). A w Basicu taka super tabulacja ze skokiem o 20 znaków jest nawet bardziej użyteczna. W porządnych edytorach tekstu i tak przywracał domyślne.
Hmm no właśnie bo jak tak będzie w ROMie a przy tym jakiś edytor tekstu zmieni funkcje to może być niefajnie. Trzeba by to przetestować. Ale dobrze kombinujesz z tymi <> bo tam z ctrl nic nie ma. Choć w emulatorach jeśli klawisz z \ masz przy lewym shift a nie prawym to emulator go wogóle nie widzi, więc wstawiłem kody z niego (`\) pod te <>.  Więc jeśli sie okaże że jakiś popularny edytor tekstu z takimi ustawieniami głupieje to lepiej będzie je wstawić na <>.

Co do kompresji czytałem o tego typu metodzie. W Bajtku 11/91 s10 są procedury w kodzie do wyświetlania skompresowanych obrazków z ArtStudio, i kompresowania ich jako CSI (to te co się wyświetlają po CALL &6000), w tym i kod do dekompresji ich który jest zawarty w samym obrazku.
Jakieś procedurki w kodzie do kompresji i dekompr są też w IKS 2/89 s15 ale nie obsługują palety.

Miałem kupę obrazków w CSI, zwykle zajmowały tyle samo KB co te z ArtStudia (tyle że nie potrzebowały osobnego pliku z paletą) a czasem CSI zajmowały o 1K mniej. I mało który obrazek był na tyle prosty by w kompresji tracić więcej niż 30% objętości. Czasem wystarczyło usunąć parę zbędnych pikseli na pustawych obszarach to dochodziło do 50%. Mniej zajmowały tylko obrazki z masą pustego miejsca na ekranie lub z masą samych poziomych linii. Dlatego wątpię by w 16K zmieściły sie więcej niż 2 ładne obrazki. Z resztą jak sie zmieści 1 to już by było super. :)
Mam te listingi wklepane. A te do pokazywania ArtStudia są w moim programiku startowym na DSK które parę razy wstawiałem na forum.
Jestem pod wrażeniem jaki jesteś oblatany w Amstradowych sprawach. :)
Coś być musi do cholery za zakrętem.

ZbyniuR

  • *****
  • Wiadomości: 3191
  • Miejsce pobytu:
    Carlisle w UK
  • CPC AGA PSX
Odp: Modyfikacja ROM-u w CPC
« Odpowiedź #17 dnia: 2021.09.05, 09:22:41 »
Nie tylko McArti0 pracuje nad obrazkiem startowym. :)

Tylko nie wiem czemu go w MODE 0 zrobił bo kolorowy nie jest.


Coś być musi do cholery za zakrętem.