Retro fun with BCPL

Re-reading the recent thread on B: B -- A Simple Interpreter Compiler I noticed a Mandelbrot program written in B and I thought it might be nice to translate (back-port?) to BCPL - it’s virtually line for line with a few syntax changes:

GET "libhdr"

LET start() = VALOF
{
  LET cx,cy,x,y,x2,y2 = ?,?,?,?,?,?
  LET iter = ?

  LET xmin,xmax,ymin,ymax,maxiter,dx,dy = ?,?,?,?,?,?,?

  xmin := -8601
  xmax :=  2867
  ymin := -4915
  ymax :=  4915

  maxiter := 32

  dx := (xmax-xmin)/79
  dy := (ymax-ymin)/30

  cy := ymin
  WHILE cy <= ymax DO
  {
    cx := xmin
    WHILE cx <= xmax DO
    {
      x := 0
      y := 0
      x2 := 0
      y2 := 0
      iter:=0
      WHILE iter < maxiter DO
      {
	IF x2+y2 > 16384 THEN
	  BREAK

	y := ((x*y)/2048)+cy
	x := x2-y2+cx
	x2 := (x*x)/4096
	y2 := (y*y)/4096
	iter := iter + 1
      }
      sawrch (' '+iter)
      cx := cx + dx
    }
    sawrch ('*n')

    cy := cy + dy
  }

  sys (Sys_quit, 0)
  RESULTIS 0
}

and of-course it produces the same result:

!!!!!!!!!!!!!!!"""""""""""""####################################""""""""""""""""
!!!!!!!!!!!!!""""""""""########################$$$$$%(&&%%$$$$$######"""""""""""
!!!!!!!!!!!!"""""""#######################$$$$$$$$%%%&)@(&&'%$$$$$######""""""""
!!!!!!!!!!""""""#######################$$$$$$$$$%%%%&'(*00*'&%%$$$$$$######"""""
!!!!!!!!!"""""######################$$$$$$$$$$%%%%&')*+2@@,)(&%%%$$$$$$#######""
!!!!!!!!""""#####################$$$$$$$$$$%%%&&&''),@@@@@@@,'&%%%%%$$$$########
!!!!!!!"""#####################$$$$$$$$$%%&''''''()*,@@@@@@@*(('&&&&&&%$$$######
!!!!!!"""###################$$$$$$$%%%%&&'*34.,+@@1@@@@@@@@@;@0@7)(()0)'%$$#####
!!!!!!"##################$$$$%%%%%%%%&&&'()@@@@@@@@@@@@@@@@@@@@@@@@@@@,(%%$$####
!!!!!"###############$$$%%%%%%%%%%%&&&'(+@-@@@@@@@@@@@@@@@@@@@@@@@@@=+('&%%$$###
!!!!"##########$$$$$%%&(.'''''''''''''(*,5@@@@@@@@@@@@@@@@@@@@@@@@@@@@+)-&%$$###
!!!!"####$$$$$$$$%%%%&&(.2,.*+10++*)))*.>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@2+&%$$$##
!!!!##$$$$$$$$$%%%%%&''()9?@@@@@@@@@,,-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-*&%$$$##
!!!!#$$$$$$$$%%%%%&,(()+1@@@@@@@@@@@@@3@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@79'%%$$$$#
!!!#$%%$$$%&&&&&''().1?2<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*'&%%$$$$#
!!!()**,+9652/1//35>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4+)'&&%%$$$$#
!!!#$%%%$%&&&&&'''()35@3?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)'&%%$$$$#
!!!"$$$$$$$$%%%%%%&+())+1@@@@@@@@@@@@@4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@2&%%$$$$#
!!!!##$$$$$$$$$%%%%%&''()=<@@@@@@@@@.,-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/0&%$$$##
!!!!"####$$$$$$$$%%%%&&(,419*+/@+.*)))*.;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5)&%$$$##
!!!!"#########$$$$$$%%&(-(''''(''''''((*-4@@@@@@@@@@@@@@@@@@@@@@@@@@@4+)-&%$$###
!!!!!"###############$$$%%%%%%%%%%&&&&'(,@.@@@@@@@@@@@@@@@@@@@@@@@@@1+('&%%$$###
!!!!!!"##################$$$$%%%%%%%%&&&'()7@@@@@@@@@@@@@@@@@@@@@@@@@@+'%%$$####
!!!!!!""####################$$$$$$%%%%%&&'+94/-+1@3@@@@@@@@@@@1@@))))-*'%$$#####
!!!!!!!"""#####################$$$$$$$$%%%&''''''()*,@@@@@@@*)('&&&&&&%$$$######
!!!!!!!!""""#####################$$$$$$$$$$%%%&&&''(,@@@@@@@+'&&%%%%%$$$########
!!!!!!!!!"""""######################$$$$$$$$$$%%%%&'*++3@@,))&%%%$$$$$$#######""
!!!!!!!!!!""""""#######################$$$$$$$$$%%%%&'(*..*'&%%$$$$$$######"""""
!!!!!!!!!!!""""""""#######################$$$$$$$$%%&&)@(''(%$$$$$$#####""""""""
!!!!!!!!!!!!!""""""""""#######################$$$$$$%+'&%%$$$$$######"""""""""""
!!!!!!!!!!!!!!!""""""""""""#####################################""""""""""""""""

It does, however take some 25 seconds to print that using my own BCPL system which I’ve yet to optimise, so I know it can go a lot faster. Still, good (lock down!) retro fun.

Cheers,

-Gordon
Ps. Just an edit to say that my BCPL system is running on WDC 65c816 processor running at 16Mhz and it’s a 32-bit BCPL system. This code is really designed for a 16-bit system and I imagine it would be faster on such a system, clock for clock. On my Linux desktop it runs in about 15mS. It compiles to about 160 bytes of cintcode.

2 Likes

Fraktal-Retro-Kram... - Seite 2 - HIVE-Project has a C variant using SIXEL graphics attached. I’ve run it on CP/M (RunCPM).

It needs a 16bit x 16bit → 32bit multiplication. Abusing the 32bit ints just makes it easy only needing a shift or division to scale the result down again.

An own optimised multiplication routine sure could increase speed or precission. I’m running similar examples with a 24 bit fraction part on e.g. the Parallax Propeller1. Look for the mandelbrot-s8p24 examples in my FastSpin notes.

2 Likes