BBC - Basic



BBC BASIC es un lenguaje de programación, desarrollado en 1981 como un lenguaje de programación nativo para el Acorn BBC Micro, un ordenador doméstico con CPU MOS Technology 6502, principalmente por Sophie Wilson. Es una adaptación del lenguaje BASIC para el Proyecto de Conocimiento en Informática de la BBC en el Reino Unido.

El BBC BASIC se basa en el viejo Atom BASIC (para el Acorn Atom), ampliado el tradicional BASIC con procedimientos y funciones nombrados, bucles REPEAT-UNTIL, y estructuras IF-THEN-ELSE inspiradas en COMAL. El intérprete incluía también poderosas sentencias para manejar las cuatro salidas de audio del BBC Micro y su pantalla de alta resolución.

Una de las características únicas del BBC BASIC es la presencia de un ensamblador en línea que permite a los usuarios escribir código ensamblador 6502 en sus programas. El ensamblador se integró plenamente en el intérprete BASIC y compartía variables con él. Esto permitió a los desarrolladores escribir, no sólo el código en lenguaje ensamblador, sino combinar código BASIC con ensamblador, por lo que es posible utilizar técnicas de generación de código, e incluso escribir simples compiladores en BASIC.
En Wikipedia podemos ver todas las versiones que se han desarrollado de este lenguaje. 


La versión de evaluación gratuita de BBC BASIC para Windows es completamente funcional, excepto que la cantidad de memoria disponible para el programa, los datos del usuario y la pila se limita a 32 Kbytes, y el comando de compilación (que le permite crear un archivo ejecutable independiente de su programa BASIC BBC) no está disponible.

Si ya ha comprado la versión completa de la BBC BASIC para Windows descargue y ejecute Upgrade.exe para actualizar automáticamente a la última versión. Esto sólo funcionará si la versión anterior se haya instalado correctamente. En Windows ™ Vista, Windows 7, Windows 8 / 8.1 o Windows 10 puede que tenga que utilizar ' Ejecutar como administrador ' para realizar la actualización con éxito.

Una vez finalizada la descarga, seleccione Ejecutar el programa si desea instalar BBC BASIC para Windows de inmediato, o Guardar en disco si desea instalarlo más adelante. BBC BASIC para Windows debería funcionar en cualquier Windows ™ 98, Windows Me, Windows 2000, Windows XP, Windows Vista, Windows 7, Windows 8 / 8.1 o Windows 10 PC, y requiere aproximadamente 6 MB de espacio en disco. El precio de la versión completa es de unos 40 $. Tiene muchos programas de ejemplo uno de ellos es el que hay un poco más abajo del conjunto de Mandelbrot.


Es un lenguaje muy documentado y con una muy amplia bibliografia, foros, manuales, web..., todo ello debido en gran medida a Richard Russell.

Existe un interprete compatible con BBC Basic que se llama Brandy basado en la versión V de BBC Basic. Que se puede descargar y viene con algunos ejemplos de código, pero no he sido capaz de ejecutarlos, aunque no me han parecido difíciles de modificar a un Basic estandar.

http://jaguar.orpheusweb.co.uk/branpage.html

Existen versiones del BBC Basic para Windows, Linux, Mac OS-X, Android, MS-DOS y un largo etc. http://mdfs.net/Software/BBCBasic/










      REM Fast Mandelbrot Plotting Demonstration with Mouse Control
      REM Requires a CPU with SSE support (i.e. minimum Pentium 4)
      REM Based on http://www.codeproject.com/KB/recipes/fractalssse.aspx
      REM!Crunch

      *FLOAT 64
      MODE 20
      OFF

      SYS "SetWindowText", @hwnd%, "Mandelbrot - Left button: drag.  " + \
      \   "Middle button: zoom out.  Right button: zoom in."

      ITER = 128
      Width% = @vdu.tr%
      Height% = @vdu.tb%
      Left = -2.200 : Right = 0.800 : Top = -1.2 : Bottom = 1.2

      INSTALL @lib$+"ASMLIBC"

      DIM bmih{biSize%, biWidth%, biHeight%, biPlanes{l&,h&}, \
      \        biBitCount{l&,h&}, biCompression%, biSizeImage%, \
      \        biXPelsPerMeter%, biYPelsPerMeter%, biClrUsed%, \
      \        biClrImportant%}
      bmih.biSize%   = DIM(bmih{})
      bmih.biWidth%  = Width%
      bmih.biHeight% = Height%
      bmih.biPlanes.l& = 1
      bmih.biBitCount.l& = 32
      bmih.biSizeImage% = Width%*Height%*4

      SYS "CreateDIBSection", @memhdc%, bmih{}, 0, ^Bits%, 0, 0 TO hbm%
      IF hbm% = 0 ERROR 100, "Couldn't create DIBSection"
      SYS "SelectObject", @memhdc%, hbm% TO oldbm%
      SYS "DeleteObject", oldbm%

      DIM palette%(ITER)
      PROCgradient(0,41,255,100,0,255,255,0)
      PROCgradient(42,83,255,255,0,255,100,0)
      PROCgradient(84,ITER-1,255,100,0,255,255,0)
      PROCassemble

      Zoom = 1.0
      PanX = 0.0
      PanY = 0.0
      Changed% = TRUE
      a% = 0
      REPEAT
        IF INKEY(-26)  PanX -= Zoom : Changed% = TRUE
        IF INKEY(-122) PanX += Zoom : Changed% = TRUE
        IF INKEY(-58)  PanY += Zoom : Changed% = TRUE
        IF INKEY(-42)  PanY -= Zoom : Changed% = TRUE
        IF INKEY(-64)  Zoom /= 1.02 : Changed% = TRUE
        IF INKEY(-79)  Zoom *= 1.02 : Changed% = TRUE
  
        MOUSE x%, y%, b%
        IF a% AND b% AND 1 THEN Zoom /= 1.02 : Changed% = TRUE
        IF a% AND b% AND 2 THEN Zoom *= 1.02 : Changed% = TRUE
        IF a% AND b% AND 4 THEN
          MOUSE ON 134
          IF x%<>oldx% OR y%<>oldy% THEN
            PanX += (x% - oldx%)/2 * Zoom
            PanY += (y% - oldy%)/2 * Zoom
            Changed% = TRUE
          ENDIF
        ELSE
          MOUSE ON 0
        ENDIF
        a% = b%
        oldx% = x%
        oldy% = y%
  


        IF Changed% THEN
          Changed% = FALSE
          dx = Zoom * (Right - Left)/Width%
          dy = Zoom * (Bottom - Top)/Height%
          dx% = FN_f4(dx)
          dy% = FN_f4(dy)
          x0% = FN_f4((Right + Left)/2 - PanX * dx/Zoom - Width%/2 * dx)
          y0% = FN_f4((Bottom + Top)/2 - PanY * dy/Zoom - Height%/2 * dy)
          CALL PaintMandelSSE
          SYS "InvalidateRect", @hwnd%, 0, 0
        ELSE
          WAIT 1
        ENDIF
  
      UNTIL FALSE
      END

      DEF PROCgradient(S%,F%,R1&,G1&,B1&,R2&,G2&,B2&)
      LOCAL I%,R,G,B
      R = R1& : G = G1& : B = B1&
      FOR I% = S% TO F%
        palette%(I%) = B OR (G << 8) OR (R << 16)
        R += (R2&-R1&)/(F%-S%)
        G += (G2&-G1&)/(F%-S%)
        B += (B2&-B1&)/(F%-S%)
      NEXT
      ENDPROC

      DEF PROCassemble
      LOCAL code%,pass%,P%,L%
      DIM code% 460,L% -1
      FOR pass% = 8 TO 10 STEP 2
        P% = (code% + 15) AND -16
        ON ERROR LOCAL [OPT FN_asmext
        [OPT pass%
        .rad dd &40800000 : dd &40800000 : dd &40800000 : dd &40800000
        .dx1 dd 0 : dd 0 : dd 0 : dd 0
        .dy1 dd 0 : dd 0 : dd 0 : dd 0
        .left1 dd 0 : dd 0 : dd 0 : dd 0
        .mask dd 0 : dd &FFFFFFFF : dd &FFFFFFFF : dd &FFFFFFFF
        .mask1 dd 0 : dd 0 : dd 0 : dd &FFFFFFFF
        .mask2 dd 0 : dd 0 : dd &FFFFFFFF : dd &FFFFFFFF
  
        .PaintMandelSSE
        mov edx,Height%
        mov esi,^palette%(0)
        mov edi,[^Bits%]
        movss xmm2,[^dx%]
        shufps xmm2,xmm2,0
        movss xmm3,[^dy%]
        shufps xmm3,xmm3,0
        movaps [dy1],xmm3
        movss xmm4,[^x0%]
        shufps xmm4,xmm4,0
        movss xmm5,[^y0%]
        shufps xmm5,xmm5,0
        movaps xmm0,xmm2
        andps xmm0,[mask1]
        movaps xmm1,xmm2
        andps xmm1,[mask2]
        addps xmm0,xmm1
        addps xmm0,xmm2
        andps xmm0,[mask]
        addps xmm4,xmm0
        movaps [left1],xmm4
        addps xmm2,xmm2
        addps xmm2,xmm2
        movaps [dx1],xmm2
        movaps xmm7,[rad]
        .YLOOP
        movaps xmm4,[left1]
        mov ebx,Width%
        .XLOOP
        movaps xmm0,xmm4
        xorps xmm6,xmm6
        movaps xmm1,xmm5
        mov ecx,ITER
        .ILOOP
        movaps xmm2,xmm0
        mulps xmm0,xmm0
        movaps xmm3,xmm1
        addps xmm1,xmm1
        mulps xmm1,xmm2
        movaps xmm2,xmm0
        mulps xmm3,xmm3
        addps xmm1,xmm5
        subps xmm0,xmm3
        addps xmm2,xmm3
        cmpleps xmm2,xmm7
        addps xmm0,xmm4
        movmskps eax,xmm2
        test eax,eax
        jz Exit
        andps xmm2,xmm7
        addps xmm6,xmm2
        sub ecx,1
        jnz ILOOP
        .Exit
        cvttss2si eax,xmm6
        mov eax,[esi + eax]
        mov [edi],eax
        shufps xmm6,xmm6,&E5
        cvttss2si eax,xmm6
        mov eax,[esi + eax]
        mov [edi+4],eax
        shufps xmm6,xmm6,&E6
        cvttss2si eax,xmm6
        mov eax,[esi + eax]
        mov [edi+8],eax
        shufps xmm6,xmm6,&E7
        cvttss2si eax,xmm6
        mov eax,[esi + eax]
        mov [edi+12],eax
        add edi,16
        addps xmm4,[dx1]
        sub ebx,4
        ja near XLOOP
        addps xmm5,[dy1]
        sub edx,1
        jnz near YLOOP
        ret
        ]
      NEXT pass%
      ENDPROC

      DEF FN_f4(A#) : LOCAL A%,P% : PRIVATE F%
      IF F%=0 THEN
        DIM P% 10
        [OPT 2
        .F%
        mov esi,[ebp+2]:mov edi,[ebp+7]
        fld qword [esi]:fstp dword [edi]
        ret
        ]
      ENDIF
      A#*=1.0# : CALL F%,A#,A%
      =A%


No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.