No to powoli i jeszcze raz.
org 60000 ; ustawiamy adres, pod którym ma się znaleźć w pamięci kod programu
di ; wyłączamy przerwania, bo one również korzystają ze stosu
ld (buf_SP),SP ; zapamiętujemy aktualne położenie szczytu stosu
ld SP,$5800 ; szczyt stosu ustawiamy na koniec obszaru pamięci ekranu
ld L,0 ; ustawiamy licznik pętli na 0, czyli na 256,
; ponieważ przed pierwszym sprawdzeniem zawartości rejestru L
; zostanie on pomniejszony o 1, więc będzie miał wtedy
; wartość -1 w kodzie U2 co bitowo bez znaku daje dokładnie 255
; i pętla nie zatrzyma się nam zaraz po pierwszym wykonaniu
ld DE,0 ; zerujemy parę rejestrów DE, której zawartość będzie kopiowana do pamięci
ins_loop push DE ; i w pętli wrzucamy po 2 bajty na stos
push DE ; każdy PUSH automatycznie zmniejsza adres licznika
push DE ; stosu o 2, rozmiar pamięci obrazu to 6144 bajty
push DE ; podzielone przez 2, bo wpisujemy po 2 bajty na raz
push DE ; daje 3072, dalej podzielone przez 256, bo tyle
push DE ; można zmieścić w 8-bitowej pętli, daje 12 powtórzeń
push DE ;
push DE ;
push DE ;
push DE ;
push DE ;
push DE ;
dec L ; zmniejszamy licznik pętli, w zależności od zawartości
; rejestru L po tej operacji zostanie ustawiony znacznik Z
; tzn. Z=1, jeśli L=0 lub Z=0, jeśli L<>0
jp NZ,ins_loop ; jeśli Z=0, to kontynuujemy pętlę
end_loop ld SP,(buf_SP) ; odtwarzamy zawartość rejestru SP
ei ; i przywracamy przerwania
ret ; koniec
buf_SP dw 0 ; definicja zmiennej, w której przechowujemy SP