[#1] Blitzbasic + assembler
Jest sobie program uae-configuration.
Są do niego dostępne źródła w C i assemblerze.
https://github.com/keirf/e-uae/tree/master/amiga/source

Z tego co się doszukałem, nie da się tego programu przepisać na blitzbasic. Nie ma on takim możliwości jak C.
Pozostaje więc umieszczenie kodu assemblera w kodzie programu blitzbasic.
Uae-configuration można używać z parametrem a wynikiem działania jest plik tekstowy.
Czy taka samą funkcjonalność da się osiągnąć łącząc blitzbasic i assembler?

Nigdy nie robiłem takich rzeczy więc piszę na forum.
Znajdzie się ktoś kto nakieruje mnie jak to wszystko ogarnąć lub napisze czy taka duet jest mozliwy

Jest to początek pracy nad programem, który byłby odpowiednikiem skryptu Winuae_mounter naszego kolegi Ponki.
Nie będzie "wodotrysków" ale działanie ma być porównywalne. (taki jest plan) szeroki uśmiech

A dlaczego Blitzbasic? W moim przypadku to jedyny wybór. szeroki uśmiech
[#2] Re: Blitzbasic + assembler

@Norbert, post #1

W Blitzu może spokojnie osadzać kod ASM, ale są pewne ograniczenia o których trzeba pamiętać.
Po pierwsze kod w asm możesz normalnie w dowolnym momencie wpisać w kodzie Blitza w zasadzie nie trzeba nawet żadnych klauzul robić. Piszesz w Blitzu i nagle wklejasz sobie kod w asm.

Natomiast... niektóre rozkazy asm w Blitzu mają nieco inne nazwy/składnie (mnemoniki) niż standard motoroli.
Przekonałem się kilkukrotnie, że gotowe programy wklejone w Blitz po prostu się nie kompilowały.
rozwiązania są dwa:
- możesz poprawiać taki kod, te instrukcje asm przy których kompilator Blitza pokazuje błąd kompilacji. nie jest tego dużo i czasami to tylko jedna dwie instrukcje np pętli DBRA, ale trzeba znać instrukcje assemblera
- albo możesz skompilować (zasemblować) kod który masz w asm jakimś zewnętrznym assemblerem do pliku binarnego i osadzić taki plik binarny instrukcją INCBIN np na końcu programu Blitzowego. Potem możesz do takiego kodu po prostu skakać instrukcją assemblera JSR. Tak w jednym swoim małym demku zrobiłem depakowanie grafiki. Depaker miałem w asm skompilowałem go sobie asm-one'em i osadziłem w Blitzu.

Jakie funckje potrzebuje ten program w C że nie ma ich w Blitzu?
[#3] Re: Blitzbasic + assembler

@c64portal, post #2

Według tego co udało mi się dokopać to :

UaeConf = (void *) 0xf0ff60;


Ustawia wskaźnik na stały adres w pamięci emulatora
Pod tym adresem WinUAE udostępnia funkcję konfiguracyjną (nieoficjalne API emulatora).

Nie da się tego osiągnąć pod blitzbasic.
Chyba że się da, a ja nie wiem (internety nie wiedzą)

Najlepiej jakby się dało całość przepisać z C na Blitzbasic o takiej samej funkcjonalności.
[#4] Re: Blitzbasic + assembler

@Norbert, post #3

Wg mnie da się przepisać, czy to w c, czy to w asm.
Oba robią chyba to samo, aczkolwiek się nieco różnią.
Użyty kod w asm jest spakowany razem z emulatorem w amiga programs/sources.zip.
UaeConf.l = $f0ff6
[#5] Re: Blitzbasic + assembler

@c64portal, post #2

To co proponujesz jest na pewno proste dla kogoś kto zna się na assemblerze.
Miałbyś czas aby przyjrzeć się temu przypadkowi ?
Źródła są tutaj
[#6] Re: Blitzbasic + assembler

@Norbert, post #5

Tak by to wyglądało
Function.l uaec{par1,par2}
  MOVE.l d0,a0
  MOVE.l d1,d0
  MOVEM.l a4-a6,-(a7)


  MOVE.l a0,a3
  MOVE.l d0,d3
  SUB.l a4,a4
  MOVEQ #20,d7

  LEA $f0ff60,a5
  TST.l (a5)
  BEQ.b xEnd

  MOVE.l 4,a6
  LEA dos(pc),a1
  MOVEQ #0,d0
  JSR -$228(a6) ;OpenLibrary
  TST.l d0
  BEQ.b xEnd
  MOVE.l d0,a4
  MOVE.l a4,a6

  MOVEQ #-1,d6

loop
  LEA outbuf,a2
  MOVE.l #1000,-(a7) ;out len
  MOVE.l a2,-(a7) ;out
  CLR.b (a2)
  MOVE.l d3,-(a7) ;param len
  MOVE.l a3,-(a7) ;param
  MOVE.l d6,-(a7) ;index
  MOVEQ #82,d0
  MOVE.l d0,-(a7)
  JSR (a5)
  LEA 6*4(a7),a7
  MOVE.l d0,d7

  ; do we have output?
  MOVE.l d3,-(a7)
  TST.b (a2)
  BEQ.b noout
  JSR -$003c(a6) ;Output
  MOVE.l d0,d4
  BEQ.b noout
  MOVE.l d4,d1
  MOVE.l a2,d2
  MOVEQ #-1,d3
out1
  ADDQ.l #1,d3
  TST.b (a2)+
  BNE.b out1
  JSR -$0030(a6) ; Write
  MOVE.l d4,d1
  LEA lf(pc),a0
  MOVE.l a0,d2
  MOVEQ #1,d3
  JSR -$0030(a6) ; Write
noout
  MOVE.l (a7)+,d3


  TST.l d7
  BPL.b xEnd
  ; list all -mode
  ADDQ.l #1,d6
  BRA loop
xEnd
  MOVE.l a4,d0
  BEQ.b xEnd2
  MOVE.l d0,a1
  MOVE.l 4,a6
  JSR -$19e(a6) ;CloseLibrary
xEnd2
  MOVE.l d7,d0

  MOVEM.l (a7)+,a4-a6
  AsmExit

dos: Dc.b "dos.library",0
lf:  Dc.b 10

outbuf
  Ds.b 1000

End Function

x=uaec{0,0}
End
2
[#7] Re: Blitzbasic + assembler

@cholok, post #6

Dzięki bardzo.
Program dał sie skompilowac, ale był brak dzialania. Nic sie nie wyswietliło.
Podanie parametrów do dzialania funkcji czyli {filesystem2,11} równiez.
Odwrotne parametry dały wypisanie calej konfiguracji Winuae.
A zależało mi tylko na parametrze FILESYSTEM2.
Chatgpt (szukam pomocy wszędzie) zaproponował taką zmiane.
Function.l uaec{}
  MOVE.l d0,a0
  MOVE.l d1,d0
  MOVEM.l a4-a6,-(a7)


  LEA dom(pc),a3    ; <------------ TU
  MOVE.l #11,d3     ; <-------------TU
  SUB.l a4,a4
  MOVEQ #20,d7

  LEA $f0ff60,a5
  TST.l (a5)
  BEQ.b xEnd

  MOVE.l 4,a6
  LEA dos(pc),a1
  MOVEQ #0,d0
  JSR -$228(a6) ;OpenLibrary
  TST.l d0
  BEQ.b xEnd
  MOVE.l d0,a4
  MOVE.l a4,a6

  MOVEQ #-1,d6

loop
  LEA outbuf,a2
  MOVE.l #1000,-(a7) ;out len
  MOVE.l a2,-(a7) ;out
  CLR.b (a2)
  MOVE.l d3,-(a7) ;param len
  MOVE.l a3,-(a7) ;param
  MOVE.l d6,-(a7) ;index
  MOVEQ #82,d0
  MOVE.l d0,-(a7)
  JSR (a5)
  LEA 6*4(a7),a7
  MOVE.l d0,d7

  ; do we have output?
  MOVE.l d3,-(a7)
  TST.b (a2)
  BEQ.b noout
  JSR -$003c(a6) ;Output
  MOVE.l d0,d4
  BEQ.b noout
  MOVE.l d4,d1
  MOVE.l a2,d2
  MOVEQ #-1,d3
out1
  ADDQ.l #1,d3
  TST.b (a2)+
  BNE.b out1
  JSR -$0030(a6) ; Write
  MOVE.l d4,d1
  LEA lf(pc),a0
  MOVE.l a0,d2
  MOVEQ #1,d3
  JSR -$0030(a6) ; Write
noout
  MOVE.l (a7)+,d3


  TST.l d7
  BPL.b xEnd
  ; list all -mode
  ADDQ.l #1,d6
  BRA loop
xEnd
  MOVE.l a4,d0
  BEQ.b xEnd2
  MOVE.l d0,a1
  MOVE.l 4,a6
  JSR -$19e(a6) ;CloseLibrary
xEnd2
  MOVE.l d7,d0

  MOVEM.l (a7)+,a4-a6
  AsmExit

dos: Dc.b "dos.library",0
lf:  Dc.b 10
dom: Dc.b "filesystem2"   ; <---------- TU
outbuf
  Ds.b 1000

End Function

x=uaec {}

End

Teraz juz wyswietla tylko to co mnie interesuje, ale w oknie CLI
Co nalezało by zrobić zeby wynik nie szedł do CLI ( CLI juz niepotrzebne) a do zmiennej tekstowej którą juz obsłuży BlitzBasic ?
[#8] Re: Blitzbasic + assembler

@Norbert, post #7

U mnie działało. Program bez parametrów wyświetlał całą konfigurację winuae w oknie CLI dokładnie tak samo jak oryginał. Widocznie niepoprawnie przekazałeś argumenty procedurze.
[#9] Re: Blitzbasic + assembler

@cholok, post #8

Argumenty podałem dla testu do uaec {filesystem2,11} jaki i uaec{11,filesystem2}. NIe dostałem poprawnego wyniku.
Ale nie ważne, ta poprawka wyżej dała właściwy wynik.
Jak teraz ten wynik przekazać do zmiennej tekstowej do Blitzbasic, a nie do okna CLI. CLI nie jest potrzebne
[#10] Re: Blitzbasic + assembler

@Norbert, post #9

Jak teraz ten wynik przekazać do zmiennej tekstowej do Blitzbasic, a nie do okna CLI

no to chyba trzeba by jednak napisać własną procedurę bo ta tutaj w asm używa funkcji w kickstarcie do wypisania właśnie w oknie CLI. Na moje oko to do przepisania jest cała ta pętla loop która wywołuje funkcję write. w zasadzie to najważniejsza część tej całej funkcji Blitzowej, więc do napisania w zasadzie masz to od nowa :)

Ostatnia aktualizacja: 09.03.2026 14:26:44 przez c64portal
[wyróżniony] [#11] Re: Blitzbasic + assembler

@Norbert, post #9

Dopicować sobie musisz już samemu.
WBStartup
;NoCli
WbToScreen 0
CloseEd

DEFTYPE.l

Function.l uaec{idx,par,parlen,out}
  MOVE.l a5,-(a7)


  LEA $f0ff60,a5


  MOVE.l #1000,-(a7) ;out len
  MOVE.l d3,-(a7) ;out
  CLR.b (a2)
  MOVE.l d2,-(a7) ;param len
  MOVE.l d1,-(a7) ;param
  MOVE.l d0,-(a7) ;index
  MOVE.l #82,-(a7)
  JSR (a5)
  LEA 6*4(a7),a7


  MOVE.l (a7)+,a5
  AsmExit

End Function

uaebase=$f0ff60

If Peek.l(uaebase)
  idx=-1
  par=0
  parlen=0
  Repeat
    r=uaec{idx,par,parlen,?label}
    a$=Peek$(?label)
    idx+1
    NPrint a$
  Until r>=0
Else
  NPrint "UAE version is too low"
EndIf

r=Edit(1)
End

label:
  Ds.b  1000
1
[#12] Re: Blitzbasic + assembler

@cholok, post #11

Jeszcze raz. Wielkie, wielkie dzięki.
Program działa tak jak chciałem.
Powoli nabiera właściwego kształtu i kolejne dodatki jakie zaplanowałem.
Gdybym chciał dodać mozliwosc zmiany wartości 82 na inną w tej funkcji , to muszę odpowiednio dopasować funkcje oraz rejestry aby 82 poszło do d0 a kolejne parametry do odpowiednikch rejestrów. (d1,d2,d3,d4) ?
Przez tej "zabawie" poznaje się kolejne możliwości języka oraz asembler, a do głowy wpada następny pomysł na program..
Program który znalejdzie hasło do zahasłowanego archiwum xpk .
A może jest już taki program ?
1
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem