The BASIC command execution routines II
THE 'GET TRACK AND SECTOR' SUBROUTINE
This routine loads DE with track and sector number from the file header, where they
were stored by the 'EXPT_PARMS' subroutine. Used with LOAD/SAVE @.
0D19 GET_TR&SE LD A,(#1E11) Get track from LSB of LENGTH1_1.
0D1C LD D,A
0D1D LD A,(#1E13) Get sector from LSB of FILE_ADDR1.
0D20 LD E,A
THE 'GET SECTOR LENGTH' SUBROUTINE
This subroutine returns with BC holding the length of a sector in bytes. With double
density this is 512, with single density 256. This routine is also present in ROM
0D22 GET_SECLEN LD BC,512 Length of DD sector.
0D25 LD A,(#1DDA)
0D28 AND 4
0D2A RET Z Return if using double density.
0D2B LD BC,256 Length of SD sector.
THE 'SAVE HEADER 1' SUBROUTINE
This subroutine SAVEs the 9 bytes header from UFIA 1 to the file and to the catalogue
entry which is build up in the DFCA.
0D2F SAVE_HEAD1 LD HL,#1E10 Start of header 1.
0D32 LD DE,#1BA9 Address of header area of a catalogue
0D35 LD B,9 The headers length.
0D37 SA_HD1 LD A,(HL)
0D38 LD (DE),A
0D39 CALL #29C3,JSBYT Save the byte to the file.
0D3C INC HL
0D3D INC DE
0D3E DJNZ #0D37,SA_HD1 Repeat for all nine bytes.
0D40 RET Finished.
THE 'SAVE' COMMAND SYNTAX ROUTINE
This routine checks that the SAVE command has the appropriate syntax.
0D41 SAVE LD IX,#1AC3 Pointer to the DFCA.
0D45 CALL #09E7,SIGN_SAVE Signal 'SAVEing'.
0D48 CALL #0AEF,EXPT_PARMS Evaluate & store all parameters.
0D4B CALL #0A00,TEST_STEAL If 'forcing' a file to a pupil, send
0D4E CALL NZ,#15CB,SEND_BLOCK the command block over the network.
0D51 CALL #0A05,TEST_NET
0D54 JR Z,#0D5C,SAVE_1 Jump if not a SAVE to the network.
0D56 CALL #0DBA,SAVE_NET
0D59 JP #0419,END Finished.
Now deal with saving to disk.
0D5C SAVE_1 CALL #2984,JTEST_DRV See if the drive is defined.
0D5F LD A,(#1E04)
0D62 CP "@"
0D64 JR NZ,#0D76,SAVE_RUN Jump if the command wasn't 'SAVE @'.
0D66 LD IX,(#1E15) Get address where sector is to be saved
0D6A CALL #0D19,GET_TR&SE from. Get track and sector number.
0D6D LD A,(#1E01) Get drive number.
0D70 CALL #15A0,HWSAD Write the sector.
0D73 JP #0419,END Finished.
THE 'SAVE A FILE' ROUTINE
This routine SAVEs the specified file on the specified drive.
0D76 SAVE_RUN CALL #29A8,JOFSM_2 Open the file for 'SAVE'.
0D79 JP NZ,#097A,EXIT_ERASE Exit if the file isn't to be
0D7C LD A,(#1E05)
0D7F CP 11 Pass the header to the file unless it's
0D81 CALL NZ,#0D2F,SAVE_HEAD1 an 'execute' file.
0D84 CALL #09FB,TEST_SERV
0D87 JR Z,#0DAA,SAVE_R1 Jump if not serving the network.
0D89 CALL #0924,OPEN_N_CH Otherwise open the "n" channel.
0D8C LD B,9 Length of a header.
0D8E SAVE_R_N1 CALL #06F2,N_LBYT LOAD a byte from the network.
0D91 DJNZ #0D8E,SAVE_R_N1 Repeat for all header bytes.
0D93 LD DE,(#1E11) Get the file length.
0D97 SAVE_R_N2 LD A,D
0D98 OR E
0D99 JR Z,#0DA4,SAVE_R_N3 Jump if no more bytes left.
0D9B CALL #06F2,N_LBYT Otherwise LOAD a byte from the network.
0D9E CALL #29C3,JSBYT And SAVE it to disk.
0DA1 DEC DE One less to go.
0DA2 JR #0D97,SAVE_R_N2 Repeat for all bytes.
There are no more bytes left, the file can be closed.
0DA4 SAVE_R_N3 CALL #2981,JCFSM Close the file.
0DA7 JP #0419,END Finished.
Save the whole block of bytes to disk.
0DAA SAVE_R1 LD HL,(#1E13) Fetch the start address.
0DAD LD DE,(#1E11) Fetch the length.
0DB1 CALL #29C9,JHSVBK_2 Save the block.
0DB4 CALL #2981,JCFSM Close the file.
0DB7 JP #097A,EXIT_ERASE Exit via 'EXIT_ERASE'.
THE 'SEND FILE OVER NETWORK' SUBROUTINE
This subroutine sends a file and its header over the network.
0DBA SAVE_NET CALL #0AE1,TEST_STAT Check the station number.
0DBD CALL #2960,JOPEN_N Open the "N" channel.
0DC0 CALL #0DC6,SAVE_NET1 Save the file and its header over the
0DC3 JP #2975,JSEND_NEOF Send the EOF block and exit.
THE 'SEND HEADER AND FILE' SUBROUTINE
This subroutine sends the header of a file and the file itself over the network.
The End Of File block isn't send.
0DC6 SAVE_NET1 LD DE,9 Length of the header.
0DC9 LD HL,#1E10 Address of the header.
0DCC CALL #0DD6,SAVE_NET2 Send the header over the network.
0DCF LD DE,(#1E11) Fetch file length.
0DD3 LD HL,(#1E13) Fetch address.
0DD6 SAVE_NET2 LD A,D
0DD7 OR E
0DD8 RET Z Return if no bytes left.
0DD9 LD A,(HL) Fetch the byte.
0DDA CALL #06FA,N_SBYT Send the byte over the network.
0DDD INC HL Point to the next byte.
0DDE DEC DE One less.
0DDF JR #0DD6,SAVE_NET2 Repeat for all bytes.
THE 'LOAD HEADER INTO UFIA 2' SUBROUTINE
This subroutine LOADs a 9 bytes header into UFIA 2.
0DE1 LOAD_HEAD2 LD HL,#1E29 Start of HEADER 2.
0DE4 LD B,9 Length of a header.
0DE6 LOAD_H1 CALL #29A2,JLBYT Load a byte.
0DE9 LD (HL),A Store it into UFIA 2.
0DEA INC HL
0DEB DJNZ #0DE6,LOAD_H1 Repeat for all header bytes.
THE 'LOAD' COMMAND SYNTAX ROUTINE
The 'LOAD' flag is set and the routine continues into the 'LOAD_VERIFY_MERGE'
0DEE LOAD CALL #09E2,SIGN_LOAD Signal 'LOADing'.
0DF1 JR #0DFB,LD_VF_MR
THE 'VERIFY' COMMAND SYNTAX ROUTINE
The 'VERIFY' flag is set and again the 'LOAD_VERIFY_MERGE' routine handles the rest.
0DF3 VERIFY CALL #09F1,SIGN_VERIF Signal 'VERIFYing'.
0DF6 JR #0DFB,LD_VF_MR
THE 'MERGE' COMMAND SYNTAX ROUTINE
The 'MERGE' flag is set and 'LOAD_VERIFY_MERGE' continues the syntax checking.
0DF8 MERGE CALL #09EC,SIGN_MERGE Signal 'MERGEing'.
THE 'LOAD_VERIFY_MERGE' COMMAND ROUTINE
This routine checks the syntax of the LOAD, VERIFY and MERGE commands and executes it.
0DFB LD_VF_MR LD IX,#1AC3 Pointer to DFCA.
0DFF CALL #0AEF,EXPT_PARMS Evaluate & store all parameters.
0E02 CALL #0A00,TEST_STEAL If 'stealing' a file from a pupil, send
0E05 CALL NZ,#15CB,SEND_BLOCK the command block over the network.
0E08 CALL #0A05,TEST_NET
0E0B JR Z,#0E28,LD_VF_MR1 Jump if not using the network.
0E0D CALL #0AE1,TEST_STAT Check station number.
0E10 CALL #2960,JOPEN_N Open the "N" channel.
0E13 LD B,9 Length of a header.
0E15 LD HL,#1E29 Start of HEADER 2.
0E18 LD_ETC_N CALL #06F2,N_LBYT LOAD a byte from the network.
0E1B LD (HL),A Store it into UFIA 2.
0E1C INC HL
0E1D DJNZ #0E18,LD_ETC_N Repeat for all header bytes.
0E1F LD HL,#06F2,N_LBYT Store address of LOAD byte routine.
0E22 LD (#1DE8),HL
0E25 JP #0EBD,LD_ETC_R6
The routine continues here if the network isn't used.
0E28 LD_VF_MR1 CALL #2984,JTEST_DRV See if the drive is defined.
0E2B LD A,(#1E04)
0E2E CP "@"
0E30 JR NZ,#0E42,LD_ETC_RUN Jump if it wasn't a '@' command.
0E32 LD IX,(#1E15) Get address where sector is to be
0E36 CALL #0D19,GET_TR&SE loaded. Get track and sector number.
0E39 LD A,(#1E01) Get drive number.
0E3C CALL #1582,HRSAD Load the sector.
0E3F JP #0419,END Finished.
The routine continues here when a file is to be LOADed from disk.
0E42 LD_ETC_RUN CALL #299C,JHGFLE_2 Open the file for loading.
0E45 LD A,(#1E05)
0E48 CP 5
0E4A JR NZ,#0E5B,LD_ETC_R1 Jump if it isn't a 'Snapshot 48K'.
0E4C LD SP,#1FEA Use internal stack.
0E4F LD HL,16384 Start address and length of a 48K Snap.
0E52 LD DE,49152
0E55 CALL #29A5,JLOAD_FILE Load the file.
0E58 JP #01EE,SNAP_EXIT Exit via 'SNAP_EXIT'.
0E5B LD_ETC_R1 CP 9
0E5D JR NZ,#0E84,LD_ETC_R3 Jump if it isn't a 'Snapshot 128K'.
0E5F LD SP,#1FEA Use internal stack.
0E62 CALL #29A2,JLBYT Get the page configuration byte.
0E65 PUSH AF
0E66 AND #F8 Keep the RAM page bits only.
0E68 LD B,8 LOAD the eight RAM-pages.
0E6A LD_ETC_R2 PUSH AF
0E6B PUSH BC
0E6C CALL #003D,RAMPAGE_A Page in RAM bank.
0E6F LD HL,49152 Start address and length of each RAM
0E72 LD DE,16384 bank.
0E75 CALL #29A5,JLOAD_FILE 'LOAD DE bytes to HL'.
0E78 POP BC
0E79 POP AF
0E7A INC A Next RAM bank.
0E7B DJNZ #0E6A,LD_ETC_R2 Repeat for each RAM bank.
0E7D POP AF Retrieve page configuration.
0E7E CALL #003D,RAMPAGE_A Page in the right RAM, ROM and SCR$
0E81 JP #01EE,SNAP_EXIT bank, exit via 'SNAP_EXIT'.
0E84 LD_ETC_R3 CP 11
0E86 JR NZ,#0E8E,LD_ETC_R4 Jump if it isn't a 'Execute' file.
0E88 CALL #1BD6 Execute (this is the address of the
0E8B JP #0419,END disk buffer). Finished.
0E8E LD_ETC_R4 CALL #0DE1,LOAD_HEAD2 Load the header into UFIA2.
0E91 CALL #09FB,TEST_SERV
0E94 JR Z,#0EB7,LD_ETC_R5 Jump if not serving the network.
0E96 CALL #0924,OPEN_N_CH Open the "N" channel.
0E99 LD HL,#1E29 Point to the header info of UFIA2.
0E9C LD B,9 Nine header bytes.
0E9E LD_ETC_N1 LD A,(HL)
0E9F CALL #06FA,N_SBYT Send a byte over the network.
0EA2 INC HL
0EA3 DJNZ #0E9E,LD_ETC_N1 Repeat for all header bytes.
0EA5 LD DE,(#1E2A) Fetch the length of the file.
0EA9 LD_ETC_N2 LD A,D
0EAA OR E Send the EOF block over the network and
0EAB JP Z,#2975,JSEND_NEOF exit when there are no more bytes left.
0EAE CALL #29A2,JLBYT LOAD a byte from disk.
0EB1 CALL #06FA,N_SBYT And SAVE it over the network.
0EB4 DEC DE One byte less.
0EB5 JR #0EA9,LD_ETC_N2 Repeat for all bytes in the file.
0EB7 LD_ETC_R5 LD HL,#29A2,JLBYT Store address of LOAD byte routine.
0EBA LD (#1DE8),HL
0EBD LD_ETC_R6 LD A,(#1E10) Fetch type of program to be LOADed. Enter
0EC0 LD B,A here when LOADing from network.
0EC1 LD A,(#1E29) Fetch type of program found.
0EC4 CP B
0EC5 JP NZ,#2930,REP_8 Give an error if they aren't equal.
NOTE: The error 'Invalid FILE NAME' is given, maybe MGT have made a typing error.
'Wrong FILE type' is the right message.
0EC8 CP 3
0ECA JR Z,#0EDA,LD_ETC_R7 Jump if it's a 'CODE' file.
0ECC JP NC,#2930,REP_8 Give error if file type >= 4.
0ECF CALL #0A14,TEST_MERGE
0ED2 JR NZ,#0F45,MERGE_CTRL Jump if 'MERGEing'.
0ED4 CALL #0A19,TEST_VERIF Jump if not 'VERIFYing' (i.e. doing a
0ED7 JP Z,#0F61,LOAD_CTRL LOAD).
Now deal with loading of all files with type 3, like 'CODE' and 'SCREEN$', or verifying
of all file types.
0EDA LD_ETC_R7 CALL #0A14,TEST_MERGE
0EDD JP NZ,#293C,REP_14 Give error if 'MERGE .. CODE' was used.
0EE0 LD HL,(#1E11) Fetch length of requested file.
0EE3 LD DE,(#1E2A) Fetch length of file found.
0EE7 LD A,H
0EE8 OR L
0EE9 JR Z,#0EF8,LD_ETC_R8 Jump if length unspecified.
0EEB SBC HL,DE Jump if file to be LOADed is shorter
0EED JR NC,#0EF8,LD_ETC_R8 than or of equal length as the
0EEF CALL #0A0A,TEST_LOAD
0EF2 JP Z,#2938,REP_12 'VERIFY failed' if not LOADing.
0EF5 JP #293E,REP_15 'CODE error' otherwise.
0EF8 LD_ETC_R8 LD HL,(#1E13) Fetch start address from FILE_ADDR1
0EFB LD A,H
0EFC OR L
0EFD JR NZ,#0F02,LD_ETC_R9 Jump if a start address was specified.
0EFF LD HL,(#1E2C) Otherwise use the start address of the
0F02 LD_ETC_R9 LD A,(#1E29) But if the file is a BASIC program the
0F05 AND A start address is held in (PROG).
0F06 JR NZ,#0F0B,LD_ETC_R10
0F08 LD HL,(23635) Fetch 'start' from (PROG).
0F0B LD_ETC_R10 CALL #1000,LV_ANY Load the file.
0F0E CALL #0A19,TEST_VERIF
0F11 JP NZ,#0419,END Exit when 'VERIFYing'.
0F14 LD HL,(#1E17) Fetch execute address.
0F17 CALL #0F23,EXEC_CODE Use it if it was specified.
0F1A LD HL,(#1E30) Otherwise use the files execute
0F1D CALL #0F23,EXEC_CODE address.
0F20 JP #0419,END But if it hasn't one either, exit here.
THE 'EXECUTE CODE FILE' SUBROUTINE
This routine jumps to the address in the HL register pair (if it is valid) after
pushing the addresses of 'STMT_R_1' and 'STACK_BC'.
0F23 EXEC_CODE LD A,H
0F24 OR L
0F25 RET Z Return if the execute address is zero.
0F26 LD A,H
0F27 CP #FF
0F29 JR NZ,#0F2F,EXEC_CODE1
0F2B LD A,L Also return when the execute address is
0F2C CP #FF #FFFF.
0F2E RET Z
0F2F EXEC_CODE1 LD SP,(23613) Clear the stack. (ERR_SP)
0F33 LD (IY+0),255 Clear the error.
0F37 CALL #297B,JBORD_REST Restore the border colour.
0F3A LD BC,#1B7D,STMT_R_1 Return to 'STMT_R_1' in the 'main' ROM
0F3D PUSH BC when finished.
0F3E LD BC,#2D2B,STACK_BC Return to 'STMT_R_1' via 'STACK_BC'
0F41 PUSH BC also in the 'main' ROM.
0F42 JP #004F,UNPAGE_HL Jump to the execute address while
unpaging the DISCiPLE.
THE 'MERGE CONTROL' ROUTINE
This routine handles the MERGEing of a (BASIC) file. No test is made if the file is
an array when using the MERGE 'p'n syntax (see NOTE at 'LOAD CONTROL').
0F45 MERGE_CTRL LD BC,(#1E2A) Fetch the length of the program to be
0F49 PUSH BC MERGEd.
0F4A INC BC Extra location for the 'end marker'.
0F4B RST #10,CALBAS Call 'BC_SPACES' in the 'main' ROM to
0F4C DEFW #0030,BC_SPACES make the required room in workspace.
0F4E LD (HL),128 Mark the end.
0F50 EX DE,HL Move start pointer to HL.
0F51 POP DE Length to DE.
0F52 PUSH HL
0F53 CALL #1000,LV_ANY Load the file.
0F56 POP HL Fetch 'start' of new program.
0F57 LD DE,(23635) Fetch 'start' of old program (PROG).
0F5B RST #10,CALBAS Do the MERGEing by calling the 'main'
0F5C DEFW #08D2,ME_NEW_LP ROM 'MERGE' routine.
0F5E JP #0419,END Finished.
THE 'LOAD CONTROL' ROUTINE
This routine handles the LOADing of a BASIC program or an array.
NOTE: The Spectrum will crash when trying to LOAD or MERGE 'p' an array. The problem
starts in the 'HGFLE_2' ('OPEN A FILE FOR LOAD') subroutine in ROM (#358D) which is
called from the 'LD_ETC_RUN' routine at #0E42. Normally UFIA1 holds the parameters of
the existing array (if present), and UFIA2 holds the parameters of the array to be
loaded. But when the 'p' syntax is used, the 'HGFLE_2' routine makes the contents of
UFIA1 equal to UFIA2. The reclaiming at address #0F99 then fails, trying to reclaim
something which isn't there.
0F61 LOAD_CTRL LD DE,(#1E2A) Fetch 'new' length.
0F65 LD HL,(#1E13) Fetch 'old' start (=0 when loading a
0F68 PUSH HL 'new' array').
0F69 LD A,H
0F6A OR L
0F6B JR NZ,#0F73,LD_CTRL1 Jump if not a 'new' array.
0F6D INC DE Increment 'length' by 3, i.e. allows
0F6E INC DE for the insertion of array name and
0F6F INC DE two-byte length.
0F70 EX DE,HL Move 'length' to HL.
0F71 JR #0F7C,LD_CTRL2 Jump forward.
The array to be loaded replaces an existing array.
0F73 LD_CTRL1 LD HL,(#1E11) Fetch 'old' length (i.e. length of
existing program or array) from UFIA1.
0F76 EX DE,HL Move 'new' length to HL.
0F77 SCF Jump if the program or array to be
0F78 SBC HL,DE loaded isn't longer than the existing
0F7A JR C,#0F85,LD_CTRL3 one.
0F7C LD_CTRL2 LD DE,5 Otherwise a check must be made to
0F7F ADD HL,DE ensure that there is sufficient space
0F80 LD B,H in memory for the program (or array) to
0F81 LD C,L be loaded.
0F82 RST #10,CALBAS Make the check by calling the 'main'
0F83 DEFW #1F05,TEST_ROOM ROM 'TEST_ROOM' subroutine.
0F85 LD_CTRL3 POP HL Restore 'old' start (=0 when handling
0F86 LD A,(#1E29) a 'new' array).
0F89 AND A
0F8A JR Z,#0FBD,LD_PROG Jump if it's a BASIC program.
0F8C LD A,H
0F8D OR L Jump unless an 'old' array is to be
0F8E JR Z,#0F9B,LD_CTRL4 erased before loading the 'new' one.
0F90 DEC HL Points to high byte of 'array length'.
0F91 LD B,(HL) Fetch the 'length'.
0F92 DEC HL
0F93 LD C,(HL)
0F94 DEC HL Now points to the 'array name'.
0F95 INC BC Include 'length' and 'name' in the
0F96 INC BC array length.
0F97 INC BC
0F98 RST #10,CALBAS Call 'RECLAIM_2' in the 'main' ROM to
0F99 DEFW #19E8,RECLAIM_2 delete the array.
0F9B LD_CTRL4 LD HL,(23641) (E_LINE) points to the end of variables
0F9E DEC HL area+1.
0F9F LD BC,(#1E2A) Fetch length of array to be loaded.
0FA3 PUSH BC
0FA4 INC BC Include in the length one byte for the
0FA5 INC BC 'array name' and two bytes for the
0FA6 INC BC 'array length'.
0FA7 LD A,(#1E15) Fetch the array name from 'LENGTH1_2'.
0FAA PUSH AF
0FAB RST #10,CALBAS Call 'MAKE_ROOM' to create the space
0FAC DEFW #1655,MAKE_ROOM for the array.
0FAE INC HL Point to first 'new' location inserted.
0FAF POP AF
0FB0 LD (HL),A Store array name into first location.
0FB1 POP DE
0FB2 INC HL Store array length into the following
0FB3 LD (HL),E two locations.
0FB4 INC HL
0FB5 LD (HL),D
0FB6 INC HL
0FB7 CALL #1000,LV_ANY Load the file.
0FBA JP #0419,END Finished.
Now deal with the LOADing of a BASIC program and its variables.
0FBD LD_PROG LD DE,(23635) Fetch start of existing program. (PROG)
0FC1 LD HL,(23641) Fetch end of existing program. I.e.
0FC4 DEC HL (E_LINE)-1.
0FC5 RST #10,CALBAS Delete the program by calling
0FC6 DEFW #19E5,RECLAIM_1 'RECLAIM_1' in the 'main' ROM.
0FC8 LD BC,(#1E2A) Fetch length of program and variables.
0FCC LD HL,(23635) Fetch (PROG), start of a BASIC program.
0FCF RST #10,CALBAS Create the required space by calling
0FD0 DEFW #1655,MAKE_ROOM 'MAKE_ROOM'.
0FD2 INC HL Point to the first location.
0FD3 LD BC,(#1E2E) Fetch length without variables.
0FD7 ADD HL,BC Calculate and store the start of the
0FD8 LD (23627),HL variables area.
0FDB LD A,(#1E31) When no autostart is known this
0FDE LD H,A ('AUTOSTART2-hi') holds #FF.
0FDF AND #C0
0FE1 JR NZ,#0FEE,LD_PROG1 Jump with no autostart.
0FE3 LD A,(#1E30) Otherwise store the autostart line
0FE6 LD L,A number into 'NEWPPC' and clear 'NSPPC'.
0FE7 LD (23618),HL These hold the line and the statement
0FEA LD (IY+10),0 to be executed respectively.
0FEE LD_PROG1 LD HL,(23635) Fetch the start of the BASIC program.
0FF1 LD DE,(#1E2A) Fetch the length + variables.
0FF5 DEC HL Reset the DATA pointer 'DATADD' to the
0FF6 LD (23639),HL beginning of the program.
0FF9 INC HL Balance the 'DEC HL'.
0FFA CALL #1000,LV_ANY Load the file.
0FFD JP #0419,END Finished.
THE 'LOAD OR VERIFY' SUBROUTINE
This subroutine is used to LOAD or VERIFY (signalled by FLAGS3) a block of bytes.
It must be entered with HL and DE holding 'start' and 'length'.
1000 LV_ANY LD A,D
1001 OR E
1002 RET Z Return if 'length' is zero.
1003 CALL #0A19,TEST_VERIF
1006 JR NZ,#1019,LV_ANY3 Jump if 'VERIFYing'.
1008 CALL #0A05,TEST_NET
100B JR NZ,#1019,LV_ANY3 Jump if 'using the network'.
100D JP #29A5,JLOAD_FILE Otherwise load the file.
1010 LV_ANY1 CP (HL) The actual VERIFY, i.e. compare the
fetched byte with that held in memory.
1011 JP NZ,#2938,REP_12 Give an error if they don't match.
1014 LV_ANY2 INC HL Next memory address.
1015 DEC DE One byte less to go.
1016 LD A,D
1017 OR E
1018 RET Z Exit if no more bytes left.
1019 LV_ANY3 PUSH HL
101A PUSH DE
101B CALL #1028,JP_(#1DE8) Load one byte with appropriate routine.
101E POP DE
101F POP HL
1020 CALL #0A19,TEST_VERIF
1023 JR NZ,#1010,LV_ANY1 Jump if VERIFYing.
1025 LD (HL),A Otherwise store the byte.
1026 JR #1014,LV_ANY2 Repeat for all bytes.
THE 'JUMP TO (#1DE8)' SUBROUTINE
This small subroutine jumps to the routine pointed to by the contents of #1DE8. It
is used by the 'LV_ANY' routine above to fetch a byte for LOADing (from the network)
1028 JP_(#1DE8) LD HL,(#1DE8) Fetch the jump address and jump to it.
102B JP (HL)
THE 'FORMAT' COMMAND SYNTAX ROUTINE
This routine tests if the command has the appropriate syntax.
102C FORMAT RST #28,NEXT_C_RAM Advance CH_ADD to next character.
102D AND #DF Only capitals.
102F CP "N"
1031 JR NZ,#1045,FORMAT_SD Jump if the character wasn't a "N".
1033 CALL #0A5E,EXPT_DEVN Evaluate the station number.
1036 CALL #0409,ST_END_RAM Confirm end of statement and exit
during syntax checking.
1039 CALL #0AE1,TEST_STAT Check the station number.
103C LD A,(#1E01) Fetch station number and
103F LD (#029C),A store it into the system var. 'NSTAT'.
1042 JP #0419,END Finished.
Now check if it is one of the format disk commands.
1045 FORMAT_SD CP "S"
1047 JR NZ,#105B,FORMAT_D Jump if it wasn't "S".
1049 RST #28,NEXT_C_RAM Next character.
104A AND #DF Only capitals.
104C CP "D"
104E JP NZ,#2920,REP_0 Give an error if not a "D".
1051 LD A,(#1DDA) Fetch current control port state.
1054 OR #04 Set 'Single Density'.
1056 LD (#1DDA),A
1059 JR #1068,FORMAT_1
105B FORMAT_D CP "D"
105D JP NZ,#2920,REP_0 Give an error if not a "D".
1060 LD A,(#1DDA)
1063 AND #FB Set 'Double Density'.
1065 LD (#1DDA),A
1068 FORMAT_1 RST #28,NEXT_C_RAM Next character.
1069 CP 13
106B JR NZ,#1070,FORMAT_2 Jump if it isn't a carriage return.
106D JP #0419,END Finished?
NOTE: It seems that there are two undocumented FORMAT commands, 'FORMAT sd' and
'FORMAT d' followed by 'ENTER'. They set or reset the single/double density bit of
the control port state respectively.
1070 FORMAT_2 CALL #0A76,EXPT_DEVN2 Evaluate the drive number.
1073 CP 204 Jump if the current character isn't
1075 JR NZ,#1081,FORMAT_3 'TO'.
1077 CALL #0AA2,SWAP_UFIAS Exchange UFIA1 and UFIA2.
107A RST #28,NEXT_C_RAM Update CH_ADD.
107B CALL #0A76,EXPT_DEVN2 Evaluate 2nd drive number.
107E CALL #0AA2,SWAP_UFIAS Exchange UFIA's again.
1081 FORMAT_3 CALL #0409,ST_END_RAM Confirm end of statement and exit when
1084 CALL #2984,JTEST_DRV Check if the drive is defined.
1087 RST #10,CALBAS
1088 DEFW #0D6E,CLS_LOWER Clear lower screen area.
108A SET 5,(IY+2) Signal 'lower screen has to be
108E CALL #29AB,JSURE_MSG Print 'Are you SURE ? (y/n)' message.
1091 CALL #298A,JTEST_Y Wait for a key, Zero set means 'Y'
1094 JP NZ,#0419,END pressed. Finished when not sure.
1097 CALL #298D,JFRMT_RUN Otherwise FORMAT the disk.
109A JP #0419,END Finished.