Hello friends,

 

In previous articles I have referred to a ZX81 ROM enhancement to "autorun"

a BASIC program from power up or reset. I have this rom patch installed on

both my ZX81 with NVM and the ZX97. Since I do most of my  "code and play"

programming on the ZX97, it is great to turn on the computer and instantly

have the assembler up and running with the source file in memory ready to

get to work. AUTOBASIC is essential for ZX controller applications (Robot,

hothouse HVAC, fire and burglar alarm, robot) which use this feature to

autorun BASIC (and machine code) control programs to automatically recover

from a reset caused by power fail, watchdog timeout, etc.

The ROM patch AUTOBASIC is compatable with my ZX81 NVM described in previous

articles (reprints available on request) and of course the ZX97. AUTOBASIC can

also be used on the XTender emulator with NEWROM installed. Although XTender

won't autorun on power up, it possible to develop and test ROM enhancements

and use RAND USR 0000 to simulate a reset. I will write a little loader

program for the XTender version if there is interest.

So here then is the AUTOBASIC article which explains how it all works.

 

enjoy

 

wilf

 

 

                  ZX97 AUTOBASIC (c) wilf

              Original JUNE 1997

                    revised APRIL 2005

                    wrigter@dccnet.com

 

You don't have to have anything but an interest in the ZX81 to read

and enjoy these articles and dream about the perfect ZX81!

If you have the technical know how you can build a NVM or ZX97 to use

this software first hand. The ZX97 PCBs will soon be available and a

ZX97 kit may be offered to help you get started.

AUTOBASIC is a ZX81 ROM enhancement and therefore needs some means of

altering the ZX81 ROM contents. One way is to replace the ROM with an

EPROM or secondly, use a RAM circuit which overlays the ROM  such as the

shadow RAM described in my 64K NVM article. AUTOBASIC also assumes that

the top 16K of the memory map is used as a RAMDISK with the autorunning

program formatted by that other ZX81 ROM enhancement: RAMDOS.

All of these features are present on the ZX97 or can be emulated in

XTender using the NEWROM program presented earlier.

Those hardy souls who roll their own ZX designs are welcome to pick and

choose some of the techniques presented here and use them in their own

designs (and give some credits ofcourse).

 

First of all I should say that you don't have to know the details of

AUTOBASIC to get the benefit of instant program execution on powerup.

Once installed the AUTOBASIC feature is completely transparent to the

normal user. Only a few directions are required to use AUTOBASIC:

 

1. The AUTORUN BASIC file must be saved using RAMDOS in the default bank

   (F) and the file type should be changed to R to identify a properly

   formatted program. (If R is not found, the normal ZX81 0/0 screen appears)

2. On powerup or reset, the SHIFT key is tested and if held down, the RAMDOS

   directory is loaded instead of the auto running BASIC program.

3. The AUTOBASIC program loads the R file to system memory and executes RUN 1

   or if no R file is found, no program is loaded and the code executes the

   nonexisting basic program ending with the familiar 0/0 error message.

 

For the technically inclined ZX81 user, the source listing may provide enough

information to understand how AUTOBASIC works (and modify it as desired:-)

but I have added an additional comments to highlight some of the finer points.

 

The old ZX81 ROM RESET code was designed for 1/2/16K system memories

and required a RAM test to set the correct value for RAMTOP.

However the new code is designed for expanded memory , with RAMTOP fixed

at 7FFF on reset and the space freed up by nuking the old RAMTEST code

is put to good use for auto running RAMDOS or AUTOBASIC.

Like the old ROM code, the new code sets up the system variables, the display

file, and the value of NEXTLIN but then the new code pushes 0676, the LINERUN

vector, on the STACK and continues with a three way branch to RAMDOS or

AUTOBASIC or the old ZX81 0/0 screen.

The new code tests if the carry flag is set which means the system reboot

was caused by NEW and a direct jump is made to RAMDOS.

If the carry flag is reset it means the system reboot was started from

a RESET. If the SHIFT key is held down, AUTOBASIC is skipped and like

NEW, the system directly executes RAMDOS to load a new program.

If no shift key is held down then the new code jumps to a third code

segment at A400 to test if the first file in BANK F has a file type R

indicating it should be loaded into system RAM and executed.

If it finds the R type AUTOBASIC file then the file length (up to 16K)

is loaded into BC and the required space is created between program start

407D and the start of the display file (400C). Finally the R file is

transferred to the newly created program space in system RAM and the

AUTOBASIC code returns via SLOW (02FB) to execute the BASIC program with

LINE RUN code at 0676. This vector was previously PUSHed on the stack and

the address of the first line saved to NEXTLIN. The BASIC interpreter

uses LINERUN to RUN the BASIC program lines. If there is no R file in the

first location in BANK F then no program is transferred and executing the

null BASIC program ends with the familiar ZX81 0/0 error message on screen.

 

Summarized comments and the source code follow:

 

The OLD ZX81 ROM is changed at 0000, 0025, and 03C3. The actual AUTOBASIC

code is added to the BASIC OS EXTENSION in EPROM (XROM) at A310.

 

1. The old ZX81 ROM code segment at 0000 is slightly modified to load HL

instead of BC with RAMTOP=7FFF.  The carry flag is reset with SUB A to

differentiate between NEW and RESET later on. Note the tight space in

this memory area (for the RST routines) required a relative jump to three

spare bytes at 0025 to make the long jump to the next code segment at 03CA.

The code between 0007 and 0025 is unaltered.

 

      ;8 BYTES OF ROM CODE AT

      ;0000 ARE CHANGED JUST TO

      ;SETUP HL REGISTER AND CF

 

      ORG 0000

 

RESET OUT FD,A;TURN OFF NMI

      LD HL,7FFF;RAMTOP = 7FFF

      SUB A;RESET/NEW FLAG (CF)

      JR 1D;JP 03CA VIA RST1

 

      ;THREE FREE BYTES AT 0025

      ;ARE USED FOR A LONG JUMP

 

      ORG 0025

 

RST1  JP 03CA;NOW JUMP TO RST2

 

 

2. The old ZX81 RAMTEST code at 03C3 is replaced and it is assumed that

at least 16K of system memory is available. This greatly speeds up

initialization and gives an "instant" powerup screen.

The NEW and RESET commands use the same system variable initializtion code

but NEW ofcourse does not autorun and instead directly starts RAMDOS to

select a NEW program. If the SHIFT key is held down during RESET it is

treated like a NEW command.

 

 

      ;A REBOOT FROM RESET OR

      ;POWER UP ENTERS AT RST2.

      ;SHIFT KEY DISABLES AUTORUN

 

      ORG 03C3

 

NEW   CALL 02E7;NEW ENTRY POINT

      LD HL,(4004);GET RAMTOP

      SCF;FLAG AS NEW,NOT RESET

RST2  LD (4004),HL;SAVE RAMTOP

      DEC HL;

      LD (HL),3E

      DEC HL

      LD SP,HL;NEW STACKPOINTER

      DEC HL

      DEC HL

      LD (4002),HL;ERR-SP

      LD A,1E;POINTER TO VIDEO

      LD I,A;FONT TABLE (MSB)

      IM1;SET INTERRUPT MODE 1

      LD IY,4000;SYSVAR POINTER

      LD HL,407D;

      LD (IY+59),H;INIT CDFLAG

      LD (400C),HL;DFILE=407D 

      LD (4029),HL;NXTLIN=407D

      LD B,19;COLLAPSED DISPLAY

NL    LD (HL),76;HAS 25 N/L CHR

      INC HL

      DJNZ NL

      LD (4010),HL;VARS=4096

      PUSH AF;NEW/RESET FLAG

      CALL 149A;CLEAR POINTERS

      CALL 0A2A;FULL DISPLAY

      POP AF;NEW/RESET FLAG

      LD HL,0676;LOAD LINERUN

      PUSH HL;AS RETURN ADDRESS

      JR C NEW1;JR IF NEW

      LD A,FE;TEST SHIFT KEY

      IN A,FE

      RRA

      CALL 0F4B;RESET DEBOUNCE

      JP C A310;JP TO AUTOBASIC

NEW1  JP A080;JUMP TO RAMDOS

 

 

3. If the SHIFT key is not held down a jump is made to A310. This code

sets up the 8255 bankswitch controller to select BANK 0F. However in

minimal systems with only one EPROM bank installed, (no bankswitch) this

default BANK is selected. The first file is tested to see if it is a

R type file and the file is transferred to the system memory and auto

executed from line 1. If not found the sequence ends with error 0/0.

 

      ;AUTOBASIC SELECTS BANK F

      ;LOADS THE 1ST FILE TO

      ;SYSTEM RAM IF IT IS A

      ;TYPE R FILE. THEN SIMPLY

      ;RETURNS TO 0676 TO RUN

      ;THE R FILE. IF NO R FILE

      ;IS FOUND, ENDS WITH 0/0

 

      ORG A310

AUTO 

      LD A,99;SETUP BANKSWITCH

      OUT DF,A;TO SELECT DIR F

      LD A,0F

      OUT CF,A

      LD HL,C007;1ST FILE TYPE

      LD A,37;TEST FILE TYPE R

      CP (HL);IS IT AN R FILE?

      JR NZ SLOW ;IF NOT > 0/0

      INC HL;FILE LENGTH (LSB)

      LD C,(HL);C=LSB LENGTH

      INC HL;FILE LENGTH (MSB)

      LD B,(HL);B=MSB LENGTH

      INC HL;NOW POINT TO DATA

      PUSH HL;SAVE DATA POINTER

      PUSH BC;SAVE LENGTH

      LD HL,407D;BASIC START

      PUSH HL;SAVE START

      DEC HL;CORRECT START

      CALL F23;CALL FAST

      CALL 99E;MAKE BC SPACES

      POP DE;GET START

      POP BC;GET LENGTH

      POP HL;GET DATA

      LDIR;LOAD R FILE

      LD (IY+1),C0;SETUP FLAGS

SLOW  JP 0F2B;RETURN VIA SLOW

 

 

This AUTOBASIC code has over the years saved me many hours of

waiting for the system to reboot. In a "code and test" session

especially when changing the system software, I use the RESET

button hundreds of times to recover from a "locked up" system.

To have the system reboot and the source code instantly ready

for editing gives a kind of dynamic fluency to the process that

has got me through some very frustrating programming sessions.

 

enjoy

 

wilf