LS-DOS 6.3.1 - MEMDISK Driver Assembly Listing (HTML format version)

[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]

Valid HTML 4.01!