-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinput5.6502
More file actions
135 lines (104 loc) · 3.06 KB
/
input5.6502
File metadata and controls
135 lines (104 loc) · 3.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
; input5 :: get 5 uppercase letters from the user
;
; An example of a text input routine.
;
; Chris Tyler 2023-01-12
; (C)2023 Seneca College of Applied Arts and Technology
; Licensed under the terms of the GPL v2+ - See the
; LICENSE or COPYING file for details.
;
; Works with the 6502 emulator at http://6502.cdot.systems
;
; ROM routines
define SCINIT $ff81 ; initialize/clear screen
define CHRIN $ffcf ; input character from keyboard
define CHROUT $ffd2 ; output character to screen
define SCREEN $ffed ; get screen size
define PLOT $fff0 ; get/set cursor coordinates
; Memory locations
define INPUT $2000 ; input buffer (up to 5 chars)
;
; This routine get a 5-character word from the user. Only letters
; can be accumulated. The backspace key deletes the last character
; if the character count is >0. The ENTER key accepts the input
; if the character count is 5. Lower case letters are converted to
; UPPERCASE.
JSR SCINIT
LDY #$00
PROMPT_CHAR:
LDA PROMPT_TEXT,Y
BEQ DONE_PROMPT
JSR CHROUT
INY
BNE PROMPT_CHAR
DONE_PROMPT:
JSR GET_INPUT
LDA #$0D
JSR CHROUT
LDY #$00
INPUT_PRINT:
LDA INPUT,Y
JSR CHROUT
INY
CPY #$05
BNE INPUT_PRINT
BRK
PROMPT_TEXT:
dcb "E","n","t","e","r",32,"a",32,"5","-","l","e"
dcb "t","t","e","r",32,"w","o","r","d",":",32,00
; ---------------------------------------------------------------
GET_INPUT:
LDA #$A0 ; CODE FOR BLACK SPACE
JSR CHROUT
LDA #$83 ; CODE TO MOVE CURSOR LEFT ONE POSITION
JSR CHROUT
LDY #$00 ; COUNT OF CHARACTERS TYPED
GET_CHAR:
JSR CHRIN
CMP #$00
BEQ GET_CHAR
CMP #$08 ; COMPARE INPUT CHAR WITH BACKSPACE
BNE CHECK_ENTER ; ... IF NOT BS, THEN CHECK FOR ENTER
CPY #$00 ; COMPARE CHAR COUNT WITH 0
BEQ GET_CHAR ; ... IF EQUAL THEN GET ANOTHER CHAR
DEY
LDA #$20 ; LOAD A WITH CODE FOR WHITE SPACE
JSR CHROUT
LDA #$83 ; CODE TO MOVE CURSOR LEFT ONE POSITION
JSR CHROUT
JSR CHROUT
LDA #$A0 ; CODE FOR BLACK SPACE
JSR CHROUT
LDA #$83 ; CODE TO MOVE CURSOR LEFT ONE POSITION
JSR CHROUT
CHECK_ENTER:
CMP #$0D ; COMPARE INPUT CHAR WITH ENTER
BNE CHECK_LETTER ; ... IF NOT ENTER, CHECK FOR LETTERS
CPY #$05 ; SEE IF WE HAVE 5 CHARACTERS
BEQ DONE_INPUT ; IF WE HAVE 5 CHARS, AND THE USER PRESSED ENTER, DONE!
CHECK_LETTER:
CMP #97 ; COMPARE INPUT CHAR WITH 'a'
BCC UPPERCASE ; ... IF LOWER, CHECK IF IT'S UPPERCASE
CMP #123 ; COMPARE INPUT CHAR WITH 'z' + 1
BCS GET_CHAR ; ... IF HIGHER THAN 'z' THEN GET ANOTHER CHAR
SEC
SBC #32 ; SUBTRACT 32 TO CONVERT lowercase TO UPPERCASE
UPPERCASE:
CMP #65 ; COMPARE INPUT CHAR WITH A C=1 IF A>=65 ; C=0 IF A<65
BCC GET_CHAR ; ... IF LOWER THAN 'A' THEN GET ANOTHER CHAR
CMP #91 ; COMPARE INPUT CHAR WITH Z + 1
BCS GET_CHAR ; ... IF HIGHER THAN 'Z' THEN GET ANOTHER CHAR
CPY #$05 ; CHECK THE COUNT OF CHARACTERS
BEQ GET_CHAR ; ... IF WE HAVE 5 WE CAN'T ACCEPT ANOTHER ONE
STA INPUT,Y
JSR CHROUT ; PRINT RECEIVED LETTER ON THE SCREEN
LDA #$A0 ; CODE FOR BLACK SPACE
JSR CHROUT
LDA #$83 ; CODE TO MOVE CURSOR LEFT ONE POSITION
JSR CHROUT
INY
JMP GET_CHAR
DONE_INPUT:
LDA #$20 ; LOAD A WITH CODE FOR WHITE SPACE
JSR CHROUT
RTS