home *** CD-ROM | disk | FTP | other *** search
/ Audio 4.94 - Over 11,000 Files / audio-11000.iso / msdos / modplay / vtglobe / globesrc.arj / GLOBE.ASM < prev    next >
Assembly Source File  |  1993-05-31  |  15KB  |  616 lines

  1. ; ------------------------------ GLOBE.ASM ------------------------------
  2. ; Bye Jare of VangeliSTeam. Want more comments? Write'em. O:-)
  3. ; -----------------------------------------------------------------------
  4. ;   Slightly inspired (that is, absolutely copied) from the Globe ST demo
  5. ; by Axel of XXX International (coded back in September 16th in 1989).
  6. ; -----------------------------------------------------------------------
  7. ;   Do anything you want with this source, but NEVER say it's yours. That
  8. ; would be a lie, so there you are. If you use it please DO credit me. If
  9. ; you write another version DO credit Axel. If  you like it, write to us;
  10. ; it would be nice to know.
  11. ; -----------------------------------------------------------------------
  12.  
  13. ; ----- Configuration of the execution. ---------
  14. TRACE   = 0
  15. FILECFG = 0
  16.  
  17.  ; ------- Values that control the appearance of the intro. -------
  18.  
  19. MAXDIAM = 198
  20. ANGLEDIVISOR = 6
  21. ANGLEINC = 1 SHL (ANGLEDIVISOR - 3)
  22.  
  23. MULTPTS = 8
  24. NUMPTS  = MULTPTS*32
  25.  
  26. FRAMESPERCFG = 70*5
  27.  
  28.  ; --- This is the best profiler ever written, if you know what I mean. ---
  29.  
  30. SetBorder MACRO r,g,b
  31.   IF TRACE
  32.         MOV     DX,3C8h
  33.         XOR     AL,AL
  34.         OUT     DX,AL
  35.         INC     DX
  36.       IFDIF <&r>,<0>
  37.         MOV     AL,&r
  38.       ENDIF
  39.         OUT     DX,AL
  40.       IFDIF <&g>,<&r>
  41.         MOV     AL,&g
  42.       ENDIF
  43.         OUT     DX,AL
  44.       IFDIF <&b>,<&g>
  45.         MOV     AL,&b
  46.       ENDIF
  47.         OUT     DX,AL
  48.   ENDIF
  49. ENDM
  50.  
  51.         .MODEL SMALL
  52.         .STACK 400
  53.         DOSSEG
  54.         LOCALS
  55.  
  56.         .DATA
  57.  
  58. ; ------------ Cosinus table, and Sin() and Cos() neat macros. ----------
  59.  
  60. CosTbl LABEL WORD
  61.         INCLUDE COSTBL.INC
  62.  
  63. Cos MACRO dest
  64.         SHR     BX,ANGLEDIVISOR
  65.         AND     BH,3
  66.         ADD     BX,BX
  67.         MOV     &dest,[CosTbl+BX]
  68. ENDM
  69.  
  70. Sin MACRO dest
  71.         ADD     BH,(1 SHL ANGLEDIVISOR)
  72.         Cos     &dest
  73. ENDM
  74.  
  75.  ; ---------------- These values define completely a configuration. ----
  76.         UDATASEG
  77.  
  78. ActualConfiguration LABEL BYTE
  79. Phi     DW ?
  80. Alp     DW ?
  81. Rho     DW ?
  82.  
  83. IncPhi  DW ?
  84. IncAlp  DW ?
  85. IncRho  DW ?
  86.  
  87. GapPhi  DW ?
  88. GapAlp  DW ?
  89.  
  90. SizeH   DW ?
  91. SizeV   DW ?
  92. CONFIGSIZE = $-OFFSET ActualConfiguration
  93.  
  94.  
  95. Preset  DW ?            ; Actual Preset configuration.
  96.  
  97. ; --------------- Predefined configurations. --------------
  98.  
  99.         .DATA
  100.  
  101. PresetConfigs LABEL BYTE            
  102.         INCLUDE GLOBECFG.INC
  103. SIZEPRESETS = $-OFFSET PresetConfigs
  104.  
  105.  ; ----------------- These other have to be this way at the beginning. ----
  106.  
  107. thisColor DB 15
  108. oldColor  DB 14
  109.  
  110. drawn     DB 0
  111.  
  112. State     DW 0                  ; 0-> Abriendo, ... hasta FRAMESPERCFG
  113. ChngDiameter DW 0               ; Diametro de apertura o cierre.
  114.  
  115.  ; ---------- Nifty nonVGA msg. Perhaps nobody I will ever see it. ----
  116.  
  117. VgaMsg  DB '   Ooohhhhh.... I''m sorry, you need at least a VGA card to run GLOBE.', 13, 10
  118.         DB 'Go buy one, GLOBE is worth the ca$h. ;-)', 13, 10, 10
  119.  
  120.  ; ------------------  And the greetings!!! -------------------
  121.  
  122. ByeMsg LABEL BYTE
  123.         INCLUDE GLOBEGRT.INC
  124. ByeMsgLng = $-OFFSET ByeMsg
  125.  
  126. IF FILECFG               ; ----------- Data file related vars.
  127. CfgFN   DB 'globe.dat', 0
  128. FileError DB 'File error.', 13, 10, '$'
  129.         UDATASEG
  130. CfgHandle DW ?
  131. ENDIF
  132.         UDATASEG
  133.  
  134.   ; ---- The moving point. ---------------
  135. _phi      DW ?
  136. _alp      DW ?
  137.  
  138.   ; ---- Buffers for screen offsets. We have to erase the points, eh?
  139. BufPos1   DW NUMPTS DUP (?)
  140. BufPos2   DW NUMPTS DUP (?)
  141.  
  142.   ; ---- Diameters for performing the opening or closing.
  143. ChngDH    DW ?
  144. ChngDV    DW ?
  145.  
  146.         .DATA
  147.  
  148. OldPos    DW OFFSET BufPos1
  149. NewPos    DW OFFSET BufPos2
  150.  
  151. ;=======================================================================
  152. ;=======================================================================
  153.  
  154.         .CODE
  155.         .STARTUP
  156.                                                    ; VGA card detection
  157.         XOR     BX,BX
  158.         MOV     AX,01A00h
  159.         INT     10h
  160.         CMP     BL,7
  161.         JC      @@novga
  162.         CMP     BL,0Dh
  163.         JC      SetupFile
  164.     @@novga:
  165.         MOV     DX,OFFSET VgaMsg
  166. ErrorExit:
  167.         MOV     AH,9
  168.         INT     21h
  169.         MOV     AX,4C01h
  170.         INT     21h
  171.  
  172. SetupFile:
  173. IF FILECFG
  174.         MOV     DX,OFFSET CfgFN
  175.         MOV     AX,3d01h                ; Open file for writing.
  176.         INT     21h
  177.         JC      @@creat
  178.         MOV     [CfgHandle],AX
  179.         MOV     BX,AX
  180.         XOR     DX,DX
  181.         XOR     CX,CX
  182.         MOV     AX,4202h                ; Go EOF.
  183.         INT     21h
  184.         JMP     SetupVideo
  185.     @@creat:
  186.         MOV     AH,5Bh
  187.         XOR     CX,CX
  188.         MOV     DX,OFFSET CfgFN
  189.         INT     21h
  190.         JNC     @@ok
  191.         MOV     DX,OFFSET FileError
  192.         JMP     ErrorExit
  193.     @@ok:
  194.         MOV     [CfgHandle],AX
  195. ENDIF
  196. SetupVideo:
  197.         CLD
  198.         MOV     AX,13h
  199.         INT     10h
  200.  
  201.         MOV     DX,3C8h
  202.         MOV     AL,14
  203.         OUT     DX,AL
  204.         MOV     AL,0FFh
  205.         INC     DX
  206.         OUT     DX,AL                   ; Palette DAC 14 & 15 == White.
  207.         OUT     DX,AL
  208.         OUT     DX,AL
  209.         OUT     DX,AL
  210.         OUT     DX,AL
  211.         OUT     DX,AL
  212.  
  213.    IF TRACE
  214.         MOV     AX,0A000h
  215.         MOV     ES,AX
  216.         MOV     DI,0
  217.         MOV     AL,8
  218.         MOV     CX,200/8
  219.      @@lp:
  220.          STOSB
  221.          ADD    DI,320*8-1
  222.          LOOP   @@lp
  223.    ENDIF
  224.         XOR     SI,SI                   ; Initialize config.
  225.         CALL    SetPreset
  226.         MOV     AX,[SizeH]
  227.         MOV     [ChngDH],AX
  228.         MOV     AX,[SizeV]
  229.         MOV     [ChngDV],AX
  230.         JMP     MainLoopEntry
  231. MainLoop:                    
  232.         SetBorder 0,0,0      
  233.         MOV     DX,3DAh                 ; Retrace sync.
  234. @@vs1:
  235.         IN      AL,DX
  236.         TEST    AL,8
  237.         JNZ      @@vs1
  238. @@vs2:
  239.         IN      AL,DX
  240.         TEST    AL,8
  241.         JZ     @@vs2
  242.  
  243.         SetBorder 63,0,63
  244.  
  245.         MOV     AL,[drawn]
  246.         OR      AL,AL
  247.         JZ      @@nodrawn
  248.          CALL   DumpGlobe
  249.          JMP    @@c2
  250.     @@nodrawn:
  251.          CALL    DumpGlobeNoErase
  252.     @@c2:
  253.         MOV     [drawn],1
  254.         MOV     AX,[WORD PTR thisColor]
  255.         XCHG    AL,AH
  256.         MOV     [WORD PTR thisColor],AX
  257.         MOV     AX,[OldPos]
  258.         MOV     DX,[NewPos]
  259.         MOV     [OldPos],DX
  260.         MOV     [NewPos],AX
  261.  
  262.         SetBorder 0,0,63
  263. MainLoopEntry:
  264.         MOV     AX,[State]
  265.         CMP     AX,0FFFFh
  266.         JZ      ReadyToCalculate
  267.          CALL   DoSequence
  268.  
  269. ReadyToCalculate:
  270.         CALL    CalculateGlobe
  271.         MOV     AX,[IncAlp]
  272.         ADD     [Alp],AX
  273.         MOV     AX,[IncPhi]
  274.         ADD     [Phi],AX
  275.         MOV     AX,[IncRho]
  276.         ADD     [Rho],AX
  277.  
  278.         MOV     AH,1
  279.         INT     16h
  280.         JZ      @@cont
  281.         MOV     AX,0FFFFh               
  282.         CMP     [State],AX
  283.         JZ      @@dokb
  284.          MOV     [State],AX             ; Switch to interactive mode.
  285.          MOV     AX,[ChngDH]            ; Restore full diameters.
  286.          MOV     [SizeH],AX
  287.          MOV     AX,[ChngDV]
  288.          MOV     [SizeV],AX
  289.     @@dokb:
  290.         CALL    ControlKeyboard
  291.         JZ      Exit
  292.     @@cont:
  293.         JMP     MainLoop
  294. Exit:
  295.         MOV     AX,3
  296.         INT     10h
  297.         XOR     BH,BH
  298.         MOV     DX,1700h
  299.         MOV     AH,2
  300.         INT     10h
  301.         MOV     AX,0B800h
  302.         MOV     ES,AX
  303.         MOV     SI,OFFSET ByeMsg
  304.         XOR     DI,DI
  305.         MOV     CX,ByeMsgLng/2
  306.         REP     MOVSW
  307.  
  308.         MOV     AX,4C00h
  309.         INT     21h
  310.  
  311. ;=======================================================================
  312. ;=======================================================================
  313.  
  314. DoSequence:
  315.         OR      AX,AX
  316.         JZ      @@open
  317.         CMP     AX,FRAMESPERCFG
  318.         JZ      @@close
  319.         INC     AX                      ; Showing the current figure.
  320.         MOV     [State],AX
  321.         RET
  322.   @@open:
  323.         MOV     AX,[ChngDiameter]
  324.         INC     AX
  325.         CMP     AX,MAXDIAM
  326.         JNZ     @@sequence
  327.          INC    [State]
  328.          JMP    @@doneseq
  329.   @@close:
  330.         MOV     AX,[ChngDiameter]
  331.         DEC     AX
  332.         JNZ     @@sequence
  333.          MOV    [State],AX
  334.          CALL   IncreasePreset
  335.          CALL    @@doneseq
  336.          XOR    AX,AX
  337.   @@sequence:
  338.         MOV     [ChngDiameter],AX
  339.         MOV     DX,[ChngDH]
  340.         MUL     DX
  341.         MOV     CX,MAXDIAM
  342.         DIV     CX
  343.         MOV     [SizeH],AX
  344.         MOV     AX,[ChngDiameter]
  345.         MOV     DX,[ChngDV]
  346.         MUL     DX
  347.         MOV     CX,MAXDIAM
  348.         DIV     CX
  349.         MOV     [SizeV],AX
  350.         RET
  351.   @@doneseq:
  352.         MOV     AX,[SizeH]
  353.         MOV     [ChngDH],AX
  354.         MOV     AX,[SizeV]
  355.         MOV     [ChngDV],AX
  356.         RET
  357.  
  358. ; -----------------------------------
  359.  
  360. CalculateGlobe:
  361.         MOV     AX,DS
  362.         MOV     ES,AX
  363.         MOV     AX,[Alp]
  364.         MOV     [_alp],AX
  365.         MOV     AX,[Phi]
  366.         MOV     [_phi],AX
  367.         MOV     BP,NUMPTS
  368.         MOV     DI,[NewPos]
  369.     @@lp:
  370.         MOV     BX,[_alp]
  371.         Cos DX
  372.         MOV     BX,[_phi]
  373.         Cos AX
  374.         IMUL    DX
  375.         ADD     DX,DX
  376.         MOV     AX,[SizeH]
  377.         IMUL    DX
  378.         ADD     DX,160
  379.         PUSH    DX                      ; Graba el valor del ancho.
  380.  
  381.         MOV     BX,[_phi]
  382.         Sin DX
  383.         MOV     BX,[Rho]
  384.         Cos AX
  385.         IMUL    DX
  386.         ADD     DX,DX
  387.         MOV     AX,[SizeV]
  388.         IMUL    DX
  389.         PUSH    DX                      ; Valor1 del alto.
  390.  
  391.         MOV     BX,[_alp]               ; Now for the 'Rhotated' Y value.
  392.         Sin DX
  393.         MOV     BX,[_phi]
  394.         Cos AX
  395.         IMUL    DX
  396.         ADD     DX,DX
  397.         MOV     BX,[Rho]
  398.         Sin AX
  399.         IMUL    DX
  400.         ADD     DX,DX
  401.         MOV     AX,[SizeH]
  402.         IMUL    DX
  403.         POP     AX
  404.         ADD     DX,101
  405.         ADD     DX,AX                   ; DX == Ypos
  406.         MOV     AX,320
  407.         MUL     DX
  408.         POP     CX                      ; Retrieve saved X.
  409.         ADD     AX,CX                   ; AX = dest. offset.
  410.         STOSW
  411.         MOV     AX,[GapAlp]
  412.         ADD     [_alp],AX
  413.         MOV     AX,[GapPhi]
  414.         ADD     [_phi],AX
  415.         DEC     BP
  416.         JZ      @@ret
  417.         JMP     @@lp
  418.     @@ret:
  419.         RET
  420.  
  421. ; -----------------------------------
  422.  
  423. DumpGlobe:
  424.         MOV     BP,NUMPTS/MULTPTS
  425.         MOV     SI,[NewPos]
  426.         MOV     BX,[OldPos]
  427.         MOV     AX,0A000h
  428.         MOV     ES,AX
  429.         XOR     CL,CL
  430.         MOV     DX,2
  431.         MOV     AX,[WORD PTR thisColor]
  432.     @@lp:
  433.         REPT MULTPTS
  434.             LOCAL @@c1
  435.             MOV     DI,[BX]
  436.             CMP     AH,ES:[DI]
  437.             JNZ     @@c1
  438.              MOV    ES:[DI],CL
  439.         @@c1:
  440.             MOV     DI,[SI]
  441.             MOV     ES:[DI],AL
  442.             ADD     SI,DX
  443.             ADD     BX,DX
  444.         ENDM
  445.         DEC     BP
  446.         JZ      @@ret
  447.         JMP     @@lp
  448.     @@ret:
  449.         RET
  450.  
  451. ; -----------------------------------
  452.  
  453. DumpGlobeNoErase:
  454.         MOV     BP,NUMPTS/MULTPTS
  455.         MOV     SI,[NewPos]
  456.         MOV     AX,0A000h
  457.         MOV     ES,AX
  458.         MOV     DX,2
  459.         MOV     AL,[thisColor]
  460.     @@lp:
  461.         REPT MULTPTS
  462.             MOV     DI,[SI]
  463.             MOV     ES:[DI],AL
  464.             ADD     SI,DX
  465.         ENDM
  466.         DEC     BP
  467.         JNZ     @@lp
  468.         RET
  469.  
  470. ; -----------------------------------
  471.  
  472. CHKKEY MACRO val,var,inc
  473.         LOCAL @@nothis
  474.         CMP     AH,&val
  475.         JNZ     @@nothis
  476.         ADD     [&var],&inc
  477.         JMP     @@nofunc
  478.     @@nothis:
  479. ENDM
  480.  
  481. CHKDIAM MACRO val,var,inc
  482.         LOCAL @@nothis
  483.         CMP     AH,&val
  484.         JNZ     @@nothis
  485.         IF &inc LE 0
  486.             CMP     [&var], 0
  487.             JLE     @@nofunc
  488.         ELSE
  489.             CMP     [&var],MAXDIAM
  490.             JGE     @@nofunc
  491.         ENDIF
  492.         ADD     [&var],&inc
  493.         JMP     @@nofunc
  494.     @@nothis:
  495. ENDM
  496.  
  497. ControlKeyboard:
  498.         XOR     AH,AH
  499.         INT     16h
  500.         OR      AL,AL
  501.         JZ      @@func
  502.         CMP     AL,27                   ; ESC pressed? Return Z.
  503.         JZ      @@ret
  504.         CMP     AL,'-'
  505.         JNZ     @@nomin
  506.         CALL    SaveActual
  507.         CALL    DecreasePreset
  508.         JMP     @@retnoesc
  509.     @@nomin:
  510.         CMP     AL,'+'
  511.         JNZ     @@noadd
  512.         CALL    SaveActual
  513.         CALL    IncreasePreset
  514.         JMP     @@retnoesc
  515.     @@noadd:
  516.         CMP     AL,8
  517.         JNZ     @@nobs
  518.         XOR     AX,AX
  519.         MOV     [Phi],AX
  520.         MOV     [Alp],AX
  521.         MOV     [Rho],AX
  522.         MOV     [IncPhi],AX
  523.         MOV     [IncAlp],AX
  524.         MOV     [IncRho],AX
  525.         MOV     [GapPhi],AX
  526.         MOV     [GapAlp],AX
  527.         MOV     AX,MAXDIAM
  528.         MOV     [SizeH],AX
  529.         MOV     [SizeV],AX
  530.         JMP     @@retnoesc
  531.     @@nobs:
  532. IF FILECFG
  533.         CMP     AL,' '
  534.         JNZ     @@nospc
  535.         CALL    SaveConfiguration
  536.     @@nospc:
  537. ENDIF
  538.     @@retnoesc:
  539.         XOR     AL,AL                   ; Return NZ.
  540.         INC     AL
  541.     @@ret:
  542.         RET
  543.     @@func:
  544.         CHKKEY  59,IncPhi,ANGLEINC
  545.         CHKKEY  60,IncPhi,-ANGLEINC
  546.         CHKKEY  61,IncAlp,ANGLEINC
  547.         CHKKEY  62,IncAlp,-ANGLEINC
  548.         CHKKEY  63,GapPhi,ANGLEINC
  549.         CHKKEY  64,GapPhi,-ANGLEINC
  550.         CHKKEY  65,GapAlp,ANGLEINC
  551.         CHKKEY  66,GapAlp,-ANGLEINC
  552.         CHKKEY  67,IncRho,ANGLEINC
  553.         CHKKEY  68,IncRho,-ANGLEINC
  554.  
  555.         CHKDIAM 77,SizeH,2
  556.         CHKDIAM 75,SizeH,-2
  557.         CHKDIAM 72,SizeV,2
  558.         CHKDIAM 80,SizeV,-2
  559.    @@nofunc:
  560.         INC     AL                      ; Return NZ
  561.         RET
  562.  
  563. ; ----------------------------
  564. ; Various Configuration handling routines interconnected. I love ASM! :_)
  565.  
  566. SaveActual:
  567.         MOV     DI,[Preset]
  568.         ADD     DI,OFFSET PresetConfigs
  569.         MOV     SI,OFFSET ActualConfiguration
  570.         JMP     DoCfgCopy
  571.  
  572. DecreasePreset:
  573.         MOV     SI,[Preset]
  574.         SUB     SI,CONFIGSIZE
  575.         JNC     SetPreset
  576.         ADD     SI,SIZEPRESETS
  577.         JMP     SetPreset
  578. IncreasePreset:
  579.         MOV     SI,[Preset]
  580.         ADD     SI,CONFIGSIZE
  581.         CMP     SI,SIZEPRESETS
  582.         JC      SetPreset
  583.         SUB     SI,SIZEPRESETS
  584. SetPreset:
  585.         MOV     [Preset],SI
  586.         ADD     SI,OFFSET PresetConfigs
  587.         MOV     DI,OFFSET ActualConfiguration
  588. DoCfgCopy:
  589.         MOV     CX,CONFIGSIZE
  590.         MOV     AX,DS
  591.         MOV     ES,AX
  592.         REP MOVSB
  593.         RET
  594.  
  595. ; -----------------------------------------
  596. IF FILECFG
  597. SaveConfiguration:
  598.         MOV     DX,OFFSET ActualConfiguration
  599. SaveDXCfg:
  600.         MOV     BX,[CfgHandle]
  601.         MOV     CX,CONFIGSIZE
  602.         MOV     AH,40h
  603.         INT     21h
  604.         JNC     @@ret
  605.         CMP     AX,CONFIGSIZE
  606.         JNZ     @@err
  607.     @@ret:
  608.         RET
  609.     @@err:
  610.         MOV     DX,OFFSET FileError
  611.         JMP     ErrorExit
  612. ENDIF
  613.         END
  614. ; ------------------------------ End of GLOBE.ASM ---------------------------
  615.  
  616.