1
0
mirror of https://github.com/option8/OUP-M.git synced 2024-07-12 19:28:58 +00:00
OUP-M/CCP.s
2018-10-02 15:48:30 -04:00

1186 lines
34 KiB
ArmAsm
Raw Blame History

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 ;CHAR<LOWER CASE Z+1?
2980 BCC LOPU2 ;NO,GO TO LOPU2
2990 RTS ;YES,RETURN
3000 LOPU2 AND #$5F ;LOWER CASE TO UPPER CASE
3010 RTS
3020 ;COLD START,($01FF)=0:ROUTINE SHOW OP VERSION
3030 ;WARM START,($01FF)<>0: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<4F>HANDLE' IF CHAR<' '
3960 CMP #$3D ;CHAR='='?
3970 BEQ CHEND ;YES,RETURN Z=0
3980 CMP #$5F ;CHAR='<<3C>'?
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