Ještě dnes druhý příspěvek, pouze info.
Ještě předtím, než jsem zacal resit vyse popsany problem jsem resil 1 chybove hlaseni LDOSu. Bylo to neco jako, ze nemuze najit soubor s indexem 0001. Leonard popisuje pouze problem, pokud je pamět preplněna, jak se to pokusit resit. Ten problem mam taky, ale to jsem docasne vyresil tim, ze nacitavam zatim pouze 2 MODy. Ve vysledku se ten problem s indexem souboru 0001 vyresil tim, ze jsem odstavil / vymazal cely kod od Photona, co mi odstavuje system. Domnívám ze, ze LDOS ma takovyhle kod svuj. Asi mu nesedelo 2 krat po sobe odstavovat system, popripade neco z Photonova kodu, co odstavuje system. To je jen ma domnenka. Po odstaveni Photonova kodu se chybova hlaska prestala zobrazoat a ja i dle chovani predpokladal, ze se mi jiz spustil muj kod i kdyz v te dobe bez hudby a ja pokacoval v bádání dál
Oznámení
Sbalit
Aktuálně žádná oznámení.
Assembler - všeobecná logika
Sbalit
X
-
Kodér Leonard a pak popis 1 problému, co mám s LDOSem
Drobátko teď OT, ale standardně mně to pobavilo a myslím, že jsem nalezl jednu z možných příčin, proč mi tvůrce LDOSu zatím neodepsal
Info z Twitteru:
@leonard_coder
U LDOSu řeším ještě 1 věc. Nedaří se mi z hudby MOD udělat jeho BIN soubor, neboli ho udělám, ale kód ho nenačte a hudba tedy nehraje. Pokud do ADF zpracované LDOSem vložím klasický MOD, tak mi hudba hraje. Tedy pomocí LDOSu mám vše ok kromě toho MODu a já ten BIN potřebuji, aby se ty MODy načítali postupně a ne naraz, čím bych měl snžit pamětovou náročnost. Vytvoreny BIN soubor meho programu je ok. U MODu postupuji stejně. Já vlastně ten MOD jen zabalím do BIN. Ta spojitost v kodu je pak nasledovná:
načtu BIN do A1 (návěstí Mod0) a dole v kódu mám INCBIN:
Code:Mod0 lea ModScr0,a1 ModScr0 incbin "ModMediev.bin"
ve druhém souboru mám (první řádek je direktiva LDOSU, ve druhém jen načítám samotný MOD):
Code:include "../../ldos/kernel.inc" incbin "mediev.MOD"
Pokud pouziju v kodu
ModScr0 incbin "Mediev.MOD"
místo:
ModScr0 incbin "ModMediev.bin"
a použiju LDOS, který mi vytbori BIN soubor z meho kodu a soubezne se mi vytvori ADF, ktereho je BIN z meho kodu soucasti, hudba z takhle vytvoreneho ADF mi hraje a vse je ok.
Tak za chvíli se vraci koder LDOSu Leonard z Japonka, třeba prohodíme pár vět, pokud se to nevyřeší...Naposledy upravil Lisiak; 17.04.2024, 13:43:54.
Vložit komentář:
-
Autorem citovaného textu je Defor Přejít na původní příspěvekK dispozici je celkem nedávný systém od Leonarda - LDOS. https://github.com/arnaud-carre/ldos
Systém je hlavně udělán k tomu, aby načítal separátní exáče (opět bez přispění OS), rozbalil je, naalokoval paměť (udělal relokaci) a spustil. Ale myslím, že v něm je možnost i načítat datové soubory (víc https://github.com/arnaud-carre/ldos...dos/kernel.inc). Ale myslím, že neumí používat žádný stávající file-system, takže image diskety se musí nejdřív vytvořit v nějakém jeho toolu.
Postupne se prokousavam tim LDOSem. Vypada to zatim dobre, jen si to je treba osahat. Jo, vyslednim ADF nebude klasicky amiga format, tedy to z diskety pujde spustit, ale jinak se nebude dat nacist tak, aby jsme viděli na ni klasicke soubory. LDOS by mel mit minimalni naroky 512 KB CHIP RAM + 512 nejake dalsi RAM. Ja se zatim zameruji na disketu, ale mel by mit i zavadec na HDD. LDOS obsahuje i hudebni prehravac. Je reprezentovany jako nejrychlejsi hudebni prehravac na Amize co by mohlo byt, ale neco za neco. Neprehrava klasicke MODy. Hudebni MOD si LDOS prevede do nejakeho sveho specifickeho formatu, Pri spravnem nastaveni by se tohle melo udelat automaticky, ten prevod pri vytvareni ADF / HDD verze. Ja tohle obejdu a dnes se mi povedlo udelat format LDOSu BIN. Jsou v nem binarni data, se kterym vas zdrojovy kod v assembleru pracuje. Ja si jako tyhle data urcil samotny MOD. Kazda skladba bude jeden BIN, tim docilim toho ze se budou MODy nacitavat do pameti postupne, Jako BIN muzete mit i jina data se kterymi potrebuje pracovat. Na to aby jste BIN mohli vytvorit potrebujete mit v adresari krome zdrojoveho kodu a MODu taky soubory LDOSu "M" a "VC". V souboru M si pomoci editace urcite cestu a nazev zdrojoveho kodu v ASM a nazev samotneho BIN, ktery se vam jeste jen vytvori. Ja mam ve zdrojovem kodu pouze INCBIN na konkretni MOD. Kazdy zdrojovy kod musi jeste nelepe někde na zacatku obsahovat i direktivu INCLUDE "kernel.inc". To je soubor LDOSu. Pokud je vse OK a spustite soubor M, LDOS vam vytvori soubor BIN. Ten si pak jiz nactete ve zdrojovem kodu. Tedy priprava ADFka by se dle vseho mela delat na dvakrat. Pripravite si BINy, ktere uvedete ve zdrojovem kodu a pak samotne vytvoreni ADFka. Dle vseho az tim krokem, jak se bude vytvaret ADF / HDD by se mela ucinit i samotna komprimace, kterou LDOS podporuje a tedy na disketu date vice dat. LDOS je dle vseho dost komplexni system, jde tam hodne veci nastavovat. Lze napriklad nastavit, aby se po nacitani dat a spusteni programu zacali nacitat hned dalsi data ktere jsou potreba. Tohle se muze a nemusi vyuzit dle potreby. Programator Leonard je jeden z dalsich expertu v ramci programovani. Jednoduse Oxygene . Ja v jednu dobu dost šlapal na hudebnim disku Amigatari, ktereho je koder Leonard a pouziva LDOS. System LDOS obsahuje i navod, ja pouzivam navod v kombinaci s ukazkovym kodem / soubory pro ADF. Samotny navod by mi nestacil, ale v kombinaci to zatim celkem jde. Tak zatim jen takove me postrehy a snad se zadaří
Naposledy upravil Lisiak; 12.04.2024, 23:48:56.
- Poděkování 1
Vložit komentář:
-
Zrejme si autor aktualizácie povedal že ak nie je podporovaný iný rozsah ako .W, tak to bude hlásiť ako chybu (v syntaxe alebo podobne).
A možno ťa len nemá rád a chce ťa nasrať. Zaspomínaj či si ho niekedy nenasral ty.
Kto vie.
Mňa teraz zase trápi chovanie ASM-Pro (1.18 aj 1.20) s RTG. Možno to ani nemá čo robiť s RTG ale keď používam KS vyšší ako 3.1.4 tak po kompilácii a spustení programu nasleduje GURU. A pomôže len reset.
Testujem to už asi tretí deň. Najprv som mal podozrenie na PiStorm ale robí to aj vo WinUAE. Až dnes ma napadlo zmeniť KS, používal som KS 3.2.
Zajtra to musím skúsiť na A1200 s PiStorm. Keby tu bol ešte niekto ochotný vyskúšať toto chovanie s posledným KS 3.2.1 by bolo super.
- Poděkování 2
Vložit komentář:
-
Autorem citovaného textu je ObiWanKen Přejít na původní příspěvekVerziu 1.20 zatiaľ len skúšam.
Pokiaľ ide o DBF (DBRA) tak mne sa zdá že u nej je dĺžka skoku len W size. Potom chyba je skôr vo verzii 1.18.
Možno u vyšších cpu aj L ale nie som si istý. Ja to nechávam na assembler nech si to skompiluje ako sa mu páči
Já si rikal, ze ti budu vysvetlovat neco, co te asi ani nebude srát, protoze to nepouzivas...
Vložit komentář:
-
Verziu 1.20 zatiaľ len skúšam.
Pokiaľ ide o DBF (DBRA) tak mne sa zdá že u nej je dĺžka skoku len W size. Potom chyba je skôr vo verzii 1.18.
Možno u vyšších cpu aj L ale nie som si istý. Ja to nechávam na assembler nech si to skompiluje ako sa mu páči
Skús si napísať krátky program, spusti debug (AD) a krokuj.
V spodnom riadku budeš vidieť inštrukciu aj v HEX. Niečo takéto:
$51C8xxxx
Kde XXXX je dĺžka skoku v bytes. Takže W size. Pri .B bude XX a pri .L bude XXXXXXXX. Ale pochybujem
Potom môžeš skúsiť meniť B,W,L a tam uvidíš či je zmena pri trasovaní vo 1.18 verzii.
To s Include poznám, ja dávam reštart asmpro príkazom !R.
Rozdiel medzi systemovým Load a Save je len veľmi malí. Neskôr ti sem hodím lepší príklad.
- Poděkování 1
Vložit komentář:
-
ObiWanKen všiml jsem si ze pouzivas ASM-PRO 1.20, ktera vysla v prosinci. Tak jsem ji dnes taky nahodil. Mam u tehle nove verze vuci stavajici 1.18 jedno horsi chovani. U instrukce DBF pokud se u ni pouzije jakykoliv rozsah, tedy se za tecku da W, co jsem u par mel, rozsah B je pro tuhle instrukci nedostacujici, pokud si to dobre pamatuji. Nicmene verze 1.20 haze chybu "illegal address size", co je z meho pohledu chybne chovani. Rozhodne se rozsah W / L musi pouzivat. Tahle chyba neni hlasena jen v pripade, kdyz se instrukce DBF napise bez rozsahu, co lze taky samozrejme, ale i tak by rozsah, pokud je spravny mel jit napsat, co ted u DBF nejde a to vnimam jako chybu.
Problem s INCLUDE, kdy musim zdrojak, ktery INCLUDE nacitavam pokud jej zmenim, tak ASM-PRO ukoncit a opet nastartovat, aby se mi zmena v kodu projevila u kompilace pomoci "a" zustal zachovany i u verze 1.20
Zatim jsem tvuj kod co zde vyse uvadis uplne nestudoval, ale tak nejak se mi jevi, ze v nem data spise zapisujes, nez nacitavas. Ja ted resim postupne nacitavani dat.
Defor ohledem Track-loaderu se rozkoukavam, ta myslenka s tim pridanim dát do ADF je super, skoda, ze takova data pak musi byt nezpakovane, neboli v mem pripade zatim ano. Asi by mne stacilo nakopnout jak je to s pouzitim toho kodu od Photona, ktery jsem uvedl vyse, ale celkove se rozkoukavam...Naposledy upravil Lisiak; 29.03.2024, 17:07:24.
Vložit komentář:
-
V mojom playfield editore vypínam OS a pri potrebe načítať data z HDD stačí zapnúť PORTS v INTENA.
Dokonca mám vlastne IRQ Level 3 a DMA celkom vypínam.
Samozrejme IRQ Level 2 nemením.
Asi takto:
- Poděkování 1
Vložit komentář:
-
Jenom k tomuhle:
Autorem citovaného textu je Defor Přejít na původní příspěvek(nemám přístup na The Zone)
Vložit komentář:
-
Pokud chceš, aby tvůj program načítal data ze zařízení, které má nějaký svůj file-system (disketa, harddisk, ...), musí ti běžet OS. Nesmíš ho vypínat tak, jak se to u demáčů a her obvykle dělalo (zakázání přerušení, DMA atd.). Někdy se to myslím dělalo tak, že hra odstavila OS a když chtěla načítat z diskety, zase ho zapla. Ale tohle nikdy nebylo bezpečné a asi to fungovalo jen někde kolem éry A500, kdy všichni měli tak maximálně disketové jednotky. Myslím, že později v době HDD, se aspoň ten systém "odstavoval" regulérně přes exec.library (nějaké ty funkce Forbid/Permit apod.).
Jak se tedy načítalo z disketové jednotky ve "zlatých starých časech"? Jelikož demáče kompletně odstavily OS, kompletně převzaly kontrolu nad HW, musely se používat nesystémové track-loader rutiny. Někdy k tomu došlo hned při bootování diskety a na disketě tak vlastně byl jen ten standardní boot-sector. Track-loadery myslím byly většinou napsané tak, že uživatel řekl kolik sektorů dat se z diskety má načíst (a od kterého sektoru) a rutina to udělala. Někdy byly synchronní, někdy asynchronní. Bylo na uživateli, aby svá data nějak dostal na patřičné sektory a jeho program musel vědět, odkud mají data načítat a kam do paměti. Myslím, že se autoři moc nezatěžovali nějakým "file systémem". Někdo do toho vložil víc úsilí a tak vznikly alternativní "DOSy" - zmínil jsi Sanity Operating System (SOS), ve kterém si udělali vlastní file-system.
Jsou i nějaké track-loadery, které umí používat OFS (nebo FFS?) na disketách. Prý je takový k dispozici někde na EAB od Rosse. V diskuzích je o něm opakovaně zmínka, ale já ho nenašel (nemám přístup na The Zone). Měl by asi fungovat tak, že uživatel normálně na disketu nahraje soubory a track-loader bez přispění OS soubory (podle názvu) umí načíst. Určitě velmi pohodlné, ale nezkoušel jsem.
K dispozici je celkem nedávný systém od Leonarda - LDOS. https://github.com/arnaud-carre/ldos
Systém je hlavně udělán k tomu, aby načítal separátní exáče (opět bez přispění OS), rozbalil je, naalokoval paměť (udělal relokaci) a spustil. Ale myslím, že v něm je možnost i načítat datové soubory (víc https://github.com/arnaud-carre/ldos...dos/kernel.inc). Ale myslím, že neumí používat žádný stávající file-system, takže image diskety se musí nejdřív vytvořit v nějakém jeho toolu.
Je tu i alternativní cesta, kdy máš ve svém exe všechna data sbalená nějakým packerem a tvůj program je postupně v paměti rozbaluje. Samozřejmě nevýhodou je, že se ti všechna data musí nejdřív vlézt do paměti a navíc musíš mít dost volné paměti, abys do ní mohl rozbalovat. Záleží na situaci. Hodně menších demáčů (one-file demo) to tak ale dělá, protože je to jednodušší než řešit track-loadery (jako např. naše Mindsurfin' - používal jsem LZ4).
P.S.: Pokud se nechceš babrat s boot-sectorem, tak je možné si udělat normálně exáč, dát ho na bootující disketu, pustit pří bootu v startup-sequenci a na disketu si dát data na sektory, které jsou jinak prázdné (je třeba si zjistiti, které to jsou!). Tvůj program pak odstaví systém a track-loader rutinou si pak kdykoliv z těch sektorů taháš data. Disketa se tak na pohled jeví, že je "systémová" (je tam s/startup-sequence, tvůj exáč i standardní systémový bootblock), ale data pochopitelně v systému nejsou vidět. Takže musíš lidi instruovat, aby si kopírovali disketu celou (resp. ADF)Naposledy upravil Defor; 26.03.2024, 14:23:24.
Vložit komentář:
-
Defor
K tem skoum, že potrebuji 32 bitovy skok na navesti (a nestaci 16 bitovy skok) pouziti rozdeleni SECTION CODE / DATA tohle mi nevyresilo, aby jsem mohl pouzit pouze PC relativni 16 bitovy skok. Mozna si to myslel ve smyslu proc mi to nabiha az napodruhe pri 1 MB CHIP RAM, ale to bylo opravdu asi na hraně s pametovou narocnosti programu. Ja tam par veci jiz mam pridanych a jiz to na 1 MB CHIP nenabiha vubec (ani napodruhe). Musi byt alespon 512 SLOW RAM k 1 MB CHIP RAM. Jiz mam nahrubo rozdelene sekvence CODE / DATA, je to tak urcite lepsi. Nevim napriklad, jestli ma nejaky smysl udelat pro kazdy MOD sekvenci pro DATA zvlast, ze by kazdy MOD mel sve sekvence data, ale ted to mam tak, ze mam 1 sekvence data a pod tim vsechny MODy.
Premyslel jsem jak snizit pametovou narocnost, tedy nacitat data postupne. U nacteni souboru / MODu se da definovat, kolik se z nej ma nacist z jeho celkove delky, ale to muj problem neresi. Na netu, hlavne EABu se tvari, ze se to resi jen tzv. track loaderom, neboli programem, ktery nacita data z diskety postupne a taky se tvari, ze to takhle jde resit pouze z diskety a ze tohle omezeni nejde obejit, ze by to slo udelat treba z HDD, neboli aby byl track loader ktery by nacital data postupne z HDD. Jeden programator tam psal, že to resi maximalni komprimaci ve FAST / SLOW RAM a postupne nacita data do CHIP RAM. Co muze byt rozumny kompromis toho vseho, aby si mohl nacitat data i z HDD a ne pouze z diskety nejakym track loaderom. Ty si tam sam na fore EAB doporucoval sve oblimene Sanity (track loader) nekdy v roce 2021 .
Svuj track loader tam ma i Photon, ktery si celkem ostatni chvalili. Rad bych jej sprovoznil, ale tak nejak zatim nerozumim tomu principu jak to pouzit s exe souborem, ze ktereho se budou data nacitat postupne, nebo to dat primo do kodu a jak to propojit s mym programem.
Ze zacatku mne napadala i alternativa mit vice mensich exe a mit je mezi sebou nejak propojeny nejakym skriptovacim jazykem, kde by se odchytila pouze po ukonceni jednoho exe promenna, ktera by urcovala, ktere exe se opet spusti, ale to asi nebude stastna volba... .
V příloze je zpakovany track loader od Photon-a, kod hazu i primo do vlakna... .
DDE5-BootLoader.zip
Code:*** BootLoader.S by Photon *** ;NOTE: PC-relative code is PREFERRED. ;To write to disk in Asm-One, use the command WS0 Boot 0 2 followed by CC0 LoaderVars =$100 ;Useful variables, see CPUinfo: Loader =$120 ;start of load script MyUserStack=$7fffc ;SSP is at a safe place, but set user ;stack. MFMsync =$4489 ;AmigaDOS standard sync marker. MFMlen =12980 ;Legacy trackdata read length in bytes ShortWt:MACRO ;CPU-independent nop;nop replacement tst.w (a6) ENDM *** Boot Block starts here *** Boot: dc.b 'DOS',0 dc.l 0,880 BootCode: ;gathers some data, turns off OS, copies itself to $100 *--- Fetch system info ---* move.l 4.w,a6 ;execbase (will soon be destroyed) move.l 294(a6),d4 ;CPUinfo in lowest byte for your use. sub.l a4,a4 ;VBR will always be 0 when booting ;from floppy. No GetVBR needed. *--- Fastmem available? ---* move.l #$20004,d1 ;fast+largest jsr -216(a6) ;AvailMem() move.l d0,d5 sub.l #2048,d5 ;leave room for stacks to grow moveq #4,d1 jsr -198(a6) ;AllocMem() and.l #-8,d0 move.l d0,a5 ;Start Address *--- OS off ---* ;you're nice'n all, but now you die. lea $dff002,a6 ;Loader uses this custom base addr tst.w (a6) ;wait out blitter .wblit: btst #6,(a6) bne.s .wblit move.l #$7fff7fff,d1 move.l d1,$9a-2(a6) ;disable interrupts & req move.w d1,$9c-2(a6) ;play it again Sam sub.w #$20,d1 ;don't affect Sprite DMA until Vblank move.w d1,$96-2(a6) ;disable DMA lea MyUserStack,a7 ;some safe place compatible with ;platform requirements *--- Copy rest of code/data to fixed address ---* lea CopyStart(PC),a0 lea (LoaderVars).w,a1 moveq #(BootE-CopyStart)/8,d2 .copyl: move.l (a0)+,(a1)+ move.l (a0)+,(a1)+ dbf d2,.copyl JMP (Loader).w ;Info from Exec passed in 4 registers ******************** $100.w ******************** CopyStart: CPUinfo: dc.l 0 ;$100 FastMemSize: dc.l 0 ;$104 SysVBR: dc.l 0 ;$108 FastMemStart: dc.l 0 ;$10c MFMcyl: dc.w 0 MFMhead: dc.w 0 MFMdrv: dc.w 0 MFMchk: dc.l 0 dc.w 0 ;reserved for your use. LoadVector: bra.w LoadMFMB ;for external calls, JSR ($11c).w LoadScript: ;At $120, sysinfo in 4 regs, a6=$dff002 lea CPUinfo(PC),a3 ;Use this for PC-rel in a pinch. movem.l d4/d5/a4/a5,(a3) bsr.s WaitEOF lea NullCop(PC),a0 move.l a0,$80-2(a6) ;blank copper move.w #$87d0,$96-2(a6) ;enable DMA (sprites enabled when used) *--- load first part ---* lea $42000,a0 ;to dest addr moveq #2,d0 ;from sector 2 move.w #-9,d1 ;load 9 sectors (- to trigger Step0) jsr ($11c).w ;call LoadVector, and return when done. lea $dff000,a6 ;restore plain custombase addr for demo JMP (a0) ;start demo. ;or use JSR and continue loading script here. *** MFMLoader.S by Photon *** ;requires a6=$dff002 WaitEOF: btst #0,5-2(a6) beq.s WaitEOF .w1: cmp.b #$37,6-2(a6) bne.s .w1 .w2: cmp.b #$37,6-2(a6) ;wait for last PAL line, $138 beq.s .w2 rts LoadMFMB: ;load sectors.a0=dst,d0=startsec.W,d1=nrsecs.W(-=Step0) MOVEM.L D0-D7/A0-A6,-(SP) lea $bfd100,a4 bsr MotorOn tst.w d1 ;if neg length,then Step0 first bpl.s .NoSt0 neg.w d1 .St0: btst #4,$f01(a4) ;head on cyl 0? beq.s .Rdy0 bsr.s StepOut bra.s .St0 .Rdy0: lea MFMcyl(PC),a1 clr.w (a1) .NoSt0: and.l #$ffff,d0 divu #22,d0 ;startcyl sub.w MFMcyl(PC),d0 ;delta-step beq.s .StRdy bmi.s .StOut subq.w #1,d0 .StIn: bsr.s StepIn dbf d0,.StIn bra.s .StRdy .StOut: not.w d0 ;=neg+sub#1 .StOutl:bsr.s StepOut dbf d0,.StOutl .StRdy: swap d0 ;startsec within cyl cmp.w #11,d0 blt.s .Head0 sub.w #11,d0 bra.s .Head1 .Head0: bset #2,(a4) lea MFMhead(PC),a1 clr.w (a1) bsr LoadTrak ;read track+decode beq.s .End .Head1: bclr #2,(a4) ;Head 1 lea MFMhead(PC),a1 move.w #1,(a1) bsr LoadTrak ;read track+decode beq.s .End bsr.s StepIn ;1 cyl forward bra.s .Head0 .End: bsr.s MotorOff MOVEM.L (SP)+,D0-D7/A0-A6 RTS StepOut: bset #1,(a4) lea MFMcyl(PC),a1 subq.w #1,(a1) ShortWt bclr #0,(a4) ShortWt bset #0,(a4) bsr.s StepWt RTS StepIn: bclr #1,(a4) lea MFMcyl(PC),a1 addq.w #1,(a1) ShortWt bclr #0,(a4) ShortWt bset #0,(a4) bsr.s StepWt RTS StepWt: moveq #67,d6 ;wait >3 ms LeaveLine: .loop1: move.b 6-2(a6),d7 .loop2: cmp.b 6-2(a6),d7 beq.s .loop2 dbf d6,.loop1 RTS MotorOn: move.w MFMdrv(PC),d7 addq.w #3,d7 or.b #$78,(a4) bset d7,(a4) ShortWt bclr #7,(a4) ;turns motor on ShortWt bclr d7,(a4) ShortWt .DiskR: btst #5,$f01(a4) ;wait until motor running bne.s .DiskR RTS MotorOff: move.w MFMdrv(PC),d7 addq.w #3,d7 bset d7,(a4) ShortWt bset #7,(a4) ShortWt bclr d7,(a4) RTS LoadTrak: ;load track+decode.a0=dst,d0=secoffs,d1=secsleft MOVE.W D0,-(SP) MOVE.W D1,-(SP) lea (MFMbuf).w,a1 move.w #2,$9c-2(a6) ;Clr Req move.l a1,$20-2(a6) move.w #$8210,$96-2(a6) ;DskEna move.w #MFMsync,$7e-2(a6) move.w #$9500,$9e-2(a6) move.w #$4000,$24-2(a6) move.w #$8000+MFMlen/2,$24-2(a6) ;DskLen(12980)+DmaEn move.w #$8000+MFMlen/2,$24-2(a6) ;start reading MFMdata .Wrdy: btst #1,$1f-2(a6) ;wait until data read beq.s .Wrdy move.w d0,d2 add.w d1,d2 ;highest sec# (d0=lowest) cmp.w #11,d2 ble.s .NoOvr moveq #11,d2 .NoOvr: sub.w d0,d2 ;nrsecs move.l #$55555555,d3 ;and-const move.w d2,d1 subq.w #1,d1 ;loopctr .FindS: cmp.w #MFMsync,(a1)+ ;search for a sync word bne.s .FindS cmp.b (a1),d3 ;search for 0-nibble bne.s .FindS move.l (a1)+,d4 ;decode fmtbyte/trk#,sec#,eow# move.l (a1)+,d5 and.w d3,d4 and.w d3,d5 add.w d4,d4 or.w d5,d4 lsr.w #8,d4 ;sec# sub.w d0,d4 ;do we want this sec? bmi.s .Skip cmp.w d2,d4 blt.s .DeCode .Skip: lea 48+1024(a1),a1 ;nope bra.s .FindS .DeCode:lea 40(a1),a1 ;found a sec,skip unnecessary data move.l a1,d6 lea MFMchk(PC),a1 clr.l (a1) move.l d6,a1 move.l (a1)+,d6 ;decode data chksum.L move.l (a1)+,d5 and.l d3,d6 and.l d3,d5 add.l d6,d6 or.l d5,d6 ;chksum lea 512(a1),a2 add.w d4,d4 ;x512 lsl.w #8,d4 lea (a0,d4.w),a3 ;dest addr for this sec moveq #127,d7 .DClup: move.l (a1)+,d4 move.l (a2)+,d5 and.l d3,d4 and.l d3,d5 eor.l d4,d6 ;EOR with checksum eor.l d5,d6 ;EOR with checksum add.l d4,d4 or.l d5,d4 move.l d4,(a3)+ dbf d7,.DClup ;chksum should now be 0 if correct lea MFMchk(PC),a1 or.l d6,(a1) ;or with track total chksum move.l a2,a1 dbf d1,.FindS ;decode next sec MOVE.W (SP)+,D1 MOVE.W (SP)+,D0 move.l MFMchk(PC),d3 ;track total chksum OK? bne LoadTrak ;no,retry moveq #0,d0 ;set to start of track move.w d2,d3 add.w d3,d3 lsl.w #8,d3 add.w d3,a0 sub.w d2,d1 ;sub #secs loaded RTS NullCop: dc.w $1fc,0 dc.w $100,$0200 dc.w $96,$0020 ;ensure sprite DMA is off until needed dc.w $ffdf,$fffe dc.l -2 BootE: *** Boot Block ends here *** dc.b "BootLoader by Photon/Scoopex" ;pad with random bytes blk.b 1024,0 ;MFMbuf is placed here after bootblock end, $3c0.w or so when copied. MFMbuf =LoaderVars+(BootE-CopyStart) MFMbufE =MFMbuf+MFMlen ;lowest free address. $372e for a full bootblock. END
Přiložené souboryNaposledy upravil Lisiak; 25.03.2024, 13:01:45.
Vložit komentář:
-
Hudebni rutinu teď načítám externě, aby jsem mel uklizeno v casti pro program. Nic jsem nestudoval jak se to dela. Pouzil jsem INCLUDE a fungovalo to. Tedy prvni zakladni verze. Pak jsem lepe rozlozil, co bude v casti hudebni rutiny a co bude lepsi nechat v casti pro program, tedy 2 soubory se zdrojovým kodem. Zamerne to delam stylem, jak bych si predstavoval, aby to fungovalo v nejake hre. Proto jsem casti kodu, kde se testuje stisk klaves dal do programu. V tehle casti pro testovani stisku klaves je ale i prima navaznost na hudebni rutinu. S tim jsem i pocital, ze to nebudu delat uplne čistě, ale to je muj zamer, protoze si muzu dovolit jednodussi logiku, nez je v programu, kde nevite, jake MODy se budou hrat, ale to ja vim.
Uplne nahore v programu je Photon-ův kod, ktery odstavuje a na konci vraci system. Pak je kod pro test stisku klaves. Teď je to šípka nahuru a dolu pro vyber hrajiciho MODu. ESC a leve tlacitko mysi pro ukonceni programu. A pak nasleduje kod ve kterem volam hudebni rutinu. V casti PROGRAM za testem stisku klaves bude dalsi kod pro program ktery jeste vznikne. Timhle se sikove vyuzije po programovve strance "pauza", ktera se i tak v hudebni rutine musi delat.
Prvni na co se skáče po odstaveni systemu je navesti "programCycle". Pomoci BSR se nacte podprogram/hudebni rutina "playMod" v hudebni rutine mam na spravnem miste RTS = navrat z podprogramu / hudebni rutiny (2.zdrojovy kod) do programu (1.zdrojovy kod) a vykona se skok pomoci BRA na navesti program = test stisku klaves. Pak se skace na navesti "programContinue" a opet se vracime do hudebni rutiny pomoci BSR a "playMod2". Dokonci se nam 1 cely cyklus hudebni rutiny a ted to dulezite, pokracuje se v novem cyklu az do jiz zpomenuteho prikazu RTS na spravnem miste v hudebni rutine. Tohle RTS v hudebni rutine je tedy spolecne pro BSR "playMod" i "playMod2". Asi to neni uplne cisty, ale umim si predstavit i vetsi prasarny v programovani a u mne je to v ramci moznosti v pohode. Za BSR "playMod2" jsme po RTS v hudebi rutine opet pred testovanim klaves. Proto pomoci BRA "nextCycle" skaceme na "program" a i si ted uvedomuji, ze bych misto BRA "nextCycle" mohl napsat hned "program" a radek s navestim "nextCycle" BRA "program" vubec nepouzit. Takhle, jak to mam ted je to asi trosku nazornejsi... .
- Poděkování 2
Vložit komentář:
-
Všiml jsem si, že jde něčeho dosáhnout, co jsem si myslel. že nejde a je to fakt blbost a jen o tom, že jsem s tím nepracoval a proto mne to nenapadlo a musel mně nasměrovat cizí kód. Nechci teď psát co to je, ale donutilo mně to na chvíli se koukat do cizího kódu a i když již vím, v čem je řešení, koukám do cizího kódu zatím ještě dál.
Chvíli mi docvakávalo, jak je myšlena adresace viz níže, protože jsem chvíli přehlížel instrukci LEA, pak mi to hned samozřejmě došlo. Je to celkem šikovné navýšení adresy bez ADD s použitím hodnoty a i když instrukci LEA nepovažuji za rychlíka, tak možná pořád rychlejší, nebo alespoň šikovnější (to je o zvyku) způsob, jak navýšit adresu / pointer.
Doposud pro mne známá klasika:
ADD #40, a0
Z cizího ukázkového kódu od SKID ROW:
LEA 40(a0), a0
ADD by mohlo mít navrch při nižších navýšeních adresy při použití ADDQ
Neměřeno a nepočítáno na takty, pardon
- Poděkování 1
Vložit komentář:
-
Soucasny stav kodu me hudebi rutiny hrajici MODy. Prehraje ciste MODy bez efektu pri pouziti zakladni rychlosti hrani 1-20 hexa. Optimalizovano pro 4 MODy, ktere prehraje správně. Pouzity ASM-Pro v1.18
V příloze zdrojovy kod.
playMod127_CDS.zip
- Poděkování 2
Vložit komentář:
Vložit komentář: