0100 ; SAVE#D:SPYPT6.M65 0110 ; 0120 ;------------------; 0130 ; Secret Agent ; 0140 ; By: Barry Kolbe ; 0150 ; Screen Handlers ; 0160 ; (c) 1988 ; 0170 ;------------------; 0180 ; 0190 ;Graphics 0 display list with 0200 ;a Status Line at the top 0210 ; 0220 GDLST .BYTE $70,$70,$60,$42 0230 .WORD PLACE ;status line 0240 .BYTE $10,$42 0250 .WORD GR0 0260 .BYTE $02,$02,$02,$02,$02 0270 .BYTE $02,$02,$02,$02,$02 0280 .BYTE $02,$02,$02,$02,$02 0290 .BYTE $02,$02,$02,$02,$02 0300 .BYTE $02,$02,$41 0310 .WORD GDLST 0320 ; 0330 ;Positions of the Graphics 0 0340 ;lines in increments of 40 0350 ;used by the Print routine 0360 ; 0370 ;Low bytes 0380 ; 0390 GL .BYTE $00,$28,$50,$78,$A0 0400 .BYTE $C8,$F0,$18,$40,$68 0410 .BYTE $90,$B8,$E0,$08,$30 0420 .BYTE $58,$80,$A8,$D0 0430 .BYTE $F8,$20,$48,$70 0440 ; 0450 ;High bytes 0460 ; 0470 GH .BYTE $00,$00,$00,$00,$00 0480 .BYTE $00,$00,$01,$01,$01 0490 .BYTE $01,$01,$01,$02,$02 0500 .BYTE $02,$02,$02,$02 0510 .BYTE $02,$03,$03,$03 0520 ; 0530 ;The Status Line 0540 ; 0550 PLACE .SBYTE " " 0560 .SBYTE " S" 0570 .SBYTE "CORE: 0 " 0580 ; 0590 ;Tables for converting from 0600 ;ASCII to Internal Code 0610 ; 0620 A2I .BYTE $40,$00,$20,$60 0630 ; 0640 ;Special Keys Codes 0650 ; 0660 ;a-z :The Raw Key Codes 0670 ;from 764 (CH = $2FC) 0680 ; 0690 KEYC .BYTE $3F,$15,$12,$3A,$2A 0700 .BYTE $38,$3D,$39,$0D,$01 0710 .BYTE $05,$00,$25,$23,$08 0720 .BYTE $0A,$2F,$28,$3E,$2D 0730 .BYTE $0B,$10,$2E,$16,$2B 0740 .BYTE $17 0750 ; 0760 ;SPACE/./,/DEL-Bsp/EOL 0770 ; 0780 OKEY .BYTE $21,$22,$20,$34,$0C 0790 .BYTE $76 0800 ; 0810 ;The ASCII equivalents 0820 ; 0830 ASCK .BYTE $20,$2E,$2C,$7E,$9B 0840 .BYTE $7D 0850 ; 0860 JIFF PHA ;just wait 0870 LDA #0 ;a jiffy 0880 STA RTCLOK 0890 WAITJ1 LDA RTCLOK 0900 BEQ WAITJ1 0910 PLA 0920 RTS 0930 ; 0940 CLRGR0 LDY #0 ;clear the 0950 TYA ;screen 0960 CLRSC STA GR0,Y 0970 STA GR0+$0100,Y 0980 STA GR0+$0200,Y 0990 STA GR0+$0300,Y 1000 INY 1010 BNE CLRSC 1020 JSR HOME ;reset cursor 1030 RTS 1040 ; 1050 ;Get Screen Position 1060 ;from the GL/GH tables 1070 ; 1080 POSITION LDY ROWCRS 1090 LDA GL,Y ;get low offset 1100 CLC 1110 ADC # GR0 1150 STA SL+1 1160 RTS 1170 ; 1180 ;Scroll Screen Memory Up 1190 ;One Line 1200 ; 1210 SCROLL LDA ROWCRS ;need to 1220 CMP #BOTLIN :scroll? 1230 BCC SCMOVEDN ;no 1240 LDA # GR0 1270 STA SCR+1 1280 LDA # <[GR0+40] ;next line 1290 STA SCR2 1300 LDA # >[GR0+40] 1310 STA SCR2+1 1320 LDX #0 ;counter 1330 SCMOVE LDY #39 ;move 40 bytes 1340 SCMOVIT LDA (SCR2),Y ;up 1350 STA (SCR),Y 1360 DEY ;done? 1370 BPL SCMOVIT ;no 1380 LDA SCR2+1 ;reset pntrs 1390 STA SCR+1 1400 LDA SCR2 1410 STA SCR 1420 CLC ;add 40 to 1430 ADC #$28 ;from pntr 1440 STA SCR2 1450 LDA SCR2+1 1460 ADC #0 1470 STA SCR2+1 1480 INX 1490 CPX #23 ;23 lines? 1500 BCC SCMOVE ;no 1510 DEC ROWCRS ;cursor up 1 1511 DEC ROWX 1520 JMP SCROLL ;need more? 1530 SCMOVEDN RTS ;done 1540 ; 1550 ;Convert ASCII to Internal Code 1560 ; 1570 ASC2IC JSR BITER 1580 ORA A2I,X 1590 LDX X2 1600 RTS 1610 ; 1620 BITER PHA ;save byte 1630 ROL A ;X16 1640 ROL A 1650 ROL A 1660 ROL A 1670 AND #3 ;type of char 1680 STX X2 ;save x 1690 TAX ;offset 1700 PLA ;restore 1710 AND #$9F 1720 RTS 1730 ; 1740 ;Get a Key 1750 ; 1760 INPKEY LDA CH ;get key 1770 CMP #$FF ;none pressed 1780 BEQ INPKEY ;yup 1790 LDX #$FF ;reset 1800 STX CH 1810 LDX #25 ;a-z? 1820 IN1 CMP KEYC,X 1830 BEQ IN2 ;yes 1840 DEX 1850 BPL IN1 1860 LDX #5 ;special key 1870 IN3 CMP OKEY,X 1880 BEQ IN4 ;yes 1890 DEX 1900 BPL IN3 1910 BMI K2 1920 IN4 LDA ASCK,X ;get ascii 1930 JMP CLKER ;make sound 1940 IN7 JMP INPKEY ;get key 1950 ; 1960 IN2 TXA ;see if caps 1970 CLC ;needed 1980 ADC CAPS 1990 JMP CLKER 2000 ; 2010 K2 CMP #$3C ;caps key? 2020 BNE IN7 ;no 2030 LDA CAPS 2040 CMP #$61 ;lower? 2050 BEQ IN5 ;yes 2060 LDA #$61 ;flip 2070 IN6 STA CAPS ;switch it 2080 JMP INPKEY ;get a key 2090 IN5 LDA #$41 ;upper case 2100 BNE IN6 2110 ; 2120 CLKER LDY #$7F ;make a key 2130 CK1 STY CONSOL ;click 2140 LDX #8 2150 CK2 DEX 2160 BNE CK2 2170 DEY 2180 BPL CK1 2190 RTS 2200 ; 2210 ;print with word wrap 2220 ;uses PBUF as output 2230 ;Enter with X, Y as Low 2240 ;and High byte of Address 2250 ; 2260 PRINTE STX ML ;X =Low 2270 STY ML+1 ;Y = High 2280 LDY #0 ;if 1st byte 2290 LDA (ML),Y ;is $FF no 2300 CMP #$FF ;message,so 2310 BNE PE7 ;quit 2320 RTS 2330 PE7 JSR POSITION ;get screen 2340 LDY #0 ;position-set 2350 STY EOLF ;end flag 2360 PE3 LDA (ML),Y ;get byte 2370 STA PBUF,Y ;put in buffer 2380 INY 2390 CMP #$00 ;end of msg? 2400 BNE PE1 ;no 2410 INC EOLF ;set flag 2420 BNE SPLP 2430 PE1 CPY #ENLIN ;at end of 2440 BNE PE3 ;physical line? 2450 DEY 2460 SPLP LDA (ML),Y ;find space 2470 CMP #$20 ;for word wrap 2480 BEQ GTSP 2490 DEY ;back up 2500 BNE SPLP 2510 LDY #ENLIN-1 2520 GTSP INY ;break 2530 SPCE STY Y2 ;save position 2540 LDA #0 ;set 0 as 2550 STA PBUF,Y ;end flag 2560 TYA ;move pointer 2570 CLC ;in message 2580 ADC ML 2590 STA ML 2600 BCC PE2 2610 INC ML+1 2620 PE2 LDY #2 ;left margin 2630 PE5 LDA PBUF-2,Y ;get byte 2640 BEQ PE6 ;end if 0 2650 JSR ASC2IC ;convert 2660 STA (SL),Y ;on screen 2670 JSR JIFF ;wait a jiff 2680 INY ;next char 2690 BNE PE5 2700 PE6 JSR CR ;linefeed 2710 LDA EOLF ;end? 2720 BNE EDON ;yes 2730 JMP PE7 ;do more 2740 EDON JSR SCROLL ;see if scroll 2750 RTS ;done 2760 ; 2770 ;Force a Carriage Return 2780 ; 2790 CR INC ROWCRS ;next line 2800 LDA #2 ;left margin 2810 STA COLCRS 2820 RTS 2830 ; 2840 ;Input Routine 2850 ; 2860 INPUT JSR POSITION ;get screen 2870 LDY COLCRS ;position 2880 DEY ;back up 2890 LDA #$1E ;' > ' ;for 2900 STA (SL),Y ;prompt 2910 LDX #0 ;input 2920 STX X1 ;counter 2930 LDA #$50 ;max input 2940 STA MAXLEN 2950 LDA COLCRS ;save current 2960 STA COLX ;position for 2970 LDA ROWCRS ;del-bck spc 2980 STA ROWX 2990 JSR POSITION 3000 JSR SHOCRS ;show the cursor 3010 ; 3020 INLOOP JSR INPKEY ;loop until 3030 CMP #EOL ;end of line 3040 BEQ INDONE 3050 CMP #$7E ;DEL BCK SPC 3060 BEQ DELETE 3070 CMP #$7D ;clear screen 3080 BEQ SCLEAR 3090 LDX X1 ;at end? 3100 CPX MAXLEN 3110 BCS INLOOP ;yes-get EOL 3120 PHA ;save char 3130 JSR PUTCHR ;onto screen 3140 LDX X1 3150 PLA ;get it back 3160 CMP #$60 ;lower case? 3170 BCC NOLO ;no 3180 SEC 3190 SBC #$20 ;make it upper 3200 NOLO STA IBUF,X ;in input 3210 INC X1 ;buffer 3220 JMP INLOOP ;more? 3230 ; 3240 INDONE LDX X1 ;all done 3250 STA IBUF,X 3260 JSR ZAPCRS ;erase cursor 3270 JSR CR 3280 JSR SCROLL ;need to 3290 RTS ;scroll? 3300 ; 3310 ;Clear the Screen 3320 ; 3330 SCLEAR JSR CLRGR0 3340 JMP INPUT 3350 ; 3360 ;Delete a character 3370 ; 3380 DELETE LDA COLCRS ;was there 3390 CMP COLX ;any input? 3400 BNE DDEL ;yes 3410 LDA ROWCRS ;same line? 3420 CMP ROWX 3430 BEQ NODEL ;yes no DEL 3440 JSR ZAPCRS ;erase cursor 3450 DEC ROWCRS ;up 1 line 3460 LDA #$27 ;right edge 3470 STA COLCRS 3480 JMP DHI ;show cursor 3490 ; 3500 DDEL JSR ZAPCRS ;erase cursor 3510 DEC COLCRS ;back up 3520 DHI JSR POSITION ;new position 3530 LDA #$3F ;show cursor 3540 LDY COLCRS 3550 STA (SL),Y 3560 DEC X1 ;1 less char 3570 NODEL JMP INLOOP ;get input 3580 ; 3590 ;Erase the cursor 3600 ; 3610 ZAPCRS JSR POSITION 3620 LDY COLCRS 3630 LDA #0 3640 STA (SL),Y 3650 RTS 3660 ; 3670 ;Put a Character on the Screen 3680 ; 3690 PUTCHR PHA ;save it 3700 JSR POSITION ;get position 3710 PLA ;retrieve it 3720 JSR ASC2IC ;to Int Code 3730 LDY COLCRS ;get column 3740 STA (SL),Y ;on screen 3750 INC COLCRS ;next column 3760 LDA COLCRS 3770 CMP #$28 ;at right edge? 3780 BNE PCO ;no 3790 LDA #2 ;yes-reset 3800 STA COLCRS 3810 INC ROWCRS ;next line 3820 JSR SCROLL ;scroll? 3830 PCO JSR SHOCRS ;show cursor 3840 RTS 3850 ; 3860 ;Show the Underline as a 3870 ;cursor 3880 ; 3890 SHOCRS JSR POSITION 3900 LDA #$3F 3910 LDY COLCRS 3920 STA (SL),Y 3930 RTS