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.
Y1 = ptr2
X2 = ptr3
Y2 = ptr4
-RADIUS = tmp1
ADDR = tmp1 ; (2) CALC
TEMP = tmp3 ; CALC icmp
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
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
; 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
jsr abs
sta NY
sty NY+1
- ; if (x2>x1)
+ ; if (x2>=x1)
ldx #X2
lda X1
ldy X1+1
; dx = -1;
@L0243: lda #$ff
@L0244: sta DX
- ; if (y2>y1)
+ ; if (y2>=y1)
ldx #Y2
lda Y1
ldy Y1+1
; 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) {
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
bne @L0167
rts
; setpixel(X1,Y1)
-@L0167: jsr SETPIXELCLIP
+@L0167: jsr SETPIXEL
; pb = err + ny
lda ERR
clc
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
@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.
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