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
Author: "Tomasz"
Date: Tue, 10 Mar 2009 12:04
Date: Tue, 10 Mar 2009 12:04
512 lines
8177 bytes
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
Author: Wojciech =?ISO-8
Date: Tue, 10 Mar 2009 12:38
Date: Tue, 10 Mar 2009 12:38
36 lines
1171 bytes
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
Author: "Tomasz"
Date: Thu, 12 Mar 2009 09:46
Date: Thu, 12 Mar 2009 09:46
16 lines
328 bytes
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
Author: Wojciech =?UTF-8
Date: Thu, 12 Mar 2009 10:55
Date: Thu, 12 Mar 2009 10:55
19 lines
499 bytes
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