Ok, per quanto riguarda il programma convertito, la cosa dell'effetto rimbalzante mi ha incuriosito, e ho notato che succede perche' impiega troppo tempo a muovere lo schermo in alto di un carattere. Ho tentato prima scrivendo la routine che trasferisce byte per byte con indicizzazione, ma anche cosi' ci sono alcuni movimenti brutali in cima allo schermo. Risolto "srotolando" completamente la routine, con grande perdita di memoria (si passa da 300bytes a quasi 6000!)
Ho usato DASM che permette l'uso di macro
;scroll verticale senza IRQ
; iAN CooG/HokutoForce
org $0801
offset = $fe
inout = $fd
counter = $fc
.word EndOfLine
.word 7102
.byte $9e
.byte "2061"
.byte 0
EndOfLine
.byte 0
.byte 0
;---------------------------------------------
lda $d011
and #$f7
sta $d011
lda #1
jsr $e536
lda #0
sta offset
sta inout
;---------------------------------------------
linea40
lda #$07
sta counter
jsr scroll
jsr hardscroll
jsr printstring; stampa la stringa spostata
jsr calcoffset ; per rendere piu' evidente
; l'effetto "rimbalzante"
dec counter
;---------------------------------------------
innerloop
lda $dc01 ; fire joy2
and $dc00 ; fire joy1/spazio
and #$10
beq getouttahere
jsr scroll
ldx #$0a
d1 lda $d012
bne d1
dex
bne d1
dec counter
lda counter
cmp #$ff ; negativo?
bne innerloop; no, fai la next
jmp linea40 ; si, ripeti il tutto
;---------------------------------------------
getouttahere
lda #$1b
sta $d011
rts
;---------------------------------------------
scroll
lda $d012
cmp #$fe
bne scroll ; ripeti finche' non leggi 0
lda $d011
and #$f8
ora counter
sta $d011
;sta $d020
rts
;---------------------------------------------
calcoffset
lda inout ; 0 all'indietro
beq jout ; 1 in avanti
dec offset
lda offset
;cmp #00
beq swap
rts
;---------------------------------------------
jout
inc offset
lda offset
cmp #40-(strend-stringa)
beq swap
rts
;---------------------------------------------
swap
lda inout
eor #01
sta inout
rts
;---------------------------------------------
stringa
; ecco perche' nonostante sia un ottimo x-asm, odio dasm :-/
.byte " ", "h"-$60,"e"-$60,"l"-$60,"l"-$60,"o"-$60," "
strend
;---------------------------------------------
printstring
lda offset
tax
ldy #0
str
lda stringa,y
sta $0400+24*40,x
inx
iny
cpy #(strend-stringa)
bne str
rts
;---------------------------------------------
hardscroll
;VERSIONE 1 : troppo lenta via kernal
;lda #$0d
;jmp $ffd2
;VERSIONE 2 : troppo lenta anche cosi'!!
; ldy #$27
; trrr
; R set 0
; repeat 24
; RR set R+1
; lda $0400+RR *40,y
; sta $0400+R *40,y
; R set R+1
; repend
; dey
; bmi outh
; jmp trrr
; outh
; rts
;VERSIONE 3 : completamente unrolled
R set 0
repeat 24
RR set R+1
C set 0
repeat 40
lda $0400+RR *40+C
sta $0400+R *40+C
C set C+1
repend
R set R+1
repend
rts
compilare con:
dasm b2l_2.asm -v2 -ob2l_2.prg -lb2l_2.lst
il file .lst serve per vedere il codice risultante, da tenere sempre d'occhio per eventuali errori.
NP: Anthrax - Persistence of Time