「SYSTEM-7c」




◆MZ-700でウィンドウシステム

 MZ-700で無茶苦茶な事をしでかすのが好きというわけではありませんが、何とSYSTEM-7cはMZ-700上で動作するウィンドウシステムです。今ではメモリが16MB必要だとかハードディスクが1GBくらいいるぞとかいう世界ですが、このSYSTEM-7cは48KBのメモリで十分に動作します。またフロッピーディスクも使いません。なんと言ってもカセットですから(笑)。
 SYSTEM-7cはゲーム用として使用されるのを前提に制作されていますので「高速かつ省メモリ」です。そのために、いくつか工夫がなされています。以下にその工夫した点を挙げてみます。

・機能単位でブロック分割ができる(使用しない機能は省ける)
・横256文字のZ80-8bit CPUとしては最高速の仮想画面設計
・なるべくハードウェアに依存しないようにしてある
・コンパクトかつ多機能
・ゲームで使用される機能、System-7Bで使用頻度の高かったものを改良



◆SYSTEM-7c

 SYSTEM-7cの最大の目的は「手軽にゲームを制作できる環境/ツールを制作」する事にあります。が、結果的にそれはかないませんでした。おまけに制作後、MacroMind Director (現在はMacromedia Director)というソフトと出会ってしまったのが運のツキでした。そのためMacで制作したゲームは、すべてMacromedia Directorを使用しています。つまり、SYSTEM-7cでめざした方向と、そのツールがDirectorというMacのソフトに近かったという事です。ただしVersion 3までは。Version 4になって、もっと私の理想に近くなるかと思ったのですが、あらぬ方向へと向かってしまいました。そう、オーサリングツールとしてDirectorを使う人が多くなり、マルチメディアブームにのって、さらにその傾向が濃くなってしまったのです。



◆NeXTSTEP

 最初に作ろうと考えていたゲーム制作ツールは、DirectorのインターフェースにNeXTSTEPのインターフェースビルダーのように、あらかじめ作ってある敵の移動アルゴリズムや表示方法などを選択するというものでした。Directorは一度作成したプログラムは、あまり流用できないのが現状です。確かにオブジェクト指向だし、コピーすればそのまま使えない事もありません。また、ハイブリッドフォーマットになっていてMacでもWindowsでも作成したデータは一応、そのまま使用することができます。これは、確かに私の理想に近いのですが、やっぱり違います。私はゲームが作りたいのであって、そのためにASCII/LOGINの提供しているXXツクールなどではなくDirectorのように汎用に使用でき、他機種でも使用できるフォーマット(言語)を書き出せるものが、欲しいのです。



◆共通ゲーム言語

 以前OpenSpaceというサークルを主催している時に「共通ゲーム言語は必要か?」というテーマを投げかけた事があります。が、結果的にはいらないという答えでした。なぜ、こんな共通ゲーム言語などというものを考えたかというと、「移植作業の無駄」を知っているからです。移植作業のために半年も3箇月もかかっていては駄目だ、そう思ってPostScriptのようなゲーム制作の土台となるような言語が必要だと思ったのです。
 最近Internetの普及、JAVAの普及によって状況が変化しました。JAVAは機種依存しないバイトコードを生成しますから、これを土台にして手軽にゲームを作れるツールを制作しようと考えています。また、Mac/Windowsの普及のおかげでグラフィックやサウンド、そしてフォーマットなどがだいぶ整備されつつあります。またツールを作成しても今までは流通の問題がありましたが、Internetの普及によって、それもだいぶクリアされつつあります。

「もっと手軽にゲームを作れるツールを!」

これが私の目標です。



◆おわりに

 SYSTEM-7cは幸いにしてソースリストが残っています。以下にソースリスト(一部文字化けしています)を掲載しておきますので、参考にしたい人はどうぞ。転載流用自由ですが、使い道はないと思います。エミュレータでも作成すれば別ですが(笑)。

 なんて書いていたら本当にMZ-700エミュレーターができてしまいました。でも、SYSTEM-7cの使い道がない(^^;


SYSTEM-7c Source List / Z80 Assembler (EDASM or ZEDA)

Jump Table

--------------------- OS KERNEL ---------------------- 0 ・ INIT (Initialize all subroutines) 1 ・ Version (Get Version Number) 2 ・ Check 700/1500 (Machine Check) 3 ・ Close I/O (V-RAM Close) 4 ・ Open I/O (V-RAM Open) 5 ・ Set.KVRAM.address (High-order Set) 6 ・ Read.KRAM.address (High-order Read) 7 ・ TDXY (Calculate X, Y -> KVRAM address) 8 ・ VTDXY (Calculate X, Y -> V-RAM address) 9 ・ GET.XY of KVRAM (Calculate V-RAM address -> X, Y) 10 ・ Trans40xy (Trans KVRAM -> V-RAM) 11 ・ Dual Trans40xy (Trans KVRAM -> V-RAM) 12 ・ Laster Print (High-speed 40chr Write) 13 ・ Color convert (Color Convert OLD.BF -> NEW.BF) 14 ・ SET.GET.BF (Use Polygon Fill) 15 ・ Read.GET.BF (Use Polygon Fill) 16 ・ STTM (Start Line, Enemy Beam) 17 ・ MVTM (Execute Line, Enemy Beam) 18 ・ Print Score (Print Score to KVRAM or V-RAM) 19 ・ Score Plus (Add the Score Buffer and BC-reg ) 20 ・ SGN8Bit (Get Sign of A-reg) 21 ・ SET.PAUSE.MESSAGE (Pause Message Process Address Set) 22 23 ・ PAUSE (Graph key to Pause, any key to Restart) 24 ・ SET.Key.Table (Key Matrix -> Asc convert Table set) 25 ・ Read.Key.Table (Key Matrix -> Asc convert Table read) 26 ・ SET.KEY.MASK (Key Matrix Port Data Mask Table Set) 27 ・ READ.KEY.MASK (Key Matrix Port Data Mask Table Read) 28 ・ GET.Key (Get Key, ASCII Code) 29 ・ GET.Key.Port (Key Port Direct Read) 30 ・ Read.Key.BF (Key Buffer Direct Read) 31 ・ Set GAME Key (Left Hand or Right Hand Select) 32 ・ Read GAME Key (Left or Right Hand ? Data Read) 33 ・ GAME.Key (Read GAME Keys) 34 ・ Move.Fighter (Move.Fighter by GAME Key Code) 35 ・ Hantei (Check 2 Rectangle Match) 36 ・ Hantei2 (Check 1 point AREA) 37 ・ SET.Random.Value (Random Value Set) 38 39 ・ Random (16 bit Random value) 40 ・ XYCood (Swap if X1>X2 or Y1>Y2) 41 ・ XY.len (X2-X1+1, Y2-Y1+1) 42 ・ Bit.Map.OBJ (Convert Bit Map to Pixel Map) 43 44 ・ PRESS.GRAPHIC.DATA (Graphics Data Press, Run Length) 45 ・ OBJECT.DATA (Object Data) 46 47 48 ・ GET.HEX.ASC (BIN to ASC,HL=Value,DE=Buf5Byte) 49 ・ GET.DEC.ASC (BIN to ASC,HL=Value,DE=Buf5Byte) 50 ・ ZAHYO (Use Font Manager) 51 ・ COLOR.ZAHYO (Use Font Manager) 52 ・ SET.VRAM.SW (Use Font Manager) 53 ・ READ.VRAM.SW (Use Font Manager) 54 55 56 ・ Multi 8x8=16 57 ・ Division 16/8=8...8 58 ・ Multi16x16=32 59 ・ Division 32/16=32...16 60 ・ GET.VALUE.DEC (In Event Manager) 61 ・ GET.VALUE.HEX (In Event Manager) 62 ・ GAME.KEY.JUMP.ADDRESS (HAND>2) 63 ・ SET.TASK.RECORD 64 ・ READ.TASK.RECORD 65 ・ Request TASK 66 ・ --------------------- SOUND ROUTINE Ver11 ---------------------- (1B00H) 67 ・ SET.SOUND.RECORD (Set Sound Record) 68 ・ READ.SOUND.RECORD (Read Sound Record) 69 ・ SOUND.SWITCH (0=Sound Off, 1=Sound On) 70 ・ SOUND.INTERRUPT (Interrupt Call Address, A=n) 71 ・ 72 ・ 73 ・ --------------------- SPACE GRAPHICS ---------------------- (1E00H) 74 ・ SET.PEN.STYLE (Graphic Pen Address Style set) 75 ・ READ.PEN.STYLE (Graphic Pen Address Style read) 76 ・ SET.PEN.Put.Large&Small (Put LS Pen Style Address set) 77 ・ READ.PEN.Put.Large&Small (Put LS Pen Style Address read) 78 79 80 ・ PRINT.GAGE (Dot Gage Display) 81 82 ・ GET (Get Data KVRAM to Memory) 83 ・ Put.chr (Put Character data only) 84 ・ Put.over.chr (Put Character data & Mask) 85 ・ Put.atb (Pair Put.chr) 86 ・ Put.atb.cpl (Put Color data Reverse) 87 ・ Put.over.atb (Put Color data & Mask) 88 ・ Put.over.atb.cpl (Put Color data reverse & Mask) 89 ・ Put.hyp (High-speed Put) 90 ・ Put.Large&Small (Put Resize data) 91 ・ Box.Normal (Box write by direct code) 92 ・ Box.Color (Box write by color modify) 93 ・ Box.chr (Alart Box) 94 95 ・ Box.Fill (Box.Fill by direct code) 96 ・ Box.PEN (Use PEN) 97 ・ Box.Fill.PEN (Use PEN) 98 ・ SCROLL UP (Ring Scroll Up) 99 ・ SCROLL DOWN (Ring Scroll Down) 100 ・ SCROLL LEFT (Ring Scroll Left) 101 ・ SCROLL RIGHT (Ring Scroll Right) 102 ・ Line (Use PEN) 103 ・ Circle (Use PEN) 104 ・ Circle.Fill (Use PEN) 105 ・ Polygon (Polygon, frame only) 106 ・ Polygon.Fill (Polygon.Fill) 107 ・ SUPER.Fill (Scan Line data) 108 ・ Screen.Effect (User Screen effect) 109 ・ PSET.PEN (Point Set) 110 ・ DRAW 111 ・ DRAW Jump Address 112 ・ 113 ・ 114 ・ 115 ・ --------------------- FONT MANAGER ---------------------- (2400H) 116 ・ MESSAGE.LEFT (Message Left -> Right) 117 ・ MESSAGE.RIGHT (Message Right -> Left) 118 ・ MESSAGE.CENTER (Message Centering) 119 ・ PRINT.ONE.CHR (1 character print) 120 ・ MESSAGE 121 ・ MESSAGE.LENGTH 122 ・ SET.FONT.RECORD (Font record set) 123 ・ READ.FONT.RECORD (font record read) 124 ・ SET.XY (X, Y set to current Record) 125 ・ READ.XY (Read X, Y current record) 126 ・ CR0A (Line Feed) 127 ・ CR0D (Return) 128 ・ 129 ・ 130 ・ 131 ・ --------------------- PICTURE DRIVER II ---------------------- (2C00H) --------------------- EVENT MANAGER ---------------------- (3000H) 132 ・ GAME.KEY.REPEAT (GAME.Key, Repeat process) 133 ・ GET.CLICK.STATUS (read Click Status) 134 ・ KEY.REPEAT (1 Key Repeat process) 135 ・ SET.EVENT.RECORD (Event record set) 136 ・ READ.EVENT.RECORD (Event record read) 137 ・ SAVE.CURSOR (KVRAM character save) 138 ・ LOAD.CURSOR (KVRAM character read) 139 ・ FLASH.CURSOR (Flash cursor) 140 ・ MODIFY.KEY (Modify Key Read) 141 ・ SET.KEY.X (Asc Table Set) 142 ・ TEXT.EDIT.LINE (Text Edit of 1 Line) 143 ・ BEEP (Bell) --------------------- MEMORY MANAGER ---------------------- (2E00H) 144 ・ MEMORY.COPY (Memory Copy, Move) 145 ・ MEMORY.SWAP (Memory Swap) 146 ・ MEMORY.COPY2 (Memory External Copy) 147 ・ --------------------- WINDOW MANAGER ----------------- (3400H) 148 ・ SET.WINDOW.RECORD (Window record set) 149 ・ READ.WINDOW.RECORD (Window record read) 150 ・ SET.WINDOW.RECORD.EXT (Extend Window Record set) 151 ・ READ.WINDOW.RECORD.EXT (Extend Window Record read) 152 ・ PRINT.WINDOW.ONE (Print KVRAM, Window one) 153 ・ PRINT.WINDOW.BUFFER (Print KVRAM, Window buffer) 154 ・ PRINT.BG (Print Back Ground Pattern) 155 ・ PRINT.SCREEN (Print KVRAM -> V-RAM) 156 ・ CHECK.XY.IN.SCRN (Check xy in Screen) 157 ・ CHECK.XY.IN.WINDOW (Check xy in Window) 158 ・ CHECK.CLICK.POINT.BF (Check click point where) 159 ・ ID.JUMP (To Subroutine by Item.ID) 160 ・ FUNCTIONS (Low-level function process) --------------------- Load and Save Routine ----------------- (4600H) 161 ・ LOAD&SAVE.MODULE (File Save and Load) --------------------- WINDOW MANAGER ----------------- (4800H) 162 ・ SERVICE ROUTINE (Service call) --------------------- SUB.FUNCTION NO. -------------------- 0 ・ QUIT (Application End Call) 1 ・ EVENT.LOOP (System Event Loop) 2 ・ ACTIVE.WINDOW (Inactive to Active) 3 ・ INACTIVE.WINDOW (Active to Inactive) 4 ・ WAIT.ON.EVENT (Wait any Event) 5 ・ MOVE.CURSOR (Move Cursor in Screen) 6 ・ WINDOW.XY+SCREEN.XY (Window X, Y + Screen X, Y) 7 ・ PRIORITY (Priority Change) 8 ・ FLASH.ITEM (Flashing Select Item) 9 ・ DRAG (Drag by DRAG Record) 10 ・ VIEW.CLIP.CHR (CLIP.SCREEN.RECT) 11 ・ VIEW.CLIP.ATB (CLIP.SCREEN.RECT) 12 13 ・ NEW.WINDOW (New Window Set) 14 ・ CLOSE.WINDOW (Window Close) 15 ・ ALWAYS.WINDOW.ACTIVE (Window Active) 16 ・ SET.DUMMY (System.ITEM.Dummy.Mode) 17 ・ PLUS.ITEM.XY 18 ・ PLUS.nXY&WXY 19 ・ SUB.ITEM.XY 20 ・ SERCH.ITEM.TYPE 21 ・ SERCH.ITEM 22 ・ SERCH.DATA 23 ・ BIN.TO.DEC 24 ・ BIN.TO.HEX 25 ・ SERCH.HEADER2 26 ・ GET.SYSTEM.STACK 27 ・ SET.QUIT.ADRS </PRE> <HR> <CENTER>KERNEL</CENTER> <P> <PRE> ; ; SYSTEM-7C ; (JUMP TABLE) ; ADRS EQU $1200 OFFSET $A000-ADRS ORG ADRS JP.TABLE JP $00AD ;$E804 JP VERSION JP CHECK JP CLOSE.IO JP OPEN.IO JP ADRS.CONV JP READ.KVRAM.ADRS JP TDXY JP VTDXY JP GET.XY JP TRANS40XY JP TRANS40XY.DUAL JP LASTER.PRINT JP COLOR.CONVERT JP SET.GET.BF JP READ.GET.BF JP STTM JP MVTM JP SCORE.PRINT JP SCORE.PLUS JP SGN8BIT JP SET.PAUSE.MSG JP 0 JP PAUSE JP SET.KEY.TABLE JP READ.KEY.TABLE JP SET.KEY.MASK JP READ.KEY.MASK JP GET.KEY JP GET.KEY.PORT JP READ.KEY.BF JP SET.GAME.KEY JP READ.GAME.KEY JP GAME.KEY JP MOVE.FIGHTER JP HANTEI JP CHECK.AREA JP INIT.RANDOM JP 0 JP RANDOM JP XYCOOD JP XYLEN JP BIT.MAP.OBJ JP BIT.MAP.OBJ.PLUS JP PRESS JP OBJECT JP 0 JP 0 JP 0 JP 0 JP ZAHYO JP COLOR.ZAHYO JP SET.VRAM.SW JP READ.VRAM.SW JP 0 JP 0 JP MULTI8 JP DIVISION8 JP MULTI16 JP DIVISION16 JP 0 JP 0 HAND.JUMP JP 0 ; --- HIKOUKAI --- JP SET.TASK.RECORD JP READ.TASK.RECORD JP CMS QQ ;---------------------- ; ; ; SUPER SYSTEM-7C ; ( OS KERNEL) ; KERNEL EQU 200*3+ADRS VER EQU 1 ORG KERNEL ; ; MZ-700 / 1500 CHECK ; ; MZ-700 タ A = 1 ; MZ-1500 タ A = 0 ; CHECK CALL OPEN.IO LD A,($FFFF) SUB $A5 JR Z,CHK LD A,1 CHK ; ; CLOSE I/O ; CLOSE.IO LD HL,(STACK.IO) DEC (HL) DEC HL LD (STACK.IO),HL RET NZ OUT ($E1),A RET ; ; OPEN I/O ; BANK = VRAM,I/O ; OPEN.IO LD HL,$FFFF LD A,(HL) LD (HL),$76 CP (HL) LD (HL),A LD A,1 JR Z,OPN XOR A OPN LD HL,(STACK.IO) LD (HL),A INC HL LD (STACK.IO),HL OUT ($E3),A RET STACK.IO DW STACK STACK DS 4 ; ; ADDRESS SETTING ; ; A = ADDRESS HIGH ; ADRS.CONV LD (ADRS1+1),A LD (ADRS2+1),A ; ; READ KVRAM ADRS ; ; EXIT: ; A = KVRAM ADRS ; READ.KVRAM.ADRS LD A,(ADRS1+1) RET ; ; CONVERT ADRS タ KVRAM X,Y ; ; HL = ADDRESS OF KVRAM ; ; EXIT: ; H = X ; L = Y ; GET.XY LD A,H ADRS2 SUB $B0 LD H,L LD L,A RET ; ; ATDXY ; TDXY ; ; H = X ; L = Y ; \ ; HL = KVRAM ADRS ; TDXY LD A,L LD L,H ADRS1 ADD A,$B0 LD H,A RET ; ; ZAHYOU KEISAN2 ; ; VRAM.SW=0 --- KVRAM ; =1 --- VRAM ; ; H = X ; L = Y ; ; EXIT: HL = ADDRESS ; ZAHYO LD A,(VRAM.SW) OR A JR Z,TDXY ; ; VIDEO RAM TDXY ; ; H = X ; L = Y (0 TO 25) ; VTDXY PUSH BC PUSH DE LD E,H LD D,0 LD H,D RLC L RLC L RLC L LD C,L LD B,D ADD HL,HL ADD HL,HL ADD HL,BC ADD HL,DE LD BC,$D000 ADD HL,BC POP DE POP BC RET VRAM.SW DB 0 ; ; COLOR ZAHYOU KEISAN ; ; HL = ADDRESS ; COLOR.ZAHYO LD A,(VRAM.SW) OR A JR Z,COLZ SET 3,H RET COLZ SET 7,L RET ; ; SET VRAM SWITCH ; ; A = 0 --- KVRAM ; = 1 --- VRAM ; SET.VRAM.SW LD (VRAM.SW),A ; ; READ VRAM SWITCH ; ; EXIT: ; A = 0 --- KVRAM ; = 1 --- VRAM ; READ.VRAM.SW LD A,(VRAM.SW) RET ; ; A = VALUE ; \ ; IF A = 0 タ A = 0 ; IF A < 0 タ A = -1 ; IF A > 0 タ A = 1 ; SGN8BIT OR A RET Z LD A,1 RET P LD A,-1 RET ; ; HANTEI ; E: D: C: B: ; HL = MEM(LY-1,LX-1,LY-1,LX-1) ; DE = X1,Y1 ; BC = X2,Y2 ミ珥珥ホ ; © ミ珥猥 ; CY = 1 タ OFF © DE©© © ; CY = 0 タ HIT © ©© BC © ; ヘ珥瓔ン © ; ヘ珥珥珎 HANTEI LD A,E ADD A,(HL) CP C RET C INC HL LD A,D ADD A,(HL) CP B RET C INC HL LD A,C ADD A,(HL) CP E RET C INC HL LD A,B ADD A,(HL) CP D RET ; ; CHECK AREA ; ; HL=(X1,Y1) ; DE=(X2,Y2) ; BC=(CHECK.X, CHECK.Y) ; ; CAUTION! ; H<D & L<E ; ; EXIT ; ; CY=1 --- AREA OVER ; CY=0 --- IN AREA ; ; CHECK.AREA LD A,B CP H RET C LD A,C CP L RET C ; LD A,D CP B RET C LD A,E CP C RET ; ; RANDOM ; ; EXIT : HL = RANDOM VALUE ; RANDOM LD HL,31415 ;… LD DE,$1021 LD B,16 RND2 ADD HL,HL JR C,RND3 LD A,D XOR H LD H,A LD A,E XOR L LD L,A RND3 DJNZ RND2 ; ; INIT.RANDOM ; ; HL = RANDOM VALUE ; INIT.RANDOM LD (RANDOM+1),HL ; ; VERSION CHECK ; ; EXIT: A=VERSION ; VERSION LD A,VER RET ; ; H = X1 ; L = Y1 ; D = X2 ; E = Y2 ; \ ; H < D (X1 < X2) ; L < E (Y1 < Y2) ; XYCOOD LD A,H CP D JR C,CDGA1 LD H,D LD D,A CDGA1 LD A,L CP E RET C LD L,E LD E,A RET ; ; D = TX ; E = TY ; H = FX ; L = FY ; \ ; D = XY LINE FLAG ; H = DX ; L = DY ; B = UX ; C = UY ; A = R ; STTM LD BC,0 LD A,H SUB D JP Z,TMA INC B JP NC,TMA LD B,-1 LD A,D SUB H TMA LD H,A LD A,L SUB E JP Z,TMB INC C JP NC,TMB LD C,-1 LD A,E SUB L TMB LD L,A CP H JP C,TMC LD D,1 SRA A RET TMC LD D,0 LD A,H SRA A RET ; ; MOVE TM ; ; H = X ; L = Y ; B =UX ; C =UY ; D =DX ; E =DY ; A =XY FLAG (Y LINE タ A=1) ; A'= R ; \ ; H = NEW X ; L = NEW Y ; A = NEW R ; MVTM OR A JP NZ,YLINE LD A,H ADD A,B LD H,A EX AF,AF' ADD A,E CP D RET C SUB D EX AF,AF' LD A,L ADD A,C LD L,A CALL GET.BF EX AF,AF' RET YLINE LD A,L ADD A,C LD L,A EX AF,AF' ADD A,D CP E JP C,YLINE2 SUB E EX AF,AF' LD A,H ADD A,B LD H,A CALL GET.BF EX AF,AF' RET YLINE2 EX AF,AF' CALL GET.BF EX AF,AF' RET ; ; MVTM --- USE POLYGON.FILL ; GET.BF JP RETURN ; ; SET GET.BF ADDRESS ; ; HL = CALL ADRS ; ; CAUTION! ; NOT BREAK ALL REG. ; IN SUBROUTINE ; SET.GET.BF LD (GET.BF+1),HL ; ; READ GET.BF ADRS ; ; EXIT ; HL = GET.BF JP ADRS ; READ.GET.BF LD HL,(GET.BF+1) RETURN RET ; ; KVRAM タ VRAM ; ; H = X ; L = Y ; B = LY ; DE= VRAM ADDRESS ; TRANS40XY CALL TDXY TRANS40 LD A,L ; L=X LD (TRNSAL+1),A LD A,B ;B=LY TRNSA LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI TRNSAL LD L,0 INC H DEC A JP NZ,TRNSA RET ; ; KVRAM タ VRAM (DUAL) ; ; H = X ; L = Y ; B = LY ; DE = VRAM ADDRESS ; H' = X ; L' = Y ; DE' = ATB ADDRESS ; TRANS40XY.DUAL CALL TDXY EXX CALL TDXY LD A,L LD (D.TRNSAL'+1),A EXX LD A,L ; L=X LD (D.TRNSAL+1),A LD A,B ;B=LY D.TRNSA LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI D.TRNSAL LD L,0 INC H EXX LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI LDI D.TRNSAL' LD L,0 INC H EXX DEC A JP NZ,D.TRNSA RET ; ; BIT MAP OBJECT ; ; HL = MOTO BIT MAP ; DE = OBJECT ADDRESS ; C = BIT MAP BYTE LENGTH ; A = VALUE 1 (NORMAL "0") ; A' = VALUE 2 (NORMAL "1") ; BIT.MAP.OBJ LD B,8 BIT.OA LD (DE),A RLC (HL) JP NC,BIT.OB EX AF,AF' LD (DE),A EX AF,AF' BIT.OB INC DE DJNZ BIT.OA INC HL DEC C JP NZ,BIT.MAP.OBJ RET ; ; BIT MAP OBJECT ; (MEMORY ADD TYPE) ; ; PARAMETER = BIT.OBJ ; CY=1 THEN A=A+N ; BIT.MAP.OBJ.PLUS LD (BIT.OPP+1),A BIT.OP LD B,8 BIT.OPA RLC (HL) JP NC,BIT.OPB LD A,(DE) BIT.OPP ADD A,0 LD (DE),A BIT.OPB INC DE DJNZ BIT.OPA INC HL DEC C JP NZ,BIT.OP RET ; ; LASTER PRINT ; ; IX = COLOR DATA TOP ADRS ; HL = X,Y ; B = COLOR DATA LENGTH ; LASTER.PRINT CALL TDXY DEC B LD C,40 ADD HL,BC LD E,B LD D,0 ADD IX,DE INC B LD (LASRET+1),SP LD (LASAD+1),HL LD HL,LASAD+2 LASAD LD SP,0 LD E,(IX) LD D,E PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE PUSH DE DEC (HL) DEC IX DJNZ LASAD LASRET LD SP,0 RET ; ; COLOR CONVERT ; ; HL = MOTO COLOR BUFFER ; DE = SAKI COLOR BUFFER ; B = COLOR LENGTH ; COLOR.CONVERT XOR A RLD LD C,A EX DE,HL RLD EX DE,HL CP C JP Z,RCVA INC A JP C,RCVA SUB 2 RCVA EX AF,AF' LD A,C RLD LD C,A EX AF,AF' EX DE,HL RLD EX DE,HL CP C JP Z,RCVB INC A JP C,RCVB SUB 2 RCVB EX DE,HL RLD EX DE,HL LD A,C RLD INC DE INC HL DJNZ COLOR.CONVERT RET ; ; PAUSE ; PAUSE XOR A LD ($E000),A LD A,($E001) BIT 6,A RET NZ ; PAUSE.MSG CALL RETURN ; PAS1 XOR A LD ($E000),A LD A,($E001) BIT 6,A JR Z,PAS1 ; ; PUSH ANY KEY TO WAIT ; ANYKEY CALL GET.KEY.PORT JR C,ANYKEY RET ; ; SET PAUSE MESSAGE ; ; HL = CALL ADRS ; SET.PAUSE.MSG LD (PAUSE.MSG+1),HL RET ; ; GET ALL KEY PORT VALUE ; ; CAUTION! EXIT,PORT BIT CPL ; GET.KEY.ALL LD HL,KEY.BF+9 LD B,10 GKA LD A,B DEC A LD ($E000),A LD A,($E001) CPL LD (HL),A DEC HL DJNZ GKA RET ; ; READ KEY BF ; ; DE = COPY BF ADRS (1-10) ; READ.KEY.BF LD HL,KEY.BF JR SKM KEY.BF DS 10 ; ; SET KEY MASK ; ; HL = MASK TBL ADRS (1-10) ; SET.KEY.MASK LD DE,MASK.TBL SKM LD BC,10 LDIR RET ; ; READ KEY MASK ; ; DE = READ MASK TBL ADRS (1-10) ; READ.KEY.MASK LD HL,MASK.TBL JR SKM MASK.TBL DB $FF:$FF:$FF:$FF:$FF DB $FF:$FF:$FF:$FF:$FF ; ; GET KEY PORT NUMBER ; ; EXIT ; ; CY = 1 --- NO ENTER KEY ; CY = 0 --- A = KEY CODE ; GET.KEY.PORT CALL GET.KEY.ALL LD HL,KEY.BF LD DE,MASK.TBL LD B,10 GKPA LD A,(DE) AND (HL) LD (HL),A INC HL INC DE DJNZ GKPA LD HL,KEY.BF+9 LD A,10 GKP1 LD D,0 LD B,8 GKP2 RLC (HL) JP C,GKP3 INC D DJNZ GKP2 DEC HL DEC A JP NZ,GKP1 SCF RET GKP3 DEC A ADD A,A ADD A,A ADD A,A ADD A,D RET ; ; GET KEY ; ; EXIT ; ; CY = 1 --- NO ENTER KEY ; CY = 0 --- A = ASCII CODE ; GET.KEY CALL GET.KEY.PORT RET C LD E,A LD D,0 LD HL,(KEY.TABLE) ADD HL,DE LD A,(HL) RET ; ; SET ASCII TABLE OF 'GET.KEY' ; ; HL = KEY TABLE ADDRESS ; SET.KEY.TABLE LD (KEY.TABLE),HL ; ; READ ASCII TABLE ; ; EXIT: HL = KEY.TABLE ADRS ; READ.KEY.TABLE DB $21 ;LD HL,N KEY.TABLE DS 2 RET ; ; GAME KEY ; ; RETURN ... ; ; BIT 7 6 5 4 3 2 1 0 ; A = A ^ \ タ _ - B ; C = A REGISTER ; ; ON = BIT ON (1) ; (A = Z OR ? KEY) ; (B = SHIFT) ; GAME.KEY LD HL,$E000 LD DE,$E001 DB $3E HAND DB 0 OR A JP NZ,LHAND LD (HL),$F7 LD A,(DE) CPL AND $3C LD C,A LD (HL),$F8 LD A,(DE) CPL AND E ; 1 OR C LD C,A LD (HL),$F1 LD A,(DE) CPL AND $40 OR C LD C,A RET LHAND DEC A JP NZ,HAND.JUMP LD (HL),$F2 LD A,(DE) CPL AND 3 RLCA RLCA RLCA RLCA LD C,A LD (HL),$F4 LD A,(DE) BIT 4,A JP NZ,LHD1 SET 3,C LHD1 BIT 7,A JP NZ,LHD2 SET 2,C LHD2 LD (HL),$F7 LD A,(DE) CPL AND 2 RRCA RRCA RRCA OR C LD C,A LD (HL),$F8 LD A,(DE) CPL AND E ; 1 OR C LD C,A RET ; ; SET GAME KEY L/R SET ; ; A = 0 タ CSR/RIGHT ; A = 1 タ CSR/LEFT ; A = 2 タ HAND JUMP ; SET.GAME.KEY LD (HAND),A ; ; READ GAME KEY ; ; EXIT: ; A = 0 : CSR/RIGHT ; 1 : CSR/LEFT ; 2 : HAND JUMP ; READ.GAME.KEY LD A,(HAND) RET ; ; MOVE FIGHTER 8 HOUKOU ; ; D = X ; E = Y ; HL = MEM(UP,LEFT,DOWN,RIGHT) ; A <> 0 --- NOT CALLED GAME.KEY ; ; \ ; ; C = CONDITION (1=ON, 0=OFF) ; BIT 0 = RIGHT ON ; BIT 1 = LEFT ON ; BIT 2 = DOWN ON ; BIT 3 = UP ON ; MOVE.FIGHTER OR A PUSH DE PUSH HL CALL Z,GAME.KEY POP HL POP DE LD C,0 LD B,A LD A,E BIT 5,B JP Z,MVF1 SET 3,C CP (HL) JP Z,MVF1 DEC E MVF1 LD A,D INC HL BIT 2,B JP Z,MVF2 SET 1,C CP (HL) JP Z,MVF2 DEC D MVF2 INC HL LD A,E BIT 4,B JP Z,MVF3 SET 2,C CP (HL) JP Z,MVF3 INC E MVF3 INC HL LD A,D BIT 3,B RET Z SET 0,C CP (HL) RET Z INC D RET ; ; H = N ; E = N ; ; HL= N*M ; MULTI8 LD D,0 LD L,D LD B,8 TI8 ADD HL,HL JR NC,TI8X ADD HL,DE TI8X DJNZ TI8 RET ; ; HL = M ; E = N ; ; L = M/N ; H = M MOD N ; DIVISION8 LD B,8 XOR A DV8A ADC HL,HL LD A,H JR C,DV8B CP E JR C,DV8C DV8B SUB E LD H,A XOR A DV8C CCF DJNZ DV8A RL L RET ; ; HL = M ; DE = N ; ; HLDE = HL*DE ; MULTI16 PUSH DE EXX LD HL,0 LD DE,0 POP BC EXX LD A,16 TI16 EXX EX DE,HL ADD HL,HL EX DE,HL ADC HL,HL EXX ADD HL,HL JR NC,TI16C EXX EX DE,HL ADD HL,BC EX DE,HL JR NC,TI16B INC HL TI16B EXX TI16C DEC A JR NZ,TI16 EXX RET ; ; 32/16 BIT ; ; DEHL = HIJYOSU ; BC = JYOSU ; ; \ ; DEHL = SYOU ; BC = AMARI ; DIVISION16 PUSH BC EXX POP BC LD HL,0 EXX LD B,32 DIV1 ADD HL,HL EX DE,HL ADC HL,HL EX DE,HL EXX ADC HL,HL JR C,DIV3 SBC HL,BC JR NC,DIV4 ADD HL,BC EXX DJNZ DIV1 DIV2 EXX PUSH HL EXX POP BC RET DIV3 OR A SBC HL,BC DIV4 EXX INC L DJNZ DIV1 JR DIV2 ; ; H = X1 ; L = Y1 ; D = X2 ; E = Y2 ; H < D & L < E ; ; B = D - H + 1 ; C = E - L + 1 ; XYLEN LD A,D SUB H LD B,A LD A,E SUB L LD C,A INC C INC B RET ; ; HL = SCORE BUFFER TOP ; DE = PRINT ADDRESS ; A = MODE ; (0 = 00123456 ; 1 = 123456 ; 2 = 123456 ; 3 = RESERVE) ; SCORE.PRINT DEC A JP M,SCORE0 JR Z,ZERO.SUP2 PUSH DE LD DE,ZPBF CALL SCORE0 POP DE LD HL,ZPBF LD B,8 ZSP1A LD A,(HL) CP $20 JR NZ,ZSP1X INC HL DJNZ ZSP1A LD A,$20 LD (DE),A RET ZSP1X LD C,B LD B,0 LDIR RET ZERO.SUP2 PUSH DE LD DE,ZPBF CALL SCORE0 POP DE LD HL,ZPBF LD B,8 ZSP2A LD A,(HL) CP $20 JR NZ,ZSP1X INC HL INC DE DJNZ ZSP2A LD A,$20 DEC DE LD (DE),A RET SCORE0 LD A,$20 LD B,4 ?SC1 RLD LD (DE),A INC DE RLD LD (DE),A INC DE RLD INC HL DJNZ ?SC1 RET ZPBF DS 8 ; ; HL = SCORE BUFFER ; IY = HIGH SCORE BUFFER ; BC = PLUS VALUE LOW ; DE = PLUS VALUE HIGH ; SCORE.PLUS INC HL INC HL INC HL LD (SCPR+1),IY LD A,C ADD A,(HL) DAA LD (HL),A DEC HL LD A,B ADC A,(HL) DAA LD (HL),A DEC HL LD A,E ADC A,(HL) DAA LD (HL),A DEC HL LD A,D ADC A,(HL) DAA LD (HL),A LD (SCPX+1),HL LD B,4 SCPA LD A,(IY) CP (HL) JR C,SCPX RET NZ INC IY INC HL DJNZ SCPA RET SCPX LD HL,0 SCPR LD DE,0 LD BC,4 LDIR RET ; ; CMS! ; ; ; H = X ; L = Y ; DE= CMS DATA ADRS ; C = READ STATUS (0,1) ; ; EXIT: ; H = NEW X ; L = NEW Y ; DE= NEW CMS DATA ADRS ; C = NEW STATUS (0,1) ; CY= 0 (OK!) ; = 1 #TRAP ON! :(X,Y=OLD XY) ; (#TRAP ON WHEN Y=0) ; ; NOTE: ; (DATA) = [X,Y,X,Y].... ; CMS LD A,(DE) BIT 0,C JR Z,CMS1 AND $F0 RRCA RRCA RRCA RRCA INC DE CMS1 AND $0F LD B,A INC C AND 3 SCF RET Z SUB 2 ADD A,L LD L,A LD A,B AND $0C SCF RET Z RRCA RRCA SUB 2 ADD A,H LD H,A OR A RET ; ; MULTI TASK MAIN ; ; ALL REGISTER SAVED ; MULTI.TASK DI PUSH AF PUSH BC PUSH DE PUSH HL PUSH IX PUSH IY CALL OPEN.IO LD HL,$E007 LD (HL),$B0 LD (HL),$74 DEC L LD (HL),2 LD (HL),0 DEC L TIMER LD (HL),40 ;120/3 LD (HL),0 ; ; TASK CALL ; TSS LD A,0 INC A AND 3 LD (TSS+1),A ADD A,A LD E,A LD D,0 LD HL,TASK.TBL ADD HL,DE LD E,(HL) INC HL LD D,(HL) EX DE,HL LD A,L OR H JP Z,TASK.PASS LD DE,TASK.PASS PUSH DE JP (HL) TASK.PASS CALL CLOSE.IO POP IY POP IX POP HL POP DE POP BC POP AF EI RET ; ; SET JUMP TABLE OF INT. ; ; HL = JUMP ADRS TBL ; SET.TASK.RECORD DI EX DE,HL LD A,$C3 LD HL,MULTI.TASK LD ($1038),A LD ($1039),HL OUT ($E0),A LD ($38),A LD ($39),HL OUT ($E2),A EX DE,HL LD DE,TASK.TBL LD BC,8 LDIR JP MULTI.TASK ; ; READ INT. TABLE ; ; DE = BUFFER ; READ.TASK.RECORD LD HL,TASK.TBL RC LD BC,8 LDIR RET TASK.TBL DW 0:0:0:0 ; ; OBJ-PRESS SUB ; ; ; PRESS ; ; IX = MOTO ADDRESS ; HL = SAKI ADDRESS ; BC = DATA LENGTH ; ; EXIT: ; CY = 0 --- PRESS OK ; CY = 1 --- NOT PRESS ; A = PASS CODE ; HL = LAST ADDRESS +1 ; ; OBJECT ; ; IX = MOTO ASYUKU DATA ADDERSS ; HL = TENKAISAKI ADDRESS ; BC = ASYUKU DATA LENGTH ; A = PASS CODE ; ; EXIT: ; HL = TENKAI SAKI ADRS +1 ; PRESS PUSH IX PUSH HL PUSH IX POP HL XOR A LPA PUSH BC PUSH HL CPIR POP HL POP BC JP PO,SET.V INC A JP NZ,LPA SCF POP HL POP IX RET SET.V LD (PASS),A ;PASS CODE LD (PASS1+1),A POP HL POP IX CALL PRESS.X LD A,(PASS) OR A RET PRESS.X LD A,(IX) LD (HL),A INC IX CPI RET PO CP (IX) JR NZ,PRESS.X CP (IX+1) JR NZ,PRESS.X PASS1 LD (HL),-1 INC HL LD (HL),0 PLA CPI RET PO DEC HL INC IX INC (HL) JR Z,PRESSX LD A,(IX-1) CP (IX) JR Z,PLA PRESSX INC HL JR PRESS.X OBJECT LD (PASS2+1),A OBJECT.X LD A,(IX) LD (HL),A INC IX CPI RET PO LD A,(IX) PASS2 CP 0000 JP NZ,OBJECT.X LD E,(IX-1) INC IX CPI RET PO DEC HL LD D,(IX) INC IX CPI RET PO DEC HL OB LD (HL),E INC HL DEC D JP NZ,OB JP OBJECT.X PASS DB 1 </PRE> <HR> <CENTER>SPACE GRAPHIC</CENTER> <P> <PRE> ORG $9000 ; ; ; SUPER SYSTEM-7C ; (SPACE GRAPHICS) ; BUFR EQU $DF00 KERNEL EQU $1200 ADRS EQU KERNEL+$C00 COLOR EQU $11FF ; ; OS KERNEL CALL ; TDXY EQU 7*3+KERNEL XYLEN EQU 41*3+KERNEL XYCOOD EQU 40*3+KERNEL STTM EQU 16*3+KERNEL MVTM EQU 17*3+KERNEL TRANS40XY EQU 10*3+KERNEL SGN8BIT EQU 20*3+KERNEL SET.GET.BF EQU 14*3+KERNEL PEN EQU 109*3+KERNEL OFFSET $A000-ADRS ORG ADRS ; ; GET CHARACTER ; ; H = X ; L = Y ; B = LX ; C = LY ; DE= GET MEMORY ADDRESS ; GET CALL TDXY LD A,L LD (GT1+1),A LD A,B OR A RET Z LD A,C OR A RET Z LD C,B LD B,0 GT0 PUSH BC LDIR GT1 LD L,0 INC H POP BC DEC A JR NZ,GT0 RET ; ; CHR(+ATB) PUT ; ; H = X ; L = Y ; DE = DATA ADDRESS ; B = LENGTH OF CHR.X ; C = LENGTH OF CHR.Y ; ; PUT.CHR CALL TDXY LD A,L LD (PTL1+1),A LD A,B LD (PTB1+1),A PTB1 LD B,0 PTA1 LD A,(DE) OR A JR Z,PTA2 LD (HL),A PTA2 INC L INC DE DJNZ PTA1 PTL1 LD L,0 INC H DEC C JP NZ,PTB1 RET ; ; CHR(+ATB) PUT OVER (BIT3=1 PAS) ; ; H = X ; L = Y ; DE = DATA ADDRESS ; B = LX ; C = LY ; PUT.OVER.CHR CALL TDXY LD A,L LD (PTOCL1+1),A LD A,B LD (PTOCB1+1),A PTOCB1 LD B,0 PTOCA1 LD A,(DE) OR A JR Z,PTOCA2 SET 7,L BIT 3,(HL) RES 7,L JR NZ,PTOCA2 LD (HL),A PTOCA2 INC L INC DE DJNZ PTOCA1 PTOCL1 LD L,0 INC H DEC C JP NZ,PTOCB1 RET ; ; (CHR+)ATB PUT ; PUT.ATB CALL TDXY LD A,B LD (PTB2+1),A LD A,L LD (PTL2+1),A PTB2 LD B,0 PTA3 LD A,(DE) BIT 3,A JR NZ,PTA5 OR A JP P,PTA4 RRD AND $7F PTA4 LD (HL),A PTA5 INC L INC DE DJNZ PTA3 PTL2 LD L,0 INC H DEC C JP NZ,PTB2 RET ; ; (CHR+)ATB PUT ; PUT.OVER.ATB CALL TDXY LD A,B LD (PTOAB2+1),A LD A,L LD (PTOAL2+1),A PTOAB2 LD B,0 PTOAA3 BIT 3,(HL) JR NZ,PTOAA5 LD A,(DE) BIT 3,A JR NZ,PTOAA5 OR A JP P,PTOAA4 RRD AND $7F PTOAA4 LD (HL),A PTOAA5 INC L INC DE DJNZ PTOAA3 PTOAL2 LD L,0 INC H DEC C JP NZ,PTOAB2 RET ; ; PUT HYPER ; PUT.HYP CALL TDXY EX DE,HL LD A,E LD (PHY2+1),A LD A,B LD (PHY1+1),A LD A,C LD B,0 PHY1 LD C,0 LDIR PHY2 LD E,0 INC D DEC A JP NZ,PHY1 RET ; ; LARGE & SMALL PUT ; ; H = X ; L = Y ; DE = DATA ADDRESS ; B = LX ; C = LY ; H' = PRINT LX ; L' = PRINT LY ; PUT.LS CALL TDXY PUSH BC EXX POP DE LD C,0 EXX LD A,B LD (WRITE.X+1),A LD (WRYF+1),A LD A,L LD (WRYC+1),A LD (WRYE+1),A ; WRITE.Y WRYA EXX LD A,C ADD A,L WRYB LD C,A CP E EXX JR C,WRYF JR Z,WRYD CALL WRITE.X WRYC LD L,0 INC H EXX LD A,C SUB E JP WRYB WRYD EXX LD C,0 EXX CALL WRITE.X WRYE LD L,0 INC H WRYF LD A,0 ADD A,E LD E,A LD A,0 ADC A,D LD D,A ; DEC C JP NZ,WRYA RET WRITE.X LD B,0 EXX LD B,0 EXX PUSH DE WRXA EXX LD A,B ADD A,H WRXB LD B,A CP D EXX JR C,WRXF JR Z,WRXD LSS1 CALL PEN.LS INC L EXX LD A,B SUB D JP WRXB WRXD EXX LD B,0 EXX LSS2 CALL PEN.LS INC L WRXF INC DE DJNZ WRXA ; POP DE RET PEN.LS LD A,(DE) OR A RET M LD (HL),A RET ; ; SET PUT.LS PEN ; ; HL = PEN ADDRESS ; (DE = DATA ADDRESS ; HL = KVRAM ADDRESS) ; ; DON'T BREAK ALL REGISTER IN SUB ; ; SET.PEN.LS LD (LSS1+1),HL LD (LSS2+1),HL ; ; READ PEN PUT.LS ; ; EXIT:HL = ADDRESS ; READ.PEN.LS LD HL,(LSS1+1) RET ; ; ATB CPL PUT ; ; H = X ; L = Y ; DE= DATA ADDRESS ; B = LX ; C = LY ; PUT.CPL CALL TDXY LD A,L LD (PCL+1),A LD A,B LD (PCB+1),A PCB LD B,0 PCA LD A,(DE) CPL LD (HL),A PCX INC L INC DE DJNZ PCA PCL LD L,0 INC H DEC C JP NZ,PCB RET ; ; ATB CPL PUT OVER ; ; H = X ; L = Y ; DE= DATA ADDRESS ; B = LX ; C = LY ; PUT.OVER.CPL CALL TDXY LD A,L LD (POL+1),A LD A,B LD (POB+1),A POB LD B,0 POA BIT 3,(HL) JR NZ,POX LD A,(DE) CPL LD (HL),A POX INC L INC DE DJNZ POA POL LD L,0 INC H DEC C JP NZ,POB RET ; ; SCREEN EFFECT ; ; H = X1 ; L = Y1 ; D = X2 ; E = Y2 ; BC = EFFECT OPERATION ADRS ; (HL=KVRAM ADDRESS) ; SCREEN.EFFECT LD (SCRN.CALL+1),BC SCREEN.EFFECT2 CALL XYCOOD CALL XYLEN CALL TDXY LD E,L LD D,B SCRN.CALL CALL 0 INC L DJNZ SCRN.CALL LD L,E INC H LD B,D DEC C JP NZ,SCRN.CALL RET ; ; BOX.CHR ; ; IX = ミ ホ © ン ヘ © ; H = X1 ; L = Y1 ; D = X2 ; E = Y2 ; BOX.CHR XOR A JP BOXA ; ; BOX.ATB ; ; IX = "ミ ホ © ン ヘ ©" _ ゥ 鵡- ; H = X1 ; L = Y1 ; D = X2 ; E = Y2 ; BOX.ATB LD A,5 BOXA LD (CPORT1+1),A ; ; WRITING BOX ; CALL XYCOOD CALL XYLEN CALL TDXY EX DE,HL CALL TDXY BXA1 LD A,(IX+5) CALL CPORT1 LD A,(IX+1) EX DE,HL CALL CPORT1 EX DE,HL INC E DEC L DJNZ BXA1 DEC E INC L LD B,C BXA2 LD A,(IX+7) CALL CPORT1 LD A,(IX+3) EX DE,HL CALL CPORT1 EX DE,HL INC D DEC H DJNZ BXA2 DEC D INC H ; LD A,(IX) CALL CPORT1 LD A,(IX+4) EX DE,HL CALL CPORT1 EX DE,HL LD A,L LD L,E LD E,A LD A,(IX+6) EX DE,HL CALL CPORT1 EX DE,HL LD A,(IX+2) ; CPORT1 JR GPORT1 CP $F0 RET Z LD (HL),A RET GPORT1 BIT 3,A RET NZ OR A JP P,GP1 RRD AND $7F GP1 LD (HL),A RET ; ; BOX FILL ; ; H = X1 ; L = Y1 ; D = X2 ; E = Y2 ; A = COLOR OR CHARACTER ; BOX.FILL EX AF,AF' CALL XYCOOD CALL XYLEN EX AF,AF' BOX.FILL2 ; ; BOX.FILL2 ; ; H = X ; L = Y ; B = LX ; C = LY ; A = COLOR OR CHARACTER ; LD (BXF1+1),A CALL TDXY LD D,L LD E,B BXF1 LD A,0 BXF2 LD (HL),A INC L DJNZ BXF2 LD L,D LD B,E INC H DEC C JP NZ,BXF2 RET ; ; BOX FILL (USE PEN) ; ; H = X1 ; L = Y1 ; D = X2 ; E = Y2 ; BOX.FILL.PEN CALL XYCOOD CALL XYLEN BOX.FILL2.PEN ; ; BOX.FILL2 (USE PEN) ; ; H = X ; L = Y ; B = LX ; C = LY ; LD D,H LD E,B BXFP CALL PEN INC H DJNZ BXFP LD H,D LD B,E INC L DEC C JP NZ,BXFP RET ; ; BOX NORMAL ; ; H = X1 ; L = Y1 ; D = X2 ; E = Y2 ; A = COLOR OR CHARACTER ; BOX.NORMAL EX AF,AF' CALL XYCOOD CALL XYLEN CALL TDXY EX DE,HL CALL TDXY EX AF,AF' ; BXNA LD (HL),A LD (DE),A INC E DEC L DJNZ BXNA DEC E INC L LD B,C BXNB LD (HL),A LD (DE),A DEC H INC D DJNZ BXNB RET ; ; BOX COLOR TYPE ; ; H = X1 ; L = Y1 ; D = X2 ; E = Y2 ; A = COLOR (BIT 7=1 タ BG OR) ; (BIT 3=1 タ CPL ) BOX.COLOR EX AF,AF' CALL XYCOOD CALL XYLEN CALL TDXY EX DE,HL CALL TDXY EX AF,AF' ; BCLA CALL ATB.SET INC E DEC L DJNZ BCLA DEC E INC L CALL ATB.SET LD B,C BCLB CALL ATB.SET DEC H INC D DJNZ BCLB INC H DEC D ; ATB.SET OR A JP P,ATBX PUSH BC LD C,A RRD AND $7F LD (HL),A EX DE,HL LD A,C RRD LD (HL),A EX DE,HL LD A,C POP BC RET ATBX BIT 3,A JR NZ,ATB.CPL LD (HL),A LD (DE),A RET ATB.CPL EX AF,AF' LD A,(HL) CPL LD (HL),A LD A,(DE) CPL LD (DE),A EX AF,AF' RET ; ; BOX (USE PEN) ; ; H = X1 ; L = Y1 ; D = X2 ; E = Y2 ; BOX.PEN CALL XYCOOD CALL XYLEN BXNAP CALL PEN EX DE,HL CALL PEN EX DE,HL INC H DEC D DJNZ BXNAP DEC H INC D LD B,C BXNBP CALL PEN EX DE,HL CALL PEN EX DE,HL INC L DEC E DJNZ BXNBP RET ; ; LINE ; ; LINE ( DE タ HL ) ; ; D = X1 ; E = Y1 ; H = X2 ; L = Y2 ; LINE LD (LNB+1),HL PUSH DE CALL STTM LD E,$3E LD (XYFLAG),DE POP DE EX DE,HL LNA EX AF,AF' LNCALL CALL PEN PUSH DE PUSH HL LNB LD DE,0 SUB HL,DE POP HL POP DE RET Z XYFLAG LD A,0 CALL MVTM JP LNA ; ; CIRCLE ; ; H = X1 ; L = Y1 ; D = X2 ; E = Y2 ; CIRCLE CALL XYCOOD CALL XYLEN SRL B LD D,B LD A,B ADD A,H LD H,A LD A,B ADD A,L LD L,A EX DE,HL ; ; CIRCLE (1/4|) ; ; H = R (HANKEI) ; D = X ; E = Y ; ; CIRCLE.X INC H DEC H JR Z,ENX ; INC D --- FILL LD A,1 SUB H LD L,0 ENLP EX AF,AF' PEN.EN CALL PEN.CIRCLE EX AF,AF' OR A JP M,ENA DEC H RET Z SUB H JP ENLP ENA INC L ADD A,L JP ENLP ENX EX DE,HL JP PEN ; ; USE CIRCLE ; PEN PATTERN ; ; H = X ; L = Y ; PEN.CIRCLE LD BC,HL LD A,D ADD A,H LD H,A LD A,E ADD A,L LD L,A CALL PEN LD HL,BC LD A,D ADD A,H LD H,A LD A,E SUB L LD L,A INC L CALL PEN LD HL,BC LD A,D SUB H LD H,A INC H LD A,E SUB L LD L,A INC L CALL PEN LD HL,BC LD A,D SUB H LD H,A INC H LD A,E ADD A,L LD L,A CALL PEN LD HL,BC RET ; ; CIRCLE.FILL ; ; H = R (HANKEI) ; D = X ; E = Y ; ; CIRCLE.FILL EXX LD DE,(PEN.EN+1) LD HL,PEN.CIRCLE.FILL LD (PEN.EN+1),HL EXX CALL CIRCLE EXX LD (PEN.EN+1),DE RET ; ; USE CIRCLE.FILL ; PEN PATTERN ; ; H = X ; L = Y ; PEN.CIRCLE.FILL PUSH DE PUSH HL LD A,H ADD A,A JR Z,CFX LD B,A LD C,A LD A,D SUB H LD H,A LD D,A LD A,E ADD A,L PUSH AF LD A,E SUB L INC A LD E,A POP AF LD L,A CFL CALL PEN EX DE,HL CALL PEN EX DE,HL INC H INC D DJNZ CFL POP HL POP DE RET CFX CALL PEN POP HL POP DE RET ; ; SET PEN.CIRCLE ; ; HL = ADDRESS ; SET.PEN.CIRCLE LD (PEN.EN+1),HL ; ; READ PEN.CIRCLE ; ; EXIT: HL = PEN ADDRESS ; READ.PEN.CIRCLE LD HL,(PEN.EN+1) RET ; ; KVRAM SCROLL UP ; ; H = X1 ; L = Y1 ; D = X2 ; E = Y2 ; SCRL.UP CALL XYCOOD CALL XYLEN CALL TDXY PUSH BC PUSH HL LD DE,BUFR LD C,B LD B,0 LDIR POP HL POP BC LD A,L LD (SRUL+1),A LD A,B LD (SRUC+1),A LD B,0 EX AF,AF' LD A,C SRUA LD DE,HL INC H SRUC LD C,0 LDIR SRUL LD L,0 DEC A JP NZ,SRUA DEC H EX DE,HL EX AF,AF' LD C,A LD HL,BUFR LDIR RET ; ; SCROLL DOWN ; ; H = X1 ; L = Y1 ; D = X2 ; E = Y2 ; SCRL.DOWN CALL XYCOOD CALL XYLEN EX DE,HL CALL TDXY PUSH BC PUSH HL LD DE,BUFR+255 LD C,B LD B,0 LDDR POP HL POP BC ;LD A,L ;LD (SRDL+1),A LD A,B LD (SRDC+1),A LD B,0 EX AF,AF' LD A,C SRDA LD DE,HL DEC H SRDC LD C,0 PUSH HL LDDR POP HL SRDL ;LD L,0 DEC A JP NZ,SRDA INC H EX DE,HL EX AF,AF' LD C,A LD HL,BUFR+255 LDDR RET ; ; SCROLL LEFT ; ; H = X1 ; L = Y1 ; D = X2 ; E = Y2 ; SCRL.LEFT CALL XYCOOD CALL XYLEN CALL TDXY LD A,L LD (SRLL+1),A LD A,B LD (SRLC+1),A LD B,0 LD A,C SRLL LD L,0 LD DE,HL INC L EX AF,AF' LD A,(DE) SRLC LD C,0 LDIR DEC DE LD (DE),A INC H EX AF,AF' DEC A JP NZ,SRLL RET ; ; SCROLL RIGHT ; ; H = X1 ; L = Y1 ; D = X2 ; E = Y2 ; SCRL.RIGHT CALL XYCOOD LD A,D EX AF,AF' CALL XYLEN EX AF,AF' LD H,A CALL TDXY LD A,B LD (SRRC+1),A LD B,0 LD A,C SRRL PUSH HL LD DE,HL DEC L EX AF,AF' LD A,(DE) SRRC LD C,0 LDDR INC DE LD (DE),A POP HL INC H EX AF,AF' DEC A JP NZ,SRRL RET ; ; POLYGON ; ; ; IX = YX DATA BUFFER ; (END CODE _ Y=-1) ; POLYGON LD E,(IX) LD D,(IX+1) LD L,(IX+2) LD H,(IX+3) INC E RET Z INC L RET Z DEC L DEC E CALL LINE INC IX INC IX JP POLYGON ; ; POLYGON FILL ; ; IY = WORK AREA (ABOUT 512?) ; IX = YX DATA BUFFER ; (END CODE _ Y=-1) ; POLYGON.FILL PUSH IX CALL POLYGON POP IX LD (TOP),IX LD (WORK),IY LD HL,SET.XYBF CALL SET.GET.BF CALL GET.DATA.LEN.IX LD E,0 INC IX INC IX DEC BC PUSH BC POLYA LD A,(IX) SUB (IX-2) INC IX INC IX CALL SGN8BIT OR A JR Z,POLYB LD E,A POLYB DEC BC LD A,B OR C JP NZ,POLYA ; LD A,E LD (F1),A POP BC LD IX,(TOP) POLYD LD E,(IX) LD D,(IX+1) LD L,(IX+2) LD H,(IX+3) PUSH BC CALL GET.LINE.XY POP BC INC IX INC IX DEC BC LD A,B OR C JR NZ,POLYD LD (IY),-1 ;ENDCODE LD IY,(WORK) CALL XYSORT CALL SUPER.FILL ; LD HL,RETURN JP SET.GET.BF SET.XYBF LD (IY),L LD (IY+1),H INC IY INC IY RETURN RET SET.GBF LD HL,SET.XYBF JP SET.GET.BF GET.LINE.XY LD A,L SUB E RET Z CALL SGN8BIT LD (F2),A LD C,A OR A JR Z,GTLA LD A,(F1) OR A JR Z,GTLA ADD A,C EX DE,HL CALL Z,SET.XYBF EX DE,HL GTLA LINE.POLY LD (LNPB+1),HL PUSH DE CALL STTM LD E,$3E LD (LNPXYFLAG),DE POP DE EX DE,HL LNPA EX AF,AF' PUSH DE PUSH HL LNPB LD DE,0 OR A SBC HL,DE POP HL POP DE JR Z,LNPC LNPXYFLAG LD A,0 CALL MVTM JP LNPA LNPC LD A,(F2) LD (F1),A RET TOP DS 2 WORK DS 2 F2 DS 1 F1 DS 1 ; ; GET IY DATA LENGTH ; ; IY = YX DATA POINTER ; GET.DATA.LEN PUSH IY LD BC,0 GDA LD A,(IY) INC A JR Z,GDB INC BC INC IY INC IY JP GDA GDB POP IY RET ; ; GET IX DATA LENGTH ; ; IX = YX DATA POINTER ; GET.DATA.LEN.IX PUSH IX LD BC,0 GDAX LD A,(IX) INC A JR Z,GDBX INC BC INC IX INC IX JP GDAX GDBX POP IX RET ; ; ; SUPER FILL ; ; IY=DATA ADDRESS (-1=ENDCODE) ; ; DATA= Y,X,Y,X,...,-1(Y) ; SUPER.FILL LD L,(IY) INC L RET Z DEC L LD A,(IY+3) SUB (IY+1) INC A LD B,A LD H,(IY+1) ; CALL PEN.FILL ; LD BC,4 ADD IY,BC JP SUPER.FILL PEN.FILL CALL PEN INC H DJNZ PEN.FILL RET ; ; GRAPHICS PEN! ; ; H = X ; L = Y ; ; COLOR DATA = COLOR ADDRESS ; ; CAUTION!: DON'T BREAK REGISTER ; PEN.DEF PUSH HL CALL TDXY LD A,(COLOR) LD (HL),A POP HL RET ; ; SET PEN STYLE ; ; HL = PEN EXEC. ADRS ; ; DON'T BREAK ALL REGISTERS ; ; PARA: H=X, L=Y ONLY ; SET.PEN.STYLE LD (PEN+1),HL ; ; READ PEN STYLE (ADDRESS) ; ; EXIT: ; ; HL = PEN EXEC. ADDRESS ; READ.PEN.STYLE LD HL,(PEN+1) RET ; ; YX SORT ; ; IY = DATA ; XYSORT CALL GET.DATA.LEN LD A,B OR C RET Z PUSH IY PUSH BC PUSH IY SORTA PUSH BC CALL SORT.SUB POP BC INC IY INC IY DEC BC LD A,B OR C JP NZ,SORTA POP IY POP BC SORTB PUSH BC CALL SORT.SUB2 POP BC INC IY INC IY DEC BC LD A,B OR C JP NZ,SORTB POP IY RET SORT.SUB PUSH IY POP HL ; SRTA LD A,(IY) CP (HL) JR C,SRTB LD E,(HL) LD (HL),A LD (IY),E INC HL LD A,(IY+1) LD E,(HL) LD (HL),A LD (IY+1),E DEC HL SRTB INC HL CPI JP PE,SRTA RET SORT.SUB2 PUSH IY POP HL INC HL SRTA2 DEC HL LD A,(HL) INC HL CP (IY) JR NZ,SRTB2 LD A,(IY+1) CP (HL) JR C,SRTB2 LD E,(HL) LD (HL),A LD (IY+1),E DEC HL LD E,(HL) LD A,(IY) LD (HL),A LD (IY),E INC HL SRTB2 INC HL CPI JP PE,SRTA2 RET ; ; DE=PRINT ADRS CHR ; HL=PRINT ADRS COLOR ; A = PRINT DOT VALUE ; C = COLOR ; ?GAGE LD B,8 ?GA1 EX DE,HL LD (HL),$43 ;'ネ' EX DE,HL LD (HL),C INC DE INC HL SUB B JR NC,?GA1 ADD A,B DEC DE DEC HL PUSH DE LD C,A LD B,0 LD DE,TBLG EX DE,HL ADD HL,BC EX DE,HL LD A,(DE) POP DE OR A RES 7,A LD (DE),A RET P LD A,(HL) RRD RET TBLG DB 0:$71:$37:$37 DB $7B:$FF:$BF:$BD ; ; INSTALL ROUTINE ; INSTALL LD HL,COPY.TBL LD DE,74*3+$1200 LD BC,COPY.END-COPY.TBL LDIR JP $AD COPY.TBL JP SET.PEN.STYLE JP READ.PEN.STYLE JP SET.PEN.LS JP READ.PEN.LS JP SET.PEN.CIRCLE JP READ.PEN.CIRCLE JP ?GAGE JP 0 JP GET JP PUT.CHR JP PUT.OVER.CHR JP PUT.ATB JP PUT.CPL JP PUT.OVER.ATB JP PUT.OVER.CPL JP PUT.HYP JP PUT.LS JP BOX.NORMAL JP BOX.COLOR JP BOX.CHR JP BOX.ATB JP BOX.FILL JP BOX.PEN JP BOX.FILL.PEN JP SCRL.UP JP SCRL.DOWN JP SCRL.LEFT JP SCRL.RIGHT JP LINE JP CIRCLE JP CIRCLE.FILL JP POLYGON JP POLYGON.FILL JP SUPER.FILL JP SCREEN.EFFECT JP PEN.DEF ;PSET PEN COPY.END </PRE> <HR> <CENTER>FONT MANAGER</CENTER> <P> <PRE> ;%%%%%%%%%%%%%%%%%%% ; ; FONT MANAGER V ER3.0 ; KERNEL EQU $1200 ADRS EQU KERNEL+$1300 TRANS EQU 10*3+KERNEL MULTI8 EQU 56*3+KERNEL DIVISION32 EQU 59*3+KERNEL MULTI16 EQU 58*3+KERNEL CHECK.AREA EQU 36*3+KERNEL SET.VRAM.SW EQU 52*3+KERNEL ZAHYO EQU 50*3+KERNEL COLOR.ZAHYO EQU 51*3+KERNEL BIT.MAP.OBJ EQU 42*3+KERNEL GET.XY EQU 9*3+KERNEL SET.PUT.LS.PEN EQU 76*3+KERNEL READ.PUT.LS.PEN EQU 77*3+KERNEL PUT.LS EQU 90*3+KERNEL WORK16 EQU $D500 WORK.BF EQU $D600 COLOR.BF EQU $D400 FONT.BF EQU $DC00 BIT.MAP.BF EQU $D400 OFFSET $A000-ADRS ORG ADRS ;%%%%%%%%%%%%%%%%%%%%%%%% ; ; BIT.MAP.BF = 4*19 ; COLOR.BF = 32*19 ; WORK.BF = 4*19 ; ;%%%%%%%%%%%%%%%%%%%%%%%% ; ; MESSAGE NORMAL ; MESSAGE CALL END.CODE RET Z CALL PRINT.ONE.CHR JP MESSAGE ; ; MESSAGE LENGTH ; MESSAGE.LENGTH CALL END.CODE RET Z PUSH BC CALL PRINT.ONE.CHR POP BC DEC BC LD A,B OR C JP NZ,MESSAGE.LENGTH RET ; ; MESSAGE LEFT (UP) ; MESSAGE.LEFT CALL SET.LC LD A,(TATE) DEC A JP NZ,MESSAGE LD A,1 LD (UN.CR),A ML1 CALL GET.CR.LEN JR NC,ML2 MLA CALL MESSAGE.LENGTH JP ML1 ML2 LD A,B OR C JR NZ,ML3 CALL END.CODE JR Z,XXXX SCF CALL CTRL.JP JP ML1 ML3 LD A,(DEST.TBL+1) ADD A,E DEC A LD (XY+1),A JP MLA XXXX XOR A LD (UN.CR),A RET ; ; MESSAGE RIGHT (DOWN) ; MESSAGE.RIGHT CALL SET.LC LD A,(TATE) DEC A JP Z,MESSAGE LD A,1 LD (UN.CR),A MR1 CALL GET.CR.LEN JR NC,MR2 MRA PUSH BC CALL MESSAGE.LENGTH POP DE LD HL,DEST.TBL+2 LD A,(TATE) CP 2 JR Z,MRA1 INC HL MRA1 LD A,(HL) DEC HL DEC HL SUB (HL) INC A LD L,A LD H,0 EX DE,HL SUB HL,DE CALL NC,CRX JP MR1 MR2 LD A,B OR C JR NZ,MR3 CALL END.CODE JR Z,XXXX SCF CALL CTRL.JP JP MR1 MR3 LD A,(TATE) CP 2 JR Z,MRT LD A,(DEST.TBL+3) SUB E INC A LD (XY+1),A JP MRA MRT LD A,(DEST.TBL+2) SUB E INC A LD (XY),A JP MRA ; ; MESSAGE CENTER ; MESSAGE.CENTER CALL SET.LC MC1 CALL GET.CR.LEN JR NC,MC2 MCA CALL MESSAGE.LENGTH JP MC1 MC2 LD A,B OR C JR NZ,MC3 CALL END.CODE RET Z SCF CALL CTRL.JP JP MC1 MC3 LD A,(TATE) DEC A JR Z,MCR JP P,MCT LD A,(LC) SUB E SRA A LD HL,(DEST.TBL) ADD A,H LD (XY+1),A JP MCA MCR LD A,(LC) SUB E SRA A LD L,A LD A,(DEST.TBL+3) SUB L LD (XY+1),A JP MCA MCT LD A,(LC) SUB E SRA A LD HL,(DEST.TBL) ADD A,L LD (XY),A JP MCA ; ; LC SETTING ; SET.LC LD A,(TATE) CP 2 JR Z,SLC LD HL,(DEST.TBL) LD A,(DEST.TBL+3) SUB H INC A LD (LC),A RET SLC LD HL,(DEST.TBL) LD A,(DEST.TBL+2) SUB L INC A LD (LC),A RET PS.CODE LD A,(IX) CP 13 RET Z CP $0A RET Z END.CODE LD A,(IX) CP $1A RET Z OR A RET ; ; TATE WRAP. ; TWRAP? LD A,(TATE) CP 2 JR NZ,TW LD A,(TATE.WRAP.FLAG) OR A RET Z LD A,(IX) CP $BE JR C,TW CP $C0 RET TW OR A RET ; ; JIKAN GET ; GET.JIKAN EXX CALL SET.PXY EXX LD A,(TATE) DEC A JP M,GJ0F JP Z,GJ0F LD HL,(PXY) JR GJ1F GJ0F LD HL,(PXY+1) GJ1F LD H,0 ADD HL,DE EX DE,HL INC BC RET ; ; PASS CODE LENGTH GETTING ; GET.CR.LEN LD BC,0 LD DE,0 PUSH IX GCL CALL PS.CODE JR Z,GCRX LD A,(IX) CP 5 JR Z,SKIPX CP 21 JR Z,SKIPX CP $1B JR Z,SKIPQ CALL TWRAP? CALL NC,GET.JIKAN CALL CHECKL JR C,GCRX INC IX JR GCL GCRX POP IX RET SKIPQ INC IX INC IX SKIPX INC IX INC BC JR GCL CHECKL LD HL,(LC) OR A SBC HL,DE RET NC EX DE,HL DEC BC LD A,B OR C SCF RET NZ INC BC RET ; ; PRINT ONE CHR ; PRINT.ONE.CHR CALL CONTROL? ;REWRITE CTRL.JP JP C,CONTROL ;REWRITE LD HL,(XY) LD (OLD.XY),HL CALL FONT CALL TATE.TRAP CALL SET.PXY INC IX LD HL,(XY) LD A,(TATE) DEC A JR Z,?YOKO JP P,?TATE LD A,(PXY+1) ADD A,H LD (XY+1),A EX AF,AF' LD A,(UN.CR) OR A RET NZ EX AF,AF' JP C,CRX LD H,A LD A,(DEST.TBL+3) ;RIGHT CP H RET NC JP CRX ?YOKO LD A,(XY+1) LD HL,(PXY) SUB H LD (XY+1),A EX AF,AF' LD A,(UN.CR) OR A RET NZ EX AF,AF' JP C,CRX ; 0 - UNDER LD HL,(DEST.TBL) CP H RET NC JP CRX ?TATE LD A,(PXY) ADD A,L LD (XY),A LD H,A LD A,(UN.CR) OR A RET NZ LD A,(DEST.TBL+2) ;DOWN CP H RET NC JP CRX ; ; CONTROL CODE CHECK ; CONTROL? LD A,(IX) CP " " RETURN RET ; ; CONTROL OPERATION ; CONTROL LD A,(IX) INC IX CP $1B JR Z,ESC OR A JR Z,CREQ CP $1A JR Z,CREQ CP 5 JP Z,SWITCH.COLOR CP 10 JP Z,CR0A CP 13 JP Z,CR0D CP 21 RET NZ ; ; HOME CONTROL ; HOME LD HL,(DEST.TBL) LD (XY),HL RET CREQ DEC IX RET ESC LD A,(IX) INC IX DEC A JP M,SET.COLOR JP Z,SET.COLOR.EF DEC A JP Z,SET.X DEC A RET NZ ; ; SET Y COORDINATE ; SET.Y LD A,(IX) LD (XY),A INC IX RET SET.X LD A,(IX) LD (XY+1),A INC IX RET SET.COLOR LD A,(IX) LD (COLOR),A INC IX RET SET.COLOR.EF LD A,(IX) LD (COLOR.EF),A INC IX RET SWITCH.COLOR LD A,(COLOR) XOR $80 LD (COLOR),A RET ; ; $0A OPERATION ; CR0A LD A,(TATE) DEC A JR Z,CR.RIGHT JP P,CR.UP LD A,(DEST.TBL+1) LD (XY+1),A RET CR.RIGHT LD A,(DEST.TBL+3) LD (XY+1),A RET CR.UP LD A,(DEST.TBL) LD (XY),A RET ; ; $0D OPERATION ; CRX CALL CR0A JR CRA CR0D LD A,(MZ.CR) OR A CALL Z,CR0A ;0=MZ CRA CALL GET.CR.PITCH LD A,(TATE) CP 2 JR Z,CR.TATE LD A,(CR.PITCH) LD HL,(XY) ADD A,L LD (XY),A LD HL,(DEST.TBL+2) SUB L RET C RET Z CRW LD B,A LD HL,FONT.RECORD SCRL.X JP RETURN ;SCROLL JUMP CR.TATE LD HL,(CR.PITCH) LD A,(XY+1) SUB L JR C,CRT LD (XY+1),A LD HL,(DEST.TBL) SUB H RET NC CRT NEG JR CRW ; ; JIKAN,GYOKAN,CR PITCH ; SET.PXY LD A,(FONT.TYPE) OR A JR NZ,STPA LD HL,(FONT.LY) LD (PXY),HL RET STPA LD A,(PROP.FLAG) OR A JR Z,STP CALL GET.PITCH.X LD A,D LD (PXY+1),A CALL GET.PITCH.Y LD A,D LD (PXY),A RET STP LD HL,(?FONT.LY) LD (PXY),HL RET ; ; CR PITCH ; GET.CR.PITCH LD A,(CR.FLAG) OR A LD A,(CR.LEN) JR NZ,GCPX LD HL,(PXY) LD A,(TATE) CP 2 LD A,L JR NZ,GCPX LD A,H GCPX LD (CR.PITCH),A RET ; ; PITCH X,Y WO MOTOMERU ; GET.PITCH.X LD BC,(FONT.LX) LD A,(?FONT.LX) LD (?WFLX+1),A JR PITCH GET.PITCH.Y LD BC,(FONT.LY) LD A,(?FONT.LY) LD (?WFLX+1),A PITCH LD E,(IX) LD D,0 LD HL,(PROP.TBL) ADD HL,DE LD L,(HL) ;CALL $3BA CALL 12 LD H,D PUSH HL ?WFLX LD H,0 LD E,D LD B,D LD L,D CALL DIVISION32 ;CALL $3BA POP DE ;CALL 12 CALL MULTI16 ;D=PLXY RET ; ; TATE WORD WRAPAROUND ; ; WORD = セ & ソ ; TATE.TRAP LD A,(TATE) CP 2 RET NZ LD A,(FONT.TYPE) OR A RET NZ LD A,(TATE.WRAP.FLAG) OR A RET Z LD A,(IX+1) CP $BE RET C CP $C0 RET NC LD HL,(XY) LD (STORE.XY),HL LD HL,(OLD.XY) INC H LD (XY),HL INC IX CALL FONT LD HL,(STORE.XY) LD (XY),HL RET STORE.XY DS 2 OLD.XY DS 2 ; ; FONT RECORD TABLE ; FONT.RECORD VERSION DB 0 XY DB 0 DB 0:0 DEST.TBL DB 0:0:24:39 VIEW.TBL DB 0:0:24:39 VRAM.SW DB 0 TATE DB 0 MZ.ASC DB 0 CONTROL.ADRS DW CONTROL CONTROL?.ADRS DW CONTROL? SCRL.JP DW RETURN TAB.TBL DW 0000 ;RESERVE PROP.FLAG DB 0 PROP.TBL DW 0 ASC.TBL DW $0A92 FONT.TBL DW 0000 FONT.TYPE DB 0 FONT.STYLE DW 0 COLOR DB $70 COLOR.EF DB 0 FONT.LY DB 1 FONT.LX DB 1 ?FONT.LY DB 1 ?FONT.LX DB 1 FONT.CHR DB $5A BG.PAT.ADRS DW 0 BG.PAT.LX DB 0 FONT.PAT.ADRS DW 0 FONT.PAT.LX DB 0 SHADOW.COLOR DB $11 STRIKE.COLOR DB $22 UNDER.COLOR DB $33 UPPER.COLOR DB $44 TATE.WRAP.FLAG DB 0 JIKAN DB 0 CR.FLAG DB 0 CR.LEN DB 1 MZ.CR DB 0 FONT.TBL.END ;--------- INTERNAL WORK ---- CR.PITCH DB 0 PXY DB 0:0 LC DW 0 UN.CR DB 0 ;--------- RECORD END ------- ; ; FONT PRINT ; FONT LD A,(FONT.TYPE) OR A JP NZ,BIT.MAP.FONT CALL CHECK.VIEW RET C LD L,(IX) LD H,0 LD DE,(ASC.TBL) ADD HL,DE LD A,(HL) EX AF,AF' LD HL,(XY) CALL ZAHYO EX AF,AF' LD (HL),A CALL COLOR.ZAHYO EF LD A,(COLOR.EF) DEC A JP M,EF0 JR Z,EF1 SUB 2 JP M,EF2 RET Z ; ; BIT7 EFFECT ; EF4 LD A,(IX) CP $61 RET C CP $7B RET NC SET 7,(HL) RET EF0 LD A,(COLOR) LD (HL),A RET EF1 LD A,(COLOR) RRD LD (HL),A RET EF2 LD A,(COLOR) NEG LD (HL),A RET BIT.MAP.FONT LD A,(VRAM.SW) OR A RET NZ LD HL,(FONT.LY) LD (STORE.FONT.LY),HL LD HL,(?FONT.LY) LD (STORE.?FONT.LY),HL LD A,H OR A RET Z LD A,L OR A RET Z ; LD HL,(XY) LD A,(VIEW.TBL+2) ;DOWN CP L RET C ; CALL INIT.FONT CALL FONT.OBJ ;LD A,(FONT.STYLE) ;BIT 0,A ;CALL NZ,REVERSE.UD ;LD A,(FONT.STYLE) ;BIT 1,A ;CALL NZ,REVERSE.LR LD A,(FONT.STYLE) BIT 2,A CALL NZ,BOLD LD A,(FONT.STYLE) BIT 3,A CALL NZ,ITALIC LD A,(FONT.STYLE) BIT 4,A CALL NZ,OUTLINE ; CALL COPY.TO.FONT.BF ; LD A,(FONT.STYLE) BIT 5,A CALL NZ,BIT.REVERSE LD A,(FONT.STYLE) BIT 6,A CALL NZ,STRIKE LD A,(FONT.STYLE) BIT 7,A CALL NZ,UNDER.LINE LD A,(FONT.STYLE+1) BIT 0,A CALL NZ,UPPER.LINE LD A,(FONT.STYLE+1) BIT 1,A CALL NZ,BG.PATTERN LD A,(FONT.STYLE+1) BIT 2,A CALL NZ,SHADOW LD A,(FONT.STYLE+1) BIT 3,A CALL NZ,FONT.PATTERN ; CALL GOSEI.FONT LD A,(FONT.STYLE) BIT 0,A CALL NZ,REVERSE.UD LD A,(FONT.STYLE) BIT 1,A CALL NZ,REVERSE.LR ; CALL READ.PUT.LS.PEN PUSH HL LD HL,PRINT.LSX CALL SET.PUT.LS.PEN LD HL,(XY) LD DE,FONT.BF LD BC,(FONT.LY) EXX LD HL,(?FONT.LY) EXX CALL PUT.LS POP HL CALL SET.PUT.LS.PEN ; LD HL,(STORE.FONT.LY) LD (FONT.LY),HL LD HL,(STORE.?FONT.LY) LD (?FONT.LY),HL RET STORE.FONT.LY DS 2 STORE.?FONT.LY DS 2 ; ; PUT.LS.PEN ; PRINT.LSX LD A,(DE) INC A RET Z LD A,(FONT.STYLE+1) BIT 4,A JR Z,PLSX SET 7,L BIT 3,(HL) RES 7,L RET NZ PLSX PUSH BC PUSH DE PUSH HL CALL GET.XY LD BC,HL RES 7,H CALL CHECK.VIEW2 POP HL POP DE POP BC RET C SET 7,L LD A,(DE) LD (HL),A RES 7,L LD A,(FONT.CHR) LD (HL),A RET ; ; VIEW AREA CHECK! ; CHECK.VIEW LD BC,(XY) CHECK.VIEW2 LD HL,(VIEW.TBL) LD DE,(VIEW.TBL+2) JP CHECK.AREA ; ; ; BIT MAP FONT EFFECT SUB ; ; ; ; UP <-> DOWN ; REVERSE.UD LD HL,(FONT.LY) LD E,L DEC E CALL MULTI8 LD DE,FONT.BF ADD HL,DE LD BC,(FONT.LY) SRA C RET Z RUD1 PUSH BC RUD2 LD A,(DE) LD C,(HL) LD (HL),A LD A,C LD (DE),A INC DE INC HL DJNZ RUD2 LD BC,(FONT.LX) LD B,0 OR A SBC HL,BC SBC HL,BC POP BC DEC C JR NZ,RUD1 RET ; ; LEFT <-> RIGHT ; REVERSE.LR LD BC,(FONT.LX) LD B,0 DEC C RET Z LD DE,FONT.BF LD HL,DE ADD HL,BC LD BC,(FONT.LY) SRA B RET Z RLR1 PUSH BC PUSH DE PUSH HL RLR2 LD A,(DE) LD C,(HL) LD (HL),A LD A,C LD (DE),A INC DE DEC HL DJNZ RLR2 POP HL POP DE LD BC,(FONT.LX) LD B,0 ADD HL,BC EX DE,HL ADD HL,BC EX DE,HL POP BC DEC C JR NZ,RLR1 RET ; ; BOLD ; BOLD LD HL,BIT.MAP.BF LD C,16 BL0 LD B,4 XOR A BL1 LD A,(HL) RR (HL) PUSH AF OR (HL) LD (HL),A POP AF INC HL DJNZ BL1 DEC C JR NZ,BL0 ; LD HL,FONT.LX INC (HL) LD HL,?FONT.LX INC (HL) RET ; ; ITALIC ; ITALIC LD A,(FONT.LY) ;FONT HEIGHT LD C,A ADD A,A ADD A,A ;*4 LD E,A LD D,0 LD HL,BIT.MAP.BF ADD HL,DE DEC HL ITA1 BIT 0,C JR Z,ITAX PUSH HL LD B,C ITAQ DEC HL DEC HL DEC HL SRL (HL) INC HL RR (HL) INC HL RR (HL) INC HL RR (HL) DEC HL DEC HL DEC HL DEC HL DJNZ ITAQ POP HL ITAX DEC HL DEC HL DEC HL DEC HL DEC C JR NZ,ITA1 ; LD A,(FONT.LY) SRA A LD C,A LD HL,(FONT.LX) ADD A,L LD (FONT.LX),A LD A,(?FONT.LX) ADD A,C LD (?FONT.LX),A RET OUTLINE LD HL,WORK.BF LD DE,WORK.BF+1 LD BC,4*19-1 LD (HL),B LDIR LD HL,BIT.MAP.BF LD DE,WORK.BF LD BC,4*19 LDIR LD HL,WORK.BF LD B,4*19 XOR A OL0 LD A,(HL) RR (HL) PUSH AF OR (HL) LD (HL),A POP AF INC HL DJNZ OL0 ; LD HL,WORK.BF LD B,4*19 XOR A OL1 LD A,(HL) RR (HL) PUSH AF OR (HL) LD (HL),A POP AF INC HL DJNZ OL1 ; LD HL,4*19-1+WORK.BF LD DE,4*18-1+WORK.BF LD B,18*4 OL2 LD A,(DE) OR (HL) LD (HL),A DEC DE DEC HL DJNZ OL2 ; LD HL,4*19-1+WORK.BF LD DE,4*18-1+WORK.BF LD B,18*4 OL3 LD A,(DE) OR (HL) LD (HL),A DEC DE DEC HL DJNZ OL3 ; LD HL,BIT.MAP.BF LD B,4*19 XOR A OL4 RR (HL) INC HL DJNZ OL4 ; LD DE,BIT.MAP.BF LD HL,WORK.BF+4 LD B,19*4 OL5 LD A,(DE) CPL AND (HL) LD (HL),A INC DE INC HL DJNZ OL5 ; LD HL,WORK.BF LD DE,BIT.MAP.BF LD BC,4*19 LDIR ; LD HL,(FONT.LY) INC H INC H INC L INC L LD (FONT.LY),HL LD HL,(?FONT.LY) INC H INC H INC L INC L LD (?FONT.LY),HL RET ; ; BIT REVERSE ; BIT.REVERSE LD HL,FONT.BF LD BC,(FONT.LY) LD A,(COLOR) LD D,A LD A,B LD (BR1+1),A LD A,32 SUB B LD (BRC+1),A BR1 LD B,0 BR2 LD A,(HL) INC A LD A,D JR Z,BR3 LD A,-1 BR3 LD (HL),A INC HL DJNZ BR2 LD A,C BRC LD C,0 ADD HL,BC LD C,A DEC C JR NZ,BR1 RET ; ; STRIKE THROUGH ; STRIKE LD A,(FONT.LY) SRA A RET Z LD BC,(STRIKE.COLOR) JR UD0 ; ; UNDER LINE ; UNDER.LINE LD A,(FONT.LY) LD BC,(UNDER.COLOR) DEC A UD0 ADD A,A ADD A,A ADD A,A LD L,A LD H,0 ADD HL,HL ADD HL,HL LD DE,COLOR.BF ADD HL,DE JR UP ; ; UPPER LINE ; UPPER.LINE LD HL,COLOR.BF LD BC,(UPPER.COLOR) UP LD A,(FONT.LX) LD B,A UP1 LD (HL),C INC HL DJNZ UP1 RET ; ; BIT.MAP.BF -> FONT.BF ; COPY.TO.FONT.BF LD HL,BIT.MAP.BF LD DE,FONT.BF LD C,4*19 LD A,-1 EX AF,AF' LD A,(COLOR) EX AF,AF' CALL BIT.MAP.OBJ LD HL,COLOR.BF LD DE,COLOR.BF+1 LD BC,32*19 LD (HL),-1 LDIR RET ; ; FONT.BF+COLOR.BF->COLOR.BF ; GOSEI.FONT LD HL,FONT.BF LD DE,COLOR.BF LD BC,32*19 GFA LD A,(HL) CP -1 JR Z,GFX LD (DE),A GFX INC DE CPI JP PE,GFA CONPRESS LD HL,(FONT.LY) LD A,32 SUB H LD (CPC+1),A LD C,L LD A,H LD (CPB+1),A LD HL,COLOR.BF LD DE,FONT.BF CPB LD B,0 CP1 LD A,(HL) LD (DE),A INC DE INC HL DJNZ CP1 LD A,C CPC LD C,0 ADD HL,BC LD C,A DEC C JR NZ,CPB RET ; ; BG PATTERN -> COLOR.BF ; BG.PATTERN LD HL,(FONT.LY) LD A,(BG.PAT.LX) SUB H ;BG.LX-LX LD (BGL+1),A LD HL,(BG.PAT.ADRS) LD DE,COLOR.BF LD A,(FONT.LX) LD (BGB+1),A LD C,A LD A,32 SUB C LD (BGC+1),A LD A,(FONT.LY) BGB LD BC,0 LDIR BGL LD C,0 ADD HL,BC EX DE,HL BGC LD BC,0 ADD HL,BC EX DE,HL DEC A JR NZ,BGB RET ; ; FONT PATTERN ; FONT.PATTERN LD HL,(FONT.LY) LD A,32 SUB H LD (FPB+1),A LD A,(FONT.PAT.LX) SUB H LD (FPL+1),A LD A,H LD (FPA+1),A LD C,L LD DE,(FONT.PAT.ADRS) LD HL,FONT.BF FPA LD B,0 FPBL LD A,(HL) INC A JR Z,FPX LD A,(DE) LD (HL),A FPX INC DE INC HL DJNZ FPBL LD A,C FPB LD C,0 ADD HL,BC EX DE,HL FPL LD C,0 ADD HL,BC EX DE,HL LD C,A DEC C JR NZ,FPA RET ; ; FONT INIT ; INIT.FONT LD HL,BIT.MAP.BF LD DE,BIT.MAP.BF+1 LD BC,4*19-1 LD (HL),B LDIR LD HL,FONT.BF LD DE,FONT.BF+1 LD BC,32*19-1 LD (HL),-1 LDIR RET ; ; FONT MEM -> BIT.MAP.BF ; FONT.OBJ LD A,(FONT.LX) LD BC,$202 CP 9 JR NC,FO1 INC C DEC B FO1 LD A,C LD (FOC+1),A LD A,B LD (FOB+1),A LD L,(IX) LD H,0 ADD HL,HL LD DE,(FONT.TBL) ADD HL,DE LD E,(HL) INC HL LD D,(HL) LD HL,BIT.MAP.BF LD BC,(FONT.LY) FOB LD B,0 FO2 LD A,(DE) LD (HL),A INC DE INC HL DJNZ FO2 LD A,C FOC LD C,0 ADD HL,BC LD C,A DEC C JR NZ,FOB RET ; ; SHADOW! ; SHADOW LD HL,FONT.BF LD DE,COLOR.BF+32+1 LD BC,18*32-1 SHA LD A,(HL) INC A JR Z,SHX LD A,(SHADOW.COLOR) LD (DE),A SHX INC DE CPI JP PE,SHA ; LD HL,(FONT.LY) INC L INC H LD (FONT.LY),HL LD HL,(?FONT.LY) INC L INC H LD (?FONT.LY),HL RET ; ; ; SET FONT RECORD ; ; SET.FONT.RECORD OR A JR NZ,SET.FONT.RECORD2 XFONT LD DE,FONT.RECORD LD BC,FONT.TBL.END-FONT.RECORD LDIR ; LD A,(VRAM.SW) CALL SET.VRAM.SW LD HL,(SCRL.JP) LD (SCRL.X+1),HL LD A,(MZ.ASC) OR A RET Z LD HL,(CONTROL.ADRS) LD (CTRL.JP+1),HL LD HL,(CONTROL?.ADRS) LD (PRINT.ONE.CHR+1),HL RET ; ; CHR FONT REC.SET ; ; HL = FONT.RECORD ; SET.FONT.RECORD2 LD DE,!FONT+1 LD BC,11 LDIR LD A,(HL) LD (!COLOR),A INC HL LD A,(HL) LD (!EF),A LD HL,!FONT JR XFONT ; ; READ FONT RECORD ; READ.FONT.RECORD LD HL,FONT.RECORD LD BC,FONT.TBL.END-FONT.RECORD LDIR RET ; ; SET X,Y ; SET.XY LD (XY),HL RET ; ; READ.XY ; READ.XY LD HL,(XY) RET !FONT DB 0 !XY DB 0 DB 0:0 DB 0:0:24:39 DB 0:0:24:39 DB 0 DB 0 DB 0 DW CONTROL DW CONTROL? DW RETURN DW 0000 ;RESERVE DB 0 DW 0 DW $0A92 DW 0000 DB 0 DW 0 !COLOR DB $70 !EF DB 0 DB 1 DB 1 DB 1 DB 1 DB 0 DW 0 DB 0 DW 0 DB 0 DB 0 DB 0 DB 0 DB 0 DB 0 DB 0 DB 0 DB 1 DB 0 ; ; ; SYSTEM INSTALL ; ; INSTALL LD HL,INIT.TBL LD DE,3*116+KERNEL LD BC,INIT.TBL.END-INIT.TBL LDIR JP $AD INIT.TBL JP MESSAGE.LEFT JP MESSAGE.RIGHT JP MESSAGE.CENTER JP PRINT.ONE.CHR JP MESSAGE JP MESSAGE.LENGTH JP SET.FONT.RECORD JP READ.FONT.RECORD JP SET.XY JP READ.XY JP CR0A JP CR0D INIT.TBL.END </PRE> <HR> <CENTER>EVENT MANAGER</CENTER> <P> <PRE> ORG $9000 ; ; SYSTEM-7C ; (EVENT MANAGER) ; ROM.DA EQU $0BCE #ROM EQU $E0 #RAM EQU $E2 KC EQU $0C00 ;DISPLAY CODE -> ASC KERNEL EQU $1200 ADRS EQU KERNEL+$1E00 GET.KEY EQU 28*3+KERNEL VTDXY EQU 8*3+KERNEL ZAHYO EQU 50*3+KERNEL COLOR.ZAHYO EQU 51*3+KERNEL SET.VRAM.SW EQU 52*3+KERNEL GAME.KEY EQU 33*3+KERNEL SET.GAME.KEY EQU 31*3+KERNEL READ.GAME.KEY EQU 32*3+KERNEL READ.SWITCH EQU 54*3+KERNEL READ.STICK EQU 55*3+KERNEL SET.KEY.TABLE EQU 24*3+KERNEL SET.KEY.MASK EQU 26*3+KERNEL PRINT.SCORE EQU 18*3+KERNEL SCORE.PLUS EQU 19*3+KERNEL X.LIMIT EQU $4D ;$52 Y.LIMIT EQU $4D ;$61 OFFSET $A000-ADRS ORG ADRS ;$3000- ; ; TEXT EDIT ; ; HL = EDIT.RECORD ; TEXT.EDIT LD DE,EDIT.RECORD LD BC,EDIT.END-EDIT.RECORD LDIR LD HL,(#PRINT) LD (PRINT+1),HL LD HL,(EDIT.BF) LD DE,(TEXT.BF) LD BC,256 LDIR LD HL,(EDIT.REPEAT.TIME) LD (REPT.TIME),HL LD (TM.WORK),HL EDIT.LOOP LD DE,(TEXT.BF) LD HL,(XY) LD A,(ASC.CODE) PRINT CALL 0 LD A,$F8 LD ($E000),A LD A,($E001) AND $81 JP Z,INIT.EVENT ;UNDO&RET OUT (#ROM),A CALL KEY.REPEAT OUT (#RAM),A OR A JR Z,EDIT.LOOP LD (ASC.CODE),A LD HL,EDIT.LOOP PUSH HL CP " " JR Z,LEFT.KEY CP " " JR Z,RIGHT.KEY CP " " JR Z,UP.KEY CP " " JR Z,DOWN.KEY CP 13 JR Z,CR.KEY LD DE,(MAXL) ;E=X MAX L LD A,(XY+1) SUB E LD E,A LD D,0 LD HL,(TEXT.BF) ADD HL,DE LD A,(ASC.CODE) LD (HL),A ;JR RIGHT.KEY RIGHT.KEY LD A,(MAXR) LD C,A LD A,(XY+1) CP C RET Z INC A LD (XY+1),A RET ; LEFT.KEY LD A,(MAXL) LD C,A LD A,(XY+1) CP C RET Z DEC A LD (XY+1),A RET UP.KEY LD A,(MAXL) LD (XY+1),A RET DOWN.KEY LD A,(MAXR) LD (XY+1),A RET CR.KEY POP AF ; LD HL,(TEXT.BF) LD DE,(EDIT.BF) TGW LD A,(HL) LD (DE),A OR A JR Z,INIT.EVENT CP $1A JR Z,INIT.EVENT INC DE INC HL JR TGW EDIT.RECORD XY DB 0:0 MAXL DB 0 MAXR DB 39 EDIT.BF DW 0 #PRINT DW 0 EDIT.END ASC.CODE DS 1 ; ; SET EVENT RECORD ; ; HL = EVENT TABLE ADRS ; A = SET.RECORD ; A <> 0 --- TO INIT.EVENT ; SET.EVENT.RECORD OR A JR Z,INIT.EVENT LD DE,EVENT.RECORD LD BC,EVENT.END-EVENT.RECORD LDIR INIT.EVENT LD HL,(KEY.REPEAT.TIME) LD (REPT.TIME),HL LD (TM.WORK),HL RET ; ; READ EVENT RECORD ; ; DE = READ ADRS ; READ.EVENT.RECORD LD HL,EVENT.RECORD LD BC,EVENT.END-EVENT.RECORD LDIR RET EVENT.RECORD CSR.CHR1 DB $33 CSR.COLOR1 DB $26 CSR.CHR2 DB $33 CSR.COLOR2 DB $26 FLASH.TYPE DB 0 KEY.REPEAT.TIME DW 12 EDIT.REPEAT.TIME DW 16 TEXT.BF DW $D400 NORMAL.KEY.TBL DW KC SFT.KEY.TBL DW 64+KC KANA.KEY.TBL DW 64*2+KC SFT.KANA.KEY.TBL DW 64*3+KC GRAPHIC.KEY.TBL DW 64*4+KC SFT.GRAPH.TBL DW 64*5+KC EVENT.END KEY.MODE DB 0 ; ; 0 = ENGLISH ; 1 = KANA ; 2 = GRAPHIC ; ; ; KEY REPEAT ! ; ; EXIT: ; A = 0 --- NO KEY ; A <> 0 --- KEY IN & ASC CODE ; KEY.REPEAT CALL MODE.SET CALL GET.KEY JR NC,KRP1 LD HL,(REPT.TIME) LD (TM.WORK),HL XOR A JR KRPX KRP1 LD C,A LD A,(KEY.CODE) SUB C JR NZ,KRP3 LD HL,(TM.WORK) ;0-32767 BIT 7,H JR NZ,KRP2 DEC HL LD (TM.WORK),HL RET KRP3 LD HL,(REPT.TIME) LD (TM.WORK),HL KRP2 LD A,C KRPX LD (KEY.CODE),A RET ; ; KEY MODE SET ; MODE.SET CALL MODIFY RRCA LD BC,$0100 JR NC,MSR1 INC C MSR1 XOR A LD ($E000),A ;KEY PORT LD A,($E001) RLCA JR NC,MSR2 INC B RLCA JR NC,MSR2 RLCA RLCA LD B,0 JR NC,MSR2 LD A,(KEY.MODE) JR MSR3 MSR2 LD A,B LD (KEY.MODE),A MSR3 ADD A,A ADD A,C ;MODE+SHIFT*2 ; ; KEY TABLE SET ; ; A = 0 --- ENGLISH NORMAL ; A = 1 --- ENGLISH SHIFT ; A = 2 --- KANA KEY ; A = 3 --- SHIFT.KANA.KEY ; A = 4 --- GRAPHICS KEY ; SET.KEY.X EX AF,AF' LD HL,MASK.TBL CALL SET.KEY.MASK EX AF,AF' LD HL,NORMAL.KEY.TBL ADD A,A LD E,A LD D,0 ADD HL,DE LD E,(HL) INC HL LD D,(HL) EX DE,HL JP SET.KEY.TABLE MASK.TBL DB $27:$F8:-1:-1:-1 DB -1:-1:-1:0:0 ; ; GAME KEY REPEAT ! ; ; EXIT: ; A = 0 --- NO GAME KEY ; A <> 0 --- KEY IN CODE ; GAME.KEY.REPEAT CALL GAME.KEY AND $3C JR Z,GRP1 LD B,A LD A,(KEY.CODE) SUB B JR NZ,GRP3 LD HL,(TM.WORK) ;0-32767 BIT 7,H JR NZ,GRP2 DEC HL LD (TM.WORK),HL RET GRP3 LD HL,(REPT.TIME) LD (TM.WORK),HL GRP2 LD A,B GRP1 LD (KEY.CODE),A RET REPT.TIME DW 10 TM.WORK DS 2 KEY.CODE DS 1 ; ; BEEP ; BEEP PUSH HL LD HL,$E004 ;FREQ OUT LD (HL),L LD (HL),6 LD L,8 LD (HL),1 LD H,$34 BPL DEC HL LD A,H OR L JR NZ,BPL LD ($E008),A ;STOP SOUND POP HL RET ; ; GET N CLICK ; ; EXIT: ; ; A = 0 --- NOTHING ; 1 --- MOVE POINTER ONLY ; 2 --- DRAG ; 3 --- SINGLE CLICK ; C = BIT CONDITION ; BIT 0 --- B BUTTON ; BIT 2 --- LEFT ; BIT 3 --- RIGHT ; BIT 4 --- DOWN ; BIT 5 --- UP ; BIT 6 --- A BUTTON ; GET.POINTER CALL GAME.KEY AND $3C JR Z,GPA LD A,1 BIT 6,C RET Z INC A RET GPA XOR A LD (KEY.CODE),A BIT 6,C RET Z LD A,3 ;SINGLE RET ; ; SAVE CURSOR CHR&COLOR ; ; H = X ; L = Y ; SAVE.CSR LD (STORE.XY),HL CALL ZAHYO LD A,(HL) LD (STORE.CHR),A CALL COLOR.ZAHYO LD A,(HL) LD (STORE.COLOR),A RET ; ; LOAD CURSOR CHR&COLOR ; LOAD.CSR LD HL,(STORE.XY) CALL ZAHYO LD A,(STORE.CHR) LD (HL),A CALL COLOR.ZAHYO LD A,(STORE.COLOR) LD (HL),A RET STORE.XY DS 2 STORE.CHR DB $33 STORE.COLOR DB $26 ; ; FLASHING CURSOR ; C = 0 --- 0 VALUE1 _タ VALUE2 ; C = 1 --- 1 VALUE _タ SAVE.CHR ; FLASH.CSR LD A,(FLASH.TYPE) LD C,A LD HL,(STORE.XY) CALL ZAHYO PUSH HL CALL COLOR.ZAHYO POP DE LD A,($E002) ;BLNK COUNT AND $40 JR NZ,FCSRA LD A,(CSR.CHR1) LD (DE),A LD A,(CSR.COLOR1) LD (HL),A RET FCSRA LD A,C OR A JR NZ,FCSRB LD A,(CSR.CHR2) LD (DE),A LD A,(CSR.COLOR2) LD (HL),A RET FCSRB LD A,(STORE.CHR) LD (DE),A LD A,(STORE.COLOR) LD (HL),A RET ; ; GET VALUE DECIMAL ; ; IX = ASCII CODE TEXT ADRS ; ; EXIT: ; CY = 1 --- ERROR ; CY = 0 --- HL = VALUE ; GET.VALUE10 LD HL,0 LD D,L LD A,(IX) CP "9"+1 JR NC,ERROR SUB "0" RET C G10 ADD HL,HL LD BC,HL ADD HL,HL ADD HL,HL ADD HL,BC LD E,A ADD HL,DE INC IX LD A,(IX) CP "9"+1 RET NC SUB "0" JR NC,G10 ERROR CCF RET ; ; GET VALUE HEXADECIMAL ; ; IX = ASCII TEXT VALUE ; ; EXIT: ; CY = 1 --- ERROR ; CY = 0 --- HL = VALUE ; GET.VALUE16 LD HL,0 LD D,L CALL GET.HEX RET C LD L,A RD16 INC IX CALL GET.HEX CCF RET NC ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL LD E,A ADD HL,DE JR RD16 GET.HEX LD A,(IX) CP "F"+1 CCF RET C CP "0" RET C CP "9"+1 JR NC,GETH SUB "0" RET GETH SUB "A" RET C ADD A,10 RET ; ; BIN TO ASC CONVERT ; ; IN: HL = $0000 - $FFFF ; DE = RETURN BF (8 BYTES) ; ; OUT: ; RETURN BF = ASC ; GETASC EXX LD HL,GABF LD DE,GABF+1 LD BC,7 LD (HL),B LDIR EXX LD (GAW+1),DE LD IX,GATBL LD B,16 GAA PUSH BC ADD HL,HL JR NC,GAX PUSH HL LD C,(IX+2) LD B,(IX+1) LD E,(IX+0) LD D,0 LD IY,DUMY LD HL,GABF CALL SCORE.PLUS POP HL GAX LD DE,3 ADD IX,DE POP BC DJNZ GAA LD HL,GABF LD DE,?GABF XOR A CALL PRINT.SCORE LD HL,?GABF LD B,8 GAB SET 4,(HL) INC HL DJNZ GAB LD HL,?GABF GAW LD DE,0 LD BC,8 LDIR RET GABF DS 4 ?GABF DS 4 DUMY DS 4 GATBL DB 3:$27:$68 DB 1:$63:$84 DB 0:$81:$92 DB 0:$40:$96 DB 0:$20:$48 DB 0:$10:$24 DB 0:5:$12 DB 0:2:$56 DB 0:1:$28 DB 0:0:$64 DB 0:0:$32 DB 0:0:$16 DB 0:0:8 DB 0:0:4 DB 0:0:2 DB 0:0:1 ; ; MODIFY KEY GET ; ; EXIT: ; A = BIT 7 (BREAK) ; 6 (CTRL) ; 0 (SHIFT) ; ; (1=ON,0=OFF) ; MODIFY LD A,$F8 LD ($E000),A LD A,($E001) CPL RET ; ; MEMORY MANAGER ; MEMORY.COPY LD DE,COPY.TBL LD BC,COPY.END-COPY.TBL LDIR LD HL,(COPY.BYTE) LD A,H OR L RET Z LD HL,(COPY.MOTO) LD DE,(MEM.TOP) OR A SBC HL,DE RET C LD DE,(COPY.MOTO) LD HL,(MEM.END) OR A SBC HL,DE RET C ;CY=1---ERR LD HL,(COPY.SAKI) LD DE,(MEM.TOP) OR A SBC HL,DE RET C LD DE,(COPY.SAKI) LD HL,(MEM.END) OR A SBC HL,DE RET C LD HL,(COPY.SAKI) LD DE,(COPY.BYTE) ADD HL,DE EX DE,HL LD HL,(MEM.END) OR A SBC HL,DE RET C ; LD HL,(COPY.MOTO) LD DE,(COPY.SAKI) LD BC,(COPY.BYTE) PUSH HL OR A SBC HL,DE POP HL RET Z JR C,MCB LDIR RET MCB DEC BC ADD HL,BC EX DE,HL ADD HL,BC EX DE,HL INC BC LDDR OR A RET COPY.TBL MEM.TOP DW 0 MEM.END DW 0 COPY.MOTO DW 0 COPY.SAKI DW 0 COPY.BYTE DW 0 COPY.END ; ; SWAP MEMORY ; MEMORY.SWAP LD A,(DE) EX AF,AF' LD A,(HL) LD (DE),A EX AF,AF' LD (HL),A INC DE CPI JP PE,MEMORY.SWAP RET ; ;%%%%%%%%%%%%%%%%%%%%%%%% ; ; INSTALLER ; ; NO = 148 TO 172 ; INSTALL LD HL,TABLE LD DE,132*3+KERNEL LD BC,TBL.END-TABLE LDIR LD A,$C3 LD HL,GET.VALUE10 LD (60*3+KERNEL),A LD (60*3+KERNEL+1),HL LD HL,GET.VALUE16 LD (61*3+KERNEL),A LD (61*3+KERNEL+1),HL LD HL,GETASC LD (49*3+KERNEL),A LD (49*3+KERNEL+1),HL JP $00AD TABLE JP GAME.KEY.REPEAT JP GET.POINTER JP KEY.REPEAT JP SET.EVENT.RECORD JP READ.EVENT.RECORD JP SAVE.CSR JP LOAD.CSR JP FLASH.CSR JP MODIFY JP SET.KEY.X JP TEXT.EDIT JP BEEP JP MEMORY.COPY JP MEMORY.SWAP TBL.END ; ; ; ; </PRE> <HR> <CENTER>WINDOW MANAGER</CENTER> <P> <PRE> ;; ; ; SUPER SYSTEM-7C ; (WINDOW MANAGER) ; KERNEL EQU $1200 ADRS EQU $3400 ITEM.LEN EQU 16 ;ITEM BF LEN ; ; OS KERNEL CALL ; TDXY EQU 7*3+KERNEL VTDXY EQU 8*3+KERNEL SET.PEN.STYLE EQU 74*3+KERNEL READ.PEN.STYLE EQU 75*3+KERNEL BOX.FILL EQU 95*3+KERNEL BOXFILL.PEN EQU 97*3+KERNEL CIRCLE.FILL EQU 104*3+KERNEL BOX.COLOR EQU 92*3+KERNEL LINE EQU 102*3+KERNEL CIRCLE EQU 103*3+KERNEL BOX.PEN EQU 96*3+KERNEL PEN EQU 109*3+KERNEL XYCOOD EQU 40*3+KERNEL CHECK.AREA EQU 36*3+KERNEL TRANS40XY.DUAL EQU 11*3+KERNEL GAME.KEY EQU 33*3+KERNEL MOVE.FIGHTER EQU 34*3+KERNEL MESSAGE.LEFT EQU 116*3+KERNEL MESSAGE.CENTER EQU 118*3+KERNEL MESSAGE.RIGHT EQU 117*3+KERNEL SET.FONT.RECORD EQU 122*3+KERNEL READ.FONT.RECORD EQU 123*3+KERNEL SET.XY EQU 124*3+KERNEL XYLEN EQU 41*3+KERNEL LOAD.CSR EQU 138*3+KERNEL SAVE.CSR EQU 137*3+KERNEL FLASH.CSR EQU 139*3+KERNEL GET.CLICK.STATUS EQU 133*3+KERNEL GAME.KEY.REPEAT EQU 132*3+KERNEL CHECK.700.1500 EQU 2*3+KERNEL TEXT.EDIT.LINE EQU 142*3+KERNEL SET.EVENT.RECORD EQU 135*3+KERNEL BEEP EQU 143*3+KERNEL MULTI8 EQU 56*3+KERNEL DIV16 EQU 59*3+KERNEL GET.KEY EQU 28*3+KERNEL MODIFY EQU 140*3+KERNEL WINDOW.LEN EQU 20 ITEM.Z.MAX EQU 63 OFFSET $B000-ADRS ORG ADRS ; ; BOX CLIPING ; ; H = X1,L=Y1 ; D = X2,E=Y2 ; ; EXIT: ; A = -1 : NO DISPLAY ; A <>-1 : DISPLAY ; X1<X2 Y1<Y2 ; VIEW.CLIP.ATB BCLIP.ATB PUSH IX LD IX,WVIEW.ATB JR BCL.ATB ; ; CLIPING OF CHR (ATB) ; VIEW.CLIP.CHR BCLIP PUSH IX LD IX,WVIEW BCL.ATB LD A,D CP H JR NC,NEA1 LD H,0 NEA1 LD A,E CP L JR NC,NEA2 LD L,0 NEA2 CALL XYCOOD ; LD A,E CP (IX) JP C,BCPX ;OVER LD A,L CP (IX) JP NC,NEA3 LD L,(IX) NEA3 ; LD A,D CP (IX+1) ;LEFT JP C,BCPX LD A,(IX+3) ;RIGHT CP H JP C,BCPX LD A,(IX+2) ;DOWN CP L JP C,BCPX BIT 7,L CALL NZ,BCPU BIT 7,E CALL NZ,BCPD LD A,H CP (IX+1) JP NC,BCP1 LD H,(IX+1) BCP1 LD A,(IX+3) ;RIGHT CP D JP NC,BCP2 LD D,A BCP2 LD A,(IX+2) CP E JP NC,BCP3 LD E,A BCP3 XOR A POP IX RET BCPX LD A,-1 POP IX RET BCPU LD L,0 ;L<0 RET BCPD LD E,(IX+2) RET ; ; CHECK XY IN WVIEW ; (CHR,ATB AREA) ; B = CHECK X ; C = CHECK Y ; ; EXIT: ; CY = 1 --- WVIEW OVER ; CY = 0 --- WVIEW IN ; CHECK.XY.CHR LD HL,(WVIEW) ;X1,Y1 LD DE,(WVIEW+2) ;X2,Y2 JP CHECK.AREA CHECK.XY.COLOR LD HL,(WVIEW.ATB) ;X1,Y1 LD DE,(WVIEW.ATB+2) ;X2,Y2 JP CHECK.AREA CHECK.XY.WIN PUSH BC CALL CHECK.XY.CHR POP BC RET C CALL WSET LD HL,(#WY1) LD DE,(#WY2) JP CHECK.AREA CHECK.XY.WIN.ATB PUSH BC CALL CHECK.XY.COLOR POP BC RET C CALL WSET LD HL,(#WY1) LD DE,(#WY2) SET 7,H SET 7,D JP CHECK.AREA ; ; WINDOW CLIP ; WCLIP CALL WSET PUSH HL LD HL,(#WY1) LD (#CLP),HL LD HL,(#WY2) LD (#CLP+2),HL POP HL PUSH IX LD IX,#CLP JP BCL.ATB WCLIP.ATB CALL WSET PUSH HL LD HL,(#WY1) SET 7,H LD (#CLP),HL LD HL,(#WY2) SET 7,H LD (#CLP+2),HL POP HL PUSH IX LD IX,#CLP JP BCL.ATB ; ; ITEM CLIP ; ICLIP.ATB CALL BCLIP.ATB CP -1 RET Z JP WCLIP.ATB ICLIP CALL BCLIP CP -1 RET Z JP WCLIP #CLP DS 4 ; ; PRINT WINDOW ; ; PARAMETER = WINDOW BF ; IX = MENU,WINDOW BUFFER ; PRINT.WINDOW CALL WSET BIT 1,(IX+3) JR NZ,PW1 LD HL,(#WY1) LD DE,(#WY2) CALL BCLIP INC A JR Z,PW1 PUSH DE PUSH HL LD A,(W.RECT) CALL BOX.FILL POP HL POP DE SET 7,H SET 7,D LD A,(W.COLOR) CALL BOX.FILL PW1 BIT 2,(IX+3) JR NZ,PW2 LD HL,(#WY1) LD DE,(#WY2) INC D INC L LD H,D CALL BCLIP INC A JR Z,PW2 PUSH DE PUSH HL LD A,(W.RIGHT) CALL BOX.FILL POP HL POP DE SET 7,H SET 7,D LD A,(W.SHADOW) CALL BOX.COLOR PW2 BIT 3,(IX+3) JR NZ,PW3 LD HL,(#WY1) LD DE,(#WY2) INC H INC E LD L,E CALL BCLIP INC A JR Z,PW3 PUSH DE PUSH HL LD A,(W.DOWN) CALL BOX.FILL POP HL POP DE SET 7,H SET 7,D LD A,(W.SHADOW) CALL BOX.COLOR PW3 BIT 0,(IX+3) RET NZ LD HL,(#WY1) LD DE,(#WY2) LD E,L CALL BCLIP INC A RET Z SET 7,D SET 7,H LD A,(W.DIS.COLOR) INC (IX) DEC (IX) JP Z,BOX.FILL LD A,(W.EN.COLOR) JP BOX.FILL ; ; WINDOW XY GET ; WSET EXX LD HL,(SCRNXY) LD A,(IX+4) ADD A,L LD (#WY1),A LD A,(IX+5) ADD A,H LD (#WX1),A LD A,(IX+6) ADD A,L LD (#WY2),A LD A,(IX+7) ADD A,H LD (#WX2),A EXX RET WSET2 ; HL=XY PUSH DE LD DE,(SCRNXY) LD A,H SUB D LD H,A LD A,L SUB E LD L,A POP DE RET WSET3 CALL WSET PUSH IY LD IY,#WY1 LD A,H SUB (IY+1) LD H,A LD A,L SUB (IY+0) LD L,A LD A,D SUB (IY+1) LD D,A LD A,E SUB (IY+0) LD E,A POP IY RET #WY1 DB 0 #WX1 DB 0 #WY2 DB 0 #WX2 DB 0 ; ; SERCH GROUP OF ITEM BF ; ; ; IY = ITEM BF ; D = ID ; E = GROUP ; ; EXIT: ; ; CY = 1 --- NO DATA ; CY = 0 --- IY=BUFFER ; SERCH.GP&ID.ITEM LD BC,16 SI1 LD A,(IY) INC A SCF RET Z LD L,(IY+8) LD H,(IY+9) SUB HL,DE RET Z ADD IY,BC JR SI1 ; ; PRINT WINDOW BUFFER ; PRINT.WINDOW.BF LD IX,(WINDOW.BF) LD A,32 LD (?WPRTY+1),A ?WIND PUSH IX ?WINDA LD A,(IX) OR A JP M,?WINDX ?WPRTY LD A,0 CP (IX+12) CALL Z,PRINT.WINDOW.ONE ?WINDP LD BC,WINDOW.LEN ADD IX,BC JR ?WINDA ?WINDX POP IX LD HL,?WPRTY+1 DEC (HL) JR NZ,?WIND RET ; ; PRINT WINDOW ONE ; ; IX = WINDOW BF ; PRINT.WINDOW.ONE CALL PRINT.WINDOW CALL SERCH.TYPE RET C CALL ?ITEM LD L,(IX+14) LD H,(IX+15) JP JPHL ; ; SERCH ITEM TYPE ; ; IX = WINDOW,MENU BF ; ; EXIT: ; IY = ITEM BUFFER ; CY = 1 --- NOTHING ; CY = 0 --- IY = ITEM BF ; SERCH.TYPE LD C,(IX+13) INC C LD DE,16 ;LD B,1 LD HL,(ITEM.BF) DEC HL SRH1 INC HL LD A,(HL) INC A ;ADD A,B RET Z CP C INC HL JP Z,SRHX SRH3 LD A,(HL) INC A JP Z,SRH1 ADD HL,DE JP SRH3 SRHX PUSH HL POP IY RET ; ; ; PRINT ITEM BUFFER ; ; IX = WINDOW,MENU BUFFER ; IY = ITEM BUFFER ; ; ?ITEM LD A,ITEM.Z.MAX ;63 LD (IPRTY),A ?ITAA PUSH IY ?ITEM2 LD A,(IY) OR A JP M,?ITEMX JR Z,?ITX LD A,(IPRTY) ;Z CP (IY+15) ;ITEM.Z JR NZ,?ITX LD A,(IY) DEC A CALL NZ,?SELECT LD A,(IY+9) OR A JP M,SYS.ITEM SYS.REQ CALL SERCH.HEADER JR C,?ITX PUSH DE LD L,(IY+2) LD H,(IY+3) LD E,(IY+4) LD D,(IY+5) CALL XYLEN POP DE LD A,(IY+1) OR A JP NZ,?ITEM.TEXT PUSH DE CALL PLUS.WXY POP DE CALL PUT.CLIP ?ITX LD BC,ITEM.LEN ADD IY,BC JP ?ITEM2 ?ITEMX POP IY LD HL,IPRTY DEC (HL) JP P,?ITAA RET SYS.ITEM CPL ADD A,A LD E,A LD D,0 LD HL,SYS.TBL ADD HL,DE LD E,(HL) INC HL LD D,(HL) EX DE,HL LD DE,?ITX PUSH DE JP (HL) SYS.TBL DW ?TITLE:?CLOSE:?SIZE:?DIALOG DW ?SIDE:?CHR.LIST:?COLOR.LIST DW ?TR:?TR:?TR DW ?CBOX:RETURN:?BOXF:RETURN DW CHR.SCRN:ATB.SCRN:?BOXC ?TITLE LD A,(IX+7) SUB (IX+5) LD (IY+5),A LD (IY+4),0 LD (IY+2),0 LD A,(IY+6) OR (IY+7) RET Z ?TR POP AF JP SYS.REQ CHR.SCRN CALL PLUS.WXY LD A,(SCRNXY+1) LD (#FSA+1),A LD A,H LD (#FSH+1),A CALL ICLIP INC A RET Z JP ?OFFSCRN ATB.SCRN CALL PLUS.WXY LD A,(SCRNXY+1) OR $80 LD (#FSA+1),A LD A,H OR $80 LD (#FSH+1),A CALL ICLIP INC A RET Z SET 7,H SET 7,D ; ?OFFSCRN LD C,(IY+13) LD B,(IY+14) EX DE,HL SUB HL,DE INC H INC L LD A,H CP B JR NC,?FS1 LD B,A ?FS1 LD A,L CP C JR NC,?FS2 LD C,A ?FS2 PUSH BC PUSH DE LD H,(IY+11) LD E,(IY+1) CALL MULTI8 LD E,(IY+12) #FSH LD A,0 #FSA SUB 0 ;SCRNX JP NC,?FSY NEG LD E,A ?FSY LD D,0 ADD HL,DE LD E,(IY+6) LD D,(IY+7) ADD HL,DE POP DE POP BC LD A,(IY+1) SUB B LD (?FSL+1),A EX DE,HL CALL TDXY EX DE,HL LD A,E LD (?FSE+1),A LD A,B LD (?FSC+1),A LD A,C LD B,0 ; ?FSC LD C,0 LDIR ?FSL LD C,0 ADD HL,BC ?FSE LD E,0 INC D DEC A JP NZ,?FSC RET ?BOXC CALL READ.PEN.STYLE PUSH HL LD HL,PEN.CPL CALL SET.PEN.STYLE CALL PLUS.WXY SET 7,H SET 7,D CALL BOX.CPL POP HL JP SET.PEN.STYLE ?BOXF CALL PLUS.WXY CALL ICLIP INC A RET Z LD A,(IY+11) RRCA JP NC,?BF1 PUSH DE PUSH HL LD A,(IY+12) CALL BOX.FILL POP HL POP DE ?BF1 LD A,(IY+11) BIT 1,A RET Z SET 7,H SET 7,D LD A,(IY+13) ;COLOR JP BOX.FILL ?DIALOG CALL WSET CALL ?TEXT.BOX LD DE,TXBF CALL READ.FONT.RECORD CALL PLUS.WXY LD ('XY),HL CALL ICLIP INC A JR Z,?DAG LD ('VIEW.TBL),HL LD ('VIEW.TBL+2),DE LD A,(#WX1) LD ('DEST.TBL+1),A LD A,(#WX2) LD ('DEST.TBL+3),A LD A,$71 ADD A,(IY+11) LD ('COLOR),A LD A,1 LD HL,DIAG.TXBF CALL SET.FONT.RECORD PUSH IX PUSH IY CALL STRSET LD IX,STR ;STRING BF CALL MESSAGE.LEFT POP IY POP IX ?DAG XOR A LD HL,TXBF JP SET.FONT.RECORD DIAG.TXBF 'XY DS 3 'DEST.TBL DS 4 'VIEW.TBL DS 4 'COLOR DB $71 'EF DB 0 ITEM.TXBF …XY DS 3 …DEST.TBL DS 4 …VIEW.TBL DS 4 …COLOR DB 0 …EF DB 1 ?ITEM.TEXT CALL WSET PUSH DE LD DE,TXBF CALL READ.FONT.RECORD CALL PLUS.WXY LD (…DEST.TBL),HL LD (…DEST.TBL+2),DE LD (…XY),HL CALL ICLIP INC A JR Z,TXR LD (…VIEW.TBL),HL LD (…VIEW.TBL+2),DE CALL PLUS.WXY LD A,-1 LD (…DEST.TBL+2),A LD A,(IY) CP 2 JR NZ,?ITG LD A,(IX+11) LD (…COLOR),A ?ITG LD A,1 LD HL,ITEM.TXBF CALL SET.FONT.RECORD LD (REQ.IX),IX LD (REQ.IY),IY POP IX LD A,(IY+1) LD HL,MESSAGE.LEFT DEC A JR Z,?ITT LD HL,MESSAGE.CENTER DEC A JR Z,?ITT LD HL,MESSAGE.RIGHT ?ITT LD (?ITJ+1),HL ?ITJ CALL 0 LD IX,(REQ.IX) LD IY,(REQ.IY) XOR A LD HL,TXBF CALL SET.FONT.RECORD XOR A LD (…COLOR),A PUSH AF TXR POP DE LD A,(IY+9) CP -8 JP Z,?RADIO CP -9 JP Z,?CHECK CP -10 JP Z,?CHECK JP ?ITX ?CLOSE ?CBOX CALL PLUS.WXY LD BC,HL CALL CHECK.AREA RET C CALL PLUS.WXY CALL TDXY LD A,(IY+9) CP -11 LD (HL),$9B JR NZ,?SX LD (HL),$2B ?SX SET 7,L LD A,(HL) AND $7F OR $70 LD (HL),A RET ?SIZE CALL WSET LD BC,(#WY2) CALL CHECK.XY.CHR RET C LD HL,(#WY2) CALL TDXY LD (HL),$4E SET 7,L LD (HL),$17 RET ?TEXT.BOX CALL PLUS.WXY LD E,L SET 7,H SET 7,D CALL ICLIP.ATB INC A LD A,$71 CALL NZ,BOX.FILL RET ?SIDE CALL PLUS.WXY LD E,L CALL ICLIP INC A LD A,$78 CALL NZ,BOX.FILL RET ?RADIO CALL PLUS.WXY LD A,(IY+11) ADD A,L LD C,A LD B,H PUSH BC CALL CHECK.XY.WIN POP HL JP C,?ITX CALL TDXY LD A,(RADIO.MARK) LD (HL),A JP ?ITX ?CHECK CALL PLUS.WXY LD E,(IY+11) LD D,(IY+12) LD B,16 ?CKA SRA D RR E JR NC,?CKP PUSH BC PUSH DE PUSH HL LD BC,HL PUSH BC CALL CHECK.XY.WIN POP HL JR C,?CKW CALL TDXY LD A,(CHECKMARK) LD (HL),A SET 7,L LD A,(CHECKCOLOR) LD (HL),A ?CKW POP HL POP DE POP BC ?CKP INC L DJNZ ?CKA JP ?ITX ?CHR.LIST ?COLOR.LIST CALL PLUS.WXY LD (XXY),HL EX DE,HL LD HL,CHRマSET LD A,(IY+9) CP -7 JR NZ,CHR0 LD HL,ATBマSET CHR0 LD (CHR.CALL+1),HL XOR A LD (CHR),A LD C,16 CHRA LD B,16 CHRB EXX LD BC,(XXY) CALL CHECK.XY.WIN CHR.CALL CALL NC,0 LD HL,XXY+1 INC (HL) LD HL,CHR INC (HL) EXX DJNZ CHRB LD HL,XXY INC (HL) LD A,D LD (XXY+1),A DEC C JP NZ,CHRA RET ATBマSET LD HL,(XXY) CALL TDXY LD (HL),$5A SET 7,L LD A,(CHR) LD (HL),A RET CHRマSET LD HL,(XXY) CALL TDXY LD A,(CHR) LD (HL),A SET 7,L LD (HL),$70 RET CHR DB 0 STRSET LD HL,STR LD DE,STR+1 LD BC,39 LD (HL),$20 LDIR ; LD L,(IY+6) LD H,(IY+7) LD DE,STR LD IX,STR LD A,(IY+1) DEC A JP M,STR.TXT JR Z,TO.DEC2 SUB 2 JP M,TO.DEC4 LD (IX),"$" INC IX JR Z,TO.HEX2 JR TO.HEX4 STR.TXT LD BC,40 LDIR RET ; ; TO.HEX4.ASC ; TO.HEX4 LD A,(HL) INC HL LD H,(HL) LD L,A JR BIN.HEX TO.HEX2 LD L,(HL) LD H,0 JR BIN.HEX ; ; TO.DEC2.ASC ; TO.DEC4 LD A,(HL) INC HL LD H,(HL) LD L,A JR BIN.ASC TO.DEC2 LD L,(HL) LD H,0 JR BIN.ASC ; ; HL = BIN ; IX = BF (5 BYTES) ; BIN.ASC LD DE,0 BNA LD BC,10 CALL DIV16 LD A,C OR "0" LD (IX),A LD A,H OR L RET Z CALL RSFT JR BNA ; ; HL = BIN ; IX = BF (5BYTES) ; BIN.HEX LD DE,0 BNB LD BC,16 CALL DIV16 LD A,C OR "0" CP "9"+1 JR C,BNC ADD A,7 BNC LD (IX),A LD A,H OR L RET Z CALL RSFT JR BNB RSFT LD A,(IX+3) LD (IX+4),A LD A,(IX+2) LD (IX+3),A LD A,(IX+1) LD (IX+2),A LD A,(IX) LD (IX+1),A RET ; ; PRINT SELECT ; ?SELECT CALL PLUS.WXY SET 7,H SET 7,D CALL ICLIP.ATB INC A RET Z LD A,(IX+11) JP BOX.FILL ; ; PLUS WXY+ITEM.XY ; PLUS.WXY CALL WSET LD L,(IY+2) LD H,(IY+3) LD E,(IY+4) LD D,(IY+5) LD A,(IY+10) DEC A JP M,W0 JR Z,W1 DEC A JR Z,W2 LD A,(#WY2) ;Y2 SUB L LD L,A LD A,(#WY2) SUB E LD E,A LD A,(#WX2) SUB H LD H,A LD A,(#WX2) SUB D LD D,A RET W0 LD A,(#WY1) ADD A,L LD L,A LD A,(#WX1) ADD A,H LD H,A LD A,(#WY1) ADD A,E LD E,A LD A,(#WX1) ADD A,D LD D,A RET W1 LD A,(#WY1) ADD A,L LD L,A LD A,(#WY1) ADD A,E LD E,A LD A,(#WX2) SUB D LD D,A LD A,(#WX2) SUB H LD H,A RET W2 LD A,(#WX1) ADD A,H LD H,A LD A,(#WX1) ADD A,D LD D,A LD A,(#WY2) ;Y2 SUB E LD E,A LD A,(#WY2) SUB L LD L,A RET ; ; SERCH GRAPHIC HEADER ; ; ; IY = ITEM BUFFER ; SERCH.HEADER LD E,(IY+6) LD D,(IY+7) SERCH.HEADER2 LD HL,(DATA.BF) SHFA LD A,(HL) LD C,A INC A SCF RET Z INC HL LD B,(HL) INC HL PUSH DE EX DE,HL SUB HL,BC EX DE,HL POP DE LD C,(HL) INC HL LD B,(HL) INC HL EX DE,HL RET Z EX DE,HL ADD HL,BC JR SHFA ; ; PUT CLIP CHR&ATB ; PUT.CLIP PUSH BC PUSH HL PTC1 PUSH BC PUSH HL PTC2 CALL ?CPX INC DE INC H DJNZ PTC2 POP HL POP BC INC L DEC C JR NZ,PTC1 POP HL POP BC SET 7,H PTC3 PUSH BC PUSH HL PTC4 CALL ?CPX2 INC DE INC H DJNZ PTC4 POP HL POP BC INC L DEC C JR NZ,PTC3 RET ; ; PUT CLIP SUB ; ?CPX PUSH HL PUSH BC PUSH DE PUSH HL LD BC,HL CALL CHECK.XY.WIN JR C,?CPXX POP HL CALL TDXY POP DE LD A,(DE) OR A JR Z,?CPXW LD (HL),A ?CPXW POP BC POP HL RET ?CPXX POP HL POP DE POP BC POP HL RET ?CPX2 PUSH HL PUSH BC PUSH DE PUSH HL LD BC,HL CALL CHECK.XY.WIN.ATB JR C,?CPXX POP HL CALL TDXY POP DE LD A,(DE) BIT 3,A JR NZ,?CPX2W BIT 7,A JR Z,?CPX2V RRD AND $7F ?CPX2V LD (HL),A ?CPX2W POP BC POP HL RET ; ; CHECK MOUSE POINT ; ; H = CHECK POINT X ; L = CHECK POINT Y ; ; EXIT: ; L = WINDOW GROUP ; H = WINDOW ID ; E = ITEM GROUP ; D = ITEM GROUP ; WHEN L = 0 IS NOTHING ; WHEN E = 0 IS NOTHING ITEM ; CHECK.CLICK.POINT LD (CXY),HL CALL CHECK.WINDOW LD A,L OR A RET Z LD (WORKHL),HL CALL SERCH.TYPE JR NC,CPA LD E,0 LD HL,(WORKHL) RET CPA CALL CHECK.ITEM EX DE,HL LD HL,(WORKHL) RET ; ; CHECK MOUSE POINT ; ; IX = WINDOW BF ; H = CHECK POINT X ; L = CHECK POINT Y ; ; EXIT: ; CY = 1 --- NOTHING ; CY = 0 THEN: ; L = WINDOW GROUP ; H = WINDOW ID ; E = ITEM GROUP ; D = ITEM GROUP ; WHEN L = 0 IS NOTHING ; WHEN E = 0 IS NOTHING ITEM ; CHECK.CLICK.POINT.BF LD HL,(USER.XY) LD E,(HL) INC HL LD D,(HL) LD (%XY),DE LD IX,(WINDOW.BF) LD A,1 CCP0 LD (CWPRTY+1),A CCP1 PUSH IX CCP2 LD A,(IX) INC A JR Z,CCPX CWPRTY LD A,0 CP (IX+12) JP NZ,CCPW LD HL,(%XY) CALL CHECK.CLICK.POINT INC L DEC L JP Z,CCPW POP AF OR A RET CCPW LD BC,WINDOW.LEN ADD IX,BC JP CCP2 CCPX POP IX LD A,(CWPRTY+1) INC A CP 33 JP C,CCP0 CALL #TRAP LD HL,0 SCF RET ACTIVE? LD A,(IX+12) DEC A RET Z ; ; WINDOW ACTIVE ; ; IX = ACTIVATE WINDOW.BF ; ACTIVE LD C,(IX+12) PUSH IX CALL PRIORITY POP IX LD (IX+12),1 LD (IX),1 RET ; ; WINDOW INACTIVE ; INACTIVE LD HL,(WINDOW.BF) LD DE,HL LD BC,12 ADD HL,BC LD BC,WINDOW.LEN INA LD A,(DE) OR A RET M DEC (HL) LD A,(HL) CP 1 JP NZ,INX LD (DE),A INX ADD HL,BC EX DE,HL ADD HL,BC EX DE,HL JP INA ; ; WINDOW PRTY (IN-ACTIVE) ; ; IX = WINDOW BF ; C = OLD PRIORITY ; PRIORITY PUSH DE PUSH IX LD IX,(WINDOW.BF) LD DE,WINDOW.LEN PRTYA LD A,(IX) INC A JR Z,PRTYX LD A,(IX+12) OR A JP Z,PRTYW CP C JP NC,PRTYW INC (IX+12) LD (IX),D PRTYW ADD IX,DE JP PRTYA PRTYX POP IX POP DE RET ; ; NEW WINDOW ; ; IX = NEW WINDOW BF ; NEW.WINDOW LD C,33 CALL PRIORITY AW.ACTIVE LD (IX+12),1 LD (IX),1 RET ; ; ID CODE JUMP ; ; IX = WINDOW BF ; E = GROUP (0=NOT JUMP) ; D = ID ; ID.JUMP LD A,(DUMY.MODE) OR A JR NZ,ID.DUMY SUPER.ID.JUMP INC E DEC E RET Z LD A,D OR A JR Z,IDA JP P,ID.JUMP2 NEG ADD A,A IDA LD E,A LD D,0 LD HL,SYSTBL ADD HL,DE LD E,(HL) INC HL LD D,(HL) EX DE,HL JP (HL) ID.JUMP2 CALL CHK.DXY LD (%ID),DE LD L,D LD H,0 ADD HL,HL LD E,(IX+16) LD D,(IX+17) ADD HL,DE LD E,(HL) INC HL LD D,(HL) LD A,D OR E RET Z EX DE,HL LD DE,(%ID) LD BC,(#DY) LD A,(#CHK) JP (HL) ID.DUMY DEC A JR NZ,DUMY.JP CALL CHK.DXY LD DE,(%ID) LD BC,(#DY) LD A,(#CHK) DUMY.JP JP 0 SYSTBL DW INRECT:TITLEBAR DW CLOSEBOX:SIZEBOX:TEXT.BOX DW RETURN:CHR.LIST DW COLOR.LIST DW RADIO DW CHECK.MARK:CHECK.MARK DW CHANGE.BOX:BOXF.TRANS DW BOXFILL:PAINT.VIEW DW RETURN:RETURN DW MOVE.BOX #TRAP LD HL,(ZERO.JP) JP JPHL BOXF.TRANS BOXFILL DS 3 JPHL67 LD L,(IY+6) LD H,(IY+7) JPHL LD A,H OR L RET Z JP (HL) PAINT.VIEW CALL CHK.DXY LD A,(IY+1) DEC A JP M,PVX LD (DRAG.VIEW+6),A LD HL,(USER.XY) LD E,(HL) INC HL LD D,(HL) LD (DRAG.VIEW),DE LD (DRAG.VIEW+2),DE LD (DRAG.VIEW+4),DE CALL STORE.LMT ; CALL PLUS.WXY CALL ICLIP LD (LIMIT.TBL),HL LD (LIMIT.TBL+2),DE LD HL,DRAG.VIEW CALL DRAG CALL REQ.LMT LD HL,(USER.XY) LD DE,(DRAG.VIEW) LD (HL),E INC HL LD (HL),D PVX LD DE,DRAG.VIEW LD A,(#CHK) LD BC,(#DY) LD L,(IY+6) LD H,(IY+7) JP (HL) DRAG.VIEW DB 0:0 DB 0:0:0:0 DB 0 DB 1 DB 0:0 DW RETURN MOVE.BOX CALL STORE.LMT CALL WSET LD HL,(#WY1) LD DE,(#WY2) CALL BCLIP LD (MMBOX),HL LD (MMBOX+2),DE LD HL,(USER.XY) LD E,(HL) INC HL LD D,(HL) LD (DRAG.MOVE),DE LD (XXY),DE CALL PLUS.WXY CALL ICLIP LD (DRAG.MOVE+2),HL LD (DRAG.MOVE+4),DE PUSH DE LD DE,(MMBOX) ;(#WY1) SUB HL,DE LD DE,(XXY) INC E EX DE,HL SUB HL,DE LD E,(IY+11) LD D,(IY+12) ADD HL,DE LD (LIMIT.TBL),HL POP DE LD HL,(MMBOX+2) ;(#WY2) LD A,(XXY+1) SUB D ADD A,H SUB (IY+14) LD (LIMIT.TBL+3),A LD A,(XXY) SUB E ADD A,L SUB (IY+13) LD (LIMIT.TBL+2),A ; LD HL,DRAG.MOVE CALL DRAG LD DE,(DRAG.MOVE) LD HL,(USER.XY) LD (HL),E INC HL LD (HL),D LD A,(DRAG.MOVE+8) ADD A,(IY+2) LD (IY+2),A LD A,(DRAG.MOVE+9) ADD A,(IY+3) LD (IY+3),A LD A,(DRAG.MOVE+8) ADD A,(IY+4) LD (IY+4),A LD A,(DRAG.MOVE+9) ADD A,(IY+5) LD (IY+5),A CALL REQ.LMT LD DE,DRAG.MOVE JP JPHL67 MMBOX DS 4 ; REQ.LMT LD HL,0 LD (LIMIT.TBL),HL REQQ LD HL,0 LD (LIMIT.TBL+2),HL RET STORE.LMT LD HL,(LIMIT.TBL) LD (REQ.LMT+1),HL LD HL,(LIMIT.TBL+2) LD (REQQ+1),HL RET DRAG.MOVE DS 6 DB 1:0 DS 2 DW RETURN CHK.DXY PUSH AF PUSH BC PUSH DE PUSH HL LD L,(IY+2) LD H,(IY+3) LD E,(IY+4) LD D,(IY+5) CALL XYLEN PUSH BC CALL GET.DX LD (#DY+1),A CALL GET.DY LD (#DY),A POP BC DEC C DEC B LD D,0 OR A JR NZ,CD1 INC D CD1 CP C JR NZ,CD2 SET 1,D CD2 LD A,(#DY+1) OR A JR NZ,CD3 SET 2,D CD3 CP B JR NZ,CD4 SET 3,D CD4 LD A,D LD (#CHK),A POP HL POP DE POP BC POP AF RET #DY DS 2 #CHK DS 1 ; ; 0=EXEC,1=DUMY DUMY.MODE DB 0 INRECT EQU ACTIVE? CLOSEBOX EQU INACTIVE TITLEBAR CALL WSET LD HL,(USER.XY) LD E,(HL) INC HL LD D,(HL) LD (DRAG.R),DE LD HL,(#WY1) LD (DRAG.R+2),HL LD HL,(#WY2) LD (DRAG.R+4),HL LD HL,DRAG.R CALL DRAG ; LD DE,(DRAG.R) LD HL,(USER.XY) LD (HL),E INC HL LD (HL),D LD HL,(DRAG.R+2) CALL WSET2 LD (IX+4),L LD (IX+5),H LD HL,(DRAG.R+4) CALL WSET2 LD (IX+6),L LD (IX+7),H RET DRAG.R DB 0:0 DB 0:0:0:0 DB 1 DB 0 DB 0:0 DW RETURN SIZEBOX CALL WSET LD HL,(USER.XY) LD E,(HL) INC HL LD D,(HL) LD (SIZE.R),DE LD HL,(#WY1) LD (SIZE.R+2),HL LD HL,(#WY2) LD (SIZE.R+4),HL LD HL,SIZE.R CALL DRAG ; LD HL,(SIZE.R+2) LD DE,(SIZE.R+4) CALL XYCOOD LD (SIZE.R+2),HL LD (SIZE.R+4),DE ; LD DE,(SIZE.R) LD HL,(USER.XY) LD (HL),E INC HL LD (HL),D LD HL,(SIZE.R+2) CALL WSET2 LD (IX+4),L LD (IX+5),H LD HL,(SIZE.R+4) CALL WSET2 LD (IX+6),L LD (IX+7),H RET CHECK LD HL,(DY1) LD DE,(DY2) CALL XYLEN LD A,B CP 3 JR NC,CK1 LD A,H ADD A,3 LD (DY2+1),A CK1 LD A,B CP 40 JR C,CK2 LD A,H ADD A,39 LD (DY2+1),A CK2 LD A,C CP 3 JR NC,CK3 LD A,L ADD A,3 LD (DY2),A CK3 LD A,C CP 25 JR C,CK4 LD A,L ADD A,24 LD (DY2),A CK4 LD HL,(DY2) RES 7,H LD (#XY),HL RET SIZE.R DB 0:0 DB 0:0:0:0 DB 1 DB 1 DB 0:0 DW CHECK TEXT.BOX LD A,(IY+11) OR A RET NZ TEXTS CALL GAME.KEY OR A JR NZ,TEXTS CALL WSET PUSH IX PUSH IY LD DE,TXBF CALL READ.FONT.RECORD CALL PLUS.WXY LD (QXY),HL LD (QVIEW.TBL),HL LD (QVIEW.TBL+2),DE LD A,(#WX1) LD (QDEST.TBL+1),A LD A,(#WX2) LD (QDEST.TBL+3),A LD A,1 LD HL,TXEDBF CALL SET.FONT.RECORD ; CALL PLUS.WXY LD (EDIT.R),HL ;XY LD L,H LD H,D LD (EDIT.R+2),HL ;LIMIT LD L,(IY+6) LD H,(IY+7) LD (EDIT.R+4),HL LD HL,EDIT.R CALL TEXT.EDIT.LINE ; XOR A LD HL,TXBF CALL SET.FONT.RECORD POP IY POP IX RET EDIT.R DB 0:0 DB 0:0 DW 0 DW XPRINT XPRINT PUSH IX LD (XXY),HL PUSH DE POP IX LD HL,(EDIT.R) CALL SET.XY CALL MESSAGE.LEFT LD BC,(XXY) CALL CHECK.XY.CHR JR C,XPRT LD HL,(XXY) CALL TDXY SET 7,L SET 1,(HL) XPRT CALL PRINT.SCREEN POP IX RET XXY DS 2 RADIO CALL GET.DY LD (IY+11),A LD L,(IY+12) LD H,(IY+13) JP JPHL GET.DY CALL PLUS.WXY LD DE,(USER.XY) LD A,(DE) SUB L RET GET.DX CALL PLUS.WXY LD DE,(USER.XY) INC DE LD A,(DE) SUB H RET CHECK.MARK CALL GET.DY PUSH IY POP HL LD DE,11 ADD HL,DE CP 8 JR C,CMKA INC HL AND 7 CMKA LD E,A LD BC,XOR.TBL EX DE,HL ADD HL,BC EX DE,HL LD A,(DE) XOR (HL) LD (HL),A LD A,(IY+9) CP -10 CALL Z,MARK2 ; LD L,(IY+13) LD H,(IY+14) JP JPHL XOR.TBL DB 1:2:4:8:16:32:64:128 MARK2 CALL GET.DY OR A JR Z,MK2 LD A,(IY+11) AND $FE LD (IY+11),A OR (IY+12) RET NZ MK2 LD (IY+11),1 LD (IY+12),0 RET CHR.LIST COLOR.LIST CALL GET.DY LD (IY+11),A ;VY CALL GET.DX LD (IY+12),A ;HX JP JPHL67 CHANGE.BOX LD L,(IY+11) LD H,(IY+12) LD E,(IX+4) LD D,(IX+5) LD (IY+11),E LD (IY+12),D LD (IX+4),L LD (IX+5),H LD L,(IY+13) LD H,(IY+14) LD E,(IX+6) LD D,(IX+7) LD (IY+13),E LD (IY+14),D LD (IX+6),L LD (IX+7),H RET ; ; ITEM FLASHING ; ; E = ITEM GP ; D = ITEM ID ; FLASH.ITEM LD A,(FLASH.KAISU) OR A RET Z ADD A,A INC A LD (COUNT),A PUSH DE CALL SERCH.TYPE POP DE RET C CALL SERCH.GP&ID.ITEM RET C PUSH IX FILP LD A,(IY) XOR 3 LD (IY),A PUSH IY CALL PRINT.WINDOW.ONE CALL PRINT.SCREEN CALL TIMER POP IY ; LD HL,COUNT DEC (HL) JP P,FILP FLPB CALL GET.CLICK.STATUS OR A JR NZ,FLPB POP IX RET TIMER LD BC,$700 TM DEC BC LD A,B OR C JR NZ,TM RET ; ; CHECK WINDOW ; ; IX = WINDOW BF ; ; EXIT: ; L = WINDOW GROUP ; H = WINDOW ID ; IX= WINDOW BF ADRS ; CHECK.WINDOW CALL WSET LD HL,(#WY1) LD DE,(#WY2) LD BC,(CXY) CALL CHECK.AREA LD HL,0 RET C LD L,(IX+1) LD H,(IX+2) RET ; ; CHECK ITEM BUFFER ; ; IY = ITEM BF ; ; EXIT: ; L = ITEM GROUP ; H = ITEM ID ; CHECK.ITEM XOR A CIAA LD (IPRTY),A PUSH IY CHECK.ITEM2 LD A,(IY) INC A JP Z,CIX DEC A JP Z,CIR LD A,(IPRTY) CP (IY+15) JP NZ,CIR CALL PLUS.WXY LD BC,(CXY) CALL CHECK.AREA JP NC,CIW CIR LD BC,16 ADD IY,BC JP CHECK.ITEM2 CIX POP IY LD A,(IPRTY) INC A CP ITEM.Z.MAX+1 JP C,CIAA LD HL,0 RET CIW LD L,(IY+8) LD H,(IY+9) POP AF RET IPRTY DS 1 REQ.IX DW 0 REQ.IY DW 0 TXBF DS 58 TXEDBF QXY DS 3 QDEST.TBL DS 4 QVIEW.TBL DS 4 QCOLOR DB $71 QEF DB 0 CXY DS 2 WORKHL DS 2 ; ; ; WINDOW MANAGER INIT. ; ; A = 0 --- NORMAL SET ; = 1 --- NOSET XY ; HL = RECORD ADRS ; ; SET.WINDOW.RECORD LD DE,W.RECORD LD BC,W.RECORD.END-W.RECORD LDIR LD HL,W.RECORD LD DE,W.STORE LD BC,W.RECORD.END-W.RECORD LDIR OR A JR NZ,SETW1 LD HL,(SCRNXY) LD DE,(LIMIT.TBL) ADD HL,DE EX DE,HL LD HL,(USER.XY) LD (HL),E INC HL LD (HL),D SETW1 LD HL,(SCRNXY) LD DE,(WY1) ADD HL,DE LD (WY1),HL LD HL,(SCRNXY) LD DE,(WY2) ADD HL,DE LD (WY2),HL LD HL,(SCRNXY) LD DE,(?XY) ADD HL,DE LD (?XY),HL LD HL,(VRAM) CALL VTDXY LD (VRAM.ADRS),HL LD HL,(WVIEW) SET 7,H LD (WVIEW.ATB),HL LD HL,(WVIEW+2) SET 7,H LD (WVIEW.ATB+2),HL XOR A CALL SET.EVENT.RECORD LD HL,(SCRNXY) RET ; ; READ WINDOW RECORD ; ; DE = STORE BUFFER ADDRESS ; ; EXIT: DE = RECORD VALUE ; READ.WINDOW.RECORD LD HL,W.STORE LD BC,W.RECORD.END-W.RECORD LDIR RET ; ; SET WINDOW RECORD EXTEND ; ; HL = RECORD.EXT ADRS ; SET.WINDOW.RECORD.EXT LD DE,W.RECORD.EXT LD BC,W.RECORD.EXT.END-W.RECORD.EXT LDIR RET ; ; READ WINDOW RECORD EXTEND ; ; DE = STORE BUFFER ADDRESS ; ; EXIT: DE = RECORD VALUE ; READ.WINDOW.RECORD.EXT LD HL,W.RECORD.EXT LD BC,W.RECORD.EXT.END-W.RECORD.EXT LDIR RET ; ; DRAG MAIN ; ; HL = DRAG RECORD ; ; RECORD: ; Y,X,Y1,X1,Y2,X2,TYPE,FLG, ; RET.Y,RET.X ; ; CAUTION!: Y2>=Y1 !!! ; ; DRAG PUSH IY LD IY,DRAG.RECORD PUSH HL LD DE,DRAG.RECORD LD BC,12 LDIR LD HL,(DR.CALL) LD (DRAG.CALL+1),HL LD HL,(DY1) SET 7,H LD (DY1),HL LD HL,(DY2) SET 7,H LD (DY2),HL CALL DRAG.SUB RES 7,H RES 7,D LD (DY1),HL LD (DY2),DE LD (RET.DXY),BC POP DE LD HL,DRAG.RECORD LD BC,10 LDIR POP IY RET ; ; DRAG SUBROUTINE ; ; H = X1 ; L = Y1 ; D = X2 ; E = Y2 ; ; EXIT: ; H = NEW X1 ; L = NEW Y1 ; D = NEW X2 ; E = NEW Y2 ; B = DX (NEW X2 - OLD X2) ; C = DY (NEW Y2 - OLD Y2) ; DRAG.SUB LD HL,(DY1) LD DE,(DY2) LD (MY1),HL LD (MY2),DE DRL0 DRAG.CALL CALL RETURN LD HL,(DY1) LD DE,(DY2) CALL CPL.OPERATION LD HL,(#XY) CALL SAVE.CSR LD C,0 CALL FLASH.CSR CALL PRINT.SCREEN CALL LOAD.CSR DRL1 CALL GAME.KEY BIT 0,A JR NZ,DRL1 BIT 6,A JP Z,DRAG.OFF AND $3C JR Z,DRL1 LD (A.STORE),A LD HL,(DY1) LD DE,(DY2) CALL CPL.OPERATION LD A,(A.STORE) LD HL,LIMIT.TBL LD DE,(#XY) CALL MOVE.FIGHTER LD HL,(#XY) LD (#XY),DE CALL GET.DXY LD DE,(DY2) LD HL,(DY1) CALL PLUS.DXY LD (DY2),DE LD A,(RESIZE) OR A JR NZ,DRL0 LD (DY1),HL JR DRL0 DRAG.OFF LD HL,(DY1) LD DE,(DY2) CALL CPL.OPERATION CALL PRINT.SCREEN LD HL,(MY2) LD DE,(DY2) CALL GET.DXY LD HL,(DY1) RETURN RET ; ; GET DXY ; ; H = X1 ; L = Y1 ; D = X2 ; E = Y2 ; ; EXIT: ; B = DX (X2-X1) ; C = DY (Y2-Y1) ; GET.DXY LD A,D SUB H LD B,A LD A,E SUB L LD C,A RET ; ; PLUS DXY ; ; H = X1 ; L = Y1 ; D = X2 ; E = Y2 ; B = DX ; C = DY ; ; EXIT: ; H = H + B ; L = L + C ; D = D + B ; E = E + C ; PLUS.DXY LD A,B ADD A,H LD H,A LD A,C ADD A,L LD L,A LD A,B ADD A,D LD D,A LD A,C ADD A,E LD E,A RET ; ; CPL OPERATION ; CPL.OPERATION EXX CALL READ.PEN.STYLE PUSH HL LD HL,PEN.CPL CALL SET.PEN.STYLE LD HL,(CPL.TYPE) LD H,0 ADD HL,HL LD DE,CPL.TBL ADD HL,DE LD E,(HL) INC HL LD D,(HL) LD (CPLJP+1),DE EXX CPLJP CALL 0 POP HL JP SET.PEN.STYLE CPL.TBL DW LINE:BOX.CPL DW CIRCLE:BOXFILL.PEN DW CIRCLE.FILL ; ; BOX.CPL ; ; H = X1 ; L = Y1 ; D = X2 ; E = Y2 ; BOX.CPL LD (BXY1),HL LD (BXY2),DE CALL BOX.PEN LD HL,(BXY1) CALL PEN LD HL,(BXY2) CALL PEN LD HL,(BXY1) LD A,(BXY2+1) LD H,A CALL PEN LD HL,(BXY1) LD A,(BXY2) LD L,A JP PEN ; ; PEN.CPL ; ; ; PEN.CPL PUSH BC PUSH DE PUSH HL PUSH HL LD BC,HL LD HL,(WXY1C) LD DE,(WXY2C) CALL CHECK.AREA POP HL JR C,PENX CALL TDXY LD A,(HL) CPL LD (HL),A PENX POP HL POP DE POP BC RET ; ; PRINT SCREEN (TRANS) ; ; PARAMETER NOTHING.. ; PRINT.SCREEN LD HL,(?XY) LD DE,(VRAM.ADRS) LD A,(?LY) LD B,A EXX LD B,A LD HL,(?XY) SET 7,H LD DE,(VRAM.ADRS) SET 3,D JP TRANS40XY.DUAL ; ; PRINT BG.. ; ; PARAMETER NOTHING.. ; PRINT.BG LD HL,(WY1) LD DE,(WY2) LD A,(BG.CHR) CALL BOX.FILL LD HL,(WY1C) LD DE,(WY2C) LD A,(BG.COLOR) JP BOX.FILL ; ; SUB FUNCTION CALL ; ; A = FUNCTION NO. ; FUNCTION PUSH DE PUSH HL ADD A,A LD E,A LD D,0 LD HL,FUNC.TBL ADD HL,DE LD E,(HL) INC HL LD D,(HL) LD (FJP+1),DE POP HL POP DE FJP JP 0 FUNC.TBL DW QUIT:EVENT.LOOP:ACTIVE DW INACTIVE:WAIT.ON.EVENT DW MOVE.CSR:WSET.FUNC DW PRIORITY:FLASH.ITEM:DRAG DW VIEW.CLIP.CHR:VIEW.CLIP.ATB DW $0000:NEW.WINDOW DW CLOSEBOX:AW.ACTIVE DW SET.DUMY:PLUS.WXY:PLUS.NXY DW WSET3:SERCH.TYPE DW SERCH.GP&ID.ITEM DW SERCH.HEADER DW BIN.ASC:BIN.HEX DW SERCH.HEADER2 DW GET.STACK:SET.QUIT ; ; SYSTEM DUMY MODE ; ; IN: C = CONDITION ; HL = DUMY EXEC ADRS ; SET.DUMY LD A,C LD (DUMY.MODE),A LD (DUMY.JP+1),HL RET ; ; QUIT ROUTINE ; QUIT LD A,(QFLG) OR A JR Z,QX LD HL,(QJP) JP (HL) QX LD HL,$D000 LD DE,$D001 LD BC,1000 LD (HL),L LDIR LD HL,$D800 LD DE,$D801 LD BC,1000 LD (HL),$71 LDIR CALL GET.STACK LD SP,HL CALL CHECK.700.1500 OR A JP NZ,$00AD JP $E804 QFLG DB 0 QJP DW QX SET.QUIT LD A,C ;CONDITION LD (QFLG),A LD (QJP),HL RET GET.STACK LD HL,$10F0 ;MZ STACK RET ; ; EVENT LOOP ; ; EXIT: ; CY = 1 --- THEN EXT.EVENT ; EVENT.LOOP CALL PRINT.BG CALL PRINT.WINDOW.BF ELOOP2 CALL WAIT.ON.EVENT RET C ;EXT.EVENT->RET&A=CODE CP -1 JR Z,EXA DEC A JR Z,EMOVE DEC A JR Z,DRAG.MX CALL CHECK.CLICK.POINT.BF JR C,EMOVE CALL ACTIVE EXA CALL ID.JUMP JR EVENT.LOOP EMOVE CALL MOVE.CSR JR ELOOP2 DRAG.MX CALL CHECK.CLICK.POINT.BF JR C,EMOVE CALL ACTIVE CALL ID.JUMP CALL MOVE.CSR JR EVENT.LOOP ; ; EVENT WAITING ; ; EXIT: ; A = CLICK STATUS ; WAIT.ON.EVENT LD HL,(USER.XY) LD E,(HL) INC HL LD D,(HL) EX DE,HL CALL SAVE.CSR LOOPA CALL EXTERNAL RET C ;A=CODE CALL FLASH.CSR CALL PRINT.SCREEN CALL LOAD.CSR CALL SHORT.CUT LD A,-1 RET NC CALL GET.CLICK.STATUS OR A JR Z,LOOPA RET EXTERNAL LD HL,(EXT.CALL) JP JPHL ; ; MOVE CSR XY ; MOVE.CSR CALL GAME.KEY.REPEAT OR A RET Z LD HL,(USER.XY) LD E,(HL) INC HL LD D,(HL) LD HL,LIMIT.TBL CALL MOVE.FIGHTER LD HL,(USER.XY) LD (HL),E INC HL LD (HL),D RET ; ; WXY+SCRN.XY FUNCTION ; ; IN:IX = WINDOW.BF ; ; EXIT:H=X1,L=Y1,D=X2,E=Y2 ; WSET.FUNC CALL WSET LD HL,(#WY1) LD DE,(#WY2) RET ; ; IX = WINDOW XY ; HL=X,Y + WXY ; PLUS.NXY PUSH HL CALL WSET.FUNC POP DE LD A,D ADD A,H LD H,A LD A,E ADD A,L LD D,A RET ; ; KEY BOARD SHORT CUT ; SHORT.CUT LD HL,(COMMAND.KEY) LD A,H OR L SCF RET Z CALL MODIFY BIT 6,A SCF RET Z OUT ($E0),A CALL GET.KEY OUT ($E2),A RET C LD C,A LD IX,(COMMAND.KEY) LD DE,4 SHCA LD A,(IX) OR A SCF RET Z CP C JR Z,SHCB ADD IX,DE JR SHCA SHCB LD C,(IX+1) LD E,(IX+2) LD D,(IX+3) PUSH DE CALL SERCH.WTYPE POP DE RET C PUSH DE CALL SERCH.TYPE POP DE RET C JP SERCH.GP&ID.ITEM SERCH.WTYPE LD IX,(WINDOW.BF) LD DE,20 SERW LD A,(IX) INC A SCF RET Z LD A,C CP (IX+13) RET Z ADD IX,DE JR SERW %XY DS 2 BXY1 DS 2 BXY2 DS 2 WVIEW.ATB WXY1C WY1C DB 0 WX1C DB 64+128 WXY2C WY2C DB 24 WX2C DB 39+64+128 W.RECORD ;WINDOW RECORD VERSION DB 0 USER.XY DW 0 WVIEW LIMIT.TBL WY1 DB 0 WX1 DB 64 WY2 DB 24 WX2 DB 39+64 WINDOW.BF DW 0 ITEM.BF DW 0 DATA.BF DW 0 ?XY DB 0:0 VRAM DB 0:0 ?LY DB 25 EXT.CALL DW 0 ZERO.JP DW 0 COMMAND.KEY DW 0 W.RECORD.END W.STORE DS 24 VRAM.ADRS DW 0 W.RECORD.EXT SCRNXY DB 0:44 BG.CHR DB $5A BG.COLOR DB $45 W.EN.COLOR DB $70 W.DIS.COLOR DB $15 W.RECT DB $00 W.RIGHT DB $37 W.DOWN DB $36 W.COLOR DB $07 W.SHADOW DB $90 FLASH.KAISU DB 2 CHECKMARK DB $AC CHECKCOLOR DB $71 RADIO.MARK DB $47 W.RECORD.EXT.END DRAG.RECORD #XY DS 2 DY1 DS 2 DY2 DS 2 CPL.TYPE DB 0 RESIZE DB 1 RET.DXY DS 2 DR.CALL DW RETURN MY1 DS 2 MY2 DS 2 A.STORE DS 1 ; COUNT DS 1 %ID DS 2 FLAG.ONF DS 1 STR DS 40 DB $1A ; ; ; SYSTEM INSTALL ; ; INSTALL LD HL,INST.TBL LD DE,148*3+KERNEL LD BC,TBL.END-INST.TBL LDIR JP $AD INST.TBL JP SET.WINDOW.RECORD JP READ.WINDOW.RECORD JP SET.WINDOW.RECORD.EXT JP READ.WINDOW.RECORD.EXT JP PRINT.WINDOW.ONE JP PRINT.WINDOW.BF JP PRINT.BG JP PRINT.SCREEN JP CHECK.XY.CHR JP CHECK.XY.WIN JP CHECK.CLICK.POINT.BF JP ID.JUMP JP FUNCTION JP $4600 JP $4800 JP BEEP TBL.END </PRE> <HR> <CENTER>SERVICE ROUTINE</CENTER> <P> <PRE> ; ; ; SYSTEM-7C ENTRY ; KERNEL EQU $1200 SET.EVENT.RECORD EQU 135*3+KERNEL SET.W.RECORD EQU 148*3+KERNEL READ.W.RECORD EQU 149*3+KERNEL PRINT.SCREEN EQU 155*3+KERNEL PRINT.WINDOW.ONE EQU 152*3+KERNEL CHECK.CLICK.POINT EQU 158*3+KERNEL ID.JUMP EQU 159*3+KERNEL FUNCTION EQU 160*3+KERNEL LOAD&SAVE.MODULE EQU 161*3+KERNEL MULTI16 EQU 58*3+KERNEL XYLEN EQU 41*3+KERNEL XYCOOD EQU 40*3+KERNEL ESC EQU $1B OFFSET $C000-$4800 ORG $4800 ; ; FILE SERVISE ROUTINE ; MAIN PUSH IX PUSH IY CALL FILE POP IY POP IX RET FILE PUSH DE PUSH HL ADD A,A LD E,A LD D,0 LD HL,JPTBL ADD HL,DE LD E,(HL) INC HL LD D,(HL) LD (JPX+1),DE POP HL POP DE JPX JP 0000 ;REWRITE JPTBL DW LOAD&SAVE.MODULE DW FILE1:FILE2:FILE3 DW OK1:OK2:RETURN DW RETURN:RETURN DW RETURN ;9 DW RETURN ;10 DW RETURN:RETURN DW RETURN:RETURN DW RETURN ; DW MAIN.EF DW SET.DEF DW XTDXY DW GET.EF DW SET.EF2 DW MEM.TO.SCRN DW SCRN.TO.MEM DW OFFSCRN.PUT DW SERCH.AFTER.END DW SERCH.AFTER.CR DW SET.EFFECT MAIN.EF CALL SET.EF LD A,B LD (N),A CALL XYCOOD CALL XYLEN CALL XTDXY MEF1 PUSH BC PUSH HL MEF2 PUSH BC PUSH HL LD A,(N) EFCALL CALL 0 POP HL POP BC INC HL DJNZ MEF2 POP HL LD DE,(LX) ADD HL,DE POP BC DEC C JR NZ,MEF1 RET SET.DEF LD (LX),HL LD (ADDRESS),DE RET XTDXY PUSH BC PUSH DE PUSH HL LD H,0 LD DE,(LX) CALL MULTI16 LD HL,(ADDRESS) ADD HL,DE POP DE LD E,D LD D,0 ADD HL,DE POP DE POP BC RET ADDRESS DS 2 LX DS 2 N DS 1 SET.EF PUSH BC PUSH HL LD B,0 RLC C LD HL,SET.TBL ADD HL,BC LD C,(HL) INC HL LD B,(HL) LD (EFCALL+1),BC POP HL POP BC RET SET.EFFECT LD (EFCALL+1),HL RET SET.EF2 PUSH HL LD B,0 RLC C LD HL,SET.TBL ADD HL,BC LD C,(HL) INC HL LD B,(HL) POP HL RET SET.TBL DW EF1:EF2:EF3:EF4 DW EF5:EF6:EF7:EF8 DW EF9:EF10:EF11:EF12 DW EF13:EF14:EF15 GET.EF LD HL,(EFCALL+1) RET ; ; EFFECT ROUTINES ; ; ADD N EF4 ADD A,(HL) LD (HL),A RET ; SUB N EF5 SUB (HL) LD (HL),A RET ;COLOR PLUS EF12 LD A,(HL) AND $F0 CP $F0 JR Z,EF3A LD A,(HL) ADD A,$10 LD (HL),A EF3A LD A,(HL) AND $0F CP $0F RET Z INC (HL) RET ;COLOR MINUS EF13 LD A,(HL) AND $F0 JR Z,EF4A LD A,(HL) SUB $10 LD (HL),A EF4A LD A,(HL) AND $0F RET Z DEC (HL) RET ; RLC EF8 RLC (HL) RET ; RRC EF9 RRC (HL) RET ; 2 VALUE EF15 LD DE,0 LD A,(HL) AND $70 CP 4 JR C,EF7A LD D,7 EF7A LD A,(HL) AND 7 CP 4 JR C,EF7B LD E,7 EF7B LD A,D OR E LD (HL),A RET ; SRA EF10 SRA (HL) RET ; SLA EF11 SLA (HL) RET ; CPL EF6 LD A,(HL) CPL LD (HL),A RET ; NEGATIVE EF7 LD A,(HL) NEG LD (HL),A RET ; AND N EF1 AND (HL) LD (HL),A RET ; OR N EF2 OR (HL) LD (HL),A RET ; XOR N EF3 XOR (HL) LD (HL),A RET ; H_タL EF14 RLC (HL) RLC (HL) RLC (HL) RLC (HL) RET ; ; OFFSCRN PUT ROUTINE ; ; HL = XY ; DE = DATA ; BC = LXY ; HL'= OPERATION ADRS ; OFFSCRN.PUT EXX LD (FPC+1),HL EXX LPA PUSH BC PUSH HL FPA PUSH BC PUSH DE PUSH HL FPC CALL 0000 POP HL POP DE POP BC INC H INC DE DJNZ FPA POP HL POP BC INC L DEC C JR NZ,LPA RET ; ; HL = TEXT ; BC = COUNTER ; ; EXIT: ; CY = 0 --- ARI ; CY = 1 --- MOJI NASI ; SERCH.AFTER.END LD A,(HL) OR A SCF RET Z CP $1A SCF RET Z CP " "+1 RET NC CPI JP PE,SERCH.AFTER.END RET ; ; HL = TEXT ; BC = COUNTER ; ; EXIT: ; CY = 0 --- ARI ; CY = 1 --- MOJI NASI ; SERCH.AFTER.CR LD A,(HL) OR A SCF RET Z CP $1A SCF RET Z CP 13 SCF RET Z CP 10 SCF RET Z CP " "+1 RET NC CPI JP PE,SERCH.AFTER.CR RET ; ; MEM TO OFFSCRN MEM ; ; HL=OFFSCRN X,Y ; DE=MEMORY ADDRESS ; BC=TRANS LX,LY ; ; MEM.TO.SCRN PUSH BC PUSH HL LD HL,(LX) LD C,B LD B,0 SUB HL,BC LD A,L LD (MTSC+1),A POP HL POP BC CALL XTDXY EX DE,HL LD A,B LD (MTSB+1),A LD A,C LD B,0 MTSB LD C,0 LDIR EX DE,HL MTSC LD C,0 ADD HL,BC EX DE,HL DEC A JR NZ,MTSB RET ; ; OFFSCRN TO MEMORY ; HL=OFFSCRN X,Y ; DE=MEMORY ; BC=TRANS LX,LY ; SCRN.TO.MEM PUSH BC PUSH HL LD HL,(LX) LD C,B LD B,0 SUB HL,BC LD A,L LD (STMC+1),A POP HL POP BC CALL XTDXY LD A,B LD (STMB+1),A LD A,C LD B,0 STMB LD C,0 LDIR STMC LD C,0 ADD HL,BC DEC A JR NZ,STMB RET ; ; ALART WINDOW DISPLAY ; ; HL = TEXT DATA ADRS ; BC = TEXT DTA LENGHTH ; OK1 LD DE,@61 LDIR LD A,1 LD IX,WINDOW6.BF CALL W.SET LD HL,W.REC2 CALL SET.W.RECORD XOR A LD (FLAG),A ; LD IX,WINDOW6.BF CALL EVENT.LOOP CALL W.REQ XOR A RETURN RET ; ; YES/NO WINDOW DISPLAY ; ; HL = TEXT DATA ADRS ; BC = TEXT DTA LENGHTH ; OK2 LD DE,@61 LDIR LD A,1 LD IX,WINDOW7.BF CALL W.SET LD HL,W.REC2 CALL SET.W.RECORD XOR A LD (FLAG),A ; LD IX,WINDOW7.BF CALL EVENT.LOOP CALL W.REQ LD A,(FLAG) DEC A RET Z SCF RET ; ; INPUT FILENAME ; ; HL = FILE.RECORD ADDRESS ; FILE1 LD (MOTO),HL LD IX,WINDOW1.BF CALL W.SET LD A,1 LD HL,W.REC2 CALL SET.W.RECORD XOR A LD (FLAG),A ; LD IX,WINDOW1.BF FSW1 CALL EVENT.LOOP CALL W.REQ SCF RET NZ LD HL,FNAME LD DE,FILE.NAME LD BC,15 LDIR LD HL,FILE.RECORD LD DE,(MOTO) LD BC,FILE.END-FILE.RECORD LDIR XOR A RET MOTO DS 2 FLAG DB 1 BTN.OK LD A,1 LD (FLAG),A RET BTN.CANSEL LD A,2 LD (FLAG),A RET ;------------------ FILE2 LD (MOTO),HL LD IX,WINDOW4.BF CALL W.SET LD HL,W.REC2 CALL SET.W.RECORD LD IX,WINDOW2.BF CALL PRINT.WINDOW.ONE CALL PRINT.SCREEN LD HL,(MOTO) CALL LOAD&SAVE.MODULE CALL W.REQ RET NC LD HL,W.REC2 CALL SET.W.RECORD XOR A LD (FLAG),A LD IX,WINDOW4.BF CALL EVENT.LOOP CALL W.REQ SCF RET BTN.OK2 LD A,1 LD (FLAG),A RET FILE3 LD (MOTO),HL LD IX,WINDOW5.BF CALL W.SET LD HL,W.REC2 CALL SET.W.RECORD LD IX,WINDOW3.BF CALL PRINT.WINDOW.ONE CALL PRINT.SCREEN LD HL,(MOTO) CALL LOAD&SAVE.MODULE CALL W.REQ RET NC LD HL,W.REC2 CALL SET.W.RECORD XOR A LD (FLAG),A LD IX,WINDOW5.BF CALL EVENT.LOOP CALL W.REQ SCF RET EVENT.LOOP CALL PRINT.WINDOW.ONE CALL PRINT.SCREEN EVL1 LD A,4 CALL FUNCTION DEC A JR Z,MOVE# DEC A JR Z,MOVE# LD HL,(USER.XY) LD E,(HL) INC HL LD D,(HL) EX DE,HL CALL CHECK.CLICK.POINT JR C,EVL1 CALL ID.JUMP LD A,(FLAG) ;1=OK,2=CANSEL DEC A JP M,EVL1 RET MOVE# LD A,5 CALL FUNCTION JR EVL1 W.SET LD DE,FILE.RECORD LD BC,FILE.END-FILE.RECORD LDIR LD DE,W.REC.SAVE CALL READ.W.RECORD LD HL,W.REC.SAVE LD DE,W.REC2 LD BC,W.REC.SAVE.END-W.REC.SAVE LDIR LD HL,ITEM1.BF LD (ITEM%),HL LD HL,DATA.BF LD (DATA%),HL LD (WIND%),IX RET W.REQ EX AF,AF' LD A,1 LD HL,W.REC.SAVE CALL SET.W.RECORD EX AF,AF' RET W.REC.SAVE DB 0 DS 2 DS 4 DS 2 DW 0 DW 0 SCRN.XY DS 2 DS 2 DB 1 DW 0 DW 0 DW 0 W.REC.SAVE.END W.REC2 DB 0 USER.XY DS 2 DS 4 WIND% DW 0 ITEM% DW 0 DATA% DW 0 DS 2 DS 2 DS 1 DW 0 DW 0 DW 0 FILE.RECORD DB 0:5:0 DW 0 ;SIZE DW $C000 ;DUMMY TOP DW $00AD ;EXEC DW $C000 DM " " DM " " FILE.NAME DS 15 DB 13 DS 16 ;COMMENT FILE.END DS 8 WINDOW1.BF DB 1:1:1:0 DB 4:4:4+8:4+18 DB 0:0:0:0 DB 1:1 DW 0:CODE1 DS 2 DB -1 WINDOW2.BF DB 1:1:1:0 DB 4:4:4+6:4+23 DB 0:0:0:0 DB 1:2 DW 0:CODE1 DS 2 DB -1 WINDOW3.BF DB 1:1:1:0 DB 4:4:4+6:4+23 DB 0:0:0:0 DB 1:3 DW 0:CODE1 DS 2 DB -1 WINDOW4.BF DB 1:1:1:0 DB 4:4:4+6:4+23 DB 0:0:0:0 DB 1:4 DW 0:CODE4 DS 2 DB -1 WINDOW5.BF DB 1:1:1:0 DB 4:4:4+6:4+23 DB 0:0:0:0 DB 1:5 DW 0:CODE4 DS 2 DB -1 WINDOW6.BF DB 1:1:1:0 DB 5:12:5+8:12+16 DB 0:0:0:0 DB 1:6 DW 0:CODE6 DS 2 DB -1 WINDOW7.BF DB 1:1:1:0 DB 5:11:5+8:12+14 DB 0:0:0:0 DB 1:7 DW 0:CODE7 DS 2 DB -1 DB -1 CODE1 DW 0:RETURN:RETURN DW BTN.OK:BTN.CANSEL CODE4 DW 0:RETURN:BTN.OK2 CODE6 DW 0:BTN.OK:0:0 CODE7 DW 0:BTN.OK:BTN.CANSEL ITEM1.BF DB 1 ;MSG DB 1:1:2:1:2:16 DB 1:1 DB 1:1 DS 6 ;TEXT DB 1:0:4:2:4:16 DW FNAME DB 1:-4 DS 6 ;OK DB 1:1:7:1:7:8 DB 1:3 DB 1:3 DS 6 ;CANSEL DB 1:1:7:10:7:17 DB 1:4 DB 1:4 DS 6 DB -1 ;----- WINDOW 2 ----- DB 2 ;MSG DB 1:1:2:2:5:22 DB 2:1 DB 2:1 DS 6 DB -1 ;----- WINDOW 3 ----- DB 3 ;MSG DB 1:1:2:2:5:22 DB 3:1 DB 3:1 DS 6 DB -1 ;----- WINDOW 4 ----- DB 4 ;MSG DB 1:1:2:5:2:28 DB 4:1 DB 4:1 DS 6 ;BTN.OK DB 1:1:5:9:5:16 DB 1:3 DB 4:2 DS 6 DB -1 ;----- WINDOW 5 ----- ;MSG DB 5 DB 1:1:2:5:2:28 DB 5:1 DB 5:1 DS 6 ;BTN.OK DB 1:1:5:9:5:16 DB 1:3 DB 5:2 DS 6 DB -1 ;----- WINDOW 6 ----- ;MSG DB 6 DB 1:1:2:1:5:14 DB 6:1 DB 1:2 DS 6 ;BTN.OK DB 1:1:7:4:7:11 DB 1:3 DB 1:1 DS 6 DB -1 ;----- WINDOW 7 ----- ;MSG DB 7 DB 1:1:2:1:5:14 DB 6:1 DB 1:0 DS 6 ;BTN.YES DB 1:1:7:2:7:6 DB 7:1 DB 1:1 DS 6 ;BTN.NO DB 1:1:7:9:7:13 DB 7:2 DB 1:2 DS 6 DB -1 DB -1 :-1 FNAME DS 16 DATA.BF ;------ GP = 1 ------ DB 1:1 DW @11E-@11S @11S DM "ャケィ-ア コ」丐セ將 " DB 0 @11E DB 1:3 DW @12E-@12S @12S DB ESC:0:$70:ESC:1:0 DM " OK " DB 0 @12E DB 1:4 DW @13E-@13S @13S DB ESC:0:$70:ESC:1:0 DM " 洛ス椹 " DB 0 @13E ;---- GP 2 --------- DB 2:1 DW @21E-@21S @21S DM "ャケ 履ス」セ脹" DB 13:13 DM "悽、+ャセコ-」セ 洛ス椹 」セ留" DB 0 @21E ;---- GP 3 --------- DB 3:1 DW @31E-@31S @31S DM "ャケ ー埒」セ脹" DB 13:13 DM "悽、+ャセコ-」セ 洛ス椹 」セ留" DB 0 @31E ;---- GP 4 --------- DB 4:1 DW @41E-@41S @41S DM "ャケ 履イッ椰」セ悛 " DB 0 @41E ;---- GP 5 --------- DB 5:1 DW @51E-@51S @51S DM "ャケ ー坿ッ椰」セ悛 " DB 0 @51E ;---- GP 7 --------- DB 7:1 DW @71E-@71S @71S DB ESC:0:$70:ESC:1:0 DM " ェ " DB 0 @71E DB 7:2 DW @72E-@72S @72S DB ESC:0:$70:ESC:1:0 DM " 鋳 " DB 0 @72E ;---- GP 6 --------- DB 6:1 DW 4*14+16 @61 DS 4*14+14 DB -1 ; ; PROGRAMINSTALL ; INSTALL LD A,$C3 LD (3*162+KERNEL),A LD HL,MAIN LD (3*162+KERNEL+1),HL JP $00AD </PRE> <HR> <CENTER>LOAD & SAVE MODULE</CENTER> <P> <PRE> ; ; MZ-700 CASETTE ; LOAD & SAVE MODULE ; ; IN: HL = BF ADDRESS ; VERSION 1 BYTE ; LS FLAG 1 BYTE ; FORMAT 1 BYTE ; SIZE 2 BYTE ; TOP ADRS 2 BYTES ; EXEC ADRS 2 BYTES ; OFST ADRS 2 BYTES ; FNAME ADRS 16 BYTES ; COMMENT 16 BYTES ; ; LS FLAG: ; 0 = LOAD HEADER ; 1 = LOAD MAIN ; 2 = LOAD HEADER & MAIN ; 3 = SAVE HEADER ; 4 = SAVE MAIN ; 5 = SAVE HEADER & MAIN ; OFFSET $A000-$4600 ORG $4600 ; MAIN LD (MOTO+1),HL LD DE,LS.RECORD LD BC,LS.END-LS.RECORD LDIR ; LD A,(LS.FLAG) DEC A JP M,MW0 JR Z,MW1 DEC A JR Z,MW2 DEC A JP Z,SAVE.HEADER DEC A JR Z,MW4 ; CALL SAVE.HEADER MW4 JP SAVE.MAIN MW0 CALL LOAD.HEADER JR MWL MW2 CALL LOAD.HEADER MW1 CALL LOAD.MAIN MWL MOTO LD DE,0 LD HL,LS.RECORD LD BC,LS.END-LS.RECORD LDIR RET ; ; RECORD ; LS.RECORD VERSION DB 0 LS.FLAG DB 0 FORMAT DB 0 SIZE DW 0 TOP DW 0 EXEC DW 0 OFST DW 0 RES.TYPE DS 8 CREAT DS 8 FNAME DS 16 COMMENT DS 16 LS.END CKSUM EQU $071A 'OTOR EQU $069F WRT.INFO EQU $045E ;$0021 WRT.DATA EQU $0024 READ.INFO EQU $0027 READ.DATA EQU $002A ?RDI DI PUSH DE PUSH BC PUSH HL LD D,$D2 LD E,$CC LD BC,$80 LD HL,$10F0 RD1 CALL MOTOR' JP C,$0572 CALL $065B JP C,$0572 CALL $050E JP $0554 ?RDD DI PUSH DE PUSH BC PUSH HL LD D,$D2 LD E,$53 LD BC,($1102) LD HL,($1104) LD A,B OR C JP Z,$0554 JR RD1 LOAD.HEADER CALL ?RDI RET C LD HL,$10F1 LD DE,FNAME LD BC,16 LDIR LD HL,$1102 LD DE,SIZE LD C,6 LDIR LD HL,$1108 LD DE,RES.TYPE LD C,8*2 LDIR LD HL,$1118 LD DE,COMMENT LD C,16 LDIR RET LOAD.MAIN XOR A LD ($E008),A LD HL,(OFST) LD ($1104),HL JP ?RDD ; ; SAVE... ; SAVE.HEADER LD HL,SIZE LD DE,$1102 LD BC,6 LDIR LD HL,FNAME LD DE,$10F1 LD C,16 LDIR LD HL,RES.TYPE LD DE,$1108 LD C,8*2 LDIR LD HL,COMMENT LD DE,$1118 LD C,16 LDIR LD A,1 LD ($10F0),A DI PUSH DE PUSH BC PUSH HL LD D,$D7 LD E,$CC LD HL,$10F0 LD BC,$80 WRT.DATA' CALL CKSUM CALL MOTOR' JP NC,WRT.INFO POP HL POP BC POP DE RET SAVE.MAIN LD HL,(OFST) LD ($1104),HL DI PUSH DE PUSH BC PUSH HL LD BC,($1102) LD HL,($1104) LD D,$D7 LD E,$53 LD A,B OR C JP Z,$04D2 JP WRT.DATA' MOTOR' PUSH BC PUSH DE PUSH HL LD B,10 MOT1 LD A,($E002) AND $10 JR Z,MOT4 MOT2 LD B,$FF MOT2' CALL $09A6 ;DLY12 DJNZ MOT2' XOR A JP $069B ;RET3 MOT4 LD A,6 LD HL,$E003 LD (HL),A INC A LD (HL),A DJNZ MOT1 JP $06D8 ;MOT5 KERNEL EQU $1200 ; ; ; INSTALLER ; ; INSTALL LD A,$C3 LD HL,MAIN LD (161*3+KERNEL),A LD (161*3+KERNEL+1),HL JP $AD </PRE> <HR> <CENTER>PICTURE DRIVER</CENTER> <P> <PRE> ; ; ORG $A0000 ; ADRS EQU $2E00 OFFSET $A000-$2E00 ORG $2E00 KERNEL EQU $1200 ;/////// NO.0 ///////// SET.Z LD A,(IY+1) LD (DRAW+1),A RET ; ; SYSTEM-7C ONLY ; ; PICTURE DRIVER ; ; IY = DATA ADDRESS ; DRAW LD A,32 LD (WORKZ),A DRAW.LP1 PUSH IY DRAW.LP2 LD A,(IY) OR A JP M,DRAW.NEXT LD A,(WORKZ) CP (IY+1) ;Z COORDINATE JR NZ,DRAW.X LD HL,(GXY) LD A,(IY) CP 64 JP NC,111*3+KERNEL LD D,0 ADD A,A LD E,A LD HL,DRAW.TBL ADD HL,DE LD E,(HL) INC HL LD D,(HL) EX DE,HL LD DE,DRAW.X PUSH DE JP (HL) DRAW.X LD E,(IY) LD D,0 LD HL,DRAW.N.TBL ADD HL,DE LD E,(HL) INC HL LD D,(HL) ADD IY,DE JR DRAW.LP2 DRAW.NEXT POP IY LD HL,WORKZ DEC (HL) JP P,DRAW.LP1 RET DRAW.TBL DW SET.Z:SET.XY:SET.PEN:SET.PEN.LS DW NO.4:NO.5:NO.6:NO.7 DW NO.8:NO.9:NO.10:NO.11 DW NO.12:NO.13:NO.14:NO.15 DW NO.16:NO.17:NO.18:NO.19 DW NO.20:NO.21:NO.22:NO.23 DW NO.24:NO.25 DRAW.N.TBL DB 2:4:4:4 DB 8:8:8:8 DB 8:8:8:10 DB 6:7:7:7 DB 6:6:6:6 DB 6:6:6:6 DB 4:4 ; ; FUNCTIONS ; ;/////// NO.1 ///////// SET.XY LD L,(IY+2) LD H,(IY+3) LD (GXY),HL RET ;/////// NO.2 ///////// SET.PEN LD L,(IY+2) LD H,(IY+3) JP 74*3+KERNEL ;/////// NO.3 ///////// SET.PEN.LS LD L,(IY+2) LD H,(IY+3) JP 76*3+KERNEL ;////////////////////// ; ; NO.4 -> NO.11 ; ;////////////////////// NO.4 LD HL,83*3+KERNEL JR #PUT NO.5 LD HL,84*3+KERNEL JR #PUT NO.6 LD HL,85*3+KERNEL JR #PUT NO.7 LD HL,86*3+KERNEL JR #PUT NO.8 LD HL,87*3+KERNEL JR #PUT NO.9 LD HL,88*3+KERNEL JR #PUT NO.10 LD HL,89*3+KERNEL JR #PUT NO.11 EXX LD H,(IY+8) LD L,(IY+9) EXX LD HL,90*3+KERNEL ;///// NO.4 - NO.11 ///// #PUT LD (JPX+1),HL LD HL,(GXY) LD A,(IY+2) ADD A,H LD H,A LD A,(IY+3) ADD A,L LD L,A LD B,(IY+4) LD C,(IY+5) LD E,(IY+6) LD D,(IY+7) JPX JP 0 ;//////////////////////// ; ; NO.12 -> NO.21 ; ;//////////////////////// NO.12 LD HL,102*3+KERNEL JR #BOX NO.13 LD HL,91*3+KERNEL JR #BOX NO.14 LD HL,92*3+KERNEL JR #BOX NO.15 LD HL,95*3+KERNEL JR #BOX NO.16 LD HL,96*3+KERNEL JR #BOX NO.17 LD HL,97*3+KERNEL JR #BOX NO.18 LD HL,98*3+KERNEL JR #BOX NO.19 LD HL,99*3+KERNEL JR #BOX NO.20 LD HL,100*3+KERNEL JR #BOX NO.21 LD HL,101*3+KERNEL JR #BOX NO.22 LD HL,103*3+KERNEL JR #BOX NO.23 LD HL,104*3+KERNEL ;///// NO.12 - NO.23 ////// #BOX LD (JPB+1),HL LD HL,(GXY) LD A,(IY+4) ADD A,H LD H,A LD A,(IY+5) ADD A,L LD L,A EX DE,HL LD HL,(GXY) LD A,(IY+2) ADD A,H LD H,A LD A,(IY+3) ADD A,L LD L,A LD A,(IY+6) JPB JP 0 ;///////////////////////// ; ; NO.24 -> NO.25 ; ;///////////////////////// NO.24 LD HL,105*3+KERNEL JR #POLY NO.25 LD HL,106*3+KERNEL ;////// NO.24 - NO.25 //// #POLY PUSH IX PUSH IY LD (JPP+1),HL LD L,(IY+2) LD H,(IY+3) PUSH HL POP IX LD L,(IY+4) LD H,(IY+5) PUSH HL POP IY JPP CALL 0000 POP IY POP IX RET GXY DS 2 WORKZ DS 1 ; ; ; INSTALLER ; ; INSTALL LD HL,TBL LD DE,110*3+KERNEL LD BC,TBL.END-TBL LDIR JP $00AD TBL JP DRAW TBL.END