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