Код:
write: ; in:
; hl - screen addr
; a' - shift
; hl' - text address (with no control data)
.loop:
exx
ld a,(hl)
inc hl
and a
ret z
exx
call out_char_42
jr .loop
out_char_42: ;
; in
; hl = screen addr
; a = char code
; a' = shift count
; out
; hl = screen addr of next char
; a' = shift count of next char
font_high_address: EQU $ + 2
ld e,a
ld d,#00 ; high font address
ex af
and a
jp z,no_shift ; в a - не код, а смещение!
ld c,a
ex af
ld a,c
neg
sub print_loop_length + 2
ld (shift_instruction_displacement),a
sla c
ld b,high Tables.shift_table
ld a,(bc)
ld (left_place_mask),a
ld (left_clear_mask),a
inc c
ld a,(bc)
ld (right_place_mask),a
ld (right_clear_mask),a
ld b,9
jp print_loop_entry_point
rrca
rrca
rrca
rrca
rrca
rrca
rrca
rrca
print_loop_start:
ld c,a
left_place_mask: equ $ + 1
and 0
xor (hl)
left_clear_mask: equ $ + 1
and 0
xor (hl)
ld (hl),a
inc l
ld a,c
right_place_mask: equ $ + 1
and 0
xor (hl)
right_clear_mask: equ $ + 1
and 0
xor (hl)
ld (hl),a
dec l
inc h
print_loop_entry_point:
ld a,(de)
inc d
print_loop_end:
djnz $
nex_pos_calc:
ld a,h
sub 8
ld h,a
ex af ; restore hl!!!
add a,6
cp 8
jp nc,1F
ex af
ret
1: and 7
ex af
inc l
ret nz
ld a,h
add a,8
ld h,a
ret
no_shift:
ex af
ex de,hl
ld c,#03
ld a,(de)
and c
or (hl)
ld (de),a
inc h
inc d
ld a,(de)
and c
or (hl)
ld (de),a
inc h
inc d
ld a,(de)
and c
or (hl)
ld (de),a
inc h
inc d
ld a,(de)
and c
or (hl)
ld (de),a
inc h
inc d
ld a,(de)
and c
or (hl)
ld (de),a
inc h
inc d
ld a,(de)
and c
or (hl)
ld (de),a
inc h
inc d
ld a,(de)
and c
or (hl)
ld (de),a
inc h
inc d
ld a,(de)
and c
or (hl)
ld (de),a
inc h
inc d
ex de,hl
jp nex_pos_calc
print_loop_length: equ print_loop_end - print_loop_start
shift_instruction_displacement: equ print_loop_end + 1
at_char_42:
; in
; b = row, c = col (in 6-pix chars)
; out
; hl = screen addr
; a' = shift_count
ld a,b
call SYSTEM.GET_SCREEN_ADDRESS
ld a,c
add a,a
add a,c
ld c,a
srl a
srl a
add a,l
ld l,a
ld a,c
and #03
add a,a
ex af
ret
at_pix_42:
; in
; b = row (in shar rows), c = col (in pixels)
; out
; hl = screen addr
; a' = shift_count
ld a,b
call SYSTEM.GET_SCREEN_ADDRESS
ld a,c
srl a
srl a
srl a
add a,l
ld l,a
ld a,c
and #07
ex af
ret
UPD: