Article View: pl.comp.lang.asm
Article #1892przerobienie kodu 16 bit na 32 bity
From: 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
Technical Details
Message-ID:
<gp5hlt$itu$1@atlantis.news.neostrada.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!newsfeed.neostrada.pl!nemesis.news.neostrada.pl!atlantis.news.neostrada.pl!news.neostrada.pl!not-for-mailShow Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!newsfeed.neostrada.pl!nemesis.news.neostrada.pl!atlantis.news.neostrada.pl!news.neostrada.pl!not-for-mail From: "Tomasz" <tomasz_tomasz1@wp.pl> Newsgroups: pl.comp.lang.asm Subject: przerobienie kodu 16 bit na 32 bity Date: Tue, 10 Mar 2009 12:04:56 +0100 Organization: TP - http://www.tp.pl/ Lines: 511 Message-ID: <gp5hlt$itu$1@atlantis.news.neostrada.pl> NNTP-Posting-Host: ahv199.neoplus.adsl.tpnet.pl X-Trace: atlantis.news.neostrada.pl 1236683262 19390 83.25.203.199 (10 Mar 2009 11:07:42 GMT) X-Complaints-To: usenet@news.neostrada.pl NNTP-Posting-Date: Tue, 10 Mar 2009 11:07:42 +0000 (UTC) X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2900.2180 X-RFC2646: Format=Flowed; Original X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180 X-Antivirus: avast! (VPS 090309-0, 2009-03-09), Outbound message X-Antivirus-Status: Clean MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit