Nejprve k tomu, co bylo možná nejvíc zřejmé, a tedy nápovědy:
- přiložený HEX soubor mohl pomoci těm, kteří s tím ovšem za mých let pracovali na škole, pokud poznali formát souboru používaný překladačem od firmy EasySoft pro 8051 - pak by už neměl být problém vyluštit, co program vlastně dělá. Původně jsem ho poslal jako sekvenci odstínů šedi, s čímž mi pomohl jeden menší prográmek v Pascalu:
program Hex2Bin;
var InF : text;
OutF : file of byte;
Znak1,Znak2 : char;
Vystup : byte;
begin
Assign(InF,'data.hex');
Assign(OutF,'data.bin');
Reset(InF);
Rewrite(OutF);
while not Eof(InF) do
begin
Read(InF,Znak1);
Read(InF,Znak2);
if Znak1 in ['a'..'z'] then Dec(byte(Znak1),Ord('a')-Ord('A'));
if Znak2 in ['a'..'z'] then Dec(byte(Znak2),Ord('a')-Ord('A'));
if (Znak1 in [#10,#13]) or (Znak2 in [#10,#13]) then Break;
Vystup := 0;
if Znak1 in ['0'..'9'] then Vystup := Vystup or (byte(Znak1)-Ord('0'))
else
if Znak1 in ['A'..'F'] then Vystup := Vystup or (byte(Znak1)-Ord('A')+10);
Vystup := Vystup shl 4;
if Znak2 in ['0'..'9'] then Vystup := Vystup or (byte(Znak2)-Ord('0'))
else
if Znak2 in ['A'..'F'] then Vystup := Vystup or (byte(Znak2)-Ord('A')+10);
Write(OutF,Vystup);
end;
Close(InF);
Close(OutF);
end.
- mohl také rovněž pomoci DAT soubor, což je program, který dělá defakto to samé, ale je psán pro x86 a využívá grafiku (jen formát dat je takový podivný.. kdybych tam dal souřadnice X,Y pro kreslení čar, to by bylo si myslím moc snadné). Tentokrát si nepomohl ani ten, který sice poznal, že jde o DOSový program, a přejmenoval ho tedy na COM, ale při spuštění mu program nic neudělal. Pokud si nevšiml, že jsem jako první instrukci dal EXIT, tak se chudák asi trochu trápil..
testrun = 1
org 100h
use16 ; v 16bitovém COM nebude u use32 fungovat nepřímé adresování!!!!
if testrun=1
nop
nop
else
int 20h
end if
mov eax,13h
int 10h
znovu_klav:
xor eax,eax
inc ah
int 16h
jz neni_klav
xor eax,eax
int 16h
jmp znovu_klav
neni_klav:
cld
cyklus:
lodsw
or ax,ax
jz stop
call cara
jmp cyklus
stop:
; mov ah,1
; int 21h
xor eax,eax
int 16h
jmp konec
align 16
cara:
mov ecx,eax
test eax,8192 ;bit13
jz vodorovne
mov ebx,320
jmp test0
vodorovne:
mov ebx,1
test0: and ecx,$fff
test eax,32768 ;bit15
jz test1
neg ebx
test1:
test eax,16384 ;bit14
jz kresli
presun:
add edi,ebx
dec ecx
jnz presun
ret
kresli:
xor eax,eax
kresli_cykl:
mov [es:edi],al
add edi,ebx
inc al
dec ecx
jnz kresli_cykl
ret
hello dw 50+$2000+$4000,10+$4000
H dw 100+$2000,50+$8000+$2000,50,50+$8000+$2000,100+$2000
E dw 10+$4000,50,50+$8000+$4000,50+$8000+$2000,50,50+$8000+$4000,50+$8000+$2000,50,50+$8000+$4000,100+$2000
L dw 60+$4000,50,50+$8000+$4000,100+$8000+$2000
L2 dw 60+$4000,100+$2000,50
O dw 10+$4000,50,100+$8000+$2000,50+$8000,100+$2000
Zero dw 0
; word číslo se znaménkem (bit15) ($8000)
; bit14 v dolním wordu určuje (1) že se nekreslí, jen přesouvá ($4000)
; bit13 = 1 znamená svisle, 0 = vodorovně ($2000)
konec:
xor eax,eax
int 10h
int 20h
Chová se více méně jako plotter, a jeho výstupem je následující obrázek:
Ale zpět k tomu zadání..
Schémata, která jsem k tomu přiložil, měla alespoň trochu ozřejmovat, o jaké jde zařízení a tedy i to, co dělá.. Program samotný pak už nemusel být až tak moc důležitý. Ale zde je:
org 0
clock bit p1.0
data0 bit p1.1
anl p1,#11111100b
mov r7,#35
l0: setb clock
clr clock
djnz r7,l0
setb data0
setb clock
clr clock
mov r0,#0
mov r7,#5
mov dptr,#tab
l2: mov a,r0
movc a,@a+dptr
mov r6,#7
l1: rrc a
mov data0,c
setb clock
clr clock
djnz r6,l1
inc r0
djnz r7,l2
sjmp $
tab: db 76h,79h,38h,38h,3fh
end
; obvod M5451, 7seg bez dekoderu, 5 displayu, spolecne U +5V, 1=ON
Obrázky neobsahují kompletní návod na postavení daného zařízení (jako ve filmu Kontakt), protože by to dalo moc práce, a stejně by se v tom málokdo vyznal, takže v rámci zjednodušení vyjdeme z toho, že tento můj nákres může lidem, co se v dané oblasti pohybují, vyvolat dojem, že to vlastně už viděli (a kdo ví, třeba i mimozemšťané mohli vyjít z rozboru nějaké naší sondy). Nejde o to, jaké jsem použil symboly, jde o jejich souvislosti.
A kdo ještě stále nepoznal, o co jde.. tak je to obyčejné
"HELLO world" na pěti 7 segmentových LED zobrazovačích s budičem (řadičem) (původně mne napadlo použít dynamické displaye s jedním portem, ale on se ten program ani moc nelišil, takže rozdíl by byl jen ve schématu a bylo by už moc jednoduché).