; This is a little scrolling demo I made ; to demostrate the use of rld \ dec hl ; for very fast horizontal scrolling. ; It is also a good example of how to use ; constants and preprocessor commands to ; easily make changes to your program. ; ; Ben Mickle ; October 30, 1999 #include "ti86asm.inc" ;********************* ; Constants ;********************* #define ScreenWidth 16 ;in bytes (must be from 12-16) pretty cool, eh :-) #define ScreenHeight 8 ;in 8-bit chunks (tiles) must be 8 or less ;********************* ; Variables ;********************* scroll_place =$8100 scroll_offset =$8102 ;********************* ; Screen Buffer Planes ;********************* bufferbyte =$82 buffer =bufferbyte*$100 buffer2 =buffer+((ScreenHeight*8)*ScreenWidth) buffer_end =buffer+((ScreenHeight*16)*ScreenWidth) .org _asm_exec_ram Start: call _clrLCD call _runindicoff call OpenGray xor a ld (scroll_offset),a ld h,a ld l,a ld (scroll_place),hl call DrawTiles MainLoop: ld hl,buffer ld de,$FC00 #if ScreenWidth = 16 ld bc,1024 ldir #else ld a,ScreenHeight*8 CopyLoop1: ld bc,ScreenWidth ldir inc de #if ScreenWidth < 15 inc de #endif #if ScreenWidth < 14 inc de #endif #if ScreenWidth < 13 inc de #endif dec a jr nz,CopyLoop1 #endif ld de,$CA00 #if ScreenWidth = 16 ld bc,1024 ldir #else ld a,ScreenHeight*8 CopyLoop2: ld bc,ScreenWidth ldir #if ScreenWidth < 16 inc de #endif #if ScreenWidth < 15 inc de #endif #if ScreenWidth < 14 inc de #endif #if ScreenWidth < 13 inc de #endif dec a jr nz,CopyLoop2 #endif call _get_key cp K_EXIT jp z,Exit ld a,%01111110 out (1),a nop nop in a,(1) bit 2,a jr nz,MainLoop Scroll: ld b,ScreenHeight ld hl,buffer_end-1 ScrollLoop: push bc push hl dec b ld c,ScreenWidth call GetTile add a,a ld e,a ld d,0 ld hl,TileTable add hl,de ld a,(hl) inc hl ld h,(hl) ld l,a ld de,15 add hl,de ex de,hl pop hl call ScrollBuffer push hl ld bc,-((buffer2-buffer)-(8*ScreenWidth)) add hl,bc call ScrollBuffer pop hl pop bc djnz ScrollLoop ld a,(scroll_offset) xor 1 ld (scroll_offset),a jp nz,MainLoop ld hl,(scroll_place) push hl ld de,ScreenWidth+1 add hl,de ld de,(LevelSize) or a sbc hl,de pop hl jr nz,NotEndOfLevel ld hl,-ScreenWidth-1 NotEndOfLevel: inc hl ld (scroll_place),hl jp MainLoop ScrollBuffer: ld b,8 ld a,(scroll_offset) ld c,a ScrollScreenLoop: ld a,(de) bit 0,c jr nz,NoSwap rlca rlca rlca rlca NoSwap: dec de rld dec hl rld dec hl rld dec hl rld ;4 dec hl rld dec hl rld dec hl rld dec hl rld ;8 dec hl rld dec hl rld dec hl rld dec hl #if ScreenWidth >= 12 rld ;12 dec hl #endif #if ScreenWidth >= 13 rld dec hl #endif #if ScreenWidth >= 14 rld dec hl #endif #if ScreenWidth >= 15 rld dec hl #endif #if ScreenWidth >= 16 rld ;16 dec hl #endif djnz ScrollScreenLoop ret Exit: call _homeup jp CloseGray DrawTiles: ld hl,Level ld b,0 DrawCol: push bc ld c,0 DrawRow: ld a,(hl) push hl push bc add a,a ld e,a ld d,0 ld hl,TileTable add hl,de ld a,(hl) inc hl ld h,(hl) ld l,a push hl pop ix ld a,b add a,a add a,a add a,a ld l,a ld h,0 #if ScreenWidth = 16 add hl,hl add hl,hl add hl,hl add hl,hl #endif #if ScreenWidth = 15 push hl add hl,hl push hl add hl,hl push hl add hl,hl pop de add hl,de pop de add hl,de pop de add hl,de #endif #if ScreenWidth = 14 add hl,hl push hl add hl,hl ld d,h ld e,l add hl,hl add hl,de pop de add hl,de #endif #if ScreenWidth = 13 push hl add hl,hl add hl,hl ld d,h ld e,l add hl,hl add hl,de pop de add hl,de #endif #if ScreenWidth = 12 add hl,hl add hl,hl ld d,h ld e,l add hl,hl add hl,de #endif ld de,buffer add hl,de ld b,0 add hl,bc ld b,8 DR_DrawLoop: ld a,(ix) ld (hl),a ld de,buffer2-buffer add hl,de ld a,(ix+8) ld (hl),a ld de,-(buffer2-buffer)+ScreenWidth add hl,de inc ix djnz DR_DrawLoop pop bc pop hl inc hl inc c ld a,c cp ScreenWidth jr nz,DrawRow push hl ld hl,(LevelSize) ld de,-ScreenWidth add hl,de ex de,hl pop hl add hl,de pop bc inc b #if ScreenHeight = 8 bit 3,b jr z,DrawCol #else ld a,b cp ScreenHeight jr nz,DrawCol #endif ret ; coords in (c,b) GetTile: ld hl,Level ld de,(scroll_place) add hl,de ld de,(LevelSize) ld a,b or a jr z,GetTileNoLoop GetTileLoop: add hl,de djnz GetTileLoop GetTileNoLoop: add hl,bc ld a,(hl) ret #include gray_lib.h TileTable: .dw BlankSprite .dw CloudLeft .dw CloudRight .dw Brick1 .dw Brick2 LevelSize: .dw 20 Level: .db 0,0,1,2,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0 .db 0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0 .db 0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,1,2,0,0 .db 0,0,0,0,4,4,4,0,0,0,0,1,2,0,0,0,0,0,0,0 .db 0,0,0,3,3,3,3,3,0,0,0,0,0,0,0,3,3,3,0,0 .db 0,0,4,4,4,4,4,4,4,0,0,0,0,0,3,4,3,3,0,0 .db 0,3,3,3,3,3,3,3,3,3,0,0,0,3,3,3,4,3,0,0 .db 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 BlankSprite: .dw 0,0,0,0,0,0,0,0 CloudLeft: .db %00000000 .db %00000000 .db %00000000 .db %00000000 .db %00000000 .db %00000000 .db %00000000 .db %00000000 .db %01101101 .db %10010010 .db %10000000 .db %10000000 .db %01000000 .db %10000000 .db %10001001 .db %01110110 CloudRight: .db %00000000 .db %00000000 .db %00000000 .db %00000000 .db %00000000 .db %00000000 .db %00000000 .db %00000000 .db %11011010 .db %00100101 .db %00000001 .db %00000001 .db %00000010 .db %00000001 .db %01001001 .db %10110110 Brick1: .db %11111111 .db %11111111 .db %11011011 .db %11111111 .db %11111111 .db %11011011 .db %11111111 .db %11111111 .db %11111111 .db %10000001 .db %10100101 .db %10000001 .db %10000001 .db %10100101 .db %10000001 .db %11111111 Brick2: .db %11111111 .db %11000011 .db %10100101 .db %10011001 .db %10011001 .db %10100101 .db %11000011 .db %11111111 .db %11111111 .db %10111101 .db %11011011 .db %11100111 .db %11100111 .db %11011011 .db %10111101 .db %11111111 .end