;
; Stefan Haubenthal <polluks@sdf.lonestar.org>
; Oliver Schmidt <ol.sc@web.de>
-; Based on Maciej Witkowiak's circle routine
;
.include "zeropage.inc"
.include "tgi-error.inc"
.include "apple2.inc"
- .macpack generic
-
; ------------------------------------------------------------------------
; Zero page stuff
Y1 := ptr2
X2 := ptr3
Y2 := ptr4
-RADIUS := tmp1
-
-ADDR := tmp1 ; (2) SETPIXELCLIP
-TEMP := tmp3 ; icmp
-TEMP2 := tmp4 ; icmp
-XX := ptr3 ; (2) CIRCLE
-YY := ptr4 ; (2) CIRCLE
-TEMP3 := sreg ; CIRCLE
-TEMP4 := sreg+1 ; CIRCLE
-MaxO := sreg ; (overwritten by TEMP3+TEMP4, but restored from OG/OU anyway)
-XS := regsave ; (2) CIRCLE
-YS := regsave+2 ; (2) CIRCLE
; ------------------------------------------------------------------------
.byte $74, $67, $69 ; "tgi"
.byte TGI_API_VERSION ; TGI API version number
-xres: .word 280 ; X resolution
-yres: .word 192 ; Y resolution
+ .word 280 ; X resolution
+ .word 192 ; Y resolution
.byte 8 ; Number of drawing colors
.byte 2 ; Number of screens available
- .byte 8 ; System font X size
+ .byte 7 ; 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).
+; Next comes the jump table. With the exception of IRQ, all entries must be
+; valid and may point to an RTS for test versions (function not implemented).
.addr INSTALL
.addr UNINSTALL
.addr GETPIXEL
.addr LINE
.addr BAR
- .addr CIRCLE
.addr TEXTSTYLE
.addr OUTTEXT
.addr 0 ; IRQ entry is unused
Set80: .res 1 ; Set 80 column store
.endif
-; Circle stuff
-
-OGora: .res 2
-OUkos: .res 2
-Y3: .res 2
-
; ------------------------------------------------------------------------
.rodata
DEFPALETTE: .byte $00, $01, $02, $03, $04, $05, $06, $07
-SHAPE: .byte $64,$01,$D0,$00,$D5,$00,$DA,$00,$E0,$00,$EF,$00,$FE,$00,$0C,$01
- .byte $19,$01,$1D,$01,$25,$01,$2D,$01,$3D,$01,$46,$01,$4B,$01,$52,$01
- .byte $56,$01,$60,$01,$70,$01,$77,$01,$83,$01,$8E,$01,$9A,$01,$A7,$01
- .byte $B6,$01,$BF,$01,$CE,$01,$DD,$01,$E2,$01,$E7,$01,$F9,$01,$03,$02
- .byte $15,$02,$1F,$02,$32,$02,$42,$02,$52,$02,$5E,$02,$6C,$02,$79,$02
- .byte $85,$02,$91,$02,$A1,$02,$A9,$02,$B2,$02,$BF,$02,$C5,$02,$D5,$02
- .byte $E5,$02,$F4,$02,$00,$03,$10,$03,$1F,$03,$2D,$03,$35,$03,$44,$03
- .byte $53,$03,$63,$03,$71,$03,$7B,$03,$85,$03,$91,$03,$97,$03,$A3,$03
- .byte $B6,$03,$BF,$03,$C3,$03,$CF,$03,$DC,$03,$E4,$03,$F3,$03,$00,$04
- .byte $0A,$04,$19,$04,$25,$04,$2A,$04,$32,$04,$3C,$04,$43,$04,$50,$04
- .byte $5A,$04,$66,$04,$72,$04,$7E,$04,$87,$04,$94,$04,$9C,$04,$A8,$04
- .byte $B4,$04,$C1,$04,$CC,$04,$DB,$04,$E6,$04,$EE,$04,$F3,$04,$FB,$04
- .byte $04,$05,$1A,$05,$1F,$05,$24,$05,$29,$05,$22,$01,$00,$00,$00,$00
- .byte $09,$89,$92,$92,$00,$36,$36,$16,$0E,$00,$0D,$FE,$6E,$96,$52,$00
- .byte $69,$FE,$17,$2D,$2D,$1E,$1F,$17,$2D,$2D,$1E,$1F,$6E,$4E,$00,$09
- .byte $8D,$3F,$BF,$0D,$15,$3F,$0E,$0D,$1E,$3F,$77,$71,$09,$00,$6D,$11
- .byte $DF,$77,$09,$1E,$17,$4D,$3A,$DF,$4E,$29,$0E,$00,$A9,$1F,$6E,$1E
- .byte $17,$0D,$0D,$1E,$DF,$0E,$6D,$0E,$00,$36,$96,$52,$00,$09,$1E,$17
- .byte $36,$15,$0E,$0E,$00,$15,$0E,$36,$1E,$17,$4E,$01,$00,$09,$8D,$1F
- .byte $1F,$0E,$2D,$1E,$17,$2D,$15,$1F,$1F,$4E,$4E,$01,$00,$89,$6E,$3A
- .byte $3F,$77,$31,$56,$09,$00,$92,$8A,$F6,$0D,$00,$52,$89,$3F,$B7,$52
- .byte $49,$00,$92,$92,$0E,$00,$49,$11,$17,$1E,$17,$1E,$56,$49,$01,$00
- .byte $29,$AD,$DF,$33,$4D,$35,$1F,$1F,$2E,$4D,$FE,$1B,$0E,$2D,$4E,$00
- .byte $31,$77,$36,$BE,$2D,$0E,$00,$29,$AD,$DF,$73,$49,$1E,$BF,$1E,$2E
- .byte $2D,$75,$00,$2D,$2D,$BE,$3E,$4E,$FE,$1B,$0E,$2D,$4E,$00,$49,$3E
- .byte $17,$0D,$FE,$33,$2D,$2D,$1E,$76,$01,$00,$2D,$2D,$DE,$1B,$2E,$2D
- .byte $15,$36,$DF,$73,$2D,$4E,$00,$09,$2D,$DE,$BB,$4D,$3A,$3F,$6E,$09
- .byte $FE,$1B,$0E,$2D,$4E,$00,$2D,$2D,$BE,$1E,$17,$36,$4E,$09,$00,$29
- .byte $AD,$DF,$33,$4D,$F1,$3F,$17,$4D,$31,$DF,$73,$2D,$4E,$00,$29,$AD
- .byte $DF,$33,$4D,$31,$3F,$77,$09,$1E,$DF,$2A,$75,$09,$00,$12,$16,$96
- .byte $01,$00,$52,$B2,$F6,$0D,$00,$49,$3E,$17,$2D,$2D,$35,$3F,$3F,$3F
- .byte $0E,$2D,$2D,$F5,$1B,$77,$4E,$09,$00,$12,$2D,$2D,$DE,$9B,$2D,$2D
- .byte $96,$01,$00,$49,$15,$FF,$13,$2D,$2D,$AD,$3F,$3F,$3F,$2E,$2D,$2D
- .byte $1E,$37,$4E,$09,$00,$29,$AD,$DF,$73,$09,$1E,$B6,$4E,$01,$00,$09
- .byte $2D,$3E,$37,$2D,$3E,$FF,$2A,$2D,$2D,$F5,$3F,$3F,$0E,$2D,$1E,$4D
- .byte $01,$00,$09,$15,$1F,$17,$4D,$31,$DF,$33,$2D,$2D,$FE,$1B,$6E,$09
- .byte $0E,$00,$2D,$AD,$DF,$33,$4D,$F1,$3F,$37,$4D,$31,$DF,$33,$2D,$75
- .byte $01,$00,$29,$AD,$DF,$33,$36,$4D,$11,$DF,$73,$2D,$4E,$00,$2D,$AD
- .byte $DF,$6E,$31,$DF,$6E,$31,$DF,$17,$2D,$75,$01,$00,$2D,$2D,$DE,$1B
- .byte $6E,$11,$3F,$37,$36,$2D,$2D,$0E,$00,$2D,$2D,$DE,$1B,$6E,$11,$3F
- .byte $37,$36,$4E,$49,$00,$29,$AD,$DF,$33,$36,$4D,$35,$DF,$73,$2D,$75
- .byte $00,$4D,$31,$DF,$33,$4D,$31,$3F,$3F,$6E,$09,$FE,$1B,$6E,$09,$0E
- .byte $00,$2D,$1E,$36,$36,$17,$2D,$0E,$00,$49,$31,$36,$36,$DF,$73,$2D
- .byte $4E,$00,$4D,$F1,$DF,$6E,$1E,$37,$0D,$15,$DF,$6E,$09,$0E,$00,$36
- .byte $36,$36,$2D,$75,$00,$4D,$31,$FF,$37,$0D,$0D,$FE,$1F,$6E,$09,$FE
- .byte $1B,$6E,$09,$0E,$00,$4D,$31,$DF,$33,$6D,$31,$1F,$1F,$6E,$29,$FE
- .byte $1B,$6E,$09,$0E,$00,$29,$AD,$DF,$33,$4D,$31,$DF,$33,$4D,$31,$DF
- .byte $73,$2D,$4E,$00,$2D,$AD,$DF,$33,$4D,$F1,$3F,$37,$36,$4E,$49,$00
- .byte $29,$AD,$DF,$33,$4D,$31,$DF,$33,$0D,$0D,$1E,$DF,$0E,$6D,$0E,$00
- .byte $2D,$AD,$DF,$33,$4D,$F1,$3F,$37,$0D,$15,$DF,$6E,$09,$0E,$00,$29
- .byte $AD,$DF,$33,$4D,$3A,$77,$09,$FE,$1B,$0E,$2D,$4E,$00,$2D,$2D,$DE
- .byte $36,$36,$76,$09,$00,$4D,$31,$DF,$33,$4D,$31,$DF,$33,$4D,$31,$DF
- .byte $73,$2D,$4E,$00,$4D,$31,$DF,$33,$4D,$31,$DF,$33,$4D,$F1,$1F,$0E
- .byte $4E,$01,$00,$4D,$31,$DF,$33,$4D,$31,$1F,$1F,$6E,$0D,$3E,$1F,$37
- .byte $4D,$71,$00,$4D,$31,$DF,$73,$0D,$1E,$17,$0D,$15,$DF,$33,$4D,$71
- .byte $00,$4D,$31,$DF,$73,$0D,$1E,$36,$76,$09,$00,$2D,$2D,$BE,$1E,$17
- .byte $1E,$2E,$2D,$75,$00,$2D,$2D,$DE,$3B,$2E,$3E,$2E,$3E,$2E,$2D,$75
- .byte $00,$72,$15,$0E,$15,$56,$00,$2D,$2D,$3E,$2E,$3E,$2E,$3E,$DF,$2A
- .byte $2D,$75,$00,$49,$15,$3F,$17,$2D,$2D,$15,$3F,$3F,$3F,$4E,$2D,$3E
- .byte $37,$2D,$3E,$6F,$49,$00,$92,$92,$49,$11,$3F,$3F,$4D,$09,$00,$76
- .byte $96,$52,$00,$52,$2D,$35,$DF,$33,$4D,$31,$FF,$73,$6D,$0E,$00,$36
- .byte $2D,$AD,$DF,$33,$4D,$31,$DF,$33,$2D,$75,$01,$00,$52,$2D,$DE,$33
- .byte $76,$2D,$0E,$00,$49,$31,$DF,$2A,$2D,$FE,$1B,$6E,$09,$FE,$1B,$0E
- .byte $2D,$75,$00,$52,$2D,$15,$DF,$33,$2D,$2D,$DE,$1B,$0E,$2D,$75,$00
- .byte $09,$F5,$33,$8D,$3F,$77,$36,$4E,$01,$00,$52,$2D,$35,$DF,$33,$4D
- .byte $31,$3F,$77,$09,$1E,$3F,$4D,$01,$00,$36,$2D,$AD,$DF,$33,$4D,$31
- .byte $DF,$33,$4D,$71,$00,$16,$36,$36,$0E,$00,$09,$9E,$35,$36,$F6,$6F
- .byte $01,$00,$36,$4D,$1E,$1F,$2E,$15,$1F,$6E,$71,$00,$35,$36,$36,$17
- .byte $2D,$0E,$00,$12,$2D,$AD,$1F,$1F,$6E,$0D,$FE,$1F,$6E,$0D,$0E,$00
- .byte $12,$2D,$15,$DF,$6E,$31,$DF,$6E,$71,$00,$52,$2D,$15,$DF,$33,$4D
- .byte $31,$DF,$73,$2D,$4E,$00,$12,$2D,$AD,$DF,$33,$4D,$F1,$3F,$37,$6E
- .byte $49,$00,$52,$2D,$35,$DF,$33,$4D,$31,$3F,$77,$09,$2E,$00,$12,$0D
- .byte $AD,$DF,$37,$36,$4E,$49,$00,$52,$2D,$F5,$DB,$0E,$2D,$15,$DF,$13
- .byte $2D,$75,$01,$00,$31,$17,$2D,$F5,$33,$76,$75,$00,$12,$4D,$31,$DF
- .byte $33,$4D,$31,$FF,$73,$6D,$0E,$00,$12,$4D,$31,$DF,$33,$4D,$F1,$1F
- .byte $0E,$4E,$01,$00,$12,$4D,$31,$DF,$33,$0D,$0D,$FE,$1F,$0E,$0D,$4E
- .byte $00,$12,$4D,$F1,$1F,$0E,$15,$1F,$17,$4D,$71,$00,$12,$4D,$31,$DF
- .byte $33,$4D,$31,$3F,$77,$09,$1E,$3F,$4D,$01,$00,$12,$2D,$2D,$1E,$17
- .byte $1E,$17,$2D,$2D,$0E,$00,$09,$F5,$33,$1E,$0E,$76,$75,$00,$36,$36
- .byte $36,$2E,$00,$AD,$AE,$17,$FE,$2A,$4E,$01,$00,$69,$11,$1F,$1F,$4E
- .byte $B1,$92,$09,$00,$2D,$2D,$35,$3F,$3F,$37,$2D,$2D,$35,$3F,$3F,$37
- .byte $2D,$2D,$35,$3F,$3F,$37,$2D,$2D,$75,$00,$40,$C0,$40,$18,$00,$40
- .byte $C0,$40,$43,$00,$40,$C0,$40,$08,$00,$19,$00,$00
+FONT:
+ ; Beagle Bros Shape Mechanic font F.ASCII.SMALL
+ ; modified to exactly reproduce the text glyphs
+ .incbin "../apple2/apple2-280-192-8.fnt"
; ------------------------------------------------------------------------
bit MIXCLR
bit TXTCLR
+ ; Beagle Bros Shape Mechanic fonts don't
+ ; scale well so use fixed scaling factor
+ lda #1
+ sta SCALE
+
; Done, reset the error code
lda #TGI_ERR_OK
sta ERROR
bit $C080 ; Switch in LC bank 2 for R/O
rts
-SETPIXELCLIP:
- lda Y1+1
- bmi :+ ; y < 0
- lda X1+1
- bmi :+ ; x < 0
- lda X1
- ldx X1+1
- sta ADDR
- stx ADDR+1
- ldx #ADDR
- lda xres
- ldy xres+1
- jsr icmp ; ( x < xres ) ...
- bcs :+
- lda Y1
- ldx Y1+1
- sta ADDR
- stx ADDR+1
- ldx #ADDR
- lda yres
- ldy yres+1
- jsr icmp ; ... && ( y < yres )
- bcc SETPIXEL
-: rts
-
; GETPIXEL: Read the color value of a pixel and return it in A/X. The
; coordinates passed to this function are never outside the visible screen
; area, so there is no need for clipping inside this function.
bne :-
rts
-; 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 :+
- jmp SETPIXELCLIP ; Plot as a point
-: sta XX
-
- ; x = r
- lda #$00
- 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) {
-while: ldx #YY
- lda XX
- ldy XX+1
- jsr icmp
- bcc :+
- rts
-
- ; Plot points in 8 slices...
-: lda XS
- add XX
- sta X1
- lda XS+1
- adc XX+1
- sta X1+1 ; x1 = xs + x
- lda YS
- add 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
- sub 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
- sub 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
- add YY
- sta X1
- lda XS+1
- adc YY+1
- sta X1+1 ; x1 = xs + y
- lda YS
- add 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
- sub 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
- sub 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
- add YY
- tay
- txa
- adc YY+1
- tax
- tya
- add YY
- tay
- txa
- adc YY+1
- tax
- tya
- add #$01
- bcc :+
- inx
-: sta OGora
- stx OGora+1
-
- ; ou = og - x - x + 1
- sub XX
- tay
- txa
- sbc XX+1
- tax
- tya
- sub XX
- tay
- txa
- sbc XX+1
- tax
- tya
- add #$01
- bcc :+
- inx
-: sta OUkos
- stx OUkos+1
-
- ; ++y
- inc YY
- bne :+
- inc YY+1
-
- ; 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 :++
-
- ; --x
- lda XX
- sub #$01
- sta XX
- bcs :+
- dec XX+1
-
- ; mo = ou }
-: lda OUkos
- ldx OUkos+1
- jmp :++
-
- ; else mo = og
-: lda OGora
- ldx OGora+1
-: sta MaxO
- stx MaxO+1
-
- ; }
- jmp while
-
; 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.
; Must set an error code: NO
TEXTSTYLE:
- stx SCALE
- asl ; 16 <=> 90รพ
- asl
- asl
- asl
- sta ROT
+ cmp #TGI_TEXT_VERTICAL
+ bne :+
+ lda #48
+: sta ROT
rts
; OUTTEXT: Output text at X/Y = ptr1/ptr2 using the current color and the
; Must set an error code: NO
OUTTEXT:
bit $C082 ; Switch in ROM
- ldx X1
+ lda X1
ldy X1+1
+ ldx ROT
+ php ; Save Z flag
+ beq :+ ; Not horizontal
+ sec
+ sbc #7 ; Adjust X
+ bcs :+
+ dey
+: tax
lda Y1
- jsr HPOSN
- lda SHAPE+2*99
- add #<SHAPE
- sta tmp3
- lda SHAPE+2*99+1
- adc #>SHAPE
- sta tmp3+1
-
+ plp ; Restore Z flag
+ bne :+ ; Not vertical
+ sec
+ sbc #7 ; Adjust Y
+: jsr HPOSN
+ clc
+ lda FONT+2*99 ; "connection char"
+ adc #<FONT
+ sta ptr4
+ lda FONT+2*99+1 ; "connection char"
+ adc #>FONT
+ sta ptr4+1
ldy #$00
: lda (ptr3),y
beq :+
- sub #$1F ; No controls
+ sty tmp1 ; Save string index
+ sec
+ sbc #$1F ; No control chars
asl ; Offset * 2
+ tay
+ clc
+ lda FONT,y
+ adc #<FONT
tax
- lda SHAPE,x
- add #<SHAPE
- sta tmp1
- lda SHAPE+1,x
- adc #>SHAPE
- sta tmp1+1
- tya
- pha
- ldx tmp1
- ldy tmp1+1
+ lda FONT+1,y
+ adc #>FONT
+ tay
lda ROT
- jsr DRAW
- ldx tmp3
- ldy tmp3+1
+ jsr DRAW ; Draw char from string
+ ldx ptr4
+ ldy ptr4+1
lda ROT
- jsr DRAW
- pla
- tay
+ jsr DRAW ; Draw "connection char"
+ ldy tmp1 ; Restore string index
iny
- bne :-
+ bne :- ; Branch always
: bit $C080 ; Switch in LC bank 2 for R/O
rts
-
-; Copies of some runtime routines
-
-abs:
- ; A/Y := abs (A/Y)
- cpy #$00
- bpl :+
- clc
- eor #$FF
- adc #$01
- pha
- tya
- eor #$FF
- adc #$00
- tay
- pla
-: rts
-
-icmp:
- ; Compare A/Y to zp,X
- sta TEMP ; TEMP/TEMP2 - arg2
- sty TEMP2
- lda $00,x
- pha
- lda $01,x
- tay
- pla
- tax
- tya ; X/A - arg1 (a = high)
-
- sub TEMP2
- bne :++
- cpx TEMP
- beq :+
- adc #$FF
- ora #$01
-: rts
-: bvc :+
- eor #$FF
- ora #$01
-: rts