home *** CD-ROM | disk | FTP | other *** search
/ Brotikasten / BROTCD01.iso / amiga / frodov13.lha / src / Main.asm < prev    next >
Assembly Source File  |  1995-02-22  |  35KB  |  1,700 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    "intuition/intuition.i"
  15.         INCLUDE    "graphics/displayinfo.i"
  16.         INCLUDE    "libraries/gadtools.i"
  17.         INCLUDE    "libraries/asl.i"
  18.         INCLUDE    "libraries/locale.i"
  19.         INCLUDE    "libraries/cybergraphics.i"
  20.         INCLUDE    "workbench/workbench.i"
  21.         INCLUDE    "FrodoPrefs.i"
  22.         INCLUDE    "Frodo_rev.i"
  23. CATCOMP_NUMBERS    = 1
  24.         INCLUDE    "Strings.i"
  25.  
  26.         XREF    _SysBase    ;Startup
  27.         XREF    _DOSBase
  28.         XDEF    _main
  29.  
  30.         XDEF    _UtilityBase
  31.         XDEF    _IntuitionBase
  32.         XDEF    _GfxBase
  33.         XDEF    _GadToolsBase
  34.         XDEF    _AslBase
  35.         XDEF    _EGSBase
  36.         XDEF    _VilIntuiBase
  37.         XDEF    _CyberGfxBase
  38.         XDEF    _CiaBase
  39.         XDEF    _MiscBase
  40.         XDEF    _SID6581Base
  41.  
  42.         XDEF    ShowPrefs
  43.  
  44.         XREF    PrefsNGads
  45.  
  46.         XDEF    MainTask
  47.  
  48.         XDEF    TheLocale    ;Strings.o
  49.         XREF    GetString
  50.  
  51.         XREF    TheRAM        ;6510.asm
  52.         XREF    TheBasic
  53.         XREF    TheKernal
  54.         XREF    TheChar
  55.         XREF    TheColor
  56.         XREF    Init6510
  57.         XREF    Start6510
  58.         XREF    Stop6510
  59.         XREF    Wait6510
  60.         XREF    Pause6510
  61.         XREF    Resume6510
  62.         XREF    Localize6510
  63.  
  64.         XREF    Reset6526    ;6526.asm
  65.         XREF    ChangedKeys
  66.         XREF    CIACycles
  67.         XREF    Joystick1On
  68.         XREF    Joystick2On
  69.         XREF    JoystickSwap
  70.         XREF    KeyboardYZ
  71.  
  72.         XREF    OpenGraphics    ;6569.asm
  73.         XREF    CloseGraphics
  74.         XREF    WaitForClick
  75.         XREF    AmigaToFront
  76.         XREF    EmulToFront
  77.         XREF    DisplayID
  78.         XREF    ScreenType
  79.         XREF    NormalCycles
  80.         XREF    BadLineCycles
  81.         XREF    Collisions
  82.         XREF    Overscan
  83.         XREF    SkipLatch
  84.  
  85.         XREF    Reset6581    ;6581.asm
  86.         XREF    ChangedSID
  87.         XREF    PauseSound
  88.         XREF    ResumeSound
  89.         XREF    CloseSID
  90.         XREF    UseSIDCard
  91.  
  92.         XREF    Open1541    ;1541.asm
  93.         XREF    Close1541
  94.         XREF    ChangedDirs
  95.         XREF    CloseIEC
  96.         XREF    ChangedIEC
  97.         XREF    Dir8
  98.         XREF    Dir9
  99.         XREF    Dir10
  100.         XREF    Dir11
  101.         XREF    Drv8IsIEC
  102.         XREF    Drv9IsIEC
  103.         XREF    Drv10IsIEC
  104.         XREF    Drv11IsIEC
  105.         XREF    OtherIEC
  106.         XREF    MapSlash
  107.  
  108.         SECTION    "CODE",CODE
  109.  
  110.  
  111. **
  112. ** Definitionen
  113. **
  114.  
  115. ; CyberGfx
  116. CModeRequest    = -66
  117.  
  118.  
  119. **
  120. ** Makros
  121. **
  122.  
  123. ; LongInt-Wert aus Integer-Gadget a0 lesen
  124. GetInt        MACRO    ;Ziel
  125.         move.l    gg_SpecialInfo(a0),a0
  126.         move.l    si_LongInt(a0),\1
  127.         ENDM
  128.  
  129.  
  130. **
  131. ** Hauptprogramm
  132. **
  133.  
  134. ; Task holen
  135. _main        move.l    _SysBase,a6
  136.         sub.l    a1,a1
  137.         JSRLIB    FindTask
  138.         move.l    d0,MainTask
  139.  
  140. ; Libraries ÷ffnen
  141.         moveq    #37,d0
  142.         lea    UtilityName,a1
  143.         JSRLIB    OpenLibrary
  144.         move.l    d0,_UtilityBase
  145.         beq    NoUtility
  146.  
  147.         moveq    #37,d0
  148.         lea    IntuiName,a1
  149.         JSRLIB    OpenLibrary
  150.         move.l    d0,_IntuitionBase
  151.         beq    NoIntui
  152.  
  153.         moveq    #37,d0
  154.         lea    GfxName,a1
  155.         JSRLIB    OpenLibrary
  156.         move.l    d0,_GfxBase
  157.         beq    NoGfx
  158.  
  159.         moveq    #37,d0
  160.         lea    GadToolsName,a1
  161.         JSRLIB    OpenLibrary
  162.         move.l    d0,_GadToolsBase
  163.         beq    NoGadTools
  164.  
  165.         moveq    #38,d0
  166.         lea    AslName,a1
  167.         JSRLIB    OpenLibrary
  168.         move.l    d0,_AslBase
  169.         beq    NoAsl
  170.  
  171.         moveq    #37,d0
  172.         lea    IconName,a1
  173.         JSRLIB    OpenLibrary
  174.         move.l    d0,_IconBase
  175.         beq    NoIcon
  176.  
  177.         moveq    #0,d0
  178.         lea    SID6581Name,a1
  179.         JSRLIB    OpenLibrary
  180.         move.l    d0,_SID6581Base
  181.  
  182.         lea    CiaResName,a1
  183.         JSRLIB    OpenResource
  184.         move.l    d0,_CiaBase
  185.         beq    NoCiaRes
  186.  
  187.         lea    MiscResName,a1
  188.         JSRLIB    OpenResource
  189.         move.l    d0,_MiscBase
  190.         beq    NoMiscRes
  191.  
  192. ; Locale ÷ffnen und Catalog laden
  193.         move.l    _SysBase,a6
  194.         moveq    #37,d0
  195.         lea    LocaleName,a1
  196.         JSRLIB    OpenLibrary
  197.         move.l    d0,_LocaleBase
  198.         beq    1$
  199.         move.l    d0,a6
  200.         sub.l    a0,a0
  201.         lea    CatalogName,a1
  202.         sub.l    a2,a2
  203.         JSRLIB    OpenCatalogA
  204.         move.l    d0,TheCatalog
  205.  
  206. ; Datenstrukturen lokalisieren
  207. 1$        bsr    Localize
  208.         bsr    Localize6510
  209.  
  210. ; 68020 vorhanden?
  211.         move.l    _SysBase,a0
  212.         move.w    AttnFlags(a0),d0
  213.         btst    #AFB_68020,d0
  214.         beq    No68020Exit
  215.  
  216. ; ScreenMode- und Directory-Requester holen
  217.         move.l    _AslBase,a6
  218.         moveq    #ASL_ScreenModeRequest,d0
  219.         lea    ScreenReqTags,a0
  220.         JSRLIB    AllocAslRequest
  221.         move.l    d0,ScreenRequester
  222.         beq    NoMemExit
  223.  
  224.         moveq    #ASL_FileRequest,d0
  225.         lea    DirReqTags,a0
  226.         JSRLIB    AllocAslRequest
  227.         move.l    d0,DirRequester
  228.         beq    NoMemExit
  229.  
  230. ; Vorgegebene Einstellungen
  231.         move.w    #63,PNormalCycles
  232.         move.w    #23,PBadLineCycles
  233.         move.w    #63,PCIACycles
  234.         clr.w    PJoystick1On
  235.         move.w    #-1,PJoystick2On
  236.         clr.w    PJoystickSwap
  237.         clr.l    PDisplayID
  238.         clr.w    PScreenType
  239.         clr.b    PDir8
  240.         clr.b    PDir9
  241.         clr.b    PDir10
  242.         clr.b    PDir11
  243.         clr.w    PUseSIDCard
  244.         clr.w    KeyboardYZ
  245.         move.w    #-1,PCollisions
  246.         move.w    #-1,PMapSlash
  247.         move.w    #-1,PFastReset
  248.         move.w    #OSCAN_TEXT,POverscan
  249.         move.w    #1,PSkipLatch
  250.  
  251. ; Einstellungen laden
  252.         move.l    _DOSBase,a6
  253.         move.l    #PrefsFileName,d1
  254.         move.l    #MODE_OLDFILE,d2
  255.         JSRLIB    Open
  256.         move.l    d0,d7
  257.         beq    NoEmulPrefs
  258.  
  259.         move.l    d7,d1
  260.         move.l    #ThePrefs,d2
  261.         move.l    #PrefsLength,d3
  262.         JSRLIB    Read
  263.  
  264.         move.l    d7,d1
  265.         JSRLIB    Close
  266. NoEmulPrefs
  267.  
  268. ; Einstellungsfenster darstellen
  269.         clr.w    PrefsFromEmul
  270.         bsr    DoThePrefs
  271.  
  272. ; Einstellungen ⁿbernehmen, wenn OK geklickt, sonst beenden
  273.         tst.l    d7
  274.         beq    Exit
  275.         bsr    SetPrefs
  276.  
  277. ; Dateikram vorbereiten
  278.         jsr    Open1541
  279.         jsr    ChangedIEC
  280.         bsr    IECErrorReq
  281.  
  282. ; Speicher fⁿr alles holen (die unteren Worte mⁿssen mit den C64-Adressen
  283. ; ⁿbereinstimmen, au▀er CharROM)
  284.         move.l    _SysBase,a6
  285.         move.l    #$30000,d0        ;192K
  286.         move.l    #MEMF_ANY|MEMF_CLEAR,d1
  287.         JSRLIB    AllocVec
  288.         move.l    d0,RAMBlock
  289.         beq    NoMemExit
  290.  
  291.         add.l    #$ffff,d0        ;Auf xxxx0000 bringen
  292.         clr.w    d0
  293.         move.l    d0,TheRAM
  294.         add.l    #$11000,d0
  295.         move.l    d0,TheChar        ;yyyy1000
  296.         add.l    #$9000,d0
  297.         move.l    d0,TheBasic        ;yyyya000
  298.         add.l    #$3800,d0
  299.         move.l    d0,TheColor        ;yyyyd800
  300.         add.l    #$0800,d0
  301.         move.l    d0,TheKernal        ;yyyye000
  302.  
  303. ; Opcodes $22 (undefiniert) ab $10000 installieren,
  304. ; fⁿr den Fall, da▀ ein Programm den Wraparound bei $ffff macht
  305.         move.l    TheRAM,a0
  306.         lea    $10000(a0),a0
  307.         moveq    #256/4-1,d0
  308. 1$        move.l    #$22222222,(a0)+
  309.         dbra    d0,1$
  310.  
  311. ; ROMs laden
  312.         move.l    _DOSBase,a6
  313.         move.l    #BasicFileName,d1    ;Basic
  314.         move.l    #MODE_OLDFILE,d2
  315.         JSRLIB    Open
  316.         move.l    d0,d7
  317.         beq    NoBasicExit
  318.         move.l    d0,d1
  319.         move.l    TheBasic,d2
  320.         move.l    #$2000,d3
  321.         JSRLIB    Read
  322.         move.l    d7,d1
  323.         JSRLIB    Close
  324.  
  325.         move.l    #KernalFileName,d1    ;Kernal
  326.         move.l    #MODE_OLDFILE,d2
  327.         JSRLIB    Open
  328.         move.l    d0,d7
  329.         beq    NoKernalExit
  330.         move.l    d0,d1
  331.         move.l    TheKernal,d2
  332.         move.l    #$2000,d3
  333.         JSRLIB    Read
  334.         move.l    d7,d1
  335.         JSRLIB    Close
  336.  
  337.         move.l    #CharFileName,d1    ;Char
  338.         move.l    #MODE_OLDFILE,d2
  339.         JSRLIB    Open
  340.         move.l    d0,d7
  341.         beq    NoCharExit
  342.         move.l    d0,d1
  343.         move.l    TheChar,d2
  344.         move.l    #$1000,d3
  345.         JSRLIB    Read
  346.         move.l    d7,d1
  347.         JSRLIB    Close
  348.  
  349. ; Betriebssystem patchen
  350.         move.l    TheKernal,a0
  351.         move.w    #$f200,$0d40(a0)    ;IECOut
  352.         move.w    #$f201,$0d23(a0)    ;IECOutATN
  353.         move.w    #$f202,$0d36(a0)    ;IECOutSec
  354.         move.w    #$f203,$0e13(a0)    ;IECIn
  355.         move.w    #$f204,$0def(a0)    ;IECSetATN
  356.         move.w    #$f205,$0dbe(a0)    ;IECRelATN
  357.         move.w    #$f206,$0dcc(a0)    ;IECTurnaround
  358.         move.w    #$f207,$0e03(a0)    ;IECRelease
  359.         bsr    PatchReset
  360.  
  361. ; Bildschirm ÷ffnen
  362.         jsr    OpenGraphics
  363.         cmp.l    #1,d0
  364.         beq    NoScreenExit
  365.         cmp.l    #2,d0
  366.         beq    NoMemExit
  367.         cmp.l    #3,d0
  368.         beq    NoEGSExit
  369.         cmp.l    #4,d0
  370.         beq    NoVilIntuiExit
  371.         cmp.l    #5,d0
  372.         beq    NoDisplayIDExit
  373.         cmp.l    #6,d0
  374.         beq    ScrTooSmallExit
  375.         cmp.l    #7,d0
  376.         beq    NoCyberGfxExit
  377.         cmp.l    #8,d0
  378.         beq    NoCyberModeExit
  379.  
  380. ; Alles initialisieren
  381.         jsr    Reset6526
  382.         jsr    Reset6581
  383.         jsr    Init6510
  384.  
  385. ; 6510 starten
  386.         jsr    Start6510
  387.         tst.l    d0
  388.         bne    NoMemExit
  389.  
  390. ; Auf Mausklick warten
  391.         jsr    WaitForClick
  392.  
  393. ; Programm beenden
  394.         bra    Exit
  395.  
  396. *
  397. * Fehlerbehandlung/Beenden
  398. *
  399.  
  400.         MACHINE    68000
  401.  
  402. No68020Exit    moveq    #MSG_NO68020,d0
  403.         lea    TheLocale,a0
  404.         jsr    GetString
  405.         lea    ErrorReq,a1
  406.         move.l    d0,es_TextFormat(a1)
  407.         sub.l    a0,a0
  408.         sub.l    a2,a2
  409.         sub.l    a3,a3
  410.         move.l    _IntuitionBase,a6
  411.         JSRLIB    EasyRequestArgs
  412.         bra    NoCiaRes
  413.  
  414.         MACHINE    68020
  415.  
  416. NoMemExit    moveq    #MSG_NOMEM,d0
  417.         bra    ReqExit
  418.  
  419. NoScreenExit    moveq    #MSG_NOSCREEN,d0
  420.         bra    ReqExit
  421.  
  422. NoEGSExit    moveq    #MSG_NOEGS,d0
  423.         bra    ReqExit
  424.  
  425. NoVilIntuiExit    moveq    #MSG_NOVILINTUI,d0
  426.         bra    ReqExit
  427.  
  428. NoCyberGfxExit    moveq    #MSG_NOCYBERGFX,d0
  429.         bra    ReqExit
  430.  
  431. NoDisplayIDExit    moveq    #MSG_NODISPLAYID,d0
  432.         bra    ReqExit
  433.  
  434. NoCyberModeExit    moveq    #MSG_NOCYBERMODE,d0
  435.         bra    ReqExit
  436.  
  437. ScrTooSmallExit    moveq    #MSG_SCRTOOSMALL,d0
  438.         bra    ReqExit
  439.  
  440. NoKernalExit    moveq    #MSG_NOKERNAL,d0
  441.         bra    ReqExit
  442.  
  443. NoBasicExit    moveq    #MSG_NOBASIC,d0
  444.         bra    ReqExit
  445.  
  446. NoCharExit    moveq    #MSG_NOCHAR,d0
  447.  
  448. ReqExit        lea    TheLocale,a0
  449.         jsr    GetString
  450.         lea    ErrorReq,a1
  451.         move.l    d0,es_TextFormat(a1)
  452.         sub.l    a0,a0
  453.         sub.l    a2,a2
  454.         sub.l    a3,a3
  455.         move.l    _IntuitionBase,a6
  456.         JSRLIB    EasyRequestArgs
  457.  
  458. Exit        jsr    Stop6510
  459.         jsr    Reset6581    ;Stoppt diesen LΣrm!
  460.         jsr    CloseSID
  461.         jsr    CloseGraphics
  462.         jsr    CloseIEC
  463.         jsr    Close1541
  464.  
  465.         move.l    _SysBase,a6