🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.asm
Article #1892

przerobienie kodu 16 bit na 32 bity

#1892
From: Tomasz
Date: Tue, 10 Mar 2009 11:04
508 lines
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-mail

Show 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