The following warnings occurred:
Warning [2] Undefined array key "attachments" - Line: 20 - File: portal.php(680) : eval()'d code PHP 8.2.31 (Linux)
File Line Function
/inc/class_error.php 157 errorHandler->error
/portal.php(680) : eval()'d code 20 errorHandler->error_callback
/portal.php 680 eval
Warning [2] Undefined array key "attachments" - Line: 20 - File: portal.php(680) : eval()'d code PHP 8.2.31 (Linux)
File Line Function
/inc/class_error.php 157 errorHandler->error
/portal.php(680) : eval()'d code 20 errorHandler->error_callback
/portal.php 680 eval
Warning [2] Undefined array key "attachments" - Line: 20 - File: portal.php(680) : eval()'d code PHP 8.2.31 (Linux)
File Line Function
/inc/class_error.php 157 errorHandler->error
/portal.php(680) : eval()'d code 20 errorHandler->error_callback
/portal.php 680 eval
Warning [2] Undefined array key "attachments" - Line: 20 - File: portal.php(680) : eval()'d code PHP 8.2.31 (Linux)
File Line Function
/inc/class_error.php 157 errorHandler->error
/portal.php(680) : eval()'d code 20 errorHandler->error_callback
/portal.php 680 eval
Warning [2] Undefined array key "attachments" - Line: 20 - File: portal.php(680) : eval()'d code PHP 8.2.31 (Linux)
File Line Function
/inc/class_error.php 157 errorHandler->error
/portal.php(680) : eval()'d code 20 errorHandler->error_callback
/portal.php 680 eval
Warning [2] Undefined array key "attachments" - Line: 20 - File: portal.php(680) : eval()'d code PHP 8.2.31 (Linux)
File Line Function
/inc/class_error.php 157 errorHandler->error
/portal.php(680) : eval()'d code 20 errorHandler->error_callback
/portal.php 680 eval
Warning [2] Undefined array key "attachments" - Line: 20 - File: portal.php(680) : eval()'d code PHP 8.2.31 (Linux)
File Line Function
/inc/class_error.php 157 errorHandler->error
/portal.php(680) : eval()'d code 20 errorHandler->error_callback
/portal.php 680 eval
Warning [2] Undefined array key "attachments" - Line: 20 - File: portal.php(680) : eval()'d code PHP 8.2.31 (Linux)
File Line Function
/inc/class_error.php 157 errorHandler->error
/portal.php(680) : eval()'d code 20 errorHandler->error_callback
/portal.php 680 eval
Warning [2] Undefined array key "attachments" - Line: 20 - File: portal.php(680) : eval()'d code PHP 8.2.31 (Linux)
File Line Function
/inc/class_error.php 157 errorHandler->error
/portal.php(680) : eval()'d code 20 errorHandler->error_callback
/portal.php 680 eval
Warning [2] Undefined array key "attachments" - Line: 20 - File: portal.php(680) : eval()'d code PHP 8.2.31 (Linux)
File Line Function
/inc/class_error.php 157 errorHandler->error
/portal.php(680) : eval()'d code 20 errorHandler->error_callback
/portal.php 680 eval




Welcome, Guest
You have to register before you can post on our site.

Username
  

Password
  





Search Forums

(Advanced Search)

Forum Statistics
» Members: 277
» Latest member: Elemento26
» Forum threads: 1,087
» Forum posts: 6,490

Full Statistics

Online Users
There are currently 147 online users.
» 0 Member(s) | 146 Guest(s)
Bing

Latest Threads
GuSprites
Forum: Help & Support
Last Post: zedex82
2026-06-19, 06:39 PM
» Replies: 2
» Views: 355
New video Couse / Nuevo c...
Forum: News
Last Post: Duefectu
2026-04-29, 11:02 PM
» Replies: 0
» Views: 2,698
location of heap manageme...
Forum: Help & Support
Last Post: boriel
2026-03-07, 12:13 AM
» Replies: 1
» Views: 745
non-paged supervisor code...
Forum: Help & Support
Last Post: sdo303
2026-02-20, 06:38 PM
» Replies: 8
» Views: 1,848
How to open fuse as an ex...
Forum: How-To & Tutorials
Last Post: Duefectu
2026-02-09, 01:52 PM
» Replies: 3
» Views: 1,742
Old zxbasic game errors
Forum: Help & Support
Last Post: boriel
2025-11-09, 11:52 AM
» Replies: 7
» Views: 2,538
Error: Undefined GLOBAL l...
Forum: Help & Support
Last Post: ardentcrest
2025-11-04, 05:46 PM
» Replies: 3
» Views: 1,395
A Fast(er) Plot Routine f...
Forum: How-To & Tutorials
Last Post: tubz74
2025-10-30, 03:16 PM
» Replies: 2
» Views: 1,479
Hall of Fame - Include fo...
Forum: How-To & Tutorials
Last Post: tubz74
2025-10-28, 03:48 PM
» Replies: 0
» Views: 819
[SOLVED] Array layout bug...
Forum: Bug Reports
Last Post: Zoran
2025-10-25, 05:48 PM
» Replies: 2
» Views: 1,539

 
  Wrong #defined calculated value
Posted by: programandala.net - 2010-06-21, 10:57 AM - Forum: Help & Support - Replies (3)

I think there's something I'm missing about the way #define values are calculated, look:

Code:
#define screenFirstCol 0 #define screenLastCol 31 #define borderFirstCol screenFirstCol #define borderLastCol screenLastCol #define oWinFirstCol borderFirstCol+1 #define oWinLastCol borderLastCol-1 ' Wrong result, 32 instead of 30: #define oWinWidth oWinLastCol-oWinFirstCol+1 cls print "Expected values in cramps:" print print "screenFirstCol(0)=";screenFirstCol print "screenLastCol(31)=";screenLastCol print "borderFirstCol(0)=";borderFirstCol print "borderLastCol(31)=";borderLastCol print "oWinFirstCol(1)=";oWinFirstCol print "oWinLastCol(30)=";oWinLastCol ' Wrong result, 32 instead of 30: print "oWinWidth(30)=";oWinWidth pause 0 stop

What's the problem?

I think #defined values are simple labels calculated by the preprocessor. Is it right? Is there any limit about the depth of the calculated values?

Print this item

  The complex page about DIM
Posted by: programandala.net - 2010-06-21, 12:17 AM - Forum: Documentation - Replies (1)

I've rearranged the DIM page. It is the most complex page I've seen in the wiki.There were double contents here and there, and no clear order. It seems text was pasted from different sources several times. I tried to reorganize the whole into two subheaders (variables and arrays). I think now the order is clearer, and there are no redundant contents. I linked to the mentioned command line options, and to the pragma page (that doesn't exist yet).

May someone take a look and see, if something is missing or wrong in the contents, the order or the headers? Thank you.

Print this item

  BritLion's High Res Print
Posted by: britlion - 2010-06-20, 05:00 PM - Forum: How-To & Tutorials - Replies (18)

Here's what I've been playing with. Weird that someone else was looking into it too. I have to thank Turkwel over at the WorldOfSpectrum Forums for a LOT of guidance with this one.

This routine prints a character at pixel position (x,y); optionally with attributes.

0 < x < 254
0 < y < 191

If the character is < 256, it assumes you sent an ascii code, and pulls it from the character set. UDG ascii code characters aren't supported in this version (use the address of the UDG - eg. USR "a" instead). If the number is 256 - 65535, it assumes this is an address for a user defined block of data (a character sprite/udg) and plots this data to the screen instead.

If the attribute byte is zero, attributes are skipped, and the routine just updates pixels. I thought, since 0 is black on black, this wasn't too bad a compromise. Otherwise it adjusts the attributes to the byte given. Note that printing one character can adjust up to four attributes!

Note also that this is not a megafast solution to printing sprites. I'm still looking into that option.

There is a Newer version of this and a "sprite" example posted later in this thread.

Code:
FUNCTION t() as uLong asm DI LD DE,(23674) LD D,0 LD HL,(23672) EI end asm end function SUB HRPrint (x as uByte, y as uByte, char as uInteger, attribute as uByte) 'High res Printing, based on code produced, with thanks, by Turkwel over on the WOS boards. 'Brought to ZX Basic by Britlion, June 2010. asm ld b,(IX+7) ld c,(IX+5) push BC ; save our co-ordinates. ;print_char: ld d,(IX+09) inc d dec d jr z, HRPrint_From_Charset ld e,(IX+08) jp HR_Print HRPrint_From_Charset: ld de,(23606) ld h,0 ld l,(IX+8) ; character add hl,hl add hl,hl add hl,hl add hl,de HR_Print: call HRPat ;convert the Y and X pixel values to the correct Screen Address - Address in DE ld a,8 ;set counter to 8 - Bytes of Character Data to put down HRPrint0: push af ;save off Counter ld a,b cp 192 jr c,HRprint1 pop af jp HRPrintEnd ;don't print character if > 191 - off the bottom of the screen - restore AF and exit Print routine ;[this can be removed if you are keeping tight control of your Y values] HRprint1: push hl push de push de ;save off Address of Character Data, Screen Address, Screen Address ld a,c and 7 ld d,a ;get lowest 3 bits of Screen address ld e,255 ;set up E with the Mask to use - 11111111b = All On ld a,(hl) jr z,HRprint3 ;get a Byte of Character Data to put down - but ignore the following Mask shifting ;if the the X value is on an actual Character boundary i.e. there's no need to shift anything HRprint2: rrca srl e dec d jp nz,HRprint2 ;Rotate the Character Data Byte D times - and Shift the Mask Byte as well, forcing Zeroes into the ;Left hand side. The Mask will be used to split the Rotated Character Data over a Character boundary HRprint3: pop hl ;POP one of the Screen Addresses (formerly in DE) into HL ld d,a ld a,e and d ;or (hl) ld (hl),a ;take the Rotated Character Data, mask it with the Mask Byte and the OR it with what's already on the Screen, ;this takes care of the first part of the Byte ;[remove the OR (HL) if you just want a straight write rather than a merge] inc l ld a,l and 31 jr z,HRprint4 ;Increment the Screen Address and check to see if it's at the end of a line, ;if so then there's no need to put down the second part of the Byte ld a,e cpl and d ;or (hl) ld (hl),a ;Similar to the first Byte, we need to Invert the mask with a CPL so we can put down the second part of the Byte ;in the next Character location ;[again, remove the OR (HL) if you just want a straight write rather than a merge] HRprint4: pop de inc d inc b ;get the Screen Address back into DE, increment the MSB so it points the the Address immediately below ;it and Increment the Y value in B as well ld a,b and 7 call z,HRPat ;now check if the Y value has gone over a Character Boundary i.e. we will need to recalculate the Screen ;Address if we've jumped from one Character Line to another - messy but necessary especially for lines 7 and 15 pop hl inc hl ;get the Address of the Character Data back and increment it ready for the next byte of data pop af dec a jp nz,HRPrint0 ;get the Counter value back, decrement it and go back for another write if we haven't reached the end yet jp HRPrintAttributes ;HRPAT is a subroutine to convert pixel values into an absolute screen address ;On Entry - B = Y Value C = X Value On Exit - DE = Screen Address HRPat: ld a,b srl a srl a srl a ld e,a and 24 or 64 ld d,a ld a,b and 7 add a,d ld d,a ld a,e and 7 rrca rrca rrca ld e,a ld a,c srl a srl a srl a add a,e ld e,a ret HRPrintAttributes: POP BC ; recover our X-Y co-ordinates. ld d,0 ld a,(IX+11) ; attribute and a jr z, HRPrintEnd ; if attribute=0, then we don't do attributes. ld e,a ; pass to e ;transfer Attribute Byte to e for easier use ld a,b cp 192 jr nc, HRPrintEnd ;check Y position and exit if off bottom of screen push bc ;save off Y and X values for later and 248 ld h,22 ld l,a add hl,hl add hl,hl srl c srl c srl c ld b,d add hl,bc ;calculate the correct Attribute Address for the Y\X values ld (hl),e ;set the Attribute - this is ALWAYS set no matter what the valid Y\X values used pop bc ;get the Y and X values back into BC ;call print_attribute2 ;call the subroutine to see if an adjacent Horizontal Attribute needs to be set print_attributes1: ld a,c cp 248 jr nc,endPrintAttributes1 ;check to see if we are at Horizontal character 31 - if so then no need to set adjacent Horizontal Attribute and 7 jr z, endPrintAttributes1 ;and don't set the adjacent Horizontal Attribute if there's no need to inc l ld (hl),e dec l ;increment the Attribute address - set the adjacent horizontal Attribute - then set the Attribute Address back endPrintAttributes1: ; ld a,b cp 184 jr nc, HRPrintEnd ;check to see if we are at Vertical character 23 - if so then no need to set adjacent Vertical Attribute & Exit routine and 7 jr z, HRPrintEnd ;and don't set the adjacent Vertical Attribute if there's no need to & Exit routine ld a,l add a,32 ld l,a ld a,d adc a,h ld h,a ld (hl),e ;set the Attribute address to the line below - and set the adjacent Vertical Attribute ; ;drop through now into adjacent Horizontal Attribute subroutine - all RETs will now Exit the routine completely ; HRPrintAttribute2: ld a,c cp 248 jr nc, HRPrintEnd ;check to see if we are at Horizontal character 31 - if so then no need to set adjacent Horizontal Attribute and 7 jr z, HRPrintEnd ;and don't set the adjacent Horizontal Attribute if there's no need to inc l ld (hl),e dec l ;increment the Attribute address - set the adjacent horizontal Attribute - then set the Attribute Address back HRPrintEnd: end asm END SUB CLS PRINT at 15,0;"Routine Test" time=t() FOR y=0 to 100 FOR x=0 to 100 HRPrint(x,y,CODE"2",39) NEXT x NEXT y print (t()-time)/CASt(float,50); " seconds"

Print this item

  "C Nonsense in BASIC"
Posted by: programandala.net - 2010-06-20, 01:22 AM - Forum: Help & Support - Replies (5)

First case

I moved the main loop of my program into a sub, but I forgot to call the sub... so the program had nothing to do after DIMing and LETing some variables. The program returned to Sinclair BASIC with the error "C Nonsense in BASIC" instead of "0 OK".

Then I wrote a test program: just one sub, not called. The program returned to Sinclar BASIC with "0 OK". Strange. So there's something wrong with my program.

If I call the sub, or take its content out of the sub, everything works fine.

Second Case

But then I moved the main loop (out of any sub) to the end of the program... and the same error happened. I suspected two files I'm including, with character sets in assembler format, had something to do.

Here you are schematic versions of both cases:

This one works fine:

Code:
' ....most of the program here...... do ' MAIN LOOP loop #include "charset1.bas" #include "charset2.bas" def sub charset() ' bla bla end sub ' END OF FILE

But this one simply returns with "Nonsense in basic":

Code:
' ....most of the program here...... #include "charset1.bas" #include "charset2.bas" def sub charset() ' bla bla end sub do ' MAIN LOOP loop ' END OF FILE

Both included files have the same structure:

Code:
label: asm defb 1,8,86,68,78,78,78,6 ; hundreds of DEFB defb 1,8,86,68,78,78,78,6 end asm

So?

Both cases are not the same, but I suspected the included files are the reason of the strange error in the first case, when there was nothing to exectute; and the fact than the main loop is not found in the second case, and the error is returned.

I kept the main loop at the end of the program and removed the #includes. The program worked fine! Case 2 confirmed.

Then I moved the main loop into a sub but didn't called the sub... The program returned with a "0 OK" message as expected! Case 1 confirmed.

Will it happen with explicit (not #included) ASM sections? Let's see. I added some assembler lines right before the main loop sub, but the message was still "0 OK". It seems the strange behaviour is caused by #including the ASM sections.

Am I doing something wrong? Is there any limitation about the location of ASM sections or its including?

Print this item

  Compiuter PlotChat
Posted by: compiuter - 2010-06-19, 09:12 PM - Forum: How-To & Tutorials - Replies (18)

I am working in this routine pixel-precise.
It is ripped from microhobby and wos forum.
Modified by me. I need help to complete the paint attributes method, because in asm my routine works fine, baut when I passed t sub It fails.
Here is the code.
Modified 20-June-2010 included colour ripped by wos
Modified 21-June-2010 included attributes in the same sub.
Now are two independent subs methods:
1.-PlotChar(file,column,CharAdr)
PlotCharPaint(file,column,atribute)
2.- PlotChat(file,column,CharAdr,atrib)
Probably, this is the last update for this routine.

Modified 2010-07-09 including fastcall and all asm routines embebed. The on ly problem is because the rets in atributes process make me save three bytes in printer buffer. Also I can not use Ubyte in fastcall because I do not understand how it works.

Code:
'========================== '=plotchat=v3.100709======= '========================== 'ripped from microhobby and 'wos forum 'thx to britlion lcd boriel '-------------------------- border 6 cls 'demo of PlotChar Dim YoF,YoC As Ubyte YoF=50:YoC=70 YoCharAdr=@manwen PlotChar(100,200,YoCharAdr) PlotCharPaint(100,200,01101001b) '--- dim w as ubyte w=0 '--- PlotChat((256*32)+512,@manwen,01101001b) do 'char paper7 = 00111010b PlotChat(w,@manwen,00110010b) asm halt ;slow movement end asm PlotChat(w,@manwen,00111010b) w=w+1 ' YoF=YoF+1 loop until w>255 end '=fin====================== FUNCTION FASTCALL PlotChat(paramHL AS Uinteger,paramDE AS Uinteger,paramBC AS Uinteger) asm ;hl-atr de-coord bc-graf ld b,h ;pilla atr,0 ld c,l ;BFActual(0) pop hl ;recup ret pop de ;pilla p2-coord ex (sp),hl ;pilla p3-graf ;--- ;bc-atr de-coord bc-graf ;-------------------------- ;### primera parte ;-------------------------- ;para: ; ld hl,16384 ; ld (hl),a ; jr para ;el atributo viene en L ;en de debe estar manwen ;en bc estan las coords b-row c-col ;descartamos a=pareado del atributo ;--- ;enterramos las coords ld a,c ld (23500),a ld a,b ld (23501),a ;enterramos el atrib para luego ld a,l ld (23502),a ;--- ;comment halt for thrust the movement halt prixoratr: ;-------------------- ;entrada e=dirmemLB 22 ; d=dirmemHB 256*X ; H=pareja del atributo ; L=atributo 33 ; b=coord row 256*X ; c=coord colum 11 ; a=se queda a cero ; 1er byte de la figura? ;-------------------- ; ld e,(IX+7) ;file ; ld d,(IX+5) ;colum ; ld l,(IX+8) ;lowbyte charadr ; ld h,(IX+9) ;highbyte charadr ex de,hl ld d,b ld e,c ld b,8 bucbyt2: ld a,(hl) ;byte del carac push bc ;guar cont bytes ld b,8 bucbit2: push bc ;guar cont bits rla ;desplaza un bit jr nc,noplot2 ;si era 0 no pinta ld b,d ;b=y ;aki va d ld c,e ;c=x ;aki va e push de ;guar regs push hl push af ;aki jamas un halt enlentece mucho call co2 ;hace plot c,b ;pero plotw de mh63 pop af ;recup byte car pop hl ;recup dir del byte pop de ;recup coords noplot2: inc e ;inc x pop bc ;recup cont bits djnz bucbit2 ;prox bit inc d ;dec y pop bc ;recup cont bytes inc hl ;dir del byte ;dec hl ;dir del byte ld a,248 ;a=-8 add a,e ;resta 8 a x ld e,a djnz bucbyt2 ;prox byte ;dec d ;dec d ;dec d ;dec d ;dec d ;dec d ;dec d ;dec d ret ;============ ;MH63PLOTW ;============ ; screen 010VVsss vvvHHHHH ; coords VVxxxvvv HHHHHsss ; objeto 010VVvvv xxxHHHHH sss ; xxx son despreciados ;------------------------ co2: ld b,d ld c,e LD H,40h ;0100-0000 = 16384 LD A,B ;b=x=fila VVxxxvvv AND 7 ;0000-0vvv ADD A,H ;0100-0vvv LD H,A ;aseguramos H ;intermedio SRL B ;0VVxxxvv SRL B ;00VVxxxv SRL B ;000VVxxx LD A,B ;000VVxxx AND 24 ;000VV000 ADD A,H ;010VVvvv LD H,A ;desprecias xxx de la vertical ;fin del primer trabajo B ;--- LD A,B ;000VVxxx AND 7 ;00000xxx RRCA ;x00000xx RRCA ;xx00000x RRCA ;xxx00000 LD L,A ; LD A,C ;c=y=colum HHHHHsss AND 7 ;00000sss LD B,A ;B=00000sss ;el bit ;--- SRL C ;0HHHHHss SRL C ;00HHHHHs SRL C ;000HHHHH LD A,C ;000HHHHH ADD A,L ;xxxHHHHH LD L,A ;la horizontal ;---inicio bucle inversor INC B ;B=00000sss + 1 XOR A ;A=00000000 SCF ;F=xxxx-xxx1 c12: RRA ;A=1000-0000 DJNZ c12 ; limpiamos A = 0000-0000 ; buscamos un pixel ; el SFC mete un 1 al principio ; y RRA corre B veces hacia der ese 1 XOR (HL) ;orea A con dfbyte LD (HL),A ;para no borrar ant XOR (HL) ;en negro pone punto blanco ; OR (HL) ;hace over sobre punto negro ;RET ;----------------- priatr2: ;Ripped from Wos-Turkwel ; ld c,(IX+7) ; ld b,(IX+5) ; ld a,(IX+11) ;desentierro coords push hl ld hl,23500 ld c,(hl) inc hl ld b,(hl) ;desenterramos el atrib inc hl ld a,(hl) pop hl ;use alongside the print_char routine to set Attribute values automatically....... ;on entry BC uses exactly the same Y\X values as the print_char routine and A holds the Atrribute Value to be used. ; ;NB If you don't want to use A this way then set up something like ld a,(nnnn) at the start of the print_attribute routine ;instead and that way you can use your own "Sytem Variable" for printing each time ; ;suggested use: ld a,"A" ; ld bc,184*256+249 ; push bc ; call print_char ; pop bc ; ld a,128+64+5 ; call print_attribute ; ret ; ;alternatively you can integrate this into the print_char routine by looking after BC and A...it doesn't matter which way ;round you use it...char\attributes or attributes\char print_attributew: ld d,0 ld e,a ;transfer Attribute Byte to e for easier use ld a,b cp 192 ret nc ;check Y position and exit if off bottom of screen push bc ;save off Y and X values for later and 248 ld h,22 ld l,a add hl,hl add hl,hl srl c srl c srl c ld b,d add hl,bc ;calculate the correct Attribute Address for the Y\X values ld (hl),e ;set the Attribute - this is ALWAYS set no matter what the valid Y\X values used pop bc ;get the Y and X values back into BC call print_attribute2 ;call the subroutine to see if an adjacent Horizontal Attribute needs to be set ; ld a,b cp 184 ret nc ;check to see if we are at Vertical character 23 - if so then no need to set adjacent Vertical Attribute & Exit routine and 7 ret z ;and don't set the adjacent Vertical Attribute if there's no need to & Exit routine ld a,l add a,32 ld l,a ld a,d adc a,h ld h,a ld (hl),e ;set the Attribute address to the line below - and set the adjacent Vertical Attribute ; ;drop through now into adjacent Horizontal Attribute subroutine - all RETs will now Exit the routine completely ; print_attribute2w: ld a,c cp 248 ret nc ;check to see if we are at Horizontal character 31 - if so then no need to set adjacent Horizontal Attribute and 7 ret z ;and don't set the adjacent Horizontal Attribute if there's no need to inc l ld (hl),e dec l ;increment the Attribute address - set the adjacent horizontal Attribute - then set the Attribute Address back ret end asm end function 'fin del fastcall plotchat '========================== FUNCTION FASTCALL PlotChar(ROWparamHL AS Uinteger,COLparamDE AS Uinteger,ADRparamBC AS Uinteger) asm ;hl-atr de-coord bc-graf ld b,h ;pilla atr,0 ld c,l ;BFActual(0) pop hl ;recup retorno pop de ;pilla p2-coord ex (sp),hl ;pilla p3-graf ;--- ;bc-atr de-coord bc-graf ;-------------------------- ;### primera parte ;-------------------------- ;---entrada---------------- ;ROWparamHL bring C uinteger ;COLparamDE bring E uinteger ;ADRparamBC bring hl uinteger ;-------------------------- prixor: ;-------------------- ;entrada e=columnaDF ; d=filaDF ; hl=dirmem figura ; a=primer byte de figura ; ;-------------------- ld d,c ;row ;ld e,e ;col ;change order row x col ;hl ya viene predicho ;ld l,(IX+8) ;lowbyte charadr ;ld h,(IX+9) ;highbyte charadr ld b,8 bucbyt: ld a,(hl) ;byte del carac push bc ;guar cont bytes ld b,8 bucbit: push bc ;guar cont bits rla ;desplaza un bit jr nc,noplot ;si era 0 no pinta ld b,d ;b=y ;aki va d ld c,e ;c=x ;aki va e push de ;guar regs push hl push af ;aki jamas un halt enlentece mucho call co ;hace plot c,b ;pero plotw de mh63 pop af ;recup byte car pop hl ;recup dir del byte pop de ;recup coords noplot: inc e ;inc x pop bc ;recup cont bits djnz bucbit ;prox bit inc d ;dec y pop bc ;recup cont bytes inc hl ;dir del byte ;dec hl ;dir del byte ld a,248 ;a=-8 add a,e ;resta 8 a x ld e,a djnz bucbyt ;prox byte ;dec d ;dec d ;dec d ;dec d ;dec d ;dec d ;dec d ;dec d ret ;============ ;MH63PLOTW ;============ ; screen 010VVsss vvvHHHHH ; coords VVxxxvvv HHHHHsss ; objeto 010VVvvv xxxHHHHH sss ; xxx son despreciados ;------------------------ co: ld b,d ld c,e LD H,40h ;0100-0000 = 16384 LD A,B ;b=x=fila VVxxxvvv AND 7 ;0000-0vvv ADD A,H ;0100-0vvv LD H,A ;aseguramos H ;intermedio SRL B ;0VVxxxvv SRL B ;00VVxxxv SRL B ;000VVxxx LD A,B ;000VVxxx AND 24 ;000VV000 ADD A,H ;010VVvvv LD H,A ;desprecias xxx de la vertical ;fin del primer trabajo B ;--- LD A,B ;000VVxxx AND 7 ;00000xxx RRCA ;x00000xx RRCA ;xx00000x RRCA ;xxx00000 LD L,A ; LD A,C ;c=y=colum HHHHHsss AND 7 ;00000sss LD B,A ;B=00000sss ;el bit ;--- SRL C ;0HHHHHss SRL C ;00HHHHHs SRL C ;000HHHHH LD A,C ;000HHHHH ADD A,L ;xxxHHHHH LD L,A ;la horizontal ;---inicio bucle inversor INC B ;B=00000sss + 1 XOR A ;A=00000000 SCF ;F=xxxx-xxx1 c1: RRA ;A=1000-0000 DJNZ c1 ; limpiamos A = 0000-0000 ; buscamos un pixel ; el SFC mete un 1 al principio ; y RRA corre B veces hacia der ese 1 XOR (HL) ;orea A con dfbyte LD (HL),A ;para no borrar ant XOR (HL) ;en negro pone punto blanco ; OR (HL) ;hace over sobre punto negro ret end asm end function 'fin del fastcall plotchar '========================== sub PlotCharViaSub(row as ubyte,colum as ubyte, charadr as uinteger) asm halt prixor3: ;-------------------- ;entrada e=columnaDF ; d=filaDF ; hl=dirmem figura ; a=primer byte de figura ; ;-------------------- ld e,(IX+7) ;row ld d,(IX+5) ;colum ld l,(IX+8) ;lowbyte charadr ld h,(IX+9) ;highbyte charadr ld b,8 bucbyt3: ld a,(hl) ;byte del carac push bc ;guar cont bytes ld b,8 bucbit3: push bc ;guar cont bits rla ;desplaza un bit jr nc,noplot3 ;si era 0 no pinta ld b,d ;b=y ;aki va d ld c,e ;c=x ;aki va e push de ;guar regs push hl push af ;aki jamas un halt enlentece mucho call co ;hace plot c,b ;pero plotw de mh63 pop af ;recup byte car pop hl ;recup dir del byte pop de ;recup coords noplot3: inc e ;inc x pop bc ;recup cont bits djnz bucbit3 ;prox bit inc d ;dec y pop bc ;recup cont bytes inc hl ;dir del byte ;dec hl ;dir del byte ld a,248 ;a=-8 add a,e ;resta 8 a x ld e,a djnz bucbyt3 ;prox byte ;dec d ;dec d ;dec d ;dec d ;dec d ;dec d ;dec d ;dec d ret ;============ ;MH63PLOTW ;============ ; screen 010VVsss vvvHHHHH ; coords VVxxxvvv HHHHHsss ; objeto 010VVvvv xxxHHHHH sss ; xxx son despreciados ;------------------------ co3: ld b,d ld c,e LD H,40h ;0100-0000 = 16384 LD A,B ;b=x=fila VVxxxvvv AND 7 ;0000-0vvv ADD A,H ;0100-0vvv LD H,A ;aseguramos H ;intermedio SRL B ;0VVxxxvv SRL B ;00VVxxxv SRL B ;000VVxxx LD A,B ;000VVxxx AND 24 ;000VV000 ADD A,H ;010VVvvv LD H,A ;desprecias xxx de la vertical ;fin del primer trabajo B ;--- LD A,B ;000VVxxx AND 7 ;00000xxx RRCA ;x00000xx RRCA ;xx00000x RRCA ;xxx00000 LD L,A ; LD A,C ;c=y=colum HHHHHsss AND 7 ;00000sss LD B,A ;B=00000sss ;el bit ;--- SRL C ;0HHHHHss SRL C ;00HHHHHs SRL C ;000HHHHH LD A,C ;000HHHHH ADD A,L ;xxxHHHHH LD L,A ;la horizontal ;---inicio bucle inversor INC B ;B=00000sss + 1 XOR A ;A=00000000 SCF ;F=xxxx-xxx1 c13: RRA ;A=1000-0000 DJNZ c13 ; limpiamos A = 0000-0000 ; buscamos un pixel ; el SFC mete un 1 al principio ; y RRA corre B veces hacia der ese 1 XOR (HL) ;orea A con dfbyte LD (HL),A ;para no borrar ant XOR (HL) ;en negro pone punto blanco ; OR (HL) ;hace over sobre punto negro RET end asm end sub '========================== FUNCTION FASTCALL PlotCharPaint(ROWparamHL AS Uinteger,COLparamDE AS Uinteger,ATRparamBC AS Uinteger) asm ;hl-atr de-coord bc-graf ld b,h ;pilla atr,0 ld c,l ;BFActual(0) pop hl ;recup retorno pop de ;pilla p2-coord ex (sp),hl ;pilla p3-graf ;--- ;bc-atr de-coord bc-graf ;-------------------------- ;### primera parte ;-------------------------- ;---entrada---------------- ;ROWparamHL bring C uinteger ;COLparamDE bring E uinteger ;ATRparamBC bring hl uinteger ;-------------------------- priatr: ;Ripped from Wos-Turkwel ld b,c ld c,e ld a,l ;atr ok ;use alongside the print_char routine to set Attribute values automatically....... ;on entry BC uses exactly the same Y\X values as the print_char routine and A holds the Atrribute Value to be used. ; ;NB If you don't want to use A this way then set up something like ld a,(nnnn) at the start of the print_attribute routine ;instead and that way you can use your own "Sytem Variable" for printing each time ; ;suggested use: ld a,"A" ; ld bc,184*256+249 ; push bc ; call print_char ; pop bc ; ld a,128+64+5 ; call print_attribute ; ret ; ;alternatively you can integrate this into the print_char routine by looking after BC and A...it doesn't matter which way ;round you use it...char\attributes or attributes\char print_attribute: ld d,0 ld e,a ;transfer Attribute Byte to e for easier use ld a,b cp 192 ret nc ;check Y position and exit if off bottom of screen push bc ;save off Y and X values for later and 248 ld h,22 ld l,a add hl,hl add hl,hl srl c srl c srl c ld b,d add hl,bc ;calculate the correct Attribute Address for the Y\X values ld (hl),e ;set the Attribute - this is ALWAYS set no matter what the valid Y\X values used pop bc ;get the Y and X values back into BC call print_attribute2 ;call the subroutine to see if an adjacent Horizontal Attribute needs to be set ; ld a,b cp 184 ret nc ;check to see if we are at Vertical character 23 - if so then no need to set adjacent Vertical Attribute & Exit routine and 7 ret z ;and don't set the adjacent Vertical Attribute if there's no need to & Exit routine ld a,l add a,32 ld l,a ld a,d adc a,h ld h,a ld (hl),e ;set the Attribute address to the line below - and set the adjacent Vertical Attribute ; ;drop through now into adjacent Horizontal Attribute subroutine - all RETs will now Exit the routine completely ; print_attribute2: ld a,c cp 248 ret nc ;check to see if we are at Horizontal character 31 - if so then no need to set adjacent Horizontal Attribute and 7 ret z ;and don't set the adjacent Horizontal Attribute if there's no need to inc l ld (hl),e dec l ;increment the Attribute address - set the adjacent horizontal Attribute - then set the Attribute Address back ret end asm end function '========================== '----------------- '------ manwen: asm db 00011000b db 00001010b db 01111110b db 01011000b db 00011000b db 00111100b db 00100100b db 00000000b end asm '--- '==========================

Print this item

  how to #include files with relative path to the current one?
Posted by: programandala.net - 2010-06-19, 01:25 PM - Forum: Help & Support - Replies (4)

#include <file> includes from the library; in order to include from the directory of the including file, the main program, i tried #include <./file> but it doesn't work. Even #include <~/path_to_the_project/file> doesn't work.

The only solution I've found is: #include </home/user/path_to_the_project/file>, that is, including the whole path from the file system root.

Is there any way to configure the including directories? It would be great to include files with relative path from the current directory if they exist, and from the library if they don't exist.

Print this item

  Suggestion about the functions and the brackets
Posted by: programandala.net - 2010-06-18, 05:52 PM - Forum: Documentation - Replies (3)

I suggest to always use brackets with functions, both in the Syntax and Examples sections, and everywhere in the docs.

I suggest to include a note in the language reference page in order to explain that brackets are optional in functions for the sake of compatibility with Sinclair BASIC (and maybe FreeBASIC in some cases). But that's all.

I think the code is much more clear with brackets; they help to avoid bugs too. And it's the standard beside a good practice, isn't it? On the other hand, it's good to have a clear convention to write the docs.

Print this item

  Suggestion for the Syntax section
Posted by: programandala.net - 2010-06-18, 05:42 PM - Forum: Documentation - Replies (20)

Hi all,

I've been thinking how to simplify and homogenize the docs; and also how to make them easier to create and mantain.

I'm preparing a list of detailed suggestions for your consideration, but the first one is ready:

I suggest for the Syntax section:

  • to use <freebasic></freebasic>. I think it's easier to write and to read, and it looks nicer and more clear. The current combination of bold and italic is not comfortable to edit (besides, I think their Mediawiki notation is unhandy and hard to read).
  • to show syntax variants simply one after another, without "or" or any kind of comment; simply one line of code per variant (no need to mark optional parameters). No text in the section, only clear code with proper parameter names.
  • to use lowercase (it's a fact it's easier to read and to write) for everything (keywords and parameters).
  • to use camelCase for parameters with compound names (they cannot be reserved words anymore, because of <freebasic>).

You can see and example in the peek page I just rearranged. Note I left both syntax layouts for you to compare. Also the rest of the page is changed to illustrate some of my future suggestions.

Print this item

  First version of RND
Posted by: programandala.net - 2010-06-18, 04:49 PM - Forum: Documentation - No Replies

I've just created the first version of RND. The remarks are adapted from a recent message of boriel, and the examples are taken from FreeBASIC.

Print this item

  RND doesn't accept brackets (*solved*)
Posted by: programandala.net - 2010-06-18, 03:53 PM - Forum: Bug Reports - Replies (3)

I've just realized RND() is not accepted ("Unexpected token '(' <LP>"), but only RND. I know it doesn't have parameters in Sinclair BASIC, but it's a function anyway. In fact, both INKEY and INKEY() are accepted, and the case is analogous.

I took a look at the functions list of the original ZX Spectrum manual (page 198, Spanish edition), and realized that PI is there! I never thougth it was a function, but a constant. Well, I tried PI() Smile in ZX BASIC and it's not accepted, not a surprise.

It's clear PI is a constant (that's the description in the wiki), but what's the difference between RND and INKEY? They both are functions that need no parameter. I think RND() should be accepted, if only for syntax coherence.

(I've just read the FreeBASIC's RND syntax. It's accepted without brackets, but can have an optional parameter, the seed.)

Print this item