;**********************************************************************;
;*               A T O M I C   S P R I T E   E D I T O R              *;
;*--------------------------------------------------------------------*;
;*    doel           : Support routines voor sprite editor            *;
;*--------------------------------------------------------------------*;
;*    filenaam       : spredit.asm                                    *;
;*    auteur         : Roland Leurs                                   *;
;*                     The Atomic Development Studio                  *;
;*    ontwikkeld     : jan 1999                                       *;
;*    laatste update :                                                *;
;*--------------------------------------------------------------------*;
;*    assembleren    : x6502 spredit                                  *;
;**********************************************************************;

zp              equ     $80
spraddr         equ     zp+0
par1            equ     zp+2
par2            equ     zp+3
par3            equ     zp+4
work            equ     zp+5

leesbyte        equ     $ffc5
zendbyte        equ     $ffc8
osbyte          equ     $ffc2

                org     $9200-16

header          .dw     header+16, main
                .dw     0,0,0,0,0,0

main            jsr     $f7d1
                .db     "Sprite editor support routines",10,13
                .db     "    (c) Roland Leurs  1999",10,10,13
                .db     "Entry points:"

                .db     10,13,"SPRWINDOW   #"
                lda     #>sprwindow
                jsr     $f802
                lda     #<sprwindow
                jsr     $f802
                jsr     $f7d1
                .db     10,13,"SPRPIXEL    #"
                lda     #>sprpixel
                jsr     $f802
                lda     #<sprpixel
                jsr     $f802
                jsr     $f7d1
                .db     10,13,"SPRPALET    #"
                lda     #>sprpalet
                jsr     $f802
                lda     #<sprpalet
                jsr     $f802
                jsr     $f7d1
                .db     10,13,"SPRREPAINT  #"
                lda     #>sprrepaint
                jsr     $f802
                lda     #<sprrepaint
                jsr     $f802
                jsr     $ffed
                rts

;**********************************************************************
;* SPRWINDOW  - plaatst het sprite in grote pixels op het werkscherm  *
;* parameters:  (#80) - sprite adres                                    *
;**********************************************************************

sprwindow       lda     #0              ; laadt y teller
                sta     par2
                lda     #0              ; laadt x teller
                sta     par1
sprwindow1      ldy     #0              ; clear indexregister
                lda     (spraddr),y     ; lees pixel data
                sta     par3            ; zet parameter
                jsr     sprpixel        ; zet pixel in werkscherm
                inc     spraddr         ; verhoog adrespointer
                bne     sprwindow2
                inc     spraddr+1
sprwindow2      inc     par1            ; verhoog x teller
                lda     par1            ; x<32
                cmp     #32
                bne     sprwindow1      ; spring indien x<32
                lda     #0              ; reset x teller
                sta     par1
                inc     par2            ; verhoog y teller
                lda     par2            ; y<32
                cmp     #32
                bne     sprwindow1      ; spring indien y<32
                rts                     ; einde routine

;**********************************************************************
;* SPRPIXEL   - plaatst pixel van 8x8 op het werkscherm               *
;* parameters:  #82  - x positie in matrix                            *
;*              #83  - y positie in matrix                            *
;*              #84  - pixel kleur                                    *
;**********************************************************************

sprpixel        lda     par3            ; laadt kleur
                cmp     #255            ; test op transparante kleur
                beq     sprpixel1       ; spring bij transparante kleur
                jsr     colour          ; stel kleur in
sprpixel1       lda     #0              ; bereken x-positie * 9
                sta     work+1
                lda     par1
                sta     work
                jsr     mul9
                lda     work            ; berg op voor later gebruik
                sta     work+4
                lda     work+1
                sta     work+5
                lda     #0              ; idem voor y-positie
                sta     work+1
                lda     par2
                sta     work
                jsr     mul9
                lda     work            ; berg op voor later gebruik
                sta     work+6
                lda     work+1
                sta     work+7
                lda     par3            ; test nogmaals op transparante kleur
                beq     sprpixel2       ; spring indien transparant
                jsr     xblock          ; voer xblock commando uit
                rts                     ; einde routine

sprpixel2       lda     #0              ; wis huidige pixel
                jsr     colour
                jsr     xblock
                lda     #15             ; plot wit puntje
                jsr     colour
                lda     #11             ; test semafoor
sprpixel3       jsr     osbyte
                bcc     sprpixel3       ; wacht indien geen toegang
                lda     #$00            ; stuur commando #34 naar pc
                jsr     zendbyte
                lda     #$34
                jsr     zendbyte
                clc                     ; wis carry voor optellen
                lda     work+4          ; stuur x*9+6 naar pc
                adc     #6
                jsr     zendbyte
                lda     work+5
                adc     #0
                jsr     zendbyte
                clc                     ; wis carry
                lda     work+6          ; stuur y*9+165 naar pc
                adc     #165
                jsr     zendbyte
                lda     work+7
                adc     #0
                jsr     zendbyte
                lda     #1              ; stuur plotmode naar pc
                jsr     zendbyte
                lda     #10             ; wis semafoor
                jsr     osbyte
                rts                     ; einde routine

;**********************************************************************
;* SPRPALET   - plaatst het palet op het scherm                       *
;* parameters:  geen                                                  *
;**********************************************************************

sprpalet        lda     #0              ; zet kleurcode
                sta     par3            
                sta     par2            ; zet y teller
                lda     #47             ; laadt x teller
                sta     par1            ; zet x teller
sprpalet1       jsr     sprpixel        ; zet pixel in werkscherm
                inc     par1            ; verhoog x teller
                lda     par1            ; x<63
                cmp     #63
                bne     sprpalet1       ; spring indien x<63
                lda     #47             ; reset x teller
                sta     par1
                inc     par2            ; verhoog y teller
                lda     par2            ; y<15
                cmp     #15
                bne     sprpalet1       ; spring indien y<15
                rts                     ; einde routine

;**********************************************************************
;* SPRREPAINT - wijzigt een pixelkleur in de sprite                   *
;* parameters:  (#80) - adres van de sprite                           *
;*              #82   - oude kleur                                    *
;*              #83   - nieuwe kleur                                  *
;**********************************************************************

sprrepaint      ldy     #0              ; clear index register
                ldx     #4              ; laadt pagina teller
sprrepaint1     lda     (spraddr),y     ; lees pixelkleur
                cmp     par1            ; test op oude kleur
                bne     sprrepaint2     ; spring indien andere kleur
                lda     par2            ; laadt nieuwe kleur
                sta     (spraddr),y     ; zet pixelkleur
sprrepaint2     iny                     ; verhoog index register
                bne     sprrepaint1     ; spring indien zelfde pagina
                inc     spraddr+1       ; verhoog pagina nummer
                dex                     ; test op einde sprite
                bne     sprrepaint1     ; spring indien nog niet klaar
                rts                     ; einde routine

;**********************************************************************
;* MUL9       - vermenigvuldigd met 9                                 *
;* parameters:  (#85) - te vermenigvuldigen getal / resultaat         *
;**********************************************************************

mul9            lda     work            ; kopieer getal
                sta     work+2
                lda     work+1
                sta     work+3
                ldy     #3              ; laadt teller
mul_1           asl     work            ; vermenigvuldig met 2
                rol     work+1
                dey                     ; verlaag teller
                bne     mul_1           ; doe dit drie maal
                clc                     ; wis carry
                lda     work            ; getal:=getal+getal*8
                adc     work+2
                sta     work
                lda     work+1
                adc     work+3
                sta     work+1
                rts                     ; einde routine

;**********************************************************************
;* COLOUR     - stel grafische kleur in                               *
;* parameters:  Accu bevat kleurnummer                                *
;**********************************************************************

colour          pha                     ; save kleurnummer
                lda     #17             ; laadt control code
                jsr     zendbyte
                pla                     ; laadt kleurnummer
                jsr     zendbyte
                rts                     ; einde routine

;**********************************************************************
;* XBLOCK     - tekent een blokje mbv commando #5A03                  *
;* parameters:  enkele gegevens staan in work+4 e.v.                  *
;**********************************************************************

xblock          lda     #11             ; test semafoor
                jsr     osbyte
                bcc     xblock          ; wacht indien geen toegang
                lda     #$00            ; stuur commando #5A03 naar pc
                jsr     zendbyte
                lda     #$5A
                jsr     zendbyte
                lda     #$03
                jsr     zendbyte
                clc                     ; wis carry voor optellen
                lda     work+4          ; stuur x*9+2 naar pc
                adc     #2
                jsr     zendbyte
                lda     work+5
                adc     #0
                jsr     zendbyte
                clc                     ; wis carry
                lda     work+6          ; stuur y*9+168 naar pc
                adc     #168
                jsr     zendbyte
                lda     work+7
                adc     #0
                jsr     zendbyte
                clc                     ; wis carry voor optellen
                lda     work+4          ; stuur x*9+9 naar pc
                adc     #9
                jsr     zendbyte
                lda     work+5
                adc     #0
                jsr     zendbyte
                clc                     ; wis carry
                lda     work+6          ; stuur y*9+161 naar pc
                adc     #161
                jsr     zendbyte
                lda     work+7
                adc     #0
                jsr     zendbyte
                lda     #10             ; wis semafoor
                jsr     osbyte
                rts                     ; einde routine

