MZ-700で無茶苦茶な事をしでかすのが好きというわけではありませんが、何とSYSTEM-7cはMZ-700上で動作するウィンドウシステムです。今ではメモリが16MB必要だとかハードディスクが1GBくらいいるぞとかいう世界ですが、このSYSTEM-7cは48KBのメモリで十分に動作します。またフロッピーディスクも使いません。なんと言ってもカセットですから(笑)。
SYSTEM-7cはゲーム用として使用されるのを前提に制作されていますので「高速かつ省メモリ」です。そのために、いくつか工夫がなされています。以下にその工夫した点を挙げてみます。
・機能単位でブロック分割ができる(使用しない機能は省ける)
・横256文字のZ80-8bit CPUとしては最高速の仮想画面設計
・なるべくハードウェアに依存しないようにしてある
・コンパクトかつ多機能
・ゲームで使用される機能、System-7Bで使用頻度の高かったものを改良
SYSTEM-7cの最大の目的は「手軽にゲームを制作できる環境/ツールを制作」する事にあります。が、結果的にそれはかないませんでした。おまけに制作後、MacroMind Director (現在はMacromedia Director)というソフトと出会ってしまったのが運のツキでした。そのためMacで制作したゲームは、すべてMacromedia Directorを使用しています。つまり、SYSTEM-7cでめざした方向と、そのツールがDirectorというMacのソフトに近かったという事です。ただしVersion 3までは。Version 4になって、もっと私の理想に近くなるかと思ったのですが、あらぬ方向へと向かってしまいました。そう、オーサリングツールとしてDirectorを使う人が多くなり、マルチメディアブームにのって、さらにその傾向が濃くなってしまったのです。
最初に作ろうと考えていたゲーム制作ツールは、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 ; (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! ; H0 --- 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
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
;%%%%%%%%%%%%%%%%%%% ; ; 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
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 ; ; ; ;
;; ; ; 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=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
; ; ; 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
; ; 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
; ; 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