Autor Wątek: Tricki na Amstradzie  (Przeczytany 77261 razy)

ZbyniuR

  • *****
  • Wiadomości: 3333
  • Miejsce pobytu:
    Carlisle w UK
  • CPC AGA PSX
Odp: Tricki na Amstradzie
« Odpowiedź #90 dnia: 2021.03.10, 14:08:31 »
Wspomniałeś wcześniej że przechowywanie kodu 128 jest kłopotliwe przez to że wygląda jak spacja.

W rzeczywistości kłopotliwe jest nie jego przechowywanie w REM, tylko jego wstawienie tam za pomocą kursora kopiującego, który rozpoznaje ten znak jako spację, i to ją wstawia.
Ale zmieniając wygląd znaku tak jak pokazałem zacznie sie różnić jednym pikselem od spacji i teraz kursor kopiujący prawidłowo go rozpozna i skopiuje kod 128 zamiast spację. :)
- Jeśli masz w domu światło i wodę, tzn. że masz światłowód. ;)

McArti0

  • ***
  • Wiadomości: 113
Odp: Tricki na Amstradzie
« Odpowiedź #91 dnia: 2021.03.23, 22:42:10 »
Procedura do 5 pasków. ostatni nr 1 to 25 linia.

Można sobie ustawiać mode dla 5 pasków, kolory Pen 0,Pen 1, i ramki border. Kolory mają numery Hardwarowe. https://www.cpcwiki.eu/index.php/CPC_Palette

Opis w remach basica.

Program w basicu pokazuje jak poke'ami ustawić np 27 kolorów na ekranie.
Kod maszynowy kopiowany z rem do &9000 procedurą z rema &260.

Ze względu na to, że procedura przerwania jest nie widoczna i zaskakująca dla systemu. To można
podłączać inne programy z obsługą przerwań. Powinno działać i dawać zaskakujące efekty :)

Pominąłem bajty &80 w kodzie. Zakładam, że trik z Symbolem który proponuje ZbyniuR dla kodu &80 byłby dla milionów użytkowników Amstradów w Polsce  :D mylący. Trik zadziałałby dopiero po wykonaniu linijki kodu, a mógłby być kopiowany z listingu przed wykonaniem kodu i już by nie działał. Dziesiątki tysięcy sfrustrowanych użytkowników. Tak nie można. ;)

;orginalna procedura CPC od #B941
;di
;EX AF,AF'
;JR C,#B978
;--^-- czesc nadpisana
;B945:
;EXX
;...

;zmiana startu procedury przerwania
;org #B941
;DI
;JP int ;#9010

org #9000

set_:
di
ld HL,#B942

ld (HL),#C3 ;kod JP
inc hl
ld (hl),#10 ;kod adres L
inc hl
ld (hl),#90 ;kod adres H
ei
ret

db #AF
db #AF

org #9010
;nowa procedura przerwania
int:
push bc
push AF

push hl
push de

ld hl,pasek 
ld C,(HL)    ;nr paska (od gory 6,5,4,3,2,1)
ld a,c
cp 6
jp nz,nvst

ld b,#f5
in a,(c) ;sprwdzenie czy pasek 6 jest w czasie synchronizacji pionowej
rra
jp c,vs

jp koniec

vs:

nvst:

;----------------

sla c
sla c
ld HL,dane
ld b,#ff
inc b
add HL,bc

ld a,(HL)

ld d,a ;color0

inc hl

ld a,(HL)

ld e,a ;color1

inc hl

ld a,(HL)

ld (color),a ;color_border

inc hl

ld a,(HL)

ld (tryb),a ;tryb

; ---------------------
ld hl,pasek
ld c,(hl)
dec c
jr nz,omin
ld c,6
omin:
ld (HL),c

ld b,#4  ; 7+  taka zaszlosc.
delay:
ld b,#1  ; 7+
loop:
djnz loop  ;+13xb+8 takty zamiast 18xNOP=72takty

;---------------- szybkie wlanczenie trybu tylko na jedna linie

ld bc,#7fff
inc c
ld a,(tryb)
or #8C
ld h,a
out (c),a

;---------------------------------
;ld bc,#7f00 ;pen 0
ld a,d

out (c), c
out (c), a

inc c    ;pen 1

ld a,e

out (c), c
out (c), a

ld c,#10    ;border
ld a,(color)

out (c), c
out (c), a

;---------------- wolne ale trwale wlonczenie trybu
ld a,h
and #3
call #BD1C
;--------------------------------------------------

koniec:
;ld a,#54

;ld bc, &7f10
;out (c), c
;out (c), a
pop de
pop hl
pop AF
pop bc

;odtworzenie funkcjonalnosci czesci nadpisanej procedury oryginalnej.
EX AF,AF'
JP C,#B978
JP #B945

;orginalna procedura CPC od #B941
;di
;EX AF,AF'
;JR C,#B978
;--^-- czesc nadpisana
;B945:
;EXX
;...

color:
db #78
tryb:
db #2
pasek:
db #1  ;nr paska+1 (od gory 6,5,4,3,2,1)

dane:
db #FF  ;pasek nr 0 nie istniejacy.
db #ff
db #FF
db #ff

color1t:  ;tło pen 0
db #54
color1p:  ;pen 1
db #53
color1b:   ;ramka  border
db #52
tryb1:
db #82

color2t:
db #4F
color2p:
db #4E
color2b:
db #4D
tryb2:
db #8c    ; MODE 0  - wartość wpisana tylko poto żeby nie było 0 w rem albo &80.

color3t:
db #4c
color3p:
db #4b
color3b:
db #4a
tryb3:
db #82

color4t:
db #47
color4p:
db #46
color4b:
db #45
tryb4:
db #82

color5t:
db #44
color5p:
db #43
color5b:
db #42
tryb5:
db #82

color6t:
db #42
color6p:
db #41
color6b:
db #40
tryb6:
db #81


McArti0

  • ***
  • Wiadomości: 113
Odp: Tricki na Amstradzie
« Odpowiedź #92 dnia: 2021.07.23, 22:01:48 »
Tapeta na Amstradzie. Ekran główny pod adresem &c000 przełączany w przerwaniach 1/50 sek z ekranem w &4000.

Skorzystałem z licznika scrolla pod adresem &b72d

Tapeta nie jest scrollowana a ekran główny jest.

wrzuciłem na Youtuba filmik z efektem zobaczymy czy opublikują go w 60Hz
https://youtu.be/A0s2uqhhmoc .....narazie nie działa. klatki z tapetą nie widać.

Dorzucam 1sek spakowany zipem film jakby ktoś chciał zobaczyć.

Zrzut ekranu z JavaCPC przy włączonym DeInterleaced

I gif który ma migać 60Hz

Zalączam snapa.
na 60Hz monitorze najlepiej widać co się dzieje w Caprice32 ustawianym na custom turbo 121% i włączonym Turbo.

jestem zaskoczony, że na CRTC 0 nie można ustawić koloru dla INK 3 , w WinAPE działa dopiero na CRTC 2 , a w Caprice na CRTC 1.

Kod procedury asemblerowej wygląda tak.

;orginalna procedura CPC od #B941
;di
;EX AF,AF'
;JR C,#B978
;--^-- czesc nadpisana
;B945:
;EXX
;...

;zmiana startu procedury przerwania
;org #B941
;DI
;JP int ;#9010

org #9000

set_:
di
ld HL,#B942

ld (HL),#C3 ;kod JP
inc hl
ld (hl),#10 ;kod adres L
inc hl
ld (hl),#90 ;kod adres H
ei
ret

db #AF
db #AF

org #9010
;nowa procedura przerwania 300Hz
int:
push bc
push AF

push hl
push de

ld hl,pasek 
ld C,(HL)    ;nr paska (od gory 6,5,4,3,2,1)
ld a,c
cp 6
jp nz,nvst

ld b,#f5
in a,(c) ;sprwdzenie czy pasek 6 jest w czasie synchronizacji pionowej
rra
jp c,vs

jp koniec

vs:

push bc

xor a
ld b,a
ld h,a
ld A,(#b72D) ;firmwarowy licznik scrolla
neg
ld l,a
sla l
rl h
sla l
rl h
sla l
rl h
ld c,l ;Ax8
ld b,h
sla l
rl h
sla l
rl h   ;Ax32

add hl,bc  ;A*(32+8)
ld a,#03
and h
ld h,a     ;wyliczony w HL offset scrolla 0-1023

ld bc,#bc00
ld a,12
out (c),a ; bc00,12

tu:
jr first
first:
ld a,tam-first
ld (tu+1),A
ld A,#10
ld l,0
;or h
jr tim
tam:
xor a
ld (tu+1),A
ld A,#30
or h
tim:
inc b

out (c),a ;bd00,(12)<- #10, #30 + $offset H  <-#10 - &4000,  #30 - &C000

dec b

ld a,13
out (c),a ;bc00,13

inc b
ld a,l
out (c),l ;bd00,(13)<- $offset L
pop bc

nvst:

;----------------

po_pasku_nr6:
sla c
sla c
ld HL,dane
ld b,#ff
inc b
add HL,bc

ld a,(HL)

ld d,a ;color0

inc hl

ld a,(HL)

ld e,a ;color1

inc hl

ld a,(HL)

ld (color),a ;color_border

inc hl

ld a,(HL)

ld (tryb),a ;tryb

; ---------------------
ld hl,pasek
ld c,(hl)
dec c
jr nz,omin
ld c,6
omin:
ld (HL),c

delay:
ld b,#1 
loop:
djnz loop

;---------------- szybkie wlanczenie trybu tylko na jedna linie

ld bc,#7fff
inc c
;ld a,(tryb)
or #8C
ld h,a
out (c),a

;---------------------------------

ld a,d

out (c), c
out (c), a

inc c    ;pen 1

ld a,e

out (c), c
out (c), a

ld c,#10    ;border
ld a,(color)

out (c), c
out (c), a

;---------------- wolne ale trwale wlonczenie trybu
ld a,h
and #3
call #BD1C
;--------------------------------------------------

koniec:

pop de
pop hl
pop AF
pop bc

;odtworzenie funkcjonalnosci czesci nadpisanej procedury oryginalnej.
EX AF,AF'
JP C,#B978
JP #B945

;orginalna procedura CPC od #B941
;di
;EX AF,AF'
;JR C,#B978
;--^-- czesc nadpisana
;B945:
;EXX
;...

color:
db #78
tryb:
db #2
pasek:
db #1  ;nr paska (od gory 6,5,4,3,2,1)

dane:
db #FF  ;pasek nr 0 nie istniejacy.
db #ff
db #FF
db #ff

color1t:
db #47   ;&90D9
color1p:
db #43   ;&90DA
color1b:
db #52   ;&90DB
tryb1:
db #81   ;&90DC

color2t:
db #47   ;&90DD
color2p:
db #43   ;&90DE
color2b:
db #4D   ;&90DF
tryb2:
db #81   ;&90E0

color3t:
db #47   ;&90E1
color3p:
db #43
color3b:
db #4a
tryb3:
db #81

color4t:
db #47   ;&90E5
color4p:
db #43
color4b:
db #45
tryb4:
db #81

color5t:
db #47   ;&90E9
color5p:
db #43
color5b:
db #42
tryb5:
db #81

color6t:
db #47   ;&90ED
color6p:
db #43
color6b:
db #40
tryb6:
db #81   ;&90F0


ZbyniuR

  • *****
  • Wiadomości: 3333
  • Miejsce pobytu:
    Carlisle w UK
  • CPC AGA PSX
Odp: Tricki na Amstradzie
« Odpowiedź #93 dnia: 2021.07.24, 00:41:07 »
Teraz dopiero załapałem co ty próbowałeś zrobić. Jest poprawa bo tapetka sie nie skroluje mimo scrola na ekranie głównym. Ale mam poważne wątpliwości co to estetyki tej pstrokacizny.

Mi kiedyś chodziło po głowie co zrobić aby po każdym resecie zamiast tego nudnego tekstu witał jakiś pocieszny obrazek, (nie szkodzi że zniknie przy pisaniu na nim lub przewinięciu ekranu), do tego kilka użytecznych funkcji przypisanych do paru klawiszy i podpowiedź co wcisnąć by coś ruszyć, ot tak dla zielonych. Taki obrazek by sie pewnie kopiował z ekstra 16KB ROMu ze 2 sek. Ale utknąłem na rozgryzieniu jak ROM po resecie definiuje klawisze funkcyjne. Sam jestem na to za głupi, a na pytania o pomoc nie było odpowiedzi ani tu ani na cpcwiki.

Co ty masz za wersję Caprice że ma Turbo i możliwość ustawiania prędkości z dokładnością do 1%, mój ma co 25%, i obsługuje tyko CRTC1.
- Jeśli masz w domu światło i wodę, tzn. że masz światłowód. ;)

McArti0

  • ***
  • Wiadomości: 113
Odp: Tricki na Amstradzie
« Odpowiedź #94 dnia: 2021.07.24, 08:03:58 »
Ale mam poważne wątpliwości co to estetyki tej pstrokacizny.
O gustach sie nie dyskutuje  ;D :P :o.
To jest zajawka techniczna nie artystyczna. A poważnie to paski zostały z poprzedniej wersji. Można je sobie poustawiać. Na końcu kodu asemblera są adresy dla hardwarowych kolorów tła, pisaka 0, bordera i modów kolejnych pasków. Cztery bajty dla każdego paska poczynając od &90D9. Niestety nie każde kolory się dobrze mieszają. Wybrałem takie, które nie zmieniają tego żółtego za bardzo i nie migają za mocno.

Mi kiedyś chodziło po głowie co zrobić aby po każdym resecie zamiast tego nudnego tekstu witał jakiś pocieszny obrazek
Mi przychodzi do głowy napisać to w basicu i umieścić kawałek pamięci z programem w odpowiednim miejscu i uruchomić nawet ręcznie ładując bufor klawiatury. procedure odpalić gdzieś z romu dodtkowego.

Co ty masz za wersję Caprice że ma Turbo i możliwość ustawiania prędkości z dokładnością do 1%, mój ma co 25%, i obsługuje tyko CRTC1.

Caprice32 ver 21.4

ZbyniuR

  • *****
  • Wiadomości: 3333
  • Miejsce pobytu:
    Carlisle w UK
  • CPC AGA PSX
Odp: Tricki na Amstradzie
« Odpowiedź #95 dnia: 2021.07.24, 13:41:22 »
Nie wiedziałem że Caprice32 zmienił nazwę na Caprice Forever, instalkę znalazłem, potem sie pobawię bo niedługo idę do roboty.

Ja w ROMie CPC umiem tylko zmienić wygląd znaków, mapę klawiatury i napis powitalny. Wiem gdzie i w jakiej postaci trzyma definicje klawiszy funkcyjnych w RAM, ale w ROMie ma to zupełnie inną postać, wygląda to raczej na procedurę która modyfikuje kolejne klawisze.

Pisałem o tym tu:
https://www.speccy.pl/forum/index.php?topic=2392.msg32369#msg32369

PS.: Większość rozmów jakie ludzie prowadzą dotyczą ich gustów. :P

- Jeśli masz w domu światło i wodę, tzn. że masz światłowód. ;)

McArti0

  • ***
  • Wiadomości: 113
Odp: Tricki na Amstradzie
« Odpowiedź #96 dnia: 2021.07.31, 17:03:03 »
Miks mode 2 i mode 0 i podprowadzony bomb jack


ZbyniuR

  • *****
  • Wiadomości: 3333
  • Miejsce pobytu:
    Carlisle w UK
  • CPC AGA PSX
Odp: Tricki na Amstradzie
« Odpowiedź #97 dnia: 2021.09.09, 16:18:52 »
Nowa wersja  Hello World.   1 linia czystego Basica. :)

10 MODE 0:BORDER 0:l=1:s=1:FOR i=0 TO 15:INK i,ASC(MID$("@YXOFCDHQTKBAIRV",i+1,1))-64:NEXT:WHILE-1:FOR p=1 TO 15 STEP 0.5:PEN p:LOCATE VAL(MID$("112345678998765432",s+1,1)),1:s=(s+1)MOD 18:PRINT"Hello World!":LOCATE 1,1:PRINT CHR$(11):NEXT:WEND

- Jeśli masz w domu światło i wodę, tzn. że masz światłowód. ;)

m0b

  • *****
  • Wiadomości: 805
  • Miejsce pobytu:
    Warszawa
Odp: Tricki na Amstradzie
« Odpowiedź #98 dnia: 2021.09.09, 16:47:27 »
Niezoptymalizowany! Zmienna l nigdzie nie używana ;)

ZbyniuR

  • *****
  • Wiadomości: 3333
  • Miejsce pobytu:
    Carlisle w UK
  • CPC AGA PSX
Odp: Tricki na Amstradzie
« Odpowiedź #99 dnia: 2021.09.10, 01:39:47 »
Faktycznie po zmianie koncepcji przestała być potrzebna. :)

Wypraszam sobie brak optymalizacji, wiesz ile przy tym siedziałem?

Podaj przykład jak to przyspieszyć albo skrócić.
np można by   DEFINT i,s   dopisać, i tak było zanim uznałem że zmieszczę się w jednej linii, a "fala" miała wtedy dłuższy ciąg cyferek i sie nie mieściło. :)
- Jeśli masz w domu światło i wodę, tzn. że masz światłowód. ;)

ZbyniuR

  • *****
  • Wiadomości: 3333
  • Miejsce pobytu:
    Carlisle w UK
  • CPC AGA PSX
Odp: Tricki na Amstradzie
« Odpowiedź #100 dnia: 2021.09.10, 04:07:04 »
Tak właściwie to jeśli zmienną s będziemy modyfikować przed Locate a nie po, to jej definiowanie na początku jako 1 też jest zbędne. I jeszcze drugie Locate można by kodem zapisać, przez co drugi Print nie jest potrzebny. I teraz listing w MODE 2 nie przekracza 3ech linijek, więc spokojnie można by dodać to DEFINT by ciut przyspieszyć. :)

10 MODE 0:BORDER 0:FOR i=0 TO 15:INK i,ASC(MID$("@YXOFCDHQTKBAIRV",i+1,1))-64:NEXT:WHILE-1:FOR p=1 TO 15 STEP 0.5:PEN p:s=(s+1)MOD 18:LOCATE VAL(MID$("112345678998765432",s+1,1)),1:PRINT"Hello World!"CHR$(30)CHR$(11):NEXT:WEND

« Ostatnia zmiana: 2021.09.10, 04:21:07 wysłana przez ZbyniuR »
- Jeśli masz w domu światło i wodę, tzn. że masz światłowód. ;)

McArti0

  • ***
  • Wiadomości: 113
Odp: Tricki na Amstradzie
« Odpowiedź #101 dnia: 2021.09.11, 19:30:54 »
WHILE-1 ???

ZbyniuR

  • *****
  • Wiadomości: 3333
  • Miejsce pobytu:
    Carlisle w UK
  • CPC AGA PSX
Odp: Tricki na Amstradzie
« Odpowiedź #102 dnia: 2021.09.12, 17:40:49 »
Normalnie przy While podaje sie warunek dopóki pętla ma sie wykonywać, ale jak chcemy by sie po prostu wykonywała bez końca to zamiast równania można podać dowolną (chyba) liczbę, a zwyczajowo podaje się -1, minus po to aby tam nawet spacji między While a liczbą nie było.
- Jeśli masz w domu światło i wodę, tzn. że masz światłowód. ;)

trojacek

  • *****
  • Wiadomości: 6841
  • Miejsce pobytu:
    Warszawa
Odp: Tricki na Amstradzie
« Odpowiedź #103 dnia: 2021.09.13, 10:28:37 »
zamiast równania można podać dowolną (chyba) liczbę, a zwyczajowo podaje się -1, minus po to aby tam nawet spacji między While a liczbą nie było.

Nie wiem jak na Amstradzie, ale w implementacjach, które ja znam, liczba musi być różna od zera, bo zero = false. Podejrzewam, że na Amstradzie jest podobnie.

Ale ten minus to nie rozumiem w sumie, po co. "WHILE-1" i "WHILE 1" to tyle samo znaków (jako string), nie podejrzewam, by wewnętrzna reprezentacja integera miała różną długość dla -1 i 1. Przy czym "WHILE 1" jest notacją elegancką, bo przejrzystą (zrozumiałą), a WHILE-1 kompletnie nie. No ale jakby wszystko było oczywiste, to by się ten wątek nie rozwijał ;)
« Ostatnia zmiana: 2021.09.13, 11:01:46 wysłana przez trojacek »

ZbyniuR

  • *****
  • Wiadomości: 3333
  • Miejsce pobytu:
    Carlisle w UK
  • CPC AGA PSX
Odp: Tricki na Amstradzie
« Odpowiedź #104 dnia: 2021.09.13, 16:30:53 »
Przed minusem nie trzeba po While pisać spacji i w pamięci program zajmuje o jeden bajt mniej.  :)

Ziarnko do ziarnka...
- Jeśli masz w domu światło i wodę, tzn. że masz światłowód. ;)