📄 lcd.s
字号:
include h/mori.h
include ../bios/h/graph.h
public write_map
public move_map
public get_map_addr
public refreshmap
public scroll_to_lcd
public lcd_to_scroll
public write_16x16
public disp_sprite
public get_16x16
public write_16x16x
public write_32x32x
public write_32x32x0
public write_64x64x
public write_160x80x
public disp_num
public close_screen
public open_screen
public play_staff
extrn mul_ax
extrn can_move
extrn get_object
extrn get_flag
extrn get_box_flag
extrn w_block
extrn get_8x8_font
extrn write_8x8_font
extrn delay
extrn gblcd12x
extrn clear_attr
extrn get_map_data0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;取16*16点阵图形
; Input: bank_data_ptr 图形id号
; cursor_posx 列号(0-9,每列16点)
; cursor_posy 行号(0-4,每行16点)
; Output: scroll_buf
; Destory: intc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
get_16x16:
lm bank_no,#graph_bank
asl2 bank_data_ptr
asl2 bank_data_ptr
asl2 bank_data_ptr
asl2 bank_data_ptr
asl2 bank_data_ptr
lda bank_data_ptr+1
clc
adc #40h
sta bank_data_ptr+1
jmp ram_get256 ;在调用前必须确保ram_program有set_get_buf1程序
write_16x16:
write_sprite:
jsr get_16x16
lda cursor_posy
asl a
tax
lm20x intc,scroll_addr_tbl
lda cursor_posx
asl a
adda2 intc
ldy #0
write_16x161:
lda data_read_buf,y
sta (intc),y
iny
lda data_read_buf,y
sta (intc),y
iny
lda #18
adda2 intc
cpy #32
bne write_16x161
rts
scroll_addr_tbl:
l = scroll_buf
rept 5
dw l
l = l+20*16
endr
write_16x16x:
jsr get_16x16
lda x0
clc
adc #15
sta x1
lda y0
clc
adc #15
sta y1
lm2 fccode,#data_read_buf
jmp w_block
write_32x32x:
jsr get_16x16
write_32x32x0:
lda x0
clc
adc #31
sta x1
lda y0
clc
adc #31
sta y1
lm2 fccode,#data_read_buf
jmp w_block
write_64x64x:
jsr get_16x16
lda x0
clc
adc #63
sta x1
lda y0
clc
adc #31
sta y1
lm2 intc,#data_read_buf
jsr w_block
inc bank_data_ptr+1
jsr ram_get256
lda x0
clc
adc #63
sta x1
lda y0
clc
adc #32
sta y0
clc
adc #31
sta y1
lm2 fccode,#data_read_buf
jmp w_block
write_160x80x:
jsr get_16x16
lm2 intc,#scroll_buf
lm a1,#6
write_160x80x1:
ldy #0
write_160x80x2:
lda data_read_buf,y
sta (intc),y
iny
bne write_160x80x2
inc intc+1
inc bank_data_ptr+1
jsr ram_get256
dec a1
bne write_160x80x1
ldy #0
write_160x80x3:
lda data_read_buf,y
sta (intc),y
iny
cpy #40h
bcc write_160x80x3
rts
;---------------------------------------
; 将scroll_buf ==> new_lcdbuf
; 总共 CPR*VDPS bytes
;---------------------------------------
scroll_to_lcd:
lm2 a1,#scroll_buf
lm2 a2,#new_lcdbuf
scroll_to_lcd0:
ldx #80
to_lcd_begin1:
ldy #0
lda (a1),y
and #7fh
sta (a2),y
iny
to_lcd_begin2:
lda (a1),y
sta (a2),y
iny
cpy #CPR
bcc to_lcd_begin2
dex
beq to_lcd_rts
lda #CPR
adda2 a1
lda #CPR
adda2 a2
jmp to_lcd_begin1
to_lcd_rts:
rts
lcd_to_scroll:
lm2 a2,#scroll_buf
lm2 a1,#new_lcdbuf
jmp scroll_to_lcd0
close_screen:
lm _a3,#1
close_screen0:
lm2 a1,#scroll_buf
lm2 a2,#new_lcdbuf
ldx #0
close_screen1:
txa
and #0fh
cmp _a3
bcc close_screen4
ldy #0
lda (a1),y
and #7fh
sta (a2),y
iny
close_screen2:
lda (a1),y
sta (a2),y
iny
cpy #CPR
bcc close_screen2
close_screen21:
inx
cpx #80
beq close_screen3
lda #CPR
adda2 a1
lda #CPR
adda2 a2
jmp close_screen1
close_screen3:
ldx #17
jsr delay
inc _a3
lda _a3
cmp #17
bcc close_screen0
rts
close_screen4:
ldy #0
lda #7fh
sta (a2),y
iny
close_screen5:
lda #0ffh
sta (a2),y
iny
cpy #CPR
bcc close_screen5
jmp close_screen21
open_screen:
lm _a3,#16
open_screen0:
lm2 a1,#scroll_buf
lm2 a2,#new_lcdbuf
ldx #0
open_screen1:
txa
and #0fh
cmp _a3
bcc open_screen4
ldy #0
lda (a1),y
and #7fh
sta (a2),y
iny
open_screen2:
lda (a1),y
sta (a2),y
iny
cpy #CPR
bcc open_screen2
open_screen21:
inx
cpx #80
beq open_screen3
lda #CPR
adda2 a1
lda #CPR
adda2 a2
jmp open_screen1
open_screen3:
ldx #17
jsr delay
dec _a3
bne open_screen0
jmp scroll_to_lcd
open_screen4:
ldy #0
lda #7fh
sta (a2),y
iny
open_screen5:
lda #0ffh
sta (a2),y
iny
cpy #CPR
bcc open_screen5
jmp open_screen21
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;画地图:
; Input: mapid 地图id号
; mapx 列号(0-255,每列16点)
; mapy 行号(0-255,每行16点)
; Output: scroll_buf
; Destory: intc,a1,a2,a3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
write_map:
jsr get_map_addr
lm2 a1,#map_buf
lm a3,#5
lm a2h,#0
lda map_xlen
asl a
sta a2
bcc write_map2
inc a2h
write_map2:
jsr ram_get256
ldy #19
write_map3:
lda data_read_buf,y
sta (a1),y
dey
bpl write_map3
lda #20
adda2 a1
add bank_data_ptr,a2
dec a3
bne write_map2
lda #0
sta cursor_posx
sta cursor_posy
sta a1
write_map4:
ldy a1
lda map_buf,y
sta bank_data_ptr
iny
lda map_buf,y
sta bank_data_ptr+1
iny
sty a1
jsr get_map_data0
bit bank_data_ptr+1
bvc write_map5
jsr get_class_graph
write_map5:
jsr write_16x16
inc cursor_posx
lda cursor_posx
cmp #10
bcc write_map4
lm cursor_posx,#0
inc cursor_posy
lda cursor_posy
cmp #5
bcc write_map4
rts
get_map_addr:
lm bank_no,#map_bank
lm bank_data_ptr+1,#88h
lda mapid
asl a
sta bank_data_ptr
bcc write_map1
inc bank_data_ptr+1
write_map1:
jsr ram_get2 ;取map地址
stx bank_data_ptr
sty bank_data_ptr+1
jsr ram_get2 ;取map长宽
stx map_xlen
sty map_ylen
lda mapy
jsr mul_ax
lda mapx
adda2 a1
inc2 a1 ;map长宽2字节
asl2 a1 ;一个map元素2字节
add bank_data_ptr,a1
rts
get_class_graph:
lda bank_data_ptr+1
and #3fh
cmp #BOX_CLASS
beq get_class_graph1
cmp #SWITCH_CLASS
beq get_class_graph3
ldx bank_data_ptr
jsr get_object
jsr ram_get2
stx bank_data_ptr
sty bank_data_ptr+1
rts
get_class_graph1:
push a1
lda bank_data_ptr
jsr get_box_flag
bne get_class_graph2
lm2 bank_data_ptr,#BOX
pull a1
rts
get_class_graph2:
lm2 bank_data_ptr,#BOXX
pull a1
rts
get_class_graph3:
ldx bank_data_ptr
jsr get_object
jsr ram_get256
push a1
lda data_read_buf+4
jsr get_flag
bne get_class_graph4
lm2 bank_data_ptr,data_read_buf
pull a1
rts
get_class_graph4:
lm2 bank_data_ptr,data_read_buf+2
pull a1
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;处理人物移动:
; Input: movedir 人物移动方向(0:静止)
; spriteid 精灵id(0:主角 1-7:剧情npc)
; Output: scroll_buf
; Destory: intc,a1,a2,a3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
move_map:
lda movedir
bne move_map1
move_map0:
refreshmap:
jsr write_map
jsr disp_sprite ;显示8个sprite
jsr scroll_to_lcd
rts
move_map1:
lda spriteid
asl a
asl a
tax
lda mandir,x
bmi move_map2
lda movedir
sta mandir,x ;改变sprite方向
jsr can_move ;判断能否移动
bcc move_map0 ;不能移动
move_map2:
lda movedir
asl a
tax
lm20x a1,move_tbl-2
jsr to_a1
jmp move_map0
up_move:
lda spriteid
bne to_move_man ;是剧情sprite,不移动背景
lda mapy
beq to_move_man
lda many
cmp #2
bcs to_move_man
dec mapy
jmp write_map
to_move_man:
lda spriteid
asl a
asl a
tax
dec many,x
rts
down_move:
lda spriteid
bne to_move_man2 ;是剧情sprite,不移动背景
lda mapy
clc
adc #5
cmp map_ylen
bcs to_move_man2
lda many
cmp #3
bcc to_move_man2
inc mapy
jmp write_map
to_move_man2:
lda spriteid
asl a
asl a
tax
inc many,x
rts
right_move:
lda spriteid
bne to_move_man3 ;是剧情sprite,不移动背景
lda mapx
clc
adc #10
cmp map_xlen
bcs to_move_man3
lda manx
cmp #8
bcc to_move_man3
inc mapx
jmp write_map
to_move_man3:
lda spriteid
asl a
asl a
tax
inc manx,x
rts
left_move:
lda spriteid
bne to_move_man4 ;是剧情sprite,不移动背景
lda mapx
beq to_move_man4
lda manx
cmp #2
bcs to_move_man4
dec mapx
jmp write_map
to_move_man4:
lda spriteid
asl a
asl a
tax
dec manx,x
rts
to_a1:
jmp (a1)
move_tbl:
dw up_move
dw down_move
dw right_move
dw left_move
disp_sprite:
lm a1,#7
disp_sprite1:
lda a1
asl a
asl a
tax
lda mandir,x
bpl disp_sprite11
sta bank_data_ptr+1
lda manid,x
sta bank_data_ptr
jmp disp_sprite12
disp_sprite11:
lda manid,x
asl a
asl a
clc
adc mandir,x
sta bank_data_ptr
dec bank_data_ptr
lda #0
sta bank_data_ptr+1
disp_sprite12:
lda manx,x
cmp #10
bcs disp_sprite2
sta cursor_posx
lda many,x
cmp #5
bcs disp_sprite2
sta cursor_posy
jsr write_sprite
disp_sprite2:
dec a1
bpl disp_sprite1
rts
disp_num:
push lcdch
push scrncv
BIN2BCD
ldx #4
disp_num0:
lda bcdbuf,x
sta ccgbuf,x
dex
bpl disp_num0
pull scrncv
pull lcdch
ldy #0ffh
disp_num1:
iny
cpy #4
bcs disp_num2
lda ccgbuf,y
cmp #'0'
beq disp_num1
disp_num2:
sty temp_y
lda ccgbuf,y
jsr get_8x8_font
jsr write_8x8_font
inc lcdch
ldy temp_y
iny
cpy #5
bcc disp_num2
rts
play_staff:
sta _a3h
CLS
jsr clear_attr
ldy #0
play_staff1:
lda data_read_buf,y
sta ScreenBuffer+26*3,y
iny
cpy #78
bcc play_staff1
jsr gblcd12x
jsr scroll_to_lcd
lda _a3h
bmi play_staff11
asl a
asl a
tax
lm20x intc,word_tbl
lda word_tbl+2,x
sta intc+2
lda key
cmp #ESC_KEY
beq play_staff11
push bank_no
push2 bank_data_ptr
BREAK_BANK __play_word
pull2 bank_data_ptr
pull bank_no
jsr scroll_to_lcd
play_staff11:
lm _a3,#78
play_staff2:
jsr get_one_line
beq play_staff4 ;结束
lm _a3h,#0
play_staff3:
jsr scroll_one_line
ldx #50
jsr delay
inc _a3h
lda _a3h
cmp #13
bcc play_staff3
jmp play_staff2
play_staff4:
rts
get_one_line:
ldx #0
ldy _a3
get_one_line0:
lda data_read_buf,y
beq get_one_line2
cmp #1
beq get_one_line3
sta ScreenBuffer,x
iny
bne get_one_line1
stx a1
inc bank_data_ptr+1
jsr ram_get256
ldx a1
ldy #0
get_one_line1:
inx
cpx #26
bcc get_one_line0
sty _a3
get_one_line11:
jsr gblcd12x
lda #1
get_one_line2:
rts
get_one_line3:
iny
sty _a3
bne get_one_line4
inc bank_data_ptr+1
jsr ram_get256
get_one_line4:
ldy #25
lda #20h
get_one_line5:
sta ScreenBuffer,y
dey
bpl get_one_line5
jmp get_one_line11
scroll_one_line:
php
lm2 a1,#new_lcdbuf+2*CPR
lm2 a2,#new_lcdbuf+CPR
lm a3,#6
ldy #0
scroll_one_line1:
lda (a1),y
sta (a2),y
iny
bne scroll_one_line1
inc a1h
inc a2h
dec a3
bne scroll_one_line1
scroll_one_line2:
lda (a1),y
sta (a2),y
iny
cpy #4
bcc scroll_one_line2
lda _a3h
asl a
tax
lm20x a1,last_line_addr
lda (a1),y
and #7fh
sta (a2),y
iny
scroll_one_line3:
lda (a1),y
sta (a2),y
iny
cpy #CPR+4
bcc scroll_one_line3
pla
ife IN_MON
ife CAN_MON
and #10h ;此处为一陷阱,在真正的6502上php时B标志会置1,在仿真器则不会
beq scroll_one_line
endif
endif
rts
word_tbl:
db 55h,90h,1,0 ;warning
db 43h,56h,1,0 ;staff
last_line_addr:
l = scroll_buf+CPR-4
rept 13
dw l
l = l+CPR
endr
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -