eXec.plMAGAZYN UŻYTKOWNIKÓW KOMPUTERÓW AMIGA
MAGAZYN UŻYTKOWNIKÓW KOMPUTERÓW AMIGA

poniedziałek, 15. sierpnia, 2022, 12:01

Amiga forum / AmigaOS 2.x i starsze / amiga 500 assembler czemu to nie działa????

Czytasz wątek: amiga 500 assembler czemu to nie działa????

68k_tester
Nieaktywny użytkownik starego forum

amiga 500 assembler czemu to nie działa???? wysłany: 2009-04-12 15:07

Czy ktoś potrafi jeszcze napisać coś na Amige (v34) w assemblerze??
Program jest prosty chodzi o ręczne odpalenie osobnego procesu..... ale nie działa czemu?
Co trzeba poprawić???



;-------------------------------------------------------------------------
;Tworzenie procesu pierwsze testy.
;OPIS: Tworzymy recznie nowy proces w systemie i uruchamiamy go oczekując
;na klawisz 'Esc' kończący aktualnie uruchomiony proces....



;Testy: Nie dziala!!!!!!



;CPU: MC 68000
;System: Amiga 500 OS v1.3 Kickstart (v34)
;Assembler: DevPac v3.02 (HiSoft)



Exec: equ 4
OldOpenLibrary: equ -408
CloseLibrary: equ -414
CreateProc: equ -138 ;Tworzy nowy proces w systemie.
Delay: equ -198



;Blok podstawowy umieszczamy w pamieci CHIP_RAM

SECTION Program,CODE_C



Start: move.l Exec.w,a6
lea DosName(pc),a1
jsr OldOpenLibrary(a6)
tst.l d0
beq.s Error_0
move.l d0,DosBase
;-----------------------


;Teraz tworzymy nowy process w pamieci

move.l DosBase,a6
move.l #ProcName,d1 ;Nazwa dla nowego procesu.
move.l #2,d2 ;Priorytet procesu (od -128(Najmniejszy) do +127(Najwiekszy))
lea Action(pc),a0 ;ręczna pozycja
move.l a0,d3 ;Lista segmentow programu zwracana np: przez funkcje LoadSeg()
move.l #4000,d4 ;Rozmiar w bajtach (Stosu) przydzielanego procesowi.Wartosc ta musi byc podzielna przez 4.
jsr CreateProc(a6)
tst.l d0 ;Wskaznik na nowo utworzony (IORequest) lub NULL jesli blad.
beq.s Error_0

Wait_Key: cmp.b #$75,$BFEC01 ;Sprawdzamy czy wcisnieto klawisz 'ESC'
bne.s Wait_Key
bra.s Koniec



DS.L 0
Action: DC.L 16
DC.L 0


;.... tutaj kod wykonywalny procesu ....

Process_Code:

PP_Loop0: move.w #10,d0 ;Odczekujemy okreslony czas.
PP_Loop2: move.w #$1FFF,d1
PP_Loop1: dbf d1,PP_Loop1
dbf d0,PP_Loop2
bchg.b #1,$BFE001 ;Zmieniamy stan diody PowerLED na przeciwny.
bra.s PP_Loop0
Process_End:



Error_0: moveq #-1,d0
rts
Koniec: moveq #0,d0
rts

ProcName: DC.B "-->Nowy<--",0
DosBase: DC.L 0
DosName: DC.B "dos.library",0



Odpowiedz

Grzegorz
Nieaktywny użytkownik starego forum

amiga 500 assembler czemu to nie działa???? wysłany: 2009-04-12 20:19

@68k_tester
ale nie działa czemu?



Prawdopodobnie dlatego, że jako seglistę kodu podajesz adres kodu podprocesu, a to raczej nie zadziała. W autodocu funkcji CreateProc() jest przykład "oszukanej" seglisty jaką można zastosować, gdy kod nie jest ładowany z dysku. Więcej Ci niestety nie pomogę, bo procesami zacząłem się bawić dopiero od kickstartu v39, a tam jest o wiele wygodniejsza CreateNewProc().


Odpowiedz

68k_tester
Nieaktywny użytkownik starego forum

amiga 500 assembler czemu to nie działa???? wysłany: 2009-04-12 21:25

Dobra problem rozwiązany ale dzień zmarnowany...
Parametr podawany w rej.D3 do funkcji CreateProc()
powinien zawierac adres o 8 bajtow wiekszy od poczatku kodu jednak adres ten musi byc podzielny bez reszty przez 4 kiedy uzyskamy juz takie ustawienie to przed zapisem do rej. D3 wartosc adresu dzielimy na 4 i dopiero to stanowi prawidlowy parametr.

Odpowiedz

AmigaOS.pl