home *** CD-ROM | disk | FTP | other *** search
/ The AGA Experience 2 / agavol2.iso / software / utilities / emulation / frodo / src / main.asm < prev    next >
Assembly Source File  |  1996-01-29  |  19KB  |  1,095 lines

  1. *
  2. * Main.asm - Hauptprogramm des C64-Emulators/Einstellungsfenster
  3. *
  4. * Copyright (C) 1994-1996 by Christian Bauer
  5. *
  6.  
  7.         MACHINE    68020
  8.  
  9.         INCLUDE    "exec/types.i"
  10.         INCLUDE    "exec/macros.i"
  11.         INCLUDE    "exec/memory.i"
  12.         INCLUDE    "exec/execbase.i"
  13.         INCLUDE    "dos/dos.i"
  14.         INCLUDE    "dos/dosextens.i"
  15.         INCLUDE    "intuition/intuition.i"
  16.         INCLUDE    "intuition/intuitionbase.i"
  17.         INCLUDE    "libraries/locale.i"
  18.         INCLUDE    "workbench/startup.i"
  19.         INCLUDE    "devices/timer.i"
  20.         INCLUDE    "Frodo_rev.i"
  21. CATCOMP_NUMBERS    = 1
  22.         INCLUDE    "LocStrings.i"
  23.  
  24.         XREF    _SysBase    ;AStartup
  25.         XREF    _DOSBase
  26.         XREF    _WBenchMsg
  27.         XDEF    _main
  28.  
  29.         XDEF    _UtilityBase
  30.         XDEF    _IntuitionBase
  31.         XDEF    _GfxBase
  32.         XDEF    _GadToolsBase
  33.         XDEF    _AslBase
  34.         XDEF    _IconBase
  35.         XDEF    _CyberGfxBase
  36.         XDEF    _CiaBase
  37.         XDEF    _MiscBase
  38.         XDEF    _SID6581Base
  39.         XDEF    _PlaySidBase
  40.         XDEF    _TimerBase
  41.  
  42.         XDEF    MainTask
  43.         XDEF    _ShowPrefs
  44.         XDEF    Random
  45.         XDEF    ResetC64
  46.  
  47.         XREF    _DoThePrefs    ;Prefs.c
  48.         XREF    _LocalizePrefs
  49.         XREF    _OpenPrefs
  50.  
  51.         XREF    _OpenDisplay    ;Display.c
  52.         XREF    _CloseDisplay
  53.         XREF    _EmulToBack
  54.         XREF    _EmulToFront
  55.         XREF    _EventLoop
  56.         XREF    _LocalizeDisplay
  57.  
  58.         XDEF    TheLocale    ;Strings.o
  59.         XREF    GetString
  60.  
  61.         XREF    TheRAM        ;6510.asm
  62.         XREF    TheBasic
  63.         XREF    TheKernal
  64.         XREF    TheChar
  65.         XREF    TheColor
  66.         XREF    Init6510
  67.         XREF    Reset6510
  68.         XREF    Start6510
  69.         XREF    Stop6510
  70.         XREF    Wait6510
  71.         XREF    Pause6510
  72.         XREF    Resume6510
  73.         XREF    Localize6510
  74.  
  75.         XREF    Reset6526    ;6526.asm
  76.         XREF    ChangedKeys
  77.         XREF    CIACycles
  78.         XREF    Joystick1On
  79.         XREF    Joystick2On
  80.         XREF    JoystickSwap
  81.         XREF    KeyboardYZ
  82.  
  83.         XREF    Init6569    ;6569.asm
  84.         XREF    OpenGraphics
  85.         XREF    DisplayID
  86.         XREF    ScreenType
  87.         XREF    NormalCycles
  88.         XREF    BadLineCycles
  89.         XREF    SpritesOn
  90.         XREF    Collisions
  91.         XREF    Overscan
  92.         XREF    SkipLatch
  93.         XREF    LimitSpeed
  94.         XREF    DirectVideo
  95.  
  96.         XREF    Reset6581    ;6581.asm
  97.         XREF    InitSID
  98.         XREF    ExitSID
  99.         XREF    ChangedSIDPrefs
  100.         XREF    PauseSound
  101.         XREF    ResumeSound
  102.         XREF    SIDType
  103.  
  104.         XREF    InitIEC        ;IEC.asm
  105.         XREF    ExitIEC
  106.         XREF    ChangedIECPrefs
  107.         XREF    Dir8
  108.         XREF    Dir9
  109.         XREF    Dir10
  110.         XREF    Dir11
  111.         XREF    Drv8Type
  112.         XREF    Drv9Type
  113.         XREF    Drv10Type
  114.         XREF    Drv11Type
  115.         XREF    OtherIEC
  116.         XREF    MapSlash
  117.  
  118.         XDEF    PDir8        ;Für ChangedIECPrefs
  119.         XDEF    PDir9
  120.         XDEF    PDir10
  121.         XDEF    PDir11
  122.         XDEF    PDrv8Type
  123.         XDEF    PDrv9Type
  124.         XDEF    PDrv10Type
  125.         XDEF    PDrv11Type
  126.  
  127.         XDEF    _IsDraco
  128.  
  129.         SECTION    "text",CODE
  130.  
  131.  
  132. **
  133. ** Definitionen
  134. **
  135.  
  136. ; Laufwerkstypen
  137. DRVTYPE_DIR    = 0
  138. DRVTYPE_D64    = 1
  139. DRVTYPE_IEC    = 2
  140.  
  141.  
  142. **
  143. ** Hauptprogramm
  144. **
  145.  
  146.         MACHINE    68000
  147.  
  148. *
  149. * Libraries öffnen
  150. *
  151.  
  152. ; Task holen
  153. _main        move.l    _SysBase,a6
  154.         sub.l    a1,a1
  155.         JSRLIB    FindTask
  156.         move.l    d0,MainTask
  157.  
  158. ; Libraries öffnen
  159.         moveq    #37,d0
  160.         lea    UtilityName,a1
  161.         JSRLIB    OpenLibrary
  162.         move.l    d0,_UtilityBase
  163.         beq    NoUtility
  164.  
  165.         moveq    #37,d0
  166.         lea    IntuiName,a1
  167.         JSRLIB    OpenLibrary
  168.         move.l    d0,_IntuitionBase
  169.         beq    NoIntui
  170.  
  171.         moveq    #37,d0
  172.         lea    GfxName,a1
  173.         JSRLIB    OpenLibrary
  174.         move.l    d0,_GfxBase
  175.         beq    NoGfx
  176.  
  177.         moveq    #37,d0
  178.         lea    GadToolsName,a1
  179.         JSRLIB    OpenLibrary
  180.         move.l    d0,_GadToolsBase
  181.         beq    NoGadTools
  182.  
  183.         moveq    #38,d0
  184.         lea    AslName,a1
  185.         JSRLIB    OpenLibrary
  186.         move.l    d0,_AslBase
  187.         beq    NoAsl
  188.  
  189.         moveq    #37,d0
  190.         lea    IconName,a1
  191.         JSRLIB    OpenLibrary
  192.         move.l    d0,_IconBase
  193.         beq    NoIcon
  194.  
  195.         moveq    #40,d0
  196.         lea    CyberGfxName,a1
  197.         JSRLIB    OpenLibrary
  198.         move.l    d0,_CyberGfxBase
  199.  
  200.         moveq    #0,d0
  201.         lea    SID6581Name,a1
  202.         JSRLIB    OpenLibrary
  203.         move.l    d0,_SID6581Base
  204.  
  205.         moveq    #1,d0
  206.         lea    PlaySidName,a1
  207.         JSRLIB    OpenLibrary
  208.         move.l    d0,_PlaySidBase
  209.  
  210.         lea    CiaResName,a1
  211.         JSRLIB    OpenResource
  212.         move.l    d0,_CiaBase
  213.         beq    NoCiaRes
  214.  
  215.         lea    MiscResName,a1
  216.         JSRLIB    OpenResource
  217.         move.l    d0,_MiscBase
  218.  
  219.         lea    DracoResName,a1
  220.         JSRLIB    OpenResource
  221.         tst.l    d0
  222.         sne.b    IsDraco
  223.  
  224.         lea    TimerName,a0
  225.         moveq    #UNIT_MICROHZ,d0
  226.         lea    TimerIO,a1
  227.         moveq    #0,d1
  228.         JSRLIB    OpenDevice
  229.         move.l    TimerIO+IO_DEVICE,_TimerBase
  230.         beq    NoTimerDev
  231.  
  232. ; Locale öffnen und Catalog laden
  233.         move.l    _SysBase,a6
  234.         moveq    #37,d0
  235.         lea    LocaleName,a1
  236.         JSRLIB    OpenLibrary
  237.         move.l    d0,_LocaleBase
  238.         beq    10$
  239.         move.l    d0,a6
  240.         sub.l    a0,a0
  241.         lea    CatalogName,a1
  242.         lea    CatalogTags,a2
  243.         JSRLIB    OpenCatalogA
  244.         move.l    d0,TheCatalog
  245.  
  246. ; Datenstrukturen lokalisieren
  247. 10$        bsr    Localize
  248.         jsr    Localize6510
  249.         jsr    _LocalizePrefs
  250.         jsr    _LocalizeDisplay
  251.  
  252. *
  253. * 68020+ vorhanden?
  254. *
  255.  
  256.         move.l    _SysBase,a0
  257.         move.w    AttnFlags(a0),d0
  258.         btst    #AFB_68020,d0
  259.         beq    No68020Exit
  260.  
  261.         MACHINE    68020
  262.  
  263. *
  264. * Argumente auswerten
  265. *
  266.  
  267. ; Default-Name der Prefs-Datei setzen
  268.         lea    PrefsDefName,a0
  269.         lea    PrefsName,a1
  270.         move.w    #255,d0
  271. 1$        move.b    (a0)+,(a1)+
  272.         dbeq    d0,1$
  273.  
  274. ; Vom CLI gestartet?
  275.         move.l    MainTask,a0
  276.         tst.l    pr_CLI(a0)
  277.         beq    FromWB
  278.  
  279. ; Ja, ReadArgs benutzen
  280. FromCLI        move.l    _DOSBase,a6
  281.         move.l    #Template,d1
  282.         move.l    #CLIArgs,d2    ;Erstes Argument
  283.         moveq    #0,d3
  284.         JSRLIB    ReadArgs
  285.         move.l    d0,d1        ;NULL ist OK
  286.  
  287.         move.l    PrefsNameArg,d0    ;Name der Prefs-Datei kopieren
  288.         beq    1$
  289.         move.l    d0,a0
  290.         lea    PrefsName,a1
  291.         move.w    #255,d0
  292. 2$        move.b    (a0)+,(a1)+
  293.         dbeq    d0,2$
  294.  
  295. 1$        JSRLIB    FreeArgs
  296.         bra    ArgsDone
  297.  
  298. ; Von der Workbench gestartet, erstes Icon als Prefs laden
  299. FromWB        move.l    _WBenchMsg,a0
  300.         cmp.l    #1,sm_NumArgs(a0)
  301.         bls    ArgsDone
  302.  
  303.         move.l    sm_ArgList(a0),a0
  304.         lea    wa_SIZEOF(a0),a0    ;Erstes Icon (wir selbst) überspringen
  305.  
  306.         move.l    wa_Lock(a0),d1
  307.         beq    ArgsDone
  308.         move.l    wa_Name(a0),d4
  309.  
  310.         move.l    _DOSBase,a6
  311.         move.l    #PrefsName,d2
  312.         move.l    #256,d3
  313.         JSRLIB    NameFromLock
  314.  
  315.         move.l    #PrefsName,d1
  316.         move.l    d4,d2
  317.         move.l    #256,d3
  318.         JSRLIB    AddPart
  319. ArgsDone
  320.  
  321. *
  322. * Einstellungen laden
  323. *
  324.  
  325. ; Vorgegebene Einstellungen
  326.         move.w    #63,PNormalCycles
  327.         move.w    #23,PBadLineCycles
  328.         move.w    #63,PCIACycles
  329.         move.w    #-1,PJoystick2On
  330.         move.w    #-1,PSpritesOn
  331.         move.w    #-1,PCollisions
  332.         move.w    #-1,PMapSlash
  333.         move.w    #-1,PFastReset
  334.         move.w    #OSCAN_TEXT,POverscan
  335.         move.w    #1,PSkipLatch
  336.  
  337. ; Einstellungen laden
  338.         pea    ThePrefs
  339.         jsr    _OpenPrefs
  340.         addq.l    #4,sp
  341.  
  342. *
  343. * Einstellungsfenster
  344. *
  345.  
  346. ; Einstellungsfenster darstellen
  347.         clr.w    PrefsFromEmul
  348.         pea    ThePrefs
  349.         jsr    _DoThePrefs
  350.         addq.l    #4,sp
  351.  
  352. ; Einstellungen übernehmen, wenn OK geklickt, sonst beenden
  353.         tst.l    d0
  354.         beq    Exit
  355.         bsr    SetPrefs
  356.  
  357. ; IEC-Bus vorbereiten
  358.         jsr    InitIEC
  359.         bsr    IECErrorReq
  360.  
  361. ; SID-Emulation vorbereiten
  362.         jsr    InitSID
  363.  
  364. *
  365. * Emulation initialisieren
  366. *
  367.  
  368. ; Zufallszahlengenerator initialisieren
  369.         move.l    _IntuitionBase,a0
  370.         move.l    ib_Micros(a0),RandomSeed
  371.  
  372. ; Speicher für alles holen (die unteren Worte müssen mit den C64-Adressen
  373. ; übereinstimmen, außer CharROM)
  374.         move.l    _SysBase,a6
  375.         move.l    #$30000,d0        ;192K
  376.         move.l    #MEMF_ANY|MEMF_CLEAR,d1
  377.         JSRLIB    AllocVec
  378.         move.l    d0,RAMBlock
  379.         beq    NoMemExit
  380.  
  381.         add.l    #$ffff,d0        ;Auf xxxx0000 bringen
  382.         clr.w    d0
  383.         move.l    d0,TheRAM
  384.         add.l    #$11000,d0
  385.         move.l    d0,TheChar        ;yyyy1000
  386.         add.l    #$9000,d0
  387.         move.l    d0,TheBasic        ;yyyya000
  388.         add.l    #$3800,d0
  389.         move.l    d0,TheColor        ;yyyyd800
  390.         add.l    #$0800,d0
  391.         move.l    d0,TheKernal        ;yyyye000
  392.  
  393. ; Opcodes $d2 (Wraparound) ab $10000 installieren,
  394. ; für den Fall, daß ein Programm über $ffff springt
  395.         move.l    TheRAM,a0
  396.         lea    $10000(a0),a0
  397.         moveq    #256/4-1,d0
  398. 10$        move.l    #$d2d2d2d2,(a0)+
  399.         dbra    d0,10$
  400.  
  401. ; ROMs laden
  402.         move.l    _DOSBase,a6
  403.         move.l    #BasicFileName,d1    ;Basic
  404.         move.l    #MODE_OLDFILE,d2
  405.         JSRLIB    Open
  406.         move.l    d0,d7
  407.         beq    NoBasicExit
  408.         move.l    d0,d1
  409.         move.l    TheBasic,d2
  410.         move.l    #$2000,d3
  411.         JSRLIB    Read
  412.         move.l    d7,d1
  413.         JSRLIB    Close
  414.  
  415.         move.l    #KernalFileName,d1    ;Kernal
  416.         move.l    #MODE_OLDFILE,d2
  417.         JSRLIB    Open
  418.         move.l    d0,d7
  419.         beq    NoKernalExit
  420.         move.l    d0,d1
  421.         move.l    TheKernal,d2
  422.         move.l    #$2000,d3
  423.         JSRLIB    Read
  424.         move.l    d7,d1
  425.         JSRLIB    Close
  426.  
  427.         move.l    #CharFileName,d1    ;Char
  428.         move.l    #MODE_OLDFILE,d2
  429.         JSRLIB    Open
  430.         move.l    d0,d7
  431.         beq    NoCharExit
  432.         move.l    d0,d1
  433.         move.l    TheChar,d2
  434.         move.l    #$1000,d3
  435.         JSRLIB    Read
  436.         move.l    d7,d1
  437.         JSRLIB    Close
  438.  
  439. ; Betriebssystem patchen
  440.         move.l    TheKernal,a0
  441.         move.w    #$f200,$0d40(a0)    ;IECOut
  442.         move.w    #$f201,$0d23(a0)    ;IECOutATN
  443.         move.w    #$f202,$0d36(a0)    ;IECOutSec
  444.         move.w    #$f203,$0e13(a0)    ;IECIn
  445.         move.w    #$f204,$0def(a0)    ;IECSetATN
  446.         move.w    #$f205,$0dbe(a0)    ;IECRelATN
  447.         move.w    #$f206,$0dcc(a0)    ;IECTurnaround
  448.         move.w    #$f207,$0e03(a0)    ;IECRelease
  449.         bsr    PatchReset
  450.  
  451. ; Bildschirm öffnen
  452.         jsr    OpenGraphics
  453.         cmp.l    #1,d0
  454.         beq    NoScreenExit
  455.         cmp.l    #2,d0
  456.         beq    NoMemExit
  457.  
  458. ; Alles initialisieren
  459.         jsr    Reset6526
  460.         jsr    Reset6581
  461.         jsr    Init6510
  462.         jsr    Init6569
  463.  
  464. ; 6510 starten
  465.         jsr    Start6510
  466.         tst.l    d0
  467.         bne    NoMemExit
  468.  
  469. ; IDCMP des Fensters handhaben
  470.         jsr    _EventLoop
  471.  
  472. ; Programm beenden
  473.         bra    Exit
  474.  
  475. *
  476. * Fehlerbehandlung/Beenden
  477. *
  478.  
  479.         MACHINE    68000
  480.  
  481. No68020Exit    moveq    #MSG_NO68020,d0
  482.         lea    TheLocale,a0
  483.         jsr    GetString
  484.         lea    ErrorReq,a1
  485.         move.l    d0,es_TextFormat(a1)
  486.         sub.l    a0,a0
  487.         sub.l    a2,a2
  488.         sub.l    a3,a3
  489.         move.l    _IntuitionBase,a6
  490.         JSRLIB    EasyRequestArgs
  491.         bra    NoCiaRes
  492.  
  493.         MACHINE    68020
  494.  
  495. NoMemExit    moveq    #MSG_NOMEM,d0
  496.         bra    ReqExit
  497.  
  498. NoScreenExit    moveq    #MSG_NOSCREEN,d0
  499.         bra    ReqExit
  500.  
  501. NoKernalExit    moveq    #MSG_NOKERNAL,d0
  502.         bra    ReqExit
  503.  
  504. NoBasicExit    moveq    #MSG_NOBASIC,d0
  505.         bra    ReqExit
  506.  
  507. NoCharExit    moveq    #MSG_NOCHAR,d0
  508.  
  509. ReqExit        lea    TheLocale,a0
  510.         jsr    GetString
  511.         lea    ErrorReq,a1
  512.         move.l    d0,es_TextFormat(a1)
  513.         sub.l    a0,a0
  514.         sub.l    a2,a2
  515.         sub.l    a3,a3
  516.         move.l    _IntuitionBase,a6
  517.         JSRLIB    EasyRequestArgs
  518.  
  519. Exit        jsr    Stop6510
  520.         jsr    Reset6581    ;Stoppt diesen Lärm!
  521.         jsr    ExitSID
  522.         jsr    _CloseDisplay
  523.         jsr    ExitIEC
  524.  
  525.         move.l    _SysBase,a6
  526.  
  527.         move.l    RAMBlock,d0
  528.         beq    1$
  529.         move.l    d0,a1
  530.         JSRLIB    FreeVec
  531. 1$
  532.         MACHINE    68000
  533.  
  534.         move.l    _SysBase,a6
  535.         move.l    _TimerBase,d0
  536.         beq    NoTimerDev
  537.         lea    TimerIO,a1
  538.         JSRLIB    CloseDevice
  539.  
  540. NoTimerDev
  541. NoCiaRes    move.l    _SysBase,a6
  542.         move.l    _PlaySidBase,d0
  543.         beq    NoPlaySid
  544.         move.l    d0,a1
  545.         JSRLIB    CloseLibrary
  546.  
  547. NoPlaySid    move.l    _SID6581Base,d0
  548.         beq    NoSID6581
  549.         move.l    d0,a1
  550.         JSRLIB    CloseLibrary
  551.  
  552. NoSID6581    move.l    _LocaleBase,d0        ;Catalog schließen
  553.         beq    NoLocale
  554.         move.l    d0,a6
  555.         move.l    TheCatalog,a0
  556.         JSRLIB    CloseCatalog
  557.         move.l    a6,a1
  558.         move.l    _SysBase,a6
  559.         JSRLIB    CloseLibrary
  560.  
  561. NoLocale    move.l    _CyberGfxBase,d0
  562.         beq    NoCyber
  563.         move.l    d0,a1
  564.         JSRLIB    CloseLibrary
  565.  
  566. NoCyber        move.l    _IconBase,a1
  567.         JSRLIB    CloseLibrary
  568.  
  569. NoIcon        move.l    _AslBase,a1
  570.         JSRLIB    CloseLibrary
  571.  
  572. NoAsl        move.l    _GadToolsBase,a1
  573.         JSRLIB    CloseLibrary
  574.  
  575. NoGadTools    move.l    _GfxBase,a1
  576.         JSRLIB    CloseLibrary
  577.  
  578. NoGfx        move.l    _IntuitionBase,a1
  579.         JSRLIB    CloseLibrary
  580.  
  581. NoIntui        move.l    _UtilityBase,a1
  582.         JSRLIB    CloseLibrary
  583.  
  584. NoUtility    moveq    #0,d0
  585.         rts
  586.  
  587.         MACHINE    68020
  588.  
  589.  
  590. **
  591. ** C64 und Floppy zurücksetzen
  592. **
  593.  
  594.         XDEF    _ResetC64
  595. _ResetC64
  596. ResetC64    jsr    Reset6510
  597.         jsr    Reset6526
  598.         jmp    Reset6581
  599.  
  600.  
  601. **
  602. ** Je nach Zustand von FastReset den Speichertest aus dem ROM entfernen
  603. **
  604.  
  605. PatchReset    move.l    TheKernal,a0
  606.         tst.w    FastReset
  607.         bne    1$
  608.         move.w    #$d0e8,$1d84(a0)
  609.         rts
  610. 1$        move.w    #$a000,$1d84(a0)
  611.         rts
  612.  
  613.  
  614. **
  615. ** Preferences
  616. **
  617.  
  618. *
  619. * Preferences aus dem Emulator heraus
  620. *
  621.  
  622. ; Aktuelle Preferences holen
  623. _ShowPrefs    movem.l    d2-d7/a2-a6,-(sp)
  624.         bsr    GetPrefs
  625.  
  626. ; Fenster öffnen und handhaben
  627.         move.w    #-1,PrefsFromEmul
  628.         pea    ThePrefs
  629.         jsr    _DoThePrefs
  630.         addq.l    #4,sp
  631.  
  632. ; Prefs setzen, wenn OK geklickt
  633.         tst.l    d0
  634.         beq    1$        ;Die stehen hier (und nicht in SetPrefs),
  635.         jsr    ChangedIECPrefs    ; weil beim ersten Aufruf von SetPrefs
  636.         bsr    IECErrorReq    ; noch nicht alles initialisiert ist
  637.         bsr    SetPrefs
  638.         jsr    ChangedSIDPrefs
  639.         bsr    PatchReset
  640. 1$        movem.l    (sp)+,d2-d7/a2-a6
  641.         rts
  642.  
  643. *
  644. * Einstellungen setzen
  645. *
  646.  
  647. SetPrefs    move.w    PNormalCycles,NormalCycles
  648.         move.w    PBadLineCycles,BadLineCycles
  649.         move.w    PCIACycles,CIACycles
  650.         move.w    PJoystick1On,Joystick1On
  651.         move.w    PJoystick2On,Joystick2On
  652.         move.w    PJoystickSwap,JoystickSwap
  653.         move.w    PDrv8Type,Drv8Type
  654.         move.w    PDrv9Type,Drv9Type
  655.         move.w    PDrv10Type,Drv10Type
  656.         move.w    PDrv11Type,Drv11Type
  657.         move.w    POtherIEC,OtherIEC
  658.         move.w    PSpritesOn,SpritesOn
  659.         move.w    PCollisions,Collisions
  660.         move.w    POverscan,Overscan
  661.         move.w    PMapSlash,MapSlash
  662.         move.w    PFastReset,FastReset
  663.         move.w    PLimitSpeed,LimitSpeed
  664.  
  665.         tst.w    IsDraco            ;Auf dem DraCo Joysticks abschalten
  666.         beq    3$
  667.         clr.w    Joystick1On
  668.         clr.w    Joystick2On
  669. 3$
  670.         move.w    PSkipLatch,SkipLatch
  671.         bne    2$
  672.         move.w    #1,SkipLatch        ;Keine Null zulassen
  673. 2$
  674.         tst.w    PrefsFromEmul
  675.         bne    1$
  676.         move.l    PDisplayID,DisplayID    ;Nur beim Start
  677.         move.w    PScreenType,ScreenType
  678.         move.w    PDirectVideo,DirectVideo
  679. 1$
  680.         lea    PDir8,a0
  681.         lea    Dir8,a1
  682.         moveq    #256/4-1,d0
  683. 11$        move.l    (a0)+,(a1)+
  684.         dbra    d0,11$
  685.  
  686.         lea    PDir9,a0
  687.         lea    Dir9,a1
  688.         moveq    #256/4-1,d0
  689. 12$        move.l    (a0)+,(a1)+
  690.         dbra    d0,12$
  691.  
  692.         lea    PDir10,a0
  693.         lea    Dir10,a1
  694.         moveq    #256/4-1,d0
  695. 13$        move.l    (a0)+,(a1)+
  696.         dbra    d0,13$
  697.  
  698.         lea    PDir11,a0
  699.         lea    Dir11,a1
  700.         moveq    #256/4-1,d0
  701. 14$        move.l    (a0)+,(a1)+
  702.         dbra    d0,14$
  703.  
  704.         move.w    PSIDType,SIDType
  705.  
  706.         move.w    PKeyboardYZ,KeyboardYZ
  707.         jmp    ChangedKeys
  708.  
  709.  
  710. *
  711. * Einstellungen holen
  712. *
  713.  
  714. GetPrefs    move.w    NormalCycles,PNormalCycles
  715.         move.w    BadLineCycles,PBadLineCycles
  716.         move.w    CIACycles,PCIACycles
  717.         move.w    Joystick1On,PJoystick1On
  718.         move.w    Joystick2On,PJoystick2On
  719.         move.w    JoystickSwap,PJoystickSwap
  720.         move.w    SIDType,PSIDType
  721.         move.w    Drv8Type,PDrv8Type
  722.         move.w    Drv9Type,PDrv9Type
  723.         move.w    Drv10Type,PDrv10Type
  724.         move.w    Drv11Type,PDrv11Type
  725.         move.w    OtherIEC,POtherIEC
  726.         move.w    KeyboardYZ,PKeyboardYZ
  727.         move.w    SpritesOn,PSpritesOn
  728.         move.w    Collisions,PCollisions
  729.         move.w    Overscan,POverscan
  730.         move.w    MapSlash,PMapSlash
  731.         move.w    FastReset,PFastReset
  732.         move.w    LimitSpeed,PLimitSpeed
  733.         move.w    DirectVideo,PDirectVideo
  734.         move.l    DisplayID,PDisplayID
  735.         move.w    ScreenType,PScreenType
  736.         move.w    SkipLatch,PSkipLatch
  737.  
  738.         lea    Dir8,a0
  739.         lea    PDir8,a1
  740.         moveq    #256/4-1,d0
  741. 11$        move.l    (a0)+,(a1)+
  742.         dbra    d0,11$
  743.  
  744.         lea    Dir9,a0
  745.         lea    PDir9,a1
  746.         moveq    #256/4-1,d0
  747. 12$        move.l    (a0)+,(a1)+
  748.         dbra    d0,12$
  749.  
  750.         lea    Dir10,a0
  751.         lea    PDir10,a1
  752.         moveq    #256/4-1,d0
  753. 13$        move.l    (a0)+,(a1)+
  754.         dbra    d0,13$
  755.  
  756.         lea    Dir11,a0
  757.         lea    PDir11,a1
  758.         moveq    #256/4-1,d0
  759. 14$        move.l    (a0)+,(a1)+
  760.         dbra    d0,14$
  761.         rts
  762.  
  763.  
  764. **
  765. ** Requester entsprechend dem Rückgabewert von InitIEC/ChangedIECPrefs anzeigen
  766. ** d0: Rückgabewert
  767. **
  768.  
  769. IECErrorReq    tst.l    d0
  770.         beq    1$
  771.         cmp.l    #1,d0
  772.         bne    2$
  773.         lea    NoParPortReq,a1
  774.         bra    3$
  775. 2$        lea    NoTimerReq,a1
  776. 3$        move.l    a6,-(sp)
  777.         move.l    _IntuitionBase,a6
  778.         sub.l    a0,a0
  779.         move.l    a0,a2
  780.         move.l    a0,a3
  781.         JSRLIB    EasyRequestArgs
  782.         move.l    (sp)+,a6
  783. 1$        rts
  784.  
  785.  
  786. **
  787. ** Zufallsbyte ermitteln (0..255)
  788. ** d0: Ergebnis als 32-Bit-Wert (MSW muß Null sein!)
  789. **
  790.  
  791. Random        move.l    RandomSeed,d1
  792.         mulu.l    #2311,d1
  793.         add.l    #25367,d1
  794.         divul.l    #120050,d0:d1    ;Rest nach d0
  795.         move.l    d0,RandomSeed
  796.         lsl.l    #8,d0
  797.         divu.l    #120050,d0
  798.         rts
  799.  
  800.  
  801. **
  802. ** Strings in Datenstrukturen lokalisieren
  803. **
  804.  
  805. GetStr        MACRO    ;Label
  806.         lea    TheLocale,a0
  807.         move.l    #\1,d0
  808.         jsr    GetString
  809.         ENDM
  810.  
  811. Localize    GetStr    MSG_REQTITLE
  812.         move.l    d0,ErrorReq+es_Title
  813.         move.l    d0,NoParPortReq+es_Title
  814.         move.l    d0,NoTimerReq+es_Title
  815.  
  816.         GetStr    MSG_REQGADS
  817.         move.l    d0,ErrorReq+es_GadgetFormat
  818.  
  819.         GetStr    MSG_REQGADS2
  820.         move.l    d0,NoParPortReq+es_GadgetFormat
  821.         move.l    d0,NoTimerReq+es_GadgetFormat
  822.  
  823.         GetStr    MSG_NOPARPORT
  824.         move.l    d0,NoParPortReq+es_TextFormat
  825.  
  826.         GetStr    MSG_NOTIMER
  827.         move.l    d0,NoTimerReq+es_TextFormat
  828.         rts
  829.  
  830.  
  831. **
  832. ** C-Support (da ohne c.lib gelinkt wird)
  833. **
  834.  
  835.         XDEF    __mulu
  836. __mulu        mulu.l    d1,d0
  837.         rts
  838.  
  839.         XDEF    __muls
  840. __muls        muls.l    d1,d0
  841.         rts
  842.  
  843.         XDEF    __divu
  844. __divu        divu.l    d1,d0
  845.         rts
  846.  
  847.         XDEF    __divs
  848. __divs        divs.l    d1,d0
  849.         rts
  850.  
  851.         XDEF    _memset        ;Dest, Char, Len -> Dest
  852. _memset        move.l    4(sp),a0
  853.         move.l    8(sp),d0
  854.         move.l    12(sp),d1
  855.         beq    1$
  856. 2$        move.b    d0,(a0)+
  857.         subq.l    #1,d1
  858.         bne    2$
  859. 1$        move.l    4(sp),d0
  860.         rts
  861.  
  862.         XDEF    _strcat        ;Dest, Source -> Dest
  863. _strcat        move.l    4(sp),d0
  864.         move.l    d0,a0
  865.         move.l    8(sp),a1
  866. 1$        tst.b    (a0)+
  867.         bne    1$
  868.         subq.l    #1,a0
  869. 2$        move.b    (a1)+,(a0)+
  870.         bne    2$
  871.         rts
  872.  
  873.         XDEF    _strncat    ;Dest, Source, Max -> Dest
  874. _strncat    move.l    4(sp),d0
  875.         move.l    d0,a0
  876.         move.l    8(sp),a1
  877.         move.l    12(sp),d1
  878.         beq    1$
  879. 2$        tst.b    (a0)+
  880.         bne    2$
  881.         subq.l    #1,a0
  882. 3$        move.b    (a1)+,(a0)+
  883.         beq    1$
  884.         subq.l    #1,d1
  885.         bne    3$
  886.         clr.b    (a0)
  887. 1$        rts
  888.  
  889.         XDEF    _strchr        ;String, Char -> First
  890. _strchr        move.l    4(sp),a0
  891.         move.l    8(sp),d0
  892. 2$        cmp.b    (a0),d0
  893.         beq    1$
  894.         tst.b    (a0)+
  895.         bne    2$
  896.         moveq    #0,d0
  897.         rts
  898. 1$        move.l    a0,d0
  899.         rts
  900.  
  901.         XDEF    _strrchr    ;String, Char -> Last
  902. _strrchr    move.l    4(sp),a0
  903.         move.l    8(sp),d1
  904.         moveq    #0,d0
  905. 2$        cmp.b    (a0),d1
  906.         bne    1$
  907.         move.l    a0,d0
  908. 1$        tst.b    (a0)+
  909.         bne    2$
  910.         rts
  911.  
  912.         XDEF    _strcpy        ;Dest, Source -> Dest
  913. _strcpy        move.l    4(sp),d0
  914.         move.l    d0,a0
  915.         move.l    8(sp),a1
  916. 1$        move.b    (a1)+,(a0)+
  917.         bne    1$
  918.         rts
  919.  
  920.         XDEF    _strncpy    ;Dest, Source, Max -> Dest
  921. _strncpy    move.l    4(sp),d0
  922.         move.l    d0,a0
  923.         move.l    8(sp),a1
  924.         move.l    12(sp),d1
  925. 2$        subq.l    #1,d1
  926.         bcs    1$
  927.         move.b    (a1)+,(a0)+
  928.         bne    2$
  929.         bra    3$
  930. 4$        clr.b    (a0)+
  931. 3$        subq.l    #1,d1
  932.         bcc    4$
  933. 1$        rts
  934.  
  935.         XDEF    _strlen        ;String
  936. _strlen        move.l    4(sp),a0
  937. 1$        tst.b    (a0)+
  938.         bne    1$
  939.         sub.l    4(sp),a0
  940.         move.l    a0,d0
  941.         subq.l    #1,d0
  942.         rts
  943.  
  944.         XDEF    _malloc        ;ByteSize
  945. _malloc        move.l    4(sp),d0
  946.         move.l    a6,-(sp)
  947.         move.l    _SysBase,a6
  948.         move.l    #MEMF_PUBLIC,d1
  949.         JSRLIB    AllocVec
  950.         move.l    (sp)+,a6
  951.         rts
  952.  
  953.         XDEF    _free        ;Ptr
  954. _free        move.l    4(sp),a1
  955.         move.l    a6,-(sp)
  956.         move.l    _SysBase,a6
  957.         JSRLIB    FreeVec
  958.         move.l    (sp)+,a6
  959.         rts
  960.  
  961.         XDEF    _GetStr        ;MSG_#?
  962. _GetStr        lea    TheLocale,a0
  963.         move.l    4(sp),d0
  964.         jmp    GetString
  965.  
  966.         XDEF    _PutChProc    ;Für RawDoFmt
  967. _PutChProc    move.b    d0,(a3)+
  968.         rts
  969.  
  970.  
  971. **
  972. ** Konstanten
  973. **
  974.  
  975. ; Taglist für OpenCatalog
  976. CatalogTags    dc.l    OC_Version,2
  977.         dc.l    0
  978.  
  979. ; Strings
  980. Version        VERSTAG
  981. UtilityName    dc.b    "utility.library",0
  982. IntuiName    dc.b    "intuition.library",0
  983. GfxName        dc.b    "graphics.library",0
  984. GadToolsName    dc.b    "gadtools.library",0
  985. AslName        dc.b    "asl.library",0
  986. IconName    dc.b    "icon.library",0
  987. CyberGfxName    dc.b    "cybergraphics.library",0
  988. LocaleName    dc.b    "locale.library",0
  989. SID6581Name    dc.b    "6581sid.library",0
  990. PlaySidName    dc.b    "playsid.library",0
  991. CiaResName    dc.b    "ciaa.resource",0
  992. MiscResName    dc.b    "misc.resource",0
  993. DracoResName    dc.b    "draco.resource",0
  994. TimerName    dc.b    "timer.device",0
  995.  
  996. CatalogName    dc.b    "Frodo.catalog",0
  997.  
  998. PrefsDefName    dc.b    "PROGDIR:Frodo Prefs",0
  999. BasicFileName    dc.b    "PROGDIR:Basic ROM",0
  1000. KernalFileName    dc.b    "PROGDIR:Kernal ROM",0
  1001. CharFileName    dc.b    "PROGDIR:Char ROM",0
  1002.  
  1003. Template    dc.b    "FILE=PREFSFILE",0
  1004.         CNOP    0,4
  1005.  
  1006.  
  1007. **
  1008. ** Datenbereich
  1009. **
  1010.  
  1011. _UtilityBase    dc.l    0
  1012. _IntuitionBase    dc.l    0
  1013. _GfxBase    dc.l    0
  1014. _GadToolsBase    dc.l    0
  1015. _AslBase    dc.l    0
  1016. _IconBase    dc.l    0
  1017. _CyberGfxBase    dc.l    0
  1018. _SID6581Base    dc.l    0
  1019. _PlaySidBase    dc.l    0
  1020. _CiaBase    dc.l    0
  1021. _MiscBase    dc.l    0
  1022. _TimerBase    dc.l    0
  1023.  
  1024. TheLocale            ;Struktur für GetString
  1025. _LocaleBase    dc.l    0
  1026. TheCatalog    dc.l    0
  1027.  
  1028. MainTask    dc.l    0    ;Emulator-Haupttask
  1029.  
  1030. RandomSeed    dc.l    0    ;Basis für Zufallsgenerator
  1031.  
  1032. RAMBlock    dc.l    0    ;Zeiger auf Speicherbereich
  1033.  
  1034. ; Requester
  1035. ErrorReq    dc.l    20,0,0,0,0
  1036. NoParPortReq    dc.l    20,0,0,0,0
  1037. NoTimerReq    dc.l    20,0,0,0,0
  1038.  
  1039.  
  1040. **
  1041. ** Nicht initialisierte Daten
  1042. **
  1043.  
  1044.         SECTION    "BSS",BSS
  1045. TimerIO        ds.b    IOTV_SIZE    ;Dummy, um die _TimerBase bekommen
  1046.  
  1047.         XDEF    _PrefsName
  1048. _PrefsName
  1049. PrefsName    ds.b    256        ;Puffer für Namen der Prefs-Datei
  1050.  
  1051. CLIArgs                    ;Argumente
  1052. PrefsNameArg    ds.l    1
  1053.  
  1054.         XDEF    _PrefsFromEmul
  1055. _PrefsFromEmul
  1056. PrefsFromEmul    ds.w    1    ;#0: Einstellungen vom Emulator aus aufgerufen
  1057.  
  1058. ; Einstellungen
  1059. ThePrefs
  1060. Pdummy        ds.w    1
  1061. PNormalCycles    ds.w    1
  1062. PBadLineCycles    ds.w    1
  1063. PCIACycles    ds.w    1
  1064. PJoystick1On    ds.w    1
  1065. PJoystick2On    ds.w    1
  1066. PJoystickSwap    ds.w    1
  1067. PDisplayID    ds.l    1
  1068. PScreenType    ds.w    1
  1069. PDir8        ds.b    256
  1070. PDir9        ds.b    256
  1071. PDir10        ds.b    256
  1072. PDir11        ds.b    256
  1073. PDrv8Type    ds.w    1
  1074. PDrv9Type    ds.w    1
  1075. PDrv10Type    ds.w    1
  1076. PDrv11Type    ds.w    1
  1077. PSIDType    ds.w    1
  1078. POtherIEC    ds.w    1
  1079. PKeyboardYZ    ds.w    1
  1080. PCollisions    ds.w    1
  1081. POverscan    ds.w    1
  1082. PMapSlash    ds.w    1
  1083. PFastReset    ds.w    1
  1084. PSkipLatch    ds.w    1
  1085. PLimitSpeed    ds.w    1
  1086. PDirectVideo    ds.w    1
  1087. PSpritesOn    ds.w    1
  1088. PrefsLength    = *-ThePrefs
  1089.  
  1090. FastReset    ds.w    1    ;Prefs: Speichertest bei Reset abschalten
  1091.  
  1092. _IsDraco
  1093. IsDraco        ds.w    1    ;Laufen wir auf einem DraCo?
  1094.         END
  1095.