Advertisement
TSC64

HiRes Plot

Apr 10th, 2020
279
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;******************************************************
  2. ;*  HiRes plot                                        *
  3. ;*   asm routines for hires plotting                  *
  4. ;*   ver 00000001  20200401 - Tonino Scaffidi         *
  5. ;* in this version                                    *
  6. ;*  - PLOT   : plot a pixel in x1H,x1L, y1            *
  7. ;*  - LINEV  : plot a vertical line from x1H,x1L, y1  *
  8. ;*                  to x2H,x2L, y2                    *
  9. ;*  - LINEH  : plot a orizontal line from x1H,x1L, y1 *
  10. ;*                  to x2H,x2L, y2                    *
  11. ;*  - LINE   : plot a generic line from x1H,x1L, y1   *
  12. ;*                  to x2H,x2L, y2 - not completed    *
  13. ;*                                   stay tuned       *
  14. ;* rimane da completare:                              *
  15. ;*  - LINE                                            *
  16. ;*  - altre primitive di disegno (cerchio e ellisse   *
  17. ;*                                  e altro           *
  18. ;*  - gestione interrupt per disabilitare output text *
  19. ;*  - uscita dal hires mode e ritorno allo schermo    *
  20. ;*           testo                                    *
  21. ;******************************************************
  22. *=$C000
  23. ;******************************************************
  24. ; PARAMETRI
  25. ;******************************************************
  26. TV.PTR = $FB    ; QUESTO PUNTATORE CONTIENE L'INDIRIZZO DELL'ATTUALE POSIZIONE DELLO SCHERMO
  27.  
  28. loc    = $5a
  29. mask   = $59
  30. store  = $5c
  31. bmpage = $ff
  32.  
  33. PARAMS=$828
  34. x1L = PARAMS
  35. x1H = PARAMS + 1
  36. y1  = PARAMS + 2
  37. x2L = PARAMS + 3
  38. x2H = PARAMS + 4
  39. y2  = PARAMS + 5
  40. tmp = PARAMS + 6
  41.  
  42. VIC    = $d000      ; VICII Base Address
  43. VICII1 = VIC+17     ; VICII Control Register 1 - Hi Res - 53265
  44. VICII2 = VIC+22     ; VICII Control Register 2 - Hi Res - 53270
  45. VICIIA = VIC+24     ; VICII Start Address Graphic Ram   - 53272
  46.  
  47.  
  48. START     ldx #0      ; 0 in x
  49.           stx $d020   ; sfondo nero
  50.           stx $d021   ; bordo nero
  51.          
  52.           jsr HIRES
  53.           jsr GRRAM
  54.           jsr SETCRAM ; set color ram
  55.           jsr CLEARGR ; Pulisce la Graphic Ram
  56.          
  57.           lda #$A0  ; x= 160
  58.           sta x1L
  59.           lda #$0
  60.           sta x1H
  61.           lda #$0  ; y= 0
  62.           sta y1
  63.           lda #$A0  ; x= 160
  64.           sta x2L
  65.           lda #$0
  66.           sta x2H
  67.           lda #$C8  ; y= 200
  68.           sta y2
  69.           jsr LINE ; LINEV
  70.  
  71.           lda #$0  ; x= 0
  72.           sta x2L
  73.           lda #$0
  74.           sta x2H
  75.           lda #$64  ; y= 100
  76.           sta y2
  77.           lda #$3f  ; x= 319
  78.           sta x1L
  79.           lda #$1
  80.           sta x1H
  81.           lda #$64  ; y= 100
  82.           sta y1
  83.           jsr LINE  ; LINEH
  84.           rts
  85.  
  86. ;******************************************************
  87. ; Passa in modalità hi res
  88. ; 20000 rem turn on hi res graphics
  89. ; 20010 rem   1. set bits 5/6 of v+17
  90. ; 20020 rem   2. clr bit 4 of v+22
  91. ; 20030 poke v+17,peek(v+17) or (11*16)
  92. ; 20040 poke v+22,peek(v+22) and (255-16)
  93. ; 20050 return
  94. ;******************************************************
  95. HIRES     lda VICII1
  96.           ora #$B0    ; $B0 = 173 = 11*16
  97.           sta VICII1
  98.  
  99.           lda VICII2
  100.           and #$EF    ; $EF = 239 = 255-16
  101.           sta VICII2
  102.           rts
  103. ;******************************************************
  104. ; Imposta l'area della ram
  105. ; 21000 rem set graphic ram area
  106. ; 21010 rem   1. set bit 3 of v+24
  107. ; 21020 poke v+24, peek(v+24) or 8
  108. ; 21030 return
  109. ;******************************************************
  110. GRRAM     lda VICIIA
  111.           ora #$8
  112.           sta VICIIA
  113.           rts
  114. ;******************************************************
  115. ; Imposta la COLOR RAM
  116. ; 22000 rem set color ram
  117. ; 22010 rem   1. color ram is 1024-2023
  118. ; 22020 rem   2. set background 1 - white
  119. ; 22030 rem   3. set foreground 0 - black
  120. ; 22040 co = 0*16 + 1
  121. ; 22050 for i = vr to vr+1000
  122. ; 22060 poke i,co
  123. ; 22070 next i
  124. ; 22080 return
  125. ;******************************************************
  126. SETCRAM   jsr TVHOME
  127.           ldx #$0
  128.           ldy #$0
  129. LOOPTV    jsr FILLRIG ; Riempie una riga della memoria colore
  130.           jsr TVGIU
  131.           inx
  132.           cpx #$19    ; #$19 = 25 - numero di righe
  133.           bcc LOOPTV
  134.           rts
  135. ;******************************************************
  136. ; Pulisce la Graphic RAM
  137. ; 23000 rem clear graphic ram
  138. ; 23010 rem   1. graphic ram is ga to
  139. ; 23020 rem        ga + 8000
  140. ; 23030 for i = ga to ga +8000
  141. ; 23040 poke i,0
  142. ; 23050 next i
  143. ; 23060 return
  144. ;******************************************************
  145. CLEARGR   jsr GRHOME
  146.           ldx #$0
  147.           ldy #$0
  148. LOOPGR    jsr FILLGR  ; Riempie una riga della memoria grafica
  149.           jsr GRGIU
  150.           inx
  151.           cpx #$20    ; #$20 = 32 * 250 = 8K
  152.           bcc LOOPGR
  153.           rts
  154.  
  155. FILLGR    lda #$0
  156.           sta(TV.PTR),Y ; SALVA NELLA POSIZIONE SCRIVENDO IL VALORE COLORE
  157.           iny           ; INCREMENTA Y PER LA POSIZONE SUCCESSIVA
  158.           cpy #$FA      ; $FA = 250
  159.           bcc FILLGR
  160.           ldy #$0
  161.           rts
  162.          
  163. GRGIU     lda #$FA   ; $FA =250 differenza indirizzi fra riga e l'altra - SPOSTA TV.PTR ALLA RIGA SUCCESSIVA
  164.           clc
  165.           adc TV.PTR
  166.           bcc NEXT.GRPIU
  167.           inc TV.PTR+1
  168. NEXT.GRPIU
  169.           sta TV.PTR
  170.           rts          ; RITORNA AL PROGRAMMA PRINCIPALE          
  171.          
  172. ; posiziona il puntatore all'inizio della memoria GRAFICA - 8192
  173. GRHOME    LDA #$00
  174.           STA TV.PTR
  175.           LDA #$20
  176.           STA TV.PTR+1
  177.           LDX #$0
  178.           rts        ; RITORNA AL PROGRAMMA PRINCIPALE
  179.          
  180. FILLRIG   lda #$1        ; $1 = 0*16 + 1
  181.           sta(TV.PTR),Y ; SALVA NELLA POSIZIONE SCRIVENDO IL VALORE COLORE
  182.           iny           ; INCREMENTA Y PER LA POSIZONE SUCCESSIVA
  183.           cpy #$28       ; $28=40 - numero di colonne
  184.           bcc FILLRIG
  185.           ldy #$0
  186.           rts
  187.  
  188. TVGIU     lda #$28   ; $28 =40 differenza indirizzi fra riga e l'altra - SPOSTA TV.PTR ALLA RIGA SUCCESSIVA
  189.           clc
  190.           adc TV.PTR
  191.           bcc NEXT.TVPIU
  192.           inc TV.PTR+1
  193. NEXT.TVPIU
  194.           sta TV.PTR
  195.           rts          ; RITORNA AL PROGRAMMA PRINCIPALE
  196.  
  197. ; posiziona il puntatore all'inizio della memoria colore
  198. TVHOME    lda #$00
  199.           sta TV.PTR
  200.           lda #$04
  201.           sta TV.PTR+1
  202.           ldx #$0
  203.           rts          ; RITORNA AL PROGRAMMA PRINCIPALE
  204.  
  205. ;******************************************************
  206. ; Disegna una Linea da x1L-x1H,y1 a x1L-x1H,y2
  207. ;******************************************************
  208. LINE      lda x1L          ; è una linea verticale? cioè x1HL=x2HL?
  209.           cmp x2L
  210.           bne LINENV       ; è una linea non verticale
  211.           lda x1H          ; controllo anche byte alto
  212.           cmp x2H
  213.           bne LINENV       ; è una linea non verticale
  214.           jsr LINEV        ; disegno la linea verticale
  215.           rts
  216. LINENV    nop
  217.           jsr LINEH        ; potrebbe !!! essere orizzontale
  218.           rts          
  219.          
  220.  
  221. ;******************************************************
  222. ; Disegna una Linea Verticale da x1L-x1H,y1 a x1L-x1H,y2
  223. ;******************************************************
  224. LINEV     lda y1         ; controllo se y2>y1
  225.           cmp y2         ; se non lo è li inverto
  226.           bcc PLOTLINEV
  227.           sta tmp        ; y1 -> tmp
  228.           lda y2
  229.           sta y1         ; y2 -> y1
  230.           lda tmp
  231.           sta y2         ; tmp -> y2
  232. PLOTLINEV jsr PLOT       ; disegna il punto x1L-x1H,y1
  233.           inc y1
  234.           lda y1
  235.           cmp y2
  236.           bne PLOTLINEV  ; disegna il punto successivo se non ha finito
  237.           jsr PLOT       ; disegna l'ultimo punto
  238.           rts
  239.  
  240. ;******************************************************
  241. ; Disegna una Linea orizzontale da x1L-x1H,y1 a x2L-x2H,y1
  242. ;******************************************************
  243. LINEH     lda x1H        ; controllo se x1H = x2h
  244.           cmp x2H        ;
  245.           beq PLOTLH     ; se sono uguali posso tracciare
  246.                          ; se sono diversi li metto in ordine crescente, quindi traccio
  247.           cmp #$0        ; se x1H = 0 allora sono in ordine e posso tracciare (dopo averli divisi x1hX1L-255;256-x2Hx2L
  248.           beq SPLITLH    ;
  249.           jsr INVXY1XY2
  250.           jsr SPLITLH
  251.           rts
  252.  
  253. INVXY1XY2 lda x1L
  254.           sta tmp        ; x1L->tmp
  255.           lda x2L
  256.           sta x1L        ; x2L->x1L
  257.           lda tmp
  258.           sta x2L        ; tmp->x2L
  259.           lda #$1
  260.           sta x2H        ; 1 -> x2H
  261.           lda #$0
  262.           sta x1H        ; 0 -> x1H
  263.           rts
  264.          
  265. SPLITLH   lda x2L
  266.           sta tmp
  267.           lda #$FF
  268.           sta x2L
  269.           lda #$0
  270.           sta x2H
  271.           jsr PLOTLINEH
  272.           lda #$0
  273.           sta x1L
  274.           lda #$1
  275.           sta x1H
  276.           lda tmp
  277.           sta x2L
  278.           lda #$1
  279.           sta x2H
  280.           jsr PLOTLINEH
  281.          
  282.           rts
  283.          
  284. PLOTLH    lda x1L        ; controllo se x2L>x1L
  285.           cmp x2L        ; se non lo è li inverto
  286.           bcc PLOTLINEH
  287.           sta tmp        ; x1L -> tmp
  288.           lda x2L
  289.           sta x1L        ; x2L -> x1L
  290.           lda tmp
  291.           sta x2L        ; tmp -> x2L
  292. PLOTLINEH jsr PLOT       ; disegna il punto x1L-x1H,y1
  293.           inc x1L
  294.           lda x1L
  295.           cmp x2L
  296.           bne PLOTLINEH  ; disegna il punto successivo se non ha finito
  297.           jsr PLOT       ; disegna l'ultimo punto
  298.           rts
  299.  
  300. ;******************************************************
  301. ; Disegna un punto coordinate x1L-x1H,y1
  302. ;******************************************************
  303. PLOT      lda x1L
  304.           and #7
  305.           tax
  306.           sec
  307.           lda #0
  308.           sta loc
  309. SHIFT     ror
  310.           dex
  311.           bpl SHIFT
  312.           sta mask
  313.           lda x1L
  314.           and #$f8
  315.           sta store
  316.           lda y1
  317.           lsr
  318.           lsr
  319.           lsr
  320.           sta loc+1
  321.           lsr
  322.           ror loc
  323.           lsr
  324.           ror loc
  325.           adc loc+1
  326.           sta loc+1
  327.           lda y1
  328.           and #7
  329.           adc loc
  330.           adc store
  331.           sta loc
  332.           lda loc+1
  333.           adc x1H
  334.           adc bmpage
  335.           sta loc+1
  336.           ldy #0
  337.           lda (loc),y
  338.           ora mask,y
  339.           sta (loc),y
  340.           rts
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement