🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
4 messages
4 total messages Started by "Tomasz" Tue, 10 Mar 2009 12:04
przerobienie kodu 16 bit na 32 bity
#1841
Author: "Tomasz"
Date: Tue, 10 Mar 2009 12:04
512 lines
8177 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
#1842
Author: Wojciech =?ISO-8
Date: Tue, 10 Mar 2009 12:38
36 lines
1171 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
#1843
Author: "Tomasz"
Date: Thu, 12 Mar 2009 09:46
16 lines
328 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
#1844
Author: Wojciech =?UTF-8
Date: Thu, 12 Mar 2009 10:55
19 lines
499 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