Previous Next Contents Index
The PUPIL control routines

This routine handles the 'new' commands supported by the 'PUPIL system'.

2315 PUPIL      LD   HL,#1DF4            Reset some DISCiPLE variables and work
2318            LD   BC,60               areas.
231B PUP_CLRV   LD   (HL),255
231D            INC  HL
231E            DEC  BC
231F            LD   A,B
2320            OR   C
2321            JR   NZ,#231B,PUP_CLRV
2323            LD   (#1DDA),A           Reset control port state.
2326            LD   (#1ACF),A           Clear FLAGS3.
2329            LD   (23729),A           Clear an unused Spectrum system variable.
232C            CALL #002C,GET_C_RAM     Fetch the command.
232F            LD   (#1DFF),A
2332            CP   207                 Is it 'CAT' ?
2334            JP   Z,#083C,CAT         Jump to the CAT routine if so.
2337            CP   239                 Also for 'LOAD',...
2339            JP   Z,#06A5,LOAD
233C            CP   248                 ...'SAVE',...
233E            JP   Z,#0672,SAVE
2341            CP   213                 ...'MERGE',...
2343            JP   Z,#06AF,MERGE
2346            CP   214                 ...'VERIFY',...
2348            JP   Z,#06AA,VERIFY
234B            CP   208                 ...'FORMAT',...
234D            JP   Z,#080C,FORMAT
2350            CP   210                 ...'ERASE',...
2352            JP   Z,#086D,ERASE
2355            CP   255                 ...'COPY',...
2357            JP   Z,#089C,COPY
235A            JP   #0146,SPEC_ERR      If non of the above, the Spectrum has
                                         to handle the error.

This routine checks if a 'command block' is send over the network. In a master/pupil
network (Shared Access Network) the master can 'steal' a file from or 'force' a file
upon a pupil station. Whenever the master does this the pupil executes the command and
loads from or saves to the master station.

235D NET_SERVER CALL #036E,NET_ACTIVE    Test network activity.
2360            CALL NZ,#038A,GET_COMBLK Fetch the command block if the network
                                         was active.
2363            LD   L,#2F               Restore registers for 'KEY_SCAN'
2365            LD   DE,#FFFF            routine in 'main' ROM.
2368            LD   BC,#FEFE
236B            JP   #021F,TAKE_PRTR     Exit via 'TAKE_PRTR'.

Before a command block can be received the network has to be active for about 10400 T
cycles and then has to go inactive in less than 52000 T states. Whenever one of both
requirements isn't fulfilled a return is made with the Zero flag set indicating
'no command block to be received'.

236E NET_ACTIVE LD   HL,200              This counter allows the network to be
                                         tested for 10395 T cycles.
2371 NET_ACT1   IN   A,(31)
2373            CPL
2374            BIT  7,A
2376            RET  Z                   Exit if the network is inactive.
2377            DEC  HL
2378            LD   A,H
2379            OR   L
237A            JR   NZ,#2371,NET_ACT1   Repeat activity-test until time out.

Now the network has to go inactive within about 52000 T cycles.

237C            LD   HL,1000
237F NET_ACT2   DEC  HL                  Decrease counter.
2380            LD   A,H
2381            OR   L
2382            RET  Z                   Exit if network isn't inactive within
2383            IN   A,(31)              the right time.
2385            BIT  7,A
2387            JR   Z,#237F,NET_ACT2    Repeat until network is inactive.
2389            RET                      Return so the command block can be

This routine fetches the command block from the network and executes the command.

238A GET_COMBLK LD   HL,#1DFD            Point to the data buffer.
238D            LD   E,29
238F            CALL #3A87,INPAK         Read 29 bytes from the network.
2392            RET  NZ                  Return if no bytes received.
2393            LD   HL,#1DFD            Restore the pointer.
2396            XOR  A                   Clear checksum.
2397            LD   B,28                Calculate checksum for 28 bytes.
2399 GET_C_CHKS ADD  A,(HL)              Add this byte.
239A            INC  HL
239B            DJNZ #2399,GET_C_CHKS    Repeat for all command block bytes.
239D            CP   (HL)                Compare with received checksum.
239E            RET  NZ                  Exit if they don't match.
239F            LD   HL,#1DFD            Restore the pointer again.
23A2            LD   A,(#029C)           Fetch own station number.
23A5            CP   (HL)                Return if the command block isn't for
23A6            RET  NZ                  this station.
23A7            INC  HL
23A8            LD   A,(HL)
23A9            CP   1                   Return also if the command block isn't
23AB            RET  NZ                  from the master station.
23AC            INC  HL                  Point to the command.
23AD            PUSH HL
23AE            CALL #3AB5,SEND_RESP     Send response code.
23B1            CALL #03DB,SIGN_SERV     Signal 'serving the master'.
23B4            LD   A,(#1DFE)           Fetch the destination station number
23B7            LD   (#1E01),A           (which is always 1).
23BA            POP  HL
23BB            LD   A,(HL)              Fetch the command.

NOTE: The commands are the commands used by the master so when the master states 'LOAD',
the pupil has to 'SAVE'.

23BC            CP   245
23BE            JR   Z,#23CF,PRINT       Jump with 'PRINT'.
23C0            CP   248                 This is 'SAVE'.
23C2            CALL Z,#06A5,LOAD        Call the 'LOAD' routine.
23C5            CP   239                 This is 'LOAD'.
23C7            CALL Z,#0672,SAVE        Call the 'SAVE' routine.
23CB            LD   (#1ACF),A           Clear FLAGS3.
23CE            RET

This subroutine prints the character send by the master on the current stream.

23CF PRINT      INC  HL                  Fetch character.
23D0            LD   A,(HL)
23D1            RST  #10,CALBAS          Print it.
23D2            DEFW #0010,PRINT_A_1
23D4            JR   #23CA,GET_EXIT
Previous Next Contents Index