ASM-print wont work right

Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
FlashBurn

ASM-print wont work right

Post by FlashBurn »

I?ve written a print function, but it wont work right. The problem is that it prints 1 line right and then sometimes do nothing on the screen and sometimes it prints 3 lines and then it starts in the first of the 3 lines. I think that the problem is my getxy function.

[attachment deleted by admin]
FlashBurn

Re:ASM-print wont work right

Post by FlashBurn »

This is a screenshot of one problem. It prints till where the cursor is and then starts in the first line of the "" filled lines.

[attachment deleted by admin]
drizzt

Re:ASM-print wont work right

Post by drizzt »

The code you have posted reprograms the PIC... I don't see any print code here!!!
FlashBurn

Re:ASM-print wont work right

Post by FlashBurn »

Ups ::) So now it should be the right file.

[attachment deleted by admin]
Curufir

Re:ASM-print wont work right

Post by Curufir »

Need some more info.

What is it you're expecting to see? Just a single backslash, a line of backslashes? You haven't actually said what you're trying to print
FlashBurn

Re:ASM-print wont work right

Post by FlashBurn »

No, My problem is that he prints only this 4 lines. If I print a string he also will print it in this 4 lines. I think the problem is the getxy function. This with the "\" was only a test to look where it goes into the first of the 4 lines. But if you will so, I have a endless loop and want to print "\" but he only print it in this 4 lines. I hope that you could understand my stupid english!
User avatar
Pype.Clicker
Member
Member
Posts: 5964
Joined: Wed Oct 18, 2006 2:31 am
Location: In a galaxy, far, far away
Contact:

Re:ASM-print wont work right

Post by Pype.Clicker »

seeing so much asm code without a push/pop looks strange. are you sure your precious ESI isn't clobbered somewhere ?
BTW, where is the code that calls print ?
FlashBurn

Re:ASM-print wont work right

Post by FlashBurn »

The "esi" register is not hte problem, believe me! What do you mean "where is the code that calls print"?
User avatar
Pype.Clicker
Member
Member
Posts: 5964
Joined: Wed Oct 18, 2006 2:31 am
Location: In a galaxy, far, far away
Contact:

Re:ASM-print wont work right

Post by Pype.Clicker »

i mean that you give us a print function without the code that invokes it. how can we check your calling code is okay and your data match what we see ?
You say "believe me" ... i believe what i see ...
FlashBurn

Re:ASM-print wont work right

Post by FlashBurn »

Ok here is the data :

Code: Select all

loop:
mov esi,test
call print

jmp loop

test  db '\ ',0
Is it enough or should I upload my whole os source?!
User avatar
Pype.Clicker
Member
Member
Posts: 5964
Joined: Wed Oct 18, 2006 2:31 am
Location: In a galaxy, far, far away
Contact:

Re:ASM-print wont work right

Post by Pype.Clicker »

Code: Select all

get_offset:
   call getxy

   mov bx,ax
   mov al,160
   mul bl
   shl bh,1      ;;; ??
   xchg bl,bh   ;;; ??
   xor bh,bh    ;;; ??
   add ax,bx

   mov edi,0b8000h
   add di,ax

   ret
those operations on bx seems weird. You'll end up with
bx == ((cursor.x*2)&0xFF)

i suggest you do

Code: Select all

   shr bx,7
instead

btw, it seems very inefficient to change the cursor place and re-read it as much as you do. You have a lot of div/mul instructions that could be removed if you only had start_current_line_offset variable. The X,Y coordinates of the cursor could also be stored in RAM so that you don't have to getXY() every time you start another printc().

remember that I/O access is alot slower than (cached) memory access...
FlashBurn

Re:ASM-print wont work right

Post by FlashBurn »

This is my new working print function. Maybe you know some optimations.

Code: Select all

;----------------------------
;   Input:
;   ESI = pointer to 0-terminated string
print:
   call getxy
   mov [cur_y],al
   mov [cur_x],ah
   
   xor cx,cx
   mov cl,ah
   shl cl,1
   
   mov bl,160
   mul bl
   
   add ax,cx
   
   mov edi,0b8000h
   add di,ax
.loop
   lodsb
   
   and al,al
   jz near .end
   
   cmp al,8
   je .tab
   
   cmp al,9
   je .back
   
   cmp al,10
   je near .new_line
   
   mov ah,7
   stosw
   
   cmp byte[cur_x],79
   je .new_line
   
   inc byte[cur_x]
   
   jmp .loop
.tab
   mov al,' '
   mov ah,7
   mov ecx,4
   rep stosw
   
   add byte[cur_x],4
   
   cmp byte[cur_x],79
   jng .loop
   
   mov al,[cur_x]
   sub al,4
   mov ah,79
   sub ah,al
   mov [cur_x],ah
   inc byte[cur_y]    

   jmp .loop
.back
   cmp byte[cur_x],0
   jne .back1
   
   cmp byte[cur_y],0
   je .loop
   
   mov byte[cur_x],80
   dec byte[cur_y]
.back1
   dec byte[cur_x]
   sub edi,2
   mov al,' '
   mov ah,7
   stosw
   sub edi,2
   
   jmp .loop
.new_line
   xor al,al
   mov [cur_x],al
   
   cmp byte[cur_y],24
   je .scroll_down
   
   inc byte[cur_y]
;----------------------------   
   xor cx,cx
   mov cl,ah
   shl cl,2
   
   mov bl,160
   mul bl
   
   add ax,cx
   
   mov edi,0b8000h
   add di,ax
;----------------------------   
   jmp .loop
.scroll_down
   push esi
   call scroll_down
   pop esi
   
   mov edi,0b8f00h
   
   jmp .loop
   
.end
   mov al,[cur_y]
   mov ah,[cur_x]
   call gotoxy
   
   ret
;----------------------------
;   vars
cur_y   db 0
cur_x   db 0
;----------------------------
FlashBurn

Re:ASM-print wont work right

Post by FlashBurn »

There is a problem on real PC?s now!? It seems like the x-coord and the y-coord are exchanged. Is this possible?
FlashBurn

Re:ASM-print wont work right

Post by FlashBurn »

I fixed the problem. Now the code is working!

Code: Select all

;----------------------------
;   Input:
;   ESI = pointer to 0-terminated string
print:
   call getxy
   mov [cur_y],al
   mov [cur_x],ah

   xor cx,cx
   mov cl,ah
   shl cl,1

   mov bl,160
   mul bl

   add ax,cx

   mov edi,0b8000h
   add di,ax
.loop
   lodsb

   and al,al
   jz near .end

   cmp al,8
   je .tab

   cmp al,9
   je .back

   cmp al,10
   je near .new_line

   mov ah,7
   stosw

   cmp byte[cur_x],79
   je .new_line

   inc byte[cur_x]

   jmp .loop
.tab
   mov al,' '
   mov ah,7
   mov ecx,4
   rep stosw

   add byte[cur_x],4

   cmp byte[cur_x],79
   jng .loop

   mov al,[cur_x]
   sub al,4
   mov ah,79
   sub ah,al
   mov [cur_x],ah
   inc byte[cur_y]

   jmp .loop
.back
   cmp byte[cur_x],0
   jne .back1

   cmp byte[cur_y],0
   je .loop

   mov byte[cur_x],80
   dec byte[cur_y]
.back1
   dec byte[cur_x]
   sub edi,2
   mov al,' '
   mov ah,7
   stosw
   sub edi,2

   jmp .loop
.new_line
   cmp byte[cur_y],24
   je .scroll_down

   inc byte[cur_y]
   mov byte[cur_x],0
;----------------------------
   mov al,[cur_y]
;   mov ah,[cur_x]

;   xor cx,cx
;   mov cl,ah
;   shl cl,2

   mov bl,160
   mul bl

;   add ax,cx

   mov edi,0b8000h
   add di,ax
;----------------------------
   jmp .loop
.scroll_down
   push esi
   call scroll_down
   pop esi

   mov byte[cur_x],0

   mov edi,0b8f00h

   jmp .loop

.end
   mov al,[cur_y]
   mov ah,[cur_x]
   call gotoxy

   ret
;----------------------------
;   vars
cur_y   db 0
cur_x   db 0
;----------------------------
User avatar
Pype.Clicker
Member
Member
Posts: 5964
Joined: Wed Oct 18, 2006 2:31 am
Location: In a galaxy, far, far away
Contact:

Re:ASM-print wont work right

Post by Pype.Clicker »

what i made for a fast PRINT in asm having all the tab, backspace, etc. features was to check %al against %20 (assuming ASC 00 .. ASC 1F were non-printable but rather command codes) and display immediately if above.

Code: Select all

    // prepare edi
.loop:
    lodsb
    cmp al,0x20
    jb .commands
    stosb
    jmp .loop

.commands:
    and eax,byte 0x1F
    jmp [print_commands+eax]

print_commands:
    dd end_of_message, ascii-display, ...
    dd do_tab (at 8th place), skip, do_CRLF, ...
this is known as "fast and slow path" optimization : you fasten the most common stuff and let the code be more complicated once you leave the default case.

Note that this code has a drawback that should be fixed: it doesn't check %edi remains in the 'console' area. This would cost 2 extra instruction.
Post Reply