Una de las utilidades del lenguaje Basic que el Spectrum no posee, es la sentencia POP. Este comando tiene la función de impedir que determinada subrutina, que llamemos mediante la sentencia gosub, retorne al programa principal; la utilidad de esta función resulta un tanto oscura y, como siempre, se comprenderá mejor practicándola. Observe que nos permite saltar desde una subrutina a cualquier parte del programa principal.
La rutina se ha escrito en lenguaje máquina y es reubicable, es decir, puede ejecutarse en cualquier parte de la memoria. En principio, se sugiere emplear el buffer de impresora para colocarlo, aunque debe tener en cuenta que si emplea comandos relacionados con la impresora, la rutina se corromperá.
Hemos incluido, someramente comentado, el listado en ensamblador y, para aquellos que prefieran utilizarlo directamente, un cargador Basic que solucionará el programa.
10 REM ************************ 20 REM Esta rutina debe 30 REM colocarse fuera del 40 REM sistema Basic 50 REM ************************ 60 INPUT "Direccion de ensamblado? "; dir 70 FOR n = dir TO dir + 23: READ a: POKE n, a: NEXT n 50 DATA 237, 123, 61, 92, 59, 59, 193, 225, 209, 122, 254, 62, 202, 54, 31, 59, 227, 235, 237, 115, 61, 92 ,197, 201
10 ; SUBRUTINA RELOCALIZABLE 20 ; 30 LD SP,823613) 40 DEC SP 50 DEC SP 60 ; 70 ; PUNTERO DEL STACK SE LE 80 ; ASIGNA LA DIRECCION DE 90 ; RETORNO DE ERROR -2 100 ; 110 ; POP BC 120 ; 130 ; TOMA LA DIRECCION DE 140 ; RETORNO DE LA ROM QUE 150 ; TRATA LA SIGUIENTE 160 ; SENTENCIA BASIC 170 ; 180 POP HL 190 ; 200 ; TOMA DIRECCION RETORNO 210 ; DE ERROR 220 ; 230 POP DE 240 ; 250 ; TOMA EL ULTIMO DATO DE 260 ; LA PILA DE GOSUB 270 ; 280 LD A,D 290 CP 62 300 JP Z,#1F36 310 ; 320 ; MENSAJE DE "RETURN 330 ; without GOSUB" SI ES 340 ; FINAL DE LA PILA 350 : 360 DEC SP 370 EX (SP),HL 380 EX DE,HL 390 LD (23613),SP 400 ; 410 ; RESTAURA EL PUNTERO DE 420 ; ERROR 430 ; 440 PUSH BC 450 ; 460 ; REPONE EN EL STACK LA 470 ; DIRECCION DE RETORNO DE 480 ; LA ROM 490 ; 500 RET