[Copyright 1999,2002 Frank Durda IV, All Rights Reserved. Mirroring of any material on this page in any form is expressly prohibited. The official web site for this material is: http://nemesis.lonestar.org Contact this address for use clearances: clearance at nemesis.lonestar.org Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]
MISOSYS EDAS-4.3 04/19/99 21:56:20 MEMDISK/DCT - LS-DOS 6.2 Page 00001 00001 ;MEMDISK/ASM - Memory Disk Driver 00003 ; 0000 00004 *GET SVCMAC:3 ;SVC Macro equivalents 00005 ;SVCMAC/ASM - LS-DOS Version VI 00006 *LIST OFF 00398 *LIST ON 0000 00400 *GET VALUES:3 ;Misc. equates 00401 ;VALUES/ASM - Version 6 00402 *LIST OFF 00429 *LIST ON 0000 00430 *GET COPYCOM:3 ;Copyright message 00431 ; COPYCOM - File for Copyright COMment block 00432 ; 0000 00433 *GET BUILDVER/ASM:3 00434 ; 00435 ; Buildver/asm is a bit of a kludge since not all utilities can load 00436 ; equates from LDOS60 and still compile. LOWCORE and everybody else 00437 ; relies on this setting, and it eventually ends up in LDOS60/EQU 00438 ; for programs that can use that. 00439 ; FFFF 00440 @BLD631 EQU -1 ;<631>Build 631 distribution (LEVEL 1B) 00441 ; These switches activate patches made since the 1B release. 00442 ; It is important that all earlier patches be enabled when a higher 00443 ; patch is enabled. 00444 ; Patches C thru F were published in TMQ IV.iv, page 32 (NOTE: the 00445 ; patch addresses listed for SPOOL in SPOOL1/FIX are 19H high.) FFFF 00446 @BLD631C EQU -1 ;<631>Apply 1C patches (SETKI) FFFF 00447 @BLD631D EQU -1 ;<631>Apply 1D patches (DIR) FFFF 00448 @BLD631E EQU -1 ;<631>Apply 1E patches (DIR & MEMDISK/DCT) FFFF 00449 @BLD631F EQU -1 ;<631>Apply 1F patches (SPOOL) 00450 ; Patches G and H were published in TMQ V.i, pages 10 and 18/19. FFFF 00451 @BLD631G EQU -1 ;<631>Apply 1G patches (//KEYIN,DIR,DO *) FFFF 00452 @BLD631H EQU -1 ;<631>Apply 1H patches (MEMORY) 00453 ; 00454 ;End of BUILDVER/ASM 00455 IF @BLD631 00457 ELSE 00458 COM '<*(C) 1982,3,4,6 by LSI*>' 00459 ENDIF 00460 ; 0A00 00461 SDBPC EQU 5*2*256 ;Single Density Bytes/Cyl 1200 00462 DDBPC EQU 6*3*256 ;Double Density Bytes/Cyl 8000 00463 LOWEST EQU 8000H ;Lowest addr for Bank 0 1300 00464 HIDRVR EQU 1300H ;Highest addr for Driver 2300 00465 BUFFER$ EQU 2300H ;Temporary I/O buffer Add 0003 00466 MINCYL EQU 3 000F 00467 WP EQU 15 ;Write Prot Disk Error # 00468 ; 00469 IF @BLD631 3000 00470 ORG 3000H 00471 ELSE 00472 ORG 2C00H 00473 ENDIF 00474 ; 00475 START 00476 IF @BLD631 3000 ED731E30 00477 LD (EXIT+1),SP ;<631> 3004 00478 @@CKBRKC ;<631>Check for break 3004+3E6A 00479 LD A,106 3006+EF 00480 RST 40 3007 2011 00481 JR NZ,ABORT1 ;<631>abort 00482 ELSE 00483 @@CKBRKC ;Check for break 00484 JR Z,STARTA ;Continue if not 00485 LD HL,-1 ; else abort 00486 RET 00487 ; 00488 STARTA EQU $ 00489 LD (EXIT+1),SP ;Save SP location 00490 ENDIF 00491 ; 00492 ; Install or Disable MemDISK 00493 ; 3009 CDF230 00494 CALL CALCDRV ;Calculate drive # 300C CD3B34 00495 CALL DOMEM ;Get type of memdisk 300F CD9632 00496 CALL INSTMEM ;Install MemDISK 00497 ; 00498 ; Exit - Clean stack, Set HL, Revector00499 ; 3012 210000 00500 NORMEX LD HL,0 ;Normal Exit - HL = 0 3015 1806 00501 JR EXIT ;Get SP & RETurn 00502 ; 3017 CD2831 00503 ABORT CALL GETDUP ;Get duplicate DCT 00504 IF @BLD631 00505 ABORT1: 00506 ENDIF 301A 21FFFF 00507 LD HL,-1 ;Abort 00508 ; 301D 310000 00509 EXIT LD SP,$-$ ;P/u SP address 3020 00510 @@CKBRKC ;Clear break 3020+3E6A 00511 LD A,106 3022+EF 00512 RST 40 3023 C9 00513 RET 00514 ; 3024 00515 *GET MEMDISKB:3 00516 ;MEMDISKB/ASM - Miscellaneous Subroutines 00519 ; 00520 ; SETBANK - Tell system which banks are used 00521 ; 3024 3E00 00522 SETBANK LD A,$-$ ;P/u bank # 3026 4F 00523 LD C,A ;Xfer to C 3027 FE03 00524 CP 3 ;Both banks 1 & 2 ? 3029 2005 00525 JR NZ,STBANK ;No - just 1 bank 302B 0D 00526 DEC C ;Set C = 2 302C CD3030 00527 CALL STBANK ;Show Bank in use 302F 0D 00528 DEC C ;C = 1 3030 C5 00529 STBANK PUSH BC ;Save BC 3031 0603 00530 LD B,3 ;Show in use function # 3033 00531 @@BANK ;Let system know it 3033+3E66 00532 LD A,102 3035+EF 00533 RST 40 3036 C1 00534 POP BC 3037 C9 00535 RET ;RETurn 00536 ; 00537 ; FREBANK - Free up Bank C 00538 ; 3038 C5 00539 FREBANK PUSH BC ;Save C & B 3039 0601 00540 LD B,1 ;Show bank available 303B 00541 @@BANK 303B+3E66 00542 LD A,102 303D+EF 00543 RST 40 303E C1 00544 POP BC ;Recover C 303F C9 00545 RET ;RETurn 00546 ; 00547 ; DECASC2 - Display Number to video 00548 ; 3040 CDAA30 00549 DECASC2 CALL SAVEREG ;Save Registers 3043 F5 00550 PUSH AF ;Save # 3044 0E08 00551 LD C,BS ;Backspace 3046 CD5530 00552 CALL DSP ;Output byte 3049 CD5530 00553 CALL DSP ;Twice 304C F1 00554 POP AF ;Recover A 304D CD5F30 00555 CALL DECASC ;Convert to ASCII 3050 4C 00556 LD C,H ;P/u ms digit 3051 CD5530 00557 CALL DSP 3054 4D 00558 LD C,L ;P/u ls digit 00559 ; 00560 ; DSP - Output byte to Video & exit if I/O err 00561 ; 3055 00562 DSP @@DSP ;Output byte 3055+3E02 00563 LD A,2 3057+EF 00564 RST 40 3058 C8 00565 RET Z ;RETurn if good 00566 ; 00567 ; IOERR - Set HL = Error # & Abort 00568 ; 3059 6F 00569 IOERR LD L,A ;Set HL = I/O Error # 305A 2600 00570 LD H,0 305C C31D30 00571 JP EXIT ;Go to exit routine 00572 ; 00573 ; Display Decimal ASCII equivalent 00574 ; 305F 262F 00575 DECASC LD H,2FH ;H=msb of BCD ASCII 3061 24 00576 LPADD INC H ;Bump msb 3062 D60A 00577 SUB 10 ;Successive sub's of 10 3064 30FB 00578 JR NC,LPADD ;Keep sub til carry 3066 C63A 00579 ADD A,3AH ;A = lsb ASCII 3068 6F 00580 LD L,A ;HL => DEC ASCII 3069 C9 00581 RET 00582 ; 00583 ; DECHEX - Convert Decimal ASCII to Hex 00584 ; 306A CD7E30 00585 DECHEX CALL GETDIG ;Get digit 306D 23 00586 INC HL ;Next byte in buffer 306E 05 00587 DEC B ;Dec digit counter 306F 280B 00588 JR Z,DONE1 ;All done 3071 57 00589 LD D,A ;Xfer to D 3072 CD7E30 00590 CALL GETDIG ;Get digit 3075 5F 00591 LD E,A ;Save digit 3076 7A 00592 LD A,D ;P/u ten's digit 3077 87 00593 ADD A,A ;Multiply 3078 87 00594 ADD A,A ; A times 10 3079 82 00595 ADD A,D ; and add it 307A 87 00596 ADD A,A ; to the ones digit 307B 83 00597 ADD A,E ;A = number of tracks 307C BF 00598 DONE1 CP A ;Set Z flag 307D C9 00599 RET ; and RETurn 00600 ; 307E 7E 00601 GETDIG LD A,(HL) ;P/u second digit 307F D630 00602 SUB '0' ;Cvt to binary 3081 3803 00603 JR C,ILLEGAL ;Clr stack & RETurn NZ 3083 FE0A 00604 CP 10 ;Legal digit 3085 D8 00605 RET C ;Yes - A = digit 3086 3C 00606 ILLEGAL INC A ;Reset Z flag 3087 E1 00607 POP HL ;Clear stack 3088 C9 00608 RET ; and RETurn 00609 ; 00610 ; Verify Error - P/u Bank / Address & display 00611 ; 3089 E5 00612 ERROR PUSH HL ;L = lsb of Address 308A 3EC9 00613 LD A,0C9H ;Modify GETADR routine 308C 326E32 00614 LD (STFRET),A ;HL <= page from DE 308F CD5932 00615 CALL GETADR 3092 D1 00616 POP DE ;E = lsb of address 3093 6B 00617 LD L,E ;HL = Bad RAM address 00618 ; 00619 ; Stuff Bank # and Address into string 00620 ; 3094 3E30 00621 LD A,'0' ;Cvt BANK # to ASCII 3096 81 00622 ADD A,C 3097 32453B 00623 LD (VBANK),A ;Stuff into string 309A EB 00624 EX DE,HL ;Xfer address to DE 309B 21553B 00625 LD HL,VLOC ;HL => string destination 309E 00626 @@HEX16 ;Cvt DE to Hex ASCII @ HL 309E+3E63 00627 LD A,99 30A0+EF 00628 RST 40 00629 ; 00630 ; Display string & restore hi/low mem 00631 ; 30A1 212F3B 00632 LD HL,BADRAM ;"BAD RAM ... 30A4 00633 @@LOGOT ;Display it 00634 IFEQ 00H,1 00635 LD HL, 00636 ENDIF 30A4+3E0C 00637 LD A,12 30A6+EF 00638 RST 40 30A7 C3EA32 00639 JP OLDRVR ;Leave & clear stack 00640 ; 00641 ; SAVEREG - Save All Primary Registers 00642 ; 30AA E3 00643 SAVEREG EX (SP),HL 30AB 22C030 00644 LD (RETADDR+1),HL 30AE E1 00645 POP HL 30AF E5 00646 PUSH HL 30B0 ED53B636 00647 LD (SAVEDE),DE 30B4 D5 00648 PUSH DE 30B5 C5 00649 PUSH BC 30B6 F5 00650 PUSH AF 30B7 11C230 00651 LD DE,RESTREG 30BA D5 00652 PUSH DE 30BB ED5BB636 00653 LD DE,(SAVEDE) 30BF C30000 00654 RETADDR JP $-$ 30C2 F1 00655 RESTREG POP AF 30C3 C1 00656 POP BC 30C4 D1 00657 POP DE 30C5 E1 00658 POP HL 30C6 C9 00659 RET 00660 ; 00661 ; CKBANK - Check if Bank C is in use 00662 ; 30C7 C5 00663 CKBANK PUSH BC ;Save BC 30C8 0602 00664 LD B,2 ;Bank in use ? 30CA 00665 @@BANK ;Check it out 30CA+3E66 00666 LD A,102 30CC+EF 00667 RST 40 30CD C1 00668 POP BC ;Recover BC 30CE C8 00669 RET Z ;RETurn if available 30CF C3D836 00670 JP BNKUSE ; else - display "in use" 00671 ; 00672 ; INPUT - Input a line to the input buffer 00673 ; 30D2 21003D 00674 INPUT LD HL,BUFFER ;HL => Input buffer 30D5 00675 @@KEYIN ;Input line 30D5+3E09 00676 LD A,9 30D7+EF 00677 RST 40 30D8 DA1730 00678 JP C,ABORT ;Exit if hit 30DB 04 00679 INC B ;Set Z if no chars 30DC 05 00680 DEC B 30DD C9 00681 RET ; else RETurn 00682 ; 00683 ; GETCYL - Get max # of cylinders in A 00684 ; 30DE D5 00685 GETCYL PUSH DE ;Save regs 30DF E5 00686 PUSH HL 00687 ; 00688 ; Init DE = # bytes/cyl, A = dividend (-1) 00689 ; 30E0 110012 00690 BPC LD DE,DDBPC ;P/u bytes/cyl 30E3 3EFF 00691 LD A,-1 ;Init avail cyl cnt = -1 00692 ; 00693 ; Divide total bytes available by Bytes/cyl 00694 ; 30E5 3C 00695 DIVLP INC A ;Bump cyl count 30E6 B7 00696 OR A 30E7 ED52 00697 SBC HL,DE ;Take off 1 cyl 30E9 30FA 00698 JR NC,DIVLP ;Loop until carry 00699 ; 00700 ; A = # of cyls avail, Restore regs 00701 ; 30EB E1 00702 POP HL ;Recover regs 30EC D1 00703 POP DE 00704 ; 00705 ; Set Z flag if more than 1 cylinder available 00706 ; 30ED FE02 00707 CP 2 ;0 or 1 ? 30EF D8 00708 RET C ;Yes - RETurn NZ 30F0 BF 00709 CP A ;Set Z flag 30F1 C9 00710 RET ; and RETurn 00711 ; 00712 ; CALCDRV - Calculate drive Number for MemDISK 00713 ; 00714 ; DE => DCT block for Drive 00715 ; 30F2 00716 CALCDRV EQU $ 30F2 EB 00717 EX DE,HL ;Xfer to HL 30F3 22B836 00718 LD (SAVEDCT),HL ;Save DCT pointer 30F6 CD1C31 00719 CALL SAVDCT ;Save DCT 30F9 7C 00720 LD A,H ;Drive number issued ? 30FA B5 00721 OR L 30FB CABC36 00722 JP Z,NODRV ;No drive entered 00723 ; 00724 ; Get Start of Drive Code Table 00725 ; 30FE 0E00 00726 LD C,0 ;Get start of DCT 3100 00727 @@GTDCT ;Get DCT for Drive 0 3100+3E51 00728 LD A,81 3102+EF 00729 RST 40 3103 FDE5 00730 PUSH IY ;Get DCT start 3105 D1 00731 POP DE 00732 ; 00733 ; Calculate Offset in Table 00734 ; 3106 AF 00735 XOR A 3107 ED52 00736 SBC HL,DE ;L = offset from start 3109 B5 00737 OR L ;P/u offset 310A CAC036 00738 JP Z,BADDRV ;Cannot use DRIVE 0 00739 ; 00740 ; Divide offset by 10 to get drive # 00741 ; 310D 06FF 00742 LD B,-1 ;Init dividend = -1 310F 04 00743 DIVLP1 INC B ;Bump dividend 3110 D60A 00744 SUB 10 ;Subtract ten 3112 30FB 00745 JR NC,DIVLP1 00746 ; 00747 ; Stuff away drive # into WRSEC routine 00748 ; 3114 78 00749 LD A,B ;P/u drive # 3115 32C133 00750 LD (DRIVE+1),A ;Stuff away drive # 00751 ; 00752 ; Point IY to System Flag table & RETurn 00753 ; 3118 00754 @@FLAGS ;IY => Flags 3118+3E65 00755 LD A,101 311A+EF 00756 RST 40 311B C9 00757 RET ;Later 00758 ; 00759 ; SAVDCT - Save Old DCT setup 00760 ; 311C CDAA30 00761 SAVDCT CALL SAVEREG ;Save registers 311F 11003E 00762 LD DE,DUPDCT ;Destination 3122 010A00 00763 DOXFER1 LD BC,10 ;10 bytes to xfer 3125 EDB0 00764 LDIR 3127 C9 00765 RET 00766 ; 00767 ; GETDUP - Get Duplicate of original DCT setup 00768 ; 3128 ED5BB836 00769 GETDUP LD DE,(SAVEDCT) ;DE => DCT+0 312C 21003E 00770 LD HL,DUPDCT ;Source 312F 18F1 00771 JR DOXFER1 ;Transfer back 00772 ; 00773 ; GTDRV - P/u Next available Driver Address 00774 ; 00775 ; IX <= Driver Address Pointer 00776 ; DE <= Current Address 00777 ; 3131 E5 00778 GTDRV PUSH HL ;Save HL 3132 114B49 00779 LD DE,'IK' ;P/u *KI DCB address 3135 00780 @@GTDCB 3135+3E52 00781 LD A,82 3137+EF 00782 RST 40 3138 2B 00783 DEC HL ;KIDCB - 2 => free area 3139 E5 00784 PUSH HL ;Xfer to IX 313A DDE1 00785 POP IX 313C 56 00786 LD D,(HL) ;P/u address in DE 313D 2B 00787 DEC HL 313E 22F432 00788 LD (KIDCB$+1),HL ;Save address to stuff 3141 5E 00789 LD E,(HL) 3142 E1 00790 POP HL ;Recover HL 3143 C9 00791 RET 00792 ; 00793 ; INSTDRV - Relocate & Install Disk Driver 00794 ; 3144 EB 00795 INSTDRV EX DE,HL ;Xfer dest to HL 3145 11BA31 00796 LD DE,DRIVER ;Start of driver 3148 E5 00797 PUSH HL ;Save Source & Dest ptrs 3149 D5 00798 PUSH DE 314A B7 00799 OR A ;Clear carry 314B ED52 00800 SBC HL,DE ;Get offset 00801 ; 00802 ; Relocate internal references in driver 00803 ; 314D DD216C31 00804 LD IX,RELTBL ;Point to relocation tbl 3151 44 00805 LD B,H ;Move to BC 3152 4D 00806 LD C,L 3153 DD6E00 00807 RLOOP LD L,(IX) ;Get address to change 3156 DD6601 00808 LD H,(IX+1) 3159 7C 00809 LD A,H 315A B5 00810 OR L 315B 2829 00811 JR Z,RELDUN 315D 5E 00812 LD E,(HL) ;P/U address 315E 23 00813 INC HL 315F 56 00814 LD D,(HL) 3160 EB 00815 EX DE,HL ;Offset it 3161 09 00816 ADD HL,BC 3162 EB 00817 EX DE,HL 3163 72 00818 LD (HL),D ;Put it back 3164 2B 00819 DEC HL 3165 73 00820 LD (HL),E 3166 DD23 00821 INC IX 3168 DD23 00822 INC IX 316A 18E7 00823 JR RLOOP ;Loop till done 00824 ; 00825 ; Relocation Table for Driver 00826 ; 316C FC31 00827 RELTBL DW REL1+1,REL2+1,REL3+1,REL4+1 0C32 3D32 4332 3174 7632 00828 DW REL5+1,REL6+2,REL7+1,REL8+1,REL8A+1 DE31 E231 E831 3232 317E 7932 00829 DW REL8B+1,REL9+1,REL2A+1,0 E531 0332 0000 00830 ; 00831 ; Transfer MemDisk driver to driver area 00832 ; 3186 E1 00833 RELDUN POP HL ;HL => Source DE => Dest 3187 D1 00834 POP DE 3188 D5 00835 PUSH DE ;Save start 3189 01DC00 00836 LD BC,LENGTH ;# bytes to move 318C EDB0 00837 LDIR ;Block move 318E D1 00838 POP DE ;Restore start 318F C9 00839 RET ;RETurn 00840 ; 00841 ; SETDCT - Set up Drive Code Table for MemDISK 00842 ; 3190 DD2AB836 00843 SETDCT LD IX,(SAVEDCT) ;IX => DCT address 3194 DD3600C3 00844 LD (IX+0),0C3H ;Enable 3198 DD7301 00845 LD (IX+1),E ;Lsb of driver 319B DD7202 00846 LD (IX+2),D ;Msb of driver 319E DD360340 00847 SDEND LD (IX+3),40H ;DD,5",floppy,step=6 31A2 DD360450 00848 SDENE LD (IX+4),50H ;DDC=Y, 1 side, ALIEN 31A6 DD360500 00849 LD (IX+5),0 ;Current Cyl = 0 31AA DD7706 00850 LD (IX+6),A ;# of tracks rel from 0 31AD DD360711 00851 SDENF LD (IX+7),17 ;18 spt (DD), 10 spt (SD) 31B1 DD360845 00852 SDENG LD (IX+8),45H ;2/3 G/C, 5/6 S/G 31B5 DD360901 00853 LD (IX+9),1 ;Directory Cyl = 1 31B9 C9 00854 RET ;RETurn 31BA 00855 *GET MEMDISKC:3 00856 ;MEMDISKC/ASM - MemDISK Driver Code 00859 ; 31BA 181D 00860 DRIVER JR INIT ;Jump around header 31BC 0000 00861 OLDHIGH DW 0 ;Old HIDRV$ 31BE 03 00862 DB 3,'$MD' ;Header 24 4D 44 31C2 0000 00863 OLD_HI DW 0 ;Old HIGH$ (for bank 0) 31C4 00 00864 BANKIM DB 00000000B ;Bank Image 31C5 0000 00865 DRVLOW DW 0 ;What driver addr was 31C7 0000 00866 MEMHIGH DW 0 ;HIGH$ after installed 00867 ; 00868 IF @MOD2 00869 DC 32,0 ;Model 2 stack area 00870 ; 00871 ELSE 31C9 00 00872 DC 16,0 ;Driver Stack Area 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00873 ENDIF 31D9 00874 MYSTACK EQU $ ;Start of Mystack 00875 ; 00876 ; Reset SP to MYSTACK, and CALL driver 00877 ; 31D9 E5 00878 INIT PUSH HL ;Save Registers 31DA D5 00879 PUSH DE ; 31DB C5 00880 PUSH BC ; 31DC ED73EB31 00881 REL6 LD (SAVESP+1),SP ;Save original SP 31E0 F3 00882 DI ;Interrupts off 31E1 31D931 00883 REL7 LD SP,MYSTACK ;Memdisk SP 31E4 228832 00884 REL9 LD (BUFF+1),HL ;Save buffer addr request 31E7 CDF231 00885 REL8 CALL MEMDRIV ;Call the actual driver 31EA 310000 00886 SAVESP LD SP,$-$ ;P/u original SP 31ED FB 00887 EI ;Back on 31EE C1 00888 POP BC ;Restore Registers 31EF D1 00889 POP DE 31F0 E1 00890 POP HL 31F1 C9 00891 RET 00892 ; 31F2 78 00893 MEMDRIV LD A,B ;Get operation byte 00894 ; 31F3 FE09 00895 B9 CP 9 ;Operation #9 ? 31F5 2027 00896 JR NZ,B10 ;No - Check for Verify 00897 ; 00898 ; READ sector - Set Z if D = directory cyl 00899 ; 31F7 15 00900 DEC D ;Set Z flag if Cyl = 1 31F8 F5 00901 PUSH AF 31F9 14 00902 INC D ;Restore cyl # 00903 ; 00904 ; Set up For transfer to temporary I/O buffer 00905 ; 31FA E5 00906 PUSH HL ;Save User I/O buffer ptr 31FB CD5932 00907 REL1 CALL GETADR ;HL => MemDISK Sector 31FE 3808 00908 JR C,DOXFER ;High - use temporary buf 00909 ; 00910 ; I/O buff is low - xfer MemDISK sector to it 00911 ; 3200 EDB0 00912 LDIR ;Xfer directly to buffer 3202 CD7F32 00913 REL2A CALL GETOLD ;Get original bank 3205 E1 00914 POP HL ;HL => User I/O buffer 3206 180D 00915 JR CHKDIR2 ;Check if directory cyl 00916 ; 00917 ; Transfer MemDISK sector to Temporary Buffer 00918 ; 3208 D5 00919 DOXFER PUSH DE ;DE => Temporary Buffer 3209 EDB0 00920 LDIR ;Xfer to system area 00921 ; 00922 ; Xfer data from temporary to User Buffer 00923 ; 320B CD7F32 00924 REL2 CALL GETOLD ;Get original bank 320E E1 00925 POP HL ;HL => Temporary buffer 320F D1 00926 POP DE ;DE => User I/O buffer 3210 010001 00927 LD BC,256 ;BC = 256 bytes to xfer 3213 EDB0 00928 LDIR ;Xfer to user buffer 00929 ; 00930 ; Set A = Error #6 if Cylinder 1 (Directory) 00931 ; 3215 F1 00932 CHKDIR2 POP AF ;Get Z 3216 2004 00933 CHKDIR JR NZ,NOTDIR ;Not a directory read 3218 3E06 00934 LD A,6 ;Error Code = 6 321A B7 00935 OR A ;NZ condition 321B C9 00936 RET ;And RETurn 321C AF 00937 NOTDIR XOR A ;Set Z flag 321D C9 00938 RET ;And return 00939 ; 321E FE0A 00940 B10 CP 10 ;Verify sector ? 3220 2003 00941 JR NZ,B13 ;Check more if not 00942 ; 00943 ; Verify a sector 00944 ; 3222 15 00945 DEC D ;Directory Cylinder 3223 18F1 00946 JR CHKDIR ;Check if Directory cyl 00947 ; 3225 FE0D 00948 B13 CP 13 ;Write a sector? 3227 201E 00949 JR NZ,B14 ;Check further if not 00950 ; 00951 ; Write A Sector 00952 ; 3229 3E0F 00953 WRITES LD A,WP ;WP error X'0F' 322B FDCB037E 00954 BIT 7,(IY+3) ;Software Write Protect? 322F C0 00955 RET NZ ;Return with error 00956 ; 00957 ; Set up for Tranfer to Temporary Buffer 00958 ; 3230 D5 00959 PUSH DE ;Save Cyl/Sector 3231 CD8632 00960 REL8A CALL GETBUF ;Get buffer ptr 3234 3005 00961 JR NC,RECVDE ;Get back DE 3236 010001 00962 LD BC,256 ;BC = 256 bytes to xfer 3239 EDB0 00963 LDIR ;Xfer to temp buffer 323B D1 00964 RECVDE POP DE ;DE = Cyl/sector 00965 ; 00966 ; Get Sector from MemDISK & xfer to User buff 00967 ; 323C CD5932 00968 REL3 CALL GETADR ;HL <= Mem, DE <= Buffer 323F EB 00969 EX DE,HL 3240 EDB0 00970 LDIR ;Xfer to user buffer 3242 CD7F32 00971 REL4 CALL GETOLD ;Get original back 3245 AF 00972 XOR A ;Set Z flag 3246 C9 00973 RET 00974 ; 3247 FE0E 00975 B14 CP 14 ;Write system sector? 3249 28DE 00976 JR Z,WRITES ;Go if so 00977 ; 324B FE0C 00978 CP 12 ;Format command? 324D 2804 00979 JR Z,B14A ;Go if so 324F FE0F 00980 CP 15 ;Write Track ? 3251 2004 00981 JR NZ,EX1 ;No - exit Z 3253 3E08 00982 B14A LD A,8 ;Yes - Exit NZ 3255 B7 00983 OR A ;Error = Device not avail 3256 C9 00984 RET 00985 ; 3257 AF 00986 EX1 XOR A ;Zero A, set Z 3258 C9 00987 RET ;Return with Z set 00988 ; 00989 ; GETADR - Point HL to MemDISK area 00990 ; - Point DE to Temporary buffer 00991 ; - Set BC = 256 (bytes to xfer) 00992 ; 3259 7A 00993 GETADR LD A,D ;P/u Cylinder # 00994 ; 00995 ; Multiply cylinder # x 10 or 18 (sectors/cyl) 00996 ; 325A 87 00997 SDENA ADD A,A ;X 2 or NOP if Single Den 325B 57 00998 LD D,A ;DDEN = x 2 SDEN = x 1 325C 87 00999 ADD A,A ;DDEN = x 4 SDEN = x 2 325D 87 01000 ADD A,A ;DDEN = x 8 SDEN = x 4 325E 87 01001 SDENB ADD A,A ;DDEN = x 16 SDEN = x 5 325F 82 01002 SDENC ADD A,D ;DDEN = x 18 SDEN = x 10 01003 ; 01004 ; Add Sect offset (E) & add 80H if bank 2 active 01005 ; 3260 83 01006 ADD A,E ;Add sector offset 3261 C600 01007 OFFSET ADD A,$-$ ;80H if 2 active 01008 ; 01009 ; Set HL => sector, C = Default bank (0 or 1) 01010 ; 3263 67 01011 LD H,A ;Stuff msb in H 3264 2E00 01012 LD L,0 ;Land on page boundary 3266 0E00 01013 DEFBANK LD C,$-$ ;C = 0 or C = 1 01014 ; 01015 ; Set C = Bank #2 if Address > X'7FFF' 01016 ; 3268 07 01017 RLCA ;Address > X'7FFF' ? 3269 3001 01018 JR NC,GOTBANK ;No - got it 326B 0C 01019 INC C ;Yes - Set C = 2 01020 ; 01021 ; Force address > X'7FFF' & Select Bank C 01022 ; 326C CBFC 01023 GOTBANK SET 7,H ;Force Address > X'7FFF' 326E 45 01024 STFRET LD B,L ;Bring in Bank C 326F 01025 @@BANK 326F+3E66 01026 LD A,102 3271+EF 01027 RST 40 01028 ; 01029 ; Pick up Bank previously in use & Save 01030 ; 3272 79 01031 LD A,C ;P/u last bank 3273 E67F 01032 AND 7FH ;Ignore Hi-bit 3275 328032 01033 REL5 LD (GETOLD+1),A ; and stuff away 01034 ; 01035 ; Set DE => Overlay Buffer, BC = 256 01036 ; 3278 CD8632 01037 REL8B CALL GETBUF ;Get buffer ptr 327B 010001 01038 LD BC,256 ;Set BC = 256 327E C9 01039 RET 01040 ; 01041 ; OLDBNK - Get original Bank used 01042 ; 327F 010000 01043 GETOLD LD BC,$-$ ;B = 0, C = Bank # 3282 01044 @@BANK ;Get bank 3282+3E66 01045 LD A,102 3284+EF 01046 RST 40 3285 C9 01047 RET 01048 ; 01049 ; GETBUF - Get Buffer ptr to LDIR from or to 01050 ; 3286 E5 01051 GETBUF PUSH HL ;Save source/dest ptr 3287 110000 01052 BUFF LD DE,$-$ ;P/u requested I/O buffer 328A 21007F 01053 LD HL,7F00H ;Use (BUFF+1) if < 7F00H 328D B7 01054 OR A 328E ED52 01055 SBC HL,DE ;Past 7F00H ? 3290 E1 01056 POP HL ;Rcvr ptr 3291 D0 01057 RET NC ;No - use requested buff 3292 110023 01058 LD DE,BUFFER$ ;Yes - use BUFFER$ 3295 C9 01059 RET 01060 ; 00DC 01061 LENGTH EQU $-DRIVER ;Length of Driver 3296 01062 *GET MEMDISKA:3 01063 ;MEMDISKA/ASM - Memdisk Initialization 01066 ; 3296 F5 01067 INSTMEM PUSH AF ;Save # cyls 3297 C5 01068 PUSH BC ;Save Bank # 01069 ; 01070 ; Is there a MemDISK driver trapped ? 01071 ; 3298 11BE38 01072 LD DE,MD$ ;"$MD" 329B 01073 @@GTMOD ;MemDISK in ? 329B+3E53 01074 LD A,83 329D+EF 01075 RST 40 329E 2011 01076 JR NZ,NOT__IN ;No 01077 ; 01078 ; There is a driver trapped - use that area 01079 ; 32A0 22EB32 01080 LD (OLDRVR+1),HL ;Save old driver addr 32A3 EB 01081 EX DE,HL ;Pt DE => Destination 32A4 21653B 01082 LD HL,RE_USE ;Set re-use flag 32A7 34 01083 INC (HL) 32A8 21DB00 01084 LD HL,LENGTH-1 ;Set HL = last used 32AB 19 01085 ADD HL,DE ; address of driver 32AC 22BC31 01086 LD (OLDHIGH),HL ;Xfer into driver 32AF 1827 01087 JR DO_INST ;Install driver 01088 ; 01089 ; Driver is not in memory - is there room ? 01090 ; 32B1 CD3131 01091 NOT__IN CALL GTDRV ;P/u low driver ptr 32B4 ED53EB32 01092 LD (OLDRVR+1),DE ;Save it 32B8 21DB00 01093 LD HL,LENGTH-1 ;HL = length of driver 32BB 010013 01094 LD BC,HIDRVR ;BC = 1 + highest avail 32BE 19 01095 ADD HL,DE ;HL => Last used by Mem 32BF 22BC31 01096 LD (OLDHIGH),HL 32C2 23 01097 INC HL 32C3 B7 01098 OR A 32C4 E5 01099 PUSH HL ;Will MemDisk fit ? 32C5 ED42 01100 SBC HL,BC 32C7 E1 01101 POP HL 32C8 3808 01102 JR C,OKTOGO ;Yes - let's do it 01103 ; 01104 ; Insufficient Driver space 01105 ; 32CA 21D036 01106 LD HL,NOMEM ;Alter exit message 32CD 220D33 01107 LD ($NOT+1),HL 32D0 1818 01108 JR OLDRVR ;Reclaim hi mem if bank 0 01109 ; 01110 ; Save next avail mem addr & set Memdisk bit 01111 ; 32D2 DD7400 01112 OKTOGO LD (IX),H ;Stuff msb 32D5 DD75FF 01113 LD (IX-1),L ;Stuff lsb 01114 ; 01115 ; Install MemDISK driver & set up DCT 01116 ; 32D8 CD4431 01117 DO_INST CALL INSTDRV ;Relocate, install driver 32DB C1 01118 POP BC ;C = Bank # requests 32DC F1 01119 POP AF ;A = # cylinders 32DD CD9031 01120 CALL SETDCT ;Set up DCT 01121 ; 01122 ; Prompt for Format 01123 ; 32E0 CD7A36 01124 CALL FORMTIT ;Format this ? 32E3 282A 01125 JR Z,DOFORM1 ;Yes - do it 01126 ; 01127 ; Format = No, Is there a MemDISK here ? 01128 ; 32E5 3E00 01129 MEMIN1 LD A,$-$ ;0 = not active 32E7 B7 01130 OR A ; 32E8 2034 01131 JR NZ,SHOWINU ;MemDisk previously in 01132 ; 01133 ; Abort installation - stuff X'C9' in DCT 01134 ; 32EA 210000 01135 OLDRVR LD HL,$-$ ;P/u original driver addr 32ED 3A653B 01136 LD A,(RE_USE) ;Have we re-used driver 32F0 B7 01137 OR A ; area that was trapped ? 32F1 2003 01138 JR NZ,DONTRES ;Yes - don't reset memptr 32F3 220000 01139 KIDCB$ LD ($-$),HL ;Stuff ptr used 32F6 2AB836 01140 DONTRES LD HL,(SAVEDCT) ;P/u DCT address 32F9 36C9 01141 LD (HL),0C9H ;Disable it 32FB FDCB03A6 01142 RES 4,(IY+DFLAG$) ;Reset MemDISK bit 32FF 3A2530 01143 LD A,(SETBANK+1) ;P/u bank request 3302 B7 01144 OR A ;If alternate bank(s), 3303 2007 01145 JR NZ,$NOT ; don't reset high$ 3305 2AC438 01146 LD HL,(MDDATA+2) ;Pu old high$ 3308 47 01147 LD B,A 3309 01148 @@HIGH$ ;Reset high$ 3309+3E64 01149 LD A,100 330B+EF 01150 RST 40 330C C3DC36 01151 $NOT JP NOTACT ;Show not installed 01152 ; 01153 ; Format mem, init GAT & HIT, & BOOT-DIR entries 01154 ; 330F CD2B36 01155 DOFORM1 CALL FORMAT ;Format 3312 CD2C33 01156 CALL WRBOOT ;Write BOOT/SYS 3315 CD5633 01157 CALL WRGAT ;Initialize GAT 3318 CDD133 01158 CALL WRHIT ;Initialize HIT 331B CDDE33 01159 CALL WRENT ;Put DIR & BOOT entries 331E CD2430 01160 SHOWINU CALL SETBANK ;Show Banks in use 3321 FDCB03E6 01161 SET 4,(IY+DFLAG$) ;Set MemDisk flag 3325 211139 01162 LD HL,INSTALD ;Init"MemDisk Installed 3328 01163 @@LOGOT ;Display the msg 01164 IFEQ 00H,1 01165 LD HL, 01166 ENDIF 3328+3E0C 01167 LD A,12 332A+EF 01168 RST 40 332B C9 01169 RET ;Done - GO TO EXIT 01170 ; 01171 ; WRBOOT - Write BOOT/SYS information 01172 ; 332C AF 01173 WRBOOT XOR A ;Fill byte 332D 21003C 01174 LD HL,IOBUFF ;HL => I/O buffer 01175 ; 01176 ; Fill BOOT/SYS with Zeroes 01177 ; 3330 77 01178 FILBUF LD (HL),A ;Stuff in byte 3331 2C 01179 INC L ;One sector to 3332 20FC 01180 JR NZ,FILBUF ; fill 01181 ; 01182 ; Write # of Sectors in BOOT 01183 ; 3334 57 01184 LD D,A ;Cylinder 0 3335 5F 01185 LD E,A ;Sector 0 3336 0606 01186 BTSECS LD B,6 ;P/u Sec cnt - 5,6, or 18 3338 CDBD33 01187 BTLP CALL WRSEC ;Write sector 333B 1C 01188 INC E ;Bump 333C 10FA 01189 DJNZ BTLP 01190 ; 01191 ; Write Directory Cylinder byte in Sector Zero 01192 ; 333E 2E02 01193 LD L,2 ;Byte 2 3340 3601 01194 LD (HL),1 ;Directory cyl = 1 01195 ; 01196 ; Write Sector 0 of Cylinder 0 01197 ; 3342 110000 01198 LD DE,0 ;Cylinder 0, Sector 0 3345 CDBD33 01199 CALL WRSEC ;Write Sector 01200 ; 01201 ; Make a duplicate of sector 0 in sector 1 01202 ; 3348 1C 01203 INC E ;Sector 1 3349 CDBD33 01204 CALL WRSEC ;Write sector 01205 ; 01206 ; Write C/R in Auto Buffer in Sector 2 01207 ; 334C 1E02 01208 LD E,2 ;Sector 2 334E 2E20 01209 LD L,20H ;Byte X'20' 3350 360D 01210 LD (HL),CR ;No auto 3352 CDBD33 01211 CALL WRSEC ;Write sector 3355 C9 01212 RET ;RETurn for now 01213 ; 01214 ; WRGAT - Write Granule Allocation Table 01215 ; 01216 ; 3356 21003C 01217 WRGAT LD HL,IOBUFF ;HL => I/O buffer 3359 36F9 01218 GAT0 LD (HL),0F9H ;DD - X'F9', SD - X'FD' 335B 23 01219 INC HL ;Bump 01220 ; 01221 ; Lock out next X'CA' bytes in GAT 01222 ; 335C 06CA 01223 LD B,0CAH ;Lock out the bytes 335E 36FF 01224 LOCKOUT LD (HL),0FFH ;GAT + X'01' through 3360 23 01225 INC HL ;GAT + X'CA' 3361 10FB 01226 DJNZ LOCKOUT 01227 ; 01228 ; GAT + X'CB' 01229 ; 3363 3663 01230 LD (HL),63H ;GAT + X'CB'= Version 6.2 01231 ; 01232 ; GAT + X'CC' 01233 ; 3365 3E00 01234 CYLS LD A,$-$ ;P/u cylinder count 3367 F5 01235 PUSH AF ;Save Cylinder count 3368 D623 01236 SUB 35 ;Tracks in excess of 35 336A 23 01237 INC HL ;HL => next GAT byte 336B 77 01238 LD (HL),A ;GAT + X'CC'= tracks - 35 01239 ; 01240 ; GAT + X'CD' 01241 ; 336C 23 01242 INC HL ;GAT + X'CD' = 336D 364A 01243 GATCD LD (HL),4AH ;DDEN, 1 side, 3 gran/cyl 01244 ; 01245 ; GAT + X'CE' & X'CF' 01246 ; 336F 23 01247 INC HL ;GAT + X'CE' & X'CF' = 3370 36E0 01248 LD (HL),0E0H ;16-bit Hash code of 3372 23 01249 INC HL ;"PASSWORD" 3373 3642 01250 LD (HL),42H ;Hash = X'42E0' 01251 ; 01252 ; GAT + X'D0' - X'D7' 01253 ; 3375 23 01254 INC HL ;HL => next GAT byte 3376 11B638 01255 LD DE,MEMDISK ;"MEMDISK " is Pack name 3379 0E08 01256 LD C,8 ;Eight bytes 337B EB 01257 EX DE,HL ;Swap 'em for LDIR 337C EDB0 01258 LDIR ;Stuff in ID 337E EB 01259 EX DE,HL ;HL => GAT + X'D8' 01260 ; 01261 ; GAT + X'D8' - X'DF' 01262 ; 337F 01263 @@DATE ;Stuff date in GAT 337F+3E12 01264 LD A,18 3381+EF 01265 RST 40 01266 ; 01267 ; Stuff GAT tracks in use with either X'F8' or X'FC' 01268 ; 3382 3EF8 01269 GPC LD A,0F8H ;3 gran/cyl 3384 21023C 01270 LD HL,IOBUFF+2 ;HL => GAT + X'02' 3387 C1 01271 POP BC ;B = # cylinders 3388 05 01272 DEC B ;Subtract 2 to account 3389 05 01273 DEC B ;For BOOT and DIR 01274 ; 01275 ; Stuff open cylinder bytes into GAT 01276 ; 338A 77 01277 FREETRK LD (HL),A ;Free track 338B 23 01278 INC HL ;Next GAT byte 338C 10FC 01279 DJNZ FREETRK ;Do it B times 01280 ; 01281 ; Put 2 free Cyl bytes in lockout - BOOT & DIR 01282 ; 338E 2E60 01283 LD L,60H ;HL => Lockout 3390 77 01284 LD (HL),A 3391 2C 01285 INC L 3392 77 01286 LD (HL),A 01287 ; 01288 ; GAT + X'62' - GAT + X'BF' 01289 ; 3393 2E02 01290 LD L,2 ;HL => GAT + X'02' 3395 54 01291 LD D,H ;Xfer to DE 3396 5D 01292 LD E,L 3397 0E60 01293 LD C,60H ;Of X'60' for the 3399 09 01294 ADD HL,BC ; duplicate of top 339A 0D 01295 DEC C ;Only duplicate X'5E' 339B 0D 01296 DEC C ; bytes 339C EB 01297 EX DE,HL ;Prepare for LDIR 339D EDB0 01298 LDIR ;HL => GAT, DE => Lockout 01299 ; 339F 11F53C 01300 LD DE,IOBUFF+255-10 ;6.2 Media Data Block 33A2 21B633 01301 LD HL,LSIID ;Point to header 33A5 010400 01302 LD BC,04 ;Set length 33A8 EDB0 01303 LDIR ;Move it 33AA 2AB836 01304 LD HL,(SAVEDCT) ;The data to move 33AD 23 01305 INC HL 33AE 23 01306 INC HL 33AF 23 01307 INC HL 33B0 0E07 01308 LD C,7 ;Bytes to move 33B2 EDB0 01309 LDIR ;Move it in 33B4 1804 01310 JR WRGAT1 ;Skip around string 01311 IF @BLD631 33B6 03 01312 LSIID DB 03,'631' ;<631> 36 33 31 01313 ELSE 01314 LSIID DB 03,'LSI' 01315 ENDIF 01316 ; 33BA 110001 01317 WRGAT1 LD DE,100H ;D = Cyl 1, E = Sector 0 01318 ; 01319 ; WRSEC - Write A sector to MemDISK drive 01320 ; 33BD 21003C 01321 WRSEC LD HL,IOBUFF ;I/O buffer 33C0 0E00 01322 DRIVE LD C,$-$ ;P/u drive # 33C2 01323 @@WRSEC ;Write Sector 33C2+3E35 01324 LD A,53 33C4+EF 01325 RST 40 33C5 C9 01326 RET ; and RETurn 01327 ; 01328 ; RDSEC - Read A sector of MemDISK drive 01329 ; 33C6 21003C 01330 RDSEC LD HL,IOBUFF ;HL => I/O Buffer 33C9 3AC133 01331 LD A,(DRIVE+1) ;P/u drive # 33CC 4F 01332 LD C,A ;Xfer to C 33CD 01333 @@RDSEC ;Read sector 33CD+3E31 01334 LD A,49 33CF+EF 01335 RST 40 33D0 C9 01336 RET ; and RETurn 01337 ; 01338 ; WRHIT - Write HIT sector in directory 01339 ; 33D1 AF 01340 WRHIT XOR A ;Set A = 0 33D2 77 01341 ZEROHIT LD (HL),A ;Zero HIT position 33D3 2C 01342 INC L ;Bump HIT pointer 33D4 20FC 01343 JR NZ,ZEROHIT ;256 positions 33D6 36A2 01344 LD (HL),0A2H ;Hash for BOOT/SYS 33D8 2C 01345 INC L ;HL => HIT + X'01' 33D9 36C4 01346 LD (HL),0C4H ;Hash for DIR/SYS 33DB 1C 01347 INC E ;D = Cyl 1, Sector 1 33DC 18DF 01348 JR WRSEC ;Write Sector & RETurn 01349 ; 01350 ; WRENT - Write DIR/SYS & BOOT/SYS entries 01351 ; 33DE 11FB33 01352 WRENT LD DE,BOOT ;BOOT/SYS byte field 33E1 EB 01353 EX DE,HL ;Swap for LDIR 33E2 012000 01354 LD BC,32 ;32 bytes in entry 33E5 EDB0 01355 LDIR ;Block move 33E7 110201 01356 LD DE,102H ;D = Cyl 1, E = Sector 2 33EA CDBD33 01357 CALL WRSEC ;Write Sector 01358 ; 33ED 012000 01359 LD BC,32 33F0 EB 01360 EX DE,HL ;Xfer buffer ptr to DE 33F1 211B34 01361 LD HL,DIR ;HL => DIR/SYS bytes 33F4 EDB0 01362 LDIR ;Xfer to MemDISK 33F6 110301 01363 LD DE,103H ;D = Cyl 1, E = Sector 3 33F9 18C2 01364 JR WRSEC ;Write sector & RETurn 01365 ; 01366 ; BOOT/SYS directory entry data 01367 ; 33FB 5E 01368 BOOT DB 01011110B ;No access,inv,sys,FPDE 33FC 0000 01369 DW 0 ;Date = 00/00/00 33FE 0000 01370 DW 0 ;EOF offset = 0, LRL=256 3400 42 01371 DB 'BOOT ' ;Name field 4F 4F 54 20 20 20 20 3408 53 01372 DB 'SYS' ;Extension 59 53 01373 IF @BLD631E 340B F471 01374 DW 071F4H ;<631E>Owner password hash 01375 ELSE 01376 DW 037F6H ;Owner password hash 01377 ENDIF 340D 0000 01378 DW 0 ;User password hash 340F 0600 01379 BOOTERN DW 6 ;ERN = 6 or 5 3411 00 01380 DB 0 ;First extent = Cyl 0 3412 00 01381 BOOTGRN DB 0 ;St gran = 0, 1 cont gran 3413 FFFF 01382 DW 0FFFFH ;No more extents 3415 FFFF 01383 DW 0FFFFH 3417 FFFF 01384 DW 0FFFFH 3419 FFFF 01385 DW 0FFFFH 01386 ; 01387 ; DIR/SYS directory entry data 01388 ; 341B 5D 01389 DIR DB 01011101B ;Read only,inv,sys,FPDE 341C 0000 01390 DW 0 ;Date= 00/00/00 341E 0000 01391 DW 0 ;EOF offset=0, LRL=256 3420 44 01392 DB 'DIR ' ;Name field 49 52 20 20 20 20 20 3428 53 01393 DB 'SYS' ;Extension 59 53 01394 IF @BLD631E 342B F471 01395 DW 071F4H ;<631E>Owner password hash 01396 ELSE 01397 DW 037F6H ;Owner password hash 01398 ENDIF 342D 9642 01399 DW 04296H ;User password hash 342F 1200 01400 DIRERN DW 18 ;ERN+1 = 10 or 18 3431 01 01401 DB 1 ;Starts on cylinder 1 3432 02 01402 SDENI DB 00000010B ;St. gran=0, 3 cont grans 3433 FFFF 01403 DW 0FFFFH ;No Second Extent 3435 FFFF 01404 DW 0FFFFH ;No Third Extent 3437 FFFF 01405 DW 0FFFFH ;No Fourth Extent 3439 FF 01406 DB 0FFH ;No further records 343A FF 01407 DB 0FFH 01408 ; 01409 ; DOMEM - Issue Prompts & take inputs for type 01410 ; 343B 21E536 01411 DOMEM LD HL,HELLO$ ;Display message 343E 01412 @@DSPLY 01413 IFEQ 00H,1 01414 LD HL, 01415 ENDIF 343E+3E0A 01416 LD A,10 3440+EF 01417 RST 40 01418 ; 01419 ; Check if entry from SYSTEM (DRIVER= command 01420 ; 3441 01421 @@FLAGS 3441+3E65 01422 LD A,101 3443+EF 01423 RST 40 3444 FDCB025E 01424 BIT 3,(IY+'C'-'A') ;System request? 3448 CAC436 01425 JP Z,VIASET ;Quit if not 01426 ; 01427 ; Input MemDISK type - A,B,C,D or E to disable 01428 ; 344B 216B37 01429 GETYPE LD HL,BANKS ;Display prompt 344E 01430 @@DSPLY 01431 IFEQ 00H,1 01432 LD HL, 01433 ENDIF 344E+3E0A 01434 LD A,10 3450+EF 01435 RST 40 3451 0601 01436 LD B,1 ;# of chars to input 3453 CDD230 01437 CALL INPUT ;Input byte 3456 28F3 01438 JR Z,GETYPE ; ? - re-input 01439 ; 01440 ; Convert input A-E to 0-4 01441 ; 3458 7E 01442 LD A,(HL) ;P/u first character 3459 CBAF 01443 RES 5,A ;Convert to U/C 345B D641 01444 SUB 'A' ; - Bank 0 ? 345D 322530 01445 LD (SETBANK+1),A ;Save type of MemDISK 3460 4F 01446 LD C,A ;Xfer to C for @BANK 01447 ; 01448 ; If input is illegal then re-input 01449 ; 3461 38E8 01450 JR C,GETYPE ;Less - re-input 3463 FE04 01451 CP 4 ; - Disable MemDISK 3465 CA8835 01452 JP Z,DISMEM ;Yes - take it out 3468 30E1 01453 JR NC,GETYPE ;>4 - Re-input 01454 ; 01455 ; Check if MemDISK is already active 01456 ; 346A FDCB0366 01457 BIT 4,(IY+DFLAG$) ;MemDISK already active ? 346E C2C836 01458 JP NZ,MEMIN ;Yes - abort 01459 ; 01460 ; If Type A,B,C - Check Bk, D - Check bks 1&2 01461 ; 3471 C5 01462 PUSH BC ;Save Bank # 3472 FE03 01463 CP 3 ;Type "D" ? 3474 2006 01464 JR NZ,A_B_C ;No - "A", "B", or "C" 01465 ; 01466 ; Type "D" - See if both banks 1 & 2 are avail 01467 ; 3476 0E01 01468 TYPED LD C,1 ;Bank #1 active ? 3478 CDC730 01469 CALL CKBANK 347B 0C 01470 INC C ;Bank #2 active ? 347C CDC730 01471 A_B_C CALL CKBANK 347F C1 01472 POP BC ;C = Bank # (0,1,2,3) 01473 ; 01474 ; Stuff Default Bank # and offset into driver 01475 ; 3480 79 01476 LD A,C ;P/u bank # 3481 3D 01477 DEC A ;If bank 0 requested, 3482 FA9434 01478 JP M,WAS0 ; then keep as -1 3485 3C 01479 INC A ; for driver bank test 3486 32C431 01480 LD (BANKIM),A ;Save bank # in driver 3489 FE02 01481 CP 2 ;Instruction if 348B 2005 01482 JR NZ,NOT2 ;Just bank #2 active 348D 216232 01483 LD HL,OFFSET+1 ;Stuff X'80' in ADD 3490 3680 01484 LD (HL),80H 3492 3E01 01485 NOT2 LD A,1 ;Always init to bank 1 01486 ; if type B, C or D 3494 326732 01487 WAS0 LD (DEFBANK+1),A ;Stuff in driver 01488 ; 01489 ; Input Density (Single or Double) 01490 ; 3497 215038 01491 INPDENS LD HL,DENSITY ;"Density" 349A 01492 @@DSPLY 01493 IFEQ 00H,1 01494 LD HL, 01495 ENDIF 349A+3E0A 01496 LD A,10 349C+EF 01497 RST 40 349D 0601 01498 LD B,1 ;Input an "S" or "D" 349F CDD230 01499 CALL INPUT 34A2 2858 01500 JR Z,DEFAULT ; - use default 01501 ; 01502 ; ouble Density input ? 01503 ; 34A4 7E 01504 LD A,(HL) ;P/u first char 34A5 CBAF 01505 RES 5,A ;Convert to U/C 34A7 FE44 01506 CP 'D' ; ouble Density ? 34A9 2851 01507 JR Z,DEFAULT ;Yes - use 6 sectors/gran 01508 ; 01509 ; ingle Density input ? 01510 ; 34AB FE53 01511 CP 'S' ;ingle Density ? 34AD 20E8 01512 JR NZ,INPDENS ;No - input density again 01513 ; 01514 ; Single Density - Change driver math 01515 ; 34AF 3E82 01516 LD A,82H ;ADD A,D instruction 34B1 325E32 01517 LD (SDENB),A 34B4 3E87 01518 LD A,87H ;ADD A,A instruction 34B6 325F32 01519 LD (SDENC),A 34B9 3E09 01520 LD A,9 34BB 32B031 01521 LD (SDENF+3),A ;DCT + 7 34BE 326835 01522 LD (SPC+1),A ;Save in CALCSIZ routine 34C1 3C 01523 INC A ;SDEN BOOT ERN = 10 34C2 322F34 01524 LD (DIRERN),A ;SDEN DIR/SYS ERN = 10 34C5 3E24 01525 LD A,24H 34C7 32B431 01526 LD (SDENG+3),A ;DCT + 8 34CA 3E32 01527 LD A,'2' ;Change size to 2.50K 34CC 321E38 01528 LD (FRTRK1),A ;Space per cylinder 34CF 3EFD 01529 LD A,0FDH ;1 Gran Free 34D1 325A33 01530 LD (GAT0+1),A ;Stuff in WRGAT routine 34D4 3D 01531 DEC A ;2 Grans/Cyl - X'FC' 34D5 328333 01532 LD (GPC+1),A 34D8 AF 01533 XOR A ;NOP instruction 34D9 325A32 01534 LD (SDENA),A 34DC 32A131 01535 LD (SDEND+3),A ;DCT + 3 34DF 3C 01536 INC A ;Set A = 1 34E0 323234 01537 LD (SDENI),A ;2 contiguous granules 34E3 3E09 01538 LD A,9 34E5 326E33 01539 LD (GATCD+1),A 34E8 3E05 01540 LD A,5 ;Set Boot ERN = 5 34EA 320F34 01541 LD (BOOTERN),A 34ED 3E10 01542 LD A,10H ;Alien Disk Controller 34EF 32A531 01543 LD (SDENE+3),A 34F2 213733 01544 LD HL,BTSECS+1 ;HL => # BOOT sectors 34F5 35 01545 DEC (HL) ;Use 5 instead of 6 34F6 21000A 01546 LD HL,SDBPC ;Change GETCYL routine 34F9 22E130 01547 LD (BPC+1),HL 01548 ; 01549 ; Calculate # of possible cylinders 01550 ; 34FC 3A2530 01551 DEFAULT LD A,(SETBANK+1) ;P/u type of memdisk 34FF 4F 01552 LD C,A ;Save in C 3500 B7 01553 OR A ;Bank 0 ? 3501 280A 01554 JR Z,PIKUPHI ;Yes - use HIGH$ 01555 ; 01556 ; Bank #1, #2, or #1 & #2 01557 ; 3503 21FF7F 01558 LD HL,7FFFH ;HL = # bytes in 1 bank 3506 FE03 01559 CP 3 ;Bank 1 & 2 ? 3508 201F 01560 JR NZ,CALCYL ;No - use X'7FFF' 350A 65 01561 LD H,L ;Set HL = X'FFFF' 350B 181C 01562 JR CALCYL 01563 ; 01564 ; Bank Zero request - calculate free mem avail 01565 ; 350D AF 01566 PIKUPHI XOR A ;Set A = 0 350E ED62 01567 SBC HL,HL ;HL = 0 3510 47 01568 LD B,A ;B = 0 3511 01569 @@HIGH$ ;P/u HIGH$ 3511+3E64 01570 LD A,100 3513+EF 01571 RST 40 3514 22C438 01572 LD (MDDATA+2),HL ;Save HIGH$ 3517 22C231 01573 LD (OLD_HI),HL ;Save HIGH$ in driver 351A 23 01574 INC HL ;Set HL = last page 351B 25 01575 DEC H 351C 6F 01576 LD L,A 351D 226D35 01577 LD (SAVPAGE+1),HL ;Save page boundary 3520 110080 01578 LD DE,LOWEST ;DE = lowest 3523 AF 01579 XOR A 3524 ED52 01580 SBC HL,DE ;HL = amount free 3526 DAD036 01581 JP C,NOMEM ;Carry - not enough mem 01582 ; 01583 ; Calculate # of cylinders available 01584 ; 3529 CDDE30 01585 CALCYL CALL GETCYL ;Get # of poss cyls 352C C2D036 01586 JP NZ,NOMEM ;NZ - Not enough mem 01587 ; 01588 ; Convert A to ASCII & stuff into string 01589 ; 352F 3C 01590 INC A ;Bump one 3530 325D35 01591 LD (MAXCYL+1),A ;Save max # of cyls 3533 3D 01592 DEC A 3534 326633 01593 LD (CYLS+1),A ;Stuff in WRGAT routine 3537 F5 01594 PUSH AF ;Save Max # of cyls 3538 CD5F30 01595 CALL DECASC ;Convert to ASCII in HL 353B F1 01596 POP AF ;A = # cyls 353C EB 01597 EX DE,HL ;DE = # 353D 214A38 01598 LD HL,FRTRK2 ;HL => Destination 3540 72 01599 LD (HL),D ;Msb 3541 23 01600 INC HL 3542 73 01601 LD (HL),E ;Lsb 01602 ; 01603 ; A = # of Cyls poss, put in string if bank 0 01604 ; 3543 0C 01605 INC C ;Bank Zero request ? 3544 0D 01606 DEC C 3545 C0 01607 RET NZ ;No - done prompting 01608 ; 01609 ; Display Cylinders string & input # of cyls 01610 ; 3546 210338 01611 REDO LD HL,FRTRACK ;How many cylinders 3549 01612 @@DSPLY 01613 IFEQ 00H,1 01614 LD HL, 01615 ENDIF 3549+3E0A 01616 LD A,10 354B+EF 01617 RST 40 354C 0602 01618 LD B,2 ;Input # of cyls 354E CDD230 01619 CALL INPUT 3551 28F3 01620 JR Z,REDO ;Reinput it 01621 ; 01622 ; Check if input legal 01623 ; 3553 CD6A30 01624 CALL DECHEX ;Convert # to Hex 3556 20EE 01625 JR NZ,REDO ;Illegal - Re-input 3558 FE03 01626 CP MINCYL ;Less than minimum? 355A 38EA 01627 JR C,REDO 355C FE00 01628 MAXCYL CP $-$ ;P/u max # of cyls 355E 30E6 01629 JR NC,REDO ;Too many - reinput 3560 326633 01630 LD (CYLS+1),A ;New # of cylinders 01631 ; 01632 ; CALCSIZ - Calculate Size of Cyl request 01633 ; 3563 CDAA30 01634 CALCSIZ CALL SAVEREG ;Save Registers 3566 4F 01635 LD C,A ;Xfer # cyls to C 3567 0611 01636 SPC LD B,17 ;P/u Sectors/Cyl 01637 ; 01638 ; Multiply Sectors per Cylinder x # Cylinders 01639 ; 3569 81 01640 MLOOP ADD A,C ;Multiply B x C 356A 10FD 01641 DJNZ MLOOP 01642 ; 01643 ; Set HL = New HIGH$ 01644 ; 356C 210000 01645 SAVPAGE LD HL,$-$ ;P/u page boundary 356F ED44 01646 NEG ;Set H = H - A 3571 84 01647 ADD A,H 3572 67 01648 LD H,A ;HL = New HIGH$, B = 0 3573 326232 01649 LD (OFFSET+1),A ;Stuff into driver 01650 ; 01651 ; Stuff a Memory Header on front of MemDISK 01652 ; 3576 2B 01653 DEC HL ;Pt 1 byte before 3577 EB 01654 EX DE,HL ; Memdisk himem area 3578 21D238 01655 LD HL,MDDATA+16 ;Pt to header block 357B 011100 01656 LD BC,17 357E EDB8 01657 LDDR ; and move it to himem 3580 EB 01658 EX DE,HL 3581 22C731 01659 LD (MEMHIGH),HL 3584 01660 @@HIGH$ ;Install new HIGH$ 3584+3E64 01661 LD A,100 3586+EF 01662 RST 40 3587 C9 01663 RET ;Restore Regs & RETurn 01664 ; 01665 ; DISMEM - Disable MemDISK if in memory 01666 ; 3588 FDCB0366 01667 DISMEM BIT 4,(IY+DFLAG$) ;MemDISK active ? 358C CAD436 01668 JP Z,NOTPRS ;No - display error mess 01669 ; 01670 ; Pick up Driver address of drive 01671 ; 358F 2AB836 01672 LD HL,(SAVEDCT) ;P/u DCT address 3592 E5 01673 PUSH HL ;Save DCT ptr 3593 23 01674 INC HL ;P/u driver address 3594 5E 01675 LD E,(HL) ;Lsb 3595 23 01676 INC HL 3596 56 01677 LD D,(HL) ;Msb 3597 D5 01678 PUSH DE ;Save Driver Address 01679 ; 01680 ; Calculate end of driver & Posn to ID 01681 ; 3598 EB 01682 EX DE,HL ;Pt HL to driver 3599 E5 01683 PUSH HL ;Save driver start 359A 01DC00 01684 LD BC,LENGTH ;Add length of driver 359D 09 01685 ADD HL,BC ; to start of driver. 359E 22F635 01686 LD (DREND+1),HL ;Save next available 35A1 E1 01687 POP HL ;HL => driver add start 35A2 23 01688 INC HL ;Pos'n to length byte 35A3 23 01689 INC HL 35A4 23 01690 INC HL 35A5 23 01691 INC HL 01692 ; 01693 ; P/u length byte & pt to driver name 01694 ; 35A6 46 01695 LD B,(HL) ;P/u length byte 35A7 23 01696 INC HL ;HL => Driver Name 35A8 11BE38 01697 LD DE,MD$ ;DE => MEMDISK 01698 ; 01699 ; Is this REALLY a certified MemDISK ?? 01700 ; 35AB 1A 01701 MEMLP LD A,(DE) ;P/u MemDISK byte 35AC BE 01702 CP (HL) ;Match ? 35AD 23 01703 INC HL ;Bump driver ptr 35AE 13 01704 INC DE ;Bump string ptr 35AF C2CC36 01705 JP NZ,NOTMEM ;No - isn't a MemDISK 35B2 10F7 01706 DJNZ MEMLP ;Yes - check all posns 01707 ; 01708 ; Pick up Old HIGH$ address & stuff for later 01709 ; 35B4 5E 01710 LD E,(HL) ;P/u old HIGH$ 35B5 23 01711 INC HL 35B6 56 01712 LD D,(HL) 35B7 ED53EA35 01713 LD (SAVEOLD+1),DE ;Stuff into LD HL inst 01714 ; 01715 ; P/u BANK information 01716 ; 35BB FDCB03A6 01717 RES 4,(IY+DFLAG$) ;Reset MemDISK bit 35BF 23 01718 INC HL ;HL => Bank image 35C0 7E 01719 LD A,(HL) ;P/u bank image 35C1 4F 01720 LD C,A ;Xfer to C 35C2 FE03 01721 CP 3 ;Both banks 1 & 2 ? 35C4 3805 01722 JR C,FRBANK ;No - free up bank 35C6 0D 01723 DEC C ;Set C = 2 35C7 CD3830 01724 CALL FREBANK ;Free bank #2 35CA 0D 01725 DEC C ;Set C = 1 35CB CD3830 01726 FRBANK CALL FREBANK ;Free Bank in C 01727 ; 01728 ; Is this a Bank Zero MemDISK ? 01729 ; 35CE FD215C3B 01730 LD IY,TYPEDIS ;IY => Disable Type 35D2 0C 01731 INC C ;Is C = 0 ? 35D3 0D 01732 DEC C 35D4 201C 01733 JR NZ,GTDRV2 ;No - check out driver 01734 ; 01735 ; Bank 0 - p/u last HIGH$ from Driver storage 01736 ; 35D6 FD3500 01737 DEC (IY) ;Change type 35D9 23 01738 INC HL ;Pos to HI$ val after 35DA 23 01739 INC HL ; MemDISK installation. 35DB 23 01740 INC HL 35DC 5E 01741 LD E,(HL) ;P/u address 35DD 23 01742 INC HL 35DE 56 01743 LD D,(HL) 01744 ; 01745 ; Pick up Current HIGH$ & compare with other 01746 ; 35DF 60 01747 LD H,B ;Set HL = 0 35E0 68 01748 LD L,B 35E1 01749 @@HIGH$ ;(B=0), p/u HIGH$ 35E1+3E64 01750 LD A,100 35E3+EF 01751 RST 40 35E4 B7 01752 OR A ;Same ? 35E5 ED52 01753 SBC HL,DE 35E7 2009 01754 JR NZ,GTDRV2 ;NZ - Can't do it 01755 ; 01756 ; Reset HIGH$ = original HIGH$ 01757 ; 35E9 210000 01758 SAVEOLD LD HL,$-$ ;P/u old HIGH$ 35EC 01759 @@HIGH$ ;Re-allocate space 35EC+3E64 01760 LD A,100 35EE+EF 01761 RST 40 35EF FD3400 01762 INC (IY) ;Change Type 01763 ; 01764 ; Can the Driver area be re-allocated ? 01765 ; 35F2 CD3131 01766 GTDRV2 CALL GTDRV ;Get driver area 35F5 210000 01767 DREND LD HL,$-$ ;P/u driver address 35F8 B7 01768 OR A 35F9 ED52 01769 SBC HL,DE ;Same ? 35FB E1 01770 POP HL ;HL => Driver Address 35FC 2016 01771 JR NZ,NORECLM ;No - can't Reclaim 01772 ; 01773 ; Stuff original Address into low driver ptr 01774 ; 35FE DD7400 01775 LD (IX),H ;Msb 3601 DD75FF 01776 LD (IX-1),L ;Lsb 3604 FD3400 01777 INC (IY) ;Change type 3607 FD3400 01778 INC (IY) 01779 ; 01780 ; Clear out Driver 01781 ; 360A 01DB00 01782 LD BC,LENGTH-1 ;BC = # of bytes clr 360D 3600 01783 LD (HL),0 ;Null byte 360F 54 01784 LD D,H ;Set DE = HL+1 3610 5D 01785 LD E,L 3611 13 01786 INC DE 3612 EDB0 01787 LDIR ;Clear area 01788 ; 01789 ; Disable DCT slot 01790 ; 3614 E1 01791 NORECLM POP HL ;HL => DCT + 0 3615 36C9 01792 LD (HL),0C9H ;Disable it 01793 ; 01794 ; Calculate Start of Disable string 01795 ; 3617 FDE5 01796 PUSH IY ;Xfer to HL 3619 E1 01797 POP HL 361A 4E 01798 LD C,(HL) ;P/u type 361B CB21 01799 SLA C ;Multiply by 2 361D 0600 01800 LD B,0 ;BC = offset in table 361F 23 01801 INC HL ;HL => Address Table 3620 09 01802 ADD HL,BC ;HL => Add of mess string 3621 5E 01803 LD E,(HL) ;P/u Address 3622 23 01804 INC HL 3623 56 01805 LD D,(HL) 3624 EB 01806 EX DE,HL ;HL => Disable message 3625 01807 @@LOGOT ;Log message 01808 IFEQ 00H,1 01809 LD HL, 01810 ENDIF 3625+3E0C 01811 LD A,12 3627+EF 01812 RST 40 3628 C31D30 01813 JP EXIT ;Go to exit routine 01814 ; 01815 ; FORMAT - Format Memory 01816 ; 362B 21AE3A 01817 FORMAT LD HL,VERIFY ;"Verifying RAM ..." 362E 01818 @@DSPLY ;Display it 01819 IFEQ 00H,1 01820 LD HL, 01821 ENDIF 362E+3E0A 01822 LD A,10 3630+EF 01823 RST 40 3631 1600 01824 LD D,00 ;Track counter 01825 ; 01826 ; Display Current Cylinder Formatting 01827 ; 3633 7A 01828 WIPELP LD A,D ;Get track counter 3634 CD4030 01829 CALL DECASC2 ;Display Dec ASCII equiv. 01830 ; 01831 ; Run 4 different bit tests on each cylinder 01832 ; 3637 3EFF 01833 LD A,11111111B ;All bits on 3639 CD5936 01834 CALL VERCYL ;Verify track w/ bits on 363C 3E55 01835 LD A,01010101B ;Next pattern 363E CD5936 01836 CALL VERCYL 3641 3EAA 01837 LD A,10101010B ;Last pattern 3643 CD5936 01838 CALL VERCYL 3646 3E00 01839 LD A,00000000B ;All bits off 3648 CD5936 01840 CALL VERCYL ;Verify track w/ bits off 01841 ; 01842 ; Finished Formatting yet ? 01843 ; 364B 14 01844 INC D ;Bump cylinder # 364C 7A 01845 LD A,D 364D DDBE06 01846 CP (IX+6) ;Finished ? 3650 20E1 01847 JR NZ,WIPELP ;No - stop when max cyl 01848 ; 01849 ; Finished Formatting - Display message 01850 ; 3652 21C83A 01851 LD HL,FORMCOM ;"Formatting Complete" 3655 01852 @@DSPLY ;Print it 01853 IFEQ 00H,1 01854 LD HL, 01855 ENDIF 3655+3E0A 01856 LD A,10 3657+EF 01857 RST 40 3658 C9 01858 RET ;Done formatting 01859 ; 01860 ; VERCYL - Verify a cylinder of RAM 01861 ; 3659 21003C 01862 VERCYL LD HL,IOBUFF ;HL => I/O buffer 365C 1E00 01863 LD E,0 ;Init to sector 0 01864 ; 01865 ; Fill buffer with specified byte 01866 ; 365E 77 01867 STUFLP LD (HL),A ;Stuff into buffer 365F 2C 01868 INC L ;Bump 3660 20FC 01869 JR NZ,STUFLP ;256 bytes to fill 01870 ; 01871 ; Write the sector & read it back 01872 ; 3662 F5 01873 CYLP PUSH AF ;Save fill byte 3663 CDBD33 01874 CALL WRSEC ;Write Sector 3666 CDC633 01875 CALL RDSEC ;Read into other buff 3669 F1 01876 POP AF ;A = Fill byte 01877 ; 01878 ; Check if sector read back has correct byte 01879 ; 366A BE 01880 CKLP CP (HL) ;Match ? 366B C28930 01881 JP NZ,ERROR ;No - error 366E 2C 01882 INC L ;Done with sector ? 366F 20F9 01883 JR NZ,CKLP ;256 bytes to check 01884 ; 01885 ; Advance to next sector 01886 ; 3671 7B 01887 LD A,E ;P/u sector # 3672 DDBE07 01888 CP (IX+7) ;Finished ? 3675 7E 01889 LD A,(HL) ;P/u cylinder byte 3676 13 01890 INC DE ;Bump E 3677 20E9 01891 JR NZ,CYLP ;DCT+8 sectors to check 3679 C9 01892 RET ;Done - RETurn 01893 ; 01894 ; FORMTIT - Check if MemDISK has data on it 01895 ; 367A 110001 01896 FORMTIT LD DE,100H ;D = Cyl 1, Sec 0 (GAT) 367D CDC633 01897 CALL RDSEC ;Read BOOT sector 01898 ; 01899 ; Check GAT ID 01900 ; 3680 2ED0 01901 LD L,0D0H ;MemDISK pack name 3682 11B638 01902 LD DE,MEMDISK ;What it should be 3685 0608 01903 LD B,8 ;# of characters 01904 ; 3687 1A 01905 CKMLP LD A,(DE) ;P/u should be char 3688 BE 01906 CP (HL) ;Match ? 3689 23 01907 INC HL ;Bump 368A 13 01908 INC DE 368B 200C 01909 JR NZ,NOMTCH ;No - must format 368D 10F8 01910 DJNZ CKMLP ;Yes - loop for more 01911 ; 01912 ; Already a MemDISK - Sure about formatting ? 01913 ; 368F 217238 01914 LD HL,DOFORM ;Destination ... 3692 3E01 01915 LD A,1 ;Set MemDISK in flag 3694 32E632 01916 LD (MEMIN1+1),A 3697 1803 01917 JR DISMES ;Display it 01918 ; 01919 ; Not a MemDISK - Do normal Prompt 01920 ; 3699 219438 01921 NOMTCH LD HL,STILLFM ;Do you wish to format ? 369C 01922 DISMES @@DSPLY ;Display message 01923 IFEQ 00H,1 01924 LD HL, 01925 ENDIF 369C+3E0A 01926 LD A,10 369E+EF 01927 RST 40 01928 ; 01929 ; Input Response 01930 ; 369F 0601 01931 LD B,1 ;Input 1 character 36A1 E5 01932 PUSH HL ;Save message start 36A2 CDD230 01933 CALL INPUT 36A5 7E 01934 LD A,(HL) ;P/u character 36A6 E1 01935 POP HL ;Recover message start 36A7 05 01936 DEC B ;Anything entered ? 36A8 C0 01937 RET NZ ;No - RETurn NZ 01938 ; 01939 ; Set Z flag if "Y" & Reset Z if "N" entered 01940 ; 36A9 CBAF 01941 RES 5,A ;Cvt to U/C 36AB FE4E 01942 CP 'N' ;o ? 36AD 2805 01943 JR Z,RESZF ;RETurn NZ 36AF FE59 01944 CP 'Y' ; es ? 36B1 C8 01945 RET Z ;RETurn Z set 36B2 18E8 01946 JR DISMES ;No - reprompt 36B4 B7 01947 RESZF OR A ;Reset Z flag 36B5 C9 01948 RET ; and RETurn 01949 ; 01950 ; Variables used 36B6 0000 01951 SAVEDE DW 0 36B8 0000 01952 SAVEDCT DW 0 36BA 0000 01953 DRADD DW 0 01954 ; 01955 ; Informative Error Display & Abort Routine 01956 ; 36BC 21D338 01957 NODRV LD HL,NODRV$ 36BF DD 01958 DB 0DDH 36C0 21F138 01959 BADDRV LD HL,BADDRV$ 36C3 DD 01960 DB 0DDH 36C4 210E3B 01961 VIASET LD HL,VIASET$ ;Not via SYSTEM 36C7 DD 01962 DB 0DDH 36C8 21973A 01963 MEMIN LD HL,MEMIN$ ;Already installed 36CB DD 01964 DB 0DDH 36CC 213039 01965 NOTMEM LD HL,NOTMEM$ ;Not a MemDISK 36CF DD 01966 DB 0DDH 36D0 214B39 01967 NOMEM LD HL,NOMEM$ ;Insufficient Memory 36D3 DD 01968 DB 0DDH 36D4 216039 01969 NOTPRS LD HL,NOTPRS$ ;Not Present 36D7 DD 01970 DB 0DDH 36D8 21653A 01971 BNKUSE LD HL,BNKUSE$ ;Bank in use 36DB DD 01972 DB 0DDH 36DC 217439 01973 NOTACT LD HL,NOTACT$ ;Cant Install 01974 ; 01975 ; Log Error Message & Abort 01976 ; 36DF 01977 @@LOGOT ;Log error message 01978 IFEQ 00H,1 01979 LD HL, 01980 ENDIF 36DF+3E0C 01981 LD A,12 36E1+EF 01982 RST 40 36E2 C31730 01983 JP ABORT ;Go to exit routine 01984 ; 36E5 4D 01985 HELLO$ DB 'MEMDISK' 45 4D 44 49 53 4B 36EC 01986 *GET CLIENT:3 01987 ;CLIENT/ASM - File to establish sign-on headers 01988 ; and version numbers. 01989 ; 01990 ; EACH STRING SHOULD CONTAIN ONLY 63 CHARACTERS !! 01991 ; 01992 IF @BLD631 01993 ; 12345678901234567890123456789012345678901234567890 36EC 20 01994 DB ' - 6.3.1 - Copyright 1982/83/84/86/90 by MISOSYS, ';<631> 2D 20 36 2E 33 2E 31 20 2D 20 43 6F 70 79 72 69 67 68 74 20 31 39 38 32 2F 38 33 2F 38 34 2F 38 36 2F 39 30 20 62 79 20 4D 49 53 4F 53 59 53 2C 20 371E 49 01995 DB 'Inc., ',10 ;<631> 6E 63 2E 2C 20 20 20 20 20 20 20 0A 01996 ELSE 01997 DB ' - 6.3.0 - Copyright 1982/83/84/86 by Logical Syst' 01998 DB 'ems, Inc. ',10 01999 ENDIF 02000 ; 02001 ; DB 'All Rights Reserved. Licensed 1982/83/84 to Tandy ' 02002 ; DB 'Corporation.',10,13 02003 ; 02004 ; DB 'All Rights Reserved. Beta-TEST Level/AD, DO NOT DI' 02005 ; DB 'STRIBUTE !! ',10,13 02006 ; DB 'All Rights reserved by LSI, 8970 N. 55th St. Milwa' 02007 ; DB 'ukee, Wisc. ',10,13 372B 41 02008 DB 'All Rights Reserved. Unauthorized duplication is p' 6C 6C 20 52 69 67 68 74 73 20 52 65 73 65 72 76 65 64 2E 20 55 6E 61 75 74 68 6F 72 69 7A 65 64 20 64 75 70 6C 69 63 61 74 69 6F 6E 20 69 73 20 70 375D 72 02009 DB 'rohibited. ',10,13 6F 68 69 62 69 74 65 64 2E 20 20 0A 0D 02010 ; 376B 0A 02011 BANKS DB LF,' Bank 0 (Primary Memory)',LF 3C 41 3E 20 20 42 61 6E 6B 20 30 20 28 50 72 69 6D 61 72 79 20 4D 65 6D 6F 72 79 29 0A 3789 3C 02012 DB ' Bank 1',LF 42 3E 20 20 42 61 6E 6B 20 31 0A 3795 3C 02013 DB ' Bank 2',LF 43 3E 20 20 42 61 6E 6B 20 32 0A 37A1 3C 02014 DB ' Banks 1 and 2',LF 44 3E 20 20 42 61 6E 6B 73 20 31 20 61 6E 64 20 32 0A 37B4 3C 02015 DB ' Disable MemDISK',LF,LF 45 3E 20 20 44 69 73 61 62 6C 65 20 4D 65 6D 44 49 53 4B 0A 0A 37CA 57 02016 DB 'Which type of allocation - ' 68 69 63 68 20 74 79 70 65 20 6F 66 20 61 6C 6C 6F 63 61 74 69 6F 6E 20 2D 20 37E5 3C 02017 DB ', , , , or ? ',ETX 41 3E 2C 20 3C 42 3E 2C 20 3C 43 3E 2C 20 3C 44 3E 2C 20 6F 72 20 3C 45 3E 20 3F 20 03 02018 ; 3803 4E 02019 FRTRACK DB 'Note: Each Cylinder equals ' 6F 74 65 3A 20 45 61 63 68 20 43 79 6C 69 6E 64 65 72 20 65 71 75 61 6C 73 20 381E 34 02020 FRTRK1 DB '4.50K of space.',LF 2E 35 30 4B 20 6F 66 20 73 70 61 63 65 2E 0A 382E 4E 02021 DB 'Number of free Cylinders: ',MINCYL+'0'&0FFH,'-' 75 6D 62 65 72 20 6F 66 20 66 72 65 65 20 43 79 6C 69 6E 64 65 72 73 3A 20 33 2D 384A 30 02022 FRTRK2 DB '00 ? ',ETX 30 20 3F 20 03 02023 ; 3850 53 02024 DENSITY DB 'Single or Double Density ? ',ETX 69 6E 67 6C 65 20 6F 72 20 44 6F 75 62 6C 65 20 44 65 6E 73 69 74 79 20 3C 53 2C 44 3E 20 3F 20 03 02025 ; 3872 44 02026 DOFORM DB 'Destination MemDISK contains Data',LF 65 73 74 69 6E 61 74 69 6F 6E 20 4D 65 6D 44 49 53 4B 20 63 6F 6E 74 61 69 6E 73 20 44 61 74 61 0A 02027 ; 3894 44 02028 STILLFM DB 'Do you wish to Format it? ',ETX 6F 20 79 6F 75 20 77 69 73 68 20 74 6F 20 46 6F 72 6D 61 74 20 69 74 20 3C 59 2F 4E 3E 20 3F 20 03 02029 ; 38B6 4D 02030 MEMDISK DB 'MEMDISK ' 45 4D 44 49 53 4B 20 38BE 24 02031 MD$ DB '$MD',ETX 4D 44 03 38C2 18 02032 MDDATA DB 18H,17,0,0,8,'MemDISKD',0,0,0,0 11 00 00 08 4D 65 6D 44 49 53 4B 44 00 00 00 00 02033 ; 38D3 4C 02034 NODRV$ DB 'Logical drive number required',CR 6F 67 69 63 61 6C 20 64 72 69 76 65 20 6E 75 6D 62 65 72 20 72 65 71 75 69 72 65 64 0D 38F1 43 02035 BADDRV$ DB 'Can''t specify SYSTEM drive slot',CR 61 6E 27 74 20 73 70 65 63 69 66 79 20 53 59 53 54 45 4D 20 64 72 69 76 65 20 73 6C 6F 74 0D 3911 4D 02036 INSTALD DB 'MemDISK Successfully Installed',CR 65 6D 44 49 53 4B 20 53 75 63 63 65 73 73 66 75 6C 6C 79 20 49 6E 73 74 61 6C 6C 65 64 0D 02037 ; 3930 54 02038 NOTMEM$ DB 'Target Drive not a MemDISK',CR 61 72 67 65 74 20 44 72 69 76 65 20 6E 6F 74 20 61 20 4D 65 6D 44 49 53 4B 0D 02039 ; 394B 49 02040 NOMEM$ DB 'Insufficient Memory ',CR 6E 73 75 66 66 69 63 69 65 6E 74 20 4D 65 6D 6F 72 79 20 0D 02041 ; 3960 4D 02042 NOTPRS$ DB 'MemDISK not present',CR 65 6D 44 49 53 4B 20 6E 6F 74 20 70 72 65 73 65 6E 74 0D 02043 ; 3974 4D 02044 NOTACT$ DB 'MemDISK not present, installation ' 65 6D 44 49 53 4B 20 6E 6F 74 20 70 72 65 73 65 6E 74 2C 20 69 6E 73 74 61 6C 6C 61 74 69 6F 6E 20 3996 61 02045 DB 'aborted',CR 62 6F 72 74 65 64 0D 02046 ; 399E 4D 02047 DISABE1 DB 'MemDISK disabled, memory now avail' 65 6D 44 49 53 4B 20 64 69 73 61 62 6C 65 64 2C 20 6D 65 6D 6F 72 79 20 6E 6F 77 20 61 76 61 69 6C 39C0 61 02048 DB 'able',CR 62 6C 65 0D 02049 ; 39C5 4D 02050 DISABE2 DB 'MemDISK disabled, Unable to reclaim ' 65 6D 44 49 53 4B 20 64 69 73 61 62 6C 65 64 2C 20 55 6E 61 62 6C 65 20 74 6F 20 72 65 63 6C 61 69 6D 20 39E9 68 02051 DB 'high memory',CR 69 67 68 20 6D 65 6D 6F 72 79 0D 02052 ; 39F5 4D 02053 DISABE3 DB 'MemDISK disabled, Unable to reclaim ' 65 6D 44 49 53 4B 20 64 69 73 61 62 6C 65 64 2C 20 55 6E 61 62 6C 65 20 74 6F 20 72 65 63 6C 61 69 6D 20 3A19 64 02054 DB 'driver area',CR 72 69 76 65 72 20 61 72 65 61 0D 02055 ; 3A25 4D 02056 DISABE4 DB 'MemDISK disabled, Unable to reclaim ' 65 6D 44 49 53 4B 20 64 69 73 61 62 6C 65 64 2C 20 55 6E 61 62 6C 65 20 74 6F 20 72 65 63 6C 61 69 6D 20 3A49 68 02057 DB 'high memory and driver area',CR 69 67 68 20 6D 65 6D 6F 72 79 20 61 6E 64 20 64 72 69 76 65 72 20 61 72 65 61 0D 02058 ; 3A65 55 02059 BNKUSE$ DB 'Unable to install MemDISK, ' 6E 61 62 6C 65 20 74 6F 20 69 6E 73 74 61 6C 6C 20 4D 65 6D 44 49 53 4B 2C 20 3A80 72 02060 DB 'requested bank in use.',CR 65 71 75 65 73 74 65 64 20 62 61 6E 6B 20 69 6E 20 75 73 65 2E 0D 02061 ; 3A97 4D 02062 MEMIN$ DB 'MemDISK already Active',CR 65 6D 44 49 53 4B 20 61 6C 72 65 61 64 79 20 41 63 74 69 76 65 0D 02063 ; 3AAE 56 02064 VERIFY DB 'Verifying RAM cylinder 00',ETX 65 72 69 66 79 69 6E 67 20 52 41 4D 20 63 79 6C 69 6E 64 65 72 20 30 30 03 02065 ; 3AC8 0A 02066 FORMCOM DB LF,'Verifying Complete, RAM good',LF 56 65 72 69 66 79 69 6E 67 20 43 6F 6D 70 6C 65 74 65 2C 20 52 41 4D 20 67 6F 6F 64 0A 3AE6 44 02067 DB 'Directory has been placed on Cylinder 1',CR 69 72 65 63 74 6F 72 79 20 68 61 73 20 62 65 65 6E 20 70 6C 61 63 65 64 20 6F 6E 20 43 79 6C 69 6E 64 65 72 20 31 0D 02068 ; 3B0E 4D 02069 VIASET$ DB 'Must install via SYSTEM (DRIVER=',CR 75 73 74 20 69 6E 73 74 61 6C 6C 20 76 69 61 20 53 59 53 54 45 4D 20 28 44 52 49 56 45 52 3D 0D 02070 ; 3B2F 0A 02071 BADRAM DB LF,'Verify Error in Bank ' 56 65 72 69 66 79 20 45 72 72 6F 72 20 69 6E 20 42 61 6E 6B 20 3B45 6E 02072 VBANK DB 'n at location X',AP 20 61 74 20 6C 6F 63 61 74 69 6F 6E 20 58 27 3B55 6E 02073 VLOC DB 'nnnn',AP,LF,CR 6E 6E 6E 27 0A 0D 02074 ; 3B5C 01 02075 TYPEDIS DB 1 ;Type of disable 3B5D 253A 02076 DISTAB DW DISABE4,DISABE3,DISABE2,DISABE1 F539 C539 9E39 3B65 00 02077 RE_USE DB 0 ;Re-use trapped driver area. 02078 ; 02079 ; Buffers Used 02080 ; 3C00 02081 ORG $<-8+1<+8 02082 ; 3C00 02083 IOBUFF DS 256 3D00 02084 BUFFER DS 256 3E00 02085 DUPDCT DS 10 02086 ; 02087 ; 3000 02089 END START 3000 is the transfer address 00000 Total errors
[Copyright 1999,2002 Frank Durda IV, All Rights Reserved. Mirroring of any material on this page in any form is expressly prohibited. The official web site for this material is: http://nemesis.lonestar.org Contact this address for use clearances: clearance at nemesis.lonestar.org Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]