;*****************************************
;*         GRAPHIC LIBRALY(DIRECT LCD系)
;*
;*(1)D_CLS
;*(2)D_GPRINT(キャラクタ幅が8の倍数のみのGPRINT:OR転送)
;*(3)D_TEXT
;*(4)DISPLAY_ON
;*(5)DISPLAY_OFF
;*(6)D_BTOB(2BYTEの2進数を10進数に変換表示)
;*(7)D_BTOB256(2進数を10進数に変換表示)
;*(8)D_GPRINT2(キャラクタ幅が8固定(繰り返し表示可)のGPRINT:OR転送)
;*(9)D_CPRINT(Y座標が8の倍数のみのGPRINT:OR転送)
;*(10)D_CPRINT_FILL(指定した範囲を指定した指定したPTNでAND,OR,XORする)
;*(11)D_DOTDS
;*(12)D_DOTDS_FT(画面の左3/4だけVRAM->LCDに転送する。なおVRAMののアドレスは$0,$1で指定)
;*(13)D_PSET
;*(14)D_LINE(ブレゼンハムのアルゴリズム)
;*(15)D_FILL_PTN(指定したパターンで画面全体を塗りつぶす。) (現在はFOREXのゲームエリアのみ塗りつぶす仕様)
;*(16)D_LINE_HORIZON8(横位置が8の倍数の位置間で線を引く)
;*****************************************


;********************************************
;*              D_FILL_PTN
;*      指定したパターンで画面全体を塗りつぶす。
;*      (現在はFOREXのゲームエリアのみ塗りつぶす仕様)
;*
;*PARA:$15 - PTN(OR:&HA0 NORM:&H80 XOR:&H20)
;*USE :$0-$7 - BITMAP PTN/LCDC COMMAND
;*     $9  - LCDC TRANS COUNTER
;*     $10 - LCD LINE COUNTER
;*     IX
;********************************************

D_FILL_PTN_BUF:DB 0,0,0,0,0,0,0,0

D_FILL_PTN:

;書き込みモードの確認
SBC $15,&H80;NORM
JR Z,D_FILL_PTN_END
SBC $15,&H20;XOR
JR Z,D_FILL_PTN_END
LD $15,&HA0;OR
D_FILL_PTN_END:

LD $1,$0
LDW $2,$0
LDW $4,$0
LDW $6,$0
PRE IX,D_FILL_PTN_BUF
STM $0,(IX+$31),8

PPO     &HDF            ;Set LCD (Select command register)
;LDW     $0,&HA2         ;Set Bitimage mode(OR:&HA2,NORM:&H82,XOR:&H22)
LD $0,&H02   ;LCD1グラフィック表示モード
OR $0,$15   ;LCD1:通常&H83 OR:&HA3
XR      $1,$1
XR      $2,$2           ;Set LCD Address = 0,0
STLM    $0,3            ;(write lcd register)
LD      $8,4            ;Set LCD line( = 4 )

LD      $10,$31         ;Set LCD Trans line( = 0 )
PRE     IX,D_FILL_PTN_BUF

D_FILL_PTN_LOOP:
PPO     &HDF            ;Set LCD (Select command register)
LD $0,&H02              ;LCD1グラフィック表示モード
OR $0,$15               ;LCD1:通常&H83 OR:&HA3
LD      $1,16           ;Set LCD1 Address = 24(48/2),$10
LD      $2,$10
STLM    $0,3            ;(write lcd register)
CAL     D_FILL_PTN_DISPL           ;LEDTP --> LCD( 72 byte )
PPO     &HDF            ;Set LCD (Select command register)
LD      $0,&H12         ;LCD2グラフィック表示モード
OR      $0,$15          ;LCD2:通常&H92 OR:&HB2
XR      $1,$1           ;Set LCD2 Address = 0,0
LD      $2,$10
STLM    $0,3            ;(write lcd register)
CAL     D_FILL_PTN_DISPR;LEDTP --> LCD( 48 byte )
AD      $10,$30
SB      $8,$30          ;finished ?
JR      NZ,D_FILL_PTN_LOOP         ;
RTN                     ;

;----------------------------------
; INPUT : IX -- LCDTP pointer
;----------------------------------
D_FILL_PTN_DISPL:
PPO     &HDE            ;Set LCD (Select data ram)
LD      $9,11          ;Set half line ( 9*8 = 72byte )
D_FILL_PTN_DLCDL:
LDM    $0,(IX+$31),8   ;Read bit data ( 8byte )
STLM   $0,8            ;Display LCD ( 8byte )
SB      $9,$30          ;finished ?
JR      NZ,D_FILL_PTN_DLCDL        ;
RTN

;----------------------------------
; INPUT : IZ -- LCDTP pointer
;----------------------------------
D_FILL_PTN_DISPR:
PPO     &HDE            ;Set LCD (Select data ram)
LD      $9,5           ;Set half line ( 6*8 = 56byte )
D_FILL_PTN_DLCDR:
LDM     $0,(IX+$31),8   ;Read bit data ( 8byte )
STLM    $0,8            ;Display LCD ( 8byte )
SB      $9,$30          ;finished ?
JR      NZ,D_FILL_PTN_DLCDR        ;
RTN

;**********************************
;              D_PSET
;PARAMETER:
; $0 - X(0-191DEC)
; $1 - Y(0-31DEC)
;USE
; $0    WORK
; $2    (8)
; $3-$5 LCD COMMAND
; IZ PSET PATTERN ADRESS
;**********************************

D_PSET:

SBC $0,192
RTN NC

SBC $1,32
RTN NC

LD $2,8

D_PSET_LINE0:
SBC $1,$2
JR NC,D_PSET_LINE1
LD $5,$31          ;Y LINE
JR D_PSET_LCD_CHECK

D_PSET_LINE1:
SB $1,$2
SBC $1,$2
JR NC,D_PSET_LINE2
LD $5,$30          ;Y LINE
JR D_PSET_LCD_CHECK

D_PSET_LINE2:
SB $1,$2
SBC $1,$2
JR NC,D_PSET_LINE3
LD $5,2          ;Y LINE
JR D_PSET_LCD_CHECK

D_PSET_LINE3:
SB $1,$2
LD $5,3          ;Y LINE

D_PSET_LCD_CHECK:
LD $3,&HA2 ;&HA2:LCD1(OR転送、BITMAP) &HB2:LCD2(OR転送、BITMAP)
;LCD1、LCD2のどちらに描画するかは、X座標が96以上か否かで判定する
SBC $0,96
JR C,D_PSET_BLOCK_CK
;LCD2に描画するので、X座標が96=0になるよう座標を再設定する
SB $0,96
LD $3,&HB2

;CHECK BLOCK
D_PSET_BLOCK_CK:

BIU $0 ;Xの座標を2倍してLCD CONTROLERの座標に合わせる

SBC $0,96 ;BLOCKの分かれ目のチェック
JR NC,SET_DPSET_BLOCK2
SET_DPSET_BLOCK1:
LD $4,$0           ;X SET(BLOCK1)
JR DPSET_BLOCKCKEND
SET_DPSET_BLOCK2:
LD $4,$0
AD $4,32           ;X SET(BLOCK2)
DPSET_BLOCKCKEND:
;

;SET GRAPHIC DATA TRANS MODE
PPO &HDF    ;LCDコマンドレジスタを指定する
STLM $3,3   ;制御コマンド設定

;SET LOCATE & DATA WRITE
PPO &HDE    ;LCDデータ書き込み指定
PRE IZ,D_PSET_PTN
LD $0,(IZ+$1)
STL $0

RTN

D_PSET_PTN:DB &H80,&H40,&H20,&H10,&H08,&H04,&H02,&H01

;************************************
;*       D_CLS_LCD2BL1(LCD2 BLOCK1限定)
;*
;*USE:
;*      $0-$2   LCD command
;*      $8      LCD line
;*      $9      COUNTER
;*      $10-$17 DATA(WHITE)
;*      IX      WHITE DATA ADRESS
;************************************
CLS_LINE_START:EQU 2    ; 消去を開始する行
CLS_LINE_END:EQU 4      ; 消去を開始する行+1

D_CLS_LCD2BL1:

PRE IX,D_CLS_DATA   ;IX = WHITE DATA
LDM $10,(IX+$31),8  ;Read bit data ( 8byte )

LD $2,CLS_LINE_START; $31             ;Set LCD line( = 3 )

LCD2BL14_LOOP:

PPO &HDF            ;Set LCD (Select command register)
LD $0,&H92
LD $1,128
STLM $0,3           ;select LCD2(right part of lcd)

CAL @DISPL          ;LEDTP --> LCD( 48 byte )

AD $2,$30           ;finished ?
SBC $2,CLS_LINE_END
JR NZ,LCD2BL14_LOOP ;
RTN

;----------------------------------
; INPUT : IX -- LCDTP pointer
;----------------------------------
@DISPL:
PPO     &HDE            ;Set LCD (Select data ram)
LD      $9,6           ;Set half line ( 6*8 = 48byte )
@DLCDL:

STLM    $10,8           ;Display LCD ( 8byte )

SB      $9,$30          ;finished ?
JR      NZ,@DLCDL        ;
RTN

;************************************
;*       D_CLS_LCD2(LCD2の指定した行を消す)
;*
;*PARA
;*      $2      LCD line
;*USE:
;*      $0-$2   LCD command
;*      $9      COUNTER
;*      $10-$17 DATA(WHITE)
;*      IX      WHITE DATA ADRESS
;************************************

D_CLS_LCD2:

PRE IX,D_CLS_DATA   ;IX = WHITE DATA
LDM $10,(IX+$31),8  ;Read bit data ( 8byte )

PPO &HDF            ;Set LCD (Select command register)
LD $0,&H92
LD $1,$31
STLM $0,3           ;select LCD2(right part of lcd)

JR D_DISPL          ;LEDTP --> LCD( 96 byte )

;************************************
;*       D_CLS_LCD1(LCD2の指定した行を消す)
;*
;*PARA
;*      $2      LCD line
;*USE:
;*      $0-$2   LCD command
;*      $9      COUNTER
;*      $10-$17 DATA(WHITE)
;*      IX      WHITE DATA ADRESS
;************************************

D_CLS_LCD1:

PRE IX,D_CLS_DATA   ;IX = WHITE DATA
LDM $10,(IX+$31),8  ;Read bit data ( 8byte )

PPO &HDF            ;Set LCD (Select command register)
LD $0,&H82
LD $1,$31
STLM $0,3           ;select LCD2(right part of lcd)

JR D_DISPL          ;LEDTP --> LCD( 96 byte )

;************************************
;*            D_CLS
;*USE:
;*      $0-$2   LCD command
;*      $8      LCD line
;*      $9      COUNTER
;*      $10-$17 DATA(WHITE)
;*      IX      WHITE DATA ADRESS
;************************************
D_CLS_DATA:DB 0,0,0,0,0,0,0,0
D_CLS:

PRE IX,D_CLS_DATA   ;IX = WHITE DATA
LDM $10,(IX+$31),8  ;Read bit data ( 8byte )

LD $8,3            ;Set LCD line( = 3 )
LD $1,$31

CLS_LOOP:
PPO &HDF           ;Set LCD (Select command register)
LD $0,&H82
;LD $1,$31
LD $2,$8
STLM $0,3          ;select LCD1(left part of lcd)

CAL D_DISPL          ;LEDTP --> LCD( 96 byte )

PPO &HDF           ;Set LCD (Select command register)
LD $0,&H92
;LD $1,$31
;LD $2,$8
STLM $0,3          ;select LCD2(right part of lcd)

CAL DISPL          ;LEDTP --> LCD( 96 byte )

SB $8,$30          ;finished ?
JR NC,CLS_LOOP     ;
RTN

;----------------------------------
; INPUT : IX -- LCDTP pointer
;----------------------------------
D_DISPL:
PPO     &HDE            ;Set LCD (Select data ram)
LD      $9,12           ;Set half line ( 12*8 = 96byte )
D_DLCDL:

STLM    $10,8           ;Display LCD ( 8byte )

SB      $9,$30          ;finished ?
JR      NZ,D_DLCDL        ;
RTN

;*************************************************************
; D_DOTOS
; USE REGISTER : $0-$3,$8,$9, IX
;*************************************************************

D_DOTDS:
PPO &HDF            ;Set LCD (Select command register)
LDW $0,&HA2         ;Set Bitimage mode(NORM:&H82,OR:&HA2,XOR:&H22)
XR $2,$2            ;Set LCD Address = 0,0
STLM $0,3           ;(write lcd register)

PRE     IX,LEDTP0   ;IX = LEDTP0
LD      $8,$31      ;Set LCD line( = 3 ) DEBUG ここは0
LD $1,$31

D_DOTDS_LOOP:
PPO &HDF            ;Set LCD (Select command register)
LD $0,&H82         ;select LCD1(left part of lcd)
LD $2,$8            ;DEBUG この行抜け？
STLM $0,3

CAL TRANS_LEDTPLCDFT ;LEDTP --> LCD( 96 byte )

PPO &HDF            ;Set LCD (Select command register)
LD $0,&H92
;LD $2,$8            ;DEBUG この行不要？
STLM $0,3           ;select LCD2(right part of lcd)

CAL TRANS_LEDTPLCDFT ;LEDTP --> LCD( 96 byte )

AD      $8,$30
SBC     $8,4          ;finished ?
JR  NZ,D_DOTDS_LOOP ;
RTN

;*************************************************************
;*                      D_DOTDS_FT
;*          画面左3/4の範囲をVRAM->LCDに転送する
;*
;*PARA:
;*      $20,$21 VRAM TOP ADRESS
;*USE:
;*      $0-$3   LCD COMMAND
;*      $8      LCD LINE
;*      $9      LCD DRAW COUNTER
;*      $10-$17 VRAM CHARACTOR DATA
;*      $22,$23 ADD COUNTER(&HCO)
;*      IX
;*
;*************************************************************

D_DOTDS_FT:

LDW $20,0                   ;Virtual VRAM TOP
LDW $22,&HC0                ;ADD COUNTER

PPO &HDF                    ;Set LCD (Select command register)
LDW $0,&HA2                 ;Set Bitimage mode(NORM:&H82,OR:&HA2,XOR:&H22)
XR $2,$2                    ;Set LCD Address = 0,0
STLM $0,3                   ;(write lcd register)

LD      $8,$31              ;Set LCD line( = 3 ) DEBUG ここは0
LD $1,$31

D_DOTDS_FT_LOOP:

PRE     IX,$20              ;Set IX Virtual VRAM TOP

PPO &HDF                    ;Set LCD (Select command register)
LD $0,&H82                  ;select LCD1(left part of lcd)
LD $2,$8                    ;DEBUG この行抜け？
STLM $0,3
LD      $9,12               ;Set half line ( 12*8 = 96byte )
CAL TRANS_LEDTPLCDFT        ;LEDTP --> LCD( 96 byte )

PPO &HDF                    ;Set LCD (Select command register)
LD $0,&H92
;LD $2,$8                   ;DEBUG この行抜け？
STLM $0,3                   ;select LCD2(right part of lcd)
LD      $9,6                ;Set half line ( 6*8 = 48byte )
CAL TRANS_LEDTPLCDFT        ;LEDTP --> LCD( 96 byte )

ADW $20,$22                 ;LCD Line Inc

AD      $8,$30
SBC     $8,4                ;finished ?
JR  NZ,D_DOTDS_FT_LOOP      ;
RTN

;----------------------------------
; INPUT : IX -- LCDTP pointer
;----------------------------------
TRANS_LEDTPLCDFT:
PPO     &HDE                ;Set LCD (Select data ram)
LCD_TR_LOOP_FT:
LDIM    $10,(IX+$31),8      ;Read bit data ( 8byte )
STLM    $10,8               ;Display LCD ( 8byte )
SB      $9,$30              ;finished ?
JR      NZ,LCD_TR_LOOP_FT   ;
RTN

;*********************************
;       DIRECT BIN TO BCD
;PARAMETER
; $8,$9   BINARY DATA
; $10     PUT X
; $11     PUT Y
; $15     PTN(OR:&HA0 NORM:&H80 XOR:&H20)
;USE
; $12     CHARACTOR LENGTH(1)
; $13,$14 NUM_CHARACTOR ADRESS
; $20     BCD CHR
; $21,$22 10000,1000,100,10,1
;**********************************
D_BTOB_NUM:DB "0123456789"
D_BTOB:

LD $12,$30
LDW $13,0

LDW $21,10000
CAL D_CONV
LDW $21,1000
CAL D_CONV
LDW $21,100
CAL D_CONV
LDW $21,10
CAL D_CONV
LDW $21,$30
CAL D_CONV
RTN

D_CONV:
LD $20,&H30 ;CHR CODE "0"
LDW $13,D_BTOB_NUM

D_LPCNV:
SBCW $8,$21
JP C,D_CONVE
SBW $8,$21
ADW $13,$30
JP D_LPCNV

D_CONVE:
PHU $10
CAL D_TEXT
PPU $10
AD $10,$30
RTN

;*********************************
;       DIRECT BIN TO BCD(256)
;PARAMETER
; $9      BINARY DATA
; $10     PUT X
; $11     PUT Y
; $15     PTN(OR:&HA0 NORM:&H80 XOR:&H20)
;USE
; $12     CHARACTOR LENGTH(1)
; $13,$14 NUM_CHARACTOR ADRESS
; $20     BCD CHR
; $21     100,10,1
;**********************************
;D_BTOB_NUM:DB "0123456789"
D_BTOB256:

LD $12,$30
LDW $13,0

LD $21,100
CAL D_CONV256
LD $21,10
CAL D_CONV256
LD $21,$30
CAL D_CONV256
RTN

D_CONV256:
LD $20,&H30 ;CHR CODE "0"
LDW $13,D_BTOB_NUM

D_LPCNV256:
SBC $9,$21
JR C,D_CONVE256
SB $9,$21
ADW $13,$30
JR D_LPCNV256

D_CONVE256:
PHU $10
CAL D_TEXT
PPU $10
AD $10,$30
RTN
;************************************
;*            D_TEXT
;*PARA:
;*      $10 X
;*      $11 Y
;*      $12 LENGTH
;*      $13,$14 DATA ADRESS
;*      $15     PTN(OR:&HA0 NORM:&H80 XOR:&H20)
;*USE:
;*      $0 LCD MODE WORK
;*      $1 LCD SET X
;*      $2 LCD SET Y
;*      $3 CHARA DATA CHANGE WORK
;*      $4 CHARA DATA CHANGE WORK
;*      $5 DATA READ COUNTER
;*      IX DATA READ INDEX
;************************************
D_TEXT:

;文字数が0なら戻る
SBC $12,$31
RTN Z

SBC $15,&H80;NORM
JR Z,D_TEXT_PTNSETEND
SBC $15,&H20;XOR
JR Z,D_TEXT_PTNSETEND
LD $15,&HA0;OR

D_TEXT_PTNSETEND:
PRE IX,$13
LD $5,$31

D_TEXT_LOOP:
LD $1,$10   ;桁位置を指定
LD $2,$11   ;行位置を指定(例外処理で行を変更するため毎回設定する必要あり)

;キャラクタを読み込み上下4バイトを入れ替える
LD $4,$31
LD $3,(IX+$5)
DIUW $3
OR $3,$4

;LCD1、LCD2のどちらに描画するかは、X座標が16以上か否かで判定する
SBC $1,16 ;96/6(文字幅)=16
JR NC,PUT_CHAR_LCD2
;LCD1に描画
LD $0,&H03 ;キャラクタ表示モード(LCD1:通常&H83 OR:&HA3)にする
OR $0,$15
JR SET_CULUM
PUT_CHAR_LCD2:
;LCD2に描画、X座標から16が96=0になるよう座標を再設定する
SB $1,16
LD $0,&H13 ;キャラクタ表示モード(LCD2:通常&H93 OR:&HB3)にする
OR $0,$15

SET_CULUM:
;X座標を12(2*6)倍する
LD $4,$1
BIU $1 ;*2
BIU $1 ;*4
BIU $1 ;*8
BIU $4 ;*2
BIU $4 ;*4
AD $1,$4 ;(*8)+(*4)=*12

;BLOCK0,1の境界(X=95)以上であれば、X座標を+32する
SBC $1,96
JR C,D_TEXT_BLOCK0
JR NZ,D_TEXT_BLOCK1
;X=96の書き込み
PPO	&HC7		;set LCD command
LD $1,94	    ;x=128 (for 1 line shift)
STLM	$0,3	;
PPO	&HC6        ;set LCD data RAM
JR D_TEXT_OUT

;BLOCK1で境界以外の場合、グラフィック座標を+32する
D_TEXT_BLOCK1:
AD $1,32

;**********************************************
;* 普通にテキスト表示すると1ドット右へ表示されるので、グラフィック座標をX=X-2する。
;* キャラクタ座標X=0の時は例外として処理を行う。
;*キャラクタ座標X=0の時はグラフィック座標をX=222として
;*Y=0ならY=3,Y=1ならY=2,Y=2ならY=1,Y=3ならY=0にすると正常表示される。
;*例1：X=0、Y=0にキャラクタを表示する場合、X=222,Y=3($0=&H83:LCD1)
;*例2：X=16,Y=2にキャラクタを表示する場合、X=222,Y=1($0=&H93:LCD2)
;**********************************************
D_TEXT_BLOCK0:
;X=0とそれ以外では異なる処理を行う
SB $1,2;右へずれて表示されるためX座標を-2(-1*2)する。
JR NC,D_TEXT_X_OVER0

;X=0の書き込み
PPO	&HC7		;set LCD command
LD $1,&HDE	    ;x=222 (for 1 line shift)
PHU $2;Y座標を退避
SB $2,$30;
AN $2,&H03;             ;Y=0ならy=3
                        ;Y=1ならy=2
                        ;Y=2ならy=1
                        ;Y=3ならy=0
STLM	$0,3	;
;
PPU $2;Y座標を復旧
PPO	&HC6        ;set LCD data RAM

JR D_TEXT_OUT

;X>0の書き込み
D_TEXT_X_OVER0:
PPO &HDF    ;LCDコマンドレジスタを指定する
STLM $0,3   ;(制御コマンド設定)
PPO &HDE    ;LCDデータ書き込み指定

D_TEXT_OUT:
STL $3      ;１文字表示

;書き込み位置をインクリメント
AD $10,$30
;書き込み位置がキャラクタ座標の31を超えたら戻る
SBC $10,32
RTN NC
;テキスト読み込みカウンタをインクリメント
AD $5,$30
SBC $5,$12
RTN NC
JP D_TEXT_LOOP

;************************************
;*            D_GPRINT
;*
;* 　LCD(0,0)がこのサブルーチンでは(0,8)となる。
;*   Y座標はワークエリアや仮想画面などに書き込まない処理を行っている。
;*   X座標についてはGPRINT_XMAX(定数)を超える部分は描画しない処理を行っている。
;*
;*PARA:
;*      $10 X
;*      $11 Y
;*      $12 LENGTH
;*      $13,$14 DATA DRESS
;*      $15 PTN(OR:&HA0 NORM:&H80 XOR:&H20)
;*USE:
;*      $0-$3   LCD COMMAND
;*      $0      COUNTER
;*      $1
;*      $4
;*
;*      $0-$7   CHARACTOR DATA
;*      $16,$17 CHARACTOR DATA SHIFT WORK
;*      $18     LCD1/LCD2 SELECT FLAG
;*      $19     X座標(退避)
;*      $20     LCD LINE(&HFF(-1),&H00(0)..&H04(4))
;*      IX
;*      IZ
;*
;************************************
LCD_BUF_U:DB 0,0,0,0,0,0,0,0
LCD_BUF_L:DB 0,0,0,0,0,0,0,0
LCD_BUF_CLR:DB 0,0,0,0,0,0,0,0

D_GPRINT:

;Yが1-39の範囲外であれば戻る
SBC $11,40
RTN NC
SBC $11,0
RTN Z

;書き込みモードの確認
SBC $15,&H80;NORM
JR Z,D_GPRINT_PTN_END
SBC $15,&H20;XOR
JR Z,D_GPRINT_PTN_END
LD $15,&HA0;OR

;Y座標が8の倍数(8<=Y<=32なら高速化のためキャラデータシフトを行わないCPRINTで処理をする)
D_GPRINT_CK08:
SBC $11,8
JR NZ,D_GPRINT_CK16
LD $11,$31
JP D_CPRINT_LP

D_GPRINT_CK16:
SBC $11,16
JR NZ,D_GPRINT_CK24
LD $11,$30
JP D_CPRINT_LP

D_GPRINT_CK24:
SBC $11,24
JR NZ,D_GPRINT_CK32
LD $11,2
JP D_CPRINT_LP

D_GPRINT_CK32:
SBC $11,32
JR NZ,D_GPRINT_START
LD $11,3
JP D_CPRINT_LP

D_GPRINT_START:
;GPRINT_XMAXを読み込む
PRE IX,GPRINT_XMAX
LD $9,(IX+$31)

D_GPRINT_LOOP:

;X>GPRINT_XMAXであれば戻る
SBC $10,$9;192
RTN NC

D_GPRINT_PTN_END:

PHU $10
PHU $11
PHU $12

LD $18,&HEF ;&HEF:LCD1 &HFF:LCD2
;LCD1、LCD2のどちらに描画するかは、X座標が96以上か否かで判定する
SBC $10,96
JR C,TRANS_DATA_BUF
;LCD2に描画するので、X座標が96=0になるよう座標を再設定する
SB $10,96
LD $18,&HFF

TRANS_DATA_BUF:
PRE IX,$13
LDM $0,(IX+$31),8
PRE IX,LCD_BUF_U
STM $0,(IX+$31),8
PRE IZ,LCD_BUF_CLR
LDM $0,(IZ+$31),8
PRE IZ,LCD_BUF_L
STM $0,(IZ+$31),8

LD $20,&HFF

;描画する行とキャラクタのシフト量を算出
CALC_LINE_SHIFT:
SBC $11,8
JR C,SHIFT_LOOP
JR Z,UPPER_LOWER_EX ;8BIT SHIFTなら上下を入れ替える
AD $20,$30
SB $11,8
JR CALC_LINE_SHIFT

LD $12,$20

UPPER_LOWER_EX:
PRE IX,LCD_BUF_U
STM $0,(IX+$31),8
PRE IX,$13
LDM $0,(IX+$31),8
STM $0,(IZ+$31),8
JR END_DATA_SHIFT

SHIFT_LOOP:
LD $1,$31 ;8回ループ用

DATA_SHIFT:
LD $17,(IX+$1)
LD $16,$31

LD $0,$11 ;SHIFT LOOP COUNTER

DATA_SHIFT_LOOP:
BIDW $17
SB $0,$30
JR NZ,DATA_SHIFT_LOOP

STORE_SHIFT_DATA:
ST $17,(IX+$1)
ST $16,(IZ+$1)

AD $1,$30
SBC $1,8
JR C,DATA_SHIFT

END_DATA_SHIFT:

BIU $10 ;Xの座標を2倍してLCD CONTROLERの座標に合わせる

;Y<8なら下部のみ描画
CHECK_LINEUNDER0:
SBC $20,&HFF
JR NZ,CHECK_LINE_OVER3
LD $11,$31
PRE IX,LCD_BUF_L
CAL X_DATA_PUT
JR END_LCD_PUT
;32<Y<40なら上部のみを描画
CHECK_LINE_OVER3:
SBC $20,3
JR NZ,UPPER_DRAW
LD $11,3
PRE IX,LCD_BUF_U
CAL X_DATA_PUT
JR END_LCD_PUT

UPPER_DRAW:
PHU $10
LD $11,$20
PHU $20
PRE IX,LCD_BUF_U
CAL X_DATA_PUT
PPU $20
AD $20,$30
LD $11,$20
PPU $10
PRE IX,LCD_BUF_L
CAL X_DATA_PUT

END_LCD_PUT:
PPU $12
PPU $11
PPU $10

;キャラの描画終了チェック
SB $12,8
RTN Z
RTN C ;キャラの長さが8の倍数以外で指定された時の保険

;キャラクターデータ読み出しアドレスを+8
LDW $0,&H0008
ADW $13,$0
;描画X座標を+8
AD $10,8
JP D_GPRINT_LOOP

X_DATA_PUT:

LD $12,$11

;CHECK BLOCK
SBC $10,96 ;BLOCKの分かれ目のチェック
JR NC,SET_BLOCK2
SET_BLOCK1:
LD $1,$10
JR SET_BLOCK_END
SET_BLOCK2:
LD $1,$10
AD $1,32
SET_BLOCK_END:
LD $2,$11
LD $19,$1 ;X座標の$1はコマンド設定で使用後、キャラデータ読み込みで破壊されるため$19に退避
;

SBC $18,&HEF ;LCD1
JP NZ,DRAW_LCD2

DRAW_LCD1:
;SET GRAPHIC DATA TRANS MODE
PPO &HDF    ;LCDコマンドレジスタを指定する
LD $0,&H02   ;LCD1グラフィック表示モード
OR $0,$15   ;LCD1:通常&H83 OR:&HA3
STLM $0,3   ;制御コマンド設定

;SET LOCATE & DATA WRITE
PPO &HDE    ;LCDデータ書き込み指定
;

;GRAPHIC DATA TRANS
DATA_TRANS_LCD1:
LDM $0,(IX+$31),8   ;表示データ読み込み
SBC $19,209 ;***********************************
JP C,LCD_PUT_8L
SB $19,208 ;*****************************

LD $10,&H12   ;LCD2グラフィック表示モード
OR $10,$15    ;LCD2:通常&H92 OR:&HB2

SBC $19,2
JP Z,LCD_PUT_7L
SBC $19,4
JP Z,LCD_PUT_6L
SBC $19,6
JP Z,LCD_PUT_5L
SBC $19,8
JP Z,LCD_PUT_4L
SBC $19,10
JP Z,LCD_PUT_3L
SBC $19,12
JP Z,LCD_PUT_2L
;SBC $19,14
JP LCD_PUT_1L

LCD_PUT_8L:
STLM $0,8  ;グラフィック表示
RTN

LCD_PUT_7L:
STLM $0,7   ;グラフィック表示
PPO &HDF
;LD $10,&H12   ;LCD2グラフィック表示モード
;OR $10,$15    ;LCD2:通常&H92 OR:&HB2
LD $11,$31
STLM $10,3
PPO &HDE
STL $7
RTN

LCD_PUT_6L:
STLM $0,6   ;グラフィック表示
PPO &HDF
;LD $10,&H12   ;LCD2グラフィック表示モード
;OR $10,$15    ;LCD2:通常&H92 OR:&HB2
LD $11,$31
STLM $10,3
PPO &HDE
STLM $6,2
RTN

LCD_PUT_5L:
STLM $0,5   ;グラフィック表示
PPO &HDF
;LD $10,&H12   ;LCD2グラフィック表示モード
;OR $10,$15    ;LCD2:通常&H92 OR:&HB2
LD $11,$31
STLM $10,3
PPO &HDE
PRE IX,LCD_BUF_L
STLM $5,3
RTN

LCD_PUT_4L:
STLM $0,4   ;グラフィック表示
PPO &HDF
;LD $10,&H12   ;LCD2グラフィック表示モード
;OR $10,$15    ;LCD2:通常&H92 OR:&HB2
LD $11,$31
STLM $10,3
PPO &HDE
STLM $4,4
RTN

LCD_PUT_3L:
STLM $0,3   ;グラフィック表示
PPO &HDF
;LD $10,&H12   ;LCD2グラフィック表示モード
;OR $10,$15    ;LCD2:通常&H92 OR:&HB2
LD $11,$31
STLM $10,3
PPO &HDE
STLM $3,5
RTN

LCD_PUT_2L:
STLM $0,2   ;グラフィック表示
PPO &HDF
;LD $10,&H12   ;LCD2グラフィック表示モード
;OR $10,$15    ;LCD2:通常&H92 OR:&HB2
LD $11,$31
STLM $10,3
PPO &HDE
STLM $2,6
RTN

LCD_PUT_1L:
STL $0   ;グラフィック表示
PPO &HDF
;LD $10,&H12   ;LCD2グラフィック表示モード
;OR $10,$15    ;LCD2:通常&H92 OR:&HB2
LD $11,$31
STLM $10,3
PPO &HDE
STLM $1,7
RTN

DRAW_LCD2:
;SET GRAPHIC DATA TRANS MODE
PPO &HDF    ;LCDコマンドレジスタを指定する
LD $0,&H12   ;LCD2グラフィック表示モード
OR $0,$15    ;LCD2:通常&H92 OR:&HB2
STLM $0,3   ;制御コマンド設定

;SET LOCATE & DATA WRITE
PPO &HDE    ;LCDデータ書き込み指定
;

;GRAPHIC DATA TRANS
DATA_TRANS_LCD2:
LDM $0,(IX+$31),8   ;表示データ読み込み
SBC $19,209;
JR C,LCD_PUT_8R
SB $19,208
SBC $19,2
JR Z,LCD_PUT_7R
SBC $19,4
JR Z,LCD_PUT_6R
SBC $19,6
JR Z,LCD_PUT_5R
SBC $19,8
JR Z,LCD_PUT_4R
SBC $19,10
JR Z,LCD_PUT_3R
SBC $19,12
JR Z,LCD_PUT_2R
;SBC $19,14
JR LCD_PUT_1R

LCD_PUT_8R:
STLM $0, 8  ;グラフィック表示
RTN
LCD_PUT_7R:
STLM $0,7   ;グラフィック表示
RTN
LCD_PUT_6R:
STLM $0,6   ;グラフィック表示
RTN
LCD_PUT_5R:
STLM $0,5   ;グラフィック表示
RTN
LCD_PUT_4R:
STLM $0,4   ;グラフィック表示
RTN
LCD_PUT_3R:
STLM $0,3   ;グラフィック表示
RTN
LCD_PUT_2R:
STLM $0,2   ;グラフィック表示
RTN
LCD_PUT_1R:
STL $0   ;グラフィック表示
RTN

;***********************************************
;*           D_CPRINT(OR転送)
;*PARA:
;*      $10     X
;*      $11     Y(8,16,24,32 ONLY)
;*      $12     CHARACTOR LENGTH(8の倍数)
;*      $13,$14 CHARACTOR ADRESS
;*      $15 PTN(OR:&HA0 NORM:&H80 XOR:&H20)
;*WORK:
;*      $0      LCD COMMAND
;*      $1      LCD COMMAND
;*      $2      LCD COMMAND
;*      $18     SELECT LCD1/LCD2 FLAG
;***********************************************

D_CPRINT:

;Yが0-32の範囲外であれば戻る
SBC $11,33
RTN NC

;Xが0-191の範囲外であれば戻る
SBC $10,192
RTN NC

;書き込みモードの確認
SBC $15,&H80;NORM
JR Z,D_CPRINT_PTN_END
SBC $15,&H20;XOR
JR Z,D_CPRINT_PTN_END
LD $15,&HA0;OR

D_CPRINT_PTN_END:

D_CPRINT_CK08:
SBC $11,8
JR NZ,D_CPRINT_CK16
LD $11,$31,D_CPRINT_LP

D_CPRINT_CK16:
SBC $11,16
JR NZ,D_CPRINT_CK24
LD $11,$30,D_CPRINT_LP

D_CPRINT_CK24:
SBC $11,24
JR NZ,D_CPRINT_CK32
LD $11,2,D_CPRINT_LP

D_CPRINT_CK32:
LD $11,3

D_CPRINT_LP:
;グラフィックデータ読み込みアドレスの設定
PRE IX,$13
PHUW $11
PHU $12
CAL D_CPRINT_PROC
PPU $12
PPUW $10

LDW $0,&H0008
AD $10,$0
ADW $13,$0
SB $12,8
RTN Z
RTN C

JR D_CPRINT_LP

D_CPRINT_PROC:

LD $18,&HEF ;&HEF:LCD1 &HFF:LCD2
;LCD1、LCD2のどちらに描画するかは、X座標が96以上か否かで判定する
SBC $10,96
JR C,@@TRANS_DATA_BUF
;LCD2に描画するので、X座標が96=0になるよう座標を再設定する
SB $10,96
LD $18,&HFF

@@TRANS_DATA_BUF:

LD $12,$11

BIU $10 ;Xの座標を2倍してLCD CONTROLERの座標に合わせる

;CHECK BLOCK
SBC $10,96 ;BLOCKの分かれ目のチェック
JR NC,@@SET_BLOCK2
@@SET_BLOCK1:
LD $1,$10
JR @@SET_BLOCK_END
@@SET_BLOCK2:
LD $1,$10
AD $1,32
@@SET_BLOCK_END:
LD $2,$11
LD $19,$1 ;X座標の$1はコマンド設定で使用後、キャラデータ読み込みで破壊されるため$19に退避
;

SBC $18,&HEF ;LCD1

;描画はD_GPRINTのルーチンを利用
JP NZ,DRAW_LCD2
JP DRAW_LCD1


;***********************************************
;*             D_CPRINT_FILL
;*PARA:
;*      $10     X(0-&HC0)
;*      $11     Y(8,16,24,32 ONLY)
;*      $12     CHARACTOR LENGTH
;*      $13     DATA PTN
;*      $15     MODE(&H80:NORM &HA0:OR &H20:XR)
;*WORK  $18     LCD1,LCD2 SELECT FLAG
;***********************************************

D_CPRINT_FILL:

;Yが0-32の範囲外であれば戻る
SBC $11,33
RTN NC

;Xが0-191の範囲外であれば戻る
SBC $10,&HC0
RTN NC

;書き込みモードの確認
SBC $15,&H80;NORM
JR Z,D_CPRINTF_PTNEND
SBC $15,&H20;XOR
JR Z,D_CPRINTF_PTNEND
LD $15,&HA0;OR

D_CPRINTF_PTNEND:

;X+LENGTH>&HC0ならLENGTHを画面の端までに設定する
LD $0,$10
AD $0,$12
;X+LEN>255の場合
JR NC,DCP_NC
JR DCP_LEN_RESET
;&HC0<X+LEN<255の確認
DCP_NC:
SBC $0,&HC0
;X+LEN<&HC1なら問題なし
JR C,D_CPRINT_F_YSET
DCP_LEN_RESET:
LD $12,&HC0
SB $12,$10

D_CPRINT_F_YSET:
;Y=8なら0、Y=16なら1に変換するため、Y=Y/8-1
BID $11
BID $11
BID $11
SB $11,$30

D_CPRINT_FILL_LP:
;パターンデータの書き込み
CAL D_CPRINT_FIL_PRC

;指定した長さの処理が終われば戻る
AD $10,$30
SB $12,$30
RTN Z

JR D_CPRINT_FILL_LP

D_CPRINT_FIL_PRC:

LD $18,&HEF ;&HEF:LCD1 &HFF:LCD2
;LCD1、LCD2のどちらに描画するかは、X座標が96以上か否かで判定する
SBC $10,96
JR C,CPF_TRANS_DATA
;LCD2に描画するので、X座標が96=0になるよう座標を再設定する
SB $10,96
LD $18,&HFF

CPF_TRANS_DATA:

BIU $10 ;Xの座標を2倍してLCD CONTROLERの座標に合わせる

;CHECK BLOCK
SBC $10,96 ;BLOCKの分かれ目のチェック
JR NC,CPF_SET_BLOCK2
CPF_SET_BLOCK1:
LD $1,$10
JR CPF_SET_BLOCK_ED
CPF_SET_BLOCK2:
LD $1,$10
AD $1,32
CPF_SET_BLOCK_ED:
LD $2,$11

SBC $18,&HEF ;LCD1
JP NZ,CPF_DRAW_LCD2

CPF_DRAW_LCD1:
;SET GRAPHIC DATA TRANS MODE
PPO &HDF    ;LCDコマンドレジスタを指定する
LD $0,$15   ;グラフィック表示(NORMAL,OR,XRはユーザー指定)モードにする
OR $0,&H02  ;LCD1,グラフィックモードに設定
STLM $0,3   ;制御コマンド設定

;SET LOCATE & DATA WRITE
PPO &HDE    ;LCDデータ書き込み指定
;

;GRAPHIC DATA TRANS
STL $13
RTN

CPF_DRAW_LCD2:
;SET GRAPHIC DATA TRANS MODE
PPO &HDF    ;LCDコマンドレジスタを指定する
LD $0,$15   ;グラフィック表示(NORMAL,OR,XRはユーザー指定)モードにする
OR $0,&H12  ;LCD2,グラフィックモードに設定
STLM $0,3   ;制御コマンド設定

;SET LOCATE & DATA WRITE
PPO &HDE    ;LCDデータ書き込み指定
;

;GRAPHIC DATA TRANS
STL $13
RTN
