[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, Revector
00499 ;
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]