1;
2; Maciej 'YTM/Elysium' Witkowiak
3;
4; 27.10.2001
5; 06.03.2002
6; 25.07.2005
7
8; void cputcxy (unsigned char x, unsigned char y, char c);
9; void cputc (char c);
10
11; TODO:
12; TAB (should be implemented)
13; other special characters directly from keyboard are unsafe, though some might be
14; implemented:
15; HOME, UPLINE, ULINEON, ULINEOFF, REV_ON, REV_OFF, BOLDON, ITALICON, OUTLINEON, PLAINTEXT
16; and cursor movement, maybe stuff like INSERT too
17;
18; these must be ignored:
19; ESC_GRAPHICS, ESC_RULER, GOTOX, GOTOY, GOTOXY, NEWCARDSET, all 1..8
20;
21; note that there are conflicts between control characters and keyboard:
22; HOME = KEY_ENTER, KEY_HOME = REV_ON,
23; UPLINE = ?, KEY_UPARROW = GOTOY, ...
24
25            .export _cputcxy, _cputc
26            .import gotoxy, fixcursor
27            .import xsize,ysize
28            .importzp cursor_x, cursor_y, cursor_c, cursor_r
29
30            .include "const.inc"
31            .include "geossym.inc"
32            .include "jumptab.inc"
33
34_cputcxy:
35        pha                     ; Save C
36        jsr gotoxy              ; Set cursor, drop x and y
37        pla                     ; Restore C
38
39; Plot a character - also used as internal function
40
41_cputc:
42        tax                     ; save character
43; some characters 0-31 are not safe for PutChar
44        cmp #$20
45        bcs L1
46        cmp #CR
47        beq do_cr
48        cmp #LF
49        beq do_lf
50        cmp #KEY_DELETE
51        bne L0
52        ldx #BACKSPACE
53        sec
54        bcs L2
55L0:     rts
56
57L1:     clc
58L2:     php
59        lda cursor_x
60        sta r11L
61        lda cursor_x+1
62        sta r11H
63        lda cursor_y
64        clc
65        adc #6                  ; 6 pixels down to the baseline
66        sta r1H
67        txa
68        jsr PutChar
69        plp
70        bcs fix_cursor
71
72        inc cursor_c
73        lda cursor_c
74        cmp xsize               ; hit right margin?
75        bne fix_cursor
76        lda #0                  ; yes - do cr+lf
77        sta cursor_c
78do_lf:  inc cursor_r
79        lda cursor_r
80        cmp ysize               ; hit bottom margin?
81        bne fix_cursor
82        dec cursor_r            ; yes - stay in the last line
83
84fix_cursor:
85        jmp fixcursor
86
87do_cr:  lda #0
88        sta cursor_c
89        beq fix_cursor
90