Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Where does Boriel assemble to?
#1
So this is like an etch-o-sketch but It doesn't like the screen grabbing part. This all works fine in Sinclair BASIC. I'm guessing the picture data collides with Boriel's compiled code. I'm also guessing that Boriel decides where to inline ASM sections. Can you explicitly tell Boriel where to assemble to ?

Code:
#include <fastPlot.bas> DIM cx,cy,x,y,cl AS UINTEGER 10 REM The variables 20 LET cx=128: LET cy=80: LET x=cx: LET y=cy:LET cl=0: INK 0 30 INK cl: fastPlot(x,y) 100 IF INKEY$="a" AND x>=0 THEN LET x=x-1: END IF 120 IF INKEY$="s" AND x<=255 THEN LET x=x+1: END IF 130 IF INKEY$="o" AND y<=175 THEN LET y=y+1: END IF 150 IF INKEY$="k" AND y>=0 THEN LET y=y-1: END IF 160 IF INKEY$="f" THEN PRINT AT 0,0;"Frame grabbed!": grabScreen(): END IF 170 IF INKEY$="g" THEN PRINT AT 0,0;"Frame pasted!": CLS : dumpScreen() : END IF 180 IF INKEY$="n" AND cl>=0 THEN LET cl=cl-1: END IF 190 IF INKEY$="m" AND cl<=7 THEN LET cl=cl+1: END IF 200 GO TO 30 SUB grabScreen() ASM LD HL,16384 LD DE,51200 LD BC,6912 LDIR RET END ASM END SUB SUB dumpScreen() ASM LD HL,51200 LD DE,16384 LD BC,6912 LDIR RET END ASM END SUB

What i found strange also was that sometimes it seems to work fine, and sometimes it doesn't. Pressing f button does the frame grab
but FUSE freezes, the border goes blue and you might get garbled stuff at bottom of screen.
Reply
#2
Some observations:
  1. Don't use RET inside an ASM section to return from a normal function / subroutine. You must let the routine to return itself because it does some work with the stack upon returning.
    The only functions / subroutines that can be directly returned are FASTCALL ones (which basically are entirely in ASM). In your example, remove the RET instructions. Also remember that ZX Basic requires the IX and SP registers to be preserved when exiting an END ASM context.
  2. There is already a memcpy() function to copy variables, btw. (#include <memcpy.bas> memcpy(16384, 51200, 6192))
  3. PLOT x, y is already very optimized, and can be changed to plot into a different memory region (e.g. 51200). But it doesn't matter.
  4. If you need a memory block like in this case, you should use <alloc.bas> and call malloc(6192) to reserve a mem block, otherwise your code might overlap with such region. Also, if your block needs to be 256-aligned currently this is not supported.
Hope this would help you.

Any other questions just tell me (I will try your code when I have some spare time).
Reply
#3
Hi

I removed the RET statements that seems to do the trick. Thank you Smile
Reply
#4
you're welcome. :roll:

if your function / subs are entirely in ASM (as in the previous example), you can use FASTCALL for better performance.
E.g. SUB FASTCAL xxx( ) ....
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)