1000 SYS 700 1010 .OPT OO 1020 ; 1030 ; *********************** 1040 ; * * 1050 ; * M/L INPUT ROUTINE * 1060 ; * (null)RIGHT 1987 * 1070 ; * GARRY G. KIZIAK * 1080 ; * * 1090 ; *********************** 1100 ; 1110 *=$C000 ; ORIGIN OF ROUTINES 1120 ; 1130 ; COMMAND JUMP TABLE 1140 ; 1150 JMP PRINT ; PRINT AT ROUTINE 1160 JMP INPUT ; INPUT ROUTINE 1170 ; 1180 ; GET CURSOR POSITION 1190 ; 1200 CHKCOM = $AEFD ; CHECK FOR A COMMA 1210 COMBYT = $B7F1 ; GET A BYTE IN X 1220 ILLQTY = $B248 ; ILLEGAL QUANTITY 1230 PLOT = $FFF0 ; SET/READ CURSOR POSITION 1240 XVAL .BYTE 0 ; TEMPORARY STORAGE 1250 YVAL .BYTE 0 ; TEMPORARY STORAGE 1260 ; 1270 GETCUR JSR COMBYT ; GET COLUMN 1280 CPX #$28 ; 0<=X<=39 1290 BCS SET1 ; TOO BIG 1300 STX YVAL 1310 TXA 1320 PHA 1330 JSR COMBYT ; GET ROW 1340 CPX #$19 ; 0<=Y<=24 1350 BCS SET1 ; TOO BIG 1360 STX XVAL 1370 PLA 1380 TAY 1390 CLC 1400 JMP PLOT ; SET CURSOR 1410 SET1 JMP ILLQTY 1420 ; 1430 ; PRINT AT ROUTINE 1440 ; 1450 PRINT JSR GETCUR 1460 JSR CHKCOM 1470 JMP $AAA4 ; CONTINUE WITH ROM PRINT 1480 ; 1490 ; WAIT FOR A KEYSTROKE 1500 ; 1510 GETIN = $FFE4 ; CHECK FOR A KEYPRESS 1520 BEG = $FB ; BEGINNING OF INPUT FIELD 1530 CURPOS = $FD ; CURSOR POSITION WITHIN INPUT FIELD 1540 ; 1550 GETKEY LDA IR ; GET CHARACTER UNDER CURSOR 1560 EOR #$80 ; REVERSE IT 1570 STA IR 1580 LDY CURPOS ; GET CURSOR POSITION 1590 STA (BEG),Y 1600 LDA #$10 ; INITIALIZE COUNTER 1610 STA COUNT2 1620 LDA #$FF 1630 STA COUNT1 1640 GET1 JSR GETIN ; HAS A KEY BEEN PRESSED 1650 BNE GET2 ; YES 1660 DEC COUNT1 ; COUNT DOWN 1670 BNE GET1 ; TRY AGAIN 1680 DEC COUNT2 ; COUNT DOWN SOME MORE 1690 BNE GET1 ; TRY AGAIN 1700 BEQ GETKEY ; FLASH CURSOR 1710 GET2 RTS 1720 COUNT1 .BYTE 0 ; COUNTER FOR FLASHING CURSOR 1730 COUNT2 .BYTE 0 1740 ; 1750 ; INPUT ROUTINE 1760 ; 1770 LEN = $02 ; MAX. NO. OF CHARACTERS ALLOWED 1780 AST = $03 ; ADDRESS OF INPUT STRING 1790 LENB = $B2 ; LENGTH OF OPTIONAL STRING 1800 BST = $B3 ; ADDRESS OF OPTIONAL STRING 1810 VARADR = $05 ; ADDRESS OF VARIABLE 1820 FINDVAR = $B08B ; FIND VARIABLE 1830 JUSTF .BYTE 0 ; JUSTIFY FLAG 1840 ESCFLG .BYTE 0 ; ESCAPE FLAG 1850 IQ .BYTE 0 ; CHARACTER BEING ENTERED 1860 IR .BYTE 0 ; CHARACTER UNDER CURSOR 1870 ID .BYTE 0 ; MASK FOR ALLOWABLE INPPUTS 1880 ; 1890 INPUT LDA #$00 1900 STA JUSTF ; NO JUSTFICATION 1910 JSR GETCUR ; GET CURSOR POSITION 1920 CLC 1930 LDA $D1 ; GET SCREEN ADDRESS 1940 ADC $D3 ; FOR BEGINNING OF INPUT 1950 STA BEG 1960 LDA $D2 1970 ADC #$00 1980 STA BEG+1 1990 JSR CHKCOM 2000 JSR FINDVAR ; FIND INPUT VARIABLE 2010 STA VARADR ; SAVE ITS LOCATION 2020 STY VARADR+1 2030 LDY #$02 ; MOVE ITS DESCRIPTOR 2040 INP1 LDA (VARADR),Y ; TO ZERO PAGE 2050 STA LEN,Y 2060 DEY 2070 BPL INP1 2080 LDA LEN 2090 BEQ SET1 2100 JSR COMBYT ; GET MAX LENGTH OF INPUT 2110 TXA 2120 BEQ SET1 2130 CPX LEN ; BIGGER THAN LENGTH OF STRING 2140 BEQ INP1A 2150 BCC INP1A 2160 BCS SET1 ; YES, TOO BIG 2170 INP1A STX LEN 2180 JSR COMBYT ; GET ID 2190 STX ID 2200 TXA ; SET STATUS REGISTERS 2210 BPL INP1C ; NO OPTIONAL STRING 2220 JSR CHKCOM 2230 JSR FINDVAR ; FIND OPTIONAL STRING 2240 LDY #$02 2250 INP1B LDA ($47),Y ; GET DESCRIPTOR FOR STRING 2260 STA LENB,Y 2270 DEY 2280 BPL INP1B 2290 INP1C JSR PRIAST ; PRINT DEFAULT INPUT 2300 INP1D LDA #$00 2310 STA $C6 ; CLEAR KEYBOARD BUFFER 2320 STA CURPOS ; INITIAL POSITION OF CURSOR 2330 STA ESCFLG ; ESCAPE FLAG = 0 2340 INP2 LDY CURPOS 2350 LDA (BEG),Y ; GET CHARACTER UNDER THE CURSOR 2360 STA IQ ; SAVE IT 2370 STA IR ; TEMPORARILY 2380 INP3 JSR GETKEY ; GET A KEYPRESS 2390 STA $D7 ; SAVE IT TEMPORARILY 2400 CMP #133 ; [F1] 2410 BNE INP4 2420 LDA ID 2430 AND #16 ; CHECK ID 2440 BEQ INP3 ; NOT ALLOWED 2450 LDA IQ 2460 LDY CURPOS ; RESTORE CHARACTER UNDER CURSOR 2470 STA (BEG),Y 2480 LDX #$1 ; SET ESCAPE FLG 2490 STX ESCFLG 2500 JMP RETURN 2510 INP4 CMP #32 ; [SPACE] 2520 BEQ INP5 2530 CMP #160 ; [SHIFTED-SPACE] 2540 BNE INP6 2550 INP5 LDA #32 ; CONVERT TO A NORMAL SPACE 2560 STA $D7 2570 JMP (null)TIT 2580 INP6 CMP #48 ; [0] 2590 BCC INP7 2600 CMP #58 ; [9]+1 2610 BCS INP7 2620 LDA ID 2630 AND #2 ; CHECK ID 2640 BEQ INP12 ; NOT ALLOWED 2650 JMP (null)TIT ; [0-9] 2660 INP7 CMP #65 ; [A] 2670 BCC INP8A 2680 CMP #91 ; [Z]+1 2690 BCS INP8A 2700 INP8 LDA ID 2710 AND #1 ; CHECK ID 2720 BEQ INP12 ; NOT ALLOWED 2730 JMP (null)TIT ; [A-Z] OR [SHIFT A-SHIFT Z] 2740 INP8A CMP #193 ; [SHIFT A] 2750 BCC INP9 2760 CMP #219 ; [SHIFT Z]+1 2770 BCS INP9 2780 BCC INP8 2790 INP9 CMP #157 ; [CURSOR LEFT] 2800 BNE INP10 2810 LDY CURPOS 2820 BEQ INP3 ; CAN'T CURSOR LEFT 2830 LDA IQ 2840 STA (BEG),Y 2850 DEC CURPOS 2860 JMP INP2 2870 INP10 CMP #29 ; [CURSOR RIGHT] 2880 BNE INP11 2890 LDY CURPOS 2900 INY 2910 CPY LEN 2920 BEQ INP3 ; CAN'T CURSOR RIGHT 2930 DEY 2940 LDA IQ 2950 STA (BEG),Y 2960 JSR CHECK 2970 INC CURPOS 2980 JMP INP2 2990 INP11 CMP #13 ; [RETURN] 3000 BEQ RETURN 3010 CMP #17 ; [CURSOR DOWN] 3020 BEQ DOWN 3030 CMP #145 ; [CURSOR UP] 3040 BEQ UP 3050 CMP #148 ; [INSERT] 3060 BEQ INSERT 3070 CMP #46 ; [.] 3080 BEQ DECIMAL 3090 CMP #20 ; [DELETE] 3100 BNE INP12 3110 JMP DELETE 3120 INP12 BIT ID ; SPECIAL CHARACTERS ALLOWED 3130 BPL DONE ; NO 3140 LDY #$00 3150 LDA $D7 3160 INP13 CMP (BST),Y ; YES 3170 BNE INP14 3180 JMP (null)TIT 3190 INP14 INY 3200 CPY LENB 3210 BNE INP13 3220 DONE JMP INP3 ; NO OTHER KEYS ALLOWED 3230 UP LDX #$03 3240 .BYTE $2C 3250 DOWN LDX #$02 3260 LDA ID 3270 AND #8 3280 BEQ DONE 3290 .BYTE $2C 3300 RETURN LDX #$01 3310 LDA ID 3320 AND #64 3330 BEQ RET1 3340 JSR JUSTR 3350 RET1 LDY CURPOS 3360 LDA IQ 3370 STA (BEG),Y 3380 LDA ID 3390 AND #32 ; CHECK FOR REMOVING TRAILING SPACES 3400 BEQ RET4 ; NO 3410 LDY LEN 3420 DEY 3430 RET2 LDA (AST),Y ; GET CHARACTER FROM A$ 3440 CMP #32 ; IS IT A SPACE 3450 BNE RET3 3460 DEY 3470 BPL RET2 3480 RET3 INY 3490 TYA 3500 LDY #$00 3510 STA (VARADR),Y 3520 RET4 TXA ; TYPE OF RETURN IN LOCATION 780 3530 PHA 3540 JSR PRIAST 3550 PLA 3560 LDX ESCFLG ; GET ESCAPE FLAG 3570 RTS 3580 DECIMAL LDA ID ; CHECK ID 3590 AND #4 3600 BEQ INP12 ; NOT ALLOWED 3610 JSR CHECKD ; CHECK FOR DECIMAL POINT 3620 BEQ CANT ; DECIMAL POINT ALREADY ENTERED 3630 JMP (null)TIT 3640 CANT JMP INP3 3650 INSERT LDY CURPOS 3660 LDA IQ 3670 STA (BEG),Y 3680 LDY LEN 3690 DEY 3700 CPY CURPOS 3710 BEQ CANT 3720 LDA (AST),Y 3730 CMP #32 ; IS LAST CHARACTER A SPACE 3740 BNE CANT ; CAN'T INSERT 3750 INS1 DEY 3760 LDA (BEG),Y ; GET SCREEN CODE 3770 PHA ; SAVE IT 3780 LDA (AST),Y 3790 INY 3800 STA (AST),Y ; MOVE CHARACTER IN STRING 3810 PLA 3820 STA (BEG),Y ; MOVE CHARACTER ON SCREEN 3830 DEY 3840 CPY CURPOS 3850 BNE INS1 3860 LDA #32 3870 STA (AST),Y ; PUT SPACE IN STRING 3880 LDX $C7 3890 BEQ INS2 3900 ORA #$80 3910 INS2 STA (BEG),Y ; PUT SPACE ON SCREEN 3920 JMP INP2 3930 DELETE LDY CURPOS 3940 BNE DEL1 3950 INY ; CURSOR IN FIRST POSITION 3960 CPY LEN ; ONLY ONE CHARACTER 3970 BNE CANT ; NO, SO CAN'T DELETE 3980 DEY ; YES, SO PUT A SPACE 3990 LDA #32 ; IN THE FIRST POSITION 4000 STA (BEG),Y 4010 STA (AST),Y 4020 JMP INP2 4030 DEL1 LDA IQ 4040 STA (BEG),Y 4050 INY ; IS CURSOR ON LAST CHARACTER 4060 CPY LEN 4070 BNE DEL2 ; NO 4080 DEY ; YES 4090 LDA (AST),Y ; GET LAST CHARACTER 4100 CMP #32 ; IS IT A SPACE 4110 BEQ DEL2 ; YES 4120 INC CURPOS ; NO 4130 DEL2 LDY CURPOS 4140 DEY 4150 LDA (AST),Y ; GET CHARACTER TO DELETE 4160 DEL3 INY 4170 CPY LEN 4180 BEQ DEL5 4190 LDA (AST),Y ; CHARACTER TO REPLACE 4200 PHA 4210 LDA (BEG),Y 4220 DEY 4230 LDX $C7 4240 BEQ DEL4 4250 ORA #$80 4260 DEL4 STA (BEG),Y ; DELETE IT ON SCREEN 4270 PLA 4280 STA (AST),Y ; DELETE IT IN STRING 4290 INY 4300 BNE DEL3 4310 DEL5 DEY 4320 LDA #32 4330 STA (AST),Y 4340 LDX $C7 4350 BEQ DEL6 4360 ORA #$80 4370 DEL6 STA (BEG),Y 4380 DEC CURPOS 4390 JMP INP2 4400 (null)TIT JSR CHECK 4410 LDY CURPOS 4420 LDA $D7 4430 STA (AST),Y ; PUT IT IN STRING 4440 BMI (null)T3 4450 CMP #$60 4460 BCC (null)T1 4470 AND #$DF 4480 BNE (null)T2 4490 (null)T1 AND #$3F 4500 (null)T2 JMP (null)T5 4510 (null)T3 AND #$7F 4520 CMP #$7F 4530 BNE (null)T4 4540 LDA #$5E 4550 (null)T4 ORA #$40 4560 (null)T5 LDX $C7 4570 BEQ (null)T6 4580 ORA #$80 4590 (null)T6 STA (BEG),Y 4600 INY 4610 CPY LEN 4620 BNE (null)T7 4630 DEY 4640 (null)T7 STY CURPOS 4650 JMP INP2 4660 ; 4670 ; JUSTIFY LEFT 4680 ; 4690 TEMPM .BYTE 0 4700 TEMPN .BYTE 0 4710 ; 4720 JUSTL LDY #$00 4730 STY TEMPM 4740 LDA (AST),Y 4750 CMP #32 4760 BNE JUS5 ; ALREADY JUSTIFIED 4770 JUS1 INY 4780 CPY LEN 4790 BEQ JUS5 ; ALL SPACES 4800 LDA (AST),Y 4810 CMP #32 4820 BEQ JUS1 4830 STY TEMPN ; FIRST NON-SPACE CHARACTER 4840 JUS2 LDY TEMPM ; MOVE LEFT 4850 STA (AST),Y 4860 INC TEMPN 4870 INC TEMPM 4880 LDY TEMPN 4890 CPY LEN 4900 BEQ JUS3 4910 LDA (AST),Y 4920 BNE JUS2 4930 BEQ JUS2 4940 JUS3 LDY TEMPM ; REST ARE SPACES 4950 LDA #32 4960 JUS4 STA (AST),Y 4970 INY 4980 CPY LEN 4990 BCC JUS4 5000 JUS5 RTS 5010 ; 5020 ; JUSTIFY RIGHT 5030 ; 5040 JUSTR LDY LEN 5050 DEY 5060 STY TEMPM 5070 LDA (AST),Y 5080 CMP #32 5090 BNE JUST5 ; ALREADY JUSTIFIED 5100 JUST1 DEY 5110 BMI JUST5 ; ALL SPACES 5120 LDA (AST),Y 5130 CMP #32 5140 BEQ JUST1 5150 STY TEMPN ; FIRST NON-SPACE CHARACTERADY. 5160 JUST2 LDY TEMPM 5170 STA (AST),Y 5180 DEC TEMPM 5190 DEC TEMPN 5200 LDY TEMPN 5210 BMI JUST3 5220 LDA (AST),Y 5230 BNE JUST2 5240 BEQ JUST2 5250 JUST3 LDY TEMPM ; REST ARE SPACES 5260 LDA #32 5270 JUST4 STA (AST),Y 5280 DEY 5290 BPL JUST4 5300 JUST5 RTS 5310 ; 5320 ; PRINT STRING 5330 ; 5340 PRIAST LDA $D7 5350 PHA 5360 LDY YVAL 5370 LDX XVAL 5380 CLC 5390 JSR PLOT 5400 LDY #$00 5410 PRI1 LDA (AST),Y 5420 JSR $FFD2 5430 INY 5440 CPY LEN 5450 BNE PRI1 5460 PLA 5470 STA $D7 5480 RTS 5490 ; 5500 ; CHECK JUSTIFY FLAG 5510 ; 5520 CHECK BIT JUSTF 5530 BMI CH1 ; ALREADY ON 5540 LDA ID 5550 AND #64 5560 BEQ CH1 ; NOT ALLOWED 5570 JSR JUSTL ; JUSTIFY STRING AND 5580 JSR PRIAST ; PRINT IT 5590 LDA #$80 ; SET FLAG 5600 STA JUSTF 5610 CH1 RTS 5620 ; 5630 ; CHECK FOR DECIMAL 5640 ; 5650 CHECKD LDY LEN 5660 DEY 5670 CHECK1 LDA (AST),Y 5680 CMP #46 5690 BEQ CHECK2 ; FOUND ONE 5700 DEY 5710 BPL CHECK1 5720 LDA #$01 ; NO DECIMAL POINT 5730 CHECK2 RTS 0