Congratulations!

[Valid RSS] This is a valid RSS feed.

Recommendations

This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.

Source: http://feeds2.feedburner.com/es/qblog

  1. <?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
  2. xmlns:content="http://purl.org/rss/1.0/modules/content/"
  3. xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  4. xmlns:dc="http://purl.org/dc/elements/1.1/"
  5. xmlns:atom="http://www.w3.org/2005/Atom"
  6. xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  7. xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  8. xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
  9. >
  10.  
  11. <channel>
  12. <title>QBlog</title>
  13. <atom:link href="https://sinclairqles.wordpress.com/feed/" rel="self" type="application/rss+xml" />
  14. <link>https://sinclairqles.wordpress.com</link>
  15. <description>El blog sobre Sinclair QL en castellano</description>
  16. <lastBuildDate>Sat, 27 Apr 2024 15:38:00 +0000</lastBuildDate>
  17. <language>es</language>
  18. <sy:updatePeriod>
  19. hourly </sy:updatePeriod>
  20. <sy:updateFrequency>
  21. 1 </sy:updateFrequency>
  22. <generator>http://wordpress.com/</generator>
  23. <cloud domain='sinclairqles.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
  24. <image>
  25. <url>https://s0.wp.com/i/buttonw-com.png</url>
  26. <title>QBlog</title>
  27. <link>https://sinclairqles.wordpress.com</link>
  28. </image>
  29. <atom:link rel="search" type="application/opensearchdescription+xml" href="https://sinclairqles.wordpress.com/osd.xml" title="QBlog" />
  30. <atom:link rel='hub' href='https://sinclairqles.wordpress.com/?pushpress=hub'/>
  31. <item>
  32. <title>QIMSI Gold ¡Una nueva GoldCard!</title>
  33. <link>https://sinclairqles.wordpress.com/2024/04/27/qimsi-gold-una-nueva-goldcard/</link>
  34. <comments>https://sinclairqles.wordpress.com/2024/04/27/qimsi-gold-una-nueva-goldcard/#respond</comments>
  35. <dc:creator><![CDATA[afx]]></dc:creator>
  36. <pubDate>Sat, 27 Apr 2024 15:38:00 +0000</pubDate>
  37. <category><![CDATA[Miscelánea]]></category>
  38. <guid isPermaLink="false">http://sinclairqles.wordpress.com/?p=3804</guid>
  39.  
  40. <description><![CDATA[Peter Graf lo ha vuelto a hacer, y esta vez a lo grande. Acaba de anunciar una nueva tarjeta de expansión para el QL pero esta vez … ¡Vía puerto ROM! Una autentica locura. Las características son: Y todo esto en una placa de 53 x 35 mm que se conecta al puerto ROM del &#8230;<p><a href="https://sinclairqles.wordpress.com/2024/04/27/qimsi-gold-una-nueva-goldcard/" class="more-link">Leer Más</a></p>]]></description>
  41. <content:encoded><![CDATA[
  42. <p>Peter Graf lo ha vuelto a hacer, y esta vez a lo grande. Acaba de anunciar una nueva tarjeta de expansión para el QL pero esta vez … ¡Vía puerto ROM! Una autentica locura.</p>
  43.  
  44.  
  45.  
  46. <p>Las características son:</p>
  47.  
  48.  
  49.  
  50. <ul>
  51. <li>Conexión con pantallas modernas vía salida VESA estándar. Soporta los modos de videos tradicionales del QL añadiendo modos adicionales con más resolución (hasta 1024&#215;768) y más colores (hasta 65536).</li>
  52.  
  53.  
  54.  
  55. <li>Una CPU compatible con el 68000 a 40 MHz.</li>
  56.  
  57.  
  58.  
  59. <li>32 MB de RAM</li>
  60.  
  61.  
  62.  
  63. <li>Soporte para sistemas operativos Minerva y SMSQ/E</li>
  64.  
  65.  
  66.  
  67. <li>Un reloj en tiempo real</li>
  68.  
  69.  
  70.  
  71. <li>Un puerto serie a 115200 baudios</li>
  72.  
  73.  
  74.  
  75. <li>Conexión con ratón PS2</li>
  76.  
  77.  
  78.  
  79. <li>Conexión con teclado PS2</li>
  80.  
  81.  
  82.  
  83. <li>Un puerto adicional de entrada / salida.</li>
  84. </ul>
  85.  
  86.  
  87.  
  88. <p>Y todo esto en una placa de 53 x 35 mm que se conecta al puerto ROM del QL.</p>
  89.  
  90.  
  91.  
  92. <p>Oficialmente lo van a presentar en el evento alemán del 40 aniversario del QL (17/18/19 de mayo), pero ya hay un adelanto en un hilo de QLFormum, <a href="https://qlforum.co.uk/viewtopic.php?t=4799" rel="nofollow">https://qlforum.co.uk/viewtopic.php?t=4799</a> .</p>
  93.  
  94.  
  95.  
  96. <p>Lo mejor es verlo en imágenes.</p>
  97.  
  98.  
  99.  
  100. <figure class="wp-block-image size-large"><img width="400" height="294" data-attachment-id="3805" data-permalink="https://sinclairqles.wordpress.com/2024/04/27/qimsi-gold-una-nueva-goldcard/qimsigold/" data-orig-file="https://sinclairqles.files.wordpress.com/2024/04/qimsigold.jpg" data-orig-size="400,294" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="qimsigold" data-image-description="" data-image-caption="" data-medium-file="https://sinclairqles.files.wordpress.com/2024/04/qimsigold.jpg?w=300" data-large-file="https://sinclairqles.files.wordpress.com/2024/04/qimsigold.jpg?w=400" src="https://sinclairqles.files.wordpress.com/2024/04/qimsigold.jpg?w=400" alt="" class="wp-image-3805" srcset="https://sinclairqles.files.wordpress.com/2024/04/qimsigold.jpg 400w, https://sinclairqles.files.wordpress.com/2024/04/qimsigold.jpg?w=150 150w, https://sinclairqles.files.wordpress.com/2024/04/qimsigold.jpg?w=300 300w" sizes="(max-width: 400px) 100vw, 400px" /></figure>
  101.  
  102.  
  103.  
  104. <figure class="wp-block-image size-large"><img width="400" height="303" data-attachment-id="3806" data-permalink="https://sinclairqles.wordpress.com/2024/04/27/qimsi-gold-una-nueva-goldcard/qimsigold2/" data-orig-file="https://sinclairqles.files.wordpress.com/2024/04/qimsigold2.jpg" data-orig-size="400,303" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;Armando Fumero Fern\u00e1ndez&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1714172950&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="qimsigold2" data-image-description="" data-image-caption="" data-medium-file="https://sinclairqles.files.wordpress.com/2024/04/qimsigold2.jpg?w=300" data-large-file="https://sinclairqles.files.wordpress.com/2024/04/qimsigold2.jpg?w=400" src="https://sinclairqles.files.wordpress.com/2024/04/qimsigold2.jpg?w=400" alt="" class="wp-image-3806" srcset="https://sinclairqles.files.wordpress.com/2024/04/qimsigold2.jpg 400w, https://sinclairqles.files.wordpress.com/2024/04/qimsigold2.jpg?w=150 150w, https://sinclairqles.files.wordpress.com/2024/04/qimsigold2.jpg?w=300 300w" sizes="(max-width: 400px) 100vw, 400px" /></figure>
  105. ]]></content:encoded>
  106. <wfw:commentRss>https://sinclairqles.wordpress.com/2024/04/27/qimsi-gold-una-nueva-goldcard/feed/</wfw:commentRss>
  107. <slash:comments>0</slash:comments>
  108. <media:content url="https://2.gravatar.com/avatar/2e948c7450b5c4716e0fc96ea0278fc228d8f5b3fd19305b5133c6cd0d22928a?s=96&#38;d=retro&#38;r=G" medium="image">
  109. <media:title type="html">afx</media:title>
  110. </media:content>
  111.  
  112. <media:content url="https://sinclairqles.files.wordpress.com/2024/04/qimsigold.jpg?w=400" medium="image" />
  113.  
  114. <media:content url="https://sinclairqles.files.wordpress.com/2024/04/qimsigold2.jpg?w=400" medium="image" />
  115. </item>
  116. <item>
  117. <title>Programando mi primera Demo en QL – fascículo IV, colisiones y puntuaciones</title>
  118. <link>https://sinclairqles.wordpress.com/2024/03/30/programando-mi-primera-demo-en-ql-fasciculo-iv-colisiones-y-puntuaciones/</link>
  119. <comments>https://sinclairqles.wordpress.com/2024/03/30/programando-mi-primera-demo-en-ql-fasciculo-iv-colisiones-y-puntuaciones/#comments</comments>
  120. <dc:creator><![CDATA[badaman]]></dc:creator>
  121. <pubDate>Sat, 30 Mar 2024 17:16:37 +0000</pubDate>
  122. <category><![CDATA[Programación]]></category>
  123. <category><![CDATA[SuperBASIC]]></category>
  124. <guid isPermaLink="false">http://sinclairqles.wordpress.com/?p=3778</guid>
  125.  
  126. <description><![CDATA[Esta colección de pocos artículos pretende dar a conocer las particularidades del SuperBASIC mediante un ejemplo práctico, la realización de una pequeña demo.<p><a href="https://sinclairqles.wordpress.com/2024/03/30/programando-mi-primera-demo-en-ql-fasciculo-iv-colisiones-y-puntuaciones/" class="more-link">Leer Más</a></p>]]></description>
  127. <content:encoded><![CDATA[
  128. <p>Viene del artículo: «<a href="https://sinclairqles.wordpress.com/2024/03/29/programando-mi-primera-demo-en-ql-fasciculo-iii-movimiento-y-rebotes/">Programando mi propia demo en QL III</a>»</p>
  129.  
  130.  
  131.  
  132. <p>Finaliza esta serie de artículos, y en esta ocasión veremos cómo controlar las colisiones y las puntuaciones para dejar nuestra demo terminada.</p>
  133.  
  134.  
  135.  
  136. <h2 class="wp-block-heading">El Ying y el Yang</h2>
  137.  
  138.  
  139.  
  140. <p>En la línea 500 de esta versión, he inicializado los marcadores a 200. Este valor se corresponde con el número de casillas del tablero del color de cada bola. En un tablero de 20&#215;20, cuya área inicial de cada bola es de 10&#215;20, el número de casillas es de 200, luego el número de puntos es 200.</p>
  141.  
  142.  
  143.  
  144. <p>Cada vez que una bola se adentre en la zona de la bola contraria, robará una casilla y rebotará para volver a su zona del tablero. En ese momento, el marcador de la bola en cuestión se incrementará en 1, y el de la otra bola se reducirá en 1.</p>
  145.  
  146.  
  147.  
  148. <p>¡Este es el delicado equilibrio entre las fuerzas del Yin y del Yang!</p>
  149.  
  150.  
  151.  
  152. <span id="more-3778"></span>
  153.  
  154.  
  155.  
  156. <h2 class="wp-block-heading">La versión IV</h2>
  157.  
  158.  
  159.  
  160. <p>Hay pocos cambios en esta versión.</p>
  161.  
  162.  
  163.  
  164. <pre class="wp-block-code"><code>100 REMark Yin &amp; Yang v.4
  165. 110 REMark GPL, 2024, Badaman
  166. 120 REMark Colisiones y puntuaciones
  167. 130 :
  168. 140 CLEAR: RANDOMISE: ch%=3: ch2%=4
  169. 150 dev$="mdv1_": prg$="yinyang": v$="v4"
  170. 160 :
  171. 170 INICIO: PANTALLA
  172. 180 REPeat prg
  173. 190   n%=1-n%
  174. 200   BORRA(n%): CALCULA(n%)
  175. 210   MUEVE(n%): PRUEBA(n%)
  176. 220   IF KEYROW(1)=8: EXIT prg: REMark ESC
  177. 230 END REPeat prg
  178. 240 FIN: STOP
  179. 250 :
  180. 260 DEFine PROCedure sa
  181. 270   REMark Salva los cambios
  182. 280   file$ = dev$&amp;prg$&amp;"_"&amp;v$&amp;"_bas"
  183. 290   DELETE file$ : SAVE file$
  184. 300 END DEFine sa
  185. 310 :
  186. 320 DEFine PROCedure INICIO
  187. 330   REMark Inicializacion del programa
  188. 340   an%=20-1: al%=20-1
  189. 350   DIM tablero%(an%, al%): DIM b%(1,5)
  190. 360   f$=" ": b$="O": REMark b$=CHR$(226)
  191. 370   FOR i=0 TO 19
  192. 380     FOR j= 0 TO  9: tablero%(i,j)=0
  193. 390     FOR j=10 TO 19: tablero%(i,j)=1
  194. 400   END FOR i
  195. 410   REMark Bolas, posiciones 'x' e 'y'
  196. 420   b%(0,0)=RND( 0 TO 18) : REMark x1
  197. 430   b%(0,1)=RND( 0 TO  9) : REMark y1
  198. 440   b%(1,0)=RND( 1 TO 19) : REMark x2
  199. 450   b%(1,1)=RND(10 TO 19) : REMark y2
  200. 460   REMark Desplazamientos 'dx' y 'dy'
  201. 470   b%(0,2)= 1: b%(0,3)= 1: REMark d1
  202. 480   b%(1,2)=-1: b%(1,3)=-1: REMark d2
  203. 490   REMark Ambas puntuaciones
  204. 500   b%(0,4)=200 : b%(1,4)=200
  205. 510   REMark Colores
  206. 520   b%(0,5)=1 : b%(1,5)=6
  207. 530   n%=1 : REMark Bola alterna
  208. 540 END DEFine INICIO
  209. 550 :
  210. 560 DEFine PROCedure FIN
  211. 570   REMark Finalizacion del programa
  212. 580   CLOSE #ch%: CLOSE #ch2%: MODE 4
  213. 590 END DEFine FIN
  214. 600 :
  215. 610 DEFine PROCedure PANTALLA
  216. 620   REMark Presentacion de pantalla
  217. 630   MODE 8
  218. 640   REMark Dibuja tablero
  219. 650   OPEN   #ch%,scr_512x256a0x0
  220. 660   OPEN   #ch2%,scr_324x225a97x18
  221. 670   PAPER  #ch%,5,7: CLS #ch%
  222. 680   PAPER  #ch2%,0: CLS #ch2%
  223. 690   WINDOW #ch%,324,202,94,16
  224. 700   WINDOW #ch2%,324,22,94,218
  225. 710   PAPER  #ch%,b%(0,5): CLS #ch%
  226. 720   PAPER  #ch2%,3: CLS #ch2%
  227. 730   BORDER #ch%,1,3: BORDER #ch2%,1
  228. 740   BLOCK  #ch%,160,200,160,0,b%(1,5)
  229. 750   CSIZE  #ch%,3,0: CSIZE #ch2%,0,1
  230. 760   INK    #ch2%,4: CURSOR #ch2%,99,0
  231. 770   PRINT  #ch2%,"YIN &amp; YANG"
  232. 780   INK    #ch2%,7
  233. 790   REMark Posicion inicial de pelotas
  234. 800   FOR i=0,1: MUEVE(i): MARCADOR(i)
  235. 810 END DEFine PANTALLA
  236. 820 :
  237. 830 DEFine PROCedure MARCADOR(bola%)
  238. 840   REMark Actualiza el marcador
  239. 850   CURSOR #ch2%,283*bola%,0
  240. 860   PRINT  #ch2%,CERO$(b%(bola%,4))
  241. 870 END DEFine MARCADOR
  242. 880 :
  243. 890 DEFine FuNction CERO$(valor)
  244. 900   REMark Rellena con ceros, max. 999
  245. 910   txt$=valor: ln%=LEN(txt$)
  246. 920   RETurn FILL$("0",3-ln%)&amp;txt$
  247. 930 END DEFine CERO$
  248. 940 :
  249. 950 DEFine PROCedure BORRA(bola%)
  250. 960   REMark Borra la bola
  251. 970   LOCal x%, y%, c1%
  252. 980   x%=b%(bola%,0) : y%=b%(bola%,1)
  253. 990   c1%=b%(bola%,5): PAPER #ch%,c1%
  254. 1000   AT #ch%,x%,y%: PRINT #ch%,f$
  255. 1010 END DEFine BORRA
  256. 1020 :
  257. 1030 DEFine PROCedure CALCULA(bola%)
  258. 1040   REMark Calcula un movimiento
  259. 1050   LOCal x%, y%, dx%, dy%
  260. 1060   x%=b%(bola%,0): dx%=b%(bola%,2)
  261. 1070   y%=b%(bola%,1): dy%=b%(bola%,3)
  262. 1080   x%=x%+dx%: b%(bola%,0)=x%
  263. 1090   y%=y%+dy%: b%(bola%,1)=y%
  264. 1100 END DEFine CALCULA
  265. 1110 :
  266. 1120 DEFine PROCedure MUEVE(bola%)
  267. 1130   REMark Mueve la bola
  268. 1140   LOCal x%, y%, c1%, c2%
  269. 1150   x%=b%(bola%,0): y%=b%(bola%,1)
  270. 1160   c1%=b%(bola%,5): c2%=b%(1-bola%,5)
  271. 1170   PAPER #ch%,c1%: INK #ch%,c2%
  272. 1180   AT #ch%,x%,y% : PRINT #ch%,b$
  273. 1190 END DEFine MUEVE
  274. 1200 :
  275. 1210 DEFine PROCedure PRUEBA(bola%)
  276. 1220   REMark Comprueba colisiones
  277. 1230   LOCal x%, y%, dx%, dy%
  278. 1240   x%=b%(bola%,0): dx%=b%(bola%,2)
  279. 1250   y%=b%(bola%,1): dy%=b%(bola%,3)
  280. 1260   :
  281. 1270   IF tablero%(x%, y%)=1-bola% THEN
  282. 1280     IF y%-dy%&gt;1 AND y%-dy%&lt;18 THEN
  283. 1290       dy%=-dy%: b%(bola%,3)=dy%
  284. 1300       tablero%(x%, y%)=bola%
  285. 1310       b%(bola%,4)=b%(bola%,4)+1
  286. 1320       b%(1-bola%,4)=b%(1-bola%,4)-1
  287. 1330       FOR i=0,1: MARCADOR(i)
  288. 1340     END IF
  289. 1350   END IF
  290. 1360   :
  291. 1370   IF x%=0 OR x%=19: b%(bola%,2)=-dx%
  292. 1380   IF y%=0 OR y%=19: b%(bola%,3)=-dy%
  293. 1390 END DEFine PRUEBA
  294. </code></pre>
  295.  
  296.  
  297.  
  298. <h2 class="wp-block-heading">Rebotes</h2>
  299.  
  300.  
  301.  
  302. <p>En estas pocas líneas de código reside la «magia» de la demo:</p>
  303.  
  304.  
  305.  
  306. <pre class="wp-block-code"><code>1270   IF tablero%(x%, y%)=1-bola% THEN
  307. 1280     IF y%-dy%&gt;1 AND y%-dy%&lt;18 THEN
  308. 1290       dy%=-dy%: b%(bola%,3)=dy%
  309. 1300       tablero%(x%, y%)=bola%
  310. 1310       b%(bola%,4)=b%(bola%,4)+1
  311. 1320       b%(1-bola%,4)=b%(1-bola%,4)-1
  312. 1330       FOR i=0,1: MARCADOR(i)
  313. 1340     END IF
  314. 1350   END IF</code></pre>
  315.  
  316.  
  317.  
  318. <p>Dentro del procedimiento PRUEBA(), en la línea 1270, compruebo si la bola se encuentra en una posición del tablero que corresponde a la bola contraria (1-bola%).</p>
  319.  
  320.  
  321.  
  322. <p>Si es así toca hacer rebote para volver a la zona de la bola, como si nos hubiésemos topado con una pared, y rebotásemos, pero puede que, al volver, nos topemos con otra zona del contrario que nos haga rebotar de nuevo. Puede que esto ocurra cerca de los bordes del tablero, y nos salgamos del mismo. Para evitarlo, hago una segunda comprobación.</p>
  323.  
  324.  
  325.  
  326. <p>En la línea 1280 me aseguro de que, si hago un cambio de dirección en Y, este cambio no hará que me salga del tablero, y para ello me aseguro de que el resultado del cambio de dirección dejará la bola más allá de la columna 1 y más acá de la columna 18, de otra forma no haré rebote, y evitaré salirme si la bola choca y me devuleve al borde del tablero.</p>
  327.  
  328.  
  329.  
  330. <p>Por supuesto, ambas comprobaciones pueden hacerse en un solo IF, aunándolas.</p>
  331.  
  332.  
  333.  
  334. <p>Si todo fue bien, en la línea 1290, cambio la dirección de dy% y lo guardo en la matriz b%().</p>
  335.  
  336.  
  337.  
  338. <p>Luego asigno la casilla del tablero a la bola que se adentró en ella en la línea 1300.</p>
  339.  
  340.  
  341.  
  342. <p>En las líneas 1310 y 1320 aumento el marcador de la bola en cuestión y decremento el marcador de la otra bola, respectivamente.</p>
  343.  
  344.  
  345.  
  346. <p>Y en la línea 1330 actualizo ambos marcadores en la pantalla mediante un bucle y la llamada al procedimiento MARCADOR().</p>
  347.  
  348.  
  349.  
  350. <p>Ya sólo queda ejecutar la demo.</p>
  351.  
  352.  
  353.  
  354. <h2 class="wp-block-heading">Repasando</h2>
  355.  
  356.  
  357.  
  358. <p>La demo que hemos construido se ha hecho pensando no tanto en la optimización del código como en su forma y la aplicación de buenas prácticas.</p>
  359.  
  360.  
  361.  
  362. <p>Primeramente definimos la estructura del programa, incluyendo los procedimientos básicos y el bucle principal. Luego, con la planificación de cómo iba a funcionar el programa, determinamos las variables que usaríamos y dimos forma al tablero en pantalla.</p>
  363.  
  364.  
  365.  
  366. <p>Teniendo el tablero y las variables disponibles, el siguiente paso era hacer que las bolas de la demo se moviesen libremente por el tablero sin salirse. Y finalmente hemos conseguido gestionar las colisiones de las bolas con las áreas del contrario y actualizar los marcadores.</p>
  367.  
  368.  
  369.  
  370. <p>En esta serie de «fascículos» pues se han puesto las bases de la construcción de programas en SuperBASIC. Con esta experiencia, y la documentación de lenguaje, no será dificil aventurarse a construir otras demos o juegos o programas&#8230; Ya tienes por dónde empezar con este ejemplo.</p>
  371.  
  372.  
  373.  
  374. <p>Espero que, esta serie os anime a crear nuevas aplicaciones para el QL 40 años después. </p>
  375.  
  376.  
  377.  
  378. <h2 class="wp-block-heading">Ejercicio</h2>
  379.  
  380.  
  381.  
  382. <p>Si ejecutas el programa, verás algo curioso. Dado que estamos usando posiciones absolutas de caracteres en el tablero, llega un momento en que se produce un equilibrio inalterable entre ambas bolas. El marcador se estabiliza, o sube y baja un punto todo el tiempo.</p>
  383.  
  384.  
  385.  
  386. <p>Además verás que se genera un damero en el tablero. Esto también tiene como origen la forma en que las bolas se mueven por él.</p>
  387.  
  388.  
  389.  
  390. <p>¿Te animas a cambiar la forma en que se mueven las bolas en la demo, usando saltos en pixeles en vez de en caracteres? Esto cambiará ciertas estructuras de la demo y te permitirá crear rebotes basándote en qué porcentaje de la bola toca una celda del contrario, pudiendo determinar como será el rebote. Revisa el código de la demo <a href="https://github.com/vnglst/pong-wars">PongWars</a> en la que se basa esta serie de fascículos.</p>
  391.  
  392.  
  393.  
  394. <h2 class="wp-block-heading">Hagamos un juego</h2>
  395.  
  396.  
  397.  
  398. <p>Cuando tengas hecho el ejercicio anterior, ¡podrás convertir esta demo en un juego!</p>
  399.  
  400.  
  401.  
  402. <p>Vamos a crear dos paletas, como en el pong, pero estas no se encontrarán a los lados, sino en el medio, en la frontera central de su territorio, cara a cara con el enemigo. La paleta de la bola 1 estará en la posición vertical 9, y la paleta de la otra bola en la posición vertical 10.</p>
  403.  
  404.  
  405.  
  406. <p>Como en el pong, las paletas se moverán sólo verticalmente, y en ellas podrás hacer rebotar la bola del contrario, parando su avance sobre tu zona del tablero y devolviéndola a su zona. Igualmente puedes ayudar a tu bola a adentrarse más en la zona del contrario haciéndola rebotar sobre tu paleta. Y, como en el juego original, en función de en que parte de la paleta rebote la bola, esta saldrá disparada con un ángulo determinado y una velocidad determinada. Las bolas pueden rebotar por ambas caras de cada paleta.</p>
  407.  
  408.  
  409.  
  410. <p>Gana la partida el primero que consigua que su bola se adentre en la zona del contrario hasta tocar su pared vertical, es decir, que la bola 1 llegue a la posición horizontal 19 o que la bola 2 llegue a la posición horizontal 0. Puedes pintar estas paredes con otro color si lo deseas.</p>
  411.  
  412.  
  413.  
  414. <p>Pon cuidado en todo el desarrollo, y ¡comparte tu juego!</p>
  415.  
  416.  
  417.  
  418. <h2 class="wp-block-heading">Enlaces recomendados</h2>
  419.  
  420.  
  421.  
  422. <ul>
  423. <li><a href="https://sinclairql.speccy.org/manuales/sqlgu.htm">Manual del QL en español</a></li>
  424.  
  425.  
  426.  
  427. <li><a href="https://sinclairql.speccy.org/manuales/tk2/index.htm">Manual de Toolkit II en español</a></li>
  428.  
  429.  
  430.  
  431. <li><a href="https://github.com/JavGuerra/Sinclair-QL-YinYang.githttps://github.com/JavGuerra/Sinclair-QL-YinYang.git">Código en GitHub &#8211; repo Sinclair-QL-YinYang</a></li>
  432. </ul>
  433.  
  434.  
  435.  
  436. <p>Puedes seguir los comentarios de la comunidad en: <a href="https://retrowiki.es/viewtopic.php?f=98&#038;t=200040293" rel="nofollow">https://retrowiki.es/viewtopic.php?f=98&#038;t=200040293</a></p>
  437. ]]></content:encoded>
  438. <wfw:commentRss>https://sinclairqles.wordpress.com/2024/03/30/programando-mi-primera-demo-en-ql-fasciculo-iv-colisiones-y-puntuaciones/feed/</wfw:commentRss>
  439. <slash:comments>2</slash:comments>
  440. <media:content url="https://0.gravatar.com/avatar/670e7a411bd32dc3309ddc8a7ac12a4cfa6305652b5ecbfc62415bc659494371?s=96&#38;d=retro&#38;r=G" medium="image">
  441. <media:title type="html">badaman</media:title>
  442. </media:content>
  443. </item>
  444. <item>
  445. <title>Programando mi primera Demo en QL – fascículo III, movimiento y rebotes</title>
  446. <link>https://sinclairqles.wordpress.com/2024/03/29/programando-mi-primera-demo-en-ql-fasciculo-iii-movimiento-y-rebotes/</link>
  447. <comments>https://sinclairqles.wordpress.com/2024/03/29/programando-mi-primera-demo-en-ql-fasciculo-iii-movimiento-y-rebotes/#comments</comments>
  448. <dc:creator><![CDATA[badaman]]></dc:creator>
  449. <pubDate>Fri, 29 Mar 2024 10:36:38 +0000</pubDate>
  450. <category><![CDATA[Programación]]></category>
  451. <category><![CDATA[SuperBASIC]]></category>
  452. <guid isPermaLink="false">http://sinclairqles.wordpress.com/?p=3751</guid>
  453.  
  454. <description><![CDATA[Esta colección de pocos artículos pretende dar a conocer las particularidades del SuperBASIC mediante un ejemplo práctico, la realización de una pequeña demo.<p><a href="https://sinclairqles.wordpress.com/2024/03/29/programando-mi-primera-demo-en-ql-fasciculo-iii-movimiento-y-rebotes/" class="more-link">Leer Más</a></p>]]></description>
  455. <content:encoded><![CDATA[
  456. <p>Viene del artículo: «<a href="https://sinclairqles.wordpress.com/2024/03/23/programando-mi-primera-demo-en-ql-fasciculo-ii-variables-y-tablero/">Programando mi propia demo en QL II</a>»</p>
  457.  
  458.  
  459.  
  460. <p>Sigo con esta serie de artículos, y hoy toca hablar de movimiento y rebotes de las bolas de la demo.</p>
  461.  
  462.  
  463.  
  464. <h2 class="wp-block-heading">La dinámica</h2>
  465.  
  466.  
  467.  
  468. <p>En anteriores entregas, hemos definido la estructura del programa, y luego inicializado las variables y dibujado la interfaz. Vamos a ver cómo darle movimiento a las bolas dentro del tablero y hacer algunas comprobaciones básicas para evitar que las bolas se salgan del mismo.</p>
  469.  
  470.  
  471.  
  472. <p>Como sabemos, cada bola tiene una posición X e Y en el tablero, que corresponde con la posición horizontal y vertical en el mismo. Para movernos por el tablero, que tiene unas dimensiones concretas, debemos sumar a las posiciones X e Y de cada bola, alternativamente, el valor 1 para avanzar. Con esto calculamos el siguiente movimiento. Es decir, que si la bola 1 está en la posición X=2, Y=5, le sumaremos uno a ambas, y calculamos así el movimiento: X=X+1, X=3; Y=Y+1, Y=6. Lo mismo para las posiciones X e Y de la bola 2. Primero la bola 1, luego la bola 2, alternativamente, sin parar.</p>
  473.  
  474.  
  475.  
  476. <p>Al valor que le sumamos a las posiciones X e Y le llamamos desplazamiento. Nos referiremos a ellos como DX y DY. Así que tenemos X1, Y1, DX1, DY1 para la bola 1 y X2, Y2, DX2, DY2 para la bola 2.</p>
  477.  
  478.  
  479.  
  480. <p>Pero si el desplazamiento es 1, ¿porqué necesitamos una variable?. Pues porque el desplazamiento puede ser negativo. Imagina que avanzamos con la bola 1 hasta llegar al borde del tablero. El siguiente movimiento no puede ser sumarle 1 a la posición X o Y. Debemos aplicar un cambio de dirección de la bola, com osi esta hubiera rebotado.</p>
  481.  
  482.  
  483.  
  484. <span id="more-3751"></span>
  485.  
  486.  
  487.  
  488. <p>Si, por ejemplo, X1=10 e Y1=19, siendo que 19 es el tope del tablero, el valor de DY no puede ser 1, debe cambiar a -1, de esta forma, el cálculo del siguiente movimiento seria: X1=10 +1= 11; Y1=10+(-1)=9. Hemos cambiado la dirección del movimiento vertical de la bola 1, y así seguirá, hasta que la bola rebote en otra pared, y debamos cambiar el valor de DX o DY. </p>
  489.  
  490.  
  491.  
  492. <p>Para hacer este cambio, siendo que el valor de DY es 1 inicialmente, sería suficiente con hacer:</p>
  493.  
  494.  
  495.  
  496. <pre class="wp-block-code"><code>DY = -DY</code></pre>
  497.  
  498.  
  499.  
  500. <p>Consulta la <a href="https://sinclairqles.wordpress.com/2024/03/23/programando-mi-primera-demo-en-ql-fasciculo-ii-variables-y-tablero/">matriz de la entrada anterior</a>, porque en el programa, no se usan las variables que he puesto en este ejemplo, sino que los datos se guardan en la matriz b%(). Es lo mismo. sigue habiendo una X e Y por cada bola, y un desplazamiento de X e Y por cada bola, solo que, por ejemplo, para referirnos a la Y de la bola 1, debemos usar b%(0, 1). Y para referirnos a su desplazamiento, deberemos usar b%(0, 3).</p>
  501.  
  502.  
  503.  
  504. <p>Para hacer el cambio de dirección, entonces, usaríamos:</p>
  505.  
  506.  
  507.  
  508. <pre class="wp-block-code"><code>b%(0, 3) = -b%(0, 3)</code></pre>
  509.  
  510.  
  511.  
  512. <p>Y para añadir el desplazamiento a la Y después:</p>
  513.  
  514.  
  515.  
  516. <pre class="wp-block-code"><code>b%(0, 1) = b%(0, 1) + b%(0, 3)</code></pre>
  517.  
  518.  
  519.  
  520. <p>Veamos cómo usarlo en el programa.</p>
  521.  
  522.  
  523.  
  524. <h2 class="wp-block-heading">La versión III</h2>
  525.  
  526.  
  527.  
  528. <p>En esta nueva versión del programa se han llevado a cabo algunos cambios y se ha añadido varias funciones. Este es el código.</p>
  529.  
  530.  
  531.  
  532. <pre class="wp-block-code"><code>100 REMark Yin &amp; Yang v.3<br>110 REMark GPL, 2024, Badaman<br>120 REMark Movimiento y rebotes<br>130 :<br>140 CLEAR: RANDOMISE: ch%=3: ch2%=4<br>150 dev$="mdv1_": prg$="yinyang": v$="v3"<br>160 :<br>170 INICIO: PANTALLA<br>180 REPeat prg<br>190   n%=1-n%<br>200   BORRA(n%): CALCULA(n%)<br>210   MUEVE(n%): PRUEBA(n%)<br>220   IF KEYROW(1)=8: EXIT prg: REMark ESC<br>230 END REPeat prg<br>240 FIN: STOP<br>250 :<br>260 DEFine PROCedure sa<br>270   REMark Salva los cambios<br>280   file$ = dev$&amp;prg$&amp;"_"&amp;v$&amp;"_bas"<br>290   DELETE file$ : SAVE file$<br>300 END DEFine sa<br>310 :<br>320 DEFine PROCedure INICIO<br>330   REMark Inicializacion del programa<br>340   an%=20-1: al%=20-1<br>350   DIM tablero%(an%, al%): DIM b%(1,5)<br>360   f$=" ": b$="O": REMark b$=CHR$(226)<br>370   FOR i=0 TO 19<br>380     FOR j= 0 TO  9: tablero%(i,j)=0<br>390     FOR j=10 TO 19: tablero%(i,j)=1<br>400   END FOR i<br>410   REMark Bolas, posiciones 'x' e 'y'<br>420   b%(0,0)=RND( 0 TO 18) : REMark x1<br>430   b%(0,1)=RND( 0 TO  9) : REMark y1<br>440   b%(1,0)=RND( 1 TO 19) : REMark x2<br>450   b%(1,1)=RND(10 TO 19) : REMark y2<br>460   REMark Desplazamientos 'dx' y 'dy'<br>470   b%(0,2)= 1: b%(0,3)= 1: REMark d1<br>480   b%(1,2)=-1: b%(1,3)=-1: REMark d2<br>490   REMark Ambas puntuaciones<br>500   b%(0,4)=0 : b%(1,4)=0<br>510   REMark Colores<br>520   b%(0,5)=1 : b%(1,5)=6<br>530   n%=1 : REMark Bola alterna<br>540 END DEFine INICIO<br>550 :<br>560 DEFine PROCedure FIN<br>570   REMark Finalizacion del programa<br>580   CLOSE #ch%: CLOSE #ch2%: MODE 4<br>590 END DEFine FIN<br>600 :<br>610 DEFine PROCedure PANTALLA<br>620   REMark Presentacion de pantalla<br>630   MODE 8<br>640   REMark Dibuja tablero<br>650   OPEN   #ch%,scr_512x256a0x0<br>660   OPEN   #ch2%,scr_324x225a97x18<br>670   PAPER  #ch%,5,7: CLS #ch%<br>680   PAPER  #ch2%,0: CLS #ch2%<br>690   WINDOW #ch%,324,202,94,16<br>700   WINDOW #ch2%,324,22,94,218<br>710   PAPER  #ch%,b%(0,5): CLS #ch%<br>720   PAPER  #ch2%,3: CLS #ch2%<br>730   BORDER #ch%,1,3: BORDER #ch2%,1<br>740   BLOCK  #ch%,160,200,160,0,b%(1,5)<br>750   CSIZE  #ch%,3,0: CSIZE #ch2%,0,1<br>760   INK    #ch2%,4: CURSOR #ch2%,99,0<br>770   PRINT  #ch2%,"YIN &amp; YANG"<br>780   INK    #ch2%,7<br>790   REMark Posicion inicial de pelotas<br>800   FOR i=0,1: MUEVE(i): MARCADOR(i)<br>810 END DEFine PANTALLA<br>820 :<br>830 DEFine PROCedure MARCADOR(bola%)<br>840   REMark Actualiza el marcador<br>850   CURSOR #ch2%,283*bola%,0<br>860   PRINT  #ch2%,CERO$(b%(bola%,4))<br>870 END DEFine MARCADOR<br>880 :<br>890 DEFine FuNction CERO$(valor)<br>900   REMark Rellena con ceros, max. 999<br>910   txt$=valor: ln%=LEN(txt$)<br>920   RETurn FILL$("0",3-ln%)&amp;txt$<br>930 END DEFine CERO$<br>940 :<br>950 DEFine PROCedure BORRA(bola%)<br>960   REMark Borra la bola<br>970   LOCal x%, y%, c1%<br>980   x%=b%(bola%,0) : y%=b%(bola%,1)<br>990   c1%=b%(bola%,5): PAPER #ch%,c1%<br>1000   AT #ch%,x%,y%: PRINT #ch%,f$<br>1010 END DEFine BORRA<br>1020 :<br>1030 DEFine PROCedure CALCULA(bola%)<br>1040   REMark Calcula un movimiento<br>1050   LOCal x%, y%, dx%, dy%<br>1060   x%=b%(bola%,0): dx%=b%(bola%,2)<br>1070   y%=b%(bola%,1): dy%=b%(bola%,3)<br>1080   x%=x%+dx%: b%(bola%,0)=x%<br>1090   y%=y%+dy%: b%(bola%,1)=y%<br>1100 END DEFine CALCULA<br>1110 :<br>1120 DEFine PROCedure MUEVE(bola%)<br>1130   REMark Mueve la bola<br>1140   LOCal x%, y%, c1%, c2%<br>1150   x%=b%(bola%,0): y%=b%(bola%,1)<br>1160   c1%=b%(bola%,5): c2%=b%(1-bola%,5)<br>1170   PAPER #ch%,c1%: INK #ch%,c2%<br>1180   AT #ch%,x%,y% : PRINT #ch%,b$<br>1190 END DEFine MUEVE<br>1200 :<br>1210 DEFine PROCedure PRUEBA(bola%)<br>1220   REMark Comprueba si rebota<br>1230   LOCal x%, y%, dx%, dy%<br>1240   x%=b%(bola%,0): dx%=b%(bola%,2)<br>1250   y%=b%(bola%,1): dy%=b%(bola%,3)<br>1260   IF x%=0 OR x%=19: b%(bola%,2)=-dx%<br>1270   IF y%=0 OR y%=19: b%(bola%,3)=-dy%<br>1280 END DEFine PRUEBA</code></pre>
  533.  
  534.  
  535.  
  536. <p>En la línea 530 inicializo una nueva variable n%. La usaré en el flujo principal del programa, en la línea 190. Esta variable va a servirnos para identificar, alternativamente, la bola con la que vamos a trabajar, y lo hará con la fórmula:</p>
  537.  
  538.  
  539.  
  540. <p>n% = 1 &#8211; n%</p>
  541.  
  542.  
  543.  
  544. <p>Como n% empeiza valiendo 1, el valor de n% al realziar esta operación es 0, porque 1 &#8211; 1 = 0. La siguiente vez el valor de n% será 1, porque  1 &#8211; 0 = 1, y vuelta a empezar, 0, 1, 0, 1&#8230;</p>
  545.  
  546.  
  547.  
  548. <p>Como se aprecia, en las líneas 200 y 210 se han añadido cuatro procedimientos que toman como parámetro de entrada este valor. Veremos a continuación que hace cada uno de ellos, pero lo que hagan va a estar supeditado al valor de n%, que indica en todo momento si estamos trabajando con la bola 1 (valor 0) o con la bola 2 (valor 1). </p>
  549.  
  550.  
  551.  
  552. <p>Seguimos. Las líneas de la 780 a la 830 han sido sustituidas por una única línea:</p>
  553.  
  554.  
  555.  
  556. <pre class="wp-block-code"><code>FOR i=0,1: MUEVE(i): MARCADOR(i)</code></pre>
  557.  
  558.  
  559.  
  560. <p>Como veremos, MUEVE() pinta una bola, la que le digamos, y MARCADOR() pinta el marcador de una bola, también la que le digamos.</p>
  561.  
  562.  
  563.  
  564. <p>El bucle FOR, que no requiere END FOR porque todo él está en una línea, es extraño. No tiene rangos, sino una lista de números. En SuperBASIC, los valores que tomará la variable del bucle en cada iteración pueden definirse como un rango (n TO m) o como iuna lista de valores (a, b, c, d&#8230;). Aquí uso esta lista de valores (0, 1) para dibujar la bola 1 y la bola 2, una en cada iteración del bucle, y sus marcadores.</p>
  565.  
  566.  
  567.  
  568. <p>El procedimiento MARCADOR() también ha cambiado. Ahora, como debe servir no sólo al inicio para pintar los marcadores, sino durante toda la demo para mostrar las actualizaciones de los marcadores alternos, recibe el parámetro bola%, que le permitirá saber en qué posición pintará el marcador, y qué valor debe poner en el marcador, apoyándose en la función CERO$().</p>
  569.  
  570.  
  571.  
  572. <p>En la siguiente línea decide la posición:</p>
  573.  
  574.  
  575.  
  576. <pre class="wp-block-code"><code>850   CURSOR #ch2%,283*bola%,0</code></pre>
  577.  
  578.  
  579.  
  580. <p>Como el marcador de la bola 1 debe pintarse en la posición 0,0 y el de la bola 2 en la posición 283,0, Para poner la posición correcta segun la bola, multiplico el valor 283 por bola%, de tal forma que si bola% es cero, 283*0 = 0, y si es 1, 283*1 = 283.</p>
  581.  
  582.  
  583.  
  584. <p>En esta línea puinto la bola que corresponda:</p>
  585.  
  586.  
  587.  
  588. <pre class="wp-block-code"><code>860   PRINT  #ch2%,CERO$(b%(bola%,4))</code></pre>
  589.  
  590.  
  591.  
  592. <p>Como b%(bola%,4) contendrá la puntuación de la bola en cuestión, con PRINT imprimo en la posición ya calculada el marcador, usando la función CERO$() que devuelve una cadena de texto con ceros a la izquierda.</p>
  593.  
  594.  
  595.  
  596. <p>Bien, para mover una bola, necesitamos:</p>
  597.  
  598.  
  599.  
  600. <ul>
  601. <li>Borrarla de su posición actual</li>
  602.  
  603.  
  604.  
  605. <li>Calcular la nueva posición</li>
  606.  
  607.  
  608.  
  609. <li>Pintarla en su nueva posición</li>
  610.  
  611.  
  612.  
  613. <li>Comprobar si hay colisiones</li>
  614. </ul>
  615.  
  616.  
  617.  
  618. <p>Tal como dije, cuatro nuevas funciones se suman a esta versión. Cada una de ellas corresponde a uno de estos pasos. Veámoslas.</p>
  619.  
  620.  
  621.  
  622. <h2 class="wp-block-heading">BORRA()</h2>
  623.  
  624.  
  625.  
  626. <p>Código:</p>
  627.  
  628.  
  629.  
  630. <pre class="wp-block-code"><code>950 DEFine PROCedure BORRA(bola%)
  631. 960   REMark Borra la bola
  632. 970   LOCal x%, y%, c1%
  633. 980   x%=b%(bola%,0) : y%=b%(bola%,1)
  634. 990   c1%=b%(bola%,5): PAPER #ch%,c1%
  635. 1000   AT #ch%,x%,y%: PRINT #ch%,f$
  636. 1010 END DEFine BORRA</code></pre>
  637.  
  638.  
  639.  
  640. <p>A efectos de aportar claridad a la explicación exclusivamente, en este yt sucesivos procedimientos usaré una serie de variables locales, es decir, cuyo ámbito estará sólo dentro del procedimiento. Así, x% e y% contendrán la posición de la bola en el tablero, y c1% el color de fondo de la bola con el que sobreimprimiremos f%, que contiene un espacio vacío. Con esto borramos la bola en cuestión, la bola 1 o la bola 2 dependiendo del valor de la variable bola%.</p>
  641.  
  642.  
  643.  
  644. <h2 class="wp-block-heading">CALCULA()</h2>
  645.  
  646.  
  647.  
  648. <p>Código:</p>
  649.  
  650.  
  651.  
  652. <pre class="wp-block-code"><code>1030 DEFine PROCedure CALCULA(bola%)
  653. 1040   REMark Calcula un movimiento
  654. 1050   LOCal x%, y%, dx%, dy%
  655. 1060   x%=b%(bola%,0): dx%=b%(bola%,2)
  656. 1070   y%=b%(bola%,1): dy%=b%(bola%,3)
  657. 1080   x%=x%+dx%: b%(bola%,0)=x%
  658. 1090   y%=y%+dy%: b%(bola%,1)=y%
  659. 1100 END DEFine CALCULA</code></pre>
  660.  
  661.  
  662.  
  663. <p> Mismo caso en este procedimiento. Aquí, con las varialbes locales x%, y%, dx%, dy% calculo la siguiente posición de la bola, y la guardo en la matriz. Ver las líneas 1080 y 1090. a x% le sumo dx% y lo guardo en b%() y lo mismo con la y%.</p>
  664.  
  665.  
  666.  
  667. <h2 class="wp-block-heading">MUEVE()</h2>
  668.  
  669.  
  670.  
  671. <p>Código:</p>
  672.  
  673.  
  674.  
  675. <pre class="wp-block-code"><code>1120 DEFine PROCedure MUEVE(bola%)
  676. 1130   REMark Mueve la bola
  677. 1140   LOCal x%, y%, c1%, c2%
  678. 1150   x%=b%(bola%,0): y%=b%(bola%,1)
  679. 1160   c1%=b%(bola%,5): c2%=b%(1-bola%,5)
  680. 1170   PAPER #ch%,c1%: INK #ch%,c2%
  681. 1180   AT #ch%,x%,y% : PRINT #ch%,b$
  682. 1190 END DEFine MUEVE</code></pre>
  683.  
  684.  
  685.  
  686. <p>En esta ocasión uso X e Y, el color del fondo y el color de la tinta, porque se trata de dibujar la bola que corresponda con sus colores. Como los colores de la bola y del fondo son inversos en cada bola, es decir, la bola 1 tiene de fondo el color azul y la tinta el color amarillo, y la bola 2 al contrario, el fondo amarillo y el color de la tinta el azul, el color c2%, que corresponde a la tinta, se calcula accediendo al color de la bola contraria, empleando la formula 1-bola% que vimos  antes en n%.</p>
  687.  
  688.  
  689.  
  690. <h2 class="wp-block-heading">PRUEBA()</h2>
  691.  
  692.  
  693.  
  694. <p>Código:</p>
  695.  
  696.  
  697.  
  698. <pre class="wp-block-code"><code>1210 DEFine PROCedure PRUEBA(bola%)
  699. 1220   REMark Comprueba si rebota
  700. 1230   LOCal x%, y%, dx%, dy%
  701. 1240   x%=b%(bola%,0): dx%=b%(bola%,2)
  702. 1250   y%=b%(bola%,1): dy%=b%(bola%,3)
  703. 1260   IF x%=0 OR x%=19: b%(bola%,2)=-dx%
  704. 1270   IF y%=0 OR y%=19: b%(bola%,3)=-dy%
  705. 1280 END DEFine PRUEBA</code></pre>
  706.  
  707.  
  708.  
  709. <p>Esta es la parte interesante, donde se comprueba si hay rebotes y, en tal caso, se hacen los cambios de dirección. Aquí usaré la posición X e Y de la bola y sus correspondientes desplazamientos DX y DY.</p>
  710.  
  711.  
  712.  
  713. <p>En las líneas 1260 y 1270 puede verse que si el valor de X o de Y es 0 o es 19, que son los límites del tablero, el valor de DX o de DY cambia, es decir, se convierte en el opuesto (p.ej. DX=-DX). Y si cambia, se guarda su valor opuesto en la matriz.</p>
  714.  
  715.  
  716.  
  717. <p>Y vuelta a empezar: borrar la bola,  calcular la nueva posición, pintar la bola, compribar colisiones. Pruebalo ejecutando el programa.</p>
  718.  
  719.  
  720.  
  721. <h2 class="wp-block-heading">Y en la próxima entrega&#8230;</h2>
  722.  
  723.  
  724.  
  725. <p>.La próxima entrega será la última, y en ella veremos como aumentar el marcador y comprobar colisiones con la zona del contrario.</p>
  726.  
  727.  
  728.  
  729. <h2 class="wp-block-heading">Ejercicio</h2>
  730.  
  731.  
  732.  
  733. <p>Tomando como base el ejercicio anterior de comer donuts, esta vez vamos a hacer que, cuando el avatar se coma un donut, su cuerpo crezca, y le salga una cola tan larga como donuts ha comido. Por supuesto, a medida que movemos el avatar, su cola se arrastra con el, como en el conocido juego Snake. Esto es, por si no lo habáis notado, un clon de dicho juego.</p>
  734.  
  735.  
  736.  
  737. <p>Las partes del cuerpo podemos representarlasa con la letra «M». Para arrastrar el cuerpo de nuestro avatar con forma de serpiente, con cada movimineto, debemos limpiar la cola de la serpiente. Esto implica que, de alguna forma, debemos guardar en orden, en alguna estructura, las posiciones XY no sólo del avatar (la cabeza de la serpiente), sino de cada parte del cuerpo, y esta estructura será mayor cuanto más grande se haga la serpiente como consecuencia de comer donuts.</p>
  738.  
  739.  
  740.  
  741. <p>¿Y qué tal si le añades un marcador donde ir anotando puntos?</p>
  742.  
  743.  
  744.  
  745. <h2 class="wp-block-heading">Enlaces recomendados</h2>
  746.  
  747.  
  748.  
  749. <ul>
  750. <li><a href="https://sinclairql.speccy.org/manuales/sqlgu.htm">Manual del QL en español</a></li>
  751.  
  752.  
  753.  
  754. <li><a href="https://sinclairql.speccy.org/manuales/tk2/index.htm">Manual de Toolkit II en español</a></li>
  755.  
  756.  
  757.  
  758. <li><a href="https://github.com/JavGuerra/Sinclair-QL-YinYang.githttps://github.com/JavGuerra/Sinclair-QL-YinYang.git">Código en GitHub &#8211; repo Sinclair-QL-YinYang</a></li>
  759. </ul>
  760.  
  761.  
  762.  
  763. <p>Puedes seguir los comentarios de la comunidad en: <a href="https://retrowiki.es/viewtopic.php?f=98&#038;t=200040286" rel="nofollow">https://retrowiki.es/viewtopic.php?f=98&#038;t=200040286</a></p>
  764.  
  765.  
  766.  
  767. <h2 class="wp-block-heading">Siguiente entrega</h2>
  768.  
  769.  
  770.  
  771. <p><blockquote class="wp-embedded-content" data-secret="zPZm31v4wk"><a href="https://sinclairqles.wordpress.com/2024/03/30/programando-mi-primera-demo-en-ql-fasciculo-iv-colisiones-y-puntuaciones/">Programando mi primera Demo en QL – fascículo IV, colisiones y puntuaciones</a></blockquote><iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted" title="«Programando mi primera Demo en QL – fascículo IV, colisiones y puntuaciones» — QBlog" src="https://sinclairqles.wordpress.com/2024/03/30/programando-mi-primera-demo-en-ql-fasciculo-iv-colisiones-y-puntuaciones/embed/#?secret=6gUQ6OBrfe#?secret=zPZm31v4wk" data-secret="zPZm31v4wk" width="545" height="307" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe></p>
  772. ]]></content:encoded>
  773. <wfw:commentRss>https://sinclairqles.wordpress.com/2024/03/29/programando-mi-primera-demo-en-ql-fasciculo-iii-movimiento-y-rebotes/feed/</wfw:commentRss>
  774. <slash:comments>3</slash:comments>
  775. <media:content url="https://0.gravatar.com/avatar/670e7a411bd32dc3309ddc8a7ac12a4cfa6305652b5ecbfc62415bc659494371?s=96&#38;d=retro&#38;r=G" medium="image">
  776. <media:title type="html">badaman</media:title>
  777. </media:content>
  778. </item>
  779. <item>
  780. <title>Programando mi primera Demo en QL – fascículo II, variables y tablero</title>
  781. <link>https://sinclairqles.wordpress.com/2024/03/23/programando-mi-primera-demo-en-ql-fasciculo-ii-variables-y-tablero/</link>
  782. <comments>https://sinclairqles.wordpress.com/2024/03/23/programando-mi-primera-demo-en-ql-fasciculo-ii-variables-y-tablero/#comments</comments>
  783. <dc:creator><![CDATA[badaman]]></dc:creator>
  784. <pubDate>Sat, 23 Mar 2024 20:58:56 +0000</pubDate>
  785. <category><![CDATA[Programación]]></category>
  786. <category><![CDATA[SuperBASIC]]></category>
  787. <guid isPermaLink="false">http://sinclairqles.wordpress.com/?p=3711</guid>
  788.  
  789. <description><![CDATA[Esta colección de pocos artículos pretende dar a conocer las particularidades del SuperBASIC mediante un ejemplo práctico, la realización de una pequeña demo.<p><a href="https://sinclairqles.wordpress.com/2024/03/23/programando-mi-primera-demo-en-ql-fasciculo-ii-variables-y-tablero/" class="more-link">Leer Más</a></p>]]></description>
  790. <content:encoded><![CDATA[
  791. <p>Viene del artículo: «<a href="https://sinclairqles.wordpress.com/2024/03/16/programando-mi-primera-demo-en-ql-fasciculo-i-los-preparativos/">Programando mi propia demo en QL I</a>»</p>
  792.  
  793.  
  794.  
  795. <p>Sigo con esta serie de artículos, y empezamos hablando de los tipos de los variables.</p>
  796.  
  797.  
  798.  
  799. <h2 class="wp-block-heading">Variables</h2>
  800.  
  801.  
  802.  
  803. <p>Como en otros BASIC de la época, en SuperBASIC las variables numéricas se indican con una serie de letras y números, dando comienzo con una letra, y pudiendo usar guiones bajos, pero no otro signo.</p>
  804.  
  805.  
  806.  
  807. <p>Las variables de cadeta o de texto, emplean el símbolo $ al final. Así «var_numero» y «var_cadena$» serán respectivamente, una variable numérica y una variable de cadena.</p>
  808.  
  809.  
  810.  
  811. <p>Pero en SuperBASIC podemos indicar que una variable va a contener un valor numérico entero añadiendo % al final del nombre de la variable, así pues «var_entero%» será una variable que almacenará valores enteros. Si le asignamos un valor decimal, sólo almacenará la parte entera. Esto es útil para reducir el consumo de memoria. Las variables enteras ocupan menos espacio en memoria y la aplicación funcionará más rápido, y esto también es de utilidad si decidimos compilar nuestra aplicación, ya que el ejecutable ocupará menos.</p>
  812.  
  813.  
  814.  
  815. <p>Pero en SuperBASIC, este tipo de variables enteras no pueden usarse en los bucles, a no ser que hayamos cambiado nuestra ROM por la ROM Minerva, una ROM avanzada a la ROM original del QL, que sí lo permite.</p>
  816.  
  817.  
  818.  
  819. <p>Como siempre, puedes conocer más leyendo la guía del usuario.</p>
  820.  
  821.  
  822.  
  823. <span id="more-3711"></span>
  824.  
  825.  
  826.  
  827. <h2 class="wp-block-heading">La versión II</h2>
  828.  
  829.  
  830.  
  831. <p> En esta nueva versión del programa he añadido contenido a los procedimientos INICIO, PANTALLA y FIN, he añadido un nuevo procedimiento MARCADOR y una función llamada CEROS$, que recibe un parámetro, como luego veremos.</p>
  832.  
  833.  
  834.  
  835. <p>El nuevo código es este: </p>
  836.  
  837.  
  838.  
  839. <pre class="wp-block-code"><code>100 REMark Yin &amp; Yang v.2<br>110 REMark GPL, 2024, Badaman<br>120 REMark Variables y tablero<br>130 :<br>140 CLEAR: RANDOMISE: ch%=3: ch2%=4<br>150 dev$="mdv1_": prg$="yinyang": v$="v2"<br>160 :<br>170 INICIO: PANTALLA<br>180 REPeat prg<br>190   REMark codigo del programa<br>200   IF KEYROW(1)=8: EXIT prg: REMark ESC<br>210 END REPeat prg<br>220 FIN: STOP<br>230 :<br>240 DEFine PROCedure sa<br>250   REMark Salva los cambios<br>260   file$ = dev$&amp;prg$&amp;"_"&amp;v$&amp;"_bas"<br>270   DELETE file$ : SAVE file$<br>280 END DEFine sa<br>290 :<br>300 DEFine PROCedure INICIO<br>310   REMark Inicializacion del programa<br>320   an%=20-1: al%=20-1<br>330   DIM tablero%(an%, al%): DIM b%(1,5)<br>340   f$=" ": b$="O": REMark b$=CHR$(226)<br>350   FOR i=0 TO 19 <br>360     FOR j= 0 TO  9: tablero%(i,j)=0<br>370     FOR j=10 TO 19: tablero%(i,j)=1<br>380   END FOR i<br>390   REMark Bolas, posiciones 'x' e 'y'<br>400   b%(0,0)=RND( 0 TO 18) : REMark x1<br>410   b%(0,1)=RND( 0 TO  9) : REMark y1<br>420   b%(1,0)=RND( 1 TO 19) : REMark x2<br>430   b%(1,1)=RND(10 TO 19) : REMark y2<br>440   REMark Desplazamientos 'dx' y 'dy'<br>450   b%(0,2)= 1: b%(0,3)= 1: REMark d1<br>460   b%(1,2)=-1: b%(1,3)=-1: REMark d2<br>470   REMark Ambas puntuaciones<br>480   b%(0,4)=0 : b%(1,4)=0<br>490   REMark Colores<br>500   b%(0,5)=1 : b%(1,5)=6<br>510 END DEFine INICIO<br>520 :<br>530 DEFine PROCedure FIN<br>540   REMark Finalizacion del programa<br>550   CLOSE #ch%: CLOSE #ch2%: MODE 4<br>560 END DEFine FIN<br>570 :<br>580 DEFine PROCedure PANTALLA<br>590   REMark Presentacion de pantalla<br>600   MODE 8<br>610   REMark Dibuja tablero<br>620   c1%=b%(0,5): c2%=b%(1,5)<br>630   OPEN   #ch%,scr_512x256a0x0<br>640   OPEN   #ch2%,scr_324x225a97x18<br>650   PAPER  #ch%,5,7: CLS #ch%<br>660   PAPER  #ch2%,0: CLS #ch2%<br>670   WINDOW #ch%,324,202,94,16<br>680   WINDOW #ch2%,324,22,94,218<br>690   PAPER  #ch%,c1%: CLS #ch%<br>700   PAPER  #ch2%,3: CLS #ch2%<br>710   BORDER #ch%,1,3: BORDER #ch2%,1<br>720   BLOCK  #ch%,160,200,160,0,c2%<br>730   CSIZE  #ch%,3,0: CSIZE #ch2%,0,1<br>740   INK    #ch2%,4: CURSOR #ch2%,99,0<br>750   PRINT  #ch2%,"YIN &amp; YANG"<br>760   INK    #ch2%,7<br>770   REMark Posicion inicial de pelotas<br>780   PAPER  #ch%,c1%: INK #ch%,c2%<br>790   AT     #ch%,b%(0,0),b%(0,1)<br>800   PRINT  #ch%,b$<br>810   PAPER  #ch%,c2%: INK #ch%,c1%<br>820   AT     #ch%,b%(1,0),b%(1,1)<br>830   PRINT  #ch%,b$<br>840   MARCADOR<br>850 END DEFine PANTALLA<br>860 :<br>870 DEFine PROCedure MARCADOR<br>880   REMark Actualiza el marcador<br>890   AT     #ch2%,0,0<br>900   PRINT  #ch2%,CERO$(b%(0,4))<br>910   CURSOR #ch2%,283,0<br>920   PRINT  #ch2%,CERO$(b%(1,4))<br>930 END DEFine MARCADOR<br>940 :<br>950 DEFine FuNction CERO$(valor)<br>960   REMark Rellena con ceros, max. 999<br>970   txt$=valor: ln%=LEN(txt$)<br>980   RETurn FILL$("0",3-ln%)&amp;txt$<br>990 END DEFine CERO$</code></pre>
  840.  
  841.  
  842.  
  843. <h2 class="wp-block-heading">Matrices</h2>
  844.  
  845.  
  846.  
  847. <p>No te asustes. Esto no son Mátemáticas, o al menos no muchas Matemáticas. Ya sabemos que hay dos bolas que rebotan, esto se ve en la captura de la demo (articulo anterior). Y hay un espacio sobre el que se mueven. Llamemos a las bolas «b» y al espacio «tablero».</p>
  848.  
  849.  
  850.  
  851. <p>Para conocer en qué posición del tablero está cada bola en un momento dado necesitaremos guardar una posición «X» y otra «Y», por cada bola, osea X1, Y1 y X2, Y2. También necesitaremos saber el desplazamiento que debemos aplicar a la bola: DX1, DY1, DX2, DY2.</p>
  852.  
  853.  
  854.  
  855. <p>Si una bola está en la posición X,Y, la siguiente posición en la que estará será X+DX e Y+DY.</p>
  856.  
  857.  
  858.  
  859. <p>Además, por cada bola, necesitaremos saber su color y la puntuación que tiene en cada momento.</p>
  860.  
  861.  
  862.  
  863. <p>Son muchas variables relacionadas con una misma cosa. ¿Qué tal si las juntamos en una estructura de datos de dos dimensiones, como una tabla, en la que haya dos columnas, una para cada bola, y 6 filas, una por cada concepto? Veamos la siguiente tabla.</p>
  864.  
  865.  
  866.  
  867. <figure class="wp-block-table"><table><tbody><tr><td><strong>Matriz: b%(1, 5)</strong></td><td class="has-text-align-center" data-align="center"><strong>Bola 1</strong></td><td class="has-text-align-center" data-align="center"><strong>Bola 2</strong></td></tr><tr><td>Posición X</td><td class="has-text-align-center" data-align="center">(0, 0)</td><td class="has-text-align-center" data-align="center">(1, 0)</td></tr><tr><td>Posición Y</td><td class="has-text-align-center" data-align="center">(0, 1)</td><td class="has-text-align-center" data-align="center">(1, 1)</td></tr><tr><td>Desplazamiento X</td><td class="has-text-align-center" data-align="center">(0, 2)</td><td class="has-text-align-center" data-align="center">(1, 2)</td></tr><tr><td>Desplazamiento Y</td><td class="has-text-align-center" data-align="center">(0, 3)</td><td class="has-text-align-center" data-align="center">(1, 3)</td></tr><tr><td>Color</td><td class="has-text-align-center" data-align="center">(0, 4)</td><td class="has-text-align-center" data-align="center">(1, 4)</td></tr><tr><td>Puntos</td><td class="has-text-align-center" data-align="center">(0, 5)</td><td class="has-text-align-center" data-align="center">(1, 5)</td></tr></tbody></table></figure>
  868.  
  869.  
  870.  
  871. <p>Si, por djemplo, quiero saber la posición Y de la bola 2, tengo que consultar el elemento (1, 1) de la matriz. Fijate que la matriz empeiza en (0, 0), y que cada elemento de la matriz comienza por 0, o 1 según sea el valor de la bola: 0 para la primera bola (bola 1) y 1 para la segunda bola (bola 2).</p>
  872.  
  873.  
  874.  
  875. <p>Para definir una matriz como esta, empleamos la instrucción DIM seguida del valor máximo de las dimensiones de la matriz, en este caso (1, 5):</p>
  876.  
  877.  
  878.  
  879. <pre class="wp-block-code"><code>DIM b%(1, 5)</code></pre>
  880.  
  881.  
  882.  
  883. <p>Como los valores que vamos a guardar son numéricos y enteros, podemos definir a la matriz como «b%». Luego veremos como poner valores en la matrizs y consultarlos.</p>
  884.  
  885.  
  886.  
  887. <p>El tablero tiene 20 x 20 casillas. Necesitamos el tablero porque hay zonas de este que pertenecen a una bola y otras zonas que pertenencen a las otras bolas. ¿Cómo saber que zonas del tablero son de la bola 1 y cuáles de la bola 2? con una matriz que tenga las dimensiones del tablero, y que guarde, en cada elemenrto de la matriz un 0 si pertenece a la bola 1 y un 1 si pertence a la bola 2. Así:</p>
  888.  
  889.  
  890.  
  891. <pre class="wp-block-code"><code>DIM tablero%(19, 19) </code></pre>
  892.  
  893.  
  894.  
  895. <p>Osea, 20-1 en ambos casos. Recuerda que las matrices comienzan por 0, y de 0 a 19 van 20.</p>
  896.  
  897.  
  898.  
  899. <p>Con esto tenemos definido cómo queremos guardar los datos. Vamos a ver cómo.</p>
  900.  
  901.  
  902.  
  903. <h2 class="wp-block-heading">INICIO</h2>
  904.  
  905.  
  906.  
  907. <pre class="wp-block-code"><code>300 DEFine PROCedure INICIO<br>310   REMark Inicializacion del programa<br>320   an%=20-1: al%=20-1<br>330   DIM tablero%(an%, al%): DIM b%(1,5)<br>340   f$=" ": b$="O": REMark b$=CHR$(226)<br>350   FOR i=0 TO 19 <br>360     FOR j= 0 TO  9: tablero%(i,j)=0<br>370     FOR j=10 TO 19: tablero%(i,j)=1<br>380   END FOR i<br>390   REMark Bolas, posiciones 'x' e 'y'<br>400   b%(0,0)=RND( 0 TO 18) : REMark x1<br>410   b%(0,1)=RND( 0 TO  9) : REMark y1<br>420   b%(1,0)=RND( 1 TO 19) : REMark x2<br>430   b%(1,1)=RND(10 TO 19) : REMark y2<br>440   REMark Desplazamientos 'dx' y 'dy'<br>450   b%(0,2)= 1: b%(0,3)= 1: REMark d1<br>460   b%(1,2)=-1: b%(1,3)=-1: REMark d2<br>470   REMark Ambas puntuaciones<br>480   b%(0,4)=0 : b%(1,4)=0<br>490   REMark Colores<br>500   b%(0,5)=1 : b%(1,5)=6<br>510 END DEFine INICIO</code></pre>
  908.  
  909.  
  910.  
  911. <p>Este procedimiento, como dijimos en el artículo anterior, inicializa las variables de la demo.</p>
  912.  
  913.  
  914.  
  915. <p>En la línea 320 se define el ancho y alto del tablero en las variables an% y al%. En la 330 se inicializan las dos matrices tablero% y b%.</p>
  916.  
  917.  
  918.  
  919. <p><strong>Nota</strong>: Podría haber puesto DIM tablero%(19, 19) en vez de tablero%(an%, al%), pero así aprovechamos para ver que a una matriz podemos pasarle valores de una variable. En estos fascículos vas a ver cosas así con frecuencia. A los ya entendidos les parecerá que no tiene sentido, pero está pensado para probar y aprender cosas.</p>
  920.  
  921.  
  922.  
  923. <p>En la línea 340 definimos las variables de cadena f$ y b$. no confundir b$ con b%. La variable b$ va a contener el caracter con el que representaremos la bola. una O mayúscula. La variable f$ contiene un carácter vacío. Es lo que usaremos cuando queramos borrar la bola. He puesto un comentario con una definición alternativa de b$. Con b$=CHR$(226) asignamos a b$ el carácter que representa una bola en el juego de caracteres de la ROM Minerva, ya que esta ROM tiene un juego de caracteres diferente, con más símbolos. Puedes ver el juego de caracteres de tu ROM con este sencillo programa:</p>
  924.  
  925.  
  926.  
  927. <pre class="wp-block-code"><code>10 FOR i=0 TO 255: PRINT CHR$(i)!</code></pre>
  928.  
  929.  
  930.  
  931. <p>Seguimos. Entre las líneas 350 y 380 tenemos un bucle FOR i=0 TO 19 que termina con un END FOR i, y que nos va a servir para hacer 20 vueltas. A cada vuelta, vamos a meter valores en la matriz tablero%.</p>
  932.  
  933.  
  934.  
  935. <p>Las lineas 360 y 370 son a la vez dos bucles más. Ambos bucles están dentro (anidados) del bucle de las 20 vueltas, pero pasa algo curioso, no hay END FOR&#8230; Si el bucle y las instrucciones se ponen en una misma línea, no es necesario poner END FOR.</p>
  936.  
  937.  
  938.  
  939. <p>Con estas dos líneas vamos a llenar de 0 y de 1 cada parte del tablero que corresponde, inicialmente, a cada bola, tablero%(i, j), siendo que «i» corresponde a la fila y «j» a la columna. Estas son las varialbes de cada bucle. La asignación se hace mediante el signo =, como con cualquier varialbe, pero la variable debe indicar el elemento (i, j) en este caso.</p>
  940.  
  941.  
  942.  
  943. <p>Entre las líneas 390 y 500 defino los valores de la matriz b%(1, 5). Ver comentarios.</p>
  944.  
  945.  
  946.  
  947. <p>de las líneas 400 a la 430 uso la instrucción RND. Esta me permite obtener un valor al azxar para inicializar la variable, entre un par de valores dados. Al principio del programa usamos RANDOMISE, este es el motivo, generar números verdaderamente aleatorios con cada ejecución del programa.</p>
  948.  
  949.  
  950.  
  951. <p>Las líneas 450 y 460 asignan el valor del desplazamiento inicial de cada bola, de tal forma que la bola 1 avanzará 1 posición horizontal a la derecha y una vertical abajo, y la bola 2 lo hará al contrario, avanzará una posición horizonal a la izquierda, y una posición vertical arriba.</p>
  952.  
  953.  
  954.  
  955. <h2 class="wp-block-heading">FIN</h2>
  956.  
  957.  
  958.  
  959. <pre class="wp-block-code"><code>530 DEFine PROCedure FIN<br>540   REMark Finalizacion del programa<br>550   CLOSE #ch%: CLOSE #ch2%: MODE 4<br>560 END DEFine FIN</code></pre>
  960.  
  961.  
  962.  
  963. <p>No hemos terminado, nos queda mucha tela que cortar. FIN es el procedimiento que uso para terminar el programa correctamente.</p>
  964.  
  965.  
  966.  
  967. <p>Fijate que en la línea 140 he añadido ch% y ch2%. Estas variables van a contener el núnero  de canal (channel) de las zonas de pantalla donde vamos a dibujar. Si no lo sabías, el QL tiene la posibilidad de dfefinir rectángulos de pantalla denominados ventanas, donde podemos escribir como si de otras pantallas se tratase, con su sistema propio de coordenadas independiente, colores de fondo y de tinta&#8230; luego veremos cómo se definen.</p>
  968.  
  969.  
  970.  
  971. <p>El caso es que vamos a usar dos canales que identifican estas ventanas, y en el procedimiento FIN lo que hacemso es cerrar estos canales que corresponden a ventanas mediante la orden CLOSE. Las ventansa las abriremos en el procedimiento PANTALLA, aunque también podríamos haberlas abierto (OPEN) en el procedimiento INICIO.</p>
  972.  
  973.  
  974.  
  975. <p>En este procedimiento, además, cambiamos al MODE 4 antes de salir. Esto ayudará a ver mejor los listados, con más caracteres por línea cuado hagamos LIST.</p>
  976.  
  977.  
  978.  
  979. <h2 class="wp-block-heading">PANTALLA</h2>
  980.  
  981.  
  982.  
  983. <pre class="wp-block-code"><code>580 DEFine PROCedure PANTALLA<br>590   REMark Presentacion de pantalla<br>600   MODE 8<br>610   REMark Dibuja tablero<br>620   c1%=b%(0,5): c2%=b%(1,5)<br>630   OPEN   #ch%,scr_512x256a0x0<br>640   OPEN   #ch2%,scr_324x225a97x18<br>650   PAPER  #ch%,5,7: CLS #ch%<br>660   PAPER  #ch2%,0: CLS #ch2%<br>670   WINDOW #ch%,324,202,94,16<br>680   WINDOW #ch2%,324,22,94,218<br>690   PAPER  #ch%,c1%: CLS #ch%<br>700   PAPER  #ch2%,3: CLS #ch2%<br>710   BORDER #ch%,1,3: BORDER #ch2%,1<br>720   BLOCK  #ch%,160,200,160,0,c2%<br>730   CSIZE  #ch%,3,0: CSIZE #ch2%,0,1<br>740   INK    #ch2%,4: CURSOR #ch2%,99,0<br>750   PRINT  #ch2%,"YIN &amp; YANG"<br>760   INK    #ch2%,7<br>770   REMark Posicion inicial de pelotas<br>780   PAPER  #ch%,c1%: INK #ch%,c2%<br>790   AT     #ch%,b%(0,0),b%(0,1)<br>800   PRINT  #ch%,b$<br>810   PAPER  #ch%,c2%: INK #ch%,c1%<br>820   AT     #ch%,b%(1,0),b%(1,1)<br>830   PRINT  #ch%,b$<br>840   MARCADOR<br>850 END DEFine PANTALLA</code></pre>
  984.  
  985.  
  986.  
  987. <p>Primero establezco, con MODE 8, el modo de pantalla a modo 8 (8 colores) que tiene una resolución de 256&#215;256 pixeles.</p>
  988.  
  989.  
  990.  
  991. <p>En la línea 620 leo los colores de la matriz de las dos bolas y los guardo en c1% y c2% con c1%=b%(0,5): c2%=b%(1,5). Como vemos, podemos usar la matriz como una variable. Lo uso aquí, además de como medio de parendizaje, para no tener que escribir la posición de la matriz cada vez que quiero usar el color de la bola 1 o de la bola 2.</p>
  992.  
  993.  
  994.  
  995. <p>En las líneas 630 y 640 abro el canal ch% y el canal ch2%. vemos que el canal ch% tiene la siguiente definición:</p>
  996.  
  997.  
  998.  
  999. <pre class="wp-block-code"><code>OPEN #ch%,scr_512x256a0x0</code></pre>
  1000.  
  1001.  
  1002.  
  1003. <p>Fijate que, aunque en el modo 8 las dimensiones de la pantalla son de 256&#215;256 pixels, igualmente al abrir un canal destinado a una ventana debemos indicar las dimensiones de la ventana con un tamaño máximo de 512&#215;256.</p>
  1004.  
  1005.  
  1006.  
  1007. <p>La segunda ventana tiene otras dimensiones, 324&#215;225 y está ubicada en la posición 97&#215;18, siendo 97 la posición horizontal y 18 la vertical:</p>
  1008.  
  1009.  
  1010.  
  1011. <pre class="wp-block-code"><code>OPEN #ch2%,scr_324x225a97x18</code></pre>
  1012.  
  1013.  
  1014.  
  1015. <p>En las líneas 670 y 680 uso la instrucción WINDOW para cambiar las dimensiones de las ventanas. Los datos son los mismos que al definir una ventana, ancho, alto, posición hortizontal y posición vertical, pero con WINDOWS podemos cambiar su tamaño y posición en cualquier momento. Con los cambios de posición de ventamas hemos hecho que ambas tengan el mismo ancho, estén las dos una encima de la otra, en el centro, y ahora podemos seguir trabajando con ellas, pero todo lo que hagamos a partir de ahora con esos canales sólo agfectará a la zona interior de sus nuevas dimensiones, y el fondo que tenían antes quedan pintados en pantalla, pues las ventanas son realmente invisibles a nuestros ojos, salvo que le demos un color de fondo o pintemos o escribamos en ellas.</p>
  1016.  
  1017.  
  1018.  
  1019. <p>En las lineas 690 y 700 pongo el color de fondo de cada ventana, el color de la bola 1 en ch% y el color magenta (rosa) en ch2%. El canal ch% es que usaremos para dibular el espacio donde rebotan las pelotas, el tablero, y le he dado las medidas de 20&#215;20 caracteres. ch2% contendrá el marcador.</p>
  1020.  
  1021.  
  1022.  
  1023. <p>En la línea 710 defino un borde tanto para ch% como para ch2%. En el primer caso es un borde del grosor de un pixel y de color magenta, y en el caso de ch% tambien tiene un grosor de un pixel, y este tendrá el color del fondo, ya que no le he definido un color concreto. Los bordes reducen el ancho y alto del espacio donde podemos escribir en las ventanas, de tal forma que, si la ventana asociada al canal ch% está definida con un ancho de 324 y un alto de 202 pixeles, sólo podremos usar 322 y 200 respectivamante, pues el borde que hemos creado resta 1 pixel arriba, otro abajo, otro a la derecha y otro a la izquierda.</p>
  1024.  
  1025.  
  1026.  
  1027. <p>En la línea 720 uso BLOCK. Esta instrucción permirte crear rectángulos dentro de ventanas. Los datos son los mismos que los de las ventanas, ancho, alto, x e y, y además podemos indicaer el color de relleno, pero estos bloques  tiene como referencia de posiciones el punto 0,0 de la ventana en la que se dibujan, y además están sujetos a un valor de escala. Dejaremos esto para otro momento. Ahora es suficiente con saber para que pintamos este rectángulo.</p>
  1028.  
  1029.  
  1030.  
  1031. <p>Al cambiar el tamaño de la ventana asociada al canal ch% pintamos la ventana delo color de la bola 1, pero en la demo, cada bola es dueña de la mitad del tablero. Con este BLOCK pinto la mitad correspondiente al color de la bola 2 en la mitad derecha del tablero. Es decir, primero puse el papel (fondo) de la ventana entera con el color c1% y luego he puesto el papel de la mitad derecha del color c2%.</p>
  1032.  
  1033.  
  1034.  
  1035. <p>En la línbea 730 cambio el tamaño de los caracteres con CSIZE. Esta instrucción permite tener caracteres el doble de ancho y alto que su tamaño original y con distinto espaciado. Ver CSIZE. Es muy útil para títulos.</p>
  1036.  
  1037.  
  1038.  
  1039. <p>En la línea 740 pongo el color de la tinta INK con la que van a ser dibujados los caracteres en ch2% de color verde, y luego uso CURSOR para indicar la posición exacta dentro de la ventana donde se va a escribir el texto. Fíjate lo potente que es esto. Podemos empezar a escribir en cualquier posición de la ventana con una presición de píxeles. Por supuesto también podemso escribvir caracteres de la forma tradicional indicado filas y columnas con la instrucción AT.</p>
  1040.  
  1041.  
  1042.  
  1043. <p>En la línea 750 se manda a imprimir com PRINT el título de la demo: «YIN &amp; YANG» que aaprecerá centrada en la ventana por arte de la instrucción CURSOR.</p>
  1044.  
  1045.  
  1046.  
  1047. <p>En la siguiente línea cambio el color de la tinta de este canal del color verde, que era el que estaba, al color blanco. </p>
  1048.  
  1049.  
  1050.  
  1051. <p>Entre las líneas 780 y 830 dibujo las dos bolas en pantalla, en su posición inicial. Primero la bola 1 y luego la bola 2 de la misma forma. Pongo el color del fondo, y el color de la tinta, con AT indico la posición en la cuadrícula de caracteres donde estará la bola, datos que obtengo de b%, de tal forma que a AT le paso el canal, lla posición X y la posición Y, y luego con PRINT imprimo la pelota b$ donde le hemos dicho.</p>
  1052.  
  1053.  
  1054.  
  1055. <p>Ya tenemos dibujado el tablero y las dos pelotas. Ahora, con invocando al procedimiento MARCADOR voy a incializar los marcadores.</p>
  1056.  
  1057.  
  1058.  
  1059. <h2 class="wp-block-heading">MARCADOR</h2>
  1060.  
  1061.  
  1062.  
  1063. <pre class="wp-block-code"><code>870 DEFine PROCedure MARCADOR<br>880   REMark Actualiza el marcador<br>890   AT     #ch2%,0,0<br>900   PRINT  #ch2%,CERO$(b%(0,4))<br>910   CURSOR #ch2%,283,0<br>920   PRINT  #ch2%,CERO$(b%(1,4))<br>930 END DEFine MARCADOR</code></pre>
  1064.  
  1065.  
  1066.  
  1067. <p>Este procedimiento es el encargado de poner los puntos de la bola 1 y de la bola 2 en el canal ch2%. En la bola 1 uso AT para posicionar los puntos y en la bola 2 uso CURSOR para posicionar de forma más precisa sus puntos. En ambos casos, a la hora de imprimir los puntos, uso la función CERO$, es decir, imprimo lo que devuelve de la función CERO$ cuando le paso el valor de los puntos que tienen que imprimirse. Ahora veremos por qué uso esta función.</p>
  1068.  
  1069.  
  1070.  
  1071. <h2 class="wp-block-heading">CERO$(valor)</h2>
  1072.  
  1073.  
  1074.  
  1075. <pre class="wp-block-code"><code>950 DEFine FuNction CERO$(valor)<br>960   REMark Rellena con ceros, max. 999<br>970   txt$=valor: ln%=LEN(txt$)<br>980   RETurn FILL$("0",3-ln%)&amp;txt$<br>990 END DEFine CERO$</code></pre>
  1076.  
  1077.  
  1078.  
  1079. <p>Esta es una función, no un procedimiento. La particularidad de las funciones es que devuelven algo despues de procesarlo, y para ello usan RETurn.</p>
  1080.  
  1081.  
  1082.  
  1083. <p>Lo que hace CERO$ es recibir un valor, en este caso la puntuación de una bola, y devolver una cadena de texto de tres caracteres de ancho formateada con ceros a la izquierda de tal forma que si, por ejemplo, le pasamos el valor 8 devolverá «008», si le pasamos el valor 15, devolverá «015», y si le pasamos el valor 321 devolverá «321». Esto serśa de ayuda para que el marcador se vea siempre bien.</p>
  1084.  
  1085.  
  1086.  
  1087. <p>Al empezar, como la puntuación de cada bola está indiacada a 0, ambos marcadores se verán como «000». Cuando la función lo devuelva, esto es lo que se imprimirá en el procedimiento MARCADOR para cada uno de los marcadores de cada bola.</p>
  1088.  
  1089.  
  1090.  
  1091. <pre class="wp-block-code"><code>970   txt$=valor: ln%=LEN(txt$)<br>980   RETurn FILL$("0",3-ln%)&amp;txt$</code></pre>
  1092.  
  1093.  
  1094.  
  1095. <p>En la línea 980 se devuelve el resultado de la operación de rellenar con los ceros «0» que sena necesarios, mediante la instrucción FILL$, el valor guardado en txt$. Es decir, con FILL$ creamos una cadena de longitud 3-ln%, osea lo que falta para completar el número, y con &amp; le añadimos el número que ya es una cadena txt$.</p>
  1096.  
  1097.  
  1098.  
  1099. <p>Un ejemplo: si la variable valor conrtiene 15, txt$ será «15» (una cadena), su longitud será 2, lo que obtenemos con LEN, y entonces deberemos rellenar con FILL$ a la izquierda con un (1) cero, es decir 3 &#8211; ln%, osea 3 &#8211; 2 = 1, y añadirle «15».</p>
  1100.  
  1101.  
  1102.  
  1103. <h2 class="wp-block-heading">Y en la próxima entrega&#8230;</h2>
  1104.  
  1105.  
  1106.  
  1107. <p>en la próxima ocasión veremos como aplicar movimiento y rebotes a cada una de las bolas para que se muevan por el tablero libremente.</p>
  1108.  
  1109.  
  1110.  
  1111. <h2 class="wp-block-heading">Ejercicio</h2>
  1112.  
  1113.  
  1114.  
  1115. <p>El juego consiste en mover libremente por la ventana un avatar identificado con la letra «C» que se irá comiendo los donuts representados con la letra «o» que apareceran en posiciones al azar. Al comerse un donut aparecerá otro en otra posición, y así hasta pulsar ESC.</p>
  1116.  
  1117.  
  1118.  
  1119. <p>Dibuja una ventana en el centro de la pantalla, con las dimensiones que tú quieras. Estas dimensiones deben ajustarse al ancho y alto de los caracteres, incluso si usas borde. de tal forma que los caracteres que se impirman en ella deben caber completamente.</p>
  1120.  
  1121.  
  1122.  
  1123. <p>Usa las teclas del cursor  y KEYROW para moverte, y controla que no te sales de la ventana.</p>
  1124.  
  1125.  
  1126.  
  1127. <p> Crea las variables siguientes: </p>
  1128.  
  1129.  
  1130.  
  1131. <ul>
  1132. <li>Una variable que contenga la letra C mayúscula, que será nuestro avatar en el juego.</li>
  1133.  
  1134.  
  1135.  
  1136. <li>Una variable que contenga la letra o minúscula, que será lo que nos vamos a comer en el juego. </li>
  1137.  
  1138.  
  1139.  
  1140. <li>Una variable que contenga un espacio vacío » » que usaremos para borrar el avatar y el objeto a comer antes de pintarlo de nuevo en la siguiente posición.</li>
  1141.  
  1142.  
  1143.  
  1144. <li>Una variable X y otra Y que guarden las posiciones horizontal y vertical de nuestro avatar (la «C») en la ventana. Puedes inciarlizarlas en la posición que desees dentro de la ventana o hacerlo de forma aleatoria.</li>
  1145.  
  1146.  
  1147.  
  1148. <li>Una variable X2 y otra Y2 que guarden las posiciones horizontal y vertical del objeto a comer y que aparecerá en las posicones aleatorias que le indiques.</li>
  1149. </ul>
  1150.  
  1151.  
  1152.  
  1153. <p>Para moverte por la ventana suma o resta uno a las posiciones X e Y del avatar con cada pulsación, pero antes, asegurate que X e Y no han llegado a los bordes de la ventana, si es así, no sumes ni restes nada a las posiciones X e Y, simplemente por ahí no se puede avanzar.</p>
  1154.  
  1155.  
  1156.  
  1157. <p>Enlaces recomendados</p>
  1158.  
  1159.  
  1160.  
  1161. <ul>
  1162. <li><a href="https://sinclairql.speccy.org/manuales/sqlgu.htm">Manual del QL en español</a></li>
  1163.  
  1164.  
  1165.  
  1166. <li><a href="https://sinclairql.speccy.org/manuales/tk2/index.htm">Manual de Toolkit II en español</a></li>
  1167.  
  1168.  
  1169.  
  1170. <li><a href="https://github.com/JavGuerra/Sinclair-QL-YinYang.githttps://github.com/JavGuerra/Sinclair-QL-YinYang.git">Código en GitHub &#8211; repo Sinclair-QL-YinYang</a></li>
  1171. </ul>
  1172.  
  1173.  
  1174.  
  1175. <p>Puedes seguir los comentarios de la comunidad en: <a href="https://retrowiki.es/viewtopic.php?f=98&#038;t=200040267" rel="nofollow">https://retrowiki.es/viewtopic.php?f=98&#038;t=200040267</a></p>
  1176.  
  1177.  
  1178.  
  1179. <h2 class="wp-block-heading">Siguiente entrega</h2>
  1180.  
  1181.  
  1182.  
  1183. <p><blockquote class="wp-embedded-content" data-secret="d4MCE35xlf"><a href="https://sinclairqles.wordpress.com/2024/03/29/programando-mi-primera-demo-en-ql-fasciculo-iii-movimiento-y-rebotes/">Programando mi primera Demo en QL – fascículo III, movimiento y rebotes</a></blockquote><iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted" title="«Programando mi primera Demo en QL – fascículo III, movimiento y rebotes» — QBlog" src="https://sinclairqles.wordpress.com/2024/03/29/programando-mi-primera-demo-en-ql-fasciculo-iii-movimiento-y-rebotes/embed/#?secret=VbyjKcjJZ8#?secret=d4MCE35xlf" data-secret="d4MCE35xlf" width="545" height="307" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe></p>
  1184. ]]></content:encoded>
  1185. <wfw:commentRss>https://sinclairqles.wordpress.com/2024/03/23/programando-mi-primera-demo-en-ql-fasciculo-ii-variables-y-tablero/feed/</wfw:commentRss>
  1186. <slash:comments>3</slash:comments>
  1187. <media:content url="https://0.gravatar.com/avatar/670e7a411bd32dc3309ddc8a7ac12a4cfa6305652b5ecbfc62415bc659494371?s=96&#38;d=retro&#38;r=G" medium="image">
  1188. <media:title type="html">badaman</media:title>
  1189. </media:content>
  1190. </item>
  1191. <item>
  1192. <title>Programando mi primera Demo en QL &#8211; fascículo I, los preparativos</title>
  1193. <link>https://sinclairqles.wordpress.com/2024/03/16/programando-mi-primera-demo-en-ql-fasciculo-i-los-preparativos/</link>
  1194. <comments>https://sinclairqles.wordpress.com/2024/03/16/programando-mi-primera-demo-en-ql-fasciculo-i-los-preparativos/#comments</comments>
  1195. <dc:creator><![CDATA[badaman]]></dc:creator>
  1196. <pubDate>Sat, 16 Mar 2024 18:24:01 +0000</pubDate>
  1197. <category><![CDATA[Programación]]></category>
  1198. <category><![CDATA[SuperBASIC]]></category>
  1199. <guid isPermaLink="false">http://sinclairqles.wordpress.com/?p=3675</guid>
  1200.  
  1201. <description><![CDATA[Esta colección de pocos artículos pretende dar a conocer las particularidades del SuperBASIC mediante un ejemplo práctico, la realización de una pequeña demo.<p><a href="https://sinclairqles.wordpress.com/2024/03/16/programando-mi-primera-demo-en-ql-fasciculo-i-los-preparativos/" class="more-link">Leer Más</a></p>]]></description>
  1202. <content:encoded><![CDATA[
  1203. <p>Parece que, más allá de los sospechosos habituales de la comunidad de QL, hay gente interesada en conocer un poco más sobre el QL, y en programar en él. Varios juegos en SuperBASIC han visto la luz recientemente en los foros de RetroWiki,. Esta colección de pocos artículos que inicio hoy pretende dar a conocer las particularidades del SuperBASIC mediante un ejemplo práctico, la realización de una pequeña demo.</p>
  1204.  
  1205.  
  1206.  
  1207. <p>Para aprovechar estas entregas es necesario que tengas conocimientos básicos de programación y sobre el Sinclair QL.</p>
  1208.  
  1209.  
  1210.  
  1211. <p>Me quedé hipnotizado con este ejemplo de programación, y me propuse portarlo al QL. A medida que lo iba desarrollando, más potencial le veía como medio para aprender programación.</p>
  1212.  
  1213.  
  1214.  
  1215. <p>El código en JavaScript y el video puede verse aquí: <a href="https://github.com/vnglst/pong-wars" rel="nofollow">https://github.com/vnglst/pong-wars</a></p>
  1216.  
  1217.  
  1218.  
  1219. <figure class="wp-block-image size-large"><img width="1024" height="811" data-attachment-id="3695" data-permalink="https://sinclairqles.wordpress.com/yin-yang_ql/" data-orig-file="https://sinclairqles.files.wordpress.com/2024/03/yin-yang_ql.png" data-orig-size="1024,811" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="yin-yang_ql" data-image-description="" data-image-caption="" data-medium-file="https://sinclairqles.files.wordpress.com/2024/03/yin-yang_ql.png?w=300" data-large-file="https://sinclairqles.files.wordpress.com/2024/03/yin-yang_ql.png?w=545" src="https://sinclairqles.files.wordpress.com/2024/03/yin-yang_ql.png?w=1024" alt="" class="wp-image-3695" srcset="https://sinclairqles.files.wordpress.com/2024/03/yin-yang_ql.png 1024w, https://sinclairqles.files.wordpress.com/2024/03/yin-yang_ql.png?w=150 150w, https://sinclairqles.files.wordpress.com/2024/03/yin-yang_ql.png?w=300 300w, https://sinclairqles.files.wordpress.com/2024/03/yin-yang_ql.png?w=768 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
  1220.  
  1221.  
  1222.  
  1223. <p>Este es el aspecto que tendrá la demo en el QL.</p>
  1224.  
  1225.  
  1226.  
  1227. <span id="more-3675"></span>
  1228.  
  1229.  
  1230.  
  1231. <h2 class="wp-block-heading">SuperBASIC</h2>
  1232.  
  1233.  
  1234.  
  1235. <p>Del potencial del lenguaje del QL ya se ha hablado mucho y bien. La característica que más destaca de él es que permite realizar programación estructurada mediante el uso de Procedimientos y Funciones. Estos se definen mediante una sentencia DEFine PROCedure o DEFine FuNtion. Por ejemplo, si necesitamos llamar al código que aumenta un contador ne un programa, podemos hacer un GO TO o GO SUB o usar un procedimiento o función, que sería la forma correcta de hacerlo en SuperBASIC:</p>
  1236.  
  1237.  
  1238.  
  1239. <pre class="wp-block-code"><code>100 DEFine PROCedure incremento<br>110   contador = contador + 1<br>120 END DEFine incremento<br>130 contador = 1<br>140 incremento<br>150 PRINT contador</code></pre>
  1240.  
  1241.  
  1242.  
  1243. <p>Como vemos en la línea 140, es suficiente con poner el nombre del procedimienrto para que se ejecute el código entre DEFine y END DEFine. No importa en la línea que esté el procedimiento. SuperBASIC lo encontrará y usará. El resultado obtenido será 2.</p>
  1244.  
  1245.  
  1246.  
  1247. <p>A un procedimiento o función podemos pasdarle parámetros, como veremos más adelante, igual que en cualquier lenguaje actual.</p>
  1248.  
  1249.  
  1250.  
  1251. <p>Esto que es tan obvio conlleva una forma de hacer programas distinta, modular, en la que el código puede trocearse para hacerlo más operativo y limpio, aunque esto implica, generalmente, un mayor número de líneas.</p>
  1252.  
  1253.  
  1254.  
  1255. <h2 class="wp-block-heading">La estructura</h2>
  1256.  
  1257.  
  1258.  
  1259. <p>Pues bien, partiendo de esta premisa, veamos cómo sería el «esqueleto» de nuestro programa demo:</p>
  1260.  
  1261.  
  1262.  
  1263. <pre class="wp-block-code"><code>100 REMark nombre del programa, version<br>110 REMark licencia, anyo, autores<br>120 REMark Estructura basica<br>130 :<br>140 CLEAR: REMark 'mdv1_yinyang_v1_bas'<br>150 dev$="mdv1_": prg$="yinyang": v$="v1"<br>160 :<br>170 INICIO: PANTALLA<br>180 REPeat prg<br>190   PRINT "Pulsa ESC": REMark Resto del codigo del programa aquí<br>200   IF KEYROW(1)=8: EXIT prg: REMark ESC<br>210 END REPeat prg<br>220 FIN: STOP<br>230 :<br>240 DEFine PROCedure sa<br>250   REMark Salva los cambios<br>260   REMark Nota: crear un fichero con el<br>270   REMark nombre correcto antes de usar<br>280   REMark y con cada nueva version<br>290   file$=dev$&amp;prg$&amp;"_"&amp;v$&amp;"_bas"<br>300   DELETE file$: SAVE file$<br>310 END DEFine sa<br>320 :<br>330 DEFine PROCedure INICIO<br>340   REMark Inicializacion del programa<br>350 END DEFine INICIO<br>360 :<br>370 DEFine PROCedure FIN<br>380   REMark Finalizacion del programa<br>390 END DEFine FIN<br>400 :<br>410 DEFine PROCedure PANTALLA<br>420   REMark Presentacion de pantalla<br>430 END DEFine PANTALLA<br>440 :<br>450 REMark Resto de FNs y PROCs aqui</code></pre>
  1264.  
  1265.  
  1266.  
  1267. <p>Podría decirse que esta es una estructura genérica que podría usarse con cualquier programa en SuperBASIC que hagamos. Vamos a estudiarla.</p>
  1268.  
  1269.  
  1270.  
  1271. <h2 class="wp-block-heading">Vamos por partes</h2>
  1272.  
  1273.  
  1274.  
  1275. <p>Como se aprecia, las lineas estan numeradas, y cada línea puede tener una o varias sentencias separadas por dos puntos. Incluso podemos tener líneas con dos puntos y nada más. Esto se usa para separar visualmente el código.</p>
  1276.  
  1277.  
  1278.  
  1279. <p>Los comentarios en el programa se incluyen con la sentencia REMark. Podemos tener comentarios que ocupen una línea o al final de una línea, tras una o varias sentencias en esa línea.</p>
  1280.  
  1281.  
  1282.  
  1283. <p>En la línea 140 vemos un CLEAR. Esto se usa para limpiar el valor de las variables del BASIC. A continuación va un comentario con la ruta de nuestro programa, un ejemplo de lo que comentaba antes sobre los REM.</p>
  1284.  
  1285.  
  1286.  
  1287. <p>En la siguiente línea, mediante variables, podemos determinar el dispositivo, el nombre del programa y la versión del mismo. Esto será útil para el procedimiento llamada sa.</p>
  1288.  
  1289.  
  1290.  
  1291. <h3 class="wp-block-heading">El procedimiento sa</h3>
  1292.  
  1293.  
  1294.  
  1295. <p>De la línea 240 a la 310 se define el procedimiento «sa» que sirve para salvar los cambios de nuestro programa a medida que programamos.</p>
  1296.  
  1297.  
  1298.  
  1299. <p>Este tipo de procedimientos es muy común en el mundo QL, y ayudan a no tener que escribir los comandos para borrar y volver a guardar el programa que vamos haciendo. SuperBASIC permite usar los procedimientos en el sistema como si de nuevos comandos se tratase, así pues, una vez hayamos ejecutado el programa, aunque paremos su ejecución, los procedimientos pueden ser invocados desde la línea de comandos.</p>
  1300.  
  1301.  
  1302.  
  1303. <p>Con sólo escribir sa en la línea de comandos, se guardará una versión actualizada de nuestro programa. Eso sí, las variables dev$, prg$ y v$ (varaibles que contienen texto y por eso terminan en $) deben tener los valores correctos, pues en la línea 290 se compone la ruta y el nombre dle fichero que usaremos.</p>
  1304.  
  1305.  
  1306.  
  1307. <p>dev$ tiene como valor mdv1_, que corresponde a un dispositivo de microdrive. Podemos usar otros como flp1_ para disqueteras, win1_ para discos, ram1_ para discos RAM&#8230; y de cada tipo de dispositivo puede haber 8, por ejemplo, de microdrives puede haber mdv1_, mdv2_ &#8230; mdv8_</p>
  1308.  
  1309.  
  1310.  
  1311. <p>En la línea 290 se usa el caracter &amp; para concatenar o unir estas cadenas que se guardarán en la variable file$</p>
  1312.  
  1313.  
  1314.  
  1315. <p>Cuando estés programando, verás lo útil que resulta el nuevo procedimiento/comando sa.</p>
  1316.  
  1317.  
  1318.  
  1319. <h2 class="wp-block-heading">Nuestro programa</h2>
  1320.  
  1321.  
  1322.  
  1323. <p>El programa como tal está entre las líneas 170 y 220:</p>
  1324.  
  1325.  
  1326.  
  1327. <pre class="wp-block-code"><code><code role="textbox" aria-multiline="true" aria-label="Código" class="block-editor-rich-text__editable rich-text"><code role="textbox" aria-multiline="true" aria-label="Código" class="block-editor-rich-text__editable rich-text" style="min-width: 1px">170 INICIO: PANTALLA<br>180 REPeat prg<br>190   PRINT "Pulsa ESC": REMark Resto del codigo del programa aquí<br>200   IF KEYROW(1)=8: EXIT prg: REMark ESC<br>210 END REPeat prg<br>220 FIN: STOP</code></code></code></pre>
  1328.  
  1329.  
  1330.  
  1331. <h3 class="wp-block-heading">Procedimiento INICIO</h3>
  1332.  
  1333.  
  1334.  
  1335. <p>Este es un procedimiento que contendrá la inicialización de variables del programa. En la siguiente versión del programa veremos qué variables necesitaremos y cómo se definen. Por ahora dejamos el procedimiento creado entre las líneas 330 y 350.</p>
  1336.  
  1337.  
  1338.  
  1339. <h3 class="wp-block-heading"><strong>Procedimiento PANTALLA</strong></h3>
  1340.  
  1341.  
  1342.  
  1343. <p>Este procedimiento será el encargado de dibujar la pantalla, de mostrar la interfaz de la demo. Está entre las líneas 410 a 430. Ahora no hace realmente nada, igual que INICIO, pero en la siguiente versión le daremos contenido.</p>
  1344.  
  1345.  
  1346.  
  1347. <h3 class="wp-block-heading">Procedimiento FIN</h3>
  1348.  
  1349.  
  1350.  
  1351. <p>Este procedimiento definido entre las líneas 370 a 390 nos permitirá cerrar el programa de forma adecuada. Mismo caso que en los procedimientos anteriores. Lo veremos en acción en la siguiente versión del programa.</p>
  1352.  
  1353.  
  1354.  
  1355. <h3 class="wp-block-heading">STOP</h3>
  1356.  
  1357.  
  1358.  
  1359. <p>Esta instrucción sirve para parar la ejecución del programa, como puede suponerse. Realmente no es necesario usarla en este programa, pero ayuda a delimitar visualmente donde termina el código.</p>
  1360.  
  1361.  
  1362.  
  1363. <p>Si bien debajo de la línea 220 hay definiciones de Procedimientos, estos no se ejecutarán a no ser que se llamen o invoquen en el programa.</p>
  1364.  
  1365.  
  1366.  
  1367. <h3 class="wp-block-heading">REPeat prg</h3>
  1368.  
  1369.  
  1370.  
  1371. <p>Repeat es un bucle que tiene asociado un identificador, en este caso «prg», que nos da la oprtunidad de ejecutar el contenido de las líneas entre REPeat y END REPeat hasta que se cumpla una condición de salida. Cuando esto ocurre, se sale del bucle mediante EXIT, como puede vertse en la línea 200.</p>
  1372.  
  1373.  
  1374.  
  1375. <p>El bucle se repite hasta que pulsemos la tecla ESC, y entonces salede él y continua la ejecución con FIN y luego STOP.</p>
  1376.  
  1377.  
  1378.  
  1379. <p>KEYROW es una instrucción que lee el teclado y devuelve un valor numérico correspondiente a la tecla pulsada. En este caso KEYROW lee la fila 1 de la cuadrícula del teclado y comprueba si esta devuelve el valor 8, que corresponde a la tecla ESC. Consulta la guía dle usuario para más información y uso de KEYROW.</p>
  1380.  
  1381.  
  1382.  
  1383. <p>Una particularidad del SuperBASIC es que, si ponemos las instrucciones que deben ejecutarse tras un IF en una sola línea, no necesitamos hacer uso de THEN ni tampoco de END IF, com ohago en la línea 200.</p>
  1384.  
  1385.  
  1386.  
  1387. <p>En la línea 190 incluiríamos el resto de programa y los procedimientos a los que deseemos invocar en las siguientes versiones de esta demo.</p>
  1388.  
  1389.  
  1390.  
  1391. <h2 class="wp-block-heading">Usando el programa</h2>
  1392.  
  1393.  
  1394.  
  1395. <p>El programa realmente no hace nada. Una vez ejecutado, espera todo el tiempo a que pulsemos la tecla ESC para salir.</p>
  1396.  
  1397.  
  1398.  
  1399. <p>Podemos copiar el código y guardarlo en nuestor disco como un fichero de texto plano, en la ruta «mdv1_yinyang_v1_bas»</p>
  1400.  
  1401.  
  1402.  
  1403. <p>Si vamos a cambiar la ubicación del fichero, debemos cambiar también el valor de la variable dev$ editando el código, para poder utilizar correctamente el comando sa. Un ejemplo de edición de código desde QL. Introducir este comando, y una vez editado, pulsar ENTER.</p>
  1404.  
  1405.  
  1406.  
  1407. <pre class="wp-block-code"><code>EDIT 150</code></pre>
  1408.  
  1409.  
  1410.  
  1411. <p>Aparecerá la línea en la línea de comandos para poder editarla. Luego se guardarán los cambios con ENTER.</p>
  1412.  
  1413.  
  1414.  
  1415. <p>Si tienes el Toolkit II o TK2 para los amigos, puedes hacer uso del comando ED, que te permite editar el programa en la ventana donde se lista. Lee el manual de TK2.</p>
  1416.  
  1417.  
  1418.  
  1419. <p>Si ejecutaste el programa, cuando hayas hecho los cambios, podrás usar el comando sa con tranquilidad para guardarlo.</p>
  1420.  
  1421.  
  1422.  
  1423. <p>Haciendo uso del comando RENUM las líneas se renumerarán automáticamente de 10 en 10, empezando por la línea 100, dejando espacio para nuevas lineas.</p>
  1424.  
  1425.  
  1426.  
  1427. <p>Recuerda que, para borrar, debes usar la combinación de teclas CTRL + tecla izquierda o CTRL + tecla derecha.</p>
  1428.  
  1429.  
  1430.  
  1431. <h2 class="wp-block-heading">Y la próxima semana&#8230;</h2>
  1432.  
  1433.  
  1434.  
  1435. <p>No te pierdas la próxima entrega en la que definiremos las variables de la demo, la pantalla y el marcador de puntuación.</p>
  1436.  
  1437.  
  1438.  
  1439. <p>Mientras tanto, ¿qué te parece probar todo lo visto aquí con una pequeña aplicación hecha por ti?</p>
  1440.  
  1441.  
  1442.  
  1443. <h3 class="wp-block-heading">Ejercicio</h3>
  1444.  
  1445.  
  1446.  
  1447. <p>Te propongo que, usando esta estructura, crees un menú en pantalla que muestre tres opciones, de tal forma que al pulsar 1, haciendo uso de PRINT, la aplicación escriba, la frase «Buenos días». Si pulsamos 2, se debe imprimir «Buenas tardes» y si pulsamos 3, debe decir «Buenas noches». Usa ESC para salir.</p>
  1448.  
  1449.  
  1450.  
  1451. <p>Cada una de las tres opciones puede ser invocada mediante un procedimiento llamado OPCION1, OPCION2 y OPCION3 respectivamente. Dentro de estos procedimientos estarían los PRINT que muestran los mensajes.</p>
  1452.  
  1453.  
  1454.  
  1455. <p>Las pulsaciones de las teclas se comprobarán mediante KEYROW (ver manual) haciendo uso de los correspondientes IF, de la misma forma que en la línea 200, pero en vez de usar EXIT invocaremos al procedimiento que corresponda.</p>
  1456.  
  1457.  
  1458.  
  1459. <h2 class="wp-block-heading">Enlaces recomendados</h2>
  1460.  
  1461.  
  1462.  
  1463. <ul>
  1464. <li><a href="https://sinclairql.speccy.org/manuales/sqlgu.htm">Manual del QL en español</a></li>
  1465.  
  1466.  
  1467.  
  1468. <li><a href="https://sinclairql.speccy.org/manuales/tk2/index.htm">Manual de Toolkit II en español</a></li>
  1469.  
  1470.  
  1471.  
  1472. <li><a href="https://github.com/JavGuerra/Sinclair-QL-YinYang.githttps://github.com/JavGuerra/Sinclair-QL-YinYang.git">Código en GitHub &#8211; repo Sinclair-QL-YinYang</a></li>
  1473. </ul>
  1474.  
  1475.  
  1476.  
  1477. <p>Puedes seguir los comentarios de la comunidad en: <a href="https://retrowiki.es/viewtopic.php?f=98&#038;t=200040237" rel="nofollow">https://retrowiki.es/viewtopic.php?f=98&#038;t=200040237</a></p>
  1478.  
  1479.  
  1480.  
  1481. <h2 class="wp-block-heading">Siguiente entrega</h2>
  1482.  
  1483.  
  1484.  
  1485. <p><blockquote class="wp-embedded-content" data-secret="FgISRljIZj"><a href="https://sinclairqles.wordpress.com/2024/03/23/programando-mi-primera-demo-en-ql-fasciculo-ii-variables-y-tablero/">Programando mi primera Demo en QL – fascículo II, variables y tablero</a></blockquote><iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted" title="«Programando mi primera Demo en QL – fascículo II, variables y tablero» — QBlog" src="https://sinclairqles.wordpress.com/2024/03/23/programando-mi-primera-demo-en-ql-fasciculo-ii-variables-y-tablero/embed/#?secret=wuwnaCbSyV#?secret=FgISRljIZj" data-secret="FgISRljIZj" width="545" height="307" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe></p>
  1486. ]]></content:encoded>
  1487. <wfw:commentRss>https://sinclairqles.wordpress.com/2024/03/16/programando-mi-primera-demo-en-ql-fasciculo-i-los-preparativos/feed/</wfw:commentRss>
  1488. <slash:comments>2</slash:comments>
  1489. <media:content url="https://0.gravatar.com/avatar/670e7a411bd32dc3309ddc8a7ac12a4cfa6305652b5ecbfc62415bc659494371?s=96&#38;d=retro&#38;r=G" medium="image">
  1490. <media:title type="html">badaman</media:title>
  1491. </media:content>
  1492.  
  1493. <media:content url="https://sinclairqles.files.wordpress.com/2024/03/yin-yang_ql.png?w=1024" medium="image" />
  1494. </item>
  1495. <item>
  1496. <title>Expandiendo un QL, hacia el futuro y hacia el pasando</title>
  1497. <link>https://sinclairqles.wordpress.com/2024/03/03/expandiendo-un-ql-hacia-el-futuro-y-hacia-el-pasando/</link>
  1498. <comments>https://sinclairqles.wordpress.com/2024/03/03/expandiendo-un-ql-hacia-el-futuro-y-hacia-el-pasando/#respond</comments>
  1499. <dc:creator><![CDATA[afx]]></dc:creator>
  1500. <pubDate>Sun, 03 Mar 2024 13:04:18 +0000</pubDate>
  1501. <category><![CDATA[Hardware]]></category>
  1502. <category><![CDATA[Historia]]></category>
  1503. <category><![CDATA[Miscelánea]]></category>
  1504. <guid isPermaLink="false">http://sinclairqles.wordpress.com/?p=3659</guid>
  1505.  
  1506. <description><![CDATA[Se que el título de este post es un poco extraño, pero me permite compartir lo que recibí en un paquete entregado por Correos esta semana. Se trata de dos "expansiones" para uno de mis QLs.
  1507.  
  1508. Una de las expansiones es una puerta abierta al futuro, ... la segunda "expansión" es una mirada al pasado, ...<p><a href="https://sinclairqles.wordpress.com/2024/03/03/expandiendo-un-ql-hacia-el-futuro-y-hacia-el-pasando/" class="more-link">Leer Más</a></p>]]></description>
  1509. <content:encoded><![CDATA[
  1510. <p>Se que el título de este post es un poco extraño, pero me permite compartir lo que recibí en un paquete entregado por Correos esta semana. Se trata de dos «expansiones» para uno de mis QLs.</p>
  1511.  
  1512.  
  1513.  
  1514. <p>Una de las expansiones es una&nbsp;<strong>puerta abierta al futuro</strong>, se trata del dispositivo de moda en el mundillo QL, QIMSI. Seguramente ya lo conoceréis porque hemos hablado mucho de él en otros post de Retrowiki y en Qlog. En el encuentro de Majadas del 40 aniversario lo pudimos ver en vivo (muchos de nosotros por primera vez). Brevemente, para quien no lo conozca, se trata de una diminuta placa que se conecta al puerto ROM del QL y que aporta almacenamiento masivo en una micro-SD, conexión de ratón PS2, conexión a un teclado externo PS2 y posibilidad de incoporar comunicaciones serie de alta velocidad. Ahora tengo la QIMSI en uno de mis QL con una GoldCard, esto me permite ejecutar tanto QDOS como SMSQ/E, que por cierto, se acaba de liberar una nueva versión hace un par de semanas.</p>
  1515.  
  1516.  
  1517.  
  1518. <p>La segunda «expansión» es <strong>una mirada al pasado</strong>, concretamente una disquetera de 5 1/4 DD de Miracle System. Sinceramente no me esperaba que funcionara, pero fue conectarla al QL, encender el sistema, formatear un disquete, copiar ficheros y &#8230;. sorpresa ¡¡FUNCIONAAAA!!. Otra prueba interesante que realice es acceder a la disquetera como «unidad compartida del QL» desde la FPGA (Q68) y desde el emulador en el PC (QPC2) empleando la QLNET (la red local del QL). Mola mucho hacer un «n1_dir_flp1_» desde la FPGA o el emulador en el PC y ver como se enciente la luz de la disquetera del QL mostrando el contenido del directorio. </p>
  1519.  
  1520.  
  1521.  
  1522. <p>Esto me parece fantástico, una plataforma que ha sobrevivido 40 años y que en la actualidad aún se mantiene su sistema operativo el cual puede lidiar con tanto con dispositivos modernos (tarjetas microSD de almacenamiento masivo) como con dispositivos de almacenamiento de principios de los 80.</p>
  1523.  
  1524.  
  1525.  
  1526. <p>Os pongo algunas imágenes:</p>
  1527.  
  1528.  
  1529.  
  1530. <figure class="wp-block-image size-large"><img loading="lazy" width="600" height="349" data-attachment-id="3660" data-permalink="https://sinclairqles.wordpress.com/2024/03/03/expandiendo-un-ql-hacia-el-futuro-y-hacia-el-pasando/qimsi/" data-orig-file="https://sinclairqles.files.wordpress.com/2024/03/qimsi.png" data-orig-size="600,349" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="qimsi" data-image-description="" data-image-caption="" data-medium-file="https://sinclairqles.files.wordpress.com/2024/03/qimsi.png?w=300" data-large-file="https://sinclairqles.files.wordpress.com/2024/03/qimsi.png?w=545" src="https://sinclairqles.files.wordpress.com/2024/03/qimsi.png?w=600" alt="" class="wp-image-3660" srcset="https://sinclairqles.files.wordpress.com/2024/03/qimsi.png 600w, https://sinclairqles.files.wordpress.com/2024/03/qimsi.png?w=150 150w, https://sinclairqles.files.wordpress.com/2024/03/qimsi.png?w=300 300w" sizes="(max-width: 600px) 100vw, 600px" /></figure>
  1531.  
  1532.  
  1533.  
  1534. <figure class="wp-block-image size-large"><img loading="lazy" width="600" height="799" data-attachment-id="3662" data-permalink="https://sinclairqles.wordpress.com/2024/03/03/expandiendo-un-ql-hacia-el-futuro-y-hacia-el-pasando/miracle514a/" data-orig-file="https://sinclairqles.files.wordpress.com/2024/03/miracle514a.png" data-orig-size="600,799" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="miracle514a" data-image-description="" data-image-caption="" data-medium-file="https://sinclairqles.files.wordpress.com/2024/03/miracle514a.png?w=225" data-large-file="https://sinclairqles.files.wordpress.com/2024/03/miracle514a.png?w=545" src="https://sinclairqles.files.wordpress.com/2024/03/miracle514a.png?w=600" alt="" class="wp-image-3662" srcset="https://sinclairqles.files.wordpress.com/2024/03/miracle514a.png 600w, https://sinclairqles.files.wordpress.com/2024/03/miracle514a.png?w=113 113w, https://sinclairqles.files.wordpress.com/2024/03/miracle514a.png?w=225 225w" sizes="(max-width: 600px) 100vw, 600px" /></figure>
  1535.  
  1536.  
  1537.  
  1538. <figure class="wp-block-image size-large"><img loading="lazy" width="600" height="799" data-attachment-id="3663" data-permalink="https://sinclairqles.wordpress.com/2024/03/03/expandiendo-un-ql-hacia-el-futuro-y-hacia-el-pasando/miracle514b/" data-orig-file="https://sinclairqles.files.wordpress.com/2024/03/miracle514b.png" data-orig-size="600,799" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="miracle514b" data-image-description="" data-image-caption="" data-medium-file="https://sinclairqles.files.wordpress.com/2024/03/miracle514b.png?w=225" data-large-file="https://sinclairqles.files.wordpress.com/2024/03/miracle514b.png?w=545" src="https://sinclairqles.files.wordpress.com/2024/03/miracle514b.png?w=600" alt="" class="wp-image-3663" srcset="https://sinclairqles.files.wordpress.com/2024/03/miracle514b.png 600w, https://sinclairqles.files.wordpress.com/2024/03/miracle514b.png?w=113 113w, https://sinclairqles.files.wordpress.com/2024/03/miracle514b.png?w=225 225w" sizes="(max-width: 600px) 100vw, 600px" /></figure>
  1539.  
  1540.  
  1541.  
  1542. <figure class="wp-block-image size-large"><img loading="lazy" width="600" height="501" data-attachment-id="3664" data-permalink="https://sinclairqles.wordpress.com/2024/03/03/expandiendo-un-ql-hacia-el-futuro-y-hacia-el-pasando/miracle514c/" data-orig-file="https://sinclairqles.files.wordpress.com/2024/03/miracle514c.png" data-orig-size="600,501" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="miracle514c" data-image-description="" data-image-caption="" data-medium-file="https://sinclairqles.files.wordpress.com/2024/03/miracle514c.png?w=300" data-large-file="https://sinclairqles.files.wordpress.com/2024/03/miracle514c.png?w=545" src="https://sinclairqles.files.wordpress.com/2024/03/miracle514c.png?w=600" alt="" class="wp-image-3664" srcset="https://sinclairqles.files.wordpress.com/2024/03/miracle514c.png 600w, https://sinclairqles.files.wordpress.com/2024/03/miracle514c.png?w=150 150w, https://sinclairqles.files.wordpress.com/2024/03/miracle514c.png?w=300 300w" sizes="(max-width: 600px) 100vw, 600px" /></figure>
  1543.  
  1544.  
  1545.  
  1546. <figure class="wp-block-image size-large"><img loading="lazy" width="600" height="459" data-attachment-id="3665" data-permalink="https://sinclairqles.wordpress.com/2024/03/03/expandiendo-un-ql-hacia-el-futuro-y-hacia-el-pasando/miracle514d/" data-orig-file="https://sinclairqles.files.wordpress.com/2024/03/miracle514d.png" data-orig-size="600,459" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="miracle514d" data-image-description="" data-image-caption="" data-medium-file="https://sinclairqles.files.wordpress.com/2024/03/miracle514d.png?w=300" data-large-file="https://sinclairqles.files.wordpress.com/2024/03/miracle514d.png?w=545" src="https://sinclairqles.files.wordpress.com/2024/03/miracle514d.png?w=600" alt="" class="wp-image-3665" srcset="https://sinclairqles.files.wordpress.com/2024/03/miracle514d.png 600w, https://sinclairqles.files.wordpress.com/2024/03/miracle514d.png?w=150 150w, https://sinclairqles.files.wordpress.com/2024/03/miracle514d.png?w=300 300w" sizes="(max-width: 600px) 100vw, 600px" /></figure>
  1547.  
  1548.  
  1549.  
  1550. <figure class="wp-block-image size-large"><img loading="lazy" width="600" height="555" data-attachment-id="3667" data-permalink="https://sinclairqles.wordpress.com/2024/03/03/expandiendo-un-ql-hacia-el-futuro-y-hacia-el-pasando/launchpad_a/" data-orig-file="https://sinclairqles.files.wordpress.com/2024/03/launchpad_a.png" data-orig-size="600,555" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="launchpad_a" data-image-description="" data-image-caption="" data-medium-file="https://sinclairqles.files.wordpress.com/2024/03/launchpad_a.png?w=300" data-large-file="https://sinclairqles.files.wordpress.com/2024/03/launchpad_a.png?w=545" src="https://sinclairqles.files.wordpress.com/2024/03/launchpad_a.png?w=600" alt="" class="wp-image-3667" srcset="https://sinclairqles.files.wordpress.com/2024/03/launchpad_a.png 600w, https://sinclairqles.files.wordpress.com/2024/03/launchpad_a.png?w=150 150w, https://sinclairqles.files.wordpress.com/2024/03/launchpad_a.png?w=300 300w" sizes="(max-width: 600px) 100vw, 600px" /></figure>
  1551.  
  1552.  
  1553.  
  1554. <p>QL is 40, QL forever!</p>
  1555.  
  1556.  
  1557.  
  1558. <p>PD:<br>¡Gracias napsternds!&nbsp;</p>
  1559. ]]></content:encoded>
  1560. <wfw:commentRss>https://sinclairqles.wordpress.com/2024/03/03/expandiendo-un-ql-hacia-el-futuro-y-hacia-el-pasando/feed/</wfw:commentRss>
  1561. <slash:comments>0</slash:comments>
  1562. <media:content url="https://2.gravatar.com/avatar/2e948c7450b5c4716e0fc96ea0278fc228d8f5b3fd19305b5133c6cd0d22928a?s=96&#38;d=retro&#38;r=G" medium="image">
  1563. <media:title type="html">afx</media:title>
  1564. </media:content>
  1565.  
  1566. <media:content url="https://sinclairqles.files.wordpress.com/2024/03/qimsi.png?w=600" medium="image" />
  1567.  
  1568. <media:content url="https://sinclairqles.files.wordpress.com/2024/03/miracle514a.png?w=600" medium="image" />
  1569.  
  1570. <media:content url="https://sinclairqles.files.wordpress.com/2024/03/miracle514b.png?w=600" medium="image" />
  1571.  
  1572. <media:content url="https://sinclairqles.files.wordpress.com/2024/03/miracle514c.png?w=600" medium="image" />
  1573.  
  1574. <media:content url="https://sinclairqles.files.wordpress.com/2024/03/miracle514d.png?w=600" medium="image" />
  1575.  
  1576. <media:content url="https://sinclairqles.files.wordpress.com/2024/03/launchpad_a.png?w=600" medium="image" />
  1577. </item>
  1578. <item>
  1579. <title>Presencia en El Mundo del Spectrum, podcast 12&#215;04</title>
  1580. <link>https://sinclairqles.wordpress.com/2024/02/29/presencia-en-el-mundo-del-spectrum-podcast-12x04/</link>
  1581. <comments>https://sinclairqles.wordpress.com/2024/02/29/presencia-en-el-mundo-del-spectrum-podcast-12x04/#comments</comments>
  1582. <dc:creator><![CDATA[badaman]]></dc:creator>
  1583. <pubDate>Thu, 29 Feb 2024 22:29:31 +0000</pubDate>
  1584. <category><![CDATA[Noticias]]></category>
  1585. <category><![CDATA[Resúmenes]]></category>
  1586. <category><![CDATA[El Mundo del Spectrum]]></category>
  1587. <category><![CDATA[QLis40]]></category>
  1588. <guid isPermaLink="false">http://sinclairqles.wordpress.com/?p=3647</guid>
  1589.  
  1590. <description><![CDATA[Varios integrantes del grupo de QL estuvimos en el programa Super Directo de El Mundo del Spectrum emitido el 1 de febrero de 2024 con motivo del 40 aniversario del QL. Este programa fue la base, junto con la entrevista que se llevó a cabo en el evento de Majadas del Tietar, para su podcast 12x04.<p><a href="https://sinclairqles.wordpress.com/2024/02/29/presencia-en-el-mundo-del-spectrum-podcast-12x04/" class="more-link">Leer Más</a></p>]]></description>
  1591. <content:encoded><![CDATA[
  1592. <p>Resumen por: Miguel Ángel Rojo</p>
  1593.  
  1594.  
  1595.  
  1596. <p>Varios integrantes del grupo de QL estuvimos en el programa Super Directo de El Mundo del Spectrum emitido el 1 de febrero de 2024 con motivo del 40 aniversario del QL. Este programa fue la base, junto con la entrevista que se llevó a cabo en el evento de Majadas del Tietar, para su podcast 12&#215;04.</p>
  1597.  
  1598.  
  1599.  
  1600. <span id="more-3647"></span>
  1601.  
  1602.  
  1603.  
  1604. <figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
  1605. <div class="embed-youtube"><iframe title="Especial SINCLAIR QL (Súper Directo)" width="545" height="307" src="https://www.youtube.com/embed/B1yjOgAm0Vk?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe></div>
  1606. </div><figcaption class="wp-element-caption">Emisión del Super Directo</figcaption></figure>
  1607.  
  1608.  
  1609.  
  1610. <p class="has-medium-font-size"><strong><a href="https://www.elmundodelspectrum.com/el-mundo-del-spectrum-podcast-12x04/">Acceso al Podcast 12&#215;04</a></strong></p>
  1611.  
  1612.  
  1613.  
  1614. <p>Esta vez los amigos del QL se fueron a una entrevista monográfica y en directo sobre el Sinclair QL al programa «El mundo del Spectrum» el 1 de febrero del 2024, que contó con 7 invitados expertos de este mítico y desconocido ordenador.</p>
  1615.  
  1616.  
  1617.  
  1618. <p>Alejandro, Jesús y Juan estaban acompañados por Napsternds, Badaman, Zerover, Titoxunix, AFX, Álvaro Alea y Miguel Ángel Rojo.</p>
  1619.  
  1620.  
  1621.  
  1622. <p>Alejandro ofreció una breve explicación sobre la salida del Sinclair QL en habitual obertura del programa. Le sigue Jesús sobre lo que se va a hablar durante las más de dos horas siguientes.</p>
  1623.  
  1624.  
  1625.  
  1626. <p>Juanfra nos ofrece su opinión sobre los seguidores del Spectrum y como lo veían, como la alargada sombra de hijo mayor, a través de las revistas de la época, y posiblemente siendo sin duda el siguiente paso del Spectrum. Esto, no obstante, no lo fue para todos ellos, por los cambios que vinieron en el mundo de la Informática y la aparición de nuevos sistemas.</p>
  1627.  
  1628.  
  1629.  
  1630. <p>Los protagonistas fueron hablando, uno a uno, dando sus agradecimientos y  un breve comentario sobre su visión de este particular ordenador.</p>
  1631.  
  1632.  
  1633.  
  1634. <p>Jesus, entrando al turrón, pregunta por el acontecimiento sobre el evento del 40 aniversario o QLis40.</p>
  1635.  
  1636.  
  1637.  
  1638. <p>Badaman nos cuenta que el 16 de abril de 2013 en una reunión por videoconferencia, hizo la propuesta, un evento de QL en España aprovechando las instalaciones del Museo de Historia de la Computación ubicado en Majadas de Tiétar, Cáceres, con fecha  al año siguiente, en torno al 12 de enero, coincidiendo con  la presentación a los medios del QL en el 84.</p>
  1639.  
  1640.  
  1641.  
  1642. <p>En el evento se puedo contabilizar unas 40 personas y se mostraron unos 15 QLs,  y maquinas vistas rara vez, como toda la colección de Fede, la de Titoxunix con su placa nueva de QL de Tetroid, o la fabricación de hardware que hace Alvaro.</p>
  1643.  
  1644.  
  1645.  
  1646. <p>Badman, Zerover. Afx, todos aportaron al evento su granito de arena. Hubo, actividades, charlas, exposiciones de equipos con ampliaciones clásicas y nuevas, faltando tiempo para trastear con ellas.</p>
  1647.  
  1648.  
  1649.  
  1650. <p>Napsternds nos cuenta lo mágico que puede ser un QL viéndolo desde el punto vista de tres generaciones, el que comenzó en la época como su primer ordenador y no lo dejó, el que volvió después del fiasco de los microdrives, o el que, como él y Miguel Angel, empezaron hace pocos años.</p>
  1651.  
  1652.  
  1653.  
  1654. <p>Posibilidades de configuración, trastear, conseguir funcionalidades, y mucha exploración, el  descubrimiento es lo que nos tiene enganchados y resulta ser una maravilla.</p>
  1655.  
  1656.  
  1657.  
  1658. <p>Álvaro da un visión en perspectiva sobre el recuerdo de la presentación del QL, su diseño, las prisas, el “contrarreloj” por superar a sus rivales y las decisiones que, a la larga, salieron muy caras a pesar de que la máquina se distribuyó con retraso.</p>
  1659.  
  1660.  
  1661.  
  1662. <p>A la pregunta de la utilización de los microdrive, TitoxUnix nos cuenta que Sinclair los introdujo por abaratar y por el intento de imponer su propio estándar, y que el mayor problema del QL fue el tiempo, con un desarrollo muy largo,  ya que fue un ordenador que tendría que haber salido a finales del 83 como mucho, y con mas inversión.</p>
  1663.  
  1664.  
  1665.  
  1666. <p>Afx añade que, en Sinclair, no supieron fijar un objetivo. No tenían claro lo que querían: ordenador portátil, super Spectrum, ordenador de oficina&#8230;</p>
  1667.  
  1668.  
  1669.  
  1670. <p>Sinclair fue un visionario, pero tal vez se adelantó demasiado a su tiempo, y sus productos no llegaron en el momento adecuado: mini televisores, calculadoras, coches eléctricos&#8230; con el QL tenia la perspectiva de hacer un producto barato para competir de igual a igual con los PCs, pero era un reto, sobre todo ante la llegada de los clónicos PC.</p>
  1671.  
  1672.  
  1673.  
  1674. <p>Sinclair tubo un acierto rotundo con el ZX80, ZX81 y su ZX Spectrum. Al alcanzar un éxito brutal, convirtiéndose en la empresa número uno del mercado, y con la presión de los accionistas de conseguir otro éxito, el descontrol por el crecimiento de la empresa, con un QL poco definido&#8230; con todo eso se alargó su salida al mercado, entregándose a los clientes tarde y con muchos problemas, lo que hizo que una maquina adelantada a su tiempo, con un SuperBASIC y un sistema operativo espectacular, no tubo la repercusión deseada en el mercado.</p>
  1675.  
  1676.  
  1677.  
  1678. <p>Juanfran, que es poseedor de una gran colección de Sinclair,  nos mostró la publicidad de la época, el catálogo del Sinclair QL con las ordenes de pedido del ordenador. Todo un tesoro que habla de sus características y sus posibilidades profesionales a un increíble precio de 110.000 pts (el equivalente a unos 2.000 € o más de hoy)..</p>
  1679.  
  1680.  
  1681.  
  1682. <p>Un dato importante del suplemento número 3 de QL User nos dice que Sinclair recibía entre 500 y 600 hojas de pedido de QLs al día, teniendo un retraso increíble en los pedidos.</p>
  1683.  
  1684.  
  1685.  
  1686. <p>El Sinclair QL tenía previsto que saliese personalizados para 12 países diferentes, mas un importador, pero, finalmente, salieron 9.</p>
  1687.  
  1688.  
  1689.  
  1690. <p>Entrando ya en tema de hardware, TitoxUnix nos da una explicación sobre el QL. Un micro de 32 bits con un 68008 de bajo costo, una ULA 8302 que controla todos los periféricos y con más ampliaciones que un ZX Spectrum.</p>
  1691.  
  1692.  
  1693.  
  1694. <p>El resumen del hardware fue que en febrero del 86 el QL ya era un ordenador retro y no había mercado para él. Todo desapareció, pero gracias a entusiastas de la comunidad, aún sigue viva, después de 40 años.</p>
  1695.  
  1696.  
  1697.  
  1698. <p>Del sistema operativo de Tony Tebby y el SuperBASIC de Jan Jones se podría hablar largo y tendido, pero dejaremos cuatro detalles. El QL estaba diseñado con algo que salió al Mundo mucho después, el Plug&amp;Play que permitía que las ampliaciones se conectaran y autoidentificaran en el sistema sin necesidad de cargar controladores. Otra novedad era la multitarea real. Se añadió una suite ofimática en 4 cartuchos de Microdrive (procesador de textos, hoja de cálculos, base de datos, y gráficos empresariales) de serie, que fue escrita por la empresa PSION. Todo ello mucho antes del lanzamiento de Microsoft Windows.</p>
  1699.  
  1700.  
  1701.  
  1702. <p>Muchos coinciden en lo sorprendente que puede ser un QL con su entorno de ventanas y la conectividad de red. Mediante un cable de audio mono entre dos QLs se puede montar una red local con la que ejecutar programas y poder comunicarse con dos simples comandos. Era algo de ciencia ficción en el 85. Cuando muy poco después llegaron las ventanas, fue algo impresionante. Se trata del Pointer Environment (PE), 10 años antes de Windows, y a la par que los Mac, el QL tenia algo parecido, con ratón ya entonces.</p>
  1703.  
  1704.  
  1705.  
  1706. <p>Álvaro comenta que lo que más le llama la atención del hardware del QL es el segundo procesador. El microcontrolador 8049, que libera muchas tareas al 68008. Una idea revolucionaria para ahorrar costes.</p>
  1707.  
  1708.  
  1709.  
  1710. <p>Se habló también un poco más sobre los microdrives. Hoy es muy complicado encontrar microdrives que funcionen, porque se deterioran con el tiempo, al igual que las membranas del teclado. El resto del equipo aguanta bastante bien.</p>
  1711.  
  1712.  
  1713.  
  1714. <p>En el ámbito de los clones, que también los hubo, el Merlin Tonto (de ICL), fue un ordenador de oficina con teléfono para secretarías que Sinclair hizo en colaboración con British Telecom partiendo del hardware del QL. En Australia fue vendida por Computerphone como OPD. No tuvo mucha repercusión. Venía con la suite de PSION y el SuperBASIC venia en un microdrive.</p>
  1715.  
  1716.  
  1717.  
  1718. <p>En cuanto a emulación de QL, está muy avanzada, con una gran variedad de programas emuladores, ya que, cuando el QL se descontinuó y los equipos se fueron estropeando, no se tuvo más remedio que recurrir a ellos.  Los hay para Mac, Windows y Linux. Miguel cuenta que, uno de ellos es QemuLator, muy fácil de usar, e invitando mucho a trastear con él, pudiendo acceder tanto a los contenedores .win como a los microdrives, entre otros.</p>
  1719.  
  1720.  
  1721.  
  1722. <p>Cabe destacar también los siguientes emuladores: SMSQemulator, ZesarUX, MAME-MESS y QPC2, que emula a la perfección un sistema tan avanzado como es SMSQ/E. En FPGA también podemos implementar, con total realismo, un QL. Mister, Mist, Sidi, Neptuno y recientemente, Poseidon.</p>
  1723.  
  1724.  
  1725.  
  1726. <p>Respecto al Software, Zerover comenta que lo que más le gusta es el SuperBASIC, y era de los que se hacia su propio software, modificando el juego de caracteres, creando su propio ensamblador para programar en código maquina, creando un editor de sprites, y haciendo pequeños juegos.</p>
  1727.  
  1728.  
  1729.  
  1730. <p>Sobre juegos, quizá los más relevantes son, el PSION Chess, el Mach Point, el juego de ajedrez por antonomasia en el QL, el Chess, y un gran juego de tenis muy logrado y entretenido, el Match Point. Por desgracia la scene es muy reducida, y salvo dos juegos conversacionales de elaboración reciente, no suele salir nada de nueva generación para el QL. Hay buenos juegos para QL, pero no son muchos, por ser un ordenador enfocado a las empresas.</p>
  1731.  
  1732.  
  1733.  
  1734. <p>Las revistas y libros eran muy necesarios para los usuarios entonces. La  QL Word fue la revista por excelencia, heredera del QL User que se publicó hasta el 94, muchos años después de la desaparición del QL, y que era complicada de conseguir, salvo en sitios especializados, y dos revistas: la IQLR y QLTODAY, cuyo último numero data del 2013. Es admirable que la comunidad se mantuviese activa hasta esa fecha.</p>
  1735.  
  1736.  
  1737.  
  1738. <p>Actualmente existen varios sitios de información y preservación de QL destacados. Uno es el de Dylwin Jones, en inglés, y sinclairql.es recursos en castellano, realizado por Badaman, y que cuenta con el material del club de usuarios de QL en España, el club Qlave, cuyo material preservado por Salvado Merino, se puedo subir a Internet en el año 2002, fecha de la aparición de esta web.</p>
  1739.  
  1740.  
  1741.  
  1742. <p>Los libros de QL más destacados son «QL programación avanzada» y el de SuperBASIC de Jan Jones.</p>
  1743.  
  1744.  
  1745.  
  1746. <p>AFX nos cuenta algo muy interesante, lo que se puede hacer con la red, un PC, un QL y la IA ChatGPT. Para el 40 aniversario del QL, Afx creó un programa en SuperBASIC que conecta, vía RS232, el QL con ChatGPT a través de un PC con un emulador que hace de intermediario, para dialogar. Es una excelente forma de mantener la maquina viva con algo actual.</p>
  1747.  
  1748.  
  1749.  
  1750. <p>Álvaro nos cuenta que clonar el hardware para usar en QL es relativamente accesible, y hay una cantidad de ellos bastante importante, empezando por la Qubide de José Leandro y la placas clonadas de Álvaro Alea, y TitoxUnix y Zerover con pequeñas aportaciones muy interesantes. Internacionalmente, tenemos al ruso Tetroid, que hace una variedad importante de clones (Gold Card, Qubides, interfaces de disco&#8230;) algo en lo que los rusos siempre han sido unos expertos y han tenido relevancia en el mundo de los Spectrum.</p>
  1751.  
  1752.  
  1753.  
  1754. <p>Como hardware curioso y raro, tenemos un digitalizador de video que Salvador Merino mostró en el evento del 40 aniversario. Por desgracia, nos quedamos con las ganas de verlo en funcionamiento.</p>
  1755.  
  1756.  
  1757.  
  1758. <p>Para ir terminando y dar paso a las despedidas, la mayoría coincidimos que para entrar en el QL no hace falta tenerlo. Con un emulador puedes ver si te gusta, podrás disfrutar de sus bondades, incluso si tienes FPGA lo apreciarás con mayor calidad. Si uno se anima a comprar un QL, hay que tener en cuenta un posible cambio de membrana que puede estar deteriorada, y que necesitarás ampliarlo  con más memoria sí o sí. Para esto, una Qubide quizá sea la mejor opción. </p>
  1759. ]]></content:encoded>
  1760. <wfw:commentRss>https://sinclairqles.wordpress.com/2024/02/29/presencia-en-el-mundo-del-spectrum-podcast-12x04/feed/</wfw:commentRss>
  1761. <slash:comments>1</slash:comments>
  1762. <media:content url="https://0.gravatar.com/avatar/670e7a411bd32dc3309ddc8a7ac12a4cfa6305652b5ecbfc62415bc659494371?s=96&#38;d=retro&#38;r=G" medium="image">
  1763. <media:title type="html">badaman</media:title>
  1764. </media:content>
  1765. </item>
  1766. <item>
  1767. <title>Teclado español en sQLux</title>
  1768. <link>https://sinclairqles.wordpress.com/2024/02/27/teclado-espanol-en-sqlux/</link>
  1769. <comments>https://sinclairqles.wordpress.com/2024/02/27/teclado-espanol-en-sqlux/#comments</comments>
  1770. <dc:creator><![CDATA[badaman]]></dc:creator>
  1771. <pubDate>Tue, 27 Feb 2024 06:07:41 +0000</pubDate>
  1772. <category><![CDATA[Emuladores]]></category>
  1773. <category><![CDATA[castellano]]></category>
  1774. <category><![CDATA[español]]></category>
  1775. <category><![CDATA[sQLux]]></category>
  1776. <guid isPermaLink="false">http://sinclairqles.wordpress.com/?p=3636</guid>
  1777.  
  1778. <description><![CDATA[Gracias al esfuerzo y apoyo del usuario Exile, el emulador sQLux ahora soporta la configuración de teclado de PC en español. Algo que nos viene muy bien para poder programar o editar textos cuando usamos la ROM MGE o la ROM Minerva y cargamos el driver de teclado español.<p><a href="https://sinclairqles.wordpress.com/2024/02/27/teclado-espanol-en-sqlux/" class="more-link">Leer Más</a></p>]]></description>
  1779. <content:encoded><![CDATA[
  1780. <p>Gracias al esfuerzo y apoyo del usuario Exile, el emulador sQLux ahora soporta la configuración de teclado de PC en español. Algo que nos viene muy bien para poder programar o editar textos cuando usamos la ROM MGE o la ROM Minerva y cargamos el driver de teclado español.</p>
  1781.  
  1782.  
  1783.  
  1784. <span id="more-3636"></span>
  1785.  
  1786.  
  1787.  
  1788. <p>Para que funcione, en el fichero sqlux.ini debemos indicar:</p>
  1789.  
  1790.  
  1791.  
  1792. <pre class="wp-block-code"><code>KBD = ES</code></pre>
  1793.  
  1794.  
  1795.  
  1796. <p>Después de una gran cantidad de soporte y pruebas, los cambios de código necesarios para el teclado en español ahora se han fusionado nuevamente en la rama maestra de sQLux, por lo que ya es posible descargar y compilar el emulador de forma sencilla.</p>
  1797.  
  1798.  
  1799.  
  1800. <p>Esta versión lleva el nombre interno de «The Comfy Chair», una parodia de los Monty Python que ha sido motivo de risas entre el programador y yo durante el proceso de desarrollo. Y es que «nadie espera a la inquisición española&#8230;» XD</p>
  1801.  
  1802.  
  1803.  
  1804. <h2 class="wp-block-heading">Cambios</h2>
  1805.  
  1806.  
  1807.  
  1808. <p>Los cambios se han probado en X11 (Mint Linux, Ubuntu Linux y Pi Os) y MS Windows. Hay soporte para teclas muertas y una selección de combinaciones de teclas Alt Gr.</p>
  1809.  
  1810.  
  1811.  
  1812. <p>De forma predeterminada, Raspberry Pi OS usa SDL en X11, por lo que estos cambios actualmente funcionarán «listos para usar» para Raspberry Pi. Los cambios no funcionan en Raspberry Pi OS cuando SDL está configurado para usar Wayland, ya que la versión de Wayland que se usa actualmente en Pi OS no informa de pulsaciones de teclas muertas.</p>
  1813.  
  1814.  
  1815.  
  1816. <h2 class="wp-block-heading">Obtener el emulador</h2>
  1817.  
  1818.  
  1819.  
  1820. <p>Para obtener la versión final de Windows o Linux, compílela a partir de las fuentes principales de sQLux en: <a href="https://github.com/SinclairQL/sQLux" rel="nofollow">https://github.com/SinclairQL/sQLux</a></p>
  1821.  
  1822.  
  1823.  
  1824. <p>Sigue los pasos básicos en Debian Linux (necesitas Git):</p>
  1825.  
  1826.  
  1827.  
  1828. <pre class="wp-block-code"><code>sudo apt install build-essential cmake git libsdl2-dev<br># ve a la carpeta donde descargarás el código<br>git clone --recursive https://github.com/SinclairQL/sQLux/<br>cd sQLux<br>cmake -B build/<br>make<br># ahora prueba el binario<br>./build/sqlux --help</code></pre>
  1829.  
  1830.  
  1831.  
  1832. <p>En el repositorio hay información para compilar el emulador en otros sistemas.</p>
  1833.  
  1834.  
  1835.  
  1836. <ul>
  1837. <li>Copia el ejecutable que encontrarás en la caprta build llamado sqlux donde desees ubicar tu emulador.</li>
  1838.  
  1839.  
  1840.  
  1841. <li>Copia allí la carpeta roms.</li>
  1842.  
  1843.  
  1844.  
  1845. <li>Copia también la carpeta examples.</li>
  1846.  
  1847.  
  1848.  
  1849. <li>Luego copia el fichero sqlux.ini que encontrarás en la carpeta sQLux.</li>
  1850.  
  1851.  
  1852.  
  1853. <li>Modifica el fichero sqlux.ini a tu gusto.</li>
  1854.  
  1855.  
  1856.  
  1857. <li>Ejecuta &#8216;sqlux&#8217;.</li>
  1858. </ul>
  1859.  
  1860.  
  1861.  
  1862. <p>Eso es todo. Ahora, prepárate a disfrutar del sillón confortable (Comfy chair).</p>
  1863.  
  1864.  
  1865.  
  1866. <figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
  1867. <iframe class="youtube-player" width="545" height="307" src="https://www.youtube.com/embed/T2ncJ6ciGyM?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=es&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
  1868. </div><figcaption class="wp-element-caption">«The Comfy Chair» &#8211; Sketch de los Monty Python.</figcaption></figure>
  1869.  
  1870.  
  1871.  
  1872. <p><strong>Actualización</strong>: Hoy 27 de febrero ha sido publicada la nueva versión del emulador, la 1.0.7, llamada «The Comfy Chair» XD <a href="https://github.com/SinclairQL/sQLux/releases/tag/v1.0.7" rel="nofollow">https://github.com/SinclairQL/sQLux/releases/tag/v1.0.7</a></p>
  1873. ]]></content:encoded>
  1874. <wfw:commentRss>https://sinclairqles.wordpress.com/2024/02/27/teclado-espanol-en-sqlux/feed/</wfw:commentRss>
  1875. <slash:comments>1</slash:comments>
  1876. <media:content url="https://0.gravatar.com/avatar/670e7a411bd32dc3309ddc8a7ac12a4cfa6305652b5ecbfc62415bc659494371?s=96&#38;d=retro&#38;r=G" medium="image">
  1877. <media:title type="html">badaman</media:title>
  1878. </media:content>
  1879. </item>
  1880. <item>
  1881. <title>Usando «MENU BOOT»</title>
  1882. <link>https://sinclairqles.wordpress.com/2024/02/19/usando-sinclair-ql-menu/</link>
  1883. <comments>https://sinclairqles.wordpress.com/2024/02/19/usando-sinclair-ql-menu/#respond</comments>
  1884. <dc:creator><![CDATA[badaman]]></dc:creator>
  1885. <pubDate>Mon, 19 Feb 2024 01:54:10 +0000</pubDate>
  1886. <category><![CDATA[Software]]></category>
  1887. <category><![CDATA[boot]]></category>
  1888. <category><![CDATA[SuperBASIC]]></category>
  1889. <guid isPermaLink="false">http://sinclairqles.wordpress.com/?p=3609</guid>
  1890.  
  1891. <description><![CDATA[Sinclair QL Menú es un BOOT de BOOTs interactivo.<p><a href="https://sinclairqles.wordpress.com/2024/02/19/usando-sinclair-ql-menu/" class="more-link">Leer Más</a></p>]]></description>
  1892. <content:encoded><![CDATA[
  1893. <p>En 2008, -hace ya unos años-, creé un programa que permite, de forma flexible, configurar menús de arranque para el QL clásico, sin entorno de ventanas.</p>
  1894.  
  1895.  
  1896.  
  1897. <p>El programa ofrece una variada gama de posibilidades de configuración para mostrar un menú desde el que seleccionar opciones que permiten lanzar aplicaciones.</p>
  1898.  
  1899.  
  1900.  
  1901. <p>El menú puede mostrar o no información relacionada con las opciones según lo configuremos, puede recorrer una lista de opciones amplia, y lanzar una o varias de las opciones si se desea.</p>
  1902.  
  1903.  
  1904.  
  1905. <p><strong>En definitiva, el &#8216;MENÚ BOOT&#8217; no es más que un BOOT de BOOTs interactivo.</strong></p>
  1906.  
  1907.  
  1908.  
  1909. <figure class="wp-block-image size-large"><img data-attachment-id="3620" data-permalink="https://sinclairqles.wordpress.com/2024/02/19/usando-sinclair-ql-menu/image/" data-orig-file="https://sinclairqles.files.wordpress.com/2024/02/image.png" data-orig-size="1000,700" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-medium-file="https://sinclairqles.files.wordpress.com/2024/02/image.png?w=300" data-large-file="https://sinclairqles.files.wordpress.com/2024/02/image.png?w=545" src="https://sinclairqles.files.wordpress.com/2024/02/image.png" alt="" class="wp-image-3620" /></figure>
  1910.  
  1911.  
  1912.  
  1913. <span id="more-3609"></span>
  1914.  
  1915.  
  1916.  
  1917. <h2 class="wp-block-heading">Probando la aplicación</h2>
  1918.  
  1919.  
  1920.  
  1921. <p>Al descargar la aplicación, ya cuentas con una configuración de ejemplo que te ayuda a entender su funcionamiento.</p>
  1922.  
  1923.  
  1924.  
  1925. <p>Puedes usar las teclas del cursor, y la tecla espacio para seleccionar las distintas opciones:</p>
  1926.  
  1927.  
  1928.  
  1929. <ul>
  1930. <li>1. Característica del programa</li>
  1931.  
  1932.  
  1933.  
  1934. <li>2. Ficheros del programa</li>
  1935.  
  1936.  
  1937.  
  1938. <li>3. Uso del menú</li>
  1939.  
  1940.  
  1941.  
  1942. <li>4. Configuración del menú</li>
  1943.  
  1944.  
  1945.  
  1946. <li>5. Cómo obtener ayuda</li>
  1947. </ul>
  1948.  
  1949.  
  1950.  
  1951. <p>La estructura de esta configuración puede servir de ayuda para entender cómo ser estructura la aplicación.</p>
  1952.  
  1953.  
  1954.  
  1955. <h2 class="wp-block-heading">Cómo funciona</h2>
  1956.  
  1957.  
  1958.  
  1959. <p>El programa, que tiene el nombre BOOT, se carga mediante la facilidad del sistema de cargar ficheros BOOT al introducir el soporte y pulsar F1 o F2. Desde el BOOT se llama a MENU_BAS.</p>
  1960.  
  1961.  
  1962.  
  1963. <p>Podemos renombrar MENU_BAS para que se inicie como BOOT si lo deseamos.</p>
  1964.  
  1965.  
  1966.  
  1967. <p>Este programa establece el modo de pantalla y la ubicación de los archivos, carga la configuración desde MENU_CFG, y dibuja la pantalla. Seguidamente, lee el archivo MENU_LST del disco para conocer la información de las aplicaciones que debe mostrar en el listado, y a continuación, las muestra. La estructura del archivo MENU_LST es auto-explicativa.</p>
  1968.  
  1969.  
  1970.  
  1971. <p>A continuación, la aplicación nos da la opción de que seleccionemos las distintas entradas del menú, mientras nos va mostrando la información correspondiente a cada una de ellas, que se encuentran en cada archivo _INFO creado para cada aplicación.</p>
  1972.  
  1973.  
  1974.  
  1975. <p>P.ej. Si tenemos un juego que se llama JUEGO_EXE que queremos ejecutar, deberemos crear un archivo JUEGO_INFO para el MENU_LST que leerá MENU_BAS. El contenido de este _INFO debe adaptarse al tamaño de la ventana de información del programa. Su primera línea será mostrada resaltada.</p>
  1976.  
  1977.  
  1978.  
  1979. <p>A parte del _INFO podemos adjuntar un _TXT con información concreta si necesitamos facilitar al usuario más explicaciones para hacer funcionar la aplicación, pero este _TXT no se mostrará desde el programa.</p>
  1980.  
  1981.  
  1982.  
  1983. <p>Por último, una vez seleccionada la aplicación, sólo nos resta pulsar &#8216;Espacio&#8217; para ejecutarla. El &#8216;MENU_BAS&#8217; llamará al _BOOT del programa que queramos ejecutar con un LRUN. De igual forma que con el _INFO en el ejemplo anterior, deberemos crear un fichero JUEGO_BOOT que contenga las instrucciones de carga de la aplicación, por ejemplo:</p>
  1984.  
  1985.  
  1986.  
  1987. <pre class="wp-block-code"><code>100 REMark carga juego<br>110 EXEC_W JUEGO_EXE</code></pre>
  1988.  
  1989.  
  1990.  
  1991. <p>Una vez lanzada la opción, el programa termina, a no ser que tengamos activado el valor ‘multi’ en el archivo MENU_CFG. En tal caso el programa permitirá lanzar tantos programas e instancias de programas como deseemos hasta pulsar ESC para salir.</p>
  1992.  
  1993.  
  1994.  
  1995. <p>Este JUEGO y el resto de programas de la lista deberá ser referenciado en el archivo MENU_LST.</p>
  1996.  
  1997.  
  1998.  
  1999. <p>Con el programa se adjunta una imagen que puede ser usada como diseño de cabecera del menú, y que ocupa 1/4 de la pantalla. Por defecto, el fichero se llama MENU_SCR y se carga en la posición de memoria 131072, la primera posición de la memoria de pantalla.</p>
  2000.  
  2001.  
  2002.  
  2003. <p>Podemos cambiar a voluntad las extensiones por defecto mediante el fichero MENU_CFG.</p>
  2004.  
  2005.  
  2006.  
  2007. <h2 class="wp-block-heading">En resumen</h2>
  2008.  
  2009.  
  2010.  
  2011. <p>Un fichero BOOT lanza el fichero MENU_BAS que carga información de configuración MENU_CFG que indica cómo se mostrará el menú en pantalla, y carga la lista de programas del menú que está en MENU_LST.</p>
  2012.  
  2013.  
  2014.  
  2015. <p>Para ver información sobre cada aplicación y lanzarla, además de los ficheros de la propia aplicación (programa en SuperBASIC o ejecutable&#8230;), se necesita tener un fichero con extensión _INFO que describe el programa y lo que se mostrará en el menú, y un fichero con extensión _BOOT con las instrucciones de carga para que, una vez sea seleccionada esta opción, se ejecute el programa elegido adecuadamente.</p>
  2016.  
  2017.  
  2018.  
  2019. <h2 class="wp-block-heading">¿Por dónde empiezo?</h2>
  2020.  
  2021.  
  2022.  
  2023. <figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="811" data-attachment-id="3629" data-permalink="https://sinclairqles.wordpress.com/2024/02/19/usando-sinclair-ql-menu/menu_boot/" data-orig-file="https://sinclairqles.files.wordpress.com/2024/02/menu_boot.gif" data-orig-size="1024,811" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="menu_boot" data-image-description="" data-image-caption="" data-medium-file="https://sinclairqles.files.wordpress.com/2024/02/menu_boot.gif?w=300" data-large-file="https://sinclairqles.files.wordpress.com/2024/02/menu_boot.gif?w=545" src="https://sinclairqles.files.wordpress.com/2024/02/menu_boot.gif?w=1024" alt="" class="wp-image-3629" srcset="https://sinclairqles.files.wordpress.com/2024/02/menu_boot.gif 1024w, https://sinclairqles.files.wordpress.com/2024/02/menu_boot.gif?w=150 150w, https://sinclairqles.files.wordpress.com/2024/02/menu_boot.gif?w=300 300w, https://sinclairqles.files.wordpress.com/2024/02/menu_boot.gif?w=768 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
  2024.  
  2025.  
  2026.  
  2027. <p>Como sugerencia, a la hora de crear la recopilación de programas que se van a mostrar en el menú, recomiendo que primero se recopilen los programas que formarán parte del menú, y se creen o renombren los ficheros _BOOT de cada uno de ellos.</p>
  2028.  
  2029.  
  2030.  
  2031. <p>A continuación crea un fichero _INFO por cada programa con el mismo nombre que el usado en el fichero _BOOT. P. ej. JUEGO_BOOT y JUEGO_INFO. Cuando tenga configurado el menú, y sepas el tamaño que ocupará el texto informativo de cada aplicación en pantalla, podrás adaptar el contenido de los ficheros _INFO para su correcta visualización en el programa.</p>
  2032.  
  2033.  
  2034.  
  2035. <p>Ahora crea un fichero llamado MENU_LST e incluye en él los nombres, sin la extensión, de cada uno de los programas. Este nombre debe coincidir con el usado en los ficheros _INFO y _BOOT. Sigue la estructura del fichero de ejemplo del programa para que la aplicación funcione correctamente.</p>
  2036.  
  2037.  
  2038.  
  2039. <p>Ahora llega le momento de determinar cómo se verá el menú. Esto se consigue configurando el archivo MENU_CFG, cuyos parámetros están explicados en el propio archivo de ejemplo. </p>
  2040.  
  2041.  
  2042.  
  2043. <p>Por último, añade el fichero BOOT principal facilitado y el fichero MENU_BAS. Tu menú está listo.</p>
  2044.  
  2045.  
  2046.  
  2047. <p><strong>Es importante que, en ambos ficheros configure adecuadamente la ruta que se guarda en la variable disp$. Por defecto, su valor es flp1_.</strong></p>
  2048.  
  2049.  
  2050.  
  2051. <h2 class="wp-block-heading">Limitaciones</h2>
  2052.  
  2053.  
  2054.  
  2055. <p>El programa cuenta con algunas limitaciones que es importante conocer a la hora de usarlo:</p>
  2056.  
  2057.  
  2058.  
  2059. <ul>
  2060. <li>Requiere que todos los ficheros se encuentren en el mismo medio y la misma ruta.</li>
  2061.  
  2062.  
  2063.  
  2064. <li>El nombre de fichero _INFO y el nombre del fichero _BOOT han de ser el mismo, y usarlo, sin la extensión, en MENU_LST.</li>
  2065.  
  2066.  
  2067.  
  2068. <li>La imagen de fondo tiene que tener, forzosamente, el ancho de la pantalla.</li>
  2069. </ul>
  2070.  
  2071.  
  2072.  
  2073. <h2 class="wp-block-heading">Más información</h2>
  2074.  
  2075.  
  2076.  
  2077. <p>Lee el manual disponible en la aplicación con más detalles sobre su configuración.</p>
  2078.  
  2079.  
  2080.  
  2081. <h2 class="wp-block-heading">Descargar</h2>
  2082.  
  2083.  
  2084.  
  2085. <p>Tienes disponible esta aplicación a través del enlace:</p>
  2086.  
  2087.  
  2088.  
  2089. <p><a href="https://github.com/JavGuerra/Sinclair-QL-menu/" rel="nofollow">https://github.com/JavGuerra/Sinclair-QL-menu/</a></p>
  2090.  
  2091.  
  2092.  
  2093. <p>Allí puede descargar un fichero .zip al hacer click sobre el botón &#8216;CODE&#8217; en verde.</p>
  2094.  
  2095.  
  2096.  
  2097. <h2 class="wp-block-heading">Ejemplo de uso</h2>
  2098.  
  2099.  
  2100.  
  2101. <p>MENU_BOOT se usó en la selección de aventuras conversacionales realizado con el CAAD en 2008.</p>
  2102.  
  2103.  
  2104.  
  2105. <figure class="wp-block-image size-large"><img src="https://sinclairql.speccy.org/utilidades/aventuras.png" alt="" /></figure>
  2106.  
  2107.  
  2108.  
  2109. <p>Puede descargar el archivo <a href="https://sinclairql.speccy.org/utilidades/aventuras.zip">aventuras.zip</a></p>
  2110. ]]></content:encoded>
  2111. <wfw:commentRss>https://sinclairqles.wordpress.com/2024/02/19/usando-sinclair-ql-menu/feed/</wfw:commentRss>
  2112. <slash:comments>0</slash:comments>
  2113. <media:content url="https://0.gravatar.com/avatar/670e7a411bd32dc3309ddc8a7ac12a4cfa6305652b5ecbfc62415bc659494371?s=96&#38;d=retro&#38;r=G" medium="image">
  2114. <media:title type="html">badaman</media:title>
  2115. </media:content>
  2116.  
  2117. <media:content url="https://sinclairqles.files.wordpress.com/2024/02/image.png" medium="image" />
  2118.  
  2119. <media:content url="https://sinclairqles.files.wordpress.com/2024/02/menu_boot.gif?w=1024" medium="image" />
  2120.  
  2121. <media:content url="https://sinclairql.speccy.org/utilidades/aventuras.png" medium="image" />
  2122. </item>
  2123. <item>
  2124. <title>Paquete de supervivencia del QL en español</title>
  2125. <link>https://sinclairqles.wordpress.com/2024/02/18/paquete-de-supervivencia-del-ql-en-espanol/</link>
  2126. <comments>https://sinclairqles.wordpress.com/2024/02/18/paquete-de-supervivencia-del-ql-en-espanol/#comments</comments>
  2127. <dc:creator><![CDATA[badaman]]></dc:creator>
  2128. <pubDate>Sun, 18 Feb 2024 18:53:09 +0000</pubDate>
  2129. <category><![CDATA[Webs]]></category>
  2130. <category><![CDATA[Enlaces]]></category>
  2131. <category><![CDATA[manuales]]></category>
  2132. <category><![CDATA[Software]]></category>
  2133. <category><![CDATA[usuarios]]></category>
  2134. <guid isPermaLink="false">http://sinclairqles.wordpress.com/?p=3599</guid>
  2135.  
  2136. <description><![CDATA[«QL ES pack» es un paquete de iniciación al QL en castellano pensado, sobre todo, en aquellos que se acercan por primera vez al QL, bien porque han comprado un ordenador, o bien porque tienen interés en la máquina y desean usar un emulador.<p><a href="https://sinclairqles.wordpress.com/2024/02/18/paquete-de-supervivencia-del-ql-en-espanol/" class="more-link">Leer Más</a></p>]]></description>
  2137. <content:encoded><![CDATA[
  2138. <p>«QL ES pack» es un paquete de iniciación al QL en castellano pensado, sobre todo, en aquellos que se acercan por primera vez al QL, bien porque han comprado un ordenador, o bien porque tienen interés en la máquina y desean usar un emulador.</p>
  2139.  
  2140.  
  2141.  
  2142. <span id="more-3599"></span>
  2143.  
  2144.  
  2145.  
  2146. <figure class="wp-block-image size-large"><img src="https://javguerra.github.io/QL_ES_pack/poster.png" alt="" /></figure>
  2147.  
  2148.  
  2149.  
  2150. <p>El pack contiene una recopilación de recursos y utilidades básicas como:</p>
  2151.  
  2152.  
  2153.  
  2154. <ul>
  2155. <li><strong>Material imprescindible</strong>. Con manuales y artículos de interés.</li>
  2156.  
  2157.  
  2158.  
  2159. <li><strong>Recursos</strong>. Como videos, y más artículos de información.</li>
  2160.  
  2161.  
  2162.  
  2163. <li><strong>Software</strong>. Con programas como el paquete PSION en español, y otros.</li>
  2164.  
  2165.  
  2166.  
  2167. <li><strong>Enlaces</strong>. Por supuesto tienes una serie de enlaces recomendados también para seguir profundizando.</li>
  2168. </ul>
  2169.  
  2170.  
  2171.  
  2172. <p>Aquí la dirección de la página: <a href="https://javguerra.github.io/QL_ES_pack/" rel="nofollow">https://javguerra.github.io/QL_ES_pack/</a></p>
  2173.  
  2174.  
  2175.  
  2176. <p>Este recurso on-line seguirá creciendo con nuevas aportaciones.</p>
  2177.  
  2178.  
  2179.  
  2180. <p>Espero que sea útil.</p>
  2181. ]]></content:encoded>
  2182. <wfw:commentRss>https://sinclairqles.wordpress.com/2024/02/18/paquete-de-supervivencia-del-ql-en-espanol/feed/</wfw:commentRss>
  2183. <slash:comments>1</slash:comments>
  2184. <media:content url="https://0.gravatar.com/avatar/670e7a411bd32dc3309ddc8a7ac12a4cfa6305652b5ecbfc62415bc659494371?s=96&#38;d=retro&#38;r=G" medium="image">
  2185. <media:title type="html">badaman</media:title>
  2186. </media:content>
  2187.  
  2188. <media:content url="https://javguerra.github.io/QL_ES_pack/poster.png" medium="image" />
  2189. </item>
  2190. </channel>
  2191. </rss>
  2192.  

If you would like to create a banner that links to this page (i.e. this validation result), do the following:

  1. Download the "valid RSS" banner.

  2. Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)

  3. Add this HTML to your page (change the image src attribute if necessary):

If you would like to create a text link instead, here is the URL you can use:

http://www.feedvalidator.org/check.cgi?url=http%3A//feeds2.feedburner.com/es/qblog

Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda