DEF SFIRST,SLAST,SLOAD SCREEN MACRO BLWP @DSPTXT DATA %1 ENDM DISPLAY MACRO DATA %1*40+%2,%3,%4 ENDM SFIRST EQU $ SLOAD B @MAIN TEXT 'V1.01' EVEN LINE23 EQU 23*40 CATBUF EQU >2000 ;TEMP BUFF FOR CATALOG >2000 TO >29EC BUF512 EQU CATBUF SCNBUF EQU >2B00 ; " " " " SCNBUFL EQU 800 VDSK1 EQU >3FFA VDSK2 EQU >3FFC VDSK3 EQU >3FFE PABBUF EQU >1000 ;VDP RAM BUFFER VDP RAM PNTR EQU >8356 ;POINTER FOR PAB NAMELENGTH PAB EQU >0F80 ;PAB GOES HERE PAB3 EQU >1E50 KCODE EQU >8375 ;KSCAN RETURNS CHAR HERE STATUS EQU >837C ;GPL STATUS BYTE LOCATION GPLWS EQU >83E0 ;GPL WORKSPACE REG FAC EQU >834A ;FLOATING POINT ACCUMULATOR DSKERR EQU >8350 ;VOL. ERROR RETURNED HERE SRCST0 EQU >FA00 ;SOURCE DRIVE SECTOR 0 (BIT MAP) SRCST1 EQU >FB00 ; " " " 1 (LINK MAP) SRCST2 EQU >FC00 ; " " " X (DIRECTORY ENTRY) TMPSCT EQU >F900 ;TEMP SECTOR BUFFER DSTST0 EQU >FD00 ;DESTINATION DRIVE SECTOR 0 DSTST1 EQU >FE00 ; " " " 1 DSTST2 EQU >FF00 ; " " " X MYREG1 EQU >8300 ;HIGH SPEED WS REG MYREG2 EQU >8320 ; " " " " MYREG3 EQU >8380 MYREG4 BSS 32 ;* >83A0 LOW SPEED WS REG MYREG5 BSS 32 ; " " " " MYREG6 BSS 32 ;WS REG TBUF EQU >8340 ;10 CHAR BUFFER RDSECX DATA MYREG4,$RDSECX WRSECX DATA MYREG4,$WRSECX RDSECT DATA MYREG4,$RDSECT ;VECTOR TABLE - READ SECTOR FROM VOL. WRSECT DATA MYREG4,$WRSECT ; " " WRITE " DISP DATA MYREG4,DISENT ; " " CONVERT/SCREEN ASCII NUMBERS CLRSCN DATA MYREG2,CLSCRN ; " " CLEAR SCREEN CLREOS DATA MYREG2,CLHALF ; " " CLEAR LOWER HALF SCREEN MOVSCT DATA MYREG2,$MOVSCT ; " " MOVE SECTOR FROM VDP TO CPU MOVVDP DATA MYREG2,MOVEVD ; " " MOVE SECTOR FROM CPU TO VDP FINDHI DATA MYREG2,FINDHH ; " " FIND FREE SECTOR IN BM RANGE(32-MAX) FINDLO DATA MYREG2,FINDLL ; " " FIND FREE SECTOR IN BM RANGE(0-MAX) CLRBUF DATA MYREG2,CLRBF ; " " CLEAR SECTOR BUFFER DSPTXT DATA MYREG2,DSTEXT ; " " SCREEN TEXT ROUTINE GTSKEY DATA MYREG2,GSKEY ; " " GET SINGLE KEY FROM SCREEN LOCATION GTMKEY DATA MYREG2,GMKEY ; " " GET MULTIPLE KEY INITB DATA MYREG5,INITBB INITC DATA MYREG5,INTDSK PDATA1 DATA >1000,>1000,>5000,>0000,>0001,>1000,>9800,>8C02 DATA >00E0,>000E,>0106,>00F5,>0A0D,>2020,>2A2A,>2A44 CPNTR DATA 0 ;MOVABLE POINTER FOR CATBUF SECTOR DATA 0 ;SECTOR POINTER BUFFER SCNEND DATA 0 ;LAST BYTE IN SCREEN TABLE FILCNT DATA 0 ;NUMBER OF FILES COUNTER KEYSW DATA 0 ;FUNCTION TABLE SWITCH FOR GTSKEY SECCNT DATA >1000 ;SECTOR COUNT IF DSDD DSKCNT DATA >02D0 ;SECTOR COUNT IF SSDD BMCNT DATA 90 ;BIT MAP COUNT 80 OR 90 BLKLNK DATA 0 ;BLOCK LINK POINTER FOR DIRECTORY STRSCT DATA 0 ;START SECTOR OFFSET DATA 0 ;OFFSET POINTER DSTSTR DATA 0 ;DEST VOL. START SECTOR DSTOFF DATA 0 ;DEST VOL. SECTOR OFFSET DSTBLK DATA 0 ;DEST VOL. BLOCK LINK ADDR TEMPR0 DATA 0 ;TEMP REG 0 TEMPR1 DATA 0 ;TEMP REG 1 TEMPR2 DATA 0 ;TEMP REG 2 TEMPR3 DATA 0 ;TEMP REG 3 D08 DATA 8 ;8 USED TO CALC BIT MAP ENTRY DFMT DATA >0111 ;DEFAULT FOR INIT VARMSK DATA >8000 ;FILE MASK "VARIABLE TYPE" INTMSK DATA >0200 ;FILE MASK "INTERNAL TYPE" PRGMSK DATA >0100 ;FILE MASK "PROGRAM IMAGE" PROMSK DATA >0800 ;FILE MASK "PROTECTED FILE" KEYMSK DATA >2000 ;KEY PRESSED MASK D40 DATA >0028 ;DECIMAL 40 D400 DATA 400 ;DECIMAL 400 D20 DATA 20 ;USED TO CALCULATE NUMBER OF SCREEN PAGES D800 DATA 800 ; " " " CATBUF MOVABLE POINTER DTEN DATA 10 ; " " " IN DISP ROUTINE TD DATA 300 ;CURSOR FLASH TIME DELAY FUNCT DATA CATPRNT ;AID FCTN 7 KEYSW = "0" DATA KZLP2 ;CLEAR FCTN 4 DATA KZLP2 ;DEL FCTN 1 DATA KZLP2 ;INS FCTN 2 DATA QUIT ;QUIT FCTN = FCT8 DATA MGR ;REDO FCTN 8 DATA LSTDVC ;ERASE FCTN 3 DATA KZLP2 ;LEFT FCTN S DATA KZLP2 ;RIGHT FCTN D DATA KZLP2 ;DOWN FCTN X DATA KZLP2 ;UP FCTN E DATA KZLP2 ;PROCD FCTN 6 FCTE DATA KZLP5 ;ENTER ENTER DATA MGR ;BEGIN FCTN 5 FCT9 DATA MGR ;BACK FCTN 9 FUNCT2 DATA FLDST ;AID FCTN 7 KEYSW = "1" DATA FLDST ;CLEAR FCTN 4 DATA DELCHR ;DEL FCTN 1 DATA INSCHR ;INS FCTN 2 DATA QUIT ;QUIT FCTN = DATA CAT ;REDO FCTN 8 DATA FLDST ;ERASE FCTN 3 DATA MOVLFT ;LEFT FCTN S DATA MOVRGT ;RIGHT FCTN D DATA MOVDWN ;DOWN FCTN X DATA MOVUP ;UP FCTN E DATA EXCMSG ;PROCD FCTN 6 DATA MOVCR ;ENTER ENTER DATA MGR ;BEGIN FCTN 5 DATA CAT ;BACK FCTN 9 ONE BYTE 1 ;VAL = 1 TWO BYTE 2 ;VAL = 2 H03 BYTE 3 ;VAL = 3 TRACKS BYTE 0 CURSOR BYTE >1E ;CURSOR CHARACTER CTRLE BYTE 133 ;PAGE UP - KEY BOARD CODES CTRLX BYTE 152 ;PAGE DOWN ASCLO BYTE >20 ;LESS THAN >20 =FCTN KEY ASCHI BYTE >7F ;GREATER THAN >7F=CRTL KEY RDO BYTE 6 ;REDO CR BYTE >0D ;CARRIAGE RETURN BS BYTE >08 ;BACKSPACE BK BYTE >0F ;BACK QT BYTE >05 ;QUIT H30 BYTE >30 ;ASCII OFFSET ASC_1 BYTE >31 ;ASCII 1 ATWO BYTE >32 ;ASCII 2 ATHREE BYTE >33 ;ASCII 3 AFOUR BYTE >34 ;ASCII 4 AFIVE BYTE >35 ;ASCII 5 ASIX BYTE >36 ;ASCII 6 ASEV BYTE >37 ;ASCII 7 AEIG BYTE >38 ;ASCII 8 SRCDRV BYTE >01 ;SOURCE DRIVE BYTE DSTDRV BYTE >02 ;DESTINATION DRIVE BYTE OPDRV BYTE 1 ;OPERATION DRIVE MGRLN BYTE 4 ;LENGTH OF 1ST LOAD FILE VERIFY? BYTE 0 ;VERIFY FLAG PGCNT BYTE 0 ;SCREEN PAGE COUNTER DSPAGE BYTE 0 ;SCREEN PAGE MARKER FIELD BYTE 0 ;FIELD POINTER MODE BYTE 0 ;FLAG FOR VOL. ERRORS TBYTE1 BYTE 0 ;TEMP BYTE BUFFER TBYTE2 BYTE 0 ; " " " TPFIL BYTE 0 ;FLAG FOR TYPE/PRINT FILE ASC_U TEXT 'U' ;P FIELD YES TEXT 'Y' ASC_S BYTE 'S' ASC_K BYTE 'K' ASC_0 BYTE '0' ASC_9 BYTE '9' STAR TEXT '*' TXTPRG TEXT 'PROGRAM' ;TYPE FIELD TXTDIS TEXT 'DIS/' ; " " TXTINT TEXT 'INT/' ; " " TXTVAR TEXT 'VAR' ; " " TXTFIX TEXT 'FIX' ; " " TXTCA0 TEXT 'Vol.Name:' ; 0000000000111111111122222222223333333333 ; 0123456789012345678901234567890123456789 TXTCA1 TEXT 'Name: ##########+ Free #### Used ####' TXTCA2 TEXT 'CMD Filename Size Type/No.### P <1/1>' TXTCA3 TEXT '--- ---------- ---- ----------- - ' TXTCA4 TEXT 'Building File Directory' TXTCA5 TEXT 'CTRL-E:Page-Up CTRL-X:Page Down' TXTCA5L EQU $-TXTCA5 TXTCA5C EQU 40-TXTCA5L/2 TXTCA6 TEXT '-= F I L E U T I L I T I E S =-' TXTCA6L EQU $-TXTCA6 TXTCA6C EQU 40-TXTCA6L/2 TXTCA8 TEXT '1. Copy/Move/Delete/' TXTC8A TEXT 'Type/Print' TXTCA9 TEXT 'Prot/Unprot/Rename' TXTCAA TEXT 'Execute File Commands (Y/N)? ' TXTCAB TEXT 'Volume No.:' TXTCAC TEXT 'Vol. Name :' TXTCAD TEXT 'Free Used' TXTCAE TEXT '2. Recover File' TXTI1 TEXT '3. RUN IMAGE PROGRAM...XB VDP' TXTI2 TEXT '4. RUN IMAGE PROGRAM..E/A VDP' ;TXTCAF TEXT '5. Find file' VOLNBR BSS 6 TXTPLS TEXT '+' TXTMIN TEXT '-' TXTFD1 EQU $ ;COMMAND FIELD DEFAULTS ASC_N TEXT 'N' ;DO NOTHING ASC_C TEXT 'C' ;COPY FILE ASC_M TEXT 'M' ;MOVE FILE ASC_D TEXT 'D' ;DELETE FILE ASC_P TEXT 'P' ;PRINT FILE ASC_T TEXT 'T' ;TYPE FILE TXTFD3 TEXT 'PUTP' ;PROTECTION FIELD DEFAULTS TXTFRM TEXT 'Master' ;EXECUTE COPY MSGS TXTTO TEXT 'Backup' TXTVOL TEXT 'Volume# :' TXTSCT TEXT 'Sector ' SPACES TEXT ' ' ;40 SPACES BLANK LINE TXTIN0 TEXT 'Format Volume (Y/N)?' TXTIN0L EQU $-TXTIN0 TXTIN4 TEXT 'Verify Y/N : < >' TXTIN5 TEXT 'Not Formatted' TXTIN5L EQU $-TXTIN5 TXTIN6 TEXT 'Up Arrow Active' TXTDSK TEXT 'DSK (' TXTCM1 TEXT 'UNPROTECTING : ' TXTCM2 TEXT 'DELETE FILE : ' TXTCM3 TEXT 'RENAME FILE : ' TXTCM4 TEXT 'COPY FILE : ' TXTCM5 TEXT 'PROTECTING : ' TXTEMP TEXT 'VOLUME IS BLANK. PRESS ANY KEY.' TXTEMPL EQU $-TXTEMP TXTER1 TEXT ' V O L U M E E R R O R ' TXTER1L EQU $-TXTER1 TXTER1C EQU 40-TXTER1L/2 TXTER2 TEXT ' No Volume in Drive ' TXTER3 TEXT ' Volume Write Protected ' TXTER4 TEXT ' Volume Not Initialized ' TXTER5 TEXT ' Device Error ' TXTCMP TEXT 'COMMAND(S) COMPLETED. PRESS ANY KEY.' TXTLRG TEXT 'File too large for Backup Vol.' TXTFUL TEXT 'Backup Vol. Full. Press any Key.' TXTPRO TEXT 'DUPLICATE FILE WRITE PROTECTED.' TXTMM1 TEXT '--== C F 7 + M A N A G E R ==--' TXTMM1L EQU $-TXTMM1 TXTMM1C EQU 40-TXTMM1L/2 TXTMM2 TEXT 'Adapted from B.Caron & R.Romans''s' TXTMM2L EQU $-TXTMM2 TXTMM2C EQU 40-TXTMM2L/2 TXTMM3 TEXT 'Disk Manager 1000 3.5' TXTMM3L EQU $-TXTMM3 TXTMM3C EQU 40-TXTMM3L/2 TXTMM4 TEXT 'Select Option:' TXTMM4L EQU $-TXTMM4 TXTMM5 TEXT '1. File Utilities' TXTMM6 TEXT '2. Volume Utilities' TXTMM6L EQU $-TXTMM6 TXTMM7 TEXT '3. Misc Utilities' TXTRC1 TEXT 'Recover File on Volume:' TXTRC1L EQU $-TXTRC1 TXTRC2 TEXT 'Enter Name of File:' TXTRC3 TEXT 'SEARCHING VOLUME' TXTRC3L EQU $-TXTRC3 TXTRC3C EQU 40-TXTRC3L/2 TXTRC4 TEXT 'FILE NOT FOUND ' TXTRC4L EQU $-TXTRC4 TXTRC5 TEXT 'FILE RECOVERED ' TXTRC5L EQU $-TXTRC5 TXTRC6 TEXT 'FILE HAS BEEN OVER WRITTEN' TXTRC7 TEXT 'RE-BUILDING LOST FILE' TXTDS1 TEXT '-= V O L U M E U T I L I T I E S =-' TXTDS1L EQU $-TXTDS1 TXTDS1C EQU 40-TXTDS1L/2 TXTDS2 TEXT '1. Catalog 4. Rename' TXTDS2L EQU $-TXTDS2 TXTDS3 TEXT '2. Backup 5. Format' TXTDS3L EQU $-TXTDS3 TXTDS4 TEXT '3. Erase 6. List' TXTDS4L EQU $-TXTDS4 TXTDS3A TEXT 'Backup Volume' TXTDS3AL EQU $-TXTDS3A TXTDS3AC EQU 40-TXTDS3AL/2 TXTRE1 TEXT 'New Vol. Name :' TXTRE1L EQU $-TXTRE1 TXTCD1 TEXT 'Read Errors' TXTCD2 TEXT 'Write Errors' TXTCD3 TEXT 'PRESS ANY KEY TO CONTINUE.' TXTCD3L EQU $-TXTCD3 TXTCD3C EQU 40-TXTCD3L/2 TXTCD4 TEXT 'EOF' TXTCD5 TEXT 'Format another (Y/N)?' TXTCD5L EQU $-TXTCD5 TXTCD5C EQU 40-TXTCD5L/2 TXTCT1 TEXT 'CATALOG VOLUME' TXTCT1L EQU $-TXTCT1 TXTCT1C EQU 40-TXTCT1L/2 TXTSWP TEXT 'Erase Vol. (Y/N)?' TXTBX1 TEXT 'Select Next Vol.. Press ENTER.' TXTBX2 TEXT ' Initializing Next Vol. ' TXTMS1 TEXT '1. Install Vol. Protection' TXTMS2 TEXT '2. Remove Vol. Protection' TXTMS3 TEXT '3. Remove XB Protection' TXTMS4 TEXT '1. Backup using bit-map ' TXTMS4L EQU $-TXTMS4 TXTMS5 TEXT '2. Backup sector-by-sector' TXTMS5L EQU $-TXTMS5 TXTMSB TEXT '4. Change Foregnd Color' TXTMSC TEXT '5. Change Backgnd color' TXTMSD TEXT '6. CF Info/geometry' TXTMS6 TEXT '-= M I S C U T I L I T I E S =-' TXTMS6L EQU $-TXTMS6 TXTMS6C EQU 40-TXTMS6L/2 TXTMS7 TEXT 'XB Program on drive :' TXTMS8 TEXT 'Enter XB Program name:' TXTMS9 TEXT 'Program is Unprotected' TXTMSA TEXT 'Not in Program Format' TXTDSA EQU TXTMS4+3 TXTDSAL EQU TXTMS4L-3 TXTDSB EQU TXTMS5+3 TXTDSBL EQU TXTMS5-3 TXTDS6 TEXT 'WARNING: Backup Vol. will be erased.' TXTDS6L EQU $-TXTDS6 TXTTFC TEXT 'Total Files to Copy:' TXTTSC TEXT 'Total Size of Files:' TXTMGR TEXT 'MGR1 ' ;1ST FILENAME OF DM1000 PROGRAM TXTPP1 TEXT 'Enter List Device :' TXTPP2 TEXT 'Send Control Codes (Y/N):' TXTPP3 TEXT 'Enter Control Codes: Ex. 27 83 01 *' TXTPP4 TEXT 'Save to Vol. (Y/N):' TXTPP6 TEXT 'Press ENTER.' TXTPP6L EQU $-TXTPP6 TXTPP6C EQU 40-TXTPP6L/2 TXTABT TEXT 'USER HALTED I/O ' TXTCP1 TEXT ' CHECKING FORMAT ' TXTCP2 TEXT 'INITIALIZING VOL.' TXTCC TEXT 'COPY' TXTMM TEXT 'MOVE' TXTD TEXT 'DELETE' EVEN QUIT CLR @STATUS ;CLEAR STATUS BYTE LIMI 2 LWPI GPLWS B @>0000 ;EXIT PROGRAM ;---------------------------------------------------------------------- ; ; FILE UTILITIES ; ;---------------------------------------------------------------------- CAT LWPI MYREG1 BLWP @CLRSCN LI R0,CAT MOV R0,@FCT8 ;REDO=CAT MOV R0,@CKT8 ;REDO=CAT LI R0,FILE MOV R0,@FCT9 ;BACK=FILE MOV R0,@CKT9 ;BACK=FILE CLR @DSTBLK ;FLAG=0 CALLED FROM FILE UTILITY SCREEN 6 DISPLAY 1,TXTCA6C,TXTCA6,TXTCA6L ;'File Utilities' DISPLAY 5,8,TXTCA8,30 ;'Copy/Move/Delete/Type/Print' DISPLAY 6,11,TXTCA9,18 ;'Prot/Unprot/Rename' DISPLAY 13,3,TXTVOL,9 ;'Volume #:' DISPLAY 14,3,TXTCA0,9 ;'Vol.name:' DISPLAY 15,3,TXTCAD,14 ;'Free Used' FILE10 BL @GETVOL ;GET VOLUME# DATA 40*13+13,VDSK1,FILE10 LI R1,>0100 MOVB R1,@SRCDRV ;SET DRIVE NO. MOVB R1,@OPDRV ;SET OPERATION DRIVE CLR @SECTOR ;SECTOR=0 BLWP @RDSECX ;GET VIB FROM VOLUME BLWP @MOVSCT ;MOVE SECTOR TO CPU RAM DATA SRCST0 ;SOURCE SECTOR 0 SCREEN 1 ;DISPLAY VOLUME NAME DISPLAY 14,13,SRCST0,10 BL @CALCBM ;CALC BIT MAP DATA SRCST0 ;BUFFER ADDR FILE20 MOV @TEMPR1,R0 ;SCREEN FREE SECTORS BLWP @DISP DATA 15*40+11 MOV @TEMPR2,R0 ;SCREEN USED SECTORS BLWP @DISP DATA 15*40+21 LI R0,14*40+13 ;SAVE VOL.NAME LI R1,TXTCA1+8 LI R2,10 BLWP @VMBR LI R0,15*40+3 ;SAVE FREE/USED LI R1,TXTCA1+21 LI R2,19 BLWP @VMBR CB @SRCST0+>10,@TXTFD3 ;IS VOL. PROTECTED JNE FILE30 MOVB @TXTPLS,@TXTCA1+18 JMP FILE40 FILE30 MOVB @TXTMIN,@TXTCA1+18 FILE40 SCREEN 1 DISPLAY 17,3,TXTCA4,23 ;'Building File Directory' INC @SECTOR ;SECTOR=1 * GET LINK MAP BLWP @RDSECX ;GET SECTOR BLWP @MOVSCT DATA SRCST1 ; ; CATBUF FORMAT - 20 bytes per directory entry ; ; name lm ff size rc r# ; ----------------------------------- ; |00-09|10-11|12|13|14-15|16|17|18|19| ; ----------------------------------- ; LI R6,SRCST1 ;LINK MAP ADDR LI R1,CATBUF ;CATALOG BUFFER ADDR LI R2,20 CLR R7 ;FILE COUNTER FILE50 MOV *R6+,R3 ;GET LM POINTER AND LOOP HERE JEQ FILE60 ;..DIRECTORY IS FINISHED INC R7 ;INC FILE COUNTER MOV R3,@SECTOR ;GET DIRECTORY ENTRY BLWP @RDSECX LI R0,PABBUF BLWP @VMBR ;GET 20 BYTES OF DIRECTORY INFO MOV R3,@10(R1) ;PUT LM BYTE IN CATBUF A R2,R1 JMP FILE50 FILE60 MOV R7,@FILCNT ;SAVE FILE COUNT MOV R7,R8 ;R7=FILE COUNT..CALC NUMBER OF SCREEN PAGES JNE FILE70 ;IF R7=0 THEN VOL. IS EMPTY SCREEN 1 DISPLAY 17,3,TXTEMP,TXTEMPL ;'VOLUME IS BLANK. PRESS ANY KEY.' B @TPLP1 FILE70 LI R1,TXTCA2+28 ;CLEAR OUT TYPE/NO. FIELD LI R0,SPACES LI R2,3 FILE80 MOVB *R0,*R1+ DEC R2 JNE FILE80 LI R1,TXTCA2+30 ;SHOW # OF FILES BL @ITO4A MOV R7,R5 CLR R4 ;20 FILES/PAGE MAX DIV @D20,R4 ;R4=QUOTIENT R5=REMAINDER MOV R5,R5 ;ANY REMAINDER JEQ FILE90 ;NO..PAGE COUNT=R4 INC R4 ;YES..USE INT(R4) FILE90 SLA R4,8 ;LSB TO MSB MOVB R4,@PGCNT ;SAVE PAGE COUNT FILE100 LI R0,SCNBUF ;SCN BUF ADDR SRL R4,8 ;NUMBER OF PAGES TO CLEAR LI R2,>2000 ;SPC FILE110 LI R1,20 ;20 LINES TO CLEAR FILE120 LI R3,40 ;CHAR PER LINE FILE130 MOVB R2,*R0+ ;CLEAR BUF DEC R3 ;LINE CLEARED? JNE FILE130 ;NO.. LOOP DEC R1 ;DEC LINE COUNTER JNE FILE120 ;LOOP IF NOT FINISHED DEC R4 ;DEC PAGE COUNT JNE FILE110 ;LOOP SETDIS MOV R7,R6 ;# OF LINES LI R4,CATBUF LI R5,SCNBUF SETAGN MOVB @ASC_N,@1(R5) ;PUT N IN CMD FIELD AI R5,4 ;MOVE TO FILENAME FIELD LI R3,10 ;MOVE FILENAME TO FIELD FNLP1 MOVB *R4+,*R5+ DEC R3 JNE FNLP1 AI R5,4 ;MOVE TO SIZE FIELD MOV @4(R4),R8 ;GET SIZE BYTE INC R8 ;BYTE +1 MOV R5,R1 ;GET ADDR BL @ITO4A INCT R5 ;MOVE TO TYPE FIELD MOVB @2(R4),R0 ;GET FILE FLAG CZC @PRGMSK,R0 ;IS FILE "PROGRAM IMAGE" ? JEQ FILTYP ;NO..THEN ITS A FILETYPE LI R1,TXTPRG ;SCREEN "PROGRAM" LI R2,7 ;7 BYTES PITXT MOVB *R1+,*R5+ DEC R2 JNE PITXT AI R5,5 ;POINT TO PROTECT FIELD JMP PROCHK ;SCREEN PFIELD FILTYP CZC @INTMSK,R0 ;IS FILE "INTERNAL" ? JEQ DISTYP ;NO..THEN ITS SCREEN TYPE LI R1,TXTINT ;SCREEN "INT/" JMP TYPOK DISTYP LI R1,TXTDIS ;SCREEN "DIS/" TYPOK LI R2,4 ;4 BYTES TPLPX MOVB *R1+,*R5+ DEC R2 JNE TPLPX CZC @VARMSK,R0 ;IS FILE "VARIABLE" ? JEQ FIXTYP ;NO..THEN ITS FIXED TYPE LI R1,TXTVAR ;SCREEN "VAR" JMP TYPEND FIXTYP LI R1,TXTFIX ;SCREEN "FIX" TYPEND LI R2,3 ;3 BYTES TYLP1 MOVB *R1+,*R5+ DEC R2 JNE TYLP1 AI R5,3 ;MOVE TO RECORD SIZE MOVB @7(R4),R8 ;GET RECORD SIZE BYTE SRL R8,8 MOV R5,R1 BL @ITO4A INCT R5 ;MOVE TO PROTECT FIELD PROCHK CZC @PROMSK,R0 ;IS PROTECT BIT SET.. JEQ PUTAU ;NO..PUT A U MOVB @ASC_P,*R5 ;SAVE A "P" TO PFIELD IN CATBUF JMP SETNXT ;LOOP TO NEXT DIRECTORY PUTAU MOVB @ASC_U,*R5 ;SAVE A "U" TO PFIELD IN CATBUF SETNXT AI R5,8 ;GOTO NEXT LINE 1ST COLUMN AI R4,10 ; " " CATBUF DEC R7 ;DEC LINE COUNTER JNE SETAGN DEC R5 ;BACK UP 1 POSITION MOV R5,@SCNEND ;SAVE LAST ADDR MOV @DSTBLK,@DSTBLK ;CALLED FROM FILES OR VOL.?? JEQ SHWDIS ;FILES.. B @CATALOG2 ;VOLUME.. SHWDIS BLWP @CLRSCN LI R3,3 ;PRINT 3 LINES LI R2,40 ;40 CHAR/LINE LI R1,TXTCA1 ;'Vol.name: Free Used' CLR R0 ;SCREEN WRITE ADDR STLP1 BLWP @VMBW ;LOOP HERE A R2,R0 ;SCRN LOC+40 A R2,R1 ;NEXT LINE OF TEXT DEC R3 JNE STLP1 ;LOOP IF NOT FINISHED LI R0,78 ;SCREEN ADDR MOVB @PGCNT,R1 ;GET PAGE COUNT AI R1,>3000 ;ADD ASCII OFFSET >30 BLWP @VSBW ;WRITE PAGE NUMBER TO SCREEN MOVB @ONE,@DSPAGE ;SCREEN PAGE 1 CLR @CPYSCT CLR @CPYFIL SHOWPG BL @DSPGS ;SHOW PAGE BL @SHOWS ;SCREEN SIZE TO COPY/MOVE/DELETE KEYPRS CLR R7 ;SCNBUF OFFSET INC R7 ;POINT TO 1ST CHAR 1ST FIELD MOVB @ONE,@FIELD ;FIELD=1 FLDST SETO @KEYSW BL @CALCS ;CALC SCREEN ADDR BLWP @GTSKEY MOVB @FIELD,R4 ;CALC JUMP SRL R4,7 ;LSB TO MSB * 2 DECT R4 CB R1,@ASCHI ;CTRL KEY PRESSED? JH CTLJMP ;YES... CB R1,@ASCLO ;FCTN KEY PRESSED? JLT FTNJMP ;YES... B @CKFJMP(R4) ;VERIFY KEYS FOR DIFFERENT FIELDS CKFJMP JMP CKFLD1 JMP CKFLD2 JMP CKFLD3 CTLJMP B @CTLKEY ;JUMP POINTS TO EXTEND RANGE FTNJMP B @FTNKEY CKFLD1 CB R1,@SCNBUF(R7) ;DID IT CHANGE JEQ KEYOK ;NO BL @SIZEF ;GET SIZE OF FILE MOVB @SCNBUF(R7),R5 ;GET OLD CHARACTER FOR FIELD 1 LI R2,TXTFD1 ;'NCMD' CMD FIELD DEFAULTS CB R1,*R2+ ;N JEQ KEYN CB R1,*R2+ ;C COPY FILE JEQ KEYC CB R1,*R2+ ;M MOVE FILE JEQ KEYM CB R1,*R2+ ;D DELETE FILE JEQ KEYD CB R1,*R2+ ;P PRINT FILE JEQ KEYP CB R1,*R2+ ;T TYPE FILE JEQ KEYT JMP FLDST ;NO KEYT LI R0,RFIL ;ADJUST FCTN KEYS MOV R0,@FCT8 MOV R0,@CKT8 LI R0,CAT MOV R0,@FCT9 MOV R0,@CKT9 MOVB @D40,@TPFIL ;SET FLAG TO SHOW IT IS TYPE FILE B @TFIL KEYP LI R0,CAT ;ADJUST FCTN KEYS MOV R0,@FCT8 MOV R0,@CKT8 MOV R0,@FCT9 MOV R0,@CKT9 MOVB @ASC_1,@TPFIL B @TFIL KEYN CB R5,@ASC_D JEQ DELD ;WAS D CB R5,@ASC_C JEQ DELS ;WAS C S R3,@CPYSCT ;WAS M DELD S R3,@CPYFIL JMP ABC KEYC CB R5,@ASC_N JEQ ADDS S R3,@CPYFIL ;WAS D OR M CB R5,@ASC_M JEQ ABC ;WAS M ADDS A R3,@CPYSCT ;WAS N JMP ABC KEYM CB R5,@ASC_C JEQ ADDD ;WAS C CB R5,@ASC_D JEQ ADDS ;WAS D A R3,@CPYFIL ;WAS N JMP ADDS DELS S R3,@CPYSCT JMP ABC KEYD CB R5,@ASC_N JEQ ADDD ;WAS N CB R5,@ASC_M JEQ DELS ;WAS M S R3,@CPYSCT ;WAS C ADDD A R3,@CPYFIL ABC BL @SHOWS JMP KEYOK CKFLD3 LI R2,TXTFD3 ;'PUTP' PROTECT FIELD DEFAULTS CKFST LI R3,4 CKLP1 CB R1,*R2+ ;CHECK FOR VALID CHAR JEQ KEYOK ;YES.. DEC R3 JNE CKLP1 JFL B @FLDST ;NO... CKFLD2 LI R2,>202E ;SPACE & PERIOD CHAR CB R1,R2 ;IS CHAR SPACE JEQ JFL ;YES..NO BKP120 SWPB R2 CB R1,R2 ;IS CHAR PERIOD JEQ JFL ;YES..NO BKP120 KEYOK MOVB R1,@SCNBUF(R7) ;SAVE CHAR IN CPU B @KYJMP(R4) KYJMP EQU $ JMP KYFLD1 ;FIELD 1 MOVE DOWN JMP KYFLD2 ; 2 MOVE RIGHT JMP KYFLD1 ; 3 MOVE DOWN KYFLD1 B @MOVDWN ;MOVE CURSOR DOWN KYFLD2 B @MOVRGT ; " " RIGHT ;---------------------------------------------------------------------- ; GET SIZE OFFSET ; LOC OF SIZE = CATBUF + 20*INT(R7/40)+14 ; INPUT R7 = SCNBUF OFFSET ; OUTPUT R3 = SIZE OF FILE +1(FOR HEADER) ; ; DESTROYED R5,R6,R0,R2 ;---------------------------------------------------------------------- SIZEF LI R2,14 MOV R7,R6 CLR R5 DIV @D40,R5 ;INT(R7/40) IS IN R5 MPY @D20,R5 ;20*INT(R7/40) A R6,R2 MOV @CATBUF(R2),R3 INC R3 RT ;---------------------------------------------------------------------- ; ; -- A T O I -- ; ;---------------------------------------------------------------------- ATOI MOV *R11+,R1 ; TEXT POINTER MOV *R11+,R2 ; TEXT LENGTH CLR R0 ; R0 = RESULT ATOI10 CLR R3 MOVB *R1+,R3 JEQ ATOI90 CI R3,>2000 JEQ ATOI90 CI R3,>3000 JL ATOI97 CI R3,>3900 JH ATOI97 ANDI R3,>0F00 SWPB R3 MOV R0,R4 LI R5,10 MPY R5,R4 A R5,R3 MOV R3,R0 DEC R2 JNE ATOI10 ATOI90 INCT R11 RT ATOI97 MOV *R11+,R11 RT ;---------------------------------------------------------------------- ; ; -- G E T V O L -- ; ; SET VIRTUAL DISK ; ;---------------------------------------------------------------------- GETVOL MOV *R11+,@GTVOL20 MOV *R11+,@GTVOL40+2 MOV *R11+,@GTVOL30+4 MOV R11,@GTVOL99+2 GTVOL10 CLR @VOLNBR CLR @VOLNBR+2 CLR @VOLNBR+4 BLWP @GTMKEY ;GET VOLUME NUMBER GTVOL20 DATA 13*40+13,VOLNBR,5,' ' BL @ATOI GTVOL30 DATA VOLNBR,5,0 MOV R0,R0 JEQ GTVOL10 C R0,@VOLMAX JH GTVOL10 MOV @GTVOL40+2,R2 AI R2,-VDSK1 MOV R0,@SRCVOL(R2) MOV R0,R1 GTVOL40 LI R0,>FFFF ;VIRTUAL DSK1 BLWP @VSBW SWPB R1 MOVB R1,@VDPWD GTVOL99 B @0 SRCVOL DATA 0 DSTVOL DATA 0 ;---------------------------------------------------------------------- ; CALC BIT MAP ;---------------------------------------------------------------------- CALCBM MOV *R11+,@CALCBM40 MOV @CALCBM40,R2 ;GET BUFFER ADDR MOV R2,@CALCBM50 LI R12,1600 ;NUMB OF SECTORS ON VOLUME (ALWAYS 1600) MOV R12,R14 SRL R12,3 ;SECTORS/8 = N BYTES LI R4,>8000 ;HIGH BIT MASK CLR R13 ;USED SECTOR COUNTER AI R2,56 ;START ADDR OF BIT MAP CALCBM10 LI R1,8 ;8 BITS TO CHECK MOVB *R2+,R0 ;GET BYTE TO TEST CALCBM20 CZC R4,R0 ;TEST BIT JEQ CALCBM30 ;IF BIT=0 THEN SHIFT INC R13 ;BIT=1 SECTOR IS USED CALCBM30 SLA R0,1 ; SHIFT BIT LEFT DEC R1 ; DEC SHIFT COUNTER JNE CALCBM20 ; LOOP IF NOT 0 DEC R12 ;DEC BYTE COUNT JNE CALCBM10 ;LOOP IF NOT 0 S R13,R14 ;TOTAL-USED=FREE MOV R14,@TEMPR1 ;VAL FREE SECTORS MOV R13,@TEMPR2 ;VAL USED SECTORS RT CALCBM40 DATA 0 CALCBM50 DATA 0 ;---------------------------------------------------------------------- ; ; SHOW TOTAL FILES TO COPY/MOVE/DELETE ; ;---------------------------------------------------------------------- SHOWS MOV @CPYSCT,R0 ;SHOW TOTAL SIZE TO COPY OR MOVE BLWP @DISP DATA 238 MOV @CPYFIL,R0 ;SHOW TOTAL SIZE TO DELETE BLWP @DISP DATA 398 SCREEN 3 DISPLAY 3,35,TXTCC,4 ;'COPY' DISPLAY 4,35,TXTMM,4 ;'MOVE' DISPLAY 8,34,TXTD,6 ;'DELETE' RT ;---------------------------------------------------------------------- ; ; -- C A L C S -- ; ; Calculate Screen addr ; INPUT R7=SCNBUF OFFSET ; OUTPUT R0=VDP SCREEN ADDR ; R1=CHAR IN MSB ; DESTROYED R5,R6 ; ;---------------------------------------------------------------------- CALCS MOV R7,R0 ;SCNBUF OFFSET CLR R5 MOVB @DSPAGE,R5 ;GET PAGE # SRL R5,8 DEC R5 MPY @D800,R5 S R6,R0 ;SUB CPU OFFSET AI R0,120 ;ADD 3 LINE OFFSET MOVB @SCNBUF(R7),R1 RT ;---------------------------------------------------------------------- ; ; MOVE DOWN, UP, RIGHT, LEFT ; ;---------------------------------------------------------------------- MOVDWN LI R0,SCNBUF ;START ADDR A R7,R0 ;ADD OFFSET AI R0,40 ;ADD 40 (MOVE DOWN) C R0,@SCNEND ;ARE WE PAST END JGT EXCJMP ;YES..DON'T MOVE BL @CALCS ;GET SCN ADDR AI R0,40 ;ADD 40 CI R0,920 ;ARE WE OVER JGT EXCJMP ;YES..DON'T MOVE AI R7,40 ;MOVE DOWN DWNRTN B @FLDST ;RTN EXCJMP B @EXCMSG ;JUMP OFF POINT MOVUP BL @CALCS ;GET SCN ADDR AI R0,-40 ;SUB 40 CI R0,120 ;ARE WE OVER JLT UPRTN ;YES..DON'T MOVE AI R7,-40 UPRTN B @FLDST ;RTN MOVRGT B @RGTJMP(R4) RGTJMP EQU $ JMP RGTFL1 ;FIELD 1 JMP RGTFL2 ; 2 JMP RGTFL3 ; 3 RGTFL1 AI R7,3 ;MOVE FROM FIELD 1 TO FIELD 2 AB @ONE,@FIELD ;ADJUST FEILD POINTER CLR R8 ;CLEAR CHAR COUNTER JMP RGTRTN RGTFL3 AI R7,-31 ;MOVE FROM FIELD 3 TO FIELD 1 MOVB @ONE,@FIELD ;ADJUST FIELD POINTER JMP RGTRTN RGTFL2 INC R7 ;MOVE RIGHT 1 CHAR INC R8 ;INC CHAR COUNTER CI R8,10 JNE RGTRTN ;NO.. MVRGT AI R7,18 ;YES..MOVE TO FIELD 3 AB @ONE,@FIELD ;ADJUST POINTER RGTRTN B @FLDST ;RETURN MOVLFT B @LFTJMP(R4) LFTJMP EQU $ JMP LFTFL1 ;FIELD 1 LEFT JMP LFTFL2 ; " 2 " JMP LFTFL3 ; " 3 " LFTFL1 AI R7,31 ;MOVE FROM FIELD 1 TO FIELD 3 AB @TWO,@FIELD ;ADJUST FIELD POINTER JMP LFTRTN LFTFL3 AI R7,-19 ;MOVE FROM FIELD 3 TO FIELD 2 MOVB @TWO,@FIELD ;ADJUST POINTER LI R8,9 ;SET CHAR POINTER JMP LFTRTN LFTFL2 MOV R8,R8 ;IF R8=0 THEN GOTO FIELD 1 JEQ MVFL1 AI R7,-1 ;MOVE LEFT 1 DEC R8 ;DEC CHAR COUNTER JMP LFTRTN ;IF NOT=0 THEN STAY IN FIELD 2 MVFL1 AI R7,-3 ;MOVE FROM FIELD 2 TO FIELD 1 MOVB @ONE,@FIELD ;ADJUST FIELD POINTER LFTRTN B @FLDST ;RTN CTLKEY CB R1,@CTRLX ;NEXT PAGE? JEQ PGDWN CB R1,@CTRLE ;PREVIOUS PAGE? JEQ PGUP FLDBR B @FLDST ;BRANCH TO FLDST FOR JUMPS PGDWN AB @ONE,@DSPAGE ;SHOW NEXT PAGE CB @DSPAGE,@PGCNT ;IS THERE REALLY A NEXT PAGE ? JLT SHOWOK ;YES..THEN SHOW IT JEQ SHOWOK ; " " " " SB @ONE,@DSPAGE ;NO..ADJUST PAGE POINTER AND RETURN JMP FLDBR PGUP SB @ONE,@DSPAGE ;SHOW PREVIOUS PAGE CB @DSPAGE,@ONE ;IS THERE REALLY A PREVIOUS PAGE ? JEQ SHOWOK ;YES..SHOW PAGE JGT SHOWOK ; " .. " " AB @ONE,@DSPAGE ;NO..ADJUST POINTER AND RETURN JMP FLDBR SHOWOK CLR R5 ;CALC NEW CURSOR POSITION MOVB @DSPAGE,R5 SRL R5,8 DEC R5 MPY @D800,R5 MOV R6,R7 ;POINT TO NEW TOP OF PAGE INC R7 ;POINT TO 1ST CHAR BL @DSPGS ;SHOW PAGE MOVB @ONE,@FIELD JMP FLDBR ;RTN FTNKEY SRL R1,7 ;CALC INDEX FOR FUNCTION KEY TABLE DECT R1 MOV @FUNCT2(R1),R1 B *R1 MOVCR B @CRJMP(R4) CRJMP EQU $ JMP CRFL1 ;FIELD 1 MOVDWN JMP CRFL2 ; 2 ADJUST JMP CRFL1 ; 3 MOVDWN CRFL1 B @MOVDWN CRFL2 S R8,R7 ;ADJUST CHAR POINTER CLR R8 ;CLEAR BYTE JMP CRFL1 DELCHR CB @TWO,@FIELD ;ONLY ACTIVE IN FIELD 2 JNE FLDBR2 LI R2,10 ;MAX CHAR 10 S R8,R2 ;SUB INDEX OFFSET BL @CALCS ;GET SCREEN ADDR INC R0 LI R1,SCNBUF A R7,R1 BLWP @VMBR ;GET CHAR RIGHT OF CURSOR DEC R0 BLWP @VMBW ;MOVE THEM LEFT 1 POSITION FLDBR2 BLWP @VSBR ;GET CHAR B @FLDST ;RTN INSCHR CB @TWO,@FIELD ;ONLY ACTIVE IN FIELD 2 JNE FLDBR2 LI R2,9 S R8,R2 BL @CALCS LI R1,SCNBUF A R7,R1 INC R1 BLWP @VMBR MOVB @ASCLO,@SCNBUF(R7) DEC R1 INC R2 BLWP @VMBW JMP FLDBR2 ;RTN CPYFIL DATA 0 ;TOTAL FILES TO COPY CPYSCT DATA 0 ;TOTAL SIZE OF FILES ;---------------------------------------------------------------------- ; ; EXECUTE COMMANDS ; ;---------------------------------------------------------------------- EXCMSG CLR @KEYSW SCREEN 1 DISPLAY 23,3,TXTCAA,32 ;"Execute Commands (Y/N) ?" LI R0,23*40+32 MOVB @ASC_N,R1 BLWP @GTSKEY CB @YES,R1 JEQ EXCCMD BL @DSRTN ;"Turn page with CTRL E-CTRL X" B @FLDST EXCCMD BLWP @CLRSCN CLR R7 ;SIZE COUNTER CLR R6 ;FILE COUNTER LI R4,CATBUF+14 LI R3,SCNBUF+1 ;START OF SCREEN BUF LI R2,>434D ;TEXT "C" AND "M" CMDLP1 CB *R3,R2 ;IS CMD=C JEQ CPCHK SWPB R2 CB *R3,R2 ;IS CMD=M JEQ CPCHK CMDLP2 AI R3,40 ;MOV DWN AI R4,20 C @SCNEND,R3 JGT CMDLP1 MOV R6,@CPYFIL ;SAVE FILE TOTAL MOV R7,@CPYSCT ; SIZE TOTAL JNE CPYSET JMP NOCOPY CPCHK INC R6 ;INC FILE COUNTER MOV *R4,R5 ;GET SIZE A R5,R7 ;INC SIZE INC R7 ;ADD 1 FOR DIRECTORY ENTRY JMP CMDLP2 NOCOPY SCREEN 4 DISPLAY 12,3,TXTFRM,6 ;'MASTER' DISPLAY 13,3,TXTVOL,9 ;'Volume #:' DISPLAY 14,3,TXTCA1,20 DISPLAY 15,3,TXTCA1+21,19 MOV @SRCVOL,R0 BLWP @DISP DATA 13*40+13 B @XXXCMD ;EXECUTE COMMANDS BYPASS VOL. INITIALIZATION ;---------------------------------------------------------------------- CPYSET BLWP @CLRSCN SCREEN 9 DISPLAY 1,TXTCA6C,TXTCA6,TXTCA6L ;'File Utilities' DISPLAY 6,3,TXTFRM,6 ;'Master Vol.' DISPLAY 7,3,TXTVOL,9 ;'Volume #:' DISPLAY 8,3,TXTCA1,20 ;'Vol.Name: **********' DISPLAY 9,3,TXTCA1+21,19 ;'Free **** Used ****' DISPLAY 12,3,TXTTO,6 ;'Backup Vol.' DISPLAY 13,3,TXTVOL,9 ;'Volume #:' DISPLAY 14,3,TXTCA0,9 ;'Vol.Name:' DISPLAY 15,3,TXTCAD,14 ;'Free Used' MOV @SRCVOL,R0 BLWP @DISP DATA 7*40+13 DSDLP1 BL @GETVOL DATA 13*40+13,VDSK2,DSDLP1 LI R1,>0200 MOVB R1,@DSTDRV ;SET DEST DRV C @SRCVOL,@DSTVOL ;ARE SRC/DST DRIVES DIFFERENT? JEQ DSDLP1 ;NO -- TRY AGAIN MOVB @DSTDRV,@OPDRV ;GET DRIVE # CLR @SECTOR ;SECTOR=0 BLWP @RDSECT ;GET SECTOR BLWP @MOVSCT ;MOVE SECTOR TO SCTBUF DATA DSTST0 LI R3,TXTER3 BL @CHKVOL ;CHECK IF VOLUME IS INITIALIZED OR PROTECTED DATA DSTST0,NODISK,VOLERR CLR R8 ;R8=0 MEANS DISK IS INITIALIZED BL @SHOWDN ;SHOW DISK NAME JMP CKINIT NODISK SETO R8 ;R8=FF MEANS DISK NOT INITIALIZED SCREEN 1 DISPLAY 14,13,TXTIN5,TXTIN5L ;'NOT FORMATTED' CKINIT SCREEN 1 DISPLAY 23,3,TXTIN0,TXTIN0L ;'FORMAT VOLUME (Y/N)' BRLP1 MOVB @DSTDRV,@OPDRV ;GET DRIVE NUMBER LI R0,23*40+3+TXTIN0L+1 MOVB @ASC_N,R1 ;"NO" BLWP @GTSKEY CB @YES,R1 JEQ BRLP2 CB @ASC_N,R1 JNE BRLP1 MOV R8,R8 ;IS DISK INITIALIZED? JEQ OKXCMD ;YES..EXECUTE COMMANDS B @CPYSET ;NO.. RETURN INVALID COMMAND BRLP2 SCREEN 2 DISPLAY 14,13,SPACES,15 ;ERASE LINE DISPLAY 23,3,SPACES,28 BLWP @INITB ;INITIALIZE DISK BL @SHOWDN ;SHOWN DISKNAME//FREE//USED OKXCMD SCREEN 1 DISPLAY 23,3,SPACES,28 ;BLANK LINE B @XXXCMD ;BRANCH TO MGR PART 6 TPLP1 BLWP @KSCAN ;TEMP ADDR FOR TESTING MOVB @STATUS,R2 CZC @KEYMSK,R2 JEQ TPLP1 MOV @FCT9,R0 ;RETURN TO BACK B *R0 ;---------------------------------------------------------------------- ; ; -- S H O W D N -- ; ; SHOW DESTINATION NAME ; ;---------------------------------------------------------------------- SHOWDN MOV R11,R10 ;SAV RTN ADDR SCREEN 1 ;SHOW DISKNAME //FREE//USED DISPLAY 14,13,DSTST0,10 BL @CALCBM ;CALC BIT MAP FREE/USED DATA DSTST0 ;BUFFER ADDR MOV @TEMPR1,R0 ;FREE BLWP @DISP DATA 15*40+11 MOV @TEMPR2,R0 ;USED BLWP @DISP DATA 15*40+21 B *R10 ;---------------------------------------------------------------------- ; ; -- K Y P R M T -- ; ; KEY PROMPT ; ;---------------------------------------------------------------------- KYPRMT SETO @KEYSW ;SET TO RTN A CR AI R0,-28 ;BACK UP FOR CURSOR POSITION KYPLP1 MOVB @ASCLO,R1 ;SPACE CHAR BLWP @GTSKEY CB R1,@CR ;IS KEY A CR JNE KYPLP1 LI R3,9 ;CLEAR 9 LINES (PROMPTS) LI R0,306 LI R1,SPACES ;BLANK LINE PRMLP1 BLWP @VMBW AI R0,40 ;MOV DWN DEC R3 JNE PRMLP1 ;LOOP IF NOT FINISHED RT ;RTN ;---------------------------------------------------------------------- ; ; -- D S P G S -- ; ; SCREEN pages routine ; ;---------------------------------------------------------------------- DSPGS MOVB @DSPAGE,R1 ;GET PAGE NUMBER AI R1,>3000 ;ADD ASCII OFFSET LI R0,76 ;SCREEN ADDR BLWP @VSBW ;SHOW PAGE NUMBER CLR R5 ;CALCULATE CATBUF POINTER MOVB @DSPAGE,R5 ;GET PAGE NUMBER SRL R5,8 ;PUT MSB TO LSB DEC R5 ;SCREEN PAGE-1 MPY @D800,R5 ;40 BYTES*20 LINES/PAGE=800 BYTES LI R0,120 ;SCREEN ADDR LI R1,SCNBUF ;CATBUF ADDR A R6,R1 ;ADD CALCULATED PAGE OFFSET LI R2,800 BLWP @VMBW DSRTN SCREEN 1 DISPLAY 23,TXTCA5C,TXTCA5,TXTCA5L RT ; ; CONVERT INT VALUE IN R8 TO 4 ASCII (*R1) ; ITO4A LI R3,4 CLCLP1 MOV R8,R9 CLR R8 DIV @DTEN,R8 CI R3,3 JNE CLCLP6 MOV R8,R8 JEQ CLCLP5 CLCLP6 CI R3,2 JNE CLCLP4 MOV R8,R8 JEQ CLCLP5 CLCLP4 CI R3,1 JNE CLCLP2 CLCLP5 MOV R9,R9 JEQ CLFMT030 CLCLP2 AI R9,>0030 SLA R9,8 MOVB R9,*R1 DEC R1 DEC R3 JNE CLCLP1 CLFMT030 RT ;---------------------------------------------------------------------- ; ; SCREEN decimal numbers routine ; ;---------------------------------------------------------------------- DISENT LI R2,4 ;4 PLACES MOV *R14+,R0 ;GET SCREEN ADDR MOV *R13,R4 ;GET VAL DISLP1 MOV R4,R5 CLR R4 DIV @DTEN,R4 CI R2,3 JNE DISLP6 MOV R4,R4 ;IF QUOTIENT=0 THEN CHECK REMAINDER JEQ DISLP5 DISLP6 CI R2,2 JNE DISLP4 MOV R4,R4 ;IF QUOTIENT=0 THEN CHECK REMAINDER JEQ DISLP5 DISLP4 CI R2,1 JNE DISLP2 DISLP5 MOV R5,R5 ;IF REMAINDER=0 THEN EXIT JEQ DISLP3 DISLP2 AI R5,>30 ;ADD ASCII OFFSET SLA R5,8 ;LSB TO MSB MOV R5,R1 BLWP @VSBW ;WRITE TO SCREEN DEC R0 ;BACKUP 1 SCREEN LOCATION DEC R2 JNE DISLP1 DISLP3 MOV R2,R2 ;HAVE WE GOT 4 DECIMAL FIGURES JEQ DISLP7 ;YES..RETURN MOVB @ASCLO,R1 ;NO..FILL WITH LEADING SPACES DISLP8 BLWP @VSBW DEC R0 DEC R2 JNE DISLP8 DISLP7 RTWP ;EXIT ;---------------------------------------------------------------------- ; ; -- M O V E S T -- ; ; Move Sector from VDP RAM to CPU RAM ; ;---------------------------------------------------------------------- $MOVSCT MOV *R14+,R1 LI R0,PABBUF LI R2,256 BLWP @VMBR RTWP ;---------------------------------------------------------------------- ; ; Disk Sector I/O Routine ; ;---------------------------------------------------------------------- $RDSECT CLR @FAC+2 ;CLEAR DRIVE & OPCODE INC @FAC+2 ;SET TO READ JMP STSCT $WRSECT CLR @FAC+2 ;SET TO WRITE STSCT MOVB @OPDRV,@FAC+2 ;GET DRIVE TO OPERATE ON LI R3,PABBUF ;VDP BUF ADDR MOV R3,@FAC+4 MOV @SECTOR,@FAC+6 LI R0,PAB ;LOAD PAB TO VDP LI R1,PDATA1 LI R2,>20 BLWP @VMBW LI R2,PAB+9 MOV R2,@PNTR BLWP @DSRLNK DATA 10 CKERR CLR *R13 ;CLEAR CALLING REG 0 MOVB @DSKERR,*R13 ;IF FLAG=0 THEN NO ERROR BLWP @KSCAN ;TEST FOR FCTN CLEAR MOVB @STATUS,R1 JEQ ENDSCT CB @KCODE,@TWO JNE ENDSCT B @ABTMSG ;USER HALTED I/O ENDSCT RTWP ;RTN ;---------------------------------------------------------------------- ; ; Clear Screen Routine ; ; BLWP @CLRSCN OR BLWP @CLREOS ;---------------------------------------------------------------------- CLSCRN CLR R0 ;CLEAR WHOLE SCREEN JMP CLRSET CLHALF MOV *R14+,R0 ;CLEAR FROM THIS ADDR CLRSET LI R1,>2000 LI R2,960 CLPX BLWP @VSBW INC R0 C R0,R2 JNE CLPX RTWP ;---------------------------------------------------------------------- ; ; High Speed VSBW,VMBW,VSBR,VMBR,VWTR ; ;---------------------------------------------------------------------- VDPRD EQU >8800 ;VDP READ DATA ADDR VDPWD EQU >8C00 ;VDP WRITE DATA ADDR VDPWA EQU >8C02 ;VDP READ/WRITE ADDR R2LB EQU >8380+5 ;R2'S LOWER BYTE - I SET WS REG TO >8380 *** VSBW DATA MYREG3,VSBW1 ;VECTOR TABLE VMBW DATA MYREG3,VMBW1 ; " " VSBR DATA MYREG3,VSBR1 ; " " VMBR DATA MYREG3,VMBR1 ; " " VWTR DATA MYREG3,VWTR1 ; " " VSBW1 BL @SETWDA ;SET UP WRITE OUT ADDR MOVB @2(R13),@VDPWD ;WRITE OUT BYTE RTWP ;RETURN VMBW1 BL @SETWDA ;SET UP WRITE OUT ADDR VWTLOP MOVB *R1+,@VDPWD ;WRITE OUT BYTE DEC R2 ;DEC BYTE COUNTER JNE VWTLOP ;IF MORE TO WRITE JUMP RTWP ;RETURN VSBR1 BL @SETRDA ;SET UP READ ADDR MOVB @VDPRD,@2(R13) ;READ A BYTE RTWP ;RETURN VMBR1 BL @SETRDA ;SET UP READ ADDR VRDLOP MOVB @VDPRD,*R1+ ;READ A BYTE DEC R2 ;DEC BYTE COUNTER JNE VRDLOP ;IF MORE TO READ JUMP RTWP ;RETURN VWTR1 MOV *R13,R1 ;GET REG # AND VAL MOVB @1(R13),@VDPWA ;WRITE OUT VAL ORI R1,>8000 ;SET FOR WRITE TO REG MOVB R1,@VDPWA ;WRITE OUT REG # RTWP ;RETURN SETWDA LI R1,>4000 ;SET TO WRITE TO VDP JMP WVADD SETRDA CLR R1 ;SET TO READ FROM VDP WVADD MOV *R13,R2 ;GET VDP ADDR MOVB @R2LB,@VDPWA ;WRITE LOW BYTE SOC R1,R2 ;ADJUST WRITE BIT MOVB R2,@VDPWA ;WRITE HIGH BYTE MOV @2(R13),R1 ;GET CPU RAM ADDR MOV @4(R13),R2 ;GET BYTE COUNT RT ;---------------------------------------------------------------------- ; ; SCREEN Text Routine ; ;---------------------------------------------------------------------- DSTEXT MOV *R14+,R3 ;NO. OF LINES TO DISPALY DSTLP1 MOV *R14+,R0 ;GET SCREEN ADDR MOV *R14+,R1 ;GET CPU ADDR MOV *R14+,R2 ;GET NO. OF BYTES BLWP @VMBW ;WRITE TO SCREEN DEC R3 ;DEC LINE COUNTER JNE DSTLP1 ;LOOP IF NOT FINISHED RTWP ;RETURN TDRPT DATA 160 ;TIME DELAY FOR REPEAT KEY FF DATA >FF00 ;---------------------------------------------------------------------- ; ; Get Single Key ; ;---------------------------------------------------------------------- GSKEY MOV *R13,R0 ;GET SCREEN ADDR MOVB @2(R13),R1 ;GET BYTE TO SHOW BLWP @VSBW ;WRITE TO SCREEN SRL R1,8 ;MSB TO LSB MOVB @CURSOR,R1 ;PUT CURSOR IN MSB BLWP @VSBW ;WRITE CURSOR TO SCREEN CLR R10 KS1 CLR R2 ;R2=0 THEN "CURSOR ON" KS2 MOV @TD,R3 ;RESET FLASH RATE KS BLWP @KSCAN MOVB @STATUS,R4 CZC @KEYMSK,R4 JNE KCHECK CB @KCODE,@FF JEQ KS3 INC R10 C @TDRPT,R10 JEQ KCHECK KS3 DEC R3 ;DEC FLASH RATE TIMER JNE KS DEC R2 ;IS CURSOR ON? JEQ CURSON ;NO..THEN TURN IT ON SWPB R1 ;SHOW CHAR BLWP @VSBW INCT R2 ;SET FLAG=1 JMP KS2 ;RESET FLASH RATE CURSON SWPB R1 ;SHOW CURSOR BLWP @VSBW JMP KS1 KCHECK MOVB @2(R13),R1 ;GET ORIGINAL KEY SWPB R1 MOVB @KCODE,R1 ;GET CURRENT KEY CB R1,@ASCHI ;SHOW DEFAULT//RETURN CURRENT JH KZLP2 CB R1,@ASCLO ;IS IT A FCTN KEY JLT KZLP3 ;YES... BLWP @VSBW ;NO.. SHOW CURRENT//RETURN CURRENT KZLP1 MOVB R1,@2(R13) ;SAVE CHAR TO R1 MSB OF LINK RTWP ;RETURN KZLP2 SWPB R1 ;SHOW DEFAULT BLWP @VSBW SWPB R1 ;RETURN FUNCT CODE JMP KZLP1 KZLP3 MOV @KEYSW,@KEYSW ;KEYSW=0 JNE KZLP4 ;NO..SHOW DEFAULT/RETURN FUNCT CODE LI R3,KZLP5 ;YES..SHOW DEFAULT//RETURN DEFAULT MOV R3,@FCTE ;SET UP CR BRANCH KZLP6 MOV R1,R2 ;CALC AND BRANCH AS PER FUNCT CODE SRL R2,7 DECT R2 MOV @FUNCT(R2),R2 B *R2 ;BRANCH KZLP4 LI R3,KZLP2 ;RETURN FUNCT CODE MOV R3,@FCTE ;SET UP CR BRANCH CLR @KEYSW ;KEYSW=0 JMP KZLP6 KZLP5 SWPB R1 ;SHOW DEFAULT//RETURN DEFAULT BLWP @VSBW JMP KZLP1 ;---------------------------------------------------------------------- ; ; GET MULTIPLE KEY CODES WITH EDITING ; ;---------------------------------------------------------------------- CKTBL DATA NOBS ;AID FCTN 7 DATA NOBS ;CLR FCTN 4 DATA CKDL ;DEL FCTN 1 DATA CKIN ;INS FCTN 2 DATA QUIT ;QUIT FCTN = CKT8 DATA NOBS ;REDO FCTN 8 DATA NOBS ;ERASE FCTN 3 DATA CKBS ;LEFT FCTN S DATA CKFS ;RIGHT FCTN D DATA NOBS ;DOWN FCTN X DATA NOBS ;UP FCTN E DATA NOBS ;PROCD FCTN 6 DATA CKCR ;ENTER ENTER DATA MGR ;BEGIN FCTN 5 CKT9 DATA CAT ;BACK FCTN 9 GMKEY MOV *R14+,R0 ;VDP ADDR MOV *R14+,R5 ;CPU ADDR MOV *R14+,R6 ;LENGTH OF STRING MOV *R14+,R7 ;INVALID CHAR (MAX 2) CLR R8 ;CHAR COUNTER GMST BLWP @VSBR ;GET CHAR FROM SCREEN GMST1 BLWP @VSBW ;WRITE TO SCREEN SRL R1,8 ;MSB TO LSB MOVB @CURSOR,R1 ;CURSOR CHAR BLWP @VSBW ;WRITE CURSOR GMLP1 CLR R2 ;FLAG=0 CURSOR ON GMLP2 MOV @TD,R3 ;RESET FLASH RATE GM BLWP @KSCAN ;SCAN AND GET KCODE MOVB @STATUS,R4 CZC @KEYMSK,R4 ;KEY PRESSED? JNE GMCHK ;YES..CHECK IT OUT DEC R3 ;DEC FLASH TIMER JNE GM DEC R2 ;IS CURSOR ON JEQ GMON ;NO..THEN TURN IT ON SWPB R1 BLWP @VSBW ;PUT CHAR TO SCREEN INCT R2 ;SET FLAG=1 JMP GMLP2 GMON SWPB R1 BLWP @VSBW JMP GMLP2 GMCHK MOV R2,R2 ;IS CURSOR "ON" JNE GMCHK1 ;NO.. SWPB R1 ;YES.. BLWP @VSBW ;DO NOT SHOW CURSOR GMCHK1 MOVB @KCODE,R1 CB R1,@ASCLO ;IS IT A FCTN KEY? JLT CKFCTN ;YES..CHECK IT OUT CB R1,R7 ;CHECK INVALID CHAR #1 JEQ GMST SWPB R7 CB R1,R7 ;CHECK INVALID CHAR #2 JEQ GMST LI R2,>6100 ;CHECK FOR LOWERCASE CB R1,R2 JLT GMCHK2 SB @ASCLO,R1 ;CONVERT TO UPPERCASE GMCHK2 C R8,R6 ;IF COUNT=MAX THEN EXIT JEQ GMST ;WAIT FOR ENTER BLWP @VSBW ;WRITE CHAR MOVB R1,*R5+ ;SAVE CHAR INC R0 ;INC SCREEN ADDR INC R8 ;INC CHAR COUNTER JMP GMST ;LOOP NXT CHAR CKFCTN SRL R1,7 ;CALC INDEX TO TABLE DECT R1 CI R1,28 ;IF KEY 14*2 THEN NO BKP120 JGT GMST MOV @CKTBL(R1),R1 B *R1 ;BRANCH AT FUNCTION CKBS MOV R8,R8 ;BACKSPACE JEQ NOBS MOVB *R5,R1 BLWP @VSBW ;SHOW CHAR UNDER CURSOR DEC R0 ;BACK UP 1 LOC VDP DEC R5 ; " " " " CPU MOVB *R5,R1 BLWP @VSBW CKBS1 DEC R8 ;DEC CHAR COUNT NOBS JMP GMST ;GET CHAR CKFS INC R8 ;INC COUNTER C R8,R6 ;OVER MAX JGT CKBS1 ;YES.ADJUST AND DON'T MOVE CB *R5,@ASCLO ;ARE WE ON A SPACE JNE DOFS ;NO..SO GO RIGHT INC R5 CB *R5,@ASCLO ;IS NEXT SPACE JNE DOFSS ;NO DEC R5 ;YES DO NOT MOVE JMP CKBS1 DOFSS DEC R5 DOFS MOVB *R5,R1 BLWP @VSBW ;SHOW CHAR UNDER CURSOR INC R0 ;MOV RGT 1 LOC VDP INC R5 ;" " " " CPU JMP NOBS ;GET CHAR AND RTN CKDL MOV R6,R2 ;DEL- LENGTH S R8,R2 ;S OFFSET MOV R5,R1 ;CPU ADDR INC R0 BLWP @VMBR ;GET STRING DEC R0 ;LEFT ADJUST BLWP @VMBW ;WRITE STRING BLWP @VSBR JMP CKRN ;RTN CKIN MOV R6,R2 ;INS- LENGTH DEC R2 ;LENGTH-1 S R8,R2 MOVB *R5,R1 BLWP @VSBW ;SHOW CHAR UNDER CURSOR MOV R5,R1 ;BUF ADDR INC R1 BLWP @VMBR ;GET STRING MOVB @ASCLO,*R5 ;PUT SPACE CHAR DEC R1 INC R2 BLWP @VMBW ;WRITE BLWP @VSBR CKRN B @GMST1 ;RTN CKCR RTWP ;---------------------------------------------------------------------- ; ; INIT DISKETTE B ; ;---------------------------------------------------------------------- INITBB SCREEN 1 DISPLAY 21,3,TXTIN4,22 ;'Verify Y/N :' LI R0,14*40+13 ;CLEAR NAME BUFFER LI R1,DSTST0 LI R2,10 BLWP @VMBR GDNAG SCREEN 1 DISPLAY 17,3,SPACES,35 BLWP @GTMKEY ;GET DISK NAME DATA 14*40+13 ;SCREEN ADDR DATA DSTST0 ;CPU ADDR DATA 10 ;LENGTH OF STRING DATA >202E ;INVALID CHAR LI R0,857 VFLP1 MOVB @ASC_N,R1 ;SHOW DEFAULT BLWP @GTSKEY LI R2,>4E59 ;"N" AND "Y" VERIFY DISK CB R1,R2 ;VERIFY DISK JEQ VFLP2 ;NO. SWPB R2 CB R1,R2 JNE VFLP1 ;INVALID CHAR VFLP2 MOVB R1,@VERIFY? ;* VERIFY * INTDSK LI R0,PAB ;LOAD PAB LI R1,PDATA1 LI R2,>0020 BLWP @VMBW LI R6,>0028 ;40 TRACK DEFAULT MOVB @OPDRV,R6 ;GET DRIVE NUMBER MOV R6,@FAC+2 LI R2,PABBUF MOV R2,@FAC+4 LI R2,>0200 MOV R2,@FAC+6 LI R0,PAB+9 ;POINTER TO NAME LENGTH MOV R0,@PNTR LI R1,DFMT ;>0111 LI R2,2 BLWP @VMBW BLWP @DSRLNK ;FORMAT VOLUME DATA 10 MOVB @DSKERR,R0 ;ERROR? JEQ KLP4 ;NO.. B @WPMSG ;YES.. KLP4 BLWP @CLRBUF ;CLEAR OUT SECTOR DATA DSTST1 SNGLE1 BLWP @MOVVDP ;MOVE BUFF TO VDP DATA DSTST1 LI R0,1 ;WRITE BUFF TO SECTOR(1) LINK MAP MOV R0,@SECTOR BLWP @WRSECX ; ; BUILD VIB ; LI R3,DSTST0 ;WRITE IN DISK NAME LI R2,DSTST1 LI R1,10 SNLP1 MOVB *R3+,*R2+ DEC R1 JNE SNLP1 LI R6,45 ;DEFAULTS FOR SSSD DISK (BM LENGTH) LI R5,>0100 ;DENSITY BYTE LI R4,>0900 ;SECT/TRACKS LI R0,1600 ;SECT/DISK SNLP3 MOV R0,*R2+ ;SAVE SIZE SECT/DISK MOVB R4,*R2+ ;SAVE SECT/TRACKS LI R3,TXTDSK ;5 BYTES >44,>53,>4B,>20,>28 LI R0,5 SNLP5 MOVB *R3+,*R2+ DEC R0 JNE SNLP5 MOVB R0,*R2+ MOVB R0,*R2 ;SAVE DENSITY/DISK LI R1,200 ;200 BYTES TOTAL IN BM LI R3,DSTST1+>38 ;BIT MAP START ADDR MOVB @H03,*R3 ;>03 SHOWS SECTOR 0&1 AS USED VERIFY CB @ASC_N,@VERIFY? ;VERIFY DISK JEQ NOVERF ;NO.. CLR @SECTOR LI R6,DSTST1+>38 MOVB *R6,R2 SRL R2,8 ;MSB TO LSB LI R1,8 ;8 BITS PER BM BYTE LI R5,1600 ;ALWAYS 1600 SECTORS PER VOLUME VLOOP8 MOV @SECTOR,R0 ;SCREEN SECTORS CHECKED INC R0 ;ADD 1 FOR SCREEN OFFSET 0-359//1-360 BLWP @DISP DATA 863 BLWP @RDSECT MOV R0,R0 ;ERROR ON SECTOR? JEQ VLOOP5 ;NO.. ORI R2,>0001 ;YES.. MASK BIT BAD VLOOP5 SRC R2,1 DEC R1 ;DEC BIT COUNT JNE VLOOP6 MOVB R2,*R6+ ;PUT BYTE BACK IN BM MOVB *R6,R2 ;GET NEXT BYTE SRL R2,8 ;MSB TO LSB LI R1,8 ;RESET BIT COUNTER VLOOP6 INC @SECTOR ;INC SECTOR ADDR DEC R5 JNE VLOOP8 NOVERF BLWP @MOVVDP ;MOVE CPU TO VDP DATA DSTST1 CLR @SECTOR BLWP @WRSECX ;WRITE TO SECTOR (0) BIT MAP BLWP @MOVSCT ;SAVE NEW BM DATA DSTST0 BLWP @CLREOS ;CLEAR LOWER PART OF SCREEN DATA 763 RTWP ;RETURN MOVEVD MOV *R14+,R1 ;MOV CPU TO VDP LI R0,PABBUF LI R2,256 BLWP @VMBW RTWP ; ; EXECUTE COMMAND ; XXXCMD MOVB @SRCDRV,@OPDRV MOV @FILCNT,R7 ;# OF FILES ON DISK UNPROT LI R5,SCNBUF+32 ;PROTECT FIELD LI R6,CATBUF UPRLP1 CB *R5,@ASC_P ;LEAVE FIELD PROTECTED JEQ UPRLP2 ;YES.. MOVB @12(R6),R4 ;GET FILE FLAG BYTE CZC @PROMSK,R4 ;IS IT PROTECTED JEQ UPRLP2 ;NO..THEN CARRY ON MOV R6,@TDATA1+2 SCREEN 2 DISPLAY 20,3,TXTCM1,15 ;'UNPROTECTING : ' TDATA1 DISPLAY 20,18,0,10 ;'**********' FILE NAME SZCB @PROMSK,R4 ;RESET PROTECT FLAG MOV @10(R6),@SECTOR ;GET LINK MAP POINTER BLWP @RDSECT ;GET DIRECTORY ENTRY UPRLP5 LI R0,PABBUF+12 ;ADDR OF FILE FLAG IN DIRECTORY ENTRY MOVB R4,R1 ;GET FILE FLAG BLWP @VSBW ;WRITE NEW FLAG BLWP @WRSECT ;WRITE DIRECTORY ENTRY MOV R0,R0 ;ERRORS ? JEQ UPRLP3 ;NO.. WPMSG BLWP @CLREOS DATA 763 LI R4,3 LI R3,TXTER2 LI R2,IOERRS WPMLP1 CB R0,*R2+ JEQ VOLERR AI R3,20 DEC R4 JNE WPMLP1 VOLERR MOV R3,@WPDATA+2 SCREEN 2 ;WRITE PROTECTED MSG DISPLAY 19,TXTER1C,TXTER1,TXTER1L ;'D I S K E R R O R' WPDATA DISPLAY 21,TXTER1C,0,TXTER1L ;I/O ERROR MSGS B @CONTINUE ;HALT ON ERROR IOERRS DATA >0634 ;NO DISK//WRITE PROTECT DATA >2131 ;NOT INIT//DEVICE ERROR UPRLP3 MOVB R4,@12(R6) ;SAVE FLAG IN CATBUF SCREEN 1 ;BLANK OUT DISK NAME DISPLAY 20,3,SPACES,30 UPRLP2 AI R5,40 ;MOVE TO NEXT FILE AI R6,20 DEC R7 ;DEC FILE COUNT JNE UPRLP1 ;LOOP IF NOT FINISHED DELFL MOV @FILCNT,R7 ;GET # OF FILES LI R5,SCNBUF+1 ;CMD FIELD LI R6,CATBUF DLLP1 CB *R5,@ASC_D ;DELETE FILE? JNE DLLP5 ;NO.. MOVB @12(R6),R4 CZC @PROMSK,R4 ;IS IT FILE PROTECTED? JNE DLLP5 ;YES..THEN DON'T DELETE MOV R6,@TDATA2+2 ;GET DISKNAME ADDR SCREEN 2 DISPLAY 20,3,TXTCM2,14 ;'DELETE FILE : ' TDATA2 DISPLAY 20,17,0,10 ;'**********' FILENAME MOV @10(R6),@SECTOR ;GET DIRECTORY ENTRY BLWP @RDSECX BLWP @MOVSCT ;MOVE DIRECTORY TO CPU DATA SRCST2 LI R1,SRCST2+>1C ;BLOCK LINK ADDR MOV R1,@BLKLNK BLKLP1 BL @GETLNK ;GET // STRSCT // OFFSET BL @RTNBM ;RETURN SECTORS TO BIT MAP MOV @10(R6),@STRSCT ;RETURN DIRECTORY SECTOR TO BIT MAP CLR @OFFSET BL @RTNBM CLR @SECTOR ;WRITE BM BLWP @MOVVDP ;MOVE BIT MAP TO VDP DATA SRCST0 BLKLP2 BLWP @WRSECX ;WRITE BIT MAP TO DISK LI R4,SRCST1 ;LINK MAP BUFFER DLLP4 C @10(R6),*R4 ;FIND POINTER IN LINK MAP JEQ DLLP2 ;YES.. INCT R4 ;NO.. JMP DLLP4 DLLP2 MOV @2(R4),R3 ;GET NEXT POINTER JEQ DLLP3 ;IF = 0 THEN END MOV R3,*R4+ ;OVER RUN POINTER WITH NEXT IN LINE JMP DLLP2 DLLP3 CLR *R4 ;CLEAR LAST POINTER INC @SECTOR ;WRITE LM BLWP @MOVVDP ;WRITE LM TO PABBUF DATA SRCST1 BLWP @WRSECX ;WRITE LM TO DISK SCREEN 1 ;CLEAR LINE DISPLAY 20,3,SPACES,30 DLLP5 AI R5,40 AI R6,20 DEC R7 JNE DLLP1 JMP RENAME GTMLNK MOV @MBLNK,R1 ;GET SECTOR ADDR AND OFFSET JEQ ZEROF ;FILE WITH ONLY A DIRECTORY(SIZE=1) MOVB @1(R1),R0 ;FOR MASTER DISK SRL R0,8 MOVB *R1,R0 ANDI R0,>FF0F ;MASK OUT 3RD NYBBLE SWPB R0 MOV R0,@MSECT ;SAVE START SECTOR ADDR MOVB @1(R1),R0 ;BUILD OFFSET POINTER ANDI R0,>F000 SRL R0,8 MOVB @2(R1),R0 SRL R0,4 MOV R0,@MOFFST AI R1,3 ;POINT TO NEXT BLOCK LINK MOV R1,@MBLNK ;FOR MASTER DISK JMP FINML ZEROF CLR @MOFFST CLR @MSECT FINML RT GETLNK MOV @BLKLNK,R1 ;GET SECTOR ADDR AND OFFSET JEQ ZEROS ;SECTOR ZERO...SKIP MOVB @1(R1),R0 SRL R0,8 MOVB *R1,R0 ANDI R0,>FF0F ;MASK OUT 3RD NYBBLE SWPB R0 MOV R0,@STRSCT ;SAVE START SECTOR ADDR MOVB @1(R1),R0 ;BUILD OFFSET POINTER ANDI R0,>F000 SRL R0,8 MOVB @2(R1),R0 SRL R0,4 MOV R0,@OFFSET AI R1,3 ;POINT TO NEXT BLOCK LINK MOV R1,@BLKLNK JMP FINGL ZEROS CLR @OFFSET CLR @STRSCT FINGL RT RTNBM MOV R11,R10 ;SAVE RTN ADDR SETO R8 ;R8= OFFSET COUNTER RTNLP1 MOV @STRSCT,R1 JEQ NORTN ;NEVER RETURN BM FOR SECTOR 0 CLR R0 ;R0=0 R1=DIVEDEND CI R1,7 ;IS RANGE (0-7) JGT RTNLP3 JMP RTNLP4 RTNLP3 DIV @D08,R0 ;R0=QUOTIENT R1=REMAINDER RTNLP4 LI R4,>0100 ;SHIFT MASK LI R3,56 ;BM OFFSET FROM START OF SECTOR 0 A R0,R3 ;R3 POINTS TO BIT MAP BYTE MOV R1,R0 ;R0 IS BIT SHIFT COUNTER JEQ NOSHFT ;IF=0 THEN NO SHIFT SLA R4,0 ;SHIFT R4//R0 TIMES NOSHFT SZCB R4,@SRCST0(R3) ;MASK IN FREE SECTOR INC @STRSCT ;INC ADDR INC R8 ;INC OFFSET COUNTER C R8,@OFFSET ;ARE WE AT THE END? JEQ RTNLP2 ;YES.. JMP RTNLP1 ;CARRY ON... RTNLP2 BL @GETLNK ;CHECK IF MORE IN BLOCK LINK MOV @STRSCT,R1 ;IS IT = 0 JNE RTNLP1 ;NO..CONTINUE NORTN B *R10 ;---------------------------------------------------------------------- ; ; -- R E N A M E -- ; ; THIS ROUTINE RENAMES FILES ; ;---------------------------------------------------------------------- RENAME MOV @FILCNT,R7 ;NUMBER OF FILES LI R5,SCNBUF LI R6,CATBUF RELP2 CB @1(R5),@ASC_D ;WAS FILE DELETED? JEQ RELP4 ;YES.. NEXT FILE LI R4,10 ;10 BYTES TO TEST MOV R5,R3 ;SCNBUF FILENAME ADDR AI R3,4 MOV R6,R2 ;CATBUF FILENAME ADDR RELP1 CB *R3+,*R2+ ;CHECK FILENAME JNE RELP3 DEC R4 JNE RELP1 RELP4 AI R5,40 ;ADJUST POINTERS AI R6,20 DEC R7 ;ANY MORE FILES? JNE RELP2 ;YES.. THEN LOOP B @PROTCM ; NO.. GOTO NEXT FUNTION RELP3 MOV R5,R3 AI R3,4 MOV R3,@TDATA5+2 ;NEW FILENAME MOV R3,@TDATA6 ; " " SCREEN 2 DISPLAY 20,3,TXTCM3,14 ;'RENAME FILE : ' TDATA5 DISPLAY 20,17,0,10 ;'NEW FILENAME' MOV @FILCNT,R9 ;TEST FOR DUPLICATE FILENAME LI R12,CATBUF RELP3C MOV R12,R10 MOV R5,R11 ;NEW FILENAME AI R11,4 LI R2,10 ;10 BYTES TO CHECK RELP3A CB *R10+,*R11+ JNE RELP3B DEC R2 JNE RELP3A SCREEN 1 ;*DUP FILE ERROR* DISPLAY 23,11,TXTPRO,14 ;'DUPLICATE FILE' B @TPLP1 RELP3B AI R12,20 DEC R9 JNE RELP3C MOV @10(R6),R8 MOV R8,@SECTOR BLWP @RDSECX ;READ DIRECTORY ENTRY BLWP @DSPTXT ;WRITE NEW FILENAME DATA 1 DATA PABBUF TDATA6 DATA 0 ;'NEW FILENAME' DATA 10 LI R0,PABBUF MOV R6,R1 ;CATBUF ADDR LI R2,10 BLWP @VMBR ;SAVE NEW ADDR RELP6 BLWP @WRSECX ;WRITE DIRECTORY ENTRY LI R0,1 ;ADJUST LM MOV R0,@SECTOR BLWP @RDSECX BLWP @MOVSCT DATA DSTST1 LI R4,DSTST1 ;* REMOVE OLD POINTER * TIC1 C R8,*R4 JEQ TIC2 INCT R4 JMP TIC1 TIC2 MOV @2(R4),R3 JEQ TIC3 MOV R3,*R4+ JMP TIC2 TIC3 CLR *R4 LI R4,DSTST1 ;* SORT LM * QTIP3 MOV *R4+,@SECTOR JEQ QTIP4 BLWP @RDSECX LI R0,PABBUF LI R1,TBUF LI R2,10 BLWP @VMBR MOV @TDATA6,R3 ;LOC OF FILE ADDR QTIP5 CB *R3+,*R1+ JGT QTIP3 JLT QTIP4 JMP QTIP5 QTIP4 DECT R4 QTIP4A MOV *R4,R3 MOV R8,*R4+ MOV *R4,R8 MOV R3,*R4+ JNE QTIP4A LI R0,1 MOV R0,@SECTOR BLWP @MOVVDP DATA DSTST1 BLWP @WRSECX SCREEN 1 ;BLANK LINE DISPLAY 20,3,SPACES,25 B @RELP4 PROTCM MOV @FILCNT,R7 ;NUMBER OF FILES LI R5,SCNBUF LI R6,CATBUF PRLP5 CB @1(R5),@ASC_D ;WAS FILE DELETED? JEQ PRLP4 ;YES.. NEXT FILE CB @32(R5),@ASC_U ;LEAVE FILE UNPROTECTED JEQ PRLP4 ;YES.. NEXT FILE MOVB @12(R6),R4 ;GET FILE FLAG CZC @PROMSK,R4 ;IS FILE ALREADY PROTECTED JNE PRLP4 ;YES.. NEXT FILE MOV R6,@TDATA3+2 ;FILENAME POINTER SCREEN 2 DISPLAY 20,3,TXTCM5,13 ;'PROTECTING : ' TDATA3 DISPLAY 20,16,0,10 ;'**********' FILE NAME SOCB @PROMSK,R4 ;SET PROTECT FLAG MOV @10(R6),@SECTOR ;GET LINK MAP POINTER BLWP @RDSECX LI R0,PABBUF+12 ;ADDR OF FILE FLAG MOVB R4,R1 BLWP @VSBW ;WRITE FILE FLAG PRLP3 BLWP @WRSECX ;WRITE DIRECTORY ENTRY MOVB R4,@12(R6) ;SAVE FLAG SCREEN 1 ;BLANK OUT DISKNAME DISPLAY 20,3,SPACES,30 PRLP4 AI R5,40 AI R6,20 DEC R7 JNE PRLP5 LSTSCT DATA 0 ;USED TO SORT LM//SAVE LAST POINTER CPYMOV MOV @FILCNT,R7 ;# OF FILES TO SEARCH CLR @LSTSCT LI R5,SCNBUF LI R6,CATBUF MOV R6,@TEMPR3 ;SAVE FOR MYREG6 CPYTST CB @1(R5),@ASC_N ;COPY THIS PGM? JEQ CKNXT ;NO.CHECK NEXT ONE CB @1(R5),@ASC_D ;WAS FILE DELETED? JNE CPY CKNXT SCREEN 1 DISPLAY 20,3,SPACES,22 ;BLANK LINE AI R5,40 ;MOVE TO NEXT FILE AI R6,20 MOV R6,@TEMPR3 ;SAVE FOR MYREG6 DEC R7 ;DEC FILE COUNTER JNE CPYTST B @MOVTST ;GOTO NEXT FUNCTION ;---------------------------------------------------------------------- ; ; -- C P Y -- ; ; THIS ROUTINE COPIES FILES ; ;---------------------------------------------------------------------- CPY SCREEN 2 DISPLAY 3,8,TXTTFC,20 ;'TOTAL FILES TO COPY:' DISPLAY 4,8,TXTTSC,20 ;'TOTAL SIZE OF FILES:' MOV @CPYFIL,R0 ;SHOW # OF FILES BLWP @DISP DATA 151 MOV @CPYSCT,R0 ;SHOW SIZE OF FILES BLWP @DISP DATA 191 MOVB @SRCDRV,@OPDRV ;CHECK SOURCE DRIVE OPERATION MOV @10(R6),@SECTOR ;GET SOURCE DIRECTORY ENTRY BLWP @RDSECX BLWP @MOVSCT DATA SRCST2 SCREEN 2 DISPLAY 20,3,TXTCM4,12 ;'COPY FILE : ' DISPLAY 20,15,SRCST2,10 ;'FILENAME' LWPI MYREG6 ;CLEAR WRITE FLAG CLR R9 LWPI MYREG1 LI R1,SRCST2+>1C ;START OF MASTER SOURCE BLOCK(0 FOR 1 SECTOR FILE) MOV R1,@MBLNK ;STORE MASTER BLOCK LINK JEQ QLP2 ;SKIP WRITE FOR 1 SECTOR FILES BL @GTMLNK ;GET BLOCK LINK CLR R9 ;CLEAR OFFSET COUNTER CKBLK3 CLR R10 ;MAX SECTOR COUNTER LI R8,>1000 ;PABBUF ADDR (VARIABLE) LI R0,PAB ;SET UP PAB LI R1,PDATA1 LI R2,>0020 BLWP @VMBW CLR @FAC+2 ;PREPARE TO ACCESS DISK INC @FAC+2 MOVB @SRCDRV,@FAC+2 CKBLK2 MOV R8,@FAC+4 ;PABBUF ADDR MOV @MSECT,@FAC+6 ;SECTOR ADDR MOV R8,@TEMPR2 ;ADJUST NEW PABBUF ADDR LI R0,PAB+2 LI R1,TEMPR2 LI R2,2 BLWP @VMBW LI R2,PAB+9 ;SET UP POINTER MOV R2,@PNTR BLWP @DSRLNK DATA 10 ;READ IN SECTOR MOVB @DSKERR,R0 ;ERROR? JEQ QLP2 ;NO. B @WPMSG ;YES. MOFFST DATA 0 ;OFFSET FOR MASTER DISK MSECT DATA 0 ;SECT # FOR MASTER DISK MBLNK DATA 0 ;BLOCK LINK FOR MASTER DISK QLP2 BLWP @KSCAN ;TEST FOR KEY PRESSED MOVB @STATUS,R1 JEQ QLP2A CB @KCODE,@TWO JNE QLP2A B @ABTMSG QLP2A C R9,@MOFFST ;ARE WE AT END OF BLOCK? JEQ CKBLK ;YES..CHECK NEXT BLOCK LINK INC @MSECT ;INC SECTOR POINTER INC R9 ;INC OFFSET COUNTER INC R10 ;INC SECTOR COUNTER (MAX 39) CI R10,39 ;ARE WE UP TO 39 YET? JEQ WRITE ;YES..WRITE TO DISK AI R8,256 ;INC VDP PABBUF ADDR JMP CKBLK2 CKBLK MOV @SRCST2+14,R11 ;GET SIZE(=0 IF 1 SECTOR FILE) JEQ WRITE ;FOR 1 SECTOR FILE DEC R11 ;SIZE-1 C R9,R11 ;COUNT=SIZE?? JEQ WRITE ;YES..WRITE TO DISK BL @GTMLNK ;GET NEXT BLOCK LINK IN CASE THERE IS ONE INC R9 ;INC OFFSET COUNTER INC R10 ;INC SECTOR COUNTER CI R10,39 ;ARE WE AT 39 SECTORS YET?? JEQ WRITE ;YES..WRITE TO DISK AI R8,256 ;INC VDP PABBUF ADDR JMP CKBLK2 WRITE LWPI MYREG6 ;USE NEW REGISTERS WRITED MOV R9,R9 ;FIRST TIME THROUGH? JEQ SETSCT ;YES..SET BM//LM//DIRECTORY B @WRITE2 ;NO.. CONTINUE COPING FILE SETSCT BLWP @MOVSCT ;SAVE PABBUF CONTENT DATA TMPSCT MOVB @DSTDRV,@OPDRV ;GET DESTINATION DRIVE INFO CLR @SECTOR ;GET SECTOR 0 BLWP @RDSECX BLWP @MOVSCT DATA DSTST0 INC @SECTOR ;GET SECTOR 1 BLWP @RDSECX BLWP @MOVSCT DATA DSTST1 LI R4,DSTST1 ;DEST LINK MAP CPYLP2 MOV *R4+,@SECTOR ;GET LM POINTER JEQ CPYLP9 ;EXIT IF ZERO BLWP @RDSECX ;SEARCH DEST DISK FOR DUP FILE LI R0,PABBUF ;GET FILENAME LI R1,TBUF ;TEMP BUFF LI R2,10 ;10 BYTES TO TEST BLWP @VMBR MOV @TEMPR3,R3 ;CATBUF FILENAME ADDR CPYLP1 CB *R1+,*R3+ ;TEST CHARS ARE THE SAME. JGT CPYLP9 ;EXIT IF THE REST ARE LARGER JLT CPYLP2 DEC R2 JNE CPYLP1 ;LOOP IF MORE TO TEST LI R0,PABBUF+12 ;FILE FLAG ADDR BLWP @VSBR ;GET FILE FLAG CZC @PROMSK,R1 ;IS FILE PROTECTED? JEQ CPYCN ;NO.. SCREEN 1 ;YES. DISPLAY 23,3,TXTPRO,31 ;'DUPLICATE FILE WRITE PROTECTED.' LWPI MYREG1 B @TPLP1 CPYCN BL @CALCBM ;* TEST FOR ENOUGH FREE SPACE * DATA DSTST0 BLWP @MOVSCT ;GET DUP FILE DIRECTORY DATA DSTST2 MOV @DSTST2+14,R0 ;GET SRC FILE SIZE INC R0 ;ADD 1 FOR DIRECTORY A @TEMPR1,R0 ;ADD FREE DISK SPACE C @SRCST2+14,R0 JLE DELDUP ;LOTS OF ROOM CONTINUE NODEL SCREEN 1 DISPLAY 23,3,TXTLRG,30 ;'FILE TOO LARGE. PRESS ANY KEY.' B @TPLP1 DELDUP MOV @SECTOR,@TEMPR3 ;* DEL FILE * SAVE LM POINTER LI R1,DSTST2+>1C ;BLOCK LINK POINTER MOV R1,@BLKLNK CPYLP3 BL @GETLNK ;GET STRSCT//OFFSET BL @RTNBM2 ;RETURN USED SECTORS TO BM MOV @SECTOR,@STRSCT ;RETURN DIRECTORY ENTRY POINTER TO BM CLR @OFFSET BL @RTNBM2 LI R4,DSTST1 ;ADJUST LM POINTERS CPYLP5 C @TEMPR3,*R4 ;COMPARE POINTER JEQ CPYLP6 ;FOUND POINTER.. INCT R4 JMP CPYLP5 ;LOOP TO NEXT LM PNTR CPYLP6 MOV @2(R4),R3 ;ADJUST LM NOW JEQ CPYLP7 ;EXIT IF ZERO MOV R3,*R4+ ;SHUFFLE POINTERS JMP CPYLP6 CPYLP7 CLR *R4 ;END OF LM JMP CPYLPA CPYLP9 BL @CALCBM ;CHECK FOR FREE SPACE DATA DSTST0 MOV @TEMPR1,@TEMPR1 ;IS DISK FULL?? JEQ CPYLPB ;YES.. MOV @SRCST2+14,R0 INC R0 C R0,@TEMPR1 JLE CPYLPA B @NODEL ;FILE TOO LARGE CPYLPB SCREEN 1 DISPLAY 23,3,TXTFUL,32 ;'BACKUP DISK FULL. PRESS ANY KEY.' B @TPLP1 CPYLPA BLWP @CLRBUF ;CLEAR OUT SECTOR BUFFER DATA DSTST2 LI R0,SRCST2 ;MOVE FILE INFO TO NEW DIRECTORY ENTRY LI R1,DSTST2 LI R2,20 ;20 BYTES TO MOVE MVLP1 MOVB *R0+,*R1+ DEC R2 JNE MVLP1 ;LOOP IF NOT FINISHED LI R10,DSTST2+>1C ;YES..CREATE A NEW BLOCK LINK MOV R10,@DSTBLK ;SAVE ADDR SETO R13 ;CLEAR OFFSET COUNTER CLR R12 ;CLEAR BLOCK LINK COUNTER MOV @SRCST2+14,R8 ;GET SIZE OF FILE JEQ WRLP6 ;FOR 1 SECTOR FILES WRLP3 BLWP @FINDHI ;FIND FREE SECTOR (RANGE 34-MAX) MOV R0,R3 ;SAVE ADDR WRLP5 MOV R12,R12 ;IS THIS FIRST SECTOR JEQ WRLP1 ;YES.. INC R2 ;LAST SECTOR NUMBER + 1 C R0,R2 ;IS SECTOR NEXT IN SEQUENCE? JNE WRLP4 ;NO..ASSEMBLE BLOCK LINK JMP WRLP2 WRLP1 MOV R0,@TEMPR2 ;SAVE START SECTOR WRLP2 MOV R0,R2 ;SAVE SECTOR FOR COMPARISION INC R13 ;INC OFFSET INC R12 ;INC BLOCK COUNTER DEC R8 ;DEC SIZE COUNTER JNE WRLP3 WRLP4 MOV @TEMPR2,R0 ;BUILD BLOCK SWPB R0 ;GET SS2-SS1 NYBBLE MOVB R0,*R10+ ;PUT BYTE IN BLOCK LINK MOV R13,R12 ;GET R01-SS3 NYBBLE ANDI R12,>000F SLA R12,12 ANDI R0,>000F SLA R0,8 A R12,R0 MOVB R0,*R10+ ;PUT BYTE IN BLOCK LINK MOV R13,R0 ;GET R03-R02 NYBBLE SLA R0,4 MOVB R0,*R10+ ;PUT BYTE IN BLOCK LINK MOV R8,R8 ;ARE WE FINISHED JEQ WRLP6 ;YES.. CLR R12 ;CLEAR BLOCK COUNTER MOV R3,R0 ;RESTORE ADDR JMP WRLP1 WRLP6 BLWP @FINDLO ;GET SECTOR FOR DIRECTORY BLWP @MOVVDP DATA DSTST2 MOV R0,R8 ;SAVE DIRECTORY POINTER MOV R0,@SECTOR BLWP @WRSECX ;WRITE TO DISK FILE DIRECTORY LI R4,DSTST1 ;LM ADDR * SORT LINK MAP * MOV R4,R6 MOV @LSTSCT,R0 ;FIRST TIME THROUGH SORT JEQ SRLP1 ;YES.. SRLP1A MOV *R4+,R5 ;NO..PRESORT ALL PREVIOUS POINTERS C R5,R0 JNE SRLP1A SRLP1 MOV R8,@LSTSCT ;SAVE POINTER SRLP4 MOV *R4,@SECTOR JEQ SRLP3 BLWP @RDSECX ;GET DIRECTORY LI R0,PABBUF ;GET FILENAME LI R1,TBUF LI R2,10 BLWP @VMBR LI R0,DSTST2 ;FILENAME TO CHECK AGAINST LI R1,TBUF SRLP2 CB *R0+,*R1+ ;CHECK CHAR JEQ SRLP2 JLT SRLP3 INCT R4 JMP SRLP4 SRLP3 C R4,R6 JEQ SRLP6 DECT R4 MOV *R4,@SECTOR BLWP @RDSECX LI R0,PABBUF LI R1,TBUF LI R2,10 BLWP @VMBR LI R0,DSTST2 LI R1,TBUF SRLP2A CB *R0+,*R1+ JEQ SRLP2A JLT SRLP3 INCT R4 SRLP6 MOV *R4,R3 MOV R8,*R4+ MOV *R4,R8 MOV R3,*R4+ JNE SRLP6 CLR @SECTOR ;WRITE BM TO DISK BLWP @MOVVDP DATA DSTST0 BLWP @WRSECX INC @SECTOR ;WRITE LM TO DISK BLWP @MOVVDP DATA DSTST1 BLWP @WRSECX BLWP @MOVVDP ;RESTORE PABBUF CONTENTS DATA TMPSCT BL @SHOWDN ;SHOW NEW BM INFO MOV @SRCST2+14,@SRCST2+14 ;IS IT 1 SECTOR FILE JEQ WTLP4 ;YES BL @GTLNK2 ;GET DEST BLOCK LINK WRITE2 CLR R10 ;CLEAR SECTOR COUNTER LI R8,>1000 ;PABBUF ADDR CLR @FAC+2 ;ACCESS DRIVE FOR WRITE OPERATION MOVB @DSTDRV,@FAC+2 WTLP1 MOV R8,@FAC+4 ;PABBUF ADDR MOV @DSTSTR,@FAC+6 ;SECTOR ADDR MOV R8,@TEMPR2 ;ADJUST PAB ADDR LI R0,PAB+2 LI R1,TEMPR2 LI R2,2 BLWP @VMBW LI R2,PAB+9 ;ADJUST POINTER MOV R2,@PNTR BLWP @DSRLNK DATA 10 ;WRITE TO DISK MOVB @DSKERR,R0 JEQ QLP9 B @WPMSG QLP9 BLWP @KSCAN ;TEST FOR KEY PRESSED MOVB @STATUS,R1 JEQ QLP9A CB @KCODE,@TWO JNE QLP9A B @ABTMSG QLP9A C R9,@DSTOFF ;ARE WE AT END OF OFFSET? JEQ WTLP2 ;YES.. JGT WTLP2 ;WE ARE OVER BUT IT IS OK INC @DSTSTR ;INC SECTOR POINTER INC R9 ;INC OFFSET POINTER INC R10 ;INC SECTOR COUNTER CI R10,39 ;ARE WE AT 39 YET?? JEQ WTLP3 ;YES.. AI R8,256 ;INC VDP PABBUF ADDR JMP WTLP1 WTLP2 MOV @DSTST2+14,R11 ;GET SIZE DEC R11 ;SIZE-1 C R9,R11 ;SIZE=COUNT JEQ WTLP4 ;YES.. WTLP5 INC R9 ;INC OFFSET COUNTER INC R10 ;INC SECTOR COUNTER CI R10,39 ;ARE WE AT 39 YET? JEQ WTLP3 ;YES.. BL @GTLNK2 ;GET NEXT BLOCK LINK AI R8,256 ;ADJUST VDP PABBUF ADDR JMP WTLP1 WTLP3 LWPI MYREG1 ;GET MORE SECTORS B @CKBLK3 WTLP4 LWPI MYREG1 ;GET MORE FILES DEC @CPYFIL S @DSTST2+14,@CPYSCT DEC @CPYSCT ;SUB 1 AGAIN FOR DIRECTORY ENTRY SCREEN 1 ;BLANK OUT FILENAME DISPLAY 20,3,SPACES,22 B @CKNXT RTNBM2 MOV R11,R10 ;RETURN USED BITS TO DEST DISK ROUTINE SETO R8 RTZLP1 MOV @STRSCT,R1 ;START SECT ADDR JEQ NORTN2 ;NEVER RETURN BM FOR SECTOR 0 CLR R0 CI R1,7 ;IS RANGE (0-7) JGT RTZLP3 JMP RTZLP4 RTZLP3 DIV @D08,R0 ;R0=QOUTIENT //R1= REMAINDER RTZLP4 LI R4,>0100 ;SHIFT MASK LI R3,56 A R0,R3 MOV R1,R0 ;R0 IS BIT SHIFT COUNTER JEQ NZSHFT ;IF=0 THEN NO SHIFT SLA R4,0 ;SHIFT R4/R0 TIMES NZSHFT SZCB R4,@DSTST0(R3) ;MASK IN SECTORS INC @STRSCT ;INC ADDR INC R8 ;INC OFFSET COUNTER C R8,@OFFSET JEQ RTZLP2 JMP RTZLP1 RTZLP2 BL @GETLNK ;GET NEXT BLOCKLINK MOV @STRSCT,R1 JNE RTZLP1 NORTN2 B *R10 ;RETURN FINDHH LI R7,DSTST0+>3C ;SECTOR RANGE(34-MAX) LI R6,34 JMP FZLP3 FINDLL LI R7,DSTST0+>38 ;SECTOR RANGE(2-MAX) LI R6,2 FZLP3 LI R5,>0400 ;MASK (START AT 2 INSTEAD OF 0) LI R4,6 ; (ONLY 6 BITS TO SHIFT) JMP FZLP6 FZLP1 LI R5,>0100 ;SHIFT MASK LI R4,8 ;8 BITS TO SHIFT FZLP6 MOVB *R7+,R3 ;GET BM BYTE FZLP2 CZC R5,R3 ;CHECK FOR FREE BIT JEQ FZLP4 SLA R5,1 ;SHIFT INC R6 ;INC SECTOR COUNTER DEC R4 ;MORE TO TEST? JNE FZLP2 C R6,@DSTST0+10 ;ARE WE AT END OF BM JEQ FINDLL ;YES..CHECK LO END JMP FZLP1 FZLP4 SOCB R5,R3 ;SET BIT DEC R7 ;ADJUST BM POINTER MOVB R3,*R7 ;SAVE BYTE TO BM MOV R6,*R13 ;RETURN SECTOR TO "R0" RTWP GTLNK2 MOV @DSTBLK,R1 ;GET DSTSTR//DSTOFF JEQ ZERO2 ;1 SECTOR FILE SO SKIP ? MOVB @1(R1),R0 SRL R0,8 MOVB *R1,R0 ANDI R0,>FF0F ;GET 3RD NYBBLE SWPB R0 MOV R0,@DSTSTR ;SAVE DEST START SECTOR MOVB @1(R1),R0 ;BUILD OFFSET POINTER ANDI R0,>F000 SRL R0,8 MOVB @2(R1),R0 SRL R0,4 MOV R0,@DSTOFF ;SAVE DEST OFFSET AI R1,3 ;POINT TO NEXT BLOCK LINK MOV R1,@DSTBLK JMP FINN2 ZERO2 CLR @DSTOFF CLR @DSTSTR FINN2 RT MOVTST SCREEN 2 DISPLAY 3,8,SPACES,25 DISPLAY 4,8,SPACES,25 MOV @FILCNT,R7 ;NUMBER OF FILES LI R5,SCNBUF LI R6,CATBUF MOVB @SRCDRV,@OPDRV MVTST CB @1(R5),@ASC_M ;MOVE OPTION?? JEQ MVDEL ;YES..DELETE FILE MVDLP5 AI R5,40 AI R6,20 DEC R7 JNE MVTST ;LOOP IF MORE FILES TO TEST JMP MVDLP7 MVDEL MOV R6,@TDATA7+2 ;FILENAME POINTER SCREEN 2 DISPLAY 20,3,TXTCM2,14 ;'DELETE FILE :' TDATA7 DISPLAY 20,17,0,10 ;'_________ FILENAME' MOV @10(R6),@SECTOR ;GET DIRECTORY BLWP @RDSECX BLWP @MOVSCT DATA SRCST2 ;GET DIRECTORY LI R1,SRCST2+>1C ;BLOCK LINK ADDR MOV R1,@BLKLNK MVDLP1 BL @GETLNK ;GET STRSCT//OFFSET BL @RTNBM ;RETURN BM BITS MOV @10(R6),@STRSCT CLR @OFFSET BL @RTNBM ;RETURN LM POINTER CLR @SECTOR ;YES.. RETURN BM BLWP @MOVVDP DATA SRCST0 MVDLP9 BLWP @WRSECX ;WRITE BM LI R4,SRCST1 ;LM BUFFER MVDLP2 C @10(R6),*R4 JEQ MVDLP3 INCT R4 JMP MVDLP2 MVDLP3 MOV @2(R4),R3 ;SHUFFLE LM POINTERS JEQ MVDLP4 MOV R3,*R4+ JMP MVDLP3 MVDLP4 CLR *R4 ;CLEAR LAST POINTER INC @SECTOR ;RETURN LM BLWP @MOVVDP DATA SRCST1 BLWP @WRSECX ;WRITE LM SCREEN 1 DISPLAY 20,3,SPACES,30 JMP MVDLP5 ;LOOP TO NEXT FILE MVDLP7 B @CAT ;COMMANDS COMPLETED ;---------------------------------------------------------------------- ; DISK I/O WITH ERROR REPORTING ; ; READS OR BKP280 SECTOR (@SECTOR) FROM/TO VOLUME (@OPDRV) ;---------------------------------------------------------------------- $RDSECX CLR @FAC+2 ;READ SECTOR INC @FAC+2 ;1=READ JMP STSCTX $WRSECX CLR @FAC+2 ;WRITE SECTOR 0=WRITE STSCTX MOVB @OPDRV,@FAC+2 LI R2,PABBUF MOV R2,@FAC+4 MOV @SECTOR,@FAC+6 LI R0,PAB ;SET PAB LI R1,PDATA1 LI R2,>0020 BLWP @VMBW LI R2,PAB+9 ;INVOKE DSR MOV R2,@PNTR BLWP @DSRLNK DATA 10 CKERRX CLR R0 ;CLEAR REG MOVB @DSKERR,R0 ;GET ERROR FLAG JEQ KEYX ;IF NOT SET CONTINUE B @WPMSG ;ERROR.. KEYX BLWP @KSCAN ;KEY PRESSED ?? MOVB @STATUS,R1 JEQ ENDSCX ;NO.. CB @KCODE,@TWO ;YES.. IS IT FCTN 4 (CLEAR) JEQ ABTMSG ;USER HALTED I/O ENDSCX RTWP ABTMSG LWPI MYREG1 SCREEN 1 DISPLAY 21,11,TXTABT,18 ;'I/O HALTED BY USER' B @CONTINUE ;------------------------------------------------------ ; ; -- M A I N -- ; ;------------------------------------------------------ MAIN LWPI MYREG1 LIMI 0 BL @CFID LI R0,>0500 MOV R0,@>8374 ;LOAD KEY UNIT 5 BLWP @CLRSCN LI R0,>F001 ;>01F0 BYTES REVERSED MOVB R0,@>83D4 ;PUT VAL FOR KSCAN SWPB R0 BLWP @VWTR ;ENABLE SCREEN VIDEO//TEXT MODE ; CODE TO CHECK THE TYPE OF DISK CONTROLLER USER LI R12,>1100 SBO 0 ;TURN ON DSR ROM MOV @>4004,R0 ;MOVE WORD AT FIRST DIFFERENCE SBZ 0 ;TURN OFF CI R0,>4010 ;>4010 FOR MYARC JNE FCTL ;MUST BE CORCOM OR TI LI R1,>1000 ;>1000 FOR DSDD MYARC CONTROLLER MOV R1,@SECCNT LI R1,640 ;640 FOR SSDD MOV R1,@DSKCNT LI R1,80 ;BITCOUNT IF DD MOV R1,@BMCNT LI R2,4 ;FILE MUST BE CALLED MGR1 R2 HAS NAME LENGTH JMP FMYA ; GET LAST FILE NAME/DRIVE LOADER IF TI CONTROLLER/CORCOM=?? FCTL LI R0,>3FED ;LAST DRIVE USED BLWP @VSBR MOVB R1,@OPDRV ;SAVE DRIVE # TO BUFFER LI R0,>3FEE ;** VDP ADDRESS OF NAME LI R1,TXTMGR ;** CPU STORAGE FOR NAME LI R2,10 ;** 10 CHARACTERS BLWP @VMBR ;** GET NAME CLR R0 ;** POINTER IN NAME CLR R2 GTNM MOVB *R1+,R2 ;** GET CHARACTER CI R2,>2000 ;** SPACE? JEQ NMOK ;** IF SO, COUNT COMPLETE INC R0 ;** IF NOT, INC. POINTER CI R0,10 ;** LAST CHARACTER? JEQ NMOK ;** IF SO, COUNT COMPLETE JMP GTNM ;** IF NOT, CHECK NEXT DATA >EEEE NMOK MOV R0,R2 ;** HOLD LENGTH IN R2 SWPB R0 MOVB R0,@MGRLN ; SAVE LENGTH LI R0,TXTMGR ;** POINT TO LAST FILE NAME A R2,R0 ;** ONE BYTE AFTER LAST CHAR. DEC R0 ;** LAST CHAR. IN NAME MOVB *R0,R1 ;** MOVE IT TO R1 HIGH BYTE AI R1,-256 ;** DECREMENT HIGH BYTE BY 1 MOVB R1,*R0 ;** MOVE RESULT BACK (FIRST FILE) ;NAME IS ONE CHAR. LESS THAN SECOND) ; *************** FMYA LI R1,1 MOV R1,@SECTOR BLWP @RDSECT BLWP @MOVSCT DATA SRCST1 LI R4,SRCST1 MGRST3 MOV *R4+,@SECTOR JEQ MGR BLWP @RDSECT LI R3,TXTMGR LI R0,PABBUF LI R1,TBUF ; R2 HAS LENGTH OF NAME BLWP @VMBR MGRST4 CB *R3+,*R1+ JNE MGRST3 DEC R2 JNE MGRST4 LI R0,PABBUF+>A0 ;SEE IF LIST/CODES ARE SET BLWP @VSBR MOVB R1,R1 JEQ MGR ;NO.. LI R0,PABBUF+>A0 ;GET LIST DEVICE LI R1,PDATA2+9 LI R2,41 BLWP @VMBR LI R0,PABBUF+>D0 ;GET CONTROL CODES / COLOR CODES LI R1,SCCBUF LI R2,33 BLWP @VMBR MGR LWPI MYREG1 LIMI 0 LI R0,>0007 MOVB @COLBUF,R0 ;SET COLOR AS PER COLBUF SWPB R0 BLWP @VWTR LI R0,KZLP2 MOV R0,@FUNCT BLWP @CLRSCN ;CLEAR SCREEN SCREEN 7 ;SHOW MAIN SCREEN DISPLAY 1,TXTMM1C,TXTMM1,TXTMM1L ;'CF7+ MANAGER' DISPLAY 20,TXTMM2C,TXTMM2,TXTMM2L DISPLAY 22,TXTMM3C,TXTMM3,TXTMM3L DISPLAY 4,5,TXTMM4,TXTMM4L ;'Select Option' DISPLAY 7,12,TXTMM5,17 ;'1. File Utilities' DISPLAY 9,12,TXTMM6,TXTMM6L ;'2. Volume Utilities' DISPLAY 11,12,TXTMM7,17 ;'3. Misc Utilities' LI R0,MGR ;SET FCTN KEYS MOV R0,@FCT8 ;REDO=MGR MOV R0,@FCT9 ;BACK=MGR MOV R0,@CKT8 ;REDO=MGR MOV R0,@CKT9 ;BACK=MGR MGLP1 LI R0,180 ;SCREEN ADDR FOR 'SELECT OPTION' LI R1,>3100 ;DEFAULT=1 BLWP @GTSKEY ;GET KEY CB R1,@ASC_1 ;=1 JEQ MGE1 CB R1,@ATWO ;=2 JEQ MGE2 CB R1,@ATHREE ;=3 JEQ MGE3 JMP MGLP1 ;NO MGE1 B @FILE ;FILE UTILITIES MGE2 B @DSKUTL ;DISK UTILITIES MGE3 B @MSFILE ;MISC UTILITIES ;---------------------------------------------------------------------- ; ; -- F I L E U T I L I T I E S -- ; ;---------------------------------------------------------------------- FILE LWPI MYREG1 LIMI 0 LI R0,FILE ;SET FCTN KEYS MOV R0,@FCT8 ;REDO=FILE MOV R0,@CKT8 ;REDO=FILE LI R0,MGR ;SET FCTN KEYS MOV R0,@FCT9 ;BACK=MGR MOV R0,@CKT9 ;BACK=MGR BLWP @CLRSCN SCREEN 7 DISPLAY 1,TXTCA6C,TXTCA6,TXTCA6L ;'File Utilities' DISPLAY 4,5,TXTMM4,TXTMM4L ;'Select Option:' DISPLAY 6,8,TXTCA8,30 ;'1. Copy/Move/Delete/Type/Print' DISPLAY 8,11,TXTCA9,18 ;'Prot/Unprot/Rename' DISPLAY 10,8,TXTCAE,15 ;'2. Recover File' DISPLAY 12,8,TXTI1,29 ;'3. RUN IMAGE PROGRAM..XB VDP' DISPLAY 14,8,TXTI2,29 ;'4. RUN IMAGE PROGRAM..E/A VDP' ; DISPLAY 16,8,TXTCAF,12 ;'5. Find file' FLP1 LI R0,180 ;GET OPTION LI R1,>3100 BLWP @GTSKEY LI R2,>3134 CB R1,R2 JLT FLP1 SWPB R2 CB R1,R2 JGT FLP1 LI R3,TXTI1 MOV R3,@RIMA+2 ;SET UP MESSAGE ADDRESS DEFAULT TO XB VDP SB @ASC_1,R1 ;INDEXED BRANCH SRL R1,7 MOV @FJMP(R1),R1 B *R1 FJMP DATA CAT ;FILE OPTION 1 DATA RCFILE ;RECOVER FILE DATA IMFXB ;RUN IMAGE FILE XB VDP DATA IMFEA ;RUN IMAGE FILE IN E/A VDP IMFEA LI R1,TXTI2 MOV R1,@RIMA+2 ;SET UP MESSAGE ADDRESS SWPB R0 ;R0=180 IMFXB MOVB R0,@IFLAG ;IFLAG=0(E/A VDP) <>1(XB VDP) B @ILOAD ;LOAD IMAGE FILE RCFILE LWPI MYREG1 ;RECOVER LOST FILE BLWP @CLRSCN LI R0,RCFILE ;ADJUST FCTN KEYS MOV R0,@FCT8 MOV R0,@CKT8 LI R0,FILE MOV R0,@FCT9 MOV R0,@CKT9 SCREEN 4 DISPLAY 1,TXTCA6C,TXTCA6,TXTCA6L ;'FILE UTILITIES' DISPLAY 5,9,TXTCAE,15 ;'2. RECOVER FILE' DISPLAY 14,7,TXTRC1,TXTRC1L ;'Recover File on Drive:' DISPLAY 16,7,TXTRC2,19 ;'Enter Name of File :' RCLP1 BL @GETVOL DATA 591,VDSK1,RCLP1 LI R1,>0100 MOVB R1,@SRCDRV LI R0,667 ;CLEAR NAME BUFFER LI R1,TBUF LI R2,10 BLWP @VMBR BLWP @GTMKEY ;GET FILENAME DATA 667 ;SCREEN ADDR DATA TBUF ;BUFF ADDR DATA 10 ;10 CHAR DATA >202E ;INVALID CHAR (SPACE // PERIOD) SCREEN 1 DISPLAY 19,TXTRC3C,TXTRC3,TXTRC3L ;'SEARCHING VOLUME' MOVB @SRCDRV,@OPDRV CLR @SECTOR ;GET BM BLWP @RDSECX BLWP @MOVSCT DATA DSTST0 INC @SECTOR ;GET LM BLWP @RDSECX BLWP @MOVSCT DATA DSTST1 INC @SECTOR ;SEARCH DISK RCLP4 BLWP @RDSECX LI R0,PABBUF ;GET FILENAME LI R1,DSTST2 LI R2,10 BLWP @VMBR LI R0,TBUF RCLP2 CB *R0+,*R1+ ;COMPARE FILENAMES JNE RFMT030 DEC R2 JNE RCLP2 JMP RCLP5 ;NAME MATCHES RFMT030 INC @SECTOR ;SECTOR+1 C @SECTOR,@DSTST0+10 ARE WE AT END OF DISK?? JNE RCLP4 SCREEN 1 ;'FILE NOT FOUND' DISPLAY 19,12,TXTRC4,TXTRC4L B @TPLP1 RCLP5 BLWP @MOVSCT ;GET FILE DIRECTORY DATA DSTST2 MOV @SECTOR,R8 ;TEST FOR DUP LM POINTER LI R1,DSTST1 ;LM ADDR RCLP5B MOV *R1+,R0 JEQ RCLP5A C R0,R8 JNE RCLP5B JMP RCLP6A RCLP5A LI R1,DSTST2+>1C ;POINT TO BLOCK LINK INFO MOV R1,@BLKLNK BL @GETLNK BL @RTX ;RESTORE BIT MAP INFO MOV @SECTOR,@STRSCT ;RESTORE LINK MAP POINTER CLR @OFFSET BL @RTX MOV @SECTOR,R8 ;SAVE LM POINTER SCREEN 1 DISPLAY 19,9,TXTRC7,21 ;'RE-BUILDING LOST FILE' LI R4,DSTST1 ;LM SORT SXLP1 MOV *R4+,@SECTOR JEQ SXLP3 BLWP @RDSECX LI R0,PABBUF ;GET FILENAME LI R1,TBUF LI R2,10 BLWP @VMBR LI R0,DSTST2 ;COMPARE FILENAME SXLP2 CB *R0+,*R1+ JGT SXLP1 JLT SXLP3 JMP SXLP2 SXLP3 DECT R4 ;SHUFFLE POINTERS SXLP4 MOV *R4,R3 MOV R8,*R4+ MOV *R4,R8 MOV R3,*R4+ JNE SXLP4 SXLP5 CLR @SECTOR ;WRITE BM BLWP @MOVVDP DATA DSTST0 SXLP6 BLWP @WRSECX INC @SECTOR ;WRITE LM BLWP @MOVVDP DATA DSTST1 BLWP @WRSECX RCLP6A SCREEN 2 DISPLAY 19,9,SPACES,21 DISPLAY 19,12,TXTRC5,TXTRC5L ;'FILE RECOVERED' B @TPLP1 RTX MOV R11,R10 ;SAVE RTN ADDR SETO R8 ;OFFSET COUNTER RTXLP1 MOV @STRSCT,R1 CLR R0 ;R0=0 R1=QUOTIENT CI R1,7 ;RANGE (0-7)? JGT RTXLP3 ;NO.. JMP RTXLP4 RTXLP3 DIV @D08,R0 RTXLP4 LI R4,>0100 ;SHIFT MASK LI R3,56 ;BM OFFSET A R0,R3 ;R3 POINTS TO BM BYTE MOV R1,R0 ;R0 IS BIT SHIFT COUNTER JEQ NXSHFT ;IF 0 THEN NO SHIFT SLA R4,0 ;SHIFT R4//R0 TIMES NXSHFT MOVB @DSTST0(R3),R5 CZC R4,R5 ;IS BIT ALREADY SET?? JNE RTXLP5 ;YES..FILE IS OVER WRITTEN SOCB R4,@DSTST0(R3) ;NO.SET BIT INC @STRSCT ;INC ADDR INC R8 C R8,@OFFSET ;ARE WE AT END JEQ RTXLP2 ;YES.. JMP RTXLP1 RTXLP2 BL @GETLNK ;CHECK NEXT BLOCK LINK MOV @STRSCT,R1 JNE RTXLP1 B *R10 RTXLP5 SCREEN 2 DISPLAY 19,9,SPACES,21 DISPLAY 19,7,TXTRC6,26 B @TPLP1 ;---------------------------------------------------------------------- ; ; -- D S K U T L -- ; ; DISK UTILITIES SECTION ; ;---------------------------------------------------------------------- DSKUTL LWPI MYREG1 LIMI 0 BLWP @CLRSCN LI R0,DSKUTL ;SET UP FCTN KEYS MOV R0,@FCT8 ;REDO=DSKUTL MOV R0,@CKT8 ;REDO=DSKUTL LI R0,MGR MOV R0,@FCT9 ;BACK=MGR MOV R0,@CKT9 ;BACK=MGR LI R0,KZLP2 MOV R0,@FUNCT SCREEN 5 DISPLAY 1,TXTDS1C,TXTDS1,TXTDS1L 'V O L U M E U T I L I T I E S' DISPLAY 4,5,TXTMM4,TXTMM4L ;'SELECT OPTION:' DISPLAY 6,7,TXTDS2,TXTDS2L ;'1. Catalog 4. Rename' DISPLAY 8,7,TXTDS3,TXTDS3L ;'2. Backup 5. Format' DISPLAY 10,7,TXTDS4,TXTDS4L ;'3. Erase 6. List' DSKUTL10 LI R0,4*40+20 ;SCRN ADDR LI R1,>3100 BLWP @GTSKEY LI R2,'16' ;IS KEY BETWEEN 1-5 CB R1,R2 JLT DSKUTL10 SWPB R2 CB R1,R2 JGT DSKUTL10 SB @ASC_1,R1 ;ADJUST FOR INDEXED BRANCH SRL R1,7 ;MSB TO LSB *2 MOV @DSULTB(R1),R1 LI R0,DSKUTL MOV R0,@FCT9 ;BACK=DSKUTL MOV R0,@CKT9 ;BACK=DSKUTL B *R1 DSULTB DATA CATALOG ;CATALOG DATA BACKUP ;BACKUP DATA ERASE ;ERASE DATA RENAMEVOL ;RENAME DATA FORMAT ;FORMAT DATA VOLLIST ;LIST VOLUMES ;---------------------------------------------------------------------- ; ; -- R E N A D S -- ; ; THIS SUBROUTINE RENAMES A VOLUME ; ;---------------------------------------------------------------------- RENAMEVOL LWPI MYREG1 LIMI 0 LI R0,RENAMEVOL ;ADJUST FCTN KEYS MOV R0,@FCT8 ;REDO=RENAME MOV R0,@CKT8 BLWP @CLREOS DATA 523 BL @DRINFO ;DISKNAME//FREE//USED SCREEN 1 DISPLAY 17,3,TXTRE1,TXTRE1L ;'New Disk Name :' RENVOL10 BL @GETVOL DATA 533,VDSK1,RENVOL10 BL @DSPVOL LI R3,TXTER3 ;' Volume Write Protected ' BL @CHKVOL DATA DSTST0,0,VOLERR LI R0,699 ;CLEAR BUFFER FOR NAME LI R1,DSTST0 LI R2,10 BLWP @VMBR BLWP @GTMKEY ;GET NEW DISK NAME DATA 699 ;SCRN ADDR DATA DSTST0 ;BUFF ADDR DATA 10 ;10 CHAR DATA >202E ;INVALID CHAR BLWP @MOVVDP ;MOVE BM TO VDP DATA DSTST0 BLWP @WRSECX ;WRITE SECTOR B @DSKUTL ;RETURN ;---------------------------------------------------------------------- ; ; -- D R I N F O -- ; ;---------------------------------------------------------------------- DRINFO SCREEN 3 ;SHOW DISKNAME//FREE//USED DISPLAY 13,3,TXTVOL,9 ;'Volume #:' DISPLAY 14,3,TXTCA0,9 ;'VOLNAME:' DISPLAY 15,3,TXTCAD,14 ;'FREE USED' RT ;---------------------------------------------------------------------- ; ; -- F O R M A T -- ; ;---------------------------------------------------------------------- FORMAT LWPI MYREG1 ;INITIALIZE DISK LIMI 0 LI R0,FORMAT MOV R0,@FCT8 ;REDO=FORMAT FMT010 BLWP @CLREOS DATA 523 BL @DRINFO ;DISKNAME//FREE//USED FMT020 BL @GETVOL DATA 533,VDSK1,FMT020 LI R1,>0100 MOVB R1,@OPDRV CLR @SECTOR ;SEE IF DISK IS ALREADY INITIALIZED BLWP @RDSECT FMT030 BLWP @MOVSCT ;BETTER CHECK DISK FIRST DATA DSTST0 LI R3,TXTER3 ;' Volume Write Protected ' BL @CHKVOL DATA DSTST0,FMT050,VOLERR BL @SHOWDN ;SHOW DISK NAME JMP FMT050 FMT040 SCREEN 1 DISPLAY 14,13,TXTIN5,15 ;'NOT INITIALIZED' FMT050 SCREEN 1 DISPLAY 23,3,TXTIN0,TXTIN0L ;'INITIALIZE DISK (Y/N)?' LI R0,23*40+3+TXTIN0L+1 MOVB @YES,R1 BLWP @GTSKEY SCREEN 2 DISPLAY 14,13,SPACES,15 DISPLAY 23,3,SPACES,28 CB @YES,R1 JNE FMT010 FMT060 BLWP @INITB ;BRANCH TO INITIALIZE BL @SHOWDN FMT070 SCREEN 1 DISPLAY 23,TXTCD5C,TXTCD5,TXTCD5L ;'FORMAT ANOTHER? (Y/N)?' LI R0,23*40+TXTCD5C+TXTCD5L+1 MOVB @YES,R1 BLWP @GTSKEY CB @YES,R1 JEQ FMT010 MOV @FCT9,R1 ;RETURN TO "BACK" B *R1 ADDRS DATA >2000,>4000 ;HIGH/LOW ; DATA >DD00,>F900 DATA >0000 RDERR DATA 0 WTERR DATA 0 BMFLG DATA 0 ;---------------------------------------------------------------------- ; ; -- V O L L I S T -- ; ; THIS SUBROUTINE LISTS ALL INITIALIZED VOLUMES ; ;---------------------------------------------------------------------- TXTVTTL TEXT '-= LIST VOLUMES =-' TXTVTTLL EQU $-TXTVTTL TXTVTTLC EQU 40-TXTVTTLL/2 TXTVOL1 TEXT 'VOL# VOL NAME FREE USED P' TXTVOL1L EQU $-TXTVOL1 TXTVOL2 TEXT '----- ---------- ---- ---- -' TXTVOL2L EQU $-TXTVOL2 TXTVOLN TEXT '##### ########## #### #### #' TXTVOLNL EQU $-TXTVOLN TXTVOLNAM EQU TXTVOLN+7 TXTVOLFRE EQU TXTVOLN+19 TXTVOLUSD EQU TXTVOLN+25 TXTVOLPRT EQU TXTVOLN+31 EVEN ; |VOL#|VOL NAME|FREE|USED| ; 2 | 10 | 2 | 2 | VOL.NBR EQU 0 VOL.NAM EQU 2 VOL.FREE EQU 12 VOL.USED EQU 14 VOL.LEN EQU 16 LINE DATA 0 VOL DATA 0 VOLMAX DATA 39 VOLLIST LWPI MYREG1 LIMI 0 LI R0,VOLLIST MOV R0,@FCT8 LI R0,VOLPRNT MOV R0,@FUNCT BLWP @CLRSCN SCREEN 3 DISPLAY 0,TXTVTTLC,TXTVTTL,TXTVTTLL ;'LIST VOLUMES' DISPLAY 1,4,TXTVOL1,TXTVOL1L ;' VOL# VOL NAME AVAIL USED P' DISPLAY 2,4,TXTVOL2,TXTVOL2L ;'----- ---------- ----- ---- -' CLR @SECTOR MOVB @ONE,@OPDRV LI R0,1 MOV R0,@VOL VLIST05 C @VOL,@VOLMAX JHE VLIST30 BLWP @CLREOS DATA 3*40 LI R0,3*40+8 MOV R0,@VLIST20 LI R3,20 VLIST10 LI R0,VDSK1 ;VIRTUAL DSK1 MOV @VOL,R1 BLWP @VSBW SWPB R1 MOVB R1,@VDPWD BLWP @RDSECX BLWP @MOVSCT DATA SRCST0 MOV @VOL,R0 BLWP @DISP VLIST20 DATA 611 BL @CHKVOL ;CHECK IF VOLUME IS INITIALIZED DATA SRCST0,VLIST25,0 MOV @VLIST20,R0 AI R0,3 LI R1,SRCST0 LI R2,10 BLWP @VMBW BL @CALCBM DATA SRCST0 MOV @VLIST20,R0 AI R0,18 MOV R0,@VLIST23 MOV @TEMPR1,R0 BLWP @DISP VLIST23 DATA 0 MOV @VLIST20,R0 AI R0,24 MOV R0,@VLIST24 MOV @TEMPR2,R0 BLWP @DISP VLIST24 DATA 0 MOV @VLIST20,R0 AI R0,27 MOVB @SRCST0+16,R1 BLWP @VSBW VLIST25 C @VOL,@VOLMAX JHE VLIST30 LI R0,40 A R0,@VLIST20 INC @VOL DEC R3 JNE VLIST10 VLIST30 BL @DSRTN VLIST35 LI R0,960 ;LOCATION OFF SCREEN MOVB @ASCLO,R1 BLWP @GTSKEY CB R1,@ASCHI JLE VLIST35 VLIST40 CB R1,@CTRLX ;NEXT PAGE? JEQ VLIST05 ;YES CB R1,@CTRLE ;PREV PAGE? JNE VLIST35 ;NO - GET KEY AGAIN MOV @VOL,R0 AI R0,-40 ;TAKE AWAY CURRENT AND PREV. PAGE JGT VLIST45 LI R0,1 VLIST45 MOV R0,@VOL JMP VLIST05 ;---------------------------------------------------------------------- ; ; -- B A C K U P -- ; ; THIS SUBROUTINE BACKS-UP A VOLUME ; ;---------------------------------------------------------------------- BACKUP LWPI MYREG1 ;COPY DISK UTILITY LIMI 0 ;DISABLE INTERRUPTS LI R0,BACKUP MOV R0,@FCT8 CLR @RDERR CLR @WTERR BLWP @CLRSCN SCREEN 5 DISPLAY 1,TXTDS1C,TXTDS1,TXTDS1L ;'VOLUME UTILIES' DISPLAY 5,TXTDS3AC,TXTDS3A,TXTDS3AL ;'2. BACKUP' DISPLAY 8,5,TXTMM4,14 ;SELECT OPTION DISPLAY 10,7,TXTMS4,TXTMS4L ;1 BIT MAP DISPLAY 12,7,TXTMS5,TXTMS5L ;2 SECTOR LI R0,8*40+20 BKP010 LI R1,>3200 BLWP @GTSKEY CB R1,@ASC_1 JNE BKP015 ;BIT COPY LI R1,TXTDSA ;"SET COPY "BIT MAP" CLR @BMFLG JMP BKP020 BKP015 CB R1,@ATWO JNE BKP010 SETO @BMFLG ;SECTOR COPY LI R1,TXTDSB ;'SET COPY "SECTOR" BKP020 MOV R1,@BKP040+2 LI R0,BKP030 MOV R0,@FCT8 ;REDO= VOL. COPY WITHOUT 1ST MENU BKP030 BLWP @CLRSCN SCREEN 9 DISPLAY 1,TXTDS1C,TXTDS1,TXTDS1L ;'V O L . U T I L I T I E S' BKP040 DISPLAY 4,10,0,TXTDSAL DISPLAY 6,3,TXTFRM,6 ;'MASTER' DISPLAY 7,3,TXTVOL,9 ;'DRIVE NO." DISPLAY 8,3,TXTSCT,11 ;'SECTOR' DISPLAY 12,3,TXTTO,6 ;'Backup' DISPLAY 13,3,TXTVOL,9 ;'Volume # DISPLAY 14,3,TXTSCT,11 ;'SECTOR' DISPLAY 23,2,TXTDS6,TXTDS6L ;'WARNING BACKUP VOL. WILL BE ERASED' BKP050 BL @GETVOL ;GET SOURCE VOLUME AND SET IT AS VDSK1 DATA 7*40+13,VDSK1,BKP050 LI R1,>0100 MOVB R1,@SRCDRV BKP060 BL @GETVOL ;GET DESTINATION VOLUME AND SET IT AS VDSK2 DATA 13*40+13,VDSK2,BKP060 LI R1,>0200 MOVB R1,@DSTDRV LWPI MYREG6 ;WORK SPACE FOR WRITING CLR R8 LWPI MYREG1 CLR R8 ;WORK SPACE FOR READING ; SCREEN 1 ; DISPLAY 21,12,TXTCP1,17 ;'CHECKING FORMAT' BKP070 MOVB @SRCDRV,@OPDRV MOV R8,R8 JNE BKP130 CLR @SECTOR BLWP @RDSECX BLWP @MOVSCT DATA SRCST0 MOV @SRCST0+10,@OFFSET BKP080 MOVB @DSTDRV,@OPDRV CLR @SECTOR BLWP @RDSECT BLWP @MOVSCT DATA DSTST0 LI R3,TXTER3 ;' Volume Write Protected ' BL @CHKVOL DATA DSTST0,0,VOLERR BKP100 SCREEN 1 DISPLAY 21,12,SPACES,17 MOVB @SRCDRV,@OPDRV MOV @BMFLG,@BMFLG JEQ BKP120 ;IF EQ THEN BIT-MAP MODE ; ; SECTOR-BY-SECTOR MODE ; LI R4,200 ;SET ALL SECTORS IN BITMAP SETO R2 LI R1,SRCST0+>38 BKP110 MOV R2,*R1+ DECT R4 JNE BKP110 BKP120 LI R12,SRCST0+>38 ;BM ADDR LI R4,8 ;8 BITS LI R5,>0001 ;SHIFT MASK MOVB *R12+,R7 SWPB R7 BKP130 LI R3,ADDRS BKP140 MOV *R3+,R10 JEQ BKP210 BKP150 CZC R5,R7 ;SECTOR NOT USED? JNE BKP160 ;NO INC R8 JMP BKP190 BKP160 MOV R10,@BKP180 MOV R8,@SECTOR BLWP @RDSECT MOV R0,R0 ;ERROR? JEQ BKP170 ;NO.. INC @RDERR ;YES.. BKP170 MOV R8,R0 ;SCREEN SECTOR INC R0 BLWP @DISP DATA 8*40+13 BLWP @MOVSCT BKP180 DATA 0 INC R8 AI R10,256 BKP190 SRC R7,1 ;BIT MASK = NEXT POSITION DEC R4 ;ALL 8 BITS TESTED? JNE BKP200 ;NO MOVB *R12+,R7 ;YES, NEXT BYTE SWPB R7 LI R4,8 ;RESET LOOP COUNTER BKP200 C @OFFSET,R8 JEQ BKP280 C *R3,R10 JNE BKP150 INCT R3 JMP BKP140 BKP210 CLR R10 LI R13,>1100 LI R0,PAB LI R1,PDATA1 LI R2,>0020 BLWP @VMBW CLR @FAC+2 INC @FAC+2 MOVB @SRCDRV,@FAC+2 BKP220 CZC R5,R7 JNE BKP230 INC R8 JMP BKP260 BKP230 MOV R13,@FAC+4 MOV R8,@FAC+6 MOV R13,@TEMPR1 LI R0,PAB+2 LI R1,TEMPR1 LI R2,2 BLWP @VMBW LI R2,PAB+9 MOV R2,@PNTR BLWP @DSRLNK DATA 10 MOVB @DSKERR,R0 JEQ BKP240 INC @RDERR BKP240 BLWP @KSCAN MOVB @STATUS,R1 JEQ BKP250 CB @KCODE,@TWO JNE BKP250 B @ABTMSG BKP250 MOV R8,R0 INC R0 BLWP @DISP DATA 8*40+13 INC R8 INC R10 AI R13,256 BKP260 SRC R7,1 DEC R4 JNE BKP270 MOVB *R12+,R7 SWPB R7 LI R4,8 BKP270 C @OFFSET,R8 JEQ BKP280 CI R10,37 JNE BKP220 BKP280 MOVB @DSTDRV,@OPDRV LWPI MYREG6 MOV R8,R8 JNE BKP290 LI R12,SRCST0+>38 ;BM ADDR LI R4,8 LI R5,>0001 MOVB *R12+,R7 SWPB R7 BKP290 LI R3,ADDRS BKP300 MOV *R3+,R10 JEQ BKP370 BKP310 CZC R5,R7 JNE BKP320 INC R8 JMP BKP350 BKP320 MOV R10,@BKP330 MOV R8,@SECTOR BLWP @MOVVDP BKP330 DATA 0 BLWP @WRSECT MOV R0,R0 ;ERROR JEQ BKP340 ;NO. INC @WTERR ;YES.. BKP340 MOV R8,R0 INC R0 BLWP @DISP DATA 14*40+13 INC R8 AI R10,256 BKP350 SRC R7,1 DEC R4 JNE BKP360 MOVB *R12+,R7 SWPB R7 LI R4,8 BKP360 C @OFFSET,R8 JEQ BKP440 C *R3,R10 JNE BKP310 INCT R3 JMP BKP300 BKP370 CLR R10 LI R13,>1100 LI R0,PAB LI R1,PDATA1 LI R2,>0020 BLWP @VMBW CLR @FAC+2 MOVB @DSTDRV,@FAC+2 BKP380 CZC R5,R7 JNE BKP390 INC R8 JMP BKP420 BKP390 MOV R13,@FAC+4 MOV R8,@FAC+6 MOV R13,@TEMPR1 LI R0,PAB+2 LI R1,TEMPR1 LI R2,2 BLWP @VMBW LI R2,PAB+9 MOV R2,@PNTR BLWP @DSRLNK DATA 10 MOVB @DSKERR,R0 JEQ BKP400 INC @WTERR BKP400 BLWP @KSCAN MOVB @STATUS,R1 JEQ BKP410 CB @KCODE,@TWO JNE BKP410 B @ABTMSG BKP410 MOV R8,R0 INC R0 BLWP @DISP DATA 573 INC R8 INC R10 AI R13,256 BKP420 SRC R7,1 DEC R4 JNE BKP430 MOVB *R12+,R7 SWPB R7 LI R4,8 BKP430 C @OFFSET,R8 JEQ BKP440 CI R10,37 JNE BKP380 LWPI MYREG1 B @BKP070 ; DISPLAY ERROR RESULTS BKP440 SCREEN 2 DISPLAY 18,13,TXTCD1,12 ;'READ ERRORS' DISPLAY 19,13,TXTCD2,12 ;'WRITE ERRORS' MOV @RDERR,R0 BLWP @DISP DATA 731 MOV @WTERR,R0 BLWP @DISP DATA 771 CLR @RDERR ;CLEAR ERR COUNT CLR @WTERR ;CLEAR ERR COUNT CONTINUE SCREEN 2 DISPLAY 23,0,SPACES,40 DISPLAY 23,TXTCD3C,TXTCD3,TXTCD3L ;'PRESS ANY KEY TO CONTINUE' CONTUE10 BLWP @KSCAN ;TEMP ADDR FOR TESTING MOVB @STATUS,R2 CZC @KEYMSK,R2 JEQ CONTUE10 MOV @FCT9,R1 ;RETURN TO "BACK" B *R1 ;---------------------------------------------------------------------- ; ; -- C H K V O L -- ; ; CHECKS VOLUME TO SEE IF "DSK" IS SET OR IF IT IS PROTECTED ; ;---------------------------------------------------------------------- CHKVOL MOV *R11+,R1 MOV *R11+,R2 JEQ CHKVOL10 ;IF ZERO IGNORE CHECK LI R0,TXTDSK CB @13(R1),*R0+ JNE CHKVOL30 CB @14(R1),*R0+ JNE CHKVOL30 CB @15(R1),*R0+ JNE CHKVOL30 CHKVOL10 MOV *R11+,R2 ;IF ZERO IGNORE CHECK JEQ CHKVOL99 CB @16(R1),@ASC_P JNE CHKVOL99 CHKVOL30 B *R2 CHKVOL99 RT ;******** DSRLNK FOR XBASIC ******** SCNAME EQU >8356 SCLEN EQU >8355 CRULST EQU >83D0 SADDR EQU >83D2 DSRLNK DATA DLNKWS,DLENTR NAMBUF DATA 0,0,0,0 SAVLEN DATA 0 SAVPAB DATA 0 SAVVER DATA 0 SAVENT DATA 0 SAVCRU DATA 0 DLNKWS DATA 0,0,0,0,0 TYPE DATA 0,0,0,0,0,0,0,0,0,0,0 DECMAL TEXT '.' HAA BYTE >AA DLENTR MOV *R14+,R5 SZCB @KEYMSK,R15 MOV @SCNAME,R0 MOV R0,R9 AI R9,-8 BLWP @VSBR MOVB R1,R3 SRL R3,8 SETO R4 LI R2,NAMBUF LNK$LP INC R0 INC R4 C R4,R3 JEQ LNK$LN BLWP @VSBR MOVB R1,*R2+ CB R1,@DECMAL JNE LNK$LP LNK$LN MOV R4,R4 JEQ LNKERR CI R4,7 JGT LNKERR CLR @CRULST MOV R4,@SCLEN-1 MOV R4,@SAVLEN INC R4 A R4,@SCNAME MOV @SCNAME,@SAVPAB SROM LWPI GPLWS CLR R1 LI R12,>1100 CLR R8 NOROM MOV R12,R12 JEQ NOOFF SBZ 0 NOOFF AI R12,>0100 CLR @CRULST CI R12,>2000 JNE NOT20 MOV R8,R8 JNE NODSR SETO R8 LI R12,>0F00 JMP NOROM NOT20 MOV R12,@CRULST SBO 0 LI R2,>4000 CB *R2,@HAA JNE NOROM A @TYPE,R2 JMP SGO2 SGO MOV @SADDR,R2 SBO 0 SGO2 MOV *R2,R2 JEQ NOROM MOV R2,@SADDR INCT R2 MOV *R2+,R9 MOVB @SCLEN,R5 JEQ NAME2 CB R5,*R2+ JNE SGO SRL R5,8 LI R6,NAMBUF NAME1 CB *R6+,*R2+ JNE SGO DEC R5 JNE NAME1 NAME2 INC R1 MOV R1,@SAVVER MOV R9,@SAVENT MOV R12,@SAVCRU BL *R9 JMP SGO SBZ 0 LWPI DLNKWS MOV R9,R0 BLWP @VSBR SRL R1,13 JNE IOERR RTWP NODSR LWPI DLNKWS LNKERR CLR R1 IOERR SWPB R1 MOVB R1,*R13 SOCB @KEYMSK,R15 RTWP ;---------------------------------------------------------------------- ; ; -- K S C A N -- ; ;---------------------------------------------------------------------- KSCAN DATA MYREG3,KSCAN1 KSCAN1 LWPI GPLWS MOV R11,@MYREG3+22 BL @>000E LWPI MYREG3 MOV R11,@GPLWS+22 RTWP ;---------------------------------------------------------------------- ; ; -- CATALOG -- ; ; DISK CATALOG ; ;---------------------------------------------------------------------- CATALOG LWPI MYREG1 LI R0,CATALOG ;ADJUST FCTN KEYS MOV R0,@FCT8 LI R0,CATPRNT ;OK TO BRANCH NOW MOV R0,@FUNCT BLWP @CLRSCN ;CLEAR SCREEN SCREEN 2 DISPLAY 1,TXTDS1C,TXTDS1,TXTDS1L ;'VOLUME UTILITIES' DISPLAY 4,TXTCT1C,TXTCT1,TXTCT1L ;'CATALOG VOLUME' BL @DRINFO ;DISKNAME//FREE//USED D2LP1 BL @GETVOL DATA 533,VDSK1,D2LP1 LI R1,>0100 MOVB R1,@SRCDRV BL @DSPVOL SETO @DSTBLK ;FLAG=FFFF CALLED FROM DISK UTILITY B @FILE20 CATALOG2 CB @DSTST0+>10,@TXTFD3 ;DISK PROTECT INDICATOR JNE GTT3A MOVB @TXTPLS,@TXTCA1+18 JMP GTT4 GTT3A MOVB @TXTMIN,@TXTCA1+18 GTT4 LI R0,SCNBUF ;CLEAR CMD FIELD LI R1,>2020 P2LP1 MOV R1,*R0 AI R0,40 C R0,@SCNEND JLT P2LP1 BLWP @CLRSCN SCREEN 3 DISPLAY 0,0,TXTCA1,40 ;'DISKNAME//FREE//USED//' DISPLAY 1,4,TXTCA2+4,36 ;'FILENAME//SIZE//TYPE//P' DISPLAY 2,4,TXTCA3+4,29 ;'-------' LI R0,78 ;# OF PAGES MOVB @PGCNT,R1 AB @H30,R1 BLWP @VSBW MOVB @ONE,@DSPAGE PGSHOW BL @DSPGS P2LP30 LI R0,960 ;LOCATION OFF SCREEN MOVB @ASCLO,R1 BLWP @GTSKEY CB R1,@ASCHI JH P2LP40 JMP P2LP30 P2LP40 CB R1,@CTRLX JEQ P2LP50 CB R1,@CTRLE JNE P2LP30 SB @ONE,@DSPAGE ;SHOW PREVIOUS PAGE..IF ANY CB @DSPAGE,@ONE JEQ PGSHOW JGT PGSHOW AB @ONE,@DSPAGE JMP P2LP30 P2LP50 AB @ONE,@DSPAGE ;SHOW NEXT PAGE ..IF ANY CB @DSPAGE,@PGCNT JLT PGSHOW JEQ PGSHOW SB @ONE,@DSPAGE JMP P2LP30 ;---------------------------------------------------------------------- ; ; -- E R A S E -- ; ; THIS FUNCTION ERASES A VOLUME ; ;---------------------------------------------------------------------- ERASE LWPI MYREG1 LI R0,ERASE ;ADJUST FCTN KEYS MOV R0,@FCT8 BLWP @CLREOS DATA 523 BL @DRINFO ;DISPLAY VOLUME FORM SWLP1 BL @GETVOL ;GET VOLUME NUMBER DATA 533,VDSK1,SWLP1 BL @DSPVOL LI R3,TXTER3 ;' Volume Write Protected ' BL @CHKVOL DATA DSTST0,0,VOLERR SCREEN 1 DISPLAY 23,7,TXTSWP,17 ;ERASE VOL. (Y/N)? SWLP2 LI R0,23*40+25 MOVB @ASC_N,R1 ;NO IS DEFAULT BLWP @GTSKEY CB @YES,R1 JEQ SWLP3 CB @ASC_N,R1 JNE SWLP2 JMP ERASE SWLP3 LI R0,1600/8 ;BM DEFAULT 1600/8 BYTES LI R1,DSTST0+>38 ;START OF BM SWLP6 CLR *R1+ DECT R0 JNE SWLP6 LI R1,DSTST0+>38 MOVB @H03,*R1 BLWP @MOVVDP ;COPY SECTOR TO VRAM DATA DSTST0 SWLP8 BLWP @WRSECX ;WRITE BM TO DISK BLWP @CLRBUF ;CLEAR LM BUFFER DATA DSTST1 BLWP @MOVVDP DATA DSTST1 INC @SECTOR BLWP @WRSECX ;ERASE LINK MAP BL @DSPVOL B @CONTINUE PAB2 EQU >1E00 PDATA2 DATA >0016,>1000,>5000,>0000,PNAMEL PNAME TEXT 'SIO.BA=9600.DA=7.PA=E' PNAMEL EQU $-PNAME BSS 40-PNAMEL ;---------------------------------------------------------------------- ; ; -- DSPVOL -- ; ; DISPLAY VOLUME INFORMATION ; ;---------------------------------------------------------------------- DSPVOL MOV R11,@DSPVOL99+2 LI R1,>0100 ;READ SECTOR FROM MOVB R1,@OPDRV CLR @SECTOR BLWP @RDSECX BLWP @MOVSCT ;MOVE TO CPU RAM DATA DSTST0 BL @CHKVOL DATA DSTST0,DSPVOLERR,0 BL @SHOWDN ;DISPLAY VOLUME INFORMATION DSPVOL99 B @0 DSPVOLERR LI R3,TXTER4 B @VOLERR ;---------------------------------------------------------------------- ; ; -- O P N P R N T -- ; ; THIS OPENS THE PRINTER PORT (AS SET BY USER) ; ;---------------------------------------------------------------------- OPNPRNT MOV R11,@OPNPRN99+2 LI R0,PAB2 ;LOAD PAB * OPEN * LI R1,PDATA2 LI R2,50 BLWP @VMBW LI R4,PAB2+9 MOV R4,@PNTR BLWP @DSRLNK DATA 8 OPNPRN99 B @0 ;---------------------------------------------------------------------- ; ; -- O P N O P T S -- ; ; SET PAB PARAMETERS ; ;---------------------------------------------------------------------- OPNOPTS MOVB *R11+,R1 LI R0,PAB2+5 BLWP @VSBW MOVB *R11+,R1 LI R0,PAB2 BLWP @VSBW ;* WRITE OPCODE * RT ;---------------------------------------------------------------------- ; ; -- Z R O L I N E -- ; ; ; ;---------------------------------------------------------------------- ZROLINE CLR R1 JMP CLRLIN05 ;---------------------------------------------------------------------- ; ; -- C L R L I N E -- ; ; ; ;---------------------------------------------------------------------- CLRLINE LI R1,>2000 CLRLIN05 LI R0,PABBUF BLWP @VSBW LI R2,39 CLRLIN10 MOVB R1,@VDPWD DEC R2 JNE CLRLIN10 RT ;---------------------------------------------------------------------- ; ; -- L I N E P R N T -- ; ; ; ;---------------------------------------------------------------------- LINEPRNT LI R4,PAB2+9 MOV R4,@PNTR BLWP @DSRLNK DATA 8 RT ;---------------------------------------------------------------------- ; ; -- F O R M F E E D -- ; ; PRINT A FORM FEED ; ;---------------------------------------------------------------------- FORMFEED MOV R11,@FRMFED99+2 BL @ZROLINE LI R0,PABBUF LI R1,>0C00 BLWP @VSBW BL @LINEPRNT FRMFED99 B @0 ;---------------------------------------------------------------------- ; ; -- V O L P R N T -- ; ; THIS ROUTINE PRINTS THE CATALOG ; ;---------------------------------------------------------------------- VOLPRNT LI R0,VOLLIST ;CALLED FROM VOLLIST C @FCT8,R0 JEQ VOLPR05 ;NO..EXIT RTWP VOLPR05 BL @OPNPRNT BL @EKTEST ;ERROR//KEY PRESSED TEST BL @OPNOPTS ;SET PAB DATA WIDTH & FUNCTION BYTE 40,>03 LI R0,1 MOV R0,@VOL VOLPR10 CLR @LINES BL @CLRLINE LI R0,PABBUF+TXTVTTLC LI R1,TXTVTTL LI R2,TXTVTTLL BLWP @VMBW BL @LINEPRNT BL @CLRLINE LI R0,PABBUF+4 LI R1,TXTVOL1 LI R2,TXTVOL1L BLWP @VMBW BL @LINEPRNT BL @CLRLINE LI R0,PABBUF+4 LI R1,TXTVOL2 LI R2,TXTVOL2L BLWP @VMBW BL @LINEPRNT CLR @SECTOR MOVB @ONE,@OPDRV VOLPR20 LI R0,VDSK1 ;VIRTUAL DSK1 MOV @VOL,R1 BLWP @VSBW SWPB R1 MOVB R1,@VDPWD BLWP @RDSECX BLWP @MOVSCT DATA SRCST0 BL @CLRLINE MOV @VOL,R0 BLWP @DISP DATA PABBUF+8 BL @CHKVOL ;TEST DISK MARKER ("DSK") DATA SRCST0,VOLPR30,0 LI R0,PABBUF+11 ;SET VOLUME NAME LI R1,SRCST0 LI R2,10 BLWP @VMBW BL @CALCBM ;COUNT USED SECTORS DATA SRCST0 MOV @TEMPR1,R0 ;FREE SECTORS BLWP @DISP DATA PABBUF+26 MOV @TEMPR2,R0 ;USED SECTORS BLWP @DISP DATA PABBUF+32 LI R0,PABBUF+35 MOVB @SRCST0+16,R1 BLWP @VSBW VOLPR30 BL @LINEPRNT INC @VOL C @VOL,@VOLMAX JH VOLPR99 INC @LINES C @LINES,@D00055 JL VOLPR20 BL @FORMFEED JMP VOLPR10 VOLPR99 BL @FORMFEED JMP CLSPRNT LINES DATA 0 D00055 DATA 55 ;---------------------------------------------------------------------- ; ; -- C A T P N T -- ; ; THIS ROUTINE PRINTS THE CATALOG ; ;---------------------------------------------------------------------- CATPRNT LI R0,CATALOG ;CALLED FROM CATALOG C @FCT8,R0 JEQ CATPR05 ;NO..EXIT RTWP CATPR05 BL @OPNPRNT BL @EKTEST ;ERROR//KEY PRESSED TEST BL @OPNOPTS ;SET PAB DATA WIDTH & FUNCTION BYTE 30,>03 MOVB @SCCBUF,@SCCBUF ;SEND CONTROL CODES JEQ CATPR10 ;NO.. MOVB @SCCBUF,R1 ;# OF CODES TO SEND LI R0,PAB2+5 BLWP @VSBW MOVB R1,R2 ;BYTES TO SEND SRL R2,8 LI R0,PABBUF LI R1,SCCBUF+1 BLWP @VMBW BL @LINEPRNT BL @EKTEST LI R1,>1E00 LI R0,PAB2+5 BLWP @VSBW CATPR10 LI R0,PABBUF ;DISKNAME LI R1,TXTCA1+8 LI R2,11 BLWP @VMBW A R2,R0 LI R1,TXTCA1+21 ;FREE/USED LI R2,19 BLWP @VMBW BL @LINEPRNT BL @EKTEST LI R3,2 LI R1,TXTCA2+4 LI R2,31 CATPR20 LI R0,PABBUF ;FILENAME SIZE TYPE/NO. P BLWP @VMBW BL @LINEPRNT BL @EKTEST AI R1,40 DEC R3 JNE CATPR20 LI R1,SCNBUF+4 ;PRINT ALL FILES CATPR30 BLWP @VMBW BL @LINEPRNT BL @EKTEST AI R1,40 C R1,@SCNEND JLT CATPR30 CLSPRNT LI R0,PAB2 ;* CLOSE OPCODE * LI R1,>0100 BLWP @VSBW SWPB R1 LI R0,PAB2+5 BLWP @VSBW BL @LINEPRNT BL @EKTEST RTWP ;---------------------------------------------------------------------- ; ; -- E K T E S T -- ; ;---------------------------------------------------------------------- EKTEST STST R8 CZC @KEYMSK,R8 JEQ EKTST10 SCREEN 1 DISPLAY 21,TXTER1C,TXTER5,TXTER1L B @CONTINUE EKTST10 BLWP @KSCAN ;ANY KEY WILL ABORT OUTPUT MOVB @STATUS,R8 CZC @KEYMSK,R8 JEQ EKTST99 BLWP @CLRSCN B @ABTMSG EKTST99 RT ;---------------------------------------------------------------------- ; ; -- M S F I L E -- ; ;---------------------------------------------------------------------- MSFILE LWPI MYREG1 LI R0,MSFILE ;ADJUST FCTN KEYS MOV R0,@FCT8 LI R0,MGR ;ADJUST FCTN KEYS MOV R0,@FCT9 BLWP @CLRSCN SCREEN 8 DISPLAY 1,TXTMS6C,TXTMS6,TXTMS6L ;'M I S C U T I L I T I E S' DISPLAY 4,5,TXTMM4,14 ;'SELECT OPTION' DISPLAY 7,8,TXTMS1,26 ;'1. INSTALL DISK PROTECTION' DISPLAY 9,8,TXTMS2,25 ;'2. REMOVE DISK PROTECTION' DISPLAY 11,8,TXTMS3,23 ;'3. REMOVE XB PROTECTION' DISPLAY 13,8,TXTMSB,23 ;'4. CHange FOREGND COLOR' DISPLAY 15,8,TXTMSC,23 ;'5. CHange BACKGND COLOR' DISPLAY 17,8,TXTMSD,19 ;'6. CF Info/geometry' MSKLP1 LI R0,180 ;GET OPTION LI R1,>3500 BLWP @GTSKEY LI R2,'16' ;VALIDATE OPTION SELECTION CB R1,R2 JLT MSKLP1 SWPB R2 CB R1,R2 JGT MSKLP1 SB @ASC_1,R1 ;INDEXED BRANCH SRL R1,7 MOV @MSJMP(R1),R1 LI R0,MSFILE ;ADJUST FCTN KEYS MOV R0,@FCT9 MOV R0,@CKT9 B *R1 MSJMP DATA IDPDSK ;* INSTALL DISK PROTECTION DATA RDPDSK ;* REMOVE DISK PROTECTION DATA RXBDSK ;* REMOVE XB PROTECTION DATA FGCOL ;* FOREGND COLOR DATA BGCOL ;* BACKGND COLOR DATA CFINFO ;* CF INFO MCOLOR DATA >F000 FGCOL CLR R0 MOVB @COLBUF,R0 ;COLBUF= 25 R0=2500 LI R1,>1000 CZC @MCOLOR,R0 ;IS R0 =FXXX JEQ FGOK ;NO A R1,R0 ;YES FGCOLOR OF 0 NOT ALOWED FGOK A R1,R0 ;R0=35XX JMP RMGR BGCOL MOVB @COLBUF,R0 ;COLBUF=25 R0=25XX LI R1,>1000 SLA R0,4 ;R0= 5XX0 CZC @MCOLOR,R0 ;IS R0=FXXX JEQ BGOK ;NO A R1,R0 ;YES COLOR OF 0 NOT ALLOWED BGOK A R1,R0 SRL R0,12 ;R0=0006 MOVB @COLBUF,R1 ;R1=25XX SRL R1,12 ;R1=0002 SLA R1,4 ;R1=0020 A R1,R0 ;R0=0026 SWPB R0 RMGR AI R0,>0007 MOVB R0,@COLBUF SWPB R0 LI R1,>2000 ;DELAY AGN DEC R1 JNE AGN BLWP @VWTR B @MSFILE ;---------------------------------------------------------------------- ; ; ** COMPACT FLASH PORT ADDRESSES ** ; ;---------------------------------------------------------------------- DATAR EQU >5F81 *DATA(READ) STATR EQU >5F8F *STATUS(READ) DATAW EQU >5FC1 *DATA(WRITE) FEATW EQU >5FC3 *FEATURE(WRITE) CMDW EQU >5FCF *COMMAND(WRITE) CFID LI R12,>1100 ;* SET 8 BIT MODE ** SBO 0 LI R0,>01EF MOVB R0,@FEATW SWPB R0 MOVB R0,@CMDW LI R0,>5000 ;* IDENTIFY DRIVE ** CFID05 MOVB @STATR,R1 CB R0,R1 JNE CFID05 LI R0,>EC58 ;* IDENTIFY DRIVE ** MOVB R0,@CMDW SWPB R0 CFID10 MOVB @STATR,R1 CB R1,R0 JNE CFID10 LI R0,BUF512 LI R1,512 CFID20 MOVB @DATAR,R2 SWPB R2 MOVB @DATAR,R2 MOV R2,*R0+ DECT R1 JNE CFID20 LI R12,>1100 ;* SET 16-BIT MODE ** SBO 0 LI R0,>81EF MOVB R0,@FEATW SWPB R0 MOVB R0,@CMDW MOV @BUF512+14,R0 MOV @BUF512+16,R1 DIV @W1600,R0 MOV R0,@VOLMAX SBZ 0 RT W1600 DATA 1600 MSG1 TEXT 'COMPACT FLASH INFO' MSG1L EQU $-MSG1 CYL TEXT 'CYLS:' CYLL EQU $-CYL HDS TEXT 'HEADS:' HDSL EQU $-HDS SEC TEXT 'SECTS:' SECL EQU $-SEC SN TEXT 'SERIAL#' SNL EQU $-SN FRMW TEXT 'FIRMWARE:' FRMWL EQU $-FRMW MODEL TEXT 'MODEL#' MODELL EQU $-MODEL VOLNM TEXT 'MAX VOLS:' VOLNML EQU $-VOLNM CFINFO BLWP @CLREOS DATA 80 BL @CFID SCREEN 10 DISPLAY 4,4,CYL,CYLL DISPLAY 6,4,HDS,HDSL DISPLAY 8,4,SEC,SECL DISPLAY 10,4,SN,SNL DISPLAY 10,14,BUF512+20,20 DISPLAY 12,4,FRMW,FRMWL DISPLAY 12,14,BUF512+46,8 DISPLAY 14,4,MODEL,MODELL DISPLAY 14,14,BUF512+54,26 DISPLAY 16,4,VOLNM,VOLNML BL @PUTW DATA 40*4+14,BUF512+2 BL @PUTW DATA 40*6+14,BUF512+6 BL @PUTW DATA 40*8+14,BUF512+12 ;* DETERMINE MAX # OF VOLUMES ** BL @PUTW DATA 40*16+14,VOLMAX B @CONTINUE ;---------------------------------------------------------------------- ; ; ; ; ;---------------------------------------------------------------------- IDPDSK LI R8,>5000 ;'P FLAG' LI R0,IDPDSK ;ADJUST FCTN KEYS MOV R0,@FCT8 JMP DSKPRT RDPDSK LI R8,>2000 ;'U FLAG' LI R0,RDPDSK ;ADJUST FCTN KEYS MOV R0,@FCT8 DSKPRT BLWP @CLREOS DATA 528 BL @DRINFO ;GET DRIVE # MSKLP2 BL @GETVOL DATA 533,VDSK1,MSKLP2 BL @DSPVOL ; LI R1,>0100 ; MOVB R1,@OPDRV ; CLR @SECTOR ;GET BM ; BLWP @RDSECX ; ; BLWP @MOVSCT ;SHOW DISKNAME ; DATA DSTST0 ; BL @SHOWDN LI R0,584 ;SHOW P/U FLAG ON SCREEN MOVB R8,R1 BLWP @VSBW LI R0,PABBUF+>10 ;PUT P/U FLAG IN BUFF BLWP @VSBW BLWP @WRSECX B @CONTINUE ;RTN RXBDSK LI R0,RXBDSK ;ADJUST FCTN KEYS MOV R0,@FCT8 MOV R0,@CKT8 BLWP @CLREOS DATA 528 SCREEN 2 DISPLAY 14,5,TXTMS7,21 ;'XB PROGRAM ON DRIVE :' DISPLAY 16,5,TXTMS8,22 ;'ENTER XB PROGRAM NAME:' RXBLP1 BL @GETVOL DATA 588,VDSK1,RXBLP1 LI R1,>0100 MOVB R1,@OPDRV LI R0,668 ;CLEAR NAME BUFFER LI R1,TBUF LI R2,10 BLWP @VMBR BLWP @GTMKEY ;GET PROGRAM NAME DATA 668 DATA TBUF DATA 10 DATA >202E LI R1,1 ;GET LM MOV R1,@SECTOR BLWP @RDSECX BLWP @MOVSCT DATA SRCST1 LI R3,SRCST1 ;LM POINTERS RXBLP4 MOV *R3+,@SECTOR ;GET LM POINTER JEQ RXBLPA BLWP @RDSECX ;GET DIRECTORY ENTRY LI R0,PABBUF ;GET AND CHECK PROGRAM NAMES LI R1,SRCST2 ;TEMP BUFFER LI R2,10 BLWP @VMBR LI R4,TBUF ;CHECK FILENAME RXBLP6 CB *R1+,*R4+ JGT RXBLPA ;IS IT BIGGER//THEN FILE IS NOT THERE JLT RXBLP4 ;IS IT SMALLER//THEN CHECK NEXT NAME DEC R2 ;MORE CHAR TO TEST JNE RXBLP6 ;YES.. BLWP @MOVSCT ;NO..ITS JUST RIGHT DATA SRCST2 MOVB @SRCST2+12,R1 ;IS IT A PROGRAM CZC @PRGMSK,R1 JNE RXBX1 ;YES.. CLR R1 ;1S IT VAR 254 MOVB @SRCST2+>11,R1 CI R1,>FE00 JNE RXBLP9 ;NO.. LI R1,SRCST2+>1C MOV R1,@BLKLNK BL @GETLNK MOV @STRSCT,@SECTOR BLWP @RDSECT LI R0,PABBUF+7 JMP RXBXB3 RXBX1 LI R1,SRCST2+>1C ;BLOCK LINK MOV R1,@BLKLNK BL @GETLNK ;GET STRSCT//OFFSET MOV @STRSCT,@SECTOR BLWP @RDSECX ;GET SECTOR LI R0,PABBUF ;GET FIRST WORD RXBXB3 LI R1,TEMPR1 LI R2,2 BLWP @VMBR C @TEMPR1,@VARMSK ;IS IT NEGATIVE? JL RXBLP8 MOV @TEMPR1,R3 ;UNPROTECT NEG R3 MOV R3,@TEMPR1 BLWP @VMBW BLWP @WRSECX ;WRITE TO DISK RXBLP8 SCREEN 1 DISPLAY 19,8,TXTMS9,22 ;'PROGRAM IS UNPROTECTED' JMP RXBLPB RXBLP9 SCREEN 1 DISPLAY 19,9,TXTMSA,21 ;'NOT IN PROGRAM FORMAT' JMP RXBLPB RXBLPA SCREEN 1 ;'FILE NOT FOUND' DISPLAY 19,12,TXTRC4,TXTRC4L RXBLPB B @FMT070 SCCBUF DATA 0 BSS 30 ;CONTROL CODE BUFFER COLBUF BYTE >F4 ;FGND/BGND COLOR==DEF IS WHITE/BLUE LSTDVC LWPI MYREG1 LI R0,MGR C @FCT8,R0 JEQ LSTDV1 B @MGR LSTDV1 BLWP @CLRSCN ;* LIST DEVICE ROUTINE * SCREEN 1 DISPLAY 3,0,TXTPP1,19 ;'ENTER LIST DEVICE :' LI R0,160 ;SHOW DEFAULT LIST DEVICE ON LINE 5 LI R1,PNAME MOVB @PDATA2+9,R2 ;BUFFER SIZE SRL R2,8 BLWP @VMBW LI R2,40 BLWP @VMBR ;CLEAR BUFFER BLWP @GTMKEY ;GET LIST DEVICE DATA 160 ;LINE 5 DATA PNAME DATA 40 DATA 0 CLR R3 ;GET LENGTH OF "LIST" DEVICE LI R0,160 ;LINE 5 LSLP1 BLWP @VSBR CB R1,@ASCLO JEQ LSLP2 INC R0 INC R3 JMP LSLP1 LSLP2 SWPB R3 ;SAVE DEVICE LENGTH MOVB R3,@PDATA2+9 SCREEN 1 DISPLAY 6,0,TXTPP2,25 ;'SEND CONTROL CODES (Y/N):' LSLP4 LI R0,266 MOVB @YES,R1 BLWP @GTSKEY CB @YES,R1 JEQ LSLP3 CB @ASC_N,R1 JNE LSLP4 CLR @SCCBUF B @STAR2 LSLP3 SCREEN 1 DISPLAY 8,0,TXTPP3,35 ;'ENTER CONTROL CODES:' LSLP7 BLWP @CLREOS DATA 360 ;FROM LINE 10 LI R0,360 ;CLEAR BUFFER LI R1,DSTST0 LI R2,100 BLWP @VMBR BLWP @GTMKEY DATA 360 ;LINE 10 DATA DSTST0 DATA 92 ;UPTO 92 CHARS. DATA 0 * VALIDATE CONTROL CODES LI R3,>3039 ;CHECK RANGE 0-9 DECIMAL LI R2,DSTST0 LSLP5 MOVB *R2+,R1 CB @STAR,R1 ;STAR= * JEQ STAR1 CB @ASCLO,R1 ;SKIP SPACES JEQ LSLP5 CB R1,R3 JLT LSLP7 ;<0 NO BKP120. SWPB R3 CB R1,R3 JGT LSLP7 ;>9 NO BKP120. SWPB R3 JMP LSLP5 STAR1 CLR R6 ;#OF CODES TO SEND LI R7,SCCBUF+1 LI R8,DSTST0 STAR3 CB *R8,@STAR JEQ STAR2 MOVB *R8+,@TBUF CB @ASCLO,@TBUF JEQ LSLP7 ;RESTART IF SPACE MOVB *R8+,@TBUF+1 CB @ASCLO,@TBUF+1 JEQ LSLP7 ;RESTART IF SPACE INC R8 BL @CONVRT SWPB R5 MOVB R5,*R7+ INC R6 ;CODE COUNTER JMP STAR3 STAR2 SWPB R6 ;SET # OF CODES MOVB R6,@SCCBUF SCREEN 1 DISPLAY 11,0,TXTPP4,19 ;'SAVE TO DISK (Y/N):' STAR5 LI R0,460 ;LINE 12, COLUMN 21 MOVB @YES,R1 BLWP @GTSKEY CB @YES,R1 JEQ STAR4 CB @ASC_N,R1 JNE STAR5 B @MGR ;NO.. STAR4 SCREEN 1 ;'PRESS ENTER.' DISPLAY 14,TXTPP6C,TXTPP6,TXTPP6L LI R0,594 LI R1,>2000 BLWP @GTSKEY MOVB @ONE,@OPDRV LI R0,1 MOV R0,@SECTOR BLWP @RDSECX BLWP @MOVSCT DATA SRCST1 LI R4,SRCST1 STAR6B MOV *R4+,@SECTOR JEQ STAR4 BLWP @RDSECX LI R3,TXTMGR LI R0,PABBUF LI R1,TBUF MOVB @MGRLN,R2 ;GET LENGTH OF PROGRAM FILE NAME SRL R2,8 BLWP @VMBR STAR6C CB *R3+,*R1+ JNE STAR6B DEC R2 JNE STAR6C LI R0,PABBUF+>A0 ;WRITE LIST DEVICE LI R1,PDATA2+9 MOVB @PDATA2+9,R2 ;# OF BYTES TO WRITE SRL R2,8 INC R2 ;+1 BLWP @VMBW LI R0,PABBUF+>D0 ;WRITE CONTROL CODES LI R1,SCCBUF LI R2,33 ;# OF BYTES TO WRITE BLWP @VMBW BLWP @WRSECX B @MGR CONVRT CLR R0 CLR R1 CLR R3 CLR R5 LI R4,2 ;LENGTH OF STRING MOVN DEC R4 MOVB @TBUF(R4),R2 SRL R2,8 AI R2,->0030 MOV R0,R0 JNE EXP LI R0,1 JMP ACCUM EXP MPY @DTEN,R0 MOV R1,R0 MPY R1,R2 MOV R3,R2 ACCUM A R2,R5 JNO NEXT CLR R5 RT NEXT MOV R4,R4 JNE MOVN RT PDATA3 DATA >0014,>1000,>5050,>0000,>000F TNAME TEXT 'DSK1. ' CLRBF MOV *R14+,R3 ;CLEAR BUFFER LI R5,256 ;CLEAR 256 BYTE BUFFER CLR R2 SETLM MOVB R2,*R3+ DEC R5 JNE SETLM RTWP ; TPFIL=0 IF TYPE FILE <>0 IF PRINT FILE TFIL LWPI MYREG1 ;SCREEN DIS/VAR 80 FILE LIMI 0 CLR @KEYSW ;FOR GETSKEY ..RETURN DEFAULT ON CR MOVB @SRCDRV,@TNAME+3 ;DISK DRIVE # AB @H30,@TNAME+3 ;MAKE IS ASCII LI R3,TNAME+5 ;CLEAR NAME BUFFER LI R4,10 LI R2,>2000 ;SPACE FSPA MOVB R2,*R3+ DEC R4 JNE FSPA LI R5,SCNBUF+3 ;MOVE FILE NAME TO PAB A R7,R5 ;OFFSET LI R4,10 LI R3,TNAME+5 MFLE MOVB *R5+,*R3+ DEC R4 JNE MFLE ; FIND LENGTH OF FILE NAME LI R1,TNAME+5 CLR R0 ;# OF CHAR IN LIST DEVICE NSP CB *R1+,@ASCLO JEQ FDSP INC R0 JMP NSP FDSP SWPB R0 ;SAVE DEVICE LENGTH AB @QT,R0 ; ADD 5 TO NAME LENGTH MOVB R0,@PDATA3+9 RFIL BLWP @CLRSCN MOVB @TPFIL,@TPFIL ;TYPE=0 PRINT<>0 JNE RF3 SCREEN 1 DISPLAY 4,10,TXTC8A,4 ;'TYPE' SCREEN 1 DISPLAY 4,15,TNAME,15 ;'FILE NAME ' RF3 MOVB @D40,@TRACKS ;CLEAR FLAG LI R0,PAB3 ;LOAD PAB * OPEN * OR REDO LI R1,PDATA3 LI R2,25 BLWP @VMBW LI R4,PAB3+9 MOV R4,@PNTR BLWP @DSRLNK ;OPEN FILE DIS/VAR 80 DATA 8 STST R8 ;GET STATUS REG CZC @KEYMSK,R8 ;DID WE HAVE AN ERR JEQ FOK ;NO ERROR LI R0,PAB3+1 ;SET UP FOR FIXED 80 FILE LI R1,>0400 BLWP @VSBW LI R4,PAB3+9 MOV R4,@PNTR BLWP @DSRLNK ;OPEN FILE DIS/FIX 80 DATA 8 BL @EKTEST ;CHECK FOR ERR/ABORT FOK MOVB @TWO,R1 LI R0,PAB3 BLWP @VSBW ;SET TO READ MODE ; OPEN AND PRINT CONTROL CODES FOR PRINTER MOVB @TPFIL,@TPFIL ;TYPE=0 PRINT<>0 JEQ RPAG PFIL1 LI R0,PAB2 ;OPEN PRINTER PAB LI R1,PDATA2 LI R2,50 BLWP @VMBW LI R4,PAB2+9 MOV R4,@PNTR BLWP @DSRLNK DATA 8 BL @EKTEST ;ERROR//KEY PRESSED TEST LI R1,>5003 SWPB R1 LI R0,PAB2 BLWP @VSBW ;* WRITE OPCODE * MOVB @SCCBUF,@SCCBUF ;SEND CONTROL CODES JEQ FSND1 ;NO.. MOVB @SCCBUF,R1 ;# OF CODES TO SEND LI R0,PAB2+5 BLWP @VSBW MOVB R1,R2 ;BYTES TO SEND SRL R2,8 LI R0,PABBUF LI R1,SCCBUF+1 BLWP @VMBW LI R4,PAB2+9 MOV R4,@PNTR BLWP @DSRLNK DATA 8 BL @EKTEST FSND1 LI R1,>5000 LI R0,PAB2+5 BLWP @VSBW RPAG LI R5,965 LI R6,SCNBUF EPAG MOVB @ASCLO,*R6+ ;CLEAR SCREEN BUFFER DEC R5 JNE EPAG LI R5,SCNBUF MOV R5,@TEMPR0 ;SET BUFFER POINTER LI R5,22 RAGN LI R4,PAB3+9 MOV R4,@PNTR BLWP @DSRLNK ;READ FILE DATA 8 STST R8 CZC @KEYMSK,R8 ;DO WE HAVE ERROR(EOF) JNE DEOF ;YES LI R0,PAB3+5 BLWP @VSBR ;GET # BYTES MOVB R1,R2 SRL R2,8 MOV @TEMPR0,R1 LI R0,>1000 ;BUFFER ADDRES IN VDP BLWP @VMBR ;XFER FROM VDP TO CPU ;*** PRINT HERE MOVB @TPFIL,@TPFIL ;TYPE=0 PRINT<>0 JEQ PFIL2 SWPB R2 ;# OF BYTES AT MSB MOV R2,R1 SWPB R2 ;RESET TO #BYTES AT LSB LI R0,PAB2+5 BLWP @VSBW LI R4,PAB2+9 MOV R4,@PNTR BLWP @DSRLNK ;PRINT FILE DATA 8 BL @EKTEST PFIL2 C R2,@D40 JLE LES A @D40,@TEMPR0 ;* >0028 DEC R5 JEQ NEOF LES A @D40,@TEMPR0 ; >0028 DEC R5 JNE RAGN ;AT END OF PAGE JMP NEOF DEOF MOVB @ASC_1,@TRACKS ;SET FLAG TO SHOW EOF NEOF BLWP @CLRSCN CLR R0 LI R1,SCNBUF LI R2,920 BLWP @VMBW MOVB @TPFIL,@TPFIL ;PRINT FILE JNE RF4 ;YES SCREEN 1 DISPLAY 23,0,TXTCD3,35 ;'PRESS ANY KEY TO CONTINUE' MOVB @TRACKS,@TRACKS ;EOF JEQ NOKEY ;NO SCREEN 1 DISPLAY 23,2,TXTCD4,3 ;'EOF' NOKEY BLWP @KSCAN ;GET A KEY MOVB @STATUS,R8 CZC @KEYMSK,R8 JEQ NOKEY CB @KCODE,@BK ;BACK PRESSED JEQ RTFIL ;YES CB @KCODE,@RDO ;REDO JEQ RTFIL ;YES RF4 MOVB @TRACKS,@TRACKS ;CHECK IF EOF JNE RTFIL ;YES JMP RPAG ;NO RTFIL LI R0,PAB3 ;* CLOSE READ FILE * LI R1,>0100 BLWP @VSBW SWPB R1 LI R0,PAB3+5 BLWP @VSBW LI R4,PAB3+9 MOV R4,@PNTR BLWP @DSRLNK DATA 8 MOVB @TPFIL,@TPFIL ;TYPE=0 PRINT<>0 JEQ RFIL4 LI R0,PAB2 ;* CLOSE PRINT FILE * LI R1,>0100 BLWP @VSBW SWPB R1 LI R0,PAB2+5 BLWP @VSBW LI R4,PAB2+9 MOV R4,@PNTR BLWP @DSRLNK DATA 8 RFIL4 CB @KCODE,@RDO ;REDO JEQ RF1 ;YES B @CAT ;BACK RF1 B @RFIL ; ; ; XB PROGRAM IMAGE LOADER ; ; GADD DATA 0 IXB DATA >4000,>AA55 ILOAD LWPI MYREG1 LIMI 0 BLWP @CLRSCN LI R0,ILOAD ;ADJUST FCTN KEYS MOV R0,@FCT8 MOV R0,@CKT8 LI R0,FILE MOV R0,@FCT9 MOV R0,@CKT9 SCREEN 4 ;'FILE UTILIES' DISPLAY 1,TXTCA6C,TXTCA6,TXTCA6L RIMA DISPLAY 5,6,TXTI1,29 ;RUN PROGRAM IMAGE XB OR E/A DISPLAY 14,7,TXTVOL,9 ;'DRIVE NO:' DISPLAY 16,7,TXTRC2,19 ;'Enter Name of File :' IDR BL @GETVOL DATA 577,VDSK1,IDR LI R1,>0100 MOVB R1,@SRCDRV MOVB R1,@INAME+1 AB @H30,@INAME+1 LI R0,667 ;SHOW LAST NAME LI R1,INAME+3 LI R2,10 BLWP @VMBW BLWP @GTMKEY ;GET FILENAME DATA 667 ;SCREEN ADDR DATA INAME+3 ;BUFF ADDR DATA 10 ;10 CHAR DATA >202E ;INVALID CHAR (SPACE // PERIOD) CLR R0 ;# OF CHAR IN LIST DEVICE ISP CB *R1+,@ASCLO JEQ FLEN INC R0 JMP ISP FLEN SWPB R0 ;SAVE DEVICE LENGTH AB @QT,R0 ;ADD 5 TO NAME LENGTH MOVB R0,@INLEN+1 ; LET'S DO IT ; LWPI >8300 LIMI 0 ; ; CALL INIT FOR XBASIC ; ; LI R13,>9C02 LI R14,>9802 LI R4,>5FFF MOVB *R14,@GADD ;SAVE GROM ADDRESS LI R12,>9800 MOVB *R14,@GADD+1 NOP DEC @GADD SAGN INC R4 CLR R0 LI R1,IXB CI R4,>F900 JEQ NOXB ;XB IS NOT INSTALLED MOVB R4,*R13 ;WRITE GROM ADDRESS SWPB R4 MOVB R4,*R13 SWPB R4 MOVB *R12,R0 ;MOVE BYTE FROM GROM TO R0 LI R3,>0006 CB R0,*R1+ ;'>40' JNE SAGN MOVB *R12,R0 ;IS NEXT BYTE LI R3,>0600 CB R0,*R1+ ;'>00' JNE SAGN MOVB *R12,R0 ;IS NEXT BYTE LI R3,>0600 CB R0,*R1+ ;'>AA' JNE SAGN MOVB *R12,R0 ;IS NEXT BYTE LI R5,>0004 CB R0,*R1 ;'>55' JNE SAGN S R5,R4 ;WE FOUND XB CALL INIT DATA AT ADDRESS R4 MOVB R4,*R13 ;WRITE GROM ADDRESS SWPB R4 MOVB R4,*R13 LI R2,>2000 IAGN MOVB *R12,*R2+ ;XFER DATA FROM GROM TO LOW MEM DEC R3 JNE IAGN NOXB MOVB @GADD,*R13 ;RESET GROM ADDRESS NOP MOVB @GADD+1,*R13 ;RESTORE GROM ADDRESS ; ; XFER LOADER TO LOW MEMORY LI R1,STLD ;ADDRESS OF DATA LI R2,>2700 LI R3,>FFFF IX1 MOV *R1+,*R2+ C *R1,R3 JNE IX1 BLWP @CLRSCN B @>271A ;ADDRESS IN LOW MEM ******************************* * * * -- P U T W -- * * * * DISPLAY WORD IN DECIMAL AT * * LINE/COLUMN COORDINATES IN * * R0. * * * ******************************* PUTW MOV *R11+,R0 MOV *R11+,R1 MOV *R1,R2 LI R3,DECTBL CLR R4 PUTW05 CLR R1 ;CLEAR HI-WORD DIV *R3+,R1 SWPB R1 MOVB R1,R1 ;IS DIGIT 0? JNE PUTW10 ;NO-DISPLAY MOV R4,R4 ;SUPRESSING? JEQ PUTW15 ;YES-SKIP PUTW10 SETO R4 AI R1,>3000 BLWP @VSBW INC R0 PUTW15 MOV *R3,R1 JNE PUTW05 RT DECTBL DATA 10000,1000,100,10,1,0 ; ; THE FOLLOWING DATA MUST BE LOCATED AT >2700+ ; STLD DATA >050C,>0A00,>0000,>2400 INLEN DATA >000B,>4453 INAME DATA >4B31,>2E20,>2020 DATA >2020,>2020,>2020,>2020 DATA >02E0,>27F2 DATA >0300,>0000,>C009,>C04A,>C08E DATA >0420,>2832,>D80C,>837C,>C80F DATA >8356,>C80C,>8354,>02E0,>83E0 DATA >C80B,>8300,>020C,>1100,>C80C DATA >83D0,>1D00,>0202,>4008,>1002 DATA >C0A0,>83D2,>C092,>C802,>83D2 DATA >05C2,>C272,>9CA0,>8355,>16F6 DATA >C160,>8354,>0206,>270A,>9CB6 DATA >16F0,>0605,>16FC,>0699,>103B DATA >1E00,>C2E0,>8300,>02E0,>27F2 DATA >0200,>0A00,>0201,>27FE,>0202 DATA >0006,>0420,>283A,>C104,>1601 DATA >C108,>0200,>0A06,>C048,>C087 DATA >0420,>283A,>C060,>2708,>B860 DATA >280D,>2709,>C186,>16B8,>D00D DATA >161B,>0205,>0300,>0206,>0800 DATA >0201,>8300,>C08E,>0203,>0028 DATA >C005,>0420,>283A,>C006,>0420 DATA >2832,>A14E,>A18E,>0603,>16F6 DATA >0200,>030E,>0420,>283E,>0200 DATA >0401,>0420,>283E,>0694,>0420 DATA >0000,>0000,>1111,>2222,>3333 DATA >0000,>5555,>6666,>7777,>8888 DATA >0820,>2700,>02E0,>0004 IFLAG DATA >0001,>0020,>082E,>0000,>0000 ;IFAG=0 FOR E/A VDP DATA >0000,>0000,>0000,>0000 ; <>0 FOR XB VDP DATA >0000,>0000,>0000,>0000,>0000 DATA >0000,>0000,>0000,>0000,>0000 DATA >2812,>2842,>2812,>2850,>2812 DATA >285C,>2812,>286A,>06A0,>287C DATA >D831,>8C00,>0602,>16FC,>0380 DATA >06A0,>2882,>DB60,>8800,>0002 DATA >0380,>06A0,>2882,>DC60,>8800 DATA >0602,>16FC,>0380,>C05D,>D82D DATA >0001,>8C02,>0261,>8000,>D801 DATA >8C02,>0380,>0201,>4000,>1001 DATA >04C1,>C09D,>D820,>2817,>8C02 DATA >E081,>D802,>8C02,>C06D,>0002 DATA >C0AD,>0004 DATA >045B,>FFFF SLAST END