VDC_LENR =17 ; (DMA) Length Register
VDC_SATB =18 ; Sprite Attribute Table
+; VDC port
+; Note: absolute addressing mode must be used when writing to this port
+
VDC_CTRL = $0000
VDC_DATA_LO = $0002
VDC_DATA_HI = $0003
CDR_MEM_DISABLE = $1803
CDR_MEM_ENABLE = $1807
-;; lda abs
-.macro ldaio arg1
- .byte $ad
- .word arg1
-.endmacro
-
-;; sta abs
-.macro staio arg1
- .byte $8d
- .word arg1
-.endmacro
-
-;; stz abs
-.macro stzio arg1
- .byte $9c
- .word arg1
-.endmacro
-
; Write VDC register
.macro VREG arg1,arg2
st0 #arg1
#define COLOR_LIGHTBLUE 0x0E
#define COLOR_GRAY3 0x0F
-#define CLOCKS_PER_SEC 50 // FIXME: is this correct?
-#define CLK_TCK 50 // FIXME: is this correct?
-
#define TV_NTSC 0
#define TV_PAL 1
#define TV_OTHER 2
#elif defined(__NES__)
# define CLK_TCK 50 /* POSIX */
# define CLOCKS_PER_SEC 50 /* ANSI */
+#elif defined(__PCE__)
+/* FIXME: we likely need to read it at runtime */
+# define CLK_TCK 50 /* POSIX */
+# define CLOCKS_PER_SEC 50 /* ANSI */
#elif defined(__GEOS__)
# define CLK_TCK 1 /* POSIX */
# define CLOCKS_PER_SEC 1 /* ANSI */
st0 #VDC_VWR
ldy #$40
rowloop: ldx #$80
-colloop: lda #' '
- staio VDC_DATA_LO
- lda #$02
- staio VDC_DATA_HI
+colloop: lda #' '
+ sta a:VDC_DATA_LO
+ lda #$02
+ sta a:VDC_DATA_HI
dex
bne colloop
.import psg_init
.import vdc_init
- .export initconio
-
.constructor initconio, 24
.macpack longbranch
ldx #0
@lp:
- .repeat 16
- lda colors,x
+ ldy #16
+@lp1:
+ lda colors,x
sta VCE_DATA_LO
- lda colors+1,x
+ lda colors+1,x
sta VCE_DATA_HI
- .endrepeat
+ dey
+ bne @lp1
inx
inx
- cpx #16*2
- jne @lp
+ cpx #16*2
+ jne @lp
stz VCE_ADDR_LO
stz VCE_ADDR_HI
ldy #$80 ; 128 chars
charloop: ldx #$08 ; 8 bytes/char
lineloop:
- lda (ptr1)
- staio VDC_DATA_LO ; bitplane 0
- stzio VDC_DATA_HI ; bitplane 1
+ lda (ptr1)
+ sta a:VDC_DATA_LO ; bitplane 0
+ stz a:VDC_DATA_HI ; bitplane 1
clc ; increment font pointer
lda ptr1
dey
bne charloop ; next character
- ldx #0
+ ldx #0
stx BGCOLOR
inx
stx CHARCOLOR
st0 #VDC_MAWR ; Memory Adress Write
lda SCREEN_PTR
- staio VDC_DATA_LO
+ sta a:VDC_DATA_LO
lda SCREEN_PTR+1
- staio VDC_DATA_HI
+ sta a:VDC_DATA_HI
st0 #VDC_VWR ; VWR
txa
- staio VDC_DATA_LO ; character
+ sta a:VDC_DATA_LO ; character
- lda CHARCOLOR
+ lda CHARCOLOR
- asl a
- asl a
- asl a
- asl a
+ asl a
+ asl a
+ asl a
+ asl a
- and #$f0
- ora #$02
- staio VDC_DATA_HI
+ ora #$02
+ sta a:VDC_DATA_HI
rts
.importzp sp
.importzp ptr1,ptr2
-; ------------------------------------------------------------------------
-; Create an empty LOWCODE segment to avoid linker warnings
-
- .segment "LOWCODE"
-
; ------------------------------------------------------------------------
; Place the startup code in a special segment.
start:
-; setup the CPU and System-IRQ
+ ; setup the CPU and System-IRQ
; Initialize CPU
cli
; Clear the BSS data
- jsr zerobss
+ jsr zerobss
; Copy the .data segment to RAM
- lda #<(__DATA_LOAD__)
- sta ptr1
- lda #>(__DATA_LOAD__)
- sta ptr1+1
- lda #<(__DATA_RUN__)
- sta ptr2
- lda #>(__DATA_RUN__)
- sta ptr2+1
-
- ldx #>(__DATA_SIZE__)
+ lda #<(__DATA_LOAD__)
+ sta ptr1
+ lda #>(__DATA_LOAD__)
+ sta ptr1+1
+ lda #<(__DATA_RUN__)
+ sta ptr2
+ lda #>(__DATA_RUN__)
+ sta ptr2+1
+
+ ldx #>(__DATA_SIZE__)
@l2:
- beq @s1 ; no more full pages
+ beq @s1 ; no more full pages
; copy one page
- ldy #0
+ ldy #0
@l1:
- lda (ptr1),y
- sta (ptr2),y
+ lda (ptr1),y
+ sta (ptr2),y
iny
- bne @l1
+ bne @l1
- inc ptr1+1
- inc ptr2+1
+ inc ptr1+1
+ inc ptr2+1
dex
- bne @l2
+ bne @l2
; copy remaining bytes
@s1:
; copy one page
- ldy #0
+ ldy #0
@l3:
- lda (ptr1),y
- sta (ptr2),y
+ lda (ptr1),y
+ sta (ptr2),y
iny
- cpy #<(__DATA_SIZE__)
- bne @l3
+ cpy #<(__DATA_SIZE__)
+ bne @l3
; setup the stack
- lda #<(__RAM_START__+__RAM_SIZE__)
- sta sp
- lda #>(__RAM_START__+__RAM_SIZE__)
- sta sp+1
-
- ; Init the Heap
- jsr initheap
+ lda #<(__RAM_START__+__RAM_SIZE__)
+ sta sp
+ lda #>(__RAM_START__+__RAM_SIZE__)
+ sta sp+1
; Call module constructors
- jsr initlib
+ jsr initlib
; Pass an empty command line
jsr push0 ; argc
; Call module destructors. This is also the _exit entry.
_exit:
- jsr donelib ; Run module destructors
+ jsr donelib ; Run module destructors
; reset the PCEngine (start over)
jmp start
phy
- inc tickcount
- bne @s1
- inc tickcount+1
- bne @s1
- inc tickcount+2
- bne @s1
- inc tickcount+3
+ inc tickcount
+ bne @s1
+ inc tickcount+1
+ bne @s1
+ inc tickcount+2
+ bne @s1
+ inc tickcount+3
@s1:
; Acknowlege interrupt
- ldaio VDC_CTRL
+ lda a:VDC_CTRL
ply
plx
.export vdc_init
vdc_init:
- ldaio VDC_CTRL
+ lda a:VDC_CTRL
VREG $00, $0000 ; MAWR
VREG $01, $0000 ; MARR
VREG $0E, $000C ; CRTC - VDE
VREG $0F, $0000 ; DCR
- .if HIRES
+.if HIRES
VREG $0A, $0C02 ; CRTC - HSR
VREG $0B, $043C ; CRTC - HDS
lda #$06
sta VCE_CTRL
- .else
+.else
VREG $0A, $0202 ; CRTC - HSR
VREG $0B, $041F ; CRTC - HDS
lda #$04
sta VCE_CTRL
- .endif
+.endif
- ldaio VDC_CTRL
+ lda a:VDC_CTRL
rts