Previous Next Contents Index
The control routine

This routine is called from 'START' at #0008, when the DISCiPLE system is paged in.
It has three main tasks:
- If a disc channel has been requested, it jumps to the required 'input' or
  'output' routine.
- If a hook/command code is used, it jumps to the required routine.
- If an error occurred in the 'main' ROM, it checks whether a DISCiPLE command was
  used. If so the corresponding routine is called, otherwise a return is made to
  the 'main' ROM, except when the DISCiPLE variable ONERR holds a non zero address.
  In that case a CALBAS to that address is made.

0597 START_3    LD   (#1DD6),HL          DISCiPLE's CH_ADD (D_CH_ADD).
059A            LD   (#1DEA),A
059D            POP  HL                  Get RETurn address (usually points to
059E            PUSH HL                  the error code).
059F            PUSH DE

Now see if a DISCiPLE channel has been requested.

05A0            AND  A
05A1            LD   DE,#15FE            If a channel has been requested, this
                                         is the RETurn address stored by the
                                         CALL #162C in the 'CALL-SUB' subroutine
                                         in the Spectrum ROM.
05A4            SBC  HL,DE
05A6            POP  DE
05A7            JR   NZ,#05C7,START_4    Jump if no channels have been requested.
05A9            LD   HL,#0050,UNPAGE_1   Make UNPAGE_1 RETurn address
05AC            PUSH HL

Now see if the channel requested is the "P" channel. The DISCiPLE "P" channel differs
only from the Spectrum's in the 'input' and 'output' addresses. For the DISCiPLE they
both are #0008. There is no information in the channel on what the DISCiPLE system's
in/output addresses are (as with "D" channels). So it has to be handled separately.

05AD            PUSH BC
05AE            LD   HL,(23631)          Fetch CHANS.
05B1            LD   BC,16               Point to "P" channel.
05B4            ADD  HL,BC
05B5            SBC  HL,DE               DE holds address of requested channel.
05B7            POP  BC
05B8            LD   A,(#1DEA)           Restore A register.
05BB            JP   Z,#1783,PCHAN_OUT   Jump if DISCiPLE "P" channel was used.
05BE            LD   HL,4                DE holds address of routine pointer-4. See
                                         #15EF in 'main' ROM.
05C1            ADD  HL,DE               HL now holds address of routine pointer.
05C2            LD   E,(HL)
05C3            INC  HL                  Fetch routine address.
05C4            LD   D,(HL)
05C5            EX   DE,HL               HL now points to the routine.
05C6            JP   (HL)                Jump to the appropriate 'input' or
                                         'output' routine.

At this point, the DISCiPLE has been paged-in by an error in the 'main' ROM or by a
hook/command code. When an error occurred during a CALBAS and D_ERR_SP isn't zero,
the error has to be handled by the 'main' ROM. If D_ERR_SP is zero, the error is
reported to the routine which executed a CALBAS.

05C7 START_4    LD   A,(#1DE5)           Check if the DISCiPLE CALLed a Spectrum
05CA            CP   #47                 ROM routine.
05CC            JR   NZ,#05EC,START_5    Jump if it didn't.
05CE            XOR  A
05CF            LD   (#1DE5),A           Clear CALBAS executing.
05D2            LD   (#1ACF),A           Clear FLAGS3.
05D5            POP  HL                  Fetch RETurn address.
05D6            RST  #10,CALBAS          This CALL's a LD A,(HL) in the Spectrum
05D7            DEFW #007B               ROM, so the error code is fetched.
05D9            LD   (23610),A           Store the error code in ERR_NR.
05DC            LD   HL,(#0296)          Fetch D_ERR_SP.
05DF            LD   A,H
05E0            OR   L                   Jump if D_ERR_SP was zero, that is when
05E1            JP   Z,#06D6,SPEC_ERR2   the 'main' ROM has to handle the error.
05E4            LD   A,(23610)           Copy error code in A register.
05E7            SET  7,A                 Signal 'Spectrum error'.
05E9            LD   SP,HL               Clear stack.
05EA            SCF                      Signal 'error and exit', someone else has
05EB            RET                      to handle the error.

Now it is most likely that the DISCiPLE has to handle the problem which the 'main' ROM
couldn't. So see if it is an error or a hook/command code.

05EC START_5    POP  HL                  Fetch address of error or hook/command
                                         code (the byte after RST #08).
05ED            RST  #10,CALBAS          Fetch the byte.
05EE            DEFW #007B
05F0            LD   (IY+0),A            Store it in ERR_NR.
05F3            CP   255                 Check if the error is 'OK'.
05F5            JP   Z,#2948,REP_20      Give 'OK GDOS' message if so.
05F8            SUB  27                  Adjust range, hookcodes start at 0 now.
05FA            JP   NC,#04C3,HOOK_CODE  Jump if it is a hook or command code.
05FD            CP   240                 Jump if the error is
05FF            JR   Z,#060E,TEST_INPUT  'Nonsense in BASIC'.
0601            CP   243
0603            JR   Z,#060E,TEST_INPUT  Also if it is 'Invalid filename'.
0605            CP   252
0607            JR   Z,#060E,TEST_INPUT  Or 'Invalid stream'.
0609            CP   230
060B            JP   NZ,#06CD,SPEC_ERR   Jump to the 'main' ROM error handler if
                                         it isn't 'Variable not found'.
060E TEST_INPUT BIT  5,(IY+55)           Use 'main' ROM error handler also if in
0612            JP   NZ,#06CD,SPEC_ERR   INPUT mode.

Now a loop is entered to find the BASIC command which produced the error. The way in
which this is done is very simple, a backward search is made until a byte value >= 206
(value of first BASIC command 'DEF FN') is found. There are a few cases in which this
algorithm fails, e.g.:
-When a number in a BASIC line is followed by its hidden representation (starts
 with a CHR$ 14 number marker), this could contain a byte >= 206.
-If the line the error occurred on doesn't contain a BASIC command the searching
 continues until a byte value >= 206 is found. So line length, line number and even
 previous lines could be searched.

0615            LD   HL,(23645)          Fetch CH_ADD.
0618 FIND_COM   DEC  HL
0619            LD   A,(HL)
061A            CP   206                 Test for DEF FN (first BASIC command).
061C            JR   C,#0618,FIND_COM    Loop until a byte >= 206 is found.
061E            LD   (23645),HL          Update CH_ADD.
0621            RST  48,SYNTAX_Z
0622            JR   NZ,#0651,RUNTIME    Jump during RUNtime.

The following loop removes all number representations from the line.

0624            DEC  HL                  Balance "INC HL" below.
0625            LD   C,0                 ???? C isn't used.
0627 RCLM_NUM   INC  HL
0628            LD   A,(HL)              Next character.
0629            CP   14                  Is it a 'number' marker ?
062B            JR   NZ,#064C,NO_NUM     Jump if not.
062D            PUSH BC
062E            PUSH HL
062F            LD   BC,6
0632            RST  #10,CALBAS          Reclaim the 6 bytes forming a number
0633            DEFW #19E8,RECLAIM_2     and the 'number marker'.
0635            POP  HL
0636            PUSH HL
0637            LD   DE,(#1DD6)          Fetch D_CH_ADD.
063B            AND  A                   Jump if the number bytes reclaimed were
063C            SBC  HL,DE               after the character pointed to by
063E            JR   NC,#064A,NXT_1      D_CH_ADD.
0640            EX   DE,HL               Otherwise D_CH_ADD has to be updated.
0641            LD   BC,6
0644            AND  A                   The character pointed by D_CH_ADD has
0645            SBC  HL,BC               been moved '6' bytes down.
0647            LD   (#1DD6),HL          Update D_CH_ADD.
064A NXT_1      POP  HL
064B            POP  BC
064C NO_NUM     LD   A,(HL)
064D            CP   13
064F            JR   NZ,#0627,RCLM_NUM   Repeat until 'end of line' is found.

Now the work areas and some DISCiPLE variables are cleared.

0651 RUNTIME    RST  #10,CALBAS          Clear Spectrum work areas by calling
0652            DEFW #16BF,SET_WORK      'SET_WORK' in 'main' ROM.
0654            LD   HL,#1DF4
0657            LD   BC,60
065A RESET_VARS LD   (HL),255            Reset DISCiPLE work areas, including
065C            INC  HL                  UFIA1 and UFIA2.
065D            DEC  BC
065E            LD   A,B
065F            OR   C
0660            JR   NZ,#065A,RESET_VARS
0662            LD   (#1ACF),A           Clear FLAGS3.
0665            LD   A,#44               Signal 'System loaded'.
0667            LD   (#1DE4),A
066A            LD   IX,#1AC3            Point to DISCiPLE system variables.

Finally the command is fetched from the line, and if its a 'new' command the
appropriate routine is called.

066E            CALL #002C,GET_C_RAM     Fetch the command.
0671            LD   (#1DFF),A           Store it.

This part is also called from the network server routine at #0325.

0674 EXEC_COMM  CP   207                 Is the command 'CAT' ?
0676            JP   Z,#0855,CAT         Jump to the CAT routine if so.
0679            CP   208                 Also for 'FORMAT',...
067B            JP   Z,#102C,FORMAT
067E            CP   209                 ...'MOVE',...
0680            JP   Z,#10B1,MOVE
0683            CP   210                 ...'ERASE',...
0685            JP   Z,#0932,ERASE
0688            CP   211                 ...'OPEN #',...
068A            JP   Z,#1216,OPEN#
068D            CP   212                 ...'CLOSE #',...
068F            JP   Z,#13C4,CLOSE#
0692            CP   213                 ...'MERGE',...
0694            JP   Z,#0DF8,MERGE
0697            CP   214                 ...'VERIFY',...
0699            JP   Z,#0DF3,VERIFY
069C            CP   239                 ...'LOAD',...
069E            JP   Z,#0DEE,LOAD
06A1            CP   244                 ...'POKE',...
06A3            JP   Z,#0438,POKE@
06A6            CP   248                 ...'SAVE',...
06A8            JP   Z,#0D41,SAVE
06AB            CP   251                 ...'CLS',...
06AD            JP   Z,#1467,CLS#
06B0            CP   253                 ...'CLEAR',...
06B2            JP   Z,#13E7,CLEAR#
06B5            CP   255                 ...'COPY',...
06B7            JP   Z,#1621,COPY
06BA            LD   HL,(#02A6)          Fetch ONERR address.
06BD            LD   A,H
06BE            OR   L
06BF            JR   Z,#06CD,SPEC_ERR    Jump if no ON ERROR address.
06C1            LD   (#06C8),HL          Store it so it can be CALBASsed.
06C4            LD   A,(#1DFF)           Fetch command which has to be examined
06C7            RST  #10,CALBAS          by user-routine (BASIC extensions).
06C8            DEFW #0000,EXT_BASIC     CALL the extend BASIC routine(s).
06CA            JP   #0419,END           Test end of command and exit.

THE 'SPECTRUM ERROR' ROUTINE
This routine must be entered with the error code in (ERR_NR), and does the same as
the 'main' ROM  'ERROR' restart, except when error messages are to be supressed. This
is indicated by a non zero value in 23728.

06CD SPEC_ERR   LD   HL,(#1DD6)          Fetch D_CH_ADD.
06D0            LD   (23645),HL          Restore CH_ADD.
06D3            LD   (23647),HL          Restore X_PTR.
06D6 SPEC_ERR2  LD   HL,#0058
06D9            RST  #30,SYNTAX_Z        RETurn to #58, which is in ERROR_2, in
06DA            JP   Z,#004F,UNPAGE_HL   the Spectrum ROM when checking syntax.
06DD            LD   A,(23728)
06E0            AND  A                   Also RETurn to #58 in 'main' ROM when
06E1            JP   Z,#004F,UNPAGE_HL   error messages aren't to be supressed.
06E4            LD   A,(23610)           Otherwise signal 'Spectrum error'.
06E7            SET  7,A
06E9            LD   (23610),A
06EC            LD   HL,#1B7D,STMT_R_1   And RETurn to STMT_R_1 in the Spectrum
06EF            JP   #004F,UNPAGE_HL     ROM.

THE 'LOAD A BYTE FROM NETWORK' ROUTINE
This routine loads one byte from the network.

06F2 N_LBYT     PUSH IX
06F4            CALL #2963,JN_INPUT      Call the ROM routine.
06F7            POP  IX
06F9            RET

THE 'SAVE A BYTE TO NETWORK' ROUTINE
This routine saves one byte to the network.

06FA N_SBYT     PUSH IX
06FC            CALL #2966,JN_OUTPUT     Call the ROM routine.
06FF            POP  IX
0701            RET
Previous Next Contents Index