forum speccy.pl
ZX Spectrum => SOFTWARE => Wątek zaczęty przez: Tygrys w 2012.07.23, 10:14:40
-
Zacytuję autora modyfikacji:
"This is a modified version of the standard ROM. The drawing commands don't do anything, there's no ZX Printer support, there's only about 34K of free RAM for your programs.
However, it provides a hi-res 80x24 text mode. It is fully integrated with the ROM and you can do almost anything you could in 32x24 mode (OVER, INVERSE, UDGs, block graphics, embedded control codes, etc).
Use the ROM file as an IF2 cartridge with a TC2048 or Spectrum SE, or use the DCK file as a cartridge with a TS2068/TC2068/UK2086. "
Plik do obrania: https://dl.dropbox.com/u/15659782/BASIC80.zip
URL do wątku na WoS: http://www.worldofspectrum.org/forums/showthread.php?t=40200
-
No, no, fajne :)
Choć nie rozumiem trochę tych ograniczeń. Ponad 20 lat temu powstała nakładka na Basic, dająca co prawda tylko 64 kolumny, ale za to również obsługę instrukcji graficznych HiRes. I zajmowało to raptem parę kilobajtów. Tak trudno by to było wcisnąć do ROM? Choć nadal nie widzę specjalnie sensu tracić kompatybilność dla czegoś, co łatwo wgrać z dysku czy z divide.
Poza tym 80 kolumn (w matrycy 6x8) oznacza, że część ekranu nie jest używana. Szkoda trochę. A dość fajnie wygląda 85 kolumn, sam kiedyś coś takiego napisałem. Przegrywało jednak z trybem 64 kolumn czasem wyświetlania.
-
Ja swego czasu używałem BASIC64 i mi wystarczył. 80x24 to już chyba lekka przesada, choć dla osób piszących długie programy w BASICu na TC może się przydać. A czy trudno to wcisnąć w ROM? Pewnie tak, bo w ROMie aż tak dużo miejsca nie zostało. Zobaczymy jak projekt będzie się rozwijać.
Aha, do 1-go postu dodałem adres wątku na WoS.
-
No, no, fajne :)
Choć nie rozumiem trochę tych ograniczeń. Ponad 20 lat temu powstała nakładka na Basic, dająca co prawda tylko 64 kolumny, ale za to również obsługę instrukcji graficznych HiRes. I zajmowało to raptem parę kilobajtów. Tak trudno by to było wcisnąć do ROM? Choć nadal nie widzę specjalnie sensu tracić kompatybilność dla czegoś, co łatwo wgrać z dysku czy z divide.
Poza tym 80 kolumn (w matrycy 6x8) oznacza, że część ekranu nie jest używana. Szkoda trochę. A dość fajnie wygląda 85 kolumn, sam kiedyś coś takiego napisałem. Przegrywało jednak z trybem 64 kolumn czasem wyświetlania.
To ograniczenie pamięci wynika z położenia obszaru drugiego ekranu zawierającego parzyste kolumny tekstu. Tak sądzę ...
-
Chodziło mi głównie o to, dlaczego nie ma obsługi DRAW - bo to poważne ograniczenie. To, że RAM-u jest mniej, to oczywiste - ekran zajmuje 2x po 6 KB, a obszary atrybutów są mało użyteczne, bo nie są w obszarze ciągłym, więc strata wynosi 2x7 KB.
-
Zrobiłem szybką analizę porównawczą tego ROMu z oryginalnym 48.
Po pierwsze tracimy 6955 bajtów - początek BASICa musi zostać przeniesiony ponad drugą połówkę ekranu: 24576+6144=30720, normalnie początek to 23755 stąd 30720-23755=6965. Dokładnie tracimy jeden bajt więcej, bo przenoszone jest CHANS (definicja - zwykle pusta - kanałów) a BASIC zaczyna się bajt wyżej.
Po drugie - procedura drukowania znaków w 80 kolumnach na pewno będzie bardziej rozbudowana niż standardowe 32 albo 64 kolumny - gdzieś trzeba wygospodarować miejsce na dodatkowy kod w tych 16 kilo. Zakładam, że w wolnym kawałku przed generatorem znaków. Nie jestem pewien, czy dałoby się podobnie przenieść (z powodu miejsca) pozostałe procedury - trzeba by zmienić obsługę stawiania punktu i wyliczania adresu na ekranie. Jako, że algorytmy musiałyby brać pod uwagę bankowanie ekranu byłyby dłuższe od swoich normalnych odpowiedników. Do tego dochodzi konieczność korekcji algorytmów rysowania koła i łuku, żeby dopasować się do zmienionego AR piksela. Ogólnie - nie jestem pewien, czy wszystko zmieściłoby się w 16 kilo.
A sama analiza też daje ciekawe rezultaty... Poniżej jej wyniki (wszystkie adresy w HEX, nazwy procedur wg The Complete Spectrum ROM Disassembly).
W całym ROMie zmienione zostały adresy następujących procedur:
PO-MSG 0C0A na 0B8F
PO-FETCH 0B03 na 0AE6
TEMPS 0D4D na 0CC2
CL-SET 0DD9 na 0D42
CL-ALL 0DAF na 0D1B
CLS-LOWER 0D6E na 0CE3
CL-LINE 0E44 na 0D95
Są to procedury drukowania tekstu, wyliczania adresu znaku, generowania atrybutu wg zmiennych systemowych i kasowania różnych fragmentów ekranu.
Zmieniona procedura PRINT-OUT (09F4) i cały blok procedur drukowania tekstów,
znaków, przesuwania kursora itp. aż do 0F2B
Od 0BF4 do 0F2B pusty obszar wypełniony FFami - tu być może można by przenieść część kodu dla grafiki.
Zmieniona procedura START/NEW (11CB) ustawia właściwy tryb graficzny.
Zmieniony kod inicjujący ekran pod 128B i dodane wywołanie kodu pod 39DE - znajduje się tam procedura przesuwająca początek BASICa (a dokładnie obszar definicji kanałów) pod adres 7800.
Usunięte odwołanie do COPY-BUFF pod 130C - Czyżby brak obsługi drukarki?
Zmieniony kod pod 18C1 (OUT-FLASH) drukujący znak z aktywnym FLASH - oczywiście nie ma FLASHa.
Zmieniona tabela interpretacji rozkazów
P-CLS - zmieniony adres 0D6B->0CE0
P-PLOT - zmieniony adres 22DC -> 1BB2
P-DRAW - zmieniony adres 2382 -> 1BB2
P-COPY - zmieniony adres 0EAC -> 1BB2
P-CIRCLE - zmieniony adres 2320 -> 1BB2
Wszystkie rozkazuy z adresem zmienionym na 1BB2 są obsługiwane jak REM -
poważny błąd, bo REM kończy interpretację linii i żadne kolejne rozkazy po
dwukropku nie są wykonywane.
Na przykład:
10 PRINT 1 : PLOT 0,0 : PRINT 2
Wyświetli tylko 1
Pod 20AA zmienione ld c,33 na ld c,81 - fragment procedury wyliczającej pozycję ekranu dla INPUT
Zmiana procedury generowania koloru dla wyświetlanego znaku od 2234
Zmiana procedury obsługi BORDER - zmienia parę INK/(PAPER+BORDER)
Ogólnie przestaje działać PRINT INK x;123 itp. konstrukcje - lokalna zmiana koloru zmienia dwukolorową parę dla całego ekranu.
Zmieniona końcówka procdedury PLOT (2304) - usunięte ustawianie atrybutów.
Od 386E ("wolny obszar") na oko sądząc procedura drukowania znaków o szerokości 6 pikseli i zmieniony generator znaków.
Myślę, że jakby się zaprzeć, to dałoby się dodać obsługę grafiki ;)
-
Ktos uruchomil to na real TC ? Wydaje mi sie, ze 80 znakow to juz przesada.
-
Usunięte odwołanie do COPY-BUFF pod 130C - Czyżby brak obsługi drukarki?
Dokładnie. Cytuję oryginalny post: "there's no ZX Printer support".
Jestem pod wrażeniem Twojej analizy, kawał solidnej (...) roboty! :)
-
Z racji tego że link z plikiem przestał działać, dodaję plik jako załącznik.
-
Gracias!
Jak miło, w zipie jest nie tylko plik .dck, ale również "czysty" ROM. Próbuję zrozumieć, czemu się różnią, oprócz oczywistego, 9-bajtowego nagłówka w .dck. Ale sam kod bootujący jest inny. Chciałbym na podstawie znalezionych różnic dopasować Zebra OS, bo mam tylko plik .dck :/
-
Domyślam się, że tryb HiRes jest podpięty pod kanał drukarki (standardowo #3). Czy da się przełączać tryby graficzne przez OPEN# i CLOSE#, tego nie sprawdzałem, ale PRINT #3 na standardowym ekranie 256x192 powinien wyświetlać co drugi znak jeßli jest tak jak myślę.
-
@Abrimaal Nie rozumiem twojego pytania... Ten konkretny ROM jest zmodyfikowany w ten sposób, że cały system pracuje w trybie hi-res i drukuje 80 kolumn w linii przy użyciu 6 pikselowych znaków. Wyświetlanie w tym trybie pracuje przez standardowe kanały #1 i #2.
-
Chciałbym mieć taki rom z przełącznikiem w moim TIMEXie.
-
@Abrimaal Nie rozumiem twojego pytania... Ten konkretny ROM jest zmodyfikowany w ten sposób, że cały system pracuje w trybie hi-res i drukuje 80 kolumn w linii przy użyciu 6 pikselowych znaków. Wyświetlanie w tym trybie pracuje przez standardowe kanały #1 i #2.
Zasugerowałem się programem sprzed wielu lat, który podpinał procedurę pisania w HiRes pod kanał #3. Nie spodziewałem się aż tak zaawansowanej modyfikacji ROM tylko dla samej przyjemności pisania i czytania tekstu :)
Chętnie bym go jeszcze poprawił, aby startował z czarnym lub niebieskim ekranem. Wie ktoś, którą wartość podmienić?
Teraz pojawia się problem z emulatorem FUSE. Nie spodziewałem się, że jeszcze istnieje jakiekolwiek oprogramowanie dla Windows, które swoją konfigurację zapisuje w Users czy innym systemowym folderze.
Specjalnie dla tego ROMu rozpakowałem FUSE (portable) do osobnego folderu, a tu niespodzianka jak za czasów Windows XP. Przestawiam jedną instancję FUSE na Timex 2048, to wszystkie pozostałe też uruchomią się z tymi ustawieniami, dlatego że plik fuse.cfg jest jeden jedyny niepowtarzalny, oczywiście w C:\Users\User
Tragedia.
-
Przestawiam jedną instancję FUSE na Timex 2048, to wszystkie pozostałe też uruchomią się z tymi ustawieniami, dlatego że plik fuse.cfg jest jeden jedyny niepowtarzalny, oczywiście w C:\Users\User
Wiele programów dopuszcza posiadanie ini/cfg w wielu folderach. Spróbuj dla konkretnej instancji fuse przenieść plik cfg do jego katalogu - jest wielce prawdopodobne że pomoże :) .
-
Z tego co widzę w źródłach, jest na sztywno ustawiony na %home%/fuse.cfg
-
Jeśli nie chcesz rekompilować to uratuje cię Sandboxie :)
-
Chętnie bym go jeszcze poprawił, aby startował z czarnym lub niebieskim ekranem. Wie ktoś, którą wartość podmienić?
Startowy tryb graficzny i kolory ustawiane są w procedurze 'START/NEW' (#11CB). Podmieniony kod zaczyna się tak:
11cb ld b,a
11cc ld a,7
11ce out (#fe),a
11d0 ld a,6
11d2 out (#ff),a
I właśnie pod #11D0 ustawiany jest tryb hi-res i kolory ekranu. Zmiana w tym miejscu wartości 6 na inną pozwala na ustawienie innego zestawu kolorów - trzy pierwsze bity wybierają tryb graficzny itp. czyli 6 jest bazą, trzy następne to wybór pary ink/paper. Zmiana z "czarny na białym" na "biały na czarnym" to zmiana pary z 000 na 111 czyli z %00000110 na %00111110 i dzisiętnie z 6 na 62. Żeby więc startował w takim trybie należy pod #11D0 wstawić "ld a,62" (czyli podmienić 6 na 62 po #11D1).
Dodatkowo sysemowe atrybuty ekranu ustawiane są w standardowym miejscu - pod #1265:
1265 ld a,#38
1267 ld (#5C8D),a
126A ld (#5C8F),a
126D ld (#5C48),a
W tym wypadku #38 to standardowy czarny na białym. O ile pierwsze dwie zmienne nie powinny mieć znaczenia o tyle trzecia (BORDCR) używana jest w zmienionych procedurach do zmiany Timeksowego koloru. W związku z tym bezpieczniej jest ustawić pod #1266 zamiast #38 #07 - to nam daje pewność, że startowe kolory będą używane przez mechanizmy zarówno te standardowe jak i te zmodyfikowane do obsługi hi-res'u.
-
Spróbuję z plików .bat, zapiszę konfiguracje po kolei dla wybranych maszyn, przeniosę do roboczego folderu zmieniając nazwy też po kolei na zx128, tc2048 itd. Później z command line
del c:\users\user\fuse.cfg
copy d:\emu\zx128.cfg c:\users\user\
ren c:\users\users\zx128.cfg fuse.cfg
D:\emu\fuse132\fuse.exe
Chyba że w instrukcji Copy można od razu nadać docelową nazwę bez użycia Ren. Ścieżka do Fuse przykładowa.
W Fuse jest jakiś profiler, ale nie orientuję się co on robi, coś rejestruje, bo jest start/stop.
-
Można.
help copy (lub copy /?) podpowie Ci, żewystarczy
copy /y ściazka\zx128.cfg ściazka2\fuse.cfg