Login

Subversion Repositories NedoOS

Rev

Rev 1346 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

COLOR=1
;; Usual speccy screen driver
    module TextMode
init:
    ld hl, font_file, b, Dos.FMODE_READ
    call Dos.fopen
    push af
    ld bc, 2048, hl, font64
    call Dos.fread
    pop af
    call Dos.fclose
        xor a : out (#fe), a
        ret
cls:
    ld de, 0 : call gotoXY
    ld a, 7 : call Memory.setPage
    xor a : out (#fe), a
    ld hl, #c000, de, #c001, bc, 6911, (hl), a : ldir
    jp Memory.setPage
   

; Set console coordinates
; d = row(0..23), e = column (0..63)
gotoXY:
        rr e
        ld a, 0
        ld (half_tile_screen), a
    ld (col_screen), de
    ret    

disable:
    ; Nothing to disable
    ret

; H - line
; A - char
fillLine:
    push af
    ld d, h, e, 0 : call gotoXY
    pop af
    ld hl, fill_buff, de, fill_buff + 1, bc, 63, (hl), a : ldir
    ld hl, fill_buff : jp printZ

usualLine:
    ld b, a
    ld c, 0
    call bc_to_attr
    ld a, 7 : call Memory.setPage
    ld (hl), #7
    ld de, hl
    inc de
    ld bc, 31
    ldir
    xor a : call Memory.setPage
    ret

highlightLine:
    ld b, a
    ld c, 0
    call bc_to_attr
    ld a, 7 : call Memory.setPage
    ld (hl), #C
    ld de, hl
    inc de
    ld bc, 31
    ldir
    xor a : call Memory.setPage
    ret

mvCR
        ld de, (col_screen)
        inc d
        ld e, 0
        ld a, 0
        ld (half_tile_screen), a
        jp gotoXY
       
; Print just one symbol
; A - symbol
putC
    cp 13 : jp z, mvCR

        ld hl, single_symbol
        ld (hl), a
        ld a, 7 : call Memory.setPage
    ld hl, single_symbol_print
    call printL
    xor a : jp Memory.setPage

; Put string
; hl - string pointer that's begins from symbol count
printZ
    ld a, (hl) : and a : ret z
    push hl
    call putC
    pop hl
    inc hl
    jr printZ
   
printL 
        ld      a, (hl)
                and     a
                ret     z

                push    hl
                call    calc_addr_attr
                ld      a,(attr_screen)
                ld      (hl),a
                pop     hl

                call    calc_addr_scr

                ld      a,(half_tile_screen)
                bit     0,a
                ld      a,(hl)
                jp      nz,print64_4
print64_3
        push    af
                push    hl
                call    calc_addr_attr
                ld      a,(attr_screen)
                ld      (hl),a
                pop     hl
       
        inc     hl
        push    hl
       
        ld      a,(hl)
                ld      l,a
                ld      h,0
                add     hl,hl
                add     hl,hl
                add     hl,hl
        ld      bc,font64
        add     hl,bc

        push    de
       
        ld      b,6
                xor     a
                ld      (de),a
print64_1  
        inc     d
        ld      a,(hl)
        and     #f0
        ld      (de),a
        inc     hl
        djnz    print64_1

        inc     d
        xor     a
        ld      (de),a

        ld      a,1
        ld      (half_tile_screen),a

        pop     de
        pop     hl
        pop     af

        dec     a
        ret     z

print64_4      
        push    af

        inc     hl
        push    hl

        ld      a,(hl)
        ld      l,a
        ld      h,0
        add     hl,hl
        add     hl,hl
        add     hl,hl
        ld      bc,font64
        add     hl,bc

        push    de

        ld      b,6
        xor     a
        ld      (de),a
print64_2      
        inc     d
        ld      a,(hl)
        and     #0f
        ld      c,a
        ld      a,(de)
        or      c
        ld      (de),a
        inc     hl
        djnz    print64_2

        inc     d
        xor     a
        ld      (de),a

        ld      (half_tile_screen),a

        pop     de

        call    move_cr64

        pop     hl
        pop     af
        dec     a
       
        jp      nz,print64_3

        ret

; move cursor
move_cr64      
        inc     de

        ld      hl,col_screen
        inc     (hl)
        ld      a,(hl)

        cp      32
        ret     c

        xor     a
        ld      (half_tile_screen),a
        ld      (hl),a
        ld      c,a

        inc     hl
        inc     (hl)
        ld      a,(hl)
        ld      b,a

        cp      24
        jp      c,move_cr64_01

        ld      a,23
        ld      (hl),a
        ld      b,a

        push    bc
        call    scroll_up8
        pop     bc

move_cr64_01   
        call    calc_addr_scr
        ret

calc_addr_scr          
        ld      a,b
        ld      d,a
        rrca
        rrca
        rrca
        and     a,224
        add     a,c
        ld      e,a
        ld      a,d
        and     24
        or      #c0
        ld      d,a
        ret

calc_addr_attr         
        ld      bc,(col_screen)
bc_to_attr:
        ld      a,b
        rrca
        rrca
        rrca
        ld      l,a
        and     31
        or      #d8
        ld      h,a
        ld      a,l
        and     252
        or      c
        ld      l,a
        ret

scroll_up8             
        ld      hl,table_addr_scr
        ld      b,184

scroll_up8_01          
        push    bc

        ld      e,(hl)
        inc     hl
        ld      d,(hl)
        inc     hl

        push    hl

        ld      bc,14
        add     hl,bc
        ld      c,(hl)
        inc     hl
        ld      b,(hl)

        ld      h,b
        ld      l,c

        ld      bc,32
        ldir

        pop     hl
        pop     bc
        djnz    scroll_up8_01

        ld      b,8

scroll_up8_02          
        push    bc

        ld      e,(hl)
        inc     hl
        ld      d,(hl)
        inc     hl

        push    hl

        ld      h,d
        ld      l,e
        inc     de
        ld      (hl),0
        ld      bc,31
        ldir

        pop     hl
        pop     bc
        djnz    scroll_up8_02
        ld      de,#D800, hl,#D820, bc,736
        ldir
        ld      a,(de)
        ld      hl,#dae0, de,#dae1, (hl),a, bc,31
        ldir

        ret

font64 equ #4000 ; Using ZX-Spectrum screen as font buffer
font_file db "data/font64.bin", 0


table_addr_scr         
        defw    #4000,#4100,#4200,#4300,#4400,#4500,#4600,#4700
        defw    #4020,#4120,#4220,#4320,#4420,#4520,#4620,#4720
        defw    #4040,#4140,#4240,#4340,#4440,#4540,#4640,#4740
        defw    #4060,#4160,#4260,#4360,#4460,#4560,#4660,#4760
        defw    #4080,#4180,#4280,#4380,#4480,#4580,#4680,#4780
        defw    #40a0,#41a0,#42a0,#43a0,#44a0,#45a0,#46a0,#47a0
        defw    #40c0,#41c0,#42c0,#43c0,#44c0,#45c0,#46c0,#47c0
        defw    #40e0,#41e0,#42e0,#43e0,#44e0,#45e0,#46e0,#47e0

        defw    #4800,#4900,#4a00,#4b00,#4c00,#4d00,#4e00,#4f00
        defw    #4820,#4920,#4a20,#4b20,#4c20,#4d20,#4e20,#4f20
        defw    #4840,#4940,#4a40,#4b40,#4c40,#4d40,#4e40,#4f40
        defw    #4860,#4960,#4a60,#4b60,#4c60,#4d60,#4e60,#4f60
        defw    #4880,#4980,#4a80,#4b80,#4c80,#4d80,#4e80,#4f80
        defw    #48a0,#49a0,#4aa0,#4ba0,#4ca0,#4da0,#4ea0,#4fa0
        defw    #48c0,#49c0,#4ac0,#4bc0,#4cc0,#4dc0,#4ec0,#4fc0
        defw    #48e0,#49e0,#4ae0,#4be0,#4ce0,#4de0,#4ee0,#4fe0

        defw    #5000,#5100,#5200,#5300,#5400,#5500,#5600,#5700
        defw    #5020,#5120,#5220,#5320,#5420,#5520,#5620,#5720
        defw    #5040,#5140,#5240,#5340,#5440,#5540,#5640,#5740
        defw    #5060,#5160,#5260,#5360,#5460,#5560,#5660,#5760
        defw    #5080,#5180,#5280,#5380,#5480,#5580,#5680,#5780
        defw    #50a0,#51a0,#52a0,#53a0,#54a0,#55a0,#56a0,#57a0
        defw    #50c0,#51c0,#52c0,#53c0,#54c0,#55c0,#56c0,#57c0
        defw    #50e0,#51e0,#52e0,#53e0,#54e0,#55e0,#56e0,#57e0


col_screen                      db      0              
row_screen                      db      0                                      
half_tile_screen        db      0                                      
attr_screen                     db      07                                     

col_screen_temp                 dw      0                              
half_tile_screen_temp   db      0                              

single_symbol_print db 1
single_symbol           db 0

fill_buff ds 65

    endmodule