home *** CD-ROM | disk | FTP | other *** search
/ Commodore Disk User Volume 4 #1 / Commodore_Disk_User_Vol.4_1_1990_-.d64 / smooth24.asm < prev    next >
Assembly Source File  |  2022-10-26  |  7KB  |  334 lines

  1. ;
  2. ; Smooth scroller, Copyright A.Millett
  3. ;
  4. *=$9c00
  5. ;
  6. vic = 53248                ; Vic chip
  7. sprptrs = 33784
  8. hibits = vic + 16          ; MSB of sprite posns
  9. zptr = $fb
  10. zptr2= $fd
  11. zmsgptr = $fb
  12. kbhit = 198                ; Set if char typed.
  13. vdu = 32768                ; Loc of screen
  14. colram = $d800             ; Loc of color ram
  15. ;
  16. ;                  Jump vector table..
  17. dosmooth.
  18.   jmp main
  19. resetsmooth.
  20.   jmp init
  21. jspecialfx.
  22.   jmp specialfx
  23. jdorotate.
  24.   jsr dorotatechar
  25. jwait1scr.
  26.   jmp wait1scr
  27. jfillvdu.
  28.   jmp fillvdu
  29. jdo1dot.
  30.   jmp do1dot
  31. ;
  32.   .byte 0,0,0
  33.   .byte 0,0,0,0,0,0,0,0
  34.   .byte 0,0,0,0,0,0,0,0
  35.   .byte 0,0,0,0,0,0,0,0
  36. ;    Ok, flags start at $9c28
  37. ;
  38. msgptr.             ; If any scroll of edge, this is ptr to new spr
  39.   .word $9000
  40. msgloc.
  41.   .word $9000
  42. chrsetloc.         ; Loc of user def char set
  43.   .word $8800
  44. index.
  45.   .byte 0
  46. rmarg.              ; Reset pos for new spr
  47.   .byte 112
  48. lmarg.
  49.   .byte 24
  50. hspacing.          ; Horizontal spacing of sprites.
  51.   .byte 46
  52. scolor.            ; Sprite color
  53.   .byte 1
  54. widemode.          ; Double width sprites
  55.   .byte 255
  56. wiggleflag.        ; Set for jumping scroll
  57.   .byte 0
  58. speed.             ; Scroll speed in x/50 sec/dot
  59.   .byte 0
  60. sproffset.         ; Start of sprites
  61.   .byte 127
  62. hline.             ; Screen line for scroll
  63.   .byte 224
  64. moveby2flag.       ; Move scroll by 2 if bit 7 set
  65.   .byte 0
  66. fillchar.          ; Char for screen fill
  67.   .byte 87
  68. tickchar.          ; Char used for 'tick' fx
  69.   .byte 209
  70. rotchar.           ; Char rotated for moving background
  71.   .byte 87
  72. rotlen.            ; No of pixels to rotate
  73.   .byte 7
  74. fillcolor.         ; Color for screen fill
  75.   .byte 0
  76. mask.
  77.   .byte 1,2,4,8,16,32,64,128
  78. wiggle.             ; Vert wiggle factor
  79.   .byte 7,5,4,3,2,1,1,0,0,0,1,1,2,3,4,5
  80. ;
  81. ;
  82. main.
  83. mainloop.
  84.   jsr dorotatechar ; Rotate scrolling background
  85.   ldx speed        ; First wait for a time & sync to screen
  86. wloop.
  87.    jsr wait1scr
  88.    dex
  89.   bpl wloop
  90.   jsr do1dot       ; Scroll message 1 dot..
  91.   bit moveby2flag  ; 2 dot move ?
  92.   bpl no2move      ; No..
  93.   jsr do1dot       ; Scroll message 1 more dot..
  94. no2move.
  95.   lda kbhit
  96.   beq mainloop     ; No key hit, reloop..
  97.   rts              ; Ok, done!
  98. ;
  99. do1dot.             ; Scroll 1 dot left,
  100.   ldx #$00          ; Index into sprites
  101.   ldy #$00
  102.   sty index
  103. more.
  104.   lda vic,x
  105.   bne nohi          ; No overflow..
  106.    lda mask,y       ; Get hi bit
  107.    and hibits
  108.    bne nonew        ; Set, so clear..
  109.     jsr newsprite   ; Start a new sprite
  110.     clc
  111.     bcc nohi
  112. nonew.              ; Lo byte overflow, clr hi bit
  113.    lda mask,y
  114.    eor # $ff        ; Calc mask for hi bit
  115.    and hibits
  116.    sta hibits
  117. nohi.               ; Ok, now set vert pos
  118.   dec vic,x         ; Move spr left
  119.   ldy index
  120.   lda #0
  121.   bit wiggleflag   ; Do we wiggle ?
  122.   bpl nowiggle
  123.   lda vic,x        ; use hpos as index to wiggle
  124.   and # $0f
  125.   tay
  126.   lda wiggle,y
  127. nowiggle.
  128.   clc              ; Now add in norm vert line
  129.   adc hline
  130.   sta vic+1,x      ; Store vert pos for sprite.
  131.   inc index        ; Ok, next sprite..
  132.   ldy index
  133.   inx
  134.   inx
  135.   cpy # 8
  136.   bne more         ; next sprite..
  137.   rts              ; Ok, done!
  138. ;
  139. newsprite.         ; Start a new sprite
  140.    lda rmarg       ; Start new sprite far right
  141.    sta vic,x
  142.    lda mask,y
  143.    ora hibits      ; Set hi bit
  144.    sta hibits
  145. nextmsg.           ; Advance message pointer
  146.    inc msgptr
  147.    bne getmsg
  148.    inc msgptr+1
  149. getmsg.            ; Get char from msg string
  150.    lda msgptr      ; Mov ptr to zero page
  151.    sta zmsgptr
  152.    lda msgptr+1
  153.    sta zmsgptr+1
  154.    ldy #0
  155.    lda (zmsgptr),y    ; Get msg char
  156.    bne new2        ; Not null yet, so print..
  157.     lda msgloc     ; End of message, so reset msg to start
  158.     sta msgptr
  159.     lda msgloc+1
  160.     sta msgptr+1
  161.     clc
  162.     bcc getmsg
  163. new2.
  164.    bpl normlet     ; No special effects
  165.    cmp #128       ; Toggle wiggle ?
  166.    bne new3
  167.     lda #$80
  168.     eor wiggleflag
  169.     sta wiggleflag
  170.     clc
  171.     bcc nextmsg    ; Another msg char..
  172. new3.
  173.    cmp #129       ; Toggle 2 dot speed?
  174.    bne new4
  175.     lda #$80
  176.     eor moveby2flag
  177.     sta moveby2flag
  178.     clc
  179.     bcc nextmsg    ; Another msg char..
  180. new4.
  181.     and #$1f
  182.     sta speed
  183.     clc
  184.     bcc nextmsg    ; Another msg char..
  185. normlet.           ; Ok norm letter in acc, store in sprite ptr
  186.    ldy index
  187.    clc
  188.    adc sproffset
  189.    sta sprptrs,y
  190.    jsr specialfx   ; Move line in ball chr
  191.    rts
  192. ;
  193. specialfx.         ; Move line in ball chr
  194.    tya
  195.    pha             ; stash y reg
  196.    lda tickchar    ; Character to tick
  197.    jsr setchrptr   ; Set up (zptr) to char
  198.    ldy #3
  199.    lda (zptr),y
  200.    pha
  201.    iny
  202.    lda (zptr),y
  203.    dey
  204.    sta (zptr),y
  205.    pla
  206.    iny
  207.    sta (zptr),y
  208.    pla
  209.    tay
  210.    rts
  211. ;
  212. dorotatechar.      ; Rotate special char vertically for effect
  213.    tya
  214.    pha             ; stash y reg
  215.    lda rotchar     ; Character to rotate
  216.    jsr setchrptr   ; Set up (zptr) to char
  217.    ldy rotlen      ; No to rotate
  218.    lda (zptr),y    ; Stash top one
  219.    pha
  220. spec1.
  221.     dey             ; Ripple bytes down..
  222.     lda (zptr),y
  223.     iny
  224.     sta (zptr),y
  225.     dey
  226.    bne spec1
  227.    pla
  228.    sta (zptr),y    ; Reget top val and put at bottom
  229.    pla             ; Reget y reg
  230.    tay
  231.    rts
  232. ;
  233. setchrptr.         ; Set up (zptr) to point to loc of char in Acc
  234.   ldy #0           ; Clr hi byte zptr
  235.   sty zptr+1
  236.   asl a            ; Mult char by 8
  237.   rol zptr+1
  238.   asl a
  239.   rol zptr+1
  240.   asl a
  241.   rol zptr+1
  242.   clc              ; Add in chr address to chrset location
  243.   adc chrsetloc
  244.   sta zptr
  245.   lda zptr+1
  246.   adc chrsetloc+1
  247.   sta zptr+1
  248.   rts
  249. ;
  250. fillvdu.           ; Fill vdu with (fillchar)
  251.   jsr setcolor     ; Fill color ram
  252.   lda fillchar
  253.   ldy #0
  254. fill1.
  255.   sta vdu,y
  256.   sta vdu+256,y
  257.   sta vdu+512,y
  258.   sta vdu+768,y
  259.   iny
  260.   bne fill1
  261.   rts
  262. ;
  263. setcolor.          ; Fill color ram with (fillcolor)
  264.   lda fillcolor
  265.   ldy #0
  266. fill2.
  267.   sta colram,y
  268.   sta colram+256,y
  269.   sta colram+512,y
  270.   sta colram+768,y
  271.   iny
  272.   bne fill2
  273.   rts
  274. ;
  275. wait1scr.          ; Wait for screen to finish
  276.    lda vic+18      ; Current raster val
  277.    cmp #250
  278.    bcc wait1scr
  279. wait2.
  280.    lda vic+18      ; Current raster val
  281.    cmp #250
  282.    bcs wait2
  283.    rts
  284. ;
  285. init.              ; Initialise sprite positions and switch them on
  286.   lda #0
  287.   sta hibits
  288.   sta wiggleflag   ; No wiggle to start
  289.   sta moveby2flag  ; Slow to start
  290.   lda msgloc       ; Reset message pointer
  291.   sta msgptr
  292.   lda msgloc+1
  293.   sta msgptr+1
  294.   ldx #0
  295.   ldy #0
  296.   lda lmarg        ; Xpos index lo
  297.   sta zptr
  298.   stx zptr+1       ; Xpos hi
  299. init1.
  300.   lda hline
  301.   sta vic+1,x      ; Set Y pos of sprite
  302.   lda zptr
  303.   sta vic,x        ; Set sprite X pos lo byte
  304.   lda zptr+1       ; Any hi bit for sprite?
  305.   beq init2        ; Leave hi bit clr
  306.    lda mask,y      ; Set sprite(y) hi bit
  307.    ora hibits
  308.    sta hibits
  309. init2.
  310.   lda scolor       ; Ok, Set color for sprite
  311.   sta vic+39,y
  312.   lda sproffset
  313.   clc
  314.   adc #1           ; all sprite start spc
  315.   sta sprptrs,y
  316.   lda zptr
  317.   clc
  318.   adc hspacing
  319.   sta zptr
  320.   bcc init3
  321.   inc zptr+1
  322. init3.
  323.   inx
  324.   inx
  325.   iny
  326.   cpy #8
  327.   bne init1
  328.   lda widemode
  329.   sta vic+29
  330.   lda #255
  331.   sta vic+21       ; Switch on sprites
  332.   rts
  333. ;
  334.