1

Koledzy Atarowcy,

    w książce Jana Ruszczyca "Asembler 6502", wydanie I z 2017 roku, Retronics, na stronie 117 znalazłem zdanie "Jakkolwiek istnieje wygodniejsza metoda stworzenia zbioru polskich znaków w drodze zamiany ROM na RAM pod tymi samymi adresami, to jednak nieraz przydatne mogą być takie przemieszczenia bloków dłuższych niż 256 bajtów".
    Chciałem zapytać, na czym polega metoda z zamianą ROM na RAM pod tymi samymi adresami?
    Będę wdzięczny za odnośnik do jakiegoś artykułu, w którym można o tym przeczytać, przykładowy program albo wyjaśnienie. Z góry dziękuję za pomoc.

tr1x

Post's attachments

Ruszczyc_Asembler6502.jpg 391.86 kb, nikt jeszcze nie pobierał tego pliku. 

Tylko zalogowani mogą pobierać załączniki.
Atari 800XL, 2 x Atari 65XE, Atari 65XE ECI, Atari 520STE, Atari Video Music (C240), Atari Portfolio, Atari 1200XL

2 Ostatnio edytowany przez seban (2019-05-04 20:46:28)

Hej!

W wielkim skrócie... Atari OS-ROM znajduje się normalnie w lokacjach $C000-$CFFF oraz $D800-$FFFF, blok $D000-$D7FF zajmują rejestry sprzętowe oraz parę dodatkowych stron przeznaczonych dla różnych urządzeń. W przypadku Atari istnieje możliwość takiej zmiany konfiguracji MMU aby w obszarze $C000-$CFFF oraz $D800-$FFFF znalazła się pamięć RAM, a OS-ROM zostanie odłączony. Przełączenia dokonuje się za pomocą bitu #0 w PORTB. Jeżeli w tej pamięci RAM umieścisz kopię ROM, i wyłączysz ROM to będzie mógł operować na "kopii systemu operacyjnego" zawartej w RAM... przez co będziesz mógł modyfikować jego zawartość, w tym np. wygląd znaków.

Takie operacje przeprowadzały niektóre programy, szczególnie napisane w BASIC-u, aby zyskać trochę dodatkowej pamięci. Większość programów wymagających większej pamięci po prostu odłączało OS-ROM i korzystało z pamięci RAM, były też takie programy które kopiowały ROM do RAM, oraz wykonywały jego modyfikacje w celu uzyskania pewnych dodatkowych funkcjonalności.

3

seban napisał/a:

Hej!

Dziękuję.

Atari 800XL, 2 x Atari 65XE, Atari 65XE ECI, Atari 520STE, Atari Video Music (C240), Atari Portfolio, Atari 1200XL

4

Nie miałem zbyt dużo czasu, ale udało mi się wyrwać chwilę z dostępnej puli aby przygotować przykład. Przykład składa się z dwóch kawałków, jeden to kod w asemblerze który potem jest wykorzystany w programie w Atari BASIC, kod w asemblerze wygląda tak:

; simple ROM-RAM routine
; 
; done by Seban @ 2019.05.05, Public Domain
;
; this code is relocatable, can be run from any address
; and it's ready for call from Atari Basic USR function

        opt     h-      ; disable any headers

ptr     equ $cb         ; zero page pointer
osrom   equ $c000       ; OS-ROM address
    
        org     $600    ; default adress of code
    
start   pla             ; call from BASIC, so remove one byte from stack (# of parameters)

        ldy #$00        ; set lo-byte of pointer to zero, also zero the Y reg.
        sty ptr+0
        lda >osrom      ; set hi-byte of pointer to OS-ROM location
        sta ptr+1
    
        lda #$01        ; set the bit #0 of portB to ensure that OS-ROM is enabled
        ora $d301
        sta $d301
    
        sei             ; disable IRQ
        inc $d40e       ; disable NMI
    
l0      lda (ptr),y     ; load ROM location into A reg.
        dec $d301       ; disable ROM
        sta (ptr),y     ; store A reg. into RAM under ROM
        inc $d301       ; enable ROM
        iny             ; next byte on page
        bne l0          ; loop until page end
    
        inc ptr+1       ; next page

        lda ptr+1       
        cmp #$d0        ; check if we are at $D000 
        bne l1          ; branch when page is not $D0xx
        lda #$d8        ; ok, we are at $D0xx we must move to $D8xx (skip the I/O area)
        sta ptr+1

l1      ora #$00        ; end of address space?
        bne l0          ; nope, do the loop!

        dec $d301       ; disable ROM
        lsr $d40e       ; enable NMI
        cli             ; enable IRQ
        rts             ; return to BASIC

do kompletu program w Atari BASIC wykorzystujący powyższą procedurę, ten przykład w BASIC, aby był czytelniejszy powyższą procedurę trzyma w liniach DATA, i po załadowaniu jej na 6 stronę, wywołuje ją funkcję X=USR(1536). Ale nic nie stoi na przeszkodzi aby powyższą procedurę umieścić w ciągu znakowym i wywołać ją bezpośrednio za pomocą X=USR(ADR(".....")), ale nie ma co ględzić oto prymitywny przykład w Atari BASIC:

10 GRAPHICS 0
11 ? "WAIT...":GOSUB 100
12 ? "MOVING...":X=USR(1536)
13 ? "ROM MOVED TO RAM."
14 ? :? "PRESS ANY KEY TO RUN EXAMPLE OF USE"
15 OPEN #1,4,0,"K:":GET #1,K:CLOSE #1
16 POKE 752,1:? CHR$(125):POKE 764,255
17 FOR I=0 TO 7:POKE 57344+I,PEEK(53770):NEXT I:IF PEEK(764)=255 THEN 17
18 FOR I=0 TO 7:POKE 57344+I,0:NEXT I
19 POKE 752,0:? CHR$(125);"DONE.":POKE 764,255
99 END 
100 REM - ROM-RAM MACHINE CODE DATA -
101 DATA 104,160,0,132,203,169,192,133,204,169,1,13,1,211,141,1
102 DATA 211,120,238,14,212,177,203,206,1,211,145,203,238,1,211,200
103 DATA 208,243,230,204,165,204,201,208,208,4,169,216,133,204,9,0
104 DATA 208,227,206,1,211,78,14,212,88,96
105 RESTORE 100:AD=1536:TRAP 107
106 READ B:POKE AD,B:AD=AD+1:GOTO 106
107 RETURN 

Program po uruchomieniu przepisuje ROM do RAM a potem w pętli modyfikuje wygląd znaku "space" (zapisuje je losowymi wartościami). Należy zauważyć że zawartość generatora jest modyfikowana w oryginalnym jego miejscu ($E000, 57344). Co pokazuje że operujemy już na pamięci RAM dostępnej w tym miejscu po uruchomieniu procedury w kodzie maszynowym.

5

Jeszcze jedno mi się przypomniało... z realnych przykładów programów wykorzystujących przepisanie ROM->RAM oraz dokonanie w ROM modyfikacji w celu uzyskania dodatkowych efektów, można obejrzeć:

Abbuc Intro #20 a także: Abbuc Intro #21

Obie te produkcje podczas ładowania dokonują przepisania ROM->RAM, a następnie dokonują modyfikacji procedur SIO już w przepisanym z ROM obszarze RAM, tak aby możliwe było dalsze ładowanie programu i jednocześnie odtwarzanie muzyki, do kompletu mamy jakiś mini efekt podczas ładowania.

W przypadku uruchamiania pliku XEX z poziomu emulatora, trudno to zobaczyć ponieważ pliki .XEX ładują się pod emu błyskawicznie. Aby to zobaczyć trzeba by załadować to na prawdziwym Atari ze stacji dyskietek, albo jakiegoś interface obsługującego SIO, np. SIO2PC. Może też próbować uzyskać efekt powolnego ładowania na emulatorze, nagrywając te dwa pliki na dyskietkę z loaderem (np. chaos loaderem) a następnie wyłączyć wszystkie "przyspieszacze ładowania" w emulatorze.

Taki plik ATR do pobrania tutaj: ABBUC Intros #20 & #21

6

seban napisał/a:

W przypadku uruchamiania pliku XEX z poziomu emulatora, trudno to zobaczyć ponieważ pliki .XEX ładują się pod emu błyskawicznie.

Albo wyłączyć SIO Patch, o ile się nie mylę...

Sikor umarł...

7

wyłączenie "SIO patch" pomoże tylko wtedy gdy ładujesz to np. z załączonego wyżej pliku ATR (dlatego pozwoliłem sobie go dołączyć), jeżeli wrzucisz (drag&drop, boot image, etc.) plik .XEX do emulatora zostanie on załadowany błyskawicznie, niezależenie od stanu "SIO Patach", przynajmniej u mnie się to tak zachowuje pod Altirra.

Przepisanie ma też miejsce w zinie Syzygy. Potem zmieniany jest tylko 1 bajt i to umożliwia odgrywanie muzyki podczas dalszego wczytywania (także w turbo!).

9 Ostatnio edytowany przez seban (2019-05-08 11:57:39)

o nie wiedziałem :) dzięki za info! :) które wydanie? #4? jeżeli o to wydanie chodzi to pod emu mam z nim jakiś problem, ale sprawdzę na prawdziwym sprzęcie później :]

10

Kurcze, człowiek jest lata dumny, że zrobił najszybsze trackmo na Atari, a tu nikt o tym nie wie ;)

11 Ostatnio edytowany przez seban (2019-05-08 12:35:19)

to no nie tak że "nikt"... ja jestem bardzo mało reprezentatywną "grupą" reprezentującą to zjawisko :) zapewne jestem jakimś wyjątkiem :P wiesz mogłem siedzieć wtedy długo pod kamieniem... albo "wyginałem" jak dinozaury ;-)

12

co konkretnie tak wyginałeś? ;]

przechodze na tumiwisizm

13 Ostatnio edytowany przez seban (2019-05-08 15:36:24)

https://img8.dmty.pl//uploads/201706/1497982364_5njkgm_600.jpg

no jak to co? siebie... ;-)