[bits 32]
txbuffer db 0
rxbuffer db 0
crc db 0
command db 0
frame db 0
framewritecompleted db 0
frameRead_7_16 db 0
header db 02h
jmpstart32:
;writefram:
start32:
call make_txbuffer
call make_txbufferdefaultdata
call make_rxbuffer
call make_rxbufferdefaultdata
mov ax,header
;read framebufferfor16channels
;write framebufferfor16channels
call make_frame
call make_framedefaultdata
call add_frametorxbuffer
call read_byteofframefromrxbuffer
call write_byteframetotxbuffer
call display_on_monitor
call make_crc
call add_crctoframe
call check_crc
call send_crctotxbuffer
call set_frameintxbufferwritecompletevalue
call speakeron
end_writeframe:
exit:
;///////////////////////////////////////////////////////////////
make_txbuffer:
mov edx,0
lea esi,[txbuffer]
l3: add esi,edx
cmp edx,8
jne l3
inc edx
end_make_txbuffer:
ret
;////////////////////////////////////////////////////////////////////
make_txbufferdefaultdata:
; esi=address of txbuffer
pusha
mov cx,8
l4: lea esi,[txbuffer]
mov eax,[esi]
mov eax,0
inc esi
loop l4
end_make_txbufferdefaultdata:
popa
ret
;/////////////////////////////////////////////////////////////////////
make_rxbuffer:
pusha
mov edx,0
lea esi,[rxbuffer]
l5:add esi,edx
cmp edx,8
jne l5
inc edx
end_make_rxbuffer:
popa
ret
;/////////////////////////////////////////////////////////////////////////////////////
make_rxbufferdefaultdata:
; esi=address of txbuffer
pusha
mov cx,8
lk:lea esi,[txbuffer]
mov eax,[esi]
mov eax,0
inc esi
loop lk
end_make_rxbufferdefaultdata:
popa
ret
;/////////////////////////////////////////////////////////////////////
make_frame:
pusha
mov edx,0
lea esi,[frame]
back:add esi,edx
cmp edx,8
jne back
inc edx
end_make_frame:
popa
ret
;/////////////////////////////////////////////////////////////////////////////////
make_framedefaultdata:
; esi=address of frame
pusha
mov cx,8
ll:mov esi,frame
mov eax,[esi]
mov eax,0
inc esi
loop ll
end_make_framedefaultdata:
popa
ret
;///////////////////////////////////////////////////////////////////////
add_frametorxbuffer:
; edi=address of rxbuffer
; esi=address of frame
pusha
lea esi, [frame]
lea edi,[rxbuffer]
mov cx,8
lm:
mov eax,[edi]
mov ebx,[esi]
add ax, bx
inc esi
inc edi
loop lm
end_add_oneframetorxbuffer:
popa
ret
;//////////////////////////////////////////////////////////////////////0
read_byteofframefromrxbuffer:
; edi=addressofrxbuffer
; esi=addressofcommand
pusha
add_commandtorxbuffer:
lea edi,[rxbuffer]
mov cx,8
lx: lea esi,[command]
mov eax,0
mov [esi],eax
inc esi
loop lx
mov cx,8
lt:
mov eax,[esi]
mov ebx,[edi]
add eax,ebx
inc esi
inc edi
loop lt
mov [esi],ax
add_commandtoframe:
lea edi,[frame] ;edi=addressofframe
mov esi,0
mov cx,8
lr: mov ebx,[edi]
mov eax,[esi]
add eax,ebx
inc esi
inc edi
loop lr
mov [esi],ax
read_commandfromframe:
; input ebx=numberofbyte
; output dx=command
push eax
push ebx
push esi
mov cx,8
ld:
add esi,ebx
add esi,ebx
loop ld
mov dl,[esi]
end_read_byteofframefromrxbuffer:
pop esi
pop ebx
pop eax
popa
ret
;///////////////////////////////////////////////////////////////////
write_byteframetotxbuffer:
; edx=number of byte
pusha
mov esi,[command]
mov ebx,header
rr: xor [esi],ebx
mov eax,[esi]
cmp eax,0
je cc
inc esi
jmp rr
cc: mov edi,[txbuffer]
mov edx,0
mov cx,8
ls:
add esi,ecx
mov ax,[edi]
mov bx,[esi]
inc edx
add ax,bx
loop ls
mov [edi],ax
end_write_frametotxbuffer:
popa
ret
;/////////////////////////////////////////////////////////////////////
make_crc:
push esi
push edi
; input edi=addressofbyte
; output dl=crcvalue
mov dl,0
lea esi,[CrcTable]
mov cx,8
lz: mov bl,byte[edi]
xor bl,dl
and ebx,0ffh
mov dl,byte[esi+ebx]
inc edi
loop lz
pop edi
pop esi
ret
;/////////////////////////////////////////////////////////////////////
add_crctoframe:
pusha
mov edi,[frame]
mov esi,[crc]
mov cx,8
lf:
mov ax,[esi]
mov bx,[edi]
add ax,bx
loop lf
mov [esi],ax
end_addcrctoframe:
popa
ret
;///////////////////////////////////////////////////////////////////////
check_crc:
;esi=addressof7bytesFrame
;output:bl=crcvalue
push esi
push edi
lea esi,[frameRead_7_16]
lea edi,[CrcTable]
;dl=start crc value
mov cx,8
tt: mov bl,byte[esi]
xor bl,dl
and ebx,0ffh
mov dl,byte[edi+ebx]
inc esi
loop tt
pop edi
pop esi
ret
;////////////////////////////////////////////////////////////////
send_crctotxbuffer:
; esi=address of txbuffer
pusha
mov esi,[txbuffer]
mov edi,[crc]
mov cx,8
lp:
mov ax,[esi]
mov bx,[edi]
mov ax,bx
inc esi
inc edi
loop lp
mov [esi],ax
end_sendcrctotxbuffer:
popa
ret
;/////////////////////////////////////////////////////////////////////
set_frameintxbufferwritecompletevalue:
; input ecx=number of byte
push eax
mov al,01h
mov byte[framewritecompleted],al
pop eax
ret
;//////////////////////////////////////////////////////////////////////
speakeron:
mov al,0b6h
out 43h,al
mov ax,0a97h
out 42H,AL
or al,03h ;speaker on
out 61h,al
call delay
and al,0fch ;speaker off
out 61h,al
mov ax,4c00h
int 80h
delay:
mov cx,0ffh
back1:
mov bx,0ffffh
back2:
dec bx
jnz back2
loop back1
ret
;/////////////////////////////////////////////////////////////////////
display_on_monitor:
pusha
mov ah,02h
lea edi,[txbuffer]
mov cx,8
ck: mov edx,[edi]
int 80h
inc edi
loop ck
enddisplay_on_monitor:
popa
ret
;///////////////////////////////////////////////////////////////
CrcTable:
pusha
db 0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, 0x83
db 0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41
db 0x9d, 0xc3, 0x21, 0x7f, 0xfc, 0xa2, 0x40, 0x1e
db 0x5f, 0x01, 0xe3, 0xbd, 0x3e, 0x60, 0x82, 0xdc
db 0x23, 0x7d, 0x9f, 0xc1, 0x42, 0x1c, 0xfe, 0xa0
db 0xe1, 0xbf, 0x5d, 0x03, 0x80, 0xde, 0x3c, 0x62
db 0xbe, 0xe0, 0x02, 0x5c, 0xdf, 0x81, 0x63, 0x3d
db 0x7c, 0x22, 0xc0, 0x9e, 0x1d, 0x43, 0xa1, 0xff
db 0x46, 0x18, 0xfa, 0xa4, 0x27, 0x79, 0x9b, 0xc5
db 0x84, 0xda, 0x38, 0x66, 0xe5, 0xbb, 0x59, 0x07
db 0xdb, 0x85, 0x67, 0x39, 0xba, 0xe4, 0x06, 0x58
db 0x19, 0x47, 0xa5, 0xfb, 0x78, 0x26, 0xc4, 0x9a
db 0x65, 0x3b, 0xd9, 0x87, 0x04, 0x5a, 0xb8, 0xe6
db 0xa7, 0xf9, 0x1b, 0x45, 0xc6, 0x98, 0x7a, 0x24
db 0xf8, 0xa6, 0x44, 0x1a, 0x99, 0xc7, 0x25, 0x7b
db 0x3a, 0x64, 0x86, 0xd8, 0x5b, 0x05, 0xe7, 0xb9
db 0x8c, 0xd2, 0x30, 0x6e, 0xed, 0xb3, 0x51, 0x0f
db 0x4e, 0x10, 0xf2, 0xac, 0x2f, 0x71, 0x93, 0xcd
db 0x11, 0x4f, 0xad, 0xf3, 0x70, 0x2e, 0xcc, 0x92
db 0xd3, 0x8d, 0x6f, 0x31, 0xb2, 0xec, 0x0e, 0x50
db 0xaf, 0xf1, 0x13, 0x4d, 0xce, 0x90, 0x72, 0x2c
db 0x6d, 0x33, 0xd1, 0x8f, 0x0c, 0x52, 0xb0, 0xee
db 0x32, 0x6c, 0x8e, 0xd0, 0x53, 0x0d, 0xef, 0xb1
db 0xf0, 0xae, 0x4c, 0x12, 0x91, 0xcf, 0x2d, 0x73
db 0xca, 0x94, 0x76, 0x28, 0xab, 0xf5, 0x17, 0x49
db 0x08, 0x56, 0xb4, 0xea, 0x69, 0x37, 0xd5, 0x8b
db 0x57, 0x09, 0xeb, 0xb5, 0x36, 0x68, 0x8a, 0xd4
db 0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16
db 0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a
db 0x2b, 0x75, 0x97, 0xc9, 0x4a, 0x14, 0xf6, 0xa8
db 0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7
db 0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35
popa
ret
;/////////////////////////////////////////////////////////////////////

وقتی این برنامه را در لینوکس کامپایل می کنم فایل obj را می سازد ولی در قسمت ساختن فایل اجرایی که ld -s -o my file my file.o است پیغام زیر را می دهد
ld: warning : cannot find entry symbol _start;defaulting to 08048080
myfile.o: In function 'start32
frame2.asm.text+0x1e):relocation truncated to fit: R_386_16 against .text ):frame2.asm
این برنامه برنامه ی نوشتن روی فریم است به زبان اسمبلی 8086 است وبا NASM روی fedora8کامپایل می شود