Uso DMODE en un boot para preparar la pantalla antes de cargar el programa principal. Pues cuando DMODE no ha sido enlazado correctamente, lógicamente es interpretado como una variable no declarada y nada funciona.
Algunas veces sí funciona con solo quitar alguna línea del programa o poner algún REMark aquí y allá... sin ninguna lógica, porque son líneas que no se ejecutan en las pruebas ni tienen nada que ver.
Sospeché que el tamaño del fichero tenía algo que ver, pero no era así. Sospeché que el problema estaba en la opción de Q-emuLator para pulsar F1 o F2 automáticamente en el arranque, pero tampoco era así. Ya no imagino más posibles causas.
He hecho muchas pruebas y no averiguo nada. No sé si el problema está en la extensión o en el emulador o en las ROMs o en alguna combinación entre ellos.
Cuando DMODE, FLIM_W o FLIM_H no son enlazados se aprecia fácilmente porque se quedan en minúsculas en el listado, pero como he dicho no siempre pasa con las tres a la vez.
Añado unos ejemplos de boot con los que he hecho pruebas:
Esto debería imprimir el modo de pantalla actual (0 u 8) y parar, pero con la ROM MGE imprime "*" porque DMODE no ha sido enlazado:
Código: Seleccionar todo
100 tk2_ext
110 lrespr "flp1_display_code"
120 print dmode
130 stop
330 defproc init_ql_colours
400 enddef
410 deffn rgb(red,green,blue)
430 enddef
440 defproc init_the_window
450 let csize_w=3-(scr_w=512)
460 let csize_h=scr_w>512
470 let tw=fopen("con_")
480 csize #tw,csize_w,csize_h
490 let tw_w=minimum(800,scr_w)
500 let tw_h=minimum(600,scr_h)
510 let tw_x=(scr_w-tw_w)/2
520 let tw_y=(scr_h-tw_h)/2
530 window #tw,tw_w,tw_h,tw_x,tw_y
540 paper #tw,black
550 ink #tw,light_grey
560 wipe_the_window
570 init_the_font
580 enddef
590 defproc wipe_the_window
600 border #tw,0
610 cls #tw
620 border #tw,8
630 enddef
640 defproc splash_screen
650 if flim_w(#0)=512 and flim_h(#0)=256
660 lbytes dev$&img_ayc8_scr,address(#0)
670 endif
680 enddef
Pero si quito las líneas640-680, el programa funciona bien con la ROM MGE!
Si quito todo lo que sobra, sigue funcionando (pero no con la ROM JM):
Código: Seleccionar todo
100 tk2_ext
110 lrespr "flp1_display_code"
120 print dmode
130 stop
Si reinicio el emulador con la ROM JM y no arranco desde el fichero, sino que le doy los comandos a mano, entonces DMODE sí funciona...!
Otra prueba que no funciona:
Código: Seleccionar todo
100 tk2_ext
110 lrespr "flp1_display_code"
120 print dmode
130 stop
330 defproc init_ql_colours
400 enddef
410 deffn rgb(red,green,blue)
430 enddef
440 defproc init_the_window
450 let csize_w=3-(scr_w=512)
460 let csize_h=scr_w>512
470 let tw=fopen("con_")
480 csize #tw,csize_w,csize_h
490 let tw_w=minimum(800,scr_w)
500 let tw_h=minimum(600,scr_h)
510 let tw_x=(scr_w-tw_w)/2
520 let tw_y=(scr_h-tw_h)/2
580 enddef
590 defproc wipe_the_window
630 enddef
640 defproc splash_screen
680 enddef
1700 deffn prog_device$
1850 enddef
1860 deffn prog_found_in(device$)
1910 enddef
Si le quito la línea 520, DMODE funciona con la ROM MGE!
Lo he intentado con y sin TK2_EXT, con LRESPR y con LBYTES+CALL. Nada cambia.
Otra prueba que no funciona... a menos que quite la línea 510!:
Código: Seleccionar todo
100 rem tk2_ext
110 rem lrespr "flp1_display_code"
110 let a=alchp(1094):lbytes "flp1_display_code",a:call a
120 print dmode
130 stop
330 defproc init_ql_colours
400 enddef
410 deffn rgb(red,green,blue)
430 enddef
440 defproc init_the_window
450 let csize_w=3-(scr_w=512)
460 let csize_h=scr_w>512
470 let tw=fopen("con_")
480 csize #tw,csize_w,csize_h
490 let tw_w=minimum(800,scr_w)
500 let tw_h=minimum(600,scr_h)
510 let tw_x=(scr_w-tw_w)/2
580 enddef
590 defproc wipe_the_window
630 enddef
640 defproc splash_screen
680 enddef
1700 deffn prog_device$
1850 enddef
1860 deffn prog_found_in(device$)
1910 enddef
El manual de Display Toolkit cita posibles problemas con la ROM JM, pero solo para la palabra BYTES, nada que ver con esto.
No veo la lógica por parte alguna. ¿A alguien se le ocurre algo?
¿Alguien querría ver si le pasa lo mismo, copiando los ejemplos?