The Microsoft MACRO Assembler , Version 1.27 Page 1-1 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1 Page 55,132 2 Title FREECOPY Version 1.13 (C)Copyright 1984 3 ;*********************** F R E E C O P Y ****************************** 4 ;* * 5 ;* Program: FREECOPY * 6 ;* * 7 ;* Author: Donald L. Buresh, C.D.P. * 8 ;* Squire Buresh Associates, Inc. * 9 ;* Post Office Box 112 * 10 ;* Millbury, MA 01527 * 11 ;* (617) 865-3435 * 12 ;* * 13 ;* !!!!!!!!!!!!!!!!!!!!!! N O T I C E !!!!!!!!!!!!!!!!!!!!!! * 14 ;* * 15 ;* A limited license is granted to all users of this program to * 16 ;* make copies of this source code and to distribute them to * 17 ;* other users under the following conditions: * 18 ;* * 19 ;* 1. The notice contained in the variable MES00_Copy_Notice * 20 ;* is not to be altered, bypassed or removed. * 21 ;* * 22 ;* 2. The program is not to be distributed to others in * 23 ;* modified form. * 24 ;* * 25 ;* 3. If you think that this program has helped you, we request * 26 ;* a $25.00 contribution. * 27 ;* * 28 ;* 4. No other fee is to be charged or any consideration received * 29 ;* for copying or distributing the program without the * 30 ;* expressed written permission of Squire Buresh Assoc, Inc. * 31 ;* * 32 ;* * 33 ;* (C) Copyright 1984 Squire Buresh Associates, Inc. * 34 ;* * 35 ;************************************************************************  The Microsoft MACRO Assembler , Version 1.27 Page 1-2 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 36 Page 37 ;************************************************************************ 38 ;* * 39 ;* REVISION HISTORY * 40 ;* * 41 ;* Version * 42 ;* Number Date Comments * 43 ;* * 44 ;* 1.00 16-SEP-84 This is the first version of FREECOPY * 45 ;* * 46 ;* 1.01 13-OCT-84 Corrected a problem when copying * 47 ;* diskettes on 512K systems. Reversed * 48 ;* the order of testing the ES:BX table * 49 ;* counter and the read/write track * 50 ;* counter. Fix was near C2005, C2006, * 51 ;* C2105 and C2106. * 52 ;* * 53 ;* 1.02 13-OCT-84 Flushed the standard input keyboard * 54 ;* buffer before accepting a character. * 55 ;* Fix was near U1101 and U1102. * 56 ;* * 57 ;* 1.03 21-OCT-84 Added parsing a tab character on the * 58 ;* command line. Fix was below C1215. * 59 ;* * 60 ;* 1.04 - 1.09 These versions never really existed in * 61 ;* any decent form. They are incorporated * 62 ;* into fixing the memory allocation * 63 ;* problems stemming from the original * 64 ;* version of FREECOPY. * 65 ;* * 66 ;* 1.10 02-FEB-85 Allocated and freed memory when running * 67 ;* FREECOPY under PC-DOS versions 2.00 * 68 ;* and greater. The fix involved finding * 69 ;* out the version of the operating system,* 70 ;* allocating the memory, establishing * 71 ;* the ES:BX table entries and freeing * 72 ;* memory before returning control to * 73 ;* PC-DOS. * 74 ;* * 75 ;* 1.11 06-JUN-85 Modified the sequence of turning inter- * 76 ;* rupts on and off in the S1000 and S1100 * 77 ;* modules. * 78 ;* * 79 ;* 1.12 06-JUN-85 Allowed users to write more than one * 80 ;* target diskette, by setting FLG17 to * 81 ;* True and jumping to B1105A after ini- * 82 ;* tializing the appropriate variables. * 83 ;* * 84 ;* 1.13 07-JUN-85 Fixed a stack imbalance that appeared * 85 ;* only when running PC-DOS 3.00 on a PC *  The Microsoft MACRO Assembler , Version 1.27 Page 1-3 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 86 ;* rather than on an XT or AT * 87 ;* * 88 ;************************************************************************  The Microsoft MACRO Assembler , Version 1.27 Page 1-4 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 89 Page 90 ;************************************************************************ 91 ;* * 92 ;* EQUATES * 93 ;* * 94 ;* The constants defined below are used to to specify: * 95 ;* * 96 ;* o Disk commands, * 97 ;* * 98 ;* o Keyboard commands, * 99 ;* * 100 ;* o Video commands * 101 ;* * 102 ;* o Miscellaneous parameters, * 103 ;* * 104 ;* o Various ASCII characters. * 105 ;* * 106 ;************************************************************************ 107 ; 108 = 0078 Disk_Parameter_Addr Equ 001EH*4 ; Address of Disk Parameter Table 109 ; 110 = 0000 Reset_Command Equ 0000D ; Diskette reset command 111 = 0001 Status_Command Equ 0001D ; Diskette status command 112 = 0002 Read_Command Equ 0002D ; Diskette read command 113 = 0003 Write_Command Equ 0003D ; Diskette write command 114 = 0004 Verify_Command Equ 0004D ; Diskette verify command 115 = 0005 Format_Command Equ 0005D ; Diskette format command 116 ; 117 = 0080 Time_Out_Error Equ 0080H ; Diskette error codes 118 = 0040 Seek_Error Equ 0040H ; . 119 = 0020 Controller_Error Equ 0020H ; . 120 = 0010 CRC_Error Equ 0010H ; . 121 = 0009 DMA_Boundary_Error Equ 0009H ; . 122 = 0008 DMA_Error Equ 0008H ; . 123 = 0004 Sector_Error Equ 0004H ; . 124 = 0003 Write_Protect_Error Equ 0003H ; . 125 = 0002 Address_Mark_Error Equ 0002H ; . 126 = 0001 Command_Error Equ 0001H ; ..End 127 ; 128 = A000 Video_Address Equ 0A000H ; Starting segment addr of Video RAM 129 ; 130 = 0000 Set_Mode_Command Equ 0000D ; Set the video mode 131 = 0001 Set_CType_Command Equ 0001D ; Set the cursor type 132 = 0002 Set_CPos_Command Equ 0002D ; Set the cursor position 133 = 0003 Read_Cursor_Command Equ 0003D ; Get cursor position and attributes 134 = 0004 Read_LPen_Command Equ 0004D ; Get the light pen position 135 = 0005 Set_ADPage_Command Equ 0005D ; Set the active display page 136 = 0006 Scroll_Up_Command Equ 0006D ; Scrool up or blank a portion of 137 ; . the video display 138 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-5 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 139 Page 140 ;************************************************************************ 141 ;* * 142 ;* EQUATES Page 2 * 143 ;* * 144 ;************************************************************************ 145 ; 146 = 0007 Scroll_Down_Command Equ 0007D ; Scroll down or blank a portion 147 ; . of the video display 148 = 0008 Read_AChar_Command Equ 0008D ; Read the attribute and character 149 = 0009 Write_AChar_command Equ 0009D ; Write the attribute and character 150 = 000A Write_Char_Command Equ 0010D ; Write the character only 151 = 000B Set_Color_Command Equ 0011D ; Set the color pallette 152 = 000C Write_Dot_Command Equ 0012D ; Write a pixel to a graphics screen 153 = 000D Read_Dot_Command Equ 0013D ; Read a pixel from a graphics screen 154 = 000E Write_TTY_Command Equ 0014D ; Write a character with automatic 155 ; . processing for LF, CR, Bell & BS 156 = 000F Video_State_Command Equ 0015D ; Get the current video state 157 ; 158 = 0007 Read_Keyboard_Command Equ 0007D ; Reads character from the keyboard 159 = 000C Flush_Keyboard_Command Equ 0012D ; Clears the standard keyboard buffer 160 = 0030 Get_DOS_Version_Number Equ 0030H ; Gets the current version of PC-DOS 161 = 0048 Allocate_Memory Equ 0048H ; Allocate a block of memory 162 = 0049 Free_Memory Equ 0049H ; Free a block of memory 163 = 004A Modify_Memory_Block Equ 004AH ; Modify the size of memory block 164 ; 165 = 0019 Default_Drive_Command Equ 0025D ; Get PC DOS default drive number 166 ; 167 = 0010 Video_Interrupt Equ 0010H ; Interrupt 10H for video calls 168 = 0011 Equipment_Interrupt Equ 0011H ; Interrupt 11H for equipment 169 = 0013 Disk_Interrupt Equ 0013H ; Interrupt 13H for disk calls 170 = 0021 PC_DOS_Interrupt Equ 0021H ; Interrupt 21H for PC DOS calls 171 ; 172 = C000 Parallel_Ports_Mask Equ 0C000H ; Equipment masks 173 = 0100 Game_Adapters_Mask Equ 00100H ; . 174 = 0E00 RS232_Ports_Mask Equ 00E00H ; . 175 = 00C0 Disk_Drives_Mask Equ 000C0H ; . 176 = 0030 Init_Video_Mask Equ 00030H ; . 177 = 000C Planar_RAM_Mask Equ 0000CH ; . 178 = 0001 IPL_Diskette_Mask Equ 00001H ; ..End 179 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-6 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 180 Page 181 ;************************************************************************ 182 ;* * 183 ;* EQUATES Page 3 * 184 ;* * 185 ;************************************************************************ 186 ; 187 = 019A Command_Com_Size Equ 0410D ; Size of various tables and programs 188 = 00B4 CHRN_Table_Size Equ 0180D ; in 16 byte paragraphs 189 ; . 190 ; . 191 = 0014 ESBX_Table_Size Equ 0020D ; . 192 ; . 193 ; . 194 = 0020 FAT_Sector_Size Equ 0032D ; ..End 195 ; 196 = 0FFF DMA_Boundary_Mask Equ 0FFFH ; Mask to isolate the high nibble of 197 ; . the ES segment address 198 ; 199 = 00FF Invalid_Drive Equ 0255D ; Invalid drive parameter 200 = 0003 Maximum_Drives Equ 0003D ; Maximum number of floppy drives 201 = 0000 Minimum_Drives Equ 0000D ; Minimum number of floppy drives 202 ; 203 = 0200 Sector_Size Equ 0512D ; Number of bytes per sector 204 = 0010 Paragraph_Size Equ 0016D ; Number of bytes per paragraph 205 = 0005 Number_of_Retries Equ 0005D ; Number of attempts to copy 206 ; . a track before admitting failure 207 = 0027 Final_Track Equ 0039D ; The last track on a PC DOS diskette 208 ; 209 = 00FE One_Side_Eight_Sectors Equ 00FEH ; First entry in the File Allocation 210 = 00FF Two_Sides_Eight_Sectors Equ 00FFH ; Table (FAT) 211 = 00FC One_Side_Nine_Sectors Equ 00FCH ; . 212 = 00FD Two_Sides_Nine_Sectors Equ 00FDH ; . 213 = 00F8 Fixed_Disk Equ 00F8H ; ..End 214 ; 215 = 0050 Keyboard_Buffer_Size Equ 0080D ; Maximum number of characters in 216 ; . the keyboard buffer 217 ; 218 = 0120 Minimum_Memory_Size Equ 0288D ; Minimum memory size in 16 byte 219 ; . paragraphs to hold a nine 220 ; . sectored track 221 ; 222 = 0F0F Blank_Cursor Equ 0F0FH ; Blank cursor value 223 = 0D0D Underline_Cursor Equ 0D0DH ; Underline cursor value 224 ; 225 = 0000 False Equ 0000D ; Incorrect processing occured 226 =-0001 True Equ Not False ; Correct processing occured 227 = FFFF High_Values Equ 0FFFFH ; High values 228 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-7 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 229 Page 230 ;************************************************************************ 231 ;* * 232 ;* EQUATES Page 4 * 233 ;* * 234 ;************************************************************************ 235 ; 236 = 0000 NUL Equ 0000D ; Null character 237 = 0001 SOH Equ 0001D ; SOH character 238 = 0002 STX Equ 0002D ; STX character 239 = 0003 ETX Equ 0003D ; Control Break character 240 = 0007 Bell Equ 0007D ; Bell character 241 = 0008 BS Equ 0008D ; Backspace character 242 = 0009 HT Equ 0009D ; Horizontal tab character 243 = 000A LF Equ 0010D ; Line feed character 244 = 000D CR Equ 0013D ; Carriage return character 245 = 0020 Space Equ 0032D ; Space or blank character 246 = 002F Slash Equ 0047D ; Slash character 247 = 0030 Zero_Digit Equ 0048D ; Digit Zero 248 = 0031 One_Digit Equ 0049D ; Digit One 249 = 0041 Capital_Letter_A Equ 0065D ; Capital letter A 250 = 004E Capital_Letter_N Equ 0078D ; Capital letter N 251 = 0059 Capital_Letter_Y Equ 0089D ; Capital letter Y 252 = 006E Small_Letter_n Equ 0110D ; Small letter n 253 = 0079 Small_Letter_y Equ 0121D ; Small letter y 254 = 00FF EOT Equ 0255D ; End of text character 255 ; 256 =-0001 Minus_One Equ -1D ; Numbers used in FREECOPY 257 = 0000 Zero Equ 0000D ; . 258 = 0001 One Equ 0001D ; . 259 = 0002 Two Equ 0002D ; . 260 = 0003 Three Equ 0003D ; . 261 = 0004 Four Equ 0004D ; . 262 = 0006 Six Equ 0006D ; . 263 = 0008 Eight Equ 0008D ; . 264 = 0009 Nine Equ 0009D ; . 265 = 000A Ten Equ 0010D ; . 266 = 000B Eleven Equ 0011D ; . 267 = 000C Twelve Equ 0012D ; . 268 = 000E Fourteen Equ 0014D ;. 269 = 000F Fifteen Equ 0015D ; . 270 = 0018 Twenty_Four Equ 0024D ; . 271 = 0019 Twenty_Five Equ 0025D ; . 272 = 0022 Thirty_Four Equ 0034D ; . 273 = 0024 Thirty_Six Equ 0036D ; . 274 = 0027 Thirty_Nine Equ 0039D ; . 275 = 004F Seventy_Nine Equ 0079D ; ..End 276 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-8 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 277 Page 278 ;************************************************************************ 279 ;* * 280 ;* CSEG Segment * 281 ;* * 282 ;* This segment contains all of the code of the program. It is * 283 ;* named CSEG because this name conforms with ASM-86. * 284 ;* * 285 ;************************************************************************ 286 ; 287 0000 CSEG Segment Para Public 'CSEG' 288 Assume CS:CSEG,DS:CSEG,ES:CSEG,SS:Nothing 289 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-9 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 290 Page 291 ;************************************************************************ 292 ;* * 293 ;* PROGRAM SEGMENT PREFIX * 294 ;* * 295 ;* The first 256 bytes of every program executed under PC DOS * 296 ;* contains a Program Segment Prefix control block. The data * 297 ;* stored in this block of memory is used by FREECOPY to process * 298 ;* the parameters when invoking the program. * 299 ;* * 300 ;************************************************************************ 301 ; 302 005C Org 05CH 303 005C Source_Drive Label Byte ; Source diskette drive number 304 005D Org 05DH 305 005D Source_Filename Label Byte ; Source diskette filename 306 0068 Org 068H 307 0068 Source_Filler_Area Label Byte 308 006C Org 06CH 309 006C Target_Drive Label Byte ; Target diskette drive number 310 006D Org 06DH 311 006D Target_Filename Label Byte ; Target diskette filename 312 0078 Org 078H 313 0078 Target_Filler_Area Label Byte 314 0080 Org 080H 315 0080 Parameter_Count Label Byte ; Number of parameters 316 0081 Org 081H 317 0081 Parameter_String Label Byte ; String entered by the user 318 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-10 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 319 Page 320 ;************************************************************************ 321 ;* * 322 ;* A1000_MAIN_MODULE * 323 ;* * 324 ;* This is the top level of FREECOPY and it controls the flow of * 325 ;* the program. The first sequence of commands in the routine * 326 ;* preserve the state of the machine. Next, there is a set of * 327 ;* three (3) calls to sub-modules that control the initial * 328 ;* processing, detail processing and final processing. Finally, * 329 ;* FREECOPY restores the state of the machine an returns to * 330 ;* PC DOS via INT 20H. * 331 ;* * 332 ;************************************************************************ 333 ; 334 0100 Org 0100H 335 ; 336 Public A1000_Main_Module 337 ; 338 0100 A1000_Main_Module Proc Far 339 ; 340 0100 A1001: 341 0100 FA Cli ; Set up the top of the stack 342 0101 BC 15AE R Mov SP,Offset MEM04_Top_of_the_Stack 343 0104 FB Sti ; ..End 344 ; 345 0105 55 Push BP ; Save the state of the machine 346 0106 1E Push DS ; . 347 0107 06 Push ES ; . 348 0108 16 Push SS ; . 349 0109 50 Push AX ; . 350 010A 53 Push BX ; . 351 010B 51 Push CX ; . 352 010C 52 Push DX ; . 353 010D 56 Push SI ; . 354 010E 57 Push DI ; . 355 010F 9C Pushf ; ..End 356 ; 357 0110 FA Cli ; Save the current stack pointer 358 0111 89 26 1519 R Mov Word Ptr SYS15_Stack_Pointer,SP 359 0115 83 06 1519 R 02 Add Word Ptr SYS15_Stack_Pointer,Two ; . 360 011A FB Sti ; ..End 361 ; 362 011B E8 013F R Call B1000_Initial_Process ; Main flow of control 363 011E 80 3E 0E21 R 00 Cmp Byte Ptr FLG01_Good_Command,False 364 0123 74 0A Je A1002 ; . 365 0125 80 3E 0E23 R 00 Cmp Byte Ptr FLG03_Default_Drive,False 366 012A 74 03 Je A1002 ; . 367 012C E8 01A3 R Call B1100_Detail_Process ; . 368 012F A1002: ; .  The Microsoft MACRO Assembler , Version 1.27 Page 1-11 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 369 012F E8 02CE R Call B1200_Final_Process ; ..End 370 0132 A1090: 371 0132 9D Popf ; Restore the state of the machine 372 0133 5F Pop DI ; . 373 0134 5E Pop SI ; . 374 0135 5A Pop DX ; . 375 0136 59 Pop CX ; . 376 0137 5B Pop BX ; . 377 0138 58 Pop AX ; . 378 0139 17 Pop SS ; . 379 013A 07 Pop ES ; . 380 013B 1F Pop DS ; . 381 013C 5D Pop BP ; ..End 382 013D A1099: 383 013D CD 20 Int 20H ; Return to PC DOS 384 ; 385 013F A1000_Main_Module Endp 386 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-12 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 387 Page 388 ;************************************************************************ 389 ;* * 390 ;* B1000_INITIAL_PROCESS * 391 ;* * 392 ;* This module performs the following functions after control * 393 ;* passess to FREECOPY: * 394 ;* * 395 ;* 1. Sets up the Disk Parameter Table. * 396 ;* * 397 ;* 2. Gets the current PC-DOS version number. * 398 ;* * 399 ;* 3. Initializes various parameters. * 400 ;* * 401 ;* 4. Gets and sets the video mode. * 402 ;* * 403 ;* 5. Displays the intiial message. * 404 ;* * 405 ;* 6. Parses the command line entered by a user. * 406 ;* * 407 ;* 7. Determines the amount of equipment on the machine. * 408 ;* * 409 ;* 8. Validates the number of disk drives on the system. * 410 ;* * 411 ;* 9. Displays the appropriate disk copying message. * 412 ;* * 413 ;* 10. Gets the amount of available memory. * 414 ;* * 415 ;* 11. Calculates the number and position of the entries in the * 416 ;* ES:BX buffer address table. * 417 ;* * 418 ;************************************************************************ 419 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-13 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 420 Page 421 ; 422 Public B1000_Initial_Process 423 ; 424 013F B1000_Initial_Process Proc Near 425 ; 426 013F B1001: 427 013F E8 0C29 R Call S1000_Setup_Disk_Param_Table 428 0142 E8 0C6D R Call S1200_Get_Version_Number 429 ; 430 0145 C6 06 0E21 R FF Mov Byte Ptr FLG01_Good_Command,True 431 014A C6 06 0E22 R FF Mov Byte Ptr FLG02_Double_Side,True 432 014F C6 06 0E23 R FF Mov Byte Ptr FLG03_Default_Drive,True 433 0154 C6 06 0E24 R FF Mov Byte Ptr FLG04_Single_Drive,True 434 0159 C6 06 0E27 R FF Mov Byte Ptr FLG07_First_Time,True 435 015E C6 06 0E30 R FF Mov Byte Ptr FLG16_Free_Memory,True 436 0163 C6 06 0E31 R 00 Mov Byte Ptr FLG17_Copy_More_Disks,False 437 0168 B1002: 438 0168 E8 02ED R Call C1000_Get_And_Set_Video ; Get and set current video state 439 016B E8 030A R Call C1100_Display_Intro ; Display the intial screen 440 016E E8 0311 R Call C1200_Parse_Commands ; Parse the command line entered 441 ; . by the user 442 0171 80 3E 0E21 R 00 Cmp Byte Ptr FLG01_Good_Command,False 443 0176 74 2A Je B1099 ; If false, go to end of the module 444 0178 E8 03E1 R Call C1300_Get_Equipment ; Find out the equipment on the PC 445 017B E8 0434 R Call C1400_Validate_Drives ; Validate the drive numbers 446 017E 80 3E 0E23 R 00 Cmp Byte Ptr FLG03_Default_Drive,False 447 0183 74 1D Je B1099 ; If false, go to end of the module 448 0185 E8 04A1 R Call C1500_Diskette_Messages ; Display the appropriate messages 449 ; 450 0188 80 3E 152A R 00 Cmp Byte Ptr SYS19_Major_Vers_Number,Zero 451 018D 75 06 Jne B1003 ; Get available memory in paragraphs 452 018F E8 04E7 R Call C1600A_Get_Free_Memory ; . and create the ES:BX table 453 0192 EB 04 90 Jmp B1004 ; . 454 0195 B1003: ; . 455 0195 E8 0589 R Call C1600B_Get_Free_Memory ; . 456 0198 B1004: ; . 457 0198 80 3E 0E21 R 00 Cmp Byte Ptr FLG01_Good_Command,False 458 019D 74 03 Je B1099 ; . 459 019F E8 05DD R Call C1700_Create_ESBX_Table; ..End 460 01A2 B1099: 461 01A2 C3 Ret 462 ; 463 01A3 B1000_Initial_Process Endp 464 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-14 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 465 Page 466 ;************************************************************************ 467 ;* * 468 ;* B1100_DETAIL_PROCESS * 469 ;* * 470 ;* This module performs the following functions when copying one * 471 ;* or more diskettes: * 472 ;* * 473 ;* 1. Initializes various parameters. * 474 ;* * 475 ;* 2. Validates the contents of the source diskette. * 476 ;* * 477 ;* 3. Creates all of the entries of the CHRN table used in * 478 ;* formatting the target diskette. * 479 ;* * 480 ;* 4. Reads the tracks of the source diskette. * 481 ;* * 482 ;* 5. If the diskette is being copied on only one drive, the * 483 ;* routines asks the user to enter the target diskette. * 484 ;* * 485 ;* 6. Writes the tracks on the target diskette. * 486 ;* * 487 ;* 7. If FREECOPY is finished copying the source diskette, the * 488 ;* program asks whether to write another target diskette, * 489 ;* provided the source diskette fits completely in memory; * 490 ;* otherwise, the program asks whether to copy a new diskette. * 491 ;* If not, the module returns to A1000_Main_Module. If so, * 492 ;* control transfers to 1. * 493 ;* * 494 ;* 8. If FREECOPY is not completed copying the source diskette, * 495 ;* control transfers to 4. * 496 ;* * 497 ;************************************************************************ 498 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-15 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 499 Page 500 ; 501 Public B1100_Detail_Process 502 ; 503 01A3 B1100_Detail_Process Proc Near 504 ; 505 01A3 B1101: 506 01A3 C6 06 14F9 R 00 Mov Byte Ptr WRK20_Current_Source_Head,Zero 507 01A8 C6 06 14FA R 00 Mov Byte Ptr WRK21_Current_Source_Track,Zero 508 01AD C6 06 14FB R 00 Mov Byte Ptr WRK22_Current_Target_Head,Zero 509 01B2 C6 06 14FC R 00 Mov Byte Ptr WRK23_Current_Target_Track,Zero 510 01B7 C7 06 1506 R 16F0 R Mov Word Ptr WRK33_CHRN_Table_Address,Offset MEM02_CHRN_Table 511 01BD C6 06 0E2D R FF Mov Byte Ptr FLG13_First_Read_Write,True 512 01C2 C6 06 0E2E R 00 Mov Byte Ptr FLG14_Copy_Complete,False 513 01C7 C6 06 0E2F R 03 Mov Byte Ptr FLG15_IO_Error,Three 514 01CC B1102: 515 01CC E8 0679 R Call C1800_Validate_Source_Disk 516 01CF 80 3E 0E28 R FF Cmp Byte Ptr FLG08_Good_Read,True 517 01D4 74 10 Je B1103 ; If it is a valid source, continue 518 01D6 BE 0FF5 R Mov SI,Offset MES07_Correct_And_Press_Key 519 01D9 E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 520 01DC C6 06 0E25 R 00 Mov Byte Ptr FLG05_Store_Buffer,False 521 01E1 E8 0C9B R Call U1100_Get_Response ; Get the user's response 522 01E4 EB BD Jmp B1101 ; Go back and try again 523 01E6 B1103: 524 01E6 E8 07E9 R Call C1900_Create_CHRN_Table 525 01E9 B1104: 526 01E9 E8 0829 R Call C2000_Read_Source_Disk 527 01EC 80 3E 0E28 R FF Cmp Byte Ptr FLG08_Good_Read,True 528 01F1 74 10 Je B1105 ; If read disk correctly, continue 529 01F3 BE 0FF5 R Mov SI,Offset MES07_Correct_And_Press_Key 530 01F6 E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 531 01F9 C6 06 0E25 R 00 Mov Byte Ptr FLG05_Store_Buffer,False 532 01FE E8 0C9B R Call U1100_Get_Response ; Get the user's response 533 0201 EB A0 Jmp B1101 ; Go back and try again 534 0203 B1105: 535 0203 80 3E 0E24 R 00 Cmp Byte Ptr FLG04_Single_Drive,False 536 0208 74 1C Je B1106 ; If a single drive copy, continue 537 020A B1105A: 538 020A BE 1066 R Mov SI,Offset MES10_Insert_Target 539 020D A0 1488 R Mov AL,Byte Ptr WRK02_Target_Drive 540 0210 04 41 Add AL,Capital_Letter_A ; Put drive letter into AL 541 0212 88 44 22 Mov [SI+Thirty_Four],AL ; Put the drive letter into the 542 ; . correct position in the message 543 0215 E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 544 0218 BE 1140 R Mov SI,Offset MES16_Press_Any_Key 545 021B E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 546 021E C6 06 0E25 R 00 Mov Byte Ptr FLG05_Store_Buffer,False 547 0223 E8 0C9B R Call U1100_Get_Response ; Get the user's response 548 0226 B1106:  The Microsoft MACRO Assembler , Version 1.27 Page 1-16 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 549 0226 E8 090D R Call C2100_Write_Format_Target_Disk 550 0229 80 3E 0E29 R 00 Cmp Byte Ptr FLG09_Good_Write,False 551 022E 74 4E Je B1110 ; If bad write, go to bottom of loop 552 0230 80 3E 0E2B R 00 Cmp Byte Ptr FLG11_Good_Format,False 553 0235 74 47 Je B1110 ; If bad format, go to bottom of loop 554 0237 B1107: 555 0237 80 3E 0E2E R FF Cmp Byte Ptr FLG14_Copy_Complete,True 556 023C 74 35 Je B1109 ; If copy done, go to bottom of loop 557 023E 80 3E 0E24 R 00 Cmp Byte Ptr FLG04_Single_Drive,False 558 0243 74 1C Je B1108 ; If double drive copy, continue 559 0245 BE 103E R Mov SI,Offset MES09_Insert_Source 560 0248 A0 1487 R Mov AL,Byte Ptr WRK01_Source_Drive 561 024B 04 41 Add AL,Capital_Letter_A ; Put the drive letter into AL 562 024D 88 44 22 Mov [SI+Thirty_Four],AL ; Put the drive letter into the 563 ; . correct position in the message 564 0250 E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 565 0253 BE 1140 R Mov SI,Offset MES16_Press_Any_Key 566 0256 E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 567 0259 C6 06 0E25 R 00 Mov Byte Ptr FLG05_Store_Buffer,False 568 025E E8 0C9B R Call U1100_Get_Response ; Get the user's response 569 0261 B1108: 570 0261 E8 09E4 R Call C2200_Check_File_Alloc_Table 571 0264 80 3E 0E2C R 00 Cmp Byte Ptr FLG12_Good_FAT,False 572 0269 74 13 Je B1110 ; If bad FAT, go to bottom of loop 573 026B C6 06 0E2D R 00 Mov Byte Ptr FLG13_First_Read_Write,False 574 0270 E9 01E9 R Jmp B1104 ; Go back and read some more 575 0273 B1109: 576 0273 C6 06 0E27 R 00 Mov Byte Ptr FLG07_First_Time,False 577 0278 BE 0F3C R Mov SI,Offset MES02_Copy_Complete 578 027B E8 0C7D R Call U1000_Display_Message 579 027E B1110: 580 027E 80 3E 0E31 R 00 Cmp Byte Ptr FLG17_Copy_More_Disks,False 581 0283 74 32 Je B1111 582 0285 BE 0EF6 R Mov SI,Offset MES01A_Write_Another_Diskette 583 0288 E8 0C7D R Call U1000_Display_Message 584 028B E8 0D43 R Call U1200_Get_Yes_or_No 585 028E 80 3E 0E26 R 00 Cmp Byte Ptr FLG06_Yes_or_No,False 586 0293 74 22 Je B1111 ; Continue 587 0295 C6 06 14FB R 00 Mov Byte Ptr WRK22_Current_Target_Head,Zero 588 029A C6 06 14FC R 00 Mov Byte Ptr WRK23_Current_Target_Track,Zero 589 029F C7 06 1506 R 16F0 R Mov Word Ptr WRK33_CHRN_Table_Address,Offset MEM02_CHRN_Table 590 02A5 C6 06 0E2D R FF Mov Byte Ptr FLG13_First_Read_Write,True 591 02AA C6 06 0E2E R 00 Mov Byte Ptr FLG14_Copy_Complete,False 592 02AF C6 06 0E2F R 03 Mov Byte Ptr FLG15_IO_Error,Three 593 02B4 E9 020A R Jmp B1105A ; Start writing a diskette again 594 02B7 B1111: 595 02B7 BE 0F1C R Mov SI,Offset MES01B_Copy_Another_Diskette 596 02BA E8 0C7D R Call U1000_Display_Message 597 02BD E8 0D43 R Call U1200_Get_Yes_or_No 598 02C0 80 3E 0E26 R 00 Cmp Byte Ptr FLG06_Yes_or_No,False  The Microsoft MACRO Assembler , Version 1.27 Page 1-17 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 599 02C5 74 06 Je B1199 ; Go to the end of the module 600 02C7 E8 04A1 R Call C1500_Diskette_Messages ; Print out the messages on screen 601 02CA E9 01A3 R Jmp B1101 ; Start copying a diskette again 602 02CD B1199: 603 02CD C3 Ret 604 ; 605 02CE B1100_Detail_Process Endp 606 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-18 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 607 Page 608 ;************************************************************************ 609 ;* * 610 ;* B1200_FINAL_PROCESS * 611 ;* * 612 ;* This module performs the following functions before returning * 613 ;* control to PC DOS: * 614 ;* * 615 ;* 1. Restores the value of the stack pointer. * 616 ;* * 617 ;* 2. Displays the final message of the program. * 618 ;* * 619 ;* 3. Restores the underline cursor. * 620 ;* * 621 ;* 4. Restores the settings in the Disk Parameter Table. * 622 ;* * 623 ;* 5. Returns control to A1000_Main_Module. * 624 ;* * 625 ;************************************************************************ 626 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-19 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 627 Page 628 ; 629 Public B1200_Final_Process 630 ; 631 02CE B1200_Final_Process Proc Near 632 ; 633 02CE B1201: 634 02CE FA Cli ; Establish the stack pointer 635 02CF 8B 26 1519 R Mov SP,Word Ptr SYS15_Stack_Pointer 636 02D3 FB Sti ; ..End 637 ; 638 02D4 E8 0A66 R Call C2300_Free_Memory ; Free allocated memory if necessary 639 ; 640 02D7 BE 146E R Mov SI,Offset MES100_Freecopy_Finished 641 02DA E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 642 ; 643 02DD B4 01 Mov AH,Set_CType_Command ; Restore the underline cursor 644 02DF B9 0D0D Mov CX,Underline_Cursor ; . 645 02E2 CD 10 Int Video_Interrupt ; ..End 646 ; 647 02E4 E8 0C50 R Call S1100_Restore_Disk_Param_Table 648 ; 649 02E7 B8 0132 R Mov AX,Offset A1090 ; Setup to return to the main module 650 02EA 0E Push CS ; . 651 02EB 50 Push AX ; ..End 652 02EC B1299: 653 02EC C3 Ret 654 ; 655 02ED B1200_Final_Process Endp 656 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-20 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 657 Page 658 ;************************************************************************ 659 ;* * 660 ;* C1000_GET_AND_SET_VIDEO * 661 ;* * 662 ;* This module gets the current video state and saves this * 663 ;* information in the various SYStem variables. * 664 ;* * 665 ;************************************************************************ 666 ; 667 Public C1000_Get_And_Set_Video 668 ; 669 02ED C1000_Get_And_Set_Video Proc Near 670 ; 671 02ED C1001: 672 02ED 50 Push AX ; Save the registers 673 02EE 53 Push BX ; . 674 02EF 51 Push CX ; ..End 675 02F0 C1002: 676 02F0 B4 0F Mov AH,Video_State_Command ; Get the current video state 677 02F2 CD 10 Int Video_Interrupt ; ..End 678 02F4 88 26 150A R Mov Byte Ptr SYS01_Number_Columns,AH 679 02F8 A2 150B R Mov Byte Ptr SYS02_Current_Mode,AL 680 02FB 88 3E 150C R Mov Byte Ptr SYS03_Active_Page,BH 681 02FF C1003: 682 02FF B4 01 Mov AH,Set_CType_Command ; Set the cursor to blanks 683 0301 B9 0F0F Mov CX,Blank_Cursor ; . 684 0304 CD 10 Int Video_Interrupt ; ..End 685 0306 C1090: 686 0306 59 Pop CX ; Restore the registers 687 0307 5B Pop BX ; . 688 0308 58 Pop AX ; ..End 689 0309 C1099: 690 0309 C3 Ret 691 ; 692 030A C1000_Get_And_Set_Video Endp 693 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-21 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 694 Page 695 ;************************************************************************ 696 ;* * 697 ;* C1100_DISPLAY_INTRO * 698 ;* * 699 ;* This module displays the introductory message to FREECOPY. * 700 ;* Please do not disable this message, since it states the * 701 ;* conditions under which a person may copy this program. * 702 ;* * 703 ;************************************************************************ 704 ; 705 Public C1100_Display_Intro 706 ; 707 030A C1100_Display_Intro Proc Near 708 ; 709 030A C1101: 710 030A BE 0E32 R Mov SI,Offset MES00_Copy_Notice ; Display the copy notice 711 030D E8 0C7D R Call U1000_Display_Message ; ..End 712 0310 C1199: 713 0310 C3 Ret 714 0311 C1100_Display_Intro Endp 715 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-22 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 716 Page 717 ;************************************************************************ 718 ;* * 719 ;* C1200_PARSE_COMMANDS * 720 ;* * 721 ;* This module parses the command line entered by the user * 722 ;* by checking the following conditions: * 723 ;* * 724 ;* 1. The source and/or the target drives do not exist. * 725 ;* * 726 ;* 2. The command line contains any characters other than two * 727 ;* drive letters (e.g., a filename). * 728 ;* * 729 ;* 3. The /1 (single side) parameter is on the command line. * 730 ;* * 731 ;************************************************************************ 732 ; 733 Public C1200_Parse_Commands 734 ; 735 0311 C1200_Parse_Commands Proc Near 736 ; 737 0311 C1201: 738 0311 80 FC FF Cmp AH,Invalid_Drive ; Compare for invalid drive parms 739 0314 75 0E Jne C1202 ; . 740 0316 C6 06 0E21 R 00 Mov Byte Ptr FLG01_Good_Command,False 741 031B BE 10F2 R Mov SI,Offset MES14_Invalid_Drive 742 031E E8 0C7D R Call U1000_Display_Message 743 0321 E9 03E0 R Jmp C1299 ; . 744 0324 C1202: ; . 745 0324 3C FF Cmp AL,Invalid_Drive ; . 746 0326 75 0E Jne C1203 ; . 747 0328 C6 06 0E21 R 00 Mov Byte Ptr FLG01_Good_Command,False 748 032D BE 10F2 R Mov SI,Offset MES14_Invalid_Drive 749 0330 E8 0C7D R Call U1000_Display_Message 750 0333 E9 03E0 R Jmp C1299 ; ..End 751 0336 C1203: 752 0336 A0 005C R Mov AL,Byte Ptr Source_Drive 753 0339 A2 1487 R Mov Byte Ptr WRK01_Source_Drive,AL 754 033C A0 006C R Mov AL,Byte Ptr Target_Drive 755 033F A2 1488 R Mov Byte Ptr WRK02_Target_Drive,AL 756 0342 C1204: 757 0342 BE 005D R Mov SI,Offset Source_Filename 758 0345 BF 1489 R Mov DI,Offset WRK03_Valid_Filename 759 0348 B9 000B Mov CX,Eleven ; Set CX to compare 11 characters 760 034B C1205: 761 034B 8A 04 Mov AL,[SI] ; Compare for valid source diskette 762 034D 8A 25 Mov AH,[DI] ; filename in the FCB at 05DH 763 034F 3A E0 Cmp AH,AL ; . 764 0351 74 0E Je C1206 ; . 765 0353 C6 06 0E21 R 00 Mov Byte Ptr FLG01_Good_Command,False  The Microsoft MACRO Assembler , Version 1.27 Page 1-23 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 766 0358 BE 10A8 R Mov SI,Offset MES12_Invalid_Parameter 767 035B E8 0C7D R Call U1000_Display_Message 768 035E E9 03E0 R Jmp C1299 ; . 769 0361 C1206: ; . 770 0361 46 Inc SI ; . 771 0362 47 Inc DI ; . 772 0363 E2 E6 Loop C1205 ; ..End 773 0365 C1207: 774 0365 BE 006D R Mov SI,Offset Target_Filename 775 0368 BF 1489 R Mov DI,Offset WRK03_Valid_Filename 776 036B B9 000B Mov CX,Eleven ; Set CX to comapre 11 characters 777 036E C1208: 778 036E 8A 04 Mov AL,[SI] ; Compare for valid target diskette 779 0370 8A 25 Mov AH,[DI] ; . filename in the FCB at 06DH 780 0372 3A E0 Cmp AH,AL ; . 781 0374 74 0E Je C1209 ; . 782 0376 C6 06 0E21 R 00 Mov Byte Ptr FLG01_Good_Command,False 783 037B BE 10A8 R Mov SI,Offset MES12_Invalid_Parameter 784 037E E8 0C7D R Call U1000_Display_Message 785 0381 EB 5D 90 Jmp C1299 ; . 786 0384 C1209: ; . 787 0384 46 Inc SI ; . 788 0385 47 Inc DI ; . 789 0386 E2 E6 Loop C1208 ; ..End 790 0388 C1210: 791 0388 A0 0080 R Mov AL,Byte Ptr Parameter_Count 792 038B A2 1494 R Mov Byte Ptr WRK04_Parameter_Count,AL 793 038E BE 0081 R Mov SI,Offset Parameter_String 794 0391 FE 06 1494 R Inc Byte Ptr WRK04_Parameter_Count 795 0395 C1211: 796 0395 FE 0E 1494 R Dec Byte Ptr WRK04_Parameter_Count 797 0399 74 45 Jz C1299 ; Go to the end of the module 798 039B 8A 04 Mov AL,[SI] ; Put the character into AL 799 039D 3C 2F Cmp AL,Slash ; Compare character with a slash 800 039F 74 03 Je C1212 ; If so, then continue processing 801 03A1 46 Inc SI ; Increment the command string addr 802 03A2 EB F1 Jmp C1211 ; Go back and try again 803 03A4 C1212: 804 03A4 46 Inc SI ; Increment the command string addr 805 03A5 8A 04 Mov AL,[SI] ; Get the next char after the slash 806 03A7 3C 31 Cmp AL,One_Digit ; Compare with the char 1 807 03A9 74 0E Je C1214 ; Set double side flag to false 808 03AB C1213: 809 03AB C6 06 0E21 R 00 Mov Byte Ptr FLG01_Good_Command,False 810 03B0 BE 10A8 R Mov SI,Offset MES12_Invalid_Parameter 811 03B3 E8 0C7D R Call U1000_Display_Message 812 03B6 EB 28 90 Jmp C1299 ; Go to the end of the module 813 03B9 C1214: 814 03B9 C6 06 0E22 R 00 Mov Byte Ptr FLG02_Double_Side,False 815 03BE FE 0E 1494 R Dec Byte Ptr WRK04_Parameter_Count  The Microsoft MACRO Assembler , Version 1.27 Page 1-24 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 816 03C2 74 1C Jz C1299 ; Go to the end of the module 817 03C4 C1215: 818 03C4 FE 0E 1494 R Dec Byte Ptr WRK04_Parameter_Count 819 03C8 74 16 Jz C1299 ; Go to the end of the module 820 03CA 46 Inc SI ; Increment the command string addr 821 03CB 8A 04 Mov AL,[SI] ; Get the next char in command line 822 03CD 3C 09 Cmp AL,HT ; Check for tabs and spaces 823 03CF 74 F3 Je C1215 ; . 824 03D1 3C 20 Cmp AL,Space ; . 825 03D3 74 EF Je C1215 ; ..End 826 03D5 C1216: 827 03D5 C6 06 0E21 R 00 Mov Byte Ptr FLG01_Good_Command,False 828 03DA BE 10A8 R Mov SI,Offset MES12_Invalid_Parameter 829 03DD E8 0C7D R Call U1000_Display_Message 830 03E0 C1299: 831 03E0 C3 Ret 832 ; 833 03E1 C1200_Parse_Commands Endp 834 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-25 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 835 Page 836 ;************************************************************************ 837 ;* * 838 ;* C1300_GET_EQUIPMENT * 839 ;* * 840 ;* This module determines the peripheral devices on the machine. * 841 ;* It invokes the equipment status interrupt and places the * 842 ;* information into the appropriate SYStem parameters. * 843 ;* * 844 ;************************************************************************ 845 ; 846 Public C1300_Get_Equipment 847 848 849 03E1 C1300_Get_Equipment Proc Near 850 ; 851 03E1 C1301: 852 03E1 CD 11 Int Equipment_Interrupt ; Get the equipment on machine 853 03E3 8B D8 Mov BX,AX ; Save the result for future use 854 ; 855 03E5 25 C000 And AX,Parallel_Ports_Mask ; Get the number of parallel ports 856 03E8 B1 0E Mov CL,Fourteen ; . 857 03EA D3 E8 Shr AX,CL ; . 858 03EC A2 1511 R Mov Byte Ptr SYS07_No_Parallel_Ports,AL 859 ; 860 03EF 8B C3 Mov AX,BX ; Get the game adapter attachments 861 03F1 25 0100 And AX,Game_Adapters_Mask ; . 862 03F4 B1 0C Mov CL,Twelve ; . 863 03F6 D3 E8 Shr AX,CL ; . 864 03F8 A2 1512 R Mov Byte Ptr SYS08_Game_Adapters,AL 865 ; 866 03FB 8B C3 Mov AX,BX ; Get the number of RS-232 ports 867 03FD 25 0E00 And AX,RS232_Ports_Mask ; . 868 0400 B1 09 Mov CL,Nine ; . 869 0402 D3 E8 Shr AX,CL ; . 870 0404 A2 1513 R Mov Byte Ptr SYS09_No_RS232_Ports,AL 871 ; 872 0407 8B C3 Mov AX,BX ; Get the number of diskette drives 873 0409 25 00C0 And AX,Disk_Drives_Mask ; . 874 040C B1 06 Mov CL,Six ; . 875 040E D3 E8 Shr AX,CL ; . 876 0410 A2 1514 R Mov Byte Ptr SYS10_No_Disk_Drives,AL 877 ; 878 0413 8B C3 Mov AX,BX ; Get the initial video mode 879 0415 25 0030 And AX,Init_Video_Mask ; . 880 0418 B1 04 Mov CL,Four ; . 881 041A D3 E8 Shr AX,CL ; . 882 041C A2 1515 R Mov Byte Ptr SYS11_Init_Video_Mode,AL 883 ; 884 041F 8B C3 Mov AX,BX ; Get planar RAM size  The Microsoft MACRO Assembler , Version 1.27 Page 1-26 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 885 0421 25 000C And AX,Planar_RAM_Mask ; . 886 0424 B1 02 Mov CL,Two ; . 887 0426 D3 E8 Shr AX,CL ; . 888 0428 A2 1516 R Mov Byte Ptr SYS12_Planar_RAM_Size,AL 889 ; 890 042B 8B C3 Mov AX,BX ; Get IPL from diskette flag 891 042D 25 0001 And AX,IPL_Diskette_Mask ; . 892 0430 A2 1517 R Mov Byte Ptr SYS13_IPL_From_Diskette,AL 893 ; 894 0433 C1399: 895 0433 C3 Ret 896 ; 897 0434 C1300_Get_Equipment Endp 898 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-27 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 899 Page 900 ;************************************************************************ 901 ;* * 902 ;* C1400_VALIDATE_DRIVES * 903 ;* * 904 ;* This module determines if the drives specified in the * 905 ;* command line are floppy disk drives or RAM disk drives. * 906 ;* It also checks if copying the source diskette takes place * 907 ;* on a single drive. * 908 ;* * 909 ;************************************************************************ 910 ; 911 Public C1400_Validate_Drives 912 ; 913 0434 C1400_Validate_Drives Proc Near 914 ; 915 0434 C1401: 916 0434 B4 19 Mov AH,Default_Drive_Command; Get the PC DOS default drive 917 0436 CD 21 Int PC_DOS_Interrupt ; . 918 0438 A2 1518 R Mov Byte Ptr SYS14_Default_Drive,AL 919 043B C1402: 920 043B 80 3E 1514 R 00 Cmp Byte Ptr SYS10_No_Disk_Drives,Minimum_Drives 921 0440 77 12 Ja C1403 ; If not single drive copy, set 922 ; . FLG04 to false 923 0442 C6 06 1518 R 00 Mov Byte Ptr SYS14_Default_Drive,Minimum_Drives 924 0447 C6 06 1487 R 00 Mov Byte Ptr WRK01_Source_Drive,Minimum_Drives 925 044C C6 06 1488 R 00 Mov Byte Ptr WRK02_Target_Drive,Minimum_Drives 926 0451 EB 4D 90 Jmp C1499 ; Go to the end of the module 927 0454 C1403: 928 0454 C6 06 0E24 R 00 Mov Byte Ptr FLG04_Single_Drive,False 929 0459 C1404: 930 0459 80 3E 1518 R 03 Cmp Byte Ptr SYS14_Default_Drive,Maximum_Drives 931 045E 76 0E Jbe C1405 ; If below maximum, continue 932 0460 C6 06 0E23 R 00 Mov Byte Ptr FLG03_Default_Drive,False 933 0465 BE 10CC R Mov SI,Offset MES13_Invalid_Default 934 0468 E8 0C7D R Call U1000_Display_Message 935 046B EB 33 90 Jmp C1499 ; Go to the end of the module 936 046E C1405: 937 046E FE 0E 1487 R Dec Byte Ptr WRK01_Source_Drive 938 0472 80 3E 1487 R FF Cmp Byte Ptr WRK01_Source_Drive,Minus_One 939 0477 75 06 Jne C1406 940 0479 A0 1518 R Mov AL,Byte Ptr SYS14_Default_Drive 941 047C A2 1487 R Mov Byte Ptr WRK01_Source_Drive,AL 942 047F C1406: 943 047F FE 0E 1488 R Dec Byte Ptr WRK02_Target_Drive 944 0483 80 3E 1488 R FF Cmp Byte Ptr WRK02_Target_Drive,Minus_One 945 0488 75 06 Jne C1407 946 048A A0 1518 R Mov AL,Byte Ptr SYS14_Default_Drive 947 048D A2 1488 R Mov Byte Ptr WRK02_Target_Drive,AL 948 0490 C1407:  The Microsoft MACRO Assembler , Version 1.27 Page 1-28 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 949 0490 A0 1487 R Mov AL,Byte Ptr WRK01_Source_Drive 950 0493 8A 26 1488 R Mov AH,Byte Ptr WRK02_Target_Drive 951 0497 3A E0 Cmp AH,AL ; Check source drive = target drive 952 0499 75 05 Jne C1499 ; If so, then continue 953 049B C6 06 0E24 R FF Mov Byte Ptr FLG04_Single_Drive,True 954 04A0 C1499: 955 04A0 C3 Ret 956 ; 957 04A1 C1400_Validate_Drives Endp 958 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-29 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 959 Page 960 ;************************************************************************ 961 ;* * 962 ;* C1500_DISKETTE_MESSAGES * 963 ;* * 964 ;* This module displays the appropriate source and target * 965 ;* insertion diskette messages on the screen. * 966 ;* * 967 ;************************************************************************ 968 ; 969 Public C1500_Diskette_Messages 970 ; 971 04A1 C1500_Diskette_Messages Proc Near 972 ; 973 04A1 C1501: 974 04A1 80 3E 0E27 R 00 Cmp Byte Ptr FLG07_First_Time,False 975 04A6 74 0D Je C1502 ; If not first time, continue 976 04A8 80 3E 0E24 R 00 Cmp Byte Ptr FLG04_Single_Drive,False 977 04AD 74 06 Je C1502 ; If false, then continue 978 04AF BE 1113 R Mov SI,Offset MES15_Single_Drive_Copy 979 04B2 E8 0C7D R Call U1000_Display_Message 980 04B5 C1502: 981 04B5 BE 103E R Mov SI,Offset MES09_Insert_Source 982 04B8 A0 1487 R Mov AL,Byte Ptr WRK01_Source_Drive 983 04BB 04 41 Add AL,Capital_Letter_A ; Put the drive letter into AL 984 04BD 88 44 22 Mov [SI+Thirty_Four],AL ; Put the drive letter into the 985 ; . correct position in the message 986 04C0 E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 987 04C3 C1503: 988 04C3 80 3E 0E24 R FF Cmp Byte Ptr FLG04_Single_Drive,True 989 04C8 74 0E Je C1505 ; If true, go to the message to press 990 ; . any key to continue 991 04CA C1504: 992 04CA BE 1066 R Mov SI,Offset MES10_Insert_Target 993 04CD A0 1488 R Mov AL,Byte Ptr WRK02_Target_Drive 994 04D0 04 41 Add AL,Capital_Letter_A ; Put the drive letter into AL 995 04D2 88 44 22 Mov [SI+Thirty_Four],AL ; Put the drive letter into the 996 ; . correct position in the message 997 04D5 E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 998 04D8 C1505: 999 04D8 BE 1140 R Mov SI,Offset MES16_Press_Any_Key 1000 04DB E8 0C7D R Call U1000_Display_Message 1001 04DE C6 06 0E25 R 00 Mov Byte Ptr FLG05_Store_Buffer,False 1002 04E3 E8 0C9B R Call U1100_Get_Response 1003 04E6 C1599: 1004 04E6 C3 Ret 1005 ; 1006 04E7 C1500_Diskette_Messages Endp 1007 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-30 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1008 Page 1009 ;************************************************************************ 1010 ;* * 1011 ;* C1600A_GET_FREE_MEMORY * 1012 ;* * 1013 ;* This module calculates the amount of free 16 byte paragraphs * 1014 ;* available on the machine. The segment address of the beginning * 1015 ;* of free memory is obtained by setting DX to: * 1016 ;* * 1017 ;* 1. The contents of the stack segment SS plus * 1018 ;* * 1019 ;* 2. 256 bytes for the Program Segment Prefix plus * 1020 ;* * 1021 ;* 3. 128 bytes for the stack. * 1022 ;* * 1023 ;* After saving the ES segment register on the stack and * 1024 ;* initializing both the offset register BX and the 16 byte * 1025 ;* counter register CX to zero, the routine begins the looping * 1026 ;* through memory 16 bytes at a time (incrementing the segment * 1027 ;* register ES by one) until either the module encounters one * 1028 ;* of the two (2) conditions: * 1029 ;* * 1030 ;* 1. The beginning of Video RAM at the segment address * 1031 ;* specified in Video_Address. * 1032 ;* * 1033 ;* 2. The memory pattern defined by the machine that * 1034 ;* indicates no more memory. * 1035 ;* * 1036 ;* When either of these two (2) conditions occur, CX contains * 1037 ;* the number of 16 bytes paragraphs of free memory. * 1038 ;* * 1039 ;* Since we do not know the size of the transient portion of * 1040 ;* COMMAND.COM, FREECOPY makes the worst case assumption that * 1041 ;* all of the bytes in COMMAND.COM reside in high memory. * 1042 ;* * 1043 ;* This module also allocates space for the ES:BX table, the * 1044 ;* CHRN table, the File Allocation Table (FAT) of the source * 1045 ;* diskette and at least one track (4608 bytes). * 1046 ;* * 1047 ;* This module executes only when running PC-DOS 1.0 and 1.1!!! * 1048 ;* * 1049 ;************************************************************************ 1050 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-31 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1051 Page 1052 ; 1053 Public C1600A_Get_Free_Memory 1054 ; 1055 04E7 C1600A_Get_Free_Memory Proc Near 1056 ; 1057 04E7 C1601A: 1058 04E7 8C D2 Mov DX,SS ; Calculate the segment address for 1059 ; . the beginning of free memory 1060 04E9 81 C2 15AE R Add DX,Offset MEM04_Top_of_the_Stack 1061 ; 1062 04ED 06 Push ES ; Save ES on the stack for a moment 1063 04EE BB 0000 Mov BX,NUL ; Initialize BX and CX registers 1064 04F1 B9 0000 Mov CX,NUL ; ..End 1065 04F4 C1602A: 1066 04F4 8E C2 Mov ES,DX ; Set ES to the appropriate value 1067 04F6 FA Cli ; Turn off interrupts for a moment 1068 04F7 26: 8B 07 Mov AX,ES:[BX] ; Read a word from memory into AX 1069 04FA 26: C7 07 0001 Mov Word Ptr ES:[BX],SOH ; Put the test pattern into memory 1070 04FF 26: 83 3F 01 Cmp Word Ptr ES:[BX],SOH ; Compare memory with test pattern 1071 0503 26: 89 07 Mov ES:[BX],AX ; Restore the contents of memory 1072 0506 FB Sti ; Turn on the interrupts 1073 0507 75 0A Jne C1603A ; If not equal, stop looping 1074 0509 42 Inc DX ; Increment DX segment register 1075 050A 81 FA A000 Cmp DX,Video_Address ; Compare for start of Video RAM 1076 050E 73 03 Jae C1603A ; If so, stop looping 1077 0510 41 Inc CX ; Increment 16 byte counter CX 1078 0511 EB E1 Jmp C1602A ; Go back and try again 1079 0513 C1603A: 1080 0513 07 Pop ES ; Restore the ES register 1081 0514 81 F9 019A Cmp CX,Command_Com_Size ; Compare the paragraph size of 1082 ; . free memory with the paragraph 1083 ; . size of COMMAND.COM. 1084 0518 77 0E Ja C1604A ; If greater, continue 1085 ; 1086 051A C6 06 0E21 R 00 Mov Byte Ptr FLG01_Good_Command,False 1087 051F BE 108E R Mov SI,Offset MES11_Insufficient_Memory 1088 0522 E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 1089 0525 EB 61 90 Jmp C1699A ; Go to the end of the module 1090 0528 C1604A: 1091 0528 81 E9 019A Sub CX,Command_Com_Size ; Subtract the size of COMMAND.COM 1092 052C 83 F9 14 Cmp CX,ESBX_Table_Size ; Compare the paragraph size of the 1093 ; . free memory with the paragraph 1094 ; . size of the ES:BX table 1095 052F 77 0E Ja C1605A ; If greater, continue 1096 0531 C6 06 0E21 R 00 Mov Byte Ptr FLG01_Good_Command,False 1097 0536 BE 108E R Mov SI,Offset MES11_Insufficient_Memory 1098 0539 E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 1099 053C EB 4A 90 Jmp C1699A ; Go to the end of the module 1100 053F C1605A:  The Microsoft MACRO Assembler , Version 1.27 Page 1-32 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1101 053F 83 E9 14 Sub CX,ESBX_Table_Size ; Subtract the size of ES:BX table 1102 0542 81 F9 00B4 Cmp CX,CHRN_Table_Size ; Compare the paragraph size of the 1103 ; . free memory with the paragraph 1104 ; . size of the CHRN table 1105 0546 77 0E Ja C1606A ; If greater, continue 1106 ; 1107 0548 C6 06 0E21 R 00 Mov Byte Ptr FLG01_Good_Command,False 1108 054D BE 108E R Mov SI,Offset MES11_Insufficient_Memory 1109 0550 E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 1110 0553 EB 33 90 Jmp C1699A ; Go to the end of the module 1111 0556 C1606A: 1112 0556 81 E9 00B4 Sub CX,CHRN_Table_Size ; Subtract the size of CHRN Table 1113 055A 83 F9 20 Cmp CX,FAT_Sector_Size ; Determine if there is enough memory 1114 055D 73 0E Jae C1607A ; to read the File Allocation Table 1115 055F C6 06 0E21 R 00 Mov Byte Ptr FLG01_Good_Command,False 1116 0564 BE 108E R Mov SI,Offset MES11_Insufficient_Memory 1117 0567 E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 1118 056A EB 1C 90 Jmp C1699A ; Go to the end of the module 1119 056D C1607A: 1120 056D 83 E9 20 Sub CX,FAT_Sector_Size ; Subtract the size of the source FAT 1121 0570 81 F9 0120 Cmp CX,Minimum_Memory_Size ; Determine if the amount of memory 1122 0574 73 0E Jae C1608A ; can hold a nine sectored track 1123 ; 1124 0576 C6 06 0E21 R 00 Mov Byte Ptr FLG01_Good_Command,False 1125 057B BE 108E R Mov SI,Offset MES11_Insufficient_Memory 1126 057E E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 1127 0581 EB 05 90 Jmp C1699A ; Go to the end of the module 1128 0584 C1608A: 1129 0584 89 0E 150E R Mov Word Ptr SYS05_Para_RAM_Size,CX 1130 0588 C1699A: 1131 0588 C3 Ret 1132 ; 1133 0589 C1600A_Get_Free_Memory Endp 1134 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-33 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1135 Page 1136 ;************************************************************************ 1137 ;* * 1138 ;* C1600B_GET_FREE_MEMORY * 1139 ;* * 1140 ;* This module calcules the amount of available memory. It * 1141 ;* executes when running PC-DOS versions 2.0 and above. * 1142 ;* * 1143 ;************************************************************************ 1144 ; 1145 Public C1600B_Get_Free_Memory 1146 ; 1147 0589 C1600B_Get_Free_Memory Proc Near 1148 ; 1149 0589 C1601B: 1150 0589 B4 4A Mov AH,Modify_Memory_Block ; Allocate enough space for the 1151 058B BB 2430 R Mov BX,Offset MEM00_Bottom_Free_Memory 1152 058E B1 04 Mov CL,Four ; . program and all tables 1153 0590 D3 EB Shr BX,CL ; . 1154 0592 43 Inc BX ; . 1155 0593 CD 21 Int PC_DOS_Interrupt ; . 1156 0595 73 0E Jnc C1603B ; ..End 1157 0597 C1602B: 1158 0597 C6 06 0E21 R 00 Mov Byte Ptr FLG01_Good_Command,False 1159 059C BE 108E R Mov SI,Offset MES11_Insufficient_Memory 1160 059F E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 1161 05A2 EB 38 90 Jmp C1699B ; Go to the end of the module 1162 05A5 C1603B: 1163 05A5 B4 48 Mov AH,Allocate_Memory ; Get the amount of available memory 1164 05A7 BB FFFF Mov BX,High_Values ; . 1165 05AA CD 21 Int PC_DOS_Interrupt ; . 1166 05AC A3 152C R Mov Word Ptr SYS21_Alloc_Segment,AX 1167 05AF 89 1E 150E R Mov Word Ptr SYS05_Para_RAM_Size,BX 1168 05B3 73 27 Jnc C1699B ; . 1169 05B5 3C 08 Cmp AL,Eight ; . 1170 05B7 74 0F Je C1605B ; . 1171 05B9 C1604B: 1172 05B9 BE 1444 R Mov SI,Offset MES97_Return_Linefeed 1173 05BC E8 0C7D R Call U1000_Display_Message ; Issue a carriage return/linefeed 1174 05BF BE 144C R Mov SI,Offset MES99_Memory_Block_Destroyed 1175 05C2 E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 1176 05C5 EB 15 90 Jmp C1699B ; Go to the end of the module 1177 05C8 C1605B: 1178 05C8 B4 48 Mov AH,Allocate_Memory ; . 1179 05CA CD 21 Int PC_DOS_Interrupt ; ..End 1180 05CC A3 152C R Mov Word Ptr SYS21_Alloc_Segment,AX 1181 05CF 89 1E 150E R Mov Word Ptr SYS05_Para_RAM_Size,BX 1182 05D3 73 02 Jnc C1606B ; Set the allocation flag 1183 05D5 EB E2 Jmp C1604B ; Go to the error condition 1184 05D7 C1606B:  The Microsoft MACRO Assembler , Version 1.27 Page 1-34 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1185 05D7 C6 06 0E30 R 00 Mov Byte Ptr FLG16_Free_Memory,False 1186 05DC C1699B: 1187 05DC C3 Ret 1188 ; 1189 05DD C1600B_Get_Free_Memory Endp 1190 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-35 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1191 Page 1192 ;************************************************************************ 1193 ;* * 1194 ;* C1700_CREATE_ESBX_TABLE * 1195 ;* * 1196 ;* This module creates the correct ES:BX addresses that are * 1197 ;* used when storing tracks read from the source diskette. * 1198 ;* The routine allocates at most 80 entries in the table for * 1199 ;* double sided diskettes. * 1200 ;* * 1201 ;************************************************************************ 1202 ; 1203 Public C1700_Create_ESBX_Table 1204 ; 1205 05DD C1700_Create_ESBX_Table Proc Near 1206 ; 1207 05DD C1701: 1208 05DD C7 06 1508 R 0000 Mov Word Ptr WRK34_DMA_OverFlow_Counter,ZERO 1209 ; 1210 05E3 C7 06 14F5 R 0000 Mov Word Ptr WRK18_Counter_ESBX_Entries,Zero 1211 05E9 B8 0009 Mov AX,Nine ; Calculate DI = the number of bytes 1212 05EC BB 0200 Mov BX,Sector_Size ; per track and BX = the number of 1213 05EF F7 E3 Mul BX ; paragraphs per track 1214 05F1 8B F8 Mov DI,AX ; . 1215 05F3 BB 0010 Mov BX,Paragraph_Size ; . 1216 05F6 BA 0000 Mov DX,Zero ; . 1217 05F9 F7 F3 Div BX ; . 1218 05FB 8B D8 Mov BX,AX ; ..End 1219 ; 1220 05FD 80 3E 152A R 00 Cmp Byte Ptr SYS19_Major_Vers_Number,Zero 1221 0602 74 06 Je C1702 ; Compare for PC DOS 1.0 and 1.1 1222 0604 A1 152C R Mov AX,Word Ptr SYS21_Alloc_Segment 1223 0607 EB 0D 90 Jmp C1703 ; Continue 1224 060A C1702: 1225 060A 8C C8 Mov AX,CS ; Calculate the address of the 1st 1226 060C B1 04 Mov CL,Four ; that will be copied into memory 1227 060E D3 E0 Shl AX,CL ; . 1228 0610 05 2430 R Add AX,Offset MEM00_Bottom_Free_Memory 1229 0613 D3 E8 Shr AX,CL ; . 1230 0615 40 Inc AX ; ..End 1231 0616 C1703: 1232 0616 BE 15B0 R Mov SI,Offset MEM03_ESBX_Table 1233 0619 C7 04 0000 Mov Word Ptr [SI],Zero ; Put the 1st entry into the table 1234 061D 89 44 02 Mov Word Ptr [SI+Two],AX ; ..End 1235 0620 C1704: 1236 0620 83 3E 14F5 R 4F Cmp Word Ptr WRK18_Counter_ESBX_Entries,Seventy_Nine 1237 0625 73 2D Jae C1707 ; Calculate the ES:BX valid entries 1238 0627 83 C6 04 Add SI,Four ; Get the next ES:BX table address 1239 ; 1240 062A 8B 44 FE Mov AX,[SI-Two] ; Check for DMA overflow error  The Microsoft MACRO Assembler , Version 1.27 Page 1-36 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1241 062D 25 0FFF And AX,DMA_Boundary_Mask ; . 1242 0630 D3 E0 Shl AX,CL ; . 1243 0632 03 C7 Add AX,DI ; . 1244 0634 73 0C Jnc C1705 ; ..End 1245 ; 1246 0636 8B 44 FE Mov AX,[SI-Two] ; Correction for DMA overflow 1247 0639 03 C3 Add AX,BX ; . 1248 063B 89 44 FE Mov [SI-Two],AX ; ..End 1249 063E FF 06 1508 R Inc Word Ptr WRK34_DMA_Overflow_Counter 1250 0642 C1705: 1251 0642 8B 44 FE Mov AX,[SI-Two] ; Increment the ES segment address 1252 0645 03 C3 Add AX,BX ; ..End 1253 0647 C1706: 1254 0647 C7 04 0000 Mov Word Ptr [SI],Zero ; Put the address into the table 1255 064B 89 44 02 Mov Word Ptr [SI+Two],AX ; ..End 1256 064E FF 06 14F5 R Inc Word Ptr WRK18_Counter_ESBX_Entries 1257 0652 EB CC Jmp C1704 ; Go back and find another entry 1258 0654 C1707: 1259 0654 A1 150E R Mov AX,Word Ptr SYS05_Para_RAM_Size 1260 0657 BA 0000 Mov DX,Zero ; Divide by the number of paragraphs 1261 065A F7 F3 Div BX ; . per track 1262 065C A3 14F7 R Mov Word Ptr WRK19_Number_ESBX_Entries,AX 1263 065F A1 1508 R Mov AX,Word Ptr WRK34_DMA_Overflow_Counter 1264 0662 29 06 14F7 R Sub Word Ptr WRK19_Number_ESBX_Entries,AX 1265 0666 83 3E 14F7 R 4F Cmp Word Ptr WRK19_Number_ESBX_Entries,Seventy_Nine 1266 066B 72 0B Jb C1799 ; If less than 79, continue 1267 066D C7 06 14F7 R 004F Mov Word Ptr WRK19_Number_ESBX_Entries,Seventy_Nine 1268 0673 C6 06 0E31 R FF Mov Byte Ptr FLG17_Copy_More_Disks,True 1269 0678 C1799: 1270 0678 C3 Ret 1271 ; 1272 0679 C1700_Create_ESBX_Table Endp 1273 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-37 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1274 Page 1275 ;************************************************************************ 1276 ;* * 1277 ;* C1800_VALIDATE_SOURCE_DISK * 1278 ;* * 1279 ;* This module determines if the source diskette is readable * 1280 ;* and whether it was formatted under PC DOS 1.0, 1.1, 2.0 or * 1281 ;* 2.1. The routine also reads the first copy of the File * 1282 ;* Allocation Table (FAT) storing it for future comparisons * 1283 ;* as well as analyzing it first entry. * 1284 ;* * 1285 ;* A series of comparisons for the number of sectors per track * 1286 ;* is done for the following reasons. All diskettes formatted * 1287 ;* under PC DOS 2.0 and 2.1 really have nine sectors. In order * 1288 ;* to obtain an eight sectored diskette, the operating system * 1289 ;* sets the first byte of the File Allocation Table (FAT) * 1290 ;* accordingly. In contrast, PC DOS 1.0 and 1.1 formats a track * 1291 ;* to have exactly eight sectors. * 1292 ;* * 1293 ;************************************************************************ 1294 ; 1295 Public C1800_Validate_Source_Disk 1296 ; 1297 0679 C1800_Validate_Source_Disk Proc Near 1298 ; 1299 0679 C1801: 1300 0679 C6 06 0E28 R FF Mov Byte Ptr FLG08_Good_Read,True 1301 ; 1302 067E A0 1487 R Mov AL,Byte Ptr WRK01_Source_Drive 1303 0681 A2 14E7 R Mov Byte Ptr WRK06_Drive_Number,AL 1304 0684 C6 06 14E8 R 00 Mov Byte Ptr WRK07_Head_Number,Zero 1305 0689 C6 06 14E9 R 00 Mov Byte Ptr WRK08_Track_Number,Zero 1306 068E C6 06 14EA R 09 Mov Byte Ptr WRK09_Sector_Number,Nine 1307 0693 C6 06 14EB R 01 Mov Byte Ptr WRK10_Number_of_Sectors,One 1308 0698 0E Push CS ; Establish the address ES:BX 1309 0699 07 Pop ES ; ..End 1310 069A BB 2230 R Mov BX,Offset MEM01_File_Allocation_Table 1311 ; 1312 069D E8 0A8D R Call D1000_Read_Diskette 1313 ; 1314 06A0 FA Cli ; Set the number of sectors to nine 1315 06A1 C6 06 1523 R 09 Mov Byte Ptr SYS18_Disk_Parameter_Table[Four],Nine 1316 06A6 FB Sti ; . 1317 06A7 C6 06 14F4 R 09 Mov Byte Ptr WRK17_Maximum_Sectors,Nine 1318 ; 1319 06AC 80 3E 0E28 R FF Cmp Byte Ptr FLG08_Good_Read,True 1320 06B1 74 1E Je C1803 ; Check for good read of sector nine 1321 06B3 80 3E 14F1 R 04 Cmp Byte Ptr WRK14_Status_Operation,Sector_Error 1322 06B8 74 0B Je C1802 ; If so, continue 1323 06BA C6 06 0E2F R 01 Mov Byte Ptr FLG15_IO_Error,One  The Microsoft MACRO Assembler , Version 1.27 Page 1-38 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1324 06BF E8 0B68 R Call D1200_Disk_IO_Error ; Process the error 1325 06C2 E9 07E8 R Jmp C1899 ; ..End 1326 06C5 C1802: 1327 06C5 FA Cli ; Set the number of sectors to eight 1328 06C6 C6 06 1523 R 08 Mov Byte Ptr SYS18_Disk_Parameter_Table[Four],Eight 1329 06CB FB Sti ; . 1330 06CC C6 06 14F4 R 08 Mov Byte Ptr WRK17_Maximum_Sectors,Eight 1331 06D1 C1803: ; . 1332 06D1 C6 06 0E28 R FF Mov Byte Ptr FLG08_Good_Read,True 1333 ; 1334 06D6 A0 1487 R Mov AL,Byte Ptr WRK01_Source_Drive 1335 06D9 A2 14E7 R Mov Byte Ptr WRK06_Drive_Number,AL 1336 06DC C6 06 14E8 R 00 Mov Byte Ptr WRK07_Head_Number,Zero 1337 06E1 C6 06 14E9 R 00 Mov Byte Ptr WRK08_Track_Number,Zero 1338 06E6 C6 06 14EA R 02 Mov Byte Ptr WRK09_Sector_Number,Two 1339 06EB C6 06 14EB R 01 Mov Byte Ptr WRK10_Number_of_Sectors,One 1340 06F0 0E Push CS ; Establish the address ES:BX 1341 06F1 07 Pop ES ; ..End 1342 06F2 BB 2230 R Mov BX,Offset MEM01_File_Allocation_Table 1343 ; 1344 06F5 E8 0A8D R Call D1000_Read_Diskette 1345 ; 1346 06F8 80 3E 0E28 R FF Cmp Byte Ptr FLG08_Good_Read,True 1347 06FD 74 0B Je C1804 ; If the read operation was 1348 ; . successful, continue 1349 06FF C6 06 0E2F R 01 Mov Byte Ptr FLG15_IO_Error,One 1350 0704 E8 0B68 R Call D1200_Disk_IO_Error ; Display appropriate error message 1351 0707 E9 07E8 R Jmp C1899 ; Go to the end of the module 1352 070A C1804: 1353 070A A0 2230 R Mov AL,Byte Ptr MEM01_File_Allocation_Table[Zero] 1354 ; 1355 070D 3C FE Cmp AL,One_Side_Eight_Sectors 1356 070F 75 10 Jne C1805 ; If not, continue 1357 0711 C6 06 14F2 R 00 Mov Byte Ptr WRK15_Maximum_Heads,Zero 1358 0716 C6 06 14F3 R 27 Mov Byte Ptr WRK16_Maximum_Tracks,Thirty_Nine 1359 071B BE 0F4F R Mov SI,Offset MES03_Copy81_Sectors 1360 071E EB 51 90 Jmp C1809 ; Continue the processing 1361 0721 C1805: 1362 0721 3C FF Cmp AL,Two_Sides_Eight_Sectors 1363 0723 75 10 Jne C1806 ; If not, continue 1364 0725 C6 06 14F2 R 01 Mov Byte Ptr WRK15_Maximum_Heads,One 1365 072A C6 06 14F3 R 4F Mov Byte Ptr WRK16_Maximum_Tracks,Seventy_Nine 1366 072F BE 0F78 R Mov SI,Offset MES04_Copy82_Sectors 1367 0732 EB 3D 90 Jmp C1809 ; Continue the processing 1368 0735 C1806: 1369 0735 3C FC Cmp AL,One_Side_Nine_Sectors 1370 0737 75 10 Jne C1807 ; If not, continue 1371 0739 C6 06 14F2 R 00 Mov Byte Ptr WRK15_Maximum_Heads,Zero 1372 073E C6 06 14F3 R 27 Mov Byte Ptr WRK16_Maximum_Tracks,Thirty_Nine 1373 0743 BE 0FA2 R Mov SI,Offset MES05_Copy91_Sectors  The Microsoft MACRO Assembler , Version 1.27 Page 1-39 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1374 0746 EB 29 90 Jmp C1809 ; Continue the processing 1375 0749 C1807: 1376 0749 3C FD Cmp AL,Two_Sides_Nine_Sectors 1377 074B 75 10 Jne C1808 ; If not, continue 1378 074D C6 06 14F2 R 01 Mov Byte Ptr WRK15_Maximum_Heads,One 1379 0752 C6 06 14F3 R 4F Mov Byte Ptr WRK16_Maximum_Tracks,Seventy_Nine 1380 0757 BE 0FCB R Mov SI,Offset MES06_Copy92_Sectors 1381 075A EB 15 90 Jmp C1809 ; Continue the processing 1382 075D C1808: 1383 075D C6 06 0E28 R 00 Mov Byte Ptr FLG08_Good_Read,False 1384 0762 BE 11A7 R Mov SI,Offset MES19_Unrecoverable_Read 1385 0765 E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 1386 0768 BE 13CC R Mov SI,Offset MES90_Unknown_FAT_Error 1387 076B E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 1388 076E EB 78 90 Jmp C1899 ; Go to display the message 1389 0771 C1809: 1390 0771 80 3E 14F2 R 00 Cmp Byte Ptr WRK15_Maximum_Heads,Zero 1391 0776 74 11 Je C1810 ; If the diskette is single sided, 1392 ; . display the diskette message 1393 0778 80 3E 0E22 R FF Cmp Byte Ptr FLG02_Double_Side,True 1394 077D 74 0A Je C1810 ; If the flag indicates to copy 1395 ; . both sides of the diskette, 1396 ; . then continue 1397 077F C6 06 14F2 R 00 Mov Byte Ptr WRK15_Maximum_Heads,Zero 1398 0784 C6 06 14F3 R 27 Mov Byte Ptr WRK16_Maximum_Tracks,Thirty_Nine 1399 0789 C1810: 1400 0789 A0 1487 R Mov AL,Byte Ptr WRK01_Source_Drive 1401 078C A2 14E7 R Mov Byte Ptr WRK06_Drive_Number,AL 1402 078F C6 06 14E8 R 01 Mov Byte Ptr WRK07_Head_Number,One 1403 0794 C6 06 14E9 R 00 Mov Byte Ptr WRK08_Track_Number,Zero 1404 0799 C6 06 14EA R 01 Mov Byte Ptr WRK09_Sector_Number,One 1405 079E C6 06 14EB R 01 Mov Byte Ptr WRK10_Number_of_Sectors,One 1406 07A3 0E Push CS ; Establish the ES segment register 1407 07A4 07 Pop ES ; . 1408 07A5 06 Push ES ; ..End 1409 07A6 BB 2430 R Mov BX,Offset MEM00_Bottom_Free_Memory 1410 07A9 80 3E 152A R 00 Cmp SYS19_Major_Vers_Number,Zero 1411 07AE 74 07 Je C1811 ; If PC DOS 1.0 or 1.1, continue; 1412 ; . otherwise, setup ES:BX a little 1413 07B0 8E 06 152C R Mov ES,Word Ptr SYS21_Alloc_Segment 1414 07B4 BB 0000 Mov BX,Zero ; . differently 1415 07B7 C1811: 1416 07B7 E8 0A8D R Call D1000_Read_Diskette 1417 07BA 07 Pop ES ; Restore ES in any case 1418 ; 1419 07BB 80 3E 0E28 R FF Cmp Byte Ptr FLG08_Good_Read,True 1420 07C0 74 23 Je C1813 ; Go to display the message 1421 07C2 80 3E 14F2 R 01 Cmp Byte Ptr WRK15_Maximum_Heads,One 1422 07C7 74 0D Je C1812 ; If double sided diskette, error!!! 1423 07C9 C6 06 0E28 R FF Mov Byte Ptr FLG08_Good_Read,True  The Microsoft MACRO Assembler , Version 1.27 Page 1-40 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1424 07CE C6 06 0E22 R 00 Mov Byte Ptr FLG02_Double_Side,False 1425 07D3 EB 10 90 Jmp C1813 ; Display the appropriate message 1426 07D6 C1812: 1427 07D6 BE 11A7 R Mov SI,Offset MES19_Unrecoverable_Read 1428 07D9 E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 1429 07DC BE 140D R Mov SI,Offset MES91_Single_Side_Error 1430 07DF E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 1431 07E2 EB 04 90 Jmp C1899 ; Go to the end of the module 1432 07E5 C1813: 1433 07E5 E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 1434 07E8 C1899: 1435 07E8 C3 Ret 1436 ; 1437 07E9 C1800_Validate_Source_Disk Endp 1438 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-41 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1439 Page 1440 ;************************************************************************ 1441 ;* * 1442 ;* C1900_CREATE_CHRN_TABLE * 1443 ;* * 1444 ;* This module creates the CHRN table to be used in case the * 1445 ;* target diskette needs to be formatted. The abbreviation * 1446 ;* stands for C = track number, H = head number, R = sector * 1447 ;* number and N = a code for the number of bytes per sector. * 1448 ;* * 1449 ;************************************************************************ 1450 ; 1451 Public C1900_Create_CHRN_Table 1452 ; 1453 07E9 C1900_Create_CHRN_Table Proc Near 1454 ; 1455 07E9 C1901: 1456 07E9 8A 3E 14F2 R Mov BH,Byte Ptr WRK15_Maximum_Heads 1457 07ED 8A 1E 14F3 R Mov BL,Byte Ptr WRK16_Maximum_Tracks 1458 07F1 B0 09 Mov AL,Nine 1459 ; 1460 07F3 8A CF Mov CL,BH ; Establish correct track number 1461 07F5 D2 EB Shr BL,CL ; ..End 1462 ; 1463 07F7 B2 02 Mov DL,Two ; . DL = number of sectors 1464 07F9 B6 00 Mov DH,Zero ; . DH = head number 1465 07FB B5 00 Mov CH,Zero ; . CH = track number 1466 07FD B1 01 Mov CL,One ; . CL = sector number 1467 07FF BE 16F0 R Mov SI,Offset MEM02_CHRN_Table; Set up initial registers 1468 0802 C1902: 1469 0802 88 2C Mov [SI],CH ; Establish an entry in the CHRN 1470 0804 88 74 01 Mov [SI+One],DH ; . table 1471 0807 88 4C 02 Mov [SI+Two],CL ; . 1472 080A 88 54 03 Mov [SI+Three],DL ; ..End 1473 ; 1474 080D 83 C6 04 Add SI,Four ; Get the addr of next CHRN entry 1475 0810 FE C1 Inc CL ; Increment the sector number 1476 0812 3A C8 Cmp CL,AL ; Compare for maximum sectors 1477 0814 76 EC Jbe C1902 ; If not, go back and try again 1478 ; 1479 0816 B1 01 Mov CL,One ; Initialize sector number 1480 0818 FE C6 Inc DH ; Increment the head number 1481 081A 3A F7 Cmp DH,BH ; Compare for maximum heads 1482 081C 76 E4 Jbe C1902 ; If not, go back and try again 1483 ; 1484 081E B1 01 Mov CL,One ; Initialize sector number 1485 0820 B6 00 Mov DH,Zero ; Initialize head number 1486 0822 FE C5 Inc CH ; Increment the track number 1487 0824 3A EB Cmp CH,BL ; Compare for maximum tracks 1488 0826 76 DA Jbe C1902 ; If not, go back and try again  The Microsoft MACRO Assembler , Version 1.27 Page 1-42 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1489 0828 C1999: 1490 0828 C3 Ret 1491 ; 1492 0829 C1900_Create_CHRN_Table Endp 1493 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-43 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1494 Page 1495 ;************************************************************************ 1496 ;* * 1497 ;* C2000_READ_SOURCE_DISK * 1498 ;* * 1499 ;* This module reads a diskette track by track until it fills * 1500 ;* all of available memory specified by the ES:BX table. The * 1501 ;* processing sequence is: * 1502 ;* * 1503 ;* 1. Initializes the SI resgister to point to the correct entry * 1504 ;* in the ES:BX table. * 1505 ;* * 1506 ;* 2. Prints the initial read message on the screen. * 1507 ;* * 1508 ;* 3. Compares for the end of the ES:BX table and/or the number * 1509 ;* of tracks on the diskette. If not, continue. If so, * 1510 ;* return to B1100_Detail_Processing. * 1511 ;* * 1512 ;* 4. Reads a track from the source diskette. * 1513 ;* * 1514 ;* 5. Displays the track and head numbers on the screen. * 1515 ;* * 1516 ;* 6. Transfers control to 3. * 1517 ;* * 1518 ;************************************************************************ 1519 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-44 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1520 Page 1521 ; 1522 Public C2000_Read_Source_Disk 1523 ; 1524 0829 C2000_Read_Source_Disk Proc Near 1525 ; 1526 0829 C2001: 1527 0829 C6 06 0E28 R FF Mov Byte Ptr FLG08_Good_Read,True 1528 ; 1529 082E BE 15B0 R Mov SI,Offset MEM03_ESBX_Table 1530 0831 C7 06 14F5 R 0000 Mov Word Ptr WRK18_Counter_ESBX_Entries,Zero 1531 ; 1532 0837 80 3E 0E2D R 00 Cmp Byte Ptr FLG13_First_Read_Write,False 1533 083C 74 08 Je C2002 ; If not first time, continue 1534 083E C6 06 1504 R 00 Mov Byte Ptr WRK31_Track_Read_Counter,Zero 1535 0843 EB 08 90 Jmp C2003 ; Go to display the message 1536 0846 C2002: 1537 0846 80 3E 0E24 R 00 Cmp Byte Ptr FLG04_Single_Drive,False 1538 084B 74 2E Je C2004 ; If double drive copy, continue 1539 084D C2003: 1540 084D 56 Push SI ; Save SI = Addr of ES:BX table 1541 084E BE 1444 R Mov SI,Offset MES97_Return_Linefeed 1542 0851 E8 0C7D R Call U1000_Display_Message ; Display a return and linefeed 1543 0854 BE 115E R Mov SI,Offset MES17_Reading_Track 1544 0857 A0 14FA R Mov AL,Byte Ptr WRK21_Current_Source_Track 1545 085A E8 0DA7 R Call U1300_Convert_Binary_to_ASCII 1546 085D 89 44 0F Mov [SI+Fifteen],AX ; Put the track number into message 1547 0860 A0 14F9 R Mov AL,Byte Ptr WRK20_Current_Source_Head 1548 0863 E8 0DA7 R Call U1300_Convert_Binary_to_ASCII 1549 0866 88 44 19 Mov [SI+Twenty_Five],AL ; Put the head number into message 1550 0869 E8 0C7D R Call U1000_Display_Message ; Display the message on the screeen 1551 ; 1552 086C B4 03 Mov AH,Read_Cursor_Command ; Get the current cursor position 1553 086E 8A 3E 150C R Mov BH,Byte Ptr SYS03_Active_Page 1554 0872 CD 10 Int Video_Interrupt ; ..End 1555 ; 1556 0874 FE CE Dec DH ; Save the row of the read track and 1557 0876 88 36 14FD R Mov Byte Ptr WRK24_Read_Message_Row,DH; . head message 1558 ; 1559 087A 5E Pop SI ; Restore SI = Addr of ES:BX table 1560 087B C2004: 1561 087B A0 1504 R Mov AL,Byte Ptr WRK31_Track_Read_Counter 1562 087E 3A 06 14F3 R Cmp AL,Byte Ptr WRK16_Maximum_Tracks 1563 0882 76 03 Jbe C2005 ; If more tracks, then continue 1564 0884 E9 090C R Jmp C2099 ; Go to the end of the module 1565 0887 C2005: 1566 0887 A1 14F5 R Mov AX,Word Ptr WRK18_Counter_ESBX_Entries 1567 088A 3B 06 14F7 R Cmp AX,Word Ptr WRK19_Number_ESBX_Entries 1568 088E 76 03 Jbe C2006 ; If more memory exists, continue 1569 0890 EB 7A 90 Jmp C2099 ; Go to the end of the module  The Microsoft MACRO Assembler , Version 1.27 Page 1-45 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1570 0893 C2006: 1571 ; ; Display the current track and head 1572 0893 A0 14FD R Mov AL,Byte Ptr WRK24_Read_Message_Row 1573 0896 A2 1501 R Mov Byte Ptr WRK28_Current_Message_Row,AL 1574 0899 A0 14F9 R Mov AL,Byte Ptr WRK20_Current_Source_Head 1575 089C A2 1502 R Mov Byte Ptr WRK29_Current_Head,AL 1576 089F A0 14FA R Mov AL,Byte Ptr WRK21_Current_Source_Track 1577 08A2 A2 1503 R Mov Byte Ptr WRK30_Current_Track,AL 1578 ; 1579 08A5 E8 0DB6 R Call U1400_Display_Head_and_Track 1580 ; 1581 ; Establish the disk parameters 1582 08A8 A0 1487 R Mov AL,Byte Ptr WRK01_Source_Drive 1583 08AB A2 14E7 R Mov Byte Ptr WRK06_Drive_Number,AL 1584 08AE A0 14F9 R Mov AL,Byte Ptr WRK20_Current_Source_Head 1585 08B1 A2 14E8 R Mov Byte Ptr WRK07_Head_Number,AL 1586 08B4 A0 14FA R Mov AL,Byte Ptr WRK21_Current_Source_Track 1587 08B7 A2 14E9 R Mov Byte Ptr WRK08_Track_Number,AL 1588 08BA C6 06 14EA R 01 Mov Byte Ptr WRK09_Sector_Number,One 1589 08BF A0 14F4 R Mov AL,Byte Ptr WRK17_Maximum_Sectors 1590 08C2 A2 14EB R Mov Byte Ptr WRK10_Number_of_Sectors,AL 1591 08C5 8B 04 Mov AX,DS:[SI] ; . 1592 08C7 8B D8 Mov BX,AX ; . 1593 08C9 8B 44 02 Mov AX,DS:[SI+Two] ; . 1594 08CC 8E C0 Mov ES,AX ; ..End 1595 ; 1596 08CE E8 0A8D R Call D1000_Read_Diskette ; Read the source diskette 1597 08D1 C2007: 1598 08D1 80 3E 0E28 R FF Cmp Byte Ptr FLG08_Good_Read,True 1599 08D6 74 0B Je C2008 ; If the read operation was 1600 ; . successful, then continue 1601 08D8 C6 06 0E2F R 01 Mov Byte Ptr FLG15_IO_Error,One 1602 08DD E8 0B68 R Call D1200_Disk_IO_Error ; Display appropriate error message 1603 08E0 EB 2A 90 Jmp C2099 ; Go to the end of the module 1604 08E3 C2008: 1605 08E3 FE 06 1504 R Inc Byte Ptr WRK31_Track_Read_Counter 1606 08E7 FF 06 14F5 R Inc Word Ptr WRK18_Counter_ESBX_Entries 1607 08EB 83 C6 04 Add SI,Four ; Increment addr of the ES:BX table 1608 08EE 80 3E 0E22 R 00 Cmp Byte Ptr FLG02_Double_Side,False 1609 08F3 74 10 Je C2009 ; If single sided, then continue 1610 08F5 FE 06 14F9 R Inc Byte Ptr WRK20_Current_Source_Head 1611 08F9 80 3E 14F9 R 01 Cmp Byte Ptr WRK20_Current_Source_Head,One 1612 08FE 76 09 Jbe C2010 ; If the head number is less than or 1613 ; . equal to one, then continue 1614 0900 C6 06 14F9 R 00 Mov Byte Ptr WRK20_Current_Source_Head,Zero 1615 0905 C2009: 1616 0905 FE 06 14FA R Inc Byte Ptr WRK21_Current_Source_Track 1617 0909 C2010: 1618 0909 E9 087B R Jmp C2004 ; Go back and read another track 1619 090C C2099:  The Microsoft MACRO Assembler , Version 1.27 Page 1-46 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1620 090C C3 Ret 1621 ; 1622 090D C2000_Read_Source_Disk Endp 1623 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-47 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1624 Page 1625 ;************************************************************************ 1626 ;* * 1627 ;* C2100_WRITE_FORMAT_TARGET_DISK * 1628 ;* * 1629 ;* This module formats and writes a diskette track by track * 1630 ;* until it fills all of available memory specified by the * 1631 ;* ES:BX table. The processing sequence is: * 1632 ;* * 1633 ;* 1. Initializes the SI resgister to point to the correct entry * 1634 ;* in the ES:BX table. * 1635 ;* * 1636 ;* 2. Prints the initial write message on the screen. * 1637 ;* * 1638 ;* 3. Compares for the end of the ES:BX table and/or the number * 1639 ;* of tracks on the diskette. If not, continue. If so, * 1640 ;* return to B1100_Detail_Processing. * 1641 ;* * 1642 ;* 4. Writes a track from the source diskette. * 1643 ;* * 1644 ;* 5. Displays the track and head numbers on the screen. * 1645 ;* * 1646 ;* 6. Transfers control to 3. * 1647 ;* * 1648 ;************************************************************************ 1649 ; 1650 Public C2100_Write_Format_Target_Disk 1651 ; 1652 090D C2100_Write_Format_Target_Disk Proc Near 1653 ; 1654 090D C2101: 1655 090D C6 06 0E29 R FF Mov Byte Ptr FLG09_Good_Write,True 1656 0912 C6 06 0E2B R FF Mov Byte Ptr FLG11_Good_Format,True 1657 ; 1658 0917 C6 06 14F0 R 05 Mov Byte Ptr WRK13_Retry_Counter,Number_of_Retries 1659 ; 1660 091C BE 15B0 R Mov SI,Offset MEM03_ESBX_Table 1661 091F C7 06 14F5 R 0000 Mov Word Ptr WRK18_Counter_ESBX_Entries,Zero 1662 ; 1663 0925 80 3E 0E2D R 00 Cmp Byte Ptr FLG13_First_Read_Write,False 1664 092A 74 08 Je C2102 ; If not first time, continue 1665 092C C6 06 1505 R 00 Mov Byte Ptr WRK32_Track_Write_Counter,Zero 1666 0931 EB 08 90 Jmp C2103 ; Go to display the message 1667 0934 C2102: 1668 0934 80 3E 0E24 R 00 Cmp Byte Ptr FLG04_Single_Drive,False 1669 0939 74 23 Je C2104 ; If double drive copy, continue 1670 093B C2103: 1671 093B 56 Push SI ; Save SI = Addr of ES:BX table 1672 ; 1673 093C BE 1444 R Mov SI,Offset MES97_Return_Linefeed  The Microsoft MACRO Assembler , Version 1.27 Page 1-48 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1674 093F E8 0C7D R Call U1000_Display_Message ; Display return and line feed 1675 0942 BE 123E R Mov SI,Offset MES23_Writing_Track 1676 0945 E8 0C7D R Call U1000_Display_Message ; Display write track message 1677 ; 1678 0948 B4 03 Mov AH,Read_Cursor_Command ; Get the current cursor position 1679 094A 8A 3E 150C R Mov BH,Byte Ptr SYS03_Active_Page 1680 094E CD 10 Int Video_Interrupt ; ..End 1681 ; 1682 0950 FE CE Dec DH ; Save the row of the I/O track and 1683 0952 88 36 1500 R Mov Byte Ptr WRK27_Write_Message_Row,DH; . head information 1684 0956 80 EE 02 Sub DH,Two ; . 1685 0959 88 36 14FD R Mov Byte Ptr WRK24_Read_Message_Row,DH 1686 ; 1687 095D 5E Pop SI ; Restore SI = Addr of ES:BX table 1688 095E C2104: 1689 095E A0 1505 R Mov AL,Byte Ptr WRK32_Track_Write_Counter 1690 0961 3A 06 14F3 R Cmp AL,Byte Ptr WRK16_Maximum_Tracks 1691 0965 76 08 Jbe C2105 ; If more tracks, then continue 1692 0967 C6 06 0E2E R FF Mov Byte Ptr FLG14_Copy_Complete,True 1693 096C EB 75 90 Jmp C2199 ; Go to the end of the module 1694 096F C2105: 1695 096F A1 14F5 R Mov AX,Word Ptr WRK18_Counter_ESBX_Entries 1696 0972 3B 06 14F7 R Cmp AX,Word Ptr WRK19_Number_ESBX_Entries 1697 0976 76 03 Jbe C2106 ; If more memory exists, continue 1698 0978 EB 69 90 Jmp C2199 ; Go to the end of the module 1699 097B C2106: 1700 ; ; Establish the disk parameters 1701 097B A0 1488 R Mov AL,Byte Ptr WRK02_Target_Drive 1702 097E A2 14E7 R Mov Byte Ptr WRK06_Drive_Number,AL 1703 0981 A0 14FB R Mov AL,Byte Ptr WRK22_Current_Target_Head 1704 0984 A2 14E8 R Mov Byte Ptr WRK07_Head_Number,AL 1705 0987 A0 14FC R Mov AL,Byte Ptr WRK23_Current_Target_Track 1706 098A A2 14E9 R Mov Byte Ptr WRK08_Track_Number,AL 1707 098D C6 06 14EA R 01 Mov Byte Ptr WRK09_Sector_Number,One 1708 0992 A0 14F4 R Mov AL,Byte Ptr WRK17_Maximum_Sectors 1709 0995 A2 14EB R Mov Byte Ptr WRK10_Number_of_Sectors,AL 1710 0998 8B 44 02 Mov AX,DS:[SI+Two] ; . 1711 099B A3 14EC R Mov Word Ptr WRK11_Segment_Address,AX 1712 099E 8B 04 Mov AX,DS:[SI] ; . 1713 09A0 A3 14EE R Mov Word Ptr WRK12_Offset_Address,AX 1714 ; 1715 09A3 E8 0AC9 R Call D1100_Write_Format_Diskette 1716 ; 1717 09A6 80 3E 0E2B R FF Cmp Byte Ptr FLG11_Good_Format,True 1718 09AB 74 0D Je C2107 ; If a good format, continue 1719 09AD 80 3E 0E29 R FF Cmp Byte Ptr FLG09_Good_Write,True 1720 09B2 74 06 Je C2107 ; If a good write, continue 1721 09B4 E8 0B68 R Call D1200_Disk_IO_Error ; Display appropriate error message 1722 09B7 EB 2A 90 Jmp C2199 ; Go to the end of the module 1723 09BA C2107:  The Microsoft MACRO Assembler , Version 1.27 Page 1-49 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1724 09BA FE 06 1505 R Inc Byte Ptr WRK32_Track_Write_Counter 1725 09BE FF 06 14F5 R Inc Word Ptr WRK18_Counter_ESBX_Entries 1726 09C2 83 C6 04 Add SI,Four ; Increment addr of the ES:BX table 1727 09C5 80 3E 0E22 R 00 Cmp Byte Ptr FLG02_Double_Side,False 1728 09CA 74 10 Je C2108 ; If single sided, then continue 1729 09CC FE 06 14FB R Inc Byte Ptr WRK22_Current_Target_Head 1730 09D0 80 3E 14FB R 01 Cmp Byte Ptr WRK22_Current_Target_Head,One 1731 09D5 76 09 Jbe C2109 ; If the head number is less than or 1732 ; . equal to one, then continue 1733 09D7 C6 06 14FB R 00 Mov Byte Ptr WRK22_Current_Target_Head,Zero 1734 09DC C2108: 1735 09DC FE 06 14FC R Inc Byte Ptr WRK23_Current_Target_Track 1736 09E0 C2109: 1737 09E0 E9 095E R Jmp C2104 ; Go back and write another track 1738 09E3 C2199: 1739 09E3 C3 Ret 1740 ; 1741 09E4 C2100_Write_Format_Target_Disk Endp 1742 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-50 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1743 Page 1744 ;************************************************************************ 1745 ;* * 1746 ;* C2200_CHECK_FILE_ALLOC_TABLE * 1747 ;* * 1748 ;* This module checks the File Allocation Table (FAT) of the * 1749 ;* diskette in the source drive and compares it with the File * 1750 ;* Allocation Table (FAT) of the original source diskette. If * 1751 ;* there are any differences, the program sets the flag * 1752 ;* FLG12_Good_FAT to False; otherwise, the flag is True. * 1753 ;* * 1754 ;************************************************************************ 1755 ; 1756 Public C2200_Check_File_Alloc_Table 1757 ; 1758 09E4 C2200_Check_File_Alloc_Table Proc Near 1759 ; 1760 09E4 C2201: 1761 09E4 C6 06 0E2C R FF Mov Byte Ptr FLG12_Good_FAT,True 1762 ; 1763 09E9 A0 1487 R Mov AL,Byte Ptr WRK01_Source_Drive 1764 09EC A2 14E7 R Mov Byte Ptr WRK06_Drive_Number,AL 1765 09EF C6 06 14E8 R 00 Mov Byte Ptr WRK07_Head_Number,Zero 1766 09F4 C6 06 14E9 R 00 Mov Byte Ptr WRK08_Track_Number,Zero 1767 09F9 C6 06 14EA R 02 Mov Byte Ptr WRK09_Sector_Number,Two 1768 09FE C6 06 14EB R 01 Mov Byte Ptr WRK10_Number_of_Sectors,One 1769 0A03 0E Push CS ; Establish the ES segment register 1770 0A04 07 Pop ES ; . 1771 0A05 06 Push ES ; ..End 1772 0A06 BB 2430 R Mov BX,Offset MEM00_Bottom_Free_Memory 1773 0A09 80 3E 152A R 00 Cmp SYS19_Major_Vers_Number,Zero 1774 0A0E 74 07 Je C2202 ; If PC DOS 1.0 or 1.1, continue; 1775 ; . otherwise, set up ES:BX a little 1776 0A10 8E 06 152C R Mov ES,Word Ptr SYS21_Alloc_Segment 1777 0A14 BB 0000 Mov BX,Zero ; . differently 1778 0A17 C2202: 1779 0A17 E8 0A8D R Call D1000_Read_Diskette ; Read the File Allocation Table 1780 0A1A 07 Pop ES ; Restore ES in any case 1781 ; 1782 0A1B 80 3E 0E28 R FF Cmp Byte Ptr FLG08_Good_Read,True 1783 0A20 74 0B Je C2203 ; If the read operation was 1784 ; . successful, continue 1785 0A22 C6 06 0E2F R 01 Mov Byte Ptr FLG15_IO_Error,One 1786 0A27 E8 0B68 R Call D1200_Disk_IO_Error ; Display appropriate error message 1787 0A2A EB 39 90 Jmp C2299 ; Go to the end of the module 1788 0A2D C2203: 1789 0A2D BE 2230 R Mov SI,Offset MEM01_File_Allocation_Table 1790 0A30 BF 2430 R Mov DI,Offset MEM00_Bottom_Free_Memory 1791 0A33 06 Push ES ; Save ES for a moment 1792 0A34 80 3E 152A R 00 Cmp Byte Ptr SYS19_Major_Vers_Number,Zero  The Microsoft MACRO Assembler , Version 1.27 Page 1-51 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1793 0A39 74 07 Je C2204 ; If PC DOS 1.0 or 1.1, continue 1794 0A3B 8E 06 152C R Mov ES,Word Ptr SYS21_Alloc_Segment 1795 0A3F BF 0000 Mov DI,Zero ; Set up ES:DI for PC DOS 2.0+ 1796 0A42 C2204: 1797 0A42 B9 0200 Mov CX,Sector_Size ; Set counter CX to compare the 1798 ; . sector size in words 1799 0A45 D1 E9 Shr CX,1 ; ..End 1800 0A47 FC Cld ; Clear the direction flag 1801 0A48 F3/ A7 Rep Cmpsw ; Compare all of the 512 bytes 1802 0A4A 75 03 Jne C2205 ; If there is a discrepancy, go to 1803 ; . the error message routine 1804 0A4C EB 16 90 Jmp C2206 ; Go to the end of the module 1805 0A4F C2205: 1806 0A4F 07 Pop ES ; Restore the ES register 1807 0A50 C6 06 0E2C R 00 Mov Byte Ptr FLG12_Good_FAT,False 1808 0A55 BE 11A7 R Mov SI,Offset MES19_Unrecoverable_Read 1809 0A58 E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 1810 0A5B BE 13CC R Mov SI,Offset MES90_Unknown_FAT_Error 1811 0A5E E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 1812 0A61 EB 02 90 Jmp C2299 ; Go to the end of the module 1813 0A64 C2206: 1814 0A64 07 Pop ES ; Restore the ES register 1815 0A65 C2299: 1816 0A65 C3 Ret 1817 ; 1818 0A66 C2200_Check_File_Alloc_Table Endp 1819 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-52 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1820 Page 1821 ;************************************************************************ 1822 ;* * 1823 ;* C2300_FREE_MEMORY * 1824 ;* * 1825 ;* This module free up allocated memory, provided that a user * 1826 ;* is running PC DOS 2.0 or greater; otherwise, it does nothing. * 1827 ;* * 1828 ;************************************************************************ 1829 ; 1830 Public C2300_Free_Memory 1831 ; 1832 0A66 C2300_Free_Memory Proc Near 1833 ; 1834 0A66 C2301: 1835 0A66 80 3E 152A R 00 Cmp Byte Ptr SYS19_Major_Vers_Number,Zero 1836 0A6B 74 1F Je C2399 ; If PC DOS 1.0 or 1.1, go to the 1837 ; . end of the module 1838 0A6D 80 3E 0E30 R FF Cmp Byte Ptr FLG16_Free_Memory,True 1839 0A72 74 18 Je C2399 ; If memory was not allocated, go 1840 ; . to the end of the module 1841 ; 1842 0A74 B4 49 Mov AH,Free_Memory ; Free allocated memory 1843 0A76 06 Push ES ; . 1844 0A77 8E 06 152C R Mov ES,Word Ptr SYS21_Alloc_Segment 1845 0A7B CD 21 Int PC_DOS_Interrupt ; . 1846 0A7D 07 Pop ES ; . 1847 0A7E 73 0C Jnc C2399 ; ..End 1848 ; 1849 0A80 BE 1444 R Mov SI,Offset MES97_Return_Linefeed 1850 0A83 E8 0C7D R Call U1000_Display_Message ; Issue a carriage return/linefeed 1851 0A86 BE 144C R Mov SI,Offset MES99_Memory_Block_Destroyed 1852 0A89 E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 1853 0A8C C2399: 1854 0A8C C3 Ret 1855 ; 1856 0A8D C2300_Free_Memory Endp 1857 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-53 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1858 Page 1859 ;************************************************************************ 1860 ;* * 1861 ;* D1000_READ_DISKETTE * 1862 ;* * 1863 ;* This module reads a track at a time from a diskette. If it * 1864 ;* fails to read the diskette it tries Number_of_Retries = 5 * 1865 ;* times. * 1866 ;* * 1867 ;************************************************************************ 1868 ; 1869 Public D1000_Read_Diskette 1870 ; 1871 0A8D D1000_Read_Diskette Proc Near 1872 ; 1873 0A8D D1001: 1874 0A8D C6 06 14F0 R 05 Mov Byte Ptr WRK13_Retry_Counter,Number_of_Retries 1875 0A92 D1002: 1876 0A92 F8 Clc ; Clear the carry flag 1877 0A93 B4 02 Mov AH,Read_Command ; Read the data on the diskette 1878 0A95 8A 16 14E7 R Mov DL,Byte Ptr WRK06_Drive_Number 1879 0A99 8A 36 14E8 R Mov DH,Byte Ptr WRK07_Head_Number 1880 0A9D 8A 2E 14E9 R Mov CH,Byte Ptr WRK08_Track_Number 1881 0AA1 8A 0E 14EA R Mov CL,Byte Ptr WRK09_Sector_Number 1882 0AA5 A0 14EB R Mov AL,Byte Ptr WRK10_Number_of_Sectors 1883 0AA8 CD 13 Int Disk_Interrupt ; ..End 1884 ; 1885 0AAA 88 26 14F1 R Mov Byte Ptr WRK14_Status_Operation,AH 1886 0AAE 73 18 Jnc D1099 ; Go to the end of the module 1887 0AB0 D1003: 1888 0AB0 FE 0E 14F0 R Dec Byte Ptr WRK13_Retry_Counter 1889 0AB4 74 0D Jz D1004 ; Could not read the diskette 1890 0AB6 F8 Clc ; Clear the carry flag 1891 0AB7 B4 00 Mov AH,Reset_Command ; Initialize the disk controller 1892 0AB9 CD 13 Int Disk_Interrupt ; . 1893 0ABB 88 26 14F1 R Mov Byte Ptr WRK14_Status_Operation,AH 1894 0ABF 73 D1 Jnc D1002 ; . 1895 0AC1 EB ED Jmp D1003 ; ..End 1896 0AC3 D1004: 1897 0AC3 C6 06 0E28 R 00 Mov Byte Ptr FLG08_Good_Read,False 1898 0AC8 D1099: 1899 0AC8 C3 Ret 1900 ; 1901 0AC9 D1000_Read_Diskette Endp 1902 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-54 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1903 Page 1904 ;************************************************************************ 1905 ;* * 1906 ;* D1100_WRITE_FORMAT_DISKETTE * 1907 ;* * 1908 ;* This module formats and writes a track at a time to a * 1909 ;* diskette. If it fails to format or a write a track, it tries * 1910 ;* Number_of_Retries = 5 times. * 1911 ;* * 1912 ;************************************************************************ 1913 ; 1914 Public D1100_Write_Format_Diskette 1915 ; 1916 0AC9 D1100_Write_Format_Diskette Proc Near 1917 ; 1918 0AC9 D1101: 1919 0AC9 C6 06 14F0 R 05 Mov Byte Ptr WRK13_Retry_Counter,Number_of_Retries 1920 0ACE D1102: 1921 0ACE F8 Clc ; Clear the carry flag 1922 0ACF B4 05 Mov AH,Format_Command ; Format the diskette 1923 0AD1 8A 16 14E7 R Mov DL,Byte Ptr WRK06_Drive_Number 1924 0AD5 8A 36 14E8 R Mov DH,Byte Ptr WRK07_Head_Number 1925 0AD9 8A 2E 14E9 R Mov CH,Byte Ptr WRK08_Track_Number 1926 0ADD 8A 0E 14EA R Mov CL,Byte Ptr WRK09_Sector_Number 1927 0AE1 A0 14EB R Mov AL,Byte Ptr WRK10_Number_of_Sectors 1928 0AE4 0E Push CS ; . 1929 0AE5 07 Pop ES ; . 1930 0AE6 8B 1E 1506 R Mov BX,Word Ptr WRK33_CHRN_Table_Address 1931 0AEA CD 13 Int Disk_Interrupt ; ..End 1932 0AEC 88 26 14F1 R Mov Byte Ptr WRK14_Status_Operation,AH 1933 0AF0 73 20 Jnc D1105 ; Formatted the diskette 1934 0AF2 D1103: 1935 0AF2 FE 0E 14F0 R Dec Byte Ptr WRK13_Retry_Counter 1936 0AF6 74 0D Jz D1104 ; Go to format error processing 1937 0AF8 F8 Clc ; Clear the carry flag 1938 0AF9 B4 00 Mov AH,Reset_Command ; Initialize the disk controller 1939 0AFB CD 13 Int Disk_Interrupt ; . 1940 0AFD 88 26 14F1 R Mov Byte Ptr WRK14_Status_Operation,AH 1941 0B01 73 CB Jnc D1102 ; Try to format the disk again 1942 0B03 EB ED Jmp D1103 ; Try to initialize the disk again 1943 0B05 D1104: 1944 0B05 C6 06 0E2F R 00 Mov Byte Ptr FLG15_IO_Error,Zero 1945 0B0A C6 06 0E2B R 00 Mov Byte Ptr FLG11_Good_Format,False 1946 0B0F EB 56 90 Jmp D1199 ; Go to the end of the module 1947 0B12 D1105: 1948 0B12 C6 06 14F0 R 05 Mov Byte Ptr WRK13_Retry_Counter,Number_of_Retries 1949 0B17 D1106: 1950 0B17 F8 Clc ; Clear the carry flag 1951 0B18 B4 03 Mov AH,Write_Command ; Write the diskette 1952 0B1A 8E 06 14EC R Mov ES,Word Ptr WRK11_Segment_Address  The Microsoft MACRO Assembler , Version 1.27 Page 1-55 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1953 0B1E 8B 1E 14EE R Mov BX,Word Ptr WRK12_Offset_Address 1954 0B22 A0 14EB R Mov AL,Byte Ptr WRK10_Number_of_Sectors 1955 0B25 CD 13 Int Disk_Interrupt ; . 1956 0B27 88 26 14F1 R Mov Byte Ptr WRK14_Status_Operation,AH 1957 0B2B 73 20 Jnc D1109 ; ..End 1958 0B2D D1107: 1959 0B2D FE 0E 14F0 R Dec Byte Ptr WRK13_Retry_Counter 1960 0B31 74 0D Jz D1108 ; Go to write error processing 1961 0B33 F8 Clc ; Clear the carry flag 1962 0B34 B4 00 Mov AH,Reset_Command ; Initialize the disk controller 1963 0B36 CD 13 Int Disk_Interrupt ; . 1964 0B38 88 26 14F1 R Mov Byte Ptr WRK14_Status_Operation,AH 1965 0B3C 73 D9 Jnc D1106 ; . 1966 0B3E EB ED Jmp D1107 ; ..End 1967 0B40 D1108: 1968 0B40 C6 06 0E2F R 02 Mov Byte Ptr FLG15_IO_Error,Two 1969 0B45 C6 06 0E29 R 00 Mov Byte Ptr FLG09_Good_Write,False 1970 0B4A EB 1B 90 Jmp D1199 ; Go to the end of the module 1971 0B4D D1109: 1972 0B4D 83 06 1506 R 24 Add Word Ptr WRK33_CHRN_Table_Address,Thirty_Six 1973 ; 1974 0B52 A0 1500 R Mov AL,Byte Ptr WRK27_Write_Message_Row 1975 0B55 A2 1501 R Mov Byte Ptr WRK28_Current_Message_Row,AL 1976 0B58 A0 14FB R Mov AL,Byte Ptr WRK22_Current_Target_Head 1977 0B5B A2 1502 R Mov Byte Ptr WRK29_Current_Head,AL 1978 0B5E A0 14FC R Mov AL,Byte Ptr WRK23_Current_Target_Track 1979 0B61 A2 1503 R Mov Byte Ptr WRK30_Current_Track,AL 1980 0B64 E8 0DB6 R Call U1400_Display_Head_and_Track 1981 0B67 D1199: 1982 0B67 C3 Ret 1983 ; 1984 0B68 D1100_Write_Format_Diskette Endp 1985 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-56 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 1986 Page 1987 ;************************************************************************ 1988 ;* * 1989 ;* D1200_DISK_IO_ERROR * 1990 ;* * 1991 ;* This module fans out a disk error. It tells a user if it * 1992 ;* occured on a read, format or write operation. If it cannot * 1993 ;* determine the nature of the error, the routine displays an * 1994 ;* unknown disk error message. * 1995 ;* * 1996 ;************************************************************************ 1997 ; 1998 Public D1200_Disk_IO_Error 1999 ; 2000 0B68 D1200_Disk_IO_Error Proc Near 2001 ; 2002 0B68 D1201: 2003 0B68 80 3E 14F1 R 80 Cmp Byte Ptr WRK14_Status_Operation,Time_Out_Error 2004 0B6D 75 11 Jne D1202 ; If not time out error, continue 2005 0B6F BE 1020 R Mov SI,Offset MES08_Drive_Not_Ready 2006 0B72 A0 14E7 R Mov AL,Byte Ptr WRK06_Drive_Number 2007 0B75 04 41 Add AL,Capital_Letter_A ; Convert drive number to a letter 2008 0B77 88 44 18 Mov [SI+Twenty_Four],AL ; Put the drive letter into position 2009 0B7A E8 0C7D R Call U1000_Display_Message 2010 0B7D E9 0C28 R Jmp D1299 ; Go to the end of the module 2011 0B80 D1202: 2012 0B80 80 3E 0E2F R 00 Cmp Byte Ptr FLG15_IO_Error,Zero 2013 0B85 75 06 Jne D1203 ; If not a format error, continue 2014 0B87 BE 117D R Mov SI,Offset MES18_Unrecoverable_Format 2015 0B8A EB 1E 90 Jmp D1206 ; Continue processing 2016 0B8D D1203: 2017 0B8D 80 3E 0E2F R 01 Cmp Byte Ptr FLG15_IO_Error,One 2018 0B92 75 06 Jne D1204 ; If not a read error, continue 2019 0B94 BE 11A7 R Mov SI,Offset MES19_Unrecoverable_Read 2020 0B97 EB 11 90 Jmp D1206 ; Continue processing 2021 0B9A D1204: 2022 0B9A 80 3E 0E2F R 02 Cmp Byte Ptr FLG15_IO_Error,Two 2023 0B9F 75 06 Jne D1205 ; If not a write error, continue 2024 0BA1 BE 11F9 R Mov SI,Offset MES21_Unrecoverable_Write 2025 0BA4 EB 04 90 Jmp D1206 ; Continue processing 2026 0BA7 D1205: 2027 0BA7 BE 1222 R Mov SI,Offset MES22_Unrecoverable_IO 2028 0BAA D1206: 2029 0BAA E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 2030 0BAD D1207: 2031 0BAD 80 3E 14F1 R 40 Cmp Byte Ptr WRK14_Status_Operation,Seek_Error 2032 0BB2 75 06 Jne D1208 ; If not a seek error, continue 2033 0BB4 BE 1268 R Mov SI,Offset MES80_Seek_Error 2034 0BB7 EB 6C 90 Jmp D1217 ; Continue processing 2035 0BBA D1208:  The Microsoft MACRO Assembler , Version 1.27 Page 1-57 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 2036 0BBA 80 3E 14F1 R 20 Cmp Byte Ptr WRK14_Status_Operation,Controller_Error 2037 0BBF 75 06 Jne D1209 ; If not a controller error, continue 2038 0BC1 BE 1285 R Mov SI,Offset MES81_Controller_Error 2039 0BC4 EB 5F 90 Jmp D1217 ; Continue processing 2040 0BC7 D1209: 2041 0BC7 80 3E 14F1 R 10 Cmp Byte Ptr WRK14_Status_Operation,CRC_Error 2042 0BCC 75 06 Jne D1210 ; If not a CRC error, continue 2043 0BCE BE 12A3 R Mov SI,Offset MES82_CRC_Error 2044 0BD1 EB 52 90 Jmp D1217 ; Continue processing 2045 0BD4 D1210: 2046 0BD4 80 3E 14F1 R 09 Cmp Byte Ptr WRK14_Status_Operation,DMA_Boundary_Error 2047 0BD9 75 06 Jne D1211 ; If not DMA boundary error, continue 2048 0BDB BE 12CA R Mov SI,Offset MES83_DMA_Boundary_Error 2049 0BDE EB 45 90 Jmp D1217 ; Continue processing 2050 0BE1 D1211: 2051 0BE1 80 3E 14F1 R 08 Cmp Byte Ptr WRK14_Status_Operation,DMA_Error 2052 0BE6 75 06 Jne D1212 ; If not a DMA error, continue 2053 0BE8 BE 12F4 R Mov SI,Offset MES84_DMA_Error 2054 0BEB EB 38 90 Jmp D1217 ; Continue processing 2055 0BEE D1212: 2056 0BEE 80 3E 14F1 R 04 Cmp Byte Ptr WRK14_Status_Operation,Sector_Error 2057 0BF3 75 06 Jne D1213 ; If not a sector error, continue 2058 0BF5 BE 1314 R Mov SI,Offset MES85_Sector_Error 2059 0BF8 EB 2B 90 Jmp D1217 ; Continue processing 2060 0BFB D1213: 2061 0BFB 80 3E 14F1 R 03 Cmp Byte Ptr WRK14_Status_Operation,Write_Protect_Error 2062 0C00 75 06 Jne D1214 ; If not write protected, continue 2063 0C02 BE 1332 R Mov SI,Offset MES86_Write_Protect_Error 2064 0C05 EB 1E 90 Jmp D1217 ; Continue processing 2065 0C08 D1214: 2066 0C08 80 3E 14F1 R 02 Cmp Byte Ptr WRK14_Status_Operation,Address_Mark_Error 2067 0C0D 75 06 Jne D1215 ; If not addr mark error, continue 2068 0C0F BE 1358 R Mov SI,Offset MES87_Address_Mark_Error 2069 0C12 EB 11 90 Jmp D1217 ; Continue processing 2070 0C15 D1215: 2071 0C15 80 3E 14F1 R 01 Cmp Byte Ptr WRK14_Status_Operation,Command_Error 2072 0C1A 75 06 Jne D1216 ; If not a command error, continue 2073 0C1C BE 1376 R Mov SI,Offset MES88_Command_Error 2074 0C1F EB 04 90 Jmp D1217 ; Continue processing 2075 0C22 D1216: 2076 0C22 BE 13A6 R Mov SI,Offset MES89_Unknown_Error 2077 0C25 D1217: 2078 0C25 E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 2079 0C28 D1299: 2080 0C28 C3 Ret 2081 ; 2082 0C29 D1200_Disk_IO_Error Endp 2083 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-58 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 2084 Page 2085 ;************************************************************************ 2086 ;* * 2087 ;* S1000_SETUP_DISK_PARAM_TABLE * 2088 ;* * 2089 ;* This module sets up the Disk Parameter Table (Int 1EH) so that * 2090 ;* it points to the disk parameters for PC DOS 2.1 contained in * 2091 ;* this program. * 2092 ;* * 2093 ;************************************************************************ 2094 ; 2095 Public S1000_Setup_Disk_Param_Table 2096 ; 2097 0C29 S1000_Setup_Disk_Param_Table Proc Near 2098 ; 2099 0C29 S1001: 2100 0C29 50 Push AX ; Save the registers 2101 0C2A 53 Push BX ; . 2102 0C2B 1E Push DS ; ..End 2103 ; 2104 0C2C FA Cli ; Turn off the interrupts 2105 2106 ; 2107 0C2D 2B C0 Sub AX,AX ; Initialize DS to Absolute Zero 2108 0C2F 8E D8 Mov DS,AX ; ..End 2109 ; 2110 0C31 BB 0078 Mov BX,Disk_Parameter_Addr ; Save and redirect the address 2111 0C34 8B 07 Mov AX,[BX] ; . 2112 0C36 2E: A3 151B R Mov Word Ptr CS:SYS16_Save_DPT_Offset,AX 2113 0C3A 8B 47 02 Mov AX,[BX+Two] ; . 2114 0C3D 2E: A3 151D R Mov Word Ptr CS:SYS17_Save_DPT_Segment,AX 2115 ; . 2116 0C41 B8 151F R Mov AX,Offset SYS18_Disk_Parameter_Table 2117 0C44 89 07 Mov [BX],AX ; . 2118 0C46 8C C8 Mov AX,CS ; . 2119 0C48 89 47 02 Mov [BX+Two],AX ; ..End 2120 ; 2121 0C4B FB Sti ; Turn on interrupts 2122 ; 2123 0C4C 1F Pop DS ; Restore the registers 2124 0C4D 5B Pop BX ; . 2125 0C4E 58 Pop AX ; ..End 2126 0C4F S1099: 2127 0C4F C3 Ret 2128 ; 2129 0C50 S1000_Setup_Disk_Param_Table Endp 2130 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-59 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 2131 Page 2132 ;************************************************************************ 2133 ;* * 2134 ;* S1100_RESTORE_DISK_PARAM_TABLE * 2135 ;* * 2136 ;* This module restores the Disk Parameter Table to its original * 2137 ;* address in PC DOS. * 2138 ;* * 2139 ;************************************************************************ 2140 ; 2141 Public S1100_Restore_Disk_Param_Table 2142 ; 2143 0C50 S1100_Restore_Disk_Param_Table Proc Near 2144 ; 2145 0C50 S1101: 2146 0C50 50 Push AX ; Save the registers 2147 0C51 53 Push BX ; . 2148 0C52 1E Push DS ; ..End 2149 ; 2150 0C53 FA Cli ; Turn off the interrupts 2151 ; 2152 0C54 2B C0 Sub AX,AX ; Initialize DS to Absolute Zero 2153 0C56 8E D8 Mov DS,AX ; ..End 2154 ; 2155 0C58 BB 0078 Mov BX,Disk_Parameter_Addr ; Restore Disk Parameter Address 2156 0C5B 2E: A1 151B R Mov AX,Word Ptr CS:SYS16_Save_DPT_Offset 2157 0C5F 89 07 Mov [BX],AX ; . 2158 0C61 2E: A1 151D R Mov AX,Word Ptr CS:SYS17_Save_DPT_Segment 2159 0C65 89 47 02 Mov [BX+Two],AX ; ..End 2160 ; 2161 0C68 FB Sti ; Turn on the interrupts 2162 ; 2163 0C69 1F Pop DS ; Restore the registers 2164 0C6A 5B Pop BX ; . 2165 0C6B 58 Pop AX ; ..End 2166 0C6C S1199: 2167 0C6C C3 Ret 2168 ; 2169 0C6D S1100_Restore_Disk_Param_Table Endp 2170 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-60 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 2171 Page 2172 ;************************************************************************ 2173 ;* * 2174 ;* S1200_GET_VERSION_NUMBER * 2175 ;* * 2176 ;* This module gets the current version number of PC DOS and * 2177 ;* stores the information in determining whether to allocate * 2178 ;* memory using the PC DOS 2.0 function calls. * 2179 ;* * 2180 ;************************************************************************ 2181 ; 2182 Public S1200_Get_Version_Number 2183 ; 2184 0C6D S1200_Get_Version_Number Proc Near 2185 ; 2186 0C6D S1201: 2187 0C6D 50 Push AX ; Save the registers and flags 2188 0C6E 9C Pushf ; ..End 2189 ; 2190 0C6F B4 30 Mov AH,Get_DOS_Version_Number 2191 0C71 CD 21 Int PC_DOS_Interrupt 2192 0C73 A2 152A R Mov Byte Ptr SYS19_Major_Vers_Number,AL 2193 0C76 88 26 152B R Mov Byte Ptr SYS20_Minor_Vers_Number,AH 2194 ; 2195 0C7A 9D Popf ; Restore the registers and flags 2196 0C7B 58 Pop AX ; ..End 2197 0C7C S1299: 2198 0C7C C3 Ret 2199 ; 2200 0C7D S1200_Get_Version_Number Endp 2201 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-61 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 2202 Page 2203 ;************************************************************************ 2204 ;* * 2205 ;* U1000_DISPLAY_MESSAGE * 2206 ;* * 2207 ;* This module displays a message on the screen. Before calling * 2208 ;* this module, the offset of the message should be in SI * 2209 ;* relative to the DS register. This routine preserves the * 2210 ;* registers and the flags. * 2211 ;* * 2212 ;************************************************************************ 2213 ; 2214 Public U1000_Display_Message 2215 ; 2216 0C7D U1000_Display_Message Proc Near 2217 ; 2218 0C7D U1001: 2219 0C7D 50 Push AX ; Save the registers and flags 2220 0C7E 53 Push BX ; . 2221 0C7F 56 Push SI ; . 2222 0C80 9C Pushf ; ..End 2223 0C81 U1002: 2224 0C81 8A 04 Mov AL,[SI] ; Put the character into AL 2225 0C83 3C FF Cmp AL,EOT ; Compare for the end of the string 2226 0C85 74 0F Je U1090 ; If so, go to end of the module 2227 0C87 B4 0E Mov AH,Write_TTY_Command ; Write the Character 2228 0C89 8A 3E 150C R Mov BH,Byte Ptr SYS03_Active_Page 2229 0C8D 8A 1E 150D R Mov BL,Byte Ptr SYS04_Foreground_Color 2230 0C91 CD 10 Int Video_Interrupt ; ..End 2231 0C93 46 Inc SI ; Increment the SI counter 2232 0C94 EB EB Jmp U1002 ; Go back and try again 2233 0C96 U1090: 2234 0C96 9D Popf ; Restore the registers and flags 2235 0C97 5E Pop SI ; . 2236 0C98 5B Pop BX ; . 2237 0C99 58 Pop AX ; ..End 2238 0C9A U1099: 2239 0C9A C3 Ret 2240 ; 2241 0C9B U1000_Display_Message Endp 2242 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-62 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 2243 Page 2244 ;************************************************************************ 2245 ;* * 2246 ;* U1100_GET_RESPONSE * 2247 ;* * 2248 ;* This module gets the response from the keyboard and displays * 2249 ;* the information on the video display unit. The keyboard * 2250 ;* buffer is WRK05_Keyboard_Buffer. The first byte of this * 2251 ;* buffer contains the length of the buffer and must be less * 2252 ;* than or equal to 80 characters. The next 80 characters are * 2253 ;* the acutal buffer. The character EOT denotes the end of the * 2254 ;* buffer and can occur in any one of the 80 characters. * 2255 ;* * 2256 ;************************************************************************ 2257 ; 2258 Public U1100_Get_Response 2259 ; 2260 0C9B U1100_Get_Response Proc Near 2261 ; 2262 0C9B U1101: 2263 0C9B 50 Push AX ; Save the registers and flags 2264 0C9C 53 Push BX ; . 2265 0C9D 51 Push CX ; . 2266 0C9E 56 Push SI ; . 2267 0C9F 9C Pushf ; ..End 2268 0CA0 U1102: 2269 0CA0 BE 1496 R Mov SI,Offset WRK05_Keyboard_Buffer+1 2270 0CA3 B9 0000 Mov CX,NUL ; Initialize the CX counter register 2271 0CA6 U1103: 2272 0CA6 B4 0C Mov AH,Flush_Keyboard_Command; Read the character from keyboard 2273 0CA8 B0 07 Mov AL,Read_Keyboard_Command; . 2274 0CAA CD 21 Int PC_DOS_Interrupt ; ..End 2275 0CAC 3C 03 Cmp AL,ETX ; Compare for a control break 2276 0CAE 75 09 Jne U1104 ; If not, then continue 2277 0CB0 BE 1447 R Mov SI,Offset MES98_Control_Break 2278 0CB3 E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 2279 0CB6 E9 012F R Jmp A1002 ; Go to B1200_Final_Process 2280 0CB9 U1104: 2281 0CB9 80 3E 0E25 R FF Cmp Byte Ptr FLG05_Store_Buffer,True 2282 0CBE 74 03 Je U1105 ; If store keyboard entries, continue 2283 0CC0 EB 7B 90 Jmp U1190 ; If not, go to end of the module 2284 0CC3 U1105: 2285 0CC3 3C 08 Cmp AL,BS ; Is AL a backspace character??? 2286 0CC5 75 33 Jne U1106 ; If not, continue processing AL 2287 0CC7 83 F9 00 Cmp CX,NUL ; Is the cursor at column zero???? 2288 0CCA 74 DA Je U1103 ; Yes, so get another character 2289 0CCC 49 Dec CX ; Decrement CX to point to the 2290 ; . previous cursor location 2291 0CCD 4E Dec SI ; Decrement SI to go back to the 2292 ; . previos buffer location  The Microsoft MACRO Assembler , Version 1.27 Page 1-63 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 2293 ; 2294 0CCE B4 0E Mov AH,Write_TTY_Command ; Write a backspace to the screen 2295 0CD0 B0 08 Mov AL,BS ; . 2296 0CD2 8A 3E 150C R Mov BH,Byte Ptr SYS03_Active_Page 2297 0CD6 8A 1E 150D R Mov BL,Byte Ptr SYS04_Foreground_Color 2298 0CDA CD 10 Int Video_Interrupt ; ..End 2299 ; 2300 0CDC B4 0E Mov AH,Write_TTY_Command ; Write a space to the screen 2301 0CDE B0 20 Mov AL,Space ; . 2302 0CE0 8A 3E 150C R Mov BH,Byte Ptr SYS03_Active_Page 2303 0CE4 8A 1E 150D R Mov BL,Byte Ptr SYS04_Foreground_Color 2304 0CE8 CD 10 Int Video_Interrupt ; ..End 2305 ; 2306 0CEA B4 0E Mov AH,Write_TTY_Command ; Write a backspace to the screen 2307 0CEC B0 08 Mov AL,BS ; . 2308 0CEE 8A 3E 150C R Mov BH,Byte Ptr SYS03_Active_Page 2309 0CF2 8A 1E 150D R Mov BL,Byte Ptr SYS04_Foreground_Color 2310 0CF6 CD 10 Int Video_Interrupt ; ..End 2311 ; 2312 0CF8 EB AC Jmp U1103 ; Go back and get another character 2313 0CFA U1106: 2314 0CFA 3C 0D Cmp AL,CR ; Compare char for a carriage return 2315 0CFC 74 1B Je U1108 ; If so, insert an EOT into buffer 2316 0CFE 83 F9 50 Cmp CX,Keyboard_Buffer_Size ; Check for keyboard buffer full 2317 0D01 73 06 Jae U1107 ; If so, sound bell and get new char 2318 0D03 88 04 Mov [SI],AL ; Put the character into the buffer 2319 0D05 46 Inc SI ; Increment the keyboard address 2320 0D06 41 Inc CX ; Increment the CX character counter 2321 0D07 EB 9D Jmp U1103 ; Go back and get another character 2322 0D09 U1107: 2323 0D09 B4 0E Mov AH,Write_TTY_Command ; Sound the beep from the screen 2324 0D0B B0 07 Mov AL,Bell ; . 2325 0D0D 8A 3E 150C R Mov BH,Byte Ptr SYS03_Active_Page 2326 0D11 8A 1E 150D R Mov BL,Byte Ptr SYS04_Foreground_Color 2327 0D15 CD 10 Int Video_Interrupt ; ..End 2328 0D17 EB 8D Jmp U1103 ; Go back and get another character 2329 0D19 U1108: 2330 0D19 B0 FF Mov AL,EOT ; Put an EOT into the buffer 2331 0D1B 88 04 Mov [SI],AL ; ..End 2332 ; 2333 0D1D B4 0E Mov AH,Write_TTY_Command ; Write a carriage return to the 2334 0D1F B0 0D Mov AL,CR ; . screen 2335 0D21 8A 3E 150C R Mov BH,Byte Ptr SYS03_Active_Page 2336 0D25 8A 1E 150D R Mov BL,Byte Ptr SYS04_Foreground_Color 2337 0D29 CD 10 Int Video_Interrupt ; ..End 2338 ; 2339 0D2B B4 0E Mov AH,Write_TTY_Command ; Write a line feed to the screen 2340 0D2D B0 0A Mov AL,LF ; . 2341 0D2F 8A 3E 150C R Mov BH,Byte Ptr SYS03_Active_Page 2342 0D33 8A 1E 150D R Mov BL,Byte Ptr SYS04_Foreground_Color  The Microsoft MACRO Assembler , Version 1.27 Page 1-64 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 2343 0D37 CD 10 Int Video_Interrupt ; ..End 2344 ; 2345 0D39 88 0E 1495 R Mov WRK05_Keyboard_Buffer[0],CL; Set the length accrodingly 2346 0D3D U1190: 2347 0D3D 9D Popf ; Restore the registers and flags 2348 0D3E 5E Pop SI ; . 2349 0D3F 59 Pop CX ; . 2350 0D40 5B Pop BX ; . 2351 0D41 58 Pop AX ; ..End 2352 0D42 U1199: 2353 0D42 C3 Ret 2354 0D43 U1100_Get_Response Endp 2355 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-65 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 2356 Page 2357 ;************************************************************************ 2358 ;* * 2359 ;* U1200_GET_YES_OR_NO * 2360 ;* * 2361 ;* This module asks for a [Yy]es or [Nn]o answer from a user. The * 2362 ;* routine accepts only a [Yy] or [Nn] and exists with the flag * 2363 ;* FLG06_Yes_or_No set to True for YES and False for NO. * 2364 ;* * 2365 ;************************************************************************ 2366 ; 2367 Public U1200_Get_Yes_or_No 2368 ; 2369 0D43 U1200_Get_Yes_or_No Proc Near 2370 ; 2371 0D43 U1201: 2372 0D43 50 Push AX ; Save the registers and flags 2373 0D44 56 Push SI ; . 2374 0D45 9C Pushf ; ..End 2375 0D46 U1202: 2376 0D46 B4 0C Mov AH,Flush_Keyboard_Command; Read the character from keyboard 2377 0D48 B0 07 Mov AL,Read_Keyboard_Command; . 2378 0D4A CD 21 Int PC_DOS_Interrupt ; ..End 2379 0D4C 3C 03 Cmp AL,ETX ; Compare for control break 2380 0D4E 75 09 Jne U1203 ; If not, then continue 2381 0D50 BE 1447 R Mov SI,Offset MES98_Control_Break 2382 0D53 E8 0C7D R Call U1000_Display_Message ; Display the message on the screen 2383 0D56 E9 012F R Jmp A1002 ; Go to B1200_Final_Process 2384 0D59 U1203: 2385 0D59 3C 59 Cmp AL,Capital_Letter_Y ; Check for capital letter Y 2386 0D5B 75 0E Jne U1204 ; ..End 2387 0D5D C6 06 0E26 R FF Mov Byte Ptr FLG06_Yes_or_No,True 2388 0D62 BE 125D R Mov SI,Offset MES24_Yes ; Display YES on the screen 2389 0D65 E8 0C7D R Call U1000_Display_Message ; ..End 2390 0D68 EB 39 90 Jmp U1290 ; Go to the end of the module 2391 0D6B U1204: 2392 0D6B 3C 79 Cmp AL,Small_Letter_y ; Check for small letter y 2393 0D6D 75 0E Jne U1205 ; ..End 2394 0D6F C6 06 0E26 R FF Mov Byte Ptr FLG06_Yes_or_No,True 2395 0D74 BE 125D R Mov SI,Offset MES24_Yes ; Display YES on the screen 2396 0D77 E8 0C7D R Call U1000_Display_Message ; ..End 2397 0D7A EB 27 90 Jmp U1290 ; Go to the end of the module 2398 0D7D U1205: 2399 0D7D 3C 4E Cmp AL,Capital_Letter_N ; Check for capital letter N 2400 0D7F 75 0E Jne U1206 ; ..End 2401 0D81 C6 06 0E26 R 00 Mov Byte Ptr FLG06_Yes_or_No,False 2402 0D86 BE 1263 R Mov SI,Offset MES25_No ; Display NO on the screen 2403 0D89 E8 0C7D R Call U1000_Display_Message ; ..End 2404 0D8C EB 15 90 Jmp U1290 ; Go to the end of the module 2405 0D8F U1206:  The Microsoft MACRO Assembler , Version 1.27 Page 1-66 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 2406 0D8F 3C 6E Cmp AL,Small_Letter_n ; Check for small letter n 2407 0D91 75 0E Jne U1207 ; ..End 2408 0D93 C6 06 0E26 R 00 Mov Byte Ptr FLG06_Yes_or_No,False 2409 0D98 BE 1263 R Mov SI,Offset MES25_No ; Display NO on the screen 2410 0D9B E8 0C7D R Call U1000_Display_Message ; ..End 2411 0D9E EB 03 90 Jmp U1290 ; Go to the end of the module 2412 0DA1 U1207: 2413 0DA1 EB A3 Jmp U1202 ; Go back and get another character 2414 0DA3 U1290: 2415 0DA3 9D Popf ; Restore the registers and flags 2416 0DA4 5E Pop SI ; . 2417 0DA5 58 Pop AX ; ..End 2418 0DA6 U1299: 2419 0DA6 C3 Ret 2420 ; 2421 0DA7 U1200_Get_Yes_or_No Endp 2422 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-67 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 2423 Page 2424 ;************************************************************************ 2425 ;* * 2426 ;* U1300_CONVERT_BINARY_TO_ASCII * 2427 ;* * 2428 ;* This module BCD contained in the AL register into an ASCII * 2429 ;* character. The output is returned in the AX register. * 2430 ;* * 2431 ;************************************************************************ 2432 ; 2433 Public U1300_Convert_Binary_to_ASCII 2434 ; 2435 0DA7 U1300_Convert_Binary_to_ASCII Proc Near 2436 ; 2437 0DA7 U1301: 2438 0DA7 52 Push DX ; Save the registers 2439 0DA8 9C Pushf ; ..End 2440 ; 2441 0DA9 98 Cbw ; Perform sign extension for division 2442 0DAA B2 0A Mov DL,Ten ; Set DL disvisor to 10D 2443 0DAC F6 F2 Div DL ; Divide AL by 10D remainder in AH 2444 0DAE 04 30 Add AL,Zero_Digit ; Setup the characters in AL & AH 2445 0DB0 80 C4 30 Add AH,Zero_Digit ; ..End 2446 ; 2447 0DB3 9D Popf ; Restore the registers 2448 0DB4 5A Pop DX ; ..End 2449 0DB5 U1399: 2450 0DB5 C3 Ret 2451 ; 2452 0DB6 U1300_Convert_Binary_to_ASCII Endp 2453 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-68 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 2454 Page 2455 ;************************************************************************ 2456 ;* * 2457 ;* U1400_DISPLAY_HEAD_AND_TRACK * 2458 ;* * 2459 ;* This module displays the current track and head number that * 2460 ;* is being read from the source diskette or written to the * 2461 ;* target diskette. * 2462 ;* * 2463 ;************************************************************************ 2464 ; 2465 Public U1400_Display_Head_and_Track 2466 ; 2467 0DB6 U1400_Display_Head_and_Track Proc Near 2468 ; 2469 0DB6 U1401: 2470 0DB6 50 Push AX ; Save the registers 2471 0DB7 53 Push BX ; . 2472 0DB8 52 Push DX ; . 2473 0DB9 9C Pushf ; ..End 2474 ; 2475 0DBA B4 02 Mov AH,Set_CPos_Command ; Set cursor to track position 2476 0DBC 8A 3E 150C R Mov BH,Byte Ptr SYS03_Active_Page 2477 0DC0 8A 36 1501 R Mov DH,Byte Ptr WRK28_Current_Message_Row 2478 0DC4 B2 0F Mov DL,Fifteen ; . 2479 0DC6 CD 10 Int Video_Interrupt ; ..End 2480 ; 2481 ; Write the current track number 2482 0DC8 A0 1503 R Mov AL,Byte Ptr WRK30_Current_Track 2483 0DCB E8 0DA7 R Call U1300_Convert_Binary_to_ASCII 2484 0DCE 50 Push AX ; . 2485 0DCF B4 0E Mov AH,Write_TTY_Command ; . 2486 0DD1 8A 3E 150C R Mov BH,Byte Ptr SYS03_Active_Page 2487 0DD5 8A 1E 150D R Mov BL,Byte Ptr SYS04_Foreground_Color 2488 0DD9 CD 10 Int Video_Interrupt ; . 2489 0DDB 58 Pop AX ; . 2490 0DDC 8A C4 Mov AL,AH ; . 2491 0DDE B4 0E Mov AH,Write_TTY_Command ; . 2492 0DE0 8A 3E 150C R Mov BH,Byte Ptr SYS03_Active_Page 2493 0DE4 8A 1E 150D R Mov BL,Byte Ptr SYS04_Foreground_Color 2494 0DE8 CD 10 Int Video_Interrupt ; ..End 2495 ; 2496 0DEA B4 02 Mov AH,Set_CPos_Command ; Set cursor to head position 2497 0DEC 8A 3E 150C R Mov BH,Byte Ptr SYS03_Active_Page 2498 0DF0 8A 36 1501 R Mov DH,Byte Ptr WRK28_Current_Message_Row 2499 0DF4 B2 19 Mov DL,Twenty_Five ; . 2500 0DF6 CD 10 Int Video_Interrupt ; ..End 2501 ; ; Write the current head number 2502 0DF8 A0 1502 R Mov AL,Byte Ptr WRK29_Current_Head 2503 0DFB E8 0DA7 R Call U1300_Convert_Binary_to_ASCII  The Microsoft MACRO Assembler , Version 1.27 Page 1-69 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 2504 0DFE 8A C4 Mov AL,AH ;. 2505 0E00 B4 0E Mov AH,Write_TTY_Command ;. 2506 0E02 8A 3E 150C R Mov BH,Byte Ptr SYS03_Active_Page 2507 0E06 8A 1E 150D R Mov BL,Byte Ptr SYS04_Foreground_Color 2508 0E0A CD 10 Int Video_Interrupt ; ..End 2509 ; 2510 0E0C B4 02 Mov AH,Set_CPos_Command ; Set cursor to the next line 2511 0E0E 8A 3E 150C R Mov BH,Byte Ptr SYS03_Active_Page 2512 0E12 8A 36 1501 R Mov DH,Byte Ptr WRK28_Current_Message_Row 2513 0E16 FE C6 Inc DH ; . 2514 0E18 B2 00 Mov DL,Zero ; . 2515 0E1A CD 10 Int Video_Interrupt ; ..End 2516 0E1C U1490: 2517 0E1C 9D Popf ; Restore the registers 2518 0E1D 5A Pop DX ; 2519 0E1E 5B Pop BX ; . 2520 0E1F 58 Pop AX ; ..End 2521 0E20 U1499: 2522 0E20 C3 Ret 2523 ; 2524 0E21 U1400_Display_Head_and_Track Endp 2525 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-70 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 2526 Page 2527 ;************************************************************************ 2528 ;* * 2529 ;* FLAGS * 2530 ;* * 2531 ;* This portion of FREECOPY contains the definitions of all of * 2532 ;* flags defined in the program. * 2533 ;* * 2534 ;************************************************************************ 2535 ; 2536 0E21 ?? FLG01_Good_Command DB (?) ; Establishes any errors in the 2537 ; . command line entered by a user 2538 0E22 ?? FLG02_Double_Side DB (?) ; Points out whether the user wants 2539 ; . to copy only the top side of a 2540 ; . floppy diskette 2541 0E23 ?? FLG03_Default_Drive DB (?) ; Shows if the default drive is a 2542 ; . valid floppy disk drive 2543 0E24 ?? FLG04_Single_Drive DB (?) ; Determines if the machine is a 2544 ; . single drive system 2545 0E25 ?? FLG05_Store_Buffer DB (?) ; Establishes whether to put the 2546 ; . characters entered from the 2547 ; . keyboard into the buffer 2548 0E26 ?? FLG06_Yes_or_No DB (?) ; Points out the user's response 2549 ; . NO = False YES = True 2550 0E27 ?? FLG07_First_Time DB (?) ; Shows the number of times the user 2551 ; . copies a diskette 2552 ; . ONCE = True MORE = False 2553 0E28 ?? FLG08_Good_Read DB (?) ; Flags establish whether the 2554 0E29 ?? FLG09_Good_Write DB (?) ; . operation was performed correctly 2555 0E2A ?? FLG10_Good_Verify DB (?) ; . YES = True NO = False 2556 0E2B ?? FLG11_Good_Format DB (?) ; ..End 2557 0E2C ?? FLG12_Good_FAT DB (?) ; Establishes a good FAT when reading 2558 ; . source diskette more than once 2559 0E2D ?? FLG13_First_Read_Write DB (?) ; Shows if a diskette is being read 2560 ; . or written for the first time 2561 ; . YES = True NO = False 2562 0E2E ?? FLG14_Copy_Complete DB (?) ; Points out if a diskette has been 2563 ; . copied completely 2564 ; . YES = True NO = False 2565 0E2F ?? FLG15_IO_Error DB (?) ; Establishes the type of IO error 2566 ; . Zero = Format error 2567 ; . One = Read error 2568 ; . Two = Write error 2569 ; ..End 2570 0E30 ?? FLG16_Free_Memory DB (?) ; Determines whether memory should 2571 ; . using the PC DOS function calls 2572 0E31 ?? FLG17_Copy_More_Disks DB (?) ; Indicates whether to ask a user to 2573 ; . write the same disk over again 2574 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-71 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 2575 Page 2576 ;************************************************************************ 2577 ;* * 2578 ;* MESSAGES * 2579 ;* * 2580 ;* This portion of FREECOPY contains the definitions of all of * 2581 ;* messages defined in the program. * 2582 ;* * 2583 ;************************************************************************ 2584 ; 2585 0E32 MES00_Copy_Notice Label Byte 2586 0E32 0D 0A DB CR,LF 2587 0E34 46 52 45 45 43 4F DB 'FREECOPY Disk Utility',CR,LF 2588 50 59 20 44 69 73 2589 6B 20 55 74 69 6C 2590 69 74 79 0D 0A 2591 0E4B 49 42 4D 20 50 65 DB 'IBM Personal Computer/Jr.',CR,LF 2592 72 73 6F 6E 61 6C 2593 20 43 6F 6D 70 75 2594 74 65 72 2F 4A 72 2595 2E 0D 0A 2596 0E66 56 65 72 73 69 6F DB 'Version 1.13 (C)Copyright 1984, 1985',CR,LF 2597 6E 20 31 2E 31 33 2598 20 28 43 29 43 6F 2599 70 79 72 69 67 68 2600 74 20 31 39 38 34 2601 2C 20 31 39 38 35 2602 0D 0A 2603 0E8C 0D 0A DB CR,LF 2604 0E8E 53 71 75 69 72 65 DB 'Squire Buresh Assoc., Inc.',CR,LF 2605 20 42 75 72 65 73 2606 68 20 41 73 73 6F 2607 63 2E 2C 20 49 6E 2608 63 2E 0D 0A 2609 0EAA 50 6F 73 74 20 4F DB 'Post Office Box 112',CR,LF 2610 66 66 69 63 65 20 2611 42 6F 78 20 31 31 2612 32 0D 0A 2613 0EBF 4D 69 6C 6C 62 75 DB 'Millbury, MA 01527',CR,LF 2614 72 79 2C 20 4D 41 2615 20 30 31 35 32 37 2616 0D 0A 2617 0ED3 0D 0A DB CR,LF 2618 0ED5 24 32 35 2E 30 30 DB '$25.00 requested contribution.',CR,LF,EOT 2619 20 72 65 71 75 65 2620 73 74 65 64 20 63 2621 6F 6E 74 72 69 62 2622 75 74 69 6F 6E 2E 2623 0D 0A FF 2624 0EF6 MES01A_Write_Another_Diskette Label Byte  The Microsoft MACRO Assembler , Version 1.27 Page 1-72 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 2625 0EF6 0D 0A DB CR,LF 2626 0EF8 57 72 69 74 65 20 DB 'Write source diskette again (Y/N)? ',EOT 2627 73 6F 75 72 63 65 2628 20 64 69 73 6B 65 2629 74 74 65 20 61 67 2630 61 69 6E 20 28 59 2631 2F 4E 29 3F 20 FF 2632 0F1C MES01B_Copy_Another_diskette Label Byte 2633 0F1C 0D 0A DB CR,LF 2634 0F1E 43 6F 70 79 20 61 DB 'Copy another diskette (Y/N)? ',EOT 2635 6E 6F 74 68 65 72 2636 20 64 69 73 6B 65 2637 74 74 65 20 28 59 2638 2F 4E 29 3F 20 FF 2639 0F3C MES02_Copy_Complete Label Byte 2640 0F3C 0D 0A DB CR,LF 2641 0F3E 43 6F 70 79 20 63 DB 'Copy complete.',CR,LF,EOT 2642 6F 6D 70 6C 65 74 2643 65 2E 0D 0A FF 2644 0F4F MES03_Copy81_Sectors Label Byte 2645 0F4F 0D 0A DB CR,LF 2646 0F51 43 6F 70 79 69 6E DB 'Copying 8 sectors per track, 1 side.',CR,LF,EOT 2647 67 20 38 20 73 65 2648 63 74 6F 72 73 20 2649 70 65 72 20 74 72 2650 61 63 6B 2C 20 31 2651 20 73 69 64 65 2E 2652 0D 0A FF 2653 0F78 MES04_Copy82_Sectors Label Byte 2654 0F78 0D 0A DB CR,LF 2655 0F7A 43 6F 70 79 69 6E DB 'Copying 8 sectors per track, 2 sides.',CR,LF,EOT 2656 67 20 38 20 73 65 2657 63 74 6F 72 73 20 2658 70 65 72 20 74 72 2659 61 63 6B 2C 20 32 2660 20 73 69 64 65 73 2661 2E 0D 0A FF 2662 0FA2 MES05_Copy91_Sectors Label Byte 2663 0FA2 0D 0A DB CR,LF 2664 0FA4 43 6F 70 79 69 6E DB 'Copying 9 sectors per track, 1 side.',CR,LF,EOT 2665 67 20 39 20 73 65 2666 63 74 6F 72 73 20 2667 70 65 72 20 74 72 2668 61 63 6B 2C 20 31 2669 20 73 69 64 65 2E 2670 0D 0A FF 2671 0FCB MES06_Copy92_Sectors Label Byte 2672 0FCB 0D 0A DB CR,LF 2673 0FCD 43 6F 70 79 69 6E DB 'Copying 9 sectors per track, 2 sides.',CR,LF,EOT 2674 67 20 39 20 73 65  The Microsoft MACRO Assembler , Version 1.27 Page 1-73 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 2675 63 74 6F 72 73 20 2676 70 65 72 20 74 72 2677 61 63 6B 2C 20 32 2678 20 73 69 64 65 73 2679 2E 0D 0A FF 2680 0FF5 MES07_Correct_And_Press_Key Label Byte 2681 0FF5 0D 0A DB CR,LF 2682 0FF7 43 6F 72 72 65 63 DB 'Correct, and press any key to continue',CR,LF,EOT 2683 74 2C 20 61 6E 64 2684 20 70 72 65 73 73 2685 20 61 6E 79 20 6B 2686 65 79 20 74 6F 20 2687 63 6F 6E 74 69 6E 2688 75 65 0D 0A FF 2689 1020 MES08_Drive_Not_Ready Label Byte 2690 1020 0D 0A DB CR,LF 2691 1022 44 69 73 6B 65 74 DB 'Diskette not in drive :.',CR,LF,EOT 2692 74 65 20 6E 6F 74 2693 20 69 6E 20 64 72 2694 69 76 65 20 20 3A 2695 2E 0D 0A FF 2696 103E MES09_Insert_Source Label Byte 2697 103E 0D 0A DB CR,LF 2698 1040 49 6E 73 65 72 74 DB 'Insert source diskette in drive :.',CR,LF,EOT 2699 20 73 6F 75 72 63 2700 65 20 64 69 73 6B 2701 65 74 74 65 20 69 2702 6E 20 64 72 69 76 2703 65 20 20 3A 2E 0D 2704 0A FF 2705 1066 MES10_Insert_Target Label Byte 2706 1066 0D 0A DB CR,LF 2707 1068 49 6E 73 65 72 74 DB 'Insert target diskette in drive :.',CR,LF,EOT 2708 20 74 61 72 67 65 2709 74 20 64 69 73 6B 2710 65 74 74 65 20 69 2711 6E 20 64 72 69 76 2712 65 20 20 3A 2E 0D 2713 0A FF 2714 108E MES11_Insufficient_Memory Label Byte 2715 108E 0D 0A DB CR,LF 2716 1090 49 6E 73 75 66 66 DB 'Insufficient memory.',Bell,CR,LF,EOT 2717 69 63 69 65 6E 74 2718 20 6D 65 6D 6F 72 2719 79 2E 07 0D 0A FF 2720 10A8 MES12_Invalid_Parameter Label Byte 2721 10A8 0D 0A DB CR,LF 2722 10AA 49 6E 76 61 6C 69 DB 'Invalid parameter(s) specified.',CR,LF,EOT 2723 64 20 70 61 72 61 2724 6D 65 74 65 72 28  The Microsoft MACRO Assembler , Version 1.27 Page 1-74 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 2725 73 29 20 73 70 65 2726 63 69 66 69 65 64 2727 2E 0D 0A FF 2728 10CC MES13_Invalid_Default Label Byte 2729 10CC 0D 0A DB CR,LF 2730 10CE 49 6E 76 61 6C 69 DB 'Invalid default floppy disk drive',CR,LF,EOT 2731 64 20 64 65 66 61 2732 75 6C 74 20 66 6C 2733 6F 70 70 79 20 64 2734 69 73 6B 20 64 72 2735 69 76 65 0D 0A FF 2736 10F2 MES14_Invalid_Drive Label Byte 2737 10F2 0D 0A DB CR,LF 2738 10F4 49 6E 76 61 6C 69 DB 'Invalid drive specification.',CR,LF,EOT 2739 64 20 64 72 69 76 2740 65 20 73 70 65 63 2741 69 66 69 63 61 74 2742 69 6F 6E 2E 0D 0A 2743 FF 2744 1113 MES15_Single_Drive_Copy Label Byte 2745 1113 0D 0A DB CR,LF 2746 1115 4E 4F 54 45 3A 20 DB 'NOTE: Copying diskette on single drive.',Bell,CR,LF,EOT 2747 43 6F 70 79 69 6E 2748 67 20 64 69 73 6B 2749 65 74 74 65 20 6F 2750 6E 20 73 69 6E 67 2751 6C 65 20 64 72 69 2752 76 65 2E 07 0D 0A 2753 FF 2754 1140 MES16_Press_Any_Key Label Byte 2755 1140 0D 0A DB CR,LF 2756 1142 50 72 65 73 73 20 DB 'Press any key when ready.',CR,LF,EOT 2757 61 6E 79 20 6B 65 2758 79 20 77 68 65 6E 2759 20 72 65 61 64 79 2760 2E 0D 0A FF 2761 115E MES17_Reading_Track Label Byte 2762 115E 52 65 61 64 69 6E DB 'Reading track ( ) head ( ).',CR,LF,EOT 2763 67 20 74 72 61 63 2764 6B 20 28 20 20 29 2765 20 68 65 61 64 20 2766 28 20 29 2E 0D 0A 2767 FF 2768 117D MES18_Unrecoverable_Format Label Byte 2769 117D 0D 0A DB CR,LF 2770 117F 55 6E 72 65 63 6F DB 'Unrecoverable format error on target.',CR,LF,EOT 2771 76 65 72 61 62 6C 2772 65 20 66 6F 72 6D 2773 61 74 20 65 72 72 2774 6F 72 20 6F 6E 20  The Microsoft MACRO Assembler , Version 1.27 Page 1-75 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 2775 74 61 72 67 65 74 2776 2E 0D 0A FF 2777 11A7 MES19_Unrecoverable_Read Label Byte 2778 11A7 0D 0A DB CR,LF 2779 11A9 55 6E 72 65 63 6F DB 'Unrecoverable read error on source.',CR,LF,EOT 2780 76 65 72 61 62 6C 2781 65 20 72 65 61 64 2782 20 65 72 72 6F 72 2783 20 6F 6E 20 73 6F 2784 75 72 63 65 2E 0D 2785 0A FF 2786 11CF MES20_Unrecoverable_Verify Label Byte 2787 11CF 0D 0A DB CR,LF 2788 11D1 55 6E 72 65 63 6F DB 'Unrecoverable verify error on target.',CR,LF,EOT 2789 76 65 72 61 62 6C 2790 65 20 76 65 72 69 2791 66 79 20 65 72 72 2792 6F 72 20 6F 6E 20 2793 74 61 72 67 65 74 2794 2E 0D 0A FF 2795 11F9 MES21_Unrecoverable_Write Label Byte 2796 11F9 0D 0A DB CR,LF 2797 11FB 55 6E 72 65 63 6F DB 'Unrecoverable write error on target.',CR,LF,EOT 2798 76 65 72 61 62 6C 2799 65 20 77 72 69 74 2800 65 20 65 72 72 6F 2801 72 20 6F 6E 20 74 2802 61 72 67 65 74 2E 2803 0D 0A FF 2804 1222 MES22_Unrecoverable_IO Label Byte 2805 1222 0D 0A DB CR,LF 2806 1224 55 6E 72 65 63 6F DB 'Unrecoverable IO error.',CR,LF,EOT 2807 76 65 72 61 62 6C 2808 65 20 49 4F 20 65 2809 72 72 6F 72 2E 0D 2810 0A FF 2811 123E MES23_Writing_Track Label Byte 2812 123E 57 72 69 74 69 6E DB 'Writing track ( ) head ( ).',CR,LF,EOT 2813 67 20 74 72 61 63 2814 6B 20 28 20 20 29 2815 20 68 65 61 64 20 2816 28 20 29 2E 0D 0A 2817 FF 2818 125D MES24_Yes Label Byte 2819 125D 59 45 53 0D 0A FF DB 'YES',CR,LF,EOT 2820 1263 MES25_No Label Byte 2821 1263 4E 4F 0D 0A FF DB 'NO',CR,LF,EOT 2822 1268 MES80_Seek_Error Label Byte 2823 1268 53 65 65 6B 20 6F DB 'Seek operation has failed.',CR,LF,EOT 2824 70 65 72 61 74 69  The Microsoft MACRO Assembler , Version 1.27 Page 1-76 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 2825 6F 6E 20 68 61 73 2826 20 66 61 69 6C 65 2827 64 2E 0D 0A FF 2828 1285 MES81_Controller_Error Label Byte 2829 1285 44 69 73 6B 20 63 DB 'Disk controller has failed.',CR,LF,EOT 2830 6F 6E 74 72 6F 6C 2831 6C 65 72 20 68 61 2832 73 20 66 61 69 6C 2833 65 64 2E 0D 0A FF 2834 12A3 MES82_CRC_Error Label Byte 2835 12A3 43 79 63 6C 69 63 DB 'Cyclic redundancy check (CRC) error.',CR,LF,EOT 2836 20 72 65 64 75 6E 2837 64 61 6E 63 79 20 2838 63 68 65 63 6B 20 2839 28 43 52 43 29 20 2840 65 72 72 6F 72 2E 2841 0D 0A FF 2842 12CA MES83_DMA_Boundary_Error Label Byte 2843 12CA 41 74 74 65 6D 70 DB 'Attempted to DMA across a 64K boundary.',CR,LF,EOT 2844 74 65 64 20 74 6F 2845 20 44 4D 41 20 61 2846 63 72 6F 73 73 20 2847 61 20 36 34 4B 20 2848 62 6F 75 6E 64 61 2849 72 79 2E 0D 0A FF 2850 12F4 MES84_DMA_Error Label Byte 2851 12F4 44 4D 41 20 6F 76 DB 'DMA overrun on I/O operation.',CR,LF,EOT 2852 65 72 72 75 6E 20 2853 6F 6E 20 49 2F 4F 2854 20 6F 70 65 72 61 2855 74 69 6F 6E 2E 0D 2856 0A FF 2857 1314 MES85_Sector_Error Label Byte 2858 1314 52 65 71 75 65 73 DB 'Requested sector not found.',CR,LF,EOT 2859 74 65 64 20 73 65 2860 63 74 6F 72 20 6E 2861 6F 74 20 66 6F 75 2862 6E 64 2E 0D 0A FF 2863 1332 MES86_Write_Protect_Error Label Byte 2864 1332 4F 75 74 70 75 74 DB 'Output diskette is write protected.',CR,LF,EOT 2865 20 64 69 73 6B 65 2866 74 74 65 20 69 73 2867 20 77 72 69 74 65 2868 20 70 72 6F 74 65 2869 63 74 65 64 2E 0D 2870 0A FF 2871 1358 MES87_Address_Mark_Error Label Byte 2872 1358 41 64 64 72 65 73 DB 'Address mark was not found.',CR,LF,EOT 2873 73 20 6D 61 72 6B 2874 20 77 61 73 20 6E  The Microsoft MACRO Assembler , Version 1.27 Page 1-77 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 2875 6F 74 20 66 6F 75 2876 6E 64 2E 0D 0A FF 2877 1376 MES88_Command_Error Label Byte 2878 1376 42 61 64 20 63 6F DB 'Bad command passed to the disk interrupt 13H.',CR,LF,EOT 2879 6D 6D 61 6E 64 20 2880 70 61 73 73 65 64 2881 20 74 6F 20 74 68 2882 65 20 64 69 73 6B 2883 20 69 6E 74 65 72 2884 72 75 70 74 20 31 2885 33 48 2E 0D 0A FF 2886 13A6 MES89_Unknown_Error Label Byte 2887 13A6 55 6E 6B 6E 6F 77 DB 'Unknown diskette error encountered.',CR,LF,EOT 2888 6E 20 64 69 73 6B 2889 65 74 74 65 20 65 2890 72 72 6F 72 20 65 2891 6E 63 6F 75 6E 74 2892 65 72 65 64 2E 0D 2893 0A FF 2894 13CC MES90_Unknown_FAT_Error Label Byte 2895 13CC 46 69 72 73 74 20 DB 'First byte of the FAT does not',CR,LF 2896 62 79 74 65 20 6F 2897 66 20 74 68 65 20 2898 46 41 54 20 64 6F 2899 65 73 20 6E 6F 74 2900 0D 0A 2901 13EC 6D 61 74 63 68 20 DB 'match any known diskette type.',CR,LF,EOT 2902 61 6E 79 20 6B 6E 2903 6F 77 6E 20 64 69 2904 73 6B 65 74 74 65 2905 20 74 79 70 65 2E 2906 0D 0A FF 2907 140D MES91_Single_Side_Error Label byte 2908 140D 44 6F 75 62 6C 65 DB 'Double sided diskette in a',CR,LF 2909 20 73 69 64 65 64 2910 20 64 69 73 6B 65 2911 74 74 65 20 69 6E 2912 20 61 0D 0A 2913 1429 73 69 6E 67 6C 65 DB 'single sided disk drive.',CR,LF,EOT 2914 20 73 69 64 65 64 2915 20 64 69 73 6B 20 2916 64 72 69 76 65 2E 2917 0D 0A FF 2918 1444 MES97_Return_Linefeed Label Byte 2919 1444 0D 0A FF DB CR,LF,EOT 2920 1447 MES98_Control_Break Label Byte 2921 1447 5E 43 0D 0A FF DB '^C',CR,LF,EOT 2922 144C MES99_Memory_Block_Destroyed Label Byte 2923 144C 4D 65 6D 6F 72 79 DB 'Memory control block destroyed.',CR,LF,EOT 2924 20 63 6F 6E 74 72  The Microsoft MACRO Assembler , Version 1.27 Page 1-78 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 2925 6F 6C 20 62 6C 6F 2926 63 6B 20 64 65 73 2927 74 72 6F 79 65 64 2928 2E 0D 0A FF 2929 146E MES100_Freecopy_Finished Label Byte 2930 146E 0D 0A DB CR,LF 2931 1470 52 65 74 75 72 6E DB 'Returning to PC DOS.',CR,LF,EOT 2932 69 6E 67 20 74 6F 2933 20 50 43 20 44 4F 2934 53 2E 0D 0A FF 2935 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-79 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 2936 Page 2937 ;************************************************************************ 2938 ;* * 2939 ;* WORK VARIABLES * 2940 ;* * 2941 ;* This portion of FREECOPY contains the definitions of the work * 2942 ;* variables that are used by the program. * 2943 ;* * 2944 ;************************************************************************ 2945 ; 2946 1487 ?? WRK01_Source_Drive DB (?) ; Source diskette drive number 2947 1488 ?? WRK02_Target_Drive DB (?) ; Target diskette drive number 2948 1489 0B [ WRK03_Valid_Filename DB 11 Dup (32D); Valid diskette file name 2949 20 2950 ] 2951 2952 1494 ?? WRK04_Parameter_Count DB (?) ; Valid diskette filler area 2953 ; 2954 1495 WRK05_Keyboard_Buffer Label Byte 2955 1495 50 DB 80D ; Length of the keyboard buffer 2956 1496 50 [ DB 80 Dup (?); Actual keyboard buffer 2957 ?? 2958 ] 2959 2960 14E6 FF DB EOT ; Last char denotes the end of text 2961 ; 2962 14E7 ?? WRK06_Drive_Number DB (?) ; Drive number of a disk drive 2963 14E8 ?? WRK07_Head_Number DB (?) ; Head number of a disk drive 2964 14E9 ?? WRK08_Track_Number DB (?) ; Track number of a diskette 2965 14EA ?? WRK09_Sector_Number DB (?) ; Sector number of a diskette 2966 14EB ?? WRK10_Number_of_Sectors DB (?) ; Number of sectors on a track 2967 14EC ???? WRK11_Segment_Address DW (?) ; ES segment address 2968 14EE ???? WRK12_Offset_Address DW (?) ; BX offset address 2969 14F0 ?? WRK13_Retry_Counter DB (?) ; Number of retrys to make 2970 14F1 ?? WRK14_Status_Operation DB (?) ; Result of the operation 2971 ; 2972 14F2 ?? WRK15_Maximum_Heads DB (?) ; Maximum heads, tracks and sectors 2973 14F3 ?? WRK16_Maximum_Tracks DB (?) ; . 2974 14F4 ?? WRK17_Maximum_Sectors DB (?) ; ..End 2975 ; 2976 14F5 ???? WRK18_Counter_ESBX_Entries DW (?) ; Counter to calculate ES:BX entries 2977 14F7 ???? WRK19_Number_ESBX_Entries DW (?) ; Maximum ES:BX table entires 2978 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-80 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 2979 Page 2980 ;************************************************************************ 2981 ;* * 2982 ;* WORK VARIABLES Page 2 * 2983 ;* * 2984 ;************************************************************************ 2985 ; 2986 14F9 ?? WRK20_Current_Source_Head DB (?) ; Current source head & track number 2987 14FA ?? WRK21_Current_Source_Track DB (?) ; ..End 2988 14FB ?? WRK22_Current_Target_Head DB (?) ; Current target head & track number 2989 14FC ?? WRK23_Current_Target_Track DB (?) ; . End 2990 ; 2991 14FD ?? WRK24_Read_Message_Row DB (?) ; Cursor row of read, verify, format 2992 14FE ?? WRK25_Verify_Message_Row DB (?) ; and write message 2993 14FF ?? WRK26_Format_Message_Row DB (?) ; . 2994 1500 ?? WRK27_Write_Message_Row DB (?) ; . 2995 1501 ?? WRK28_Current_Message_Row DB (?) ; ..End 2996 ; 2997 1502 ?? WRK29_Current_Head DB (?) ; Current head and track to display 2998 1503 ?? WRK30_Current_Track DB (?) ; . on the screen 2999 ; 3000 1504 ?? WRK31_Track_Read_Counter DB (?) ; Counter of tracks processed 3001 1505 ?? WRK32_Track_Write_Counter DB (?) ; ..End 3002 ; 3003 1506 ???? WRK33_CHRN_Table_Address DW (?) ; Current address of the CHRN table 3004 ; 3005 1508 ???? WRK34_DMA_Overflow_Counter DW (?) ; Counts how many times FREECOPY 3006 ; . adjusted for DMA overflow 3007 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-81 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 3008 Page 3009 ;************************************************************************ 3010 ;* * 3011 ;* SYSTEM VARIABLES * 3012 ;* * 3013 ;* This portion of FREECOPY contains the definitions of all of * 3014 ;* the system variables used by the program. * 3015 ;* * 3016 ;************************************************************************ 3017 ; 3018 150A ?? SYS01_Number_Columns DB (?) ; Number of columns in current mode 3019 150B ?? SYS02_Current_Mode DB (?) ; Current video mode 3020 150C ?? SYS03_Active_Page DB (?) ; Active display page 3021 150D ?? SYS04_Foreground_Color DB (?) ; Foreground color number 3022 150E ???? SYS05_Para_RAM_Size DW (?) ; Number of free 16 byte paragraphs 3023 1510 ?? SYS06_Monitor_Flag DB (?) ; 0 = monochrome 1 = graphics 3024 1511 ?? SYS07_No_Parallel_Ports DB (?) ; Number of parallel ports 3025 1512 ?? SYS08_Game_Adapters DB (?) ; Number of RS-232 ports 3026 1513 ?? SYS09_No_RS232_Ports DB (?) ; 0 = no adapter 1 = has adapter 3027 1514 ?? SYS10_No_Disk_Drives DB (?) ; Number of floppy disk drives 3028 1515 ?? SYS11_Init_Video_Mode DB (?) ; Initial video mode when powering 3029 ; up the machine 3030 1516 ?? SYS12_Planar_RAM_Size DB (?) ; Planar RAM size 3031 1517 ?? SYS13_IPL_From_Diskette DB (?) ; Location of initial program load 3032 1518 ?? SYS14_Default_Drive DB (?) ; Default disk drive 3033 ; 3034 1519 ???? SYS15_Stack_Pointer DW (?) ; Stack pointer value when entering 3035 ; . FREECOPY from PC DOS 3036 151B ???? SYS16_Save_DPT_Offset DW (?) ; Address of Disk Parameter Table 3037 151D ???? SYS17_Save_DPT_Segment DW (?) ; ..End 3038 ; 3039 151F SYS18_Disk_Parameter_Table Label Byte 3040 151F DF DB 11011111B ; SRT = 0D & Head Unload = 0FH 3041 1520 02 DB 002H ; Head Load = 1 Mode = DMA 3042 1521 25 DB 025H ; Wait to turn the motor off 3043 1522 02 DB 002H ; 512 bytes per sector 3044 1523 09 DB 009H ; 9 sectors per track 3045 1524 2A DB 02AH ; PC DOS gap length for I/O 3046 1525 FF DB 0FFH ; Data length parameter 3047 1526 50 DB 050H ; PC DOS gap length for format 3048 1527 F6 DB 0F6H ; Fille byte for format 3049 1528 0F DB 00FH ; Head Settle time in milliseconds 3050 1529 02 DB 002H ; Motor start-up time (1/8 sec.) 3051 ; 3052 152A ?? SYS19_Major_Vers_Number DB (?) ; Major and minor version number 3053 152B ?? SYS20_Minor_Vers_Number DB (?) ; . of the operating system 3054 ; 3055 152C ???? SYS21_Alloc_Segment DW (?) ; Beginning segment address of 3056 ; . free memory 3057 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-82 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 3058 Page 3059 ;************************************************************************ 3060 ;* * 3061 ;* SETUP STACK POINTER AND MEMORY * 3062 ;* * 3063 ;* This portion of FREECOPY is contains the stack and the label * 3064 ;* that indicates the beginning of available memory. * 3065 ;* * 3066 ;************************************************************************ 3067 ; 3068 152E MEM05_Bottom_of_the_Stack Label Word 3069 152E 40 [ DW 64 Dup (?) 3070 ???? 3071 ] 3072 3073 15AE MEM04_Top_of_the_Stack Label Word 3074 ; 3075 = 15B0 MEM03_ESBX_Table Equ MEM04_Top_of_the_Stack+2 3076 ; 3077 = 16F0 MEM02_CHRN_Table Equ MEM03_ESBX_Table+320 3078 ; 3079 = 2230 MEM01_File_Allocation_Table Equ MEM02_CHRN_Table+2880 3080 ; 3081 = 2430 MEM00_Bottom_Free_Memory Equ MEM01_File_Allocation_Table+512 3082 ;  The Microsoft MACRO Assembler , Version 1.27 Page 1-83 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 3083 Page 3084 ;************************************************************************ 3085 ;* * 3086 ;* END OF THE PROGRAM * 3087 ;* * 3088 ;************************************************************************ 3089 ; 3090 15AE CSEG Ends 3091 End A1000_Main_Module  The Microsoft MACRO Assembler , Version 1.27 Page Symbols-1 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 Segments and groups: N a m e Size align combine class CSEG . . . . . . . . . . . . . . 15AE PARA PUBLIC 'CSEG' Symbols: N a m e Type Value Attr A1000_MAIN_MODULE. . . . . . . . F PROC 0100 CSEG Global Length =003F A1001. . . . . . . . . . . . . . L NEAR 0100 CSEG A1002. . . . . . . . . . . . . . L NEAR 012F CSEG A1090. . . . . . . . . . . . . . L NEAR 0132 CSEG A1099. . . . . . . . . . . . . . L NEAR 013D CSEG ADDRESS_MARK_ERROR . . . . . . . Number 0002 ALLOCATE_MEMORY. . . . . . . . . Number 0048 B1000_INITIAL_PROCESS. . . . . . N PROC 013F CSEG Global Length =0064 B1001. . . . . . . . . . . . . . L NEAR 013F CSEG B1002. . . . . . . . . . . . . . L NEAR 0168 CSEG B1003. . . . . . . . . . . . . . L NEAR 0195 CSEG B1004. . . . . . . . . . . . . . L NEAR 0198 CSEG B1099. . . . . . . . . . . . . . L NEAR 01A2 CSEG B1100_DETAIL_PROCESS . . . . . . N PROC 01A3 CSEG Global Length =012B B1101. . . . . . . . . . . . . . L NEAR 01A3 CSEG B1102. . . . . . . . . . . . . . L NEAR 01CC CSEG B1103. . . . . . . . . . . . . . L NEAR 01E6 CSEG B1104. . . . . . . . . . . . . . L NEAR 01E9 CSEG B1105. . . . . . . . . . . . . . L NEAR 0203 CSEG B1105A . . . . . . . . . . . . . L NEAR 020A CSEG B1106. . . . . . . . . . . . . . L NEAR 0226 CSEG B1107. . . . . . . . . . . . . . L NEAR 0237 CSEG B1108. . . . . . . . . . . . . . L NEAR 0261 CSEG B1109. . . . . . . . . . . . . . L NEAR 0273 CSEG B1110. . . . . . . . . . . . . . L NEAR 027E CSEG B1111. . . . . . . . . . . . . . L NEAR 02B7 CSEG B1199. . . . . . . . . . . . . . L NEAR 02CD CSEG B1200_FINAL_PROCESS. . . . . . . N PROC 02CE CSEG Global Length =001F B1201. . . . . . . . . . . . . . L NEAR 02CE CSEG B1299. . . . . . . . . . . . . . L NEAR 02EC CSEG BELL . . . . . . . . . . . . . . Number 0007 BLANK_CURSOR . . . . . . . . . . Number 0F0F BS . . . . . . . . . . . . . . . Number 0008 C1000_GET_AND_SET_VIDEO. . . . . N PROC 02ED CSEG Global Length =001D C1001. . . . . . . . . . . . . . L NEAR 02ED CSEG C1002. . . . . . . . . . . . . . L NEAR 02F0 CSEG C1003. . . . . . . . . . . . . . L NEAR 02FF CSEG C1090. . . . . . . . . . . . . . L NEAR 0306 CSEG C1099. . . . . . . . . . . . . . L NEAR 0309 CSEG C1100_DISPLAY_INTRO. . . . . . . N PROC 030A CSEG Global Length =0007  The Microsoft MACRO Assembler , Version 1.27 Page Symbols-2 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 C1101. . . . . . . . . . . . . . L NEAR 030A CSEG C1199. . . . . . . . . . . . . . L NEAR 0310 CSEG C1200_PARSE_COMMANDS . . . . . . N PROC 0311 CSEG Global Length =00D0 C1201. . . . . . . . . . . . . . L NEAR 0311 CSEG C1202. . . . . . . . . . . . . . L NEAR 0324 CSEG C1203. . . . . . . . . . . . . . L NEAR 0336 CSEG C1204. . . . . . . . . . . . . . L NEAR 0342 CSEG C1205. . . . . . . . . . . . . . L NEAR 034B CSEG C1206. . . . . . . . . . . . . . L NEAR 0361 CSEG C1207. . . . . . . . . . . . . . L NEAR 0365 CSEG C1208. . . . . . . . . . . . . . L NEAR 036E CSEG C1209. . . . . . . . . . . . . . L NEAR 0384 CSEG C1210. . . . . . . . . . . . . . L NEAR 0388 CSEG C1211. . . . . . . . . . . . . . L NEAR 0395 CSEG C1212. . . . . . . . . . . . . . L NEAR 03A4 CSEG C1213. . . . . . . . . . . . . . L NEAR 03AB CSEG C1214. . . . . . . . . . . . . . L NEAR 03B9 CSEG C1215. . . . . . . . . . . . . . L NEAR 03C4 CSEG C1216. . . . . . . . . . . . . . L NEAR 03D5 CSEG C1299. . . . . . . . . . . . . . L NEAR 03E0 CSEG C1300_GET_EQUIPMENT. . . . . . . N PROC 03E1 CSEG Global Length =0053 C1301. . . . . . . . . . . . . . L NEAR 03E1 CSEG C1399. . . . . . . . . . . . . . L NEAR 0433 CSEG C1400_VALIDATE_DRIVES. . . . . . N PROC 0434 CSEG Global Length =006D C1401. . . . . . . . . . . . . . L NEAR 0434 CSEG C1402. . . . . . . . . . . . . . L NEAR 043B CSEG C1403. . . . . . . . . . . . . . L NEAR 0454 CSEG C1404. . . . . . . . . . . . . . L NEAR 0459 CSEG C1405. . . . . . . . . . . . . . L NEAR 046E CSEG C1406. . . . . . . . . . . . . . L NEAR 047F CSEG C1407. . . . . . . . . . . . . . L NEAR 0490 CSEG C1499. . . . . . . . . . . . . . L NEAR 04A0 CSEG C1500_DISKETTE_MESSAGES. . . . . N PROC 04A1 CSEG Global Length =0046 C1501. . . . . . . . . . . . . . L NEAR 04A1 CSEG C1502. . . . . . . . . . . . . . L NEAR 04B5 CSEG C1503. . . . . . . . . . . . . . L NEAR 04C3 CSEG C1504. . . . . . . . . . . . . . L NEAR 04CA CSEG C1505. . . . . . . . . . . . . . L NEAR 04D8 CSEG C1599. . . . . . . . . . . . . . L NEAR 04E6 CSEG C1600A_GET_FREE_MEMORY . . . . . N PROC 04E7 CSEG Global Length =00A2 C1600B_GET_FREE_MEMORY . . . . . N PROC 0589 CSEG Global Length =0054 C1601A . . . . . . . . . . . . . L NEAR 04E7 CSEG C1601B . . . . . . . . . . . . . L NEAR 0589 CSEG C1602A . . . . . . . . . . . . . L NEAR 04F4 CSEG C1602B . . . . . . . . . . . . . L NEAR 0597 CSEG C1603A . . . . . . . . . . . . . L NEAR 0513 CSEG C1603B . . . . . . . . . . . . . L NEAR 05A5 CSEG C1604A . . . . . . . . . . . . . L NEAR 0528 CSEG C1604B . . . . . . . . . . . . . L NEAR 05B9 CSEG C1605A . . . . . . . . . . . . . L NEAR 053F CSEG  The Microsoft MACRO Assembler , Version 1.27 Page Symbols-3 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 C1605B . . . . . . . . . . . . . L NEAR 05C8 CSEG C1606A . . . . . . . . . . . . . L NEAR 0556 CSEG C1606B . . . . . . . . . . . . . L NEAR 05D7 CSEG C1607A . . . . . . . . . . . . . L NEAR 056D CSEG C1608A . . . . . . . . . . . . . L NEAR 0584 CSEG C1699A . . . . . . . . . . . . . L NEAR 0588 CSEG C1699B . . . . . . . . . . . . . L NEAR 05DC CSEG C1700_CREATE_ESBX_TABLE. . . . . N PROC 05DD CSEG Global Length =009C C1701. . . . . . . . . . . . . . L NEAR 05DD CSEG C1702. . . . . . . . . . . . . . L NEAR 060A CSEG C1703. . . . . . . . . . . . . . L NEAR 0616 CSEG C1704. . . . . . . . . . . . . . L NEAR 0620 CSEG C1705. . . . . . . . . . . . . . L NEAR 0642 CSEG C1706. . . . . . . . . . . . . . L NEAR 0647 CSEG C1707. . . . . . . . . . . . . . L NEAR 0654 CSEG C1799. . . . . . . . . . . . . . L NEAR 0678 CSEG C1800_VALIDATE_SOURCE_DISK . . . N PROC 0679 CSEG Global Length =0170 C1801. . . . . . . . . . . . . . L NEAR 0679 CSEG C1802. . . . . . . . . . . . . . L NEAR 06C5 CSEG C1803. . . . . . . . . . . . . . L NEAR 06D1 CSEG C1804. . . . . . . . . . . . . . L NEAR 070A CSEG C1805. . . . . . . . . . . . . . L NEAR 0721 CSEG C1806. . . . . . . . . . . . . . L NEAR 0735 CSEG C1807. . . . . . . . . . . . . . L NEAR 0749 CSEG C1808. . . . . . . . . . . . . . L NEAR 075D CSEG C1809. . . . . . . . . . . . . . L NEAR 0771 CSEG C1810. . . . . . . . . . . . . . L NEAR 0789 CSEG C1811. . . . . . . . . . . . . . L NEAR 07B7 CSEG C1812. . . . . . . . . . . . . . L NEAR 07D6 CSEG C1813. . . . . . . . . . . . . . L NEAR 07E5 CSEG C1899. . . . . . . . . . . . . . L NEAR 07E8 CSEG C1900_CREATE_CHRN_TABLE. . . . . N PROC 07E9 CSEG Global Length =0040 C1901. . . . . . . . . . . . . . L NEAR 07E9 CSEG C1902. . . . . . . . . . . . . . L NEAR 0802 CSEG C1999. . . . . . . . . . . . . . L NEAR 0828 CSEG C2000_READ_SOURCE_DISK . . . . . N PROC 0829 CSEG Global Length =00E4 C2001. . . . . . . . . . . . . . L NEAR 0829 CSEG C2002. . . . . . . . . . . . . . L NEAR 0846 CSEG C2003. . . . . . . . . . . . . . L NEAR 084D CSEG C2004. . . . . . . . . . . . . . L NEAR 087B CSEG C2005. . . . . . . . . . . . . . L NEAR 0887 CSEG C2006. . . . . . . . . . . . . . L NEAR 0893 CSEG C2007. . . . . . . . . . . . . . L NEAR 08D1 CSEG C2008. . . . . . . . . . . . . . L NEAR 08E3 CSEG C2009. . . . . . . . . . . . . . L NEAR 0905 CSEG C2010. . . . . . . . . . . . . . L NEAR 0909 CSEG C2099. . . . . . . . . . . . . . L NEAR 090C CSEG C2100_WRITE_FORMAT_TARGET_DISK . N PROC 090D CSEG Global Length =00D7 C2101. . . . . . . . . . . . . . L NEAR 090D CSEG C2102. . . . . . . . . . . . . . L NEAR 0934 CSEG  The Microsoft MACRO Assembler , Version 1.27 Page Symbols-4 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 C2103. . . . . . . . . . . . . . L NEAR 093B CSEG C2104. . . . . . . . . . . . . . L NEAR 095E CSEG C2105. . . . . . . . . . . . . . L NEAR 096F CSEG C2106. . . . . . . . . . . . . . L NEAR 097B CSEG C2107. . . . . . . . . . . . . . L NEAR 09BA CSEG C2108. . . . . . . . . . . . . . L NEAR 09DC CSEG C2109. . . . . . . . . . . . . . L NEAR 09E0 CSEG C2199. . . . . . . . . . . . . . L NEAR 09E3 CSEG C2200_CHECK_FILE_ALLOC_TABLE . . N PROC 09E4 CSEG Global Length =0082 C2201. . . . . . . . . . . . . . L NEAR 09E4 CSEG C2202. . . . . . . . . . . . . . L NEAR 0A17 CSEG C2203. . . . . . . . . . . . . . L NEAR 0A2D CSEG C2204. . . . . . . . . . . . . . L NEAR 0A42 CSEG C2205. . . . . . . . . . . . . . L NEAR 0A4F CSEG C2206. . . . . . . . . . . . . . L NEAR 0A64 CSEG C2299. . . . . . . . . . . . . . L NEAR 0A65 CSEG C2300_FREE_MEMORY. . . . . . . . N PROC 0A66 CSEG Global Length =0027 C2301. . . . . . . . . . . . . . L NEAR 0A66 CSEG C2399. . . . . . . . . . . . . . L NEAR 0A8C CSEG CAPITAL_LETTER_A . . . . . . . . Number 0041 CAPITAL_LETTER_N . . . . . . . . Number 004E CAPITAL_LETTER_Y . . . . . . . . Number 0059 CHRN_TABLE_SIZE. . . . . . . . . Number 00B4 COMMAND_COM_SIZE . . . . . . . . Number 019A COMMAND_ERROR. . . . . . . . . . Number 0001 CONTROLLER_ERROR . . . . . . . . Number 0020 CR . . . . . . . . . . . . . . . Number 000D CRC_ERROR. . . . . . . . . . . . Number 0010 D1000_READ_DISKETTE. . . . . . . N PROC 0A8D CSEG Global Length =003C D1001. . . . . . . . . . . . . . L NEAR 0A8D CSEG D1002. . . . . . . . . . . . . . L NEAR 0A92 CSEG D1003. . . . . . . . . . . . . . L NEAR 0AB0 CSEG D1004. . . . . . . . . . . . . . L NEAR 0AC3 CSEG D1099. . . . . . . . . . . . . . L NEAR 0AC8 CSEG D1100_WRITE_FORMAT_DISKETTE. . . N PROC 0AC9 CSEG Global Length =009F D1101. . . . . . . . . . . . . . L NEAR 0AC9 CSEG D1102. . . . . . . . . . . . . . L NEAR 0ACE CSEG D1103. . . . . . . . . . . . . . L NEAR 0AF2 CSEG D1104. . . . . . . . . . . . . . L NEAR 0B05 CSEG D1105. . . . . . . . . . . . . . L NEAR 0B12 CSEG D1106. . . . . . . . . . . . . . L NEAR 0B17 CSEG D1107. . . . . . . . . . . . . . L NEAR 0B2D CSEG D1108. . . . . . . . . . . . . . L NEAR 0B40 CSEG D1109. . . . . . . . . . . . . . L NEAR 0B4D CSEG D1199. . . . . . . . . . . . . . L NEAR 0B67 CSEG D1200_DISK_IO_ERROR. . . . . . . N PROC 0B68 CSEG Global Length =00C1 D1201. . . . . . . . . . . . . . L NEAR 0B68 CSEG D1202. . . . . . . . . . . . . . L NEAR 0B80 CSEG D1203. . . . . . . . . . . . . . L NEAR 0B8D CSEG D1204. . . . . . . . . . . . . . L NEAR 0B9A CSEG  The Microsoft MACRO Assembler , Version 1.27 Page Symbols-5 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 D1205. . . . . . . . . . . . . . L NEAR 0BA7 CSEG D1206. . . . . . . . . . . . . . L NEAR 0BAA CSEG D1207. . . . . . . . . . . . . . L NEAR 0BAD CSEG D1208. . . . . . . . . . . . . . L NEAR 0BBA CSEG D1209. . . . . . . . . . . . . . L NEAR 0BC7 CSEG D1210. . . . . . . . . . . . . . L NEAR 0BD4 CSEG D1211. . . . . . . . . . . . . . L NEAR 0BE1 CSEG D1212. . . . . . . . . . . . . . L NEAR 0BEE CSEG D1213. . . . . . . . . . . . . . L NEAR 0BFB CSEG D1214. . . . . . . . . . . . . . L NEAR 0C08 CSEG D1215. . . . . . . . . . . . . . L NEAR 0C15 CSEG D1216. . . . . . . . . . . . . . L NEAR 0C22 CSEG D1217. . . . . . . . . . . . . . L NEAR 0C25 CSEG D1299. . . . . . . . . . . . . . L NEAR 0C28 CSEG DEFAULT_DRIVE_COMMAND. . . . . . Number 0019 DISK_DRIVES_MASK . . . . . . . . Number 00C0 DISK_INTERRUPT . . . . . . . . . Number 0013 DISK_PARAMETER_ADDR. . . . . . . Number 0078 DMA_BOUNDARY_ERROR . . . . . . . Number 0009 DMA_BOUNDARY_MASK. . . . . . . . Number 0FFF DMA_ERROR. . . . . . . . . . . . Number 0008 EIGHT. . . . . . . . . . . . . . Number 0008 ELEVEN . . . . . . . . . . . . . Number 000B EOT. . . . . . . . . . . . . . . Number 00FF EQUIPMENT_INTERRUPT. . . . . . . Number 0011 ESBX_TABLE_SIZE. . . . . . . . . Number 0014 ETX. . . . . . . . . . . . . . . Number 0003 FALSE. . . . . . . . . . . . . . Number 0000 FAT_SECTOR_SIZE. . . . . . . . . Number 0020 FIFTEEN. . . . . . . . . . . . . Number 000F FINAL_TRACK. . . . . . . . . . . Number 0027 FIXED_DISK . . . . . . . . . . . Number 00F8 FLG01_GOOD_COMMAND . . . . . . . L BYTE 0E21 CSEG FLG02_DOUBLE_SIDE. . . . . . . . L BYTE 0E22 CSEG FLG03_DEFAULT_DRIVE. . . . . . . L BYTE 0E23 CSEG FLG04_SINGLE_DRIVE . . . . . . . L BYTE 0E24 CSEG FLG05_STORE_BUFFER . . . . . . . L BYTE 0E25 CSEG FLG06_YES_OR_NO. . . . . . . . . L BYTE 0E26 CSEG FLG07_FIRST_TIME . . . . . . . . L BYTE 0E27 CSEG FLG08_GOOD_READ. . . . . . . . . L BYTE 0E28 CSEG FLG09_GOOD_WRITE . . . . . . . . L BYTE 0E29 CSEG FLG10_GOOD_VERIFY. . . . . . . . L BYTE 0E2A CSEG FLG11_GOOD_FORMAT. . . . . . . . L BYTE 0E2B CSEG FLG12_GOOD_FAT . . . . . . . . . L BYTE 0E2C CSEG FLG13_FIRST_READ_WRITE . . . . . L BYTE 0E2D CSEG FLG14_COPY_COMPLETE. . . . . . . L BYTE 0E2E CSEG FLG15_IO_ERROR . . . . . . . . . L BYTE 0E2F CSEG FLG16_FREE_MEMORY. . . . . . . . L BYTE 0E30 CSEG FLG17_COPY_MORE_DISKS. . . . . . L BYTE 0E31 CSEG FLUSH_KEYBOARD_COMMAND . . . . . Number 000C  The Microsoft MACRO Assembler , Version 1.27 Page Symbols-6 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 FORMAT_COMMAND . . . . . . . . . Number 0005 FOUR . . . . . . . . . . . . . . Number 0004 FOURTEEN . . . . . . . . . . . . Number 000E FREE_MEMORY. . . . . . . . . . . Number 0049 GAME_ADAPTERS_MASK . . . . . . . Number 0100 GET_DOS_VERSION_NUMBER . . . . . Number 0030 HIGH_VALUES. . . . . . . . . . . Number FFFF HT . . . . . . . . . . . . . . . Number 0009 INIT_VIDEO_MASK. . . . . . . . . Number 0030 INVALID_DRIVE. . . . . . . . . . Number 00FF IPL_DISKETTE_MASK. . . . . . . . Number 0001 KEYBOARD_BUFFER_SIZE . . . . . . Number 0050 LF . . . . . . . . . . . . . . . Number 000A MAXIMUM_DRIVES . . . . . . . . . Number 0003 MEM00_BOTTOM_FREE_MEMORY . . . . E WORD 2430 CSEG MEM01_FILE_ALLOCATION_TABLE. . . E WORD 2230 CSEG MEM02_CHRN_TABLE . . . . . . . . E WORD 16F0 CSEG MEM03_ESBX_TABLE . . . . . . . . E WORD 15B0 CSEG MEM04_TOP_OF_THE_STACK . . . . . L WORD 15AE CSEG MEM05_BOTTOM_OF_THE_STACK. . . . L WORD 152E CSEG MES00_COPY_NOTICE. . . . . . . . L BYTE 0E32 CSEG MES01A_WRITE_ANOTHER_DISKETTE. . L BYTE 0EF6 CSEG MES01B_COPY_ANOTHER_DISKETTE . . L BYTE 0F1C CSEG MES02_COPY_COMPLETE. . . . . . . L BYTE 0F3C CSEG MES03_COPY81_SECTORS . . . . . . L BYTE 0F4F CSEG MES04_COPY82_SECTORS . . . . . . L BYTE 0F78 CSEG MES05_COPY91_SECTORS . . . . . . L BYTE 0FA2 CSEG MES06_COPY92_SECTORS . . . . . . L BYTE 0FCB CSEG MES07_CORRECT_AND_PRESS_KEY. . . L BYTE 0FF5 CSEG MES08_DRIVE_NOT_READY. . . . . . L BYTE 1020 CSEG MES09_INSERT_SOURCE. . . . . . . L BYTE 103E CSEG MES100_FREECOPY_FINISHED . . . . L BYTE 146E CSEG MES10_INSERT_TARGET. . . . . . . L BYTE 1066 CSEG MES11_INSUFFICIENT_MEMORY. . . . L BYTE 108E CSEG MES12_INVALID_PARAMETER. . . . . L BYTE 10A8 CSEG MES13_INVALID_DEFAULT. . . . . . L BYTE 10CC CSEG MES14_INVALID_DRIVE. . . . . . . L BYTE 10F2 CSEG MES15_SINGLE_DRIVE_COPY. . . . . L BYTE 1113 CSEG MES16_PRESS_ANY_KEY. . . . . . . L BYTE 1140 CSEG MES17_READING_TRACK. . . . . . . L BYTE 115E CSEG MES18_UNRECOVERABLE_FORMAT . . . L BYTE 117D CSEG MES19_UNRECOVERABLE_READ . . . . L BYTE 11A7 CSEG MES20_UNRECOVERABLE_VERIFY . . . L BYTE 11CF CSEG MES21_UNRECOVERABLE_WRITE. . . . L BYTE 11F9 CSEG MES22_UNRECOVERABLE_IO . . . . . L BYTE 1222 CSEG MES23_WRITING_TRACK. . . . . . . L BYTE 123E CSEG MES24_YES. . . . . . . . . . . . L BYTE 125D CSEG MES25_NO . . . . . . . . . . . . L BYTE 1263 CSEG MES80_SEEK_ERROR . . . . . . . . L BYTE 1268 CSEG MES81_CONTROLLER_ERROR . . . . . L BYTE 1285 CSEG  The Microsoft MACRO Assembler , Version 1.27 Page Symbols-7 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 MES82_CRC_ERROR. . . . . . . . . L BYTE 12A3 CSEG MES83_DMA_BOUNDARY_ERROR . . . . L BYTE 12CA CSEG MES84_DMA_ERROR. . . . . . . . . L BYTE 12F4 CSEG MES85_SECTOR_ERROR . . . . . . . L BYTE 1314 CSEG MES86_WRITE_PROTECT_ERROR. . . . L BYTE 1332 CSEG MES87_ADDRESS_MARK_ERROR . . . . L BYTE 1358 CSEG MES88_COMMAND_ERROR. . . . . . . L BYTE 1376 CSEG MES89_UNKNOWN_ERROR. . . . . . . L BYTE 13A6 CSEG MES90_UNKNOWN_FAT_ERROR. . . . . L BYTE 13CC CSEG MES91_SINGLE_SIDE_ERROR. . . . . L BYTE 140D CSEG MES97_RETURN_LINEFEED. . . . . . L BYTE 1444 CSEG MES98_CONTROL_BREAK. . . . . . . L BYTE 1447 CSEG MES99_MEMORY_BLOCK_DESTROYED . . L BYTE 144C CSEG MINIMUM_DRIVES . . . . . . . . . Number 0000 MINIMUM_MEMORY_SIZE. . . . . . . Number 0120 MINUS_ONE. . . . . . . . . . . . Number - 0001 MODIFY_MEMORY_BLOCK. . . . . . . Number 004A NINE . . . . . . . . . . . . . . Number 0009 NUL. . . . . . . . . . . . . . . Number 0000 NUMBER_OF_RETRIES. . . . . . . . Number 0005 ONE. . . . . . . . . . . . . . . Number 0001 ONE_DIGIT. . . . . . . . . . . . Number 0031 ONE_SIDE_EIGHT_SECTORS . . . . . Number 00FE ONE_SIDE_NINE_SECTORS. . . . . . Number 00FC PARAGRAPH_SIZE . . . . . . . . . Number 0010 PARALLEL_PORTS_MASK. . . . . . . Number C000 PARAMETER_COUNT. . . . . . . . . L BYTE 0080 CSEG PARAMETER_STRING . . . . . . . . L BYTE 0081 CSEG PC_DOS_INTERRUPT . . . . . . . . Number 0021 PLANAR_RAM_MASK. . . . . . . . . Number 000C READ_ACHAR_COMMAND . . . . . . . Number 0008 READ_COMMAND . . . . . . . . . . Number 0002 READ_CURSOR_COMMAND. . . . . . . Number 0003 READ_DOT_COMMAND . . . . . . . . Number 000D READ_KEYBOARD_COMMAND. . . . . . Number 0007 READ_LPEN_COMMAND. . . . . . . . Number 0004 RESET_COMMAND. . . . . . . . . . Number 0000 RS232_PORTS_MASK . . . . . . . . Number 0E00 S1000_SETUP_DISK_PARAM_TABLE . . N PROC 0C29 CSEG Global Length =0027 S1001. . . . . . . . . . . . . . L NEAR 0C29 CSEG S1099. . . . . . . . . . . . . . L NEAR 0C4F CSEG S1100_RESTORE_DISK_PARAM_TABLE . N PROC 0C50 CSEG Global Length =001D S1101. . . . . . . . . . . . . . L NEAR 0C50 CSEG S1199. . . . . . . . . . . . . . L NEAR 0C6C CSEG S1200_GET_VERSION_NUMBER . . . . N PROC 0C6D CSEG Global Length =0010 S1201. . . . . . . . . . . . . . L NEAR 0C6D CSEG S1299. . . . . . . . . . . . . . L NEAR 0C7C CSEG SCROLL_DOWN_COMMAND. . . . . . . Number 0007 SCROLL_UP_COMMAND. . . . . . . . Number 0006 SECTOR_ERROR . . . . . . . . . . Number 0004  The Microsoft MACRO Assembler , Version 1.27 Page Symbols-8 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 SECTOR_SIZE. . . . . . . . . . . Number 0200 SEEK_ERROR . . . . . . . . . . . Number 0040 SET_ADPAGE_COMMAND . . . . . . . Number 0005 SET_COLOR_COMMAND. . . . . . . . Number 000B SET_CPOS_COMMAND . . . . . . . . Number 0002 SET_CTYPE_COMMAND. . . . . . . . Number 0001 SET_MODE_COMMAND . . . . . . . . Number 0000 SEVENTY_NINE . . . . . . . . . . Number 004F SIX. . . . . . . . . . . . . . . Number 0006 SLASH. . . . . . . . . . . . . . Number 002F SMALL_LETTER_N . . . . . . . . . Number 006E SMALL_LETTER_Y . . . . . . . . . Number 0079 SOH. . . . . . . . . . . . . . . Number 0001 SOURCE_DRIVE . . . . . . . . . . L BYTE 005C CSEG SOURCE_FILENAME. . . . . . . . . L BYTE 005D CSEG SOURCE_FILLER_AREA . . . . . . . L BYTE 0068 CSEG SPACE. . . . . . . . . . . . . . Number 0020 STATUS_COMMAND . . . . . . . . . Number 0001 STX. . . . . . . . . . . . . . . Number 0002 SYS01_NUMBER_COLUMNS . . . . . . L BYTE 150A CSEG SYS02_CURRENT_MODE . . . . . . . L BYTE 150B CSEG SYS03_ACTIVE_PAGE. . . . . . . . L BYTE 150C CSEG SYS04_FOREGROUND_COLOR . . . . . L BYTE 150D CSEG SYS05_PARA_RAM_SIZE. . . . . . . L WORD 150E CSEG SYS06_MONITOR_FLAG . . . . . . . L BYTE 1510 CSEG SYS07_NO_PARALLEL_PORTS. . . . . L BYTE 1511 CSEG SYS08_GAME_ADAPTERS. . . . . . . L BYTE 1512 CSEG SYS09_NO_RS232_PORTS . . . . . . L BYTE 1513 CSEG SYS10_NO_DISK_DRIVES . . . . . . L BYTE 1514 CSEG SYS11_INIT_VIDEO_MODE. . . . . . L BYTE 1515 CSEG SYS12_PLANAR_RAM_SIZE. . . . . . L BYTE 1516 CSEG SYS13_IPL_FROM_DISKETTE. . . . . L BYTE 1517 CSEG SYS14_DEFAULT_DRIVE. . . . . . . L BYTE 1518 CSEG SYS15_STACK_POINTER. . . . . . . L WORD 1519 CSEG SYS16_SAVE_DPT_OFFSET. . . . . . L WORD 151B CSEG SYS17_SAVE_DPT_SEGMENT . . . . . L WORD 151D CSEG SYS18_DISK_PARAMETER_TABLE . . . L BYTE 151F CSEG SYS19_MAJOR_VERS_NUMBER. . . . . L BYTE 152A CSEG SYS20_MINOR_VERS_NUMBER. . . . . L BYTE 152B CSEG SYS21_ALLOC_SEGMENT. . . . . . . L WORD 152C CSEG TARGET_DRIVE . . . . . . . . . . L BYTE 006C CSEG TARGET_FILENAME. . . . . . . . . L BYTE 006D CSEG TARGET_FILLER_AREA . . . . . . . L BYTE 0078 CSEG TEN. . . . . . . . . . . . . . . Number 000A THIRTY_FOUR. . . . . . . . . . . Number 0022 THIRTY_NINE. . . . . . . . . . . Number 0027 THIRTY_SIX . . . . . . . . . . . Number 0024 THREE. . . . . . . . . . . . . . Number 0003 TIME_OUT_ERROR . . . . . . . . . Number 0080 TRUE . . . . . . . . . . . . . . Number - 0001  The Microsoft MACRO Assembler , Version 1.27 Page Symbols-9 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 TWELVE . . . . . . . . . . . . . Number 000C TWENTY_FIVE. . . . . . . . . . . Number 0019 TWENTY_FOUR. . . . . . . . . . . Number 0018 TWO. . . . . . . . . . . . . . . Number 0002 TWO_SIDES_EIGHT_SECTORS. . . . . Number 00FF TWO_SIDES_NINE_SECTORS . . . . . Number 00FD U1000_DISPLAY_MESSAGE. . . . . . N PROC 0C7D CSEG Global Length =001E U1001. . . . . . . . . . . . . . L NEAR 0C7D CSEG U1002. . . . . . . . . . . . . . L NEAR 0C81 CSEG U1090. . . . . . . . . . . . . . L NEAR 0C96 CSEG U1099. . . . . . . . . . . . . . L NEAR 0C9A CSEG U1100_GET_RESPONSE . . . . . . . N PROC 0C9B CSEG Global Length =00A8 U1101. . . . . . . . . . . . . . L NEAR 0C9B CSEG U1102. . . . . . . . . . . . . . L NEAR 0CA0 CSEG U1103. . . . . . . . . . . . . . L NEAR 0CA6 CSEG U1104. . . . . . . . . . . . . . L NEAR 0CB9 CSEG U1105. . . . . . . . . . . . . . L NEAR 0CC3 CSEG U1106. . . . . . . . . . . . . . L NEAR 0CFA CSEG U1107. . . . . . . . . . . . . . L NEAR 0D09 CSEG U1108. . . . . . . . . . . . . . L NEAR 0D19 CSEG U1190. . . . . . . . . . . . . . L NEAR 0D3D CSEG U1199. . . . . . . . . . . . . . L NEAR 0D42 CSEG U1200_GET_YES_OR_NO. . . . . . . N PROC 0D43 CSEG Global Length =0064 U1201. . . . . . . . . . . . . . L NEAR 0D43 CSEG U1202. . . . . . . . . . . . . . L NEAR 0D46 CSEG U1203. . . . . . . . . . . . . . L NEAR 0D59 CSEG U1204. . . . . . . . . . . . . . L NEAR 0D6B CSEG U1205. . . . . . . . . . . . . . L NEAR 0D7D CSEG U1206. . . . . . . . . . . . . . L NEAR 0D8F CSEG U1207. . . . . . . . . . . . . . L NEAR 0DA1 CSEG U1290. . . . . . . . . . . . . . L NEAR 0DA3 CSEG U1299. . . . . . . . . . . . . . L NEAR 0DA6 CSEG U1300_CONVERT_BINARY_TO_ASCII. . N PROC 0DA7 CSEG Global Length =000F U1301. . . . . . . . . . . . . . L NEAR 0DA7 CSEG U1399. . . . . . . . . . . . . . L NEAR 0DB5 CSEG U1400_DISPLAY_HEAD_AND_TRACK . . N PROC 0DB6 CSEG Global Length =006B U1401. . . . . . . . . . . . . . L NEAR 0DB6 CSEG U1490. . . . . . . . . . . . . . L NEAR 0E1C CSEG U1499. . . . . . . . . . . . . . L NEAR 0E20 CSEG UNDERLINE_CURSOR . . . . . . . . Number 0D0D VERIFY_COMMAND . . . . . . . . . Number 0004 VIDEO_ADDRESS. . . . . . . . . . Number A000 VIDEO_INTERRUPT. . . . . . . . . Number 0010 VIDEO_STATE_COMMAND. . . . . . . Number 000F WRITE_ACHAR_COMMAND. . . . . . . Number 0009 WRITE_CHAR_COMMAND . . . . . . . Number 000A WRITE_COMMAND. . . . . . . . . . Number 0003 WRITE_DOT_COMMAND. . . . . . . . Number 000C WRITE_PROTECT_ERROR. . . . . . . Number 0003 WRITE_TTY_COMMAND. . . . . . . . Number 000E  The Microsoft MACRO Assembler , Version 1.27 Page Symbols-10 FREECOPY Version 1.13 (C)Copyright 1984 06-06-85 WRK01_SOURCE_DRIVE . . . . . . . L BYTE 1487 CSEG WRK02_TARGET_DRIVE . . . . . . . L BYTE 1488 CSEG WRK03_VALID_FILENAME . . . . . . L BYTE 1489 CSEG Length =000B WRK04_PARAMETER_COUNT. . . . . . L BYTE 1494 CSEG WRK05_KEYBOARD_BUFFER. . . . . . L BYTE 1495 CSEG WRK06_DRIVE_NUMBER . . . . . . . L BYTE 14E7 CSEG WRK07_HEAD_NUMBER. . . . . . . . L BYTE 14E8 CSEG WRK08_TRACK_NUMBER . . . . . . . L BYTE 14E9 CSEG WRK09_SECTOR_NUMBER. . . . . . . L BYTE 14EA CSEG WRK10_NUMBER_OF_SECTORS. . . . . L BYTE 14EB CSEG WRK11_SEGMENT_ADDRESS. . . . . . L WORD 14EC CSEG WRK12_OFFSET_ADDRESS . . . . . . L WORD 14EE CSEG WRK13_RETRY_COUNTER. . . . . . . L BYTE 14F0 CSEG WRK14_STATUS_OPERATION . . . . . L BYTE 14F1 CSEG WRK15_MAXIMUM_HEADS. . . . . . . L BYTE 14F2 CSEG WRK16_MAXIMUM_TRACKS . . . . . . L BYTE 14F3 CSEG WRK17_MAXIMUM_SECTORS. . . . . . L BYTE 14F4 CSEG WRK18_COUNTER_ESBX_ENTRIES . . . L WORD 14F5 CSEG WRK19_NUMBER_ESBX_ENTRIES. . . . L WORD 14F7 CSEG WRK20_CURRENT_SOURCE_HEAD. . . . L BYTE 14F9 CSEG WRK21_CURRENT_SOURCE_TRACK . . . L BYTE 14FA CSEG WRK22_CURRENT_TARGET_HEAD. . . . L BYTE 14FB CSEG WRK23_CURRENT_TARGET_TRACK . . . L BYTE 14FC CSEG WRK24_READ_MESSAGE_ROW . . . . . L BYTE 14FD CSEG WRK25_VERIFY_MESSAGE_ROW . . . . L BYTE 14FE CSEG WRK26_FORMAT_MESSAGE_ROW . . . . L BYTE 14FF CSEG WRK27_WRITE_MESSAGE_ROW. . . . . L BYTE 1500 CSEG WRK28_CURRENT_MESSAGE_ROW. . . . L BYTE 1501 CSEG WRK29_CURRENT_HEAD . . . . . . . L BYTE 1502 CSEG WRK30_CURRENT_TRACK. . . . . . . L BYTE 1503 CSEG WRK31_TRACK_READ_COUNTER . . . . L BYTE 1504 CSEG WRK32_TRACK_WRITE_COUNTER. . . . L BYTE 1505 CSEG WRK33_CHRN_TABLE_ADDRESS . . . . L WORD 1506 CSEG WRK34_DMA_OVERFLOW_COUNTER . . . L WORD 1508 CSEG ZERO . . . . . . . . . . . . . . Number 0000 ZERO_DIGIT . . . . . . . . . . . Number 0030 Warning Severe Errors Errors 0 0