1 ; _____________________________________________ 2 ; | | 3 ; | Project: APPLER | 4 ; | File: DM.ASM | 5 ; | Compiler: 16-bit TASM (2.5) | 6 ; | | 7 ; | Subject: Disk Manager | 8 ; | | 9 ; | Author: Emil Dotchevski | 10 ; |_____________________________________________| 11 12 include GLOBALS.INC 13 include INTERFAC.INC 14 include CONIO.INC 15 include DM.INC 16 17 G_DIRECTORY = 0 18 G_PATH_FILTER = 1 19 G_IMAGE = 2 20 G_D1 = 3 21 G_D2 = 4 22 23 DM segment public 24 assume cs:DM,ds:DM,es:Emulate 25 26 ManagerState db MS_NORMAL 27 GetLineBuf db 80h dup (0) 28 29 GetLineParams GL_ParamStruc 30 ScreenIOParams SIO_ParamStruc <1,DM,0,0,offset Screen,seg Screen,1,0,1,1> 31 GetKeyParams RK_ParamStruc <1,Fkey,1,Alt_Key,0,?,ShowAll,0 > 32 33 disk1_ptr dd CurrentDrive 34 disk2_ptr dd OtherDrive 35 set_ptrs: push ax bx ds 36 pushf 37 mov ds,word ptr cs:disk1_ptr[2] 38 assume ds:seg CurrentDrive 39 cmp ds:CurrentDrive.ID,0 40 mov ax,offset CurrentDrive 41 mov bx,offset OtherDrive 42 jz set_ptrs_1 43 xchg ax,bx 44 set_ptrs_1: mov word ptr cs:disk1_ptr[0],ax 45 mov word ptr cs:disk2_ptr[0],bx 46 popf 47 pop ds bx ax 48 ret 49 50 assume es:seg CurrentDrive 51 present1: push bp es 52 les bp,disk1_ptr 53 cmp es:[bp].FileHandle,0FFFFh 54 pop es bp 55 ret 56 57 present2: push bp es 58 les bp,disk2_ptr 59 cmp es:[bp].FileHandle,0FFFFh 60 pop es bp 61 ret 62 assume es:Emulate 63 64 DMInInit proc far 65 call DM_InInitP 66 call UnSetBreaks 67 ret 68 DMInInit endp 69 70 DMOutInit proc far 71 push ax es 72 call DM_OutInitP 73 mov ax,seg T_Iflags 74 mov es,ax 75 assume es:seg T_Iflags 76 mov byte ptr es:T_Iflags,00000010b 77 assume es:Emulate,ds:DM 78 call AppleKeysOn 79 call SetBreaks 80 pop es ax 81 ret 82 DMOutInit endp 83 84 DM_InInitP proc near 85 cli 86 push ax bx ds es 87 mov ax,Emulate 88 mov es,ax 89 mov al,es:[C000] 90 mov cs:KeyPressed,al 91 mov es:[C000],0 92 call DebugKeysOn 93 call set_ptrs 94 mov ax,CONio 95 mov ds,ax 96 assume ds:CONio 97 mov GL_ParamsOfs, offset GetLineParams 98 mov GL_ParamsSeg, seg GetLineParams 99 mov SIO_ParamsOfs, offset ScreenIOParams 100 mov SIO_ParamsSeg, seg ScreenIOParams 101 mov RK_ParamsOfs, offset GetKeyParams 102 mov RK_ParamsSeg, seg GetKeyParams 103 assume ds:DM 104 pop es ds bx ax 105 sti 106 ret 107 DM_InInitP endp 108 109 KeyPressed db 0 110 DM_OutInitP proc near 111 cli 112 push ax es 113 mov ax,Emulate 114 mov es,ax 115 mov al,cs:KeyPressed 116 mov es:[C000],al 117 assume es:Emulate 118 pop es ax 119 ret 120 DM_OutInitP endp 121 122 123 124 GoWhere? dw G_D1 125 DM_FirstFlag db 1 126 DM_MainRet: push cs 127 pop ds 128 cmp DM_FirstFlag,0 129 jz BigLoop 130 mov DM_FirstFlag,0 131 call ShowAll 132 mov DirectoryParams.S_MaxLength,0 133 call ReadDir 134 BigLoop: mov GetLineParams.GL_Color,0Bh 135 mov GetLineParams.GL_CX,80*2 136 mov di,GoWhere? 137 shl di,1 138 mov GoWhere?,G_D1 139 call CmndAddress[di] 140 call ShowAll 141 jmp BigLoop 142 143 CmndAddress dw Directory,S_PathFilter,Image,D1,D2 144 145 I_Current db 0 146 I_CurrentSVD db 0 147 I_FirstTime? db 1 148 I_CH db 15,15,15,16,17,17,17,19,19,19,20,21,21,21,22 149 I_CL db 29,32,35,29,29,32,35,29,32,35,29,29,32,35,29 150 I_Keys db '0123456789abcdef' 151 db 5,6,7,8,1,2,20h 152 db 0Ch,18h,7Fh 153 I_Procs dw I_Num,I_Num,I_Num,I_Num,I_Num,I_Num,I_Num,I_Num 154 dw I_Num,I_Num,I_Num,I_Num,I_Num,I_Num,I_Num,I_Num 155 dw I_Left,I_Right,I_Up,I_Down,I_Home,I_End,I_Space 156 dw I_Esc,I_Enter,I_7Fh 157 Image: push es 158 mov ScreenIOparams.CursorColor,40h 159 mov ScreenIOparams.CursorFlag,1 160 mov ScreenIOparams.CursorLen,4 161 mov cs:ActiveFlags,0000000000010000b 162 mov I_FirstTime?,1 163 mov bx,seg SectorImage 164 mov es,bx 165 assume es:seg SectorImage 166 xor bx,bx 167 mov bl,I_CurrentSVD 168 mov I_Current,bl 169 I_Loop: xor bx,bx 170 mov bl,I_Current 171 mov ch,I_CH[bx] 172 mov cl,I_CL[bx] 173 dec cl 174 call ReadKey 175 mov di,offset I_Keys 176 mov cx,offset I_Procs - offset I_Keys 177 call CalcCommand 178 jc I_Loop 179 shl di,1 180 xor bx,bx 181 mov bl,I_Current 182 call I_Procs[di] 183 jnc I_Loop 184 pop es 185 mov bl,I_Current 186 mov I_CurrentSvd,bl 187 ret 188 189 I_OffsetAddr db AddressProlog,AddressProlog+1,AddressProlog+2 190 db AddressCheckSum 191 db AddressEpilog,AddressEpilog+1,AddressEpilog+2 192 db DataProlog, DataProlog+1, DataProlog+2 193 db DataCheckSum 194 db DataEpilog, DataEpilog+1, DataEpilog+2 195 db EndByte 196 I_Num: mov bl,I_OffsetAddr[bx] 197 xor bh,bh 198 shr di,1 199 mov ax,di 200 cmp cs:I_FirstTime?,0 201 jz I_NumByte_1 202 mov byte ptr es:SectorImage[bx],0 203 I_NumByte_1: shl byte ptr es:SectorImage[bx],4 204 or byte ptr es:SectorImage[bx],al 205 clc 206 mov I_FirstTime?,0 207 ret 208 209 I_Left: dec I_Current 210 jns I_LeftOk 211 mov I_Current,size SectorImage_S - 1 212 I_LeftOk: clc 213 mov I_FirstTime?,1 214 ret 215 216 I_SpaceFlags db 0,1,1,1,1,1,1,0,1,1,1,1,1,1,1 217 I_Space: cmp I_SpaceFlags[bx],0 218 jz I_SpcRet 219 mov bl,I_OffsetAddr[bx] 220 xor bh,bh 221 xor byte ptr es:SectorImageF[bx],0FFh 222 cmp cs:I_FirstTime?,1 223 I_SpcRet: clc 224 ret 225 226 I_Enter: 227 I_Right: inc I_Current 228 cmp I_Current,size SectorImage_S 229 jb I_RightOk 230 mov I_Current,0 231 I_RightOk: clc 232 mov I_FirstTime?,1 233 ret 234 235 I_Ups db 14,12,13,0,3,1,2,4,5,6,7,10,8,9,11 236 I_Up: mov al,I_Ups[bx] 237 mov I_Current,al 238 clc 239 mov I_FirstTime?,1 240 ret 241 242 I_Downs db 3,5,6,4,7,8,9,10,12,13,11,14,1,2,0 243 I_Down: mov al,I_Downs[bx] 244 mov I_Current,al 245 clc 246 mov I_FirstTime?,1 247 ret 248 249 I_Home: mov I_Current,0 250 clc 251 mov I_FirstTime?,1 252 ret 253 254 I_End: mov I_Current,size SectorImage_S - 1 255 clc 256 mov I_FirstTime?,1 257 ret 258 259 I_Esc: call GoAppleII 260 clc 261 ret 262 263 I_7Fh: stc 264 ret 265 266 267 assume es:Emulate 268 S_ParamsStruc struc 269 S_MaxLength db 0 270 S_BegPrint db ? 271 S_Pos db ? 272 S_CX dw ? 273 S_LinesNum db ? 274 S_Buffer db ? 275 S_ParamsStruc ends 276 DirectoryParams S_ParamsStruc <0,0,0,0B2Ah,13> 277 db 100h * size DiskDescription dup (0) 278 279 S_Commands db 'ta',18h 280 db 7,8,3,4,1,2,0Ch 281 S_Subrt dw S_Type,S_Access,S_Enter 282 dw S_Up,S_Down,S_PgUp,S_PgDn,S_Home,S_End,GoAppleII 283 S_CallIfZero? db 0,0,0,0,0,0,0,0,0 284 Directory: xor bx,bx 285 mov SHL_Flag,1 286 mov GetLineParams.GL_AllowSpc,0 287 gotoxy 2,0 288 mov GetLineParams.GL_CX,cx 289 mov ActiveFlags,0000000000000010b 290 mov FkeysFlags,1111111111b 291 mov ScreenIOparams.CursorFlag,0 292 mov cx,DirectoryParams.S_CX 293 call ReadKey 294 cmp al,7Fh 295 je SelectRet 296 mov di,offset S_Commands 297 mov cx,offset S_Subrt- offset S_Commands 298 call CalcCommand 299 jc Directory 300 cmp DirectoryParams.S_MaxLength,0 301 jnz S_ok1 302 test S_CallIfZero?[di],1 303 jz Directory 304 S_ok1: shl di,1 305 call S_Subrt[di] 306 jmp Directory 307 SelectRet: GetLineService _GL_CLRBUFF 308 ret 309 310 S_Up: push ax 311 mov al,DirectoryParams.S_Pos 312 or al,al 313 jz S_UpRet 314 dec al 315 mov ah,al 316 sub ah,DirectoryParams.S_BegPrint 317 cmp ah,2 318 jae S_UpOk1 319 cmp DirectoryParams.S_BegPrint,0 320 jz S_UpOk1 321 dec DirectoryParams.S_BegPrint 322 inc byte ptr DirectoryParams.S_CX[1] 323 S_UpOk1: dec byte ptr DirectoryParams.S_CX[1] 324 S_UpRet: mov DirectoryParams.S_Pos,al 325 pop ax 326 ret 327 328 S_Down: push ax 329 mov al,DirectoryParams.S_Pos 330 mov ah,DirectoryParams.S_MaxLength 331 dec ah 332 cmp al,ah 333 je S_DownRet 334 inc al 335 mov ah,al 336 sub ah,DirectoryParams.S_BegPrint 337 add ah,2 338 cmp ah,DirectoryParams.S_LinesNum 339 jb S_DownOk1 340 mov ah,DirectoryParams.S_BegPrint 341 add ah,DirectoryParams.S_LinesNum 342 jc S_DownOk1 343 cmp ah,DirectoryParams.S_MaxLength 344 jae S_DownOk1 345 inc DirectoryParams.S_BegPrint 346 dec byte ptr DirectoryParams.S_CX[1] 347 S_DownOk1: inc byte ptr DirectoryParams.S_CX[1] 348 S_DownRet: mov DirectoryParams.S_Pos,al 349 pop ax 350 ret 351 352 S_PgUp: push cx 353 xor ch,ch 354 mov cl,DirectoryParams.S_LinesNum 355 dec cx 356 S_PgUpLoop: call S_Up 357 loop S_PgUpLoop 358 pop cx 359 ret 360 361 S_PgDn: push cx 362 xor ch,ch 363 mov cl,DirectoryParams.S_LinesNum 364 dec cx 365 S_PgDnLoop: call S_Down 366 loop S_PgDnLoop 367 pop cx 368 ret 369 370 S_Home: push cx 371 mov cx,100h 372 dec cx 373 S_HomeLoop: call S_Up 374 loop S_HomeLoop 375 pop cx 376 ret 377 378 S_End: push cx 379 mov cx,100h 380 dec cx 381 S_EndLoop: call S_Down 382 loop S_EndLoop 383 pop cx 384 ret 385 386 S_Access: push bx di 387 mov bl,DirectoryParams.S_Pos 388 call CalcBuffer 389 test DirectoryParams.S_Buffer[di].FileFlag,FF_DAMAGED? 390 jnz S_AccessRet 391 xor DirectoryParams.S_Buffer[di].FileFlag,FF_READ_ONLY? 392 S_AccessRet: pop di bx 393 ret 394 395 S_TypeNewVal db FD_Directory,FD_DOS33,FD_Nibble 396 S_Type: push ax bx di 397 mov bl,DirectoryParams.S_Pos 398 call CalcBuffer 399 mov al,DirectoryParams.S_Buffer[di].FileFlag 400 test al ,FF_DAMAGED? 401 jnz S_TypeRet 402 test al,FF_MODIFYTYPE? 403 jz S_TypeRet 404 xor bx,bx 405 mov bl,DirectoryParams.S_Buffer[di].FileType 406 mov bl,S_TypeNewVal[bx] 407 mov DirectoryParams.S_Buffer[di].FileType,bl 408 S_TypeRet: pop di bx ax 409 ret 410 411 S_EnterProcs dw SE_Directory,SE_Nibble,SE_DOS33 412 S_Enter: push ax bx cx dx si di ds es 413 cmp ManagerState,MS_NORMAL 414 jne S_EnterRet 415 cmp DirectoryParams.S_MaxLength,0 416 jz S_EnterRet 417 mov bl,DirectoryParams.S_Pos 418 call CalcBuffer 419 test DirectoryParams.S_Buffer[di].FileFlag,FF_DAMAGED? 420 jnz S_EnterRet 421 xor bx,bx 422 mov bl,DirectoryParams.S_Buffer[di].FileType 423 mov si,bx 424 mov bx,di 425 call LinkName 426 shl si,1 427 mov dx,offset Path 428 call S_EnterProcs[si] 429 call UnLinkName 430 S_EnterRet: pop es ds di si dx cx bx ax 431 ret 432 433 SE_Directory: mov bx,LN_BX 434 mov byte ptr Path[bx],'\' 435 mov byte ptr Path[bx+1],0 436 call ReadDir 437 ret 438 439 SE_DOS33: 440 SE_Nibble: test ActiveFlags,0000000000001000b 441 mov ax,offset Fkey_InsertB 442 jnz SE_1 443 mov ax,offset Fkey_InsertA 444 SE_1: call ax 445 ret 446 447 448 449 D1: mov DN,0 450 mov ActiveFlags,0000000000000100b 451 jmp Drive 452 453 D2: mov DN,1 454 mov ActiveFlags,0000000000001000b 455 jmp Drive 456 457 D_Chars db 'av' 458 db 7,8,3,4,1,2,18h,0Ch 459 D_Procs dw D_Access,D_Volume 460 dw S_Up,S_Down,S_PgUp,S_PgDn,S_Home,S_End,S_Enter,GoAppleII 461 D_CallIfZero? db 0,0,1,1,1,1,1,1,1,1 462 DN db ? 463 Drive: push es 464 D_Loop: call ReadKey 465 cmp al,7Fh 466 je D_Ret 467 cmp DN,0 468 mov dx,offset SDA_Filename 469 mov bx,offset present1 470 les bp,disk1_ptr 471 jz D_ok1 472 mov dx,offset SDA_Filename 473 mov bx,offset present2 474 les bp,disk2_ptr 475 assume es:seg CurrentDrive 476 D_ok1: mov di,offset D_Chars 477 mov cx,offset D_Procs - offset D_Chars 478 call CalcCommand 479 jc D_Loop 480 call bx 481 jnz D_ok2 482 cmp D_CallIfZero?[di],0 483 jz D_Loop 484 D_ok2: shl di,1 485 call D_Procs[di] 486 jmp D_Loop 487 D_Ret: pop es 488 ret 489 490 D_Access: push ax cx 491 call Prepare4DOS 492 mov ax,4300h 493 int 21h 494 jc D_AccessError 495 mov ax,4301h 496 xor cx,1 497 int 21h 498 jc D_AccessError 499 xor es:[bp].WriteProtect,0FFh 500 D_AccessExit: call SOD4eraperP 501 pop cx ax 502 ret 503 504 D_RemoveDisk dw Fkey_RemoveA,Fkey_RemoveB 505 D_AccessError: xor bh,bh 506 mov bl,DN 507 shl bx,1 508 call D_RemoveDisk[bx] 509 jmp D_AccessExit 510 511 512 D_VolCXs dw 622h,0B22h 513 D_Vol_First? db ? 514 D_VolNums db '0123456789abcdef' 515 D_Volume: push word ptr [GetKeyParams.RK_AltFlag] 516 cmp es:[bp].DiskType,0 517 jz D_VolRet 518 mov ScreenIOparams.CursorColor,40h 519 mov ScreenIOparams.CursorFlag,1 520 mov ScreenIOparams.CursorLen,4 521 mov SHL_Flag,0 522 mov GetKeyParams.RK_AltFlag,0 523 mov D_Vol_First?,1 524 D_VolLoop: xor bh,bh 525 mov bl,DN 526 shl bx,1 527 mov cx,D_VolCXs[bx] 528 call ReadKey 529 cmp al,0Ch 530 je D_VolRet 531 cmp al,18h 532 je D_VolRet 533 mov di,offset D_VolNums 534 mov cx,16 535 call CalcCommand 536 jc D_VolLoop 537 mov bl,es:[bp].Volume 538 cmp D_Vol_First?,0 539 jz D_VolNotFirst 540 xor bl,bl 541 mov D_Vol_First?,bl 542 D_VolNotFirst: shl bl,4 543 or bx,di 544 mov es:[bp].Volume,bl 545 jmp D_VolLoop 546 D_VolRet: mov ScreenIOparams.CursorFlag,0 547 mov SHL_Flag,1 548 pop word ptr [GetKeyParams.RK_AltFlag] 549 ret 550 assume es:Emulate 551 552 553 S_PathFilter: push word ptr cs:[ScreenIOparams.CursorFlag] 554 push word ptr cs:[GetKeyParams.RK_AltFlag] 555 mov SHL_Flag,0 556 mov GetKeyParams.RK_AltFlag,0 557 mov GetLineParams.GL_AllowSpc,0 558 mov ActiveFlags,0000000000000001b 559 mov FkeysFlags,0000000101b 560 mov ScreenIOparams.CursorFlag,1 561 mov GetLineParams.GL_Buffer,offset PathFilter 562 mov GetLineParams.GL_Pos,0 563 mov GetLineParams.GL_BegPrint,0 564 mov GetLineParams.GL_MaxLength,67+20h 565 mov GetLineParams.GL_MaxPrint,35 566 mov ScreenIOparams.CursorLen,1 567 call LinkPathFilter 568 mov GetLineParams.GL_Length,bl 569 gotoxy 5,42 570 GetLineService _GETLINE 571 call GetPathFilter 572 call ReadDir 573 pop word ptr cs:[GetKeyParams.RK_AltFlag] 574 pop word ptr cs:[ScreenIOparams.CursorFlag] 575 mov SHL_Flag,1 576 GetLineService _GL_CLRBUFF 577 clc 578 ret 579 580 LinkPathFilter: push ax si di es 581 xor bx,bx 582 push cs 583 pop es 584 mov si,offset Path 585 mov di,offset PathFilter 586 cld 587 LPF_Loop1: lodsb 588 or al,al 589 jz LPF_Filter 590 stosb 591 inc bx 592 jmp LPF_Loop1 593 LPF_Filter: mov si,offset Filter 594 LPF_Loop2: lodsb 595 stosb 596 inc bx 597 or al,al 598 jnz LPF_Loop2 599 dec bx 600 pop es di si ax 601 ret 602 603 604 605 GetPathFilter: push ax cx dx si di es 606 push cs 607 pop es 608 xor al,al 609 mov di,offset PathFilter 610 cld 611 mov cx,20h+67 612 repne scasb 613 dec di 614 mov si,di 615 std 616 GPF_Loop1: cmp si,offset PathFilter 617 jna GPF_NoPath 618 lodsb 619 cmp al,'\' 620 jne GPF_Loop1 621 add si,2 622 mov dx,si 623 mov si,offset PathFilter 624 mov di,offset Path 625 cld 626 GPF_Loop2: lodsb 627 stosb 628 cmp si,dx 629 jna GPF_Loop2 630 dec si 631 dec di 632 xor al,al 633 stosb 634 mov Path[67],0 635 GPF_NoPath: cld 636 mov di,offset Filter 637 xor cx,cx 638 GPF_Loop3: lodsb 639 stosb 640 cmp cx,20h 641 je GPF_LongFilt 642 inc cx 643 or al,al 644 jnz GPF_Loop3 645 cmp cx,1 646 je GPF_NoFilter 647 GPF_Ret: pop es di si dx cx ax 648 ret 649 650 GPF_LongFilt: dec di 651 xor ax,ax 652 stosb 653 jmp GPF_Ret 654 655 GPF_DefaultFilt db '*.DSK,*.NBL',0 656 GPF_NoFilter: mov si,offset PathFilter 657 mov di,offset Path 658 cld 659 GPF_Loop4: lodsb 660 stosb 661 or al,al 662 jnz GPF_Loop4 663 mov si,offset GPF_DefaultFilt 664 mov di,offset Filter 665 mov cx,offset GPF_NoFilter - offset GPF_DefaultFilt 666 rep movsb 667 jmp GPF_Ret 668 669 670 671 ; -- Read Directory ------------------ 672 673 RD_GetDirs? db 1 674 Path db '.\',66 dup (0) ; Current Path 675 Filter db '*.DSK,*.NBL',020h dup (0) ; Scan Filter 676 PathFilter db 67+20h dup (0) ; Path&Filter 677 WildCard db 0Dh dup (0) ; Temp 678 WC_AnyFile db '*.*',0 ; For SubDirs scanning 679 680 BufPtr dw 0 681 RD_0OfsSvd dw 0 682 DTA DTA_S <0,0,0,0,0,0> 683 684 ReadDirectory proc near 685 push ax bx cx dx si di es 686 call Prepare4DOS 687 mov si,offset Path 688 mov di,si 689 push ds 690 pop es 691 mov ah,60h 692 int 21h 693 mov dx,offset DTA 694 mov ah,1Ah 695 int 21h 696 697 xor bx,bx 698 RD_SearchFor0: cmp Path[bx],0 699 jz RD_0Found 700 inc bx 701 jmp RD_SearchFor0 702 RD_0Found: or bx,bx 703 jz RD_PathOK 704 cmp Path[bx-1],'\' 705 je RD_PathOK 706 mov Path[bx],'\' 707 inc bx 708 mov Path[bx],0 709 RD_PathOK: xor si,si 710 mov RD_0OfsSvd,bx 711 712 cmp RD_GetDirs?,0 713 jz RD_GetFiles 714 715 RD_CopyWC1: mov al,WC_AnyFile[si] 716 mov Path[bx],al 717 inc si 718 inc bx 719 cmp al,0 720 jnz RD_CopyWC1 721 mov bx,BufPtr 722 mov dx,offset Path 723 mov cx,FA_DIRECTORY 724 FindFirst 725 jc RD_GetFiles 726 RD_GetDirLoop: test DTA.Attributes,FA_DIRECTORY 727 jz RD_GD_Next 728 cmp DirectoryParams.S_MaxLength,0FEh 729 je RD_NoMoreFiles 730 call RD_PutFile 731 inc DirectoryParams.S_MaxLength 732 add bx,size DiskDescription 733 RD_GD_Next: FindNext 734 jnc RD_GetDirLoop 735 mov BufPtr,bx 736 737 RD_GetFiles: mov bx,RD_0OfsSvd 738 xor si,si 739 RD_CopyWC2: mov al,WildCard[si] 740 mov Path[bx],al 741 inc si 742 inc bx 743 cmp al,0 744 jnz RD_CopyWC2 745 mov bx,BufPtr 746 mov dx,offset Path 747 mov cx,FA_ARCHIVE or FA_READ_ONLY 748 FindFirst 749 jc RD_NoMoreFiles 750 RD_GetFilesLoop: cmp DirectoryParams.S_MaxLength,0FEh 751 je RD_NoMoreFiles 752 call RD_PutFile 753 inc DirectoryParams.S_MaxLength 754 add bx,size DiskDescription 755 FindNext 756 jnc RD_GetFilesLoop 757 758 RD_NoMoreFiles: mov si,RD_0OfsSvd 759 mov byte ptr Path[si],0 760 mov BufPtr,bx 761 call SOD4eraperP 762 pop es di si dx cx bx ax 763 ret 764 ReadDirectory endp 765 766 767 768 PF_FileExts db 'NBLDSK' 769 PF_FileTypes db FD_Nibble,FD_DOS33 770 PF_Addr dw PF_Directory,PF_Nibble,PF_DOS33 771 PF_NameLength dw ? 772 RD_PutFile proc near 773 push ax cx dx si di bp es 774 xor si,si 775 PF_GetNameLoop: mov al,DTA.FileSpec[si] 776 mov DirectoryParams.S_Buffer[bx].FileName[si],al 777 inc si 778 or al,al 779 jnz PF_GetNameLoop 780 mov PF_NameLength,si 781 782 or bx,bx 783 jz PF_Cont1 784 xor bp,bp 785 PF_Cmp0: xor di,di 786 PF_Cmp1: mov al,DirectoryParams.S_Buffer[bp].FileName[di] 787 cmp al,DirectoryParams.S_Buffer[bx].FileName[di] 788 jne PF_NotMatch 789 inc di 790 or al,al 791 jnz PF_Cmp1 792 PF_Error: sub bx,size DiskDescription 793 dec DirectoryParams.S_MaxLength 794 jmp PF_Ret 795 PF_NotMatch: add bp,size DiskDescription 796 cmp bp,bx 797 jne PF_Cmp0 798 799 PF_Cont1: mov DirectoryParams.S_Buffer[bx].FileFlag,0 800 test DTA.Attributes,FA_DIRECTORY 801 jz PF_NotDir 802 mov DirectoryParams.S_Buffer[bx].FileType,FD_DIRECTORY 803 jmp PF_Ret 804 805 PF_NotDir: push cs 806 pop es 807 cld 808 lea di,DirectoryParams.S_Buffer[bx].FileName 809 inc di 810 mov al,'.' 811 mov cx,PF_NameLength 812 repne scasb 813 xor dl,dl 814 jcxz PF_PokeType 815 mov bp,di 816 mov si,offset PF_FileExts 817 mov dh,2 818 PF_CmpExtLoop: mov di,bp 819 mov cx,3 820 repe cmpsb 821 je PF_PokeType 822 PF_3: inc si 823 loop PF_3 824 inc dl 825 dec dh 826 jnz PF_CmpExtLoop 827 xor dl,dl 828 PF_PokeType: xor dh,dh 829 mov di,dx 830 xor ax,ax 831 mov al,PF_FileTypes[di] 832 mov DirectoryParams.S_Buffer[bx].FileType,al 833 mov di,ax 834 shl di,1 835 call PF_Addr[di] 836 and DirectoryParams.S_Buffer[bx].FileFlag,not FF_READ_ONLY? 837 test DTA.Attributes,FA_READ_ONLY 838 jz PF_Ret 839 or DirectoryParams.S_Buffer[bx].FileFlag,FF_READ_ONLY? 840 PF_Ret: pop es bp di si dx cx ax 841 ret 842 RD_PutFile endp 843 844 PF_Directory: mov DirectoryParams.S_Buffer[bx].FileFlag,0 845 ret 846 847 PF_DOS33: mov DirectoryParams.S_Buffer[bx].FileFlag,FF_MODIFYTYPE? 848 ret 849 850 PF_Nibble: mov DirectoryParams.S_Buffer[bx].FileFlag,FF_MODIFYTYPE? 851 ret 852 853 854 RD_NewDisk db 1,0Fh,'',0 855 ReadDir proc near 856 push ax bx si di 857 mov GetKeyParams.RK_ErrPtr,offset SMS_ReadDir 858 xor ax,ax 859 mov DirectoryParams.S_MaxLength,al 860 mov BufPtr,ax 861 mov DirectoryParams.S_BegPrint,al 862 mov DirectoryParams.S_Pos,al 863 mov DirectoryParams.S_CX,0B2Ah 864 mov RD_GetDirs?,1 865 xor si,si 866 RD1_Loop0: xor di,di 867 RD1_Cloop: mov al,Filter[si] 868 or al,al 869 jz RD1_CallRead 870 cmp al,',' 871 je RD1_CallRead 872 mov WildCard[di],al 873 inc si 874 inc di 875 cmp di,0Ch 876 jb RD1_Cloop 877 RD1_CallRead: mov WildCard[di],0 878 call ReadDirectory 879 mov RD_GetDirs?,0 880 cmp Filter[si],0 881 jz RD1_Done 882 RD1_Ignore: inc si 883 cmp Filter[si],',' 884 je RD1_Ignore 885 jmp RD1_Loop0 886 RD1_Done: mov GetKeyParams.RK_ErrPtr,0 887 mov bl,DirectoryParams.S_MaxLength 888 inc DirectoryParams.S_MaxLength 889 call CalcBuffer 890 xor bx,bx 891 RD_CopyNewName: mov al,RD_NewDisk[bx] 892 mov DirectoryParams.S_Buffer[di].FileName[bx],al 893 inc bx 894 or al,al 895 jnz RD_CopyNewName 896 mov DirectoryParams.S_Buffer[di].FileFlag,FF_MODIFYTYPE? 897 mov DirectoryParams.S_Buffer[di].FileType,FD_DOS33 898 call LinkPathFilter 899 call CheckInsertion 900 pop di si bx ax 901 ret 902 ReadDir endp 903 904 905 CheckInsertion: push ax bx cx di bp ds es 906 pushf 907 push cs 908 pop ds 909 cmp DirectoryParams.S_MaxLength,0 910 jz CI_Quit 911 call set_ptrs 912 xor cx,cx 913 mov bl,cl 914 call CalcBuffer 915 CI_Loop: mov bx,di 916 call LinkName 917 xor bx,bx 918 call present1 919 jz CI_NodiskA 920 CI_Loop1: mov al,SDA_Filename[bx] 921 or al,al 922 jz CI_L1exit 923 inc bx 924 cmp al,Path-1[bx] 925 je CI_Loop1 926 CI_L1exit: mov al,FF_INSERTED1? 927 je CI_ok1 928 CI_NodiskA: xor al,al 929 CI_ok1: and DirectoryParams.S_Buffer[di].FileFlag,not(FF_INSERTED1? or FF_INSERTED2?) 930 or DirectoryParams.S_Buffer[di].FileFlag,al 931 xor bx,bx 932 call present2 933 jz CI_NodiskB 934 CI_Loop2: mov al,SDB_Filename[bx] 935 or al,al 936 jz CI_L2exit 937 inc bx 938 cmp al,Path-1[bx] 939 je CI_Loop2 940 CI_L2exit: mov al,FF_INSERTED2? 941 je CI_ok2 942 CI_NodiskB: xor al,al 943 CI_ok2: or DirectoryParams.S_Buffer[di].FileFlag,al 944 mov bl,cl 945 inc cl 946 add di,size DiskDescription 947 cmp bl,DirectoryParams.S_MaxLength 948 jb CI_Loop 949 call UnLinkName 950 CI_Quit: popf 951 pop es ds bp di cx bx ax 952 ret 953 assume es:Emulate 954 955 956 LN_BX dw ? 957 LinkName: pushf 958 push ax bx si di 959 mov si,bx 960 lea si,DirectoryParams.S_Buffer[si] 961 mov di,cs:RD_0OfsSvd 962 xor bx,bx 963 LN_Loop: mov al,cs:[si].FileName[bx] 964 mov cs:Path[di][bx],al 965 inc bx 966 or al,al 967 jnz LN_Loop 968 dec bx 969 add bx,di 970 mov cs:LN_BX,bx 971 pop di si bx ax 972 popf 973 ret 974 975 976 977 UnLinkName: pushf 978 push bx 979 mov bx,cs:RD_0OfsSvd 980 mov cs:Path[bx],0 981 pop bx 982 popf 983 ret 984 985 986 987 Upcase: cmp al,'A' 988 jb UPCSret 989 cmp al,'Z' 990 ja UPCSret 991 or al,20h 992 UPCSret: ret 993 994 995 996 CalcBuffer: push ax 997 mov al,size DiskDescription 998 mul bl 999 mov di,ax 1000 pop ax 1001 ret 1002 1003 1004 CalcCommand: push ax bx cx es ; Returns number of a command 1005 push cs ; Input: 1006 pop es ; di -> offset Commands 1007 call Upcase ; al -> search command 1008 cld ; cx -> commands count 1009 mov bx,di 1010 repne scasb ; Output: 1011 stc ; di <- Number of the command 1012 jne CC_end ; cf <- 1 if not found 1013 sub di,bx 1014 dec di 1015 clc 1016 CC_end: pop es cx bx ax 1017 ccc label byte 1018 ret 1019 1020 1021 1022 ; -- Hook INT 24h ---------------------- 1023 1024 DOSflag db 0 1025 OldFlags dw 0 1026 Prepare4DOS: saveall 1027 pushf 1028 xor ax,ax 1029 mov cs:SHL_Flag,al 1030 xchg ax,cs:ActiveFlags 1031 mov cs:OldFlags,ax 1032 mov cs:DOSflag,1 1033 call ShowAll 1034 ScreenIOservice _SHOWSCREEN 1035 call far ptr SystemTINI 1036 popf 1037 restoreall 1038 ret 1039 1040 1041 1042 ; -- Unhook INT 24h -------------------- 1043 1044 SOD4eraperP: saveall 1045 pushf 1046 mov ax,cs:OldFlags 1047 mov cs:ActiveFlags,ax 1048 mov cs:SHL_Flag,1 1049 mov ax,Emulate 1050 mov es,ax 1051 mov byte ptr [C000],0 1052 call far ptr SystemINIT 1053 mov cs:DOSflag,0 1054 popf 1055 restoreall 1056 ret 1057 1058 1059 1060 ; ******************************************************************* 1061 ; ** ** 1062 ; ** ** 1063 ; ** S H O W A L L ** 1064 ; ** ** 1065 ; ** ** 1066 ; ******************************************************************* 1067 1068 ActiveFlags dw 0 1069 ShowAll proc far 1070 push ds bp 1071 push word ptr [ScreenIOparams.CursorColor] 1072 push word ptr [ScreenIOparams.CursorLen] 1073 push word ptr [ScreenIOparams.CursorFlag] 1074 push cs 1075 pop ds 1076 mov ScreenIOparams.CursorLen,14 ;36 1077 mov ScreenIOparams.CursorColor,10h 1078 mov ScreenIOparams.CursorFlag,1 1079 call InitFlags 1080 ScreenIOservice _CLEARSCREEN 1081 call ShowPathFilter 1082 call ShowDirectory 1083 call ShowDiskA 1084 call ShowDiskB 1085 call ShowImage 1086 call ShowFuncKeys 1087 call ShowError 1088 call ShowMessage 1089 ScreenIOservice _SHOWLINE 1090 call ShowHilights 1091 call ShowTitle 1092 pop word ptr [ScreenIOparams.CursorFlag] 1093 pop word ptr [ScreenIOparams.CursorLen] 1094 pop word ptr [ScreenIOparams.CursorColor] 1095 pop bp ds 1096 ret 1097 ShowAll endp 1098 1099 1100 ; -- Draw box -------------------------- 1101 ; Entry: 1102 ; AH = Active Flag Bit 1103 ; CX = HTAB & VTAB 1104 ; BX = Offset of the strings 1105 ; DL = Length of the box line - 1 1106 ; DH = Number of lines - 1 1107 ; Destroy: 1108 ; AX,BX,CX,DX 1109 DB_CX dw ? 1110 DrawBox: push ax 1111 mov ax,cx 1112 add ax,80 * 2 1113 mov cs:DB_CX,ax 1114 pop ax 1115 test ActiveFlags,ax 1116 mov ah,7 1117 jz DB_ok1 1118 mov ah,0Eh 1119 DB_ok1: ScreenIOservice _STRINGPRINT 1120 mov bx,ScreenIOparams.SP_bx 1121 dec dh 1122 mov al,dh 1123 mov dx,cs:DB_CX 1124 DB_Loop1: mov cx,dx 1125 add dx,80 * 2 1126 ScreenIOservice _STRINGPRINT 1127 dec al 1128 jnz DB_Loop1 1129 mov cx,dx 1130 mov bx,ScreenIOparams.SP_bx 1131 ScreenIOservice _STRINGPRINT 1132 ret 1133 1134 1135 IF_Procs dw IFP_F1,IFP_F2,IFP_F3,IFP_F4,IFP_F5 1136 dw IFP_F6,IFP_F7,IFP_F8,IFP_F9,IFP_F0 1137 InitFlags: push ax bx si di bp 1138 mov bl,DirectoryParams.S_Pos 1139 call CalcBuffer 1140 xor si,si 1141 cmp SHL_Flag,0 1142 mov FkeysFlags,0000000100b 1143 jz IF_0 1144 IF_Loop: call IF_Procs[si] 1145 add si,2 1146 cmp si,20 1147 jb IF_Loop 1148 IF_0: cmp DOSflag,0 1149 jnz IF_1 1150 cmp ActiveFlags,0 1151 jnz IF_Ret 1152 IF_1: mov FkeysFlags,0 1153 IF_Ret: pop bp di si bx ax 1154 ret 1155 1156 IFP_F1: cmp ManagerState,MS_NORMAL 1157 jne IFP_F1ret 1158 or FkeysFlags,0000000001b 1159 mov SFK_Reboot[1],06Fh 1160 cmp DirectoryParams.S_Buffer[di].FileType,FD_DIRECTORY 1161 je IFP_F1ret 1162 test DirectoryParams.S_Buffer[di].FileFlag,FF_INSERTED1? or FF_INSERTED2? or FF_DAMAGED? 1163 jnz IFP_F1ret 1164 mov SFK_Reboot[1],01Fh 1165 IFP_F1ret: ret 1166 1167 IFP_F2_D1 dw Fkey_InsertA,Fkey_RemoveA 1168 IFP_F2_D2 dw Fkey_InsertB,Fkey_RemoveB 1169 IFP_F2: or FkeysFlags,00000010b 1170 test ActiveFlags,0000000000001000b 1171 mov bx,offset IFP_F2_D1 1172 mov ax,offset present1 1173 jz IFP_F2_1 1174 mov bx,offset IFP_F2_D2 1175 mov ax,offset present2 1176 IFP_F2_1: call ax 1177 mov ax,[bx][2] 1178 mov SFK_FkeysMain[2],offset SFK_Remove 1179 jnz IFP_F2_2 1180 mov ax,[bx][0] 1181 mov SFK_FkeysMain[2],offset SFK_Insert 1182 cmp DirectoryParams.S_Buffer[di].FileType,FD_DIRECTORY 1183 je IFP_F2_12 1184 test DirectoryParams.S_Buffer[di].FileFlag,FF_INSERTED1? or FF_INSERTED2? or FF_DAMAGED? 1185 jz IFP_F2_2 1186 IFP_F2_12: and FkeysFlags,11111101b 1187 IFP_F2_2: mov Fkeys_Main[2],ax 1188 ret 1189 1190 IFP_F3: or FkeysFlags,0000000100b 1191 cmp ManagerState,MS_NORMAL 1192 mov SFK_FkeysMain[2*2],offset SFK_Apple 1193 mov Fkeys_Main[2*2],offset Fkey_Apple 1194 je IFP_F3_1 1195 mov SFK_FkeysMain[2*2],offset SFK_Resume 1196 mov Fkeys_Main[2*2],offset Fkey_Resume 1197 IFP_F3_1: ret 1198 1199 IFP_F4: cmp ManagerState,MS_NORMAL 1200 mov SFK_FkeysMain[3*2],offset SFK_None 1201 mov Fkeys_Main[3*2],offset Fkey_None 1202 je IFP_F4_1 1203 or FkeysFlags,0000001000b 1204 mov SFK_FkeysMain[3*2],offset SFK_Abort 1205 mov Fkeys_Main[3*2],offset Fkey_Abort 1206 IFP_F4_1: ret 1207 1208 IFP_F5: 1209 IFP_F6: 1210 IFP_F7: 1211 IFP_F8: 1212 IFP_F9: ret 1213 1214 IFP_F0: or FkeysFlags,1100000000b 1215 test ActiveFlags,1 1216 jz IFP0_Ret 1217 mov FkeysFlags,0000000101b 1218 IFP0_Ret: ret 1219 1220 1221 ST_Str db ' APPLER DISK MANAGER ',0 1222 ShowTitle: push ax bx cx 1223 gotoxy 1,0 1224 mov ah,6Fh 1225 mov bx,offset ST_Str 1226 ScreenIOservice _STRINGPRINT 1227 gotoxy 2,0 1228 xor ah,ah 1229 ScreenIOservice _STRINGPRINT 1230 pop cx bx ax 1231 ret 1232 1233 1234 SP_Str db 'ÚPath&FilterÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿',0 1235 db '³ ³',0 1236 db 'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ',0 1237 ShowPathFilter: push ax bx cx dx 1238 gotoxy 3,40 1239 mov bx,offset SP_Str 1240 mov dh,3 1241 mov ax,0000000000000001b 1242 call DrawBox 1243 mov bx,35 1244 xor al,al 1245 xchg PathFilter[bx],al 1246 mov bx,offset PathFilter 1247 mov ah,0Bh 1248 gotoxy 5,42 1249 ScreenIOservice _StringPrint 1250 mov bx,35 1251 xchg PathFilter[bx],al 1252 SPF_Ret: pop dx cx bx ax 1253 ret 1254 1255 1256 SD_Str db 'ÚDirectoryÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿',0 1257 db '³ ³',0 1258 db 'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ',0 1259 1260 SD_Antet0 db 1,07h,'ÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄ',0 1261 SD_Antet1 db 1,07h,'Filename Type Access',0 1262 SD_Antet2 db 1,07h,'Filename ',1,0Fh,'T',1,07h,'ype ',1,0Fh,'A',1,07h,'ccess',0 1263 SD_NotFndMsg db 1,7,'No Matching Files in Directory',0 1264 SD_AntetAddr dw SD_Antet1,SD_Antet1,SD_Antet2,SD_Antet1 1265 dw SD_Antet1,SD_Antet1,SD_Antet2,SD_Antet1 1266 1267 ShowDirectory: push ax bx cx dx di 1268 gotoxy 7,40 1269 mov bx,offset SD_Str 1270 mov dh,17 1271 mov ax,0000000000000010b 1272 call DrawBox 1273 cmp DirectoryParams.S_MaxLength,0 1274 jnz SD_ok2 1275 gotoxy 9,2Bh 1276 mov bx,offset SD_NotFndMsg 1277 ScreenIOservice _STRINGPRINT 1278 jmp SD_Ret 1279 SD_ok2: mov bl,DirectoryParams.S_Pos 1280 call CalcBuffer 1281 xor bx,bx 1282 mov bl,DirectoryParams.S_Buffer[di].FileFlag 1283 test bl,11111000b 1284 jnz SD_ok25 1285 and bl,00000111b 1286 shl bx,1 1287 mov bx,SD_AntetAddr[bx] 1288 cmp SHL_Flag,0 1289 jz SD_ok25 1290 test ActiveFlags,0000000000000010b 1291 jnz SD_ok3 1292 SD_ok25: mov bx,offset SD_Antet1 1293 SD_ok3: gotoxy 9,43 1294 ScreenIOservice _STRINGPRINT 1295 mov bx,offset SD_Antet0 1296 gotoxy 10,43 1297 ScreenIOservice _STRINGPRINT 1298 mov bl,DirectoryParams.S_BegPrint 1299 mov dx,13 1300 mov di,offset DirectoryParams.S_Buffer 1301 gotoxy 11,43 1302 mov ah,7 1303 SD_Loop0: call OneFile 1304 add cx,80 * 2 1305 inc bl 1306 cmp bl,DirectoryParams.S_MaxLength 1307 je SD_Ret0 1308 dec dx 1309 jnz SD_Loop0 1310 SD_Ret0: cmp NameEntering,0 1311 jnz SD_Ret 1312 mov cx,DirectoryParams.S_CX 1313 ScreenIOservice _SHOWCURSOR 1314 SD_Ret: pop di dx cx bx ax 1315 ret 1316 1317 1318 SDA_Str db 'ÚDrive 1ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ',0 1319 db '³ ³ ',0 1320 db 'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ',0 1321 SDA_NoDisk db 1,0Fh,'NO DISK IN DRIVE',0 1322 SDA_File db 1,7,'Name: ',0 1323 SDA_Type db 1,7,'Type: ',0 1324 SDA_Access db 'A',1,7,'ccess: ',0 1325 SDA_Volume db 'V',1,7,'olume: ',0 1326 SDA_Track db 1,7,'Track:',1,0Fh,0 1327 SDA_DOS33 db 1,0Bh,'DOS 3.3',0 1328 SDA_Nibble db 1,0Bh,'Nibblized',0 1329 SDA_ReadOnly db 1,0Bh,'R',0 1330 SDA_RW db 1,0Bh,'R/W',0 1331 SDA_Color db ? 1332 SDA_Filename db 80h dup (0) 1333 ShowDiskA: push ax bx cx dx si es 1334 gotoxy 3,0 1335 mov bx,offset SDA_Str 1336 mov dh,4 1337 mov ax,0000000000000100b 1338 call DrawBox 1339 les si,disk1_ptr 1340 assume es:seg CurrentDrive 1341 cmp es:[si].FileHandle,0FFFFh 1342 jne SDA_Show 1343 mov bx,offset SDA_NoDisk 1344 gotoxy 5,11 1345 ScreenIOservice _STRINGPRINT 1346 jmp SDA_Ret 1347 SDA_Show: mov SDA_Color,7 1348 cmp SHL_Flag,0 1349 jz SDA_LoLight 1350 test ActiveFlags,0000000000000100b 1351 jz SDA_LoLight 1352 mov SDA_Color,0Fh 1353 SDA_LoLight: gotoxy 5,2 1354 mov bx,offset SDA_File 1355 ScreenIOservice _STRINGPRINT 1356 mov bx,offset SDA_Filename 1357 call ShowFilename 1358 gotoxy 6,2 1359 mov bx,offset SDA_Type 1360 mov ah,SDA_Color 1361 ScreenIOservice _STRINGPRINT 1362 cmp es:[si].DiskType,0 1363 mov bx,offset SDA_Nibble 1364 jz SDA_Print 1365 mov bx,offset SDA_DOS33 1366 SDA_Print: ScreenIOservice _STRINGPRINT 1367 gotoxy 5,26 1368 mov bx,offset SDA_Access 1369 mov ah,SDA_Color 1370 ScreenIOservice _STRINGPRINT 1371 cmp es:[si].WriteProtect,0 1372 mov bx,offset SDA_RW 1373 jz SDA_ok1 1374 mov bx,offset SDA_ReadOnly 1375 SDA_ok1: ScreenIOservice _STRINGPRINT 1376 cmp es:[si].DiskType,0 1377 jz SDA_Ret 1378 gotoxy 6,26 1379 mov bx,offset SDA_Volume 1380 mov ah,SDA_Color 1381 ScreenIOservice _STRINGPRINT 1382 mov ah,0Bh 1383 mov al,es:[si].Volume 1384 ScreenIOservice _BYTEPRINT 1385 SDA_Ret: gotoxy 3,30 1386 mov bx,offset SDA_Track 1387 ScreenIOservice _STRINGPRINT 1388 mov al,es:[si].Track 1389 mov ah,0Fh 1390 ScreenIOservice _BYTEPRINT 1391 pop es si dx cx bx ax 1392 ret 1393 assume es:Emulate 1394 1395 1396 SDB_Str db 'ÚDrive 2ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ',0 1397 db '³ ³ ',0 1398 db 'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ',0 1399 SDB_Type db 0 1400 SDB_Filename db 80h dup (0) 1401 ShowDiskB: push ax bx cx dx si es 1402 gotoxy 8,0 1403 mov bx,offset SDB_Str 1404 mov dh,4 1405 mov ax,0000000000001000b 1406 call DrawBox 1407 les si,disk2_ptr 1408 assume es:seg CurrentDrive 1409 cmp es:[si].FileHandle,0FFFFh 1410 jne SDB_Show 1411 mov bx,offset SDA_NoDisk 1412 gotoxy 10,11 1413 ScreenIOservice _STRINGPRINT 1414 jmp SDB_Ret 1415 SDB_Show: mov SDA_Color,7 1416 cmp SHL_Flag,0 1417 jz SDB_LoLight 1418 test ActiveFlags,0000000000001000b 1419 jz SDB_LoLight 1420 mov SDA_Color,0Fh 1421 SDB_LoLight: gotoxy 10,2 1422 mov bx,offset SDA_File 1423 ScreenIOservice _STRINGPRINT 1424 mov bx,offset SDB_Filename 1425 call ShowFilename 1426 gotoxy 11,2 1427 mov bx,offset SDA_Type 1428 mov ah,SDA_Color 1429 ScreenIOservice _STRINGPRINT 1430 cmp es:[si].DiskType,0 1431 mov bx,offset SDA_Nibble 1432 jz SDB_Print 1433 mov bx,offset SDA_DOS33 1434 SDB_Print: ScreenIOservice _STRINGPRINT 1435 gotoxy 10,26 1436 mov bx,offset SDA_Access 1437 mov ah,SDA_Color 1438 ScreenIOservice _STRINGPRINT 1439 cmp es:[si].WriteProtect,0 1440 mov bx,offset SDA_RW 1441 jz SDB_ok1 1442 mov bx,offset SDA_ReadOnly 1443 SDB_ok1: ScreenIOservice _STRINGPRINT 1444 cmp es:[si].DiskType,0 1445 jz SDB_Ret 1446 gotoxy 11,26 1447 mov bx,offset SDA_Volume 1448 mov ah,SDA_Color 1449 ScreenIOservice _STRINGPRINT 1450 mov ah,0Bh 1451 mov al,es:[si].Volume 1452 ScreenIOservice _BYTEPRINT 1453 SDB_Ret: gotoxy 8,30 1454 mov bx,offset SDA_Track 1455 ScreenIOservice _STRINGPRINT 1456 mov al,es:[si].Track 1457 mov ah,0Fh 1458 ScreenIOservice _BYTEPRINT 1459 pop es si dx cx bx ax 1460 ret 1461 assume es:Emulate 1462 1463 1464 ShowFilename: push ax si di es 1465 push cx 1466 cmp byte ptr ds:[bx],0 1467 stc 1468 jz SF_Ret 1469 mov di,bx 1470 mov ax,ds 1471 mov es,ax 1472 mov cx,0FFh 1473 xor al,al 1474 cld 1475 repne scasb 1476 std 1477 mov si,di 1478 dec si 1479 SF_Loop1: lodsb 1480 cmp al,'\' 1481 je SF_ok 1482 cmp si,bx 1483 jae SF_Loop1 1484 dec si 1485 SF_ok: mov bx,si 1486 add bx,2 1487 mov ah,3 1488 clc 1489 pop cx 1490 pushf 1491 ScreenIOservice _STRINGPRINT 1492 popf 1493 SF_Ret: pop es di si ax 1494 ret 1495 1496 1497 SI_Str db 'ÚDOS 3.3 Sector ImageÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ',0 1498 db '³ ³ ',0 1499 db 'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ',0 1500 SI_AdrP db 1,7,'Address Field Prolog: ',0 1501 SI_AdrChecksum db 1,7,'Address Field Checksum: ',0 1502 SI_AdrE db 1,7,'Address Field Epilog: ',0 1503 SI_DataP db 1,7,'Data Field Prolog: ',0 1504 SI_DataChecksum db 1,7,'Data Field Checksum: ',0 1505 SI_DataE db 1,7,'Data Field Epilog: ',0 1506 SI_EOS db 1,7,'End-Of-Sector Byte: ',0 1507 SI_Texts dw SI_AdrP,?,? 1508 dw SI_AdrChecksum 1509 dw SI_AdrE,?,? 1510 dw SI_DataP,?,? 1511 dw SI_DataChecksum 1512 dw SI_DataE,?,? 1513 dw SI_EOS,? 1514 SI_TextFlags db 1,0,0,1,1,0,0,1,0,0,1,1,0,0,1 1515 ShowImage: push ax bx cx dx si di ds 1516 gotoxy 13,0 1517 mov bx,offset SI_Str 1518 mov dh,10 1519 mov ax,0000000000010000b 1520 call DrawBox 1521 mov ax,seg SectorImage 1522 mov ds,ax 1523 mov si,offset SectorImage 1524 mov dx,offset SectorImageF 1525 cld 1526 xor di,di 1527 SI_Loop: cmp cs:SI_TextFlags[di],0 1528 jz SI_Dont 1529 mov ch,cs:I_CH[di] 1530 dec ch 1531 mov al,ch 1532 mov ah,80 * 2 1533 mul ah 1534 add ax,2*2 1535 mov cx,ax 1536 shl di,1 1537 mov bx,cs:SI_Texts[di] 1538 shr di,1 1539 ScreenIOservice _STRINGPRINT 1540 SI_Dont: xchg dx,si 1541 lodsb 1542 xchg dx,si 1543 or al,al 1544 mov ah,3 1545 jz SI_ok1 1546 mov ah,0Bh 1547 SI_ok1: lodsb 1548 ScreenIOservice _BYTEPRINT 1549 add cx,2 1550 inc di 1551 cmp di,size SectorImage_S 1552 jb SI_Loop 1553 pop ds di si dx cx bx ax 1554 ret 1555 1556 1557 SMS_ReadDir db 'Accessing Disk Directory...',0 1558 SMS_DecodeErr db 1,8Ch,'Drive ',3 1559 dw DM_DriveNum 1560 db ': Error Decoding Track Data',0 1561 SMS_EnterFilename db 'Enter Filename ( cancel)',0 1562 ShowMessage: push ax bx cx 1563 cmp GetKeyParams.RK_ErrPtr,0 1564 jz SMS_Ret 1565 gotoxy 18h,1 1566 mov bx,GetKeyParams.RK_ErrPtr 1567 mov ah,0Ah 1568 ScreenIOservice _STRINGPRINT 1569 SMS_Ret: pop cx bx ax 1570 ret 1571 1572 1573 1574 SFK_Str db '1 2 3 4 5 ' 1575 db '6 7 8 9 10 ',0 1576 FkeysFlags dw 1010000111b 1577 SFK_FkeysMain dw SFK_Reboot,SFK_Insert,SFK_Apple,SFK_None,SFK_None 1578 dw SFK_None,SFK_None,SFK_None,SFK_PathFilter,SFK_Rescan 1579 SFK_Reboot db 1,6Fh,'Reboot',0 1580 SFK_Apple db 1,6Fh,'Apple ',0 1581 SFK_Resume db 1,6Fh,'Resume',0 1582 SFK_Abort db 1,6Fh,'Abort ',0 1583 SFK_Insert db 1,6Fh,'Insert',0 1584 SFK_Remove db 1,6Fh,'Remove',0 1585 SFK_PathFilter db 1,6Fh,'Path&F',0 1586 SFK_Rescan db 1,6Fh,'Rescan',0 1587 SFK_None db 1,6Fh,' ',0 1588 1589 ShowFuncKeys: push ax bx cx dx si 1590 gotoxy 19h,0 1591 mov bx,offset SFK_Str 1592 mov ah,7 1593 ScreenIOservice _STRINGPRINT 1594 gotoxy 19h,1 1595 xor si,si 1596 mov dx,FkeysFlags 1597 SFK_Loop0: shr dx,1 1598 mov ah,8 1599 jnc SFK_Next0 1600 mov ah,0Fh 1601 SFK_Next0: mov bx,SFK_FkeysMain[si] 1602 and byte ptr [bx+1],0F0h 1603 or byte ptr [bx+1],ah 1604 ScreenIOservice _STRINGPRINT 1605 add cx,4 1606 add si,2 1607 cmp si,20 1608 jb SFK_Loop0 1609 pop si dx cx bx ax 1610 ret 1611 1612 1613 SE_BadAdrChk db 'Bad address checksum: ',3 1614 dw DM_BadData,0 1615 SE_BadAdrEpi db 'Bad address epilog, S:',3 1616 dw DM_Sector,0 1617 SE_BadTrack db 'Wrong track number: ',3 1618 dw DM_BadData 1619 db ', S:',3 1620 dw DM_Sector,0 1621 SE_BadSector db 'Sector number not allowed: ',3 1622 dw DM_BadData,0 1623 SE_MisingData db 'Data field not found, S:',3 1624 dw DM_Sector,0 1625 SE_DuplicateSec db 'Sector found twice: ',3 1626 dw DM_BadData 1627 db ', S:',3 1628 dw DM_Sector,0 1629 SE_BadDataChk db 'Bad data checksum: ',3 1630 dw DM_BadData 1631 db ', S:',3 1632 dw DM_Sector,0 1633 SE_BadDataImg db 'Bad nibble byte, S:',3 1634 dw DM_Sector,0 1635 SE_BadDataEpi db 1,8Ch,'Bad data epilog, S:',3 1636 dw DM_Sector,0 1637 SE_BadEnd db 'Bad end-of-sector byte, S:',3 1638 dw DM_Sector,0 1639 SE_MissingSec db 'Can''t find sector: ',3 1640 dw DM_BadData,0 1641 SE_WriteAttempt db 'Write protected',0 1642 SE_ErrorAddress dw SE_BadAdrChk 1643 dw SE_BadAdrEpi 1644 dw SE_BadTrack 1645 dw SE_BadSector 1646 dw SE_MisingData 1647 dw SE_DuplicateSec 1648 dw SE_BadDataChk 1649 dw SE_BadDataImg 1650 dw SE_BadDataEpi 1651 dw SE_BadEnd 1652 dw SE_MissingSec 1653 dw SE_WriteAttempt 1654 ShowError: push ax bx cx 1655 cmp ManagerState,MS_NORMAL 1656 je SE_Ret 1657 cmp DM_DriveNum,1 1658 gotoxy 4,2 1659 je SE_ok1 1660 gotoxy 9,2 1661 SE_ok1: xor bx,bx 1662 mov bl,DM_ErrorCode 1663 shl bx,1 1664 mov bx,SE_ErrorAddress[bx] 1665 mov ah,0Ch 1666 ScreenIOservice _STRINGPRINT 1667 SE_Ret: pop cx bx ax 1668 ret 1669 1670 SHL_Flag db 1 1671 ShowHilights: cmp SHL_Flag,0 1672 jz SHL_Ret 1673 push ax cx 1674 gotoxy 13,16 1675 mov ax,0E00h+'I' 1676 ScreenIOservice _SYMBPRINT 1677 gotoxy 3,7 1678 mov al,'1' 1679 ScreenIOservice _SYMBPRINT 1680 gotoxy 8,7 1681 mov al,'2' 1682 ScreenIOservice _SYMBPRINT 1683 gotoxy 3,41 1684 mov al,'P' 1685 ScreenIOservice _SYMBPRINT 1686 gotoxy 7,41 1687 mov al,'D' 1688 ScreenIOservice _SYMBPRINT 1689 SHL_Exit: pop cx ax 1690 SHL_Ret: ret 1691 1692 1693 OF_CX dw ? 1694 OF_Types dw OF_Directory,OF_Nibble,OF_DOS33 1695 OF_Directory db 1,7,'',0 1696 OF_DOS33 db 'DOS3.3',0 1697 OF_Nibble db 'Nibble',0 1698 OF_RO db 'Read Only ',0 1699 OF_RW db 'Read/Write',0 1700 OF_DirAccess db 1,7,' ---- ',0 1701 OF_Inserted1 db 1,0Fh,'Inserted in Drive 1',0 1702 OF_Inserted2 db 1,0Fh,'Inserted in Drive 2',0 1703 OF_Base dw ? 1704 OF_Color db ? 1705 comment % 1706 push ax dx ds 1707 mov ax,4d9h 1708 mov ds,ax 1709 mov dx,103h 1710 mov ax,2509h 1711 int 21h 1712 pop ds dx ax 1713 int 3 1714 % 1715 OneFile: push ax bx cx dx di 1716 mov OF_Base,di 1717 mov OF_CX,cx 1718 call CalcBuffer 1719 mov bp,OF_Base 1720 lea bx,ds:[bp][di].FileName 1721 test ds:[bp][di].FileFlag,FF_DAMAGED? 1722 mov OF_Color,0Bh 1723 jz OF_hop1 1724 mov ah,0Ch 1725 mov OF_Color,ah 1726 OF_hop1: ScreenIOservice _STRINGPRINT 1727 mov cx,OF_CX 1728 add cx,2*15 1729 mov bp,OF_Base 1730 test ds:[bp][di].FileFlag,FF_INSERTED1? or FF_INSERTED2? 1731 jz OF_NotInserted 1732 test ds:[bp][di].FileFlag,FF_INSERTED1? 1733 mov bx,offset OF_Inserted1 1734 jnz OF_id1 1735 mov bx,offset OF_Inserted2 1736 OF_id1: ScreenIOservice _STRINGPRINT 1737 jmp OF_Ret 1738 OF_NotInserted: xor bx,bx 1739 push bp 1740 mov al,ds:[bp][di].FileType 1741 mov bl,al 1742 shl bx,1 1743 mov bx,OF_Types[bx] 1744 mov ah,OF_Color 1745 ScreenIOservice _STRINGPRINT 1746 cmp al,FD_DIRECTORY 1747 mov bx,offset OF_DirAccess 1748 pop bp 1749 je OF_hop2 1750 test ds:[bp][di].FileFlag,FF_READ_ONLY? 1751 mov bx,offset OF_RO 1752 jnz OF_hop2 1753 mov bx,offset OF_RW 1754 OF_hop2: mov cx,OF_CX 1755 add cx,2*24 1756 ScreenIOservice _STRINGPRINT 1757 OF_Ret: pop di dx cx bx ax 1758 ret 1759 1760 1761 1762 1763 ; ******************************************************************* 1764 ; ** ** 1765 ; ** ** 1766 ; ** K E Y B O A R D S E R V I C E S ** 1767 ; ** ** 1768 ; ** ** 1769 ; ******************************************************************* 1770 1771 Alt_Keys db 'ipd12' 1772 Alt_Procs dw Alt_Image,Alt_PathFilter,Alt_Directory,Alt_D1,Alt_D2 1773 Alt_Key proc far 1774 push cx si di ds 1775 mov di,offset Alt_Keys 1776 mov cx,offset Alt_Procs- offset Alt_Keys 1777 call CalcCommand 1778 jc Alt_Ret 1779 Alt_ok: shl di,1 1780 call cs:Alt_Procs[di] 1781 mov al,7Fh 1782 Alt_Ret: pop ds di si cx 1783 ret 1784 1785 Alt_PathFilter proc near 1786 mov cs:GoWhere?,G_PATH_FILTER 1787 ret 1788 Alt_PathFilter endp 1789 1790 Alt_Directory proc near 1791 mov cs:GoWhere?,G_DIRECTORY 1792 ret 1793 Alt_Directory endp 1794 1795 Alt_Image proc near 1796 mov cs:GoWhere?,G_IMAGE 1797 ret 1798 Alt_Image endp 1799 1800 Alt_D1 proc near 1801 mov cs:GoWhere?,G_D1 1802 ret 1803 Alt_D1 endp 1804 1805 Alt_D2 proc near 1806 mov cs:GoWhere?,G_D2 1807 ret 1808 Alt_D2 endp 1809 1810 Alt_Key endp 1811 1812 1813 1814 FkeysMasks dw 1b,10b,100b,1000b,10000b,100000b,1000000b,10000000b,100000000b,1000000000b 1815 Fkeys_Main dw Fkey_Reboot,Fkey_None,Fkey_Apple,Fkey_InsertA,Fkey_InsertB 1816 dw Fkey_None,Fkey_None,Fkey_None,Fkey_PathFilter,Fkey_Rescan 1817 Fkey proc far 1818 push ax bx cx dx si di bp ds es 1819 push cs 1820 pop ds 1821 push word ptr ds:[ScreenIOparams.CursorLen] 1822 push word ptr ds:[ScreenIOparams.CursorFlag] 1823 push ds:[GetLineParams.GL_Buffer] 1824 push ds:[GetLineParams.GL_CX] 1825 push [ActiveFlags] 1826 push [FkeysFlags] 1827 mov bx,Emulate 1828 mov es,bx 1829 xor bx,bx 1830 mov bl,al 1831 shl bx,1 1832 mov si,bx 1833 mov ax,FkeysMasks[si] 1834 test FkeysFlags,ax 1835 jz Fkey_Ret 1836 xor bx,bx 1837 call Fkeys_Main[si] 1838 mov cx,DirectoryParams.S_CX 1839 Fkey_Ret: pop [FkeysFlags] 1840 pop [ActiveFlags] 1841 pop ds:[GetLineParams.GL_CX] 1842 pop ds:[GetLineParams.GL_Buffer] 1843 pop word ptr ds:[ScreenIOparams.CursorFlag] 1844 pop word ptr ds:[ScreenIOparams.CursorLen] 1845 pop es ds bp di si dx cx bx ax 1846 ret 1847 Fkey endp 1848 1849 Fkey_InsertA: clc 1850 call InsertDisk 1851 ret 1852 1853 Fkey_InsertB: stc 1854 call InsertDisk 1855 ret 1856 1857 ; Entry: 1858 ; CF -- 0 - Disk1, 1 - Disk2 1859 ID_Flags db ? 1860 ID_Rescan? db ? 1861 ID_Ext db '.DSK',0 1862 InsertDisk: mov ID_Rescan?,0 1863 mov si,offset SDA_Filename 1864 jnc ID_Disk1 1865 mov si,offset SDB_Filename 1866 ID_Disk1: lahf 1867 mov ID_Flags,ah 1868 cmp DirectoryParams.S_MaxLength,0 1869 jz ID_Ret 1870 mov bl,DirectoryParams.S_Pos 1871 call CalcBuffer 1872 test DirectoryParams.S_Buffer[di].FileFlag,FF_INSERTED1? or FF_INSERTED2? 1873 jnz ID_Ret 1874 cmp DirectoryParams.S_Buffer[di].FileType,FD_DIRECTORY 1875 je ID_Ret 1876 cmp DirectoryParams.S_Buffer[di].FileName[0],1 1877 jne ID_NotNew 1878 mov ID_Rescan?,1 1879 add di,size DiskDescription 1880 call EnterFilename 1881 jc ID_Quit 1882 push si di 1883 lea di,DirectoryParams.S_Buffer[di].FileName 1884 mov si,offset ID_Ext 1885 call AddExt 1886 pop di si 1887 mov DirectoryParams.S_Buffer[di].FileType,FD_NIBBLE 1888 jc ID_NotDOS33 1889 mov DirectoryParams.S_Buffer[di].FileType,FD_DOS33 1890 ID_NotDOS33: mov bx,di 1891 call CreateDisk 1892 jc ID_Err 1893 ID_NotNew: mov bx,di 1894 call LinkName 1895 xor bx,bx 1896 ID_Loop: mov al,Path[bx] 1897 mov [si][bx],al 1898 inc bx 1899 or al,al 1900 jnz ID_Loop 1901 call UnlinkName 1902 mov dx,si 1903 mov bl,DirectoryParams.S_Buffer[di].FileType 1904 dec bl 1905 mov bh,0FEh 1906 test DirectoryParams.S_Buffer[di].FileFlag,FF_READ_ONLY? 1907 mov al,1 1908 jnz ID_1 1909 xor al,al 1910 ID_1: mov ah,ID_Flags 1911 sahf 1912 call OpenDiskFile 1913 jc ID_Err 1914 and DirectoryParams.S_Buffer[di].FileFlag,not FF_DAMAGED? 1915 clc 1916 jmp ID_Ret 1917 ID_Err: or DirectoryParams.S_Buffer[di].FileFlag,FF_DAMAGED? 1918 mov ah,ID_Flags 1919 sahf 1920 call CloseDiskFile 1921 stc 1922 ID_Ret: cmp ID_Rescan?,0 1923 jz ID_Quit 1924 call ReadDir 1925 ID_Quit: ret 1926 1927 CreateDisk: push ax bx dx cx 1928 call LinkName 1929 mov dx,offset Path 1930 mov ah,3Ch 1931 xor cx,cx 1932 int 21h 1933 jc CD_Err 1934 mov bx,ax 1935 mov ah,3Eh 1936 int 21h 1937 CD_Err: call UnlinkName 1938 pop cx dx bx ax 1939 ret 1940 1941 1942 Fkey_RemoveA: call CloseDiskFile1 1943 mov cs:SDA_Filename[0],0 1944 ret 1945 1946 Fkey_RemoveB: call CloseDiskFile2 1947 mov cs:SDB_Filename[0],0 1948 ret 1949 1950 Fkey_Reboot: call Fkey_InsertA 1951 jc FR_Ret 1952 call ResetAppleII 1953 call GoAppleII 1954 FR_Ret: ret 1955 1956 Fkey_PathFilter: call S_PathFilter 1957 ret 1958 1959 Fkey_Rescan: call ReadDir 1960 ret 1961 1962 Fkey_Apple: call GoAppleII 1963 ret 1964 1965 Fkey_Resume: clc 1966 jmp DMentry_Exit 1967 Fkey_Abort: stc 1968 jmp DMentry_Exit 1969 1970 Fkey_None: 1971 ret 1972 1973 1974 NameEntering db 0 1975 EnterFilename: push ax bx cx dx di 1976 mov NameEntering,1 1977 push word ptr [GetKeyParams.RK_AltFlag] 1978 push word ptr [FkeysFlags] 1979 push word ptr [SHL_Flag] 1980 mov GetLineParams.GL_Color,0Bh 1981 mov GetKeyParams.RK_AltFlag,0 1982 mov SHL_Flag,0 1983 mov FkeysFlags,0000000100b 1984 mov ScreenIOparams.CursorFlag,1 1985 lea bx,DirectoryParams.S_Buffer[di].FileName 1986 mov GetLineParams.GL_Buffer,bx 1987 mov GetLineParams.GL_Pos,0 1988 mov GetLineParams.GL_BegPrint,0 1989 mov GetLineParams.GL_MaxLength,0Ch 1990 mov GetLineParams.GL_MaxPrint,0Dh 1991 mov GetLineParams.GL_Length,0 1992 mov ScreenIOparams.CursorLen,1 1993 mov cx,DirectoryParams.S_CX 1994 dec ch 1995 inc cl 1996 mov al,80 * 2 1997 mul ch 1998 xor bx,bx 1999 mov bl,cl 2000 shl bx,1 2001 add ax,bx 2002 mov cx,ax 2003 mov GetKeyParams.RK_ErrPtr,offset SMS_EnterFilename 2004 GetLineService _GETLINE 2005 pop word ptr [SHL_Flag] 2006 pop word ptr [FkeysFlags] 2007 pop word ptr [GetKeyParams.RK_AltFlag] 2008 gotoxy 2,0 2009 mov GetLineParams.GL_CX,cx 2010 mov NameEntering,0 2011 pop di dx cx bx ax 2012 ret 2013 2014 2015 2016 2017 GetLineUser proc far 2018 ret 2019 GetLineUser endp 2020 2021 2022 GoAppleII: push ax bx es 2023 xor bx,bx 2024 xchg bx,ActiveFlags 2025 call ShowAll 2026 ScreenIOservice _SHOWSCREEN 2027 mov ax,Emulate 2028 mov es,ax 2029 mov al,C050 2030 ScreenIOservice _SetScreen 2031 SwitchToProcess PID_EMULATOR 2032 mov ActiveFlags,bx 2033 pop es bx ax 2034 ret 2035 2036 2037 ; Entry: 2038 ; DS:DX^ -- Filename 2039 ; AL -- Access Mode: 0 - Don't Change, else Read Only 2040 ; BL -- Type: 0 - Nibble, 1 - DOS 3.3 2041 ; BH -- Volume (for DOS 3.3 type only) 2042 ; CF -- 0 - Disk1, 1 - Disk2 2043 ; Exit: 2044 ; CF -- Cleared if successfull 2045 assume es:seg CurrentDrive 2046 OpenDiskFile proc far 2047 push ax bx cx dx si di bp ds es 2048 call set_ptrs 2049 mov cl,al 2050 les bp,cs:disk1_ptr 2051 mov di,offset SDA_Filename 2052 jnc ODF_Continue 2053 les bp,cs:disk2_ptr 2054 mov di,offset SDB_Filename 2055 ODF_Continue: call CloseDiskFIle 2056 mov ax,3D02h 2057 int 21h 2058 jnc ODF_1 2059 mov ax,3D00h 2060 int 21h 2061 jc ODF_Quit 2062 stc 2063 ODF_1: mov es:[bp].FileHandle,ax 2064 mov es:[bp].DiskType,bl 2065 mov es:[bp].Volume,bh 2066 mov bl,0FFh 2067 jc ODF_2 2068 xor bl,bl 2069 ODF_2: or cl,cl 2070 jz ODF_3 2071 mov bl,0FFh 2072 ODF_3: mov es:[bp].WriteProtect,bl 2073 mov si,dx 2074 mov bx,es:[bp].FileHandle 2075 mov cx,1 2076 mov dx,1000h 2077 mov ax,4200h 2078 int 21h 2079 jc ODF_Ret 2080 push ds 2081 push cs 2082 pop ds 2083 mov cx,40h 2084 mov dx,offset ODF_TempBuffer 2085 mov ah,3Fh 2086 int 21h 2087 jc ODF_Ret 2088 cmp ax,cx 2089 jne ODF_Ret 2090 cmp ODF_TempBuffer[3],3 2091 jne ODF_Ret 2092 cmp ODF_TempBuffer[35h],10h 2093 jne ODF_Ret 2094 cmp word ptr ODF_TempBuffer[36h],100h 2095 jne ODF_Ret 2096 mov al,ODF_TempBuffer[6] 2097 mov es:[bp].Volume,al 2098 ODF_Ret: pop ds 2099 push cs 2100 pop es 2101 mov ah,60h 2102 int 21h 2103 clc 2104 call CheckInsertion 2105 ODF_Quit: pop es ds bp di si dx cx bx ax 2106 ret 2107 ODF_TempBuffer db 40h dup (?) 2108 OpenDiskFile endp 2109 2110 ; Entry: 2111 ; CF -- 0 - Disk1, 1 - Disk2 2112 CloseDiskFile proc near 2113 push ax bx bp es 2114 call set_ptrs 2115 les bp,cs:disk1_ptr 2116 jnc CDF_Disk1 2117 les bp,cs:disk2_ptr 2118 assume es:seg CurrentDrive 2119 CDF_Disk1: mov bx,es:[bp].FileHandle 2120 inc bx 2121 jz CDF_NoDisk 2122 dec bx 2123 cmp cs:ManagerState,MS_NORMAL 2124 jne CDF_FlushOK ; Don't flush while in error 2125 cmp bp,offset CurrentDrive 2126 jne CDF_FlushOK ; Flush only if close current 2127 call FlushBuffer 2128 CDF_FlushOK: mov ah,3Eh 2129 int 21h 2130 jc CDF_Ret 2131 mov es:[bp].FileHandle,0FFFFh 2132 call CheckInsertion 2133 CDF_Ret: clc 2134 CDF_Quit: pop es bp bx ax 2135 ret 2136 CDF_NoDisk: stc 2137 jmp CDF_Quit 2138 CloseDiskFile endp 2139 2140 OpenDiskFile1 proc far 2141 push ax bx dx bp ds es 2142 call set_ptrs 2143 push cs 2144 pop ds 2145 les bp,disk1_ptr 2146 mov dx,offset SDA_Filename 2147 cmp SDA_Filename[0],0 2148 jz ODF1_NoFile 2149 mov bl,es:[bp].DiskType 2150 mov bh,es:[bp].Volume 2151 mov al,es:[bp].WriteProtect 2152 clc 2153 call OpenDiskFile 2154 jnc ODF1_Ret 2155 ODF1_NoFile: mov es:[bp].FileHandle,0FFFFh 2156 call CheckInsertion 2157 ODF1_Ret: pop es ds bp dx bx ax 2158 ret 2159 OpenDiskFile1 endp 2160 2161 OpenDiskFile2 proc far 2162 push ax bx dx bp ds es 2163 call set_ptrs 2164 push cs 2165 pop ds 2166 les bp,disk2_ptr 2167 mov dx,offset SDB_Filename 2168 cmp SDB_Filename[0],0 2169 jz ODF2_NoFile 2170 mov bl,es:[bp].DiskType 2171 mov bh,es:[bp].Volume 2172 mov al,es:[bp].WriteProtect 2173 stc 2174 call OpenDiskFile 2175 jnc ODF2_Ret 2176 ODF2_NoFile: mov es:[bp].FileHandle,0FFFFh 2177 call CheckInsertion 2178 ODF2_Ret: pop es ds bp dx bx ax 2179 ret 2180 OpenDiskFile2 endp 2181 2182 CloseDiskFile1 proc far 2183 clc 2184 call CloseDiskFile 2185 jnc CDF1_Ret 2186 mov cs:SDA_Filename[0],0 2187 CDF1_Ret: ret 2188 CloseDiskFile1 endp 2189 2190 CloseDiskFile2 proc far 2191 stc 2192 call CloseDiskFile 2193 jnc CDF2_Ret 2194 mov cs:SDB_Filename[0],0 2195 CDF2_Ret: ret 2196 CloseDiskFile2 endp 2197 assume es:Emulate 2198 2199 ; Entry: 2200 ; DL <-- Sector (0FFh if an invalid sector number) 2201 ; AH <-- Error Code 2202 ; AL <-- Bad Data 2203 ; Exit: 2204 ; CF --> 0 - Retry, 1 - Abort 2205 OldEnableTask db ? 2206 DM_ScreenMode db ? 2207 DMentry_SP dw ? 2208 DM_ErrorCode db ? 2209 DM_BadData db ? 2210 DM_DriveNum db ? 2211 DM_Sector db ? 2212 DM_OldKeyTable dw ? 2213 DM_old_gl dd ? 2214 DM_old_sio dd ? 2215 DM_old_rk dd ? 2216 DM_SwapFlag db ? 2217 DMentry proc far 2218 SaveAll 2219 push word ptr cs:[GetKeyParams.RK_AltFlag] 2220 2221 mov bx,seg k_Table ; Save Current Key Table 2222 mov ds,bx 2223 assume ds:seg k_Table 2224 mov bx,ds:k_Table 2225 mov cs:DM_OldKeyTable,bx 2226 2227 mov bx,CONio ; Save Current CONIO Params 2228 mov ds,bx 2229 assume ds:CONio 2230 mov bx,ds:GL_ParamsOfs 2231 mov word ptr cs:DM_old_gl[0],bx 2232 mov bx,ds:GL_ParamsSeg 2233 mov word ptr cs:DM_old_gl[2],bx 2234 mov bx,ds:SIO_ParamsOfs 2235 mov word ptr cs:DM_old_sio[0],bx 2236 mov bx,ds:SIO_ParamsSeg 2237 mov word ptr cs:DM_old_sio[2],bx 2238 mov bx,ds:RK_ParamsOfs 2239 mov word ptr cs:DM_old_rk[0],bx 2240 mov bx,ds:RK_ParamsSeg 2241 mov word ptr cs:DM_old_rk[2],bx 2242 2243 call DM_InInitP 2244 mov bx,seg SwapFlag 2245 mov ds,bx 2246 assume ds:seg SwapFlag 2247 mov al,1 2248 xchg al,ds:SwapFlag 2249 mov cs:DM_SwapFlag,al 2250 mov bx,seg EnableTaskSwitch 2251 mov ds,bx 2252 assume ds:seg EnableTaskSwitch 2253 xor bl,bl 2254 xchg ds:EnableTaskSwitch,bl 2255 mov cs:OldEnableTask,bl 2256 mov bx,seg CurrentDrive 2257 mov ds,bx 2258 assume ds:seg CurrentDrive 2259 mov cl,ds:CurrentDrive.ID 2260 push cs 2261 pop ds 2262 assume DS:DM 2263 mov ScreenIOparams.CursorFlag,0 2264 mov DM_ErrorCode,ah 2265 mov DM_Sector,dl 2266 mov DM_BadData,al 2267 inc cl 2268 mov DM_DriveNum,cl 2269 dec cl 2270 mov ActiveFlags,0000000000000100b 2271 mov GoWhere?,G_D1 2272 jz DMentry_1 2273 mov ActiveFlags,0000000000001000b 2274 mov GoWhere?,G_D2 2275 DMentry_1: mov ah,0Fh 2276 int 10h 2277 mov DM_ScreenMode,al 2278 mov I_CurrentSVD,0 2279 mov ManagerState,MS_ERROR 2280 mov DMentry_SP,sp 2281 mov GetKeyParams.RK_ErrPtr,offset SMS_DecodeErr 2282 jmp DM_MainRet 2283 ; --------------------- 2284 DMentry_Exit: mov sp,DMentry_SP 2285 pushf 2286 mov ManagerState,MS_NORMAL 2287 mov ax,seg EnableTaskSwitch 2288 mov ds,ax 2289 assume ds:seg EnableTaskSwitch 2290 mov al,cs:OldEnableTask 2291 mov ds:EnableTaskSwitch,al 2292 call DM_OutInitP 2293 2294 mov ax,seg k_Table ; Restore Entry Key Table 2295 mov ds,ax 2296 assume ds:seg k_Table 2297 mov ax,cs:DM_OldKeyTable 2298 mov ds:k_Table,ax 2299 2300 mov ax,CONio ; Restore Entry CONIO Params 2301 mov ds,ax 2302 assume ds:CONio 2303 mov ax,word ptr cs:DM_old_gl[0] 2304 mov ds:GL_ParamsOfs,ax 2305 mov ax,word ptr cs:DM_old_gl[2] 2306 mov ds:GL_ParamsSeg,ax 2307 mov ax,word ptr cs:DM_old_sio[0] 2308 mov ds:SIO_ParamsOfs,ax 2309 mov ax,word ptr cs:DM_old_sio[2] 2310 mov ds:SIO_ParamsSeg,ax 2311 mov ax,word ptr cs:DM_old_rk[0] 2312 mov ds:RK_ParamsOfs,ax 2313 mov ax,word ptr cs:DM_old_rk[2] 2314 mov ds:RK_ParamsSeg,ax 2315 2316 cmp cs:DM_ScreenMode,3 2317 jne DM_Entry_2 2318 cmp cs:DM_SwapFlag,0 2319 jz DM_Entry_2 2320 ScreenIOservice _SHOWSCREEN 2321 jmp DM_Entry_3 2322 DM_Entry_2: mov ax,seg C050 2323 mov es,ax 2324 assume es:seg C050 2325 mov al,es:C050 2326 ScreenIOservice _SetScreen 2327 DM_Entry_3: popf 2328 pop word ptr cs:[GetKeyParams.RK_AltFlag] 2329 RestoreAll 2330 ret 2331 DMentry endp 2332 assume es:Emulate 2333 2334 DM ends 2335 END