Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- В 16-битные регисты записывается содержимое экрана (слева направо)
- со строки ниже той на которую содержимое регистров будет возвращено (справа налево).
- Используем 8 16-битных регистров перенося 16 символов экрана
- Ускорить можно за счет избавления от цикла в halfHoriz и подставлении
- значений в стек. То-есть firstTblAddr нужно размножить на кол-во
- сдвигаемых строк с генерацией адресов стека для каждого размноженного блока.
- (избавимся от таблицы, но займем памяти больше на firstTblAddr * (lineCount - 1) )
- */
- module vScrollStack
- lineCount: equ 128 // max 128 line addresses for two tables (visual 129 lines)
- tableSize: equ lineCount * 2
- align 256
- tables: // two tables screen addresses
- block tableSize * 2
- saveSP: dw #0000
- //------------------------------
- run:
- xor a
- out (254),a
- call build
- repeat:
- ei
- halt
- call textPrint
- call halfHoriz
- jr repeat
- //------------------------------
- /*
- create 2 table
- first | x = 0; y = 1 |
- second | x = 16;y = 0 |
- */
- build:
- // second table addresses
- ld de,#4010
- ld ix,tables+tableSize
- ld b,lineCount
- 1:
- ld (ix),e
- ld (ix+1),d
- inc ixl
- inc ixl
- call down_de
- djnz 1B
- // first table addresses
- ld de,#4100
- ld ix,tables
- ld b,lineCount
- 2:
- ld (ix),e
- ld (ix+1),d
- inc ixl
- inc ixl
- call down_de
- djnz 2B
- ret
- //------------------------------
- down_de:
- inc d
- ld a,d
- and 7
- jr nz,$+12
- ld a,e
- add a,32
- ld e,a
- jr c,$+6
- ld a,d
- sub 8
- ld d,a
- ret
- //-------------------------------
- halfHoriz:
- ld (saveSP),sp
- ld iyl,lineCount
- ld ix,tables
- hh:
- ld l,(ix)
- ld h,(ix+1)
- ld (firstTblAddr+1),hl
- inc ixh
- ld l,(ix)
- ld h,(ix+1)
- ld (secondTblAddr+1),hl
- dec ixh
- inc ixl
- inc ixl
- firstTblAddr:
- ld sp,0
- // load bottom line into 8 16-bit registers (16 symbols (half screen on horizontal))
- pop hl
- pop de
- pop bc
- exx
- pop hl
- pop de
- pop bc
- pop af
- ex af,af
- pop af
- secondTblAddr:
- ld sp,0
- // keep the top line in reverse
- push af
- ex af,af
- push af
- push bc
- push de
- push hl
- exx
- push bc
- push de
- push hl
- dec iyl
- jp nz,hh
- ld sp,(saveSP)
- ret
- //------------------------------
- restartPause: db 0
- fontLine: db 0
- textPrint:
- ld hl,text
- ld a,(fontLine)
- ex af,af
- ld de,(run-260)
- ld b,16
- plt:
- push bc
- push hl
- ld a,(hl)
- or a
- jr z,waitRestart
- call font
- ld b,0
- ex af,af
- ld c,a
- ex af,af
- add hl,bc
- ld a,(showType)
- or a
- jp nz,bold
- ld a,(hl)
- jr endPrtS
- bold:
- ld a,(hl)
- ld c,a
- rrca
- or c
- endPrtS:
- ld (de),a
- inc e
- pop hl
- inc hl
- pop bc
- djnz plt
- ld a,(showType)
- cp 2
- jr nz,std
- dHeightBit
- ld a,0
- xor 1
- ld (dHeightBit+1),a
- or a
- ret z
- std:
- ex af,af
- inc a
- cp 8
- jr c,cont
- ld hl,(textPrint+1)
- ld bc,16
- add hl,bc
- ld (textPrint+1),hl
- xor a
- cont:
- ld (fontLine),a
- ret
- //------------------------------
- waitRestart:
- pop af
- pop af
- xor a
- dup 16
- ld (de),a
- inc e
- edup
- ld a,(restartPause)
- dec a
- ld (restartPause),a
- ret nz
- ld hl,text
- ld (textPrint+1),hl
- ret
- //------------------------------
- font:
- ; calc address of char in font
- ld l,a,h,0 ; a=char
- add hl,hl,hl,hl,hl,hl
- ld bc,15616-256
- add hl,bc ; hl=address in font
- ret
- //------------------------------
- //------------------------------
- text:
- dm " Hello "
- dm " Hello WORLD "
- dm " any text show "
- dm "again,again....."
- db #0
- //------------------------------
- showType: db 2
- /*
- 0 - standart
- 1 - bold
- 2 - double height + bold
- */
- endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement