1000         .TITLE  'DISK UTILITY PROGRAMS (DUP)  VER 2.9  11/18/80'
1001             LIST X
1002 ;*************************************************************************
1003 ;               THIS IS FINAL VERSION OF DUP  ---- 2.0S ----
1004 ;*************************************************************************
1005 ;                   FILENAME = DOS2.DUP29Q ON TANDEM
1006 ;-------------------------------------------------------------------------
1007 ;CHANGED FOR SYSTEM RESET:            DUPFLG                               
1008 ;ADDED INTERRUPT ROUTINES FROM SIO:   KB
1009 ;ADDED SAVE/RESTORE OF DOSINI VECTOR: KB
1010 ;-------------------------------------------------------------------------
1011 ;SCANNED BY:                          MR.ATARI   JAN-2004 
1012 ;PRETTY PRINTED & FIXED ALL COMMENTS: UNIXcoffee 16-JUN-2011 
1013 ;-------------------------------------------------------------------------
1014         .PAGE
1015 ;
1016 ;=========================================================================
1017 ;  ****  EQUATES  ****
1018 ;=========================================================================
1019 CIO     =       $E456
1020 DKHND   =       $E453
1021 SETVBV  =       $E45C
1022 SYSVBV  =       $E45F
1023 XITVBV  =       $E462
1024 CIOINV  =       $E46E
1025 MEMTOP  =       $2E5
1026 BRKKEY  =       $11
1027 DOSVEC  =       $A
1028 DOSINI  =       $C              ;DOS INIT VECTOR
1029 WARMST  =       8
1030 LMARGN  =       $52
1031 RMARGN  =       $53
1032 CARTST  =       $BFFA
1033 INTRVEC =       $20A            ;INTERRUPT VECTOR LOC FOR SIO PATCH
1034 MEMLO   =       $2E7
1035 SHFLOK  =       $2BE
1036 INITAD  =       $2E2
1037 RUNAD   =       $2E0
1038 ICHIDZ  =       $20
1039 ICDNOZ  =       $21
1040 ICBALZ  =       $24
1041 ICBAHZ  =       $25
1042 ICIDNO  =       $2E
1043 MAXDEV  =       $21
1044 HATABS  =       $31A
1045 USRDOS  =       $1700
1046 FMS     =       $700
1047 FMINIT  =       FMS+$E0
1048 DOS     =       FMS+$E40
1049 WRMSTR  =       $E474           ;WARM START VECTOR
1050 BSIOR   =       $772            ;ENTRY POINT TO FMS DISK HANDLER USED BY DUP DISK
1051 CDTMV3  =       $21C            ;ADDRESS OF SYSTEM TIMER # 3
1052 CDTMF3  =       $22A            ;ADDRESS OF SYS TIMER # 3 TIME OUT FLAG
1053 ;
1054 CR      =       $9B
1055 CUP     =       $1C
1056 CDN     =       $1D
1057 CLF     =       $1E
1058 CRT     =       $1F
1059 DLL     =       $9C
1060 CLSCR   =       $7D
1061 EOF     =       $88             ;ENDFILE RETURN CODE FROM CIO
1062 ;
1063 ;
1064 OPEN    =       $03
1065 CLOSE   =       $0C
1066 PUTCHR  =       $0B
1067 GETCHR  =       $07
1068 GETREC  =       $05
1069 PUTREC  =       $09
1070 RENAME  =       $20
1071 DELETE  =       $21
1072 FORMAT  =       $FE
1073 LOCK    =       $23
1074 UNLOCK  =       $24
1075 STAREQ  =       $53             ;STATUS COMMAND TO DISK CONTROLER
1076 ;
1077 IOCB1   =       $10
1078 ;
1079 DVSTAT  =       $2EA            ;ADDRESS OF STATUS INFO STORED BY OS
1080 ;.........................................................................
1081 ;
1082 DCB     =       $300
1083 DUNIT   =       DCB+1
1084 DCOMND  =       DCB+2
1085 DSTATS  =       DCB+3
1086 DBUFLO  =       DCB+4
1087 DBUFHI  =       DCB+5
1088 DSLO    =       DCB+$A
1089 DSHI    =       DCB+$B
1090 ;.........................................................................
1091 IOCB    =       $340
1092 ICHID   =       IOCB+0
1093 ICDNO   =       IOCB+1
1094 ICCOM   =       IOCB+2
1095 ICSTA   =       IOCB+3
1096 ICBAL   =       IOCB+4
1097 ICBAH   =       IOCB+5
1098 ICBLL   =       IOCB+8
1099 ICBLH   =       IOCB+9
1100 ICAX1   =       IOCB+10
1101 ICAX2   =       IOCB+11
1102 ;.........................................................................
1103 SYSED   =       $0
1104 OWRIT   =       $08
1105 ORDWRT  =       $0C
1106 ;.........................................................................
1107 HILO    .MACRO  P1
1108 P1&H     =       P1&/256
1109 P1&L     =       (-256)*&P1&H+&P1
1110         .ENDM
1111         .PAGE
1112 ;=========================================================================
1113 ;  ****  ZERO  PAGE  VARIABLES  **** 
1114 ;=========================================================================
1115         *=$18
1116 JMPTBL  *=*+2
1117 RAMLO   *=*+2
1118 BUFADR  =       RAMLO           ;SAVE AREA FOR BUFFER ADDRESS USED BY USER
1119         .PAGE
1120 ;=========================================================================
1121 ;  ****  INIT CODE FOR DUP  ****
1122 ;=========================================================================
1123 ;       INITIALIZATION CODE FOR DUP - CALLS FMS INIT CODE.
1124 ;       CALLED ON WARM START AND COLD START.
1125 ;-------------------------------------------------------------------------
1126         *=DOS
1127         LDA     #0
1128         STA     OPT
1129         LDA     #.LOW.MNDUPL
1130         STA     DOSVEC
1131         LDA     #.LOW.MNDUPH
1132         STA     DOSVEC+1
1133         LDA     #.LOW.ISRSIR    ;SET UP INTERRUPT VECTORS FOR SIO PA
1134         STA     INTRVEC         ;INSTEAD OF USING THE SERIAL INPUT READY
1135         LDA     #.HIGH.ISRSIR   ;SERVICE ROUTINE AND THE SERIAL OUTPUT
1136         STA     INTRVEC+1       ;INTERRUPT SERVICE ROUTINE IN THE OS ROM
1137         LDA     #.LOW.ISRODN    ;USE THE VERSIONS IN RAM FOLLOWING THE
1138         STA     INTRVEC+2       ;RESIDENT PORTION OF DUP.
1139         LDA     #.HIGH.ISRODN
1140         STA     INTRVEC+3
1141         JSR     FMINIT
1142         LDA     WARMST          ;ON COLDSTART, LOAD AUTORUN.SYS
1143         BNE     CKMDOS          ;WARMSTART CHECK IF DUP WAS RUNNING
1144         LDA     #.LOW.AFL
1145         STA     ICBAL+$10
1146         LDA     #.LOW.AFH
1147         STA     ICBAH+$10
1148         JSR     INITX           ;CLEAR DUPFLG SHOW DUP NOT IN MEMORY.
1149         LDA     #$C0
1150         JSR     STLOAD          ;LOAD, INIT AND RUN THE AUTORUN FILE
1151         JMP     CLOSX           ;MAKE SURE IOCB #1 IS CLOSED & RETURN
1152 ;
1153 CKMDOS  LDA     DUPFLG          ;SEE IF DUP WAS IN MEMORY
1154         BEQ     INITX           ;=ZERO THEN WASN'T
1155 ;.........................................................................
1156         LDA     MEMFLG          ;SEE IF USER AREA WRITTEN TO MEM.SAV
1157         BEQ     CLDSET          ;=ZERO THEN WASN'T
1158         JSR     LDMEM1          ;ELSE GET USER MEMORY BACK IN
1159 ;.........................................................................
1160         JSR     RELDIN          ;RELOAD SAVED DOSINI VECTOR
1161         JSR     INITX           ;CLEAR DUP IN MEMORY FLAG
1162         JSR     WRMSTR          ;REDO WARMSTART
1163 ;.........................................................................
1164 INITX   LDA     #0              ;SAY DUP NOT IN MEMORY
1165         STA     DUPFLG          ;CLEAR FLAG
1166         RTS
1167 ;.........................................................................
1168 CLDSET  STA     WARMST          ;NO VALID USER MEMORY
1169         BEQ     INITX           ;SET TO COLD START
1170         .PAGE
1171 ;=========================================================================
1172 ;  ****  LOADER ROUTINE  *** 
1173 ;=========================================================================
1174 ;       LOADS FROM THE FILE (MUST BE LOAD FORMAT)
1175 ;       INTO MEMORY. RETURNS:
1176 ;         X=0 LOAD OK
1177 ;         X=1 OPEN ERRORS Y=CIO CODE
1178 ;         X=2 READ ERRORS Y=CIO CODE
1179 ;         X=3 BAD LOAD FILE
1180 ; ON ENTRY, IOCB 1 POINTS TO FILENAME.
1181 ;-------------------------------------------------------------------------
1182 DUPFLG  .BYTE   0               ;FLAG -IF DUP IN MEMORY NOT ZERO
1183 OPT     .BYTE   0               ;HOLDS VALUE OF OPTION GIVEN BY USER
1184 LOADFG  .BYTE   0               ;FLAG = $80 IF MEMORY FILE DOESN'T HAVE
1185 HDBUF   *=*+4
1186         HILO    HDBUF
1187 HDBUFH     =       HDBUF/256
1188 HDBUFL     =       (-256)*HDBUFH+HDBUF
1189 SFLOAD  LDA     #$80
1190 STLOAD  STA     LOADFG
1191 LOAD    LDA     #.LOW.RTS
1192         STA     RUNAD
1193         LDA     #.HIGH.RTS
1194         STA     RUNAD+1         ;MAKE RUN AT EOF DEFAULT TO RTS
1195         LDX     #$10
1196         LDA     #OPEN
1197         STA     ICCOM,X
1198         LDA     #4              ;OPEN TYPE=INPUT
1199         STA     ICAX1,X
1200         JSR     CIO             ;TRY TO OPEN FILE
1201         BPL     RDLF            ;CONT IF OK
1202         LDA     #1              ;OPEN ERRORS
1203         BNE     CLFX            ;CLOSE AND EXIT
1204 RDLF    LDX     #$10
1205         LDA     #.LOW.DBUFL
1206         STA     ICBAL,X
1207         LDA     #.LOW.DBUFH
1208         STA     ICBAH,X
1209         LDA     #2
1210         STA     ICBLL,X
1211         LDA     #0
1212         STA     ICBLH,X
1213         STA     MEMLDD          ;CLEAR MEM.SAV LOADED FLAG
1214         LDA     #GETCHR
1215         STA     ICCOM,X
1216         JSR     CIO
1217         BMI     ERST            ;IF ERRS
1218         LDA     #$FF
1219         CMP     DBUF            ;CHECK FOR VALID LOAD FILE
1220         BNE     LNLF
1221         CMP     DBUF+1
1222         BNE     LNLF            ;BRANCH IF NOT A LOAD FILE
1223 RDDRC   LDX     #$10
1224         LDA     #.LOW.HDBUFL
1225         STA     ICBAL,X
1226         LDA     #.LOW.HDBUFH
1227         STA     ICBAH,X
1228         LDA     #4
1229 RDDRC1  STA     ICBLL,X
1230         LDA     #0
1231         STA     ICBLH,X
1232         JSR     CIO             ;NO ERROR CHECK SO CAN CATCH EOF
1233         BPL     STOK            ;IF NO ERROR
1234         CPY     #$88            ;SEE IF EOF
1235         BNE     ERST            ;IF SOME ERROR STATUS
1236 ;=========================================================================
1237 ;EOF SO DONE, EXIT
1238 ;=========================================================================
1239         JSR     CLOSX           ;CLOSE IOCB'S 1 AND 2
1240         BIT     OPT
1241         BMI     DRUN            ;BRANCH IF NO RUN OPTION
1242         JSR     JMPRUN          ;JUMP THROUGH RUN VECTOR
1243 DRUN    LDA     #0              ;OK STATUS
1244         BIT     LOADFG          ;WAS MEMORY SWAPPED?
1245         STA     LOADFG
1246         BMI     CLFX            ;BRANCH IF MEMORY WASN'T SWAPPED
1247         JSR     MEMSVQ          ;DOES MEMORY SAVE FILE EXIST?
1248         BMI     DRUN1           ;BRANCH IF NOT
1249         PLA
1250         PLA
1251         JMP     GOOD            ;WRITE MEMORY AND RELOAD DUP
1252 ;=========================================================================
1253 ;       SEE IF DUP WRITTEN OVER. IF IS RELOAD & TELL USER NEED MEM.SAV TO
1254 ;       LOAD THIS FILE.
1255 ;=========================================================================
1256 DRUN1   LDA     DUPFLG          ;SEE IF DUP CLOBBERED
1257         BNE     DRUN2           ;NO, THEN RETURN
1258         LDA     #.LOW.NMSFL     ;ELSE TELL USER NEED MEM.SAV
1259         LDX     #.LOW.NMSFH
1260         JSR     PRNTMSG         ;PRINT MSG
1261         JMP     RRDUP           ;RELOAD & RUN DUP
1262 ;=========================================================================
1263 ;       RETURN TO CALLING ROUTINE
1264 ;=========================================================================
1265 DRUN2   LDA     #0              ;NO DUP ERR MSG ON EOF
1266 CLFX    TAX
1267 RTS     RTS
1268 ;=========================================================================
1269 ;       ERROR RETURNS
1270 ;=========================================================================
1271 LNLF    JSR     CLOSX
1272         LDA     #3              ;BAD LOAD FILE
1273         BNE     CLFX
1274 ERST    TYA
1275         PHA
1276         JSR     CLOSX
1277         PLA
1278         TAY
1279         BNE     CLFX
1280 ;=========================================================================
1281 ;       CONTINUE WITH LOAD - CHECK LOAD ADDRESS FOR HEADER
1282 ;       HEADER IF HAVE CONCATENATED LOAD FILES
1283 ;=========================================================================
1284 STOK    LDX     #$10
1285         LDA     HDBUF           ;MOVE PARAMS TO IOCB
1286         STA     ICBAL,X
1287         PHA
1288         LDA     HDBUF+1
1289         STA     ICBAH,X
1290         TAY
1291         PLA
1292         INY                     ;WAS ADDRESS FF?
1293         BNE     ADOK            ;BRANCH IF NOT
1294         TAY
1295         INY                     ;OTHER BYTE FF?
1296         BNE     ADOK            ;BRANCH IF NOT
1297 ;=========================================================================
1298 ;       HAVE A HEADER & START ADDRESS - GET END ADDRESS FOR TEXT & DO AG
1299 ;=========================================================================
1300         LDA     HDBUF+2
1301         STA     HDBUF
1302         LDA     HDBUF+3
1303         STA     HDBUF+1         ;MOVE LOAD ADDRESS
1304         LDA     #.LOW.HDBUF+2
1305         STA     ICBAL,X
1306         LDA     #.HIGH.(HDBUF+2)
1307         STA     ICBAH,X         ;SO LOAD ADDRESS DOESN'T GET WIPED OUT B
1308         LDA     #2
1309         JMP     RDDRC1
1310 ;=========================================================================
1311 ;       GET LENGTH OF TEXT. THEN DETERMINE IF IN DUP
1312 ;=========================================================================
1313 ADOK    LDA     HDBUF+2
1314         SEC
1315         SBC     HDBUF
1316         STA     ICBLL,X
1317         LDA     HDBUF+3
1318         SBC     HDBUF+1
1319         STA     ICBLH,X
1320         LDA     HDBUF+1
1321         JSR     AWDQ            ;IS BEGINNING ADDRESS WITHIN DUP?
1322         BCS     AWD             ;BRANCH IF SO
1323         LDA     HDBUF+3
1324         JSR     AWDQ            ;IS ENDING ADDRESS WITHIN DUP?
1325         BCS     AWD             ;BRANCH IF SO
1326 ;=========================================================================
1327 ;       SINCE TEXT IN DUP, LOAD MEM.SAV IF NECCESARY
1328 ;=========================================================================
1329 ANWD    LDA     MEMLDD
1330         BMI     AWD             ;BRANCH IF MEM.SAV ALREADY LOADED
1331         LDA     #$80
1332         ORA     LOADFG
1333         STA     LOADFG          ;SET MEM.SAV DOESN'T HAVE TO BE LOADED F
1334 AWD     INC     ICBLL,X
1335         BNE     *+5
1336         INC     ICBLH,X
1337         BIT     LOADFG          ;DOES MEMORY HAVE TO BE LOADED?
1338         BMI     DLM             ;BRANCH IF NOT
1339         LDA     MEMLDD          ;WAS MEM.SAV ALREADY LOADED?
1340         BMI     DLM             ;BRANCH IF SO
1341         DEC     MEMLDD
1342         JSR     LDMEM           ;LOAD MEM.SAVE FILE (IF IT EXISTS)
1343         LDA     #0              ;SHOW USER AREA NOT DUP IN MEMORY
1344         STA     DUPFLG
1345         JSR     RELDIN          ;RESTORE DOSINI VECTOR FROM SAVED LOC
1346 ;=========================================================================
1347 ;       SET NO INIT ADDR DEFAULT THEN READ IN TEXT & ATTEMPT INIT
1348 ;=========================================================================
1349 DLM     LDX     #$10
1350         LDA     #.LOW.RTS
1351         STA     INITAD
1352         LDA     #.HIGH.RTS
1353         STA     INITAD+1        ;INIT DEFAULTS TO AN RTS
1354         JSR     CIO             ;READ DATA DIRECTLY TO MEMORY
1355         BPL     DLM1
1356         JMP     ERST            ;IF ERRORS
1357 DLM1    BIT     OPT
1358         BMI     DINIT           ;BRANCH IF NOGO OPTION
1359         JSR     JMPINT          ;DO INIT
1360 DINIT   JMP     RDDRC           ;GET NEXT SECTION OF LOAD FILE
1361 ;=========================================================================
1362 ;       SUBROUTINE TO DETERMINE IF ADDRESS IS WITHIN DUP ADDRESS SPACE.
1363 ;               ENTRY - HI BYTE OF ADDRESS IN REG. A
1364 ;               RETURNS - CARRY SET : WITHIN DUP
1365 ;                         CARRY CLR : NOT WITHIN DUP
1366 ;=========================================================================
1367 AWDQ    CMP     #.LOW.NDOSH
1368         BCC     AWDQR           ;BRANCH IF HI BYTE LT DUP START
1369         CMP     #.LOW.NMDUPH+1
1370         ROL     A
1371         EOR     #1
1372         LSR     A               ;COMPLEMENT CARRY
1373 AWDQR   RTS
1374 ;.........................................................................
1375 ;
1376 JMPINT  JMP     (INITAD)
1377 JMPRUN  JMP     (RUNAD)
1378 ;.........................................................................
1379 ;
1380 MEMLDD  .BYTE   0
1381 AF      .BYTE   'D1:AUTORUN.SYS',CR
1382         HILO    AF
1383 AFH     =       AF/256
1384 AFL     =       (-256)*AFH+AF
1385 NMSF    .BYTE   'NEED MEM.SAV TO LOAD THIS FILE.',CR
1386         HILO    NMSF
1387 NMSFH     =       NMSF/256
1388 NMSFL     =       (-256)*NMSFH+NMSF
1389         .PAGE
1390 ;=========================================================================
1391 ;  ****  CREATE  MEM.SAV  FILE  ****
1392 ;=========================================================================
1393 ;ROUTINE WRITTEN BY MICHAEL EKBERG,APRIL 21,1980
1394 ;-------------------------------------------------------------------------
1395 ;THIS ROUTINE CREATES A FILE ON DISK OF DATA FROM MEMORY
1396 ;CREATE FILE CALLED 'D1:MEM.SAV',SET Y=1
1397 ;
1398 ;ABLE TO CREATE FILE THEN SET REG.Y=ERROR RETURNED FROM CIO
1399 ;THE RAM TO BE OCCUPIED BY DUP IS STORED BY THIS ROUTINE INTO 'MEMORY.SAV'
1400 ;-------------------------------------------------------------------------
1401 NAME    .BYTE   'D1:MEM.SAV',CR
1402         HILO    NAME
1403 NAMEH     =       NAME/256
1404 NAMEL     =       (-256)*NAMEH+NAME
1405 MWRITE  JSR     CLOSX           ;CLOSE IOCB AND OPEN IT TO WRITE
1406         LDA     #OWRIT          ;
1407         STA     ICAX1,X         ;
1408         JSR     OREST           ;OPEN FOR WRITE
1409         BMI     ERRWR           ;IF ERROR THEN JMP AND RET
1410 ;
1411 ;=========================================================================
1412 ;WRITE MEMORY BLOCK
1413 ;=========================================================================
1414         LDA     #PUTCHR
1415         STA     ICCOM,X
1416         LDA     #.LOW.NDOSL     ;STORE START OF BLOCK FOR CIO
1417         STA     ICBAL,X
1418         LDA     #.LOW.NDOSH     ;START ADDR (HIGH)
1419         STA     ICBAH,X
1420         LDA     #.LOW.MLENL+1   ;LENGTH OF BLOCK
1421         STA     ICBLL,X
1422         LDA     #.LOW.MLENH     ;LENGTH(HIGH)
1423         STA     ICBLH,X
1424         JSR     CIO             ;WRITE DATA BLOCK
1425         BMI     ERRWR           ;IF WRITE ERROR THEN JMP
1426         JSR     CLOSX
1427         BMI     ERRWR
1428         LDY     #0
1429 RET     RTS
1430 ;-------------------------------------------------------------------------
1431 OREST   LDA     #.LOW.OPEN
1432         STA     ICCOM,X
1433         LDA     #.LOW.NAMEL     ;ROUTINE TO COMPLETE OPEN OF 'D1:MEMORY.
1434         STA     ICBAL,X         ;CALLING SUB SUPPLIES 'READ' OR 'WRITE'
1435         LDA     #.LOW.NAMEH     ;IN ICAX1
1436         STA     ICBAH,X
1437         JMP     CIO
1438 ;-------------------------------------------------------------------------
1439 ERRWR   STY     TEMP+1          ;TEMP STORE FOR Y FLAG
1440         JSR     CLOSX           ;CLOSE #$20
1441         LDA     #.LOW.DELETE    ;DELETE PART OF MENSAV
1442         STA     ICCOM,X
1443         JSR     OREST
1444 TEMP    LDY     #0              ;RESTORE FLAG
1445         RTS                     ;RETURN TO MAIN CALLER
1446         .PAGE
1447 ;=========================================================================
1448 ;  ****  ENTRY  POINT  ON  'DOS'  CALL  ****
1449 ;=========================================================================
1450 INISAV  .DBYTE 0                ;DOSINI VECTOR SAVE LOC
1451 MEMFLG  .BYTE   0
1452 MNDUP   LDX     #0
1453         STX     MEMFLG
1454         STX     LOADFG
1455         DEX
1456         STX     WARMST
1457         JSR     INITIO
1458 ;.........................................................................
1459         JSR     MEMSVQ          ;FIND OUT IF FILE D1:MEM.SAV EXISTS
1460         BPL     GOOD            ;BRANCH IF MEM.SAV FILE EXITS
1461         LDA     #0
1462         STA     WARMST          ;CLEAR WARM START FLAG
1463         BEQ     FINAL
1464 ;.........................................................................
1465 ;
1466 GOOD    JSR     MWRITE          ;WRITE USER AREA TO MEM.SAV
1467         BMI     ERROR
1468         DEC     MEMFLG          ;SHOW MEMORY WRITTEN
1469         BMI     FINAL
1470 ;.........................................................................
1471 ERROR   LDA     #.LOW.ERRMES    ;PRINT ERROR OCCURED MSG
1472         LDX     #.HIGH.ERRMES
1473         JSR     PRNTMSG         ;GOTO MSG PRINTER
1474 ;
1475         LDA     #.LOW.ERR       ;PRINT QUERY TO RUN DOS
1476         LDX     #.HIGH.ERR
1477         JSR     PRNTMSG         ;GOTO MSG PRINTER
1478 ;
1479 ;                               ;WAIT FOR Y TO RUN DOS
1480 ;.........................................................................
1481         LDA     #GETREC
1482         STA     ICCOM
1483         LDA     #.LOW.STAKL
1484         STA     ICBAL
1485         LDA     #.LOW.STAKH
1486         STA     ICBAH
1487         LDA     #2
1488         STA     ICBLL
1489         LDA     #0
1490         STA     ICBLH
1491         JSR     CIO
1492         LDA     STAK            ;SEE IF Y TYPED
1493         CMP     #'Y
1494         BNE     RTCART          ;BRANCH IF NOT
1495         LDA     #0
1496         STA     WARMST
1497 ;-------------------------------------------------------------------------
1498 FINAL   LDX     #$20
1499         LDA     #CLOSE
1500         STA     ICCOM,X         ;SET UP CLOSE COMMAND
1501         JSR     CIO             ;PERFORM CLOSE COMMAND
1502 ;-------------------------------------------------------------------------
1503 RRDUP   LDA     DOSINI          ;SAVE DOS INIT VECTOR
1504         STA     INISAV
1505         LDA     DOSINI+1
1506         STA     INISAV+1
1507 ;.........................................................................
1508         LDA     #.LOW.DOS       ;SET UP DUP INIT ADDR AS
1509         STA     DOSINI          ;DOS INIT VECTOR
1510         LDA     #.HIGH.DOS
1511         STA     DOSINI+1
1512 ;-------------------------------------------------------------------------
1513 RRDUP1  LDA     #.LOW.DUPSYS
1514         LDX     #$10
1515         STA     ICBAL,X
1516         LDA     #.HIGH.DUPSYS
1517         STA     ICBAH,X
1518         LDY     #0
1519         STY     OPT             ;ASSURE NO /N OPTION IN EFFECT
1520         DEY                     ;SHOW THAT DUP IS IN MEMORY
1521         STY     DUPFLG
1522         JSR     SFLOAD          ;LOAD DUP.SYS AND RUN IT
1523 RTCART  RTS
1524 EC      .BYTE   'E:',CR
1525         HILO    EC
1526 ECH     =       EC/256
1527 ECL     =       (-256)*ECH+EC
1528         HILO    MNDUP
1529 MNDUPH     =       MNDUP/256
1530 MNDUPL     =       (-256)*MNDUPH+MNDUP
1531 DUPSYS  .BYTE   'D1:DUP.SYS',CR
1532 ;.........................................................................
1533 ERRMES  .BYTE   'ERROR-SAVING USER MEMORY ON DISK',CR
1534 ERR     .BYTE   'TYPE Y TO STILL RUN DOS',CR
1535 ;=========================================================================
1536 ;  ****  SUBROUTINES  FOR  RESIDENT  DUP  **** 
1537 ;=========================================================================
1538 ;       ROUTINE TESTS IF MEM.SAV IS PRESENT ON THE DISK.
1539 ;       RETURNS - MINUS IF MEM.SAV IS NOT THERE
1540 ;                 PLUS  IF MEM.SAV IS THERE
1541 ;-------------------------------------------------------------------------
1542 MEMSVQ  JSR     CLOS20          ;CLOSE IOCB # 2
1543         LDA     #OPEN
1544         STA     ICCOM,X
1545         LDA     #.LOW.NAMEL
1546         STA     ICBAL,X
1547         LDA     #.LOW.NAMEH
1548         STA     ICBAH,X
1549         LDA     #ORDWRT
1550         STA     ICAX1,X         ;TRY TO OPEN D1:MEM.SAV FOR READ/WRITE
1551         JSR     CIO
1552         PHP                     ;SAVE STATUS
1553         JSR     CLOS20          ;CLOSE MEM.SAV
1554         PLP                     ;RESTORE STATUS
1555         RTS
1556 ;
1557 ;=========================================================================
1558 ;       SAVE FILE SUBROUTINE - WRITE FILE BODY, INIT, & RUN VECTORS
1559 ;=========================================================================
1560 WDR1    LDA     #0              ;THIS IMMEDIATE VALUE MODIFIED
1561         BEQ     WDR2            ;BRANCH IF MEMORY FILE DOESN'T HAVE TO B
1562         JSR     LDMEM
1563 WDR2    LDX     #$10
1564         JSR     CIO             ;DO SAVE - WRITE BODY TO DISK
1565 INITQ   LDA     #0              ;THIS IMMEDIATE VALUE CHANGED DURING SAV
1566         BEQ     RUNQ            ;SET TO FF WHEN AN INIT VECTOR IS PRESENT
1567         INC     INITQ+1
1568         LDA     INITAD
1569         STA     VECTR           ;IF INIT VECTOR FOR FILE SAVE IT
1570         LDA     INITAD+1
1571         STA     VECTR+1
1572         LDA     #.LOW.INITAD
1573         TAX
1574         STA     LDST
1575         LDA     #.HIGH.INITAD
1576         JSR     WRVEC
1577 RUNQ    LDA     #0              ;THIS IMMEDIATE VALUE MODIFIED
1578         BEQ     NORNAD          ;SET TO FF WHEN A RUN VECTOR IS PRESENT
1579         INC     RUNQ+1
1580         LDA     RUNAD
1581         STA     VECTR           ;IF RUN VECTOR FOR FILE SAVE IT
1582         LDA     RUNAD+1
1583         STA     VECTR+1
1584         LDA     #.LOW.RUNAD
1585         TAX
1586         STA     LDST
1587         LDA     #.HIGH.RUNAD
1588         JSR     WRVEC
1589 NORNAD  JSR     CLOSX           ;CLOSE IOCBS 1 &2
1590         LDA     MEMFLG
1591         AND     WDR1+1
1592         BEQ     DRRDUP
1593         INC     WDR1+1          ;RESET MEM.NEEDS TO BE LOADED FLAG
1594         JMP     RRDUP1          ;RELOAD & RUN DUP
1595 DRRDUP  JMP     DOSOS           ;RUN THE SWAPPED IN DUP
1596 ;-------------------------------------------------------------------------
1597 ;
1598 ;
1599 WRVEC   STA     LDST+1
1600         INX
1601         STX     LDND
1602         STA     LDND+1
1603         LDX     #$10
1604         LDA     #.LOW.LDST
1605         STA     ICBAL,X
1606         LDA     #.HIGH.LDST
1607         STA     ICBAH,X
1608         LDA     #6
1609         STA     ICBLL,X
1610         LDA     #0
1611         STA     ICBLH,X
1612         JMP     CIO             ;WRITE INIT OR RUN ADDRESS
1613 ;
1614 ;=========================================================================
1615 ;       JUMP TO CARTRIDGE
1616 ;=========================================================================
1617 CLMJMP  JSR     LDMEM
1618         LDA     #0              ;SHOW DUP NO LONGER IN MEMORY
1619         STA     DUPFLG
1620         JSR     RELDIN          ;RESTORE DOS INIT VECTOR SAVED
1621         JMP     (CARTST)        ;JUMP TO CARTRIDGE
1622 ;
1623 ;=========================================================================
1624 ;       LOAD MEM.SAV (IF IT EXISTS) BEFORE RUN AT ADDRESS
1625 ;=========================================================================
1626 LMTR    JSR     LDMEM           ;LOAD MEM.SAVE IF IT EXISTS
1627         LDA     #0              ;SHOW THAT DUP NO LONGER IN MEMORY
1628         STA     DUPFLG
1629         JSR     RELDIN          ;RESTORE DOS INIT VECTOR SAVED
1630         JMP     (RAMLO)         ;RUN AT ADDRESS
1631 ;=========================================================================
1632 ;       RESTORE DOSINI VECTOR FROM SAVED LOCATION
1633 ;=========================================================================
1634 RELDIN  LDA     INISAV
1635         STA     DOSINI
1636         LDA     INISAV+1
1637         STA     DOSINI+1
1638         RTS
1639 ;
1640 ;=========================================================================
1641 ;       SUBROUTINE - LDMEM
1642 ;       LOAD MEM.SAV IF IT EXISTS
1643 ;=========================================================================
1644 LDMEM   LDA     MEMFLG
1645         BNE     LDMEM1          ;BRANCH IF MEMORY WAS SAVED
1646         RTS
1647 LDMEM1  JSR     MEMSVQ
1648         BPL     LDMEM2          ;BRANCH IF MEM.SAV FILE DOES EXIST
1649         LDA     #0              ;TELL CART PGM AREA CLOBBERED
1650         STA     WARMST
1651         BEQ     CLOS2           ;GO CLOSE AND GOTO CART
1652 ;-------------------------------------------------------------------------
1653 LDMEM2  LDA     #OPEN
1654         STA     ICCOM,X
1655         JSR     CIO             ;REOPEN MEM.SAV
1656         LDA     #GETCHR
1657         STA     ICCOM,X
1658         LDA     #.LOW.MLENL+1
1659         STA     ICBLL,X
1660         LDA     #.LOW.MLENH
1661         STA     ICBLH,X
1662         LDA     #.LOW.NDOSL
1663         STA     ICBAL,X
1664         LDA     #.LOW.NDOSH
1665         STA     ICBAH,X
1666         JSR     CIO
1667 CLOS2   LDA     #CLOSE
1668         STA     ICCOM,X
1669         JMP     CIO             ;CLOSE MEM.SAV
1670 ;=========================================================================
1671 ;       CLOSE ALL IOCBS & RE-OPEN ZERO AS SCREEN EDITOR
1672 ;=========================================================================
1673 INITIO  JSR     CIOINV          ;THIS ROUTINE CLOSES ALL IOCB'S
1674 ;                               ;THEN REOPENS THE SCREEN EDITOR
1675         LDX     #0
1676         LDA     #OPEN
1677         STA     ICCOM,X
1678         LDA     #.LOW.ECL
1679         STA     ICBAL,X
1680         LDA     #.LOW.ECH
1681         STA     ICBAH,X
1682         LDA     #ORDWRT
1683         STA     ICAX1,X
1684         JSR     CIO
1685 ;.........................................................................
1686         LDX     #0              ;DELAY UNTIL DMA (SCREEN) IS RESTORED
1687         STX     CDTMV3          ;CLEAR TIMER NUMBER 3
1688         STX     CDTMV3+1
1689         LDY     #1              ;WAIT FOR ONE VBLANK
1690         LDA     #3              ;USE TIMER # 3
1691         STA     CDTMF3          ;SET TIMER DONE FLAG TO NOT DONE
1692         JSR     SETVBV          ;SYSTEM CALL TO SET TIMER
1693 WAITIM  LDA     CDTMF3          ;WAIT UNTIL TIMER IS DONE
1694         BNE     WAITIM
1695 ;.........................................................................
1696         RTS
1697 ;=========================================================================
1698 ;  CLOSX - CLOSE IOCBS 10,20
1699 ;=========================================================================
1700 CLOSX   LDA     #CLOSE
1701         LDX     #$10
1702         STA     ICCOM,X
1703         JSR     CIO
1704 ;=========================================================================
1705 ;       ENTRY TO CLOSE IOCB # 2 ONLY
1706 ;=========================================================================
1707 CLOS20  LDX     #$20
1708         LDA     #CLOSE
1709         STA     ICCOM,X
1710         JMP     CIO
1711 ;=========================================================================
1712 ;       SUBROUTINE - PRNTMSG
1713 ;=========================================================================
1714 ;       PUTS A CHARACTER STRING TERMINATED BY A CARRIAGE RETURN CHAR TO
1715 ;       SCREEN EDITOR.
1716 ;               ENTRY - REG A : LOW BYTE MSG ADDRESS
1717 ;                       REG X : HI BYTE MSG ADDRESS
1718 ;=========================================================================
1719 ;       PUT PARAMS IN IOCB - USE IOCB 0 FOR SCREEN EDITOR
1720 ;=========================================================================
1721 PRNTMSG STA     ICBAL           ;SET MSG ADDR IN IOCB BUFF ADDR
1722         STX     ICBAH
1723 ;=========================================================================
1724 ;       SET UP REST OF IOCB
1725 ;=========================================================================
1726         LDA     #$80            ;SET IN BUFFER LENGTH
1727         STA     ICBLL           ;ASSUME 128 BYTES MAX
1728         LDX     #0              ;USE REG X TO SET IN IOCB INDEX FOR CIO
1729         STX     ICBLH
1730         LDA     #PUTREC         ;PUT MSG
1731         STA     ICCOM
1732 ;=========================================================================
1733 ;       TEST IF DUP IS RESIDENT - IF IS THEN USE INDIRECT CIO ROUTINE TO
1734 ;       FOR BREAK KEY ABORT
1735 ;=========================================================================
1736         LDA     DUPFLG          ;=ZERO IF NON-RESIDENT DUP NOT IN MEMORY
1737         BNE     INMEM           ;IN MEMORY THEN USE INDIRECT CIO CALL
1738 ;.........................................................................
1739         JMP     CIO             ;ELSE GO DIRECT TO CIO & RETURN
1740 ;-------------------------------------------------------------------------
1741 INMEM   JMP     CIO1            ;USE CIO CALL WITH TEST FOR BREAK KEY ABORT
1742 ;-------------------------------------------------------------------------
1743 ;
1744 SAVH    .BYTE   $FF,$FF
1745         HILO    SAVH
1746 SAVHH     =       SAVH/256
1747 SAVHL     =       (-256)*SAVHH+SAVH
1748 LDST    *=*+2
1749         HILO    LDST
1750 LDSTH     =       LDST/256
1751 LDSTL     =       (-256)*LDSTH+LDST
1752 LDND    *=*+2
1753 VECTR   *=*+2
1754         .PAGE
1755 ;=========================================================================
1756 ;  ****  SIO  INTERRUPT  SERVICE  ROUTINES  ****
1757 ;=========================================================================
1758 ;       EQUATES FOR INTERRUPT ROUTINES MOVED FROM SIO ZERO PAGE
1759 ;
1760 ;       
1761 ;-------------------------------------------------------------------------
1762 BUFRLO  =       $32             ;POINTER TO BYTE TO SEND OR RECEIVE
1763 BUFRHI  =       $33
1764 BFENLO  =       $34             ;POINTER TO BYTE AFTER END OF BUFFER
1765 BFENHI  =       $35
1766 CHKSUM  =       $31             ;LOC TO STORE DATA FRAME CHECKSUM
1767 CHKSNT  =       $3B             ;CHECKSUM SENT FLAG- =FF SENT
1768 NOCKSM  =       $3C             ;FLAG NO CHECK SUM TO BE RECEIVED-NOT ZERO
1769 STATUS  =       $30             ;HOLD FOR STATUS TO BE PUT IN DCB
1770 BUFRFL  =       $38             ;FLAG-IF FF RECEIVE BUFFER IS FULL
1771 RECVDN  =       $39             ;FLAG RECEIVE NOT DONE. USED BY WAIT LOOP
1772 POKMSK  =       $10             ;POKEY INTERRUPT MASK SHADOW FOR IRQEN
1773 ;=========================================================================
1774 ;       HARDWARE REGISTERS USED IN SIO INTERRUPT ROUTINES
1775 ;=========================================================================
1776 SKRES   =       $D20A           ;SERIAL PORT STATUS RESET ON POKEY
1777 SEROUT  =       $D20D           ;SERIAL OUTPUT REGISTER
1778 SERIN   =       SEROUT          ;SERIAL PORT INPUT REG ON POKEY
1779 IRQEN   =       $D20E           ;IRQ INTERRUPT ENABLE ON POKEY
1780 SKSTAT  =       $D20F           ;SERIAL PORT STATUS REG ON POKEY
1781 ;=========================================================================
1782 ;       ERROR CODES RETURNED BY SIO
1783 ;=========================================================================
1784 FRMERR  =       $8C             ;FRAMING ERROR ON INPUT
1785 OVRRUN  =       $8E             ;DATA FRAME OVER RUN-BIT D5 IN SKSTAT
1786 CHKERR  =       $8F             ;DATA FRAME CHECKSUM ERROR
1787         .PAGE
1788 ;=========================================================================
1789 ;  ****  INTERRUPT  SERVICE  ROUTINE  TO  OUTPUT  DATA  NEEDED  ****
1790 ;=========================================================================
1791 ;       KEITH BALL 6/10/80
1792 ;-------------------------------------------------------------------------
1793 ;       IT UPDATES THE BYTE TO PUT ON SERIAL I/O BUS POINTER
1794 ;       UNTIL END OF BUFFER.  AFTER EACH UPDATE OF THE PTR ADDS THE
1795 ;       VALUE OF THE BYTE TO THE CHECKSUM.  OUTPUTS THE CHECKSUM WHEN
1796 ;       PTR EQUALS THE END OF BUFFER PTR (POINTS TO BYTE AFTER BUFFER).
1797 ;       RETURNS TO THIS ROUTINE AFTER CHECKSUM PASSED AND RESETS POKEY
1798 ;       INTERRUPT REG TO HAVE THE TRANSMIT DONE ROUTINE CALLED TO END
1799 ;       WAIT LOOP (SEE SIO LISTING).
1800 ;-------------------------------------------------------------------------
1801 ;
1802 ISRODN  TYA                     ;SAVE Y REG ON STACK
1803         PHA
1804 ;.........................................................................
1805         INC     BUFRLO
1806         BNE     NOWRP0          ;INCREMENT PTR TO NEXT BYTE
1807         INC     BUFRHI          ;TO SEND
1808 ;=========================================================================
1809 ;       PATCH TO ROUTINE        CHANGED CHECK
1810 ;=========================================================================
1811 NOWRP0  LDA     BUFRLO          ;CHECK IF PTR IS WITHIN BUFFER
1812         CMP     BFENLO          ;DO A DOUBLE PRECISION SUBTRACT
1813         LDA     BUFRHI
1814         SBC     BFENHI
1815         BCC     NOTEND          ;BRANCH IF (BUFR) < (BFEN)-MORE TO SEND
1816 ;.........................................................................
1817         LDA     CHKSNT          ;TEST IF CHECKSUM ALREADY SENT
1818         BNE     RELONE          ;BRANCH IF ALREADY SENT
1819 ;=========================================================================
1820 ;       SEND CHECKSUM AND SET FLAG
1821 ;=========================================================================
1822         LDA     CHKSUM
1823         STA     SEROUT          ;PUT CHECKSUM IN SERIAL OUT REG
1824         DEC     CHKSNT          ;SET FLAG TO FF HEX
1825         BNE     CHKDON          ;RETURN
1826 ;=========================================================================
1827 ;       AFTER CHECKSUM SENT AND CAUSE NEXT INTERRUPT THEN CHANGE POKEY
1828 ;       MASK TO ENABLE TRANSMIT DONE INTERRUPT AND TERMINATE WAIT LOOP.
1829 ;=========================================================================
1830 RELONE  LDA     POKMSK          ;GET POKEY MASK
1831         ORA     #$08            ;OR IN ENABLE
1832         STA     POKMSK
1833         STA     IRQEN           ;ENABLE THE INTERRUPTS
1834 ;=========================================================================
1835 ;       RESTORE REGS AND RETURN
1836 ;=========================================================================
1837 CHKDON  PLA
1838         TAY                     ;RESTOR Y REG
1839         PLA                     ;RESTORE A REG SAVED IN OS IRQ INTERRUPT
1840         RTI
1841 ;=========================================================================
1842 ;       MORE TO SEND.  SEND NEXT BYTE POINTED AT BY BUFR.
1843 ;=========================================================================
1844 NOTEND  LDY     #0
1845         LDA     (BUFRLO),Y      ;GET NEXT BYTE
1846         STA     SEROUT          ;PUT IN SERIAL OUT REG
1847 ;.........................................................................
1848         CLC
1849         ADC     CHKSUM          ;ADD BYTE TO CHECKSUM
1850         ADC     #0
1851         STA     CHKSUM
1852 ;-------------------------------------------------------------------------
1853         JMP     CHKDON          ;GO RETURN AND WAIT FOR NEXT BYTE
1854 ;-------------------------------------------------------------------------
1855 ;        END OF OUT SERVICE ROUTINE **************************************
1856         .PAGE
1857 ;=========================================================================
1858 ;  ****  SERIAL  INPUT  READY  INTERRUPT  SERVICE  ROUTINE  ****
1859 ;=========================================================================
1860 ;       KEITH BALL    6/11/80
1861 ;-------------------------------------------------------------------------
1862 ;       AFTER SERIAL RECEIVE IS ENABLED ROUTINE IS USED TO COLLECT
1863 ;       BYTES FROM THE SERIAL INPUT REG AND PUT THEM IN BUFFER. 
1864 ;       WILL STOP WHEN BUFFER IS FULL.  IF A CHECKSUM IS EXPECTED
1865 ;       ROUTINE WILL MARK BUFFER FULL AND CONTINUE. WHEN CHECKSUM
1866 ;       RECEIVED IT WILL CHECK IF = TO CHECKSUM IT WAS MAKING.
1867 ;       WILL STORE ERRORS FOUND IN STATUS LOCATION.
1868 ;       
1869 ;       THE IRQ INTERRUPT HANDLER IN THE OS PUSHES THE USER'S A REGISTER 
1870 ;       ONTO THE STACK BEFORE CALLING THIS ROUTINE.
1871 ;       
1872 ;-------------------------------------------------------------------------
1873 ISRSIR  TYA                     ;SAVE Y REG ON STACK
1874         PHA
1875 ;=========================================================================
1876 ;       GET STATUS FROM POKEY THEN RESET IT.
1877 ;=========================================================================
1878         LDA     SKSTAT
1879         STA     SKRES           ;IGNORES VALUE- JUST STROBED
1880 ;=========================================================================
1881 ;       CHECK FOR ERRORS
1882 ;=========================================================================
1883         BMI     NTFRAM          ;BIT 8 SET IF NO FRAMING ERROR
1884         LDY     #FRMERR
1885         STY     STATUS          ;SET FRAME ERROR STATUS
1886 ;-------------------------------------------------------------------------
1887 NTFRAM  AND     #$20            ;IF BIT 5 CLEAR THEN FRAME OVER RUN
1888         BNE     NTOVRN          ;BRANCH IF NO OVER RUN
1889         LDY     #OVRRUN
1890         STY     STATUS          ;ELSE SET OVERRUN ERROR STATUS
1891 ;=========================================================================
1892 ;       CHECK IF BUFFER FULL AND THIS IS A CHECKSUM.  IF IT IS, THEN CHECK
1893 ;       IF DATA SENT WAS VALID.
1894 ;=========================================================================
1895 NTOVRN  LDA     BUFRFL          ;TEST FOR BUFFER FULL (NOT ZERO)
1896         BEQ     NOTYET          ;IF ZERO THEN NOT YET, THIS IS DATA.
1897         LDA     SERIN           ;ELSE THIS IS CHECKSUM
1898         CMP     CHKSUM          ;ARE THEY EQUAL?
1899         BEQ     SRETRN          ;YES,THEN RETURN
1900         LDY     #CHKERR         ;ELSE SET CHECK SUM ERROR STATUS
1901         STY     STATUS
1902 ;=========================================================================
1903 ;       SET RECEIVE DONE TO END WAIT LOOP
1904 ;=========================================================================
1905 SRETRN  LDA     #$FF            ;DONE VALUE
1906         STA     RECVDN
1907 ;=========================================================================
1908 ;       RESTORE REGS AND RETURN
1909 ;=========================================================================
1910 SUSUAL  PLA
1911         TAY                     ;RESTORE Y REG
1912         PLA                     ;RESTORE A REG
1913         RTI
1914 ;=========================================================================
1915 ;       IF BYTE IS DATA, THEN GET HERE.  PUT BYTE IN BUFFER AND CHECK IF
1916 ;       AT END OF BUFFER.
1917 ;=========================================================================
1918 NOTYET  LDA     SERIN           ;GET DATA BYTE
1919         LDY     #0
1920         STA     (BUFRLO),Y      ;STORE IT IN THE BUFFER
1921 ;.........................................................................
1922         CLC
1923         ADC     CHKSUM          ;ADD DATA BYTE TO CHECKSUM
1924         ADC     #0
1925         STA     CHKSUM
1926 ;.........................................................................
1927         INC     BUFRLO          ;INCREMENT POINTER TO LOCATION
1928         BNE     NTWRP1          ;FOR NEXT BYTE INPUT
1929         INC     BUFRHI
1930 ;=========================================================================
1931 ;       THE PATCH CHANGED THE TEST FOR END OF BUFFER
1932 ;=========================================================================
1933 NTWRP1  LDA     BUFRLO          ;DO DOUBLE PRECISION SUBTRACT
1934         CMP     BFENLO
1935         LDA     BUFRHI
1936         SBC     BFENHI          ;CARRY CLEAR IF BORROW
1937         BCC     SUSUAL          ;BRANCH IF (BUFR) < (BFEN)-WITHIN BUFFER
1938 ;=========================================================================
1939 ;       DONE WITH DATA.  SEE IF CHECKSUM TO BE SENT
1940 ;=========================================================================
1941         LDA     NOCKSM          ;IF = ZERO THEN A CHECKSUM
1942         BEQ     GOON            ;WILL FOLLOW THE DATA
1943 ;.........................................................................
1944         LDA     #0              ;ELSE NO CHECKSUM TO FOLLOW
1945         STA     NOCKSM          ;CLEAR NO CHECKSUM FLAG
1946         BEQ     SRETRN          ;RETURN AFTER SET RECEIVE DONE FLAG
1947 ;=========================================================================
1948 ;       SET BUFFER FULL AND THEN GO GET CHECKSUM
1949 ;=========================================================================
1950 GOON    DEC     BUFRFL          ;SET BUFFER FULL FLAG TO FF
1951         BNE     SUSUAL          ;GO RETURN
1952 ;.........................................................................
1953 ;       END OF RECEIVE SERIAL INPUT INTERRUPT ROUTINE*********************
1954 MDEND   =       *
1955         HILO MDEND
1956 MDENDH     =       MDEND/256
1957 MDENDL     =       (-256)*MDENDH+MDEND
1958         *=$70C
1959         .BYTE   MDENDL,MDENDH   ;SET END ADDRESS IN FMS PAST RESIDENT DUP
1960                                 ;BUFFERS DON'T CLOBBER IT.
1961 STAK    =       $100
1962         HILO    STAK
1963 STAKH     =       STAK/256
1964 STAKL     =       (-256)*STAKH+STAK
1965         .PAGE
1966 ;=========================================================================
1967 ;  ****  BEGINNING  OF  NON-RESIDENT  PORTION  OF  DUP  **** 
1968 ;=========================================================================
1969 NDOS    =       MDEND+$300      ;END OF THE SYSTEM BUFFERS AND M
1970         HILO    NDOS
1971 NDOSH     =       NDOS/256
1972 NDOSL     =       (-256)*NDOSH+NDOS
1973         *=NDOS
1974 PAR     *=*+40  PARAMETER AREA
1975 PARH    =       PAR/256
1976 PARL    =       (-256)*PARH+PAR
1977 LINE    *=*+80  TYPEIN LINE BUFFER
1978 LBUFH   =       LINE/256
1979 LBUFL   =       (-256)*LBUFH+LINE
1980 DBUF    *=*+$100        DATA BUFFER FOR COPY
1981 DB1     =       DBUF+$80
1982 DB3     =       DBUF-3
1983         HILO    DBUF
1984 DBUFH     =       DBUF/256
1985 DBUFL     =       (-256)*DBUFH+DBUF
1986         HILO    DB1
1987 DB1H     =       DB1/256
1988 DB1L     =       (-256)*DB1H+DB1
1989         HILO    DB3
1990 DB3H     =       DB3/256
1991 DB3L     =       (-256)*DB3H+DB3
1992 DBLL    =       0
1993 DBLH    =       1               ;DATA BUFFER LENGTH=$100
1994 EDBLL   =       $FA             ;DATA BUFFER LENGTH USED IN USEPGM
1995 EDBLH   =       0               ;MUST BE A MULTIPLE OF 125, SECTOR DATA L
1996 MENUSZ  *=*+1
1997 PER     *=*+1
1998 UNNO    *=*+1
1999 RCNT    *=*+1
2000 SSTAT   *=*+1
2001 SWDP    *=*+5
2002 CSRC    *=*+1
2003 CDES    *=*+1
2004 SAVX    *=*+1
2005 PTR     *=*+1
2006 IPTR    *=*+1
2007 CTR     *=*+1
2008 T1      *=*+2
2009 BUFLEN  =       T1              ;SAVE AREA FOR BUFFER LENGTH, USED IN USE
2010 STVEC   *=*+2                   ;A TEMP OF SOME KIND
2011 MLT125  =       STVEC           ;TEMP STORE FOR MULTIPLE OF 125, USEPGM
2012 SECSIZ  *=*+2                   ;USED TO STORE SECTOR SIZE IN BYTES FOR DUP DISK
2013 EOFFLG  *=*+1                   ;ENDFILE FLAG FOR SOURCE IN DUPFIL
2014 FTRF    *=*+1                   ;FIRST TIME READ FLAG USED IN DUPFIL
2015 TWODRV  =       FTRF            ;FLAG TO SHOW IF 1 OR 2 DRIVES. USED IN DUPDISK
2016 DTH     =*
2017         HILO    DTH
2018 DTHH     =       DTH/256
2019 DTHL     =       (-256)*DTHH+DTH
2020 EDN     .BYTE   'E:',CR
2021 EDH     =       EDN/256
2022 EDL     =       (-256)*EDH+EDN
2023         .PAGE
2024 ;=========================================================================
2025 ;  ****  DOS  MENU  ****
2026 ;=========================================================================
2027 DMENU   .BYTE   CLSCR
2028         .BYTE   'DISK OPERATING SYSTEM II VERSION 2.0S',CR
2029         .BYTE   'COPYRIGHT 1980 ATARI',CR,CR
2030         .BYTE   'A. DISK DIRECTORY I. FORMAT DISK',CR
2031         .BYTE   'B. RUN CARTRIDGE  J. DUPLICATE DISK',CR
2032         .BYTE   'C. COPY FILE      K. BINARY SAVE',CR
2033         .BYTE   'D. DELETE FILE(S) L. BINARY LOAD',CR
2034         .BYTE   'E. RENAME FILE    M. RUN AT ADDRESS',CR
2035         .BYTE   'F. LOCK FILE      N. CREATE MEM.SAV',CR
2036         .BYTE   'G. UNLOCK FILE    O. DUPLICATE FILE',CR
2037         .BYTE   'H. WRITE DOS FILES',CR
2038         .BYTE   CDN,CDN,CDN,CDN,CDN
2039 DMEND   =*
2040 DULEN   =       DMEND-DMENU
2041         HILO    DULEN
2042 DULENH     =       DULEN/256
2043 DULENL     =       (-256)*DULENH+DULEN
2044         HILO    DMENU
2045 DMENUH     =       DMENU/256
2046 DMENUL     =       (-256)*DMENUH+DMENU
2047 ;
2048 DUJPT   .WORD   DIRLST,STCAR,CPYFIL,DELFIL,RENFIL,LKFIL,ULFIL
2049         .WORD   WBOOT,FMTDSK,DUPDSK,SAVFIL,LDFIL,BRUN,MEMSAV
2050         .WORD   DUPFIL
2051         HILO    DUJPT
2052 DUJPTH     =       DUJPT/256
2053 DUJPTL     =       (-256)*DUJPTH+DUJPT
2054 DUNUM      =       15           ;NUMBER OF FUNCTIONS
2055         .PAGE
2056 ;=========================================================================
2057 ;  ****  DISK  OPERATING  SYS  MONITOR  ****
2058 ;=========================================================================
2059 DOSOS   LDX     #$FF
2060         HILO    DOSOS
2061 DOSOSH     =       DOSOS/256
2062 DOSOSL     =       (-256)*DOSOSH+DOSOS
2063         CLD                     ;MAKE SURE DECIMAL MODE OFF
2064         STX     BRKKEY
2065         INX
2066         STX     LOADFG
2067         LDA     #2
2068         STA     LMARGN
2069         LDA     #39
2070         STA     RMARGN          ;SET MARGINS
2071         LDA     POKMSK          ;ENABLE BREAK INTERRRUPTS
2072         ORA     #$80
2073         STA     POKMSK
2074         STA     IRQEN
2075         JSR     INITIO          ;CLOSE FILES
2076 ;=========================================================================
2077 ;       DISK UTILITY MONITOR
2078 ;=========================================================================
2079 DSKUTL
2080 DU1     LDA     #DUNUM
2081         STA     MENUSZ          ;SET MENU SIZE.
2082         LDA     #.LOW.DUJPTL
2083         STA     JMPTBL
2084         LDA     #.LOW.DUJPTH
2085         STA     JMPTBL+1        ;SET UP JUMP TABLE ADDRESS
2086 ;------------------------------------------------------------------------- 
2087 ; FALL THRU TO MENU SELECT
2088 ;
2089 ;=========================================================================
2090 ;       MENU SELECT MONITOR -- VECTORS TO ROUTINE SELECTED FROM MENU.
2091 ;=========================================================================
2092 SHMEN   LDA     #.LOW.DMENUL    ;GET MENU ADDRESS
2093         STA     ICBAL
2094         LDA     #.LOW.DMENUH
2095         STA     ICBAH
2096         LDA     #.LOW.DULENL    ;GET MENU LENGTH
2097         STA     ICBLL
2098         LDA     #.LOW.DULENH
2099         STA     ICBLH
2100         JSR     DSPMSG          ;SHOW MENU
2101 ;.........................................................................
2102 ;SELECT ITEM FROM MENU
2103         .PAGE
2104 ;=========================================================================
2105 ;  ****  FUNCTIONS COME HERE WHEN THEY ARE DONE  **** 
2106 MENUSL  LDX     #$FF            ;RESET STACK AT THIS POINT
2107         TXS
2108         INX
2109         STX     WCFLAG          ;CLEAR WILD-CARD FLAG
2110         LDA     #.LOW.SITL      ;SELECT ITEM MESSAGE
2111         LDX     #.LOW.SITH
2112         JSR     PRNTMSG
2113         LDA     #$40            ;MAKE SURE UPPER CASE
2114         STA     SHFLOK
2115         JSR     CHRGET          ;GO GET KEYBOARD CHAR.
2116 ;.........................................................................
2117         CMP     #CR             ;IF CR REDISPLAY MENU
2118         BEQ     SHMEN
2119 ;.........................................................................
2120         SEC
2121         SBC     #'A             ;CONVERT ASCII CHAR. TO BINARY # & SUBTRACT
2122         BMI     RANGE           ;IF ASCII CHAR NOT A #, GO READ AGAIN
2123         CMP     MENUSZ          ;IS THE # ENTERED > MENU SIZE?
2124         BPL     RANGE           ;IF YES, GO READ AGAIN.
2125         ASL     A
2126         TAY                     ;SET INDEX TO (MENU # - 1) * 2
2127         LDA     (JMPTBL),Y
2128         INY
2129         STA     RAMLO           ;GET STRING POINTER
2130         LDA     (JMPTBL),Y
2131         STA     RAMLO+1
2132         LDY     #1              ;LOAD STRING POINTER INTO REGISTERS
2133         LDA     (RAMLO),Y       ;FOR DSPLIN
2134         TAX
2135         DEY
2136         LDA     (RAMLO),Y
2137         JSR     DSPLIN          ;PRINT MODULES INITIAL STRING
2138         JSR     SCROL           ;SCROLL INPUT WINDOW
2139         LDA     RAMLO           ;INC BY 2 TO POINT PAST STRING POINTER
2140         CLC
2141         ADC     #2
2142         STA     RAMLO
2143         LDA     RAMLO+1
2144         ADC     #0      CARRY
2145         STA     RAMLO+1         ;PUT HI BYTE.
2146         JMP     (RAMLO)         ;JUMP TO ROUTINE SELECTED BY MENU.
2147 RANGE   LDA     #.LOW.NSIL
2148         LDX     #.LOW.NSIH
2149         JSR     DSPLIN          ;NO SUCH ITEM MESSAGE
2150         JMP     MENUSL
2151         .PAGE
2152 NSI     .BYTE   'NO SUCH ITEM',CR
2153 ;=========================================================================
2154 ;       PROMPT FOR MENU SELECTION OR REDISPLAY MENU - RETURN IS IN INVER
2155 ;=========================================================================
2156 SIT     .BYTE   'SELECT ITEM OR ',$D2,$C5,$D4,$D5,$D2,$CE
2157         .BYTE   ' FOR MENU',CR
2158         HILO    NSI
2159 NSIH     =       NSI/256
2160 NSIL     =       (-256)*NSIH+NSI
2161         HILO    SIT
2162 SITH     =       SIT/256
2163 SITL     =       (-256)*SITH+SIT
2164 MNSL    =       MENUSL
2165         HILO    MNSL
2166 MNSLH     =       MNSL/256
2167 MNSLL     =       (-256)*MNSLH+MNSL
2168         .PAGE
2169 ;=========================================================================
2170 ;  ****  DIRECTORY  LISTING  ROUTINE  ****
2171 ;=========================================================================
2172 DIRLST  .WORD   DLMG
2173         JSR     GETIC1
2174         JSR     USEBUF          ;INIT BUFADR & BUFLEN
2175         LDX     PTR
2176         LDA     #CR
2177         STA     PAR-1,X         ;ASSURE GOOD TERM
2178         LDA     PAR-2,X         ;LAST CHAR OF SEARCH SPEC
2179         CMP     #':             ;IF COLON, ADD *.*
2180         BNE     GLF
2181         LDA     #'*
2182         STA     PAR-1,X
2183         STA     PAR+1,X
2184         LDA     #'.
2185         STA     PAR,X
2186         LDA     #CR
2187         STA     PAR+2,X
2188         INX
2189         INX
2190         INX
2191         STX     PTR
2192 GLF     STX     SAVX
2193         LDX     #$20
2194         JSR     PIOCB
2195         JSR     GETFIL
2196         JSR     PERX
2197         LDA     #6              ;READ DIR INFO
2198         LDX     #$10
2199         STA     ICAX1,X
2200         LDA     #OPEN           ;OPEN
2201         STA     ICCOM,X
2202         STX     CSRC            ;COPY SOURCE=DIRECTORY INFO
2203         CPX     #$10
2204         BNE     *+3
2205         JSR     CIOCL
2206         LDA     PTR
2207         SEC
2208         SBC     SAVX
2209         CMP     #3              ;IF ONLY 3 CHARS, IS 'D:'CR, USE DEFAULT
2210         BEQ     DLST1
2211 DLST0   JMP     PDES            ;GO INTO COPY
2212 DLST1   LDX     SAVX
2213         LDA     PAR,X
2214         CMP     #'D
2215         BNE     DLST0
2216         JMP     PDES1           ;GO INTO COPY WITH DES='E:'
2217         .PAGE
2218 DLMG    .BYTE   'DIRECTORY--SEARCH SPEC,LIST FILE?',CR
2219 ;=========================================================================
2220 ;  ****  DELETE  FILE  ROUTINE  ****
2221 ;=========================================================================
2222 DELFIL  .WORD   DEMG
2223         JSR     GETIC1
2224         JSR     PERX            ;EXIT IF PARAM ERRORS
2225 ;-------------------------------------------------------------------------
2226         JSR     CHKVER          ;BE SURE THAT IT IS VER. 2 DISKETTE
2227 ;=========================================================================
2228 ;       CONTINUE WITH DELETE - ALLOW ONLY FOR DISK DEVICE ID
2229 ;=========================================================================
2230         LDA     PAR             ;GET DEVICE
2231         CMP     #'D             ;ONLY ALLOW DELETE FOR D:
2232         BEQ     DF1
2233         LDA     #.LOW.NDFL
2234         LDX     #.LOW.NDFH
2235         JSR     DSPLIN
2236         JMP     MENUSL
2237 NDF     .BYTE   'NOT A DISK FILE',CR
2238         HILO    NDF
2239 NDFH     =       NDF/256
2240 NDFL     =       (-256)*NDFH+NDF
2241 DF1     LDX     #$10
2242         LDA     OPT
2243         CMP     #'N             ;IF OPTION=N, NO QUERY
2244         BNE     DWQ             ;NO, DELETE WITH QUERY
2245         LDA     #DELETE
2246         STA     ICCOM,X
2247         JSR     CIOCL
2248         JMP     MENUSL
2249 DWQ     LDA     #.LOW.TYQL
2250         LDX     #.LOW.TYQH
2251         JSR     DSPLIN  SAY TYPE Y TO DELETE...
2252         LDA     #0
2253         STA     IPTR            ;HOW MANY FILES TO SKIP, NONE AT FIRST
2254         LDX     #$20            ;SET UP DELETE IOCB
2255         LDA     #DELETE
2256         STA     ICCOM,X
2257         LDA     #.LOW.DB3L
2258         STA     ICBAL,X
2259         LDA     #.LOW.DB3H
2260         STA     ICBAH,X
2261         LDA     #'D
2262         STA     DBUF-3
2263         LDA     #':
2264         STA     DBUF-1
2265         LDA     PAR+1           ;DEVICE NUMBER OR : FROM OP INPUT
2266         CMP     #':
2267         BNE     *+4
2268         LDA     #'1
2269         STA     DBUF-2          ;KLUDGE KLUDGE KLUDGE
2270 IDRD    LDX     #$10
2271         LDA     #OPEN
2272         STA     ICCOM,X
2273         LDA     #6
2274         STA     ICAX1,X         ;DIR READ OPEN
2275         LDA     #PARL
2276         STA     ICBAL,X
2277         LDA     #PARH
2278         STA     ICBAH,X
2279         JSR     CIOCL
2280         LDA     #.LOW.DBUFL
2281         STA     ICBAL,X
2282         LDA     #.LOW.DBUFH
2283         STA     ICBAH,X
2284         LDA     #GETREC
2285         STA     ICCOM,X
2286         LDA     #0
2287         STA     PTR             ;HOW MANY FILES WE HAVE SKIPPED
2288 ;READ FILENAME FROM DIR, QUERY AND DELETE
2289 RDFN    LDX     #$10
2290         LDA     #0
2291         STA     ICBLL,X
2292         LDA     #1
2293         STA     ICBLH,X
2294         JSR     CIOCL           ;READ A LINE FROM DIRECTORY
2295         LDA     DBUF+1          ;IF FILE LINE, THIS IS BLANK
2296         CMP     #'
2297         BNE     DELX            ;THIS IS FREE BLOCKS LINE
2298         INC     PTR             ;COUNT THIS FILE
2299         LDA     PTR             ;HAVE WE SKIPPED ENUF YET
2300         CMP     IPTR
2301         BMI     RDFN            ;BR IF NO
2302         LDX     #0              ;PUT PTR
2303         LDY     #2              ;GET PTR
2304 ;MASSAGE DELETE FILE NAMES
2305 MDN1    LDA     DBUF,Y
2306         CMP     #'              ;END OF FILENAME
2307         BEQ     MDN2
2308         STA     DBUF,X
2309         INX
2310         INY
2311         CPX     #8
2312         BMI     MDN1
2313 ;FILENAME IS MOVED, PUT .EXT
2314 MDN2    LDA     #'.
2315         STA     DBUF,X
2316         INX
2317         LDY     #10             ;WHERE EXT IS
2318 MDN3    LDA     DBUF,Y
2319         STA     DBUF,X
2320         INY
2321         INX
2322         CPY     #13
2323         BMI     MDN3
2324         STX     SAVX            ;PUT CR HERE LATER
2325         LDA     #'?             ;FOR QUERY
2326         STA     DBUF,X
2327         INX
2328         LDA     #CR
2329         STA     DBUF,X
2330         LDA     #.LOW.DB3L
2331         LDX     #.LOW.DB3H
2332         JSR     DSPLIN          ;GO ASK ABOUT THIS FILE
2333         JSR     CHRGET
2334         CMP     #'Y
2335         BNE     RDFN            ;GO DO NEXT FILENAME
2336         LDA     PTR             ;NUMBER FILES WE HAVE GONE THRU SO FAR
2337         STA     IPTR            ;IS NEW NUMBER TO SKIP.
2338         LDX     SAVX
2339         LDA     #CR
2340         STA     DBUF,X
2341         LDX     #$20            ;DELETE IOCB
2342         JSR     CIOCL
2343         JSR     CLOS1
2344         JMP     IDRD            ;CLOSE AND REOPEN DIR READ FILE
2345 DELX    JSR     CLOS1           ;CLOSE DIR READ FILE
2346         JMP     MENUSL
2347 CLOS1   LDX     #$10
2348         LDA     #CLOSE
2349         STA     ICCOM,X
2350         JMP     CIOCL           ;DO CLOSE AND RETURN
2351 TYQ     .BYTE   'TYPE ',$22,'Y',$22,' TO DELETE...',CR
2352         HILO    TYQ
2353 TYQH     =       TYQ/256
2354 TYQL     =       (-256)*TYQH+TYQ
2355 DEMG    .BYTE   'DELETE FILE SPEC',CR
2356 ;LIST
2357         .PAGE
2358 ;=========================================================================
2359 ;  ****  COPY FILE ROUTINE  ****
2360 ;=========================================================================
2361 CPMG    .BYTE   'COPY--FROM, TO?',CR
2362 OE      .BYTE   'OPTION NOT ALLOWED',CR
2363         HILO    OE
2364 OEH     =       OE/256
2365 OEL     =       (-256)*OEH+OE
2366 ;.........................................................................
2367 ;
2368 ;
2369 ;
2370 ;
2371 WCFLAG  *=*+1
2372 WCSKP1  *=*+1
2373 WCSKP2  *=*+1
2374 WCBUFL  =       20
2375 WCBUF   *=*+WCBUFL
2376 WCOPYM  .BYTE   '  COPYING---'
2377 WCBUF2  .BYTE   'DN:'
2378         *=*+WCBUFL-3
2379 CPYFIL  .WORD   CPMG            ;COPY FILE PROMPT
2380         JSR     GETIC1          ;GET SOURCE DEVICE, ETC.
2381         LDA     PTR
2382         STA     SAVX
2383         LDA     PAR             ;GET 1ST CHAR. OF DEVICE
2384         CMP     #'D             ;TEST IF IT IS THE DISK
2385         BNE     JMPNWC          ;BRANCH IF NOT THE DISK (THEN USE OLD CODE)
2386         LDX     #0              ;LOOK AT SOURCE FILE SPEC.
2387         JSR     LOOKWC          ;LOOK FOR WILDCARDS IN FILE SPEC.
2388         BEQ     CPYFL1          ;BRANCH IF WILDCARDS USED IN DISK SPEC.
2389 JMPNWC  JMP     NOTWC           ;USE OLD CODE
2390 CPYFL1  LDA     #$80
2391 ;.........................................................................
2392 ;
2393 WCINIT  STA     WCFLAG          ;SET 'WILDCARD' MODE  (COPY-FILE OR DUPLICATE)
2394         LDA     #0
2395         STA     WCSKP1
2396 ;-------------------------------------------------------------------------
2397 WCOPYL  LDA     #0
2398         STA     WCSKP2
2399         LDX     #$10            ;OPEN DIRECTORY
2400         LDA     #6
2401         STA     ICAX1,X
2402         LDA     #OPEN
2403         STA     ICCOM,X
2404         LDA     #.LOW.PAR
2405         STA     ICBAL,X
2406         LDA     #.HIGH.PAR
2407         STA     ICBAH,X
2408         JSR     CIOCL
2409 ;
2410 ;-------------------------------------------------------------------------
2411 WCOPYR  LDA     #GETREC         ;READ DIRECTORY
2412         STA     ICCOM,X
2413         LDA     #WCBUFL
2414         STA     ICBLL,X
2415         LDA     #0
2416         STA     ICBLH,X
2417         LDA     #.LOW.WCBUF
2418         STA     ICBAL,X
2419         LDA     #.HIGH.WCBUF
2420         STA     ICBAH,X
2421         JSR     CIOCL
2422 ;.........................................................................
2423         LDA     WCBUF           ;IF 1ST CHAR. OF DIRECTORY READ IS AN # -
2424         CMP     #'0
2425         BCC     WCGOT
2426         CMP     #':
2427         BCS     WCGOT
2428 ;.........................................................................
2429         LDA     #CLOSE          ;ALL DONE -- NORMAL EXIT OF WILDCARDED CMD
2430         STA     ICCOM,X
2431         JSR     CIOCL
2432         JMP     MENUSL
2433 ;
2434 ;-------------------------------------------------------------------------
2435 WCGOT   LDA     WCSKP1          ;IF ALREADY COPIED OR SKIPPED THIS FILE
2436         CMP     WCSKP2
2437         BEQ     SKIP1
2438 ;.........................................................................
2439         INC     WCSKP2
2440         BNE     WCOPYR
2441 ;-------------------------------------------------------------------------
2442 SKIP1   INC     WCSKP1
2443 ;
2444         LDA     #CLOSE          ;CLOSE DIRECTORY READ FILE
2445         STA     ICCOM,X
2446         JSR     CIOCL
2447 ;
2448 ;-------------------------------------------------------------------------
2449         LDY     #2              ;DON'T COPY .SYS FILES
2450 SYSLOP  LDA     WCBUF+10,Y
2451         CMP     DOTSYS,Y
2452         BNE     NOSYS
2453         DEY
2454         BPL     SYSLOP
2455         BMI     WCOPYL
2456 ;-------------------------------------------------------------------------
2457 DOTSYS  .BYTE   'SYS'
2458 ;-------------------------------------------------------------------------
2459 NOSYS   LDY     #'1             ;CALC SOURCE DRIVE NUMBER
2460         LDA     PAR+1
2461         CMP     #':
2462         BEQ     WCGOT1
2463         TAY
2464 WCGOT1  STY     WCBUF2+1
2465 ;
2466 ;.........................................................................
2467         LDX     #2              ;COMPRESS SPACES, ADD ':', ADD 'CR'
2468         LDY     #3
2469 ;-------------------------------------------------------------------------
2470 COMPR1  LDA     WCBUF,X
2471         CMP     #'
2472         BEQ     COMPR2
2473         STA     WCBUF2,Y
2474         INY
2475 ;-------------------------------------------------------------------------
2476 COMPR2  INX
2477         CPX     #10
2478         BNE     COMPR1
2479 ;.........................................................................
2480         LDA     WCBUF,X
2481         CMP     #'
2482         BEQ     COMPR5
2483         LDA     #'.
2484         STA     WCBUF2,Y
2485         INY
2486 COMPR3  LDA     WCBUF,X
2487         CMP     #'
2488         BEQ     COMPR4
2489         STA     WCBUF2,Y
2490         INY
2491 COMPR4  INX
2492         CPX     #13
2493         BNE     COMPR3
2494 ;-------------------------------------------------------------------------
2495 COMPR5  LDA     #CR
2496         STA     WCBUF2,Y
2497 ;.........................................................................
2498 ;
2499         LDA     #.LOW.WCOPYM    ;PRINT 'COPYING---DEV:FILENAME.EXT' MESSAGE
2500         LDX     #.HIGH.WCOPYM
2501         JSR     DSPLIN
2502 ;.........................................................................
2503         BIT     WCFLAG
2504         BVC     WCOPY           ;BRANCH TO MIDDLE OF DUPLICATE FILE ROUTINE
2505 ;
2506         LDX     #$10            ;SET UP BUFFER ADDRESS TO POINT TO WILDCARD
2507         LDA     #.LOW.WCBUF2
2508         STA     ICBAL,X
2509         LDA     #.HIGH.WCBUF2
2510         STA     ICBAH,X
2511         JMP     WCDUPS
2512 ;-------------------------------------------------------------------------
2513 WCOPY   JSR     USEPGM          ;SET BUFFER SIZES
2514         LDX     #$10            ;OPEN COPY SORCE FILE
2515         LDA     #OPEN
2516         STA     ICCOM,X
2517         LDA     #4
2518         STA     ICAX1,X
2519         LDA     #.LOW.WCBUF2
2520         STA     ICBAL,X
2521         LDA     #.HIGH.WCBUF2
2522         STA     ICBAH,X
2523         STX     CSRC
2524         JSR     CIOCL
2525 ;.........................................................................
2526         LDX     #$20
2527         JSR     PIOCB           ;GET COPY DESTINATION FILE
2528         LDA     PTR             ;SAVE  PTR,IPTR BECAUSE MIGHT REPEAT GETTING
2529 MES
2530         PHA
2531         LDA     IPTR
2532         PHA
2533         JSR     GETFIL          ;GET 2ND FILE NAME TO PAR
2534         PLA                     ;RECOVER  IPTR,PTR
2535         STA     IPTR
2536         PLA
2537         STA     PTR
2538         LDX     SAVX
2539         LDA     PAR,X
2540         CMP     #'D
2541         BEQ     WCOPY0
2542         JMP     PDES            ;JUMP TO OLD COPY-FILE CODE IF NOT A DISK
2543 ;-------------------------------------------------------------------------
2544 WCOPY0  LDY     #'1             ;CALCULATE DESTINATION DRIVE #
2545         LDA     PAR+1,X
2546         CMP     #':
2547         BEQ     WCOPY1
2548 ;-------------------------------------------------------------------------
2549         TAY
2550 WCOPY1  CPY     WCBUF2+1
2551         BNE     WCOPY2
2552         JSR     CLOSX           ;CAN NOT COPY TO SAME DRIVE NUMBER -- ERROR
2553 ;.........................................................................
2554         JMP     ODMS
2555 ;
2556 ;-------------------------------------------------------------------------
2557 WCOPY2  LDX     #$20
2558         STY     WCBUF2+1        ;CHANGE FILESPEC TO DESTINATION
2559         LDA     #.LOW.WCBUF2
2560         STA     ICBAL,X
2561         LDA     #.HIGH.WCBUF2
2562         STA     ICBAH,X
2563         JMP     OPDES1          ;CONTINUE INTO OLD COPY-FILE CODE
2564 ;
2565 ;-------------------------------------------------------------------------
2566 NOTWC   =       *
2567         LDX     #$20    IOCB 3
2568         JSR     PIOCB
2569         JSR     GETFIL          ;GET SECOND FILENAME
2570 ;=========================================================================
2571 ;       MAKE SURE DESTINATION IS NOT DOS.SYS
2572 ;=========================================================================
2573         LDX     SAVX            ;ENTRY-INDEX TO DEST FILE SPEC
2574         JSR     TSTDOS          ;WON'T RETURN IF IS DOS.SYS
2575 ;.........................................................................
2576         LDX     SAVX
2577         JSR     LOOKWC
2578         BNE     NWCIND          ;BRANCH IF NO WILDCARDS IN DESTINATION
2579         LDA     #.LOW.NWAL
2580         LDX     #.LOW.NWAH
2581         JSR     DSPLIN
2582         JMP     MENUSL
2583 NWA     .BYTE   'WILD CARDS NOT ALLOWED IN DESTINATION',CR
2584         HILO    NWA
2585 NWAH     =       NWA/256
2586 NWAL     =       (-256)*NWAH+NWA
2587 NWCIND  =       *
2588         JSR     PERX            ;IF PARAM ERRS, EXIT
2589         JSR     USEPGM          ;ASK USER IF CAN USE PGM AREA OR DATA BUF
2590 PSRC    =       *
2591         LDA     PAR             ;GET 1ST LETR OF PARAM
2592         CMP     #'K
2593         BEQ     ODMS            ;K: GETS 'OPTION DOES NOT MAKE SENSE' FOR NOW
2594         CMP     #'C
2595         BEQ     ODMS            ;C: GETS 'OPTION DOES NOT MAKE SENSE' FOR NOW
2596         CMP     #'E             ;E: AS SOURCE IS SPECIAL
2597         BNE     OPSRC           ;IF NO THEN OPEN SOURCE FILE
2598         LDX     #0
2599         STX     CSRC
2600         JMP     PDES
2601 OPSRC   CMP     #'S
2602         BEQ     ODMS            ;S: AS SOURCE GETS 'OPTION DOES NOT MAKE SENSE' FOR NOW
2603 ;=========================================================================
2604 ;       OPEN SOURCE FILE
2605 ;=========================================================================
2606         LDX     #$10
2607         LDA     #OPEN
2608         STA     ICCOM,X
2609         LDA     #4              ;OPEN IN
2610         STA     ICAX1,X
2611         STX     CSRC
2612         CPX     #$10
2613         BNE     *+33
2614         JSR     CIOCL           ;OPEN SOURCE FILE HERE
2615 ;=========================================================================
2616 ;       READY FOR OPEN OF DESTINATION
2617 ;=========================================================================
2618 PDES    LDX     SAVX
2619         LDA     PAR,X
2620 ;.........................................................................
2621         CMP     #'K             ;IS DEST KEYBOARD?
2622         BEQ     ODMS            ;YES, THEN CAN'T DO IT
2623 ;.........................................................................
2624         CMP     #'E             ;CHECK FOR SPECIAL CASE
2625         BNE     OPDES           ;IF NOT
2626 PDES1   LDA     #0              ;SPECIAL CASE - DONT OPEN, USE EXISTING IOCB
2627         STA     CDES
2628         JMP     DOCPY
2629 ODMS    LDA     #OEL
2630         LDX     #OEH            ;SAY OPTION NOT ALLOWED
2631         JSR     DSPLIN
2632         JSR     CLOSX           ;CLOSE IOCB 1 & 2
2633         JMP     MENUSL
2634 ;-------------------------------------------------------------------------
2635 OPDES   CMP     #'C
2636         BEQ     ODMS            ;C: GETS 'OPTION DOESNOT MAKE SENSE' FOR NOW
2637         LDX     OPT             ;GET 2ND FILE OPTION
2638 ;.........................................................................
2639         CPX     #'A             ;APPEND TO DISK FILE
2640         BNE     OPDES1
2641         CMP     #'D
2642         BNE     ODMS
2643         LDA     #9
2644         BNE     OPDES3
2645 OPDES1  LDA     #8
2646 OPDES3  LDX     #$20
2647         STA     ICAX1,X OPEN TYPE OUT
2648         LDA     #OPEN
2649         STA     ICCOM,X OPEN
2650         STX     CDES
2651         JSR     CIOCL
2652         LDA     #0
2653         STA     ICAX2,X
2654 ;COPY FROM CSRC TO CDES
2655 DOCPY   LDA     #GETCHR
2656 GC1     LDX     CSRC
2657         LDY     CDES
2658         STA     ICCOM,X
2659         LDA     #PUTCHR
2660         STA     ICCOM,Y
2661         LDA     BUFADR          ;ADDRESS OF BUFFER - EITHER
2662         STA     ICBAL,X         ;PGM AREA (MEMLO) OR DATA BUFFER (DBUF)
2663         STA     ICBAL,Y
2664         LDA     BUFADR+1        ;BUFADR IN LSB,MSB ORDER
2665         STA     ICBAH,X
2666         STA     ICBAH,Y
2667 CLOOP   LDX     CSRC
2668         LDA     BUFLEN          ;LENGTH OF BUFFER ADDRESSED
2669         STA     ICBLL,X         ;BY BUFADR
2670         LDA     BUFLEN+1        ;BOTH BUFADR & BUFLEN ARE ASSIGNED
2671         STA     ICBLH,X         ;IN SUBROUTINE USEPGM
2672         JSR     CIO             ;READ FROM INPUT
2673         STY     SSTAT
2674         LDX     CDES
2675         LDY     CSRC
2676         LDA     ICBLL,Y
2677         STA     ICBLL,X
2678         LDA     ICBLH,Y
2679         STA     ICBLH,X
2680         ORA     ICBLL,Y         ;IF SOURCE FILE LENGTH = 0
2681         BEQ     CKRS            ;DONT DO WRITE
2682         JSR     CIOCL           ;WRITE, ABORT IF ERROR
2683 CKRS    LDA     SSTAT           ;GET READ OPERATION STATUS BACK
2684         BPL     CLOOP           ;IF OK, GO READ SOME MORE
2685         CMP     #$88            ;EOF STATUS
2686         BEQ     *+5
2687         JMP     CIOER           ;IF NOT, ABORT
2688 CLOC    LDX     CSRC
2689         BEQ     DU4             ;IF E:, DONT CLOSE
2690 ;=========================================================================
2691 ;CLOSE SOURCE FILE
2692 ;=========================================================================
2693         LDA     #CLOSE
2694         STA     ICCOM,X
2695         JSR     CIO
2696 DU4     LDX     CDES
2697         BEQ     DU3             ;IF DES=E:
2698         LDA     #CLOSE
2699         STA     ICCOM,X
2700         JSR     CIO
2701 DU3     LDX     CDES
2702         BNE     DU6
2703         LDA     #.LOW.DDSK+1
2704         LDX     #.HIGH.(DDSK+1)
2705         JSR     PRNTMSG         ;PRINT A CR BEFORE SELECT OR WILDCARD PRO
2706 DU6     =       *
2707 ;.........................................................................
2708         BIT     WCFLAG
2709         BPL     DU5
2710         JMP     WCOPYL          ;BRANCH BACK TO WILD CARD LOOP
2711 DU5     JMP     MENUSL
2712         .PAGE
2713 ;=========================================================================
2714 ;  ****  RENAME  FILE  ROUTINE  **** 
2715 ;=========================================================================
2716 ;       RENAME SETS UP IOCB #1 WITH THE OLD FILE NAME AND THE BUFFER ADD
2717 ;       POINTS TO THE NEW FILE NAME.  THE NEW FILE SPECIFICATION CANNOT
2718 ;       A DEVICE ID.  THE DEVICE ID IS THE SAME AS SPECIFIED FOR THE OLD
2719 ;               EG D2:ABC.S2,QQQ.R3     THIS RENAMES ABC.S2 ON DRIVE #2
2720 ;                                       QQQ.R3
2721 ;-------------------------------------------------------------------------
2722 RENFIL  .WORD   RNMG
2723         JSR     GETIC1          ;GET OLD FILE SPEC & PUT ADDR IN IOCB
2724         JSR     GETNAME         ;GET NEW FILE NAME
2725         JSR     PERX            ;EXIT IF PARAMETER ERRORS
2726 ;.........................................................................
2727         JSR     CHKVER          ;MAKE SURE VER 2 DISKETTE
2728 ;=========================================================================
2729 ;       CONTINUE WITH RENAME
2730 ;=========================================================================
2731         LDA     #RENAME
2732         LDX     #$10
2733         STA     ICCOM,X
2734         JSR     CIOCL
2735         JMP     MENUSL
2736 RNMG    .BYTE   'RENAME - GIVE OLD NAME, NEW',CR
2737 ;=========================================================================
2738 ;*******************   SUBROUTINE   *******************
2739 ;
2740 ;       MAKE SURE THIS IS A VERSION 2 FORMAT DISK
2741 ;=========================================================================
2742 CHKVER  LDY     #1              ;ASSUME DRIVE 1- GET DRIVE #
2743         LDA     PAR+1           ;TEST CHAR 2 OF FILE SPEC FOR SEMICOLON
2744         CMP     #':             ;IF IS, USING DEFAULT DRIVE (1)
2745         BEQ     DRV1            ;IT IS, SO SAVE DRIVE #
2746         AND     #$0F            ;ELSE CHAR 2 IS ASCII REP OF DRIVE #
2747         TAY                     ;CONVERT TO BINARY & SAVE IT
2748 DRV1    STY     UNNO            ;SAVE DRIVE #
2749 ;.........................................................................
2750         JMP     TSTVER2         ;TEST FOR VERSION 2 DISK- WON'T RETURN IF
2751 ;.........................................................................
2752         .PAGE
2753 ;=========================================================================
2754 ;  ****  FORMAT  DISK  ROUTINE  ****
2755 ;=========================================================================
2756 FMTDSK  .WORD   WHD
2757         JSR     GETLIN
2758         JSR     GETDN
2759         CLC
2760         ADC     #'0
2761         STA     DDSK
2762         STA     CDSK
2763         JSR     PERX
2764         LDA     #.LOW.VFML      ;QUERY TO VERIFY DRIVE NUMBER
2765         LDX     #.LOW.VFMH
2766         JSR     DSPLIN
2767         JSR     CHRGET
2768         CMP     #'Y             ;SEE IF OK
2769         BNE     FMX
2770         LDA     #.LOW.FDPL
2771         LDX     #$10
2772         STA     ICBAL,X
2773         LDA     #.LOW.FDPH
2774         STA     ICBAH,X
2775         LDA     #FORMAT
2776         STA     ICCOM,X
2777         JSR     CIOCL           ;CALL CIO TO DO FORMAT
2778 FMX     JMP     MENUSL          ;EXIT.
2779 WHD     .BYTE   'WHICH DRIVE TO FORMAT?',CR
2780 VFM     .BYTE   'TYPE ',$22,'Y',$22,' TO FORMAT DISK '
2781 DDSK    *=*+1
2782         .BYTE   CR
2783 FDP     .BYTE   'D'
2784 CDSK    *=*+1
2785         .BYTE   ':',CR
2786         HILO    WHD
2787 WHDH     =       WHD/256
2788 WHDL     =       (-256)*WHDH+WHD
2789         HILO    VFM
2790 VFMH     =       VFM/256
2791 VFML     =       (-256)*VFMH+VFM
2792         HILO    FDP
2793 FDPH     =       FDP/256
2794 FDPL     =       (-256)*FDPH+FDP
2795         .PAGE
2796 ;=========================================================================
2797 ;  ****  START  CARTRIDGE  ROUTINE  ****
2798 ;=========================================================================
2799 SYVBL   =       SYSVBV
2800         HILO    SYVBL
2801 SYVBLH     =       SYVBL/256
2802 SYVBLL     =       (-256)*SYVBLH+SYVBL
2803 XTVBL   =       XITVBV
2804         HILO    XTVBL
2805 XTVBLH     =       XTVBL/256
2806 XTVBLL     =       (-256)*XTVBLH+XTVBL
2807 STCAR   .WORD   SCMG            NO MSG, PRINT A <CR>
2808 ROMTST  =       $BFFD
2809         LDY     ROMTST          ;TEST IF RAM OR OTHER
2810         LDA     #$AA            ;PATTERN #1
2811         STA     ROMTST
2812         CMP     ROMTST
2813         BNE     NOTRAM          ;BRANCH IF NOT RAM
2814         LDA     #$55            ;PATTERN #2
2815         STA     ROMTST
2816         CMP     ROMTST
2817         BNE     NOTRAM          ;BRANCH IF NOT RAM
2818 ;-------------------------------------------------------------------------
2819         STY     ROMTST          ;THERE IS VALID RAM - SAY NO CART
2820 NOCART  LDA     #.LOW.NCAL
2821         LDX     #.LOW.NCAH      ;SAY NO CART
2822         JSR     DSPLIN
2823         JMP     MENUSL
2824 ;=========================================================================
2825 ;       CHECK IF ROM OR EMPTY ADDRESS SPACE
2826 ;=========================================================================
2827 NOTRAM  LDA     $BFFC           ;KNOWN ROM ZERO BYTE
2828         BNE     NOCART          ;BRANCH IF EMPTY ADDRESS SPACE
2829 ;-------------------------------------------------------------------------
2830         TAX                     ;SINCE EMPTY ADDRESS SPACE GIVES A RANDOM
2831 CKCART  LDA     ROMTST          ;VALUE, TEST THE SAME LOCATION MANY TIMES
2832         BEQ     NOCART          ;BRANCH IF NO CARTRIDGE
2833         CMP     ROMTST
2834         BNE     NOCART          ;BRANCH IF NO CARTRIDGE
2835         INX
2836         BNE     CKCART          ;LOOP BACK
2837 ;
2838 ;=========================================================================
2839 ;       RESET VERTICAL BLANK VECTORS BEFORE ENTERING CART
2840 ;=========================================================================
2841         JSR     INITIO
2842         LDA     #6              ;SET VVBLKI
2843         LDX     #.LOW.SYVBLH    ;HI BYTE
2844         LDY     #.LOW.SYVBLL
2845         JSR     SETVBV
2846         LDA     #7              ;SET VVBLKD
2847         LDX     #.LOW.XTVBLH
2848         LDY     #.LOW.XTVBLL
2849         JSR     SETVBV
2850         JMP     CLMJMP
2851         .PAGE
2852 NCA     .BYTE   'NO CARTRIDGE'
2853 SCMG    .BYTE   CR
2854         HILO    NCA
2855 NCAH     =       NCA/256
2856 NCAL     =       (-256)*NCAH+NCA
2857 ;
2858 ;=========================================================================
2859 ;       *******  RUN AT ADDRESS *******   
2860 ;=========================================================================
2861 ;
2862 ;
2863 BRUN    .WORD   BRMG
2864         JSR     GETLIN
2865         JSR     GETNO
2866         JSR     PERX
2867         STA     RAMLO
2868         STX     RAMLO+1
2869         LDA     CTR
2870         CMP     #4
2871         BEQ     MOUT1           ;RETURN TO MENU IF NO RUN ADDRESS GIVEN
2872         JSR     INITIO          ;CLOSE ALL IOCB'S, THEN REOPEN S/E
2873         JMP     LMTR            ;LOAD MEM.SAV & JUMP TO ADDRESS
2874 ;
2875 ;-------------------------------------------------------------------------
2876 BRMG    .BYTE   'RUN FROM WHAT ADDRESS?',CR
2877 ;=========================================================================
2878 ;  ****  CREATE  MEM.SAV  FILE  ON  DISK  **** 
2879 ;=========================================================================
2880 MEMS    .BYTE   'TYPE ',$22,'Y',$22,' TO CREATE MEM.SAV',CR
2881 MEMSAV  .WORD   MEMS
2882         JSR     CHRGET          ; GET CHAR (CR)
2883         CMP     #'Y
2884         BNE     MOUT            ;BRANCH IF USER'S ANSWER NOT A Y
2885         JSR     MEMSVQ          ;TRY TO OPEN MEM.SAV
2886         BMI     MCONT           ; IF FILE DOESN'T EXIST THEN JUMP
2887         LDA     #.LOW.MEMSGL    ; ELSE 'MEMORY.SAVE' AREADY EXIST
2888         LDX     #.LOW.MEMSGH    ;
2889         JSR     DSPLIN          ;DISPLAY THIS FACT
2890 MOUT    JSR     CLOSX           ;EXIT AFTER CLOSING IOCB1
2891 MOUT1   JMP     MENUSL          ;
2892 ;=========================================================================
2893 ; WRITE MEMORY.SAVE TO DISK
2894 ;=========================================================================
2895 MCONT   JSR     MWRITE          ; WRITE FILE
2896         BPL     MOUT
2897 MERR    JMP     CIOER1          ; DISPLAY ERROR
2898 ;-------------------------------------------------------------------------
2899 MEMSG   .BYTE   'MEM.SAV FILE ALREADY EXISTS',CR
2900         HILO    MEMSG
2901 MEMSGH     =       MEMSG/256
2902 MEMSGL     =       (-256)*MEMSGH+MEMSG
2903         .PAGE
2904 ;=========================================================================
2905 ;  ****  WRITE  DOS  &  DUP  **** 
2906 ;=========================================================================
2907 WBOOT   .WORD   DOSDRV          ADDRESS OF DRIVE # PROMPT
2908 ;=========================================================================
2909 ;       RETREIVE DRIVE NUMBER FROM USER.
2910 ;=========================================================================
2911         JSR     GETLIN          ;GET INPUT
2912         JSR     GETDN           ;GET DRIVE AS NUMBER, VERIFY IT
2913         JSR     PERX            ;EXIT IF ERROR
2914         STA     UNNO            ;SAVE IT FOR TSTVER2
2915         ORA     #'0             ;TURN BACK TO ASCII REP
2916         STA     DS+1            ;STORE IN DOS.SYS FILE SPEC
2917         STA     QWMG+31         ;& IN PROMPT
2918 ;.........................................................................
2919         JSR     TSTVER2         ;TEST IF VERSION 2 DISK - IF ISN'T WON'T
2920 ;=========================================================================
2921 ;       ASK USER IF CAN WRITE DOS & DUP TO SPECIFIED DRIVE
2922 ;=========================================================================
2923         LDA     #.LOW.QWMGL     ;PRINT PROMPT
2924         LDX     #.LOW.QWMGH
2925         JSR     DSPLIN
2926         JSR     CHRGET
2927         CMP     #'Y
2928         BNE     WBX             ;EXIT UNLESS Y
2929 ;=========================================================================
2930 ;       TELL USER WRITING DOS FILES AND WRITE DOS.SYS FIRST- JUST OPEN IT
2931 ;=========================================================================
2932         LDA     #.LOW.WBMGL
2933         LDX     #.LOW.WBMGH
2934         JSR     DSPLIN
2935 ;.........................................................................
2936         LDA     #OPEN
2937         LDX     #$10            ;OPEN DOS.SYS ON IOCB #1
2938         STA     ICCOM,X         ;WILL CAUSE FMS TO REWRITE BOOT SECTOR
2939         LDA     #.LOW.DSL       ;& A COPY OF DOS.SYS
2940         STA     ICBAL,X
2941         LDA     #.LOW.DSH
2942         STA     ICBAH,X
2943         LDA     #8
2944         STA     ICAX1,X
2945         JSR     CIOCL           ;DO OPEN, IF ERROR GOTO MENU
2946 ;.........................................................................
2947         LDX     #$10
2948         LDA     #CLOSE
2949         STA     ICCOM,X
2950         JSR     CIOCL           ;DONE CLOSE IT.
2951 ;=========================================================================
2952 ;       WRITE DUP.SYS - SWAP AREA FILE
2953 ;=========================================================================
2954         LDX     #11             ;MOVE 11 CHARS
2955 MDUPBL  LDA     DUPSYS-1,X
2956         STA     PAR-1,X         ;MOVE FILE NAME TO PARAMETER LIST
2957         DEX
2958         BNE     MDUPBL
2959         LDA     DS+1            ;GET DRIVE NUMBER
2960         STA     PAR+1           ;PUT IT IN DUP.SYS FILE SPEC
2961 ;.........................................................................
2962         STX     PTR
2963         LDX     #$10
2964         JSR     PIOCB           ;PUT FILE NAME POINTER IN IOCB
2965         LDA     #.LOW.DTHL
2966         STA     LDST
2967         LDA     #.LOW.DTHH
2968         STA     LDST+1
2969         LDA     #.LOW.NMDUP
2970         STA     LDND
2971         LDA     #.LOW.LENL
2972         STA     WDRL+1
2973         LDA     #.LOW.LENH
2974         STA     WDRH+1
2975         LDA     #.HIGH.NMDUP
2976         STA     LDND+1
2977         PHA                     ;NO /A
2978         LDA     #.LOW.DOSOS
2979         STA     RUNAD
2980         LDA     #.HIGH.DOSOS
2981         STA     RUNAD+1         ;SET DUP.SYS RUN ADDRESS
2982         DEC     RUNQ+1          ;SET RUN FLAG
2983         JMP     NRUNAD          ;WRITE DUP.SYS
2984 WBX     JMP     MENUSL
2985 DOSDRV  .BYTE   'DRIVE TO WRITE DOS FILES TO?',CR
2986 WBMG    .BYTE   'WRITING NEW DOS FILES',CR
2987         HILO    WBMG
2988 WBMGH     =       WBMG/256
2989 WBMGL     =       (-256)*WBMGH+WBMG
2990         .PAGE
2991 QWMG    .BYTE   'TYPE ',$22,'Y',$22,' TO WRITE DOS TO DRIVE  .',CR
2992         HILO    QWMG
2993 QWMGH     =       QWMG/256
2994 QWMGL     =       (-256)*QWMGH+QWMG
2995 DS      .BYTE   'D1:DOS.SYS',CR
2996         HILO    DS
2997 DSH     =       DS/256
2998 DSL     =       (-256)*DSH+DS
2999 WVD     .BYTE   'ERROR - NOT VERSION 2 FORMAT.',CR
3000         HILO    WVD
3001 WVDH     =       WVD/256
3002 WVDL     =       (-256)*WVDH+WVD
3003         .PAGE
3004 ;=========================================================================
3005 ;  **** TEST FOR VERSION 2 FORMAT - SUBROUTINE ****
3006 ;=========================================================================
3007 ;       SUBROUTINE - TSTVER2
3008 ;-------------------------------------------------------------------------
3009 ;       
3010 ;       READS THE DISK'S VTOC AND CHECKS IF VERSION BYTE IS SET AS 2.
3011 ;                                                                    
3012 ;               ENTRY     - DRIVE # STORED IN UNNO                   
3013 ;               EXIT      - RETURNS ONLY IF IS A VERSION 2 DISK      
3014 ;                           ELSE DOES AN ERROR EXIT BACK TO MENU     
3015 ;               CALLS     - DRVSTAT AND RVTOC                        
3016 ;               CALLED BY - DELFIL, RENFIL, WBOOT.                   
3017 ;
3018 ;=========================================================================
3019 ;       GET DRIVE TYPE SO KNOW CORRECT SECTOR SIZE - NEEDED FOR RVTOC
3020 ;=========================================================================
3021 TSTVER2 =       *
3022         LDA     #0              ;GET DRIVE TYPE IN SECSIZ
3023         STA     SECSIZ          ;ASSUME 256 - NEEDED BY RVTOC
3024         LDA     UNNO            ;GET DRIVE #
3025         JSR     DRVSTAT         ;FIND OUT TYPE - CARRY FLAG
3026         BCS     OKTYP           ;BRANCH IF 256 TYPE
3027         LDA     #$80            ;ELSE SET AS 128 BYTE DEVICE
3028         STA     SECSIZ
3029 ;=========================================================================
3030 ;       READ THE VTOC & CHECK IF VERSION 2
3031 ;=========================================================================
3032 OKTYP   JSR     RVTOC           ;READ IN VTOC TO DBUF
3033         LDA     DBUF            ;1ST BYTE IS VERSION #
3034         CMP     #2              ;IS IT VERSION 2?
3035         BEQ     SMVRS           ;YES, SAME VERSION - RETURN
3036 ;=========================================================================
3037 ;       NOT A VERSION 2 DISK - PRINT MSG & GOTO MENU
3038 ;=========================================================================
3039         LDA     #.LOW.WVDL      ;ELSE, NOT SAME VERSION
3040         LDX     #.LOW.WVDH      ;PRINT INCOMPATIBLE MSG
3041         JSR     DSPLIN
3042         JMP     MENUSL          ;GOTO MENU
3043 ;=========================================================================
3044 ;       DISK IS VERSION TWO SO RETURN
3045 ;=========================================================================
3046 SMVRS   RTS                     ;RETURN
3047         .PAGE
3048 ;=========================================================================
3049 ;  ****  LOAD  USER  FILE  FUNCTION  ****
3050 ;=========================================================================
3051 LDFIL   .WORD   LFMG
3052         JSR     GETIC1
3053         LDA     #0
3054         LDX     OPT
3055         STA     OPT
3056         CPX     #'N             ;IS OPTION N FOR DON'T LOAD AND GO?
3057         BNE     NOTN            ;BRANCH IF NOT
3058         DEC     OPT
3059 NOTN    JSR     PERX
3060         JSR     LOAD
3061         CPX     #0              ;PROCESS LOAD SUBR RESPONSE
3062         BEQ     LDFX            ;BRANCH IF LOAD WAS OK
3063         CPX     #3
3064         BEQ     NLF             ;IF BAD LOAD FILE
3065         TYA                     ;OTHERWISE WE GOT A CIO ERROR
3066         JMP     CIOER           ;GO SAY WHAT IT IS
3067 NLF     LDA     #.LOW.BLFL
3068         LDX     #.LOW.BLFH
3069         JSR     DSPLIN          ;BAD LOAD FILE MSG
3070         JSR     CLOSX           ;CLOSE THE FILE
3071 LDFX    JMP     MENUSL          ;EXIT
3072 BLF     .BYTE   'BAD LOAD FILE',CR
3073         HILO    BLF
3074 BLFH     =       BLF/256
3075 BLFL     =       (-256)*BLFH+BLF
3076 LFMG    .BYTE   'LOAD FROM WHAT FILE?',CR
3077 ;=========================================================================
3078 ;  ****  LOCK  &  UNLOCK  FILE  COMMANDS  **** 
3079 ;=========================================================================
3080 LKFIL   .WORD   LKMG            ;DO LOCK
3081         JSR     GETIC1
3082         JSR     PERX
3083         LDA     #LOCK
3084         LDX     #$10
3085         STA     ICCOM,X
3086         JSR     CIOCL
3087         JMP     MENUSL
3088 LKMG    .BYTE   'WHAT FILE TO LOCK?',CR
3089 ;-------------------------------------------------------------------------
3090 ULFIL   .WORD   ULMG            ;DO UNLOCK
3091         JSR     GETIC1
3092         JSR     PERX
3093         LDA     #UNLOCK
3094         LDX     #$10
3095         STA     ICCOM,X
3096         JSR     CIOCL
3097         JMP     MENUSL
3098 ULMG    .BYTE   'WHAT FILE TO UNLOCK?',CR
3099 ;=========================================================================
3100 ;  ****  DUPLICATE  DISK  ROUTINE  ****
3101 ;=========================================================================
3102 DDMG    .BYTE   'DUP DISK-SOURCE,DEST DRIVES?',CR
3103 OK      .BYTE   'TYPE ',$22,'Y',$22,' IF OK TO USE PROGRAM AREA',CR
3104         HILO    OK