pouët.net

mess_age by Desire [web]

;                  M   E   S   S   A   G   E
;
;                     a 32 b msdos intro										
;                      mode 0x13 / MIDI
;                     by HellMood/DESiRE
;                    at "DemoSplash" 2017
;
;
;                        G r e e t s 
;
;             sensenstahl, homecoded, rrrola, frag
;             Optimus, Trixter, igor, gargaj, VileR
;            Whizart,g0blinish,Rudi,ryg,Orby a.k.a.
;            orbitaldecay,wysiwtf,Kuemmel,p01,Elias
;            Oscar Toledo,Drift +all DESIRE members 
;
;                      youtube capture
;          https://www.youtube.com/watch?v=dSz7xlUkQFI
;
;--------------------------------------------------------------
;
;      this has been tested on FreeDos on real hardware
;			        works on DosBox as well
;         mode 0x13 (320 x 200) is used for animation
;               the sound is generated with MIDI
;                please read - and contribute!
;           http://www.sizecoding.org/wiki/Output
;
;--------------------------------------------------------------
						; ATTENTION : this data is EXECUTED
db 0x3F					; MIDI command for activating UART Mode
db 0xC0 + 0x01			; changing instrument on channel 1
db 0x51					; instrument number for "Lead 2 (sawtooth)"
db 0x90 + 0x01			; playing something on channel 1
db 0x12					; playing a deep note
db 0x7F					; volume 127 (maximum)
nop						; unused instruction for aligning MIDI data

	; MIDI data with alignment instruction translates to :
		; aas
		; rcl word [bx+di-0x6F], 0x12
		; jg 0x97
	; which does nothing harmful for our code flow

pop es					; top stack is 0, we need a zero segment for the timer
mov dx , 0x331			; port for sending UART mode switch
outsb					; sending UART mode switch ( 0x3F )
dec dx					; changing to MIDI data port ( 0x330 )

mov cl , 0x05			; sending 5 defined bytes to the MIDI data port
rep						; writing this way (reading from DS:SI and following)
outsb					; is much shorter than assigning to AL in the code

L:
xor al , 0x13			; first pass: set graphic mode, after that: flicker effect
int 0x10				; first pass: set graphic mode, after that: set pixel
and cl , ch				; optimized sierpinski effect
mov ah , 0x0C			; AH from "set mode" (0x00) to "set pixel" (0x0C)
xor al , [es : 0x46C]	; modifying current pixel value with current timer value
loop L					; rinse and repeat