]> git.sur5r.net Git - cc65/blobdiff - libsrc/c128/c128-640-200-2.s
poor man's _toascii routine, contributed by Fatih Aygun
[cc65] / libsrc / c128 / c128-640-200-2.s
index dbe0a0e6bc6c4abe8d2be10c8f06c4bf9dee712e..1a51eb903dad9e64f03974c5759ccb42c06c9618 100644 (file)
@@ -62,31 +62,31 @@ yres:   .word   200                     ; Y resolution
 pages: .byte   1                       ; Number of screens available
         .byte   8                       ; System font X size
         .byte   8                       ; System font Y size
-        .res    4, $00                  ; Reserved for future extensions
+        .word   $100                    ; Aspect ratio
 
 ; Next comes the jump table. Currently all entries must be valid and may point
 ; to an RTS for test versions (function not implemented).
 
-        .word   INSTALL
-        .word   UNINSTALL
-        .word   INIT
-        .word   DONE
-       .word   GETERROR
-        .word   CONTROL
-        .word   CLEAR
-        .word   SETVIEWPAGE
-        .word   SETDRAWPAGE
-        .word   SETCOLOR
-        .word   SETPALETTE
-        .word   GETPALETTE
-        .word   GETDEFPALETTE
-        .word   SETPIXEL
-        .word   GETPIXEL
-        .word   LINE
-        .word   BAR
-        .word   CIRCLE
-        .word   TEXTSTYLE
-        .word   OUTTEXT
+        .addr   INSTALL
+        .addr   UNINSTALL
+        .addr   INIT
+        .addr   DONE
+               .addr   GETERROR
+        .addr   CONTROL
+        .addr   CLEAR
+        .addr   SETVIEWPAGE
+        .addr   SETDRAWPAGE
+        .addr   SETCOLOR
+        .addr   SETPALETTE
+        .addr   GETPALETTE
+        .addr   GETDEFPALETTE
+        .addr   SETPIXEL
+        .addr   GETPIXEL
+        .addr   LINE
+        .addr   BAR
+        .addr   TEXTSTYLE
+        .addr   OUTTEXT
+        .addr   0                       ; IRQ entry is unused
 
 ; ------------------------------------------------------------------------
 ; Data.
@@ -98,7 +98,6 @@ X1              = ptr1
 Y1              = ptr2
 X2              = ptr3
 Y2              = ptr4
-RADIUS         = tmp1
 
 ADDR           = tmp1          ; (2)   CALC
 TEMP           = tmp3          ;       CALC icmp
@@ -111,12 +110,6 @@ PB                 = ptr3          ; (2)   LINE
 UB             = ptr4          ; (2)   LINE
 ERR            = regsave       ; (2)   LINE
 NX             = regsave+2     ; (2)   LINE
-; Circle stuff
-XX             = ptr3          ; (2)   CIRCLE
-YY             = ptr4          ; (2)   CIRCLE
-MaxO           = sreg          ; (overwritten by TEMP3+TEMP4, but restored from OG/OU anyway)
-XS             = regsave       ; (2)   CIRCLE
-YS             = regsave+2     ; (2)   CIRCLE
 
 ; Absolute variables used in the code
 
@@ -131,15 +124,13 @@ BITMASK:        .res    1       ; $00 = clear, $FF = set pixels
 
 OLDCOLOR:      .res    1       ; colors before entering gfx mode
 
-; Line routine stuff (combined with CIRCLE to save space)
+; Line routine stuff
 
-OGora:
 COUNT:          .res   2
-OUkos:
 NY:             .res   2
-Y3:
 DX:             .res   1
 DY:             .res   1
+AX:             .res   1
 AY:             .res   1
 
 ; Text output stuff
@@ -502,31 +493,6 @@ GETDEFPALETTE:
 ; Must set an error code: NO
 ;
 
-SETPIXELCLIP:
-       lda     Y1+1
-       bmi     @finito         ; y<0
-       lda     X1+1
-       bmi     @finito         ; x<0
-       lda     xres
-       ldx     xres+1
-       sta     ADDR
-       stx     ADDR+1
-       ldx     #ADDR
-       lda     X1
-       ldy     X1+1
-       jsr     icmp            ; if (xres<x1)
-       bcs     @cont           ; !(xres<x1)
-@finito:rts
-@cont: lda     yres
-       ldx     yres+1
-       sta     ADDR
-       stx     ADDR+1
-       ldx     #ADDR
-       lda     Y1
-       ldy     Y1+1
-       jsr     icmp            ; if (yres<y1)
-       bcc     @finito
-
 SETPIXEL:
         jsr     CALC            ; Calculate coordinates
 
@@ -607,7 +573,7 @@ LINE:
        jsr     abs
        sta     NY
        sty     NY+1
-       ; if (x2>x1)
+       ; if (x2>=x1)
        ldx     #X2
        lda     X1
        ldy     X1+1
@@ -620,7 +586,7 @@ LINE:
        ; dx = -1;
 @L0243:        lda     #$ff
 @L0244:        sta     DX
-       ; if (y2>y1)
+       ; if (y2>=y1)
        ldx     #Y2
        lda     Y1
        ldy     Y1+1
@@ -633,10 +599,11 @@ LINE:
        ; dy = -1;
 @L024A:        lda     #$ff
 @L024B:        sta     DY
-       ; err = ay = 0;
+       ; err = ax = ay = 0;
        lda     #0
        sta     ERR
        sta     ERR+1
+       sta     AX
        sta     AY
 
        ; if (nx<ny) {
@@ -654,8 +621,11 @@ LINE:
        ldx     NY+1
        sta     NY+1
        stx     NX+1
-       ; ay = dx
+       ; ax = dx
        lda     DX
+       sta     AX
+       ; ay = dy
+       lda     DY
        sta     AY
        ; dx = dy = 0;
        lda     #0
@@ -677,7 +647,7 @@ LINE:
        bne     @L0167
        rts
        ;    setpixel(X1,Y1)
-@L0167:        jsr     SETPIXELCLIP
+@L0167:        jsr     SETPIXEL
        ;    pb = err + ny
        lda     ERR
        clc
@@ -733,10 +703,10 @@ LINE:
        lda     PB
        ldx     PB+1
        jmp     @L0312
-       ; } else { x1 = x1 + ay
+       ; } else { x1 = x1 + ax
 @L027F:
        ldx     #0
-       lda     AY
+       lda     AX
        bpl     @L0288
        dex
 @L0288:        clc
@@ -911,213 +881,6 @@ HORLINE:
 
 @L5:   jmp     HORLINE
 
-; ------------------------------------------------------------------------
-; CIRCLE: Draw a circle around the center X1/Y1 (= ptr1/ptr2) with the
-; radius in tmp1 and the current drawing color.
-;
-; Must set an error code: NO
-;
-
-CIRCLE:
-       lda     RADIUS
-        bne     @L1
-        jmp     SETPIXELCLIP    ; Plot as a point
-
-@L1:   sta     XX
-       ; x = r;
-       lda     #0
-       sta     XX+1
-       sta     YY
-       sta     YY+1
-       sta     MaxO
-       sta     MaxO+1
-       ; y =0; mo=0;
-       lda     X1
-       ldx     X1+1
-       sta     XS
-       stx     XS+1
-       lda     Y1
-       ldx     Y1+1
-       sta     YS
-       stx     YS+1            ; XS/YS to remember the center
-
-       ; while (y<x) {
-@L013B:        ldx     #YY
-       lda     XX
-       ldy     XX+1
-       jsr     icmp
-       bcc     @L12
-       rts
-@L12:  ; plot points in 8 slices...
-       lda     XS
-       clc
-       adc     XX
-       sta     X1
-       lda     XS+1
-       adc     XX+1
-       sta     X1+1            ; x1 = xs+x
-       lda     YS
-       clc
-       adc     YY
-       sta     Y1
-       pha
-       lda     YS+1
-       adc     YY+1
-       sta     Y1+1            ; (stack)=ys+y, y1=(stack)
-       pha
-       jsr     SETPIXELCLIP    ; plot(xs+x,ys+y)
-       lda     YS
-       sec
-       sbc     YY
-       sta     Y1
-       sta     Y3
-       lda     YS+1
-       sbc     YY+1
-       sta     Y1+1            ; y3 = y1 = ys-y
-       sta     Y3+1
-       jsr     SETPIXELCLIP    ; plot(xs+x,ys-y)
-       pla
-       sta     Y1+1
-       pla
-       sta     Y1              ; y1 = ys+y
-       lda     XS
-       sec
-       sbc     XX
-       sta     X1
-       lda     XS+1
-       sbc     XX+1
-       sta     X1+1
-       jsr     SETPIXELCLIP    ; plot (xs-x,ys+y)
-       lda     Y3
-       sta     Y1
-       lda     Y3+1
-       sta     Y1+1
-       jsr     SETPIXELCLIP    ; plot (xs-x,ys-y)
-
-       lda     XS
-       clc
-       adc     YY
-       sta     X1
-       lda     XS+1
-       adc     YY+1
-       sta     X1+1            ; x1 = xs+y
-       lda     YS
-       clc
-       adc     XX
-       sta     Y1
-       pha
-       lda     YS+1
-       adc     XX+1
-       sta     Y1+1            ; (stack)=ys+x, y1=(stack)
-       pha
-       jsr     SETPIXELCLIP    ; plot(xs+y,ys+x)
-       lda     YS
-       sec
-       sbc     XX
-       sta     Y1
-       sta     Y3
-       lda     YS+1
-       sbc     XX+1
-       sta     Y1+1            ; y3 = y1 = ys-x
-       sta     Y3+1
-       jsr     SETPIXELCLIP    ; plot(xs+y,ys-x)
-       pla
-       sta     Y1+1
-       pla
-       sta     Y1              ; y1 = ys+x(stack)
-       lda     XS
-       sec
-       sbc     YY
-       sta     X1
-       lda     XS+1
-       sbc     YY+1
-       sta     X1+1
-       jsr     SETPIXELCLIP    ; plot (xs-y,ys+x)
-       lda     Y3
-       sta     Y1
-       lda     Y3+1
-       sta     Y1+1
-       jsr     SETPIXELCLIP    ; plot (xs-y,ys-x)
-
-       ; og = mo+y+y+1
-       lda     MaxO
-       ldx     MaxO+1
-       clc
-       adc     YY
-       tay
-       txa
-       adc     YY+1
-       tax
-       tya
-       clc
-       adc     YY
-       tay
-       txa
-       adc     YY+1
-       tax
-       tya
-       clc
-       adc     #1
-       bcc     @L0143
-       inx
-@L0143:        sta     OGora
-       stx     OGora+1
-       ; ou = og-x-x+1
-       sec
-       sbc     XX
-       tay
-       txa
-       sbc     XX+1
-       tax
-       tya
-       sec
-       sbc     XX
-       tay
-       txa
-       sbc     XX+1
-       tax
-       tya
-       clc
-       adc     #1
-       bcc     @L0146
-       inx
-@L0146:        sta     OUkos
-       stx     OUkos+1
-       ; ++y
-       inc     YY
-       bne     @L0148
-       inc     YY+1
-@L0148:        ; if (abs(ou)<abs(og))
-       lda     OUkos
-       ldy     OUkos+1
-       jsr     abs
-       sta     TEMP3
-       sty     TEMP4
-       lda     OGora
-       ldy     OGora+1
-       jsr     abs
-       ldx     #TEMP3
-       jsr     icmp
-       bpl     @L0149
-       ; { --x;
-       sec
-       lda     XX
-       sbc     #1
-       sta     XX
-       bcs     @L014E
-       dec     XX+1
-@L014E:        ; mo = ou; }
-       lda     OUkos
-       ldx     OUkos+1
-       jmp     @L014G
-       ; else { mo = og }
-@L0149:        lda     OGora
-       ldx     OGora+1
-@L014G:        sta     MaxO
-       stx     MaxO+1
-       ; }
-        jmp    @L013B
-
 ; ------------------------------------------------------------------------
 ; TEXTSTYLE: Set the style used when calling OUTTEXT. Text scaling in X and Y
 ; direction is passend in X/Y, the text direction is passed in A.
@@ -1201,13 +964,11 @@ CALC:
 
 abs:
        ; a/y := abs(a/y)
-       dey
-       iny
+       cpy     #$00
        bpl     absend
        ; negay
-neg:   clc
-       eor     #$ff
-       adc     #1
+neg:   eor     #$ff
+       add     #1
        pha
        tya
        eor     #$ff