home *** CD-ROM | disk | FTP | other *** search
/ The Party 1994: Try This At Home / disk_image.bin / source / cloak / cloak.asm next >
Assembly Source File  |  1995-03-13  |  11KB  |  594 lines

  1. ;        cloak
  2. ;
  3. ;        (C)94 xToto/Valhalla
  4. ;
  5. ;        first presented at the pc-party in herning/denmark
  6.  
  7.         .model compact
  8.         .386
  9.  
  10.         .stack    100h
  11.  
  12. Ysin_base    = 8        ; sin-values in [0;pi/2[
  13. Ysin_samples    = 1 shl Ysin_base
  14.  
  15. Ywidth        = 320        ; must be a multiple of 8
  16. Yheight        = 144        ; must be a multiple of 4
  17.  
  18. _data        segment 'data'
  19. Yvga_regs    dw    003d4h
  20.         db    013h, Ywidth/8
  21.         db    -1
  22.         dw    -1
  23.  
  24. Ytimer        dw    0
  25. Yampl        dw    0
  26. Yviewport    dw    0
  27. Ymid        db    80h
  28. Ycmid        dw    0
  29. Ycdesc        dw    0
  30.  
  31. include mapping.inc
  32.  
  33. Ydx0        dd    ?
  34. Ydy0        dd    ?
  35. Ydx1        dd    ?
  36. Ydy1        dd    ?
  37. Ydx2        dd    ?
  38. Ydy2        dd    ?
  39.  
  40. Yp0        dd    ?
  41. Yp1        dd    ?
  42. Yp2        dd    ?
  43. Yt0        dd    ?
  44. Yt1        dd    ?
  45. Yt2        dd    ?
  46.  
  47. Ylookup        db    1000h dup (?)    ; color lookup-table
  48. Yoffs        dw    100h dup (?)    ; line offsets
  49. Ycolors        db    31h dup (?)
  50. Ysin        dw      Ysin_samples dup (?)
  51. Ycos        dw      Ysin_samples dup (?)
  52. Ysin1        dw    2*Ysin_samples dup (?)
  53. Ysin2        dw      Ysin_samples dup (?)
  54. _data        ends
  55.  
  56. _sin        segment 'bss'
  57.         dw    8000h dup (?)
  58. _sin        ends
  59.  
  60. _cloak        segment 'bss'
  61.         dw    8000h dup (?)
  62. _cloak        ends
  63.  
  64. _text    segment 'code'
  65.  
  66. ; clear the keyboard-buffer and exit
  67. ; used registers: ax
  68.  
  69. Yclean_up:
  70.     mov    ah, 01h        ; clear key-buffer if needed
  71.     int    16h
  72.     jz    Yclean_up1
  73.     mov    ah, 00h
  74.     int    16h
  75.     jmp    Yclean_up
  76. Yclean_up1:
  77.     mov    ax, 0003h    ; restore text-mode
  78.     int    10h
  79.     mov    ax, 4c00h    ; quit program
  80.     int    21h
  81.  
  82. ; calculate the next phase of a plasma-field
  83. ; used registers: all ?
  84.  
  85. Yframe:
  86.     mov    cx, Yheight / 2
  87.     xor    eax, eax
  88. Yframe_loop2:
  89.     push    cx
  90.     mov    edx, Yp0
  91.     mov    ebx, Yp1
  92.     mov    esi, Yp2
  93.     shld    ebp, esi, 16
  94.     shld    esi, ebx, 16
  95.     shld    ebx, edx, 16
  96.     mov    cx, Ywidth / 8
  97. Yframe_loop1:
  98.  
  99.     add    dx, 1234h
  100. Yframe_1_1lo = $-2
  101.     adc    ebx, 12345678h
  102. Yframe_1_2lo_1hi = $-4
  103.     adc    esi, 12345678h
  104. Yframe_1_3lo_2hi = $-4
  105.     adc    bp, 1234h
  106. Yframe_1_3hi = $-2
  107.     and    bx, 00ffh
  108.     and    si, 00ffh
  109.     and    bp, 00ffh
  110.     mov    al, fs:[bx]
  111.     add    al, fs:[si]
  112.     add    al, fs:[bp]
  113.     add    al, Ymid
  114.     mov    es:[di], al
  115.  
  116.     add    dx, 1234h
  117. Yframe_2_1lo = $-2
  118.     adc    ebx, 12345678h
  119. Yframe_2_2lo_1hi = $-4
  120.     adc    esi, 12345678h
  121. Yframe_2_3lo_2hi = $-4
  122.     adc    bp, 1234h
  123. Yframe_2_3hi = $-2
  124.     mov    al, fs:[bx]
  125.     add    al, fs:[si]
  126.     add    al, fs:[bp]
  127.     add    al, Ymid
  128.     mov    es:[di+1], al
  129.  
  130.     add    dx, 1234h
  131. Yframe_3_1lo = $-2
  132.     adc    ebx, 12345678h
  133. Yframe_3_2lo_1hi = $-4
  134.     adc    esi, 12345678h
  135. Yframe_3_3lo_2hi = $-4
  136.     adc    bp, 1234h
  137. Yframe_3_3hi = $-2
  138.     mov    al, fs:[bx]
  139.     add    al, fs:[si]
  140.     add    al, fs:[bp]
  141.     add    al, Ymid
  142.     mov    es:[di+2], al
  143.  
  144.     add    dx, 1234h
  145. Yframe_4_1lo = $-2
  146.     adc    ebx, 12345678h
  147. Yframe_4_2lo_1hi = $-4
  148.     adc    esi, 12345678h
  149. Yframe_4_3lo_2hi = $-4
  150.     adc    bp, 1234h
  151. Yframe_4_3hi = $-2
  152.     mov    al, fs:[bx]
  153.     add    al, fs:[si]
  154.     add    al, fs:[bp]
  155.     add    al, Ymid
  156.     mov    es:[di+3], al
  157.  
  158.     add    di, 4
  159.     dec    cx
  160.     jne    Yframe_loop1
  161.     mov    eax, Ydy0
  162.     add    Yp0, eax
  163.     mov    eax, Ydy1
  164.     add    Yp1, eax
  165.     mov    eax, Ydy2
  166.     add    Yp2, eax
  167.     pop    cx
  168.     dec    cx
  169.     jne    Yframe_loop2
  170.     ret
  171.  
  172. ; do all needed initializations
  173. ; used regisers: all ?
  174.  
  175. Yinit:
  176.     mov    ax, seg _data
  177.     mov    ds, ax
  178.     mov    ax, seg _cloak
  179.     mov    es, ax
  180.     mov    ax, seg _sin
  181.     mov    fs, ax
  182.     mov    ax, 0a000h
  183.     mov    gs, ax
  184.  
  185.     call    Yinit_gfx
  186.     call    Yinit_offset
  187.     call    Yinit_lookup
  188.     call    Yinit_pic
  189.     call    Yinit_sin
  190.     ret
  191.  
  192. ; initialize the graphics and colors
  193. ; used registers: all ?
  194.  
  195. Yinit_gfx:
  196.     mov    ax, 0013h    ; initiailze graphics-mode
  197.     int    10h
  198.     mov    si, offset Yvga_regs    ; rewrite some vga-regisers
  199. Yinit_gfx_loop2:
  200.     lodsw
  201.     or    ax, ax        ; is it all done ?
  202.     js    Yinit_gfx_ok
  203.     mov    dx, ax
  204. Yinit_gfx_loop1:
  205.     lodsb
  206.     or    al, al        ; use next port ?
  207.     js    Yinit_gfx_loop2
  208.     out    dx, al
  209.     inc    dx
  210.     lodsb
  211.     out    dx, al
  212.     dec    dx
  213.     jmp    Yinit_gfx_loop1
  214. Yinit_gfx_ok:
  215.     ret
  216.  
  217. ; initialize the color-loopup table
  218. ; used registers: all ?
  219.  
  220. Yinit_lookup:
  221.     mov    di, offset Ylookup
  222.     xor    bx, bx
  223. Yinit_lookup1:
  224.     xor    cx, cx
  225. Yinit_lookup2:
  226.     mov    ax, cx
  227.     mul    bx
  228.     shr    ax, 10
  229.     mov    [di], al
  230.     inc    di
  231.     inc    cx
  232.     cmp    cx, 100h
  233.     jne    Yinit_lookup2
  234.     add    bx, 011h
  235.     cmp    bx, 0100h
  236.     jna    Yinit_lookup1
  237.     ret
  238.  
  239. ; initialize the offsets of the lines in memory
  240. ; used registers: all ?
  241.  
  242. Yinit_offset:
  243.     xor    cx, cx
  244.     xor    ax, ax
  245.     mov    di, offset Yoffs
  246. Yinit_offset1:
  247.     mov    [di], ax
  248.     mov    [di+2], ax
  249.     mov    [di+4], ax
  250.     mov    [di+6], ax
  251.     mov    [di+8], ax
  252.     mov    [di+10], ax
  253.     mov    [di+12], ax
  254.     mov    [di+14], ax
  255.     add    di, 010h
  256.     add    ax, Ywidth
  257.     add    cx, 1 shl 3
  258.     cmp    cx, 100h
  259.     jb    Yinit_offset1
  260.     ret
  261.  
  262. ; initialize the picture --- this is only a dummy routine
  263. ; used registers: all ?
  264.  
  265. Yinit_pic:
  266.     xor    di, di
  267.     xor    cx, Yheight
  268. Yinit_pic1:
  269.     mov    bx, Ywidth
  270. Yinit_pic2:
  271.     mov    fs:[di], cl
  272.     add    fs:[di], bl
  273.     inc    di
  274.     dec    bx
  275.     jnz    Yinit_pic2
  276.     dec    cx
  277.     jnz    Yinit_pic1
  278.     ret
  279.  
  280. ; initialize a sin-lookup-table
  281. ; used registers: all ?
  282.  
  283. Yinit_sin:
  284.     xor    di, di        ; build a sin-lookup-table
  285.     xor    cx, cx
  286.     xor    bx, bx
  287. Yinit_sin1:
  288.     mov    ebx, 3373259426 ; <-- pi/2 * 65536 / 2
  289.     movzx    eax, cx        ; calculate x
  290.     mul    ebx
  291.     shrd    eax, edx, Ysin_base+1
  292.     mov    esi, eax    ; iteratively calculate the summands
  293.     mov    ebp, eax    ; +x
  294.     mov    ebx, 6/2    ; -x^3 / 3!
  295.     call    Ytaylor
  296.     sub    ebp, eax
  297.     mov    bl, 20/2    ; +x^5 / 5!
  298.     call    Ytaylor
  299.     add    ebp, eax
  300.     mov    bl, 42/2    ; -x^7 / 7!
  301.     call    Ytaylor
  302.     sub    ebp, eax
  303.     mov    bl, 72/2    ; +x^9 / 9!
  304.     call    Ytaylor
  305.     add    ebp, eax
  306.     mov    bl, 110/2    ; -x^11 / 11!
  307.     call    Ytaylor
  308.     sub    ebp, eax
  309.     mov    bl, 156/2    ; +x^13 / 13!
  310.     call    Ytaylor
  311.     add    ebp, eax
  312.     mov    bl, 210/2/2    ; -x^15 / 15! , avoid 0x40000000
  313.     call    Ytaylor
  314.     sub    ebp, eax
  315.     shr    ebp, 15
  316.     mov    Ysin [di], bp    ;   sin(x)
  317.     mov    Ysin2[di], bp    ; = sin(2pi+x)
  318.     neg    di
  319.     mov    Ysin1[di], bp    ; = sin(pi-x)
  320.     neg    bp
  321.     mov    Ysin2[di], bp    ; =-sin(2pi-x)
  322.     neg    di
  323.     mov    Ysin1[di], bp    ; =-sin(pi+x)
  324.     add    di, 2
  325.     inc    cx
  326.     cmp    cx, Ysin_samples
  327.     jna    Yinit_sin1
  328.     ret
  329.  
  330. ; create a new sin-lookup-table with amplitude bx
  331. ; used registers: all ?
  332.  
  333. Ymodify_sin:
  334.     mov    si, offset Ysin
  335.     xor    di, di
  336.     mov    cx, 100h
  337. Ymodify_sin1:
  338.     mov    ax, ds:[si]
  339.     add    ax, 8000h
  340.     mov    dx, bx
  341.     mul    dx
  342.     mov    fs:[di], dl
  343.     add    si, (Ysin_samples / 256) * 8
  344.     inc    di
  345.     dec    cx
  346.     jne    Ymodify_sin1
  347.     xor    di, di
  348.     mov    cx, 100h
  349. Ymodify_sin2:
  350.     mov    al,fs:[di]
  351.     mov    fs:[di+100h], al
  352.     mov    fs:[di+200h], al
  353.     mov    fs:[di+300h], al
  354.     mov    fs:[di-100h], al
  355.     mov    fs:[di-200h], al
  356.     mov    fs:[di-300h], al
  357.     inc    di
  358.     dec    cx
  359.     jnz    Ymodify_sin2
  360.     ret
  361.  
  362. ; check if a key was pressed
  363. ; used registers: ax
  364.  
  365. Ykey:
  366.     mov    ah, 01h        ; check keyboard-status
  367.     int    16h
  368.     ret
  369.  
  370. ; modify the frame-routine (specify the field)
  371. ; used registers: eax
  372.  
  373. Ymodify_frame macro  _dx0, _dx1, _dx2, _dy0, _dy1, _dy2, _t0, _t1, _t2, _dt0, _dt1, _dt2
  374.     mov    Ydy0, _dy0
  375.     mov    Ydy1, _dy1
  376.     mov    Ydy2, _dy2
  377.     add    _t0, _dt0
  378.     mov    eax, _t0
  379.     mov    Yt0, eax
  380.     mov    Yp0, eax
  381.     add    _t1, _dt1
  382.     mov    eax, _t1
  383.     mov    Yt1, eax
  384.     mov    Yp1, eax
  385.     add    _t2, _dt2
  386.     mov    eax, _t2
  387.     mov    Yt2, eax
  388.     mov    Yp2, eax
  389.     mov    word ptr cs:Yframe_1_1lo, _dx0 and 0ffffh
  390.     mov    word ptr cs:Yframe_2_1lo, _dx0 and 0ffffh
  391.     mov    word ptr cs:Yframe_3_1lo, _dx0 and 0ffffh
  392.     mov    word ptr cs:Yframe_4_1lo, _dx0 and 0ffffh
  393.     mov    dword ptr cs:Yframe_1_2lo_1hi, (_dx0 shr 16) or ((_dx1 and 65535) shl 16)
  394.     mov    dword ptr cs:Yframe_2_2lo_1hi, (_dx0 shr 16) or ((_dx1 and 65535) shl 16)
  395.     mov    dword ptr cs:Yframe_3_2lo_1hi, (_dx0 shr 16) or ((_dx1 and 65535) shl 16)
  396.     mov    dword ptr cs:Yframe_4_2lo_1hi, (_dx0 shr 16) or ((_dx1 and 65535) shl 16)
  397.     mov    dword ptr cs:Yframe_1_3lo_2hi, (_dx1 shr 16) or ((_dx2 and 65535) shl 16)
  398.     mov    dword ptr cs:Yframe_2_3lo_2hi, (_dx1 shr 16) or ((_dx2 and 65535) shl 16)
  399.     mov    dword ptr cs:Yframe_3_3lo_2hi, (_dx1 shr 16) or ((_dx2 and 65535) shl 16)
  400.     mov    dword ptr cs:Yframe_4_3lo_2hi, (_dx1 shr 16) or ((_dx2 and 65535) shl 16)
  401.     mov    word ptr cs:Yframe_1_3hi, _dx2 shr 16
  402.     mov    word ptr cs:Yframe_2_3hi, _dx2 shr 16
  403.     mov    word ptr cs:Yframe_3_3hi, _dx2 shr 16
  404.     mov    word ptr cs:Yframe_4_3hi, _dx2 shr 16
  405.     endm
  406.  
  407. ; main routine of the whole thing
  408. ; used registers: all ?
  409.  
  410. Ymain:
  411.     call    Yinit
  412. Ymain_loop:
  413.     call    Yproceed
  414.     Ymodify_frame Ydx00 Ydx01 Ydx02 Ydy00 Ydy01 Ydy02 Yt00 Yt01 Yt02 Ydt00 Ydt01 Ydt02
  415.     mov    bx, Yampl    
  416.     call    Ymodify_sin
  417.     mov    di, 00000h
  418.     call    Yframe
  419.     call    Ydump
  420.  
  421.     call    Yproceed
  422.     Ymodify_frame Ydx10 Ydx11 Ydx12 Ydy10 Ydy11 Ydy12 Yt10 Yt11 Yt12 Ydt10 Ydt11 Ydt12
  423.     mov    bx, Yampl
  424.     call    Ymodify_sin
  425.     mov    di, 04000h
  426.     call    Yframe
  427.     call    Ydump
  428.  
  429.     call    Yproceed
  430.     Ymodify_frame Ydx20 Ydx21 Ydx22 Ydy20 Ydy21 Ydy22 Yt20 Yt21 Yt22 Ydt20 Ydt21 Ydt22
  431.     mov    bx, Yampl
  432.     call    Ymodify_sin
  433.     mov    di, 08000h
  434.     call    Yframe
  435.     call    Ydump
  436.  
  437.     call    Ykey
  438.     jz    Ymain_loop
  439.     call    Yclean_up
  440.  
  441. ; draw the next frame to the video-ram
  442. ; used registers: all ?
  443.  
  444. Ydump:
  445.     xor    ebx, ebx
  446.     mov    bp, Ywidth/2
  447.     xor    si, si
  448.     xor    di, di
  449. Ydump_loop:
  450.     xor    bx, bx
  451.     mov    bl, es:[si]
  452.     mov    bx, Yoffs[2*ebx]
  453.     mov    ax, es:[si+4000h-1]
  454.     shr    ax, 11
  455.     add    bx, ax
  456.     mov    dl, es:[si+8000h]
  457.     and    dl, 0f0h
  458.     mov    dh, dl
  459.     mov    ax, fs:[di+bx+10h]
  460. ;    mov    ax, 0707h
  461.     or    ax, dx
  462.     mov    gs:[di], ax
  463.     mov    ax, fs:[di+bx+Ywidth+10h]
  464. ;    mov    ax, 0707h
  465.     or    ax, dx
  466.     mov    gs:[di+Ywidth], ax
  467.     add    di, 2
  468.     inc    si
  469.     dec    bp
  470.     jnz    Ydump_noskip
  471.     mov    bp, Ywidth/2
  472.     add    di, Ywidth
  473. Ydump_noskip:
  474.     cmp    si, (Ywidth/2)*(Yheight/2)
  475.     jb    Ydump_loop
  476.     ret
  477.  
  478. ; called every frame for time-dependant stuff
  479. ; used registers: ax
  480.  
  481. Yproceed:
  482.     inc    Ytimer
  483.     cmp    Ytimer, 0aah
  484.     jae    Yproceed1
  485.     mov    ax, Ytimer
  486.     shr    ax, 1
  487.     mov    Yampl, ax
  488. Yproceed1:
  489.     cmp    Ytimer, 356h
  490.     jb    Yproceed2
  491.     mov    ax, 400h
  492.     sub    ax, Ytimer
  493.     shr    ax, 1
  494.     mov    Yampl, ax
  495. Yproceed2:
  496.     cmp    Ytimer, 400h
  497.     jb    Yproceed3
  498.     jmp    Yclean_up
  499. Yproceed3:
  500.     mov    ax, Ytimer
  501.     shr    ax, 2
  502.     mov    dx, ax
  503.     sub    ax, 0ffh
  504.     neg    ax
  505.     mov    Ycmid, ax
  506.     cmp    dx, 080h
  507.     jb    Yproceed4
  508.     sub    dx, 100h
  509.     neg    dx
  510. Yproceed4:
  511.     shr    dx, 3
  512.     jz    Yproceed5
  513.     dec    dx
  514. Yproceed5:
  515.     mov    Ycdesc, dx
  516.     mov    ax, 0ffh
  517.     sub    ax, Yampl
  518.     sub    ax, Yampl
  519.     sub    ax, Yampl
  520.     shr    ax, 1
  521.     mov    Ymid, al
  522.     call    Ypalette
  523.     ret
  524.     
  525. ; build the new palette
  526. ; used registers: all ?
  527.  
  528. Ypalette:
  529.     mov    ax, Ycmid
  530.     mov    bp, ax
  531.     mov    bx, ax
  532.     mov    dx, Ycdesc
  533.     shl    dx, 3
  534.     sub    ax, dx
  535.     add    bp, dx
  536.     shr    dx, 3
  537.     mov    si, offset Ycolors
  538.     mov    cx, 10h
  539. Ypalette1:
  540.     mov    [si], ax
  541.     mov    [si+1], bx
  542.     mov    [si+2], bp
  543.     add    si, 3
  544.     add    ax, dx
  545.     sub    bp, dx
  546.     dec    cx
  547.     jnz    Ypalette1
  548.  
  549.     mov    dx, 03c8h
  550.     xor    al, al
  551.     out    dx, al
  552.     inc    dx
  553.     mov    di, offset Ycolors
  554.     xor    bx, bx
  555.     mov    cx, 10h
  556. Ypalette2:
  557.     push    cx
  558.     mov    si, offset Ylookup
  559.     mov    cx, 10h
  560. Ypalette3:
  561.     mov    bl, ds:[di]
  562.     mov    al, [si+bx]
  563.     out    dx, al
  564.     mov    bl, ds:[di+1]
  565.     mov    al, [si+bx]
  566.     out    dx, al
  567.     mov    bl, ds:[di+2]
  568.     mov    al, [si+bx]
  569.     out    dx, al
  570.     add    si, 100h
  571.     dec    cx
  572.     jnz    Ypalette3
  573.     add    di, 3
  574.     pop    cx
  575.     dec    cx
  576.     jnz    Ypalette2
  577.     ret
  578.  
  579. ; auxiliary-routine for the sin-calculation
  580. ; used registers: eax, ebx, edx, esi
  581.  
  582. Ytaylor:
  583.     mul    esi        ; calculate the next summand
  584.     shrd    eax, edx, 30
  585.     mul    esi
  586.     shrd    eax, edx, 31
  587.     xor    edx, edx
  588.     div    ebx
  589.     ret
  590.  
  591. _text    ends
  592.  
  593.     end Ymain
  594.