środa, kwietnia 06, 2011

.asm - to było fajne rozszerzenie plików z programami ;-)

Aż mi się łezka w oku zakręciła jak znalazłem ten programik ;-)
W ostatniej klasie LO (1996 rok) zrobiliśmy z kolegą "konkurs" kto napisze mniejszy program wyświetlający nicka autora ;-) Ja miałem sprawę o tyle ułatwioną, że moim nickiem, czy wtedy to jeszcze ksywą było RMK :-)
Nie pamiętam już jakiej wielkości był program gdy wygrałem konkurs, chyba około 100 bajtów, ale później przez kilka lat (już w czasie studiów) wracałem co jakiś czas do tego programiku i trochę go zmniejszałem by w końcu osiągnąć rozmiar 69 bajtów (a nie 70 jak stoi w komentarzach).
Radzę zwrócić uwagę na bogactwo komentarzy i ich ortografię ;-)

;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
;(c) 1996-1998 by RMK ▒ Aktualny rozmiar programu:
;e-mail : rmk@zeus.polsl.gliwcie.pl ▒ 70 bajtów ;-)
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
;Jak chcesz to skomilować to rób to tak:
; TASM nazwa.ASM
; TLINK nazwa.OBJ /t
;dzięki temu uzyskasz programik nazwa.COM.
;Mam wrażenie, że nie można go już bardziej zmniejszyć niż o jakieś 4-5 bajtów
;bez zmian w formacie przechowywania danych.
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
;Info tla ciekawskich
;Prgramik wypisujący w prawym dolnym rogu ekranu w 13h (320x200x256) moją
;xywkę bez używania fontów VGA.
; !!! Programik ma być jak najkrótszy. !!!
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
;Ostatnie modyfikacjie:
;26-11-1998 76 NASM
;26-11-1998 74 NASM odwróciłem dane (czyli są na odwrót)
;26-11-1998 72 NASM znów odwróciłem dane (tzn. znów są po kolei)
;26-11-1998 71 NASM
;26-11-1998 70 NASM
;29-11-1998 70 TASM wracamy do starego dobrego TASMa
;04-03-2000 69 TASM zamiana instrukcji xor dx,dx i mov dl,7 na mov dx,7
;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
.model tiny
.code
org 100h

Start:
; xor dx,dx ; wycięte 04-03-2000
mov al,13h
int 10h ; SET MODE 13h

mov al,15 ; Kolorek pikseli
; teoretycznie można rysować kolorem
; 19 (13h) który mamy już w AL, trzeba
; jednak szczerze powiedzieć, że ten
; kolor jest do bani. I niestety
; przez to tracimy cenne 2 bajty

mov bh,0a0h ; Jak wiemy BX na początku=0 więc
; jeśli BH=0a0h to BX=0a000h
mov es,bx ; No i mamy segment VIDEO w ES

mov di,61740 ; Przesunięcie naszego piczturka
; ^ to draństwo zajmuje 6 bajtów, horror :-)
mov dx,7 ; zmienione z mov dl,7 04-03-2000
mov bx,offset rmkbin ; W BX offset tablicy z rysunkiem
pocz: dec dx ; jeśli DL=0 (czyli narysowane)
jz koniec ; zakończ
mov bp,[bx] ; DO BP binarna linia piczturka
mov cl,16

rys: shl bp,1 ; Przesunąć bity w BP o jeden w lewo
jc rysuj ; i jak jakiś tam był to rysujemy pixelka
wr: dec cx ; zmniejszamy CX, i jeżeli CX=0 to
jz dodaj ; znaczy koniec lini

inc di

jmp short rys ; Znów zapentlaj

rysuj: ; Jak rysować to trzeba gdzieś umieścić
; adres naszego pixla, będzie to ES:DI
stosb ; PUT PIXEL :-) ; Naryzowane (To jezd sztrasznie niesoptymalisowane tla Pentium-a)
dec di ; zmniejszamy DI, bo stosb go nam zwiększył
jmp short wr ; No i skoczemy do wr
dodaj: add di,320-15 ; Koniec lini binarnej więc zwiększamy
; ^ a to draństow zajmuje aż 4 bajty :-)
inc bx ; SI o 320
inc bx ; offset naszej tablicy zwiększamy o 2
jmp short pocz ; no i skaczemy do POCZątku

koniec:
key: mov ah,1
int 21h
mov al,3h
int 10h ; SET MODE 03h
ret ; no i kuniec

rmkbin DW 1110010001010010b ; napis w tablicy binarnej
DW 1001011011010100b
DW 1001010101011000b
DW 1110010001011000b
DW 1001010001010100b
DW 1001010001010010b

;rmkbin DW 0100101000100111b
; DW 0010101101101001b
; DW 0001101010101001b
; DW 0001101000100111b
; DW 0010101000101001b
; DW 0100101000101001b


END Start


Sam efekt działania programu wyglądał tak:



Nie powala, wiem ;-) Ale byłem z tego wtedy bardzo dumny :-)

Co zabawne teraz obrazek w PNG jest o prawie 14 razy większy niż cały program ;-)
Sam obrazek został wykonany w DOSBoksie, bo Windows 7 nie jest aż tak kompatybilny by potrafić uruchomić plik COM, w którym znajduje się program ;-)

Na wyprawę w swoje stare źródła udałem się w poszukiwaniu informacji o module, który mi się wtedy bardzo podobał i który użyłem w swoim "demku" (jego źródeł znaleźć nie mogę :-() z którego byłem też strasznie dumny i bardzo lubiłem nad nim pracę, choć nie wiem nawet czy je komuś pokazałem :-). Nie namierzyłem tak tego utworu, ale namierzyłem go chyba inaczej ;-) Był to moduł z dema Technological autorstwa XTD (tutaj wideo na YouTube, ale dźwięk jest taki sobie).

Tak patrzę na te źródła, i z jednej strony jestem zadowolony, że jestem w stanie je zrozumieć, ale z drugiej strony zadziwia mnie to jakie to było proste :-) i co może dziwnie zabrzmi ;-) niewinne. Ale wtedy to już umierało, był Windows ze swoim trybem chronionym (który zły nie był i nie jest), ale i z HALem, który zabrał przyjemność rozrabiania na sprzęcie ;-) I co prawda wiem, że tak jest lepiej, to czasem mi brakuje tego, że kiedyś było można ;-)

A teraz co? Java działa na wirtualnej maszynie, a wszystko wydaje się zmierzać w jeszcze bardziej wirtualnym kierunku... Bo już teraz np. większość aplikacji enterprise działa na wirtualnej maszynie Java'y, która jest odpalona na wirtualnym serwerze ;-) Do tego Apple od paru lat mocno używa (podobno) LLVM, Google odgraża się, że będzie go wspierać w NaCL... czyli kiedyś może być tak, że taka aplikacja enterprise będzie napisana w Java'ie (czy innej Scala'i...) która będzie wykonywana przez wirtualną maszynę Java'y, która będzie skompilowana do listy instrukcji LLVM (czyli wirtualnego procesora), której silnik będzie wbudowany w system operacyjny działający na wirtualnym serwerze..... ;-)


Podobne postybeta
Plan lekcji - wersja hard ;-)
Celeron M353 900MHz vs. Intel Atom 1.6GHz, czyli o tym czemu jest remis? ;-)
Gadające Gadu-Gadu
Noble
Referencje w Java'ie