Difference between revisions of "Indian Spirit"
|Line 40:||Line 40:|
jmp short Y
jmp short Y
Latest revision as of 02:49, 26 April 2019
Indian Spirit was created by Hellmood and is 32 bytes in size. Indian Spirit implements a 640x400 American Indian cloth tapestry while playing music inspired by that culture. Original Readme:
"Indian Spirit" - HellMood / DSR released just for fun 02/2019 DOSBOX - 32 bytes - PC Speaker Somewhat inspired by Adoks "Indian" Series i coded for one hour to see what i can come up with, but in 32 bytes, and with sound. At the same time i exploited the "secret mode" 0x69 which switches to 640x400 in 256 colors, but without using the size-unfriendly VESA functions. For that reason, this demo only works in DOSBOX or on a computer which as the EXACT graphic card dosbox emulates. Youtube Capture : https://www.youtube.com/watch?v=TeIkW31Blf0
pop ds cwd Y: xor al,0x69 int 0x10 mov dl,cl mov al,[0x46C] neg al xor dl,al and al,32+16+4+2 or al,0x41 out 0x42,al out 0x61,al mov ah,12 loop Y inc bl jmp short Y
pop ds puts 0 into DS. The top stack value at the start of a DOS program is known to be zero.
cwd is used to clear DX, it is needed because later, pixel setting via BIOS is used (int10h, AH=12), where DX is the row number. Since DX is the same as DS at start, we need to clear it, otherwise there is an offset for the whole graphic effect.
xor al,0x69 is a part of the graphic effect as well as assigning a graphic mode number to AL. This is a non standard short cut to the usual way of setting a high resolution graphic mode (VESA), which needs 4 bytes more. The mode numbers differ depending on the graphics cards used, here it works for the graphics card DOSBOX is emulating, so it should work on real hardware. A proof of concept version for a GT105M from NVIDIA can be found here. The idea of the graphic effect is to
loop over 65536 values of
CX which denotes the column at the same time, while changing the row in
DL to create an interesting pattern. The row has to be kept in reasonable range, otherwise uncaught illegal memory accesses can occur. Here, the row number itself cannot exceed 255, since only DL is modified in an otherwise empty DX. Due to the linear memory modell of graphics memory, a column of 65535 would translate to about 102 rows, so we reach up to 357 rows, which fills about 75% of the screen. Syncing to the timer in [0:0x46C] and generating PC speaker output both are explained here and here. The melody itself is playing with some binary logic on the raw timing value, and heavily intertwined with the actual pixel color, as well as switching the PC speaker on and off.