Author Topic: some problem with painting (mode 13h)  (Read 1397 times)

ghjjkl

  • Member
  • **
  • Posts: 53
some problem with painting (mode 13h)
« on: June 19, 2014, 11:45:55 PM »
i need to move some picture by keyboard. Picture must be stopped if it comes to sreen edge. I've tried smth like this(example):
Code: [Select]
(...)

.data

(...)

;buffer for picture
pict db 0,0,1,1,0,0
     db 0,0,1,1,0,0
     db 1,1,1,1,1,1
     db 1,1,1,1,1,1
     db 0,0,1,1,0,0
     db 0,0,1,1,0,0

(...)

.code

;there should be setting of 13h mode, changing vga palette and then drawing that picture in cycle

(...)

xor ah,ah
int 16h


;there should be checking if any button is pressed

(...)

;for example, if 'w' is pressed:

cmp al,'w'
jne @f

.if (PICTURE_POSITION >= 320) ;if there's one pixel left at least
sub PICTURE_POSITION,320
.endif
jmp short @000 ;otherwise

(...)

;then if 's' is pressed:

cmp al,'s'
jne @f ;otherwise

.if (PICTURE_POSITION < 320 * 200 - PICTURE_HEIGHT * 320) ;if there's one pixel left at least
sub PICTURE_POSITION,320
.endif
jmp short @001 ;otherwise

(...)

;that code works, but if i add code for left and right edges...

cmp al,'a'
jne @f

mov ax,PICURE_POSITION
cwd
mov bx,320 ;we need to find vertical component of picture's postion, it should be (0/320), (320/320), (640/320) and so on
div bx
mul bx
;for example: if picture's postion is 645 - it is located on third row, so if we want to stop it in the right place,
;we need to check if its position is bigger than (645/320)*320=640 and if it is, we move picture left
.if PICTURE_POSITION>ax
dec mach_pos
.endif


so there's problem: initially all border checking works fine, but when picture have passed some rows down and i try to move it left or right, my program just stucks hopelessly,
and all my next actions is ignored. I think if it worth to try this on real machine (i've tried it on dosbox so far) but what if i'll make my pc to be knelt?
« Last Edit: June 20, 2014, 04:42:13 AM by ghjjkl »

ghjjkl

  • Member
  • **
  • Posts: 53
Re: some problem with painting (mode 13h)
« Reply #1 on: July 04, 2014, 09:10:52 PM »
And one silly question: what does happen when some bytes being drawn reach upper left screen edge? Do they damage data which's located before 0A000h?

nidud

  • Member
  • *****
  • Posts: 1371
    • https://github.com/nidud/asmc
Re: some problem with painting (mode 13h)
« Reply #2 on: July 04, 2014, 10:06:50 PM »
A000 is a segment and you normally only change the offset. The result will usually be that it’s drawn at the bottom. I attached some 13h code which illustrate what happens when lines are drawn beyond the screen edge. You may manipulate the limits of the objects (.ex and .ey) to see it more clearly.

dedndave

  • Member
  • *****
  • Posts: 8734
  • Still using Abacus 2.0
    • DednDave
Re: some problem with painting (mode 13h)
« Reply #3 on: July 05, 2014, 03:07:43 AM »
if a segment register is set to A000h, you can only access A0000 to AFFFF physical
if you keep going, it "segment wraps" back to A0000   :biggrin: