40GOTO 250
   60DEFPROCvdu(N)
   70LOCAL D,D$,B,byte,item,lbyte
   80FOR item=1 TO N
   90READ D$
  100IFRIGHT$(D$,1)="@" THEN B=2 ELSE B=1
  110D=EVAL(D$)
  120IFASC(D$)>64 THEN [OPT PASS:LDA D:JSR OSWRCH:]:GOTO160
  130IF D<0 THEN D=(ABS(D) EOR &FFFF)+1
  140byte=D MOD 256:PROCform
  150IF B=2 THEN byte=D DIV 256:PROCform
  160NEXT item
  170ENDPROC
  180 
  190DEFPROCform
  200IF byte<>lbyte THEN [OPT PASS:LDA #byte:]
  210[OPT PASS:JSR OSWRCH:]
  220lbyte=byte
  230ENDPROC
  250OSWRCH=&FFEE:OSBYTE=&FFF4
  260SCR=&70
  270DIM START 1000
  280FOR PASS=0 TO 3 STEP 3
  290P%=START
  300RESTORE
  310 
  320 
  330PROCvdu(29)
  340DATA 22,2,18,0,132,16,18,0,3,25,4,500@,500@,25,1,200@,0@,25,81,0@,-200@,25,1,-200@,0@,25,81,0@,200@
  350 
  360[OPT PASS
  370.BEGIN \ start at screen pos &3000
  380LDA #&00
  390STA SCR
  400LDA #&06
  410STA SCR+1
  420.SCROLL
  430LDA #&13
  440JSR OSBYTE
  450LDA #&0D
  460STA &FE00
  470LDA SCR
  480STA &FE01
  490LDA #&0C
  500STA &FE00
  510LDA SCR+1
  520STA &FE01
  530CLC
  540LDA#&51
  550STA&77
  560JSRadd
  570LDA&78:STA SCR
  580LDA&79:STA SCR+1
  590\ (78/79) and (SCR/SCR+1)
  591\        point to the start of scr mem
  630JSR shuffle
  640JMP SCROLL
  650\
  660\
  670\
  760.add
  761LDA SCR+1:STA&79:LDA SCR:CLC
  762ADC&77
  763STA&78
  764BCC addret
  765LDA SCR+1:CLC:ADC#&01
  766CMP#&10:BNE addend
  767LDA#&06
  768.addend:STA&79
  769.addret:RTS
  770.sub
  771LDA SCR+1:STA&79:LDA SCR:SEC
  772SBC&77:STA&78
  773BCS subret
  775LDA SCR+1:SEC:SBC#&01
  776CMP#&5:BNE subend
  777LDA#&0F
  778.subend:STA&79:.subret:RTS
  779\
  780\
  781\
  890.shuffle \ assumes current screen addr is in 78/79
  900JSR getaddr
  910JSR storetop
  929LDX #&1F \ copy loop starts with 2nd and ends before the last
  930.copyloop
  935LDA&78:STA&88:LDA&79:STA&89:JSR incaddr
  936LDY#&07
  937.move
  939  LDA(&78),Y
  940  STA(&88),Y
  941  DEY
  942BPL move 
  943DEX
  944BNE copyloop
  945RTS
  947JSR incaddr:JSR retrtop
  948RTS
  950\
  951\
  952\
  957.getaddr:ASL&78:ROL&79:ASL&78:ROL&79:ASL&78:ROL&79:RTS
  958.incaddr:CLC:LDA&78:ADC#&80:STA&78:LDA&79:ADC#&02:CMP#&80:BMI incret:SEC:SBC#&50:.incret:STA&79:RTS
  959\
  960.storetop:LDY#&07
  962.loopst
  963LDA(&78),Y
  964STA&60,Y
  965DEY
  966BPL loopst
  967RTS
  980.retrtop:LDY#&07
  982.looprt
  983LDA&60,Y
  984STA(&78),Y
  985DEY
  986BPL looprt
  987RTS:]
  988NEXT PASS
  990END