120 CPM=0005 ;Location to call for CP/M 130 FDESCA=34000 ;Location we are using for the File Descriptor 140 BUFFER=34200 ;Location we are using for buffer 320 .START LD A,12 330 RST 8 340 DEFB 158 350 .MENU LD HL,MMESS1 360 CALL PRM 370 LD HL,MMESS2 380 CALL PRM 390 LD HL,MMESS3 400 CALL PRM 410 LD HL,MMESS4 420 CALL PRM 430 LD HL,MMESS5 440 CALL PRM 450 .getkey RST 8 460 DEFB 156 470 CP 49 480 CALL Z,create 490 CP 50 500 CALL Z,erase 510 CP 51 520 CALL Z,open 530 CP 52 540 CALL Z,close 550 CP 53 560 JP Z end 570 JP MENU 580 .PRM LD B,(HL) 590 INC HL 600 .PRM1 LD A,(HL) 610 RST 8 620 DEFB 158 630 INC HL 640 DEC B 650 RET Z 660 JP PRM1 670 .create CALL getnam ;WE NEED A NAME 680 CALL OPNCPM ;MUST CHECK TO SEE IF IT EXISTS FIRST 690 JR NZ FILEXI ;IF IT DOES GO TO ERROR MESSAGE 700 CALL CRECPM ;OTHERWISE CREATE IT 710 JR Z NOSPAC ;BUT IF THERE IS NO SPACE GO TO ERROR MESSAGE 720 RET ;FINISHED 730 .erase CALL getnam ;WE NEED A NAME 740 CALL ERACPM ;ERASE IT 750 RET ;FINISHED 760 .open CALL getnam ;WE NEED A NAME 770 CALL OPNCPM ;OPEN IT 780 JR Z NOFILE ;BUT GO TO ERROR IF FILE DOES NOT EXIST 790 RET ;FINISHED 800 .close CALL getnam ;WE NEED A NAME 810 CALL CLOCPM ;CLOSE IT 820 RET ;FINISHED 830 .end RET;THIS ONE RETURNS YOU TO BASIC 840 .FILEXI LD HL,ERR1 ;POINT TO ERROR MESSAGE 850 JP PRM ;JUMP TO IT BECAUSE THE PRINT A MESSAGE 860 .NOSPAC LD HL,ERR2 ; 870 JP PRM ;ROUTINE ENDS WITH A 'RET' SO IT WILL 880 .NOFILE LD HL,ERR3 ; 890 JP PRM ;GO BACK TO THE MENU ROUTINE. 900 .INVAL LD HL,ERR4 ; 910 JP PRM ;CLEVER ISN'T IT?? 920 .OPNCPM LD DE,FDESCA ;GET FILE DATA 930 LD C,15 ;FUNCTION NUMBER TO OPEN FILE 940 CALL CPM ;DO IT 950 CP 255 ;SET ZERO FLAG IF NO FILE 960 RET ;FINISHED 970 .CLOCPM LD DE,FDESCA ;GET FILE DATA 980 LD C,16 ;FUNCTION NUMBER TO CLOSE FILE 990 CALL CPM ;DO IT 1000 RET ;FINISHED 1010 .CRECPM LD DE,FDESCA ;GET FILE DATA 1020 LD C,22 ;FUNCTION NUMBER TO CREATE FILE 1030 CALL CPM ;DO IT 1040 CP 255 ;SET ZERO FLAG IF NO SPACE IN DIRECTORY 1050 RET ;FINISHED 1060 .ERACPM LD DE,FDESCA ;GET FILE DATA 1070 LD C,19 ;FUNCTION NUMBER TO ERASE FILE 1080 CALL CPM ;DO IT 1090 RET ;FINISHED 1100 .getnam LD E,12 ;CLEAR SCREEN CHARACTER, 'E' REGISTER USED IN CP/M 1110 LD C,2 ;FUNCTION NUMBER TO PRINT A CHARACTER TO THE SCREEN 1120 CALL CPM ;DO IT 1130 LD HL,PROMPT ;GET MESSAGE 1140 CALL PRM ;PRINT IT 1150 CALL CLRBUF ;CLEAR INPUT BUFFER 1160 LD DE,BUFFER ;POINT CP/M AT BUFFER 1170 LD C,10 ;FUNCTION NUMBER TO GET A LINE OF INPUT 1180 CALL CPM ;DO IT 1190 CALL CLRFDB ;CLEAR FILE DESCRIPTOR BLOCK 1200 CALL CHECK ;CHECK FOR VALID FILENAME 1210 RET ;FINISHED 1220 .CLRBUF LD HL,BUFFER ;POINT TO START OF BUFFER 1230 LD (HL),32 ;PUT A SPACE IN IT 1240 LD DE,BUFFER+1 ;POINT TO THE NEXT BUFFER POSITION 1250 LD BC,128 ;128 POSITIONS ALLTOGETHER 1260 LDIR ;SEE TEXT FOR EXPLANATION 1270 RET ;FINISHED 1280 .CLRFDB LD HL,FDESCA ;SAME 1290 LD (HL),0 ;AS 1300 LD DE,FDESCA+1 ;ABOVE 1310 LD BC,36 ;BUT 1320 LDIR ;TO 1330 RET ;FILE DESCRIPTOR BLOCK 1340 .move LD A,(HL) ;GET THE BYTE POINTED TO 1350 AND 127 ;MAKE SURE IT IS NOT GRAPHICS 1360 CP 46 ;IS IT A FULL STOP 1370 JR NZ,TRANS ;IF NOT TRANSFER TO FILE DESCRIPTOR BLOCK 1380 .PAD DEC HL ;IF IT IS MOVE BACK ONE POSITION 1390 LD A,32 ;USE A SPACE 1400 .TRANS LD (DE),A ;AND PUT IT IN THE FILE DESCRIPTOR BLOCK 1410 INC HL ;ADVANCE A BYTE (IF WE HAVE PUT IN A SPACE BECAUSE 1420 INC DE ;NEXT IN FDESCA (OF THE FULL STOP THEN ADVANCE TO 1430 DJNZ move ;SEE TEXT (IT. FILLS ALL EIGHT POSITIONS 1440 INC HL ;JUMP PAST FULL STOP 1450 RET ;FINISHED 1460 .check LD HL,BUFFER+2 ;WE DONT WANT THE FIRST TWO CHARACTERS 1470 LD DE,FDESCA ;THE FIRST CHARACTER 1480 LD A,0 ;OF THE FILE DESCRIPTOR 1490 LD (DE),A ;MUST BE ZERO 1500 INC DE ;NEXT CHARACTER 1510 .check1 LD B,8 ;EIGHT LETTERS IN FILENAME? 1520 CALL move ;MOVE EIGHT OR PAD WITH SPACES 1530 LD B,3 ;EXTENT IS THREE CHARACTERS 1540 CALL move ;MOVE THREE OR PAD WITH SPACES 1550 RET ;FINISHED 1560 .MMESS1 DEFB 20 ;MESSAGES FROM HERE ON 1570 DEFM "1 CREATE a File" 1580 DEFB 10 1590 DEFB 13 1600 .MMESS2 DEFB 19 1610 DEFM "2 ERASE a File" 1620 DEFB 10 1630 DEFB 13 1640 .MMESS3 DEFB 18 1650 DEFM "3 OPEN a File" 1660 DEFB 10 1670 DEFB 13 1680 .MMESS4 DEFB 19 1690 DEFM "4 CLOSE a File" 1700 DEFB 10 1710 DEFB 13 1720 .MMESS5 DEFB 11 1730 DEFM "5 END " 1740 DEFB 10 1750 DEFB 13 1760 .ERR1 DEFB 14 1770 DEFM "File exists " 1780 DEFB 10 1790 DEFB 13 1800 .ERR2 DEFB 11 1810 DEFM "No Space " 1820 DEFB 10 1830 DEFB 13 1840 .ERR3 DEFB 10 1850 DEFM "No File " 1860 DEFB 10 1870 DEFB 13 1880 .ERR4 DEFB 18 1890 DEFM "Invalid Filename" 1900 DEFB 10 1910 DEFB 13 1920 .PROMPT DEFB 41 1930 DEFM "Please enter a valid Filename (No Drive)" 1940 DEFB 10 1950 DEFB 13 1960 RET