Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;******************************************************
- ;* HiRes plot *
- ;* asm routines for hires plotting *
- ;* ver 00000001 20200401 - Tonino Scaffidi *
- ;* in this version *
- ;* - PLOT : plot a pixel in x1H,x1L, y1 *
- ;* - LINEV : plot a vertical line from x1H,x1L, y1 *
- ;* to x2H,x2L, y2 *
- ;* - LINEH : plot a orizontal line from x1H,x1L, y1 *
- ;* to x2H,x2L, y2 *
- ;* - LINE : plot a generic line from x1H,x1L, y1 *
- ;* to x2H,x2L, y2 - not completed *
- ;* stay tuned *
- ;* rimane da completare: *
- ;* - LINE *
- ;* - altre primitive di disegno (cerchio e ellisse *
- ;* e altro *
- ;* - gestione interrupt per disabilitare output text *
- ;* - uscita dal hires mode e ritorno allo schermo *
- ;* testo *
- ;******************************************************
- *=$C000
- ;******************************************************
- ; PARAMETRI
- ;******************************************************
- TV.PTR = $FB ; QUESTO PUNTATORE CONTIENE L'INDIRIZZO DELL'ATTUALE POSIZIONE DELLO SCHERMO
- loc = $5a
- mask = $59
- store = $5c
- bmpage = $ff
- PARAMS=$828
- x1L = PARAMS
- x1H = PARAMS + 1
- y1 = PARAMS + 2
- x2L = PARAMS + 3
- x2H = PARAMS + 4
- y2 = PARAMS + 5
- tmp = PARAMS + 6
- VIC = $d000 ; VICII Base Address
- VICII1 = VIC+17 ; VICII Control Register 1 - Hi Res - 53265
- VICII2 = VIC+22 ; VICII Control Register 2 - Hi Res - 53270
- VICIIA = VIC+24 ; VICII Start Address Graphic Ram - 53272
- START ldx #0 ; 0 in x
- stx $d020 ; sfondo nero
- stx $d021 ; bordo nero
- jsr HIRES
- jsr GRRAM
- jsr SETCRAM ; set color ram
- jsr CLEARGR ; Pulisce la Graphic Ram
- lda #$A0 ; x= 160
- sta x1L
- lda #$0
- sta x1H
- lda #$0 ; y= 0
- sta y1
- lda #$A0 ; x= 160
- sta x2L
- lda #$0
- sta x2H
- lda #$C8 ; y= 200
- sta y2
- jsr LINE ; LINEV
- lda #$0 ; x= 0
- sta x2L
- lda #$0
- sta x2H
- lda #$64 ; y= 100
- sta y2
- lda #$3f ; x= 319
- sta x1L
- lda #$1
- sta x1H
- lda #$64 ; y= 100
- sta y1
- jsr LINE ; LINEH
- rts
- ;******************************************************
- ; Passa in modalità hi res
- ; 20000 rem turn on hi res graphics
- ; 20010 rem 1. set bits 5/6 of v+17
- ; 20020 rem 2. clr bit 4 of v+22
- ; 20030 poke v+17,peek(v+17) or (11*16)
- ; 20040 poke v+22,peek(v+22) and (255-16)
- ; 20050 return
- ;******************************************************
- HIRES lda VICII1
- ora #$B0 ; $B0 = 173 = 11*16
- sta VICII1
- lda VICII2
- and #$EF ; $EF = 239 = 255-16
- sta VICII2
- rts
- ;******************************************************
- ; Imposta l'area della ram
- ; 21000 rem set graphic ram area
- ; 21010 rem 1. set bit 3 of v+24
- ; 21020 poke v+24, peek(v+24) or 8
- ; 21030 return
- ;******************************************************
- GRRAM lda VICIIA
- ora #$8
- sta VICIIA
- rts
- ;******************************************************
- ; Imposta la COLOR RAM
- ; 22000 rem set color ram
- ; 22010 rem 1. color ram is 1024-2023
- ; 22020 rem 2. set background 1 - white
- ; 22030 rem 3. set foreground 0 - black
- ; 22040 co = 0*16 + 1
- ; 22050 for i = vr to vr+1000
- ; 22060 poke i,co
- ; 22070 next i
- ; 22080 return
- ;******************************************************
- SETCRAM jsr TVHOME
- ldx #$0
- ldy #$0
- LOOPTV jsr FILLRIG ; Riempie una riga della memoria colore
- jsr TVGIU
- inx
- cpx #$19 ; #$19 = 25 - numero di righe
- bcc LOOPTV
- rts
- ;******************************************************
- ; Pulisce la Graphic RAM
- ; 23000 rem clear graphic ram
- ; 23010 rem 1. graphic ram is ga to
- ; 23020 rem ga + 8000
- ; 23030 for i = ga to ga +8000
- ; 23040 poke i,0
- ; 23050 next i
- ; 23060 return
- ;******************************************************
- CLEARGR jsr GRHOME
- ldx #$0
- ldy #$0
- LOOPGR jsr FILLGR ; Riempie una riga della memoria grafica
- jsr GRGIU
- inx
- cpx #$20 ; #$20 = 32 * 250 = 8K
- bcc LOOPGR
- rts
- FILLGR lda #$0
- sta(TV.PTR),Y ; SALVA NELLA POSIZIONE SCRIVENDO IL VALORE COLORE
- iny ; INCREMENTA Y PER LA POSIZONE SUCCESSIVA
- cpy #$FA ; $FA = 250
- bcc FILLGR
- ldy #$0
- rts
- GRGIU lda #$FA ; $FA =250 differenza indirizzi fra riga e l'altra - SPOSTA TV.PTR ALLA RIGA SUCCESSIVA
- clc
- adc TV.PTR
- bcc NEXT.GRPIU
- inc TV.PTR+1
- NEXT.GRPIU
- sta TV.PTR
- rts ; RITORNA AL PROGRAMMA PRINCIPALE
- ; posiziona il puntatore all'inizio della memoria GRAFICA - 8192
- GRHOME LDA #$00
- STA TV.PTR
- LDA #$20
- STA TV.PTR+1
- LDX #$0
- rts ; RITORNA AL PROGRAMMA PRINCIPALE
- FILLRIG lda #$1 ; $1 = 0*16 + 1
- sta(TV.PTR),Y ; SALVA NELLA POSIZIONE SCRIVENDO IL VALORE COLORE
- iny ; INCREMENTA Y PER LA POSIZONE SUCCESSIVA
- cpy #$28 ; $28=40 - numero di colonne
- bcc FILLRIG
- ldy #$0
- rts
- TVGIU lda #$28 ; $28 =40 differenza indirizzi fra riga e l'altra - SPOSTA TV.PTR ALLA RIGA SUCCESSIVA
- clc
- adc TV.PTR
- bcc NEXT.TVPIU
- inc TV.PTR+1
- NEXT.TVPIU
- sta TV.PTR
- rts ; RITORNA AL PROGRAMMA PRINCIPALE
- ; posiziona il puntatore all'inizio della memoria colore
- TVHOME lda #$00
- sta TV.PTR
- lda #$04
- sta TV.PTR+1
- ldx #$0
- rts ; RITORNA AL PROGRAMMA PRINCIPALE
- ;******************************************************
- ; Disegna una Linea da x1L-x1H,y1 a x1L-x1H,y2
- ;******************************************************
- LINE lda x1L ; è una linea verticale? cioè x1HL=x2HL?
- cmp x2L
- bne LINENV ; è una linea non verticale
- lda x1H ; controllo anche byte alto
- cmp x2H
- bne LINENV ; è una linea non verticale
- jsr LINEV ; disegno la linea verticale
- rts
- LINENV nop
- jsr LINEH ; potrebbe !!! essere orizzontale
- rts
- ;******************************************************
- ; Disegna una Linea Verticale da x1L-x1H,y1 a x1L-x1H,y2
- ;******************************************************
- LINEV lda y1 ; controllo se y2>y1
- cmp y2 ; se non lo è li inverto
- bcc PLOTLINEV
- sta tmp ; y1 -> tmp
- lda y2
- sta y1 ; y2 -> y1
- lda tmp
- sta y2 ; tmp -> y2
- PLOTLINEV jsr PLOT ; disegna il punto x1L-x1H,y1
- inc y1
- lda y1
- cmp y2
- bne PLOTLINEV ; disegna il punto successivo se non ha finito
- jsr PLOT ; disegna l'ultimo punto
- rts
- ;******************************************************
- ; Disegna una Linea orizzontale da x1L-x1H,y1 a x2L-x2H,y1
- ;******************************************************
- LINEH lda x1H ; controllo se x1H = x2h
- cmp x2H ;
- beq PLOTLH ; se sono uguali posso tracciare
- ; se sono diversi li metto in ordine crescente, quindi traccio
- cmp #$0 ; se x1H = 0 allora sono in ordine e posso tracciare (dopo averli divisi x1hX1L-255;256-x2Hx2L
- beq SPLITLH ;
- jsr INVXY1XY2
- jsr SPLITLH
- rts
- INVXY1XY2 lda x1L
- sta tmp ; x1L->tmp
- lda x2L
- sta x1L ; x2L->x1L
- lda tmp
- sta x2L ; tmp->x2L
- lda #$1
- sta x2H ; 1 -> x2H
- lda #$0
- sta x1H ; 0 -> x1H
- rts
- SPLITLH lda x2L
- sta tmp
- lda #$FF
- sta x2L
- lda #$0
- sta x2H
- jsr PLOTLINEH
- lda #$0
- sta x1L
- lda #$1
- sta x1H
- lda tmp
- sta x2L
- lda #$1
- sta x2H
- jsr PLOTLINEH
- rts
- PLOTLH lda x1L ; controllo se x2L>x1L
- cmp x2L ; se non lo è li inverto
- bcc PLOTLINEH
- sta tmp ; x1L -> tmp
- lda x2L
- sta x1L ; x2L -> x1L
- lda tmp
- sta x2L ; tmp -> x2L
- PLOTLINEH jsr PLOT ; disegna il punto x1L-x1H,y1
- inc x1L
- lda x1L
- cmp x2L
- bne PLOTLINEH ; disegna il punto successivo se non ha finito
- jsr PLOT ; disegna l'ultimo punto
- rts
- ;******************************************************
- ; Disegna un punto coordinate x1L-x1H,y1
- ;******************************************************
- PLOT lda x1L
- and #7
- tax
- sec
- lda #0
- sta loc
- SHIFT ror
- dex
- bpl SHIFT
- sta mask
- lda x1L
- and #$f8
- sta store
- lda y1
- lsr
- lsr
- lsr
- sta loc+1
- lsr
- ror loc
- lsr
- ror loc
- adc loc+1
- sta loc+1
- lda y1
- and #7
- adc loc
- adc store
- sta loc
- lda loc+1
- adc x1H
- adc bmpage
- sta loc+1
- ldy #0
- lda (loc),y
- ora mask,y
- sta (loc),y
- rts
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement