1

Mam taki oto kod przerwania używanego na kolory (do gry z Wapniaka, ostatecznej wersji):

14999 PROC PRZERWANIE
15000   RESTORE 20000:DL=DPEEK(560)
15001   READ P$:IF P$="--" THEN 15003
15002   POKE ADDR,DEC(P$):ADDR=ADDR+1:GOTO 15001
15003   DPOKE $0200,$9C00:POKE $D40E,$C0
15004   POKE DL+190,PEEK(DL+190)+$80
15005 ENDPROC 
20000 DATA 48
20001 DATA 8A
20002 DATA 48
20003 DATA A9
20004 DATA FF:.ZMIANA KOLORU
20005 DATA A2
20006 DATA 00:.ZMIANA KOLORU
20007 DATA 8D
20008 DATA 0A
20009 DATA D4
20010 DATA 8D
20011 DATA 17:.KOLOR
20012 DATA D0
20013 DATA 8E
20014 DATA 18
20015 DATA D0:. KOLOR
20016 DATA 68
20017 DATA AA
20018 DATA 68
20019 DATA 40
20020 DATA --

I mam z nim problem. Wszystko idealnie działa pod Turbo Basiciem, niezależnie od adresu przerwania (sprawdzałem zarówno szóstą stronę, jak i $9c00), a po kompilacji (udanej) kicha i wywala grę. Potrzebuję opcji przerwania, aby były dobrze widoczne teksty. Może macie jakieś pomysły lub procedurę na zmianę dwu rejestrów koloru, taką, aby działała po kompilacji i była zrozumiała dla laika w asemblerze, jakim jestem? Zależy mi na wypuszczeniu pełnej wersji, a nie lubię dawać niekompilowanego kodu.

Sikor umarł...

2

Twój kod przerwania jest OK

 PHA
 TXA
 PHA
 LDA #$FF
 LDX #$00
 STA WSYNC
 STA COLPF1
 STX COLPF2
 PLA
 TAX
 PLA
 RTI

sprawdziłeś pod debuggerem jak wygląda ten program po kompilacji w pamięci Atari ?

może sposób wywołania zawodzi? ustawiasz wektor $0200 dla DLI? modyfikujesz DisplayList i wstawiasz tam rozkaz DLI? na samym końcu ustawiasz NMIEN na $C0?

może szybkość ma tutaj znaczenie i zła kolejność, przed modyfikacją wektora $0200 trzeba odczekać do początku ramki, tak aby zmiany jakie są wprowadzane nie zostały przerwane wywołaniem kolejnego przerwania

chyba że korzystamy z OS i on nam zmienia te wektory wprowadzając odpowiednią synchronizację

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

3

TeBe ma rację, sama procedura jest poprawna. Aczkolwiek mogłaby być krótsza (wystarczy użyć samego akumulatora).
Podejrzane są natomiast:

  • brak inicjalizacji zmiennej ADDR

  • komentarze w DATA. Atari BASIC ich nie obsługuje (stawiam że TBXL też) - DATA przyjmuje wszystko do końca linii, więc READ to odczyta i być może skompilowany DEC ma z tym problem

https://www.youtube.com/watch?v=jofNR_WkoCE

4 Ostatnio edytowany przez xxl (2018-07-05 07:48:07)

- ja bym wyeliminowal DEC podajac wartosci dziesietne
a druga sprawa:
- potrafie sobie wyobrazic ze przed uruchomieniem Twojego skompilowanego programu NMIEN mialo juz ustawione zezwolenie na DLI...

Fox mowil chyba o:

PHA
LDA #$FF
STA WSYNC
STA COLPF1
LDA #$00
STA COLPF2
PLA
RTI

http://atari.pl/hsc/ad.php?i=1.

5

Może być kwestia DEC właśnie. ADDR jest ustawiony na początku programu, bez kompilacji wszystko działa o.k.  Dopiero jaja robią się po kompilacji.
O.K. Na początek spróbuję zgrać sobie przerwanie do pliku i uruchomię wtedy bezpośrednio lub zmienię wartości na dec od razu. Dziwne właśnie było to, że do czasu kompilacji wszystko działa o.k.
Dzięki za pomoc.
@Fox: dwukropek oznacza koniec linii, pod samym TB działa ok, ale to też sprawdzę
@Xxl, @Fox: czy ta procka jest ok, co wskazał Xxl? Rozumiem, że jeszcze org wstawić i ewentualnie można wywołać przez x=usr?

Sikor umarł...

6

Czy $9C00 nie jest zajęte przez skompilowany program?
Xxl: tak, chodziło mi o taką prockę.
Sikor: gdzie chcesz wstawić org? Nie wołaj przez USR, to procedura przerwania a nie do wołania z BASICa.

https://www.youtube.com/watch?v=jofNR_WkoCE

7 Ostatnio edytowany przez tebe (2018-07-05 11:04:01)

Sikor -> http://tajemnice.atari8.info/7_91/7_91_mapa.html

jako miłośnik Turbo Basica mogłeś pomijać tą lekturę ;)

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

8

@fox: zarówno $9c00, jak i $600 działa bezproblemowo po skompilowaniu. Zazwyczaj tak wysoko fonty trzymam, ale tu już kombinowałem
@Tebe: nie pomijałem
O.K. Teraz wiem coś więcej - dzięki chłopaki. Na początek spróbuję obyć się bez dec, bo to najprawdopodobniej leci w kosmos przy kompilacji. Potem popróbuję z wersją na sam akumulator ;)

Sikor umarł...

9

Sikor napisał/a:

@Fox: dwukropek oznacza koniec linii, pod samym TB działa ok, ale to też sprawdzę

Nie w REM ani DATA. Zresztą widzisz, że w listingu kropka nie rozwija się do REM.

10 DIM A$(30)
20 READ A$:PRINT A$
30 DATA FF:.GREETZY DLA SIKORA
RUN
FF:.GREETZY DLA SIKORA
https://www.youtube.com/watch?v=jofNR_WkoCE

10

Prockę z pierwszego posta sam kiedyś skleciłem (dzięki za aplauz ;) ) na podstawie podobnej, wyciętej z którejś z gier KE-SOFTa, z pewnym wsparciem kursu ASM na AA.

Specjalnie jest napisana w ten sposób, aby dopasować ją do swoich potrzeb, potem zgrać z pamięci i użyć już w swojej produkcji. A co to działania DEC po kompilacji - jest jakiś feler. Zapomniałem o tym wspomnieć przed wysłaniem powyższej procki do Sikora. Tyle! :)

I Ty zostaniesz big endianem...

11

Runtime2 prawdopodobnie rozwiąże problem z DEC. Sikor, podesłać?

Kontakt: pin@usdk.pl

12

@Pin, używam Runtime2 właśnie ;)

Sikor umarł...

13

Jeśli problemem jest DEC to da się go rozwiązać w pamięci w minutę czy dwie. Zresztą pewnie z 10 różnych innych rozwiązań daloby się wymyślić.

"tatusiu zobacz, narysowałam tobie takie same coś jak na twojej koszulce" 
https://github.com/willyvmm/mouSTer
jmp $e477

14

A co się dzieje, gdy wyrzucasz REM z DATA?

15

@willy, właśnie tak zrobię
@VAsko: to samo, pod TB działa, po kompilacji kicha

Sikor umarł...