From acc0ab70842c29b26bee55a1a6f222555738a85b Mon Sep 17 00:00:00 2001 From: Charles Mangin Date: Tue, 2 Oct 2018 15:48:30 -0400 Subject: [PATCH] Add files via upload --- CCP.s | 1186 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1186 insertions(+) create mode 100644 CCP.s diff --git a/CCP.s b/CCP.s new file mode 100644 index 0000000..f2da1a8 --- /dev/null +++ b/CCP.s @@ -0,0 +1,1186 @@ +780 ;OUP/M CCP WRITTEN BY LIO,QI-WEN +790 ;ON AUG. 1982 +800 *=$D000 +810 JMP MAIN +820 ;6502 CP/M CCP +830 ;******************************************* +840 STACKB=$FF +850 IBUBCC=$EE80 ;MAX CHAR ADDRESS +860 IBUBC=$EE81 ;BUFF COUNTER +870 IBUFB=$EE82 ;FIRST CHAR IN BUFF +880 IBUFBA=$EF02 +890 IBUFBB=$EF04 +900 IBUFC .WORD IBUBC +910 IBUFF .WORD IBUFB +920 IBUFPA .WORD IBUFB ;PTR,INIT IBUFB +930 IBUFPB .WORD IBUFBB +940 FCBB=$EE01 +950 FCBBB=FCBB+1 +960 FCBBC=FCBB+$10 +970 FCBBD=FCBB+$20 +980 RETVAL=FCBB+$23 +990 FCBP .WORD FCBB +1000 FCBPB .WORD FCBBB +1010 FCBPC .WORD FCBBC +1020 FCBBP .WORD FCBBD +1030 DSKNUM=FCBB+$42 ;POINTES THE NUMBER OF +1040 WRKPLA=FCBB+$43 ;WORK ELEMENT +1050 WRKPLB=FCBB+$44 +1060 WRKPLC=FCBB+$45 +1070 WRKPLD=FCBB+$46 +1080 WRKPPB .WORD WRKPLB +1090 RBC=$0067 +1100 RHL=$0069 +1110 RDE=$006D ;REPLACE Z80 DE,HL,BC +1120 RWK=$006B +1130 RWQ=$0060 +1140 RNW=$0062 +1150 DMAD=$E965 +1160 SUBTBL .WORD SUBPGO +1170 STRTD=$0200 +1180 SUBPGO .WORD $2710 ;10,000 +1190 .WORD $03E8 ;1,000 +1200 .WORD $0064 ;100 +1210 .WORD $000A ;10 +1220 MSGAD1 .WORD MSGVER +1230 CMDTAB *BYTE 'DIR ERA TYPESAVEREN USER' +1240; +1250; +1260 TABADD .WORD CMDTAB +1270 ADRTAB .WORD PDIR,PERA,PTYPE,PSAVE,PREN +1280 .WORD PUSER,PTRANS +1290 TBLAD2 .WORD ADRTAB +1300 RDERRA .WORD RDERR +1310 NOFERA .WORD NOFERR +1320 MSGAD3 .WORD MSGADI +1330 BDOS=$D93F +1340 MSGAD5 .WORD MSGAD4 +1350 MSGAD7 .WORD MSGAD6 +1360 MSGDD9 .WORD MSGDD8 +1370 MSGBA2 .WORD MSGBA1 +1380 ;*********************************************** +1390 ;SUBROUTINE +1400 ;*********************************************** +1410 CHROUT STA RDE ;OUTPUT CHAR TO E +1420 LDX #$02 +1430 JMP BDOS ;PRINT A CHARACTER +1440 CHROB STA WRKPLC ;FOR SAVING RBC +1450 LDA RBC +1460 STA RWQ +1470 LDA RBC+1 +1480 STA RWQ+1 +1490 LDA WRKPLC +1500 JSR CHROUT ;TO PRINT A CHAR +1510 LDA RWQ ;FOR RESTORE RBC +1520 STA RBC +1530 LDA RWQ+1 +1540 STA RBC+1 +1550 RTS +1560 CRLF LDA #$0D ;'CR' TO A +1570 JSR CHROB ;OUTPUT 'CR' +1580 LDA #$0A ;'LF' TO A +1590 JMP CHROB ;OUTPUT 'LF' +1600 SPACE LDA #$20 ;' ' TO A +1610 JMP CHROB +1620 ;PRINT STRING UNTIL 'NUL',MESSAGE POINTER IN RDE +1630 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +1640 STRIOA JSR CRLF ;OUTPUT 'CR' 'LF' +1650 LDA RBC ;GET MESSAGE POINTER +1660 STA RHL +1670 LDA RBC+1 +1680 STA RHL+1 ;NOW RHL POINTES MESSAGE +1690 ;PRINT STRING ,MESSAGE IN RHL +1700 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +1710 STRIOB LDY #$00 ;CLEAR Y +1720 LDA (RHL),Y ;GET A CHAR +1730 BNE LOOP1 ;CHAR='NUL'? +1740 RTS ;YES,END PRINT AND RETURN +1750 LOOP1 INY ;NO, +1760 STY RWQ +1770 JSR CHROUT ;OUTPUT A CHAR +1780 LDY RWQ +1790 JMP STRIOB+2 ;CONTINUE +1800 RSTDSK LDX #$0A ;RESET DISK OPERATION +1810; +1820; +1830; +1840; +1850; +1860; +1870 JMP BDOS +1880 SELDSK LDX #$13 ;SELECT DISK OPERATION +1890 JMP BDOS +1900 ;THE FOLLOWING 8 ROUTINES CALL BDOS THEN +1910 ;RETURN VALUE TO RETVAL ,A+1RETURN +1920 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +1930 CDOSRT LDA RDE +1940 LDY RDE+1 +1950 CDOSR1 JSR BDOS +1960 STA RETVAL ;RETURN VALUE TO 'RETVAL' +1970 CLC +1980 ADC #$01 ;A+1,THEN RETURN +1990 RTS +2000 OPNFLB LDX #$16 ;OPEN DISK FILE +2010 JMP CDOSRT +2020 OPNFL LDA #$00 +2030 STA FCBBD ;CLEAR SOME PLACE OF FCB +2040 JSR FCBTOD ;FCBP TO RDE +2050 JMP OPNFLB ;TO OPEN FILE +2060 CLSFIL LDX #$17 ;CLOSE FILE +2070 JMP CDOSRT ; +2080 SERFST LDX #$1C ;SEARCH FOR FIRST +2090 JMP CDOSRT +2100 SERNXT LDX #$1D ;SEARH FOR THE NEXT +2110 JMP CDOSR1 +2120 SERFIL JSR FCBTOD ;FCBP TO RDE +2130 JMP SERFST +2140 FCBTOD LDA FCBP ;FOR FCB TO RDE +2150 STA RDE +2160 LDA FCBP+1 +2170 STA RDE+1 +2180 RTS +2190 DELFIL LDX #$15 ;DELETE FILE +2200 ;THE FOLLOWING ROUTINE CALLING CDOSB +2210 ;RETURN ZERO IF SUCCESS +2220 ;------------------------------------- +2230 LDY #$21 +2240 CDOSB LDA RDE +2250 LDY RDE+1 +2260 JSR BDOS +2270 CLC +2280 RTS ;RETURN VALUE<>0 IF FALSE +2290 RDSEQB LDX #$18 ;READ SEQUENTIAL +2300 JMP CDOSB +2310 RDSEQ JSR FCBTOD ;FCB TO RDE +2320 JMP RDSEQB ;TO READ SEQUENTIAL +2330 WRSEQ LDX #$19 ;WRITE SEQUENTIAL +2340 JMP CDOSB +2350 MAKFIL LDX #$14 ;MAKE FILE +2360 JMP CDOSRT ;RETURN VALUE TO 'RETVAL' +2370 RENFIL LDA RDE +2380 LDY RDE+1 +2390 LDX #$1E ;RENAME FILE +2400 JMP BDOS +2410 GETCOD LDA #$FF +2420 STA RDE ;$FF TO E +2430 SETCOD LDX #$11 ;SET/GET ESER CODE +2440 JMP BDOS ;RETURN USER CODE IF 'GET' +2450 ;PRINT PAGE +2460 ;------------ +2470 PRNPG1 JSR SPACE +2480 JSR SPACE +2490 LDY #$21 ;PAGE POSITION +2500 LDA (RHL),Y ;GET PAGE NUMB. +2510 STA FCBB+$25 ;SAVE +2520 INY +2530 LDA (RHL),Y ;GET PAGE MSB +2540 STA FCBB+$26 ;SAVE +2550 CLC +2560 ROR FCBB+$26 +2570 ROR FCBB+$25 +2580 PRNPG2 LDY #06 ;IF PAGE 000-999 +2590 NXTDIG LDX #00 ;INIT DIGIT COUNT +2600 SUBEM LDA FCBB+$25 ;FETCH LSBY +2610 SEC +2620 SBC SUBTBL,Y ;-LSBT OF TAB +2630 STA FCBB+$25 ;RETURN TO MEMORY +2640 LDA FCBB+$26 ;FETCH MSBY +2650 INY +2660 SBC SUBTBL,Y ;-MSBY OF TAB +2670 BCC ADBACK ;IF RESULT IS '-' +2680 STA FCBB+$26 ;NO +2690 INX +2700 DEY ;PTR LSBY IN TABLE +2710 JMP SUBEM ;LOOP +2720 ADBACK DEY ;PTR LSBY IN TABLE +2730 LDA FCBB+$25 ;FETCH LSBY +2740 ADC SUBTBL,Y ;+LSBY OF TAB +2750 STA FCBB+$25 +2760 TXA ;DIGIT COUNT TO A +2770 ORA #$30 ;CONVERT TO ASCII +2780 STY RNW ;SAVE +2790 JSR CHROUT ;OUT DIGIT +2800 LDY RNW ;RESTORE Y +2810 INY +2820; +2830 INY ;PTR TO NEXT TABLE +2840; +2850 CPY #$0A +2860; +2870 BCC NXTDIG ;LOOP +2880 LDA FCBB+$25 +2890 ORA DSKNUM +2900 ORA #$30 ;CONVERT TO ASCII +2910 JMP CHROUT ;PRINT REMAINDER +2920 ;CHANGE LOWER CASE TO UPPER CASE +2930 ;---------------------------------------- +2940 CUPCAS CMP #$61 ;CHAR>=LOWER CASE A ? +2950 BCS LOPU1 ;NO, +2960 RTS ;YES,RETURN +2970 LOPU1 CMP #$7C ;CHAR0:ROUTINE HANDLE IN BUFF +3040 ;---------------------------------------- +3050 INBUFL LDA $01FF ;'COLD START'? +3060 CMP #$FF +3070 BNE MJN ;NO, +3080 JSR CRLF +3090 LDA MSGAD1 +3100 STA RHL +3110 LDA MSGAD1+1 ;P +3120 STA RHL+1 ;RHL POINTES 'CP/M VERSION--' +3130 JSR STRIOB ;PRINT MESSAGE STRING +3140 JSR ENDINB ;YES TO FILL 0 TO $01FF +3150 MJN JMP START +3160 INBUFA LDA #$80 ;BUFF SIZE +3170 STA IBUBCC ;SAVE BUFF SIZE +3180 LDA #IBUBCC ;BUFF ADDRESS +3190 LDY #IBUBCC/256 +3200 LDX #$06 ;INPUT BUFF LINE +3210 JSR BDOS +3220 LDA #IBUBC +3230 STA RHL +3240 LDA #IBUBC/256 +3250 STA RHL+1 ;RHL POINTES INPUT BUFFER +3260 LDX IBUBC ;X AS COUNTER FOR NUMB OF CHAR +3270 LDY #$00 +3280 LOPIB1 INC RHL +3290 TXA +3300 BEQ BUFEND ;NUMB.OF CHAR=0,BRANCH +3310 LDA (RHL),Y ;NO,GET A CHAR +3320 JSR CUPCAS ;LOWER CASE TO UPPER CASE +3330 STA (RHL),Y ;SAVE UPPER CHAR +3340 DEX ;COUNTER-1=0 ? +3350 JMP LOPIB1 ;CONTINUE +3360 BUFEND STA (RHL),Y ;0 TO (RHL) +3370 LDA IBUFF +3380 STA IBUFPA +3390 LDA IBUFF+1 +3400 STA IBUFPA+1 ;IBUFPA POINTES HEAD OF BUFF +3410 RTS +3420 CSTATD LDX #$09 +3430 JSR BDOS +3440 PHA +3450 PLA ;FLAGE=O? +3460 BNE LOPCS1 ;NO,BREANCH +3470 RTS ;YES,RETURN +3480 LOPCS1 LDX #$01 ;CONSOLE INPUT OPERATION +3490 JSR BDOS +3500 PHA +3510 PLA ;FLAGE Z=O? +3520 RTS +3530 RETDKN LDX #$0C ;RETURN CURRENT DISK +3540 JMP BDOS +3550 STDMAI LDA #DMAD +3560 STA RDE +3570 LDA #DMAD/256 +3580 STA RDE+1 ;RDE POINTES $0080BUF +3590 SETDMA LDX #$12 ;SET DMA OPERATION +3600 LDA RDE +3610 LDY RDE+1 +3620 JMP BDOS +3630 ENDINB LDA #$00 +3640 STA $01FF ;0 TO STACK +3650 LDA DSKNUM +3660 JSR SELDSK ;SELECT CURRENT DISK +3670 RTS +3680 CMDEND JSR ;OUTPUT 'CR''LF' +3690 LDA ;IN BUFF TO RWK REF'3120' +3700 STA +3710 LDA IBUFPB+1 ; +3720 STA RWK+1 ;RWK POINTES IN BUFF +3730 LDY #$00 +3740 LOPCN1 LDA (RWK),Y ;GET A CHAR +3750 CMP #$20 ;CHAR=' '? +3760 BEQ ERENDC ;YES +3770 PHA +3780 PLA ;CHAR='0' +3790 BEQ ERENDC ;Y, +3800 JSR CHROUT ;OUTPUT CHAR +3810 INC RWK +3820 JMP LOPCN1 ;CONTINUE +3830 ERENDC LDA #$3F +3840 JSR CHROUT ;OUTPUT '?' +3850 JSR CRLF ;OUTPUT 'CR' 'LF' +3860 JSR ENDINB ;TO END COMMAND +3870 JMP START +3880 ;CHECK SPECIAL CHARACTER +3890 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +3900 CHARCK JSR RDRDE ;READ (RED) +3910 CMP #$00 +3920 BEQ CHEND ;RETURN IF CHAR='NUL' +3930 CMP #$20 ;NO,CHECK CHAR=' '? +3940 BEQ CHEND ;YES,RETURN +3950 BCC CMDEND ;GO 'ERRORÑHANDLE' IF CHAR<' ' +3960 CMP #$3D ;CHAR='='? +3970 BEQ CHEND ;YES,RETURN Z=0 +3980 CMP #$5F ;CHAR='<Ñ'? +3990 BEQ CHEND +4000 CMP #$2E ;CHAR='.'? +4010 BEQ CHEND +4020 CMP #$3A ;CHAR=':'? +4030 BEQ CHEND +4040 CMP #$3B ;CHAR=';'? +4050 BEQ CHEND +4060 CMP #$3C ;CHAR='<'? +4070 BEQ CHEND +4080 CMP #$3E ;CHAR='>'? +4090 BEQ CHEND +4100 CHEND RTS +4110 RDRDE STY WRKPLD+1 ;SAVE Y +4120 LDY #$00 +4130 LDA (RDE),Y ;GET A CHAR +4140 LDY WRKPLD+1 ;RESTORE +4150 RTS +4160 ;SKIP ' ' +4170 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +4180 SKPBLK JSR RDRDE ;GET A CHAR. +4190 CMP #$00 +4200 BEQ KPND ;'BUFF-END' +4210 CMP #$20 ;CHAR=' '? +4220 BNE KPND ;NO,RETURN +4230 INC RDE ;GET NEXT CHAR +4240 JMP SKPBLK ;LOOP +4250 KPND RTS +4260 ;******************************************** +4270 ;FILL FCB FROM FCB'POINTER'+(A) +4280 ;******************************************** +4290 FIFCBM CLC +4300 ADC RHL ;(A)+(L) +4310 STA RHL ;TO (L) +4320 BCC FIEND ;RETURN IF FLAG C=0 +4330 INC RHL+1 ;NO,(H)+1 +4340 FIEND RTS +4350 ;FILL FCB FROM BEGINNING OF FCB +4360 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +4370 FIFCBB LDA #$00 +4380 FIFCB PHA +4390 LDA FCBP +4400 STA RHL +4410 LDA FCBP+1 +4420 STA RHL+1 ;RHL POINTES FCB +4430 PLA +4440 JSR FIFCBM ;(RHL)+(A) TO RHL +4450 LDA RHL +4460 STA RWK +4470 LDA RHL+1 +4480 STA RWK+1 ;SAVE INITIAL VALUE OF RHL +4490 LDA #$00 +4500 STA WRKPLA ;CLEAR +4510 STA WRKPLD ;'WRKPLD'AS COUNTER FOR RDE +4520 LDA IBUFPA +4530 STA RDE +4540 LDA IBUFPA+1 +4550 STA RDE+1 ;RDE POINTES INPUT BUFF +4560 JSR SKPBLK ;TO SKIP ' ' +4570 LDA RDE +4580 STA IBUFPB +4590 LDA RDE+1 +4600 STA IBUFPB+1 ;SAVE NEW POINTER IN IBUFPB +4610 LDY #$00 +4620 INC RDE ;PRT 2 CHAR +4630 JSR RDRDE ;GET 2'S CHAR +4640 CMP #$3A ;':'? +4650 BEQ FIDKNN ;YES,FILL DSKNUMB +4660 LDA #$00 +4670 STA (RWK),Y ;FILL PCB +4680 LDA DSKNUM ;CURRENT DISK +4690 STA WRKPLA ;SAVE REQ.DSKNUM +4700 DEC RDE ;RET 1'S CHAR IN BUFF +4710 JMP FINAME +4720 FIDKNN DEC RDE ;PTR 1'S CHAR IN BUFF +4730 JSR RDRDE +4740 SEC +4750 SBC #$40 +4760 STA RWQ +4770 STA WRKPLA ;SAVE REG.DSKNUM +4780 DEC WRKPLA +4790 MEDJN STA (RWK),Y ;FILL 'D'TO PCB +4800 INC RDE +4810 INC RDE ;PTR 3'CHAR IN BUFF +4320 ; +4830 ;FILL 'NAME' IN FCB +4840 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +4850 FINAME LDX #$08 ;X AS COUNTER FOR 8 CHAR +4860 LDA #$20 +4870 STA RNW ;INIT ' ' +4880 LOPFII JSR CHARCK ;CHECK SPECIALCHAR +4890 BEQ FIBLK1 ;TO FILL ' 'IF RET Z=0 +4900 INY +4910 CMP #$2A ;CHAR='*'? +4920 BNE FICHAR ;NO,TO FILL CHAR +4930 LDA #$3F ;YES,'?'TO A +4940 STA (RWK),Y +4950 STA RNW +4960 JMP FINEXT +4970 FICHAR STA (RWK),Y ;A CHAR TO FCB +4980 LDA #$20 +4990 STA RNW +5000 FINEXT INC RDE ;POINTES NEXT CHAR +5010 DEX ;COUNT X-1=0? +5020 BNE LOPFI1 ;NO,LOOP +5030; +5040 ;TO FIND THE END OF NAME +5050 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +5060 FINDSG JSR CHARCK ;TO CHECK SPECIAL CHAR +5070 BEQ FITYP ;TO FILL TYPE IF RET Z=0 +5080 INC RDE +5090 JMP FINDSG ;LOOP +5100 ; +5110 ;TO FILL ' ' IN FCB +5120 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +5130 FIBLKT PHA +5140 FIBLK INY +5150 LDA RNW ;' ' OR ? TO A +5160 STA (RWK,Y) ;' ' TO FCB +5170 DEX ;COUNTER X-1=0? +5180 BNE FIBLK ;LOOP +5190 PLA +5200 ;TO FILL TYPE IN FCB +5210 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +5220 FITYP LDX #$20 +5230 STX RNW +5240 LDX #$03 ;X AS COUNTER FOR 3 CHAR +5250 CMP #$2E ;CHAR='>'? +5260 BNE FIBLKT ;NO,FILL ' 'IN FBC +5270 INC RDE ;RDE POINTES NEXT CHAR +5280 LOPTP JSR CHARCK ;CHECK SPECIAL CHAR +5290 BEQ FIBLKT ;TO FILL ' 'IF RET Z=0 +5300 INY +5310 CMP #$2A ;CHAR='*'? +5320 BNE FILLCH ;NO,TO FILL CHAR +5330 LDA #$3F ;'?' TO A +5340 STA (RWK),Y ;'?'AS TYPE TO FCB +5350 STA RNW +5360 INC RDE ;PTR NEXT CHAR +5370 JMP NEXTP ;TO FILL NEXT CHAR +5380 FILCH STA (RWK),Y ;CHAR TO FCB +5390 LDA #$20 +5400 STA RNW +5410 INC RDE ;RDE POINTER NEXT CHAR +5420 NEXTP DEX ;COUNTER X-1=0? +5430 BNE LOPTP ;NO,LOOP +5440 ;TO FIND THE END OF COMMAND +5450 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +5460 ; +5470 ; +5480 ; +5490 ; +5500 ; +5510 ; +5520 ; +5530 ; +5540 ; +5550 BLNKJ1 JMP FIND5 +5560 FNDEDG JSR CHARCK ;TO CHECK SPECIAL CHAR. +5570 BNE FIND5 ;IF RETURN Z=0 +5580 INC RDE ;POINTES NEXT +5590 JMP FNDEDG ;LOOP +5600 FIBLKT INY +5610 LDA RNW ;' ' OR ? TO A +5620 STA (RWK),Y ;' ' TO FCB +5630 DEX ;COUNTER X-1=0? +5640 BNE FIBLKT ;NO,LOOP +5650 FIND5 LDX #$03 ;X AS COUNTER FOR 3'NUL' +5660 LOPFEN INY +5670 LDA #$00 ;'NUL' TO A +5680 STA (RWK),Y ;TO FCB +5690 DEX ;COUNTER X-1=0? +5700 BNE LOPFEN ;NO,LOOP +5710 LDA RDE +5720 STA IBUFPA +5730 LDA RDE+1 +5740 STA IBUFPA+1 ;SAVE INPUT BUFFER +5750 CKQUEN LDY #$00 +5760 STY RBC +5770 LDX #$0B ;X AS COUNTER FOR 11CHAR +5780 ;COMPUTE '?'NUMBER IN FCB +5790 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +5800 CHKOUE INY ;SCAN FCB +5810 LDA (RWK),Y ;GET A CHAR FROM FCB +5820 CMP #$3F ;CHAR='?'? +5830 BNE NEXCH ;NO,GO TO NEXT CHER +5840 INC RBC ;C AS COUNTER FOR '?'NUMBER +5850 NEXCH DEX ;COUNTER X-1=0? +5860 BNE CHKQUE ;NO,LOOP +5870 LDA RBC +5880 RTS +5890 ;COMPARE THE COMMAND IN FCB WITH NAME TABLE +5900 ;RETURN A=0 TO 6 WHICH POINTES COMMAND POSITION +5910 ;******************************************* +5920 CMDCMP LDA TABADD +5930 STA RWK +5940 LDA TABADD+1 +5950 STA RWK+1 ;RWK POINTES COMMAND TABLE +5960 LDY #$00 +5970 LDX #$00 ;X AS COUNTER FOR 6 COMMANDS +5980 LOPCM TXA +5990 CMP #$06 ;COUNTER X>=6? +6000 BCS CMPEND ;YES,JUMP +6010 LDA FCBPB +6020 STA RDE +6030 LDA FCBPB+1 +6040 STA RDE+1 ;RDE PTR COMMAND NAME +6050 LDA #$04 +6060 STA RHL ;HL AS COUNTER FOR COMPARE 4 C +6070 CMPBGN JSR RDRDE ;GET A CHAR FROM FCB +6080 CMP (RWK),Y ;EQUAL? +6090 BNE CHGNX1 ;NO,TO CHANGE NEXT COMMAND +6100 INC RDE ;YES +6110 INY +6120 DEC RHL ;COUNTER-1=0? +6130 BNE CMPBGN ;NO,CONTINUE +6140 JSR RDRDE ;YES,4 CHAR EQUAL +6150 CMP #$20 ;' ' ? +6160 BNE CHGNX2 ;NO.COMPARE AGAIN +6170 ; LDA RDE +6180 ; STA IBUFPA +6190 ; LDA RDE+1 +6200 ; STA IBUFPA+1 ;PTR END OF COMMAND NAME?? +6210 TXA ;YES,GET POSITION OF TABLE +6220 CMPEND RTS +6230 CHGNX1 INY +6240 DEC RHL ;#4COUNTER -1=0? +6250 BNE CHGNX1 ;NO,LOOP +6260 CHGNX2 INX +6270 JMP LOPCM ;CONTINUE +6280 ;SEPARATE USER CODE WITH DISK NUMB. +6290 ;SET USER CODE,SELECT CURRENT DISK +6300 ;******************************************* +6310 MAIN PHA +6320 JSR RSTDSK ;RESET DISK SYSTEM +6330 PLA +6340 STA DSKNUM ;CURRENT DISK TO 'DSKNUM' +6350 JSR SELDSK ;TO SELECT CURRENT DISK +6360 JMP INBUFL ;VERSION SHOW? +6370 ;******************************************* +6380 ;START AFTER ENDING EACH CONSOLE COMMAND +6390 ;******************************************* +6400 START LDX #$22 +6410 JSR BDOS +6420 LDX #$FE +6430 TXS ;$FE TO SP +6440 LDA DSKNUM +6450 JSR SELDSK +6460 JSR CRLF ;OUTPUT 'CR' 'LF' +6470 JSR RETDKN ;RETURN CURRENT DISK +6480 CLC +6490 ADC #$41 ;CHANGE DISK NUMB.TO CHA +6500 JSR CHROUT ;OUTPUT 'A' OR 'B'- - +6510 LDA #$3E ;'>' TO A +6520 JSR CHROUT ;OUTPUT '>' +6530 JSR INBUFA ;RECEIVE MESSAGE FROM CONSOLE +6540 LDA IBUBC+$2 ;2'S CHAR IN BUFF +6550 CMP #$3A ;':'? +6560 BEO BPSDK +6570 ENTRYA LDA #DMAD +6530 STA RDE +6590 LDA #DMAD/256 +6600 STA RDE+1 ;RDE POINTES DMA ADDRESS +6610 JSR SETDMA ;SET DMA +6620 JSR FIFCBB ;FILL COMMAND IN FCB,RET '?'CO +6630 BNE CMDND1 ;IF RET'?'COUNT<>0,ERR COMMAND +6640 JSR CMDCMP ;TO COMPARE COMMAND +6650 ;BASED ON TAB POSITION RETURNED BY 'CMDCMP' +6660 ;,PROGRAM JUMP TO DIFFERENCE ENTRY +6670 ;******************************************* +6680 STA RWK ;SAVE RETURN VALUE +6690 LDA TBLAD2 ;ENTRY ADDR.TABLE TO A +6700 STA RHL +6710 LDA TBLAD2+1 ; +6720; +6730; +6740; +6750; +6760 STA RHL+1 ;RHL POINTES ENTRY ADDR.TABLE +6770 LDA RWK +6780 CLC +6790 ADC RWK ;(RETURN VALUE)*2 +6800 ADC RHL ; +6810 STA RHL +6820 LDA #$00 ;REMAIN FLAGE C +6830 ADC RHL+1 +6840 STA RHL+1 ;TABL.HEAD+(RET.VAL.)*2 +6850 LDY #$00 +6860 LDA (RHL),Y +6870 STA RWK +6880 INY +6890 LDA (RHL),Y +6900 STA RWK+1 +6910 JMP (RWK) ;TO DIFFERENCE ENTRY +6920 CMDNDI JMP CMDEND ;END ERR.COMMAND +6930 BPSDK LDA IBUBC+$3 ;3'S CHAR +6940 CMP #$00 ;'00'? +6950 BNE ENTRYA ;NOT A: OR B:COMMAND +6960 JMP PSDK ;A: OR B: COMMAND +6970 ;SOME LOCAL SUBROUTINES +6980 ;************************* +6990 ;OUTPUT ERROR MESSAGE +7000 ;~~~~~~~~~~~~~~~~~~~~ +7010 PRTERI LDA RDERRA ;MESSAGE ADDR.TO A +7020 STA RBC +7030 LDA RDERRA+1 +7040 STA RBC+1 ;RBC POINTES 'MESSAGE' +7050 JMP STRIOA ;OUTPUT 'DEAD ERROR' +7060 PRTER2 LDA NOFERA ;MESSAGE ADDR. TO A +7070 STA RBC +7080 LDA NOFERA+1 +7090 STA RBC+1 ;RBC POINTES 'MESSAGE' +7100 JMP STRIOA ;OUTPUT 'NO FILE' +7110 ;'DIGIT' HANDLE FOR PAGE & USER CODE +7120 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +7130 DIGHD JSR FIFCBB ;FILL 'DIGIT' IN FCB +7140; LDA WRKPLA +7150; BNE DIGEN1 ;ERR.END +7160 LDA #$00 +7170 STA RWQ ;RWQ FOR SAVING HIGH BITS +7180 LDA FCBPB ; +7190 STA RHL +7200 LDA FCBPB+1 +7210 STA RHL+1 ;RHL POINTES FCB +7220 LDY #$00 +7230 LDX #$0B ;X AS COUNTER FOR 11 CHAR. +7240 LOPDIG LDA (RHL),Y ;GET A CHAR +7250 CMP #$20 ;CHAR=' '? +7260 BEQ SKPEN1 ;YES,JUMP TO END +7270 INY ;NO, +7280 SEC +7290 SBC #$30 ;CHAR-'0'BIAS +7300 CMP #$0A ;CHAR<=9? +7310 BCS DIGEN1 ;NO, END ERR.COMMAND +7320 STA RWK ;SAV ELOWER BITS +7330 LDA RWQ ;HIGH BITS TO A +7340 AND #$E0 +7350 BNE DIGEN1 ;TO END ERR.COMMAND IF A<>0 +7360 LDA RWQ +7370 CLC +7380 ROR A +7390 ROR A +7400 ROR A +7410 ROR A +7420 ROR A +7430 ROR A ;(A)LEFT SHIFT 4 +7440 ADC RWQ ;OVERFLOW? +7450 BCS DIGEN1 ;YES,ERR. +7460 ADC RWQ ;OVERFLOW? +7470 BCS DIGEN1 ;YES,ERR. +7480 ADC RWK ;ADD LOW BITS +7490 BCS DIGEN1 ;ERR.IF OVERFLOW +7500 STA RWQ ;SAVE NEW HIGH BITS +7510 DEX ;COUNTER X-1=0? +7520 BNE LOPDIG ;NO,LOOP +7530 RTS +7540 DIGEN1 JMP CMDEND ;TO END ERR.COMMAND +7550 SKPEN1 LDA (RHL),Y ;GET A CHAR +7560 CMP #$20 ;CHAR=' '? +7570 BNE DIGEN1 ;NO,ERR. +7580 INY +7590 DEX ;COUNTER X-1=0? +7600 BNE SKPEN1 ;NO,LOOP +7610 LDA RWQ ;'DIGIT' TO A ,RETURN +7620 RTS +7630 ;MOVE ROUTINE +7640 ;~~~~~~~~~~~~~~~~~~~~~~ +7650 MV3CHR LDX #$03 ;X AS COUNTER FOR MOVING 3 BYT +7660 BLKMOV LDY #$00 +7670 BLKMO2 LDA (RHL),Y ;GET CHAR +7680 STA (RDE),Y ;SAVE CHAR +7690 INY +7700 DEX ;COUNTER X-1=0? +7710 BNE BLKMO2 ;LOOP +7720 RTS +7730 ;COMPUTE DIR.ADDR.&GET ACHAR. +7740 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~ +7750 DMACUN LDY #DMAD +7760 STY RHL +7770 LDY #DMAD/256 +7780 STY RHL+1 ;RHL POINTES DMA ADDR. +7790 CLC +7800 ADC RBC ;(C):DIR,RELATIV.POSITION +7810 JSR FIFCBM ;RHL+A TO RHL +7820 LDY #$00 +7830 LDA (RHL),Y ;GET A CHAR +7840 RTS +7850 ;******************************************* +7860 ;A:,B:,C:----,COMMAND +7870 ;******************************************* +7880 PSDK LDA IBUBC+$1 ;DISK CHAR +7890 SEC +7900 SBC #$41 ;DISK NUMBER +7910 PHA +7920 JSR SELDSK ;CHANR-DSK +7930 PLA +7940 STA DSKNUM +7950 JMP START +7960 ;************************************* +7970 ;DIR COMMAND HANDLE ROUTINE +7980 ;************************************* +7990 PDIR JSR FIFCBB ;FILL FILE NAME IN FCB +8000 LDA WRKPLA +8010 JSR SELDSK +8020 LDA FCBPB +8030 STA RHL +8040 LDA FCBPB+1 +8050 STA RHL+1 ;RHL POINTES FCB +8060 LDY #$00 +8070 STY FCBB+$0C ;CLARE SOME PLACE +8080 LDA (RHL),Y ;GET FIRST CHAR FOR D-NAME +8090 CMP #$20 ;CHAR=' '? +8100 ENE BRNCHB ;NO,BEGIN TO SEARCH FILE +8110 LUX #$0B ;YES,X AS COUNTER FOR 11 CHAR +8120 PATCHQ LDA #$3F ;'?' TO A +8130 STA (RHL),Y ;'?' TO FCB +8140 INY +3150 DEX ;COUNTER X-1=0? +8160 BNE PATCHQ ;NO,LOOP +8170 BRNCHB LDA #$00 +8180; +8190 STA RWK ;CLEAR COUNTER'RWK' +8200 JSR CRLF ;OUT 'CR' 'LF' +8210 LDA WRKPLA ;REQ.DISK +8220 CLC +8230 ADC #$41 ;TO DISK NUMB. +8240 JSR CHROB ;OUT DISK NAME +8250 LDA #$3A ;: TO A +8260 JSR CHROB ;OUT ':' +8270 JSR SERFIL ;SEARCH FOR THE FIRST +8280 BNE LOPDIR ;SEARCH SUCCESS,JUMP TO +8290 JSR PRTER2 ;SEARCH FALSE,PRINT'NO FILE' +8300 JMP DIREND ;TO END COMMAND +8310 LOPDIR LDA RETVAL ;RET VALUSE TO A +8320 ROR A +8330 ROR A +8340 ROR A +8350 ROR A +8360 AND #$60 +8370 STA RBC ;(RET VALUES*32) TO RBC +8380 STA RWQ +8390 LDA #$0A ;CHECK PROTECT +8400 JSR DMACUN ;COUNT DIR ADDRESS +8410 EMT NXTDR2 ; +8420 LDA RWK +8430 INC RWK ;COUNTER+1 +8440 AND #$03 +3450 STA RWQ+1 ;SAVE +8460 BNE WARMR +8470 JSR CRLF +8480 INC RWK +8490 JMP COMMON +8500 WARMR JSR SPACE ;OUTPUT ' ' +3510 JSR SPACE ;OUT ' ' +8520 JSR SPACE ;OUT ' ' +8530 COMMON JSR SPACE ;OUTPUT ' ' +8540 LDA RWQ +8550 STA RBC ;(C):RET.VAL.*32 +8560 LDX #$01 ;X AS COUNTER,INITIAL VAL 1 +8570 SIX RNW ;SAVE 'X'REG. +8580 ONEDIR LDA RNW ;CHAR COUNTER TO A +8590 JSR DMACUN ;GET CHAR +8600 AND #$7F +8610 JSR CHROB ;OUT CHAR +8620 LDX RNW +8630 CPX #$08 ;END FILE NAME ? +8640; +8650; +8660; +8670; +8680; +8690 BNE MEDIR2 +8700 JSR SPACE ;INSERT ' ' +8710 LDX RNW +8720 MEDIR2 CPX #$0C ;END TYPE? +8730 BEQ NXTDR2 +8740 INC RNW +8750 BNE ONEDIR +8760 NXTDR2 LDA #$00 +8770 JSR DMACUN ;RHL PTR FCB +8780 LDA RHL +8790 STA RDE +8800 LDA RHL+1 +8810 STA RDE+1 ;RDE PTR FCB +8820 LDA FCBB +8830 LDY #$00 +8840 STA (RHL),Y ;WRITE DSK TO FCB' +8850 LDX #$20 ;COUNT PAGE NUMB. +8860 JSR CDOSRT +8870 JSR PRNPG1 ;PRINT PAGE +8880 JSR CSTATD ;GET CONSOLE STATUE +8890 BNE DIREND ;IF STAT.<>0,JUMP +8900 JSR SERNXT ;SEARCH FOR NEXT +8910 BEQ DIREND +8920 JMP LOPDIR +8930 DIREND LDA RWK ;COUNTER TO A +8940 JMP PEND +8950 ;************************************* +8960 ;* ERA COMMAND HANDLE ROUTINE * +8970 ;************************************* +8980 PERA JSR FIFCBB ;FILL FILE NAME IN FCB +8990 CMP #$0B ;RETURN IF RET '?'COUNT.=11 +9000 BNE DELEFI ;NO,GO DELETE FILE +9010 LDA MSSAD3 ;YES,ERR. +9020 STA RBC +9030 LDA MSGAD3+1 ; +9040 STA RBC+1 ;RBC POINTES MESSAGE'ALL(Y/N)? +9050 JSR STRIOA ;OUTPUT 'ALL (Y/N)?' +9060 JSR INBUFA ;WAIT FOR ANSWER +9070 LDA IBUBC ;INPUT BUFF COUNTER TO A +9080 CMP #$01 ;BUFF COUNTER=1? +9090 BNE ERAEN1 ;NO,GO TO END COMMAND +9100 LDA IBUFB ;YES,GET CHAR +9110 CMP #$59 ;CHAR='Y'? +9120 BNE ERAEN1 ;NO,ERR. JUMP +9130 INC IBUFPA ;PTR BUFF IN BUFF +9140 DELEFI JSR FCBTOD ;FCB PTR RDE +9150 JSR DELFIL ;DELECT FILE ,A=0~3IF SUCCESS +9160 CMP #$FF ;RET VAL.=$FF IF FALSE +9170 BEQ ERAEN2 ;FALSE,JUMP +9180 JMP PEND ;SUCCESS,END +9190 ERAEN1 JMP START +9200 ERAEN2 JSR PRTER2 ;OUT 'NO FILE' +9210 JMP PEND +9220 ;*********************************************** +9230 ;* TYPE COMMAND HANDLE ROUTINE * +9240 ;*********************************************** +9250 PTYPE JSR FIFCBB ;FILL FILE NAME IN FCB +9260 BNE TYPEN1 ;IF RET '?'COUNT<>0,GO TO END +9270 LDA WRKPLA +9280 JSR SELDSK +9290 JSR OPNFL ;OPEN FILE +9300 BEQ ERENDT ;OPEN FALSE,JUMP +9310 JSR CRLF ;SUCCESS,OUTPUT 'CR''LF' +9320 WRTTP LDY #DMAD +9330 STY RHL +9340 LDY #DMAD/256 +9350 STY RHL+1 ;RHL POINTES DMAD +9360 TPBEGN JSR RDSEQ ;READ DISK +9370 BNE TEND ;IF READ FALSE +9380 LDY #$00 +9390 MEDTY LDA (RHL),Y ;GET CHAR +9400 CMP #$1A ;CHAR=CTL-Z?,EOF? +9410 BEQ BLNKT ;YES +9420 STY RNW +9430 JSR CHROUT ;NO,OUTPUT A CHAR +9440 JSR CSTATD ;GET CONSOLE STATUES +9450 BNE BLNKT ;IF STATUES<>0,GO END +9460 LDY RNW +9470 INY +9480 CPY #$80 ;TYPE 128 CHAR +9490 BNE MEDTY ;NO,LOOP +9500 JMP TPBEGN +9510 BLNKT JMP PEND +9520 TEND CMP #$01 ;'1'SHOWS EOF +9530 BEQ BLNKT ;YES +9540 JSR PRTER1 ;NO,OUTPUT'READ ERROR' +9550 ERENDT NOP +9560 TYPEN1 JMP CMDEND ;TO END ERR. COMMAND +9570 BLNKS JMP SAEND +9580 ;****************************************** +9590 ;* SAVE COMMAND HANDLE ROUTINE * +9600 ;****************************************** +9610 PSAVE JSR DIGHD ;FILL PAGE NUMB. RET NUMBER +9620 PHA +9630 JSR FIFCBB ;FILL FILE NAME IN FCB,RET'?# +9640 BNE TYPEN1 ;'?'COUNT.<>0,ERR. GO ERR END +9650 LDA WRKPLA +9660 JSR SELDSK +9670 JSR FCBTOD ;FCB POINTER TO RDE +9680 JSR DELFIL ;DELECT FILE IF IT EXISTED +9690 JSR FCBTOD ; +9700 JSR MAKFIL ;MAKE FILE,RET'0'IF FALSE +9710 BEO BLNKS ;FALSE,JUMP TO END +9720 LDA #$00 +9730 STA RWK+1 +9740 STA FCBBD ;CLEAR SOME PLACE +9750 CLC +9760 PLA +9770 STA RWK +9780 ADC RWK ;NUMB.*2 +9790 BCC ENTR1 ;LOW BITS NO'C' JUMP +9800 INC RWK+1 ;ADD'C' +9810 ENTR1 STA RWK ;PAGE N*2 TO RWK +9820 LDA #STRTD +9830 STA RDE +9840 LDA #STRTD/256 +9850 STA RDE+1 +9860 SAVBGN LDA RWK +9870 ORA RWK+1 +9880 BEO SFINSH ;CHECK PAGE NUMB.=0? +9890 LDA RWK ;YES,END +9900 SEC +9910 SBC #$01 +9920 BCS ENTR2 +9930 DEC RWK+1 +9940 ENTR2 STA RWK +9950 LDA #$80 ;128 BYTES +9960 CLC +9970 ADC RDE ;+128 +9980 STA RHL +9990 LDA RDE+1 +10000 ADC #$00 +10010 STA RHL+1 ;RHL POINTES NEXT RDE A@@R. +10020 JSR SETDMA ;USINC RDE,SET DMA +10030 JSR FCBTOD ;R@E POINTES FCB +10040 JSR WRSEQ ;WRITE SEQUANTIAL,RET 0 IF SUCCE +10050 BNE SAEND ;WRIPA FALSE(ERRRRRR* AJD +10060 LDA RHL +10070 STA RDE +10080 LDA RHL+1 +10090 STA RDE+1 ;RDE POINTES NEW DIA ADDR. +10100 JMP SAVBGN ;LOOP +10110 SFINISH JSR FCBTOD ;RDE POINTES FCB +10120 JSR CLSFIL ;CLOSE BILE +10130 CMP #$00 ;RETURN=0.CLOSE FALSE +10140 BNE SAEND2 ;SUCCASS,JUMPTO-- +10150 SAEND JSR CRLF ;OUTPUT 'CR' 'LF' +10160 LDA MSOAD5 +10170 STA RHL +10180 LDA MSGAD5+1 +10190 STA RHL+1 ;RHH POINPES 'NK SPACE' +10200 JSR STRIOB ;OUT 'NO SPACE' +10210 SAEND2 JSR STDMAI ;INITIAL DMA ADDR. +10220 JMP PEND +10230 ERENDZ JMP CMDEND ;END ERR. +10240 ;************************************ +10250 ;* RENAME COMMAND HANDLE ROUTINE +10260 ;************************************ +10270 PREN JSR FIFCBB ;FILL FILE NAME IN FCB,RET +10280 BNE ERENDZ ;IF RET'?'COUNTER<>0,ERR. +10290 LDA WRKPLA ;REQUIRED DISK NO.TO A +10300 STA WRKPLC ;SAVE +10310 LDA FCBP ;NO REPEAT NAME, +10320 STA RHL +10330 LDA FCBP+1 +10340 STA RHL+1 ;RHL POINTES NEW FILE NAME FCB +10350 LDA FCBPC +10360 STA RDE +10370 LDA FCBPC+1 +10380 STA RDE+1 ;RDE POINTES TEMP.SAVE ARE +10390 LDX #$10 ;X AS COUNTER FOR MOVING16 CHA +10400 JSR BLKMOV ;MOVE NEW NAME TO TEMP.AREA +10410 LDA IBUFPA +10420 STA RDE +10430 LDA IBUFPA+1 ; +10440 STA RDE+1 ;RDE POINTES INPUT BUFFER +10450 JSR SKPBLK ;TO SKIP ' ' +10460 CMP #$3D ;CHAR='='? +10470 BEQ FIOLDN ;YES,JUMP TO FILL OLD NAME +10480 CMP #$5F ;CHAR='<-`? +10490 BNE ERENDN ;NO,ERR. JUMP +10500 FIOLDN CLC +10510 LDA RDE +10520 ADC #$01 +10530 STA IBUFPA +10540 LDA #$00 +10550 ADC RDE+1 +10560 STA IBUFPA+1 ;MODIFY IN-BUFF PTR +10570 JSR FIFCBB ;FILL OLD FILE NAME +10580 BNE ERENDN ;RET '?'COUNT.<>0,ERR. +10590 LDA FCBBC ;OLD DSK IN FCB +10600 BEQ USNEWN +10610 LDA FCBB +10620 BEQ USNEWN ;(A)=0,G0,USE NEW FILE DSK +10630 LDA WRKPLA +10640 CMP WRKPLC ;COMPARE NEW DSK WITH OLD D +10650 BNE ERENDJ ;ERR. +10660 USNEWN LDA FCBBC +10670 ORA FCBB +10680 STA FCBB +10690 STA FCBBC +10700 LDA FCBPC +10710 STA RDE +10720 LDA FCBPC+1 +10730 STA RDE+1 ;RDE PTRNEWFILE +10740 JSR SERFIL+3 ;SEACH NEW FILE +10750 BNE ERENDR +10760 JSR SERFIL ;SEARCH FOR OLD NAME FILE +10770 BEQ PRTEND ;SEARCH FALSE,'NO FIRE' +10780 JSR FCBTOD ;SUCCESS,RDE POINT.FCB +10790 JSR RENFIL ;RENAME FILE +10800 JMP FEND ;NORMALLY END +10810 PRTEND JSR PRTER2 ;OUTPUT 'NO FILE' +10820 JMP FEND +10830 ERENDN JMP CMDEND ;ERR. +10840 ERENDR JSR CRLF ;OUTPUT 'CR' 'LF' +10850 LDA MSOAD7 +10860 STA RHL +10870 LDA MSGAD7+1 ; +10880 STA RHL+1 ;RHL POINTES'FILE EXISTS` +10890 JSR STRIOB ;PRINT +10900 JMP PEND +10910 ERENDJ JMP CMDEND ;END ERR. +10920 ;****************************************** +10930 ;* USER COMMAND HANDLE ROUTINE +10940 ;****************************************** +10950 PUSER JSR DIGHD ;FILL 'DIGIT'IN FCB COUNT +10960 CMP #$10 ;USER CODE>=16? +10970 BCS ERENDJ ;YES,ERR. TO END +10980 LDX FCBBB +10990 CPX #$20 ;1'S CHAR=' '? +11000 BEQ ERENDJ ;YES,ERR. +11010 JSR SETCOD ;SET USER CODE +11020 BLKTR JMP PEND +11030 ;****************************************** +11040 ;* TRANSIENT PROGRAM COMMAND HANDLE ROUTINE +11050 ;****************************************** +11060 ;PTRANS LDA FCBB ;GET DSK NUMB. IN FCB +11010 ; +11080 PTRANS LDA WRKPLA +11090 ; STA DSKNUM +11100 ; DEC DSKNUM ;TO CHANGE CURRENT DISK +11110 ; JSR WRTDKN ;SAVE CURRENT DISK #0004 +11120 JSR SELDSK +11130 LDA #FCBB ;FCB ADDRESS +11140 STA RWK +11150 LDA #FCBB/256 +11160 STA RWK+1 ;RWK PIR FCB +11170 JSR CKQUEN ;COUNT'?' +11180 BNE ERENDJ ;JUMP TO END ERR.COMMAND +11190 LDA IBUFPA+1 +11200 PHA +11210 LDA IBUFPA +11220 PHA +11230 FICOM LDA FCBB+9 ;TYPE 1'SCHAR +11240 CMP #$20 +11250 BNE ERENDJ +11260 LDA FCBP +11270 CLC +11280 ADC #$09 +11290 STA RDE +11300 LDA #$00 +11310 ADC FCBP+1 +11320 STA RDE+1 ;RDE POINTES (FCBP+8) +11330 LDA MSGDD9 +11340 STA RHL +11350 LDA MSGDD9+1 +11360 STA RHL+1 ;RHL POINTES 'COM' +11370 JSR MV3CHR ;FILL 'COM'IN FCB +11380 JSR OPNFL ;OPEN FILE +11390 BEQ BLKJ6 ;OPEN FALSE,ERR. +11400 LDA #STRTD ;OPEN SUCCESS, +11410 STA RWK +11420 LDA #STRTD/256 +11430 STA RWK+1 ;RWK POINTES INPUT ADDR, +11440 RDDSK LDA RWK +11450 STA RDE +11460 LDA RWK+1 +11470 STA RDE+1 ;RDE POINTES INPUT ADDRESS +11480 JSR SETDMA ;SET DMA +11490 JSR FCBTOD ;RDE POINTES FCB +11500 JSR RDSEQB ;READ SEOUENTIAL,RETO IF SUCCES +11510 BNE RDEND ;REAR FALSE,GO END +11520 CLC +11530 LDA RWK ;GET INPUT ADDR. +11540 ADC #$80 ;+128 BYTES +11550 STA RWK +11560 LDA #$00 +11570 ADC RWK+1 +11580 STA RWK+1 ;RWK SAVE NEW INPUT ADDR. +11590 CMP #$B0 ;CHECK OVER LOAD? +11600 BCS BLKJ7 ;OVER,ERR. +11610 JMP RDDSK ;NO,LOOP +11620 BLKJ6 JMP PRTERB +11630 BLKJ7 JMP PRTERP +11640 RDEND CMP #$01 ;CHECK EOF? +11650 BNE BLKJ7 ;NO,ERR. +11660 JSR FIFCBB ;FILL FILENAME FOLLOWING COMMA. +11670 INC WRKPLA +11680 LDA WRKPLA ;FIRST FILE DSK TO A +11690 STA FCBB ;FILL +11700 STA RWQ ;SAVE +11710 LDA #$10 ;FOR FILLING SECOND FILE NAME +11720 JSR FIFCB ;SECOND FILE NAME TO FCB +11730 LDA RWQ ;FIRST FILE DISK TO A +11740 STA FCBB+16 ;AS SECOND FILE DISK +11750 LDA #$00 +11760 STA FCBB+32 ;CLEAR A BYTE +11770 LDA #$10 +11780 STA RDE +11790 LDA #$EF +11800 STA RDE+1 ;RDE PTR $EF10 FOR 2'S FILE NAM +11810 LDA FCBP +11820 STA RHL +11830 LDA FCBP+1 +11840 STA RHL+1 ;RHL POINTES FCB +11850 LDX #$21 ;X AS COUNTER FOR 33CHAR +11860 JSR BLKMOV ;MOVE FROM FCB TO NEW SAVE AREA +11870; +11880; +11890; +11900; +11910; +11920; +11930 PLA +11940 STA RHL +11950 PLA +11960 STA RHL+1 ;RHL POINTES INPUT BUFFER +11970 LDY #$00 +11980 FNBLK LDA (RHL),Y ;GET CHAR +11990 BEQ MVEND +12000 CMP #$20 ;CHAR=' '/ +12010 BNE NEWLIN ;Y,JMP +12020 LDA $#01 +12030 JSR FIFCBM ;RHL+1 +12040 JMP FNBLK ;LOOP +12050 NEWLIN LDX #$00 ;INITIAL COUNTER X=0 +12060 LDA #DMAD +12070 STA RDE +12030 LDA #DMAD/256 +12090 STA RDE+1 +12100 INC RDE ;RDE PTR $E965 FOR SAVING OTHER +12110 LDY #$00 +12120 MVSTAR LDA (RHL),Y +12130 STA (RDE),Y ;MOVE A CHAR +12140 BEQ MVEND ;IF CHAR=0,ST0P MOVING +12150 INX ;COUNTER X+1 +12160 INY +12170 JMP MVSTAR ;LOOP +12180 MVEND TXA +12190 LDY #$00 +12200 DEC RDE +12210 STA (RDE),Y ;$E965 SAVE INFO, COUNTER +12220 ;FROM $E966 TO E966+(E965 COUNT) SAVE ALL PARAME. +12230 ;FROM $EF10 TO EF30 SAVE SAVE TWO COMMAND INCL.DSK +12240 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +12250 ;************************************************* +12260 JSR CRLF ;OUTPUT 'CR' 'LF' +12270 JSR STDMAI ;SET DMA=DMAD +12280 EXECUT JSR STRTD ;GO TO EXECUTE PROGRAM +12290 LDA DSKNUM ;CURRENT DISK +12300 JSR SELDSK ;SELECT CURRENT DISK +12310 JMP START +12320 PRTERB NOP +12330 JMP CMDEND ;ERR.END +12340 PRTERP JSR CRLF ;OUTPUT 'CR' 'LF' +12350 LDA MSGBA2 +12360 STA RHL +12370 LDA MSGBA2+1 ; +12380 STA RHL+1 ;RHL POINTES 'BAD LOAD' +12390 JSR STRIOB ;PRINT +12400 JMP PEND +12410 PEND JSR FIFCBB ;FILL REMAIN SOMETHING +12420 LDA FCBBB ;GET CHAR FROM FCB +12430 SEC +12440 SBC #$20 ;SUB ' 'VALUE +12450 ORA WRKPLA +12460 BNE PENER ;(A)<>0,ERR,END +12470 JMP START ;END NORMALLY +12480 PENER JMP CMDEND ; +12490 MSGVER .BYTE 'O.U.6502 CP/M VERSION',$0D,$0A +12500 .BYTE ' DIR ERA TYPE SAVE REN B:',$00 +12510; +12520; +12530; +12540; +12550; +12560 RDERR .BYTE 'READ ERROR',$00 +12570 NOFERR .BYTE 'NO FILE',$00 +12580 MSGADI .BYTE 'ALL (Y/N)?',$00 +12590 MSGAD4 .BYTE 'NO SPACE',$00 +12600 MSGAD6 .BYTE 'FILE EXISTS',$00 +12610 MSGDD8 .BYTE 'COM' +12620 MSGBA1 .BYTE 'BAD L0AD',$00 +12630 .END \ No newline at end of file