NAM RAMDISK OPT PAG PAG * RAM DISK PROGRAM FOR SK*DOS * COPYRIGHT (C) 1986, 1987 BY PETER A. STARK >>A<< * FOR STAR-K SOFTWARE SYSTEMS CORP. * VER 2.7 >>E>> FIX PROBLEM WITH BATCH FILES * VER 2.6 >>D<< MOD 5-10-88 NEW DOS ID CHECK * VER 2.5 >>C<< MOD 7-31-87 FOR 32-SECTOR TRACKS * VER 2.4 >>B<< MOD 6-17-87 TO AVOID PRINTING PERIODS * VER 2.3 >>A<< MOD 5-28-87 TO ALLOW KILLING THE RAMDISK * VER 2.2 MOD 2-16-87 TO GO WITH CACHE PROGRAM * VER 2.1 MOD 12-28-86 TO FIX PROBLEM WITH SEC VECTORS * VER 2.0 MOD 10-10-86 TO GO WITH NEW LOGICAL DRIVES * THIS PROGRAM CONSISTS OF TWO PARTS: * THE FIRST PART IS PERMANENT, AND IS LEFT * IN MEMORY TO READ AND WRITE THE RAM DISK. * IT IS DELIMITED BY RAMDSK AND REND * THE SECOND PART IS USED ONLY ON THE INITIAL * CALL, AND IS NO LONGER NEEDED AFTER THAT * SK*DOS EQUATES LIB SKEQUATE OFFINI EQU $18 OFFSET INITIALIZATION SECTRD EQU $20 SECT READ OFFSET SECTWR EQU $34 WRITE OFFSET SECCOL EQU $48 COLD START OFFSET SECWAR EQU $5C WARM START OFFSET SECCHK EQU $70 CHECK OFFSET SECFL1 EQU $84 FLAG OFFSET DRUSED EQU $13C DRIVE USED TABLE RAMFLG EQU $332 RAMDISK FLAG (52414D44 IF THERE) RAMADD EQU $336 RAMDISK BEGINNING ADDRESS CACFLG EQU $F9E CACHE FLAG (43414348 IF THERE) LASTRK EQU $33A LAST TRACK NUMBER LASECT EQU LASTRK+1 LAST SECTOR NUMBER DOSID EQU $33E DOS IDENTIFIER ORG $0000 * THE FOLLOWING RAMDSK LABEL IS NEVER CALLED, BUT USED * TO PROVIDE A BRA INSTRUCTION BEFORE THE VERSION RAMDSK BRA.S RAMDSK DUMMY - NEVER CALLED DC.W $0207 VERSION NUMBER DRIVE DC.B 255 DRIVE NUMBER VARPTR DC.L 0 POINTER TO DOS VARIABLE AREA ******************************************** *** PART 1 - THE PERMANENT PART OF RAMDISK * * ACTUAL RAM DISK PROGRAM FOLLOWS. THIS PGM IS * CALLED FROM SK*DOS ON EACH CALL TO FCS * FUNCTION 9 OR 10; ON ENTRY, A4 POINTS TO * CURRENT FCB. ******************************************** RAMRD BRA.S RAMRD1 READ A SECTOR DC.L $A55A4321 FOR TESTING WHETHER LOADED * READ RAM DISK ROUTINE RAMRD1 TST.B FCBPHY(A4) CHECK PHYSICAL DRIVE NO BMI.S READ IT'S $80, GO DO IT RTS NOT FOR RAM DISK, RETURN TO SK*DOS READ MOVEM.L D5-D7/A5-A6,-(A7) MOVE.W FCBCTR(A4),D6 GET TRACK AND SECTOR BSR.S PTSECT POINT A5 TO SECTOR IN RAM LEA FCBDAT(A4),A6 AND A6 TO FCB DATA AREA MOVE.W #15,D5 COUNTER IS 256/16 >>C<< READLO MOVE.L (A5)+,(A6)+ MOVE FOUR BYTES MOVE.L (A5)+,(A6)+ MOVE.L (A5)+,(A6)+ MOVE.L (A5)+,(A6)+ DBRA D5,READLO DECREMENT COUNTER TO USER'S FCB >>C<< MOVEM.L (A7)+,D5-D7/A5-A6 LEA 8(A7),A7 REMOVE TWO RETURN ADDR FROM STACK OR.B #$04,CCR SET ZERO FOR NO ERROR RTS AND RETURN TO CALLER * WRITE RAM DISK ROUTINE RAMWR TST.B FCBPHY(A4) CHECK PHYSICAL DRIVE NUM BMI.S WRIT IT'S $80, GO DO IT RTS NOT FOR RAM DISK, RETURN TO SK*DOS WRIT MOVEM.L D5-D7/A5-A6,-(A7) MOVE.W FCBCTR(A4),D6 GET TRACK AND SECTOR BSR.S PTSECT POINT A5 TO SECTOR IN RAM LEA FCBDAT(A4),A6 AND A6 TO FCB DATA AREA MOVE.W #15,D5 COUNTER IS 256/16 >>C<< WRITLO MOVE.L (A6)+,(A5)+ MOVE FOUR BYTES MOVE.L (A6)+,(A5)+ MOVE.L (A6)+,(A5)+ MOVE.L (A6)+,(A5)+ DBRA D5,WRITLO DECREMENT COUNTER TO USER'S FCB >>C<< MOVEM.L (A7)+,D5-D7/A5-A6 LEA 8(A7),A7 REMOVE TWO RETURN ADDR FROM STACK OR.B #$04,CCR SET ZERO FOR NO ERROR RTS AND RETURN TO CALLER ******************************************************* * PTSECT ROUTINE - POINT TO THE APPROPRIATE SECTOR IN * HIGH RAM. * ON ENTRY: D6.W CONTAINS TRACK AND SECTOR NUMBER * ON EXIT: A5 POINTS TO ITS LOCATION IN RAM ******************************************************* PTSECT MOVE.L VARPTR(PC),A6 POINT TO SK*DOS VAR AREA CLR.L D5 MOVE.W D6,D5 TRACK NUMBER INTO D5 LSR.L #8,D5 MOVE INTO LS BYTE CLR.W D7 MOVE.B LASECT(A6),D7 NUMBER OF SECTORS PER TRACK MULU D5,D7 NO OF SCTRS PRECEDING CURR TRK CLR.L D5 MOVE.B D6,D5 NUMBER OF DESIRED SECTOR ADD.L D5,D7 SECTOR NUMBER IN FILE SUB.L #1,D7 START WITH 0 LSL.L #8,D7 TIMES 256 = BYTE NUMBER MOVE.L RAMADD(A6),A5 POINT TO RAM BEGINNING LEA 0(A5,D7.L),A5 POINT TO TRACK IN RAM RTS AND EXIT ********************************************* * RAMCHK - THIS ROUTINE ALWAYS RETURNS A * CARRY CLEAR TO SHOW THIS RAMDISK IS READY * (IF PROPER DRIVE NUMBER IS SELECTED) ********************************************* RAMCHK TST.B FCBPHY(A4) CHECK PHYSICAL DRIVE NUM BMI.S RCHECK IT'S $80, GO DO IT RTS NOT FOR RAM DISK, RETURN TO SK*DOS RCHECK LEA 8(A7),A7 REMOVE TWO RETURN ADDR FROM STACK AND.B #$FE,CCR CLEAR CARRY TO SHOW IT'S OK OR.B #$04,CCR SET ZERO FOR NO ERROR RTS AND RETURN TO CALLER ********************************************** * RAMINI - RAM WARM START INITIALIZATION - * CALLS VPOINT TO GET VARIABLE POINTER. THIS * IS NECESSARY BECAUSE IT IS NOT SAFE TO CALL * VPOINT WHILE A DISK READ OR WRITE IS IN * PROGRESS, SO THIS IS DONE AT WARM START ********************************************** RAMINI DC VPOINT GET VAR POINTER INTO A6 LEA VARPTR(PC),A5 MOVE.L A6,(A5) SAVE IT LOCALLY RTS REND EQU * MARKS END OF RAM DISK PROGRAM ********************************************** *** PART 2 - THE TEMPORARY PART OF RAMDISK *** * THIS IS THE LOADER PROGRAM WHICH LOADS THE * RAMDISK ROUTINE, CHECKS WHETHER IT HAS BEEN * PREVIOUSLY CALLED, AND INITIALIZES THINGS. * IT IS NO LONGER NEEDED AFTER THAT, AND IS * OVERLAID, LEAVING ONLY THE PREVIOUS PART 1 * IN MEMORY WHEN FINISHED ********************************************** START DC PCRLF MOVE.L DOSORG(A6),A3 DOS ORIGIN MOVE.L DOSID(A6),D0 CHECK DOS IDENTIFIER CMP.L #$00045034,D0 BCS.L WRGDOS WRONG DOS IF NO MATCH >>A<< * >>A<< MOVED THREE LINES * CHECK WHETHER CALL HAD ARGUMENTS CHKARG LEA NEWFLG(PC),A0 CLR.B (A0) CLEAR NEW FLAG DC GETNXT GET NEXT CHARACTER CMP.B #$0D,D5 CR? BEQ.L HELP NO ARGUMENTS CMP.B ENDLNC(A6),D5 EOL? BEQ.L HELP NO CMP.B #$3F,D5 ? BEQ.L HELP DC TOUPPR CVT TO UPPER CASE >>A<< CMP.B #'R',D5 CHECK FOR 'REMOVE' >>A<< BEQ.L KILLIT YES >>A<< MOVE.L CACFLG(A6),D0 CHECK CACHE FLAG >>A<< CMP.L #$43414348,D0 IS IT THERE? >>A<< BEQ.L NGCACH NO GOOD IF YES >>A<< CMP.B #$4E,D5 CHECK FOR 'NEW' BNE.L NOTNEW NO DC GETNXT GET NEXT CHARACTER DC TOUPPR CVT TO UPPER CASE >>A<< CMP.B #$45,D5 BNE.L NOARGS WRONG SYNTAX DC GETNXT GET NEXT CHARACTER DC TOUPPR CVT TO UPPER CASE >>A<< CMP.B #$57,D5 BNE.L NOARGS WRONG SYNTAX DC GETNXT SKIP PAST DELIMITER * NEW: SET NEW FLAG LEA RUSMSG(PC),A4 DC PSTRNG PRINT "ARE YOU SURE" DC GETCH GET ANSWER AND.B #$DF,D5 CVT TO UPPER CASE CMP.B #$59,D5 IS IT Y BNE.L QUIT QUIT IF NOT Y LEA NEWFLG(PC),A0 MOVE.B #1,(A0) SET NEW FLAG DC GETNXT GET LOGICAL DRIVE NUMBER * NOT NEW: PROCEED NOTNEW SUB.B #$30,D5 CONVERT FROM ASCII CMP.B #10,D5 VALID DRIVE NUMBER? BCC.L NOARGS NO LEA DRIVE(PC),A0 MOVE.B D5,(A0) STORE DRIVE NUMBER MOVE.L LPOINT(A6),A5 POINT TO NEXT CHAR MOVE.B (A5),D0 GET IT CMP.B #$20,D0 IS IT SPACE? BEQ.S NOTK YES, OK CMP.B #$2C,D0 IS IT COMMA? BEQ.S NOTK YES, OK CMP.B #$0D,D0 OR CR? BEQ.S NOTK YES, OK CMP.B ENDLNC(A6),D0 OR END OF LINE? BNE.L NOARGS NO, MUST BE AN ERROR * CHECK IF PREVIOUSLY INITIALIZED; * IF SO, TREAT IT SPECIAL NOTK LEA RAMFLG(A6),A5 POINT TO RAM FLAG CMP.L #$52414D44,(A5) IF PREVIOUSLY INITIALIZED BNE.S FORMAT NO, SO GO FORMAT IT LEA EXIMSG(PC),A4 DC PSTRNG PRINT "RAM DISK WAS FORMATTED EARLIER" LEA VARPTR(PC),A0 >>E<< MOVE.L A6,(A0) SAVE VAR POINTER >>E<< LEA SECFL1(A3),A0 LOOK AT SK*DOS RAM DISK FLAGS CMP.W #$5244,(A0) IS IT "RD"? BEQ.L ALRINI IS INITIALIZED, MAYBE NEW DRIVE NO? LEA 6(A0),A0 CMP.W #$5244,(A0) BEQ.L ALRINI LEA 6(A0),A0 CMP.W #$5244,(A0) BEQ.L ALRINI BRA.L FORFIN ELSE PUT IN CODE BUT DON'T FORMAT ******************************************** * ON VALID DRIVE NUMBER, DETERMINE RAMDISK * SIZE, CALCULATE NUMBER OF TRACKS AND * SECTORS, AND THEN FORMAT IT ******************************************** FORMAT LEA NEWFLG(PC),A5 CLR.B (A5) CLEAR NEW FLAG IF NOT NEW MOVE.L LPOINT(A6),A5 GET LINE POINTER FSKPSP MOVE.B (A5)+,D7 GET NEXT CHARACTER CMP.B #$20,D7 SPACE? BEQ.S FSKPSP YES, SKIP IT CMP.B #$2C,D7 COMMA? BEQ.S FSKPSP YES, SKIP IT SUB.L #1,A5 BACKUP POINTER CLR.L D1 CLR.L D6 FDECIN MOVE.B (A5)+,D6 GET NEXT CHAR OF SIZE SUB.B #$30,D6 CVT FROM ASCII CMP.B #9,D6 CHECK IF >9 BHI.S FDEDON YES, FINISHED MULU #10,D1 MULT PREV D1 BY 10 ADD.L D6,D1 ADD NEW DIGIT BRA.S FDECIN AND REPEAT FDEDON CMP.L #8,D1 CHECK SIZE BCS.L NOARGS <8 IS NO GOOD CMP.L #1025,D1 BCC.L NOARGS >1024K ALSO NO GOOD AND.W #$FFFC,D1 BRING DOWN TO LOWER 4K LSL.L #5,D1 LSL.L #5,D1 TIMES 1K INTO D1 MOVE.L MEMEND(A6),D0 GET MEMEND SUB.L OFFINI(A3),D0 SUBTRACT OFFSET SUB.L #$4000,D0 SUBTRACT 16K SUB.L #REND-RAMDSK,D0 AND LENGTH OF RESIDENT PGM BCS.L NOTENU NOT ENOUGH MEMORY IF MINUS SUB.L D1,D0 SUBTRACT DESIRED SIZE BCS.L NOTENU NOT ENOUGH MEMORY IF MINUS ADD.L #$4000,D0 ADD BACK THE 16K * AT THIS POINT, D1 CONTAINS DESIRED RAMDISK SIZE, AND * D0 CONTAINS AMOUNT OF FREE USER MEMORY LEFT IF THIS VALUE * OF RAMDISK IS ALLOWED. ASK IF THIS IS OK. LEA TWLMSG(PC),A4 DC PSTRNG PRINT "THIS WILL LEAVE YOU.." LSR.L #5,D0 LSR.L #5,D0 DIVIDE BY 1K TO CVT TO K MOVE.L D0,D4 CLR.L D5 NO SPACES BEFORE IT DC OUT5D PRINT NUMBER OF K LEFT LEA LEFMSG(PC),A4 DC PNSTRN PRINT "LEFT ... OK?" DC GETCH GET ANSWER AND.B #$DF,D5 CVT TO UPPER CASE CMP.B #$59,D5 IS IT YES? BNE.L QUIT QUIT IF NOT YES MOVE.L MEMEND(A6),D0 GET MEMEND AGAIN SUB.L D1,D0 SUBTRACT RAMDISK SIZE ADD.L #1,D0 ADD 1 IF IT ENDS ON FF CLR.B D0 DOWN TO NEXT 256-BYTE BDRY MOVE.L D0,RAMADD(A6) STORE IN SK*DOS LSR.L #8,D1 BYTES/256=SECTORS MOVE.B #32,D4 INIT 32 SECT PER TRACK >>C<< LSR.L #5,D1 /32 = NUM OF TRACKS >>C<< MOVE.B D4,LASECT(A6) SAVE SECT PER TRACK SUB.B #1,D1 TRACKS START WITH 0 MOVE.B D1,LASTRK(A6) SAVE NUMBER OF TRACKS FORMA1 LEA FMTMSG(PC),A4 DC PSTRNG PRINT "FORMATTING DISK" LEA VARPTR(PC),A0 MOVE.L A6,(A0) SAVE VAR POINTER MOVE.W #$0002,D6 START AT TRACK 0 SECTOR 2 * MAIN FORMAT LOOP MFLOOP BSR.L PTSECT POINT TO SECTOR IN RAM MOVE.L A5,A0 MOVE.B #16,D1 256/16 = COUNTER FELOOP CLR.L (A0)+ ERASE 4 BYTES CLR.L (A0)+ CLR.L (A0)+ CLR.L (A0)+ SUB.B #1,D1 DECREMENT COUNTER BNE.S FELOOP ERASE ALL 256 BYTES ADD.B #1,D6 GO TO NEXT SECTOR CMP.B LASECT(A6),D6 CHECK IF PAST LAST SECTOR BLS.S SAVPTR GO SAVE POINTER IF NOT PAST ADD.W #$0100,D6 ELSE GO TO NEXT TRACK MOVE.B #1,D6 AND SECTOR 1 MOVE.W D6,D0 * >>B<< THREE LINES DELETED HERE LSR.W #8,D0 TRACK INTO LS BYTE CMP.B LASTRK(A6),D0 CHECK IF PAST LAST TRACK BLS.S SAVPTR GO SAVE POINTER IF NOT PAST CLR.W D6 ELSE LAST POINTER IS 00 SAVPTR MOVE.W D6,(A5) PUT POINTER INTO SECTOR BNE.S MFLOOP NON-ZERO MEANS THERE'S MORE TO DO * FINISH OFF THE DIRECTORY CLR.L D6 TRACK 0 MOVE.B LASECT(A6),D6 LAST SECTOR NUMBER BSR.L PTSECT POINT TO THE SECTOR CLR.W (A5) ERASE POINTER * NOW DO SYSTEM INFORMATION SECTOR MOVE.W #0003,D6 SECTOR 3 OF TRACK 0 BSR.L PTSECT POINT TO SECTOR IN RAM CLR.W (A5) CLEAR POINTER MOVE.L #$52414D20,16(A5) PUT IN "RAM " MOVE.L #$4449534B,20(A5) "DISK" MOVE.B #$01,29(A5) FIRST FREE TRACK/SECTOR MOVE.B #$01,30(A5) CLR.L D0 CLR.L D1 MOVE.B LASTRK(A6),D0 LAST TRACK MOVE.B LASECT(A6),D1 LAST SECTOR MOVE.B D0,31(A5) LAST FREE TRACK/SECTOR MOVE.B D1,32(A5) MOVE.B D0,38(A5) LAST TRK AND SECTOR ON DISK MOVE.B D1,39(A5) MULU D0,D1 NUMBER OF FREE SECTORS MOVE.B D1,34(A5) LSR.W #8,D1 MOVE.B D1,33(A5) STORE IT MOVE.B CMONTH(A6),35(A5) MONTH MOVE.B CDAY(A6),36(A5) DAY MOVE.B CYEAR(A6),37(A5) YEAR LEA FINMSG(PC),A4 DC PSTRNG PRINT 'FORMATTING COMPLETED' MOVE.B NEWFLG(PC),D7 CHECK IF NEW BNE.L QUIT QUIT IF ONLY DOING NEW * WHEN FORMATTED, SET FLAG AND MAX DRIVE NUMBER FORFIN MOVE.L RAMADD(A6),D0 SUB.L #1,D0 MEMEND IS JUST UNDER DISK RAM MOVE.L D0,MEMEND(A6) SET MEMEND LEA RAMFLG(A6),A1 POINT TO RAMFLAG MOVE.L #$52414D44,(A1) FLAG RAM DISK AS INITIALIZED CLR.L D0 MOVE.B DRIVE(PC),D0 GET LOGICAL DRIVE NUMBER LEA DRUSED(A3),A1 POINT TO DRIVE USED TABLE AND.L #$7F7F7F7F,(A1) NO OTHER DRIVES CAN BE RAM AND.L #$7F7F7F7F,4(A1) AND.W #$7F7F,8(A1) MOVE.B #$80,0(A1,D0.W) SET LOGICAL DRIVE TO RAMDISK CMP.B MAXDRV(A6),D0 CHECK IF GREATER BLS.S CHKMOV NO, IT'S OK AS IS MOVE.B D0,MAXDRV(A6) YES, INCREASE MAX DRIVE NUMBER * THEN CHECK WHETHER RAMDISK PROGRAM WAS ALREADY ONCE READ IN CHKMOV LEA SECTRD(A3),A1 POINT TO SCTR READ TRAP CMP.W #$4E75,(A1) IS IT STILL RTS? BEQ.S NOTINY YES, SO NOTHING READ IN YET MOVE.L 2(A1),A2 POINT TO RAMRD ENTRY? MOVE.L 2(A2),D1 POINT PAST THE BRA IN IT CMP.L #$A55A4321,D1 IS A55A... ETC THERE? BEQ.L QUIT IT'S THERE IF IT MATCHES CMP.W #$4E75,6(A1) BEQ.S NOTINY MOVE.L 8(A1),A2 MOVE.L 2(A2),D1 CHECK SECOND POINTER CMP.L #$A55A4321,D1 BEQ.L QUIT CMP.W #$4E75,12(A1) BEQ.S NOTINY MOVE.L 14(A1),A2 MOVE.L 2(A2),D1 CHECK THIRD POINTER CMP.L #$A55A4321,D1 BEQ.L QUIT * IF WE GET HERE, IT MEANS THAT RAM DISK IS FORMATTED, BUT * THE RAMDISK PROGRAM HAS NOT YET BEEN PREVIOUSLY * LOADED INTO MEMORY. IN THAT CASE SET UP THE OFFSET * POINTER SO IT CAN STAY, AND FIX THE VARIOUS SECONDARY * POINTERS TO POINT TO RAMDISK. NOTINY LEA REND(PC),A1 POINT TO END OF RESIDENT PART MOVE.L A1,D1 ADD.L #$100,D1 GO UP 256 BYTES MOVE.B #0,D1 DOWN TO 256 BOUNDARY MOVE.L D1,OFFINI(A3) AND SET OFFSET LEA SECTRD(A3),A1 POINT TO FIRST SEC POINTER MOVE.W (A1),D4 CHECK IT CMP.W #$4E75,D4 IS IT RTS? BEQ.S GOTRTS YES, GO ON LEA 6(A1),A1 POINT TO SECOND MOVE.W (A1),D4 CHECK IT CMP.W #$4E75,D4 IS IT RTS? BEQ.S GOTRTS YES, GO ON LEA 6(A1),A1 POINT TO THIRD GOTRTS MOVE.W #$4EB9,D0 JSR OP CODE MOVE.W D0,(A1) LEA RAMRD(PC),A0 MOVE.L A0,2(A1) JSR TO RAM READ MOVE.W D0,20(A1) LEA RAMWR(PC),A0 MOVE.L A0,22(A1) JSR TO RAM WRITE MOVE.L #$4E714E71,D1 MOVE.W D1,40(A1) MOVE.L D1,42(A1) NOPS TO RAM COLDSTART MOVE.W D0,60(A1) LEA RAMINI(PC),A0 MOVE.L A0,62(A1) JSR TO RAM INIT MOVE.W D0,80(A1) LEA RAMCHK(PC),A0 MOVE.L A0,82(A1) JSR TO RAM CHECK DISK MOVE.W #$5244,100(A1) "RD" IN SEC FLAG * THEN RETURN BACK TO SK*DOS QUIT DC WARMST * IF RAM DISK WAS ALREADY FORMATTED AND FLAG IS SET, * PERHAPS HE'S ASKING FOR A NEW DRIVE NUMBER * ENTER WITH A0 POINTING TO "RD" IN SEC FLAG ALRINI LEA DRUSED(A3),A0 POINT TO DRIVE TABLE MOVE.W #0,D0 START WITH LOG DRIVE 0 ALRLOO TST.B 0(A0,D0.W) CHECK NEXT ENTRY BMI.S ALRFIN FOUND OLD RAM ADD.B #1,D0 NEXT LOGICAL CMP.B #10,D0 PAST 9? BNE.S ALRLOO NO * GET HERE IF RAM DRIVE WAS DISABLED IN DRUSED TABLE LEA REIMSG(PC),A4 DC PSTRNG PRINT "REINSTALLING ..." BRA.S ALRNEW AND THEN GO PRINT NEW NUMBER * FOUND OLD RAMDISK DRIVE NUMBER IN DRUSED, NOW IN D0 ALRFIN CLR.L D1 MOVE.B DRIVE(PC),D1 NEW DRIVE NUMBER CMP.B MAXDRV(A6),D1 CHECK IF GREATER BLS.S PRTDRV NO, IT'S OK AS IS MOVE.B D1,MAXDRV(A6) YES, INCREASE MAX DRIVE NUMBER PRTDRV LEA FRMMSG(PC),A4 DC PSTRNG PRINT "CHANGING FROM DRIVE NUMBER" MOVE.B D0,D4 ADD.B #$30,D4 CHANGE OLD DRIVE TO ASCII DC PUTCH PRINT OLD DRIVE LEA DRUSED(A3),A4 MOVE.B #0,0(A4,D0.W) ERASE OLD RAMDISK ALRNEW LEA DRUSED(A3),A4 MOVE.B #$80,0(A4,D1.W) PUT NEW DRIVE INTO DRUSED LEA TOMSG(PC),A4 DC PNSTRN PRINT " TO " MOVE.L D1,D4 ADD.B #$30,D4 CHANGE NEW DRIVE TO ASCII DC PUTCH PRINT NEW DRIVE MOVE.B NEWFLG(PC),D7 CHECK IF DOING NEW BNE.L FORMA1 YES, GO FORMAT BRA.S QUIT ELSE QUIT * KILLIT ROUTINE - WANTS TO KILL ALL VESTIGES OF RAMDISK AND * RECLAIM MEMORY, IF POSSIBLE. THIS ENTIRE FOLLOWING SECTION * IS NEW AT REVISION 2.3 >>A<< KILLIT DC GETNXT GET NEXT CHARACTER DC TOUPPR CVT TO UPPER CASE >>A<< CMP.B #$45,D5 BNE.L HELP WRONG SYNTAX DC GETNXT GET NEXT CHARACTER DC TOUPPR CVT TO UPPER CASE >>A<< CMP.B #$4D,D5 BNE.L HELP WRONG SYNTAX LEA RUSMSG(PC),A4 DC PSTRNG PRINT "ARE YOU SURE" DC GETCH GET ANSWER DC TOUPPR CVT TO UPPER CASE CMP.B #$59,D5 IS IT Y BNE.L QUIT QUIT IF NOT Y LEA RAMFLG(A6),A5 POINT TO RAM FLAG CMP.L #$52414D44,(A5) IF PREVIOUSLY INITIALIZED BEQ.S KILL2 YES, SO KILL IT LEA NEXMSG(PC),A4 DC PSTRNG PRINT "RAM DISK DOESN'T EXIST" DC WARMST KILL2 MOVE.L #'NRAM',(A5) KILL THE RAM FLAG * THEN CHECK WHETHER RAMDISK PROGRAM WAS ALREADY ONCE READ IN * AND ERASE ITS A55A... FLAG IF SO LEA SECTRD(A3),A1 POINT TO SCTR READ TRAP CMP.W #$4E75,(A1) IS IT STILL RTS? BEQ.S KILL4 YES, SO NOTHING READ IN YET MOVE.L 2(A1),A2 POINT TO RAMRD ENTRY? MOVE.L 2(A2),D1 POINT PAST THE BRA IN IT CMP.L #$A55A4321,D1 IS A55A... ETC THERE? BEQ.L KILL3 IT'S THERE IF IT MATCHES CMP.W #$4E75,6(A1) BEQ.S KILL4 MOVE.L 8(A1),A2 MOVE.L 2(A2),D1 CHECK SECOND POINTER CMP.L #$A55A4321,D1 BEQ.L KILL3 CMP.W #$4E75,12(A1) BEQ.S KILL4 MOVE.L 14(A1),A2 MOVE.L 2(A2),D1 CHECK THIRD POINTER CMP.L #$A55A4321,D1 BNE.S KILL4 KILL3 MOVE.L #'NRAM',2(A2) KILL THE A55A... FLAG KILL4 MOVE.L MEMEND(A6),D7 GET CURRENT MEMEND ADD.L #1,D7 SUPPOSEDLY BEG OF RAMDISK CMP.L RAMADD(A6),D7 CHECK IF SO BEQ.S KILL5 YES, OK TO RECLAIM MEMORY LEA NREMSG(PC),A4 DC PSTRNG PRINT "CAN'T RECOVER MEMORY" DC WARMST AND QUIT KILL5 CLR.L D6 MOVE.B LASECT(A6),D5 SECT/TRACK LSL.W #8,D5 *256 = BYTES PER TRACK MOVE.B LASTRK(A6),D6 LAST TRACK ADD.W #1,D6 NUMBER OF TRACKS MULU D5,D6 CALC SIZE OF RAMDISK ADD.L D6,D7 SUB.L #1,D7 CALC NEW MEMEND MOVE.L D7,MEMEND(A6) RESTORE IT DC WARMST AND QUIT * END OF SECTION ADDED BY REV. 2.3 >>A<< * ERROR PROCESSING NOARGS LEA BSYMSG(PC),A4 DC PSTRNG PRINT 'BAD COMMAND SYNTAX' BRA.L QUIT NOTENU LEA NENMSG(PC),A4 DC PSTRNG PRINT "NOT ENOUGH MEMORY" BRA.L QUIT WRGDOS LEA WRGMSG(PC),A4 DC PSTRNG PRINT "WRONG DOS" BRA.L QUIT NGCACH LEA NGCMSG(PC),A4 DC PSTRNG PRINT "NO GOOD IF CACHE INSTALLED' BRA.L QUIT * PRINT HELP MESSAGE HELP LEA HLPMSG(PC),A4 DC PSTRNG DC WARMST * TEST STRINGS HLPMSG DC.B 'RAMDISK is used to set up an area of memory which is used as' DC.B $0D,$0A DC.B 'a virtual disk or RAM disk. The command may be used in' DC.B $0D,$0A DC.B 'several ways:' DC.B $0D,$0A DC.B ' RAMDISK ' DC.B $0D,$0A DC.B 'sets up a new RAM disk of the specified size (8K to 1 Meg).' DC.B $0D,$0A DC.B ' RAMDISK ' DC.B $0D,$0A DC.B 'changes the RAMDISK to a new drive number.' DC.B $0D,$0A DC.B ' RAMDISK NEW ' DC.B $0D,$0A DC.B 'erases the entire RAMDISK and reformats it.' >>A<< DC.B $0D,$0A DC.B ' RAMDISK REMOVE' >>A<< DC.B $0D,$0A DC.B 'removes the entire RAMDISK, deletes all traces of it,' >>A<< DC.B $0D,$0A DC.B 'and recovers its memory, if possible.' >>A<< DC.B $0D,$0A NGCMSG FCC 'RAMDISK and CACHE may be used together, but only if' DC.B $0D,$0A FCC 'RAMDISK is installed first.',4 WRGMSG FCC 'RAMDISK does not work with this version of SK*DOS.',4 TWLMSG FCC 'RAMdisk will leave ',4 LEFMSG FCC 'K of memory free - OK to format? ',4 NENMSG FCC 'The specified RAM disk size is too big for your RAM.',4 RUSMSG FCC 'Are you sure you want to erase the RAM disk? ',4 BSYMSG FCC 'Correct syntax is: RAMDISK [NEW] ' FCC ' [size in K]',4 REIMSG FCC 'Reinstalling RAMDISK drive number',4 FRMMSG FCC 'Resetting the drive number from ',4 TOMSG FCC ' to ',4 EXIMSG FCC 'Your RAM disk was formatted earlier',4 NEXMSG FCC "RAM disk doesn't exist ... can't be killed.",4 >>A<< NREMSG FCC 'RAMdisk memory cannot be recovered unless you reboot.',4 >>A<< FMTMSG FCC 'Formatting RAM disk',4 FINMSG FCC 'Formatting completed',4 FCC 'COPYRIGHT (C) 1986, 1987 BY PETER A. STARK ' >>A<< FCC 'STAR-K SOFTWARE SYSTEMS CORP.' * DATA AREA NEWFLG DC.B 0 NEW FLAG END START