home *** CD-ROM | disk | FTP | other *** search
/ Aminet 10 / aminetcdnumber101996.iso / Aminet / misc / emu / Frodo.lha / Frodo / src / Main.asm < prev    next >
Assembly Source File  |  1995-12-07  |  19KB  |  1,075 lines

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