home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / LINEOUT / DELTA.ZIP / DELTASRC.ZIP / DELTA.SRC / DEMO.S < prev    next >
Text File  |  2003-01-04  |  16KB  |  884 lines

  1. ;                        //==========================\\
  2. ;                       //|  demo part handler 1.0   |\\
  3. ;                       \\|    24-08-2002 by earx    |//
  4. ;                        \\==========================//
  5. ;
  6. ;                                falcon030 only
  7. ; beware: only 3 screenbuffers
  8.  
  9. ;======= GLOBAL EQUATES ========
  10.  
  11. DEMO_SYSTEM:                    ; Indicates demosystem is active.
  12. testmode:    =    0            ; debug mode
  13.  
  14. MAX_SCREENSIZE:    =    320*200*2
  15.  
  16. ; monitormode-equates
  17. autodetect:    =    0
  18. rgb50:        =    1            ; RGB/TV, 50Hz
  19. vga60:        =    2            ; VGA, 60, noninterlaced
  20. vga100:        =    3            ; VGA, 100Hz, interlaced
  21. ; monitormode selector ( =autodetect ) or force mode ( >0 )
  22. monitorequ:    =    autodetect
  23.  
  24. Part.INIT:    =    0
  25. Part.START:    =    4
  26. Part.STOP:    =    8
  27.  
  28. ;======= ASM OPTIONS AND PATHS ========
  29.  
  30.     COMMENT    HEAD=%111
  31.     OPT    P=68030
  32.     IFEQ    testmode
  33.     OPT    D-
  34.     ENDC
  35.  
  36. ;======= INCLUDES ========
  37.  
  38.     bra.l    START
  39.  
  40.     INCLUDE    SYS.I
  41.     TEXT
  42.     INCLUDE    MEM.I
  43.     TEXT
  44.     INCLUDE    MATH.I
  45.     TEXT
  46.     INCLUDE    DEPACK35.S
  47.     INCLUDE    FSCR2.I
  48.     TEXT
  49.     INCLUDE    DSP_FIX.S
  50.     TEXT
  51. ;    INCLUDE    DSP.I
  52.     INCLUDE    TEXTURE.I
  53.     TEXT
  54.     INCLUDE    EARXPLAO.S
  55.     TEXT
  56.     INCLUDE    SFLY_DSP.S            ; Include the CPU-DSP engine.
  57.     TEXT
  58.     INCLUDE    OBJECT3D.I
  59.     TEXT
  60.     INCLUDE    TUNNEL.I
  61.     TEXT
  62.     INCLUDE    FONT.I
  63.     TEXT
  64.  
  65. ;======= INITIALISING ========
  66.  
  67. START:
  68. ; Give back some mem to the system..
  69.     move.l    $04(sp),a5            ; mshrink
  70.     move.l    $0C(a5),d0
  71.     add.l    $14(a5),d0
  72.     add.l    $1C(a5),d0
  73.     addi.l    #$00001000,d0
  74.     move.l    a5,d1
  75.     add.l    d0,d1
  76.     andi.b    #%11111110,d1            ; even address
  77.     move.l    d1,sp
  78.     move.l    d0,-(sp)
  79.     move.l    a5,-(sp)
  80.     move.w    d0,-(sp)
  81.     move.w    #$4a,-(sp)
  82.     trap    #1
  83.     lea    12(sp),sp
  84.  
  85. ; mxalloc - Reserve stram ONLY for screens.
  86.     move.w    #0,-(sp)
  87.     move.l    #MAX_SCREENSIZE*3+256,-(sp)    ; size of screens..
  88.     move.w    #$44,-(sp)
  89.     trap    #1
  90.     addq    #8,sp
  91.     tst.l    d0                ; Check if there is ST-RAM enough.
  92.     bgt.s    .ramok
  93. ; Not enough ST-RAM free :(
  94.     clr.w    -(sp)
  95.     trap    #1
  96.  
  97. ; Initialize screenaddresses..
  98. .ramok    lea    scr,a0
  99.     addi.l    #15,d0                ; / long even
  100.     andi.b    #%11110000,d0            ; \ address..
  101.     move.l    d0,(a0)+
  102.     addi.l    #MAX_SCREENSIZE,d0
  103.     move.l    d0,(a0)+
  104.     addi.l    #MAX_SCREENSIZE,d0
  105.     move.l    d0,(a0)+
  106.  
  107. ; Calculate sine table.
  108.     lea    sine_tbl,a0
  109.     Init_SineTable
  110.  
  111.     IFNE    monitorequ-autodetect
  112.     move.w    #monitorequ,monitormode
  113.     ELSE
  114.     bsr.l    getSettings
  115.     tst.w    d0
  116.     bmi.l    exit
  117.     ENDC
  118.  
  119. ; Set supervisormode and save old stackpointer..
  120.     clr.l    -(sp)
  121.     move.w    #32,-(sp)
  122.     trap    #1
  123.     addq    #6,sp
  124.     move.l    d0,oldsp
  125.     move.l    #ustk,sp            ; Install own stack..
  126.  
  127. ; Save old screenaddress..
  128.     move.w    #2,-(sp)
  129.     trap    #14
  130.     addq    #2,sp
  131.     move.l    d0,oldscr
  132.  
  133. ; Falcon check..
  134.     move.l    $05A0.w,a0
  135.     tst.l    a0
  136.     beq.l    exit
  137. .fndmch    cmpi.l    #"_MCH",(a0)
  138.     beq.s    .found
  139.     addq    #8,a0
  140.     bra.s    .fndmch
  141. .found    cmpi.w    #3,4(a0)
  142.     bne.l    exit
  143.  
  144. ; Initialize libs..
  145.     bsr.l    System.init
  146.     bsr    setDot
  147.     bsr.l    Mem.init
  148.     bsr    setDot
  149.     bsr.l    Tunnel.genOffsetMap
  150.     bsr    setDot
  151.     bsr.l    Tunnel.calcFlareOctant
  152.     bsr    setDot
  153.     bsr.l    FlareGen.init
  154.     bsr    setDot
  155.     bsr.l    Texture.makeDefaults
  156.     bsr    setDot
  157.     bsr.l    Font.init
  158.     bsr    setDot
  159.  
  160. ; Call parts to initialize all their screens..
  161.     bsr.l    initParts
  162.     tst.l    d0
  163.     bmi.l    exit
  164.     bsr    setDot
  165.  
  166. ; Initialize intro..
  167.     movea.l    Intro.table+4,a1
  168.     jsr    (a1)
  169.     tst.l    d0
  170.     bmi.l    exit
  171.     bsr    setDot
  172. ; Initialize menuscreen..
  173.     movea.l    Menu.table+4,a1
  174.     jsr    (a1)
  175.     tst.l    d0
  176.     bmi.l    exit
  177.     bsr    setDot
  178.  
  179. ; Reserve enough mem for all fx.
  180.     bsr.l    Mem.take
  181.     tst.l    d0
  182.     beq.l    exit
  183.  
  184. ; Save and install nasty interrupts..
  185.     IFEQ    testmode
  186.     move.b    $0484.w,old484
  187.     clr.b    $0484.w
  188. ; Save falcon-pallette..
  189.     bsr.l    SAVE_FALCPAL
  190. ; Save resolution..
  191.     bsr.l    SAVE_FV
  192. ; Install own vbl-routine..
  193.     move    #$2700,sr
  194.     move.l    $0070.w,oldvbl
  195.     move.l    #NEWVBL,$70.w
  196.     move    #$2300,sr
  197.  
  198. ; Initialize mod-player.
  199.     moveq    #2,d0                ; 33KHz
  200. ;    moveq    #1,d0                ; 49KHz
  201.     bsr.l    EarxPlay.init
  202.     tst.l    d0
  203.     bmi.l    return2tos
  204.  
  205. ; Black out palette..
  206.     lea    $FFFF9800.w,a0
  207.     clr.l    d0
  208.     clr.b    d1
  209. .loop:    move.l    d0,(a0)+
  210.     addq.b    #1,d1
  211.     bne.s    .loop
  212.     ENDC                    ; IFEQ testmode
  213.  
  214. ; Show intro..
  215.     bsr.l    showIntro
  216.  
  217. ; Show menu, request part...
  218. showMenu:
  219.     bsr.l    showActualMenu
  220.     move.w    d0,partNum
  221.  
  222. ; Set the demo to selected part.
  223.     move.w    partNum,d0
  224.     bsr.l    setPart
  225.  
  226. ; Reset framecounters, timers.
  227.     clr.l    d0
  228.     move.l    d0,frmcnt
  229.     move.l    d0,lastframecount
  230.     move.l    $04BA.w,starttime
  231.  
  232. mainloopcycle:
  233.  
  234.     IFNE    0
  235.  
  236. ; Test if a key is pressed.
  237.     move.w    #$B,-(sp)
  238.     trap    #1
  239.     addq    #2,sp
  240.     tst.w    d0
  241.     beq.s    .key_done
  242. ; Read the waiting char.
  243.     move.w    #1,-(sp)
  244.     trap    #1
  245.     addq    #2,sp
  246.     swap    d0
  247.  
  248.     ELSE
  249.  
  250.     move.b    $FFFFFC02.w,d0
  251.  
  252.     ENDC
  253.  
  254.     cmpi.b    #$39,d0
  255.     beq.l    showMenu
  256.     cmpi.b    #$72,d0
  257.     bne.s    .no_skip
  258.     bsr.l    EarxPlay.nextPos
  259. .no_skip:
  260.  
  261. .key_done:
  262.     movea.l    actScreenAdr,a0
  263.     tst.l    a0
  264.     beq.s    .do
  265.     movea.l    (a0),a1
  266.     jsr    (a1)                ; execute main-rout of screen
  267. .do:    addq.l    #1,frmcnt
  268.     bsr.l    handleDemoEvents
  269.     bra.s    mainloopcycle
  270.  
  271. setDot:    move.w    #".",-(sp)
  272.     move.w    #2,-(sp)
  273.     trap    #1
  274.     addq    #4,sp
  275.     rts
  276.  
  277. ;======= INCLUDED PARTS ========
  278.  
  279. partTable:
  280.     DC.L    alphaRoutTable
  281.     DC.L    betaRoutTable
  282.     DC.L    gammaRoutTable
  283.     DC.L    0
  284.  
  285. alphaRoutTable:
  286.     INCLUDE    ALPHA_P.S
  287.     TEXT
  288. betaRoutTable:
  289.     INCLUDE    BETA_P.S
  290.     TEXT
  291. gammaRoutTable:
  292.     INCLUDE    GAMMA_P.S
  293.     TEXT
  294.  
  295. ; A dark intermezzo.
  296.     INCLUDE    BLACK.SO
  297.     INCLUDE    INTRO.SO
  298.     TEXT
  299.     INCLUDE    MENU2.SO
  300.     TEXT
  301.  
  302. ;======= EXITTING CODE ========
  303.  
  304. return2tos:
  305. OUT:
  306.     IFEQ    testmode
  307.  
  308. ; Stop current part..
  309. ;    move.w    partNum,d0
  310. ;    movea.l    (partTable,d0.w*4),a0
  311. ;    movea.l    Part.STOP(a0),a0
  312. ;    jsr    (a0)
  313.  
  314. exitMenu:
  315.     bsr.l    EarxPlay.stop
  316.     bsr.l    EarxPlay.deinit
  317.  
  318. ; Restore interrupts..
  319.     move.l    oldvbl,$70.w
  320.  
  321. ; Restore video..
  322.     lea    save_fv,a0
  323.     bsr.l    CHANGE_FVFAST
  324.     bsr.l    RESTORE_FALCPAL
  325.  
  326. ; Restore screen..
  327.     move.l    oldscr,d0
  328.     move.l    d0,d1
  329.     lsr.w    #8,d0
  330.     move.l    d0,$ffff8200.w
  331.     move.b    d1,$ffff820d.w
  332.  
  333. ; Restore keyboard sound..
  334.     move.b    old484,$0484.w
  335.  
  336.     ENDC                    ; IFEQ testmode
  337.  
  338.     bsr.l    dsp_load_bootstrap
  339.  
  340. exit:    clr.w    -(sp)
  341.     trap    #1
  342.  
  343. ;======= DEMO-OS SUBROUTINES ========
  344.  
  345.         RSRESET
  346. Option.XPOS:    RS.B    1
  347. Option.YPOS:    RS.B    1
  348. Option.CHAR:    RS.B    1
  349.  
  350. Keycode.ESCAPE:    =    27        ; escape
  351. Keycode.RGB_50:    =    "1"
  352. Keycode.VGA_100:=    "2"
  353. Keycode.VGA_60:    =    "3"
  354. Keycode.DETAIL:    =    "d"
  355.  
  356. ; OUTPUT:
  357. ; d0.w:    0=Run demo, -1=Exit demo
  358. getSettings:
  359.     bsr    paintSelector
  360.  
  361. .repaint:
  362.     tst.w    detail
  363.     beq.s    .set_wtext
  364.     pea    .detailb_txt(pc)
  365.     bra.s    .paint_detail
  366. .set_wtext:
  367.     pea    .detailw_txt(pc)
  368. .paint_detail:
  369.     move.w    #9,-(sp)
  370.     trap    #1
  371.     addq    #6,sp
  372.  
  373. ; Read a key from the console into d0.
  374. .get_newkey:
  375.     move.w    #8,-(sp)
  376.     trap    #1
  377.     addq    #2,sp
  378. ; d0.b: result keycode
  379.  
  380.     cmpi.b    #Keycode.ESCAPE,d0
  381.     beq.s    .exit
  382.     cmpi.b    #Keycode.RGB_50,d0
  383.     beq.s    .set_rgb50
  384.     cmpi.b    #Keycode.VGA_100,d0
  385.     beq.s    .set_vga100
  386.     cmpi.b    #Keycode.VGA_60,d0
  387.     beq.s    .set_vga60
  388.     cmpi.b    #Keycode.DETAIL,d0
  389.     beq.s    .switch_detail
  390.     bra.s    .get_newkey
  391.  
  392. .set_rgb50:
  393.     move.w    #rgb50,monitormode
  394.     bra.s    .proceed
  395. .set_vga100:
  396.     move.w    #vga100,monitormode
  397.     bra.s    .proceed
  398. .set_vga60:
  399.     move.w    #vga60,monitormode
  400.     bra.s    .proceed
  401. .switch_detail:
  402.     not.w    detail
  403.     bra.s    .repaint
  404.  
  405. .proceed:
  406.     moveq    #0,d0
  407.     rts
  408. .exit:    moveq    #-1,d0
  409.     rts
  410.  
  411. .detailw_txt:
  412.     DC.B    27,89,32+11,32+18,"detail",27,89,32+13,32+15,0
  413. .detailb_txt:
  414.     DC.B    27,89,32+11,32+18,27,112,"detail",27,113,27,89,32+13,32+15,0
  415.     EVEN
  416.  
  417. paintSelector:
  418.     pea    selector_txt
  419.     move.w    #9,-(sp)
  420.     trap    #1
  421.     addq    #6,sp
  422.     rts
  423.  
  424. ; Run the intro..
  425. showIntro:
  426.     clr.l    d0
  427.     move.l    d0,frmcnt
  428.     move.l    d0,lastframecount
  429.     move.l    $04BA.w,starttime
  430.  
  431. .intro_loop:
  432. ; Test if a key is pressed.
  433.     move.w    #$B,-(sp)
  434.     trap    #1
  435.     addq    #2,sp
  436.     tst.w    d0
  437.     beq.s    .no_introkey_waiting
  438.  
  439. ; Read the waiting char.
  440.     move.w    #7,-(sp)
  441.     trap    #1
  442.     addq    #2,sp
  443.  
  444.     cmpi.b    #' ',d0
  445.     beq    .intro_done
  446.  
  447. .no_introkey_waiting:
  448.     move.l    $04BA.w,d0
  449.     sub.l    starttime,d0
  450.     cmpi.l    #100,d0
  451.     blt.s    .intro_events_done
  452.     cmpi.l    #700+400,d0
  453.     blt.s    .try_crew_logo
  454.     cmpi.l    #1300+400,d0
  455.     blt.s    .try_presents
  456.     cmpi.l    #2000+400,d0
  457.     bge.s    .intro_done
  458.  
  459. .try_delta:
  460.     tst.w    .delta_shown(pc)
  461.     bne.s    .intro_events_done
  462.     st    .delta_shown
  463.     movea.l    Intro.table+4*5,a1
  464.     jsr    (a1)
  465.     bra.s    .intro_events_done
  466.  
  467. .try_presents:
  468.     tst.w    .presents_shown(pc)
  469.     bne.s    .intro_events_done
  470.     st    .presents_shown
  471.     movea.l    Intro.table+4*4,a1
  472.     jsr    (a1)
  473.     bra.s    .intro_events_done
  474.  
  475. .try_crew_logo:
  476.     tst.w    .crew_shown(pc)
  477.     bne.s    .intro_events_done
  478.     st    .crew_shown
  479.     movea.l    Intro.table+4*3,a1
  480.     jsr    (a1)
  481.  
  482. .intro_events_done:
  483.     movea.l    Intro.table,a1
  484.     jsr    (a1)
  485.     addq.l    #1,frmcnt
  486.     bra    .intro_loop
  487.  
  488. .intro_done:
  489.     rts
  490.  
  491. .crew_shown:
  492.     DC.W    0
  493. .presents_shown:
  494.     DC.W    0
  495. .delta_shown:
  496.     DC.W    0
  497.  
  498. ; Shows a nice graphic delta menu..
  499. ; OUPUT:
  500. ; d0.w= partnumber
  501. showActualMenu:
  502.     bsr.l    EarxPlay.stop
  503.     clr.l    d0
  504.     move.w    d0,.options_shown
  505.     move.w    d0,.logo_shown
  506.     move.l    d0,frmcnt
  507.     move.l    d0,lastframecount
  508.     move.l    $04BA.w,starttime
  509.  
  510. .menu_loop:
  511. ; Test if a key is pressed.
  512.     move.w    #$B,-(sp)
  513.     trap    #1
  514.     addq    #2,sp
  515.     tst.w    d0
  516.     beq.s    .no_char_waiting
  517.  
  518. ; Read the waiting char.
  519.     move.w    #7,-(sp)
  520.     trap    #1
  521.     addq    #2,sp
  522.  
  523.     cmpi.b    #27,d0                ; escape
  524.     beq    exitMenu
  525.     ori.b    #$20,d0
  526.     cmpi.b    #'a',d0
  527.     beq.s    .a_key
  528.     cmpi.b    #'b',d0
  529.     beq.s    .b_key
  530.     cmpi.b    #'c',d0
  531.     beq.s    .c
  532.  
  533. .no_char_waiting:
  534.     move.l    $04BA.w,d0
  535.     sub.l    starttime,d0
  536.     cmpi.l    #400,d0
  537.     blt.s    .end_menu_event
  538.     tst.w    .logo_shown(pc)
  539.     bne.s    .end_logo_stuff
  540.     st    .logo_shown
  541.     movea.l    Menu.table+4*3,a1
  542.     jsr    (a1)
  543.     bra.s    .end_menu_event
  544. .end_logo_stuff:
  545.     cmpi.l    #600,d0
  546.     blt.s    .end_menu_event
  547.     tst.w    .options_shown(pc)
  548.     bne.s    .end_options_stuff
  549.     st    .options_shown
  550.     movea.l    Menu.table+4*5,a1
  551.     jsr    (a1)
  552. .end_options_stuff:
  553. .end_menu_event:
  554.  
  555.     movea.l    Menu.table,a1
  556.     jsr    (a1)
  557.     addq.l    #1,frmcnt
  558.     bra.w    .menu_loop
  559.  
  560. .a_key:    moveq    #0,d0
  561.     bra.s    .blink_it
  562. .b_key:    moveq    #1,d0
  563.     bra.s    .blink_it
  564. .c:    moveq    #2,d0
  565. ;    bra.s    .blink_it
  566. .blink_it:
  567.     move.w    d0,-(sp)
  568.     bsr.l    Menu.setBlinking
  569.     move.w    (sp)+,d0
  570.     rts
  571.  
  572. .logo_shown:
  573.     DC.W    0
  574. .options_shown:
  575.     DC.W    0
  576.  
  577. ; Initializes all parts.
  578. ; OUTPUT:
  579. ; d0.l: =0: success, <0: error
  580. initParts:
  581.     lea    partTable,a0
  582.     lea    partInfoTable,a2
  583.     clr.w    numParts
  584.  
  585. .loop:    movea.l    (a0)+,a1
  586.     tst.l    a1
  587.     beq.s    .end
  588. ; a1: part's rout table
  589.     movea.l    Part.INIT(a1),a1        ; a1: part's init rout
  590.     movem.l    a0/a2,-(sp)
  591.     jsr    (a1)
  592.     move.l    a0,d1
  593.     move.l    a1,d2
  594.     movem.l    (sp)+,a0/a2
  595.     tst.l    d0
  596.     bmi.s    .abort
  597.     move.l    d1,(a2)+
  598.     move.l    d2,(a2)+
  599.     addq.w    #1,numParts
  600.     bra.s    .loop
  601.  
  602. .end:    clr.l    d0
  603. .abort:    rts
  604.  
  605. ; Initializes a part's screens.
  606. ; INPUT:
  607. ; a0: part's screentable
  608. ; OUTPUT:
  609. ; d0.l: =0: success, <0: error
  610. initScreens:
  611.     addq    #4,a0                ; a0: first object-pointer
  612.  
  613. ; Count screens..
  614.     movea.l    a0,a6
  615.       moveq    #-1,d0
  616. .countloop:
  617.     addq.w    #1,d0
  618.     tst.l    (a6)+
  619.     bne.s    .countloop
  620.  
  621. ; If 0 screens in part, abort.
  622.     tst.w    d0
  623.     beq.s    .abort
  624.  
  625. ; Initialize screens.
  626.     clr.l    d0                ; d0.w: screencounter
  627.  
  628. .loop:    ;cmpi.b    #$39,$FFFFFC02.w
  629.     ;beq    .abort
  630.  
  631.     movea.l    (a0)+,a1            ; a1: screen's rout-table
  632.     tst.l    a1
  633.     beq.s    .end
  634.     move.l    4(a1),a1            ; a1: screen's init-rout
  635.  
  636.     move.w    d0,-(sp)
  637.     move.l    a0,-(sp)
  638.     jsr    (a1)                ; Execute to screen's initialization.
  639.     move.l    d0,d1
  640.     movea.l    (sp)+,a0
  641.     move.w    (sp)+,d0
  642.     tst.l    d1                ; Screen init failed?
  643.     bmi.s    .abort
  644.  
  645.     addq.w    #1,d0                ; Increase counter.
  646.     bra.s    .loop
  647.  
  648. .end:    rts
  649.  
  650. .abort:    moveq    #-1,d0
  651.     rts
  652.  
  653. ; Counts a part's event-subroutines for every screen.
  654. ; INPUT:
  655. ; a0: part's screentable
  656. ; a1: dst. subevent count table
  657. countSubFx:
  658.     addq    #1,a1
  659.     lea    4(a0),a2
  660.  
  661. .countloop:
  662.     movea.l    (a2)+,a3
  663.     tst.l    a3
  664.     beq.s    .endcounting
  665.     moveq    #-1,d1
  666.  
  667. .incountloop:
  668.     addq.w    #1,d1
  669.     tst.l    (a3)+
  670.     bne.s    .incountloop
  671.  
  672.     move.b    d1,(a1)+
  673.     bra.s    .countloop
  674.  
  675. .endcounting:
  676.     rts
  677.  
  678. ; Sets the demo to a specified part.
  679. ; INPUT:
  680. ; d0.w= part number
  681. setPart:cmp.w    numParts,d0
  682.     blt.s    .ok
  683.     move.l    #showMenu,(sp)            ; If last part done, return to menu.
  684.     rts
  685.  
  686. .ok:    move.w    d0,partNum            ; If it's a legal part, set it.
  687.  
  688. ; Temporary blindness.
  689.     move.l    #Darkness.table,actScreenAdr
  690.     move.l    frmcnt,lastframecount
  691.  
  692. ; Start the part.
  693.     lea    partInfoTable,a0
  694.     move.l    (a0,d0.w*8),actPartAdr
  695.     move.l    4(a0,d0.w*8),subEffectTableAdr
  696.     movea.l    (partTable,d0.w*4),a0
  697.     movea.l    Part.START(a0),a0
  698.     jsr    (a0)
  699.     move.w    d0,screenCount
  700.     bmi    return2tos
  701.     rts
  702.  
  703. ; Processes one new event from the eventlist.
  704. ; PRE:
  705. ; - subeffects_tbl contains number of routs for each fx.
  706. ; - screenCount = number of fx in table
  707. handleDemoEvents:
  708.  
  709. .loop:
  710. ; Get command from modplayer..
  711.     bsr.l    EarxPlay.getSyncInfo
  712.  
  713.     cmpi.b    #255,d0
  714.     beq    .end                ; no new command -> do nothing
  715.  
  716.     tst.b    d0
  717.     beq.s    .next_part            ; end command -> next part
  718.  
  719.     btst    #7,d0                ; test intern indicator
  720.     bne.s    .intern
  721.  
  722. ; Activate new effect.
  723.     movea.l    actPartAdr,a1
  724.     andi.w    #$007F,d0
  725.     cmp.w    screenCount,d0
  726.     bgt    .end                ; fx-index >= #fx, error
  727.     move.w    d0,actScreenNum            ; Set fx-number.
  728.     move.l    (a1,d0.w*4),actScreenAdr    ; Set new fx-base.
  729.     move.l    frmcnt,lastframecount        ; Store time of this fx-change.
  730.  
  731.     bra.s    .loop
  732.  
  733. ; Call a routine in the current effect.
  734. .intern:andi.w    #$007F,d0            ; Mask out indicator, d0.w=fx index
  735.     movea.l    subEffectTableAdr,a2
  736.     move.w    actScreenNum,d1
  737.     move.b    (a2,d1.w),d1            ; d1.w=#fx-routs
  738.     cmp.w    d1,d0
  739.     bge.s    .end                ; fx-rout-index >= #fx-routs, error
  740.     movea.l    actScreenAdr,a0
  741.     movea.l    (a0,d0.w*4),a0
  742.     jsr    (a0)                ; Call fx-subroutine.
  743.  
  744.     bra.s    .loop
  745.  
  746. ; Start the next part, if any.
  747. ; pre: a part is running.
  748. .next_part:
  749.     move.w    partNum,d0
  750.     addq.w    #1,d0
  751.     bsr.w    setPart
  752.  
  753. .end:    rts
  754.  
  755. ; INPUT:
  756. ; a0: filename
  757. playMod:
  758. ; fopen
  759.     clr.w    -(sp)
  760.     move.l    a0,-(sp)
  761.     move.w    #$3D,-(sp)
  762.     trap    #1
  763.     addq    #8,sp
  764.  
  765.     tst.l    d0
  766.     blt.s    .fin                ; d0.w=handle
  767.     move.l    d0,d6
  768.  
  769. ; fread
  770.     pea    mod
  771.     move.l    #-1,-(sp)
  772.     move.w    d6,-(sp)
  773.     move.w    #$3F,-(sp)
  774.     trap    #1
  775.     lea    12(sp),sp
  776.  
  777. ; fclose
  778.     move.w    d6,-(sp)
  779.     move.w    #$3E,-(sp)
  780.     trap    #1
  781.     addq    #4,sp
  782.  
  783. ; Decrunch the file using atomik. If not packed nothing happens.
  784.     lea    mod,a0
  785.     bsr.l    depack
  786.  
  787.     IFEQ    testmode
  788.     lea    mod,a0
  789.     bsr.l    EarxPlay.play
  790.     ENDC
  791.  
  792. .fin:    rts                    ; d0.l=resultcode
  793.  
  794. ;======= INTERRUPTS ========
  795.  
  796. NEWVBL:    addq.l    #1,$0466.w
  797.     movem.l    d0-a6,-(sp)
  798.     bsr.l    Screen.update
  799.     move.l    vbl_gfx(pc),a0
  800.     jsr    (a0)
  801.     movem.l    (sp)+,d0-a6
  802.     rte
  803.  
  804. vbl_gfx:DC.L    rts
  805.  
  806. rts:    rts
  807.  
  808. ;======= DATA + INCBINS ========
  809.  
  810.     DATA
  811.  
  812. selector_txt:
  813.     DC.B    27,72
  814.     DC.B    "........................................",$a,$d
  815.     DC.B    "|                                      |",$a,$d
  816.     DC.B    "|      . .   //\                       |",$a,$d
  817.     DC.B    "|           //  \                      |",$a,$d
  818.     DC.B    "|        . //    \                     |",$a,$d
  819.     DC.B    "|    .  . //______\..e..l..t..a.. .    |",$a,$d
  820.     DC.B    "|                                      |",$a,$d
  821.     DC.B    "|   ..b..y.....l..i..n..e..o..u..t..   |",$a,$d
  822.     DC.B    "|                                      |",$a,$d
  823.     DC.B    "|   1.rgb50 2.vga100 3.vga60 esc.exit  |",$a,$d
  824.     DC.B    "|                                      |",$a,$d
  825.     DC.B    "|               d.detail               |",$a,$d    ; 19,11, len=6
  826.     DC.B    "|                                      |",$a,$d
  827.     DC.B    "!.............[          ].............!",$a,$d
  828.     DC.B    0
  829.     EVEN
  830.  
  831. ;======= RESERVES ========
  832.  
  833.     BSS
  834.  
  835. ; Init-data
  836.     DS.L    256
  837. ustk:    DS.L    1
  838. oldsp:    DS.L    1
  839. oldscr:    DS.L    1
  840. oldvbl:    DS.L    1
  841. old484:    DS.W    1
  842. old468:    DS.W    1
  843. fvbuf:    DS.W    24
  844.  
  845. sine_tbl:
  846.     DS.L    sintbllen
  847.  
  848. ; Stats shit
  849. monitormode:
  850.     DS.W    1
  851. detail:    DS.W    1
  852.  
  853. ; Object handling
  854. numParts:
  855.     DS.W    1                    ; #parts in demo
  856. partNum:DS.W    1                    ; current part
  857. screenCount:
  858.     DS.W    1                    ; #screens in current part
  859. actScreenNum:
  860.     DS.W    1                    ; selected screen
  861. actScreenAdr:
  862.     DS.L    1                    ; Points to current screen.
  863. actPartAdr:
  864.     DS.L    1                    ; Points to current part.
  865. subEffectTableAdr:
  866.     DS.L    1                    ; Points to current part's sub-effect counttable
  867. partInfoTable:
  868.     DS.L    2*3                    ; 3 parts (screentbl ptr, counttable ptr)
  869.  
  870. ; Counter and timer shit
  871. frmcnt:    DS.L    1                    ; #frames animated
  872. lastframecount:
  873.     DS.L    1                    ; #frames animated when current screen started
  874. starttime:
  875.     DS.L    1
  876.  
  877. ; Key vars.
  878. keycode:DS.W    1
  879.  
  880. ; Scr-stuff
  881. scr:    DS.L    3
  882.  
  883. mod:    DS.B    530000                    ; max(mod1,mod2,mod3)