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.