1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-26 05:29:30 +00:00

initial commit of soft80 implementation

This commit is contained in:
mrdudz 2015-09-27 18:12:25 +02:00
parent 067956b808
commit 9e08c53b01
13 changed files with 1351 additions and 0 deletions

58
libsrc/c64/extra/soft80.s Normal file
View File

@ -0,0 +1,58 @@
; soft80_cgetc.s
.import soft80_cgetc
.export _cgetc := soft80_cgetc
; soft80_chline.s
.import soft80_chlinexy
.import soft80_chline
.export _chlinexy := soft80_chlinexy
.export _chline := soft80_chline
; soft80_color.s
.import soft80_textcolor
.import soft80_bgcolor
.import soft80_bordercolor
.export _textcolor := soft80_textcolor
.export _bgcolor := soft80_bgcolor
.export _bordercolor := soft80_bordercolor
; soft80_cputc.s
.import soft80_cputc
.import soft80_cputcxy
.import soft80_cputdirect
.import soft80_putchar
.import soft80_newline
.import soft80_plot
.export _cputc := soft80_cputc
.export _cputcxy := soft80_cputcxy
.export cputdirect := soft80_cputdirect
.export putchar := soft80_putchar
.export newline := soft80_newline
.export plot := soft80_plot
; soft80_cvline.s
.import soft80_cvlinexy
.import soft80_cvline
.export _cvlinexy := soft80_cvlinexy
.export _cvline := soft80_cvline
; soft80_kclrscr.s
.import soft80_kclrscr
.export _clrscr := soft80_kclrscr
.export CLRSCR := soft80_kclrscr
; soft80_kplot.s
.import soft80_kplot
.export PLOT := soft80_kplot
; soft80_kscreen.s
.import soft80_kscreen
.export SCREEN := soft80_kscreen
;-------------------------------------------------------------------------------
; force the init constructor to be imported
.import soft80_init
conio_init = soft80_init

29
libsrc/c64/soft80.inc Normal file
View File

@ -0,0 +1,29 @@
; ram under i/o
soft80_lo_charset = $d000
soft80_hi_charset = $d400
soft80_vram = $d800
soft80_colram = $d800 ; color ram (used for temp. storage)
; ram under kernel
soft80_bitmap = $e000
charsperline = 80
screenrows = 25
CH_ESC = 95
CH_HLINE = 96
CH_CROSS = 123
CH_VLINE = 125
CH_PI = 126
; FIXME: these are defined in cbm.h normally, the putchar stuff should accept
; the regular codes instead of the following ones:
CH_LTEE = 171-160
CH_URCORNER = 174-160
CH_LLCORNER = 173-160
CH_ULCORNER = 176-160
CH_BTEE = 177-160
CH_TTEE = 178-160
CH_RTEE = 179-160
CH_LRCORNER = 189-160

90
libsrc/c64/soft80_cgetc.s Normal file
View File

@ -0,0 +1,90 @@
;
; char cgetc (void);
;
.export soft80_cgetc
.import cursor ; FIX/CHECK
.import putcolor ; FIX/CHECK
.include "c64.inc"
.include "soft80.inc"
soft80_cgetc:
lda KEY_COUNT ; Get number of characters
bne L3 ; Jump if there are already chars waiting
; Switch on the cursor if needed
lda cursor
jsr setcursor ; set cursor on or off accordingly
L1: lda KEY_COUNT ; wait for key
beq L1
ldx #0
lda CURS_FLAG
bne L2
inx
L2: txa
jsr setcursor
L3: jsr KBDREAD ; Read char and return in A
ldx #0
rts
; Switch the cursor on or off
; A= 0: cursor off
; 1: cursor on
.proc setcursor
; On or off?
cmp CURS_STATE
bne @set
rts
@set:
sta CURS_STATE
sei
lda $01
pha
lda #$34
sta $01
jsr putcolor
ldy #$00
lda CURS_X
and #$01
bne @l1
.repeat 8,line
lda (SCREEN_PTR),y
eor #$f0
sta (SCREEN_PTR),y
.if (line < 7)
iny
.endif
.endrepeat
@back:
pla
sta $01
cli
rts
@l1:
.repeat 8,line
lda (SCREEN_PTR),y
eor #$0f
sta (SCREEN_PTR),y
.if line < 7
iny
.endif
.endrepeat
jmp @back
.endproc

290
libsrc/c64/soft80_charset.s Normal file
View File

@ -0,0 +1,290 @@
; FIXME: generate charset at runtime
soft80_lo_charset0:
.byte $0f,$03,$0f,$00,$0f,$07,$05,$0e
.byte $0f,$05,$0e,$0b,$0f,$0b,$0f,$0f
.byte $0f,$0b,$0f,$0b,$07,$07,$0e,$00
.byte $00,$0f,$0e,$0f,$0c,$0b,$03,$03
.byte $0f,$0b,$05,$05,$0b,$05,$0b,$0b
.byte $0d,$07,$0f,$0f,$0f,$0f,$0f,$0d
.byte $0b,$0b,$0b,$0b,$05,$01,$0b,$01
.byte $0b,$0b,$0f,$0f,$0d,$0f,$07,$0b
.byte $0b,$0f,$0f,$0f,$0f,$0f,$0f,$0f
.byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
.byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
.byte $0f,$0f,$0f,$09,$07,$03,$0b,$0f
.byte $0f,$0b,$03,$0b,$03,$01,$01,$0b
.byte $05,$01,$09,$05,$07,$05,$05,$0b
.byte $03,$0b,$03,$0b,$01,$05,$05,$05
.byte $05,$05,$01,$0b,$07,$0b,$0f,$0a
soft80_lo_charset1:
.byte $0f,$03,$0f,$0f,$0f,$07,$05,$0e
.byte $0f,$0a,$0e,$0b,$0f,$0b,$0f,$0f
.byte $0f,$0b,$0f,$0b,$07,$07,$0e,$00
.byte $00,$0f,$0e,$0f,$0c,$0b,$03,$03
.byte $0f,$0b,$05,$05,$09,$05,$05,$0b
.byte $0b,$0b,$05,$0b,$0f,$0f,$0f,$0d
.byte $05,$0b,$05,$05,$05,$07,$05,$05
.byte $05,$05,$0f,$0f,$0b,$0f,$0b,$05
.byte $05,$0f,$07,$0f,$0d,$0f,$09,$0f
.byte $07,$0b,$0d,$07,$03,$0f,$0f,$0f
.byte $0f,$0f,$0f,$0f,$0b,$0f,$0f,$0f
.byte $0f,$0f,$0f,$0b,$07,$0b,$0b,$0b
.byte $0f,$0b,$05,$05,$05,$07,$07,$05
.byte $05,$0b,$0d,$05,$07,$01,$01,$05
.byte $05,$05,$05,$05,$0b,$05,$05,$05
.byte $05,$05,$0d,$0b,$07,$0b,$0f,$0a
soft80_lo_charset2:
.byte $0f,$03,$0f,$0f,$0f,$07,$0a,$0e
.byte $0f,$05,$0e,$0b,$0f,$0b,$0f,$0f
.byte $0f,$0b,$0f,$0b,$07,$07,$0e,$0f
.byte $00,$0f,$0d,$0f,$0c,$0b,$03,$03
.byte $0f,$0b,$05,$00,$07,$0d,$0b,$07
.byte $0b,$0b,$0b,$0b,$0f,$0f,$0f,$0b
.byte $01,$03,$0d,$0d,$05,$03,$07,$0d
.byte $05,$05,$0b,$0b,$0b,$08,$0b,$0d
.byte $01,$0b,$07,$09,$0d,$0b,$0b,$09
.byte $07,$0f,$0f,$07,$0b,$05,$03,$0b
.byte $03,$09,$03,$09,$01,$05,$05,$05
.byte $05,$05,$01,$0b,$0b,$0b,$05,$0b
.byte $0f,$05,$05,$07,$05,$07,$07,$07
.byte $05,$0b,$0d,$03,$07,$01,$01,$05
.byte $05,$05,$05,$07,$0b,$05,$05,$05
.byte $0b,$05,$0b,$0b,$0b,$0b,$0a,$05
soft80_lo_charset3:
.byte $09,$03,$0f,$0f,$0f,$07,$0a,$0e
.byte $0f,$0a,$0e,$08,$0f,$08,$03,$0f
.byte $08,$00,$00,$03,$07,$07,$0e,$0f
.byte $0f,$0f,$05,$0f,$0c,$03,$03,$03
.byte $0f,$0b,$0f,$05,$0b,$0b,$0b,$0f
.byte $0b,$0b,$01,$01,$0f,$01,$0f,$0b
.byte $05,$0b,$0b,$0b,$01,$0d,$03,$0b
.byte $0b,$09,$0f,$0f,$07,$0f,$0d,$0b
.byte $01,$0d,$03,$07,$09,$05,$01,$05
.byte $03,$03,$0d,$05,$0b,$01,$05,$05
.byte $05,$05,$05,$07,$0b,$05,$05,$05
.byte $05,$05,$0d,$0b,$0b,$0b,$05,$00
.byte $00,$01,$03,$07,$05,$03,$03,$01
.byte $01,$0b,$0d,$03,$07,$05,$01,$05
.byte $03,$05,$03,$0b,$0b,$05,$05,$01
.byte $0b,$0b,$0b,$00,$0b,$0b,$05,$05
soft80_lo_charset4:
.byte $09,$03,$00,$0f,$0f,$07,$05,$0e
.byte $05,$05,$0e,$08,$0c,$08,$03,$0f
.byte $08,$00,$00,$03,$07,$07,$0e,$0f
.byte $0f,$0f,$03,$03,$0f,$03,$0f,$0c
.byte $0f,$0f,$0f,$00,$0d,$07,$04,$0f
.byte $0b,$0b,$0b,$0b,$0f,$0f,$0f,$0b
.byte $05,$0b,$07,$0d,$0d,$0d,$05,$0b
.byte $05,$0d,$0f,$0f,$0b,$08,$0b,$0b
.byte $07,$09,$05,$07,$05,$01,$0b,$05
.byte $05,$0b,$0d,$03,$0b,$01,$05,$05
.byte $05,$05,$07,$0b,$0b,$05,$05,$01
.byte $0b,$05,$0b,$0b,$0b,$0b,$0f,$00
.byte $00,$05,$05,$07,$05,$07,$07,$05
.byte $05,$0b,$0d,$03,$07,$05,$01,$05
.byte $07,$05,$03,$0d,$0b,$05,$05,$01
.byte $0b,$0b,$0b,$00,$07,$0b,$05,$0a
soft80_lo_charset5:
.byte $0f,$03,$00,$0f,$0f,$07,$05,$0e
.byte $05,$0a,$0e,$0b,$0c,$0f,$0b,$0f
.byte $0b,$0f,$0b,$0b,$07,$07,$0e,$0f
.byte $0f,$00,$03,$03,$0f,$0f,$0f,$0c
.byte $0f,$0f,$0f,$05,$03,$05,$05,$0f
.byte $0b,$0b,$05,$0b,$0b,$0f,$0b,$07
.byte $05,$0b,$07,$05,$0d,$05,$05,$0b
.byte $05,$05,$0b,$0b,$0b,$0f,$0b,$0f
.byte $05,$05,$05,$07,$05,$07,$0b,$09
.byte $05,$0b,$0d,$05,$0b,$05,$05,$05
.byte $03,$09,$07,$0d,$0b,$05,$0b,$01
.byte $05,$09,$07,$0b,$0d,$0b,$0f,$0b
.byte $0f,$05,$05,$05,$05,$07,$07,$05
.byte $05,$0b,$05,$05,$07,$05,$05,$05
.byte $07,$0b,$05,$05,$0b,$05,$0b,$05
.byte $05,$0b,$07,$0b,$07,$0b,$05,$0a
soft80_lo_charset6:
.byte $0f,$03,$00,$0f,$0f,$07,$0a,$0e
.byte $0a,$05,$0e,$0b,$0c,$0f,$0b,$00
.byte $0b,$0f,$0b,$0b,$07,$07,$0e,$0f
.byte $0f,$00,$07,$03,$0f,$0f,$0f,$0c
.byte $0f,$0b,$0f,$05,$0b,$05,$08,$0f
.byte $0d,$07,$0f,$0f,$0b,$0f,$0b,$07
.byte $0b,$01,$01,$0b,$0d,$0b,$0b,$0b
.byte $0b,$0b,$0f,$0b,$0d,$0f,$07,$0b
.byte $0b,$09,$03,$09,$09,$09,$0b,$0d
.byte $05,$01,$0d,$05,$01,$05,$05,$0b
.byte $07,$0d,$07,$03,$0d,$09,$0b,$05
.byte $05,$0d,$01,$09,$0d,$03,$0f,$0b
.byte $0f,$05,$03,$0b,$03,$01,$07,$0b
.byte $05,$01,$0b,$05,$01,$05,$05,$0b
.byte $07,$0d,$05,$0b,$0b,$0b,$0b,$05
.byte $05,$0b,$01,$0b,$0b,$0b,$05,$05
soft80_lo_charset7:
.byte $0f,$03,$00,$0f,$00,$07,$0a,$0e
.byte $0a,$0a,$0e,$0b,$0c,$0f,$0b,$00
.byte $0b,$0f,$0b,$0b,$07,$07,$0e,$0f
.byte $0f,$00,$0f,$03,$0f,$0f,$0f,$0c
.byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
.byte $0f,$0f,$0f,$0f,$07,$0f,$0f,$0f
.byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
.byte $0f,$0f,$0f,$07,$0f,$0f,$0f,$0f
.byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$03
.byte $0f,$0f,$03,$0f,$0f,$0f,$0f,$0f
.byte $07,$0d,$0f,$0f,$0f,$0f,$0f,$0f
.byte $0f,$03,$0f,$0f,$0f,$0f,$0f,$0f
.byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
.byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
.byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
.byte $0f,$0f,$0f,$0b,$0b,$0b,$0f,$05
soft80_hi_charset0:
.byte $f0,$30,$f0,$00,$f0,$70,$50,$e0
.byte $f0,$50,$e0,$b0,$f0,$b0,$f0,$f0
.byte $f0,$b0,$f0,$b0,$70,$70,$e0,$00
.byte $00,$f0,$e0,$f0,$c0,$b0,$30,$30
.byte $f0,$b0,$50,$50,$b0,$50,$b0,$b0
.byte $d0,$70,$f0,$f0,$f0,$f0,$f0,$d0
.byte $b0,$b0,$b0,$b0,$50,$10,$b0,$10
.byte $b0,$b0,$f0,$f0,$d0,$f0,$70,$b0
.byte $b0,$f0,$f0,$f0,$f0,$f0,$f0,$f0
.byte $f0,$f0,$f0,$f0,$f0,$f0,$f0,$f0
.byte $f0,$f0,$f0,$f0,$f0,$f0,$f0,$f0
.byte $f0,$f0,$f0,$90,$70,$30,$b0,$f0
.byte $f0,$b0,$30,$b0,$30,$10,$10,$b0
.byte $50,$10,$90,$50,$70,$50,$50,$b0
.byte $30,$b0,$30,$b0,$10,$50,$50,$50
.byte $50,$50,$10,$b0,$70,$b0,$f0,$a0
soft80_hi_charset1:
.byte $f0,$30,$f0,$f0,$f0,$70,$50,$e0
.byte $f0,$a0,$e0,$b0,$f0,$b0,$f0,$f0
.byte $f0,$b0,$f0,$b0,$70,$70,$e0,$00
.byte $00,$f0,$e0,$f0,$c0,$b0,$30,$30
.byte $f0,$b0,$50,$50,$90,$50,$50,$b0
.byte $b0,$b0,$50,$b0,$f0,$f0,$f0,$d0
.byte $50,$b0,$50,$50,$50,$70,$50,$50
.byte $50,$50,$f0,$f0,$b0,$f0,$b0,$50
.byte $50,$f0,$70,$f0,$d0,$f0,$90,$f0
.byte $70,$b0,$d0,$70,$30,$f0,$f0,$f0
.byte $f0,$f0,$f0,$f0,$b0,$f0,$f0,$f0
.byte $f0,$f0,$f0,$b0,$70,$b0,$b0,$b0
.byte $f0,$b0,$50,$50,$50,$70,$70,$50
.byte $50,$b0,$d0,$50,$70,$10,$10,$50
.byte $50,$50,$50,$50,$b0,$50,$50,$50
.byte $50,$50,$d0,$b0,$70,$b0,$f0,$a0
soft80_hi_charset2:
.byte $f0,$30,$f0,$f0,$f0,$70,$a0,$e0
.byte $f0,$50,$e0,$b0,$f0,$b0,$f0,$f0
.byte $f0,$b0,$f0,$b0,$70,$70,$e0,$f0
.byte $00,$f0,$d0,$f0,$c0,$b0,$30,$30
.byte $f0,$b0,$50,$00,$70,$d0,$b0,$70
.byte $b0,$b0,$b0,$b0,$f0,$f0,$f0,$b0
.byte $10,$30,$d0,$d0,$50,$30,$70,$d0
.byte $50,$50,$b0,$b0,$b0,$80,$b0,$d0
.byte $10,$b0,$70,$90,$d0,$b0,$b0,$90
.byte $70,$f0,$f0,$70,$b0,$50,$30,$b0
.byte $30,$90,$30,$90,$10,$50,$50,$50
.byte $50,$50,$10,$b0,$b0,$b0,$50,$b0
.byte $f0,$50,$50,$70,$50,$70,$70,$70
.byte $50,$b0,$d0,$30,$70,$10,$10,$50
.byte $50,$50,$50,$70,$b0,$50,$50,$50
.byte $b0,$50,$b0,$b0,$b0,$b0,$a0,$50
soft80_hi_charset3:
.byte $90,$30,$f0,$f0,$f0,$70,$a0,$e0
.byte $f0,$a0,$e0,$80,$f0,$80,$30,$f0
.byte $80,$00,$00,$30,$70,$70,$e0,$f0
.byte $f0,$f0,$50,$f0,$c0,$30,$30,$30
.byte $f0,$b0,$f0,$50,$b0,$b0,$b0,$f0
.byte $b0,$b0,$10,$10,$f0,$10,$f0,$b0
.byte $50,$b0,$b0,$b0,$10,$d0,$30,$b0
.byte $b0,$90,$f0,$f0,$70,$f0,$d0,$b0
.byte $10,$d0,$30,$70,$90,$50,$10,$50
.byte $30,$30,$d0,$50,$b0,$10,$50,$50
.byte $50,$50,$50,$70,$b0,$50,$50,$50
.byte $50,$50,$d0,$b0,$b0,$b0,$50,$00
.byte $00,$10,$30,$70,$50,$30,$30,$10
.byte $10,$b0,$d0,$30,$70,$50,$10,$50
.byte $30,$50,$30,$b0,$b0,$50,$50,$10
.byte $b0,$b0,$b0,$00,$b0,$b0,$50,$50
soft80_hi_charset4:
.byte $90,$30,$00,$f0,$f0,$70,$50,$e0
.byte $50,$50,$e0,$80,$c0,$80,$30,$f0
.byte $80,$00,$00,$30,$70,$70,$e0,$f0
.byte $f0,$f0,$30,$30,$f0,$30,$f0,$c0
.byte $f0,$f0,$f0,$00,$d0,$70,$40,$f0
.byte $b0,$b0,$b0,$b0,$f0,$f0,$f0,$b0
.byte $50,$b0,$70,$d0,$d0,$d0,$50,$b0
.byte $50,$d0,$f0,$f0,$b0,$80,$b0,$b0
.byte $70,$90,$50,$70,$50,$10,$b0,$50
.byte $50,$b0,$d0,$30,$b0,$10,$50,$50
.byte $50,$50,$70,$b0,$b0,$50,$50,$10
.byte $b0,$50,$b0,$b0,$b0,$b0,$f0,$00
.byte $00,$50,$50,$70,$50,$70,$70,$50
.byte $50,$b0,$d0,$30,$70,$50,$10,$50
.byte $70,$50,$30,$d0,$b0,$50,$50,$10
.byte $b0,$b0,$b0,$00,$70,$b0,$50,$a0
soft80_hi_charset5:
.byte $f0,$30,$00,$f0,$f0,$70,$50,$e0
.byte $50,$a0,$e0,$b0,$c0,$f0,$b0,$f0
.byte $b0,$f0,$b0,$b0,$70,$70,$e0,$f0
.byte $f0,$00,$30,$30,$f0,$f0,$f0,$c0
.byte $f0,$f0,$f0,$50,$30,$50,$50,$f0
.byte $b0,$b0,$50,$b0,$b0,$f0,$b0,$70
.byte $50,$b0,$70,$50,$d0,$50,$50,$b0
.byte $50,$50,$b0,$b0,$b0,$f0,$b0,$f0
.byte $50,$50,$50,$70,$50,$70,$b0,$90
.byte $50,$b0,$d0,$50,$b0,$50,$50,$50
.byte $30,$90,$70,$d0,$b0,$50,$b0,$10
.byte $50,$90,$70,$b0,$d0,$b0,$f0,$b0
.byte $f0,$50,$50,$50,$50,$70,$70,$50
.byte $50,$b0,$50,$50,$70,$50,$50,$50
.byte $70,$b0,$50,$50,$b0,$50,$b0,$50
.byte $50,$b0,$70,$b0,$70,$b0,$50,$a0
soft80_hi_charset6:
.byte $f0,$30,$00,$f0,$f0,$70,$a0,$e0
.byte $a0,$50,$e0,$b0,$c0,$f0,$b0,$00
.byte $b0,$f0,$b0,$b0,$70,$70,$e0,$f0
.byte $f0,$00,$70,$30,$f0,$f0,$f0,$c0
.byte $f0,$b0,$f0,$50,$b0,$50,$80,$f0
.byte $d0,$70,$f0,$f0,$b0,$f0,$b0,$70
.byte $b0,$10,$10,$b0,$d0,$b0,$b0,$b0
.byte $b0,$b0,$f0,$b0,$d0,$f0,$70,$b0
.byte $b0,$90,$30,$90,$90,$90,$b0,$d0
.byte $50,$10,$d0,$50,$10,$50,$50,$b0
.byte $70,$d0,$70,$30,$d0,$90,$b0,$50
.byte $50,$d0,$10,$90,$d0,$30,$f0,$b0
.byte $f0,$50,$30,$b0,$30,$10,$70,$b0
.byte $50,$10,$b0,$50,$10,$50,$50,$b0
.byte $70,$d0,$50,$b0,$b0,$b0,$b0,$50
.byte $50,$b0,$10,$b0,$b0,$b0,$50,$50
soft80_hi_charset7:
.byte $f0,$30,$00,$f0,$00,$70,$a0,$e0
.byte $a0,$a0,$e0,$b0,$c0,$f0,$b0,$00
.byte $b0,$f0,$b0,$b0,$70,$70,$e0,$f0
.byte $f0,$00,$f0,$30,$f0,$f0,$f0,$c0
.byte $f0,$f0,$f0,$f0,$f0,$f0,$f0,$f0
.byte $f0,$f0,$f0,$f0,$70,$f0,$f0,$f0
.byte $f0,$f0,$f0,$f0,$f0,$f0,$f0,$f0
.byte $f0,$f0,$f0,$70,$f0,$f0,$f0,$f0
.byte $f0,$f0,$f0,$f0,$f0,$f0,$f0,$30
.byte $f0,$f0,$30,$f0,$f0,$f0,$f0,$f0
.byte $70,$d0,$f0,$f0,$f0,$f0,$f0,$f0
.byte $f0,$30,$f0,$f0,$f0,$f0,$f0,$f0
.byte $f0,$f0,$f0,$f0,$f0,$f0,$f0,$f0
.byte $f0,$f0,$f0,$f0,$f0,$f0,$f0,$f0
.byte $f0,$f0,$f0,$f0,$f0,$f0,$f0,$f0
.byte $f0,$f0,$f0,$b0,$b0,$b0,$f0,$50

View File

@ -0,0 +1,28 @@
;
; void chlinexy (unsigned char x, unsigned char y, unsigned char length);
; void chline (unsigned char length);
;
.export soft80_chlinexy, soft80_chline
.import popa, _gotoxy, cputdirect ; FIX/CHECK
.importzp tmp1
soft80_chlinexy:
pha ; Save the length
jsr popa ; Get y
jsr _gotoxy ; Call this one, will pop params
pla ; Restore the length
soft80_chline:
cmp #0 ; Is the length zero?
beq L9 ; Jump if done
sta tmp1
L1: lda #96 ; Horizontal line, screen code
jsr cputdirect ; Direct output
dec tmp1
bne L1
L9: rts

100
libsrc/c64/soft80_color.s Normal file
View File

@ -0,0 +1,100 @@
;
; unsigned char __fastcall__ textcolor (unsigned char color);
; unsigned char __fastcall__ bgcolor (unsigned char color);
; unsigned char __fastcall__ bordercolor (unsigned char color);
;
.export soft80_textcolor, soft80_bgcolor, soft80_bordercolor
.export __textcolor,__bgcolor ; CHECK/FIX
.importzp tmp1,tmp2
.import soft80_checkchar
.include "c64.inc"
.include "soft80.inc"
soft80_textcolor:
ldx __textcolor ; get old value
sta __textcolor ; set new value
lda __bgcolor
asl a
asl a
asl a
asl a
ora __textcolor
sta CHARCOLOR
txa ; get old value
rts
soft80_bgcolor:
cmp __bgcolor
beq _donothing
ldx __bgcolor ; get old value
sta __bgcolor ; set new value
asl a
asl a
asl a
asl a
sta tmp2 ; shifted new value
ora __textcolor
sta CHARCOLOR ; text/bg combo for new chars
txa
pha ; save old value
sta tmp1
sei
lda $01
pha
lda #$34
sta $01
ldx #$00
lp2:
.repeat $4,page
.scope
lda soft80_vram+(page*$100),x
and #$0f
cmp tmp1 ; old bg color
bne as
; is old bg color
; is space
;lda __bgcolor
as:
ora tmp2 ; new bg color
sta soft80_vram+(page*$100),x
.endscope
.endrepeat
inx
bne lp2
pla
sta $01
cli
pla ; get old value
_donothing:
rts
soft80_bordercolor:
ldx VIC_BORDERCOLOR ; get old value
sta VIC_BORDERCOLOR ; set new value
txa
rts
; FIXME: shouldnt they be in zeropage?
.bss
__textcolor:
.res 1
__bgcolor:
.res 1

74
libsrc/c64/soft80_conio.s Normal file
View File

@ -0,0 +1,74 @@
;
; Low level stuff for screen output/console input
;
.constructor soft80_init, 24
.destructor soft80_shutdown
.import soft80_kclrscr, soft80_plotinit
.import __textcolor, __bgcolor ; CHECK/FIX
.include "c64.inc"
.include "soft80.inc"
soft80_init:
lda #$3b
sta VIC_CTRL1
lda #$00
sta CIA2_PRA
lda #$68
sta VIC_VIDEO_ADR
lda #$c8
sta VIC_CTRL2
; copy charset to RAM under I/O -> FIXME: generate at runtime
sei
lda $01
pha
lda #$34
sta $01
lda #>soft80_lo_charset0
sta @hi1+2
lda #>$d000
sta @hi2+2
ldy #8
@l2:
ldx #0
@l1:
@hi1: lda soft80_lo_charset0,x
@hi2: sta $d000,x
inx
bne @l1
inc @hi1+2
inc @hi2+2
dey
bne @l2
pla
sta $01
cli
jsr soft80_plotinit
lda #1
sta __textcolor
lda #0
sta __bgcolor
jmp soft80_kclrscr
soft80_shutdown:
lda #$1b
sta VIC_CTRL1
lda #$03
sta CIA2_PRA
lda #$15
sta VIC_VIDEO_ADR
rts
; FIXME: generate the charset at init time, and put it into RAM under I/O
.include "soft80_charset.s"

419
libsrc/c64/soft80_cputc.s Normal file
View File

@ -0,0 +1,419 @@
;
; void cputcxy (unsigned char x, unsigned char y, char c);
; void cputc (char c);
;
.export soft80_cputcxy, soft80_cputc
.export soft80_cputdirect, soft80_putchar
.export putcolor ; FIX/CHECK
.export soft80_newline, soft80_plot
.import popa, _gotoxy
.import xsize
.import PLOT ; FIX/CHECK
.importzp tmp4,tmp3
.import __bgcolor ; FIX/CHECK
.macpack longbranch
.include "c64.inc"
.include "soft80.inc"
soft80_cputcxy:
pha ; Save C
jsr popa ; Get Y
jsr _gotoxy ; Set cursor, drop x
pla ; Restore C
; Plot a character - also used as internal function
soft80_cputc:
cmp #$0A ; CR?
bne L1
lda #0
sta CURS_X
; Set cursor position, calculate RAM pointers
soft80_plot:
ldx CURS_Y
ldy CURS_X
clc
jmp PLOT ; Set the new cursor
L1: cmp #$0D ; LF?
beq soft80_newline ; Recalculate pointers
; Printable char of some sort
tay
bpl L10
clc
adc #$20
and #$7F
L10:
soft80_cputdirect:
jsr soft80_putchar ; Write the character to the screen
; Advance cursor position
advance:
iny
cpy #charsperline
beq L3
sty CURS_X
tya
and #$01
bne @L5
lda SCREEN_PTR
clc
adc #8
sta SCREEN_PTR
bcc @L4
inc SCREEN_PTR+1
@L4:
inc CRAM_PTR
bne @L5
inc CRAM_PTR+1
@L5:
rts
L3:
inc CURS_Y ; new line
ldy #0 ; + cr
sty CURS_X
jmp soft80_plot
soft80_newline:
lda SCREEN_PTR
clc
adc #<(40*8)
sta SCREEN_PTR
lda SCREEN_PTR+1
adc #>(40*8)
sta SCREEN_PTR+1
lda CRAM_PTR
clc
adc #40
sta CRAM_PTR
bcc L5
inc CRAM_PTR+1
L5:
inc CURS_Y
rts
; Write one character to the screen without doing anything else
; in: A: character
; returns: Y: cursor X position
; this function is going to be used a lot so we unroll it a bit for speed
;--- start color vodoo
; remove color from cell
; y unmodified
remcolor:
;ldy #$00 ; is still $00
lda (CRAM_PTR),y ; vram
and #$0f
cmp __bgcolor
jeq @l2b ; vram==bgcolor
inc $01
lda (CRAM_PTR),y ; colram
stx $01 ;$34
and #$0f
cmp __bgcolor
beq @l2s ; colram==bgcolor
; vram = colram
;inc $01
;lda (CRAM_PTR),y ; colram
;stx $01 ;$34
;and #$0f
sta tmp3
lda (CRAM_PTR),y ; vram
and #$f0
ora tmp3
sta (CRAM_PTR),y ; vram
; colram = bgcolor
lda __bgcolor
inc $01
sta (CRAM_PTR),y ; colram
stx $01 ;$34
jmp @l2b
@l2s:
; colram is bgcolor
; => only one char in cell used
jsr soft80_checkchar
bcc @l2b ; space at current position
; vram = bgcolor
lda (CRAM_PTR),y ; vram
and #$f0
ora __bgcolor
sta (CRAM_PTR),y ; vram
@l2b:
rts
; put color to cell
; y unmodified
putcolor:
;ldy #$00 ; is still $00
lda (CRAM_PTR),y ; vram
and #$0f
cmp __bgcolor
beq @l2s ; vram==bgcolor => first char in cell
; vram!=bgcolor => second char in cell
inc $01 ;$35
lda (CRAM_PTR),y ; colram
stx $01 ;$34
and #$0f
cmp __bgcolor
bne @l2s ; colram!=bgcolor
; colram==bgcolor => second char in cell or overwrite 1st char
jsr soft80_checkchar
bcs @l2a ; char at current position => overwrite 1st
; colram=vram
lda (CRAM_PTR),y ; vram
inc $01
sta (CRAM_PTR),y ; colram
stx $01 ;$34
;jmp @l2a
@l2s:
; colram!=bgcolor => alread 2 chars in cell
@l2a:
; Set color
lda CHARCOLOR
sta (CRAM_PTR),y ; vram
rts
;--- end color vodoo
.export soft80_checkchar
; test if there is a space or a character at current position
; CLC: space SEC: character
soft80_checkchar:
;ldy #$00 ; is still $00
lda CURS_X
and #$01
jne @l1a
.repeat 8,line
lda (SCREEN_PTR),y
and #$f0
cmp #$f0
bne @l2b
.if (line < 7)
iny
.endif
.endrepeat
ldy #$00
clc
rts
@l2b:
ldy #$00
sec
rts
@l1a:
.repeat 8,line
lda (SCREEN_PTR),y
and #$0f
cmp #$0f
bne @l2bb
.if line < 7
iny
.endif
.endrepeat
ldy #$00
clc
rts
@l2bb:
ldy #$00
sec
rts
; output space
_space:
lda RVS
jne _spaceinvers
jsr remcolor
;ldy #$00 ; is still $00
lda CURS_X
and #$01
bne @l1
.repeat 8,line
lda (SCREEN_PTR),y
ora #$f0
sta (SCREEN_PTR),y
.if (line < 7)
iny
.endif
.endrepeat
jmp _back
@l1:
.repeat 8,line
lda (SCREEN_PTR),y
ora #$0f
sta (SCREEN_PTR),y
.if line < 7
iny
.endif
.endrepeat
@l2:
jmp _back
; output inverted space
_spaceinvers:
jsr putcolor
lda CURS_X
and #$01
bne @l1
.repeat 8,line
lda (SCREEN_PTR),y
and #$0f
sta (SCREEN_PTR),y
.if line < 7
iny
.endif
.endrepeat
jmp _back
@l1:
.repeat 8,line
lda (SCREEN_PTR),y
and #$f0
sta (SCREEN_PTR),y
.if line < 7
iny
.endif
.endrepeat
jmp _back
; output a character
soft80_putchar:
sta tmp3
sei
ldx $01
stx tmp4
ldx #$34
stx $01 ; will stay $34 for space
ldy #$00 ; will be $00 from now on
cmp #' ' ; space is a special (optimized) case
jeq _space
jsr putcolor
; output character
char:
ldx tmp3
lda RVS
jne _invers
lda CURS_X
and #$01
bne @l1
.repeat 8,line
lda (SCREEN_PTR),y
and #$0f
ora soft80_hi_charset+(line*$80),x
sta (SCREEN_PTR),y
.if line < 7
iny
.endif
.endrepeat
jmp @l2
@l1:
.repeat 8,line
lda (SCREEN_PTR),y
and #$f0
ora soft80_lo_charset+(line*$80),x
sta (SCREEN_PTR),y
.if line < 7
iny
.endif
.endrepeat
@l2:
_back:
lda tmp4
sta $01
cli
ldy CURS_X
rts
; output inverted character
_invers:
lda CURS_X
and #$01
bne @l1
.repeat 8,line
lda (SCREEN_PTR),y
ora #$f0
eor soft80_hi_charset+(line*$80),x
sta (SCREEN_PTR),y
.if line < 7
iny
.endif
.endrepeat
jmp _back
@l1:
.repeat 8,line
lda (SCREEN_PTR),y
ora #$0f
eor soft80_lo_charset+(line*$80),x
sta (SCREEN_PTR),y
.if line < 7
iny
.endif
.endrepeat
jmp _back

View File

@ -0,0 +1,28 @@
;
; void cvlinexy (unsigned char x, unsigned char y, unsigned char length);
; void cvline (unsigned char length);
;
.export soft80_cvline, soft80_cvlinexy
.import popa, _gotoxy, putchar, newline ; CHECK/FIX
.importzp tmp1
soft80_cvlinexy:
pha ; Save the length
jsr popa ; Get y
jsr _gotoxy ; Call this one, will pop params
pla ; Restore the length and run into soft80_cvlinexy
soft80_cvline:
cmp #0 ; Is the length zero?
beq L9 ; Jump if done
sta tmp1
L1: lda #125 ; Vertical bar
jsr putchar ; Write, no cursor advance
jsr newline ; Advance cursor to next line
dec tmp1
bne L1
L9: rts

View File

@ -0,0 +1,60 @@
.export soft80_kclrscr
.import soft80_kplot
.import __bgcolor ; FIX/CHECK
.include "c64.inc"
.include "soft80.inc"
soft80_kclrscr:
lda #$ff
ldx #$00
lp1:
.repeat $20,page
sta soft80_bitmap+(page*$100),x
.endrepeat
inx
bne lp1
sei
ldy $01
lda #$34
sta $01
lda CHARCOLOR
and #$f0
ora __bgcolor
;ldx #$00
lp2:
.repeat $4,page
sta soft80_vram+(page*$100),x
.endrepeat
inx
bne lp2
inc $01
lda __bgcolor
;ldx #$00
lp3:
.repeat $4,page
sta soft80_colram+(page*$100),x
.endrepeat
inx
bne lp3
sty $01
cli
ldx #0
ldy #0
clc
jmp soft80_kplot

101
libsrc/c64/soft80_kplot.s Normal file
View File

@ -0,0 +1,101 @@
.export soft80_kplot
.export soft80_plotinit
.include "c64.inc"
.include "soft80.inc"
soft80_kplot:
bcs @getpos
; calc pointer to bitmap
lda _bitmaplo,x
clc
adc _bitmapxlo,y
sta SCREEN_PTR
lda _bitmaphi,x
adc _bitmapxhi,y
sta SCREEN_PTR+1
; calc pointer to vram
tya
lsr a
clc
adc _vramlo,x
sta CRAM_PTR
lda #0
adc _vramhi,x
sta CRAM_PTR+1
@getpos:
ldx CURS_Y
ldy CURS_X
rts
; FIXME: perhaps just include the respective tables directly?
soft80_plotinit:
; create screen-rows base tables (bitmap)
lda #<soft80_bitmap
sta SCREEN_PTR
lda #>soft80_bitmap
sta SCREEN_PTR+1
ldx #$00
l1:
lda SCREEN_PTR
sta _bitmaplo,x
clc
adc #<(40*8)
sta SCREEN_PTR
lda SCREEN_PTR+1
sta _bitmaphi,x
adc #>(40*8)
sta SCREEN_PTR+1
inx
cpx #25
bne l1
; create screen-rows base tables (colorram)
lda #<soft80_vram
sta CRAM_PTR
lda #>soft80_vram
sta CRAM_PTR+1
ldx #$00
l1b:
lda CRAM_PTR
sta _vramlo,x
clc
adc #<(40)
sta CRAM_PTR
lda CRAM_PTR+1
sta _vramhi,x
adc #>(40)
sta CRAM_PTR+1
inx
cpx #25
bne l1b
rts
_bitmapxlo:
.repeat 80,col1
.byte <((col1/2)*8)
.endrepeat
_bitmapxhi:
.repeat 80,col
.byte >((col/2)*8)
.endrepeat
.bss
_vramlo:
.res 25
_vramhi:
.res 25
_bitmaplo:
.res 25
_bitmaphi:
.res 25

View File

@ -0,0 +1,9 @@
.export soft80_kscreen
.include "soft80.inc"
soft80_kscreen:
ldy #screenrows
ldx #charsperline
rts

65
testcode/lib/conio.c Normal file
View File

@ -0,0 +1,65 @@
#include <conio.h>
#include <string.h>
#include <stdlib.h>
void main(void)
{
int i, j;
unsigned char xsize, ysize, n;
clrscr();
screensize(&xsize, &ysize);
cputs("cc65 conio test");
cputsxy(0, 2, "colors:" );
for (i = 3; i < 6; ++i) {
gotoxy(i,i);
for (j = 0; j < 16; ++j) {
textcolor(j);
cputc('X');
}
}
textcolor(1);
cprintf("\n\n\rscreensize is: %dx%d", xsize, ysize );
chlinexy(0,10,xsize);
cvlinexy(0,10,3);
chlinexy(0,12,xsize);
cvlinexy(xsize-1,10,3);
cputcxy(0,10,CH_ULCORNER);
cputcxy(xsize-1,10,CH_URCORNER);
cputcxy(0,12,CH_LLCORNER);
cputcxy(xsize-1,12,CH_LRCORNER);
gotoxy(0,ysize - 2 - ((256 + xsize) / xsize));
for (i = 0; i < xsize; ++i) {
cputc('0' + i % 10);
}
for (i = 0; i < 256; ++i) {
if ((i != '\n') && (i != '\r')) {
cputc(i);
}
}
while(wherex() > 0) {
cputc('#');
}
for (i = 0; i < xsize; ++i) {
cputc('0' + i % 10);
}
for(;;) {
gotoxy(xsize - 10, 3);
j = (n >> 5) & 1;
revers(j);
cputc(j ? 'R' : ' ');
cputs(" revers");
revers(0);
++n;
}
for(;;);
}