;; Test scrolling mid-line up, down, left and right org &8000 nolist ;;write direct "plusscrl.bin" ;;run start scr_set_mode equ &bc0e txt_output equ &bb5a start: ;; initialise a display window of 48x35 characters ;; each character is 8 scanlines tall ;; set character height to 8 scanlines ld bc,&bc09 out (c),c ld bc,&bd00+7 out (c),c ;; set default horizontal total (set horizontal total to 64 CRTC characters ;; = 64 microseconds) ld bc,&bc00 out (c),c ld bc,&bd00+&3f out (c),c ;; set default vertical total (set vertical total to 39 CRTC character-lines) ld bc,&bc04 out (c),c ld bc,&bd00+38 out (c),c ;; setup default horizontal and vertical sync widths ;; this is compatible with CRTC type 2 based on the width ;; and hsync position defined in this example ld bc,&bc03 out (c),c ld bc,&bd00+&89 out (c),c ;; setup default vertical adjust ld bc,&bc05 out (c),c ld bc,&bd00 out (c),c ;; setup default interlace & skew ld bc,&bc08 out (c),c ld bc,&bd00 out (c),c ;; set width of display window ;; this value is compatible with crtc type 2 ld bc,&bc01 out (c),c ld bc,&bd00+48 out (c),c ;; set horizontal sync position; and therefore the ;; horizontal position of the display window ;; within the monitor display ;; ;; this value is compatible with crtc type 2 ld bc,&bc02 out (c),c ld bc,&bd00+48 out (c),c ;; set height of display window ld bc,&bc06 out (c),c ld bc,&bd00+35 out (c),c ;; set vertical sync position; and therefore the ;; vertical position of the display window ;; within the monitor display ld bc,&bc07 out (c),c ld bc,&bd00+35 out (c),c ;; set display start ;; force MA11=MA10=1, so that the internal MA ;; counter will increment enough to change MA12. ;; the displayed data is &0000-&7fff ld bc,&bc0c out (c),c ld bc,&bd00+&0c out (c),c ld bc,&bc0d out (c),c ld bc,&bd00+0 out (c),c di ld b,&bc ld hl,sequence ld e,17 seq: ld a,(hl) out (c),a inc hl dec e jr nz,seq ld hl,&c9fb ld (&0038),hl ei ld bc,&7fb8 out (c),c ld a,8 ld (&6800),a mainloop: ;; scroll down ld a,(vscroll1) add a,16 and %01110000 ld (vscroll1),a ;; scroll up ld a,(vscroll2) sub 16 and %01110000 ld (vscroll2),a ;; scroll right ld a,(hscroll1) inc a and %1111 ld (hscroll1),a ;; scroll left ld a,(hscroll2) dec a and %1111 ld (hscroll2),a ;; scroll down ld a,(vscroll3) add a,16 and %01110000 or %10000000 ld (vscroll3),a ;; scroll up ld a,(vscroll4) sub 16 and %01110000 or %10000000 ld (vscroll4),a ;; scroll right ld a,(hscroll3) inc a and %1111 or %10000000 ld (hscroll3),a ;; scroll left ld a,(hscroll4) dec a and %1111 or %10000000 ld (hscroll4),a halt ld hl,&6804 ;; [3] ld de,(vscroll) ;; [6] call set_scroll ld a,58 ld (&6800),a halt ld hl,&6804 ;; [3] ld de,(vscrollb) ;; [6] call set_scroll ld a,106 ld (&6800),a halt ld hl,&6804 ld de,(hscroll) call set_scroll ld a,154 ld (&6800),a halt ld hl,&6804 ld de,(hscrollb) call set_scroll ld a,8 ld (&6800),a jp mainloop set_scroll: ;; 5 here xor a ;; [1] defs 54 ;; no scroll initially ld (hl),a ;; [2] ld c,32 ;; [2] set_scroll2: defs 4 ld (hl),D ;; [2] defs 8 ;; middle non-scrolling section ld (hl),a ;; [2] defs 6 ld (hl),e ;; [2] defs 8 ld (hl),a ;; [2] defs 26 dec c ;; [1] jp nz,set_scroll2 ;; [3] ;; and end with no scroll ld (hl),a ret vscroll: vscroll1: defb 0 vscroll2: defb 0 vscrollb: vscroll3: defb 0 vscroll4: defb 0 hscroll: hscroll1: defb 0 hscroll2: defb 0 hscrollb: hscroll3: defb 0 hscroll4: defb 0 sequence: defb &ff,&00,&ff,&77,&b3,&51,&a8,&d4,&62,&39,&9c,&46,&2b,&15,&8a,&cd,&ee ;;end start