Thread View: pl.comp.lang.asm
4 messages
4 total messages
Started by Tomasz
Tue, 10 Mar 2009 11:04
przerobienie kodu 16 bit na 32 bity
Author: Tomasz
Date: Tue, 10 Mar 2009 11:04
Date: Tue, 10 Mar 2009 11:04
508 lines
9754 bytes
9754 bytes
Mam stary program ASM z 16 bitowym kodem a obecnie mam koniecznosc
polaczenia tego programu z 32 bitowym kodem produkowanym przez xHarbour i
BCC55.
Nigdy nie mialem do czynienie z assemblerem a producent tego
programu "Posnet" przeslal mi tylo stare archiwalia i stwierdzil ze juz sie
tym nie zajmuje.
Prosze o odpowiedz czy da sie w prosty sposob przerobic ten kod ASM na 32
bitowy, a jesli tak to czy znacie kogos kto by mi to zrobil?
W zalaczeniu ten 16 bitowy DF.ASM
--
Tomasz
----------------------------------------------
;
public CHECKSUM
public RS_INIT
public RS_DONE
public RS_SEND
public CHR_IN_BUF
public RS_GET
public RS_GET_NW
public TIMEOUT
;
extrn __PARC:far ; Clipper's character 'getter' get char*
extrn __PARNI:far ; Clipper's character 'getter' get int
extrn __RETC:far ; Clipper's character 'returner' return char*
extrn __RETL:far ; Clipper's character 'returner' return bool
extrn __RETNI:far ; Clipper's character 'returner' return int
extrn __RET:far ; Clipper's character 'returner' return void
;
;
DGROUP GROUP datasg ; Clipper's Data Segment
; the 'public' in the next statement combines the datasg
; to Clipper's DGROUP group
datasg segment public 'DATA'
RETVAL db 3 dup(" ")
port dw 0
irq db 0
PORT_ADDRS dw 3f8h, 2f8h, 3e8h, 2e8h
tim_vec dw 0,0
rs_vec dw 0,0
buffer db 4096 dup (" ")
wsk_pis dw 0
wsk_czyt dw 0
tr_allowed db 1
counter dw 0
timeout_c dw 18
db 13,10,"COM driver for POSNET fiscal printers. (c) 1995 by J.Zapa'a",13,10
datasg ends ; end of datasg (in DGROUP)
;
;
_prog segment
assume cs:_prog,ds:DGROUP,es:DGROUP
;----------------------------------------------------------------------------
WYPISZ MACRO l,aaa
push ax
push ds
mov ax,0b800h
mov ds,ax
mov al,aaa
mov byte ptr ds:[160*(10+l)+158],al
pop ds
pop ax
ENDM
receiver proc far
push ax
push bx
push dx
push ds
; WYPISZ 0,'I'
mov ax,DGROUP
mov ds,ax
mov dx,port
in al,dx ; czyta znak - tylko taki przerwanie jest zglaszane
cmp al,"" ; zatrzymanie transmisji
jne d1
mov tr_allowed,0
; WYPISZ 0,"X"
jmp r_q
d1: cmp al,"" ; wznowienie transmisji
jne d2
mov tr_allowed,1
; WYPISZ 0,"x"
jmp r_q
d2: mov bx,wsk_pis
mov [bx+buffer],al
inc bx
and bx,4095
mov wsk_pis,bx
r_q: mov al,20h
out 20h,al
pop ds
pop dx
pop bx
pop ax
iret
receiver endp
;----------------------------------------------------------------------------
timer proc far
; iret
; WYPISZ 1,'T'
push ax
push ds
mov ax,DGROUP
mov ds,ax
cmp counter,0
je td1
dec counter
td1: pushf
call dword ptr [tim_vec]
pop ds
pop ax
; WYPISZ 1,'t'
iret
timer endp
;----------------------------------------------------------------------------
al_to_hex proc near
add al,'0'
cmp al,'9'
jle juz
add al,'A'-'9'-1
juz: ret
al_to_hex endp
;----------------------------------------------------------------------------
CHECKSUM proc far ; far process
mov ax,1 ; get first para
push ax ; push AX
call __PARC ; call Chara "getter"
add sp,2 ; restore stack
; string in dx:ax
push ds ; preserve DS
push si
cld ; clear direction flag (L-R)
mov ds,dx
mov si,ax
cmp word ptr [si], 27+'P'*256
jne ok
inc si
inc si
ok: mov ah,255
petla: lodsb
or al,al
jz koniec
xor ah,al
jmp petla
koniec: mov al,ah
mov bx,DGROUP
mov ds,bx
mov si,offset DGROUP:RETVAL
mov cl,4
shr al,cl
call al_to_hex
mov [si],al
mov al,ah
and al,0fh
call al_to_hex
mov [si+1],al
mov byte ptr [si+2],0
mov ax,ds
mov bx,si
pop si
pop ds
push ax
push bx
call __retc
add sp,4
ret
CHECKSUM endp ; end of process
;----------------------------------------------------------------------------
OUTB MACRO offs,val
mov dx,bx
add dx,offs
mov al,val
out dx,al
mov cx,0
loop $-2
ENDM
init_port proc near
mov bx,dx
OUTB 3,80h
OUTB 1,0
OUTB 0,12 ; 12=9600 48=2400 6=19200
OUTB 3,3
OUTB 4,8 ; activate -OUT2
OUTB 1,1
; OUTB 1,0
ret
init_port endp
;----------------------------------------------------------------------------
init_irq proc near
and al,7
push ax ; al = irq
add al,8
mov ah,35h
int 21h
mov rs_vec,bx
mov rs_vec+2,es
mov ah,25h
push ds
mov bx,_prog
mov ds,bx
mov dx,offset receiver
int 21h
pop ds
mov ax,351ch
int 21h
mov tim_vec,bx
mov tim_vec+2,es
mov ah,25h
push ds
mov bx,_prog
mov ds,bx
mov dx,offset _prog:timer
int 21h
pop ds
pop ax
mov cl,al
mov ah,1
shl ah,cl
not ah
in al,21h
and al,ah
out 21h,al
ret
init_irq endp
;----------------------------------------------------------------------------
RS_DONE proc far
push ds
push es
mov ax,DGROUP
mov es,ax
mov dx,es:port
inc dx
xor al,al
out dx,al
mov dx,es:rs_vec
mov ds,es:rs_vec+2
mov al,es:irq
add al,8
mov ah,25h
int 21h
mov al,1ch
mov dx,es:tim_vec
mov ds,es:tim_vec+2
int 21h
pop es
pop ds
call __RET
ret
RS_DONE endp
;----------------------------------------------------------------------------
; RS_INIT (port_num, irq)
RS_INIT proc far ; far process
push ds
push es
mov ax,1 ; get first para
push ax
call __PARNI
pop bx
mov bx,ax
mov ax,DGROUP
mov ds,ax
dec bx
add bx,bx
mov dx,[PORT_ADDRS+bx]
mov port,dx
mov ax,2
push ax
call __PARNI
pop bx
mov irq,al
mov dx,port
call init_port
mov al,irq
call init_irq
mov dx,port
in al,dx
mov al,0
out dx,al
pop es
pop ds
call __ret
ret
RS_INIT endp
;----------------------------------------------------------------------------
send_char proc near ; wysyla znak z al (adres portu w dx)
; WYPISZ 2,'1'
s1: cmp es:counter,0
je send_koniec
cmp es:tr_allowed,1
jne s1
; WYPISZ 2,'2'
add dx,5
mov ah,al
s2: cmp es:counter,0
je send_koniec
in al,dx
and al,32
jz s2
; WYPISZ 2,'3'
sub dx,5
mov al,ah
out dx,al
; WYPISZ 2,'4'
send_koniec:
ret
send_char endp
;----------------------------------------------------------------------------
RS_SEND proc far
push ds
push es
push si
mov ax,1 ; get first para
push ax ; push AX
call __PARC ; call Chara "getter"
add sp,2 ; restore stack
; string in dx:ax
mov si,ax
mov ds,dx
mov ax,DGROUP
mov es,ax
mov ax,es:timeout_c
mov es:counter,ax
mov dx,es:port
ptl: lodsb
or al,al
jz kon
call send_char
cmp es:counter,0
je kon_false
jmp ptl
mov ax,1
jmp kon
kon_false:
mov ax,0
kon: pop si
pop es
pop ds
push ax
call __RETL
pop ax
ret
RS_SEND endp
;----------------------------------------------------------------------------
CHR_IN_BUF proc far
push ds
mov ax,DGROUP
mov ds,ax
mov ax,wsk_pis
sub ax,wsk_czyt
jns dd1
add ax,4096
dd1:
pop ds
push ax
call __RETNI
pop ax
ret
CHR_IN_BUF endp
;----------------------------------------------------------------------------
RS_GET proc far
push ds
mov ax,DGROUP
mov ds,ax
mov ax,timeout_c
mov counter,ax
mov bx,wsk_czyt
tt1: cmp counter,0
jne tt2
mov ax,-1
jmp rs_get_koniec
tt2: cmp bx,wsk_pis
je tt1
xor ah,ah
mov al,[bx+buffer]
inc bx
and bx,4095
mov wsk_czyt,bx
rs_get_koniec:
pop ds
push ax
call __RETNI
pop ax
ret
RS_GET endp
;----------------------------------------------------------------------------
RS_GET_NW proc far
push ds
mov ax,DGROUP
mov ds,ax
mov bx,wsk_czyt
cmp bx,wsk_pis
je brak
xor ah,ah
mov al,[bx+buffer]
inc bx
and bx,4095
mov wsk_czyt,bx
jmp powrot
brak: mov ax,-1
powrot: pop ds
push ax
call __RETNI
pop ax
ret
RS_GET_NW endp
;----------------------------------------------------------------------------
TIMEOUT proc far
mov ax,1 ; get first para
push ax ; push AX
call __PARNI
add sp,2 ; restore stack
push ds
mov bx,DGROUP
mov ds,bx
mov timeout_c,ax
pop ds
call __ret
ret
TIMEOUT endp
_prog ends ; end of segment
end ; end of program
Re: przerobienie kodu 16 bit na 32 bity
Author: Wojciech Muła
Date: Tue, 10 Mar 2009 11:38
Date: Tue, 10 Mar 2009 11:38
28 lines
2210 bytes
2210 bytes
"Tomasz" <tomasz_tomasz1@wp.pl> wrote: > Mam stary program ASM z 16 bitowym kodem a obecnie mam koniecznosc > polaczenia tego programu z 32 bitowym kodem produkowanym przez xHarbour i > BCC55. Harbour, ten darmowy kompilator Clippera? Jeszcze w Clipperze się coś nowego robi, czy tylko przenosicie stary program? > Nigdy nie mialem do czynienie z assemblerem a producent tego > programu "Posnet" przeslal mi tylo stare archiwalia i stwierdzil ze juz sie > tym nie zajmuje. > Prosze o odpowiedz czy da sie w prosty sposob przerobic ten kod ASM na 32 > bitowy, a jesli tak to czy znacie kogos kto by mi to zrobil? > W zalaczeniu ten 16 bitowy DF.ASM Spora część kodu to obsługa portu szeregowego, czyli coś, co już w Windowsach jest gotowe. Tak na pierwszy rzut oka wystarczy tylko sprawdzić jakie są ustawienia portu i prześledzić schemat transmisji, co sądząc po objętości kodu nie jest przesadnie skomplikowane. Wydaje mi się, że będzie to nawet można przetłumaczyć na C, czy C++. Ja się niestety nie podejmę, bo jestem zawalony robotą. w. -- Kupię: http://wm.ite.pl/kupie.html
Re: przerobienie kodu 16 bit na 32 bity
Author: Tomasz
Date: Thu, 12 Mar 2009 08:46
Date: Thu, 12 Mar 2009 08:46
13 lines
1483 bytes
1483 bytes
Użytkownik "Wojciech Muła" <wojciech_mula@poczta.null.onet.pl.invalid> napisał Spora część kodu to obsługa portu szeregowego, czyli coś, co już w Windowsach jest gotowe. Czy mozesz mnie nieco nakierowac czego i gdzie mam szukac jesli chodzi o to gotowa obsluge portu szeregowego pod Windows? -- Tomasz
Re: przerobienie kodu 16 bit na 32 bity
Author: Wojciech Muła
Date: Thu, 12 Mar 2009 09:55
Date: Thu, 12 Mar 2009 09:55
18 lines
1556 bytes
1556 bytes
"Tomasz" <tomasz_tomasz1@wp.pl> wrote: > Spora czę¶ć kodu to obsługa portu szeregowego, czyli co¶, co już w > Windowsach jest gotowe. > > Czy mozesz mnie nieco nakierowac czego i gdzie mam szukac jesli chodzi o to > gotowa obsluge portu szeregowego pod Windows? Na przykład to: http://www.codeproject.com/KB/system/serial_com.aspx W zasadzie poza ustawieniami transmisji, odwołujesz się do portu jak do zwykłego pliku, żadna filozofia. w. -- Kupię: http://wm.ite.pl/kupie.html
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads