Oznámení

Sbalit
Aktuálně žádná oznámení.

Assembler - všeobecná logika

Sbalit
X
 
  • Filtr
  • Čas
  • Zobrazit
Vymazat vše
new posts

  • Lisiak
    odpověděl
    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
    Naposledy upravil Lisiak; 17.04.2024, 14:32:13.

    Vložit komentář:


  • Lisiak
    odpověděl
    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

    Apr 6
    hey twitter's friends! Soon is my first family trip to Japan (10 to 20 April), visiting Osaka, Kyoto, Tokyo and Hakone. Is there anything we should definitely see/do? #Japan
    ·

    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"
    Druhý soubor dle postupu zabalím do BIN souboru a soubor BIN se mi pak vytvoří. Soubor BIN pak načítám místo MODU, aby mi s ním LDOS uměl pracovat. Pak vytvorim BIN i z meho kodu soucasne s ADF souborem. Hudba mi vsak nezacne hrat.

    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ář:


  • Lisiak
    odpověděl
    Autorem citovaného textu je Defor Přejít na původní příspěvek
    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.
    LDOS - pouze mé postřehy

    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.

    Vložit komentář:


  • ObiWanKen
    odpověděl
    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.

    Vložit komentář:


  • Lisiak
    odpověděl
    Autorem citovaného textu je ObiWanKen Přejít na původní příspěvek
    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
    OK, s tym DBF jsem to myslel tak, ze jiz nelze napsat ve verzi 1.20 DBF.W, protoze ti to napise chybu a to ve verzi 1.18 fungovalo a slo napsat DBF.W. Je hezky, ze lze instrukce psat i bez W, ale rozhodne by pri pouziti spravneho rozsahu nemel kompiler hazet chybu co 1.20 dela a 1.18 nedela. Tohle je pro mne zatim chyba, ktera ve verzi 1.20 pribyla. Ja vim, ze kde nemusis rozsahy nepouzivas, pamatuji si to z nasich starsich komunikaci, ze to takhle máš.

    Já si rikal, ze ti budu vysvetlovat neco, co te asi ani nebude srát, protoze to nepouzivas...



    Vložit komentář:


  • ObiWanKen
    odpověděl
    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.


    Vložit komentář:


  • Lisiak
    odpověděl
    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ář:


  • ObiWanKen
    odpověděl
    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:



    Klikni pro plné zobrazení obrázku

Jméno: X.png
Počet zobrazení: 88
Velikost: 139,0 KB
ID: 167074

    Vložit komentář:


  • Predseda
    odpověděl
    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)
    o ten nemusíš ani žádat, ten si jen zapneš English Amiga Board - FAQ: vBulletin FAQ (abime.net)

    Vložit komentář:


  • Defor
    odpověděl
    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ář:


  • Lisiak
    odpověděl
    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é soubory
    Naposledy upravil Lisiak; 25.03.2024, 13:01:45.

    Vložit komentář:


  • Lisiak
    odpověděl
    Zjednodušení logiky:

    Klikni pro plné zobrazení obrázku

Jméno: playMod146include2.png
Počet zobrazení: 226
Velikost: 17,0 KB
ID: 166608

    Vložit komentář:


  • Lisiak
    odpověděl
    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... .​


    Klikni pro plné zobrazení obrázku

Jméno: playMod146include.png
Počet zobrazení: 218
Velikost: 15,9 KB
ID: 166606

    Vložit komentář:


  • Lisiak
    odpověděl
    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


    Vložit komentář:


  • Lisiak
    odpověděl
    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

    Vložit komentář:

Zpracovávám...
X