BDOS EQU 0005H READKBD EQU 6 WRITBUFF EQU 9 WRITCHAR EQU 2 LF EQU 0AH CR EQU 0DH ACTULMAP EQU 600H ; Morrow Voodoo Gizmo.. IMAGEMAP EQU 200H ; ..memory map tables CPMBANK EQU 0 ; CP/M Bank is Bank 0 CPMTASK EQU 1 ; CP/M Task is Task 1 RAMSEG EQU 13 ; Buffer is in Segment 14 (E000H) RAMBSH EQU 3 ; Block Shift Factor (1k Blocks) KBPERBLK EQU 1.SHL.(RAMBSH-3) ; Alloc. Block size in K-bytes KBPERBNK EQU 64 ; 64K Bytes per memory bank BNKPRDSK EQU 15 ; 3 Memory banks per Ram Disk BYTPRSEG EQU 1000H ; Bytes per Memory Segment BYTPRDIR EQU 32 ; Bytes per Directory Entry BLKPRDIR EQU 2 ; Allocation Blocks per Directory BYTPRSEC EQU 128 ; CP/M Sector size ; BYTPRBLK EQU KBPERBLK*1024 ; 1K Bytes per CP/M Allocation Block BYTPRTRK EQU BYTPRSEG ; One memory segment per track SECPRTRK EQU BYTPRTRK/BYTPRSEC ; CP/M Sectors per Track KBPERTRK EQU BYTPRTRK/1024 ; K-Bytes per Track BLKPRTRK EQU BYTPRTRK/BYTPRBLK ; CP/M Allocation Blocks per Track BLKPRDSK EQU (KBPERBNK/KBPERBLK)*BNKPRDSK ; Allocation Blocks per Disk DIRPRTRK EQU BYTPRTRK/BYTPRDIR ; Directory Entries per Track DIRPRBLK EQU BYTPRBLK/BYTPRDIR ; Directory Entries per Alloc. Block TRKPRBNK EQU KBPERBNK/KBPERTRK ; Tracks per Bank TRKPRDSK EQU TRKPRBNK*BNKPRDSK ; Tracks per Disk ; RAMBUFF EQU RAMSEG*BYTPRSEG ; MEMDRV EQU 5 BIAS EQU 0E000H REALSDSK EQU (09*3)+BIAS REALSTRK EQU (10*3)+BIAS REALSSEC EQU (11*3)+BIAS REALSDMA EQU (12*3)+BIAS REALWRIT EQU (14*3)+BIAS ORG 100H ; BUFFER EQU 80H ; Use default DMA address for buffer ; ; Format Ram-Disk: FORMATIT: LD DE,FORMTQRY ; Ask user if.. LD C,WRITBUFF ; ..RAM-DISK to be.. CALL BDOS ; ..formatted READRESP: LD C,READKBD ; Read.. LD E,0FFH ; ..response.. CALL BDOS ; ..from KBD: OR A JR Z,READRESP ; Loop until response given AND 5FH ; Force to Upper-Case CP 'N' ; If "N" then.. JP Z,0 ; ..return to CCP CP 'Y' ; If NOT "Y" then.. JR NZ,FORMATIT ; ..ask again!!! DOFORMAT: ; If "Y" then format the RAM-DISK LD DE,FORMTMSG ; Advise user.. LD C,WRITBUFF ; ..of what.. CALL BDOS ; ..we're doing LD A,0E5H LD HL,BUFFER LD BC,BYTPRSEC-1 LD (HL),A LD E,L LD D,H INC DE LDIR ; LD C,MEMDRV ; Select Memory Drive CALL REALSDSK ; LD BC,BUFFER CALL REALSDMA ; LD BC,TRKPRDSK ; Set tracks per RAM-Disk (rel. 0) ; TRAKLOOP: DEC BC LD (FORMTTRK),BC ; Load Track-count LD (BUFFER+124),BC ; Plug track address into formatted record CALL REALSTRK ; Call BIOS set-track routine LD A,C ; If track is.. INC A . ..a multiple.. AND 0FH ; ..of 16, then.. JR NZ,SHOWPROG LD DE,NEWLINE ; ..force.. LD C,WRITBUFF ; ..new line.. CALL BDOS ; ..on screen SHOWPROG: LD C,WRITCHAR ; Display... LD E,'.' ; ..progress.. CALL BDOS ; ..on screen LD BC,SECPRTRK ; Set sectors per RAM-Disk track (rel. 0) ; SCTRLOOP: DEC BC LD (FORMTSEC),BC ; Load sector-count LD (BUFFER+126),BC ; Plug sector address into formatted record CALL REALSSEC ; PUSH BC CALL REALWRIT POP BC LD A,B OR C JR NZ,SCTRLOOP LD BC,(FORMTTRK) LD A,B OR C JR NZ,TRAKLOOP JP 0 ; Return to CCP ; FORMTTRK DW 0 FORMTSEC DW 0 ; VIRGNMSG DB CR,LF,'RAM-Disk implementation program starting',CR,LF,'$' NONVIRGN DB CR,LF,'RAM-Disk ALREADY implemented!!',CR,LF,'$' FORMTQRY DB CR,LF,'Do you wish to format the RAM-DISK? (Y/N): $' FORMTMSG DB CR,LF,'FORMATTING RAM-DISK!',CR,LF DB '0123456789ABCDEF' NEWLINE DB CR,LF,'$' ; DB '0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF',CR,LF,'$' ; END ORG 100H LF EQU 0AH CR EQU 0DH WRITFUNC EQU 9 READFUNC EQU 6 BDOS EQU 00005H ; Define address of BDOS entry point REALBIOS EQU 0E000H ; Define address of actual BIOS jump table MDRVBIOS EQU 0FD00H ; Relocate Dummy BIOS at FD00H ; ; Re-locate dummy BIOS above REAL BIOS LD HL,DUMYBIOS LD DE,MDRVBIOS LD BC,MOVLENTH LDIR ; ; ; Compare jump-table image to see if RAM-DISK already here!! LD IX,NONVIRGN ; Set message for "already here" situation LD HL,DUMYBIOS LD DE,REALBIOS-1 ; Set start address - 1 (increment comes first) LD BC,BIAS2 COMPLOOP: INC DE ; Bump to comparand byte LD A,(DE) ; Load it CPI ; Compare it (and bump various pointers) JR NZ,SHOSTTUS ; If unequal, then RAM-DISK already set up JP PE,COMPLOOP ; Test for end of compare ; LD IX,VIRGNMSG ; All equal, so set "virgin" message ; ; ; RAM-DISK hasn't been implemented yet, go ahead and do. NOMATCH: ; Save jump-table image for non-disk functions LD HL,REALBIOS LD DE,MDRVBIOS LD BC,BIAS2 LDIR ; ; Load alternate jump-table for RAM-DISK functions LD HL,DUMYBIOS+BIAS2 LD DE,REALBIOS LD BC,BIAS2 LDIR SHOSTTUS: ; Show status (ALREADY implemented or NOT) PUSH IX ; Move message address.. POP DE ; ..into parameter reg (DE) LD C,WRITFUNC ; Set up to write message CALL BDOS ; Do it! LD A,0E5H LD HL,BUFDIR LD (HL),A PUSH HL POP DE INC DE LD BC,BYTPRSEC-1 LDIR ; LD C,MEMDRV-'A' ; Select Memory Drive CALL REALSDSK+BIAS2 ; LD BC,BUFDIR CALL REALSDMA+BIAS2 ; LD BC,0000 ; Set track to 0 and.. LD (FORMTTRK),BC ; ..store in track-count ; TRAKLOOP: LD BC,(FORMTTRK) ; Load Track-count LD (BUFDIR+2),BC ; Plug track address into formatted record CALL REALSTRK+BIAS2 LD BC,0001 ; Set sector to 1 and.. LD (FORMTSEC),BC ; ..store in sector-count LD C,2 LD E,'.' CALL 5 ; SCTRLOOP: LD BC,(FORMTSEC) ; Load sector-count LD (BUFDIR+4),BC ; Plug sector address into formatted record CALL REALSSEC+BIAS2 ; PUSH BC CALL REALWRIT+BIAS2 POP BC INC BC LD (FORMTSEC),BC LD A,C CP SECPRTRK+1 ; Test for end-of-track JR C,SCTRLOOP ; Not yet, so format next sector ; LD BC,(FORMTTRK) INC BC LD (FORMTTRK),BC LD A,C CP TRKPRDSK ; Test for end-of-disk JR C,TRAKLOOP ; Not yet, so format next track ; JP 0 ; Return to CCP ; REALDPH DW 0 FORMTTRK DW 0 FORMTSEC DW 1