256바이트 DOS 환경에서 구현된 보스전, Endbot의 기술적 마법!

by DD
1개월 전
조회수 8

256바이트(bytes)라는 극도로 제한된 환경에서 MSDOS용 오디오-비주얼 데모(audio-visual demo) 구현

어셈블리(Assembly) 언어를 사용하여 256바이트 내에 플롯, 사운드, 스프라이트(sprite) 애니메이션을 통합

FASM(Flat Assembler)을 사용하여 어셈블(assemble) 및 DOSBox-X 환경에서 실행 가능

MIDI 사운드트랙(MIDI soundtrack), 스프라이트, 폭발 효과, 스크롤 배경 등 다양한 시각 효과를 포함

256바이트 제약 내의 최적화 기법

Endbot은 코드 크기를 최소화하기 위해 다양한 최적화 기법(Optimization Techniques)을 활용한다. 특히, BP 레지스터(Register)를 전역 시계로 사용하여 타이밍을 관리하고, `mul 0xCCCD` 명령어를 통해 나눗셈 연산 없이 픽셀의 X, Y 좌표를 계산한다. 또한, `stosb` 명령어를 사용하여 픽셀을 그리고, `hlt` 명령어를 통해 프레임 동기화를 수행하며, `xlat` 명령어를 사용하여 색상 조회를 수행하는 등, 각 명령어의 특성을 최대한 활용하여 코드 크기를 줄였다.

MIDI 사운드트랙(MIDI Soundtrack) 스트리밍

Endbot은 MIDI 사운드트랙을 생성하기 위해, 시작 시 MIDI 포트(MIDI Port)로 데이터를 스트리밍한다. 특히, 스프라이트 데이터와 MIDI 데이터를 하나의 메모리 블록에 저장하여, `rep outsb` 명령어를 통해 한 번에 전송한다. 이 방식은 코드 크기를 줄이는 동시에, 사운드와 시각 효과를 동기화하는 데 기여한다. MIDI 리셋(MIDI Reset) 명령어를 사용하여 사운드 출력을 제어하는 점도 주목할 만하다.

스프라이트(Sprite) 렌더링 및 애니메이션

Endbot은 16x16 픽셀 크기의 스프라이트를 사용하여, 로봇의 움직임과 피해를 시각적으로 표현한다. 스프라이트 데이터는 2비트(bit)를 사용하여 각 픽셀의 색상을 표현하며, `btc` 명령어를 통해 스프라이트의 비트를 변경하여 피해를 시각화한다. 또한, 타이머 값을 활용하여 스프라이트의 X축 위치를 변경하고, 폭발 효과를 구현하는 등, 제한된 환경에서도 다양한 애니메이션 효과(Animation Effects)를 구현했다.

DOS 환경에서의 배경 및 폭발 효과

Endbot은 배경을 위해, 수평선 아래는 파란색 하늘을, 수평선 위는 스크롤링 체커보드(scrolling checkerboard) 패턴을 사용한다. 특히, `div` 명령어를 사용하여 원근감을 표현하고, `aam 9` 명령어를 통해 색상 밴딩(color banding) 효과를 추가하여 시각적 깊이를 더한다. 폭발 효과는 수학적 원리를 기반으로, 시간에 따라 증가하는 원을 그려낸다. 수학적 계산(Mathematical Calculation)을 통해, 제한된 환경에서도 복잡한 시각 효과를 구현한 점이 돋보인다.

A whole boss fight in 256 bytes