; Black Onyx for SG-1000 CPU Z80 ;COLECO SET 1 ; coleco-specific stuff OPT0 SET 0 ; optimizations that don't work (one particular CALL+RTS -> JP) OPT1 SET 0 ; obvious optimizations OPT2 SET 0 ; more iffy optimizations (usually CALL+RTS -> JP) SEGA SET 1 ; sega logo EXTRA SET 0 ; extra features (name/password wraparound, name shown with password in QUIT) FONT2 SET 0 ; use alternate font ENGLISH SET 0 IF ..UNDEF COLECO COLECO SET 0 ENDIF IF ..UNDEF LOCATOR LOCATOR SET 0 ENDIF IF COLECO OPT NOSYM ENGLISH SET 1 SEGA SET 0 EXTRA SET 1 OPT0 SET 0 OPT1 SET 1 OPT2 SET 1 FONT2 SET 1 ELSE OPT NOSYM ENDIF ; fixes still needed for coleco: ; - change save game password from using japanese chars? (will need 20 more symbols!) ; - disable "add warrior" in menu when already 5 in party? ; original bugs: ; - buy something and cancel at weapon shop, you lose the money ; tests needed for coleco: ; - set breakpoint on any access 0069-6FFF and 7400-7FFF ; - set breakpoint on write access 0000-6FFF and 7400-FFFF (7000-73FF exclusive) _0 EQU 00H ; numeric _1 EQU 01H ; _2 EQU 02H ; _3 EQU 03H ; _4 EQU 04H ; _5 EQU 05H ; _6 EQU 06H ; _7 EQU 07H ; _8 EQU 08H ; _9 EQU 09H ; _A EQU 0AH ; alphabetic _B EQU 0BH ; _C EQU 0CH ; _D EQU 0DH ; _E EQU 0EH ; _F EQU 0FH ; _G EQU 10H ; _H EQU 11H ; _I EQU 12H ; _J EQU 13H ; _K EQU 14H ; _L EQU 15H ; _M EQU 16H ; _N EQU 17H ; _O EQU 18H ; _P EQU 19H ; _Q EQU 1AH ; _R EQU 1BH ; _S EQU 1CH ; _T EQU 1DH ; _U EQU 1EH ; _V EQU 1FH ; _W EQU 20H ; _X EQU 21H ; _Y EQU 22H ; _Z EQU 23H ; _larr EQU 24H ; left arrow _ EQU 25H ; blank __ EQU 25H ; blank HLINE EQU 26H ; horizontal line HBAR EQU 27H ; horizontal bar? HP0 EQU 28H ; HP bar piece? ;_ EQU 29H ; HP bar piece? ;_ EQU 2AH ; HP bar piece? ;_ EQU 2BH ; HP bar piece? ;_ EQU 2CH ; HP bar piece? ;_ EQU 2DH ; HP bar piece? ;_ EQU 2EH ; HP bar piece? ;_ EQU 2FH ; HP bar piece? _copy EQU 30H ; copyright symbol (title screen only) _rarr EQU 30H ; right arrow (for menus) _uarr EQU 30H ; up arrow (for menus) a_ EQU 31H ; hiragana a i_ EQU 32H ; hiragana i u_ EQU 33H ; hiragana u e_ EQU 34H ; hiragana e o_ EQU 35H ; hiragana o ka EQU 36H ; hiragana ka ki EQU 37H ; hiragana ki ku EQU 38H ; hiragana ku ke EQU 39H ; hiragana ke ko EQU 3AH ; hiragana ko sa EQU 3BH ; hiragana sa shi EQU 3CH ; hiragana shi su EQU 3DH ; hiragana su se EQU 3EH ; hiragana se so EQU 3FH ; hiragana so ta EQU 40H ; hiragana ta chi EQU 41H ; hiragana chi tsu EQU 42H ; hiragana tsu te EQU 43H ; hiragana te to EQU 44H ; hiragana to na EQU 45H ; hiragana na ni EQU 46H ; hiragana ni nu EQU 47H ; hiragana nu ne EQU 48H ; hiragana ne no EQU 49H ; hiragana no ha EQU 4AH ; hiragana ha hi EQU 4BH ; hiragana hi fu EQU 4CH ; hiragana fu he EQU 4DH ; hiragana he ho EQU 4EH ; hiragana ho ma EQU 4FH ; hiragana ma mi EQU 50H ; hiragana mi mu EQU 51H ; hiragana mu me EQU 52H ; hiragana me mo EQU 53H ; hiragana mo ya EQU 54H ; hiragana ya yu EQU 55H ; hiragana yu yo EQU 56H ; hiragana yo ra EQU 57H ; hiragana ra ri EQU 58H ; hiragana ri ru EQU 59H ; hiragana ru re EQU 5AH ; hiragana re ro EQU 5BH ; hiragana ro wa EQU 5CH ; hiragana wa wo EQU 5DH ; hiragana wo n_ EQU 5EH ; hiragana n xtsu EQU 5FH ; hiragana small tsu xya EQU 60H ; hiragana small ya xyu EQU 61H ; hiragana small yu xyo EQU 62H ; hiragana small yo _RE EQU 63H ; katakana RE _HE EQU 64H ; katakana HE _RU EQU 65H ; katakana RU _ME EQU 66H ; katakana ME _SE EQU 67H ; katakana SE _SHI EQU 68H ; katakana SHI _KE EQU 69H ; katakana KE _MU EQU 6AH ; katakana MU _TA EQU 6BH ; katakana TA _KA EQU 6CH ; katakana KA _MA EQU 6DH ; katakana MA _N_ EQU 6EH ; katakana N _TO EQU 6FH ; katakana TO _XTSU EQU 70H ; katakana small TSU ten EQU 71H ; dakuten (") dot EQU 72H ; kana period (b->p mark?) _excl EQU 73H ; ! _dash EQU 74H ; - _lpar EQU 75H ; ( _rpar EQU 76H ; ) _star EQU 77H ; * _per EQU 78H ; . _colon EQU 79H ; : _lt EQU 7AH ; < _gt EQU 7BH ; > _ques EQU 7CH ; ? _lbr EQU 7DH ; [ _rbr EQU 7EH ; ] _eq EQU 7FH ; = _nbr EQU 80H ; # _apost EQU 81H ; apostrophe ;----------------------------------------------------------------------- IF COLECO ORG 7001H ELSE ORG 0C000H ENDIF ; for coleco, (IY-1) is used for flags DC000 DS 1 ; A pointed to by IY, bit-mapped, bit 6 not used DS 1 ; unused? DC002 DS 2 ; 2 timer? DC004 DS 2 ; 2,A frame counter 1? DC006 DS 2 ; 2 random number seed? DC008 DS 1 ; 1,A offset for rotating SEGA logo colors? DC009 DS 2 ; 2,1,A joypad buttons: -- -- -- -- -- -- 1B 1A DC00A EQU DC009+1 ; 1,A joypad direction from D0328 table: 1=up 3=right 5=down 7=left DC00B DS 1 ; 1,A last direction for menu up/down DC00C DS 1 ; A last direction repeat delay DC00D DS 2 ; 2,1 VRAM pointer to current menu item DC00F DS 1 ; 1 message speed (aka TIME) ; 1st char at C010 DC010 DS 10 ; 1,A DC01A DS 5 ; A DC01F DS 9 ; A DC028 DS 1 ; A DC029 DS 4 ; A ; 2nd char at C02D DC02D DS 1DH ; A ; 3rd char at C04A DS 1DH ; 4th char at C067 DS 1DH ; 5th char at C084 DS 1DH ; current monster storage C0A1-C116 (size 76H) NC0A1 EQU 76H DC0A1 DS NC0A1 ; 1,A monster number DC0A2 EQU DC0A1+1 ; 1 DC0A3 EQU DC0A1+2 ; 1,A monster count DC0A4 EQU DC0A1+3 ; A NPC names (6 bytes), or monster name in first slot DC0AA EQU DC0A1+9 ; 1,A ; 16H per, starts at C0A1? DC0AC EQU DC0A1+11; A DC0BC EQU DC0A1+27; A ; C0BA-2 C0D0-3 C0E6-4 C0FC-5 C112-6 C128 DS 12 DC123 DS 3 ; 1,A DC126 DS 2 ; 1 DC128 DS 4 ; 1,A current map number DC129 EQU DC128+1 ; 2,1,A current column number in map DC12A EQU DC128+2 ; 1 current row number in map DC12B EQU DC128+3 ; 1,A current facing direction 01=N 02=E 03=S 04=W DC12C DS 2 ; 2 address of current location in map DC12E DS 6 ; 2 base address of current map DC134 DS 1 ; 1 DC135 DS 1 ; 1,A DC136 DS 1 ; 1,A DC137 DS 1 ; 1 DC138 DS 1 ; 1 DC139 DS 2 ; 1,A DC13B DS 1 ; 1,A DC13C DS 7 ; A DC143 DS 1 ; A DC144 DS 1 ; A DC145 DS 1 ; A DC146 DS 3 ; 2,1,A DC147 EQU DC146+1 ; 2 (note overlapping word accesses!) DC148 EQU DC146+2 ; 1,A DC149 DS 3 ; 2 DC14C DS 1 ; 1,A DC14D DS 1 ; 1 DC14E DS 2 ; 2 DC150 DS 2 ; 2 DC152 DS 8 ; 2 DC15A DS 1 ; 1 DC15B DS 2 ; 2 DC15D DS 1 ; 1 DC15E DS 2 ; 2 DC160 DS 1 ; 2,1 DC161 DS 4 ; 1 DC165 DS 1 ; 1,A DC166 DS 5 ; 1,A DC16B DS 26H ; 1 DC191 DS 1 ; 1,A - 3x3? (0x009) DC192 DS 1 ; 1 DC193 DS 1 ; 1 DC194 DS 1 ; 1,A DC195 DS 1 ; 1 DC196 DS 1 ; 1 DC197 DS 1 ; 1,A DC198 DS 1 ; A DC199 DS 1 ; 1 DC19A DS 1 ; 1,A DC19B DS 1 ; 1 DC19C DS 1 ; 1 ; C19D-C2AC - off-screen buffer for 3D maze (16 wide x 17 high) ;DC19D DS 17*16 ; C19D row 0 DC19D DS 2 ; A DC19F DS 8 ; A DC1A7 DS 2 ; A DC1A9 DS 2 ; A DC1AB DS 1 ; A DC1AC DS 1 ; A ; C1AD row 1 DC1AD DS 1 ; A DC1AE DS 1 ; 1,A DC1AF DS 1 ; 1 DC1B0 DS 1 ; 1 DC1B1 DS 1 ; 1 DC1B2 DS 1 ; 1 DC1B3 DS 1 ; 1 DC1B4 DS 1 ; 1 DC1B5 DS 1 ; 1,A DC1B6 DS 3 ; 1 DC1B9 DS 3 ; 1,A DC1BC DS 1 ; A ; C1BD row 2 DS 10 DC1C7 DS 1 ; 1,A DC1C8 DS 1 ; 1 DC1C9 DS 1 ; 1 DC1CA DS 1 ; 1 DC1CB DS 1 ; A DC1CC DS 1 ; 1 ; C1CD row 3 DC1CD DS 1 ; A DC1CE DS 1 ; 1,A DC1CF DS 1 ; A DC1D0 DS 1 ; 1 DC1D1 DS 1 ; 1 DC1D2 DS 1 ; 1 DC1D3 DS 1 ; 1 DC1D4 DS 1 ; 1,A DC1D5 DS 7 ; 1 DC1DC DS 1 ; A ; C1DD row 4 DC1DD DS 4 ; A DC1E1 DS 6 ; A DC1E7 DS 2 ; A DC1E9 DS 4 ; A ; C1ED row 5 DS 4 DC1F1 DS 12 ; A ; C1FD row 6 DS 3 DC200 DS 3 ; A DC203 DS 3 ; A DC206 DS 1 ; A DC207 DS 6 ; A ; C20D row 7 DC20D DS 5 ; A DC212 DS 2 ; A DC214 DS 2 ; A DC216 DS 7 ; A ; C21D row 8 DC21D DS 16 ; A ; C22D row 9 DS 16 ; C23D row 10 DS 6 DC243 DS 3 ; A DC246 DS 7 ; A ; C24D row 11 DS 4 DC251 DS 6 ; A DC257 DS 6 ; A ; C25D row 12 DS 16 ; C26D row 13 DC26D DS 1 ; A DC26E DS 11 ; A DC279 DS 4 ; A ; C27D row 14 DS 16 ; C28D row 15 DS 16 ; C29D row 16 DC29D DS 1 ; A DC29E DS 14 ; A DC2AC DS 1 ; A ; C2AD DS 1 DC2AE DS 22H ; A DC2D0 DS 1 ; 1 ; these three bytes may be part of the first sound channel DC2D1 DS 1 ; 1,A DC2D2 DS 1 ; 1,A DC2D3 DS 1 ; 1 DC2D4 DS 6*20H ; A 6x20H bytes, IX points to one of these, sound channels? DC2D4_1 EQU DC2D4+0*20H DC2D4_2 EQU DC2D4+1*20H DC2D4_3 EQU DC2D4+2*20H DC2D4_4 EQU DC2D4+3*20H DC2D4_5 EQU DC2D4+4*20H ;DC2D4_6 EQU DC2D4+5*20H ; (not referenced directly) DC391 EQU *-3 ; end of a memory clear DC2D1 - DC390 DS 6BH ; stack space? IF COLECO ;STACK EQU 7400H ; top of stack STACK EQU 73FEH ; top of stack (with room for underflow) ELSE STACK EQU 0C3FFH ; A - stack top ENDIF ; I/O addresses IF COLECO PSG EQU FFH ; PSG write VDPdata EQU 0BEH ; VDP data read/write VDPcmd EQU 0BFH ; VDP command write VDPstat EQU 0BFH ; VDP status read Joy1 EQU 0FCH ; joypad 1 = -- 1A -- -- 1U 1R 1D 1L / -- 1B -- -- K3 K2 K1 K0 Joy2 EQU 0FFH ; joypad 2 = -- 2A -- -- 2U 2R 2D 2L / -- 2B -- -- K3 K2 K1 K0 KeySel EQU 80H ; select keypad JoySel EQU 0C0H ; select joystick ;IDE EQU 0DEH ; do not use ;ODE EQU 0DEH ; do not use ;ODF EQU 0DFH ; do not use ELSE PSG EQU 7FH ; PSG write VDPdata EQU 0BEH ; VDP data read/write VDPcmd EQU 0BFH ; VDP command write VDPstat EQU 0BFH ; VDP status read Joy1 EQU 0DCH ; joypad 1 = 2D 2U 1B 1A 1R 1L 1D 1U Joy2 EQU 0DDH ; joypad 2 = xx xx x RES 2B 2A 2R 2L IDE EQU 0DEH ; 8255 for keyboard? ODE EQU 0DEH ; 8255 for keyboard? ODF EQU 0DFH ; 8255 for keyboard? ENDIF ; VDP addresses PT EQU 0000H ; pattern table 0000-17FF SPT EQU 1800H ; sprite pattern table 1800-1FFF CT EQU 2000H ; color table 2000-37FF NT EQU 3800H ; name table 3800-3AFF SAT EQU 3B00H ; sprite attribute table 3B00-3B7F ;----------------------------------------------------------------------- ; IX offsets (blocks at C2D4) ORG 00H IX_00 DS 1 ; bitmapped: bits 2,3,5,6,7 used IX_01 DS 1 ; C,A (read only?) IX_02 DS 1 ; E (read only?) IX_03 DS 2 ; DE - sound data address? IX_05 DS 1 ; A (read only?) IX_06 DS 1 ; A IX_07 DS 1 ; A IX_08 DS 1 ; A DS 1 ; unused? IX_0A DS 2 ; HL,E IX_0C DS 2 ; DE IX_0E DS 1 ; A,inc/dec IX_0F DS 1 ; A,inc/dec IX_10 DS 2 ; DE,A:A (freq?) IX_12 DS 2 ; DE,HL,A:inc/dec IX_14 DS 2 ; HL,A:A (freq?) IX_16 DS 1 ; A,inc/dec,store 0FH DS 9 ; unused? IX_sz ; should be 20H ;----------------------------------------------------------------------- IF COLECO ORG 8000H ; ColecoVision cartridge header ; DW 55AAH ; Cartridge signature bytes (slow start) DW 0AA55H ; Cartridge signature bytes (fast start) DW 0,0 ; No RAM sprite tables DW 0 ; No VDP_Temp storage DW 0 ; Controller state table not used DW Main ; Main entry point JP 0000H ; RST 08 JP 0000H ; RST 10 JP 0000H ; RST 18 JP 0000H ; RST 20 JP 0000H ; RST 28 JP 0000H ; RST 30 JP 0000H ; RST 38 JR L0038 ; NMI NOP DB '-/-/----' ; 'WORLD/HELLO/2006' ELSE ORG 0000H ENDIF Main LD SP,STACK ; initialize stack IM 1 IF COLECO ; CALL X7EDB ; delay 2000 ELSE LD BC,8000H CALL L7EDB ; delay ENDIF L000B LD SP,STACK ; initialize stack (again?) LD HL,D002B ; initialize VDP registers CALL L7F4B LD IY,DC000 ; IY is always used to reference DC000 LD HL,DC000 ; clear most of RAM LD BC,03F0H XOR A CALL L7EE5 ; fill memory: HL=address, BC=length, A=fill byte DI IF COLECO IN A,(VDPStat) ; ensure that VDP interrupt is acknowledged LD (IY-1),0 ; clear NMI lockout flags JR L0068 ELSE LD A,92H ; 8255 mode set: A=mode 0/input, C=output, B=mode 0 input, C=output OUT (ODF),A EI JP L0068 ENDIF ; VDP register initialization D002B DB 01H ; reg 7 = 01 background color = black DB 03H ; reg 6 = 03 sprite pattern table at 1800 (01 1000 0000 0000) DB 76H ; reg 5 = 76 sprite attribute table at 3B00 (11 1011 0000 0000) DB 03H ; reg 4 = 03 pattern table at 0000 (01 1000 0000 0000) DB 0FFH ; reg 3 = FF color table at 2000 (11 1111 1100 0000) DB 0EH ; reg 2 = 0E name table at 3800 (11 1000 0000 0000) DB 0A0H ; reg 1 = A0 16K, blank, int enable, mode 2, 8x8 sprites DB 02H ; reg 0 = 02 mode 2 IF OPT1 ELSE ;0033 unused? HEX 29 C4 9D 04 C3 ENDIF ; VDP interrupt (RST 38H on SG-1000, NMI on ColecoVision) L0038 EX AF,AF' ; switch to alternate register set EXX IF COLECO BIT 0,(IY-1) ; branch if lockout flag set JR NZ,.20 IN A,(VDPstat) ; acknowledge interrupt .20 SET 1,(IY-1) ; set "NMI happened" flag ELSE IN A,(VDPstat) ; acknowledge interrupt ENDIF AND A JP P,.0051 ; branch if interrupt flag not set CALL L77A2 ; do sound interrupt handler LD HL,(DC004) ; increment frame counter 1? INC HL LD (DC004),HL LD HL,(DC006) ; increment random number seed? INC HL LD (DC006),HL .0051 CALL L0281 ; read joypads EXX ; switch back to normal register set EX AF,AF' IF COLECO RETN ; return from interrupt ELSE EI ; return from interrupt ENDIF RET IF OPT1 ELSE ;0058 unused? HEX CA 47 2B F5 CD 0E 0C C4 24 0C C2 3A 2B 7E ; NMI handler (for pause button) L0066 RETN ENDIF ;----------------------------------------------------------------------- ; SEGA logo L0068 CALL L7B3B ; initialize PSG IF SEGA LD HL,012CH ; initialize SEGA logo screen timer LD (DC002),HL ENDIF LD HL,D002B ; initialize VDP registers CALL L7F4B IF COLECO IN A,(VDPStat) ; ensure that VDP interrupt is acknowledged LD (IY-1),0 ; clear NMI lockout flags ENDIF IF SEGA LD HL,D01AF ; write SEGA logo character data to pattern table LD BC,N01AF LD DE,PT+0800H+0C8H*8 CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length LD DE,D0157 ; SEGA logo character codes CALL L7F2D ; print message group: DE=messages LD B,0E0H ; 16K, no blank, int enable CALL L7F60 ; unblank screen .008E LD HL,DC008 ; address of color offset LD A,(HL) ; get current offset INC (HL) ; increment offset CP 18H ; at end? JR NZ,.0099 LD (HL),00H ; reset offset if so .0099 LD H,00H ; HL = offset LD L,A LD DE,D017F ; base of rotating color table ADD HL,DE ; add offset LD DE,CT+0800H+0C8H*8 ; get base of color table for SEGA logo CALL L035A ; write color table x8: DE=VRAM address, HL=color table data LD DE,0008H ; HL = HL + 8 for second row ADD HL,DE LD DE,CT+0800H+0D0H*8 CALL L035A ; write color table x8: DE=VRAM address, HL=color table data LD DE,0008H ; HL = HL + 8 for third row ADD HL,DE LD DE,CT+0800H+0D8H*8 CALL L035A ; write color table x8: DE=VRAM address, HL=color table data CALL L0344 ; check for button or end of DC002 timer JR NC,.008E ; loop if timer not expired and button not pressed ELSE CALL L079E ; clear screen LD HL,015AH ; initialize title screen timer LD (DC002),HL JR .SKIP .LOOP ENDIF ; SEGA LD HL,015AH ; initialize title screen timer LD (DC002),HL IF SEGA LD B,0A0H ; 16K, blank, int enable LD HL,SAT CALL L7F6A ; blank screen IF OPT1 CALL L079E ; clear screen ELSE ; *** not optimal *** LD HL,3800H ; clear screen LD BC,0300H LD A,__ CALL L7F81 ; fill VRAM: HL=VRAM addr, BC=length, A=fill char => HL,AF saved ENDIF ELSE LD BC,8000H CALL L7EDB ; delay .SKIP ENDIF LD HL,D5AC0 LD BC,N5AC0 LD DE,PT+0000H ; name table CALL L7EEF ; copy data to all three pattern tables: HL=data, DE=VRAM addr, BC=length LD A,03H LD HL,D66B0 LD DE,CT+0000H ; color table CALL L3AF6 ; load color table: HL=data, DE=VRAM address, A=number of times LD HL,D6985 ; "THE" LD DE,38C5H LD BC,0204H CALL L7F1E ; put rectangular data on screen: B=height, C=width, DE=VRAM addr, HL=data LD HL,D698D ; "BLACK ONYX" LD DE,3902H LD BC,041DH CALL L7F1E ; put rectangular data on screen: B=height, C=width, DE=VRAM addr, HL=data LD DE,D6A01 ; title screen text CALL L7F2D ; print message group: DE=messages LD A,85H LD (DC2D0),A LD B,0E0H ; 16K, no blank, int enable CALL L7F60 ; unblank screen IF COLECO CALL X7EDB ; delay 2000H ELSE LD BC,8000H CALL L7EDB ; delay ENDIF .011D CALL L0344 ; check for button or end of DC002 timer JR NC,.011D ; loop if timer not expired and button not pressed IF OPT1 IF SEGA JP Z,L0068 ; branch if button not pressed ELSE JR Z,.LOOP ; branch if button not pressed ENDIF ELSE JR NZ,L0127 ; branch if button pressed *** not optimal *** JP L0068 ; go back to SEGA logo if button not pressed ENDIF L0127 CALL L7B3B ; initialize PSG CALL L036E ; initialize VDP and clear RAM CALL L048F ; MENU: new game / PASS WORD CALL L03BE ; put 3D maze chars in pattern table CALL L395E CALL L32DD ; clear bottom of screen LD HL,D4F38 ; "PREPARE TO DIE!!" CALL L7F3F ; print message with screen address LD A,81H LD (DC2D0),A ; start background music LD A,06H CALL L31B2 ; delay in A CALL L32DD ; clear bottom of screen .014C CALL L026F ; wait for vblank? CALL L0E7E ; print room name and check for direction input CALL L0A6B ; check for button input JR .014C ;----------------------------------------------------------------------- IF SEGA ; SEGA logo for name table D0157 DB 03H DW D015E,D0169,D0174 D015E DW 392CH ASCIIC 0C8H,0C9H,0CAH,0CBH,0CCH,0CDH,0CEH,0CFH D0169 DW 394CH ASCIIC 0D0H,0D1H,0D2H,0D3H,0D4H,0D5H,0D6H,0D7H D0174 DW 396CH ASCIIC 0D8H,0D9H,0DAH,0DBH,0DCH,0DDH,0DEH,0DFH ; color table for SEGA logo D017F HEX 40 40 40 50 50 50 70 70 HEX 70 F0 F0 F0 F0 F0 F0 70 HEX 70 70 50 50 50 40 40 40 HEX 40 40 40 50 50 50 70 70 HEX 70 F0 F0 F0 F0 F0 F0 70 HEX 70 70 50 50 50 40 40 40 ; SEGA logo for pattern table ; copied to VRAM 0E40 D01AF DB 00000000B ; C8 DB 00001111B DB 00111111B DB 01111111B DB 01111000B DB 11110111B DB 11101111B DB 11101111B DB 00000000B ; C9 DB 11111110B DB 11111110B DB 11111110B DB 00000000B DB 11111110B DB 11111110B DB 11111110B DB 00000000B ; CA DB 00001111B DB 00111111B DB 01111111B DB 01111000B DB 11110111B DB 11101111B DB 11101111B DB 00000000B ; CB DB 11111000B DB 11111000B DB 11111001B DB 00000001B DB 11111011B DB 11111011B DB 11111011B DB 00000000B ; CC DB 00111111B DB 11111111B DB 11111111B DB 11100000B DB 11011111B DB 10111111B DB 10111111B DB 00000000B ; CD DB 11111000B DB 11111000B DB 11111000B DB 00000000B DB 11111000B DB 11111000B DB 11111000B DB 00000000B ; CE DB 00000110B DB 00001111B DB 00011111B DB 00011111B DB 00111001B DB 00110110B DB 00110110B DB 00011100B ; CF DB 00100010B DB 01011101B DB 11010101B DB 11011001B DB 11010101B DB 11100010B DB 11111100B DB 11101110B ; D0 DB 11101111B DB 11101111B DB 11110111B DB 01111000B DB 01111111B DB 00111111B DB 00001111B DB 00000000B ; D1 DB 11100000B DB 11111000B DB 11111100B DB 00111100B DB 11011110B DB 11101110B DB 11101110B DB 11101110B ; D2 DB 11101111B DB 11101111B DB 11101111B DB 11100000B DB 11101111B DB 11101111B DB 11101111B DB 00000011B ; D3 DB 11110011B DB 11110011B DB 11110011B DB 00000011B DB 11110011B DB 11110011B DB 11110011B DB 10111000B ; D4 DB 10110111B DB 10110111B DB 10110111B DB 10110000B DB 10110111B DB 10110111B DB 10110111B DB 00000000B ; D5 DB 11111000B DB 11111000B DB 11111000B DB 00011000B DB 11011000B DB 11011001B DB 11011001B DB 01110110B ; D6 DB 01101111B DB 01101111B DB 11101111B DB 11011001B DB 11011001B DB 11011001B DB 10110000B DB 11100000B ; D7 DB 01100000B DB 01100000B DB 01110000B DB 10110000B DB 10110000B DB 10111000B DB 11011000B DB 00000000B ; D8 DB 11111111B DB 11111111B DB 11111111B DB 00000000B DB 11111111B DB 11111111B DB 11111111B DB 11101110B ; D9 DB 11101110B DB 11101110B DB 11011110B DB 00111100B DB 11111100B DB 11111000B DB 11100000B DB 11101110B ; DA DB 11101111B DB 11101111B DB 11110111B DB 01111000B DB 01111111B DB 00111111B DB 00001111B DB 00000011B ; DB DB 11111011B DB 11111011B DB 11111011B DB 00000001B DB 11111001B DB 11111000B DB 11111000B DB 10111000B ; DC DB 10111111B DB 10111111B DB 11011111B DB 11100000B DB 11111111B DB 11111111B DB 00111111B DB 11011001B ; DD DB 11011011B DB 11011011B DB 11011011B DB 00011111B DB 11111110B DB 11111110B DB 11111110B DB 10110000B ; DE DB 10111111B DB 01101111B DB 01101111B DB 01100000B DB 11001111B DB 11001111B DB 11001111B DB 11011000B ; DF DB 11011100B DB 11101100B DB 11101100B DB 00001110B DB 11111110B DB 11111110B DB 11111110B N01AF EQU $-D01AF ENDIF ; SEGA ;----------------------------------------------------------------------- ; wait for vblank? L026F LD HL,(DC006) ; increment random number seed? INC HL LD (DC006),HL LD HL,DC004 LD A,(HL) CP 01H JR C,L026F XOR A LD (HL),A RET ;----------------------------------------------------------------------- ; joypad input handler L0281 IF COLECO ; -=-=-=-=-=-=-=-=-=- ; 7 6 5 4 3 2 1 0 ; A = joypad 1 - 2D 2U 1B 1A 1R 1L 1D 1U ; B = joypad 2 - xx xx x RES 2B 2A 2R 2L ; joypad 1 = -- 1A -- -- 1U 1R 1D 1L / -- 1B -- -- K3 K2 K1 K0 ; joypad 2 = -- 2A -- -- 2U 2R 2D 2L / -- 2B -- -- K3 K2 K1 K0 OUT (KeySel),A EX (SP),HL EX (SP),HL IN A,(Joy1) ; - B - - K K K K CPL RLCA ; B - - K K K K - AND 80H ; B 0 0 0 0 0 0 0 LD E,A OUT (JoySel),A EX (SP),HL EX (SP),HL IN A,(Joy1) ; - A - - U R D L CPL AND 4FH OR E ; B A 0 0 U R D L LD E,A RLCA RLCA AND 03H ; 0 0 0 0 0 0 B A LD (DC009),A LD A,E AND 0FH ; 0 0 0 0 U R D L LD C,A LD B,0 LD HL,D0328 ; index into D0328 ADD HL,BC LD A,(HL) LD (DC00A),A RET ; 08 01 02 ; 07 00 03 ; 06 05 04 D0328 DB 00H ; ---- = 00 DB 01H ; ---U = 01 DB 03H ; --R- = 02 DB 02H ; --RU = 03 DB 05H ; -D-- = 04 DB 00H ; -D-U = 05 DB 04H ; -DR- = 06 DB 03H ; -DRU = 07 DB 07H ; L--- = 08 DB 08H ; L--U = 09 DB 00H ; L-R- = 0A DB 01H ; L-RU = 0B DB 06H ; LD-- = 0C DB 07H ; LD-U = 0D DB 05H ; LDR- = 0E DB 00H ; LDRU = 0F ELSE ; -=-=-=-=-=-=-=-=-=- LD DE,0000H XOR A OUT (ODE),A IN A,(IDE) OR A JR NZ,.02FD LD A,01H CALL L0338 ; read jopyads BIT 2,A ; 1L JR Z,.0297 SET 2,E .0297 BIT 3,A ; 1R JR Z,.029D SET 1,E .029D LD A,02H CALL L0338 ; read joypads BIT 1,A ; 1D JR Z,.02A8 SET 0,E .02A8 BIT 4,A ; 1A JR Z,.02AE SET 4,D .02AE LD A,03H CALL L0338 ; read joypads BIT 2,A ; 1L JR Z,.02B9 SET 3,E .02B9 BIT 4,A ; 1A JR Z,.02BF SET 5,D .02BF LD A,04H CALL L0338 ; read joypads BIT 5,A ; 1B JR Z,.02CA SET 1,D .02CA LD A,05H CALL L0338 ; read joypads BIT 5,A ; 1B JR Z,.02D5 SET 2,D .02D5 BIT 3,B ; 2B JR Z,.02DB SET 5,E .02DB LD A,06H CALL L0338 ; read joypads BIT 5,A ; 1B JR Z,.02E6 SET 3,D .02E6 BIT 6,A ; 2U JR Z,.02EC SET 0,D .02EC BIT 2,B ; 1L JR Z,.02F2 SET 4,E .02F2 XOR A OUT (ODE),A IN A,(IDE) OR A JR Z,.02FD LD DE,0000H .02FD LD A,07H CALL L0338 ; read joypads LD C,A ; C = Joy1, B=Joy2 RL C ; shift 2D and 2U into Joy2 RL B RL C RL B ; B = -- RES 2B 2A 2R 2L 2D 2U AND 3FH ; A = -- --- 1B 1A 1R 1L 1D 1U JR Z,.0310 ; skip if no Joy1 LD D,A ; D = Joy1 .0310 LD A,B OR A JR Z,.0315 ; skip if no Joy2 LD E,B ; E = Joy2 .0315 LD HL,DC009 ; start of controller data LD (HL),D ; DC009 = Joy1 PUSH HL XOR A LD B,A RRD ; DC009 high nibble = 0, low nibble = -- -- 1B 1A, A = 1R 1L 1D 1U LD C,A ; C = 1R 1L 1D 1U LD HL,D0328 ; index into D0328 ADD HL,BC LD A,(HL) POP HL INC HL LD (HL),A ; DC00A = translated RLDU bits RET D0328 DB 00H ; ---- = 00 DB 01H ; ---U = 01 DB 05H ; --D- = 02 DB 00H ; --DU = 03 DB 07H ; -L-- = 04 DB 08H ; -L-U = 05 DB 06H ; -LD- = 06 DB 07H ; -LDU = 07 DB 03H ; R--- = 08 DB 02H ; R--U = 09 DB 04H ; R-D- = 0A DB 03H ; R-DU = 0B DB 00H ; RL-- = 0C DB 01H ; RL-U = 0D DB 05H ; RLD- = 0E DB 00H ; RLDU = 0F ; read joypads ; A = joypad 1 - 2D 2U 1B 1A 1R 1L 1D 1U ; B = joypad 2 - xx xx x RES 2B 2A 2R 2L L0338 OUT (ODE),A IN A,(Joy2) CPL AND 0FH LD B,A IN A,(Joy1) CPL RET ENDIF ; -=-=-=-=-=-=-=-=-=- ;----------------------------------------------------------------------- ; check for button or end of DC002 timer ; zero set if timer expired and button not pressed ; carry set if timer expired or button pressed L0344 CALL L026F ; wait for vblank? LD HL,DC009 ; read joypad buttons LD A,(HL) OR A JR NZ,.0358 ; branch and return with carry set if button pressed LD HL,(DC002) ; decrement counter DEC HL LD (DC002),HL LD A,H ; return with carry clear if count not finished OR L RET NZ .0358 SCF RET ;----------------------------------------------------------------------- ; write color table x8: DE=VRAM address, HL=color table data L035A EX DE,HL ; HL = VRAM address CALL L7FCA ; set VRAM drite address: HL=VRAM address LD B,08H ; width of SEGA logo .0360 PUSH BC LD BC,0008H ; copy 8 bytes to VRAM PUSH DE CALL L7F94 ; print message, DE=message, BC=length POP DE POP BC DJNZ .0360 ; loop for rest of row EX DE,HL ; swap registers back RET ;----------------------------------------------------------------------- ; initialize VDP and clear RAM L036E LD HL,DC000 ; clear most of memory LD BC,0300H XOR A CALL L7EE5 ; fill memory: HL=address, BC=length, A=fill byte ; initialize VDP L0378 LD B,0A0H ; 16K, blank, int enable LD HL,SAT ; sprite attribute table CALL L7F6A ; blank screen LD BC,0107H ; reg 7 = 01, background color = black CALL L7F73 ; write VDP register: C=register, B=data LD HL,D63F8 ; hiragana/katakana to char codes starting at 30H LD DE,PT+30H*8 LD BC,N63F8 CALL L7EEF ; copy data to all three pattern tables: HL=data, DE=VRAM addr, BC=length LD HL,D6903 ; color table for char codes starting at 30H LD DE,CT+30H*8 LD A,03H CALL L3AF6 ; load color table: HL=data, DE=VRAM address, A=number of times LD HL,D6935 ; initialize sprite pattern table LD DE,SPT LD BC,N6935 CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length LD HL,D040F ; initialize sprite attribute table LD DE,SAT LD BC,N040F+N045F+N0473 CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length L03B5 CALL L079E ; clear screen LD B,0E0H ; 16K, no blank, int enable IF OPT2 JP L7F60 ; unblank screen ELSE CALL L7F60 ; unblank screen RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- ; put 3D maze chars in pattern table L03BE LD A,01H LD (DC12B),A ; current facing direction CALL L3948 ; base address of current map to DC12E CALL L392F ; address of current map location to DC12C CALL L197D LD A,04H LD (DC00F),A ; message speed = default (4) LD A,07H LD HL,SAT ; sprite attribute table CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data LD BC,0407H ; reg 7 = 04, background color = dark blue IF OPT2 JP L7F73 ; unblank screen ELSE CALL L7F73 ; write VDP register: C=register, B=data RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L03E0 LD B,0A0H ; 16K, blank, int enable LD HL,SAT ; sprite attribute table CALL L7F6A ; blank screen LD HL,D5FD0 ; maze drawing chars LD DE,PT+30H*8 LD BC,N5FD0 LD A,02H ; copy to first two pattern tables CALL L7EF1 ; copy data to multiple pattern tables: HL=data, DE=VRAM addr, BC=length, A=ntables LD HL,D671F LD DE,CT+0180H ; color table LD A,02H ; copy to first two color tables CALL L3AF6 ; load color table: HL=data, DE=VRAM address, A=number of times LD HL,D63F8 ; hiragana/katakana to char codes starting at 30H LD DE,PT+30H*8 CALL L3B51 ; copy one char from HL to DE (just the right arrow) CALL L3B46 JR L03B5 ; clear screen, unblank, and return ;----------------------------------------------------------------------- ; copied to VRAM 3B00 sprite attribute table ; Y, X, pattern, color/early clock D040F HEX 07 10 01 0F ; 00 HEX 0F 18 01 00 ; 01 HEX 0F 00 00 01 ; 02 HEX 17 00 00 01 ; 03 HEX 1F 10 01 0F ; 04 HEX 27 18 10 00 ; 05 HEX 27 00 00 01 ; 06 HEX 2F 00 00 01 ; 07 HEX 37 10 01 0F ; 08 HEX 3F 18 01 00 ; 09 HEX 3F 00 00 01 ; 0A HEX 47 00 00 01 ; 0B HEX 4F 10 01 0F ; 0C HEX 57 18 01 00 ; 0D HEX 57 00 00 01 ; 0E HEX 5F 00 00 01 ; 0F HEX 67 10 01 0F ; 10 HEX 6F 18 01 00 ; 11 HEX 6F 00 00 01 ; 12 HEX 77 00 00 01 ; 13 N040F EQU $-D040F ; copied to VRAM 3B50 D045F HEX 8F 00 00 01 ; 14 HEX 97 00 00 01 ; 15 HEX 9F 00 00 01 ; 16 HEX A7 00 00 01 ; 17 HEX AF 00 00 01 ; 18 N045F EQU $-D045F ; copied to VRAM 3B64 D0473 HEX 4F A8 01 0F ; 19 HEX 57 B0 01 09 ; 1A HEX 47 A8 01 0F ; 1B HEX 4F 90 01 0F ; 1C HEX 4F C0 01 0F ; 1D HEX 2F 98 01 0F ; 1E HEX 2F B8 01 0F ; 1F N0473 EQU $-D0473 ;----------------------------------------------------------------------- ; MENU: new game / password L048F LD DE,D5379 ; MENU / PASS WORD / nakama wo tsukuru CALL L7F2D ; print message group: DE=messages LD HL,394AH CALL L35B4 ; do menu: HL=VRAM address => A=first char of item CP _P ; *J* PASS else nakama/NEW GAME JP Z,L054B ; === NEW GAME start === CALL L03E0 LD HL,L0542 ; set initial row,column PUSH HL LD B,05H ; max 5 characters PUSH BC ; save counter .04AA CALL L079E ; clear screen CALL L07D0 ; draw five character images on screen LD HL,D49BC ; "choose a player" CALL L7F3F ; print message with screen address LD HL,3862H LD (DC00D),HL ; VRAM pointer to current menu item LD A,30H CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data IF OPT1 CALL X7EDB ; delay 2000H ELSE LD BC,2000H CALL L7EDB ; delay ENDIF XOR A LD (DC00B),A .04CB CALL L07EB ; handle directions for character selection menu LD A,(DC009) ; joypad buttons BIT 0,A ; button 1 JR Z,.04E9 ; branch if button 1 not pressed LD A,(DC00D) ; low byte of pointer to current menu item SUB (3862H-6)&0FFH LD B,06H ; max five items .04DC DEC B ; divide horizontal position by 6 SUB 06H JR NZ,.04DC LD HL,3923H CALL L07AA ; draw one character image on screen: HL=VRAM address, B=image number JR .04CB .04E9 BIT 1,A ; button 2 JR Z,.04CB ; branch if button 2 not pressed LD HL,3924H CALL L7FAD ; read one byte from VDP: HL=VRAM address => A=data CP __ JR Z,.04CB ; branch if can't identify selected item LD HL,DC19D+10H ; chr+10H no potion LD (HL),80H INC HL ; chr+11H money LD A,02H CALL L35DF ; generate random money? LD BC,0003H ADD HL,BC ; chr+17H exp toward next level = 1 LD (HL),01H INC HL ; chr+18H level = 1 LD B,01H CALL L1E7F LD HL,3800H ; clear top 2/3 of screen LD BC,1020H LD A,__ CALL L32CE ; erase a rectangle: HL=VRAM address, B=height, C=width LD DE,DC1A7 CALL L3772 LD H,00H LD DE,3863H CALL L3876 CALL L0653 ; "ENTER NAME" menu CALL L0754 ; copy PC data at DC19D to next available PC slot POP BC ; get back counter DEC B RET Z ; return if all 5 slots entered PUSH BC ; save counter CALL L079E ; clear screen CALL L07D0 ; draw five character images on screen LD HL,D5028 ; "mouhitori tsukurimasuka ?" CALL L076B ; ask a yes/no question: Z=YES, NZ=NO JP Z,.04AA ; YES, go enter another character POP BC ; drop counter and return RET ;----------------------------------------------------------------------- ; set initial row,column L0542 LD HL,DC129 ; current column number in map LD (HL),0BH INC HL ; HL => current row number in map at DC12A LD (HL),00H RET ;----------------------------------------------------------------------- ; === PASSWORD start === L054B LD A,10H LD (DC123),A LD HL,D5FD0 ; maze drawing chars LD DE,PT+30H*8 LD BC,0008H ; just the right arrow at 30H CALL L7EEF ; copy data to all three pattern tables: HL=data, DE=VRAM addr, BC=length LD B,05H ; up to 5 characters PUSH BC .055F CALL L079E ; clear screen CALL L0653 ; "ENTER NAME" menu .0565 CALL L079E ; clear screen CALL L05DF ; "ENTER PASSWORD" menu OR A JR NZ,.059C LD HL,3889H ; copy 15-byte password from screen LD DE,DC1C7 ; start of save data LD BC,000FH ; 15 chars in password CALL L7F9E ; VRAM read: HL=VRAM address, DE=data, BC=length CALL L0891 ; decode password: DE=data => password at DC19D..DC1AB, NZ=fail IF OPT1 JR NZ,.05C9 ; branch if decode error CALL L0920 ; load save data JR NC,.05C9 ; branch if password error ELSE JP NZ,.05C9 ; branch if decode error ; *** not optimal *** CALL L0920 ; load save data JP NC,.05C9 ; branch if password error ENDIF LD HL,DC1B5 LD B,(HL) INC HL LD A,(HL) PUSH AF CALL L1E81 POP AF LD (DC1B6),A CALL L0754 ; copy PC data at DC19D to next available PC slot POP BC DEC B JR Z,.05B4 PUSH BC .059C CALL L079E ; clear screen CALL L3B46 CALL L0768 ; enter another character? PUSH AF CALL L3B4B POP AF IF OPT1 JR Z,.055F ; YES, loop for next character ELSE JP Z,.055F ; hai, loop for next character ENDIF LD A,(DC010) OR A JR Z,L05D7 POP BC .05B4 LD DE,DC128 ; current map number LD HL,DC123 LD BC,0003H LDIR CALL L03E0 LD A,(DC126) IF OPT2 JP L0E5D ELSE CALL L0E5D RET ; *** not optimal *** ENDIF .05C9 LD HL,D53E6 ; "ga machigatteimasu " CALL L7F3F ; print message with screen address LD A,0AH CALL L31B1 ; delay in A IF OPT1 JR .0565 ELSE JP .0565 ENDIF L05D7 LD SP,STACK IF OPT1 JP L0127 ELSE LD HL,L0127 PUSH HL RET ENDIF ;----------------------------------------------------------------------- ; "ENTER PASSWORD" menu L05DF LD HL,DC1A7 LD BC,0012H XOR A CALL L7EE5 ; fill memory: HL=address, BC=length, A=fill byte CALL L0832 ; put PC name and 15-char underline on screen LD HL,3922H LD (DC00D),HL ; VRAM pointer to current menu item LD A,_uarr CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data IF OPT1 CALL X7EDB ; delay 2000H ELSE LD BC,2000H CALL L7EDB ; delay ENDIF XOR A LD (DC00B),A LD C,0FH .0603 CALL L31C1 ; handle arrow keys for name/password menus LD A,(DC009) ; joypad buttons BIT 0,A ; button 1 JR Z,.0647 LD HL,(DC00D) ; VRAM pointer to current menu item LD DE,0FFE0H ; peek one line up ADD HL,DE CALL L7FAD ; read one byte from VDP: HL=VRAM address => A=data CP _larr JR Z,.0623 ; branch if backspace DEC C LD B,A JP P,.062F INC C JR .0603 ; backspace .0623 LD B,__ LD A,C CP 0FH JR Z,.0603 INC C LD A,10H JR .0631 .062F LD A,0FH .0631 SUB C LD HL,3888H LD D,00H LD E,A ADD HL,DE LD A,B CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data PUSH BC IF OPT1 CALL X7EDB ; delay 2000H ELSE LD BC,2000H CALL L7EDB ; delay ENDIF POP BC JR .0603 .0647 BIT 1,A JR Z,.0603 LD A,C OR A RET Z CP 0FH RET Z JR .0603 ;----------------------------------------------------------------------- ; "ENTER NAME" menu L0653 LD HL,D4983 ; "enter name (10 chars max)" CALL L7F3F ; print message with screen address LD C,03H LD HL,390BH LD A,0AH .0660 LD B,09H .0662 CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data INC HL INC HL INC A DJNZ .0662 DEC C JR Z,.0673 LD DE,40H-12H ; go to start of next row ADD HL,DE JR .0660 .0673 LD HL,392BH LD (DC00D),HL ; VRAM pointer to current menu item LD A,_uarr CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data .067E LD HL,38AAH ; put horizontal line on screen LD BC,000AH LD A,HLINE CALL L7F81 ; fill VRAM: HL=VRAM addr, BC=length, A=fill char => HL,AF saved LD HL,DC19D ; off-screen buffer LD BC,000AH XOR A CALL L7EE5 ; fill memory: HL=address, BC=length, A=fill byte IF OPT1 CALL X7EDB ; delay 2000H ELSE LD BC,2000H CALL L7EDB ; delay ENDIF XOR A LD (DC00B),A LD C,0AH .069F CALL L31C1 ; handle arrow keys for name/password menus LD A,(DC009) ; joypad buttons BIT 0,A ; button 1 JR Z,.06E3 LD HL,(DC00D) ; VRAM pointer to current menu item LD DE,0FFE0H ; peek one line up ADD HL,DE CALL L7FAD ; read one byte from VDP: HL=VRAM address => A=data CP _larr JR Z,.06BF ; branch if backspace DEC C LD B,A JP P,.06CB INC C JR .069F ; backspace .06BF LD B,__ LD A,C CP 0AH JR Z,.069F INC C LD A,0BH JR .06CD .06CB LD A,0AH .06CD SUB C LD HL,3889H LD D,00H LD E,A ADD HL,DE LD A,B CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data PUSH BC IF OPT1 CALL X7EDB ; delay 2000H ELSE LD BC,2000H CALL L7EDB ; delay ENDIF POP BC JR .069F .06E3 BIT 1,A JR Z,.069F LD A,0AH CP C JR Z,.069F LD HL,388AH LD DE,DC19D ; off-screen buffer for 3D maze LD BC,000AH CALL L7F9E ; VRAM read: HL=VRAM address, DE=data, BC=length LD HL,DC010 LD BC,0A04H .06FE LD DE,DC19D ; off-screen buffer for 3D maze PUSH BC .0702 LD A,(DE) CP (HL) JR NZ,.0740 INC HL INC DE DJNZ .0702 CALL L32DD ; clear bottom of screen POP BC LD HL,3A23H LD DE,DC19D ; off-screen buffer for 3D maze CALL L3317 ; print PC name, DE=name, HL=VRAM addr LD BC,N49AD LD DE,D49AD ; "wa sudeni imasu." CALL L7F94 ; print message, DE=message, BC=length LD HL,D49A1 ; "[ANY KEY]" CALL L7F3F ; print message with screen address CALL L31A1 ; delay and wait for joypad button LD HL,388AH ; clear area on screen LD BC,000AH LD A,__ CALL L7F81 ; fill VRAM: HL=VRAM addr, BC=length, A=fill char => HL,AF saved CALL L32DD ; clear bottom of screen LD HL,D4983 ; "enter name (10 chars max)" CALL L7F3F ; print message with screen address JP .067E .0740 POP BC DEC C RET Z LD A,C CP 02H LD DE,001DH LD HL,DC02D JR Z,.0751 JR NC,.06FE ADD HL,DE .0751 ADD HL,DE JR .06FE ;----------------------------------------------------------------------- ; copy PC data at DC19D to next available PC slot L0754 LD BC,001DH LD HL,DC010 XOR A .075B CP (HL) JR Z,.0761 ADD HL,BC JR .075B .0761 EX DE,HL LD HL,DC19D ; off-screen buffer LDIR RET ;----------------------------------------------------------------------- ; ask for entering another character L0768 LD HL,D49D3 ; "mouhitori ikimasuka ?" ; ask a yes/no question: Z=YES, NZ=NO L076B CALL L7F3F ; print message with screen address LD HL,3A31H LD (DC00D),HL ; VRAM pointer to current menu item LD A,30H CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data LD DE,D50EB ; "hai / iie" CALL L7F2D ; print message group: DE=messages IF OPT1 CALL X7EDB ; delay 2000H ELSE LD BC,2000H CALL L7EDB ; delay ENDIF XOR A ; clear last direction LD (DC00B),A .0789 CALL L3258 ; handle menu up/down LD A,(DC009) ; joypad buttons BIT 1,A ; button 2 JR Z,.0789 LD HL,(DC00D) ; VRAM pointer to current menu item INC HL INC HL CALL L7FAD ; read one byte from VDP: HL=VRAM address => A=data IF ENGLISH CP _Y ; YES ELSE CP ha ; *J* ha hai ENDIF RET ;----------------------------------------------------------------------- ; clear screen L079E LD HL,NT ; start of name table LD BC,0300H ; size of name table LD A,__ IF OPT2 JP L7F81 ; fill VRAM: HL=VRAM addr, BC=length, A=fill char => HL,AF saved ELSE CALL L7F81 ; fill VRAM: HL=VRAM addr, BC=length, A=fill char => HL,AF saved ; *** not optimal *** RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- ; draw one character image on screen: HL=VRAM address, B=image number L07AA LD DE,DC1AC ; off-screen buffer + 15 XOR A LD (DE),A DEC DE LD A,85H ; right arm with knife LD (DE),A DEC DE XOR A LD (DE),A DEC DE LD (DE),A DEC DE LD A,05H SUB B ADD A,5BH LD (DE),A DEC DE SUB 05H LD (DE),A PUSH HL CALL L3772 POP DE PUSH DE LD H,00H CALL L3876 POP HL RET ;----------------------------------------------------------------------- ; draw five character images on screen L07D0 LD HL,DC19D ; off-screen buffer LD BC,001DH XOR A CALL L7EE5 ; fill memory: HL=address, BC=length, A=fill byte LD B,05H ; number of PC images LD HL,3863H ; VRAM address for first PC image .07DF PUSH BC CALL L07AA ; draw one character image on screen: HL=VRAM address, B=image number LD BC,0006H ADD HL,BC ; HL = HL + 6 POP BC DJNZ .07DF ; loop for next image RET ;----------------------------------------------------------------------- ; handle directions for character selection menu L07EB LD HL,DC00A LD A,(HL) INC HL CP 03H ; right JR Z,.07FB CP 07H ; left JR Z,.07FB LD (HL),00H ; DC00B = 00 RET .07FB CP (HL) LD (HL),A INC HL LD A,1EH JR NZ,.0806 DEC (HL) RET NZ LD A,0FH .0806 LD (HL),A DEC HL LD A,(HL) LD HL,(DC00D) ; VRAM pointer to current menu item CP 03H ; right LD DE,+6 LD B,7AH JR Z,.081A LD DE,-6 LD B,62H .081A LD A,L CP B RET Z LD A,25H CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data ADD HL,DE LD A,30H CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data LD (DC00D),HL ; VRAM pointer to current menu item IF OPT2 JP X7EDB ; delay 2000H ELSE LD BC,2000H CALL L7EDB ; delay RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L0832 LD HL,DC19D ; off-screen buffer LD BC,000AH ; 10 chars in PC name LD DE,3842H CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length LD HL,38A9H LD BC,000FH ; 15 chars in password LD A,HLINE CALL L7F81 ; fill VRAM: HL=VRAM addr, BC=length, A=fill char => HL,AF saved LD DE,0022H LD HL,3902H LD B,0AH LD A,00H CALL L0888 LD B,05H LD A,31H CALL L0888 LD C,02H .085F ADD HL,DE LD B,0FH CALL L0888 DEC C JR NZ,.085F ADD HL,DE LD B,0BH CALL L0888 LD A,0AH LD B,04H CALL L0888 LD BC,0F02H .0878 ADD HL,DE CALL L0888 LD B,08H DEC C JR NZ,.0878 LD HL,D53A2 IF OPT2 JP L7F3F ; print message with screen address ELSE CALL L7F3F ; print message with screen address RET ; *** not optimal *** ENDIF L0888 CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data INC HL INC HL INC A DJNZ L0888 RET ;----------------------------------------------------------------------- ; decode password: DE=data => password at DC19D..DC1AB, NZ=fail L0891 LD HL,DC19D ; off-screen buffer (character name here) CALL L08AE ; get base code from name checksum: HL=name => HL=80-byte code table LD B,15 ; 15 bytes of code LD DE,DC1C7 ; start of save data .089C PUSH BC PUSH HL LD A,(DE) ; get next character of entered code LD BC,80 CPIR ; look up index of code LD A,C ; A = 80 - index (0..79) POP HL POP BC RET NZ ; exit if char code not found in table LD (DE),A ; put back de-indexed byte INC DE DJNZ .089C XOR A RET ;----------------------------------------------------------------------- ; get base code from name checksum: HL=name => HL=80-byte code table L08AE XOR A ; clear checksum LD B,0AH ; 10 chars in name? .08B1 PUSH AF ; save checksum LD A,(HL) CP __ JR Z,.08BE ; exit loop if blank (end of name) POP AF ; get back checksum ADD A,(HL) ; add name char to checksum INC HL ; point to next char DJNZ .08B1 ; loop for rest of name IF OPT1 PUSH AF ; one byte shorter ELSE JR .08BF ENDIF .08BE POP AF .08BF SUB 03H JR NC,.08BF ADD A,03H ; A = checksum mod 3 (0..2) INC A ; increment for loop counter LD B,A LD HL,D08CE-1 ; base of code table .08CA INC HL ; offset by checksum mod 3 DJNZ .08CA RET ; code table: one of three code sets is used, depending on the checksum of the name D08CE DB 5EH,3BH,55H,3FH,3AH,48H,23H,22H ; n sa yu so ko ne Z Y DB 21H,20H,1FH,1EH,1DH,1CH,1BH,1AH ; X W V U T S R Q DB 19H,18H,17H,16H,15H,14H,13H,12H ; P O N M L K J I DB 11H,10H,0FH,0EH,0DH,0CH,0BH,0AH ; H G F E D C B A DB 52H,36H,33H,49H,5DH,09H,08H,07H ; me ka u no wo 9 8 7 DB 06H,05H,04H,03H,02H,01H,00H,47H ; 6 5 4 3 2 1 0 nu DB 39H,5AH,4DH,42H,54H,3EH,58H,46H ; ke re he tu ya se ri ni DB 5CH,32H,51H,4BH,43H,38H,4FH,34H ; wa i mu hi te ku ma e DB 57H,40H,4EH,45H,59H,37H,4AH,50H ; ra ta ho na ru ki ha mi DB 41H,56H,3CH,53H,35H,5BH,44H,3DH ; ti yo si mo o ro to su DB 4CH,31H ; fu a ;----------------------------------------------------------------------- L0920 LD BC,0F00FH ; B=F0 mask, C=0F mask LD DE,DC1C7 ; start of save data LD A,(DE) ; PW+00 AND B LD (DC19D+11H),A ; chr+11 money LSB INC DE LD A,(DE) ; PW+01 AND C CP 0AH RET NC LD A,(DE) ; PW+01 LD (DC19D+15H),A ; chr+15 bank money mid-SB INC DE LD A,(DE) ; PW+02 LD (DC129),A ; current column number in map INC DE LD A,(DE) ; PW+03 CP 49H RET NC OR A RET Z LD (DC19D+19H),A ; chr+19 life INC DE LD A,(DE) ; PW+04 AND B CP 40H RET NC LD HL,DC19D+0CH OR A JR Z,.0957 LD (HL),A ; chr+0C shield RRD LD A,(HL) ; chr+0C shield ADD A,A ADD A,66H .0957 LD (HL),A ; chr+0C shield LD A,(DE) ; PW+04 INC HL AND C CP 05H ; 5 = cloak? JR Z,.0964 RET NC ADD A,74H JR .0966 .0964 LD A,0FFH ; magic cloak .0966 LD (HL),A ; chr+0D armor INC DE LD A,(DE) ; PW+05 CP 47H RET NC LD (DC19D+1CH),A ; chr+1C damage INC DE LD A,(DE) ; PW+06 AND C LD (DC19D+18H),A ; chr+18 level LD A,(DE) ; PW+06 AND B LD HL,DC19D+10H LD (HL),A ; chr+10 potion data RRD INC DE LD A,(DE) ; PW+07 AND B CP 20H RET NC OR A JR NZ,.098B LD A,(HL) ; chr+10 potion data OR A RET NZ LD (HL),80H ; chr+10 potion data .098B LD A,(DE) ; PW+07 AND C CP 07H JR Z,.0994 RET NC JR .0996 .0994 LD A,0FFH ; change map 07 to map FF .0996 LD (DC128),A ; current map number INC DE LD A,(DE) ; PW+08 AND B CP 40H RET NC LD HL,DC19D+0FH OR A JR Z,.09AB LD (HL),A ; chr+0F = helm RRD LD A,(HL) ; chr+0F = helm ADD A,0AEH .09AB LD (HL),A ; chr+0F = helm LD A,(DE) ; PW+08 DEC HL ; 0E AND C CP 09H RET NC CP 05H JR Z,.09BC JR C,.09C3 CP 06H JR Z,.09C3 .09BC DEC HL ; 0D DEC HL ; 0C INC (HL) ; chr+0C DEC (HL) ; error if shield + 2-handed weapon RET NZ INC HL ; 0D INC HL ; 0E .09C3 ADD A,A ADD A,85H LD (HL),A ; chr+0E = weapon INC DE LD A,(DE) ; PW+09 LD (DC12A),A ; current row number in map INC DE LD A,(DE) ; PW+0A CP 15H RET NC AND C CP 0AH RET NC LD A,(DE) ; PW+0A LD (DC19D+13H),A ; chr+13 = money LSB INC DE LD A,(DE) ; PW+0B CP 49H RET NC LD (DC19D+17H),A ; chr+17 = ??? INC DE LD A,(DE) ; PW+0C AND C CP 0AH ; ensure that it's valid BCD RET NC LD A,(DE) ; PW+0C LD (DC19D+16H),A ; chr+16 = bank money MSB INC DE LD A,(DE) ; PW+0D AND B LD (DC19D+14H),A ; chr+14 = bank money LSB LD A,(DE) ; PW+0D AND C CP 05H RET NC ADD A,56H LD HL,DC19D+0AH LD (HL),A ; chr+0A = head ADD A,05H INC HL LD (HL),A ; chr+0A = head INC DE LD A,(DE) ; PW+0E AND C CP 0AH RET NC LD A,(DE) ; PW+0E LD (DC19D+12H),A ; money mid-SB LD A,(DC19D+1CH) ; damage LD B,A LD A,(DC19D+19H) ; life CP B RET Z CCF RET NC LD HL,DC129 ; current column number in map LD A,(HL) LD B,(HL) ; B=PW+02 AND 0FH LD (HL),A ; column INC HL LD A,(HL) LD C,(HL) ; C=PW+09 AND 0FH LD (HL),A ; row PUSH BC CALL L3948 ; base address of current map to DC12E CALL L392F ; address of current map location to DC12C POP BC LD A,(HL) OR A RET Z LD A,B AND 0F0H JR NZ,.0A39 LD A,C AND 0F0H RET Z ADD A,40H .0A39 LD B,A LD A,(DC128) ; current map number CP 06H JR Z,.0A4F CP 0FFH LD C,10H JR NZ,.0A49 LD C,80H .0A49 LD A,B CP C JR Z,.0A54 .0A4D OR A RET .0A4F LD A,B CP 80H JR Z,.0A4D .0A54 LD HL,DC128 ; current map number LD DE,DC123 LD A,(DE) CP 10H JR Z,.0A62 CP (HL) JR C,.0A69 .0A62 LD A,B LD BC,0003H LDIR LD (DE),A .0A69 SCF RET ;----------------------------------------------------------------------- L0A6B LD A,(DC009) ; joypad buttons BIT 1,A ; button 2 RET Z CALL L32DD ; clear bottom of screen LD DE,D50F0 ; "*MENU* / => TIME / HOW MUCH GOLD / CURE / QUIT / ADD WARRIOR" CALL L7F2D ; print message group: DE=messages IF OPT1 CALL X7EDB ; delay 2000H ELSE LD BC,2000H CALL L7EDB ; delay ENDIF LD HL,3A2FH LD (DC00D),HL ; VRAM pointer to current menu item XOR A ; clear last direction LD (DC00B),A .0A8A CALL L3258 ; handle menu up/down LD A,(DC009) ; joypad buttons BIT 0,A ; button 1 IF OPT1 JP NZ,L32DD ; if button 1 pressed, clear bottom of screen and exit ELSE JR NZ,.0AB8 ; *** not optimal *** ENDIF BIT 1,A ; button 2 JR Z,.0A8A LD HL,(DC00D) ; VRAM pointer to current menu item INC HL INC HL CALL L7FAD ; read one byte from VDP: HL=VRAM address => A=data PUSH AF CALL L32DD ; clear bottom of screen POP AF CP _A ; *J* A ADD JP Z,L0C4C CP _H ; *J* H HOW JP C,.0B64 ; HL=VRAM addr, DE=next data LD C,0CH ADD HL,BC EX DE,HL ; DE = VRAM addr + 12 LD C,09H ADD HL,BC ; HL = char data + 10 + 9 CALL L32E7 ; print 3-byte BCD number at (HL): HL=last/high byte of number, DE=VRAM addr LD DE,D4A4F ; "G.P." LD BC,N4A4F CALL L7F94 ; print message, DE=message, BC=length POP DE ; get back VRAM addr LD HL,0020H ; 32 bytes per line ADD HL,DE EX DE,HL ; DE = VRAM addr of next line POP HL ; get back char data base LD BC,001DH ; 1D bytes per character ADD HL,BC ; HL = address of next character POP BC DJNZ .0B2A ; loop for next character .0B58 LD HL,D4A53 ; "[ANY]" CALL L7F3F ; print message with screen address CALL L31A1 ; delay and wait for joypad button JP .0C3D ; clear bottom of screen and exit ;----------------------------------------------------------------------- ; === CURE === .0B64 CALL L32B1 ; print PC name menu LD HL,D5039 ; "cancel" LD BC,N5039 CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length LD HL,3A31H LD (DC00D),HL ; VRAM pointer to current menu item .0B76 LD DE,D5102 ; "dareno kusuriwo / tsukaimasuka ?" CALL L7F2D ; print message group: DE=messages CALL L35B7 ; do menu: HL=VRAM address => A=first char of item IF ENGLISH CP _dash ; -CANCEL- ELSE CP tsu ; *J* tsukawanai ENDIF JP Z,.0C3D ; if cancel, clear bottom of screen and exit CALL L3329 ; HL=player selected in menu LD BC,0010H ; offset to PC potion data ADD HL,BC BIT 7,(HL) ; test no-bottle flag JR NZ,.0BC9 ; branch if no bottle LD A,(HL) ; get number of doses AND 0FH JR Z,.0BC9 ; branch if no potion PUSH HL LD HL,D4A72 ; "darega kusuriwo" CALL L7F3F ; print message with screen address IF ENGLISH EX DE,HL CALL L7F3F ; print message with screen address ENDIF CALL L35B7 ; do menu: HL=VRAM address => A=first char of item IF ENGLISH CP _dash ; -CANCEL- ELSE CP tsu ; *J* tsukawanai ENDIF POP HL JP Z,.0C3D DEC (HL) CALL L3329 ; HL=player selected in menu LD BC,0018H ; offset to PC level? ADD HL,BC LD A,(HL) LD C,04H ADD HL,BC CP 06H LD C,05H JR NC,.0BBB SUB 0BH NEG LD C,A .0BBB LD A,(HL) SUB C JR NC,.0BC0 XOR A .0BC0 LD (HL),A CALL L3346 ; find line number in PC name menu CALL L364E JR .0C3D .0BC9 OR A SBC HL,BC ; un-add 10H from PC data pointer PUSH HL LD HL,3A23H LD BC,050EH CALL L32CE ; erase a rectangle: HL=VRAM address, B=height, C=width POP HL EX DE,HL LD HL,3A43H CALL L3317 ; print PC name, DE=name, HL=VRAM addr IF ENGLISH ELSE LD A,ha ; *J* "wa" OUT (VDPdata),A ENDIF LD DE,D5110 ; "kusuri wo motteimasen / [ANY]" CALL L7F2D ; print message group: DE=messages CALL L31A1 ; delay and wait for joypad button LD HL,3A23H LD BC,050EH CALL L32CE ; erase a rectangle: HL=VRAM address, B=height, C=width JR .0B76 ;----------------------------------------------------------------------- ; === QUIT === .0BF6 CALL L32DD ; clear bottom of screen LD B,05H ; 5 people LD HL,DC010 ; base of character data .0BFE PUSH BC ; save count PUSH HL ; save character pointer EX DE,HL LD HL,3A23H CALL L3317 ; print PC name, DE=name, HL=VRAM addr IF ENGLISH ELSE LD A,no ; *J* OUT (VDPdata),A ENDIF LD DE,D53C1 ; "PASS WORDwo / hyouji shimasuka ? / hai / iie" CALL L7F2D ; print message group: DE=messages LD HL,3A31H CALL L35B4 ; do menu: HL=VRAM address => A=first char of item POP HL PUSH HL ; HL = character pointer IF ENGLISH CP _Y ; YES ELSE CP ha ; *J* hai ENDIF CALL Z,L0D1F ; if YES, generate password: HL=character data CALL L32DD ; clear bottom of screen POP HL ; HL = character pointer LD DE,001DH ADD HL,DE ; HL = HL + 1D (next character) POP BC ; get back count XOR A CP (HL) JR Z,.0C2D ; branch if end of characters (first byte of next char = 00) DJNZ .0BFE ; loop for next character .0C2D LD DE,D5107 ; "GE-MUwo / tsuzukemasuka ? / hai / iie" CALL L7F2D ; print message group: DE=messages LD HL,3A31H CALL L35B4 ; do menu: HL=VRAM address => A=first char of item IF ENGLISH CP _N ; NO ELSE CP i_ ; *J* iie ENDIF IF OPT1 JP Z,L000B ; restart game if NO ELSE JR Z,L0C47 ; restart game if NO ENDIF .0C3D CALL L32DD ; clear bottom of screen LD BC,2000H IF OPT2 JP L7EDB ; delay and return ELSE CALL L7EDB ; delay and return RET ; *** not optimal *** ENDIF IF OPT1 ELSE L0C47 LD HL,L000B ; huh? some crazy way to JP 000BH? PUSH HL RET ENDIF ;----------------------------------------------------------------------- ; === ADD WARRIOR === L0C4C CALL L0E40 PUSH AF CALL L0378 ; initialize VDP LD HL,D5FD0 ; maze chars LD DE,PT+30H*8 LD BC,0008H ; just the up arrow at 30H CALL L7EEF ; copy data to all three pattern tables: HL=data, DE=VRAM addr, BC=length .0C5F CALL L079E ; clear screen CALL L3899 ; B = number of PCs LD A,05H SUB B JR NZ,.0C92 LD DE,D5212 CALL L7F2D ; print message group: DE=messages CALL L31A1 ; delay and wait for joypad button .0C73 CALL L03E0 POP AF CALL L0E5D LD BC,0407H ; reg 7 = 04, background color = dark blue CALL L7F73 ; write VDP register: C=register, B=data LD A,07H LD HL,SAT ; sprite attribute table CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data CALL L395E LD BC,2000H IF OPT2 JP L7EDB ; delay ELSE CALL L7EDB ; delay RET ; *** not optimal *** ENDIF .0C92 CALL L3B46 LD DE,D5217 ; "atarashii namaka wo / kuwaemasuka ? / hai / iie" CALL L7F2D ; print message group: DE=messages LD HL,3A31H CALL L35B4 ; do menu: HL=VRAM address => A=first char of item IF ENGLISH CP _N ; NO ELSE CP 32H ; *J* i_ iie ENDIF JR Z,.0C73 ; YES, make a new one CALL L3B4B CALL L079E ; clear screen CALL L0653 ; "ENTER NAME" menu CALL L079E ; clear screen CALL L05DF ; "ENTER PASSWORD" menu OR A JR NZ,.0C5F LD HL,3889H ; copy 15-byte password from screen LD DE,DC1C7 ; start of save data LD BC,000FH ; 15 chars in password CALL L7F9E ; VRAM read: HL=VRAM address, DE=data, BC=length CALL L0891 ; decode password: DE=data => password at DC19D..DC1AB, NZ=fail JR NZ,.0CEA ; branch if decode error LD HL,DC128 ; current map number (to verify the map location) LD A,(DC1CE) ; DC1C7+7 & 15 = map number AND 0FH CP (HL) JR NZ,.0CEA INC HL ; HL => current column number LD A,(DC1C9) ; DC1C7+2 & 15 = column number AND 0FH CP (HL) JR NZ,.0CEA INC HL ; HL => current row number LD A,(DC1D0) ; DC1C7+9 & 15 = row number AND 0FH CP (HL) JR NZ,.0CEA CALL L0920 ; load save data JR C,.0D0B ; branch if no password error .0CEA CALL L079E ; clear screen LD DE,DC19D ; off-screen buffer for 3D maze LD HL,3A23H CALL L3317 ; print PC name, DE=name, HL=VRAM addr LD DE,D5079 ; "wa kokoni imasen." LD BC,N5079 CALL L7F94 ; print message, DE=message, BC=length LD HL,D49A1 ; "[ANY KEY]" CALL L7F3F ; print message with screen address CALL L7FDB JP .0C5F .0D0B LD HL,DC1B5 LD B,(HL) INC HL LD A,(HL) PUSH AF CALL L1E81 POP AF LD (DC1B6),A CALL L0754 ; copy PC data at DC19D to next available PC slot JP .0C5F ;----------------------------------------------------------------------- ; generate password: HL=character data L0D1F PUSH HL ; save pointer to character data LD BC,000AH ; 10 bytes in name ADD HL,BC ; skip past name EX DE,HL ; DE = chr+0AH LD A,(DE) SUB 56H LD (DC1C7+0DH),A ; PW+0D = chr+0A (head) INC DE INC DE LD HL,DC1C7+04H LD A,(DE) ; chr+0CH (shield) OR A JR Z,.0D37 SUB 66H ; if non-zero, (chr+0C - 66H) / 2 RRCA .0D37 RLD ; PW+04 high = shield INC DE LD A,(DE) ; chr+0DH (armor) OR A JR Z,.0D46 ; branch if no armor (free leather armor?) CP 0FFH JR NZ,.0D44 LD A,79H ; FF -> 79 (magic cloak) .0D44 SUB 74H ; 00..04 or 05 if none .0D46 RLD ; PW+04 low = armor INC DE LD HL,DC1C7+08H LD A,(DE) ; chr+0EH (weapon) OR A JR Z,.0D53 SUB 85H RRCA .0D53 RRD ; PW+8 low = weapon INC DE LD A,(DE) ; chr+0FH (helm) OR A JR Z,.0D5C SUB 0AEH .0D5C RRD ; PW+8 high = helm INC DE LD HL,DC1C7+06H LD A,(DE) ; chr+10h (potion data) AND 8FH ; mask out no-bottle flag and potion count CP 80H LD BC,0000H ; (no potions, no bottle) JR Z,.0D75 ; branch if no bottle LD C,10H ; C=10 CP 05H JR C,.0D74 ; branch if < 5 potions LD A,04H ; convert >= 5 potions to A=4 .0D74 LD B,A ; B = number of potions (0..4) .0D75 LD (HL),B ; PW+6 = number of potions (0..4) INC HL LD (HL),C ; PW+7 = 10H if bottle INC DE LD A,(DE) ; chr+11H = PC money LSB CP 50H JR C,.0D7F ; branch if < 50H (<5GP) XOR A ; else make it zero .0D7F LD (DC1C7+00H),A ; PW+0 =low bits of money INC DE LD A,(DE) ; chr+12H = PC money mid-SB JR C,.0D88 ; branch if LSB was < 50H INC A ; turn that 5-9GP into 10GP DAA .0D88 CP 50H ; branch if < 50H (<500GP) JR C,.0D8E AND 0FH ; mask off high nibble .0D8E LD (DC1C7+0EH),A ; PW+14 = mid-SB of money INC DE LD A,(DE) ; chr+13H = PC money MSB JR C,.0D96 ; branch if mid-SB was < 50H INC A ; turn that 500-900GP into 1000GP (probably should DAA?) .0D96 CP 15H JR C,.0D9C ; branch if < 15000 GP LD A,14H ; cap it at 14999 GP .0D9C LD (DC1C7+0AH),A ; PW+10 = MSB of money INC DE LD HL,DC1C7+0DH LD A,(DE) ; chr+14H = PC bank money LSB CP 50H JR C,.0DA9 ; branch if < 50H XOR A ; else make it zero .0DA9 PUSH AF ; save carry flag OR (HL) ; (really should AND F0H first) LD (HL),A ; PW+13 high = PC bank money LSB POP AF INC DE LD A,(DE) ; chr+15H = PC bank money mid-SB JR C,.0DB3 ; branch if LSB was < 50H INC A ; turn that 5-9GP into 10GP DAA .0DB3 CP 50H JR C,.0DB9 ; branch if mid-SB was < 50H AND 0FH ; mask off high nibble .0DB9 LD (DC1C7+01H),A ; PW+1 = PC bank money mid-SB INC DE LD A,(DE) ; chr+16H = PC bank money MSB JR C,.0DC1 ; branch if mid-SB was < 50H INC A ; turn that 500-900GP into 1000GP (probably should DAA?) .0DC1 CP 4AH JR C,.0DC7 ; branch if < 4AH LD A,49H ; cap MSB at 49H .0DC7 LD (DC1C7+0CH),A ; PW+12 = PC bank money MSB INC DE LD A,(DE) ; chr+17H = ??? LD (DC1C7+0BH),A ; PW+11 = chr+17H INC DE LD A,(DE) ; chr+18H = level CP 10H JR C,.0DD7 ; branch if level < 10H LD A,0FH ; cap at level 15 .0DD7 LD HL,DC1C7+06H RLD ; PW+6 low nibble = level INC DE LD A,(DE) ; chr+19H = life LD (DC1C7+03H),A ; PW+3 = life INC DE INC DE INC DE LD A,(DE) ; chr+1CH = damage LD (DC1C7+05H),A ; PW+5 = damage LD DE,DC128 ; current map number LD HL,DC1C7+07H LD A,(DE) ; get current map number CP 0FFH JR NZ,.0DF5 LD A,07H ; change map FF to map 07 .0DF5 OR (HL) ; PW+7 low nibble = map number LD (HL),A PUSH DE CALL L0E40 ; read something from color table??? CP 50H LD B,A ; B = ??? LD C,00H ; C = 0 JR C,.0E06 ; branch if < 50H SUB 40H LD B,C LD C,A .0E06 POP DE INC DE LD A,(DE) ; get map column number OR B LD (DC1C7+02H),A ; PW+2 = column number INC DE LD A,(DE) ; get map row number OR C LD (DC1C7+09H),A ; PW+9 = row number POP HL ; get back pointer to char data IF EXTRA PUSH HL ENDIF CALL L08AE ; get base code from name checksum: HL=name => HL=80-byte code table LD B,15 ; 15 bytes of code LD DE,DC1C7 ; start of save data .0E1C PUSH BC PUSH HL LD B,00H LD A,(DE) SUB 80-1 NEG ; A = 80 - (DE) LD C,A ADD HL,BC ; HL = HL + 80 - (DE) LDI ; put code byte back in (DE) POP HL POP BC DJNZ .0E1C ; loop for next character of code CALL L32DD ; clear bottom of screen IF EXTRA POP DE LD HL,3A23H CALL L3317 ; print PC name, DE=name, HL=VRAM addr ENDIF LD HL,DC1C7 ; start of save data LD DE,3A63H LD BC,15 ; put 15 bytes of code on screen CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length IF OPT2 JP L31A1 ; delay and wait for joypad button ELSE CALL L31A1 ; delay and wait for joypad button RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L0E40 LD HL,CT+34H*8 CALL L7FAD ; read one byte from VDP: HL=VRAM address => A=data LD BC,N0E55 LD HL,D0E55 CPIR INC BC LD A,C RLCA RLCA RLCA RLCA RET D0E55 DB 14H,0F2H,72H,0C2H,0D2H,92H,0B2H,42H N0E55 EQU $-D0E55 ; 14=black on blue ; F2=white on green ; 72=cyan on green ; C2=dk green on green ; D2=purple on green ; 92=orange on green ; B2=tan on green ; 42=dk blue on green ;----------------------------------------------------------------------- L0E5D CP 80H JR NZ,.0E65 IF OPT2 JP L3B7C ELSE CALL L3B7C RET ; *** not optimal *** ENDIF .0E65 CP 10H RET Z LD HL,D690A-3 LD BC,0003H .0E6E SUB 10H JR Z,.0E75 ADD HL,BC JR .0E6E .0E75 LD DE,CT+31H*8 ; color table LD A,02H IF OPT2 JP L3AF6 ; load color table: HL=data, DE=VRAM address, A=number of times ELSE CALL L3AF6 ; load color table: HL=data, DE=VRAM address, A=number of times RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- IF LOCATOR DIRS DB _N,_E,_S,_W L0E7E LD HL,NT CALL L7FCA ; set VRAM write address LD HL,DC128 ; map position LD A,(HL) ; map number INC HL CP 0FFH JR NZ,.10 LD A,7 .10 OUT (VDPdata),A LD A,(HL) ; column number INC HL ADD A,_A OUT (VDPdata),A LD A,(HL) ; row number INC HL ADD A,_A OUT (VDPdata),A LD A,(HL) ; facing LD HL,DIRS-1 ADD A,L LD L,A JR NC,.20 INC H .20 LD A,(HL) OUT (VDPdata),A ;DC12B EQU DC128+3 ; 1,A current facing direction 01=N 02=E 03=S 04=W CALL L3357 ; A=room name index if carry set ELSE L0E7E CALL L3357 ; A=room name index if carry set ENDIF JR NC,.0E8B CP 22H ; >= 22H is color walls / black tower IF OPT1 JR NC,.0E8B ; branch if color wall / black tower ELSE JP NC,.0E8B ; branch if color wall / black tower ENDIF CALL L33EF ; print room label: A=label index (or 00 if "well in front of you") .0E8B LD A,(DC00A) ; joypad direction LD HL,D0F01 ; direction table: up, right, down, left LD BC,0004H CPIR LD HL,DC139 JR Z,.0E9E ; branch if direction found LD (HL),00H ; clear last direction at DC139 RET .0E9E CP (HL) ; check if same direction as before in DC139 LD (HL),A ; update last direction at DC139 INC HL ; HL => repeat timer at DC13A LD A,1CH ; A = new delay value JR NZ,.0EA9 ; branch if new direction DEC (HL) ; decrement repeat timer at DC13A RET NZ ; return if same direction and timer not expired LD A,14H ; A = repeat delay value .0EA9 LD (HL),A ; update repeat timer at DC13A DEC HL ; HL => last direction at DC139 PUSH HL CALL L32DD ; clear bottom of screen POP HL LD A,(HL) ; get last direction LD HL,DC12B ; HL => current facing direction at DC12B CP 03H ; right JR C,.0EC1 ; 01=up JR Z,.0EEA ; 03=right CP 07H ; left IF OPT1 JR C,.0EE9 ; 05=down ELSE JP C,.0EE9 ; 05=down ENDIF JR .0EE0 ; 07=left ; 01=up (forward) .0EC1 CALL L0F05 CALL L3357 ; A=room name index if carry set CP 21H ; "stairs" JR Z,.0EF3 LD A,(DC128) ; current map number OR A JR NZ,.0EF3 ; branch if not map 00 BIT 1,(IY) JR Z,.0EF3 ; branch if flag not set RES 1,(IY) CALL L39BA JR .0EF3 ; 07=left (turn left) .0EE0 DEC (HL) ; decrement facing direction IF OPT1 JR NZ,.0EF3 ELSE JP NZ,.0EF3 ENDIF LD (HL),04H ; if facing direction becomes zero, make it 04 IF OPT1 JR .0EF3 ELSE JP .0EF3 ENDIF ; 05=down (turn around) .0EE9 INC (HL) ; increment facing direction twice ; 03=right (turn right) .0EEA INC (HL) ; increment facing direction once to turn right LD A,(HL) CP 05H JR C,.0EF3 ; branch if < 5 SUB 04H ; otherwise subtract 4 to keep it in the 1..4 range LD (HL),A .0EF3 BIT 2,(IY) JP NZ,L1048 CALL L299A CALL L17B6 ; CAN NOT JUMP TO THIS (it might pop the return address!) RET D0F01 DB 01H,03H,05H,07H ; up right down left ;----------------------------------------------------------------------- L0F05 CALL L3357 ; A=room name index if carry set JR NC,.0F2D CP 21H ; "stairs" RES 1,(IY) JR NZ,.0F16 ; SET 1,(IY) .0F16 CP 24H ; color walls JR C,.0F3E ; branch if < 24H PUSH AF CALL L2AB5 ; erase maze area POP AF CALL L10A5 CALL L33EF ; print room label: A=label index (or 00 if "well in front of you") CALL L31A1 ; delay and wait for joypad button CALL L32DD ; clear bottom of screen JR .0F3E .0F2D LD A,(DC128) ; current map number OR A JR NZ,.0F3A BIT 1,(IY) CALL NZ,L39BA .0F3A RES 1,(IY) .0F3E LD A,(DC128) ; current map number CP 06H ; color walls level JR NZ,L0F83 LD DE,D0F6B ; specials table LD C,06H L0F4A LD B,03H LD HL,DC129 ; current column number in map .0F4F LD A,(DE) CP (HL) ; compare column number JR NZ,L0F7D ; branch if no match INC HL INC DE DJNZ .0F4F LD A,(DC136) CP 0E6H JR NZ,L0FC1 ; if color combination not broken, then bump into tower LD HL,D691C ; 31-33 = 72 / 34-3A = 42 LD DE,CT+31H*8 ; color table LD A,02H CALL L3AF6 ; load color table: HL=data, DE=VRAM address, A=number of times JR L0FAE ; map 06 special: column, row, facing D0F6B DB 08H,0AH,01H DB 09H,0AH,01H DB 05H,06H,02H DB 05H,09H,02H DB 07H,05H,03H DB 0AH,06H,04H ;----------------------------------------------------------------------- L0F7D INC DE DJNZ L0F7D DEC C JR NZ,L0F4A L0F83 CALL L3390 RET C LD HL,(DC12C) ; current map location CALL L3AE7 ; A=map data at (HL), HL=square data address LD A,(DC12B) ; current facing direction CP 02H JR C,.0F9D ; =01 JR Z,.0F9C ; =02 CP 04H JR C,.0F9B ; =03 INC HL ; =04 .0F9B INC HL .0F9C INC HL .0F9D RES 2,(IY) BIT 2,(HL) ; if 04H bit set JR NZ,L0FC1 ; then bump into tower BIT 3,(HL) ; if 08H bit set JR NZ,L0FC7 ; then it's an ordinary wall BIT 6,(HL) ; if 40H bit set IF OPT1 JR NZ,L101C ELSE JP NZ,L101C ENDIF L0FAE LD A,(DC12B) ; current facing direction LD HL,DC129 ; current column number in map CP 02H JR C,L0FDA ; =01 JR Z,L0FEF ; =02 CP 04H JR C,L0FFE ; =03 IF OPT1 JR L100E ELSE JP L100E ENDIF ;----------------------------------------------------------------------- L0FC1 LD A,82H ; sound 82H = bump into tower LD (DC2D0),A HALT L0FC7 LD HL,D4AAA ; "susumemasen!" CALL L7F3F ; print message with screen address CALL L31AF ; message speed delay IF ENGLISH LD HL,3A2FH LD BC,0111H ELSE LD HL,3A31H LD BC,0107H ENDIF IF OPT1 JP L32CE ; erase a rectangle: HL=VRAM address, B=height, C=width ELSE CALL L32CE ; erase a rectangle: HL=VRAM address, B=height, C=width RET ; *** not optimal *** ENDIF ; dir=01 L0FDA INC HL DEC (HL) LD DE,-16 JP P,L0FE7 LD (HL),0FH LD DE,-16+256 L0FE7 LD HL,(DC12C) ; current map location ADD HL,DE ; add offset LD (DC12C),HL ; current map location RET ; dir=02 L0FEF INC (HL) BIT 4,(HL) LD DE,+1 JR Z,L0FE7 LD (HL),00H LD DE,+1-16 JR L0FE7 ; dir=03 L0FFE INC HL INC (HL) BIT 4,(HL) LD DE,+16 JR Z,L0FE7 LD (HL),00H LD DE,+16-256 JR L0FE7 ; dir=04 L100E DEC (HL) LD DE,-1 JP P,L0FE7 LD (HL),0FH LD DE,-1+16 JR L0FE7 L101C LD A,(DC128) ; current map number OR A IF OPT1 JR NZ,L0FAE CALL L3357 ; A=room name index if carry set JR NC,L0FAE ELSE JP NZ,L0FAE ; *** not optimal *** CALL L3357 ; A=room name index if carry set JP NC,L0FAE ENDIF LD HL,D105A LD BC,N105A CPIR JP NZ,L0FAE SET 2,(IY) LD HL,DC13B LD (HL),C INC HL LD DE,DC129 ; current column number in map EX DE,HL LD C,05H LDIR JP L0FAE L1048 LD A,(DC13B) ADD A,A LD C,A LD HL,D1063 ADD HL,BC LD A,(HL) INC HL LD H,(HL) LD L,A LD DE,L1075 ; "thank you" on exit PUSH DE JP (HL) D105A DB 02H, 0BH, 0CH, 0DH, 15H, 16H, 17H, 18H, 19H N105A EQU $-D105A D1063 DW L1686,L1632,L15B3,L1564,L14F4,L13E8,L130A,L1212,L10F5 ; 02/1686=tailor 0B/1632=helms 0C/15B3=weapons 0D/1564=armor ; 15/14F4=shields 16/13E8=herablist 17/130A=exam 18/1212=healer 19/10F5=bank ; "thank you" on exit L1075 RES 2,(IY) CALL L32DD ; clear bottom of screen LD HL,D4B93 ; "doumo arigatou gozaimashita." CALL L7F3F ; print message with screen address CALL L31AF ; message speed delay CALL L32DD ; clear bottom of screen LD HL,DC13C LD DE,DC129 ; current column number in map LD BC,0005H LDIR LD HL,3B66H LD A,01H CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data LD HL,3B6AH CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data IF OPT1 JP L2ABF ELSE CALL L2ABF RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- ; update color wall status: A=current wall L10A5 LD HL,DC136 ; HL = current color wall status PUSH AF LD A,(HL) CP 0E6H JR Z,.10C3 ; branch if combination already broken POP AF PUSH AF ADD A,(HL) ; add current color to status LD HL,D10E3 ; look for new status in table LD BC,N10E3 CPIR JR Z,.10BC ; branch if new status found XOR A ; else reset it to zero (should this be FF?) .10BC LD (DC136),A CP 0E6H JR NZ,.10C9 ; branch if combination not broken .10C3 LD A,84H LD (DC2D0),A ; play music HALT .10C9 POP AF PUSH AF SUB 24H ADD A,A LD D,00H LD E,A LD HL,D10E9 ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A LD DE,CT+31H*8 ; color table LD A,02H CALL L3AF6 ; load color table: HL=data, DE=VRAM address, A=number of times POP AF RET ; differences = 24,26,27,28,24,29 - Y P G B Y W or R P G B Y W (first time only) D10E3 DB 24H,4AH,71H,99H,0BDH,0E6H N10E3 EQU $-D10E3 ; yellow,red,purple,green,blue, white D10E9 DW D690A,D690D,D6910,D6913,D6916,D6919 ;----------------------------------------------------------------------- ; 19/10F5=bank L10F5 LD HL,D55E6 ; head and body LD DE,D5135 ; "suitougakarino TRY PENDRAGONdesu." etc. CALL L1693 ; set up initial store screen .10FE CALL L3B46 CALL L32DD ; clear bottom of screen LD DE,D513C ; "donatawo otetsudai / shimashouka ?" CALL L7F2D ; print message group: DE=messages CALL L32B1 ; print PC name menu LD HL,D503E ; "cancel" LD BC,N503E CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length LD HL,3A31H LD A,30H CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data CALL L35B4 ; do menu: HL=VRAM address => A=first char of item IF ENGLISH CP _dash ; -CANCEL- ELSE CP mi ; *J* mi of "minai" in D503E ENDIF RET Z CALL L3346 ; find line number in PC name menu LD HL,DC010-001DH LD DE,001DH .112D ADD HL,DE DJNZ .112D LD (DC146),HL .1133 CALL L3B46 CALL L32DD ; clear bottom of screen LD DE,D5141 ; "DEPOSIT / WITHDRAW / LEAVE" CALL L7F2D ; print message group: DE=messages LD HL,3A45H CALL L35B4 ; do menu: HL=VRAM address => A=first char of item PUSH AF CALL L3B4B CALL L32DD ; clear bottom of screen POP AF CP _L ; *J* L LEAVE JR Z,.10FE PUSH AF LD DE,(DC146) LD HL,3A23H CALL L3317 ; print PC name, DE=name, HL=VRAM addr LD BC,N4CB4 POP AF CP _L ; *J* LEAVE JR NC,.1166 ; B=hundreds C=tens A=ones LD HL,DC1B9 RRD INC HL LD A,C RRD LD A,B RRD POP BC .1283 LD HL,DC148 INC (HL) PUSH BC LD DE,DC1BC LD HL,DC1B9 LD B,03H CALL L352D ; BCD add: (HL)=(HL)+DE, B=length in bytes LD DE,DC143 LD HL,DC1B9 LD B,03H CALL L3537 ; BCD subtract: (HL)=(HL)-(DE), B=length in bytes POP BC JR C,.12A8 DJNZ .1283 LD HL,DC1BC JR .12AF .12A8 LD HL,(DC146) LD DE,0011H ADD HL,DE .12AF LD DE,DC143 LD BC,0003H LDIR LD HL,(DC146) IF ENGLISH LD DE,3A22H ELSE LD DE,3A23H ENDIF EX DE,HL CALL L3317 ; print PC name, DE=name, HL=VRAM addr LD DE,D515D ; "chiryouniwa / G.P.kakarimasu. / yoroshiidesuka ? / hai / iie" CALL L7F2D ; print message group: DE=messages LD HL,DC145 IF ENGLISH LD DE,3A62H ELSE LD DE,3A63H ENDIF CALL L32E7 ; print 3-byte BCD number at (HL): HL=last/high byte of number, DE=VRAM addr LD HL,3A31H CALL L35B4 ; do menu: HL=VRAM address => A=first char of item PUSH AF CALL L32DD ; clear bottom of screen POP AF IF ENGLISH CP _N ; NO ELSE CP i_ ; *J* iie ENDIF JP Z,.1237 ; if no, go to next PC LD HL,(DC146) LD DE,0011H ; offset to PC money ADD HL,DE EX DE,HL LD HL,DC143 LD B,03H CALL L3537 ; BCD subtract: (HL)=(HL)-(DE), B=length in bytes LD A,(DC148) LD HL,(DC146) LD DE,001CH ; offset to PC damage? ADD HL,DE SUB (HL) NEG ; A = (HL) - A LD (HL),A ; damage = damage - A POP BC PUSH BC LD A,06H SUB B LD B,A CALL L364E JP .1237 ; go to next PC ;----------------------------------------------------------------------- ; 17/130A=exam L130A LD HL,D55E8 ; head and body LD DE,D5168 ; "watashiwa SLEA ishyadesu. CALL L1693 ; set up initial store screen .1313 CALL L32DD ; clear bottom of screen LD DE,D516D ; "dare wo / miteagemashouka ?" CALL L7F2D ; print message group: DE=messages CALL L32B1 ; print PC name menu LD HL,D503E ; "cancel" LD BC,N503E CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length LD HL,3A31H LD A,30H CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data CALL L35B4 ; do menu: HL=VRAM address => A=first char of item PUSH AF CALL L32DD ; clear bottom of screen POP AF IF ENGLISH CP _dash ; -CANCEL- ELSE CP mi ; *J* minai at D503E ENDIF RET Z ; return if cancel LD DE,DC143 XOR A LD B,03H .1341 LD (DE),A INC DE DJNZ .1341 CALL L3346 ; find line number in PC name menu LD HL,DC010-001DH ; find address of character data LD DE,001DH ; 1DH bytes per character .134E ADD HL,DE DJNZ .134E LD (DC146),HL ; DC146 = current character LD DE,3A23H LD BC,000AH ; 10 = length of character name CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length LD HL,000EH ; (DE = next data after name, add 000EH to DE) ADD HL,DE LD B,(HL) .1362 PUSH BC LD A,60H LD B,03H LD HL,DC143 CALL L7ED1 ; add BCD number in A to BCD number at (HL), length B LD A,01H LD B,02H LD HL,DC144 CALL L7ED1 ; add BCD number in A to BCD number at (HL), length B POP BC DJNZ .1362 LD HL,DC145 LD DE,3A63H CALL L32E7 ; print 3-byte BCD number at (HL): HL=last/high byte of number, DE=VRAM addr LD DE,D5172 ; "kensainiwa / G.P. / hitsuyoudesuka. / yoroshiidesuka ? / hai / iie" CALL L7F2D ; print message group: DE=messages LD HL,3A31H CALL L35B4 ; do menu: HL=VRAM address => A=first char of item IF ENGLISH CP _N ; NO ELSE CP i_ ; *J* iie ENDIF JR Z,.1313 CALL L32DD ; clear bottom of screen LD HL,(DC146) LD DE,0013H ADD HL,DE LD DE,DC145 CALL L345F ; BCD compare: (DE)-(HL), BC=length INC B DEC B JR Z,.13A9 JR NC,.13DB .13A9 LD HL,(DC146) LD DE,0011H ADD HL,DE LD DE,DC143 EX DE,HL LD B,03H CALL L3537 ; BCD subtract: (HL)=(HL)-(DE), B=length in bytes LD DE,D517F ; "LVL = / LIFE= / STR = / DEX =" CALL L7F2D ; print message group: DE=messages LD HL,(DC146) LD DE,0018H ; offset to PC level? ADD HL,DE LD DE,3A49H EX DE,HL ; HL=VRAM address, DE=PC level LD B,04H .13CC PUSH BC LD A,(DE) CALL L3B58 ; print decimal number: HL=VRAM address, A=number LD BC,0020H ADD HL,BC ; VRAM address down one line INC DE POP BC DJNZ .13CC JR .13E2 .13DB LD DE,(DC146) CALL L355E ; PC-name san not enough money [ANY]: DE=name .13E2 CALL L31A1 ; delay and wait for joypad button JP .1313 ;----------------------------------------------------------------------- ; 16/13E8=herablist L13E8 LD HL,D55EA LD DE,D5188 ; "watashi PANDORA / yakuzaishiyo." etc. LD A,02H ; selling item 02 first (bottle?) CALL L1690 ; set up initial store screen: A=item number LD HL,D1424 ; bottle price LD DE,DC143 LD BC,0003H ; copy 3 bytes of bottle price to DC143..DC145 LDIR DEC DE ; DE = last byte of price LD HL,D1427 ; "youki" (REDUNDANT: HL already equals D1427 here!) L1402 PUSH DE PUSH HL CALL L32DD ; clear bottom of screen POP HL POP DE CALL L3577 ; " wa ###": HL=name, DE=last byte of BCD price LD DE,D51E7 ; "G.P.desu. / okaiageninarimasuka ? / NEXT ITEM / kau / misewo deru" CALL L7F2D ; print message group: DE=messages LD HL,3A31H CALL L35B4 ; do menu: HL=VRAM address => A=first char of item PUSH AF CALL L32DD ; clear bottom of screen POP AF IF ENGLISH CP _B JR Z,L1465 ; B = BUY CP _N JR Z,L142B ; N = NEXT, else L = LEAVE ELSE CP ka ; *J* JR C,L142B ; < ka NEXT JR Z,L1465 ; = ka kau ; return if > ka (misewo deru) ENDIF RET D1424 DB 50H,03H,00H ; 00035.0 GP IF ENGLISH D1427 ASCIIC _B,_O,_T,_T,_L,_E ELSE D1427 ASCIIC yo,u_,ki ; "youki" *J* ENDIF ; next item L142B LD HL,DC146 ; item number (XOR 01H would have been simpler) DEC (HL) ; 2->1 JR NZ,L1433 LD (HL),02H ; 1->2 L1433 LD A,(DC146) DEC A ADD A,A ; A = A * 2 ADD A,A ; A = A * 4 LD E,A LD D,00H ; DE = A * 4 LD HL,D1456 ADD HL,DE ; HL = D1456 + A*4 LD A,(HL) INC HL PUSH HL LD H,(HL) LD L,A ; HL = (HL) LD DE,DC143 LD BC,0003H LDIR ; copy 3 bytes of BCD price to DC143..DC145 DEC DE POP HL INC HL LD A,(HL) ; HL = (HL+2) INC HL LD H,(HL) LD L,A JR L1402 ; go back to print item name D1456 DW D145E,D1461 ; 55 GP / kusuri DW D1424,D1427 ; 35 GP / youki D145E DB 50H,05H,00H ; 00055.0 GP IF ENGLISH D1461 ASCIIC _P,_O,_T,_I,_O,_N ELSE D1461 ASCIIC ku,su,ri ; "kusuri" *J* ENDIF ; buy bottle/potion L1465 CALL L16DA ; do "who will buy?" menu JR Z,L1433 CALL L16E9 ; check for enough money: => HL/DC147=PC data, OK if Z or C set JR Z,.1476 JR C,.1476 CALL L1706 ; DC147 does not have enough money JR L1433 IF OPT1 .1476 ELSE .1476 CALL L35A1 ; print "who will take?" menu (redundant!) ENDIF CALL L1711 ; do "who will take?" menu JR Z,L1433 ; go back to purchase menu if cancel CALL L171F ; B=player number => HL/DC149=PC data pointer LD DE,0010H ; offset to potion byte ADD HL,DE LD A,(DC146) ; get item number CP 01H ; branch if 01 (potion) JR Z,.14A4 BIT 7,(HL) ; test no-bottle flag RES 7,(HL) ; reset no-bottle flag JR Z,.14E2 .1492 LD HL,(DC147) ; get current player LD DE,0011H ADD HL,DE ; HL = money in PC data? LD DE,DC143 ; DE = item price EX DE,HL LD B,03H ; 3 bytes of BCD data CALL L3537 ; BCD subtract: (HL)=(HL)-(DE), B=length in bytes JR L1433 ; buying a potion .14A4 BIT 7,(HL) ; test no-bottle flag JR Z,.14BA ; branch if has bottle SBC HL,DE ; unsubtract potion byte offset EX DE,HL LD HL,3A23H CALL L3317 ; print PC name, DE=name, HL=VRAM addr IF ENGLISH ELSE LD A,ha ; *J* OUT (VDPdata),A ENDIF LD DE,D5196 ; "youkiwo motteimasen." (has no bottle) JR .14D9 .14BA LD A,(HL) ; get current dose count AND 0FH CP 05H JR Z,.14C4 ; full if dose count = 5 INC (HL) ; increment dose count JR .1492 ; deduct money and continue .14C4 SBC HL,DE EX DE,HL LD HL,3A23H CALL L3317 ; print PC name, DE=name, HL=VRAM addr LD DE,D4EC2 ; "no youki ni wa" LD BC,N4EC2 CALL L7F94 ; print message, DE=message, BC=length LD DE,D5191 ; "mou hairimasen." .14D9 CALL L7F2D ; print message group: DE=messages CALL L31A1 ; delay and wait for joypad button JP L1433 .14E2 SBC HL,DE EX DE,HL LD HL,3A23H CALL L3317 ; print PC name, DE=name, HL=VRAM addr IF ENGLISH ELSE LD A,ha ; *J* OUT (VDPdata),A ENDIF LD DE,D519B ; "sudeniyoukiwo motteimasu" JR .14D9 ;----------------------------------------------------------------------- ; 15/14F4=shields L14F4 LD HL,D55EC ; head and body LD DE,D51A0 ; "HROLF BATTERSHIELD" etc. LD A,03H CALL L1690 ; set up initial store screen: A=item number: A=item number .14FF LD HL,D598D CALL L16BD ; ###GP / NEXT / BUY / LEAVE IF ENGLISH CP _B JR Z,.1514 ; B = BUY CP _N JR Z,.150A ; N = NEXT, else L = LEAVE ELSE JR C,.150A ; < ka NEXT JR Z,.1514 ; = ka BUY ; return if > ka ENDIF RET .150A LD HL,DC146 DEC (HL) JR NZ,.14FF LD (HL),03H JR .14FF .1514 CALL L16DA ; do "who will buy?" menu JR Z,.14FF CALL L16E9 ; check for enough money: => HL/DC147=PC data, OK if Z or C set JR Z,.1525 JR C,.1525 CALL L1706 ; DC147 does not have enough money JR .14FF .1525 CALL L1711 ; do "who will take?" menu JR Z,.14FF CALL L171F ; B=player number => HL/DC149=PC data pointer LD E,0EH ADD HL,DE LD A,(HL) CP 8FH JR Z,.1539 CP 93H JR C,.1551 .1539 LD DE,D51AB ; "WEAPONwo tebanashimasuka ?" etc. (can't use single-handed) CALL L1780 ; yes/no: DE=messages => Z=no NZ=yes JR Z,.14FF LD DE,000EH CALL L1791 ; A,DE=??? => DE=screen address of PC graphic LD HL,D1562 DEC DE LD BC,0201H CALL L7F1E ; put rectangular data on screen: B=height, C=width, DE=VRAM addr, HL=data .1551 LD HL,(DC149) LD BC,D59A0 LD DE,000CH CALL L172F CALL L1753 JR .14FF D1562 DB 25H,60H ; two rows x one char (blank + xya?) ;----------------------------------------------------------------------- ; 0D/1564=armor L1564 LD HL,D55EE ; head and body LD DE,D51B6 ; "BLICK ARMSTRONG" etc. LD A,05H CALL L1690 ; set up initial store screen: A=item number: A=item number .156F LD HL,D59BE CALL L16BD ; ###GP / NEXT / BUY / LEAVE IF ENGLISH CP _B JR Z,.1584 ; B = BUY CP _N JR Z,.157A ; N = NEXT, else L = LEAVE ELSE JR C,.157A ; < ka NEXT JR Z,.1584 ; = ka BUY ; return if > ka ENDIF RET .157A LD HL,DC146 DEC (HL) JR NZ,.156F LD (HL),05H JR .156F .1584 CALL L16DA ; do "who will buy?" menu JR Z,.156F CALL L16E9 ; check for enough money: => HL/DC147=PC data, OK if Z or C set JR Z,.1595 JR C,.1595 CALL L1706 ; DC147 does not have enough money JR .156F .1595 CALL L1711 ; do "who will take?" menu JR Z,.156F CALL L171F ; B=player number => HL/DC149=PC data pointer LD E,0DH LD BC,D59DD CALL L172F CALL L1753 LD HL,(DC149) LD DE,0010H ADD HL,DE RES 6,(HL) JR .156F ;----------------------------------------------------------------------- ; 0C/15B3=weapons L15B3 LD HL,D55F0 ; head and body LD DE,D51BD ; "irasshaimase. / DARNOC buki senmonde gozaimasu. / [ANY KEY]" LD A,09H CALL L1690 ; set up initial store screen: A=item number: A=item number L15BE LD HL,D5A0D CALL L16BD ; ###GP / NEXT / BUY / LEAVE IF ENGLISH CP _B JR Z,.15D3 ; B = BUY CP _N JR Z,.15C9 ; N = NEXT, else L = LEAVE ELSE JR C,.15C9 ; < ka NEXT JR Z,.15D3 ; = ka BUY ; return if > ka ENDIF RET .15C9 LD HL,DC146 DEC (HL) JR NZ,L15BE LD (HL),09H JR L15BE .15D3 CALL L16DA ; do "who will buy?" menu JR Z,L15BE CALL L16E9 ; check for enough money: => HL/DC147=PC data, OK if Z or C set JR Z,.15E4 JR C,.15E4 CALL L1706 ; DC147 does not have enough money JR L15BE .15E4 CALL L1711 ; do "who will take?" menu JR Z,L15BE CALL L171F ; B=player number => HL/DC149=PC data pointer LD E,0CH ADD HL,DE LD A,(DC146) CP 05H JR NC,.1616 CP 03H JR Z,.1616 XOR A CP (HL) JR Z,.1616 LD DE,D51C4 ; "SHIELDwo tebanashimasuka ?" etc. (weapon is two-handed) CALL L1780 ; yes/no: DE=messages => Z=no NZ=yes JR Z,L15BE ; go back to shop menu if no LD DE,000CH CALL L1791 ; A,DE=??? => DE=screen address of PC graphic LD HL,D1630 INC DE LD BC,0201H CALL L7F1E ; put rectangular data on screen: B=height, C=width, DE=VRAM addr, HL=data .1616 LD BC,D5A44 LD DE,000EH LD HL,(DC149) CALL L172F CALL L1753 LD HL,(DC149) LD DE,0010H ADD HL,DE RES 5,(HL) JR L15BE D1630 DB 25H,63H ; two rows x one char (blank + arm?) ;----------------------------------------------------------------------- ; 0B/1632=helms L1632 SET 1,(IY) LD HL,D55F2 ; head and body LD DE,D51CF ; "irasshai. / NIELS HJELMERSSON to moushimasu. / [ANY KEY]" LD A,03H CALL L1690 ; set up initial store screen: A=item number CALL L39BF .1644 LD HL,D5A8D CALL L16BD ; ###GP / NEXT / BUY / LEAVE IF ENGLISH CP _B JR Z,.1660 ; B = BUY CP _N JR Z,.1656 ; N = NEXT, else L = LEAVE ELSE JR C,.1656 ; < ka NEXT JR Z,.1660 ; = ka BUY ; return if > ka ENDIF RES 1,(IY) IF OPT1 JP L39BA ELSE CALL L39BA RET ; *** not optimal *** ENDIF .1656 LD HL,DC146 DEC (HL) JR NZ,.1644 LD (HL),03H JR .1644 .1660 CALL L16DA ; do "who will buy?" menu JR Z,.1644 CALL L16E9 ; check for enough money: => HL/DC147=PC data, OK if Z or C set JR Z,.1671 JR C,.1671 CALL L1706 ; DC147 does not have enough money JR .1644 .1671 CALL L1711 ; do "who will take?" menu JR Z,.1644 CALL L171F ; B=player number => HL/DC149=PC data pointer LD E,0FH LD BC,D5AA0 CALL L172F CALL L1753 JR .1644 ;----------------------------------------------------------------------- ; 02/1686=tailor L1686 LD HL,D55F4 ; head and body LD DE,D51D6 ; "makotoni sumimasen. / misewa tsuburete shimaimashita. / [ANY KEY]" IF OPT1 JR L1693 ; set up initial store screen ELSE CALL L1693 ; set up initial store screen RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- ; set up initial store screen: A=item number L1690 LD (DC146),A ; save initial item number ; set up initial store screen L1693 PUSH DE LD DE,DC19D ; off-screen buffer LD BC,N55F4 ; =0002H - would LDI/LDI have been better here? LDIR EX DE,HL ; HL=buffer LD C,04H ; B already = 00 XOR A ; fill with nulls? CALL L7EE5 ; fill memory: HL=address, BC=length, A=fill byte LD DE,DC19D ; off-screen buffer CALL L3772 CALL L2AB5 ; erase maze area LD DE,3955H LD HL,3B66H CALL L3876 POP DE CALL L7F2D ; print message group: DE=messages IF OPT1 JP L31A1 ; delay and wait for joypad button ELSE CALL L31A1 ; delay and wait for joypad button RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- ; ###GP / NEXT / BUY / LEAVE L16BD PUSH HL CALL L32DD ; clear bottom of screen LD DE,D51E7 ; "G.P.desu. / okaiageninarimasuka ? / NEXT ITEM / kau / misewo deru" CALL L7F2D ; print message group: DE=messages POP HL LD BC,DC143 LD A,(DC146) CALL L360D LD HL,3A31H IF ENGLISH JP L35B4 ; do menu: HL=VRAM address => A=first char of item ; compares done on return ELSE CALL L35B4 ; do menu: HL=VRAM address => A=first char of item CP ka ; *J* ka kau RET ENDIF ;----------------------------------------------------------------------- ; do "who will buy?" menu L16DA CALL L32DD ; clear bottom of screen CALL L358E ; print "who will buy?" menu LD HL,3A31H CALL L35B4 ; do menu: HL=VRAM address => A=first char of item IF ENGLISH CP _dash ; -CANCEL- (fortunately only checked for Z/NZ) ELSE CP ka ; *J* kawanai ENDIF RET ;----------------------------------------------------------------------- ; check for enough money: => HL/DC147=PC data, OK if Z or C set L16E9 CALL L3346 ; find line number in PC name menu LD HL,DC010-001DH LD DE,001DH .16F2 ADD HL,DE DJNZ .16F2 LD (DC147),HL LD E,13H ADD HL,DE LD DE,DC145 LD B,03H CALL L345F ; BCD compare: (DE)-(HL), BC=length INC B DEC B RET ;----------------------------------------------------------------------- ; DC147 does not have enough money L1706 LD DE,(DC147) CALL L355E ; PC-name san not enough money [ANY]: DE=name IF OPT1 JP L31A1 ; delay and wait for joypad button ELSE CALL L31A1 ; delay and wait for joypad button RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- ; do "who will take?" menu L1711 CALL L35A1 ; print "who will take?" menu CALL L35B7 ; do menu: HL=VRAM address => A=first char of item PUSH AF CALL L32DD ; clear bottom of screen POP AF IF ENGLISH CP _dash ; -CANCEL- ELSE CP tsu ; *J* tsukawanai ENDIF RET ;----------------------------------------------------------------------- ; B=player number => HL/DC149=PC data pointer L171F CALL L3346 ; find line number in PC name menu LD HL,DC010-001DH LD DE,001DH .1728 ADD HL,DE DJNZ .1728 LD (DC149),HL RET ;----------------------------------------------------------------------- L172F ADD HL,DE PUSH HL PUSH BC ; HL = BC POP HL LD A,(DC146) SUB (HL) NEG INC HL LD C,A ADD A,(HL) INC HL LD B,(HL) .173E ADD A,C DJNZ .173E SUB C POP HL LD (HL),A PUSH AF CALL L17A5 ; HL=PC data pointer => B=player index (0..5) LD HL,37C2H LD DE,0060H .174E ADD HL,DE DJNZ .174E POP AF RET ;----------------------------------------------------------------------- L1753 PUSH HL LD HL,(DC149) LD DE,000AH ADD HL,DE EX DE,HL CALL L3772 CALL L3346 ; find line number in PC name menu LD HL,3AF2H LD DE,0010H .1768 ADD HL,DE DJNZ .1768 POP DE CALL L3876 LD HL,(DC147) LD DE,0011H ADD HL,DE LD DE,DC143 EX DE,HL LD B,03H IF OPT1 JP L3537 ; BCD subtract: (HL)=(HL)-(DE), B=length in bytes ELSE CALL L3537 ; BCD subtract: (HL)=(HL)-(DE), B=length in bytes RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- ; yes/no: DE=messages => Z=no NZ=yes L1780 CALL L7F2D ; print message group: DE=messages LD HL,3A31H CALL L35B4 ; do menu: HL=VRAM address => A=first char of item PUSH AF CALL L32DD ; clear bottom of screen POP AF IF ENGLISH CP _N ; NO ELSE CP i_ ; *J* iie ENDIF RET ;----------------------------------------------------------------------- ; A,DE=??? => DE=screen address of PC graphic L1791 LD HL,(DC149) ADD HL,DE LD (HL),00H CALL L17A5 ; HL=PC data pointer => B=player index (0..5) LD HL,3823H-0060H LD DE,0060H .17A0 ADD HL,DE DJNZ .17A0 EX DE,HL ; DE=screen address of PC graphic RET ;----------------------------------------------------------------------- ; HL=PC data pointer => B=player index (0..5) L17A5 LD HL,(DC149) LD DE,DC010 XOR A LD B,A .17AD INC B SBC HL,DE RET Z LD DE,001DH JR .17AD ;----------------------------------------------------------------------- ; do NOT jump to this instead of JSR! L17B6 BIT 3,(IY) ; test if kraken needed? JR Z,.17CB ; branch if not RES 3,(IY) ; clear "kraken needed" flag SET 0,(IY) ; set "kraken met" flag (again?) CALL L19E3 ; "something's coming!" LD A,1CH ; A=kraken? JR .1814 .17CB LD A,(DC128) ; current map number OR A JR NZ,.17E8 LD HL,D583D CALL L1958 LD C,0DH JR NZ,.17DD .17DB LD C,05H .17DD CALL L3922 ; random number in A CP C RET NC XOR A LD (DC0A2),A JR .180A .17E8 CP 0FFH JR NZ,.17EE LD A,07H .17EE LD HL,DC2AE CP (HL) JR NZ,.17DB INC HL CALL L1958 LD C,0B3H LD A,01H JR NZ,.1801 LD C,05H XOR A .1801 LD (DC0A2),A CALL L3922 ; random number in A CP C LD (HL),B RET NC .180A CALL L19E3 ; "something's coming!" CALL L19FB ; random monster in A CP 1DH ; branch if enemy fighter party JR Z,.1819 .1814 CALL L1AAF JR .182C .1819 LD HL,DC0A1 LD (HL),A ; save monster number at DC0A1 INC HL CALL L3922 ; random number in A CP 40H LD (HL),00H JR NC,.1829 SET 3,(HL) .1829 CALL L1C5A .182C CALL L1B67 LD HL,0000H LD (DC152),HL POP HL ; kill return address LD HL,L1941 PUSH HL .183A LD DE,D5115 ; "doushimasuka ? / TALK / ATTACK / RUN" CALL L7F2D ; print message group: DE=messages LD HL,3A64H CALL L35B4 ; do menu: HL=VRAM address => A=first char of item CALL L1E34 CP _R ; *J* _R RUN JR Z,.18A9 ; RUN JP NC,.18EC ; >= R TALK, else ATTACK ; === ATTACK === LD A,(DC0A2) BIT 3,A JR NZ,.185F LD A,(DC14C) BIT 0,A JP Z,.1924 .185F LD A,01H .1861 PUSH AF LD HL,D4F90 CALL L7F3F ; print message with screen address CALL L31AF ; message speed delay CALL L1E34 CALL L27AF CALL L277A LD HL,(DC14E) LD DE,(DC150) POP AF OR A SBC HL,DE JR NC,.1887 LD A,09H LD (DC14D),A XOR A .1887 CALL L1DA2 LD HL,DC16B LD A,(DC0A3) ; monster count LD B,00H LD C,A CALL L7EE5 ; fill memory: HL=address, BC=length, A=fill byte CALL L1EC3 LD HL,DC14C BIT 1,(HL) JR Z,.183A LD (HL),00H INC HL LD (HL),00H IF OPT1 JP L281A ELSE CALL L281A RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- ; === RUN === .18A9 LD HL,(DC12C) ; current map location CALL L3AE7 ; A=map data at (HL), HL=square data address CALL L3922 ; random number in A AND 03H INC A LD (DC12B),A ; current facing direction CP 02H JR C,.18C5 ; =01 JR Z,.18C4 ; =02 CP 04H JR C,.18C3 ; =03 INC HL ; =04 .18C3 INC HL .18C4 INC HL .18C5 BIT 7,(HL) JR Z,.18DC CALL L1E40 CALL L0F05 CALL L2ABF LD HL,D4AE8 ; "itsumo umakuikutowa kagirimasenyo." (you run away) CALL L7F3F ; print message with screen address IF OPT1 JP L31AF ; message speed delay ELSE CALL L31AF ; message speed delay RET ; *** not optimal *** ENDIF .18DC LD HL,D4B00 ; "shimatta nigerarenai!!" (didn't run away) CALL L7F3F ; print message with screen address CALL L31AF ; message speed delay CALL L1E34 XOR A JP .1861 ;----------------------------------------------------------------------- ; === TALK === .18EC LD A,(DC0A2) BIT 3,A LD A,00H JP NZ,.1861 LD HL,DC14C BIT 0,(HL) JP NZ,.1861 CALL L3899 ; B = number of PCs LD A,(DC0A3) ; monster count ADD A,B CP 06H JR NC,.1934 ; branch if more fighters than room in party LD DE,D5125 ; "naniwo hamashikakemasuka? / JOIN US / GOOD BYE / YOUR MONEY / OR LIFE" CALL L7F2D ; print message group: DE=messages LD HL,3A63H CALL L35B4 ; do menu: HL=VRAM address => A=first char of item CALL L1E34 CP _J ; *J* _J RET C ; HL,AF saved LD A,(DC0A1) ; current monster number CP 1DH JR Z,.1B7D CALL L38AD JR L1BD6 .1B7D LD B,05H LD HL,DC0AA .1B82 LD A,(HL) OR A JR Z,L1BD6 PUSH BC PUSH HL LD DE,0007H ADD HL,DE EX DE,HL CALL L3772 POP HL PUSH HL CALL L2329 PUSH HL LD H,00H CALL L3876 POP HL LD DE,DC19A LD A,(DE) CP 01H JR Z,.1BAB INC HL INC HL CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data JR .1BC8 .1BAB INC DE LD A,(DE) CP 01H JR Z,.1BC8 CALL L7FAD ; read one byte from VDP: HL=VRAM address => A=data ADD A,08H CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data INC HL CALL L7FAD ; read one byte from VDP: HL=VRAM address => A=data ADD A,08H CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data LD BC,0002H CALL L7F94 ; print message, DE=message, BC=length .1BC8 LD BC,1000H CALL L7EDB ; delay POP HL LD DE,0016H ADD HL,DE POP BC DJNZ .1B82 L1BD6 LD A,(DC0A3) ; monster count CALL L3541 ; convert to decimal: A=number => B=hundreds C=tens A=ones PUSH AF LD A,C LD HL,3A3BH CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data POP AF INC HL CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data LD DE,3A33H LD BC,0006H LD A,(DC0A1) ; current monster number CP 1DH JR Z,.1BFE LD HL,DC0A4 CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length JR .1C07 .1BFE LD HL,D5072 ; "FIGHTER" LD BC,N5072 CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length .1C07 LD HL,3A52H LD DE,DC0AA LD B,05H .1C0F LD A,(DE) OR A RET Z PUSH BC PUSH HL PUSH DE CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data LD A,79H INC HL CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data INC HL PUSH HL LD A,(DC0A1) ; current monster number CP 1DH LD HL,0002H JR NZ,.1C2C LD L,12H .1C2C ADD HL,DE PUSH HL LD A,06H SUB B LD B,A LD HL,3B4DH ; 3B51H-4? LD DE,0004H .1C38 ADD HL,DE DJNZ .1C38 PUSH HL POP BC POP HL POP DE CALL L367A POP HL LD A,(DC0A1) ; current monster number CP 1DH LD DE,0006H JR NZ,.1C4F LD E,16H .1C4F ADD HL,DE EX DE,HL POP HL LD BC,0020H ADD HL,BC POP BC DJNZ .1C0F RET ;----------------------------------------------------------------------- L1C5A CALL L3922 ; random number in A LD HL,DC0A3 ; monster count AND 07H ; A = [0..7] INC A ; A = [1..8] CP 06H ; branch if a <= 6 JR C,.1C69 SUB 05H ; 7->2, 8->3 .1C69 LD (HL),A ; monster count = [1 2 2 3 3 4 5 6] LD B,A LD C,0AH LD HL,DC0AA .1C70 PUSH BC LD (HL),C INC HL PUSH HL CALL L1C93 POP HL LD DE,0006H ADD HL,DE CALL L1CE3 CALL L35DC CALL L3922 ; random number in A AND 3FH INC A LD (HL),A INC HL CALL L1E60 INC HL POP BC INC C DJNZ .1C70 RET L1C93 LD A,25H PUSH HL LD BC,0006H CALL L7EE5 ; fill memory: HL=address, BC=length, A=fill byte POP HL CALL L3922 ; random number in A AND 03H LD B,02H CP B JR NC,.1CA8 INC B .1CA8 LD C,19H .1CAA PUSH BC CALL L3922 ; random number in A .1CAE SUB C JR NC,.1CAE ADD A,C EX DE,HL LD HL,D1CDE LD BC,0005H CPIR EX DE,HL JR Z,.1CD6 ADD A,0AH LD (HL),A INC HL CALL L3922 ; random number in A AND 07H CP 05H JR C,.1CCD SUB 05H .1CCD LD DE,D1CDE-1 INC A .1CD1 INC DE DEC A JR NZ,.1CD1 LD A,(DE) .1CD6 ADD A,0AH LD (HL),A INC HL POP BC DJNZ .1CAA RET D1CDE DB 00H,08H,14H,04H,0EH ;----------------------------------------------------------------------- L1CE3 CALL L3922 ; random number in A AND 07H CP 05H JR C,.1CEE SUB 05H .1CEE ADD A,56H LD (HL),A INC HL CALL L3922 ; random number in A AND 07H CP 05H JR C,.1CFD SUB 05H .1CFD ADD A,5BH LD (HL),A INC HL CALL L1D4C JR Z,.1D09 ADD A,A ADD A,66H .1D09 LD (HL),A INC HL CALL L1D7F OR A JR Z,.1D13 ADD A,73H .1D13 LD (HL),A INC HL LD A,(DC128) ; current map number INC A JR NZ,.1D1D LD A,08H .1D1D LD B,A CALL L3922 ; random number in A CP 55H JR C,.1D2B CP 0AAH JR C,.1D2A INC B .1D2A DEC B .1D2B LD A,B CP 06H JR Z,.1D34 CP 08H JR C,.1D3A .1D34 DEC HL DEC HL LD (HL),00H INC HL INC HL .1D3A OR A JR Z,.1D40 ADD A,A ADD A,83H .1D40 LD (HL),A INC HL CALL L1D4C JR Z,.1D49 ADD A,0AEH .1D49 LD (HL),A INC HL RET ;----------------------------------------------------------------------- L1D4C LD A,(DC128) ; current map number LD B,00H CP 02H JR C,.1D60 INC B CP 04H JR C,.1D60 INC B CP 06H JR C,.1D60 INC B .1D60 LD C,04H L1D62 CALL L3922 ; random number in A CP 55H JR C,.1D6E CP 0AAH JR C,.1D71 INC B .1D6E DEC B JR .1D72 .1D71 INC B .1D72 LD A,B CP 0FFH JR Z,.1D7C CP C JR NZ,.1D7D DEC A DEC A .1D7C INC A .1D7D OR A RET L1D7F LD A,(DC128) ; current map number LD B,00H CP 02H JR C,.1D9E ; A=0,1 -> B=0 LD B,01H JR Z,.1D9E ; A=2 -> B=1 LD B,02H CP 04H JR C,.1D9E ; A=3 -> B=2 LD B,03H JR Z,.1D9E ; A=4 -> B=3 LD B,04H CP 06H JR C,.1D9E ; A=5 -> B=4 LD B,05H ; A=6 -> B=5 .1D9E LD C,06H JR L1D62 ;----------------------------------------------------------------------- L1DA2 OR A JR NZ,L1DB0 L1DA5 XOR A LD HL,DC166 LD BC,0005H IF OPT1 JP L7EE5 ; fill memory: HL=address, BC=length, A=fill byte ELSE CALL L7EE5 ; fill memory: HL=address, BC=length, A=fill byte RET ; *** not optimal *** ENDIF L1DB0 LD A,(DC14D) CP 09H JR Z,L1DA5 LD A,(DC0A3) ; monster count DEC A JR NZ,.1DCB CALL L3899 ; B = number of PCs LD A,(DC0AA) LD HL,DC166 .1DC6 LD (HL),A INC HL DJNZ .1DC6 RET .1DCB LD DE,D5130 ; "dorewo kougeki / shimasuka ?" CALL L7F2D ; print message group: DE=messages LD HL,3A50H LD (DC00D),HL ; VRAM pointer to current menu item LD HL,DC010 LD DE,DC166 LD B,05H .1DDF PUSH BC PUSH HL PUSH DE LD DE,3AA3H LD BC,000AH CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length CALL L35B7 ; do menu: HL=VRAM address => A=first char of item POP DE LD (DE),A INC DE POP HL LD BC,001DH ADD HL,BC POP BC XOR A CP (HL) RET Z DJNZ .1DDF RET ;----------------------------------------------------------------------- L1DFD CALL L3899 ; B=number of PCs, HL=new PC slot EX DE,HL LD A,(DC0A3) ; monster count LD B,A LD HL,DC0AA .1E08 PUSH BC INC HL LD BC,0006H LDIR EX DE,HL PUSH DE LD A,25H LD C,04H CALL L7EE5 ; fill memory: HL=address, BC=length, A=fill byte POP DE EX DE,HL LD C,06H LDIR LD A,80H LD (DE),A INC DE LD C,03H LDIR INC DE INC DE INC DE LD C,06H LDIR POP BC DJNZ .1E08 IF OPT1 JP L396C ELSE CALL L396C RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L1E34 PUSH AF LD HL,3A23H LD BC,060EH CALL L32CE ; erase a rectangle: HL=VRAM address, B=height, C=width POP AF RET ;----------------------------------------------------------------------- L1E40 CALL L1E50 LD HL,D0473 ; (sprite table 3) LD DE,3B64H LD BC,N0473 IF OPT1 JP L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length ELSE CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L1E50 CALL L32DD ; clear bottom of screen LD HL,D045F ; (sprite table 2) LD DE,3B50H LD BC,N045F IF OPT1 JP L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length ELSE CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L1E60 LD A,(DC128) ; current map number CP 0FFH JR NZ,.1E69 LD A,07H .1E69 LD B,A CALL L3922 ; random number in A CP 80H JR NC,.1E72 INC B .1E72 XOR A CP B JR NZ,.1E77 INC B .1E77 LD (HL),B INC HL CALL L1E88 LD (HL),00H RET ;----------------------------------------------------------------------- L1E7F LD (HL),B INC HL L1E81 LD E,B LD BC,0A0AH LD D,B JR L1E8D L1E88 LD E,B LD BC,0505H LD D,B L1E8D DEC E JR Z,.1E9E LD A,05H ADD A,B LD B,A LD A,04H ADD A,C LD C,A LD A,03H ADD A,D LD D,A JR L1E8D .1E9E LD E,02H .1EA0 CALL L3922 ; random number in A CP 80H JR NC,.1EB0 BIT 0,E JR Z,.1EB4 .1EAB AND 03H ADD A,B JR .1EB9 .1EB0 BIT 0,E JR Z,.1EAB .1EB4 AND 03H SUB B NEG .1EB9 LD (HL),A INC HL DEC E RET M LD B,C JR NZ,.1EA0 LD B,D JR .1EA0 ;----------------------------------------------------------------------- L1EC3 LD HL,DC14C LD (HL),01H INC HL LD A,09H CP (HL) JR NZ,.1F03 CALL L1E40 CALL L2ABF LD HL,D4B27 ; "nigete itta..." CALL L7F3F ; print message with screen address CALL L31AF ; message speed delay XOR A LD (DC0A3),A ; monster count .1EE1 CALL L1E40 CALL L2ABF LD A,(DC0A2) BIT 2,A CALL NZ,L254E ; check for magic cloak? CALL L25B5 LD A,(DC0A2) BIT 0,A CALL NZ,L2657 CALL L275E LD HL,DC14C LD (HL),02H RET .1F03 INC (HL) LD A,(DC166) OR A LD B,00H CALL NZ,L3899 ; B = number of PCs LD A,(DC0A3) ; monster count LD C,A .1F11 PUSH BC CALL L3A37 LD A,(DC160) CP 06H JR NC,.1F61 LD B,00H LD C,A LD HL,DC165 ADD HL,BC LD A,(DC0A1) ; current monster number CP 1DH LD DE,0006H JR NZ,.1F2F LD E,16H .1F2F LD A,(DC0A3) ; monster count LD B,A LD A,(HL) LD (HL),00H LD HL,DC0AA LD C,06H .1F3B CP (HL) JR Z,.1F44 INC C ADD HL,DE DJNZ .1F3B JR .1F48 .1F44 LD A,C CALL L1FDD .1F48 CALL L1E34 POP BC LD A,(DC0A3) ; monster count OR A IF OPT1 JR Z,.1EE1 ELSE JP Z,.1EE1 ENDIF DJNZ .1F11 LD A,C OR A JR NZ,.1F11 LD A,(DC0A3) ; monster count OR A IF OPT1 JR Z,.1EE1 ELSE JP Z,.1EE1 ENDIF RET .1F61 LD B,00H LD C,A LD HL,DC165 ADD HL,BC LD (HL),00H LD HL,DC0AA LD A,(DC0A1) ; current monster number LD DE,0006H ; monster name length CP 1DH ; enemy fighter party JR NZ,.1F79 LD E,16H .1F79 LD A,C SUB 05H .1F7C DEC A JR Z,.1F82 ADD HL,DE JR .1F7C .1F82 CALL L3899 ; B = number of PCs CALL L3922 ; random number in A AND 07H .1F8A CP B JR C,.1F90 SUB B JR .1F8A .1F90 INC A PUSH AF LD HL,DC010-001DH LD BC,001DH .1F98 ADD HL,BC DEC A JR NZ,.1F98 POP AF CALL L1FD6 CALL L1E34 POP BC LD A,(DC010) ; get first PC's name OR A JR Z,.1FB8 ; "everybody dead" if null DEC C JP NZ,.1F11 LD A,B OR A JP NZ,.1F11 LD A,(DC010) ; get first PC's name OR A ; (didn't we just test for this?) RET NZ ; return if name not null .1FB8 LD A,86H LD (DC2D0),A LD HL,D4F54 ; "zenmetsu shimashita." (everybody dead) CALL L7F3F ; print message with screen address LD A,25H CALL L31B2 ; delay in A LD BC,0107H ; reg 7 = 01, background color = black CALL L7F73 ; write VDP register: C=register, B=data CALL L318A ; "GAME OVER" screen IF OPT1 JP L000B ELSE LD HL,L000B PUSH HL RET ENDIF ;----------------------------------------------------------------------- L1FD6 PUSH AF PUSH HL CALL L235C POP HL POP AF L1FDD CALL L236C CALL L1E34 CALL L23A6 LD B,(HL) LD HL,0000H LD DE,0046H .1FED ADD HL,DE DJNZ .1FED PUSH HL CALL L239E LD E,(HL) POP HL .1FF6 INC B OR A SBC HL,DE JR NC,.1FF6 DEC B CALL L3922 ; random number in A .2000 CP 63H JR C,.2008 SUB 63H JR .2000 .2008 INC A LD C,A LD A,B CP C JR NC,.2014 CALL L23C0 ; ...yoketa JP .21BA .2014 CALL L23A6 DEC HL CALL L3922 ; random number in A .201B SUB 05H JR NC,.201B ADD A,0AH LD B,A LD E,(HL) LD HL,0000H .2026 ADD HL,DE DJNZ .2026 PUSH HL LD A,(DC15A) CP 06H JR C,.2041 LD A,(DC0A1) ; current monster number CP 1DH LD DE,000BH JR Z,.2044 CALL L223F LD A,(HL) JR .204C .2041 LD DE,000EH .2044 LD HL,(DC15B) ADD HL,DE LD A,(HL) CALL L27EB .204C POP DE LD HL,0000H LD B,A OR A JR Z,.2057 .2054 ADD HL,DE DJNZ .2054 .2057 LD DE,0046H OR A .205B SBC HL,DE JR C,.2065 INC B JR NC,.205B DEC B JR .2066 .2065 INC B .2066 LD A,C CP 03H JR NC,.2078 LD A,B SRL A ADD A,B LD B,A PUSH BC LD HL,D4FBB ; "*GOOD SHOT*" CALL L7F3F ; print message with screen address POP BC .2078 PUSH BC LD A,(DC15A) CP 06H LD HL,(DC15B) JR C,.2086 LD HL,(DC15E) .2086 LD DE,0010H ADD HL,DE CP 06H JR C,.20AE BIT 6,(HL) JR Z,.20C5 LD E,03H SBC HL,DE LD A,(HL) SUB 73H ADD A,A LD B,A CALL L3922 ; random number in A .209E SUB B JR NC,.209E ADD A,B INC A POP BC SUB B LD B,00H JR NC,.20C6 NEG LD B,A JR .20C6 .20AE BIT 5,(HL) JR Z,.20C5 DEC HL DEC HL LD A,(HL) SUB 83H LD B,A CALL L3922 ; random number in A .20BB SUB B JR NC,.20BB ADD A,B INC A POP BC ADD A,B LD B,A JR .20C6 .20C5 POP BC .20C6 LD A,(DC15D) CP 06H JR C,.20DE LD A,(DC0A1) ; current monster number CP 1DH ; enemy fighter party? LD DE,0009H JR Z,.20E1 CALL L223F INC HL LD A,(HL) JR .20FB .20DE LD DE,000CH .20E1 LD HL,(DC15E) ADD HL,DE LD A,(HL) CALL L27F8 PUSH DE INC HL LD A,(HL) CALL L2802 PUSH DE INC HL INC HL LD A,(HL) CALL L2811 POP HL ADD HL,DE POP DE ADD HL,DE LD A,L .20FB LD C,A LD A,B SUB C JR Z,.2102 JR NC,.2108 .2102 CALL L23C7 ; ...uketometa (was defended against) JP .21BA .2108 LD B,A LD A,(DC0A1) ; current monster number CP 19H JR NZ,.2162 LD A,(DC15D) CP 06H JR NC,.2162 LD HL,(DC15E) LD DE,0019H ADD HL,DE CALL L3922 ; random number in A AND 07H INC A LD B,A LD A,(HL) SUB B JR NC,.212A XOR A .212A LD (HL),A LD E,03H ADD HL,DE CP (HL) JR Z,.2195 JR C,.2195 LD HL,3A84H LD A,B CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data LD DE,D520B ; "WRAITH ni / no LIFEwo / ubawareta" CALL L7F2D ; print message group: DE=messages LD HL,(DC15E) LD DE,3A43H ; LINE 1 CALL L2452 ; print string until blank: DE=VRAM addr, HL=string, B=length IF ENGLISH ELSE LD A,ka ; *J* OUT (VDPdata),A NOP NOP LD A,ten ; *J* OUT (VDPdata),A ENDIF LD HL,(DC15B) LD A,(HL) LD HL,3A69H CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data CALL L250F JR .21BA .2162 LD A,(DC15D) CP 06H LD DE,0019H JR C,.2177 LD A,(DC0A1) ; current monster number CP 1DH LD E,02H JR NZ,.2177 LD E,12H .2177 LD HL,(DC15E) ADD HL,DE LD C,(HL) LD E,03H ADD HL,DE LD A,B ADD A,(HL) LD (HL),A CP C JR NC,.2192 CALL L224D PUSH BC ; save damage (in B?) CALL L250F POP AF ; A = damage CALL L23D5 ; A damage ataeta JR .21BA .2192 CALL L2248 .2195 CALL L23CE ; shitometa (slain) LD A,(DC15D) LD B,00H LD C,A LD HL,DC165 ADD HL,BC LD A,(HL) OR A JR Z,.21B3 POP HL POP DE LD A,C CP 06H JR C,.21B0 DEC E JR .21B1 .21B0 DEC D .21B1 PUSH DE PUSH HL .21B3 CALL L21BE IF OPT1 JP L2460 ELSE CALL L2460 RET ; *** not optimal *** ENDIF .21BA LD A,01H JR L21CB L21BE LD A,(DC15D) CP 06H JR NC,.21CA LD A,84H LD (DC2D0),A .21CA XOR A L21CB LD B,04H .21CD PUSH AF PUSH BC BIT 0,B JR Z,.21EA LD A,(DC15A) LD HL,(DC15B) LD B,02H .21DB PUSH BC CALL L2262 LD A,(DC15D) LD HL,(DC15E) POP BC DJNZ .21DB JR .220D .21EA OR A LD B,02H JR NZ,.21FA LD A,(DC15D) LD HL,(DC15E) CALL L22D3 LD B,01H .21FA LD A,(DC15A) LD HL,(DC15B) .2200 PUSH BC CALL L22AB LD A,(DC15D) LD HL,(DC15E) POP BC DJNZ .2200 .220D POP BC POP AF PUSH AF PUSH BC OR A JR NZ,.2223 LD A,(DC15D) CP 06H JR NC,.2223 LD BC,1000H CALL L7EDB ; delay JR .222B .2223 LD A,(DC00F) ; message speed LD C,A INC C CALL L31B6 .222B POP BC POP AF DJNZ .21CD OR A JR NZ,.223B LD A,(DC15D) LD HL,(DC15E) CALL L22D3 IF OPT1 .223B JP L2360 ELSE .223B CALL L2360 RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L223F LD E,A ; E=A*1 ADD A,A ; A=A*2 ADD A,E ; A=A*3 LD HL,D57E3 LD E,A ADD HL,DE RET ;----------------------------------------------------------------------- L2248 SUB C SUB B NEG LD B,A L224D LD A,(DC15D) CP 06H RET C PUSH HL PUSH DE LD HL,(DC152) LD D,00H LD E,B ADD HL,DE LD (DC152),HL POP DE POP HL RET ;----------------------------------------------------------------------- L2262 CP 06H JR NC,.2277 LD DE,000AH ADD HL,DE EX DE,HL PUSH AF CALL L3772 POP AF CALL L2313 IF OPT1 JP L3876 ELSE CALL L3876 RET ; *** not optimal *** ENDIF .2277 LD A,(DC0A1) ; current monster number CP 1DH JR Z,.2285 CALL L2341 IF OPT1 JP L7F1E ; put rectangular data on screen: B=height, C=width, DE=VRAM addr, HL=data ELSE CALL L7F1E ; put rectangular data on screen: B=height, C=width, DE=VRAM addr, HL=data RET ; *** not optimal *** ENDIF .2285 PUSH HL LD DE,0007H ADD HL,DE EX DE,HL CALL L3772 POP HL L228F CALL L2329 PUSH HL LD H,00H CALL L3876 POP HL INC HL INC HL LD A,(DC19A) CP 01H JR NZ,.22A7 LD A,(DC19B) CP 01H .22A7 CALL NZ,L7FB5 ; write one byte to VDP: HL=VRAM address, A=data RET ;----------------------------------------------------------------------- L22AB CP 06H LD DE,000AH JR C,.22BA LD A,(DC0A1) ; current monster number CP 1DH RET NZ LD E,07H .22BA PUSH AF PUSH HL LD A,82H LD (DC2D0),A ADD HL,DE EX DE,HL CALL L3725 POP HL POP AF CP 06H JR NC,L228F CALL L2313 IF OPT1 JP L3876 ELSE CALL L3876 RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L22D3 CP 06H JR NC,.22ED CALL L2313 PUSH DE LD A,01H CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data LD BC,0004H ADD HL,BC CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data POP HL LD BC,0303H JR .2304 .22ED LD A,(DC0A1) ; current monster number CP 1DH JR NZ,.2300 CALL L2329 LD A,01H INC HL INC HL CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data JR .2303 .2300 CALL L2341 .2303 EX DE,HL .2304 LD A,__ .2306 PUSH BC LD B,00H CALL L7F81 ; fill VRAM: HL=VRAM addr, BC=length, A=fill char => HL,AF saved LD C,20H ADD HL,BC POP BC DJNZ .2306 RET ;----------------------------------------------------------------------- L2313 LD B,A LD HL,37C2H ; 3822H-60H? LD DE,0060H .231A ADD HL,DE DJNZ .231A PUSH HL LD B,A LD HL,3AF2H ; 3B02H-10H? LD E,10H .2324 ADD HL,DE DJNZ .2324 POP DE RET ;----------------------------------------------------------------------- L2329 LD A,(HL) PUSH AF SUB 09H LD HL,3B68H ; 3B64H-4? LD DE,0004H .2333 ADD HL,DE DEC A JR NZ,.2333 EX DE,HL POP AF LD HL,D6AB5 LD BC,0303H JR L234D L2341 LD A,(HL) PUSH AF CALL L3913 ; get current monster table entry LD E,04H ; (L3913 exits with D=0) ADD HL,DE CALL L38F3 ; get monster name table data -> BC=hgt/wid, HL=screen addrs POP AF L234D SUB 09H .234F DEC A JR Z,.2356 INC HL INC HL JR .234F .2356 LD A,(HL) INC HL LD H,(HL) LD L,A EX DE,HL RET ;----------------------------------------------------------------------- L235C LD A,91H JR L2362 L2360 LD A,0F1H L2362 LD BC,0220H LD HL,3188H IF OPT1 JP L7F81 ; fill VRAM: HL=VRAM addr, BC=length, A=fill char => HL,AF saved ELSE CALL L7F81 ; fill VRAM: HL=VRAM addr, BC=length, A=fill char => HL,AF saved RET ; *** not optimal *** ENDIF L236C LD (DC15E),HL LD (DC15D),A LD A,(DC160) LD (DC15A),A CP 06H LD HL,DC010 ; first PC LD DE,001DH ; size of PC entry LD B,A JR C,.2394 SUB 05H LD B,A LD HL,DC0AA LD E,06H LD A,(DC0A1) ; current monster number CP 1DH JR NZ,.2394 LD E,16H .2394 DEC B JR Z,.239A ADD HL,DE JR .2394 .239A LD (DC15B),HL RET ;----------------------------------------------------------------------- L239E LD A,(DC15D) LD HL,(DC15E) JR L23AC L23A6 LD A,(DC15A) LD HL,(DC15B) L23AC CP 06H LD DE,001BH JR C,.23BE LD A,(DC0A1) ; current monster number CP 1DH LD E,04H JR NZ,.23BE LD E,14H .23BE ADD HL,DE RET ;----------------------------------------------------------------------- L23C0 LD A,02H LD HL,D4F9B ; "yoketa." JR L23E9 IF ENGLISH L23C7 EQU L23C0 ; change "Y defended against X" to "X misses Y" ELSE L23C7 LD A,04H LD HL,D4FA2 ; "uketometa." JR L23E9 ENDIF L23CE LD A,08H LD HL,D4FB3 ; "shitometa!" JR L23E9 IF ENGLISH L23D5 LD HL,3AA4H ELSE L23D5 LD HL,3A84H ENDIF CALL L3B58 ; print decimal number: HL=VRAM address, A=number LD DE,D5069 ; ### "no DAMAGE wo" LD BC,N5069 CALL L7F94 ; print message, DE=message, BC=length LD A,06H LD HL,D4FAB ; "ataeta!" L23E9 PUSH AF CALL L7F3F ; print message with screen address POP AF PUSH AF IF ENGLISH SCF ELSE CP 06H ; ataeta ENDIF LD A,(DC15A) ; attacker number? LD HL,(DC15B) ; attacker name? IF ENGLISH .23F7 LD DE,3A43H ; LINE 2 JR C,.23FF ; yoketa/uketometa LD DE,3A83H ; LINE 1 if yoketa/uketometa, print at different location (not for english please!) ELSE .23F7 LD DE,3A63H ; LINE 2 JR C,.23FF ; yoketa/uketometa LD DE,3A43H ; LINE 1 if yoketa/uketometa, print at different location (not for english please!) ENDIF .23FF LD B,0AH ; 10 chars for player name CP 06H ; is target a monster? JR C,.240F ; branch if target is a PC LD B,06H ; 6 chars for monster name LD A,(DC0A1) ; get current monster number CP 1DH ; 1D means enemy is FIGHTER party JR NZ,.2414 ; branch if enemy is monster INC HL ; skip monster letter .240F CALL L2452 ; print string until blank: DE=VRAM addr, HL=string, B=length JR .2425 .2414 LD A,(HL) PUSH AF LD HL,DC0A4 ; MONSTER A name CALL L2452 ; print string until blank: DE=VRAM addr, HL=string, B=length LD A,__ OUT (VDPdata),A NOP NOP POP AF ; A = monster letter OUT (VDPdata),A .2425 POP AF IF ENGLISH PUSH AF CP 05H JR Z,.10 ; =05 ataeta target RRA JR NC,.243E LD A,_excl OUT (VDPdata),A JR .243E .10 LD DE,D5069a ; "for" LD BC,N5069a CALL L7F94 ; print message, DE=message, BC=length .243E POP AF ELSE PUSH AF CP 05H LD B,ni ; *J* JR Z,.243E ; =05 ??? (but there is no 05!) JR C,.2430 ; <05 means yoketa/uketometa DEC A .2430 BIT 0,A LD B,wo ; *J* JR Z,.243E LD A,ka ; *J* OUT (VDPdata),A NOP NOP LD B,ten ; *J* .243E LD A,B OUT (VDPdata),A POP AF ENDIF BIT 0,A RET NZ DEC A ; 2,4,6,8 -> 1,3,5,7 PUSH AF IF ENGLISH OR A ; clear carry flag ELSE CP 05H CCF ENDIF LD A,(DC15D) ; target number? LD HL,(DC15E) ; target name? JR .23F7 ;----------------------------------------------------------------------- ; print string until blank: DE=VRAM addr, HL=string, B=length L2452 EX DE,HL CALL L7FCA ; set VRAM drite address: HL=VRAM address .2456 LD A,(DE) CP __ RET Z OUT (VDPdata),A INC DE DJNZ .2456 RET ;----------------------------------------------------------------------- L2460 LD A,(DC15D) LD B,00H LD C,A LD HL,DC165 ADD HL,BC CP 06H JR NC,.2472 LD A,05H JR .2478 .2472 SUB 05H LD C,A LD A,(DC0A3) ; monster count .2478 SUB C JR Z,.2483 LD C,A XOR A PUSH HL INC HL POP DE LDIR EX DE,HL .2483 LD (HL),A LD HL,DC19D ; off-screen buffer for 3D maze LD BC,0091H CALL L7EE5 ; fill memory: HL=address, BC=length, A=fill byte LD A,(DC15D) CP 06H JR C,.24B0 SUB 05H LD C,A LD HL,DC0A3 ; monster count LD A,(HL) DEC (HL) SUB C LD B,16H JR Z,.24D2 LD B,A LD A,(DC0A1) ; current monster number LD DE,0006H CP 1DH ; enemy is FIGHTER party JR NZ,.24BC LD E,16H JR .24BC .24B0 LD C,A LD A,05H SUB C LD B,1DH JR Z,.24D2 LD B,A LD DE,001DH .24BC LD HL,0000H .24BF ADD HL,DE DJNZ .24BF PUSH HL ADD HL,DE POP BC PUSH HL LD HL,(DC15E) ADD HL,DE LD DE,DC19D ; off-screen buffer for 3D maze LDIR POP BC JR .24D5 .24D2 LD C,B LD B,00H .24D5 LD DE,(DC15E) LD HL,DC19D ; off-screen buffer for 3D maze LDIR LD A,(DC15D) CP 06H JR NC,.24FE LD HL,3822H LD BC,0F0DH CALL L32CE ; erase a rectangle: HL=VRAM address, B=height, C=width LD HL,D040F ; (sprite table 1) LD DE,SAT ; sprite attribute table LD BC,N040F CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length IF OPT1 JP L396C ELSE CALL L396C RET ; *** not optimal *** ENDIF .24FE LD HL,3A30H LD BC,060DH CALL L32CE ; erase a rectangle: HL=VRAM address, B=height, C=width LD A,(DC0A3) ; monster count OR A CALL NZ,L1BD6 RET ;----------------------------------------------------------------------- L250F LD A,(DC15D) CP 06H JR NC,.251B LD B,A IF OPT1 JP L364E ELSE CALL L364E RET ; *** not optimal *** ENDIF .251B CP 0BH RET Z SUB 05H LD B,A LD C,A LD A,(DC0A1) ; current monster number CP 1DH LD DE,0002H JR NZ,.252E LD E,12H .252E LD HL,(DC15E) ADD HL,DE PUSH HL LD HL,3A34H LD E,20H LD B,C .2539 ADD HL,DE DJNZ .2539 PUSH HL LD HL,3B4DH ; 3B51H-4? LD E,04H LD B,C .2543 ADD HL,DE DJNZ .2543 PUSH HL POP BC POP DE POP HL IF OPT1 JP L367A ELSE CALL L367A RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L254E LD A,(DC0A3) ; monster count OR A RET NZ CALL L3922 ; random number in A CP 40H RET NC LD DE,D51FC ; "tekiwa mahounoMANTOwo kiteita! / [ANY KEY]" CALL L7F2D ; print message group: DE=messages CALL L31A1 ; delay and wait for joypad button CALL L32DD ; clear bottom of screen LD DE,D5201 ; "donataga / tsukaimasuka ? " CALL L7F2D ; print message group: DE=messages CALL L32B1 ; print PC name menu LD HL,D5039 ; "cancel" LD BC,N5039 CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length LD HL,3A31H CALL L35B4 ; do menu: HL=VRAM address => A=first char of item PUSH AF CALL L32DD ; clear bottom of screen POP AF IF ENGLISH CP _dash ; -CANCEL- ELSE CP tsu ; *J* tsukawanai ENDIF RET Z CALL L3346 ; find line number in PC name menu PUSH BC LD HL,DC010H+0DH-1DH ; chr+0DH = armor LD DE,001DH .258F ADD HL,DE DJNZ .258F LD (HL),0FFH ; set armor = 0FFH DEC HL DEC HL DEC HL EX DE,HL ; DE = chr+0A CALL L3772 POP BC PUSH BC LD HL,37C2H ; 3822H-60H? LD DE,0060H .25A3 ADD HL,DE DJNZ .25A3 POP BC PUSH HL LD HL,3AF2H ; 3B02H-10H? LD E,10H .25AD ADD HL,DE DJNZ .25AD POP DE IF OPT1 JP L3876 ELSE CALL L3876 RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L25B5 LD HL,DC010 LD B,05H .25BA PUSH BC PUSH HL LD DE,0018H ADD HL,DE PUSH HL LD A,(HL) CP 0EH JR C,.25C8 LD A,0EH .25C8 INC A LD B,A LD HL,(DC152) .25CD SRL H RR L DJNZ .25CD LD A,H OR A JR Z,.25D9 LD L,0FFH .25D9 LD A,L POP HL DEC HL ADD A,(HL) LD (HL),A CP 48H JR C,.263C LD (HL),01H ; chr+17 xp-to-next-level = 1 INC HL INC (HL) ; chr+18 increment level INC HL CALL L264A ; chr+19 (HL) = (HL) + random(1..8) CP 48H JR C,.25F0 LD (HL),48H ; max HP = 48H .25F0 INC HL LD A,04H CALL L2650 INC HL LD A,03H CALL L2650 POP DE PUSH DE LD HL,3A23H CALL L3317 ; print PC name, DE=name, HL=VRAM addr IF ENGLISH ; LD A,__ ; OUT (VDPdata),A LD DE,D504F ; "is now level" LD BC,N504F CALL L7F94 ; print message, DE=message, BC=length ELSE LD A,ha ; *J* OUT (VDPdata),A LD A,__ NOP OUT (VDPdata),A ENDIF POP HL PUSH HL LD DE,0018H ; offset to player level? ADD HL,DE LD A,(HL) CALL L3B5D ; print decimal number: A=number IF ENGLISH LD A,_excl OUT (VDPdata),A ELSE LD DE,D504F ; "REBERUninatta!" (gained a level) LD BC,N504F CALL L7F94 ; print message, DE=message, BC=length ENDIF LD HL,D49A1 ; "[ANY KEY]" CALL L7F3F ; print message with screen address CALL L31A1 ; delay and wait for joypad button CALL L32DD ; clear bottom of screen POP HL POP BC PUSH BC PUSH HL LD A,06H SUB B LD B,A PUSH BC CALL L364E POP BC CALL L36DC .263C POP HL LD BC,001DH ADD HL,BC POP BC XOR A CP (HL) RET Z DEC B JP NZ,.25BA RET ;----------------------------------------------------------------------- ; (HL) = (HL) + random(1..8) L264A CALL L3922 ; random number in A AND 07H INC A ; A = 1..8 L2650 ADD A,(HL) ; A = (HL) + 1..8 JR NC,.2655 ; store it if no carry LD A,0FFH ; top it out at 255 .2655 LD (HL),A RET ;----------------------------------------------------------------------- L2657 LD A,(DC0A3) ; monster count OR A RET NZ LD A,(DC128) ; current map number OR A RET Z CP 0FFH JR NZ,.2667 LD A,07H .2667 LD B,A LD HL,D2742-4 LD DE,0004H .266E ADD HL,DE DJNZ .266E LD E,(HL) INC HL LD D,(HL) INC HL PUSH HL LD HL,(DC006) ; random number seed? XOR A .267A SBC HL,DE JR NC,.267A ADD HL,DE EX DE,HL POP HL LD A,(HL) INC HL LD H,(HL) LD L,A ADD HL,DE PUSH HL CALL L3899 ; B = number of PCs LD A,06H SUB B LD B,A LD HL,0000H POP DE .2692 ADD HL,DE DJNZ .2692 LD A,L PUSH HL CALL L3541 ; convert to decimal: A=number => B=hundreds C=tens A=ones LD HL,DC143 LD (HL),00H RRD INC HL LD A,C RRD LD A,B RRD INC HL LD (HL),00H POP HL LD B,H DEC H JP M,.26CA LD HL,2506H LD (DC146),HL XOR A LD (DC148),A .26BB PUSH BC LD HL,DC146 LD DE,DC143 LD B,03H CALL L352D ; BCD add: (HL)=(HL)+DE, B=length in bytes POP BC DJNZ .26BB .26CA LD HL,DC145 LD DE,3A23H CALL L32E7 ; print 3-byte BCD number at (HL): HL=last/high byte of number, DE=VRAM addr LD DE,D5058 ; " GP found" LD BC,N5058 CALL L7F94 ; print message, DE=message, BC=length LD HL,D49A1 ; "[ANY KEY]" CALL L7F3F ; print message with screen address CALL L31A1 ; delay and wait for joypad button CALL L32DD ; clear bottom of screen LD HL,DC146 XOR A ; DC146..DC148 = 15000.0 GP LD (HL),A INC HL LD (HL),A INC HL LD (HL),15H LD HL,DC010 LD B,05H .26F7 PUSH BC PUSH HL LD DE,0011H ; offset to PC money ADD HL,DE PUSH HL LD DE,DC143 EX DE,HL LD B,03H CALL L352D ; BCD add: (HL)=(HL)+DE, B=length in bytes POP HL PUSH HL INC HL INC HL LD DE,DC148 ; DC146..DC148 = 15000.0 GP LD B,03H CALL L345F ; BCD compare: (DE)-(HL), BC=length INC B DEC B POP DE JR Z,.2736 ; deposit money if <= 15000 GP JR NC,.2736 LD HL,DC146 ; DC146..DC148 = 15000.0 GP LD BC,0003H ; copy 3 bytes of BCD data LDIR POP DE PUSH DE LD HL,3A23H CALL L3317 ; print PC name, DE=name, HL=VRAM addr LD DE,D5206 ; "can't have more than 15000 GP / [ANY KEY]" CALL L7F2D ; print message group: DE=messages CALL L31A1 ; delay and wait for joypad button CALL L32DD ; clear bottom of screen .2736 POP HL LD BC,001DH ADD HL,BC POP BC XOR A CP (HL) RET Z DJNZ .26F7 RET D2742 DW 001EH,0006H,0042H,0012H,008AH,002AH,011AH,005AH DW 023AH,00BAH,047AH,017AH,08FAH,02FAH ;----------------------------------------------------------------------- L275E LD HL,DC010 LD A,05H .2763 PUSH AF PUSH HL SUB 06H NEG LD B,A CALL L36DC POP HL LD BC,001DH ADD HL,BC POP AF INC (HL) DEC (HL) RET Z DEC A JR NZ,.2763 RET ;----------------------------------------------------------------------- L277A LD HL,0000H LD (DC14E),HL LD A,(DC0A3) ; monster count LD B,A LD A,(DC0A1) ; current monster number CP 1DH LD C,06H LD HL,DC0AC JR NZ,L2795 LD C,16H LD HL,DC0BC L2795 LD DE,0000H .2798 PUSH HL LD A,(HL) LD E,03H ADD HL,DE SUB (HL) LD E,A LD HL,(DC14E) ADD HL,DE LD (DC14E),HL POP HL PUSH BC LD B,00H ADD HL,BC POP BC DJNZ .2798 RET ;----------------------------------------------------------------------- L27AF LD HL,0000H LD (DC14E),HL LD (DC150),HL CALL L3899 ; A,B = number of PCs LD C,1DH LD HL,DC029 CALL L2795 LD A,(DC0A1) ; current monster number CALL L223F INC HL INC HL LD B,(HL) LD HL,(DC14E) EX DE,HL LD L,00H INC B DEC B JR Z,.27D9 .27D6 ADD HL,DE DJNZ .27D6 .27D9 LD DE,0014H LD BC,0000H OR A .27E0 INC BC SBC HL,DE JR NC,.27E0 DEC BC LD (DC150),BC RET ;----------------------------------------------------------------------- L27EB LD DE,0000H OR A JR NZ,.27F3 LD A,85H .27F3 SUB 83H RRCA LD E,A RET ;----------------------------------------------------------------------- L27F8 LD DE,0000H OR A RET Z SUB 66H RRCA LD E,A RET ;----------------------------------------------------------------------- L2802 LD DE,0000H OR A RET Z CP 0FFH LD E,0CH RET Z SUB 73H ADD A,A LD E,A RET ;----------------------------------------------------------------------- L2811 LD DE,0000H OR A RET Z SUB 0AEH LD E,A RET ;----------------------------------------------------------------------- L281A LD A,(DC0A3) ; monster count OR A RET NZ LD A,(DC0A2) BIT 1,A RET Z LD A,(DC128) ; current map number LD B,A ; B = A ADD A,A ; A = A * 2 ADD A,B ; A = A * 3 LD B,A CALL L3922 ; random number in A CP B RET NC LD A,(DC128) ; current map number CP 0FFH JR NZ,.283A LD A,07H .283A DEC A RET M ADD A,A LD C,A CALL L3922 ; random number in A CP 80H JR NC,.2846 INC C .2846 LD B,00H LD HL,D2919 ADD HL,BC LD A,(HL) LD (DC137),A INC A LD HL,D2927 .2854 LD C,(HL) INC HL DEC A JR Z,.285D INC HL ADD HL,BC JR .2854 .285D LD A,(HL) LD (DC138),A INC HL LD DE,3A2AH CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length LD DE,D5048 ; "wo mitsuketa!" LD C,N5048 ; (I guess B=0 here?) CALL L7F94 ; print message, DE=message, BC=length LD DE,D51F2 ; "subarashii / [ANY KEY]" CALL L7F2D ; print message group: DE=messages CALL L31A1 ; delay and wait for joypad button CALL L32DD ; clear bottom of screen .287C LD DE,D51F7 ; "donataga / tsukaimasuka ?" (who will take this?) CALL L7F2D ; print message group: DE=messages CALL L32B1 ; print PC name menu LD HL,D5039 ; "cancel" LD BC,N5039 CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length LD HL,3A31H CALL L35B4 ; do menu: HL=VRAM address => A=first char of item PUSH AF CALL L32DD ; clear bottom of screen POP AF IF ENGLISH CP _dash ; CANCEL ELSE CP tsu ; *J* tsukawanai ENDIF RET Z CALL L3329 ; HL=player selected in menu LD A,(DC137) LD DE,000DH PUSH HL POP BC CP 07H JR NC,.28AC INC DE .28AC ADD HL,DE CP 03H JR Z,.28B9 CP 05H JR Z,.28B9 CP 06H JR NZ,.28E6 .28B9 PUSH HL DEC HL DEC HL LD A,(HL) OR A JR Z,.28E5 PUSH BC LD HL,(DC00D) ; VRAM pointer to current menu item PUSH HL LD DE,D51C4 ; "SHIELDwo tebanashimasuka ?" etc. (weapon is two-handed) CALL L7F2D ; print message group: DE=messages LD HL,3A31H CALL L35B4 ; do menu: HL=VRAM address => A=first char of item POP HL LD (DC00D),HL ; VRAM pointer to current menu item PUSH AF CALL L32DD ; clear bottom of screen POP AF POP BC POP HL IF ENGLISH CP _N ; NO ELSE CP i_ ; *J* iie ENDIF JR Z,.287C PUSH HL DEC HL DEC HL LD (HL),00H .28E5 POP HL .28E6 LD A,(DC138) LD (HL),A LD HL,000AH ADD HL,BC EX DE,HL CALL L3772 CALL L3346 ; find line number in PC name menu LD A,0F0H LD HL,37C2H LD DE,0060H .28FD ADD A,10H ADD HL,DE DJNZ .28FD CALL L386D CALL L3329 ; HL=player selected in menu LD DE,0010H ADD HL,DE LD A,(DC137) CP 07H JR C,.2916 SET 6,(HL) RET .2916 SET 5,(HL) RET D2919 DB 00H,07H,01H,08H,02H,09H,03H,0AH DB 04H,0BH,05H,0BH,06H,0BH ; first byte is text length ; second byte is first name table char for item D2927 DB 04H,89H,_M,_A,_C,_E DB 0BH,8BH,_S,_H,_O,_R,_T,__,_S,_W,_O,_R,_D DB 03H,8DH,_A,_X,_E DB 05H,8FH,_S,_P,_E,_A,_R IF ENGLISH DB 0BH,91H,_B,_R,_O,_A,_D,__,_S,_W,_O,_R,_D ELSE DB 0BH,91H,_B,_L,_O,_R,_D,__,_S,_W,_O,_R,_D ; should be "broad sword" ENDIF DB 08H,93H,_C,_L,_A,_Y,_M,_O,_R,_E DB 0AH,95H,_B,_A,_T,_T,_L,_E,__,_A,_X,_E DB 07H,74H,_L,_E,_A,_T,_H,_E,_R IF ENGLISH DB 07H,75H,_H,_A,_U,_B,_E,_R,_K ELSE DB 06H,75H,_H,_U,_B,_E,_R,_K ; "should be hauberk" ENDIF DB 0AH,76H,_H,_A,_L,_F,__,_P,_L,_A,_T,_E DB 0AH,77H,_F,_U,_L,_L,__,_P,_L,_A,_T,_E DB 06H,78H,_T,_A,_B,_A,_R,_D ;----------------------------------------------------------------------- L299A CALL L2AB5 ; erase maze area LD BC,0200H CALL L7EDB ; delay .29A3 CALL L2ABF CALL L3357 ; A=room name index if carry set RES 1,(IY) JR NC,.29BF CP 21H ; "stairs" JR NZ,.29B9 SET 1,(IY) JR .29BC .29B9 JP NC,.2A96 ; kraken / onyx / color walls / tower .29BC CALL L33EF ; print room label: A=label index (or 00 if "well in front of you") .29BF LD A,(DC139) DEC A RET NZ LD HL,(DC12C) ; current map location LD A,(HL) DEC A LD L,A ; HL = A LD H,00H PUSH HL ; DE = HL POP DE ADD HL,HL ; HL = A * 2 ADD HL,HL ; HL = A * 4 ADD HL,DE ; HL = A * 5 LD DE,D3E81+4 ; room type flags ADD HL,DE ; HL = A * 5 + D3E81 + 4 BIT 6,(HL) ; bit 6 = hole/stairs down? (40H) JR Z,.29E8 BIT 2,(HL) ; bit 2 = ? (04H) RET NZ BIT 1,(HL) ; bit 1 = stairs? (02H) LD DE,D5220 ; "stairs going down" JR NZ,.29F9 LD DE,D5229 ; "hole going down" JR .29F9 .29E8 BIT 2,(HL) ; bit 2 = hole/stairs up? (04H) LD DE,D5244 ; "hole going up and down" JR Z,.29F9 BIT 5,(HL) ; bit 5 = stairs up? (20H) LD DE,D5232 ; "stairs going up" JR NZ,.29F9 LD DE,D523B ; "hole going up" .29F9 PUSH DE CALL L32DD ; clear bottom of screen POP DE CALL L7F2D ; print message group: DE=messages LD HL,3A96H CALL L35B4 ; do menu: HL=VRAM address => A=first char of item PUSH AF CALL L32DD ; clear bottom of screen LD BC,2000H CALL L7EDB ; delay POP AF IF ENGLISH CP _S ; STAY RET Z CP _C ; CLIMB (else DESCEND) ELSE CP u_ ; *J* ue (else 3C shita or 32 ikanai) RET C ; < u_ = 32 ikanai ENDIF PUSH AF CALL L1995 CALL L2AB5 ; erase maze area POP AF LD HL,DC128 ; current map number JR Z,.2A78 ; *J* ue/UP ; going down INC (HL) ; increment map number for going down LD A,(HL) ; DC129 column OR A JR NZ,.2A3B ; branch if not map 00 SET 1,(IY) LD HL,CT+2*800H+82H*8 LD BC,3*8 LD A,12H CALL L7F81 ; fill VRAM: HL=VRAM addr, BC=length, A=fill char => HL,AF saved LD HL,D6928 JR .2A67 .2A3B CP 06H JR Z,.2A46 ; branch if map 06 CP 01H CALL Z,L39BF ; call if map 01 JR .2A6F ; going down to map 06 .2A46 LD HL,DC136 LD A,(HL) CP 0E6H JR Z,.2A50 ; branch if color combination broken LD (HL),0FFH ; reset it to -1? (first color is now red?) .2A50 BIT 1,(IY) JR NZ,.2A6F OR A LD HL,(DC129) ; current column number in map LD DE,060BH SBC HL,DE LD HL,D690A ; 31-3A = B2 tan on green JR NZ,.2A67 LD HL,D690D ; 31-3A = 92 orange on green .2A67 LD DE,CT+31H*8 ; color table LD A,02H CALL L3AF6 ; load color table: HL=data, DE=VRAM address, A=number of times .2A6F CALL L3948 ; base address of current map to DC12E CALL L392F ; address of current map location to DC12C JP .29A3 ; going up .2A78 DEC (HL) ; decrement map number for going up LD A,(HL) CP 0FFH JR NZ,.2A83 ; branch if not top of tower CALL L3B7C JR .2A6F .2A83 CP 05H LD HL,D691C ; 31-33 = 72 / 34-3A = 42 JR Z,.2A67 OR A JR NZ,.2A6F BIT 1,(IY) CALL Z,L39BA JR .2A6F .2A96 CP 23H ; test for onyx room JR NZ,.2AA2 CALL L3081 ; found the black onyx IF OPT1 JP L000B ELSE LD HL,L000B PUSH HL RET ENDIF .2AA2 JP NC,.29BF ; branch if not color walls (leaving 22H kraken) BIT 0,(IY) ; test "kraken met" flag JP NZ,.29BF ; branch if kraken already met SET 0,(IY) ; set "kraken met" flag SET 3,(IY) ; set "kraken needed" flag RET ;----------------------------------------------------------------------- ; erase maze area L2AB5 LD HL,3810H LD BC,1110H ; 17x16 IF OPT1 JP L32CE ; erase a rectangle: HL=VRAM address, B=height, C=width ELSE CALL L32CE ; erase a rectangle: HL=VRAM address, B=height, C=width RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L2ABF LD HL,DC19D ; off-screen buffer for 3D maze LD BC,0110H LD A,4DH CALL L7EE5 ; fill memory: HL=address, BC=length, A=fill byte CALL L2B0E LD A,(DC128) ; current map number OR A JR NZ,.2AD9 BIT 1,(IY) JR Z,.2ADC .2AD9 CALL L2B1D .2ADC LD A,(DC12B) ; current facing direction CP 02H JR C,.2AEE JR Z,.2AF3 CP 04H JR C,.2AF8 CALL L2D8E JR .2AFB .2AEE CALL L2BB7 JR .2AFB .2AF3 CALL L2C4A JR .2AFB .2AF8 CALL L2CF7 .2AFB CALL L2B54 CALL L2B94 LD HL,DC19D ; off-screen buffer for 3D maze LD DE,3810H LD BC,1110H ; 17 x 16? IF OPT1 JP L7F1E ; put rectangular data on screen: B=height, C=width, DE=VRAM addr, HL=data ELSE CALL L7F1E ; put rectangular data on screen: B=height, C=width, DE=VRAM addr, HL=data RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L2B0E LD HL,D5965 LD A,55H ; top line CALL L2B2C LD DE,D5971 IF OPT1 JR L2B41 ELSE CALL L2B41 RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L2B1D LD HL,D593D LD A,54H ; bottom line CALL L2B2C LD DE,D5949 IF OPT1 JR L2B41 ELSE CALL L2B41 RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L2B2C LD B,04H ; four addresses in RAM to clear .2B2E PUSH BC LD E,(HL) ; DE = RAM address to clear INC HL LD D,(HL) INC HL LD B,00H LD C,(HL) ; BC = length to clear INC HL PUSH HL EX DE,HL ; HL = RAM address to clear CALL L7EE5 ; fill memory: HL=address, BC=length, A=fill byte POP HL POP BC DJNZ .2B2E RET ;----------------------------------------------------------------------- L2B41 LD HL,DC19D ; start of off-screen buffer for 3D maze LD BC,000EH ; 14 parts .2B47 PUSH BC LD A,(DE) ; B=00, C=(DE) LD C,A ADD HL,BC ; HL = HL + (DE) INC DE LD A,(DE) ; second byte = name table char for maze part INC DE LD (HL),A POP BC DEC C JR NZ,.2B47 ; loop for all 14 parts RET L2B54 LD HL,DC29D LD A,(HL) CP 52H LD (HL),82H JR Z,.2B66 LD (HL),85H LD DE,3428H CALL L2B7F .2B66 LD HL,DC29E LD B,0EH .2B6B LD (HL),83H INC HL DJNZ .2B6B LD A,(HL) CP 4FH LD (HL),84H RET Z LD (HL),86H LD DE,3430H IF OPT2 ; (nothing) ELSE CALL L2B7F RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L2B7F LD H,00H LD L,A ADD HL,HL ADD HL,HL ADD HL,HL LD BC,2000H ADD HL,BC CALL L7FAD ; read one byte from VDP: HL=VRAM address => A=data LD BC,0008H EX DE,HL IF OPT2 JP L7F81 ; fill VRAM: HL=VRAM addr, BC=length, A=fill char => HL,AF saved ELSE CALL L7F81 ; fill VRAM: HL=VRAM addr, BC=length, A=fill char => HL,AF saved RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L2B94 LD A,(DC128) ; current map number OR A RET NZ LD HL,DC20D LD C,10H .2B9E PUSH HL LD A,(HL) CP 3BH ; sa JR C,.2BB1 CP 42H ; tsu JR NC,.2BB1 LD B,07H LD DE,0FFF0H .2BAD ADD HL,DE LD (HL),A DJNZ .2BAD .2BB1 POP HL INC HL DEC C JR NZ,.2B9E RET L2BB7 LD B,03H .2BB9 PUSH BC LD A,B LD (DC134),A LD HL,(DC12C) ; current map location DEC HL CALL L2C33 CALL L2BE8 POP BC DEC B JP P,.2BB9 .2BCD INC B PUSH BC LD A,B LD (DC134),A LD HL,(DC12C) ; current map location CALL L2C33 CALL L2C17 POP BC BIT 4,(IY) RET NZ LD A,B CP 03H JR NZ,.2BCD RET ;----------------------------------------------------------------------- L2BE8 PUSH HL LD A,(DC129) ; current column number in map OR A JR NZ,.2BF3 LD BC,0010H ADD HL,BC .2BF3 CALL L3AE7 ; A=map data at (HL), HL=square data address CALL L2E43 POP HL INC HL PUSH HL CALL L3AE7 ; A=map data at (HL), HL=square data address CALL L2E47 POP HL INC HL LD A,(DC129) ; current column number in map CP 0FH JR C,.2C10 LD DE,0010H SBC HL,DE .2C10 CALL L3AE7 ; A=map data at (HL), HL=square data address IF OPT2 JP L2E4B ELSE CALL L2E4B RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L2C17 CALL L3AE7 ; A=map data at (HL), HL=square data address LD DE,0003H ADD HL,DE PUSH HL PUSH AF CALL L2F05 POP AF POP HL DEC HL DEC HL PUSH HL PUSH AF CALL L2F09 POP AF POP HL DEC HL IF OPT2 JP L303D ELSE CALL L303D RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L2C33 LD C,B INC B DEC B JR Z,.2C40 LD DE,0010H XOR A .2C3C SBC HL,DE DJNZ .2C3C .2C40 LD A,(DC12A) ; current row number in map SUB C RET NC LD DE,0100H ADD HL,DE RET ;----------------------------------------------------------------------- L2C4A LD HL,(DC12C) ; current map location LD DE,0003H ADD HL,DE LD E,10H SBC HL,DE LD A,(DC12A) ; current row number in map OR A JR NZ,.2C5F LD DE,0100H ADD HL,DE .2C5F SET 5,(IY) CALL L2CAF LD HL,(DC12C) ; current map location LD DE,0003H ADD HL,DE LD E,10H ADD HL,DE LD A,(DC12A) ; current row number in map CP 0FH JR C,.2C7D LD DE,0100H XOR A SBC HL,DE .2C7D RES 5,(IY) CALL L2CAF LD BC,0000H .2C87 PUSH BC LD A,C LD (DC134),A LD HL,(DC12C) ; current map location ADD HL,BC LD A,(DC129) ; current column number in map ADD A,C CP 10H JR C,.2C9D LD BC,0010H SBC HL,BC .2C9D POP BC PUSH BC CALL L2CDF POP BC BIT 4,(IY) RET NZ INC C LD A,C CP 04H JR NZ,.2C87 RET ;----------------------------------------------------------------------- L2CAF LD B,03H .2CB1 PUSH BC LD A,B LD (DC134),A PUSH HL LD A,(DC129) ; current column number in map ADD A,B CP 10H JR C,.2CC4 LD BC,0010H SBC HL,BC .2CC4 CALL L3AE7 ; A=map data at (HL), HL=square data address INC HL BIT 5,(IY) JR Z,.2CD3 CALL L2E43 JR .2CD6 .2CD3 CALL L2E4B .2CD6 POP HL DEC HL POP BC DEC B JP P,.2CB1 INC B RET ;----------------------------------------------------------------------- L2CDF CALL L3AE7 ; A=map data at (HL), HL=square data address PUSH HL PUSH AF CALL L2F05 POP AF POP HL INC HL INC HL PUSH HL PUSH AF CALL L2F09 POP AF POP HL DEC HL IF OPT2 JP L302F ELSE CALL L302F RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L2CF7 LD B,03H .2CF9 PUSH BC LD A,B LD (DC134),A LD HL,(DC12C) ; current map location INC HL CALL L2D76 CALL L2D28 POP BC DEC B JP P,.2CF9 .2D0D INC B PUSH BC LD A,B LD (DC134),A LD HL,(DC12C) ; current map location CALL L2D76 CALL L2D5D POP BC BIT 4,(IY) RET NZ LD A,B CP 03H JR NZ,.2D0D RET ;----------------------------------------------------------------------- L2D28 PUSH HL LD A,(DC129) ; current column number in map CP 0FH JR C,.2D35 LD DE,0010H SBC HL,DE .2D35 CALL L3AE7 ; A=map data at (HL), HL=square data address INC HL INC HL CALL L2E43 POP HL DEC HL PUSH HL CALL L3AE7 ; A=map data at (HL), HL=square data address INC HL INC HL CALL L2E47 POP HL DEC HL LD A,(DC129) ; current column number in map OR A JR NZ,.2D54 LD DE,0010H ADD HL,DE .2D54 CALL L3AE7 ; A=map data at (HL), HL=square data address INC HL INC HL IF OPT2 JP L2E4B ELSE CALL L2E4B RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L2D5D CALL L3AE7 ; A=map data at (HL), HL=square data address INC HL PUSH HL PUSH AF CALL L2F05 POP AF POP HL INC HL INC HL PUSH HL PUSH AF CALL L2F09 POP AF POP HL DEC HL IF OPT2 JP L303D ELSE CALL L303D RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L2D76 LD C,B INC B DEC B JR Z,.2D81 LD DE,0010H .2D7E ADD HL,DE DJNZ .2D7E .2D81 LD A,(DC12A) ; current row number in map ADD A,C CP 10H RET C LD DE,0100H SBC HL,DE RET ;----------------------------------------------------------------------- L2D8E LD HL,(DC12C) ; current map location LD DE,0003H XOR A SBC HL,DE LD DE,0010H ADD HL,DE LD A,(DC12A) ; current row number in map CP 0FH JR C,.2DA7 LD DE,0100H SBC HL,DE .2DA7 SET 5,(IY) CALL L2DF6 LD HL,(DC12C) ; current map location LD DE,0003H XOR A SBC HL,DE LD E,10H SBC HL,DE LD A,(DC12A) ; current row number in map OR A JR NZ,.2DC5 LD DE,0100H ADD HL,DE .2DC5 RES 5,(IY) CALL L2DF6 LD BC,0000H .2DCF PUSH BC LD A,C LD (DC134),A XOR A LD HL,(DC12C) ; current map location SBC HL,BC LD A,(DC129) ; current column number in map SUB C JR NC,.2DE4 LD DE,0010H ADD HL,DE .2DE4 POP BC PUSH BC CALL L2E26 POP BC BIT 4,(IY) RET NZ INC C LD A,C CP 04H JR NZ,.2DCF RET ;----------------------------------------------------------------------- L2DF6 LD B,03H .2DF8 PUSH BC LD A,B LD (DC134),A PUSH HL LD A,(DC129) ; current column number in map SUB B JR NC,.2E08 LD DE,0010H ADD HL,DE .2E08 CALL L3AE7 ; A=map data at (HL), HL=square data address LD DE,0003H ADD HL,DE BIT 5,(IY) JR Z,.2E1A CALL L2E43 JR .2E1D .2E1A CALL L2E4B .2E1D POP HL INC HL POP BC DEC B JP P,.2DF8 INC B RET ;----------------------------------------------------------------------- L2E26 CALL L3AE7 ; A=map data at (HL), HL=square data address INC HL INC HL ; dir 03 PUSH HL PUSH AF CALL L2F05 POP AF POP HL DEC HL DEC HL ; dir 01 PUSH HL PUSH AF CALL L2F09 POP AF POP HL LD DE,0003H ADD HL,DE IF OPT2 JP L302F ELSE CALL L302F RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L2E43 LD B,00H JR L2E4D L2E47 LD B,01H JR L2E4D L2E4B LD B,02H L2E4D CALL L306B OR A RET Z L2E52 PUSH AF ADD A,06H LD E,A DEC A LD D,A POP AF JR C,.2E65 CP 34H JR NZ,.2E65 LD A,31H LD D,32H LD E,33H .2E65 LD C,A LD HL,L2E9D PUSH HL LD A,(DC134) CP 01H JR C,.2E8A JR Z,L2EC8 CP 03H JR C,L2EEA LD A,C DEC B LD BC,0301H LD HL,DC212 RET M LD HL,DC216 RET NZ LD HL,DC214 LD C,01H RET .2E8A LD A,C DEC B LD BC,0F01H LD HL,DC1AC RET M LD HL,DC1BC RET NZ LD HL,DC1AE LD C,0DH RET L2E9D JR Z,.2EA6 JP M,.2EAA LD D,00H JR .2EAC .2EA6 LD D,A LD E,A JR .2EAC .2EAA LD E,00H .2EAC PUSH BC PUSH HL INC E DEC E JR Z,.2EB3 LD (HL),E .2EB3 INC HL DEC C JR Z,.2EBA LD (HL),A JR .2EB3 .2EBA INC D DEC D JR Z,.2EBF LD (HL),D .2EBF POP HL LD BC,0010H ADD HL,BC POP BC DJNZ .2EAC RET L2EC8 LD A,C BIT 7,(IY) JR NZ,.2EE1 DEC B LD BC,0904H LD HL,DC1DC .2ED6 RET M LD HL,DC1E9 RET NZ LD HL,DC1E1 LD C,07H RET .2EE1 DEC B LD BC,0903H LD HL,DC1DD JR .2ED6 ;----------------------------------------------------------------------- L2EEA LD A,C DEC B LD BC,0502H LD HL,DC200 RET M LD HL,DC207 RET NZ LD HL,DC203 LD C,03H RET ;----------------------------------------------------------------------- IF OPT1 ELSE L2EFD LD B,00H ; *** UNREACHABLE *** JR L2F10 L2F01 LD B,02H ; *** UNREACHABLE *** JR L2F10 ENDIF L2F05 LD B,00H JR L2F0B L2F09 LD B,02H L2F0B CALL L306B OR A RET Z L2F10 LD C,A LD A,(DC134) PUSH BC LD HL,L2F70 PUSH HL OR A JR Z,.2F5C CP 02H LD A,C JR C,.2F36 JR Z,.2F49 INC B DEC B LD BC,0101H LD HL,D3006 LD DE,DC203 RET Z LD HL,D300B LD DE,DC206 RET .2F36 INC B DEC B LD BC,0303H LD HL,D2FFE LD DE,DC1AE RET Z LD HL,D300E LD DE,DC1B9 RET .2F49 INC B DEC B LD BC,0202H LD HL,D3006 LD DE,DC1E1 RET Z LD HL,D300A LD DE,DC1E7 RET .2F5C LD A,C INC B DEC B LD BC,0101H LD HL,D3006 LD DE,DC19D ; off-screen buffer for 3D maze RET Z LD HL,D300B LD DE,DC1AC RET ;----------------------------------------------------------------------- L2F70 CALL L2FE1 POP BC LD A,C PUSH BC SCF SET 7,(IY) CALL L2E52 RES 7,(IY) POP BC LD HL,L2FE1 PUSH HL LD A,(DC134) OR A JR Z,.2FCD CP 02H LD A,C JR C,.2FA7 JR Z,.2FBA INC B DEC B LD BC,0101H LD HL,D3020 LD DE,DC243 RET Z LD HL,D3023 LD DE,DC246 RET .2FA7 INC B DEC B LD BC,0303H LD HL,D3016 LD DE,DC26E RET Z LD HL,D3026 LD DE,DC279 RET .2FBA INC B DEC B LD BC,0202H LD HL,D301F LD DE,DC251 RET Z LD HL,D3023 LD DE,DC257 RET .2FCD LD A,C INC B DEC B LD BC,0101H LD HL,D3020 LD DE,DC29D RET Z LD HL,D3023 LD DE,DC2AC RET ;----------------------------------------------------------------------- L2FE1 DEC A .2FE2 PUSH BC PUSH DE .2FE4 PUSH BC LD B,(HL) INC B DEC B POP BC JR Z,.2FEE ADD A,(HL) LD (DE),A SUB (HL) .2FEE INC HL INC DE DEC C JR NZ,.2FE4 EX DE,HL POP HL LD BC,0010H ADD HL,BC EX DE,HL POP BC DJNZ .2FE2 RET ;----------------------------------------------------------------------- D2FFE DB 02H,00H,00H,01H,02H,00H,01H,01H D3006 DB 02H,00H,01H,02H D300A DB 00H D300B DB 03H,03H,01H D300E DB 00H,00H,03H,00H,03H,01H,03H,01H D3016 DB 01H,01H,04H,01H,04H,00H,04H,00H,00H D301F DB 01H D3020 DB 04H,04H,00H D3023 DB 05H,01H,00H D3026 DB 05H,01H,01H,00H,05H,01H,00H,00H,05H ;----------------------------------------------------------------------- L302F CALL L306B OR A RES 4,(IY) RET Z CALL L2E47 JR L3046 L303D CALL L306B OR A RES 4,(IY) RET Z L3046 SET 4,(IY) CP 42H ; tsu RET NZ LD HL,DC21D LD A,(DC134) CP 01H LD DE,000DH JR C,.3066 LD E,0BH JR Z,.3066 CP 03H LD E,09H JR C,.3066 LD E,08H .3066 ADD HL,DE ADD A,49H LD (HL),A RET ;----------------------------------------------------------------------- L306B OR A RET Z XOR A BIT 7,(HL) RET NZ LD A,42H BIT 6,(HL) RET NZ LD A,34H BIT 5,(HL) RET NZ BIT 3,(HL) RET NZ LD A,3BH RET ;----------------------------------------------------------------------- L3081 CALL L7B3B ; initialize PSG LD HL,SAT ; sprite attribute table LD A,0D0H ; "end of sprite list" value CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data CALL L079E ; clear screen LD BC,0107H ; reg 7 = 01, background color = black CALL L7F73 ; write VDP register: C=register, B=data LD HL,D63F8 ; hiragana/katakana to char codes starting at 30H LD DE,PT+1*800H+30H*8 ; copy to second part of pattern table LD BC,N63F8 CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length LD HL,D6903 LD DE,CT+0980H ; color table LD A,01H CALL L3AF6 ; load color table: HL=data, DE=VRAM address, A=number of times LD HL,D5C40 ; green egg chars LD DE,0180H LD BC,N5C40 CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length LD C,00H CALL L3119 LD HL,D3178 ; green egg LD DE,384EH LD BC,0603H CALL L7F1E ; put rectangular data on screen: B=height, C=width, DE=VRAM addr, HL=data LD DE,D524F ; "omedetou / toutou kimiwa BLACK ONYX wo teniireru" CALL L7F2D ; print message group: DE=messages LD BC,2000H CALL L7EDB ; delay LD HL,0050H ; set timer LD (DC002),HL XOR A LD (DC008),A .30DF LD HL,DC008 LD A,(HL) INC (HL) CP 03H JR NZ,.30EA LD (HL),00H .30EA LD C,A CALL L3119 LD BC,0C00H CALL L7EDB ; delay LD HL,(DC002) ; decrement timer DEC HL LD (DC002),HL LD A,H OR L JR NZ,.30DF ; loop until timer runs out IF OPT1 CALL L079E ; clear screen ELSE ; *** not optimal *** LD HL,3800H ; clear screen LD BC,0300H LD A,__ CALL L7F81 ; fill VRAM: HL=VRAM addr, BC=length, A=fill char => HL,AF saved ENDIF LD DE,D52C5 ; credits CALL L7F2D ; print message group: DE=messages LD A,30H CALL L31B1 ; delay in A IF OPT2 JR L318A ; "GAME OVER" screen ELSE CALL L318A ; "GAME OVER" screen RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L3119 LD HL,2190H CALL L7FCA ; set VRAM drite address: HL=VRAM address LD HL,D3157 LD B,0DH .3124 PUSH BC LD A,(HL) PUSH HL LD B,00H LD HL,DC19D ; off-screen buffer for 3D maze LD (HL),A XOR A RLD .3130 LD DE,D3171 CP 03H JR C,.3146 JR Z,.3141 CP 0CH JR C,.3140 JR Z,.3142 INC DE .3140 INC DE .3141 INC DE .3142 EX DE,HL ADD HL,BC EX DE,HL LD A,(DE) .3146 RLD OR A JR NZ,.3130 LD A,(HL) POP HL INC HL LD C,(HL) INC HL CALL L7F86 ; fill VRAM: BC=length, A=fill char POP BC DJNZ .3124 RET D3157 DB 0C1H,41H,0C3H,07H,0C1H,01H,0C3H,1CH DB 0C1H,03H,0C3H,05H,0C1H,03H,0C3H,06H DB 0B3H,08H,0FBH,05H,0B3H,04H,0C3H,01H DB 0FBH,08H D3171 DB 0CH,03H,0BH,0FH,0CH,03H,0BH ; six rows x three chars to VRAM 384E - green egg D3178 DB 32H,33H,34H DB 35H,40H,36H DB 3AH,41H,3BH DB 3CH,43H,3DH DB 3EH,42H,3FH DB 37H,38H,39H ;----------------------------------------------------------------------- ; "GAME OVER" screen IF OPT1 L318A CALL L079E ; clear screen ELSE ; *** not optimal *** L318A LD HL,3800H ; clear screen LD BC,0300H LD A,__ CALL L7F81 ; fill VRAM: HL=VRAM addr, BC=length, A=fill char => HL,AF saved ENDIF LD HL,D52B9 ; "GAME OVER" CALL L7F3F ; print message with screen address LD A,10H IF OPT2 JR L31B1 ; delay in A ELSE CALL L31B1 ; delay in A RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- ; delay and wait for joypad button L31A1 LD BC,2000H CALL L7EDB ; delay .31A7 LD HL,(DC009) ; joypad buttons LD A,H OR L JR Z,.31A7 RET ;----------------------------------------------------------------------- ; message speed delay L31AF LD A,(DC00F) ; message speed ; delay in A IF COLECO L31B1 ELSE L31B1 EQU $-1 ; C0 = RET NZ (becomes 70 "LD (HL),B" on Coleco!) ENDIF ; delay in A L31B2 INC A ; A=(A+1)*4 ADD A,A ADD A,A LD C,A L31B6 LD B,03H .31B8 CALL L026F ; wait for vblank? DJNZ .31B8 DEC C JR NZ,L31B6 RET ;----------------------------------------------------------------------- ; handle arrow keys for name/password menus L31C1 LD HL,DC00A ; HL => joypad direction LD A,(HL) ; get joypad direction INC HL ; HL => last direction at DC00B CP 00H JR NZ,.31CD LD (HL),00H RET .31CD CP (HL) LD (HL),A INC HL LD A,1EH JR NZ,.31D8 DEC (HL) RET NZ LD A,0FH .31D8 LD (HL),A DEC HL LD A,(HL) ; get direction ADD A,A LD HL,D31EC-2 LD D,00H LD E,A ADD HL,DE ; HL = D31EC + direction * 2 LD E,(HL) INC HL LD D,(HL) ; DE = handler for current direction LD HL,L324F ; delay 2000, saves BC PUSH HL ; push delay routine PUSH DE ; jump to direction handler routine RET ; 01 U 02 UR 03 R 04 DR 05 D 06 DL 07 L 08 UL D31EC DW L31FF,L3203,L3206,L320A,L320D,L3211,L3214,L31FC L31FC CALL L3227 ; left then up IF OPT2 L31FF JR L3218 ; up ELSE L31FF CALL L3218 ; up RET ; *** not optimal *** ENDIF L3203 CALL L3218 ; up then right IF OPT2 L3206 JR L3222 ; right ELSE L3206 CALL L3222 ; right RET ; *** not optimal *** ENDIF L320A CALL L3222 ; right then down IF OPT2 L320D JR L321D ; down ELSE L320D CALL L321D ; down RET ; *** not optimal *** ENDIF L3211 CALL L321D ; down then left IF OPT2 L3214 JR L3227 ; left ELSE L3214 CALL L3227 ; left RET ; *** not optimal *** ENDIF ; up L3218 LD DE,-40H-20H ; up two lines JR L322A ; down L321D LD DE,+40H-20H ; down two lines JR L322A ; right L3222 LD DE,+2-20H ; left two lines JR L322A ; left L3227 LD DE,-2-20H ; right two lines L322A LD HL,(DC00D) ; VRAM pointer to current menu item PUSH HL ADD HL,DE IF EXTRA ; wrap-around left and right edges LD A,L ; save high three bits of L AND E0H LD B,A LD A,L ; test low five bits of L AND 1FH JR NZ,.10 ; if (L & 3F) = 20 -> subtract 1E LD DE,001EH SBC HL,DE ; subtract 1E to move from right edge to left ; if (L & 3F) = 00 -> add 1E BIT 5,B JR NZ,.99 ADD HL,DE ; add 1E to move from left edge to right ADD HL,DE JR .99 .10 ; if (L & 1F) = 1D -> 0B CP 1DH JR NZ,.20 LD A,0BH JR .98 .20 ; if (L & 1F) = 09 -> 1B CP 09H JR NZ,.99 LD A,1BH .98 OR B LD L,A .99 ; vertical wrap: ; BIT 0,L: odd=name, even=password ; name: (HL & FFE0) = 3900-40 -> add 6*40H ; (HL & FFE0) = 3960+40 -> subtract 6*40H ; password: (HL & FFE0) = 3920-40 -> add 3*40H ; (HL & FFE0) = 3A60+40 -> subtract 3*40H ENDIF CALL L7FAD ; read one byte from VDP: HL=VRAM address => A=data CP _rarr JR NC,.323C ; branch if >= right arrow (hiragana) CP __ JR C,.323C ; branch if < blank (alphanumeric) POP HL RET ; return if blank (or other invalid character) .323C LD DE,0020H ; move down a line ADD HL,DE LD A,_uarr ; put new up arrow on screen CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data LD (DC00D),HL ; VRAM pointer to current menu item POP HL LD A,__ ; clear old up arrow from screen IF OPT2 JP L7FB5 ; write one byte to VDP: HL=VRAM address, A=data ELSE CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data RET ; *** not optimal *** ENDIF ; delay 2000, saves BC L324F PUSH BC LD BC,2000H CALL L7EDB ; delay POP BC RET ;----------------------------------------------------------------------- ; handle menu up/down L3258 LD HL,DC00A ; get joystick directionals LD A,(HL) INC HL ; HL => last direction CP 01H ; up JR Z,.3268 CP 05H ; down JR Z,.3268 LD (HL),00H ; clear last direction if not acceptable RET .3268 CP (HL) ; compare with last direction LD (HL),A ; update last direction INC HL ; HL => last direction repeat delay LD A,1EH ; delay first time value JR NZ,.3273 ; branch if direction changed DEC (HL) ; decrement delay if no change RET NZ ; return if delay not finished LD A,0FH ; delay repeat time value .3273 LD (HL),A ; set delay timer DEC HL ; HL => last direction LD A,(HL) ; get (new) last direction LD HL,(DC00D) ; VRAM pointer to current menu item CP 01H ; up JR Z,.3282 ; branch if up LD DE,0022H ; down: look for item on next line JR .3285 .3282 LD DE,0FFE2H ; up: look for item on previous line .3285 PUSH HL ADD HL,DE ; add offset to VRAM address of current item CALL L7FAD ; read one byte from VDP: HL=VRAM address => A=data CP 82H ; don't move arrow if >= 82H (end of hiragana) JR NC,.3296 CP _rarr ; branch if >= right arrow (hiragana) JR NC,.3298 CP __ ; branch if < blank (alpha and left arrow) JR C,.3298 .3296 POP HL ; exit if [25H..2FH] or >=82H RET .3298 DEC HL ; back up two chars DEC HL LD A,_rarr ; put right arrow on new item CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data LD (DC00D),HL ; update menu item pointer POP HL ; get back old item pointer LD A,__ ; blank out the arrow CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data IF OPT1 JR L324F ELSE PUSH BC LD BC,2000H CALL L7EDB ; delay POP BC RET ENDIF ;----------------------------------------------------------------------- ; print PC name menu L32B1 LD HL,DC010 LD DE,3A33H LD B,05H .32B9 XOR A CP (HL) RET Z PUSH BC LD BC,000AH CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length LD C,20H ADD HL,BC EX DE,HL LD C,13H ADD HL,BC POP BC DJNZ .32B9 RET ;----------------------------------------------------------------------- ; erase a rectangle: HL=VRAM address, B=height, C=width L32CE LD A,__ .32D0 PUSH BC LD B,00H CALL L7F81 ; fill VRAM: HL=VRAM addr, BC=length, A=fill char => HL,AF saved LD C,20H ADD HL,BC POP BC DJNZ .32D0 RET ;----------------------------------------------------------------------- ; clear bottom of screen IF ENGLISH L32DD LD HL,3A20H LD BC,0620H ELSE L32DD LD HL,3A22H LD BC,061CH ENDIF IF OPT2 JR L32CE ; code re-arrangement would be even better ELSE CALL L32CE ; erase a rectangle: HL=VRAM address, B=height, C=width RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- ; print 3-byte BCD number at (HL): HL=last/high byte of number, DE=VRAM addr ; even though there are three bytes, this only prints up to five digits (lowest digit ignored) L32E7 PUSH DE LD DE,DC1AB ; DE = temp buffer LD B,03H ; 3 bytes of BCD XOR A ; clear high nibble of A .32EE RLD ; A = high nibble LD (DE),A ; store high nibble in buffer INC DE RLD ; A = low nibble LD (DE),A ; store low nibble in buffer RLD ; restore (HL) to original value, A = 00 INC DE DEC HL ; point to previous number byte (next digit) DJNZ .32EE ; loop for next byte LD HL,DC1AB ; HL = temp buffer LD B,04H ; B = up to 4 digits of suppressed leading zeros .3300 CP (HL) ; is next digit a zero? JR NZ,.3308 ; branch if not LD (HL),__ ; put a blank in buffer instead of the leading zero INC HL ; point to next digit DJNZ .3300 ; loop for next zero-suppression .3308 POP DE LD HL,DC1AB ; HL = temp buffer LD BC,0005H ; BC = 5 digits IF OPT2 JP L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length ELSE CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- IF OPT1 ELSE L3313 LD B,06H ; *** UNREACHABLE *** (length of monster name) JR L3319 ENDIF ; print PC name, DE=name, HL=VRAM addr L3317 LD B,0AH ; (length of PC name) L3319 CALL L7FCA ; set VRAM drite address: HL=VRAM address EX (SP),HL EX (SP),HL .331E LD A,(DE) OUT (VDPdata),A INC DE LD A,(DE) CP __ RET Z DJNZ .331E RET ;----------------------------------------------------------------------- ; HL=player selected in menu L3329 LD HL,(DC00D) ; VRAM pointer to current menu item LD B,01H LD DE,3A31H .3331 XOR A SBC HL,DE JR Z,.333C LD DE,0020H INC B JR .3331 .333C LD HL,DC010-001DH LD DE,001DH .3342 ADD HL,DE DJNZ .3342 RET ;----------------------------------------------------------------------- ; find line number in PC name menu L3346 LD HL,(DC00D) ; VRAM pointer to current menu item LD DE,3A00H XOR A SBC HL,DE LD B,A LD A,L .3351 SUB 20H RET C INC B JR .3351 ;----------------------------------------------------------------------- ; A=room name index if carry set L3357 LD A,(DC128) ; current map number CP 0FFH JR NZ,.3360 LD A,07H ; change map FF to map 07 .3360 ADD A,A ; HL = HL * 2 LD HL,D3C69 LD E,A LD D,00H ADD HL,DE ; HL = address of pointer to map data LD A,(HL) INC HL LD H,(HL) LD L,A ; HL = pointer to map data LD B,(HL) ; B = count byte .336D INC HL LD DE,DC129 ; current column number in map LD A,(DE) ; column CP (HL) ; compare column with first byte INC HL JR Z,.337C ; branch if same column number .3376 INC HL .3377 INC HL DJNZ .336D XOR A ; clear carry and return zero RET .337C INC DE LD A,(DE) ; row CP (HL) ; compare row with second byte JR NZ,.3376 ; loop if no match INC HL INC DE LD A,(HL) ; get third byte CP 05H JR Z,.338C ; always match (any facing) if = 05 LD A,(DE) ; facing CP (HL) ; compare facing with third byte JR NZ,.3377 ; loop if no match .338C INC HL LD A,(HL) ; get special code SCF ; and set carry flag RET ;----------------------------------------------------------------------- L3390 LD A,(DC128) ; current map number CP 0FFH JR NZ,.3399 LD A,07H ; change map FF to 07 .3399 ADD A,A ; HL = D3B93 + A*2 LD HL,D3B93 LD E,A LD D,00H ADD HL,DE LD A,(HL) ; HL = (HL) INC HL LD H,(HL) LD L,A LD B,(HL) ; B = first byte (count) LD A,(HL) ; return if first byte = 00H OR A RET Z .33A9 INC HL LD DE,DC129 ; current column number in map LD A,(DE) CP (HL) INC HL JR Z,.33B9 .33B2 INC HL .33B3 INC HL INC HL DJNZ .33A9 XOR A RET .33B9 INC DE LD A,(DE) CP (HL) JR NZ,.33B2 INC HL INC DE LD A,(HL) CP 05H JR Z,.33C9 LD A,(DE) CP (HL) JR NZ,.33B3 .33C9 INC HL LD A,(DC128) ; current map number CP 06H JR NZ,.33E3 LD A,(DC129) ; current column number in map CP 29H JR NZ,.33E3 LD A,(DC136) CP 0FFH JR Z,.33E3 LD DE,000AH ADD HL,DE .33E3 LD DE,DC129 ; current column number in map LDI LDI CALL L392F ; address of current map location to DC12C SCF RET ;----------------------------------------------------------------------- ; print room label: A=label index (or 00 if "well in front of you") L33EF CP 20H JR Z,.33F7 CP 1FH JR NZ,.3401 .33F7 LD B,A LD HL,DC139 LD A,(HL) DEC A RET NZ LD (HL),00H LD A,B .3401 PUSH AF OR A JR NZ,.3416 ; branch if room name != 0 LD B,N344E LD HL,DC128 ; current map number LD DE,D344E .340D LD A,(DE) CP (HL) JR NZ,.3440 ; if no match, print "there is a well in front of you" INC HL INC DE DJNZ .340D XOR A ; apparently it really was Tom's Grog .3416 ADD A,A ; A = room name number LD E,A LD D,00H LD HL,D53FB ; special room names ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A ; HL = pointer to name LD C,(HL) LD B,00H ; BC = length of blanks LD A,__ ; fill it with blanks EX DE,HL LD HL,3A50H CALL L7F81 ; fill VRAM: HL=VRAM addr, BC=length, A=fill char => HL,AF saved INC DE LD A,(DE) ; get length again LD C,A INC DE CALL L7F94 ; print message, DE=message, BC=length POP AF CP 1FH JR Z,.343C CP 20H .343C CALL Z,L31AF ; message speed delay RET .3440 LD HL,D3451 ; "there is a well in front of you" LD DE,3A50H LD BC,N3451 CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length POP AF RET D344E DB 00H,02H,05H ; map 00, col 02, row 05 (tom's grog location?) N344E EQU $-D344E IF ENGLISH D3451 DB _Y,_O,_U,_,_S,_E,_E,_,_A,_,_W,_E,_L,_L ELSE ; "mukouni idoga mieru" D3451 DB mu,ko,u_,ni,_,i_,to,ten,ka,ten,_,mi,e_,ru ENDIF N3451 EQU $-D3451 ;----------------------------------------------------------------------- ; BCD or string compare: (DE)-(HL), BC=length L345F LD A,(DE) CP (HL) RET NZ DEC HL DEC DE DJNZ L345F RET ;----------------------------------------------------------------------- L3467 LD HL,3AB5H LD A,30H CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data LD A,25H LD BC,0004H CALL L7F86 ; fill VRAM: BC=length, A=fill char LD (DC00D),HL ; VRAM pointer to current menu item LD BC,2000H CALL L7EDB ; delay XOR A LD (DC00B),A .3484 LD A,(DC00A) LD BC,0004H LD HL,D3529 CPIR JR NZ,.3501 LD HL,DC00B CP (HL) LD (HL),A INC HL LD A,3CH JR NZ,.34A0 DEC (HL) JR NZ,.3501 LD A,1EH .34A0 LD (HL),A DEC HL LD A,(HL) LD HL,(DC00D) ; VRAM pointer to current menu item LD DE,0FFE0H ADD HL,DE CP 03H JR C,.34B6 JR Z,.34C3 CP 07H JR C,.34D6 JR .34E2 .34B6 CALL L7FAD ; read one byte from VDP: HL=VRAM address => A=data CP 09H ; _9? JR Z,.3501 INC A CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data JR .34FB .34C3 INC HL CALL L7FAD ; read one byte from VDP: HL=VRAM address => A=data CP 0AH ; _9+1? JR NC,.3501 LD HL,(DC00D) ; VRAM pointer to current menu item LD A,__ CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data INC HL JR .34F3 .34D6 CALL L7FAD ; read one byte from VDP: HL=VRAM address => A=data DEC A JP M,.3501 CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data JR .34FB .34E2 DEC HL CALL L7FAD ; read one byte from VDP: HL=VRAM address => A=data CP __ JR Z,.3501 LD HL,(DC00D) ; VRAM pointer to current menu item LD A,25H CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data DEC HL .34F3 LD A,30H CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data LD (DC00D),HL ; VRAM pointer to current menu item .34FB LD BC,2000H CALL L7EDB ; delay .3501 LD A,(DC009) ; joypad buttons BIT 1,A ; button 2 JP Z,.3484 LD HL,3A95H CALL L7FBF ; set VRAM read address: HL=VRAM address LD HL,DC19F LD B,02H EX (SP),HL EX (SP),HL .3516 IN A,(VDPdata) RLD IN A,(VDPdata) RLD DEC HL DJNZ .3516 IN A,(VDPdata) RLD XOR A RLD RET D3529 DB 01H,03H,05H,07H ; up down left right ;----------------------------------------------------------------------- ; BCD add: (HL)=(HL)+DE, B=length in bytes L352D OR A .352E LD A,(DE) ADC A,(HL) DAA LD (DE),A INC HL INC DE DJNZ .352E RET ;----------------------------------------------------------------------- ; BCD subtract: (HL)=(HL)-(DE), B=length in bytes L3537 OR A .3538 LD A,(DE) SBC A,(HL) DAA LD (DE),A INC HL INC DE DJNZ .3538 RET ;----------------------------------------------------------------------- ; convert to decimal: A=number => B=hundreds C=tens A=ones ; wierdness: this counts down from 99 then does 10's remainder L3541 LD BC,_9*256+_9 ; 99 .3544 CP 10 JR C,.3553 ; branch if < 10 SUB 10 ; subtract 10 DEC C ; decrement tens JP P,.3544 ; loop if no carry DEC B ; decrement hundreds LD C,_9 ; reset tens JR .3544 ; continue loop .3553 PUSH AF ; save ones digit LD A,09H ; C = 9 - C SUB C LD C,A LD A,09H ; B = 9 - B SUB B LD B,A POP AF RET ;----------------------------------------------------------------------- ; PC-name san not enough money [ANY]: DE=name L355E CALL L32DD ; clear bottom of screen LD HL,3A23H CALL L3317 ; print PC name, DE=name, HL=VRAM addr IF ENGLISH ELSE LD BC,N5041 LD DE,D5041 ; "san" CALL L7F94 ; print message, DE=message, BC=length ENDIF LD DE,D51DD ; "okanega tarimasen. / [ANY KEY]" IF OPT2 JP L7F2D ; print message group: DE=messages ELSE CALL L7F2D ; print message group: DE=messages RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- ; " wa ###": HL=name, DE=last byte of BCD price L3577 PUSH DE LD C,(HL) LD B,00H INC HL LD DE,3A43H CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length IF ENGLISH ELSE LD A,ha ; *J* OUT (VDPdata),A ENDIF POP HL LD DE,3A63H IF OPT2 JP L32E7 ; print 3-byte BCD number at (HL): HL=last/high byte of number, DE=VRAM addr ELSE CALL L32E7 ; print 3-byte BCD number at (HL): HL=last/high byte of number, DE=VRAM addr RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- ; print "who will buy?" menu L358E LD DE,D51E2 ; "donataga / okaiageninarimasuka ?" CALL L7F2D ; print message group: DE=messages CALL L32B1 ; print PC name menu LD HL,D5044 ; "kawanai" (cancel) LD BC,N5044 IF OPT2 JP L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length ELSE CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- ; print "who will take?" menu L35A1 LD HL,D4C0E ; "tsukaimasuka?" CALL L7F3F ; print message with screen address CALL L32B1 ; print PC name menu LD HL,D5039 ; "cancel" LD BC,N5039 IF OPT2 JP L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length ELSE CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- ; do menu: HL=VRAM address => A=first char of item L35B4 LD (DC00D),HL ; VRAM pointer to current menu item ; do menu: HL=VRAM address => A=first char of item L35B7 XOR A ; clear out last direction LD (DC00B),A LD HL,(DC00D) ; get item pointer LD A,_rarr ; put right arrow on screen CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data LD BC,2000H CALL L7EDB ; delay .35C9 CALL L3258 ; handle menu up/down LD A,(DC009) ; joypad buttons BIT 1,A ; button 2 JR Z,.35C9 ; loop if button 2 not pressed LD HL,(DC00D) ; get VRAM pointer of selected item INC HL ; read byte two chars after right arrow INC HL IF OPT2 JP L7FAD ; read one byte from VDP: HL=VRAM address => A=data ELSE CALL L7FAD ; read one byte from VDP: HL=VRAM address => A=data RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L35DC LD A,(DC128) ; current map number L35DF LD B,A LD A,20H INC B .35E3 DEC B JR Z,.35EA ADD A,20H JR .35E3 .35EA LD B,A CALL L3922 ; random number in A AND 1FH LD C,A CALL L3922 ; random number in A CP 80H LD A,C JR C,.35FB NEG .35FB ADD A,B CALL L3541 ; convert to decimal: A=number => B=hundreds C=tens A=ones RRD INC HL LD A,B RLD LD A,C RLD INC HL LD (HL),00H INC HL RET ;----------------------------------------------------------------------- L360D PUSH BC LD B,(HL) INC HL DEC A LD C,A ADD A,A ADD A,C ADD A,A LD D,00H LD E,A ADD HL,DE LD A,(HL) PUSH HL LD HL,DC19F CP 74H JR C,.362D CP 85H JR C,.362C CP 0AFH JR C,.362B INC HL .362B INC HL .362C INC HL .362D LD (HL),A LD DE,DC19D ; off-screen buffer for 3D maze CALL L3772 LD DE,3955H LD HL,3B66H CALL L3876 POP HL INC HL POP DE LD BC,0003H LDIR DEC DE LD A,(HL) INC HL LD H,(HL) LD L,A IF OPT2 JP L3577 ; " wa ###": HL=name, DE=last byte of BCD price ELSE CALL L3577 ; " wa ###": HL=name, DE=last byte of BCD price RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L364E LD C,B LD HL,DC00C ; DC029H-1DH? LD DE,001DH .3655 ADD HL,DE DJNZ .3655 PUSH HL LD B,C LD HL,37E5H LD E,60H .365F ADD HL,DE DJNZ .365F PUSH HL PUSH BC LD BC,0009H LD A,__ CALL L7F81 ; fill VRAM: HL=VRAM addr, BC=length, A=fill char => HL,AF saved POP BC LD B,C LD HL,3AF9H ; 3B09H-10H? LD E,10H .3673 ADD HL,DE DJNZ .3673 PUSH HL POP BC POP DE POP HL L367A PUSH HL PUSH BC LD A,(HL) CALL L36D2 ADD A,29H .3682 DEC B JR Z,.3689 ADD A,08H JR .3682 .3689 PUSH AF LD A,D CP 3AH LD C,00H JR NZ,.3693 LD C,78H .3693 POP AF ADD A,C POP HL CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data EX DE,HL CALL L7FCA ; set VRAM drite address: HL=VRAM address POP HL LD A,(HL) LD C,03H ADD HL,BC SUB (HL) CALL L36D4 PUSH AF INC B DEC B JR Z,.36B1 .36AB LD A,HBAR OUT (VDPdata),A DJNZ .36AB .36B1 LD A,(HL) OR A JR Z,.36CC POP AF ADD A,HP0 OUT (VDPdata),A SUB 30H NEG SUB (HL) RET NC NEG CALL L36D2 .36C5 LD A,HP0 OUT (VDPdata),A DJNZ .36C5 RET .36CC POP BC LD A,HBAR OUT (VDPdata),A RET ;----------------------------------------------------------------------- L36D2 LD B,01H L36D4 LD C,08H .36D6 CP C RET C INC B SUB C JR .36D6 L36DC LD C,B LD HL,DC00A ; DC027H-1DH? LD DE,001DH .36E3 ADD HL,DE DJNZ .36E3 PUSH HL LD B,C LD HL,3805H ; 3865H-60H? LD E,60H .36ED ADD HL,DE DJNZ .36ED PUSH HL LD HL,3AFDH ; 3B0DH-10H? LD B,C LD E,10H .36F7 ADD HL,DE DJNZ .36F7 PUSH HL POP BC POP DE POP HL PUSH BC LD A,(HL) CALL L36D2 LD C,B ADD A,29H .3706 DEC B JR Z,.370D ADD A,08H JR .3706 .370D POP HL CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data LD A,09H SUB C PUSH AF EX DE,HL LD A,0B4H CALL L7F81 ; fill VRAM: HL=VRAM addr, BC=length, A=fill char => HL,AF saved POP AF OR A RET Z LD C,A LD A,__ IF OPT2 JP L7F86 ; fill VRAM: BC=length, A=fill char ELSE CALL L7F86 ; fill VRAM: BC=length, A=fill char RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- L3725 LD HL,D37F4 LD C,06H CALL L3800 JR Z,.3737 LD HL,DC198 LD B,06H CALL L382F .3737 INC DE LD A,(DE) OR A JR Z,L37B9 ADD A,15H CP 0A2H JR NC,.374B LD (DC194),A INC A LD (DC197),A JR L37B9 .374B LD (DC191),A INC A LD (DC194),A CP 0A5H JR C,L37B9 LD B,09H JR Z,.376C CP 0A9H JR C,L37B9 LD A,0AEH LD C,09H JR NZ,L37AE LD A,0ADH LD C,07H LD B,0BH JR L37AE .376C LD A,0ACH LD C,05H JR L37AE ;----------------------------------------------------------------------- L3772 LD HL,D37E8 LD C,00H CALL L3800 JR Z,.3784 LD HL,DC197 LD B,00H CALL L382F .3784 INC DE LD A,(DE) OR A JR Z,L37B9 LD (DC191),A INC A LD (DC194),A CP 90H JR C,L37B9 JR Z,.37A8 CP 94H JR C,L37B9 LD B,09H LD A,98H LD C,06H JR Z,L37AE LD A,99H LD C,08H JR L37AE .37A8 LD A,97H LD C,04H LD B,0BH L37AE LD (DC196),A LD A,C LD (DC19B),A LD A,B LD (DC19C),A L37B9 DEC DE LD A,(DE) INC DE INC DE INC A JR Z,.37E1 LD A,(DC128) ; current map number OR A JR NZ,.37CB .37C6 BIT 1,(IY) RET Z .37CB LD A,(DE) OR A RET Z LD (DC192),A CP 0B0H RET C ADD A,02H LD (DC193),A SUB 0B2H ADD A,02H LD (DC19A),A RET .37E1 BIT 2,(IY) RET Z JR .37C6 D37E8 DB 25H,00H,25H,60H,00H,63H,61H,62H,25H,01H,01H,00H D37F4 DB 25H,00H,25H,64H,00H,67H,25H,65H,66H,01H,01H,00H ;----------------------------------------------------------------------- L3800 PUSH DE PUSH BC LD DE,DC191 LD BC,000CH LDIR POP BC POP DE LD A,(DE) LD (DC192),A INC DE LD A,(DE) LD (DC195),A INC DE LD A,(DE) OR A JR Z,.382A ADD A,C LD (DC196),A INC A CP 71H JR Z,.382A CP 6FH JR Z,.382A LD (DC199),A .382A INC DE LD C,A LD A,(DE) OR A RET ;----------------------------------------------------------------------- L382F CP 0FFH JR NZ,.3853 PUSH DE LD A,(DC128) ; current map number OR A JR NZ,.3846 BIT 1,(IY) LD HL,DC194 LD BC,0009H JR Z,.384C .3846 LD HL,DC191 LD BC,000CH .384C LD A,25H CALL L7EE5 ; fill memory: HL=address, BC=length, A=fill byte POP DE RET .3853 LD (DC195),A CP 77H LD A,79H JR C,.3862 LD A,7BH JR Z,.3862 LD A,7DH .3862 ADD A,B LD (HL),A INC A INC HL LD B,A LD A,C CP 73H RET Z LD (HL),B RET ;----------------------------------------------------------------------- L386D PUSH HL LD H,00H LD L,A LD DE,3B02H ADD HL,DE POP DE L3876 LD A,H OR A JR Z,.388F LD A,(DC19A) CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data LD BC,0004H ADD HL,BC LD A,(DC19B) CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data LD A,(DC19C) OUT (VDPdata),A .388F LD HL,DC191 LD BC,0303H IF OPT2 JP L7F1E ; put rectangular data on screen: B=height, C=width, DE=VRAM addr, HL=data ELSE CALL L7F1E ; put rectangular data on screen: B=height, C=width, DE=VRAM addr, HL=data RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- ; B=number of PCs, HL=new PC slot L3899 LD B,05H LD HL,DC010 LD DE,001DH XOR A .38A2 CP (HL) JR Z,.38A8 ADD HL,DE DJNZ .38A2 .38A8 LD A,05H SUB B LD B,A RET ;----------------------------------------------------------------------- L38AD CALL L3913 ; get current monster table entry LD E,(HL) ; DE = first word, pattern table data INC HL LD D,(HL) INC HL PUSH HL EX DE,HL LD DE,PT+0B5H*8 ; copy to pattern table for char code B5 LD BC,22*8 ; copy enough for the largest monster graphics data LD A,02H CALL L7EF1 ; copy data to multiple pattern tables: HL=data, DE=VRAM addr, BC=length, A=ntables POP HL LD E,(HL) ; DE = second word, color table data INC HL LD D,(HL) INC HL PUSH HL EX DE,HL LD DE,CT+0B5H*8 ; copy to color table for char code B5 LD A,02H CALL L3AF6 ; load color table: HL=data, DE=VRAM address, A=number of times POP HL CALL L38F3 ; get monster name table data -> BC=hgt/wid, HL=screen addrs LD A,(DC0A3) ; get monster count .38D7 PUSH AF PUSH BC PUSH DE PUSH HL LD A,(HL) INC HL LD H,(HL) LD L,A EX DE,HL CALL L7F1E ; put rectangular data on screen: B=height, C=width, DE=VRAM addr, HL=data LD BC,1000H CALL L7EDB ; delay POP HL INC HL INC HL POP DE POP BC POP AF DEC A ; decrement monster count JR NZ,.38D7 ; loop for next monster RET ;----------------------------------------------------------------------- ; get monster name table data -> BC=hgt/wid, HL=screen addrs L38F3 LD E,(HL) ; DE = third word, name table data INC HL LD D,(HL) LD A,(DE) INC DE CP 01H LD HL,D6A5F ; 00 = 2x2 JR C,.390E LD HL,D6A89 ; 01 = 2x3 JR Z,.390E CP 03H LD HL,D6AB3 ; 02 = 3x3 JR C,.390E LD HL,D6ACD ; 03 = 5x5 .390E LD C,(HL) ; C = width INC HL LD B,(HL) ; B = height INC HL RET ;----------------------------------------------------------------------- ; get current monster table entry L3913 LD A,(DC0A1) ; A = current monster number LD B,A ; B = A ADD A,A ; A = A * 2 ADD A,B ; A = A * 3 ADD A,A ; A = A * 6 LD HL,D6AD9 ; monster graphics table LD D,00H LD E,A ADD HL,DE ; HL = D6AD9 + monster number * 6 RET ;----------------------------------------------------------------------- ; random number generator? L3922 PUSH HL LD HL,(DC006) ; get random number seed INC H ; do some lame stuff with it LD A,H ADD A,L LD L,A LD (DC006),HL ; put back updated seed POP HL RET ;----------------------------------------------------------------------- ; address of current map location to DC12C L392F LD HL,(DC12E) ; get start of current map LD DE,0010H ; 16 bytes per row LD A,(DC12A) ; current row number in map OR A JR Z,.393F LD B,A .393C ADD HL,DE DJNZ .393C .393F LD A,(DC129) ; get current column number? LD E,A ADD HL,DE LD (DC12C),HL ; save address of current map location RET ;----------------------------------------------------------------------- ; base address of current map to DC12E L3948 LD HL,D4183-0100H ; = 4083H LD DE,0100H LD A,(DC128) ; current map number INC A JR NZ,.3956 LD A,08H ; change map number FF to 08 .3956 LD B,A .3957 ADD HL,DE DJNZ .3957 LD (DC12E),HL RET ;----------------------------------------------------------------------- IF OPT1 L395E CALL L079E ; clear screen ELSE ; *** not optimal *** L395E LD HL,3800H ; clear screen LD BC,0300H LD A,__ CALL L7F81 ; fill VRAM: HL=VRAM addr, BC=length, A=fill char => HL,AF saved ENDIF CALL L299A L396C LD HL,DC010 LD DE,3825H LD B,05H LD A,01H LD (DC135),A .3979 XOR A CP (HL) RET Z PUSH BC PUSH HL PUSH DE PUSH BC LD BC,000AH CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length PUSH HL CALL L3772 POP HL LD DE,0FFFDH ADD HL,DE POP BC LD A,05H SUB B ADD A,A ADD A,A ADD A,A ADD A,A CALL L386D LD A,(DC135) LD B,A CALL L364E LD A,(DC135) LD B,A CALL L36DC LD HL,DC135 INC (HL) POP HL LD BC,0060H ADD HL,BC EX DE,HL POP HL LD C,1DH ADD HL,BC POP BC DJNZ .3979 RET ;----------------------------------------------------------------------- L39BA LD DE,DC01A JR L39C2 L39BF LD DE,DC01F L39C2 PUSH DE CALL L3899 ; A,B = number of PCs POP DE LD HL,3823H LD B,A .39CB PUSH BC PUSH HL PUSH DE DEC DE DEC DE LD A,(DE) POP DE PUSH DE INC A JR NZ,.39EF LD A,(DC128) ; current map number OR A JR NZ,.39E8 BIT 1,(IY) JR Z,.3A29 BIT 2,(IY) JR NZ,.39EF .39E8 LD A,25H CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data JR .3A29 .39EF LD A,(DE) OR A JR Z,.3A29 CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data CP 0B0H ; check for horned/winged helm JR NC,.3A00 ; branch if >= B0H LD A,__ LD C,01H JR .3A07 .3A00 LD C,02H JR Z,.3A05 INC C .3A05 ADD A,02H ; right side of horned/winged helm .3A07 OUT (VDPdata),A LD B,01H LD A,L CP 43H JR C,.3A1C JR Z,.3A19 CP 0A3H JR C,.3A1B JR NZ,.3A1A INC B .3A19 INC B .3A1A INC B .3A1B INC B .3A1C LD HL,3AF2H ; 3B02H-10H? LD DE,0010H .3A22 ADD HL,DE DJNZ .3A22 LD A,C CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data .3A29 POP HL LD BC,001DH ADD HL,BC EX DE,HL POP HL LD C,60H ADD HL,BC POP BC DJNZ .39CB RET ;----------------------------------------------------------------------- L3A37 LD HL,0000H LD (DC160),HL LD HL,DC010 LD DE,DC166 LD B,01H .3A45 LD A,(DE) OR A JR NZ,.3A75 INC DE INC B LD A,B CP 06H JR Z,.3A6B PUSH DE LD DE,001DH JR C,.3A61 LD A,(DC0A1) ; current monster number CP 1DH LD E,06H JR NZ,.3A61 LD E,16H .3A61 ADD HL,DE POP DE XOR A CP (HL) JR NZ,.3A45 LD A,B CP 06H RET NC .3A6B LD HL,DC0AA LD DE,DC16B LD B,06H JR .3A45 .3A75 LD A,B LD (DC160),A PUSH HL PUSH DE LD DE,001BH CP 06H JR C,.3A8D LD A,(DC0A1) ; current monster number LD E,04H CP 1DH JR NZ,.3A8D LD E,14H .3A8D ADD HL,DE LD A,(HL) LD (DC161),A POP DE POP HL .3A94 INC DE INC B LD A,B CP 06H JR NZ,.3AA5 .3A9B LD HL,DC0AA LD DE,DC16B LD B,06H JR .3AB8 .3AA5 PUSH DE LD DE,001DH JR C,.3AB6 LD A,(DC0A1) ; current monster number LD E,06H CP 1DH JR NZ,.3AB6 LD E,16H .3AB6 ADD HL,DE POP DE .3AB8 XOR A CP (HL) JR NZ,.3AC2 LD A,B CP 06H JR C,.3A9B RET .3AC2 LD A,(DE) CP 00H JR Z,.3A94 PUSH HL PUSH DE LD A,B LD DE,001BH CP 06H JR C,.3ADC LD A,(DC0A1) ; current monster number LD E,04H CP 1DH JR NZ,.3ADC LD E,14H .3ADC ADD HL,DE LD A,(DC161) CP (HL) POP DE POP HL JR C,.3A75 JR .3A94 ;----------------------------------------------------------------------- ; A=map data at (HL), HL=square data address L3AE7 LD A,(HL) LD L,(HL) LD H,00H DEC HL PUSH HL ; DE = HL * 1 POP DE ADD HL,HL ; HL = HL * 2 ADD HL,HL ; HL = HL * 4 ADD HL,DE ; HL = HL * 5 LD DE,D3E81 ADD HL,DE RET ;----------------------------------------------------------------------- ; load color table: HL=data, DE=VRAM address, A=number of times ; A = number color tables? ; first byte = number of iterations ; second bytes = number of entries in low 6 bits (multiplied by 8), code in high 2 bits ; 00-3F: third byte = fill repeated for 2nd-byte number of entries ; 40-7F: third bytes = data copied for 2nd-byte number of entries ; 80-FF: third bytes = copy 8 bytes for 2nd-byte number of entries L3AF6 LD C,A .3AF7 PUSH HL PUSH DE LD B,(HL) ; B = first data byte INC HL EX DE,HL ; HL=VRAM address, DE=data address CALL L7FCA ; set VRAM drite address: HL=VRAM address .3AFF PUSH BC ; save first byte and caller's A-reg LD A,(DE) ; A = second data byte & 3FH AND 3FH PUSH AF LD H,00H ; BC = A * 8 LD L,A ADD HL,HL ADD HL,HL ADD HL,HL PUSH HL POP BC LD A,(DE) ; A = second data byte & 0C0H INC DE AND 0C0H JR Z,.3B2A ; 00 CP 40H JR Z,.3B34 ; 40 POP BC ; 80/C0 - get back first byte ; 80-FF - copy from following data bytes .3B17 PUSH BC PUSH DE LD BC,0008H CALL L7F94 ; copy 8 bytes at DE to color table POP DE POP BC DJNZ .3B17 LD HL,0008H ; DE = DE + 8 ADD HL,DE EX DE,HL JR .3B38 ; 00-3F - fill with third data byte .3B2A POP AF ; drop second byte & 3FH LD A,(DE) ; get third byte INC DE PUSH DE CALL L7F86 ; fill VRAM: BC=length, A=fill char POP DE JR .3B38 ; 40-7F - copy following data .3B34 POP AF ; drop second byte & 3FH CALL L7F94 ; copy BC bytes from DE to color table .3B38 POP BC ; get back first byte and caller's A-reg DJNZ .3AFF ; loop for number of times in first byte POP DE ; get back VRAM address LD HL,0800H ; DE = VRAM address + 0800H (next color table?) ADD HL,DE EX DE,HL POP HL ; get back address of start of data DEC C ; loop for number of times in caller's A-reg JR NZ,.3AF7 RET ;----------------------------------------------------------------------- L3B46 LD HL,D63F8 ; right arrow JR L3B4E L3B4B LD HL,D5FD0 ; maze chars L3B4E LD DE,PT+2*800H+30H*8 ; copy to third part of pattern table L3B51 LD BC,0008H ; just copy the up arrow or right arrow at 30H IF OPT2 JP L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length ELSE CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- ; print decimal number: HL=VRAM address, A=number L3B58 PUSH AF CALL L7FCA ; set VRAM drite address: HL=VRAM address POP AF ; print decimal number: A=number L3B5D PUSH HL CALL L3541 ; convert to decimal: A=number => B=tens C=ones INC B ; test hundreds digit DEC B JR Z,.3B6D ; branch if hundreds digit is zero PUSH AF LD A,B OUT (VDPdata),A ; put hundreds digit on screen EX (SP),HL ; delay a moment (but a NOP is enough elsewhere?) EX (SP),HL JR .3B72 ; continue to print tens .3B6D INC C ; test tens digit DEC C JR Z,.3B78 ; branch if tens digit is zero PUSH AF .3B72 LD A,C OUT (VDPdata),A ; put tens digit on screen EX (SP),HL ; delay a moment (but a NOP is enough elsewhere?) EX (SP),HL POP AF .3B78 OUT (VDPdata),A ; put ones digit on screen POP HL RET ;----------------------------------------------------------------------- L3B7C LD HL,CT+800H*2+82H*8 ; 82,83,84 LD BC,3*8 LD A,44H ; dk blue on dk blue? CALL L7F81 ; fill VRAM: HL=VRAM addr, BC=length, A=fill char => HL,AF saved LD HL,D6921 ; 31-48 = 14, 49-4C = 1B, 4D-55 = 44 LD DE,CT+31H*8 ; blk on dk.blue, blk on tan, dk.blue on dk.blue LD A,02H IF OPT2 JP L3AF6 ; load color table: HL=data, DE=VRAM address, A=number of times ELSE CALL L3AF6 ; load color table: HL=data, DE=VRAM address, A=number of times RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- ; special tables for each map ; 00 01 02 03 04 05 06 FF/07 D3B93 DW D3BA3,D3BA9,D3BAA,D3BAB,D3BBB,D3BE9,D3C67,D3C68 D3BA3 DB 01H DB 03H,09H,05H,0AH,0CH D3BA9 DB 01H ; should this be 00? D3BAA DB 01H ; should this be 00? D3BAB DB 03H DB 07H,06H,03H,0FH,02H DB 0FH,02H,03H,0EH,08H DB 08H,09H,01H,08H,00H D3BBB DB 09H DB 0DH,0AH,02H,00H,01H DB 0DH,05H,04H,08H,01H DB 00H,06H,02H,09H,01H DB 08H,01H,02H,0AH,09H DB 0AH,06H,04H,0AH,07H DB 0AH,07H,02H,0AH,07H DB 0AH,09H,04H,08H,01H DB 0DH,06H,04H,08H,01H DB 0AH,08H,02H,0AH,09H D3BE9 DB 19H DB 07H,06H,03H,06H,0DH DB 06H,07H,02H,05H,04H DB 06H,0DH,01H,07H,06H DB 05H,04H,04H,06H,07H DB 08H,06H,03H,07H,0DH DB 09H,07H,04H,06H,04H DB 07H,0DH,01H,08H,06H DB 06H,04H,02H,09H,07H DB 06H,08H,02H,05H,05H DB 07H,09H,01H,06H,0EH DB 05H,05H,04H,06H,08H DB 06H,0EH,03H,07H,09H DB 09H,08H,04H,06H,05H DB 08H,09H,01H,07H,0EH DB 06H,05H,02H,09H,08H DB 07H,0EH,03H,08H,09H DB 0CH,0EH,02H,00H,04H DB 0BH,0EH,01H,0AH,0CH DB 0BH,0FH,04H,0BH,0CH DB 0CH,0FH,03H,0AH,06H DB 0AH,0CH,04H,0BH,0CH DB 0BH,0CH,03H,01H,04H DB 0BH,0BH,02H,0BH,0EH DB 0AH,0BH,01H,05H,00H DB 0BH,06H,03H,0BH,0CH D3C67 DB 00H D3C68 DB 00H ;----------------------------------------------------------------------- ; special tables for each map ; 00 01 02 03 04 05 06 FF/07 D3C69 DW D3C79,D3D92,D3DA3,D3DB4,D3DC5,D3DD6,D3DEB,D3E7C ; column, row, facing, code for this square D3C79 DB 46H ; map 00 DB 00H,03H,02H,0FH ; room #1 DB 00H,03H,04H,11H ; room #3 DB 00H,04H,02H,10H ; room #2 DB 00H,04H,04H,12H ; room #4 DB 00H,06H,02H,06H ; cell #1 DB 00H,07H,02H,07H ; cell #2 DB 00H,08H,02H,08H ; cell #3 DB 00H,09H,02H,09H ; cell #4 DB 01H,02H,02H,1AH ; exit DB 01H,0CH,01H,16H ; armor DB 01H,0CH,03H,15H ; shields DB 02H,02H,04H,01H ; utsuro inn DB 02H,05H,03H,00H ; tom's grog DB 02H,06H,01H,1AH ; exit DB 02H,0FH,02H,1EH ; DB 0EH,0FH,03H,1EH ; TIME" D49F7 DW 3A2FH ASCIIC _rarr,_,_T,_I,_M,_E ENDIF ; "HOW MUCH GOLD" D4A00 DW 3A51H ASCIIC _H,_O,_W,_,_M,_U,_C,_H,_,_G,_O,_L,_D ; "CURE" D4A10 DW 3A71H ASCIIC _C,_U,_R,_E ; "QUIT" D4A17 DW 3A91H ASCIIC _Q,_U,_I,_T IF ENGLISH D4A1E DW 3A23H ASCIIC _M,_E,_S,_S,_A,_G,_E,_,_S,_P,_E,_E,_D ELSE ; "MESSEJIno hyouji jikanwo" D4A1E DW 3A23H ASCIIC _ME,_XTSU,_SE,_dash,_SHI,ten,no,_,hi,xyo,u_,shi,ten,_,shi,ten,ka,n_,wo ENDIF IF ENGLISH D4A34 DW 3A63H ASCIIC _0,_eq,_F,_A,_S,_T,_,_9,_eq,_S,_L,_O,_W,_,_lbr,_0,_dash,_lpar,_,_rpar,_dash,_9,_rbr,_ques ELSE ; "dorekuraini shimasuka [0-( )-9] ?" D4A34 DW 3A63H ASCIIC to,ten,re,ku,ra,i_,ni,_,shi,ma,su,ka,_,_lbr,_0,_dash,_lpar,_,_rpar,_dash,_9,_rbr,_,_ques ENDIF ; "G.P." in "HOW MUCH GOLD" display IF ENGLISH D4A4F DB _,_G,_per,_P,_per ELSE D4A4F DB _G,_per,_P,_per ENDIF N4A4F EQU *-D4A4F ; "[ANY]" D4A53 DW 3AB9H ASCIIC _lbr,_A,_N,_Y,_rbr IF ENGLISH D4A5B DW 3A23H ASCIIC _U,_S,_E,_,_W,_H,_O,_S,_E ELSE ; "dareno kusuriwo" D4A5B DW 3A23H ASCIIC ta,ten,re,no,_,ku,su,ri,wo ENDIF IF ENGLISH D4A67 DW 3A63H ASCIIC _P,_O,_T,_I,_O,_N,_ques ELSE ; "tsukaimasuka ?" D4A67 DW 3A63H ASCIIC tsu,ka,i_,ma,su,ka,_,_ques ENDIF IF ENGLISH D4A72 DW 3A23H ASCIIC _W,_H,_O,_,_W,_I,_L,_L,_ DW 3A43H ASCIIC _D,_R,_I,_N,_K,_,_T,_H,_E ELSE ; "darega kusuriwo" D4A72 DW 3A23H ASCIIC ta,ten,re,ka,ten,_,ku,su,ri,wo ENDIF IF ENGLISH D4A7F DW 3A63H ASCIIC _H,_A,_S,_,_N,_O,_,_P,_O,_T,_I,_O,_N ELSE ; "kusuriwo motteimasen" D4A7F DW 3A63H ASCIIC ku,su,ri,wo,_,mo,xtsu,te,i_,ma,se,n_ ENDIF ; "[ANY]" D4A8E DW 3AABH ASCIIC _lbr,_A,_N,_Y,_rbr IF ENGLISH D4A96 DW 3A23H ASCIIC _C,_O,_N,_T,_I,_N,_U,_E ELSE ; "GE-MUwo" D4A96 DW 3A23H ASCIIC _KE,ten,_dash,_MU,wo ENDIF IF ENGLISH D4A9E DW 3A43H ASCIIC _G,_A,_M,_E,_ques ELSE ; "tsuzukemasuka ?" D4A9E DW 3A63H ASCIIC tsu,tsu,ten,ke,ma,su,ka,_,_ques ENDIF IF ENGLISH D4AAA DW 3A2FH ASCIIC _C,_A,_N,_apost,_T,_,_G,_O,_,_F,_O,_R,_W,_A,_R,_D,_excl ELSE ; "susumemasen!" D4AAA DW 3A31H ASCIIC su,su,me,ma,se,n_,_excl ENDIF IF ENGLISH D4AB4 DW 3A23H ASCIIC _S,_O,_M,_E,_T,_H,_I,_N,_G,_apost,_S,_,_C,_O,_M,_I,_N,_G,_excl ELSE ; "nanika chikazuite kita!!" D4AB4 DW 3A23H ASCIIC na,ni,ka,_,chi,ka,tsu,ten,i_,te,_,ki,ta,_excl,_excl ENDIF IF ENGLISH D4AC6 DW 3A23H ASCIIC _W,_H,_A,_T,_,_T,_O,_,_D,_O,_ques ELSE ; "doushimasuka ?" D4AC6 DW 3A23H ASCIIC to,ten,u_,shi,ma,su,ka,_,_ques ENDIF ; "TALK" D4AD2 DW 3A86H ASCIIC _T,_A,_L,_K ; "ATTACK" D4AD9 DW 3A66H ASCIIC _A,_T,_T,_A,_C,_K ; "RUN" D4AE2 DW 3AA6H ASCIIC _R,_U,_N IF ENGLISH D4AE8 DW 3A22H ASCIIC _L,_I,_V,_E,_,_T,_O,_,_F,_I,_G,_H,_T,_,_A,_N,_O,_T,_H,_E,_R,_,_D,_A,_Y,_per,_per,_per ELSE ; he who fights and runs away will live to fight another day? ; itsumo umaku iku towa kagirimasen yo ; "itsumo umakuikutowa kagirimasenyo." D4AE8 DW 3A23H ASCIIC i_,tsu,mo,_,u_,ma,ku,i_,ku,to,ha,_,ka,ki,ten,ri,ma,se,n_,yo,dot ENDIF IF ENGLISH D4B00 DW 3A23H ASCIIC _C,_A,_N,_apost,_T,_,_E,_S,_C,_A,_P,_E,_excl,_excl ELSE ; "shimatta nigerarenai!!" D4B00 DW 3A23H ASCIIC shi,ma,xtsu,ta,_,ni,ke,ten,ra,re,na,i_,_excl,_excl ENDIF IF ENGLISH D4B11 DW 3A63H;3A23H ASCIIC _W,_H,_O,_,_D,_O,_,_Y,_O,_U ELSE ; "dorewo kougeki" D4B11 DW 3A23H ASCIIC to,ten,re,wo,_,ko,u_,ke,ten,ki ENDIF IF ENGLISH D4B1E DW 3A83H;3A63H ASCIIC _A,_T,_T,_A,_C,_K,_ques ELSE ; "shimasuka ?" D4B1E DW 3A63H ASCIIC shi,ma,su,ka,_,_ques ENDIF IF ENGLISH D4B27 DW 3A23H ASCIIC _R,_A,_N,_,_A,_W,_A,_Y,_per,_per,_per ELSE ; "nigete itta!!!" D4B27 DW 3A23H ASCIIC ni,ke,ten,te,_,i_,xtsu,ta,_per,_per,_per ENDIF IF ENGLISH D4B35 DW 3A23H ASCIIC _G,_O,_O,_D,_,_L,_U,_C,_K,_,_F,_I,_N,_D,_I,_N,_G ELSE ; "BLACK ONYX wo mezashite" D4B35 DW 3A23H ASCIIC _B,_L,_A,_C,_K,_,_O,_N,_Y,_X,wo,_,me,sa,ten,shi,te ENDIF IF ENGLISH D4B49 DW 3A6FH ASCIIC _T,_H,_E,_,_B,_L,_A,_C,_K,_,_O,_N,_Y,_X,_excl ELSE ; "ganbarimashyou." D4B49 DW 3A70H ASCIIC ka,ten,n_,ha,ten,ri,ma,shi,xyo,u_,dot ENDIF IF ENGLISH D4B57 DW 3A22H ASCIIC _W,_H,_A,_T,_,_D,_O,_,_Y,_O,_U,_,_S,_A,_Y,_ques ELSE ; "naniwo hamashikakemasuka?" D4B57 DW 3A23H ASCIIC na,ni,wo,_,ha,ma,shi,ka,ke,ma,su,ka,_ques ENDIF ; "JOIN US" D4B67 DW 3A65H ASCIIC _J,_O,_I,_N,_,_U,_S ; "GOOD BYE" D4B71 DW 3A85H ASCIIC _G,_O,_O,_D,_,_B,_Y,_E ; "YOUR MONEY" D4B7C DW 3AA5H ASCIIC _Y,_O,_U,_R,_,_M,_O,_N,_E,_Y ; "OR LIFE" D4B89 DW 3AC8H ASCIIC _O,_R,_,_L,_I,_F,_E IF ENGLISH D4B93 DW 3A23H ASCIIC _T,_H,_A,_N,_K,_,_Y,_O,_U,_,_V,_E,_R,_Y,_,_M,_U,_C,_H,_per ELSE ; "doumo arigatou gozaimashita." D4B93 DW 3A23H ASCIIC to,ten,u_,mo,_,a_,ri,ka,ten,to,u_,_,ko,ten,sa,ten,i_,ma,shi,ta,dot ENDIF IF ENGLISH D4BAB DW 3A63H ASCIIC _N,_O,_T,_,_E,_N,_O,_U,_G,_H,_,_M,_O,_N,_E,_Y ELSE ; "okanega tarimasen. " D4BAB DW 3A63H ASCIIC o_,ka,ne,ka,ten,_,ta,ri,ma,se,n_,dot,_,_,_ ENDIF IF ENGLISH D4BBD DW 3A68H ASCIIC _G,_per,_P,_per ELSE ; "G.P.desu." D4BBD DW 3A68H ASCIIC _G,_per,_P,_per,te,ten,su,dot ENDIF IF ENGLISH D4BC8 DW 3A83H ASCIIC _W,_A,_N,_T,_,_T,_O,_,_B,_U,_Y,_ques ELSE ; "okaiageninarimasuka ?" D4BC8 DW 3A83H ASCIIC o_,ka,i_,a_,ke,ten,ni,na,ri,ma,su,ka,_,_ques ENDIF ; "NEXT ITEM" D4BD9 DW 3A33H ASCIIC _N,_E,_X,_T,_,_I,_T,_E,_M IF ENGLISH D4BE5 DW 3A53H ASCIIC _B,_U,_Y ELSE ; "kau" D4BE5 DW 3A53H ASCIIC ka,u_ ENDIF IF ENGLISH D4BEA DW 3A73H ASCIIC _L,_E,_A,_V,_E,_,_S,_H,_O,_P ELSE ; "misewo deru" D4BEA DW 3A73H ASCIIC mi,se,wo,_,te,ten,ru ENDIF IF ENGLISH D4BF4 DW 3A23H ASCIIC _W,_H,_O,_,_W,_I,_L,_L ELSE ; "donataga" D4BF4 DW 3A23H ASCIIC to,ten,na,ta,ka,ten ENDIF IF ENGLISH D4BFD DW 3A63H ASCIIC _P,_A,_Y,_,_F,_O,_R,_,_T,_H,_I,_S,_ques ELSE ; "okaiageninarimasuka ?" D4BFD DW 3A63H ASCIIC o_,ka,i_,a_,ke,ten,ni,na,ri,ma,su,ka,_,_ques ENDIF IF ENGLISH D4C0E DW 3A63H ASCIIC _T,_A,_K,_E,_,_T,_H,_I,_S,_ques,_,_,_,_ ELSE ; "tsukaimasuka ? " D4C0E DW 3A63H ASCIIC tsu,ka,i_,ma,su,ka,_,_ques,_,_,_,_,_,_ ENDIF IF ENGLISH D4C1F DW 3A23H ASCIIC _W,_E,_L,_C,_O,_M,_E,_,_T,_O,_,_C,_I,_T,_Y,_,_B,_A,_N,_K,_per,_,_I,_,_A,_M ELSE ; "irasshaimase.watashiwa touginkouno" D4C1F DW 3A23H ASCIIC i_,ra,xtsu,shi,xya,i_,ma,se,dot,wa,ta,shi,ha,_,to,u_,ki,ten,n_,ko,u_,no ENDIF IF ENGLISH D4C38 DW 3A63H ASCIIC _Y,_O,_U,_R,_,_T,_E,_L,_L,_L,_E,_R,_,_T,_Y,_R,_,_P,_E,_N,_D,_R,_A,_G,_O,_N,_per ELSE ; "suitougakarino TRY PENDRAGONdesu." D4C38 DW 3A63H ASCIIC su,i_,to,u_,ka,ten,ka,ri,no,_,_T,_R,_Y,_,_P,_E,_N,_D,_R,_A,_G,_O,_N,te,ten,su,dot ENDIF IF ENGLISH D4C56 DW 3A23H ASCIIC _W,_H,_O,_,_N,_E,_E,_D,_S ELSE ; "donatawo otetsudai" D4C56 DW 3A23H ASCIIC to,ten,na,ta,wo,_,o_,te,tsu,ta,ten,i_ ENDIF IF ENGLISH D4C65 DW 3A63H ASCIIC _A,_S,_S,_I,_S,_T,_A,_N,_C,_E,_ques ELSE ; "shimashouka ?" D4C65 DW 3A63H ASCIIC shi,ma,shi,xyo,u_,ka,_,_ques ENDIF ; "DEPOSIT" D4C70 DW 3A47H ASCIIC _D,_E,_P,_O,_S,_I,_T ; "WITHDRAW" D4C7A DW 3A67H ASCIIC _W,_I,_T,_H,_D,_R,_A,_W ; "LEAVE" D4C85 DW 3A87H ASCIIC _L,_E,_A,_V,_E IF ENGLISH D4C8D DB _,_H,_A,_S ELSE ; "nootemochiha"? D4C8D DB 49H,35H,43H,53H,41H,4AH ENDIF N4C8D EQU $-D4C8D IF ENGLISH D4C93 DW 3A83H ASCIIC _D,_E,_P,_O,_S,_I,_T,_,_H,_O,_W ELSE ; "oikura gonyukin" D4C93 DW 3A83H ASCIIC o_,i_,ku,ra,_,ko,ten,ni,xyu,ki,n_ ENDIF IF ENGLISH D4CA1 DW 3A8FH ASCIIC _M,_U,_C,_H,_ques,_,_0,_0,_0,_0,_0,_G,_per,_P,_per ELSE ; "desuka ? 00000G.P." D4CA1 DW 3A8EH ASCIIC te,ten,su,ka,_,_ques,_,_0,_0,_0,_0,_0,_G,_per,_P DB _per ENDIF IF ENGLISH D4CB4 DB _apost,_S,_,_B,_A,_L,_A,_N,_C,_E,_,_I,_S ELSE ; "noyokinha" D4CB4 DB no,yo,ki,n_,ha ENDIF N4CB4 EQU $-D4CB4 IF ENGLISH D4CB9 DW 3A83H ASCIIC _W,_I,_T,_H,_D,_R,_A,_W,_,_H,_O,_W ELSE ; "oikura ohikidashi" D4CB9 DW 3A83H ASCIIC o_,i_,ku,ra,_,o_,hi,ki,ta,ten,shi ENDIF IF ENGLISH D4CC7 DW 3A23H ASCIIC _I,_,_A,_M,_,_S,_L,_E,_A,_,_T,_H,_E,_,_P,_H,_Y,_S,_I,_C,_K,_E,_R,_per ELSE ; "watashiwa SLEA ishyadesu." D4CC7 DW 3A23H ASCIIC wa,ta,shi,ha,_,_S,_L,_E,_A,_,i_,shi,xya,te,ten,su,dot ENDIF IF ENGLISH D4CDB DW 3A63H ASCIIC _W,_H,_O,_,_N,_E,_E,_D,_S,_,_H,_E,_A,_L,_I,_N,_G,_ques ELSE ; "doredore shinsatsuteagemashou." D4CDB DW 3A63H ASCIIC to,ten,re,to,ten,re,_,shi,n_,sa,tsu,shi,te,a_,ke,ten,ma,shi,xyo,u_,dot ENDIF IF ENGLISH D4CF3 DW 3A42H ASCIIC _T,_R,_E,_A,_T,_M,_E,_N,_T,_,_C,_O,_S,_T,_S ELSE ; "chiryouniwa" D4CF3 DW 3A43H ASCIIC chi,ri,xyo,u_,ni,ha ENDIF IF ENGLISH D4CFC DW 3A68H ASCIIC _G,_per,_P,_per ELSE ; "G.P.kakarimasu." D4CFC DW 3A68H ASCIIC _G,_per,_P,_per,ka,ka,ri,ma,su,dot ENDIF IF ENGLISH D4D09 DW 3A82H ASCIIC _I,_S,_,_T,_H,_I,_S,_,_A,_C,_C,_E,_P,_T,_A,_B,_L,_E,_ques ELSE ; "yoroshiidesuka ?" D4D09 DW 3A83H ASCIIC yo,ro,shi,i_,te,ten,su,ka,_,_ques ENDIF IF ENGLISH D4D16 DW 3A43H ASCIIC _W,_H,_O,_,_S,_H,_A,_L,_L,_,_I ELSE ; "dare wo" D4D16 DW 3A23H ASCIIC ta,ten,re,wo ENDIF IF ENGLISH D4D1D DW 3A63H ASCIIC _E,_X,_A,_M,_I,_N,_E,_ques ELSE ; "miteagemashouka ?" D4D1D DW 3A63H ASCIIC mi,te,a_,ke,ten,ma,shi,xyo,u_,ka,_,_ques ENDIF ; "LVL =" D4D2C DW 3A44H ASCIIC _L,_V,_L,_,_eq ; "LIFE=" D4D34 DW 3A64H ASCIIC _L,_I,_F,_E,_eq ; "STR =" D4D3C DW 3A84H ASCIIC _S,_T,_R,_,_eq ; "DEX =" D4D44 DW 3AA4H ASCIIC _D,_E,_X,_,_eq IF ENGLISH D4D4C DW 3A43H ASCIIC _E,_X,_A,_M,_,_C,_O,_S,_T,_S ELSE ; "kensainiwa" D4D4C DW 3A43H ASCIIC ke,n_,sa,ni,ha ENDIF IF ENGLISH ELSE ; "hitsuyoudesuka." D4D54 DW 3A83H ASCIIC hi,tsu,yo,u_,te,ten,su,ka,ten ENDIF IF ENGLISH D4D60 DW 3AA3H ASCIIC _I,_S,_,_T,_H,_I,_S,_,_O,_K,_ques ELSE ; "yoroshiidesuka ?" D4D60 DW 3AA3H ASCIIC yo,ro,shi,i_,te,ten,su,ka,_,_ques ENDIF IF ENGLISH D4D6D DW 3A22H ASCIIC _W,_E,_L,_C,_O,_M,_E ELSE ; "irasshaimase." D4D6D DW 3A23H ASCIIC i_,ra,xtsu,shi,xya,i_,ma,se,dot ENDIF IF ENGLISH D4D79 DW 3A62H ASCIIC _I,_,_A,_M,_,_D,_A,_R,_N,_O,_C,_,_T,_H,_E,_,_W,_E,_A,_P,_O,_N,_S,_M,_I,_T,_H,_per ELSE ; "DARNOC buki senmonde gozaimasu." D4D79 DW 3A63H ASCIIC _D,_A,_R,_N,_O,_C,_,fu,ten,ki,_,se,n_,mo,n_,te,ten,_,ko,ten,sa,ten,i_,ma,su,dot ENDIF IF ENGLISH D4D96 DW 3A23H ASCIIC _T,_H,_E,_,_W,_E,_A,_P,_O,_N,_,_I,_S ELSE ; "SHIELDwo motteitewa" D4D96 DW 3A23H ASCIIC _S,_H,_I,_E,_L,_D,wo,_,mo,xtsu,te,i_,te,ha ENDIF IF ENGLISH D4DA7 DW 3A63H ASCIIC _T,_W,_O,_dash,_H,_A,_N,_D,_E,_D,_per ELSE ; "konoWEAPONwa tsukaemasen" D4DA7 DW 3A63H ASCIIC ko,no,_W,_E,_A,_P,_O,_N,ha,_,tsu,ka,e_,ma,se,n_ ENDIF IF ENGLISH D4DBA DW 3AA3H ASCIIC _D,_R,_O,_P,_,_Y,_O,_U,_R,_,_S,_H,_I,_E,_L,_D,_ques ELSE ; "SHIELDwo tebanashimasuka ?" D4DBA DW 3AA3H ASCIIC _S,_H,_I,_E,_L,_D,wo,_,te,ha,ten,na,shi,ma,su,ka,_,_ques ENDIF IF ENGLISH D4DCF DW 3A23H ASCIIC _Y,_O,_U,_R,_,_W,_E,_A,_P,_O,_N,_,_I,_S ELSE ; "anatanoWEAPONwa" D4DCF DW 3A23H ASCIIC a_,na,ta,no,_W,_E,_A,_P,_O,_N,ha ENDIF IF ENGLISH D4DDD EQU D4DA7 ;D4DDD DW 3A63H ; ASCIIC _T,_W,_O,_dash,_H,_A,_N,_D,_E,_D,_per ELSE ; "katatedewa motemasen" D4DDD DW 3A63H ASCIIC ka,ta,te,te,ten,ha,_,mo,te,ma,se,n_ ENDIF IF ENGLISH D4DEC DW 3AA3H ASCIIC _D,_R,_O,_P,_,_Y,_O,_U,_R,_,_W,_E,_A,_P,_O,_N,_ques ELSE ; "WEAPONwo tebanashimasuka ?" D4DEC DW 3AA3H ASCIIC _W,_E,_A,_P,_O,_N,wo,_,te,ha,ten,na,shi,ma,su,ka,_,_ques ENDIF IF ENGLISH D4E01 DW 3A23H ASCIIC _W,_E,_L,_C,_O,_M,_E,_,_T,_O,_,_M,_Y,_,_S,_H,_O,_P,_per,_,_I,_,_A,_M ELSE ; "youkoso irasshaimase. watashiwa" D4E01 DW 3A23H ASCIIC yo,u_,ko,so,_,i_,ra,xtsu,shi,xya,i_,ma,se,dot,_,wa,ta,shi,ha ENDIF IF ENGLISH D4E17 DW 3A63H ASCIIC _C,_A,_L,_L,_E,_D,_,_B,_L,_I,_C,_K,_,_A,_R,_M,_S,_T,_R,_O,_N,_G,_per ELSE ; "BLICK ARMSTRONG to moushimasu." D4E17 DW 3A63H ASCIIC _B,_L,_I,_C,_K,_,_A,_R,_M,_S,_T,_R,_O,_N,_G,_,to,_,mo,u_,shi,ma,su,dot ENDIF IF ENGLISH D4E32 DW 3A23H ASCIIC _I,_,_A,_M,_,_H,_R,_O,_L,_F,_,_B,_A,_T,_T,_E,_R,_S,_H,_I,_E,_L,_D ELSE ; "orewa konokuni ichibanno" D4E32 DW 3A23H ASCIIC o_,re,ha,_,ko,no,ku,ni,_,i_,chi,ha,ten,n_,no ENDIF IF ENGLISH D4E44 DW 3A43H ASCIIC _T,_H,_E,_,_B,_E,_S,_T,_,_S,_H,_I,_E,_L,_D,_,_M,_A,_K,_E,_R ELSE ; "SHIELD ME-KA" D4E44 DW 3A43H ASCIIC _S,_H,_I,_E,_L,_D,_,_ME,_dash,_KA,_dash ENDIF IF ENGLISH D4E52 DW 3A63H ASCIIC _I,_N,_,_T,_H,_E,_,_L,_A,_N,_D,_excl ELSE ; "HROLF BATTERSHIELD da." D4E52 DW 3A63H ASCIIC _H,_R,_O,_L,_F,_,_B,_A,_T,_T,_E,_R,_S,_H,_I,_E,_L,_D,_,ta,ten,dot ENDIF IF ENGLISH D4E6B DW 3A83H ASCIIC _H,_O,_W,_,_M,_A,_Y,_,_I,_,_H,_E,_L,_P,_,_Y,_O,_U,_ques ELSE ; "nanika katteikeyo." D4E6B DW 3A83H ASCIIC na,ni,ka,_,ka,xtsu,te,i_,ke,yo,dot ENDIF IF ENGLISH D4E79 DW 3A23H ASCIIC _W,_E,_L,_C,_O,_M,_E,_per,_,_I,_,_A,_M,_,_P,_A,_N,_D,_O,_R,_A ELSE ; "irasshaimase. watashi PANDORA" D4E79 DW 3A23H ASCIIC i_,ra,xtsu,shi,xya,i_,ma,se,dot,_,wa,ta,shi,_,_P,_A,_N,_D,_O,_R,_A ENDIF IF ENGLISH D4E91 DW 3A43H ASCIIC _T,_H,_E,_,_H,_E,_R,_B,_A,_L,_I,_S,_T,_per,_,_I,_,_S,_E,_L,_L ELSE ; "yakuzaishiyo." D4E91 DW 3A43H ASCIIC ya,ku,sa,ten,i_,shi,yo,dot ENDIF IF ENGLISH D4E9C DW 3A63H ASCIIC _P,_O,_T,_I,_O,_N,_S,_,_A,_N,_D,_,_B,_O,_T,_T,_L,_E,_S,_per ELSE ; "kusurito sonoyoukiwo oiteimasu." D4E9C DW 3A63H ASCIIC ku,su,ri,to,_,so,no,yo,u_,ki,wo,_,o_,i_,te,i_,ma,su,dot ENDIF IF ENGLISH D4EB2 DW 3A63H ASCIIC _H,_A,_S,_,_N,_O,_,_B,_O,_T,_T,_L,_E,_per ELSE ; "youkiwo motteimasen." D4EB2 DW 3A63H ASCIIC yo,u_,ki,wo,_,mo,xtsu,te,i_,ma,se,n_,dot ENDIF IF ENGLISH D4EC2 DB _apost,_S,_,_B,_O,_T,_T,_L,_E N4EC2 EQU $-D4EC2 ELSE ; "no youkiniwa" D4EC2 DB no,_,yo,u_,ki,ni,ha N4EC2 EQU $-D4EC2 ENDIF IF ENGLISH D4EC9 DW 3A63H if 1 ASCIIC _I,_S,_,_F,_U,_L,_L,_per else ASCIIC _C,_A,_N,_apost,_T,_,_B,_E,_,_F,_I,_L,_L,_E,_D endif ELSE ; "mou hairimasen." D4EC9 DW 3A63H ASCIIC mo,u_,_,ha,i_,ri,ma,se,n_,dot ENDIF IF ENGLISH D4ED6 DW 3A23H ASCIIC _W,_E,_L,_C,_O,_M,_E,_per ELSE ; "irasshai." D4ED6 DW 3A23H ASCIIC i_,ra,xtsu,shi,xya,i_,dot ENDIF IF ENGLISH D4EE0 DW 3A63H ASCIIC _I,_,_A,_M,_,_N,_I,_E,_L,_S,_,_H,_J,_E,_L,_M,_E,_R,_S,_S,_O,_N,_per ELSE ; "NIELS HJELMERSSON to moushimasu." D4EE0 DW 3A63H ASCIIC _N,_I,_E,_L,_S,_,_H,_J,_E,_L,_M,_E,_R,_S,_S,_O,_N,_,to,_,mo,u_,shi,ma,su,dot ENDIF IF ENGLISH D4EFD DW 3A23H ASCIIC _V,_E,_R,_Y,_,_S,_O,_R,_R,_Y,_,_B,_U,_T ELSE ; "makotoni sumimasen." D4EFD DW 3A23H ASCIIC ma,ko,to,ni,_,su,mi,ma,se,n_,dot ENDIF IF ENGLISH D4F0B DW 3A63H ASCIIC _I,_,_A,_M,_,_B,_A,_N,_K,_R,_U,_P,_T,_per ELSE ; "misewa tsuburete shimaimashita." D4F0B DW 3A63H ASCIIC mi,se,ha,_,tsu,fu,ten,re,te,_,shi,ma,i_,ma,shi,ta,dot ENDIF ; "G.P." D4F1F DW 3A68H ASCIIC _G,_per,_P,_per IF ENGLISH D4F26 DW 3A63H ASCIIC _A,_L,_R,_E,_A,_D,_Y,_,_H,_A,_S,_,_A,_,_B,_O,_T,_T,_L,_E ELSE ; you already have a bottle? ; "sudeniyoukiwo motteimasu" D4F26 DW 3A43H ASCIIC su,te,ten,ni,yo,u_,ki,wo,_,mo,xtsu,te,i_,ma,su ENDIF ; "PREPARE TO DIE!!" D4F38 DW 3A48H ASCIIC _P,_R,_E,_P,_A,_R,_E,_,_T,_O,_,_D,_I,_E,_excl,_excl IF ENGLISH D4F4B DW 3A23H ASCIIC _G,_R,_E,_A,_T,_excl ELSE ; "subarashii" D4F4B DW 3A23H ASCIIC su,ha,ten,ra,shi,i_ ENDIF IF ENGLISH D4F54 DW 3A23H ASCIIC _A,_L,_L,_,_H,_A,_V,_E,_,_D,_I,_E,_D,_per ELSE ; "zenmetsu shimashita." D4F54 DW 3A23H ASCIIC se,ten,n_,me,tsu,_,shi,ma,shi,ta,dot ENDIF IF ENGLISH D4F62 DW 3A23H ASCIIC _E,_N,_E,_M,_Y,_,_H,_A,_D,_,_A,_,_M,_A,_G,_I,_C,_,_C,_L,_O,_A,_K,_excl ELSE ; "tekiwa mahounoMANTOwo kiteita!" enemy was wearing a magic cloak D4F62 DW 3A23H ASCIIC te,ki,ha,_,ma,ho,u_,no,_MA,_N_,_TO,wo,_,ki,te,i_,ta,_excl ENDIF IF ENGLISH D4F77 DW 3A63H ASCIIC _C,_A,_N,_apost,_T,_,_H,_O,_L,_D,_,_M,_O,_R,_E D4F77a DW 3A83H ASCIIC _T,_H,_A,_N,_,_1,_5,_0,_0,_0,_G,_per,_P,_per ELSE ; "15000G.P.ijyouwa motemasen." D4F77 DW 3A63H ASCIIC _1,_5,_0,_0,_0,_G,_per,_P,_per,i_,shi,ten,xyo,u_,ha,_,mo,te,ma,se,n_,dot ENDIF ; "*BATTLE*" D4F90 DW 3A23H ASCIIC _star,_B,_A,_T,_T,_L,_E,_star IF ENGLISH D4F9B DW 3A64H ASCIIC _M,_I,_S,_S,_E,_S ELSE ; "yoketa." D4F9B DW 3A84H ASCIIC yo,ke,ta,dot ENDIF IF ENGLISH ;D4FA2 DW 3A64H ; ASCIIC _A,_T,_T,_A,_C,_K,_S ELSE ; "uketometa." D4FA2 DW 3A84H ASCIIC u_,ke,to,me,ta,dot ENDIF IF ENGLISH D4FAB DW 3A64H ASCIIC _H,_I,_T,_S ELSE ; "ataeta!" D4FAB DW 3AA5H ASCIIC a_,ta,e_,ta,_excl ENDIF IF ENGLISH D4FB3 DW 3A64H ASCIIC _H,_A,_S,_,_S,_L,_A,_I,_N ELSE ; "shitometa!" D4FB3 DW 3A84H ASCIIC shi,to,me,ta,_excl ENDIF ; "*GOOD SHOT!*" D4FBB DW 3A23H ASCIIC _star,_G,_O,_O,_D,_,_S,_H,_O,_T,_excl,_star IF ENGLISH D4FCA DW 3A63H ASCIIC _T,_H,_E,_,_W,_R,_A,_I,_T,_H ELSE ; "WRAITH ni" D4FCA DW 3A63H ASCIIC _W,_R,_A,_I,_T,_H,_,ni ENDIF IF ENGLISH D4FD5 DW 3A85H ASCIIC _S,_T,_O,_L,_E,_N,_,_Y,_O,_U,_R ELSE ; "no LIFEwo" D4FD5 DW 3A85H ASCIIC no,_,_L,_I,_F,_E,wo ENDIF IF ENGLISH D4FDF DW 3AA5H ASCIIC _L,_I,_F,_E,_,_F,_O,_R,_C,_E ELSE ; "ubawareta" D4FDF DW 3AA5H ASCIIC u_,ha,ten,wa,re,ta ENDIF IF ENGLISH D4FE8 DW 3A23H ASCIIC _N,_O,_,_R,_O,_O,_M,_,_F,_O,_R,_,_A,_N,_O,_T,_H,_E,_R,_,_W,_A,_R,_R,_I,_O,_R,_per ELSE ; "mou nakamawo kuwarerukotowa dekimasen." D4FE8 DW 3A23H ASCIIC mo,u_,_,na,ka,ma,wo,_,ku,wa,e_,ru,ko,to,ha,_,te,ten,ki,ma,se,n_,dot ENDIF IF ENGLISH D5002 DW 3A23H ASCIIC _A,_D,_D,_,_A,_,_N,_E,_W ELSE ; "atarashii namaka wo" D5002 DW 3A23H ASCIIC a_,ta,ra,shi,i_,_,na,ka,ma,wo ENDIF IF ENGLISH D500F DW 3A43H ASCIIC _W,_A,_R,_R,_I,_O,_R,_ques ELSE ; "kuwaemasuka ?" D500F DW 3A64H ASCIIC ku,wa,e_,ma,su,ka,_,_ques ENDIF ; "ADD WARRIOR" D501A DW 3AB1H ASCIIC _A,_D,_D,_,_W,_A,_R,_R,_I,_O,_R IF ENGLISH D5028 DW 3A23H ASCIIC _M,_A,_K,_E,_,_A,_N,_O,_T,_H,_E,_R,_ques ELSE ; "mouhitori tsukurimasuka ?" D5028 DW 3A23H ASCIIC mo,u_,hi,to,ri,_,tsu,ku,ri,ma,su,ka,_,_ques ENDIF IF ENGLISH D5039 DB _dash,_C,_A,_N,_C,_E,_L,_dash ELSE ; "tsukawanai" D5039 DB tsu,ka,wa,na,i_ ENDIF N5039 EQU $-D5039 IF ENGLISH D503E DB _dash,_C,_A,_N,_C,_E,_L,_dash N503E EQU $-D503E ELSE ; "minai" D503E DB mi,na,i_ N503E EQU $-D503E ENDIF IF ENGLISH ELSE ; "san " D5041 DB sa,n_,_ N5041 EQU $-D5041 ENDIF IF ENGLISH D5044 EQU D503E N5044 EQU N503E ;D5044 DB _dash,_C,_A,_N,_C,_E,_L,_dash ;N5044 EQU $-D5044 ELSE ; "kawanai" D5044 DB ka,wa,na,i_ N5044 EQU $-D5044 ENDIF IF ENGLISH D5048 DB _,_F,_O,_U,_N,_D,_excl N5048 EQU $-D5048 ELSE ; "wo mitsuketa!" D5048 DB wo,_,mi,tsu,ke,ta,_excl N5048 EQU $-D5048 ENDIF IF ENGLISH D504F DB _,_I,_S,_,_N,_O,_W,_,_L,_E,_V,_E,_L,_ ELSE ; "REBERUninatta!" D504F DB _RE,_HE,ten,_RU,ni,na,xtsu,ta,_excl ENDIF N504F EQU $-D504F IF ENGLISH D5058 DB _,_G,_per,_P,_per,_,_G,_O,_L,_D,_,_F,_O,_U,_N,_D,_excl N5058 EQU $-D5058 ELSE ; "G.P.no GOLDwo mitsuketa!" D5058 DB _G,_per,_P,_per,no,_,_G,_O,_L,_D,wo,_,mi,tsu,ke,ta,_excl N5058 EQU $-D5058 ENDIF IF ENGLISH D5069a DB _,_F,_O,_R N5069a EQU $-D5069a D5069 DB _,_D,_A,_M,_A,_G,_E,_excl N5069 EQU $-D5069 ELSE ; "no DAMEJIwo" D5069 DB no,_,_TA,ten,_ME,_dash,_SHI,ten,wo N5069 EQU $-D5069 ENDIF ; "FIGHTER" D5072 DB _F,_I,_G,_H,_T,_E,_R N5072 EQU $-D5072 IF ENGLISH D5079 DB _,_I,_S,_N,_apost,_T,_,_H,_E,_R,_E,_per N5079 EQU $-D5079 ELSE ; "wa kokoni imasen." D5079 DB ha,_,ko,ko,ni,_,i_,ma,se,n_,dot N5079 EQU $-D5079 ENDIF IF ENGLISH D5084 DW 3A50H ASCIIC _G,_O,_I,_N,_G,_,_D,_O,_W,_N,_per ELSE ; "shitani oriru" D5084 DW 3A30H ASCIIC shi,ta,ni,_,o_,ri,ru ENDIF IF ENGLISH D508E DW 3A30H ASCIIC _T,_H,_E,_R,_E,_,_A,_R,_E,_,_S,_T,_A,_I,_R,_S ELSE ; "kaidanga aru." D508E DW 3A50H ASCIIC ka,i_,ta,ten,n_,ka,ten,_,a_,ru,dot ENDIF IF ENGLISH D509C DW 3A30H ASCIIC _B,_E,_L,_O,_W,_,_Y,_O,_U ELSE ; "shitani" D509C DW 3A30H ASCIIC shi,ta,ni ENDIF IF ENGLISH D50A2 DW 3A50H ASCIIC _I,_S,_,_A,_,_H,_O,_L,_E,_per ELSE ; "nukeanagaaru." D50A2 DW 3A50H ASCIIC nu,ke,a_,na,ka,ten,a_,ru,dot ENDIF IF ENGLISH D50AE DW 3A50H ASCIIC _G,_O,_I,_N,_G,_,_U,_P,_per ELSE ; "ueni agaru" D50AE DW 3A30H ASCIIC u_,e_,ni,_,a_,ka,ten,ru ENDIF IF ENGLISH D50B9 DW 3A30H ASCIIC _A,_B,_O,_V,_E,_,_Y,_O,_U ELSE ; "ueni" D50B9 DW 3A30H ASCIIC u_,e_,ni ENDIF IF ENGLISH D50BF DW 3A30H ASCIIC _A,_B,_O,_V,_E,_,_A,_N,_D,_,_B,_E,_L,_O,_W ELSE ; "ueto shitani" D50BF DW 3A30H ASCIIC u_,e_,to,_,shi,ta,ni ENDIF IF ENGLISH D50C9 DW 3AB8H ASCIIC _D,_E,_S,_C,_E,_N,_D ELSE ; "shitani iku" D50C9 DW 3AB8H ASCIIC shi,ta,ni,_,i_,ku ENDIF IF ENGLISH D50D2 DW 3A98H ASCIIC _S,_T,_A,_Y ELSE ; "ikanai" D50D2 DW 3A98H ASCIIC i_,ka,na,i_ ENDIF IF ENGLISH D50D9 DW 3AB8H ASCIIC _C,_L,_I,_M,_B ELSE ; "ueni iku" D50D9 DW 3AB8H ASCIIC u_,e_,ni,_,i_,ku ENDIF IF ENGLISH D50E2 DW 3AD8H ASCIIC _C,_L,_I,_M,_B ELSE ; "ueni iku" at bottom of screen D50E2 DW 3AD8H ASCIIC u_,e_,ni,_,i_,ku ENDIF ; "hai / iie" D50EB DB 02H DW D49E3,D49E8 ; "*MENU* / => TIME / HOW MUCH GOLD / CURE / QUIT / ADD WARRIOR" D50F0 DB 06H DW D49EE,D49F7,D4A00,D4A10,D4A17,D501A ; "MESSEJIno hyouji jikanwo / dorekuraini shimasuka [0-( )-9] ?" D50FD DB 02H DW D4A1E,D4A34 ; "dareno kusuriwo / tsukaimasuka ?" D5102 DB 02H DW D4A5B,D4A67 ; "GE-MUwo / tsuzukemasuka ? / hai / iie" D5107 DB 04H DW D4A96,D4A9E,D49E3,D49E8 ; "kusuriwo motteimasen / [ANY]" D5110 DB 02H DW D4A7F,D4A8E ; "doushimasuka ? / TALK / ATTACK / RUN" D5115 DB 04H DW D4AC6,D4AD2,D4AD9,D4AE2 ; "BLACK ONYX wo mezashite / ganbarimashyou. / [ANY KEY]" D511E DB 03H DW D4B35,D4B49,D49A1 ; "naniwo hamashikakemasuka? / JOIN US / GOOD BYE / YOUR MONEY / OR LIFE" D5125 DB 05H DW D4B57,D4B67,D4B71,D4B7C,D4B89 ; "dorewo kougeki / shimasuka ?" D5130 DB 02H DW D4B11,D4B1E ; "irasshaimase.watashiwa touginkouno" ; "suitougakarino TRY PENDRAGONdesu. / [ANY KEY]" D5135 DB 03H DW D4C1F,D4C38,D49A1 ; "donatawo otetsudai / shimashouka ?" D513C DB 02H DW D4C56,D4C65 ; "DEPOSIT / WITHDRAW / LEAVE" D5141 DB 03H DW D4C70,D4C7A,D4C85 ; "G.P.desu. / oikura ohikidashi / desuka ? 00000G.P." D5148 DB 03H DW D4BBD,D4CB9,D4CA1 ; "G.P.desu. / oikura gonyukin / desuka ? 00000G.P." D514F DB 03H DW D4BBD,D4C93,D4CA1 ; "watashiwa SLEA ishyadesu. / doredore shinsatsuteagemashou. / [ANY KEY]" D5156 DB 03H DW D4CC7,D4CDB,D49A1 ; "chiryouniwa / G.P.kakarimasu. / yoroshiidesuka ? / hai / iie" D515D DB 05H DW D4CF3,D4CFC,D4D09,D49E3,D49E8 ; "watashiwa SLEA ishyadesu. / [ANY KEY]" D5168 DB 02H DW D4CC7,D49A1 ; "dare wo / miteagemashouka ?" D516D DB 02H DW D4D16,D4D1D ; "kensainiwa / G.P. / hitsuyoudesuka. / yoroshiidesuka ? / hai / iie" IF ENGLISH D5172 DB 05H DW D4D4C,D4F1F,D4D60,D49E3,D49E8 ELSE D5172 DB 06H DW D4D4C,D4F1F,D4D54,D4D60,D49E3,D49E8 ENDIF ; "LVL = / LIFE= / STR = / DEX =" D517F DB 04H DW D4D2C,D4D34,D4D3C,D4D44 ; "irasshaimase. watashi PANDORA / yakuzaishiyo." ; kusurito sonoyoukiwo oiteimasu. / [ANY KEY]" D5188 DB 04H DW D4E79,D4E91,D4E9C,D49A1 ; "mou hairimasen. / [ANY KEY]" D5191 DB 02H DW D4EC9,D49A1 ; "youkiwo motteimasen. / [ANY KEY]" D5196 DB 02H DW D4EB2,D49A1 ; "sudeniyoukiwo motteimasu / [ANY KEY]" D519B DB 02H DW D4F26,D49A1 ; "orewa konokuni ichibanno / SHIELD ME-KA / ; HROLF BATTERSHIELD da. / nanika katteikeyo. / [ANY KEY]" D51A0 DB 05H DW D4E32,D4E44,D4E52,D4E6B,D49A1 ; "anatanoWEAPONwa / katatedewa motemasen" ; "WEAPONwo tebanashimasuka ? / hai / iie" D51AB DB 05H DW D4DCF,D4DDD,D4DEC,D49E3,D49E8 ; "youkoso irasshaimase. watashiwa / BLICK ARMSTRONG to moushimasu. / [ANY KEY]" D51B6 DB 03H DW D4E01,D4E17,D49A1 ; "irasshaimase. / DARNOC buki senmonde gozaimasu. / [ANY KEY]" D51BD DB 03H DW D4D6D,D4D79,D49A1 ; "SHIELDwo motteitewa / konoWEAPONwa tsukaemasen" ; "SHIELDwo tebanashimasuka ? / hai / iie" D51C4 DB 05H DW D4D96,D4DA7,D4DBA,D49E3,D49E8 ; "irasshai. / NIELS HJELMERSSON to moushimasu. / [ANY KEY]" D51CF DB 03H DW D4ED6,D4EE0,D49A1 ; "makotoni sumimasen. / misewa tsuburete shimaimashita. / [ANY KEY]" D51D6 DB 03H DW D4EFD,D4F0B,D49A1 ; "okanega tarimasen. / [ANY KEY]" D51DD DB 02H DW D4BAB,D49A1 ; "donataga / okaiageninarimasuka ?" D51E2 DB 02H DW D4BF4,D4BFD ; "G.P.desu. / okaiageninarimasuka ? / NEXT ITEM / kau / misewo deru" D51E7 DB 05H DW D4BBD,D4BC8,D4BD9,D4BE5,D4BEA ; "subarashii / [ANY KEY]" D51F2 DB 02H DW D4F4B,D49A1 ; "donataga / tsukaimasuka ? " (for weapons/armor found) D51F7 DB 02H DW D4BF4,D4C0E ; "tekiwa mahounoMANTOwo kiteita! / [ANY KEY]" D51FC DB 02H DW D4F62,D49A1 IF ENGLISH D5201 EQU D51F7 ELSE ; "donataga / tsukaimasuka ? " (for magic cloak) D5201 DB 02H DW D4BF4,D4C0E ENDIF ; "can't have more than 15000 GP / [ANY KEY]" IF ENGLISH D5206 DB 02H DW D4F77,D4F77a,D49A1 ELSE D5206 DB 02H DW D4F77,D49A1 ENDIF ; "WRAITH ni / no LIFEwo / ubawareta" D520B DB 03H DW D4FCA,D4FD5,D4FDF ; / [ANY KEY]" D5212 DB 02H DW D4FE8,D49A1 ; "atarashii namaka wo / kuwaemasuka ? / hai / iie" D5217 DB 04H DW D5002,D500F,D49E3,D49E8 ; "shitani oriru / kaidan ga aru. / shitani iku / ikanai" D5220 DB 04H DW D5084,D508E,D50C9,D50D2 ; "shitani / nukeanagaaru. / shitani iku / ikanai" D5229 DB 04H DW D509C,D50A2,D50C9,D50D2 ; "ueni agaru / kaidanga aru. / ueni iku / ikanai" D5232 DB 04H DW D50AE,D508E,D50D9,D50D2 ; "ueni / nukeanagaaru. / ueni iku / ikanai" D523B DB 04H DW D50B9,D50A2,D50D9,D50D2 ; "ueto shitani / nukeanagaaru. / ikanai / shitani iku / ueni iku" D5244 DB 05H DW D50BF,D50A2,D50D2,D50C9,D50E2 ; omedetou / toutou kimiwa BLACK ONYX wo teniireru / kotogadekita ..." D524F DB 05H DW D525A,D5263,D5280,D528B,D52A8 IF ENGLISH D525A DW 3943H ASCIIC _C,_O,_N,_G,_R,_A,_T,_U,_L,_A,_T,_I,_O,_N,_S,_excl ELSE ; "omedetou" D525A DW 3943H ASCIIC o_,me,te,ten,to,u_ ENDIF IF ENGLISH D5263 DW 3983H ASCIIC _Y,_O,_U,_,_H,_A,_V,_E,_,_F,_O,_U,_N,_D,_,_T,_H,_E ELSE ; "toutou kimiwa BLACK ONYXwo teniireru" D5263 DW 3983H ASCIIC to,u_,to,u_,_,ki,mi,ha,_,_B,_L,_A,_C,_K,_,_O,_N,_Y,_X,wo,_,te,ni,i_,re,ru ENDIF IF ENGLISH D5280 DW 39C3H ASCIIC _B,_L,_A,_C,_K,_,_O,_N,_Y,_X,_excl,_,_Y,_O,_U,_,_S,_H,_A,_L,_L ELSE ; "kotogadekita" D5280 DW 39C3H ASCIIC ko,to,ka,ten,te,ten,ki,ta ENDIF IF ENGLISH D528B DW 3A03H ASCIIC _H,_A,_V,_E,_,_E,_T,_E,_R,_N,_A,_L,_,_Y,_O,_U,_T,_H ELSE ; "korede kimitachiwa eiennowakasato bakuda" D528B DW 3A03H ASCIIC ko,re,te,ten,_,ki,mi,ta,chi,ha,_,e_,i_,e_,n_,no,wa,ka,sa,to,_,ha,ten,ku,ta,ten ENDIF IF ENGLISH D52A8 DW 3A43H ASCIIC _A,_N,_D,_,_W,_E,_A,_L,_T,_H,_excl ELSE ; "inatomiwo erukotodarou" D52A8 DW 3A43H ASCIIC i_,na,to,mi,wo,_,e_,ru,ko,to,ta,ten,ro,u_ ENDIF ; "GAME OVER" D52B9 DW 396BH ASCIIC _G,_A,_M,_E,__,_O,_V,_E,_R ; credits D52C5 DB 08H DW D52D6,D52DE,D52F9,D5313,D531F,D5337,D534C,D5362 D52D6 DW 384DH ASCIIC _S,_T,_A,_F,_F D52DE DW 38A2H ASCIIC _P,_R,_O,_D,_U,_C,_E,_D,__,_B,_Y,__,__,__,__,__,_V,_T,__,_K,_E,_I,_K,_O D52F9 DW 3902H ASCIIC _D,_I,_R,_E,_C,_T,_E,_D,__,_B,_Y,__,__,__,__,__,_M,_U,_T,__,_2,_4,_1 D5313 DW 3952H ASCIIC _M,_I,_N,_O,__,_C,_H,_A,_N IF ENGLISH D531F DW 39A2H ASCIIC _A,_R,_T,__,_D,_I,_R,_E,_C,_T,_O,_R,__,__,__,__,_C,_H,_O,_K,_O ELSE D531F DW 39A2H ASCIIC _A,_R,_T,__,_D,_I,_R,_E,_C,_T,_E,_R,__,__,__,__,_C,_H,_O,_K,_O ENDIF D5337 DW 3A02H ASCIIC _S,_O,_U,_N,_D,__,_C,_O,_M,_P,_O,_S,_E,_R,__,__,_B,_O D534C DW 3A62H ASCIIC _O,_R,_I,_G,_I,_N,_A,_L,__,_G,_A,_M,_E,__,__,__,_B,_P,_S D5362 DW 3AC2H ASCIIC _P,_R,_E,_S,_E,_N,_T,_E,_D,__,_B,_Y,__,__,__,__,_S,_E,_G,_A D5379 DB 03H DW D5380,D538B,D5396 ; "* MENU *" D5380 DW 38ECH ASCIIC _star,_,_M,_E,_N,_U,_,_star IF ENGLISH D538B DW 394CH ASCIIC _N,_E,_W,_,_G,_A,_M,_E ELSE ; "nakama wo tsukuru" D538B DW 394CH ASCIIC na,ka,ma,wo,_,tsu,ku,ru ENDIF IF ENGLISH D5396 DW 396CH ASCIIC _P,_A,_S,_S,_W,_O,_R,_D ELSE ; "PASS WORD" D5396 DW 396CH ASCIIC _P,_A,_S,_S,_,_W,_O,_R,_D ENDIF IF ENGLISH D53A2 DW 3AA2H ASCIIC _E,_N,_T,_E,_R,_,_P,_A,_S,_S,_W,_O,_R,_D,_,_lpar,_1,_5,_C,_H,_R,_,_M,_A,_X,_rpar ELSE ; "PASSWORD wo iretekudasai (15moji)" D53A2 DW 3AA2H ASCIIC _P,_A,_S,_S,_,_W,_O,_R,_D,_,wo,_,i_,re,te,ku,ta,ten,sa,i_,_,_lpar,_1,_5,mo,shi,ten,_rpar ENDIF ; "PASS WORDwo / hyouji shimasuka ? / hai / iie" D53C1 DB 04H DW D53CA,D53D7,D49E3,D49E8 IF ENGLISH D53CA DW 3A63H ASCIIC _D,_O,_,_Y,_O,_U,_,_W,_A,_N,_T,_,_A ELSE ; "PASS WORDwo" D53CA DW 3A63H ASCIIC _P,_A,_S,_S,_,_W,_O,_R,_D,wo ENDIF IF ENGLISH D53D7 DW 3A83H ASCIIC _S,_A,_V,_E,_,_P,_A,_S,_S,_W,_O,_R,_D,_ques ELSE ; "hyouji shimasuka ?" D53D7 DW 3AA3H ASCIIC hi,xyo,u_,shi,ten,_,shi,ma,su,ka,_,_ques ENDIF IF ENGLISH D53E6 DW 3AA2H ASCIIC _P,_A,_S,_S,_W,_O,_R,_D,_,_I,_S,_,_N,_O,_T,_,_C,_O,_R,_R,_E,_C,_T,_,_,_ ELSE ; "ga machigatteimasu " D53E6 DW 3AACH ASCIIC ka,ten,_,ma,chi,ka,ten,xtsu,te,i_,ma,su,_,_,_,_,_,_ ENDIF ; special room names D53FB DW D5451,D545C,D5468,D546E,D547B,D5481,D5487,D548F DW D5497,D549F,D54A7,D54B2,D54BB,D54C9,D54D0,D54DA DW D54E2,D54EA,D54F2,D54FA,D5504,D5510,D5519,D5520 DW D5529,D5530,D5538,D553E,D5545,D554F,D5558,D5561 DW D556F,D557E,D5586,D5586,D5586,D5594,D55A1,D55B0 DW D55BF,D55CC,D55D9 ; first byte is number of blanks to indent by IF ENGLISH D5451 DB 03H ; 00 ASCIIC _T,_O,_M,_apost,_S,_,_G,_R,_O,_G ELSE D5451 DB 02H ; 00 ASCIIC _T,_O,_M,_S,_,_G,_R,_O,_G ENDIF D545C DB 02H ; 01 ASCIIC _U,_T,_S,_U,_R,_O,_,_I,_N,_N D5468 DB 05H ; 02 ASCIIC _B,_A,_N,_K IF ENGLISH D546E DB 02H ; 03 ASCIIC _A,_R,_N,_O,_L,_D,_apost,_S,_,_P,_U,_B ELSE D546E DB 01H ; 03 ASCIIC _A,_R,_N,_O,_L,_D,_S,_,_P,_U,_B ENDIF D547B DB 05H ; 04 ASCIIC _G,_R,_U,_B D5481 DB 05H ; 05 ASCIIC _J,_A,_I,_L D5487 DB 04H ; 06 ASCIIC _C,_E,_L,_L,_nbr,_1 D548F DB 04H ; 07 ASCIIC _C,_E,_L,_L,_nbr,_2 D5497 DB 04H ; 08 ASCIIC _C,_E,_L,_L,_nbr,_3 D549F DB 04H ; 09 ASCIIC _C,_E,_L,_L,_nbr,_4 D54A7 DB 02H ; 0A ASCIIC _P,_H,_Y,_S,_I,_C,_K,_E,_R D54B2 DB 03H ; 0B ASCIIC _S,_U,_R,_G,_E,_R,_Y D54BB DB 01H ; 0C ASCIIC _E,_X,_A,_M,_I,_N,_A,_T,_I,_O,_N,_S D54C9 DB 04H ; 0D ASCIIC _D,_R,_U,_G,_S D54D0 DB 03H ; 0E ASCIIC _P,_A,_T,_I,_E,_N,_T,_S D54DA DB 04H ; 0F ASCIIC _R,_O,_O,_M,_nbr,_1 D54E2 DB 04H ; 10 ASCIIC _R,_O,_O,_M,_nbr,_2 D54EA DB 04H ; 11 ASCIIC _R,_O,_O,_M,_nbr,_3 D54F2 DB 04H ; 12 ASCIIC _R,_O,_O,_M,_nbr,_4 D54FA DB 03H ; 13 ASCIIC _C,_E,_M,_E,_T,_E,_R,_Y D5504 DB 02H ; 14 ASCIIC _star,_C,_E,_M,_E,_T,_E,_R,_Y,_star D5510 DB 03H ; 15 ASCIIC _S,_H,_I,_E,_L,_D,_S D5519 DB 04H ; 16 ASCIIC _A,_R,_M,_O,_R D5520 DB 03H ; 17 ASCIIC _W,_E,_A,_P,_O,_N,_S D5529 DB 04H ; 18 ASCIIC _H,_E,_L,_M,_S D5530 DB 04H ; 19 ASCIIC _T,_A,_I,_L,_O,_R D5538 DB 05H ; 1A ASCIIC _E,_X,_I,_T D553E DB 04H ; 1B ASCIIC _lt,_E,_X,_I,_T D5545 DB 03H ; 1C ASCIIC _T,_H,_E,_,_W,_A,_L,_L D554F DB 03H ; 1D ASCIIC _M,_A,_R,_K,_E,_T,_gt D5558 DB 03H ; 1E ASCIIC _lt,_M,_A,_R,_K,_E,_T D5561 DB 01H ; 1F ASCIIC _D,_O,_,_N,_O,_T,_,_E,_N,_T,_E,_R D556F DB 01H ; 20 IF ENGLISH ASCIIC _C,_O,_L,_O,_R,_S,_,_S,_H,_I,_F,_T ELSE ASCIIC i_,ro,_,i_,xtsu,ka,i_,tsu,ten,tsu,_per,_per,_per ; "iroikkaizutsu..." ENDIF D557E DB 04H ; 21 ASCIIC _S,_T,_A,_I,_R,_S ; NOTE: room code 22H = kraken (at bottom of well) ; NOTE: room code 23H = black onyx IF ENGLISH D5586 DB 01H ; 24 ASCIIC _Y,_E,_L,_L,_O,_W,_,_W,_A,_L,_L,_S D5594 DB 03H ; 25 ASCIIC _R,_E,_D,_,_W,_A,_L,_L,_S D55A1 DB 01H ; 26 ASCIIC _P,_U,_R,_P,_L,_E,_,_W,_A,_L,_L,_S D55B0 DB 02H ; 27 ASCIIC _G,_R,_E,_E,_N,_,_W,_A,_L,_L,_S D55BF DB 02H ; 28 ASCIIC _B,_L,_U,_E,_,_,_W,_A,_L,_L,_S D55CC DB 02H ; 29 ASCIIC _W,_H,_I,_T,_E,_,_W,_A,_L,_L,_S D55D9 DB 02H ; 2A ASCIIC _B,_L,_A,_C,_K,_,_T,_O,_W,_E,_R ELSE D5586 DB 01H ; 24 ASCIIC ka,he,ten,no,_,i_,ro,ha,_,ki,i_,ro ; "kabeno iroha kiiro" (the wall color is yellow) D5594 DB 01H ; 25 ASCIIC ka,he,ten,no,_,i_,ro,ha,_,a_,ka ; "kabeno iroha aka" D55A1 DB 01H ; 26 ASCIIC ka,he,ten,no,_,i_,ro,ha,_,mu,ra,sa,ki ; "kabeno iroha murasaki" D55B0 DB 01H ; 27 ASCIIC ka,he,ten,no,_,i_,ro,ha,_,mi,to,ten,ri ; "kabeno iroha midori" D55BF DB 01H ; 28 ASCIIC ka,he,ten,no,_,i_,ro,ha,_,a_,o_ ; "kabeno iroha ao" D55CC DB 01H ; 29 ASCIIC ka,he,ten,no,_,i_,ro,ha,_,shi,ro ; "kabeno iroha shiro" D55D9 DB 01H ; 2A ASCIIC _B,_L,_A,_C,_K,_,_T,_O,_W,_E,_R ENDIF ; heads and bodies of storekeepers? D55E6 DB 56H,5DH ; banker - tyr pendragon D55E8 DB 57H,5EH ; healer - slea D55EA DB 58H,5FH ; herablist - pandora D55EC DB 59H,5BH ; shield - hrolf battleshield D55EE DB 5AH,5CH ; armor - blick armstrong D55F0 DB 56H,5DH ; weapons - darnoc D55F2 DB 57H,5EH ; helms - niels hjelmersson D55F4 DB 58H,5FH ; tailor N55F4 EQU $-D55F4 ; monster stats D55F6 DB 08H,00H,01H,03H,_Z,_O,_M,_B,_I,_E,01H,04H,01H,07H,01H,03H,01H ; 00 ZOMBIE DB 09H,01H,02H,03H,_A,_Z,_T,_E,_C,__,01H,06H,01H,04H,01H,05H,01H ; 01 AZTEC DB 08H,00H,01H,05H,_W,_O,_L,_F,__,__,01H,06H,01H,05H,01H,05H,01H ; 02 WOLF DB 08H,01H,01H,03H,_L,_I,_O,_N,__,__,02H,0AH,03H,06H,03H,0AH,03H ; 03 LION DB 08H,01H,0AH,01H,_B,_A,_T,__,__,__,02H,01H,00H,03H,00H,0CH,00H ; 04 BAT DB 09H,01H,08H,0AH,_K,_O,_B,_O,_L,_D,02H,02H,01H,03H,01H,06H,01H ; 05 KOBOLD DB 0AH,01H,02H,05H,_S,_K,_E,_L,_E,_T,02H,03H,02H,04H,02H,05H,02H ; 06 SKELET DB 0AH,01H,03H,05H,_G,_O,_B,_L,_I,_N,02H,04H,02H,03H,04H,05H,03H ; 07 GOBLIN DB 09H,02H,01H,02H,_O,_R,_C,__,__,__,03H,08H,04H,0AH,05H,0AH,05H ; 08 ORC DB 08H,02H,02H,03H,_S,_L,_I,_M,_E,__,03H,0EH,04H,08H,02H,05H,02H ; 09 SLIME DB 08H,02H,01H,05H,_M,_U,_M,_M,_Y,__,04H,06H,03H,0AH,06H,07H,0AH ; 0A MUMMY DB 09H,03H,02H,04H,_G,_H,_O,_U,_L,__,04H,0AH,04H,0AH,06H,08H,0AH ; 0B GHOUL DB 0BH,03H,02H,00H,_C,_O,_B,_R,_A,__,04H,14H,06H,0EH,08H,0CH,0AH ; 0C COBRA DB 0AH,03H,01H,03H,_O,_G,_R,_E,__,__,04H,0FH,06H,0AH,0AH,0AH,0AH ; 0D OGRE DB 09H,03H,01H,02H,_S,_P,_I,_D,_E,_R,04H,0FH,06H,0BH,06H,19H,0AH ; 0E SPIDER DB 09H,03H,01H,02H,_V,_A,_M,_P,_I,_R,04H,1EH,08H,1CH,08H,22H,0AH ; 0F VAMPIR DB 09H,04H,01H,02H,_H,_O,_B,_G,_O,_B,04H,19H,0AH,0CH,08H,14H,0AH ; 10 HOBGOB DB 08H,03H,01H,02H,_B,_L,_A,_A,_B,__,05H,14H,08H,0DH,0AH,0EH,0AH ; 11 BLAAB DB 0AH,04H,01H,03H,_W,_I,_R,_K,_A,_T,05H,16H,0AH,14H,0AH,16H,0AH ; 12 WIRKAT DB 08H,05H,03H,02H,_G,_H,_O,_S,_T,__,06H,14H,0CH,14H,0CH,14H,0CH ; 13 GHOST DB 09H,05H,01H,02H,_D,_E,_M,_O,_N,__,06H,1EH,0EH,32H,0AH,19H,0CH ; 14 DEMON DB 0AH,05H,02H,00H,_B,_E,_A,_S,_T,__,06H,23H,0EH,1CH,0CH,1EH,0CH ; 15 BEAST DB 0CH,05H,01H,00H,_H,_I,_D,_E,_R,__,06H,1EH,0AH,28H,05H,23H,05H ; 16 HIDER DB 09H,06H,06H,00H,_M,_I,_E,_R,__,__,07H,1EH,00H,1EH,00H,14H,00H ; 17 MIER DB 0BH,06H,03H,00H,_T,_R,_O,_L,_L,__,07H,28H,00H,19H,00H,19H,00H ; 18 TROLL DB 0AH,07H,01H,03H,_W,_R,_A,_I,_T,_H,08H,14H,05H,14H,05H,14H,05H ; 19 WRAITH DB 0BH,07H,03H,00H,_T,_A,_U,_R,_U,_S,08H,28H,00H,14H,00H,23H,00H ; 1A TAURUS DB 09H,07H,02H,00H,_G,_I,_A,_N,_T,__,08H,40H,00H,96H,00H,14H,00H ; 1B GIANT DB 0BH,05H,01H,00H,_K,_R,_A,_K,_E,_N,09H,44H,00H,64H,00H,19H,00H ; 1C KRAKEN D57E3 DB 03H,00H,00H DB 06H,00H,05H DB 03H,00H,14H DB 03H,01H,03H DB 01H,00H,02H DB 04H,00H,08H DB 05H,01H,00H DB 06H,01H,07H DB 05H,02H,07H DB 05H,00H,01H DB 04H,01H,00H DB 06H,01H,00H DB 08H,07H,01H DB 09H,05H,02H DB 05H,03H,05H DB 04H,03H,04H DB 0AH,03H,04H DB 08H,00H,01H DB 05H,02H,08H DB 05H,14H,02H DB 03H,0AH,01H DB 06H,0FH,00H DB 05H,05H,01H DB 06H,0AH,01H DB 07H,05H,01H DB 04H,06H,00H DB 0AH,0CH,01H DB 03H,05H,01H DB 02H,05H,01H DB 00H,00H,05H D583D HEX 3F B2 CB F1 EB C1 C3 71 HEX CF F7 37 0E F5 A0 FE D3 HEX 8F 7B D9 9C 03 80 57 70 HEX 57 F8 47 74 21 F8 20 02 D585D HEX BD 81 01 80 B8 E1 03 10 HEX BA 90 83 23 45 F7 0B 7F HEX E7 7E 8B B7 0B EA B3 C0 HEX A0 01 40 38 09 00 20 00 HEX 03 10 01 13 14 10 B9 09 HEX 2E 40 24 00 09 81 0B C0 HEX 36 D5 13 92 2B CD 80 00 HEX 00 A8 24 20 08 02 4F 00 HEX 48 0B 04 90 04 09 50 00 HEX 00 0A 45 45 31 A0 8A C5 HEX 92 DA 1D A0 5E 44 00 08 HEX D8 00 24 55 00 00 84 08 HEX 20 10 80 C0 30 7A 79 A4 HEX 78 A7 31 7D A9 AC 06 61 HEX 03 F3 0D A0 40 05 C3 84 HEX 02 12 10 28 08 41 81 00 HEX 23 24 54 81 8B 7C 04 00 HEX 2E 18 76 25 28 18 A3 40 HEX 13 F0 41 C7 13 84 D7 32 HEX C2 7A 03 82 53 9A D4 18 HEX 70 00 40 CC 40 30 0E 21 HEX 10 E5 21 8C C7 6C C5 A1 HEX 05 A9 66 C0 63 CC 02 04 HEX 00 34 13 34 03 05 30 01 HEX 33 13 22 62 44 44 88 8B HEX 11 11 23 22 64 44 C8 98 HEX 19 51 22 22 44 46 88 88 HEX 91 19 22 22 88 88 44 54 ;----------------------------------------------------------------------- D593D DW DC19D ; address to fill with 54H DB 10H ; length to fill with 54H DW DC1CD DB 10H DW DC1F1 DB 08H DW DC203 DB 04H ; first byte = offset from previous location (starting from beginning of off-screen maze) ; second = name table byte for that location D5949 HEX 00 50 0F 53 02 4E 0D 51 04 4E 0B 51 06 50 HEX 09 53 08 4E 07 51 0A 50 05 53 0C 50 03 53 D5965 DW DC243 ; address to fill with 55H DB 04H ; length to fill with 55H DW DC251 DB 08H DW DC26D DB 10H DW DC29D DB 10H ; first byte = offset from previous location (starting from beginning of off-screen maze) ; second = name table byte for that location D5971 HEX A6 52 03 4F 0C 52 05 4F 0A 51 07 4E 08 52 HEX 09 4F 06 51 0B 4E 04 51 0D 4E 02 52 0F 4F ;----------------------------------------------------------------------- ; store catalogs D598D DB 02H DW 006CH,0243H,D59A3 ; 02430.0 L shield DW 006AH,0027H,D59AC ; 00270.0 M shield DW 0068H,0003H,D59B5 ; 00030.0 S shield D59A0 DB 03H,68H,02H ; DE=000C D59A3 ASCIIC _L,_dash,_S,_H,_I,_E,_L,_D D59AC ASCIIC _M,_dash,_S,_H,_I,_E,_L,_D D59B5 ASCIIC _S,_dash,_S,_H,_I,_E,_L,_D D59BE DB 01H DW 0078H,1024H,D59E0 ; 10240.0 tabard DW 0077H,0256H,D59E7 ; 02560.0 full plate DW 0076H,0064H,D59F2 ; 00640.0 half plate DW 0075H,0016H,D59FD ; 00160.0 hauberk DW 0074H,0004H,D5A05 ; 00040.0 leather D59DD DB 05H,74H,01H ; DE = 000D D59E0 ASCIIC _T,_A,_B,_A,_R,_D D59E7 ASCIIC _F,_U,_L,_L,__,_P,_L,_A,_T,_E D59F2 ASCIIC _H,_A,_L,_F,__,_P,_L,_A,_T,_E D59FD ASCIIC _H,_A,_U,_B,_E,_R,_K D5A05 ASCIIC _L,_E,_A,_T,_H,_E,_R D5A0D DB 02H DW 0095H,0256H,D5A47 ; 02560.0 battle axe DW 0093H,0128H,D5A52 ; 01280.0 claymore DW 0091H,0064H,D5A5B ; 00640.0 broad sword DW 008FH,0032H,D5A67 ; 00320.0 spear DW 008DH,0016H,D5A6D ; 00160.0 axe DW 008BH,0008H,D5A71 ; 00080.0 short sword DW 0089H,0004H,D5A7D ; 00040.0 mace DW 0087H,0002H,D5A82 ; 00020.0 club DW 0085H,0001H,D5A87 ; 00010.0 knife D5A44 DB 09H,85H,02H ; DE = 000E D5A47 ASCIIC _B,_A,_T,_T,_L,_E,__,_A,_X,_E D5A52 ASCIIC _C,_L,_A,_Y,_M,_O,_R,_E D5A5B ASCIIC _B,_R,_O,_A,_D,__,_S,_W,_O,_R,_D D5A67 ASCIIC _S,_P,_E,_A,_R D5A6D ASCIIC _A,_X,_E D5A71 ASCIIC _S,_H,_O,_R,_T,__,_S,_W,_O,_R,_D D5A7D ASCIIC _M,_A,_C,_E D5A82 ASCIIC _C,_L,_U,_B D5A87 ASCIIC _K,_N,_I,_F,_E D5A8D DB 01H DW 00B1H,0256H,D5AA3 ; 02560.0 horned helm DW 00B0H,0032H,D5AAF ; 00320.0 winged helm DW 00AFH,0004H,D5ABB ; 00040.0 coif D5AA0 DB 03H,0AFH,01H ; DE = 000F D5AA3 ASCIIC _H,_O,_R,_N,_E,_D,__,_H,_E,_L,_M D5AAF ASCIIC _W,_I,_N,_G,_E,_D,__,_H,_E,_L,_M D5ABB ASCIIC _C,_O,_I,_F ;----------------------------------------------------------------------- D5AC0 ; copied to VRAM 0000 IF FONT2 HEX 1C 26 63 63 63 32 1C 00 ; 0 HEX 18 38 18 18 18 18 7E 00 ; 1 HEX 3E 63 07 1E 3C 70 7F 00 ; 2 HEX 3F 06 0C 1E 03 63 3E 00 ; 3 HEX 0E 1E 36 66 7F 06 06 00 ; 4 HEX 7E 60 7E 03 03 63 3E 00 ; 5 HEX 1E 30 60 7E 63 63 3E 00 ; 6 HEX 7F 63 06 0C 18 18 18 00 ; 7 HEX 3C 62 72 3C 4F 43 3E 00 ; 8 HEX 3E 63 63 3F 03 06 3C 00 ; 9 HEX 1C 36 63 7F 63 63 63 00 ; A HEX 6E 73 63 7E 63 63 7E 00 ; B HEX 1E 33 60 60 60 33 1E 00 ; C HEX 6C 76 63 63 63 66 7C 00 ; D HEX 7F 31 30 3C 30 31 7F 00 ; E HEX 7F 31 30 3C 30 30 78 00 ; F HEX 1E 33 60 67 63 37 1D 00 ; G HEX 63 63 63 7F 63 63 63 00 ; H HEX 3C 18 18 18 18 18 3C 00 ; I HEX 1F 06 06 06 06 66 3C 00 ; J HEX 66 66 6C 78 6C 67 63 00 ; K HEX 78 30 60 60 63 63 7E 00 ; L HEX 63 77 7F 6B 63 63 63 00 ; M HEX 63 73 7B 6F 67 63 63 00 ; N HEX 1C 36 63 63 63 36 1C 00 ; O HEX 6E 73 63 7E 60 60 60 00 ; P HEX 1C 36 63 6B 67 36 1D 00 ; Q HEX 6E 73 63 7E 6C 67 63 00 ; R HEX 3E 63 60 3E 03 63 3E 00 ; S HEX 7E 5A 18 18 18 18 3C 00 ; T HEX 73 33 63 63 63 76 3C 00 ; U HEX 73 33 63 63 66 3C 18 00 ; V HEX 73 33 63 6B 7F 77 63 00 ; W HEX 63 63 36 1C 36 63 63 00 ; X HEX 33 63 63 36 1C 78 70 00 ; Y HEX 7F 63 06 1C 33 63 7E 00 ; Z ELSE DB 00000000B ; 00 0 (0000) DB 00111100B DB 01100110B DB 01100110B DB 01100110B DB 01100110B DB 00111100B DB 00000000B DB 00000000B ; 01 1 DB 00011000B DB 00111000B DB 00011000B DB 00011000B DB 00011000B DB 00111100B DB 00000000B DB 00000000B ; 02 2 DB 00111100B DB 01100110B DB 01100110B DB 00001100B DB 00110000B DB 01111110B DB 00000000B DB 00000000B ; 03 3 DB 00111100B DB 01100110B DB 00001100B DB 00000110B DB 01100110B DB 00111100B DB 00000000B DB 00000000B ; 04 4 DB 00001100B DB 00011100B DB 00101100B DB 01001100B DB 01111110B DB 00001100B DB 00000000B DB 00000000B ; 05 5 DB 01111100B DB 01100000B DB 01111100B DB 00000110B DB 01100110B DB 00111100B DB 00000000B DB 00000000B ; 06 6 DB 00111100B DB 01100000B DB 01111100B DB 01100110B DB 01100110B DB 00111100B DB 00000000B DB 00000000B ; 07 7 DB 01111110B DB 01100110B DB 00001000B DB 00011000B DB 00011000B DB 00011000B DB 00000000B DB 00000000B ; 08 8 DB 00111100B DB 01100110B DB 00111100B DB 01100110B DB 01100110B DB 00111100B DB 00000000B DB 00000000B ; 09 9 DB 00111100B DB 01100110B DB 01100110B DB 00111110B DB 00000110B DB 00111100B DB 00000000B DB 00000000B ; 0A A DB 00111100B DB 01100010B DB 01100010B DB 01100010B DB 01111110B DB 01100010B DB 00000000B DB 00000000B ; 0B B DB 01111100B DB 01100010B DB 01111100B DB 01100010B DB 01100010B DB 01111100B DB 00000000B DB 00000000B ; 0C C DB 00111100B DB 01100110B DB 01100000B DB 01100000B DB 01100110B DB 00111100B DB 00000000B DB 00000000B ; 0D D DB 01111100B DB 01100010B DB 01100010B DB 01100010B DB 01100010B DB 01111100B DB 00000000B DB 00000000B ; 0E E DB 01111110B DB 01100000B DB 01111100B DB 01100000B DB 01100000B DB 01111110B DB 00000000B DB 00000000B ; 0F F DB 01111110B DB 01100000B DB 01100100B DB 01111100B DB 01100100B DB 01100000B DB 00000000B DB 00000000B ; 10 G (0080) DB 00111100B DB 01100010B DB 01100000B DB 01101110B DB 01100010B DB 00111100B DB 00000000B DB 00000000B ; 11 H DB 01100010B DB 01100010B DB 01111110B DB 01100010B DB 01100010B DB 01100010B DB 00000000B DB 00000000B ; 12 I DB 00111100B DB 00011000B DB 00011000B DB 00011000B DB 00011000B DB 00111100B DB 00000000B DB 00000000B ; 13 J DB 00011110B DB 00001100B DB 00001100B DB 00001100B DB 01001100B DB 00111000B DB 00000000B DB 00000000B ; 14 K DB 01100010B DB 01100100B DB 01111000B DB 01101000B DB 01100100B DB 01100010B DB 00000000B DB 00000000B ; 15 L DB 01100000B DB 01100000B DB 01100000B DB 01100000B DB 01100010B DB 01111110B DB 00000000B DB 00000000B ; 16 M DB 01100010B DB 01110110B DB 01101010B DB 01100010B DB 01100010B DB 01100010B DB 00000000B DB 00000000B ; 17 N DB 01100010B DB 01110010B DB 01101010B DB 01100110B DB 01100010B DB 01100010B DB 00000000B DB 00000000B ; 18 O DB 00111100B DB 01100010B DB 01100010B DB 01100010B DB 01100010B DB 00111100B DB 00000000B DB 00000000B ; 19 P DB 01111100B DB 01100010B DB 01100010B DB 01111100B DB 01100000B DB 01100000B DB 00000000B DB 00000000B ; 1A Q DB 00111100B DB 01100010B DB 01100010B DB 01101010B DB 01100110B DB 00111110B DB 00000000B DB 00000000B ; 1B R DB 01111100B DB 01100010B DB 01100010B DB 01111100B DB 01100100B DB 01100010B DB 00000000B DB 00000000B ; 1C S DB 00111100B DB 01100010B DB 00111000B DB 00000100B DB 01100010B DB 00111100B DB 00000000B DB 00000000B ; 1D T DB 01111110B DB 00011000B DB 00011000B DB 00011000B DB 00011000B DB 00011000B DB 00000000B DB 00000000B ; 1E U DB 01100010B DB 01100010B DB 01100010B DB 01100010B DB 01100010B DB 00111100B DB 00000000B DB 00000000B ; 1F V DB 01100010B DB 01100010B DB 01100010B DB 01100010B DB 00110100B DB 00011000B DB 00000000B DB 00000000B ; 20 W DB 01100010B DB 01101010B DB 01101010B DB 01101010B DB 01101010B DB 00110100B DB 00000000B DB 00000000B ; 21 X DB 01110010B DB 00110100B DB 00111000B DB 00011100B DB 00101100B DB 01001110B DB 00000000B DB 00000000B ; 22 Y DB 01100010B DB 01100010B DB 00110100B DB 00011000B DB 00011000B DB 00011000B DB 00000000B DB 00000000B ; 23 Z DB 01111110B DB 00000100B DB 00111000B DB 00011100B DB 00100000B DB 01111110B DB 00000000B ENDIF DB 00000000B ; 24 left arrow DB 00010000B DB 00110000B DB 01111111B DB 11111111B DB 01111111B DB 00110000B DB 00010000B DB 00000000B ; 25 blank DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B ; 26 horizontal line? DB 00000000B DB 00000000B DB 11111111B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B ; 27 horizontal bar? DB 00000000B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 00000000B DB 00000000B ; 28 HP bar piece DB 00000000B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 00000000B DB 00000000B ; 29 HP bar piece DB 00000000B DB 01111111B DB 01111111B DB 01111111B DB 01111111B DB 01111111B DB 00000000B DB 00000000B ; 2A HP bar piece DB 00000000B DB 00111111B DB 00111111B DB 00111111B DB 00111111B DB 00111111B DB 00000000B DB 00000000B ; 2B HP bar piece DB 00000000B DB 00011111B DB 00011111B DB 00011111B DB 00011111B DB 00011111B DB 00000000B DB 00000000B ; 2C HP bar piece DB 00000000B DB 00001111B DB 00001111B DB 00001111B DB 00001111B DB 00001111B DB 00000000B DB 00000000B ; 2D HP bar piece DB 00000000B DB 00000111B DB 00000111B DB 00000111B DB 00000111B DB 00000111B DB 00000000B DB 00000000B ; 2E HP bar piece DB 00000000B DB 00000011B DB 00000011B DB 00000011B DB 00000011B DB 00000011B DB 00000000B DB 00000000B ; 2F HP bar piece DB 00000000B DB 00000001B DB 00000001B DB 00000001B DB 00000001B DB 00000001B DB 00000000B D5C40 ; copied to VRAM 0180 DB 00111100B ; 30 (0180) copyright symbol DB 01000010B DB 10011001B DB 10100001B DB 10011001B DB 01000010B DB 00111100B DB 00000000B DB 00000000B ; 31 blank DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B ; 32 egg 0.0 DB 00000000B DB 00000001B DB 00000011B DB 00000111B DB 00000111B DB 00001111B DB 00001111B DB 00111100B ; 33 egg 0.1 DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 00000000B ; 34 egg 0.2 DB 00000000B DB 10000000B DB 11000000B DB 11100000B DB 11100000B DB 11110000B DB 11110000B DB 00011111B ; 35 egg 1.0 DB 00011111B DB 00111111B DB 00111111B DB 00111111B DB 01111111B DB 01111111B DB 01111111B DB 11111000B ; 36 egg 1.2 DB 11111000B DB 11111100B DB 11111100B DB 11111100B DB 11111110B DB 11111110B DB 11111110B DB 00111111B ; 37 DB 00111111B DB 00011111B DB 00011111B DB 00001111B DB 00000111B DB 00000011B DB 00000000B DB 11111111B ; 38 DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111100B ; 39 DB 11111100B DB 11111000B DB 11111000B DB 11110000B DB 11100000B DB 11000000B DB 00000000B DB 01111111B ; 3A DB 11111110B DB 11111110B DB 11111110B DB 11111100B DB 11111100B DB 11111100B DB 11111100B DB 11111110B ; 3B DB 01111111B DB 01111111B DB 01111111B DB 00111111B DB 00111111B DB 00111111B DB 00111111B DB 11111000B ; 3C DB 11111000B DB 11111000B DB 11111000B DB 11111000B DB 11111000B DB 11111000B DB 11111000B DB 00011111B ; 3D DB 00011111B DB 00011111B DB 00011111B DB 00011111B DB 00011111B DB 00011111B DB 00011111B DB 11111000B ; 3E DB 11111100B DB 11111100B DB 11111100B DB 11111110B DB 01111111B DB 01111111B DB 01111111B DB 00011111B ; 3F DB 00111111B DB 00111111B DB 00111111B DB 01111111B DB 11111110B DB 11111110B DB 11111110B DB 11111111B ; 40 (0200) DB 11111111B DB 11111111B DB 11000011B DB 10000001B DB 10000001B DB 00000000B DB 00011000B DB 00011000B ; 41 DB 00111100B DB 00111100B DB 01111110B DB 01111110B DB 01111110B DB 00011000B DB 00011000B DB 00111100B ; 42 DB 00111100B DB 00011000B DB 01111110B DB 01111110B DB 00111100B DB 00000000B DB 11000011B DB 00111100B ; 43 DB 00111100B DB 01111110B DB 01111110B DB 01111110B DB 01111110B DB 01111110B DB 01111110B N5C40 EQU $-D5C40 ; (green egg chars only) DB 01111111B ; 44 DB 01111111B DB 01101111B DB 00110111B DB 00010111B DB 00010111B DB 00000111B DB 00000111B DB 11110111B ; 45 DB 11110011B DB 10110011B DB 01100011B DB 01000011B DB 01000011B DB 00000011B DB 00000011B DB 11000000B ; 46 DB 10000000B DB 10000000B DB 10000000B DB 10111000B DB 11111100B DB 10011100B DB 10011100B DB 00000000B ; 47 DB 00000000B DB 00000000B DB 00000000B DB 00111110B DB 01110011B DB 01100011B DB 11101110B DB 00000111B ; 48 DB 00000111B DB 00000111B DB 00000111B DB 00001111B DB 00011111B DB 00000000B DB 00000000B DB 00000011B ; 49 DB 00000011B DB 00000011B DB 00000011B DB 10000011B DB 11000111B DB 00000000B DB 00000000B DB 10011100B ; 4A DB 10011100B DB 10011100B DB 10011100B DB 10011100B DB 11111110B DB 00000000B DB 00000000B DB 11101100B ; 4B DB 11110000B DB 11100000B DB 11110010B DB 01111111B DB 00111110B DB 00000000B DB 00000000B DB 01111111B ; 4C DB 11111111B DB 11111111B DB 11111111B DB 01101111B DB 01110111B DB 00111011B DB 00011100B DB 11111111B ; 4D DB 11111111B DB 11000000B DB 10000000B DB 10000000B DB 10000000B DB 10000000B DB 10000000B DB 11110000B ; 4E DB 11111000B DB 11111100B DB 01111100B DB 01111100B DB 01111000B DB 01111000B DB 11110000B DB 01111111B ; 4F DB 11111111B DB 01111111B DB 00111111B DB 00011111B DB 00011111B DB 00011111B DB 00011111B DB 11100000B ; 50 (0280) DB 11110000B DB 11100000B DB 11000000B DB 10000000B DB 10000000B DB 10000000B DB 10000000B DB 00111111B ; 51 DB 01111111B DB 01111101B DB 01111001B DB 00111101B DB 00011111B DB 00001111B DB 00000111B DB 11111111B ; 52 DB 11111111B DB 10111111B DB 10111111B DB 10011111B DB 10011111B DB 10011110B DB 00011101B DB 11111000B ; 53 DB 11111100B DB 11111100B DB 00111100B DB 00111000B DB 01111000B DB 11110000B DB 11000000B DB 00000000B ; 54 DB 00000011B DB 00000111B DB 00001111B DB 00011110B DB 00011100B DB 00111101B DB 00111001B DB 11111111B ; 55 DB 11111111B DB 11000011B DB 00000001B DB 01110001B DB 11111011B DB 11111111B DB 11011111B DB 10000000B ; 56 DB 11100000B DB 11110000B DB 11110000B DB 11111000B DB 11111000B DB 11111000B DB 11111000B DB 01111111B ; 57 DB 11111111B DB 11111111B DB 11111111B DB 11101111B DB 01101111B DB 01110111B DB 00111001B DB 11000001B ; 58 DB 11100011B DB 11000011B DB 10000001B DB 00000001B DB 00000001B DB 00000011B DB 00000111B DB 11111000B ; 59 DB 11111100B DB 11111000B DB 11110000B DB 11110000B DB 11100000B DB 11000000B DB 10000000B DB 01111111B ; 5A DB 11111111B DB 11111111B DB 11111111B DB 01111111B DB 01111111B DB 00111111B DB 00011111B DB 11111111B ; 5B DB 11111111B DB 10000011B DB 00000001B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 11000000B ; 5C DB 11110001B DB 11111001B DB 11111001B DB 11111100B DB 11111100B DB 11111100B DB 11111100B DB 01111111B ; 5D DB 11111111B DB 11100111B DB 11011111B DB 11011111B DB 01111111B DB 00111111B DB 00111111B DB 11100000B ; 5E DB 11110001B DB 11000111B DB 10011111B DB 01111100B DB 01100000B DB 10000000B DB 10000000B DB 01111000B ; 5F DB 11111101B DB 11111101B DB 11111101B DB 01111100B DB 00111000B DB 00111000B DB 01110000B ;5DC0 DB 11100000B ; 60 (0300) DB 11110001B DB 11000111B DB 10011111B DB 01111100B DB 01100000B DB 00000000B DB 10000000B DB 01111000B DB 11111100B DB 11111100B DB 11111100B DB 01111000B DB 01111000B DB 01110000B DB 11100000B DB 00001111B DB 00010011B DB 00011100B DB 00011111B DB 00011111B DB 00011111B DB 00011111B DB 00011111B DB 00000000B DB 11000001B DB 11110001B DB 01111111B DB 10011111B DB 10001111B DB 10000111B DB 10000011B DB 11110000B DB 11100000B DB 11000000B DB 10000000B DB 11000000B DB 11000000B DB 11110000B DB 11110000B DB 00011111B DB 00011111B DB 00011111B DB 00011111B DB 00011111B DB 00011111B DB 00011111B DB 00011111B DB 10000000B DB 10000000B DB 10000000B DB 10000000B DB 10000000B DB 10000000B DB 10000000B DB 10000000B DB 00000111B DB 00001111B DB 00001111B DB 00001110B DB 00001110B DB 00011110B DB 00011100B DB 00011111B DB 00001011B ; 68 DB 00000111B DB 00001110B DB 00011101B DB 00111011B DB 01110111B DB 11100111B DB 11000111B DB 10000000B DB 01000000B DB 11000000B DB 11000000B DB 11000000B DB 11000000B DB 11000000B DB 11000000B DB 00111000B DB 01111000B DB 01111000B DB 01111000B DB 01110000B DB 11110000B DB 11110000B DB 11110000B DB 11001111B DB 00001111B DB 00000111B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 11110000B DB 11110000B DB 11100000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00011110B DB 00001111B DB 00010011B DB 00011100B DB 00011111B DB 00011111B DB 00011111B DB 00011111B DB 00001111B DB 11011110B DB 11111100B DB 11111100B DB 01111110B DB 00111111B DB 00111111B DB 00011111B DB 00001111B DB 00010111B DB 00011011B DB 00011101B DB 00011110B DB 00011111B DB 00011111B DB 00011111B DB 00000000B ; 70 (0380) DB 00000000B DB 10000000B DB 11100000B DB 11110001B DB 01111001B DB 01111001B DB 11111001B DB 11111100B DB 11111100B DB 11111100B DB 11111100B DB 11111100B DB 11111000B DB 11111000B DB 11111000B DB 00011111B DB 00011111B DB 00001111B DB 00001111B DB 00000111B DB 00000111B DB 00000011B DB 00000011B DB 11000000B DB 11000000B DB 11100000B DB 11100001B DB 11110011B DB 11110111B DB 11111111B DB 11111110B DB 01110000B DB 11100000B DB 11000000B DB 11000000B DB 10000000B DB 00000000B DB 00000000B DB 00000000B DB 10000001B DB 11000001B DB 11000011B DB 11100111B DB 11101110B DB 11111100B DB 11111000B DB 11111000B DB 11000000B DB 10000000B DB 10000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00011111B DB 00011111B DB 00011111B DB 00011111B DB 00011111B DB 00011111B DB 00011111B DB 00011111B DB 10000000B ; 78 DB 10000000B DB 10000000B DB 10000000B DB 10000000B DB 10000000B DB 10000000B DB 10000000B DB 11111000B DB 11111000B DB 11111100B DB 11111100B DB 11111100B DB 11111100B DB 11111100B DB 11111100B DB 10000000B DB 10000000B DB 10000001B DB 10000001B DB 10000001B DB 10000000B DB 10000000B DB 10000000B DB 00000000B DB 10000000B DB 11000000B DB 11100000B DB 11100000B DB 11100000B DB 11110000B DB 01110000B DB 00011100B DB 00111100B DB 00111100B DB 00111100B DB 00111100B DB 01111000B DB 01111000B DB 01111000B DB 00000111B DB 00000111B DB 00000011B DB 00000011B DB 00000011B DB 00000011B DB 00000011B DB 00000001B DB 11000000B DB 11000000B DB 11100000B DB 11100000B DB 11100000B DB 11100000B DB 11100000B DB 11110000B DB 11110000B DB 11110000B DB 11110000B DB 11111000B DB 11111000B DB 11111000B DB 11111100B DB 01111100B DB 00000000B ; 80 (0400) DB 00000000B DB 00000000B DB 00000000B DB 00001000B DB 00001100B DB 00011100B DB 00011100B DB 00011111B DB 00011111B DB 00001111B DB 00001111B DB 00001111B DB 00001111B DB 00001111B DB 00000111B DB 00000000B DB 00000000B DB 10000000B DB 10000000B DB 10000000B DB 11000000B DB 11000000B DB 11000000B DB 00000011B DB 00000011B DB 00000011B DB 00000011B DB 00000111B DB 00000111B DB 00000111B DB 00000111B DB 11110000B DB 11110000B DB 11100000B DB 11000000B DB 11000000B DB 10000000B DB 10000000B DB 10000000B DB 00000001B DB 00000001B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 11111110B DB 11111100B DB 11111100B DB 11111100B DB 11111100B DB 01111100B DB 01111100B DB 01111100B DB 00000001B DB 00000011B DB 00000111B DB 00001110B DB 00011100B DB 00111000B DB 01111000B DB 11110000B DB 11111000B ; 88 DB 11111100B DB 11111100B DB 11111110B DB 01111110B DB 01111111B DB 00111111B DB 00111111B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 10000000B DB 00011111B DB 00011111B DB 00011111B DB 00011111B DB 00111111B DB 11111111B DB 11111111B DB 01111111B DB 10000000B DB 10000000B DB 10000001B DB 11000111B DB 11111111B DB 11111111B DB 11111111B DB 00001111B DB 11111100B DB 11111100B DB 11111100B DB 11111100B DB 11111000B DB 11111000B DB 11110000B DB 11000000B DB 00011111B DB 00011111B DB 00111111B DB 01111110B DB 11111000B DB 11110011B DB 01111111B DB 00111110B DB 11000000B DB 11100000B DB 10000111B DB 00011111B DB 11111111B DB 11111111B DB 11111111B DB 00011111B DB 00111000B DB 00111000B DB 11111000B DB 11111000B DB 11111100B DB 11111100B DB 11111000B DB 11100000B DB 01111010B ; 90 (0480) DB 11111110B DB 11111110B DB 11111110B DB 11111110B DB 11111100B DB 01111100B DB 01111000B DB 00000001B DB 00000001B DB 00000001B DB 00000001B DB 00000011B DB 00000111B DB 00000111B DB 00000011B DB 11110000B DB 11110000B DB 11110000B DB 11110000B DB 11111000B DB 11111110B DB 11111110B DB 11111100B DB 01111110B DB 01111111B DB 00111111B DB 00111111B DB 00011111B DB 00011111B DB 00000111B DB 00000001B DB 00000000B DB 10000011B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 01111100B DB 11111100B DB 11111100B DB 11111100B DB 11111000B DB 11111000B DB 11110000B DB 11000000B DB 00011111B DB 00011111B DB 00011111B DB 00011111B DB 00111111B DB 11111111B DB 11111111B DB 01111011B DB 00000111B DB 00000111B DB 00000111B DB 00000011B DB 10000011B DB 11100011B DB 11100011B DB 11000000B DB 11000000B ; 98 DB 11100000B DB 11100000B DB 11100000B DB 11110000B DB 11111100B DB 11111100B DB 11111000B DB 00000111B DB 00000111B DB 00001111B DB 00001111B DB 10001111B DB 11101111B DB 11101111B DB 11000111B DB 00000000B DB 00111000B DB 11111100B DB 11111100B DB 11111100B DB 11111100B DB 11111100B DB 11101000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000011B DB 00000011B DB 00000001B DB 01111100B DB 01111100B DB 01111100B DB 01111100B DB 11111110B DB 11111111B DB 11111111B DB 11101111B DB 00000000B DB 00000001B DB 00000001B DB 00000001B DB 00000001B DB 10000001B DB 10000001B DB 00000000B DB 11100000B DB 11100000B DB 11000000B DB 11000000B DB 11110000B DB 11111110B DB 11111111B DB 11111000B DB 00011111B DB 00011111B DB 00001111B DB 00001111B DB 00000111B DB 00001111B DB 00011111B DB 00001110B DB 10000000B ; A0 (0500) DB 11000000B DB 11000000B DB 11100000B DB 11110000B DB 11111000B DB 11111100B DB 01111000B DB 00000000B ; A1 tm DB 00000000B DB 11100000B DB 01001010B DB 01010101B DB 01010101B DB 01010101B DB 01010101B D5FD0 ; 3D maze drawing tiles? - copied to VRAM 0180 DB 00010000B ; 30 (0180) up arrow DB 00111000B DB 01111100B DB 11111110B DB 00111000B DB 00111000B DB 00111000B DB 00111000B DB 11111111B ; 31 DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111110B ; 32 DB 11111110B DB 11111110B DB 11111110B DB 11111110B DB 11111110B DB 11111110B DB 11111110B DB 01111111B ; 33 DB 01111111B DB 01111111B DB 01111111B DB 01111111B DB 01111111B DB 01111111B DB 01111111B DB 11111111B ; 34 DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 00000000B ; 35 DB 10000000B DB 11000000B DB 11100000B DB 11110000B DB 11111000B DB 11111100B DB 11111110B DB 00000000B ; 36 DB 00000001B DB 00000011B DB 00000111B DB 00001111B DB 00011111B DB 00111111B DB 01111111B DB 11111110B ; 37 DB 11111100B DB 11111000B DB 11110000B DB 11100000B DB 11000000B DB 10000000B DB 00000000B DB 01111111B ; 38 DB 00111111B DB 00011111B DB 00001111B DB 00000111B DB 00000011B DB 00000001B DB 00000000B DB 11111110B ; 39 DB 11111110B DB 11111110B DB 11111110B DB 11111110B DB 11111110B DB 11111110B DB 11111110B DB 01111111B ; 3A DB 01111111B DB 01111111B DB 01111111B DB 01111111B DB 01111111B DB 01111111B DB 01111111B DB 11111111B ; 3B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 00000000B ; 3C DB 10000000B DB 11000000B DB 11100000B DB 11110000B DB 11111000B DB 11111100B DB 11111110B DB 00000000B ; 3D DB 00000001B DB 00000011B DB 00000111B DB 00001111B DB 00011111B DB 00111111B DB 01111111B DB 11111110B ; 3E DB 11111100B DB 11111000B DB 11110000B DB 11100000B DB 11000000B DB 10000000B DB 00000000B DB 01111111B ; 3F DB 00111111B DB 00011111B DB 00001111B DB 00000111B DB 00000011B DB 00000001B DB 00000000B DB 11111110B ; 40 DB 11111110B DB 11111110B DB 11111110B DB 11111110B DB 11111110B DB 11111110B DB 11111110B DB 01111111B ; 41 DB 01111111B DB 01111111B DB 01111111B DB 01111111B DB 01111111B DB 01111111B DB 01111111B DB 11111111B ; 42 DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 00000000B ; 43 DB 10000000B DB 11000000B DB 11100000B DB 11110000B DB 11111000B DB 11111100B DB 11111110B DB 00000000B ; 44 DB 00000001B DB 00000011B DB 00000111B DB 00001111B DB 00011111B DB 00111111B DB 01111111B DB 11111110B ; 45 DB 11111100B DB 11111000B DB 11110000B DB 11100000B DB 11000000B DB 10000000B DB 00000000B DB 01111111B ; 46 DB 00111111B DB 00011111B DB 00001111B DB 00000111B DB 00000011B DB 00000001B DB 00000000B DB 11111110B ; 47 DB 11111110B DB 11111110B DB 11111110B DB 11111110B DB 11111110B DB 11111110B DB 11111110B DB 01111111B ; 48 DB 01111111B DB 01111111B DB 01111111B DB 01111111B DB 01111111B DB 01111111B DB 01111111B DB 11111111B ; 49 doorknob? DB 10000111B DB 00000011B DB 00000011B DB 00000011B DB 00000011B DB 10000111B DB 10000111B DB 11111111B ; 4A doorknob DB 11111111B DB 11111111B DB 11111111B DB 11110011B DB 11110011B DB 11110011B DB 11111111B DB 11111111B ; 4B doorknob DB 11111111B DB 11111111B DB 11111111B DB 11110011B DB 11110011B DB 11110011B DB 11111111B DB 11111111B ; 4C doorknob DB 11111111B DB 11111111B DB 11111111B DB 11110011B DB 11110011B DB 11110011B DB 11111111B DB 00000000B ; 4D DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 10000000B ; 4E DB 01000000B DB 00100000B DB 00010000B DB 00001000B DB 00000100B DB 00000010B DB 00000001B DB 11111111B ; 4F DB 01000000B DB 00100000B DB 00010000B DB 00001000B DB 00000100B DB 00000010B DB 00000001B DB 10000000B ; 50 DB 01000000B DB 00100000B DB 00010000B DB 00001000B DB 00000100B DB 00000010B DB 11111111B DB 00000001B ; 51 DB 00000010B DB 00000100B DB 00001000B DB 00010000B DB 00100000B DB 01000000B DB 10000000B DB 11111111B ; 52 DB 00000010B DB 00000100B DB 00001000B DB 00010000B DB 00100000B DB 01000000B DB 10000000B DB 00000001B ; 53 DB 00000010B DB 00000100B DB 00001000B DB 00010000B DB 00100000B DB 01000000B DB 11111111B DB 00000000B ; 54 DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 11111111B DB 11111111B ; 55 DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B ; 56 DB 01111100B DB 00101000B DB 01101110B DB 01011010B DB 01011010B DB 01111110B DB 00100100B DB 00000000B ; 57 DB 01111100B DB 00101000B DB 01101110B DB 01011010B DB 01011010B DB 01111110B DB 00100100B DB 00000000B ; 58 DB 01111100B DB 00101000B DB 01101110B DB 01011010B DB 01011010B DB 01111110B DB 00100100B DB 00000000B ; 59 DB 01111100B DB 00101000B DB 01101110B DB 01011010B DB 01011010B DB 01111110B DB 00100100B DB 00000000B ; 5A DB 01111100B DB 00101000B DB 01101110B DB 01011010B DB 01011010B DB 01111110B DB 00100100B DB 00011000B ; 5B DB 00011000B DB 10000001B DB 10000001B DB 01111110B DB 01111110B DB 01111110B DB 11111111B DB 00011000B ; 5C DB 00011000B DB 10000001B DB 10000001B DB 01111110B DB 01111110B DB 01111110B DB 11111111B DB 00011000B ; 5D DB 00011000B DB 10000001B DB 10000001B DB 01111110B DB 01111110B DB 01111110B DB 11111111B DB 00011000B ; 5E DB 00011000B DB 10000001B DB 10000001B DB 01111110B DB 01111110B DB 01111110B DB 11111111B DB 00011000B ; 5F DB 00011000B DB 10000001B DB 10000001B DB 01111110B DB 01111110B DB 01111110B DB 11111111B DB 00011000B ; 60 DB 00011000B DB 00011001B DB 00001001B DB 00001111B DB 00000110B DB 00000000B DB 00000000B DB 00000001B ; 61 DB 00000011B DB 00000011B DB 00000001B DB 00000000B DB 00000001B DB 00000000B DB 00000000B DB 11000000B ; 62 DB 11000000B DB 00000110B DB 10000110B DB 11000110B DB 11000110B DB 00000110B DB 00000111B DB 00000000B ; 63 DB 00000000B DB 11000000B DB 11000000B DB 01100000B DB 01100000B DB 11000000B DB 11000000B DB 00000000B ; 64 DB 00000000B DB 00000001B DB 00000011B DB 00000110B DB 00001100B DB 00011000B DB 00011000B DB 00000011B ; 65 DB 00000011B DB 01100000B DB 01100001B DB 01100011B DB 01100011B DB 01100000B DB 11100000B DB 10000000B ; 66 DB 11000000B DB 11000000B DB 10000000B DB 00000000B DB 10000000B DB 00000000B DB 00000000B DB 00000000B ; 67 DB 00000000B DB 10000000B DB 11000000B DB 01100000B DB 11100000B DB 11000000B DB 00000000B DB 00000000B ; 68 S shield DB 10000000B DB 11000000B DB 01110000B DB 11011000B DB 10001000B DB 11011000B DB 01110000B DB 00000000B ; 69 DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B ; 6A M shield DB 00000000B DB 10000000B DB 01110000B DB 11011000B DB 10001000B DB 11011000B DB 11011000B DB 11011000B ; 6B DB 11011000B DB 01110000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B ; 6C L shield DB 00000000B DB 10000000B DB 01110000B DB 11011000B DB 11011000B DB 10001000B DB 11011000B DB 11011000B ; 6D DB 11011000B DB 11011000B DB 11011000B DB 11011000B DB 11011000B DB 11111000B DB 01110000B DB 01110000B ; 6E S shield DB 11011000B DB 10001000B DB 11011000B DB 01110000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B ; 6F DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 01110000B ; 70 M shield DB 11011000B DB 10001000B DB 11011000B DB 11011000B DB 11011000B DB 11011000B DB 01110000B DB 00000000B ; 71 DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 01110000B ; 72 L shield DB 11011000B DB 11011000B DB 10001000B DB 11011000B DB 11011000B DB 11011000B DB 11011000B DB 11011000B ; 73 DB 11011000B DB 11011000B DB 11011000B DB 01110000B DB 00000000B DB 00000000B DB 00000000B DB 00011000B ; 74 - leather DB 00011000B DB 10000001B DB 10000001B DB 01011110B DB 01111010B DB 01101110B DB 11111110B DB 00011000B ; 75 - huberk [sic] DB 10000001B DB 10000001B DB 01111110B DB 01111110B DB 01111110B DB 10000001B DB 11000011B DB 00011000B ; 76 - half plate DB 00111100B DB 11100111B DB 11100111B DB 11000011B DB 11100111B DB 11100111B DB 01010101B DB 00011000B ; 77 - full plate DB 00111100B DB 11100111B DB 11100111B DB 11000011B DB 11100111B DB 11100111B DB 01010101B DB 00011000B ; 78 - tabard DB 00111100B DB 00011000B DB 01111110B DB 01111110B DB 00011000B DB 01011010B DB 01011010B DB 00000001B ; 79 DB 00000011B DB 00000011B DB 00000001B DB 00000000B DB 00000001B DB 00000000B DB 00000000B DB 11111110B ; 7A DB 10000110B DB 00000110B DB 10000110B DB 11000110B DB 11000110B DB 00000110B DB 00000111B DB 00000011B ; 7B DB 00000100B DB 00000101B DB 00000010B DB 00000001B DB 00000011B DB 00000000B DB 00000000B DB 10101010B ; 7C DB 10000101B DB 00000101B DB 10000101B DB 11000101B DB 11000101B DB 00000111B DB 00000111B DB 00000001B ; 7D DB 00000011B DB 00000011B DB 00000001B DB 00000000B DB 00000011B DB 00000000B DB 00000000B DB 00011000B ; 7E DB 00110000B DB 11100000B DB 00011000B DB 00011111B DB 11001111B DB 00000000B DB 00000111B DB 01111111B ; 7F DB 01100000B DB 01100000B DB 01100001B DB 01100011B DB 01100011B DB 01100000B DB 11100000B DB 10000000B ; 80 (0400) DB 11000000B DB 11000000B DB 10000000B DB 00000000B DB 10000000B DB 00000000B DB 00000000B DB 10101010B ; 81 DB 10100001B DB 10100000B DB 10100001B DB 10100011B DB 10100011B DB 11100000B DB 11100000B DB 11000000B ; 82 DB 00100000B DB 10100000B DB 01000000B DB 10000000B DB 11000000B DB 00000000B DB 00000000B DB 00011000B ; 83 DB 00001100B DB 00000111B DB 00011000B DB 11111000B DB 11110011B DB 00000000B DB 11100000B DB 10000000B ; 84 DB 11000000B DB 11000000B DB 10000000B DB 00000000B DB 11000000B DB 00000000B DB 00000000B DB 00000000B ; 85 - knife DB 00000000B DB 00010000B DB 00010000B DB 00011000B DB 00011000B DB 00011000B DB 00111100B DB 00011000B ; 86 DB 00011000B DB 00011001B DB 00001001B DB 00001111B DB 00000110B DB 00000000B DB 00000000B DB 00011000B ; 87 - club DB 00111100B DB 00111100B DB 00111100B DB 00111100B DB 00111100B DB 00111100B DB 00011000B DB 00011000B ; 88 DB 00011000B DB 00011001B DB 00001001B DB 00001111B DB 00000110B DB 00000000B DB 00000000B DB 00000000B ; 89 - mace DB 01011010B DB 00111100B DB 01111110B DB 01111110B DB 00111100B DB 01011010B DB 00011000B DB 00011000B ; 8A DB 00011000B DB 00011001B DB 00001001B DB 00001111B DB 00000110B DB 00000000B DB 00000000B DB 00010000B ; 8B - short sword DB 00010000B DB 00011000B DB 00011000B DB 00011000B DB 00011000B DB 00011000B DB 00011000B DB 00111100B ; 8C DB 00011000B DB 00011001B DB 00001001B DB 00001111B DB 00000110B DB 00000000B DB 00000000B DB 00000010B ; 8D - axe DB 00000111B DB 00001011B DB 00010111B DB 00011110B DB 00000110B DB 00001100B DB 00011000B N5AC0 EQU $-D5AC0 DB 00011000B ; 8E (0470) DB 00011000B DB 00011001B DB 00001001B DB 00001111B DB 00000110B DB 00000000B DB 00000000B DB 00000000B ; 8F - spear DB 00000000B DB 00000000B DB 00000000B DB 01100000B DB 01110000B DB 00111000B DB 00011100B DB 00001100B ; 90 (0480) DB 00000111B DB 00001111B DB 00001111B DB 00000111B DB 00000110B DB 00000000B DB 00000000B DB 00000100B ; 91 - broad sword DB 00001110B DB 00001110B DB 00001110B DB 00001110B DB 00001110B DB 00001110B DB 00001110B DB 00001110B ; 92 DB 00001110B DB 00001110B DB 00011111B DB 00001111B DB 00001110B DB 00000000B DB 00000000B DB 00000000B ; 93 - claymore DB 00000000B DB 00001100B DB 00001100B DB 00001100B DB 00000110B DB 00000110B DB 00000111B DB 00000011B ; 94 DB 00000011B DB 00000001B DB 00000001B DB 00000110B DB 00000110B DB 00000000B DB 00000000B DB 00100000B ; 95 - battle axe DB 01110000B DB 01011000B DB 01101100B DB 01110110B DB 01111011B DB 00111110B DB 00111100B DB 00001100B ; 96 DB 00000111B DB 00001101B DB 00001101B DB 00000111B DB 00000110B DB 00000000B DB 00000000B DB 00000000B ; 97 left arm DB 00000000B DB 10000000B DB 11000000B DB 01100000B DB 11100000B DB 11000000B DB 01100000B DB 00000000B ; 98 DB 00000000B DB 10000000B DB 10000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B ; 99 left arm variant? DB 00000000B DB 10000000B DB 11000000B DB 01100000B DB 11100000B DB 11000000B DB 01100000B DB 00000000B ; 9A - knife down DB 00000000B DB 00000001B DB 00000011B DB 00000110B DB 00001100B DB 00011000B DB 00011000B DB 00111100B ; 9B DB 00011000B DB 00011000B DB 00011000B DB 00001000B DB 00001000B DB 00000000B DB 00000000B DB 00000000B ; 9C - club down DB 00000000B DB 00000001B DB 00000011B DB 00000110B DB 00001100B DB 00011000B DB 00011000B DB 00011000B ; 9D DB 00111100B DB 00111100B DB 00111100B DB 00111100B DB 00111100B DB 00111100B DB 00011000B DB 00000000B ; 9E - mace down DB 00000000B DB 00000001B DB 00000011B DB 00000110B DB 00001100B DB 00011000B DB 00011000B DB 00011000B ; 9F DB 01011010B DB 00111100B DB 01111110B DB 01111110B DB 00111100B DB 01011010B DB 00000000B DB 00000000B ; A0 (0500) - short sword down DB 00000000B DB 00000001B DB 00000011B DB 00000110B DB 00001100B DB 00011000B DB 00111100B DB 00011000B ; A1 DB 00011000B DB 00011000B DB 00011000B DB 00011000B DB 00011000B DB 00001000B DB 00001000B DB 00110000B ; A2 - axe chopping DB 00101000B DB 00101100B DB 00101100B DB 00111100B DB 00011000B DB 00011000B DB 00011000B DB 00011000B ; A3 DB 00011000B DB 00011001B DB 00011001B DB 00001111B DB 00000110B DB 00000000B DB 00000000B DB 00000000B ; A4 - spear stabbing DB 00000000B DB 00000000B DB 00000000B DB 11000000B DB 11100000B DB 01110000B DB 00111000B DB 00011100B ; A5 DB 00001111B DB 00011001B DB 00011111B DB 00000110B DB 00000000B DB 00000000B DB 00000000B DB 00000000B ; A6 - broad sword attack DB 00000000B DB 00000100B DB 00001110B DB 00001110B DB 00001110B DB 00001110B DB 00001110B DB 00001110B ; A7 DB 00001110B DB 00001110B DB 00001110B DB 00011111B DB 00001111B DB 00001110B DB 00000000B DB 00000000B ; A8 - claymore attack DB 00000000B DB 00110000B DB 00110000B DB 00011000B DB 00011000B DB 00001100B DB 00001100B DB 00000110B ; A9 DB 00000110B DB 00000011B DB 00000011B DB 00000001B DB 00000001B DB 00000000B DB 00000000B DB 01000000B ; AA - battle axe attack DB 11100000B DB 10110000B DB 11011000B DB 11101100B DB 11110110B DB 01111100B DB 00111000B DB 00011100B ; AB DB 00001111B DB 00011001B DB 00011111B DB 00000110B DB 00000000B DB 00000000B DB 00000000B DB 00000000B ; AC - left arm attack DB 00000000B DB 10000000B DB 10000000B DB 11000000B DB 11000000B DB 10000000B DB 11000000B DB 00000000B ; AD DB 00000000B DB 11000000B DB 11000000B DB 10000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B ; AE - left arm attack variant? DB 00000000B DB 10000000B DB 10000000B DB 11000000B DB 11000000B DB 10000000B DB 11000000B DB 01111110B ; AF DB 11111111B DB 11111111B DB 11000011B DB 01011010B DB 01011010B DB 01111110B DB 00100100B DB 00000000B ; B0 (0580) DB 01111110B DB 11111111B DB 11011011B DB 11000011B DB 11011011B DB 01111110B DB 01111110B DB 00111100B ; B1 DB 01111110B DB 11111111B DB 10111101B DB 01000010B DB 01100110B DB 01111110B DB 00111100B DB 00000000B ; B2 (0590) DB 11110000B DB 11000000B DB 10000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 10000000B ; B3 DB 10000000B DB 11000000B DB 11000000B DB 10000000B DB 10000000B DB 00000000B DB 00000000B DB 00000000B ; B4 (05A0) DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 11111111B DB 00000000B DB 00000000B N5FD0 EQU $-D5FD0 D63F8 ; hiragana/katakana to VRAM 0180 DB 00001000B ; 30 (0180) right arrow DB 00001100B DB 11111110B DB 11111111B DB 11111110B DB 00001100B DB 00001000B DB 00000000B DB 00110000B ; 31 a DB 11111110B DB 00110100B DB 01111100B DB 10110110B DB 10111010B DB 01110100B DB 00000000B DB 00000000B ; 32 i DB 10001100B DB 10000110B DB 10000110B DB 11100110B DB 11001100B DB 00000000B DB 00000000B DB 00011000B ; 33 u DB 00000000B DB 01111100B DB 11000110B DB 00000110B DB 00001100B DB 00111000B DB 00000000B DB 00110000B ; 34 e DB 00000000B DB 11111100B DB 00001100B DB 00011000B DB 01111000B DB 11001110B DB 00000000B DB 00110010B ; 35 o DB 11111110B DB 00110000B DB 01111100B DB 10110010B DB 10110010B DB 01110100B DB 00000000B DB 01100100B ; 36 ka DB 11111010B DB 01101100B DB 01101100B DB 01101100B DB 01101100B DB 11011000B DB 00000000B DB 00110000B ; 37 ki DB 11111110B DB 00011000B DB 11111110B DB 00001100B DB 11000000B DB 01111000B DB 00000000B DB 00001110B ; 38 ku DB 00011100B DB 01110000B DB 11100000B DB 01110000B DB 00011100B DB 00001110B DB 00000000B DB 00001100B ; 39 ke DB 10011110B DB 10001100B DB 10001100B DB 11001100B DB 10001100B DB 00011000B DB 00000000B DB 01111100B ; 3A ko DB 11000110B DB 00000000B DB 00000000B DB 00000000B DB 11000110B DB 01111100B DB 00000000B DB 00011000B ; 3B sa DB 00011000B DB 01111110B DB 00001100B DB 10000110B DB 11000000B DB 01111100B DB 00000000B DB 11000000B ; 3C shi DB 11000000B DB 11000000B DB 11000000B DB 11000000B DB 11100110B DB 01111100B DB 00000000B DB 00001100B ; 3D su DB 11111110B DB 00111100B DB 01001100B DB 00111100B DB 00001100B DB 00111000B DB 00000000B DB 01101100B ; 3E se DB 11111110B DB 01101100B DB 01101100B DB 01100000B DB 01100000B DB 00111100B DB 00000000B DB 01111100B ; 3F so DB 00011000B DB 11111110B DB 00111000B DB 01100000B DB 01100000B DB 00111100B DB 00000000B DB 01100000B ; 40 ta (0200) DB 11111110B DB 01100000B DB 01101110B DB 11000000B DB 11000000B DB 11001110B DB 00000000B DB 00110000B ; 41 chi DB 11111110B DB 01100000B DB 01111100B DB 00000110B DB 00000110B DB 01111100B DB 00000000B DB 00000000B ; 42 tsu DB 11111100B DB 11111110B DB 00000110B DB 00000110B DB 00011100B DB 00000000B DB 00000000B DB 11111110B ; 43 te DB 00011100B DB 00111000B DB 01110000B DB 01100000B DB 01100000B DB 00111100B DB 00000000B DB 00100000B ; 44 to DB 01100110B DB 00111100B DB 00110000B DB 01100000B DB 01100000B DB 00111110B DB 00000000B DB 01100000B ; 45 na DB 11111110B DB 01100110B DB 01100100B DB 11011100B DB 11010110B DB 11011100B DB 00000000B DB 00000000B ; 46 ni DB 11011110B DB 11000000B DB 11000000B DB 11000000B DB 11100000B DB 11011110B DB 00000000B DB 10001000B ; 47 nu DB 11111100B DB 01010110B DB 11010010B DB 10101110B DB 10101010B DB 01000100B DB 00000000B DB 01100000B ; 48 ne DB 11110000B DB 01111100B DB 01100110B DB 11101110B DB 01110100B DB 01101010B DB 00000000B DB 01111100B ; 49 no DB 11010110B DB 10010010B DB 10010010B DB 10010010B DB 10100010B DB 01000100B DB 00000000B DB 00001100B ; 4A ha DB 10111110B DB 10001100B DB 10011100B DB 11101110B DB 10101100B DB 00011000B DB 00000000B DB 00100100B ; 4B hi DB 11100110B DB 00100100B DB 01000100B DB 01000100B DB 01001100B DB 00111000B DB 00000000B DB 00110000B ; 4C fu DB 00011000B DB 00110000B DB 10011010B DB 10011010B DB 00011000B DB 00110000B DB 00000000B DB 00000000B ; 4D he DB 00110000B DB 01111000B DB 11001100B DB 10000110B DB 00000010B DB 00000000B DB 00000000B DB 10111110B ; 4E ho DB 10001100B DB 10111110B DB 10001100B DB 11011100B DB 10101110B DB 00011000B DB 00000000B DB 00011000B ; 4F ma DB 01111100B DB 00011000B DB 01111100B DB 00111000B DB 01011100B DB 00110000B DB 00000000B DB 00000000B ; 50 mi (0280) DB 01110000B DB 00110110B DB 00110110B DB 01111111B DB 10110110B DB 01101100B DB 00000000B DB 00000000B ; 51 mu DB 00110100B DB 11111010B DB 01110000B DB 10110010B DB 01110010B DB 00111100B DB 00000000B DB 01000100B ; 52 me DB 01111100B DB 11100110B DB 10110110B DB 10011010B DB 10010010B DB 01100100B DB 00000000B DB 01100000B ; 53 mo DB 11111000B DB 01100000B DB 11111000B DB 01100000B DB 01100100B DB 00111000B DB 00000000B DB 01101000B ; 54 ya DB 11111100B DB 01101010B DB 01100010B DB 00110100B DB 00110000B DB 00110000B DB 00000000B DB 00010000B ; 55 yu DB 10111100B DB 11110110B DB 11010110B DB 11010110B DB 10010110B DB 10101100B DB 00000000B DB 00110000B ; 56 yo DB 00111100B DB 00110000B DB 00110000B DB 01111100B DB 10110000B DB 01100000B DB 00000000B DB 00011000B ; 57 ra DB 01101100B DB 01100000B DB 11111100B DB 11000110B DB 00000110B DB 00011100B DB 00000000B DB 01000110B ; 58 ri DB 01000110B DB 01000110B DB 01000110B DB 00000110B DB 00001100B DB 00011000B DB 00000000B DB 01111110B ; 59 ru DB 00001100B DB 00111100B DB 00000110B DB 00110010B DB 01001110B DB 00111100B DB 00000000B DB 01100000B ; 5A re DB 11110100B DB 01101100B DB 01111100B DB 01110100B DB 11100100B DB 01100010B DB 00000000B DB 11111100B ; 5B ro DB 00011000B DB 01111000B DB 00001100B DB 00001100B DB 00001100B DB 01111000B DB 00000000B DB 01100000B ; 5C wa DB 11110000B DB 01111100B DB 01100110B DB 11100110B DB 01100110B DB 01101100B DB 00000000B DB 01100000B ; 5D wo DB 11111000B DB 01101110B DB 00110000B DB 01111000B DB 01100000B DB 00111110B DB 00000000B DB 01100000B ; 5E n DB 01100000B DB 01100000B DB 11111000B DB 11001100B DB 11001100B DB 11000110B DB 00000000B DB 00000000B ; 5F small tsu DB 00000000B DB 00000000B DB 11110000B DB 00001000B DB 00001000B DB 00110000B DB 00000000B DB 00000000B ; 60 small ya (0300) DB 01001000B DB 11110000B DB 01001000B DB 01010000B DB 01000000B DB 00100000B DB 00000000B DB 00000000B ; 61 small yu DB 00100000B DB 10110000B DB 11101000B DB 10101000B DB 00101000B DB 01010000B DB 00000000B DB 00000000B ; 62 small yo DB 00100000B DB 00111000B DB 00100000B DB 01110000B DB 10101000B DB 01100000B DB 00000000B DB 01100000B ; 63 RE DB 01100000B DB 01100000B DB 01100000B DB 01100010B DB 01111100B DB 01110000B DB 00000000B DB 00000000B ; 64 HE DB 00110000B DB 01111000B DB 11001100B DB 10000110B DB 00000010B DB 00000000B DB 00000000B DB 01101100B ; 65 RU DB 01101100B DB 01101100B DB 01101100B DB 01101100B DB 01001110B DB 10001100B DB 00000000B DB 00000110B ; 66 ME DB 01100110B DB 00111100B DB 00011100B DB 00011100B DB 00110110B DB 11000000B DB 00000000B DB 01100000B ; 67 SE DB 11111110B DB 01100100B DB 01100000B DB 01100000B DB 01100000B DB 00111110B DB 00000000B DB 11000010B ; 68 SHI DB 00000010B DB 11000110B DB 00001100B DB 00011100B DB 11111000B DB 11100000B DB 00000000B DB 01100000B ; 69 KE DB 01111110B DB 11011000B DB 00011000B DB 00011000B DB 00011000B DB 00110000B DB 00000000B DB 00011000B ; 6A MU DB 00011000B DB 00110000B DB 00110100B DB 01100110B DB 01111110B DB 11100010B DB 00000000B DB 01111110B ; 6B TA DB 01100110B DB 01110110B DB 11011110B DB 00001100B DB 00001100B DB 00011000B DB 00000000B DB 00110000B ; 6C KA DB 11111110B DB 00110110B DB 00110110B DB 00110110B DB 00110110B DB 01101100B DB 00000000B DB 11111110B ; 6D MA DB 00000110B DB 00000110B DB 01101100B DB 00111100B DB 00011000B DB 00001100B DB 00000000B DB 01000010B ; 6E N DB 11100010B DB 01000110B DB 00000100B DB 00001100B DB 11111000B DB 11110000B DB 00000000B DB 01100000B ; 6F TO DB 01100000B DB 01111000B DB 01101100B DB 01100100B DB 01100000B DB 01100000B DB 00000000B DB 00000000B ; 70 small TSU (0380) DB 00000000B DB 00000000B DB 10101100B DB 10101100B DB 00011100B DB 01111000B DB 00000000B DB 10100000B ; 71 " (dakuten) DB 10100000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B ; 72 o (kana period / p->b mark) DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 01000000B DB 10100000B DB 01000000B IF FONT2 HEX 08 1C 1C 18 10 00 30 00 ; ! HEX 00 00 00 3F 7E 00 00 00 ; - HEX 0C 18 30 30 30 18 0C 00 ; ( HEX 18 0C 06 06 06 0C 18 00 ; ) HEX 08 6B 3E 1C 3E 6B 08 00 ; * HEX 00 00 00 00 00 18 18 00 ; . HEX 00 00 18 18 00 18 18 00 ; : HEX 06 0C 18 30 18 0C 06 00 ; < HEX 30 18 0C 06 0C 18 30 00 ; > HEX 3C 66 06 0C 18 00 18 00 ; ? HEX 1E 18 18 18 18 18 1E 00 ; [ HEX 3C 0C 0C 0C 0C 0C 3C 00 ; ] HEX 00 00 3E 00 3E 00 00 00 ; = HEX 36 36 7F 36 7F 36 36 00 ; # HEX 18 18 30 00 00 00 00 00 ; ' ELSE DB 00001100B ; 73 ! DB 00011100B DB 00011100B DB 00011000B DB 00000000B DB 00110000B DB 00110000B DB 00000000B DB 00000000B ; 74 - DB 00000000B DB 00000000B DB 01111110B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00011000B ; 75 ( DB 00110000B DB 00100000B DB 00100000B DB 00100000B DB 00110000B DB 00011000B DB 00000000B DB 00011000B ; 76 ) DB 00001100B DB 00000100B DB 00000100B DB 00000100B DB 00001100B DB 00011000B DB 00000000B DB 10010010B ; 77 * DB 11010110B DB 01111100B DB 00111000B DB 01111100B DB 11010110B DB 10010010B DB 00000000B DB 00000000B ; 78 . DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00011000B DB 00011000B DB 00000000B DB 00000000B ; 79 : DB 00011000B DB 00011000B DB 00000000B DB 00000000B DB 00011000B DB 00011000B DB 00000000B DB 00001100B ; 7A < DB 00011000B DB 00110000B DB 01100000B DB 00110000B DB 00011000B DB 00001100B DB 00000000B DB 00110000B ; 7B > DB 00011000B DB 00001100B DB 00000110B DB 00001100B DB 00011000B DB 00110000B DB 00000000B DB 00111100B ; 7C ? DB 01100110B DB 01100110B DB 00001100B DB 00011000B DB 00000000B DB 00011000B DB 00000000B DB 00111000B ; 7D [ DB 00111000B DB 00100000B DB 00100000B DB 00100000B DB 00111000B DB 00111000B DB 00000000B DB 00011100B ; 7E ] DB 00011100B DB 00000100B DB 00000100B DB 00000100B DB 00011100B DB 00011100B DB 00000000B DB 00000000B ; 7F = DB 00000000B DB 01111110B DB 00000000B DB 01111110B DB 00000000B DB 00000000B DB 00000000B DB 01001100B ; 80 # (0400) DB 11111110B DB 01001100B DB 01001100B DB 01001100B DB 11111110B DB 01001100B DB 00000000B DB 00011000B ; 81 ' (apostrophe) DB 00011000B DB 00001000B DB 00010000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B ENDIF DB 11111111B ; 82 DB 00000010B DB 00000100B DB 00001000B DB 00010000B DB 00100000B DB 01000000B DB 10000000B DB 11111111B ; 83 DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 11111111B ; 84 DB 01000000B DB 00100000B DB 00010000B DB 00001000B DB 00000100B DB 00000010B DB 00000001B DB 11111110B ; 85 DB 11111100B DB 11111000B DB 11110000B DB 11100000B DB 11000000B DB 10000000B DB 00000000B DB 01111111B ; 86 DB 00111111B DB 00011111B DB 00001111B DB 00000111B DB 00000011B DB 00000001B DB 00000000B N63F8 EQU $-D63F8 ;----------------------------------------------------------------------- ; color table initialization stuff ; first byte = number of second bytes ; second byte 00-3F: third byte = fill repeated for 2nd-byte number of entries ; second byte 40-7F: third bytes = data copied for 2nd-byte number of entries ; second byte 80-FF: third bytes = copy 8 bytes for 2nd-byte number of entries ; title screen color table (color tables 0,1,2) D66B0 DB 13H DB 26H,0F1H ; 00-25 = F1 white on black DB 01H,0A1H ; 26 = A1 dk.yellow on black DB 01H,71H ; 27 = 71 cyan on black DB 01H,91H ; 28 = 91 orange on black DB 87H ; 29-2F DB 11H,11H,97H,97H,97H,97H,97H,11H DB 02H,0F1H ; 30-31 = F1 white on black DB 08H,0C1H ; 32-39 = C1 dk.green on black DB 82H ; 3A-3B DB 0C1H,0C3H,0C3H,0C3H,0C3H,0C3H,0C3H,0C3H DB 02H,0C3H ; 3C-3D = C3 dk.green on lt.green DB 82H ; 3E-3F DB 0C3H,0C3H,0C3H,0C3H,0C3H,0C1H,0C1H,0C1H DB 43H ; 40-42 DB 0CCH,0CCH,0CCH,0C3H,0C3H,0C3H,33H,0B3H DB 0B3H,0B3H,0B3H,0B3H,0B3H,0B3H,0FBH,0FBH DB 0FBH,0FBH,0FBH,0B3H,0B3H,0B3H,33H,0C3H DB 01H,0FBH ; 43 = FB white on tan DB 84H ; 44-47 DB 71H,71H,71H,71H,71H,71H,0B1H,0B1H DB 84H ; 48-4B DB 0B1H,0B1H,0B1H,0B1H,0A1H,0A1H,11H,11H DB 16H,70H ; 4C-61 = 70 cyan on trnasparent DB 95H ; 62-76 DB 70H,70H,70H,70H,70H,70H,0B0H,70H DB 13H,0B0H ; 77-89 = B0 tan on transparent DB 97H ; 8A-A0 DB 0B0H,0B0H,0B0H,0B0H,0A0H,0A0H,0A0H,0A0H DB 01H,0F0H ; A1 = F0 white on transparent ; 0=transparent 4=dk.blue 8=lt.red C=dk.green ; 1=black 5=lt.blue 9=orange/pink D=purple ; 2=green 6=dk.red A=dk.yellow E=gray ; 3=lt.green 7=cyan B=tan F=white ; 3D maze color table? (color tables 0,1) D671F DB 40H DB 01H,0F1H ; 30 = F1 white on black DB 03H,72H ; 31-33 = 72 cyan on green DB 07H,42H ; 34-3A = 42 dk.blue on green DB 07H,12H ; 3B-41 = 12 black on green DB 07H,92H ; 42-48 = 92 orange on green DB 04H,9BH ; 49-4C = 9B orange on tan DB 09H,12H ; 4D-55 = 12 black on green DB 45H ; 56-5A HEX 11 41 B4 B4 B1 B1 B1 B1 HEX 11 61 B6 B6 B1 B1 B1 B1 HEX 11 C1 BC BC B1 B1 B1 B1 HEX 11 D1 BD BD B1 B1 B1 B1 HEX 11 F1 BF BF B1 B1 B1 B1 DB 45H ; 5B-5F HEX B1 B4 B4 B4 41 41 41 44 HEX B1 B6 B6 B6 61 61 61 44 HEX B1 BC BC BC C1 C1 C1 44 HEX B1 BD BD BD D1 D1 D1 44 HEX B1 BF BF BF F1 F1 F1 44 DB 05H,0B1H ; 60-64 = B1 tan on black DB 41H ; 65 HEX B4 B4 B1 B1 B1 B1 B1 B1 DB 02H,0B1H ; 66-67 = B1 tan on black DB 83H ; 68-6A DB 11H,0B1H,0B1H,71H,71H,71H,71H,71H DB 01H,71H ; 6B = 71 cyan on black DB 41H ; 6C DB 11H,71H,0B1H,71H,71H,71H,71H,71H DB 07H,71H ; 6D-73 = 71 cyan on black DB 42H ; 74-75 DB 0B1H,0B8H,0B8H,0B8H,81H,81H,81H,81H DB 0B7H,0B7H,0B7H,71H,71H,71H,0B7H,0B7H DB 82H ; 76-77 DB 0B1H,0E8H,0E8H,0E7H,0E7H,0E7H,0E8H,87H DB 41H ; 78 DB 0B1H,93H,0D3H,0D3H,0D3H,0D3H,31H,31H DB 02H,0B1H ; 79-7A = B1 tan on black DB 42H ; 7B-7C DB 0E1H,0E1H,0E1H,0E1H,81H,71H,11H,11H DB 87H,0E1H,0E1H,0E1H,0E1H,0E1H,81H,71H DB 01H,31H ; 7D = 31 lt.green on black DB 41H ; 7E DB 0D3H,0D3H,0D3H,0D3H,31H,31H,11H,0D1H DB 02H,0B1H ; 7F-80 DB 44H ; 81-84 DB 87H,0E1H,0E1H,0E1H,81H,71H,81H,71H DB 0E1H,0E1H,0E1H,0E1H,81H,71H,11H,11H DB 0D3H,0D3H,0D3H,0D3H,31H,31H,11H,31H DB 31H,31H,31H,31H,11H,0D1H,11H,11H DB 41H ; 85 DB 0F1H,0F1H,0F1H,0F1H,0F1H,0F1H,0F1H,41H DB 01H,0B1H ; 86 = B1 DB 01H,0A1H ; 87 = A1 DB 01H,0B1H ; 88 = B1 DB 41H ; 89 DB 0E1H,0E1H,0E1H,0E1H,0E1H,0E1H,0E1H,0A1H DB 01H,0B1H ; 8A = B1 DB 01H,0F1H ; 8B = F1 DB 42H ; 8C-8D DB 0F1H,0F1H,0F1H,0F1H,0F1H,0F1H,0F1H,0F1H DB 0E1H,0E1H,0E1H,0E1H,0E1H,81H,81H,81H DB 01H,0B1H ; 8E = B1 DB 01H,0F1H ; 8F = F1 DB 41H ; 90 DB 81H,81H,0B1H,0B1H,0B1H,0B1H,0B1H,0B1H DB 01H,0F1H ; 91 = F1 DB 41H ; 92 DB 0F1H,0F1H,0F1H,41H,0B1H,41H,11H,11H DB 01H,0F1H ; 93 = F1 DB 43H ; 94-96 DB 0F1H,0F1H,0F1H,0F1H,0B1H,0B1H,11H,11H DB 0E1H,0E1H,0E1H,0E1H,0E1H,0E1H,0E1H,81H DB 81H,81H,81H,0B1H,0B1H,0B1H,11H,11H DB 83H ; 97-99 DB 0B1H,0B1H,0B1H,0B1H,0B1H,0B1H,81H,81H DB 01H,0B1H ; 9A = B1 DB 41H ; 9B DB 41H,0F1H,0F1H,0F1H,0F1H,0F1H,0F1H,0F1H DB 01H,0B1H ; 9C = B1 DB 01H,0A1H ; 9D = A1 DB 01H,0B1H ; 9E = B1 DB 41H ; 9F DB 0A1H,0E1H,0E1H,0E1H,0E1H,0E1H,0E1H,0E1H DB 41H ; A0 DB 0B1H,0B1H,0B1H,0B1H,0B1H,0B1H,0B1H,41H DB 01H,0F1H ; A1 = F1 DB 42H ; A2-A3 DB 0E1H,0E1H,0E1H,0E1H,0E1H,81H,81H,81H DB 81H,81H,0B1H,0B1H,0B1H,0B1H,0B1H,0B1H DB 01H,0F1H ; A4 = F1 DB 41H ; A5 DB 81H,81H,0B1H,0B1H,0B1H,0B1H,0B1H,0B1H DB 01H,0F1H ; A6 = F1 DB 41H ; A7 DB 0F1H,0F1H,0F1H,0F1H,41H,0B1H,41H,0F1H DB 01H,0F1H ; A8 = F1 DB 41H ; A9 DB 0F1H,0F1H,0F1H,0F1H,0F1H,0B1H,0F1H,0F1H DB 42H ; AA-AB DB 0E1H,0E1H,0E1H,0E1H,0E1H,0E1H,0E1H,81H DB 81H,81H,0B1H,0B1H,0B1H,11H,11H,11H DB 41H ; AC DB 0B1H,0B1H,0B1H,0B1H,0B1H,0B1H,81H,81H DB 01H,0B1H ; AD = F1 DB 41H ; AE DB 0B1H,0B1H,0B1H,0B1H,0B1H,0B1H,81H,81H DB 42H ; AF-B0 DB 0E1H,0E1H,0E1H,0EBH,0B1H,0B1H,0B1H,0B1H DB 11H,0E1H,0E1H,0E4H,0E4H,0E4H,0E1H,0E1H DB 01H,0E1H ; B1 = E1 DB 02H,0F1H ; B2-B3 = F1 DB 01H,0B1H ; B4 = B1 ; 0=transparent 4=dk.blue 8=lt.red C=dk.green ; 1=black 5=lt.blue 9=orange/pink D=purple ; 2=green 6=dk.red A=dk.yellow E=gray ; 3=lt.green 7=cyan B=tan F=white D6903 DB 03H ; (color tables 0,1,2 and 1) DB 3FH,0F1H ; 30-6E = F1 white on black DB 13H,0F1H ; 6F-81 = F1 white on black DB 05H,12H ; 82-86 = 12 black on green D690A DB 01H ; (color tables 0,1) DB 0AH,0B2H ; 31-3A = B2 tan on green D690D DB 01H ; (color tables 0,1) DB 0AH,92H ; 31-3A = 92 orange on green D6910 DB 01H ; (color tables 0,1) DB 0AH,0D2H ; 31-3A = D2 purple on green D6913 DB 01H ; (color tables 0,1) DB 0AH,0C2H ; 31-3A = C2 dk.green on green D6916 DB 01H ; (color tables 0,1) DB 0AH,72H ; 31-3A = 72 cyan on green D6919 DB 01H ; (color tables 0,1) DB 0AH,0F2H ; 31-3A = F2 white on green D691C DB 02H ; (color table 2) DB 03H,72H ; 31-33 = 72 DB 07H,42H ; 34-3A = 42 D6921 DB 03H ; (color tables 0,1) DB 18H,14H ; 31-48 = 14 DB 04H,1BH ; 49-4C = 1B DB 09H,44H ; 4D-55 = 44 D6928 DB 06H ; (color tables 0,1) DB 03H,72H ; 30-32 = 72 DB 07H,42H ; 33-39 = 42 DB 07H,12H ; 3A-40 = 12 DB 07H,92H ; 41-47 = 92 DB 04H,9BH ; 48-4B = 9B DB 09H,12H ; 4C-54 = 12 ;----------------------------------------------------------------------- ; copied to VRAM 1800H (sprite pattern table) D6935 DB 11111111B ; 00 DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 00000000B ; 01 DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000000B ; 02 DB 00001111B DB 00000011B DB 00000001B DB 00000000B DB 00000000B DB 00000000B DB 00000000B DB 00000001B ; 03 DB 00000001B DB 00000011B DB 00000011B DB 00000001B DB 00000001B DB 00000000B DB 00000000B DB 00000000B ; 04 DB 00000000B DB 11000000B DB 01100000B DB 00011000B DB 00000110B DB 00000001B DB 00000000B DB 00000000B ; 05 DB 00000000B DB 11100000B DB 01110000B DB 00111000B DB 00001100B DB 00000111B DB 00000000B DB 00000000B ; 06 DB 00000000B DB 11000011B DB 11111110B DB 00011100B DB 00000000B DB 00000000B DB 00000000B DB 00000000B ; 07 DB 00000000B DB 00000000B DB 00000000B DB 11100011B DB 11111111B DB 00110000B DB 00000000B DB 00000000B ; 08 DB 00000000B DB 11000000B DB 01110000B DB 00011000B DB 00000110B DB 00000001B DB 00000000B DB 00000000B ; 09 DB 00000000B DB 11000000B DB 01100000B DB 00110000B DB 00001100B DB 00000011B DB 00000000B N6935 EQU $-D6935 ;----------------------------------------------------------------------- ; two lines to VRAM 38C5 = "THE" D6985 HEX 44 45 46 47 HEX 48 49 4A 4B ; four lines to VRAM 3902 = "BLACK ONYX" D698D HEX 4C 4D 4E 4F 50 31 51 52 53 54 55 56 57 58 59 31 35 40 36 5A 5B 5C 5D 5E 5F 5D 60 61 31 HEX 62 63 64 65 66 31 67 68 69 6A 6B 6C 6D 6E 31 31 3A 41 3B 6F 70 71 72 73 74 72 75 76 31 HEX 77 78 79 77 7A 7B 7C 7D 7E 7F 31 80 77 81 82 31 3C 43 3D 77 83 84 85 86 31 87 88 89 31 HEX 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 31 3E 42 3F 8A 99 9A 9B 9C 9D 9E 9F A0 A1 D6A01 DB 05H DW D6A0C,D6A12,D6A18,D6A2C,D6A44 D6A0C DW 38F2H ASCIIC 32H,33H,34H ; top of green egg? D6A12 DW 3992H ASCIIC 37H,38H,39H ; bottom of green egg? D6A18 DW 3A27H ASCIIC _P,_U,_S,_H,__,_S,_T,_A,_R,_T,__,_B,_U,_T,_T,_O,_N D6A2C DW 3A85H ASCIIC _B,_L,_A,_C,_K,__,_O,_N,_Y,_X,__,_copy,__,_B,_P,_S,__,_1,_9,_8,_4 D6A44 DW 3AC4H ASCIIC _S,_E,_G,_A,__,_V,_E,_R,_S,_I,_O,_N,__,_copy,__,_S,_E,_G,_A,__,_1,_9,_8,_7 ;----------------------------------------------------------------------- ; monster graphics ; monster graphics sizes (and screen locations?) D6A5F DB 02H,02H DW 3934H,38F7H,38D4H,3959H,3995H,38D9H,3956H,3911H DW 3875H,3972H,38BBH,39B7H,385AH,38B1H,397BH,3898H DW 39B1H,391BH,3852H,39BAH D6A89 DB 02H,03H DW 38D4H,38B8H,3993H,3939H,3873H,3996H,3932H,3859H DW 3935H,391BH,3917H,3851H,38B6H,3998H,385BH,3855H DW 38D1H,3991H,38BAH,399BH D6AB3 DB 03H,03H D6AB5 DW 3935H,3952H,3958H,38D3H,38D7H,38F0H,38FAH,3875H DW 3890H,389AH,3832H,3838H D6ACD DB 05H,05H DW 38D5H,3870H,3838H,3970H,3979H ; monster graphics table ; first entry = pattern table data (starting with char code B5) ; second entry = color table data (starting with char code B5) ; third entry = name table data (blanks are 25H) ; first byte of graphics data: ; 00 = 6A5F 2,2 ; 01 = 6A89 2,3 (3 high, 2 wide) ; 02 = 6AB3 3,3 ; 03 = 6ACD 5,5 D6AD9 DW D71E2,D7212,D71DB ; 00 ZOMBIE DW D7327,D7357,D7320 ; 01 AZTEC DW D7239,D7281,D722F ; 02 WOLF DW D72A8,D72F0,D729E ; 03 LION DW D772A,D774A,D7725 ; 04 BAT DW D7002,D7032,D6FFB ; 05 KOBOLD DW D775D,D778D,D7756 ; 06 SKELET DW D6F59,D6F89,D6F52 ; 07 GOBLIN DW D6B91,D6BD9,D6B87 ; 08 ORC DW D76CA,D76EA,D76C5 ; 09 SLIME DW D7689,D76B9,D7682 ; 0A MUMMY DW D6F05,D6F35,D6EFE ; 0B GHOUL DW D738C,D73D4,D7382 ; 0C COBRA DW D7471,D74B9,D7467 ; 0D OGRE DW D6FA7,D6FEF,D6F9D ; 0E SPIDER DW D7413,D745B,D7409 ; 0F VAMPIR DW D7050,D7098,D7046 ; 10 HOBGOB DW D76F2,D7712,D76ED ; 11 BLAAB DW D7567,D75AF,D755D ; 12 WIRKAT DW D7634,D7674,D762A ; 13 GHOST DW D7156,D719E,D714C ; 14 DEMON DW D74F7,D753F,D74ED ; 15 BEAST DW D7797,D779F,D7790 ; 16 HIDER DW D75BC,D7604,D75B2 ; 17 MIER DW D6C11,D6C59,D6C07 ; 18 TROLL DW D6E92,D6ED2,D6E88 ; 19 WRAITH DW D70D7,D711F,D70CD ; 1A TAURUS DW D6D5E,D6E0E,D6D44 ; 1B GIANT DW D6C88,D6D38,D6C6E ; 1C KRAKEN ; NT monster 08 (ORC) D6B87 DB 02H DB 0B5H,0B9H,0B8H DB 0BAH,0BBH,0BCH DB 0BDH,0B6H,0B7H ; PT monster 08 D6B91 HEX 00 03 01 00 00 00 07 3F HEX F8 F0 F3 E3 E1 F0 70 60 HEX E0 E0 F8 A8 A8 00 00 00 HEX 7F 77 71 78 FC 30 30 78 HEX 18 7E 42 66 FF 5A 3C 18 HEX 3C FE E7 DB E7 FF C3 DB HEX FF 99 66 FF E0 07 FF FF HEX DB E7 FE 7E 3C E0 E0 E0 HEX 78 78 78 30 00 07 05 05 ; CT monster 08 D6BD9 DB 03H DB 03H,0D1H ; B5-B7 = D1 DB 01H,91H ; B8 = 91 DB 45H ; B9-BD DB 0D1H,0D1H,0FDH,0FDH,0DDH,0FDH,0FDH,0FDH DB 0D1H,0D1H,0D1H,0D1H,0B1H,0F1H,0F1H,0F1H DB 0DDH,0FDH,0FDH,0DDH,0D7H,0D7H,0DDH,0DDH DB 91H,91H,91H,91H,91H,0D1H,0D1H,0D1H DB 0F1H,0F1H,0F1H,0F1H,11H,0D1H,0D1H,0D1H ; NT monster 18 (TROLL) D6C07 DB 02H DB 0B5H,0BDH,0B6H DB 0B7H,0B8H,0B9H DB 0BBH,0BAH,0BCH ; PT monster 18 D6C11 HEX 00 01 00 01 00 00 02 07 HEX 00 80 00 80 00 00 40 E0 HEX 17 1E 1C 58 38 74 F0 A0 HEX BD C3 FF 7E 3C 5A 3C BD HEX E8 70 30 1A 1C 2E 0F 05 HEX 7E E7 C3 81 81 00 00 00 HEX A0 80 40 03 0F 15 35 69 HEX 05 01 02 C0 F0 A8 AC 96 HEX 81 FF FF BD 99 FF 81 42 ; CT monster 18 D6C59 DB 03H DB 06H,71H ; B5-BA = 71 DB 82H ; BB-BC DB 91H,91H,91H,71H,71H,71H,91H,91H DB 41H ; BD DB 71H,71H,71H,7FH,7FH,71H,7FH,71H ; NT monster 1C (KRAKEN) D6C6E DB 03H DB 0B5H,0B6H,0B7H,0B8H,0B9H DB 0BAH,0BBH,0BCH,0BDH,0BEH DB 0BFH,0C9H,0CAH,0C0H,0C1H DB 0C2H,0C3H,0C4H,0C5H,0C6H DB 25H,0C7H, 25H,0C8H, 25H ; PT monster 1C D6C88 HEX 3C 6E 5E 52 AE A4 A0 B0 HEX 70 F8 DC 9D 3B 57 B7 AF HEX 00 1F FF FF FF FF FF FF HEX 00 80 EC B7 DB EB ED E5 HEX 00 F0 B8 18 F8 F8 F0 E0 HEX B7 BF BF 59 6F 1F 3F 3F HEX 6F DF 9F DF BF BF B1 AE HEX FF FF FF FF FF FF F1 EE HEX F4 F2 F2 F2 F2 F2 F6 F5 HEX 44 8E CB EB E3 F6 B6 5D HEX 3D 3A 3B 1A 1A 1A 3A 34 HEX 65 A9 B8 F7 6F 5F FF FF HEX AA 9C 00 80 C0 C0 C0 C0 HEX B5 EB 4B 37 07 07 03 01 HEX FF E7 D8 A7 D0 D0 E8 E8 HEX FF 7F BF 5F BF BF 80 7F HEX E7 99 66 82 F2 FA F9 78 HEX BC BE F2 D1 A0 A0 40 80 HEX E8 E8 D0 D0 E9 77 79 3E HEX B8 7C 7E 3F 1F 07 17 0E HEX AF DF 5F F0 EF EB 70 7F HEX 6F 9F 9F F0 0F 9D F0 FF ; CT monster 1C D6D38 DB 02H DB 14H,21H ; B5-C8 DB 82H ; C9-CA DB 21H,21H,21H,21H,0B1H,0B1H,21H,21H ; NT monster 1B (GIANT) D6D44 DB 03H DB 0B5H,0B9H,0C1H,0BAH,0B6H DB 0C2H,0BBH,0C3H,0BCH,0B7H DB 0C4H,0BFH,0C5H,0C0H,0C6H DB 25H,0C7H,0BDH,0BEH,0B8H DB 25H,0C8H,0C9H,0CAH, 25H ; PT monster 1B D6D5E HEX 18 7E 4E DF BF BF BF DF HEX 00 00 00 00 F8 FE FE FF HEX FF FF FF FF FF 7F 7F 3F HEX 7F 5F 3F 1E 00 00 00 00 HEX 02 01 03 01 01 0F 0D 07 HEX 40 80 C0 80 80 F0 B0 E0 HEX FE 01 01 FC FC FE FE FF HEX 7F 80 80 3F 3F 7F 7F FF HEX FF FF 01 01 81 81 81 C1 HEX FE 20 20 34 B4 FC FC FC HEX FF FF DD EE 3F 3F 3F 7F HEX FF FF BB 76 FC FC FC FC HEX A5 FF 66 FF C3 99 99 C3 HEX 5E 7E 3C 3C 76 76 40 7A HEX 7E 42 FF 81 C3 5A 81 FF HEX 42 7A 34 14 1C 18 18 08 HEX E7 FF FF FF 7E 66 7E FF HEX 3F 7F 7F 7F 3F 3F 3F 7F HEX 04 0C 09 BF 3F 3F 7F FF HEX FF FF FC FC FF FF 00 00 HEX C1 C3 C3 C3 C3 C3 03 03 HEX FE FF FF FF 3F 3F FF FF ; CT monster 1B D6E0E DB 07H DB 01H,91H ; B5 = 91 DB 03H,0B1H ; B6-B8 = B1 DB 82H ; B9-BA DB 51H,51H,51H,0B8H,0B8H,0B8H,0B8H,0B8H DB 82H ; BB-BC DB 85H,0B5H,85H,85H,85H,85H,85H,88H DB 82H ; BD-BE DB 81H,0B8H,0B8H,0B8H,0B8H,0B1H,0B1H,0B1H DB 82H ; BF-C0 DB 81H,81H,81H,81H,0D1H,0D1H,0D1H,81H DB 4AH ; C1-CA DB 51H,55H,0B5H,0BBH,0B1H,0B1H,0B1H,0B1H DB 91H,91H,91H,91H,0B1H,0B1H,0B1H,0B1H DB 0B5H,0B5H,55H,0B5H,0B5H,0B5H,85H,55H DB 0B1H,0B1H,91H,91H,91H,91H,91H,91H DB 85H,88H,88H,88H,0FDH,0FDH,0FDH,88H DB 0B1H,81H,0B1H,81H,0B1H,81H,0B1H,0B1H DB 0B8H,0B8H,0B8H,0B1H,0B1H,0B1H,0B1H,0BBH DB 0BBH,88H,0B8H,0B8H,88H,88H,11H,11H DB 0B1H,0B1H,0B1H,81H,0B1H,0B1H,81H,81H DB 0B1H,0BBH,0BBH,88H,0B8H,0B8H,88H,88H ; NT monster 19 (WRAITH) D6E88 DB 02H DB 0B8H,0B5H, 25H DB 0B9H,0BAH,0BBH DB 0B6H,0BCH,0B7H ; PT monster 19 D6E92 HEX 18 24 42 81 81 81 42 3C HEX 06 06 06 06 06 00 00 00 HEX 20 00 00 00 00 00 00 00 HEX 06 0E 0A 0A 0E 06 07 07 HEX 06 0F 17 17 16 0E 06 06 HEX 66 66 EF F7 EF 76 6E 76 HEX E0 E0 60 90 98 D8 78 70 HEX EF F7 EF F7 7F 1E 7F 1E ; CT monster 19 D6ED2 DB 02H DB 03H,0D1H ; B5-B7 = D1 DB 45H ; B8-BC DB 81H,81H,81H,81H,81H,81H,0F1H,0F1H DB 0F1H,0D1H,0D1H,0D1H,0D1H,0D1H,0D1H,0D1H DB 96H,96H,0D1H,0D1H,0D1H,0D1H,0D1H,0D1H DB 0F1H,0F1H,0F1H,0D1H,0D1H,0D1H,0D1H,0D1H DB 0D1H,0D1H,0D1H,0D1H,0D9H,0D9H,91H,91H ; NT monster 0B (GHOUL) D6EFE DB 01H DB 0B5H,0B6H DB 0B7H,0B8H DB 0B9H,0BAH ; PT monster 0B D6F05 HEX 42 6A 67 6D 66 6B 62 65 HEX 40 50 E2 B5 67 D3 43 A3 HEX F1 07 76 65 03 03 03 07 HEX 87 FE 7C B0 C0 C0 C0 E0 HEX 0E 0E 0C 0C 0C 0C 1C 38 HEX 70 70 30 30 30 18 18 00 ; CT monster 0B D6F35 DB 03H DB 02H,71H ; B5-B6 = 71 DB 82H ; B7-B8 DB 71H,71H,71H,71H,71H,91H,91H,71H DB 42H ; B9-BA DB 71H,71H,71H,71H,91H,71H,91H,91H DB 71H,71H,91H,71H,91H,91H,91H,01H ; NT monster 07 (GOBLIN) D6F52 DB 01H DB 0B5H,0B6H DB 0B7H,0B8H DB 0B9H,0BAH ; PT monster 07 D6F59 HEX 05 05 D3 D1 D2 D3 B2 31 HEX A5 A7 C7 87 42 C7 42 97 HEX 37 05 56 73 01 32 37 37 HEX FE BC 70 C0 80 41 ED FD HEX 06 06 06 06 06 06 0E 14 HEX 75 62 60 60 70 28 00 00 ; CT monster 07 D6F89 DB 02H DB 04H,0C1H ; B5-B8 = C1 DB 42H ; B9-BA DB 0C1H,0C1H,0C1H,0C1H,51H,0C1H,51H,51H DB 0C1H,0C1H,51H,0C1H,51H,51H,01H,11H ; NT monster 0E (SPIDER) D6F9D DB 02H DB 0B5H,0B6H,0B7H DB 0B8H,0BDH,0B9H DB 0BAH,0BBH,0BCH ; PT monster 0E D6FA7 HEX 20 70 79 1D 6F 07 33 19 HEX 7E C3 BD 42 BD 42 BD A5 HEX 04 0E 9F B8 F3 E0 C3 83 HEX 01 00 3F 1F E0 01 83 C7 HEX 82 00 FC F8 07 90 CE E0 HEX 6F 1D 01 71 05 79 30 00 HEX 24 42 24 18 00 00 81 42 HEX F0 B8 80 8E 80 86 0E 3C HEX FF FF FF FF FF FF 24 3C ; CT monster 0E D6FEF DB 02H DB 08H,51H ; B5-BC = 51 DB 41H ; BD DB 55H,55H,55H,55H,55H,55H,95H,95H ; NT monster 05 (KOBOLD) D6FFB DB 01H DB 0B5H,0B6H DB 0B7H,0B8H DB 0B9H,0BAH ; PT monster 05 D7002 HEX 05 07 25 66 67 62 63 61 HEX A2 E5 A7 63 E3 43 C3 87 HEX 65 F7 06 75 63 01 61 03 HEX AE FC 78 A0 C0 80 80 C0 HEX 06 06 06 06 06 06 0E 1C HEX E0 60 60 60 60 70 38 00 ; CT monster 05 D7032 DB 02H DB 04H,0C1H ; B5-B8 = C1 DB 42H ; B9-BA DB 0C1H,0C1H,0C1H,0C1H,0B1H,0B1H,0C1H,0B1H DB 0C1H,0C1H,0C1H,0B1H,0B1H,0C1H,0B1H,11H ; NT monster 10 (HOBGOB) D7046 DB 02H DB 0B9H,0BAH,0B5H DB 0BBH,0B6H,0BCH DB 0BDH,0B7H,0B8H ; PT monster 10 D7050 HEX 00 38 7C FE FE FE FE BC HEX FF FF E7 E7 99 FF FF FF HEX FF FF EF E7 E3 C3 C3 C0 HEX 38 00 80 C0 E0 50 50 00 HEX 00 00 F8 D8 D8 F8 D8 98 HEX 99 7E 5A 66 5A A5 DB E7 HEX 00 3C 7A 7A 7A 3C 00 18 HEX BC 3C 3C 3C 3C 7C 7C 3C HEX 18 00 00 01 03 07 0A 0A ; CT monster 10 D7098 DB 03H DB 01H,0C1H ; B5 = C1 DB 83H ; B6-B8 DB 0C1H,0C1H,0C1H,0C1H,0C1H,51H,51H,51H DB 45H ; B9-BD DB 11H,11H,71H,71H,71H,71H,71H,91H DB 0C1H,0C9H,0C9H,0C9H,0C1H,0C1H,0C1H,0C1H DB 11H,0C1H,0C1H,0C1H,0C1H,0C1H,11H,91H DB 0C1H,0C1H,51H,0C1H,51H,0C1H,0C1H,0C1H DB 0B1H,11H,11H,0C1H,0C1H,0C1H,51H,51H ; NT monster 1A (TAURUS) D70CD DB 02H DB 0B8H,0BAH,0B9H DB 0B5H,0B6H,0B7H DB 0BBH,0BCH,0BDH ; PT monster 1A D70D7 HEX 7F FB FA FA FC 7F 7F 3F HEX 24 A5 3D 59 43 BE BE BE HEX FE DF DF DF 3F FE FE FC HEX 07 0C 0F 0F 07 1F 3F 7F HEX E0 30 F0 F0 E0 F8 FC FE HEX 00 3C 7E 7E FF BD 7E 7E HEX 0F 11 11 19 1D 1F 1F 1F HEX BE 77 77 67 47 07 07 07 HEX F8 40 C0 E0 E0 E0 70 70 ; CT monster 1A D711F DB 03H DB 03H,0E1H DB 82H DB 0B1H,0B1H,0B1H,0B1H,0B1H,0E1H,0E1H,0E1H DB 44H DB 11H,0EBH,0EBH,0EBH,0E1H,0E9H,0E1H,0E1H DB 0E1H,0F1H,0F1H,0F1H,0F1H,0F1H,0F1H,0F1H DB 0E1H,0EFH,0EFH,0EFH,0EFH,7FH,7FH,7FH DB 0E1H,0E1H,0E1H,0E1H,0E1H,71H,71H,71H ; NT monster 14 (DEMON) D714C DB 02H DB 0B8H,0B9H,0B5H DB 0BAH,0BBH,0BCH DB 0BDH,0B6H,0B7H ; PT monster 14 D7156 HEX 00 00 00 00 38 7C FC FE HEX FF EF C3 81 81 81 81 80 HEX 98 C0 C0 C0 E0 F0 A8 00 HEX 18 3C 3C 3C 3C 3C 18 1C HEX 4A 5A 5A 5A 7E 24 18 42 HEX 3A 3A 3A 1C 18 08 00 00 HEX 5A 5A 24 18 33 CC 33 FF HEX FE DE 9E 0E 0E 1E 3E 3C HEX 01 01 03 03 03 07 0F 15 ; CT monster 14 D719E DB 03H DB 01H,91H DB 82H DB 91H,91H,91H,91H,51H,51H,51H,51H DB 46H DB 0B1H,0B1H,0B1H,0B1H,0B1H,0B1H,0B1H,91H DB 91H,91H,91H,91H,91H,0B9H,0B9H,0B9H DB 91H,91H,91H,91H,0B1H,0B1H,11H,11H DB 0B9H,0B9H,0B9H,0B9H,95H,95H,95H,99H DB 91H,91H,91H,51H,51H,91H,91H,91H DB 91H,91H,91H,91H,51H,91H,51H,51H ; NT monster 00 (ZOMBIE) D71DB DB 01H DB 0B5H,0B6H DB 0B7H,0B8H DB 0B9H,0BAH ; PT monster 00 D71E2 HEX 06 11 0F 17 4B 3D 0F 16 HEX 60 88 F0 E8 D2 BC F0 68 HEX 03 07 1C 1F 1F 0F 57 57 HEX C0 E0 38 F8 F8 F0 EA EA HEX 0F 0F 0E 06 06 0E 00 01 HEX F0 F0 F0 F0 F0 E0 E0 F0 ; CT monster 00 D7212 DB 03H DB 02H,71H DB 82H DB 71H,71H,0F7H,0F7H,0F7H,0F7H,0F7H,0F7H DB 42H DB 0F1H,0F1H,0F1H,0F1H,71H,71H,11H,71H DB 0F1H,0F1H,0F1H,0F1H,0F1H,0F1H,71H,71H ; NT monster 02 (WOLF) D722F DB 02H DB 0B5H,0B6H,0BCH DB 0B7H,0B8H,0B9H DB 0BDH,0BAH,0BBH ; PT monster 02 D7239 HEX 00 00 00 00 00 00 20 36 HEX 00 00 00 00 00 00 60 A0 HEX 3F 3F 1F 0C 37 6F 5A 21 HEX B8 DC 5F 7F FF FF FF BF HEX 06 F6 FE FC FC FC FC FC HEX 7F FE CE C7 81 00 01 00 HEX F8 F8 F8 7C 18 D8 30 00 HEX 00 00 03 07 06 06 06 06 HEX 3F 01 39 31 77 6F 6C D4 ; CT monster 02 D7281 DB 03H DB 05H,51H DB 82H DB 51H,51H,51H,51H,51H,0B1H,0B1H,0B1H DB 42H DB 11H,11H,0B1H,51H,0B1H,51H,51H,51H DB 51H,51H,51H,51H,51H,51H,0B1H,0B1H ; NT monster 03 (LION) D729E DB 02H DB 0B6H,0B9H,0BAH DB 0B7H,0B8H,0B5H DB 0BBH,0BCH,0BDH ; PT monster 03 D72A8 HEX E0 E0 C0 E0 E0 E0 C0 C0 HEX 00 00 00 00 00 00 1D 7F HEX 80 80 29 FC 72 2B FF 9F HEX 3F DF DF 9F 1F 1F 1F 3B HEX 00 00 00 00 00 00 07 1F HEX 0C 0C 18 38 70 60 E0 E0 HEX 9F 52 85 7B 01 67 6E 5C HEX 37 77 EB CD 86 02 05 00 HEX 80 E0 E0 E0 C0 C0 A0 00 ; CT monster 03 D72F0 DB 04H DB 01H,0B1H DB 01H,91H DB 02H,0B9H DB 45H DB 11H,11H,11H,11H,11H,11H,0B1H,0B9H DB 91H,91H,91H,0B1H,0B1H,0B1H,0B1H,0B1H DB 0B9H,0B1H,0B1H,0B1H,0B1H,91H,0B1H,0B1H DB 0B9H,0B9H,0B1H,0B1H,91H,0B1H,0B1H,11H DB 0B1H,0B1H,0B1H,0B1H,91H,0B1H,0B1H,11H ; NT monster 01 (AZEC) D7320 DB 01H DB 0B7H,0B8H DB 0B5H,0B6H DB 0B9H,0BAH ; PT monster 01 D7327 HEX 01 5F 67 62 61 63 65 6B HEX C1 F8 70 A0 C0 E0 50 68 HEX AC AB A8 FA 66 67 43 ED HEX E0 10 F6 D7 B4 F3 63 26 HEX 63 03 03 03 03 03 1F 1F HEX 30 38 18 18 30 7E 7E 00 ; CT monster 01 D7357 DB 02H DB 82H DB 0B9H,91H,91H,91H,91H,0B1H,0B1H,0B1H DB 44H DB 0B9H,0B9H,0B9H,0B9H,91H,91H,91H,91H DB 91H,91H,91H,91H,91H,91H,91H,0B9H DB 91H,91H,91H,0B1H,91H,0B1H,91H,91H DB 91H,91H,0B1H,91H,0B1H,91H,91H,11H ; NT monster 0C (COBRA) D7382 DB 02H DB 0B7H,0B9H,0B8H DB 0BAH,0BBH,0BCH DB 0B5H,0B6H,0BDH ; PT monster 0C D738C HEX 07 0F 1E 1C 1F 1F 0F 03 HEX BC BC 3D 3D 7D F8 F8 F0 HEX 00 00 01 07 0F 0F 0F 0F HEX 00 00 80 E0 F0 F0 F0 F0 HEX 7E BD DB 81 5A 5A BD BD HEX 0F 07 07 03 00 00 00 01 HEX BD A5 FF FF FF 3C 3C 80 HEX F0 E0 E0 C0 00 20 20 30 HEX 18 0C 0C 8C CC FC 78 00 ; CT monster 0C D73D4 DB 03H DB 02H,21H DB 82H DB 11H,11H,31H,31H,31H,91H,31H,31H DB 45H DB 31H,31H,31H,93H,93H,93H,93H,93H DB 31H,31H,91H,31H,11H,11H,11H,21H DB 93H,93H,33H,33H,33H,91H,21H,21H DB 31H,31H,91H,31H,11H,91H,91H,91H DB 91H,21H,91H,21H,21H,21H,21H,11H ; NT monster 0F (VAMPIR) D7409 DB 02H DB 0B5H,0B6H,0B7H DB 0B8H,0BDH,0B9H DB 0BAH,0BBH,0BCH ; PT monster 0F D7413 HEX 20 60 50 D0 88 94 BA BD HEX 00 00 00 81 C3 A5 A5 99 HEX 04 06 0A 0B 11 29 5D BD HEX BE BE FE FF FF FF FF FF HEX 7D 7D 7F 7F FF FF FF FF HEX FF FC F8 70 78 38 1C 0F HEX 66 3C C3 42 00 00 00 00 HEX FF 3F 1F 0E 1E 1C 38 F0 HEX DB FF FF C3 66 7E 18 81 ; CT monster 0F D745B DB 02H DB 08H,51H ; B5-BC = 51 DB 41H ; BD DB 51H,55H,55H,95H,95H,51H,51H,51H ; NT monster 0D (OGRE) D7467 DB 02H DB 0B8H,0B5H,0B9H DB 0B6H,0BAH,0B7H DB 0BBH,0BCH,0BDH ; PT monster 0D D7471 HEX 18 18 3C 5A 66 5A A5 DB HEX 3B 4D 75 3A 34 30 30 30 HEX EC F8 C0 00 00 00 00 80 HEX B4 B4 FC FC B4 B4 33 37 HEX 60 F0 70 38 3C 3C BE DE HEX E7 FF E6 99 7E 7E 03 07 HEX 31 31 31 31 01 03 05 05 HEX 07 EF ED E5 E0 E0 60 40 HEX 80 80 40 40 00 00 00 00 ; CT monster 0D D74B9 DB 02H DB 03H,0B1H ; B5-B7 = B1 DB 46H ; B8-BD DB 71H,71H,71H,71H,71H,71H,0B1H,0B1H DB 0B1H,0B1H,0B1H,91H,91H,0B1H,0B1H,0B1H DB 0B1H,0BBH,0B1H,0B1H,91H,91H,0B6H,0B6H DB 61H,0B1H,0B1H,0B1H,91H,0B1H,0B1H,0B1H DB 96H,0B1H,0B1H,0B1H,91H,0B1H,0B1H,0B1H DB 91H,0B1H,0B1H,0B1H,11H,11H,11H,11H ; NT monster 15 (BEAST) D74ED DB 02H DB 0B8H,0B5H,0B9H DB 0B6H,0BDH,0B7H DB 0BAH,0BBH,0BCH ; PT monster 15 D74F7 HEX 00 00 00 00 24 24 A5 BD HEX DF DE DA D1 D0 D0 A0 A0 HEX FB 7B 5B 8B 0B 0B 05 05 HEX F0 38 34 6A 6A 5D 5E DF HEX 0F 1C 2C 56 56 BA 7A FB HEX A1 A2 A6 66 66 6E 5D 7A HEX BD DB BD A5 E7 C3 E7 A5 HEX 85 45 65 66 66 76 BA 5E HEX 3C A5 18 5A A5 BD C3 FF ; CT monster 15 D753F DB 04H DB 03H,51H ; B5-B7 = 51 DB 82H ; B8-B9 DB 0B1H,51H,51H,51H,51H,51H,51H,51H DB 83H ; BA-BC DB 51H,51H,51H,51H,51H,51H,51H,0B1H DB 41H ; BD DB 51H,0B5H,0B5H,51H,51H,51H,51H,55H ; NT monster 12 (WIRKAT) D755D DB 02H DB 0B5H,0B6H,0B7H DB 0B8H,0B9H,0BAH DB 0BBH,0BCH,0BDH ; PT monster 12 D7567 HEX 00 00 00 00 00 00 08 15 HEX 00 00 00 00 00 00 AA 5F HEX 18 00 30 00 18 00 86 00 HEX 16 0F 16 14 1F 16 1D 02 HEX 6A F5 B5 B5 B5 B5 75 EF HEX C2 76 5C 54 56 D6 56 54 HEX 0D 02 0C 1C 39 73 A7 0A HEX E0 C1 C3 C6 CC 94 80 80 HEX 34 1C 38 30 70 F8 A8 00 ; CT monster 12 D75AF DB 01H DB 09H,0B1H ; B5-BD = B1 ; NT monster 17 (MIER) D75B2 DB 02H DB 0B5H,0B6H,0B7H DB 0B8H,0BAH,0B9H DB 0BBH,0BCH,0BDH ; PT monster 17 D75BC HEX E0 70 18 08 1C 0F 00 00 HEX 00 00 00 00 00 C3 66 24 HEX 07 0E 18 10 38 F0 00 00 HEX 00 00 00 03 0F 0F 0F 0F HEX 00 C0 E0 F0 F0 F0 F0 60 HEX 7E 42 66 66 66 66 24 7E HEX 0F 06 06 06 06 0F 16 16 HEX 66 42 24 00 01 01 80 80 HEX 60 60 60 F0 68 68 00 00 ; CT monster 17 D7604 DB 03H DB 03H,51H ; B5-B7 = 51 DB 02H,81H ; B8-B9 = 81 DB 44H ; BA-BD DB 81H,0B8H,0B8H,0B8H,0B8H,0B8H,0B8H,81H DB 81H,81H,81H,81H,81H,91H,91H,91H DB 91H,91H,91H,11H,91H,91H,91H,91H DB 81H,81H,81H,91H,91H,91H,11H,11H ; NT monster 13 (GHOST) D762A DB 02H DB 0B5H,0BCH,0B6H DB 0B7H,0BBH,0B8H DB 25H,0B9H,0BAH ; PT monster 13 D7634 HEX 00 00 01 00 04 00 04 00 HEX 00 00 00 40 00 20 00 20 HEX 04 00 04 00 1E 3E 2B 2A HEX 00 20 00 20 78 7C 54 D4 HEX 80 02 40 04 20 02 08 02 HEX 00 10 00 30 00 A0 00 80 HEX 00 81 7E 00 00 00 00 00 HEX 00 55 00 00 00 00 C3 E7 ; CT monster 13 D7674 DB 03H DB 06H,0F1H ; B5-BA = F1 DB 01H,91H ; BB = 91 DB 41H ; BC DB 11H,0F1H,11H,11H,11H,11H,91H,91H ; NT monster 0A (MUMMY) D7682 DB 01H DB 0B9H,0BAH DB 0B5H,0B6H DB 0B7H,0B8H ; PT monster 0A D7689 HEX 1F 60 97 E0 E3 60 67 40 HEX F8 06 E9 07 C7 05 E5 61 HEX 46 40 06 00 06 00 06 0E HEX 01 61 00 60 70 00 00 00 HEX 01 03 03 01 03 00 01 04 HEX 80 C0 C0 80 C0 00 80 20 ; CT monster 0A D76B9 DB 02H,04H,0F1H,82H,0F1H,0F1H,91H,91H DB 0F1H,11H,0F1H,0F1H ; NT monster 09 (SLIME) D76C5 DB 00H DB 0B5H,0B6H DB 0B7H,0B8H ; PT monster 09 D76CA HEX 00 00 00 00 00 00 00 1B HEX 00 00 00 00 00 00 00 C8 HEX 7F FB FD 5F 7F 1F 19 00 HEX FE DF BF FF F4 FE C0 00 ; CT monster 09 D76EA DB 01H DB 04H,0C1H ; B5-B8 = 11 ; NT monster 11 (BLAAB) D76ED DB 00H DB 0B5H,0B6H DB 0B7H,0B8H ; PT monster 11 D76F2 HEX 00 00 00 00 00 03 37 DF HEX 00 00 00 00 00 C0 EE FB HEX 0C 06 BF FF FF FF 57 31 HEX 30 60 FF FE FF FF DC 86 ; CT monster 11 D7712 DB 02H DB 82H DB 11H,11H,11H,11H,11H,0C1H,31H,0C1H DB 82H DB 91H,91H,31H,0CCH,33H,0CCH,31H,0C1H ; NT monster 04 (BAT) D7725 DB 00H DB 0B7H,0B8H DB 0B5H,0B6H ; PT monster 04 D772A HEX E6 C3 CC C4 80 C0 40 00 HEX 67 C3 33 23 01 03 02 00 HEX 60 E0 F4 EA EF 03 01 E5 HEX 06 07 2F 57 F7 C0 80 A7 ; CT monster 04 D774A DB 02H DB 02H,51H ; B5-B6 = 51 DB 82H ; B7-B8 DB 51H,51H,51H,51H,51H,95H,95H,51H ; NT monster 06 (SKELET) D7756 DB 01H DB 0B5H,0B6H DB 0B7H,0B8H DB 0B9H,0BAH ; PT monster 06 D775D HEX 03 25 25 65 62 62 61 67 HEX C0 A0 A6 AD 4D 4B 8B ED HEX F9 07 69 67 61 03 05 03 HEX 9D EB 9B ED 8D C6 A0 C0 HEX 02 04 08 10 08 04 02 0C HEX 40 20 10 08 10 20 40 30 ; CT monster 06 D778D DB 01H DB 06H,0F1H ; B5-BA = F1 ; NT monster 16 (HIDER) D7790 DB 01H DB 25H,25H DB 25H,25H DB 25H,25H ; PT monster 16 D7797 HEX 00 00 00 00 00 00 00 00 ; CT monster 16 D779F DB 01H DB 01H,11H ; B5 = 11 ;----------------------------------------------------------------------- ; sound routines ; interrupt handler L77A2 CALL L77EE CALL L77BF LD IX,DC2D4 LD B,06H .77AE PUSH BC BIT 7,(IX+IX_00) CALL NZ,L788F LD DE,0020H ADD IX,DE POP BC DJNZ .77AE RET L77BF LD HL,DC2D2 BIT 7,(HL) RET Z LD A,(DC2D3) DEC A LD (DC2D3),A RET NZ LD A,14H LD (DC2D3),A LD A,(HL) AND 0FH INC A LD (DC2D4_3+IX_08),A OR 80H LD (HL),A AND 0FH INC A LD (DC2D4_2+IX_08),A INC A LD (DC2D4_1+IX_08),A CP 0DH RET NZ XOR A LD (DC2D2),A RET L77EE LD A,(DC2D0) ; get sound number BIT 7,A ; turn sound off if < 80H JP Z,L7B3B ; initialize PSG CP 87H ; turn sound off if >= 87H JP NC,L7B3B ; initialize PSG SUB 81H ; convert 81..86 to 00..05 RET M ; no change if 80H LD C,A LD B,00H LD HL,D7816 ADD HL,BC ADD HL,BC ; HL = pointer to sound data aadress LD C,(HL) INC HL LD B,(HL) ; BC = sound data address LD DE,D7826-D7816-1 ADD HL,DE ; HL = pointer to sound code address LD A,(HL) INC HL LD H,(HL) LD L,A ; HL = sound code address LD A,(DC2D1) LD E,A ; E = DC2D1 JP (HL) ; jump to sound handler ; 81 82 83 84 85 86 D7816 DW D7C17,D7D47,D7D68,D7D87,D7DBE,D7E36 D7826 DW L7839,L7858,L7850,L7842,L7839,L7839 L782E LD HL,DC2D4_3 SET 2,(HL) LD HL,DC2D4_2 SET 2,(HL) RET ; 81/85/86 L7839 CALL L7B3B ; initialize PSG LD DE,DC2D4_1 IF OPT1 JR L7862 ELSE JP L7862 ENDIF ; 84 L7842 LD HL,DC2D4_1 SET 2,(HL) CALL L782E LD DE,DC2D4_4 IF OPT1 JR L7862 ELSE JP L7862 ENDIF ; 83 L7850 LD A,10H LD (DC2D1),A IF OPT1 JR L785C ELSE JP L785C ENDIF ; 82 L7858 OR A IF OPT1 JR NZ,L7889 ELSE JP NZ,L7889 ENDIF L785C CALL L782E LD DE,DC2D4_5 L7862 LD A,0FFH OUT (PSG),A LD H,B LD L,C LD B,(HL) INC HL .786A PUSH BC LD BC,0009H LDIR LD A,20H LD (DE),A INC DE LD A,01H LD (DE),A INC DE XOR A LD (DE),A INC DE LD (DE),A INC DE LD (DE),A PUSH HL LD HL,0012H ADD HL,DE EX DE,HL POP HL INC DE POP BC DJNZ .786A L7889 LD A,80H ; set sound number to 80H (no change) LD (DC2D0),A RET L788F LD E,(IX+IX_0C+0) LD D,(IX+IX_0C+1) INC DE LD (IX+IX_0C+0),E LD (IX+IX_0C+1),D LD L,(IX+IX_0A+0) LD H,(IX+IX_0A+1) OR A SBC HL,DE CALL Z,L79E0 LD E,(IX+IX_10+0) LD D,(IX+IX_10+1) LD A,E OR D JR NZ,L78B9 LD (IX+IX_16),0FH JP L795E L78B9 BIT 5,(IX+IX_00) JR NZ,L78E4 LD A,(IX+IX_06) OR A JR NZ,L78D9 LD (IX+IX_12+0),E LD (IX+IX_12+1),D IF OPT1 JR L7921 ELSE JP L7921 ENDIF L78CE DEC A LD C,A LD B,00H ADD HL,BC ADD HL,BC LD A,(HL) INC HL LD H,(HL) LD L,A RET L78D9 LD HL,D7EB9 CALL L78CE CALL L79AA JR L7921 L78E4 PUSH DE LD L,(IX+IX_14+0) LD H,(IX+IX_14+1) OR A SBC HL,DE PUSH AF LD A,L JP P,.78F5 NEG .78F5 LD H,A LD E,(IX+IX_0C) CALL L7BF8 LD E,(IX+IX_0A) DEC E CALL L7C04 LD E,A LD D,00H POP AF LD A,E JP P,.7911 NEG JR Z,.7911 DEC D LD E,A .7911 POP HL ADD HL,DE EX DE,HL LD (IX+IX_12+0),E LD (IX+IX_12+1),D LD A,(IX+IX_06) OR A IF OPT1 JR NZ,L78D9 ELSE JP NZ,L78D9 ENDIF L7921 LD A,(IX+IX_07) OR A JR NZ,.7932 LD A,(IX+IX_08) CPL AND 0FH LD (IX+IX_16),A JR .793D .7932 RES 7,A LD HL,D7E88 CALL L78CE CALL L7970 .793D BIT 6,(IX+IX_00) JR NZ,L795E LD C,(IX+IX_01) LD A,(IX+IX_12) AND 0FH OR C CALL L7B33 LD A,(IX+IX_12+0) AND 0F0H OR (IX+IX_12+1) RRCA RRCA RRCA RRCA CALL L7B33 L795E LD A,(IX+IX_01) ADD A,10H OR (IX+IX_16) JP L7B33 DB 90H,0B0H,0D0H,0F0H L796D LD (IX+IX_0E),A L7970 PUSH HL LD A,(IX+IX_0E) SRL A PUSH AF LD C,A LD B,00H ADD HL,BC POP AF LD A,(HL) POP HL JR C,.7994 RRCA RRCA RRCA RRCA OR A JR Z,L796D CP 10H JR NZ,.7990 DEC (IX+IX_0E) JR L7970 .7990 CP 20H JR Z,.799F .7994 INC (IX+IX_0E) OR 0F0H ADD A,(IX+IX_08) INC A JR C,.79A0 .799F XOR A .79A0 CPL AND 0FH LD (IX+IX_16),A RET L79A7 LD (IX+IX_0F),A L79AA PUSH HL LD A,(IX+IX_0F) SRL A PUSH AF LD C,A LD B,00H ADD HL,BC POP AF LD A,(HL) POP HL JR C,.79CE RRCA RRCA RRCA RRCA OR A IF OPT1 JR Z,L79A7 ELSE JP Z,L79A7 ENDIF CP 10H JR NZ,.79CE DEC (IX+IX_0F) JR L79AA IF OPT1 ELSE ;L79CB ; *** UNREACHABLE *** CP 20H RET Z ENDIF .79CE INC (IX+IX_0F) CPL AND 0FH LD L,A LD H,00H EX DE,HL ADD HL,DE LD (IX+IX_12+0),L LD (IX+IX_12+1),H RET L79E0 LD E,(IX+IX_03+0) LD D,(IX+IX_03+1) .79E6 LD A,(DE) INC DE CP 0E0H JP NC,.7A74 ; branch if >= E0 BIT 3,(IX+IX_00) JR NZ,.7A53 OR A JP P,.7A2F SUB 80H JR Z,.79FE ADD A,(IX+IX_05) .79FE LD HL,D7B66 ; address of note lookup table LD C,A ; HL = HL + A*2 LD B,00H ADD HL,BC ADD HL,BC LD A,(HL) ; IX_10 = frequency LD (IX+IX_10+0),A INC HL LD A,(HL) LD (IX+IX_10+1),A BIT 5,(IX+IX_00) JR Z,.7A6D LD A,(DE) INC DE SUB 80H ADD A,(IX+IX_05) LD HL,D7B66 ; address of note lookup table LD C,A ; HL = HL + A*2 LD B,00H ADD HL,BC ADD HL,BC LD A,(HL) ; IX_14 = frequency LD (IX+IX_14+0),A INC HL LD A,(HL) LD (IX+IX_14+1),A .7A2D LD A,(DE) .7A2E INC DE .7A2F PUSH DE LD H,A LD E,(IX+IX_02) CALL L7BF8 POP DE LD (IX+IX_0A+0),L LD (IX+IX_0A+1),H .7A3E XOR A LD (IX+IX_0E),A LD (IX+IX_0F),A LD (IX+IX_03+0),E LD (IX+IX_03+1),D IF OPT1 ELSE XOR A ; *** redundant *** ENDIF LD (IX+IX_0C+0),A LD (IX+IX_0C+1),A RET .7A53 LD (IX+IX_10+1),A LD A,(DE) INC DE LD (IX+IX_10+0),A BIT 5,(IX+IX_00) JR Z,.7A2D LD A,(DE) INC DE LD (IX+IX_14+1),A LD A,(DE) INC DE LD (IX+IX_14+0),A JR .7A2D .7A6D LD A,(DE) OR A JP P,.7A2E JR .7A3E ; >= E0 .7A74 LD HL,.7A87 PUSH HL AND 1FH ; but what if it's F0-FF? LD HL,D7A8B LD C,A LD B,00H ADD HL,BC ADD HL,BC LD A,(HL) INC HL LD H,(HL) LD L,A JP (HL) .7A87 INC DE JP .79E6 ; only E2, E5, EF used? D7A8B DW L7AAC ; E0 DW L7AAD ; E1 DW L7AF3 ; E2 - end DW L7AB2 ; E3 DW L7AC9 ; E4 DW L7AD3 ; E5 xx xx - reset sound pointer DW L7AD9 ; E6 DW L7AD9 ; E7 DW L7AD9 ; E8 DW L7AD9 ; E9 DW L7B13 ; EA DW L7B13 ; EB DW L7B14 ; EC DW L7ACE ; ED DW L7AAB ; EE DW L7ADA ; EF - do something, then end IF OPT1 ; EE L7AAB ; E0 L7AAC ELSE ; EE L7AAB LD A,(DE) ; *** redundant *** ; E0 L7AAC LD A,(DE) ; *** redundant *** ENDIF ; E1 L7AAD LD A,(DE) LD (IX+IX_08),A RET ; E3 L7AB2 LD A,(DE) OR 0E0H PUSH AF CALL L7B33 POP AF OR 0FCH INC A JR NZ,.7AC4 RES 6,(IX+IX_00) RET .7AC4 SET 6,(IX+IX_00) RET ; E4 L7AC9 LD A,(DE) LD (IX+IX_07),A RET ; ED L7ACE LD A,(DE) LD (IX+IX_06),A RET ; E5 xx xx - reset sound pointer L7AD3 EX DE,HL LD E,(HL) INC HL LD D,(HL) DEC DE RET ; E6, E7, E8, E9 L7AD9 RET ; EF L7ADA LD A,82H LD (DC2D2),A LD A,14H LD (DC2D3),A LD HL,DC2D4_1 RES 2,(HL) XOR A LD (DC2D4_1+IX_08),A LD (DC2D4_2+IX_08),A LD (DC2D4_3+IX_08),A ; E2 - end L7AF3 XOR A LD (DC2D1),A LD (IX+IX_00),A LD HL,DC2D4_2 RES 2,(HL) LD HL,DC2D4_3 RES 2,(HL) LD HL,DC2D4_4 RES 2,(HL) LD A,0E4H OUT (PSG),A CALL L7B2C POP HL ; pop return address back to sound routines POP HL RET ; EA, EB L7B13 RET ; EC L7B14 LD A,(DE) INC DE ADD A,17H LD C,A LD B,00H PUSH IX POP HL ADD HL,BC LD A,(HL) OR A JR NZ,.7B25 LD A,(DE) LD (HL),A .7B25 INC DE DEC (HL) IF OPT1 JR NZ,L7AD3 ELSE JP NZ,L7AD3 ENDIF INC DE RET L7B2C LD A,(IX+IX_01) ADD A,10H OR 0FH L7B33 BIT 2,(IX+IX_00) RET NZ OUT (PSG),A RET ; initialize PSG L7B3B PUSH HL PUSH DE PUSH BC LD HL,DC2D1 LD DE,DC2D1+1 LD BC,DC391-DC2D1-1 ; 00BFH LD (HL),00H LDIR POP BC POP DE POP HL PUSH HL PUSH DE PUSH BC LD HL,D7B62 IF OPT1 LD BC, N7B62*256+PSG ELSE LD C,PSG ; ***not optimal*** LD B,N7B62 ENDIF OTIR XOR A LD (DC2D1),A POP BC POP DE POP HL RET D7B62 DB 9FH,0BFH,0DFH,0FFH ; PSG initialization N7B62 EQU $-D7B62 ; music notes conversion table D7B66 DW 000H IF 0 ; these may be a little more in tune DW 3F8H,3BFH,389H,356H,327H,2F9H,2CEH,2A6H,280H,25CH,23AH,21AH ; A110 DW 1FCH,1DFH,1C4H,1ABH,193H,17CH,167H,153H,140H,12EH,11DH,10DH ; A220 DW 0FEH,0EFH,0E2H,0D5H,0C9H,0BEH,0B3H,0A9H,0A0H,097H,08EH,086H ; A440 DW 07FH,077H,071H,06AH,064H,05FH,059H,054H,050H,04BH,047H,043H ; A880 DW 03FH,03BH,038H,035H,032H,02FH,02CH,02AH,028H,025H,023H,021H ; A1760 DW 01FH,01DH,01BH,01AH,018H,017H,015H,014H,013H,012H,011H,010H ; A3520? ELSE DW 3FFH,3C7H,390H,35DH,32DH,2FFH,2D4H,2ABH,285H,261H,23FH,21EH ; A110? DW 200H,1E3H,1C8H,1AFH,196H,180H,16AH,156H,143H,130H,11FH,10FH ; A220? DW 100H,0F2H,0E4H,0D7H,0CBH,0C0H,0B5H,0ABH,0A1H,098H,090H,088H ; A440? DW 080H,079H,072H,06CH,066H,060H,05BH,055H,051H,04CH,048H,044H ; A880? DW 040H,03CH,039H,036H,033H,030H,02DH,02BH,028H,026H,024H,022H ; A1760? DW 020H,01EH,01CH,01BH,019H,018H,016H,015H,014H,013H,012H,011H ; A3520? ENDIF L7BF8 LD D,00H LD L,D LD B,08H .7BFD ADD HL,HL JR NC,.7C01 ADD HL,DE .7C01 DJNZ .7BFD RET L7C04 LD B,08H .7C06 ADC HL,HL LD A,H JR C,.7C0E CP E JR C,.7C11 .7C0E SUB E LD H,A OR A .7C11 DJNZ .7C06 LD A,L RLA CPL RET ;----------------------------------------------------------------------- ; sound data ; music 81H - background music? D7C17 DB 03H DB 80H,80H,02H DW D7C33 DB 0F4H,01H,04H,0DH DB 80H,0A0H,02H DW D7C7C DB 0F4H,01H,04H,0CH DB 80H,0C0H,02H DW D7CC2 DB 00H,02H,05H,0BH D7C33 HEX A8 20 A7 08 A8 AA 30 AA HEX 20 A8 08 AA AC 30 B1 18 HEX 08 B0 B1 B1 18 B0 B1 30 HEX B1 0C 80 AC A8 AA 09 AC HEX 09 1E AA 09 AC 09 1E B0 HEX 09 B1 09 1E B3 09 B4 09 HEX 1E AC 1E AA 09 A8 A7 18 HEX A4 0C A0 A5 0C 80 12 A3 HEX 09 A5 A5 0C 80 24 E5 DW D7C33 D7C7C HEX A5 20 A4 08 A5 A7 18 AC HEX A7 20 A5 08 A7 A8 18 A5 HEX AC 18 08 08 08 AA 18 18 HEX A8 30 A8 0C 80 AC A8 A7 HEX 09 A8 09 1E A7 09 A8 09 HEX 1E AC 09 09 1E 09 09 1E HEX A5 1E 09 A8 A0 18 0C 0C HEX 9C 0C 80 12 9B 09 9C 9C HEX 0C 80 24 E5 DW D7C7C D7CC2 HEX 8D 09 99 8D 0C 99 8D 06 HEX 8C 09 98 8C 0C 98 8C 06 HEX 8B 09 97 8B 0C 97 8B 06 HEX 89 09 95 89 0C 95 89 06 HEX 89 09 95 89 0C 95 89 06 HEX 88 09 94 88 0F 8A 09 8C HEX 06 8D 09 99 8D 0C 99 8D HEX 06 99 0C 80 24 8D 09 99 HEX 8D 06 80 8D 09 09 8C 09 HEX 98 8C 06 80 8C 09 09 8B HEX 09 97 8B 06 80 8B 09 09 HEX 8A 09 96 8A 06 80 8A 09 HEX 09 89 09 95 89 06 80 89 HEX 09 09 88 09 94 88 06 80 HEX 88 09 09 8D 0C 80 12 88 HEX 09 8D 8D 0C 80 88 09 8A HEX 8C 06 E5 DW D7CC2 ; music 82H - battle? / bump into tower D7D47 DB 02H DB 0A8H,0A0H,04H DW D7D5A DB 03H,01H,01H,0FH DB 0A8H,0E0H,04H DW D7D60 DB 03H,01H,01H,0EH D7D5A HEX 00 14 00 14 01 E2 D7D60 HEX E3 07 00 30 00 80 03 E2 ; music 83H - something's coming D7D68 DB 02H DB 0A8H,0A0H,01H DW D7D7B DB 03H,03H,00H,0EH DB 0A8H,0C0H,01H DW D7D81 DB 03H,00H,00H,0EH D7D7B HEX 01 00 01 F0 0A E2 D7D81 HEX 01 90 02 80 0A E2 ; music 84H D7D87 DB 03H DB 80H,80H,01H DW D7DA3 DB 03H,03H,00H,0EH DB 80H,0A0H,01H DW D7DAC DB 03H,00H,00H,0DH DB 80H,0C0H,01H DW D7DB5 DB 03H,03H,00H,0DH D7DA3 HEX 99 04 9D A0 9E 9B 98 99 E2 D7DAC HEX 8D 04 8A 86 88 8A 86 8D E2 D7DB5 HEX 96 04 99 9D 9B 98 94 96 EF ; music 85H - title screen music D7DBE DB 03H DB 80H,80H,06H DW D7DDA DB 03H,01H,04H,0EH DB 80H,0A0H,06H DW D7E03 DB 03H,00H,04H,0EH DB 80H,0C0H,06H DW D7E0D DB 03H,03H,04H,0EH D7DDA HEX A2 02 A4 A5 A4 01 A2 A4 HEX 04 A0 9E 02 A0 A2 A0 01 HEX 92 9D 08 A2 02 A4 A5 A4 HEX 01 A2 A4 04 A9 02 A5 A4 HEX 02 A5 A7 A5 01 98 96 08 HEX E2 D7E03 HEX 8A 08 88 86 85 8A 88 85 HEX 8A E2 D7E0D HEX 99 02 9B 9D 9B 01 99 9B HEX 04 98 9B 02 9D 9E 9D 01 HEX 9B 98 08 99 02 9B 9D 9B HEX 01 99 9B 04 A2 02 9D A0 HEX 02 A2 A4 A2 01 A0 9D 08 HEX E2 ; music 86H - everybody dead game over D7E36 DB 03H DB 80H,80H,04H DW D7E52 DB 03H,01H,04H,0DH DB 80H,0A0H,04H DW D7E62 DB 03H,00H,04H,0CH DB 80H,0C0H,04H DW D7E75 DB 03H,01H,04H,0DH D7E52 HEX A3 04 A2 A0 A2 A0 9F A0 HEX 9B 08 A3 A2 04 A0 10 E2 D7E62 HEX 88 04 8F 8C 8A 8A 02 8B HEX 8D 04 88 87 08 8B 8A 04 HEX 88 10 E2 D7E75 HEX 9B 04 99 97 99 99 02 9B HEX 9C 04 9B 93 08 9B 99 04 HEX 98 10 E2 ;----------------------------------------------------------------------- D7E88 DW D7E94,D7E9B,D7E9D,D7EA6,D7EB0,D7EB0 D7E94 DB 0FFH,0EEH,0DDH,0BBH,0AAH,99H,02H D7E9B DB 0FFH,02H D7E9D DB 0FFH,0EDH,0CAH,8BH,0AAH,0BBH,0A8H,75H,01H D7EA6 DB 0DEH,0EEH,0EFH,0FEH,0EDH,0DCH,0CBH,0BAH,0A8H,01H D7EB0 DB 0EEH,0FFH,0EEH,0DDH,0CCH,0CBH,0BAH,0A9H,02H D7EB9 DW D7EC1,D7EC6,D7EC9,D7ECC D7EC1 DB 0EEH,0FFH,0EEH,0DDH,00H D7EC6 DB 0FFH,0EEH,00H D7EC9 DB 0FFH,0EFH,00H D7ECC DB 0FFH,0EEH,0FFH,00H,0FFH ;----------------------------------------------------------------------- ; add BCD number in A to BCD number at (HL), length B L7ED1 OR A .7ED2 ADC A,(HL) DAA LD (HL),A INC HL LD A,00H DJNZ .7ED2 RET ;----------------------------------------------------------------------- IF OPT1 ; delay 2000H X7EDB LD BC,2000H ENDIF ; delay L7EDB EX (SP),HL EX (SP),HL EX (SP),HL EX (SP),HL DEC BC LD A,B OR C JR NZ,L7EDB RET ;----------------------------------------------------------------------- ; fill memory: HL=address, BC=length, A=fill byte L7EE5 LD (HL),A INC HL DEC BC LD D,A LD A,B OR C LD A,D JR NZ,L7EE5 RET ;----------------------------------------------------------------------- ; copy data to all three pattern tables: HL=data, DE=VRAM addr, BC=length L7EEF LD A,03H ; copy data to multiple pattern tables: HL=data, DE=VRAM addr, BC=length, A=ntables L7EF1 PUSH AF PUSH BC PUSH HL CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length LD B,08H ADD HL,BC EX DE,HL POP HL POP BC POP AF DEC A JR NZ,L7EF1 RET ;----------------------------------------------------------------------- IF OPT1 ELSE ; *** UNREACHABLE *** ; do nothing in a vertical column to VRAM (leave position at end of column?) L7F02 CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data LD DE,0020H ; move VDP address down one line ADD HL,DE DEC C JR NZ,L7F02 RET ;----------------------------------------------------------------------- ; *** UNREACHABLE *** ; write vertical column to VRAM: HL=VRAM addrss, DE=data, BC=height L7F0D LD A,(DE) ; get next data byte CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data PUSH BC LD BC,0020H ; move VDP address down one line ADD HL,BC INC DE ; increment data pointer POP BC DEC BC ; decrement counter LD A,C OR B JR NZ,L7F0D ; loop for rest of column RET ENDIF ;----------------------------------------------------------------------- ; put rectangular data on screen: B=height, C=width, DE=VRAM addr, HL=data L7F1E PUSH BC ; save line counter LD B,00H ; high byte of length = 0 CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length => HL=VRAM addr, DE=next data LD BC,0020H ; move VRAM addr to next line ADD HL,BC EX DE,HL ; unswap VRAM addr / data addr POP BC ; get back line counter DJNZ L7F1E ; loop for next line RET ;----------------------------------------------------------------------- ; print message group: DE=messages L7F2D LD A,(DE) ; get number of messages LD B,A .7F2F INC DE ; get address of next message LD A,(DE) LD L,A INC DE LD A,(DE) LD H,A PUSH DE PUSH BC CALL L7F3F ; print message with screen address POP BC POP DE DJNZ .7F2F ; loop for next message RET ;----------------------------------------------------------------------- ; print message with screen address L7F3F LD E,(HL) ; get screen address INC HL LD D,(HL) INC HL LD C,(HL) ; get message length LD B,00H INC HL IF OPT2 JR L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length ELSE CALL L7F90 ; VRAM write: HL=data, DE=VRAM addr, BC=length RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- ; initialize VDP registers L7F4B LD C,07H ; start with VDP register 7 .7F4D LD B,(HL) CALL L7F73 ; write VDP register: C=register, B=data INC HL DEC C ; decrement VDP register number JP P,.7F4D ; loop until all eight VDP registers set XOR A ; data = 0 LD H,A ; VRAM addr = 0 LD L,A LD BC,4000H ; length = 16K IF OPT2 JR L7F81 ; fill VRAM: HL=VRAM addr, BC=length, A=fill char => HL,AF saved ELSE CALL L7F81 ; fill VRAM: HL=VRAM addr, BC=length, A=fill char => HL,AF saved RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- ; *** always called with B=E0 *** ; unblank screen L7F60 LD A,0E0H ; 16K, no blank, int enable L7F62 LD C,01H ; VDP register 1 OR B LD B,A IF OPT2 JR L7F73 ; write VDP register: C=register, B=data ELSE CALL L7F73 ; write VDP register: C=register, B=data RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- ; *** always called with HL=3B00, B=A0 *** ; blank screen L7F6A LD A,0D0H ; end of sprite list marker CALL L7FB5 ; write one byte to VDP: HL=VRAM address, A=data LD A,0A0H ; 16K, blank, int enable JR L7F62 ;----------------------------------------------------------------------- ; write VDP register: C=register, B=data L7F73 LD A,B IF COLECO LD (IY-1),1 ; set lockout flag and clear "NMI happened" flag ELSE DI ENDIF OUT (VDPcmd),A LD A,C OR 80H OUT (VDPcmd),A IF COLECO RES 0,(IY-1) ; clear lockout flag BIT 1,(IY-1) ; test "NMI happened" flag JR Z,.10 ; if NMI flag set, read status register IN A,(VDPstat) .10 ELSE EI ENDIF RET IF COLECO ELSE L7F7E IN A,(VDPstat) ; *** UNREACHABLE *** RET ENDIF ;----------------------------------------------------------------------- ; fill VRAM: HL=VRAM addr, BC=length, A=fill char => HL,AF saved L7F81 PUSH AF CALL L7FCA ; set VRAM drite address: HL=VRAM address L7F85 POP AF ; fill VRAM: BC=length, A=fill char L7F86 OUT (VDPdata),A PUSH AF DEC BC LD A,C OR B JR NZ,L7F85 POP AF RET ;----------------------------------------------------------------------- ; VRAM write: HL=data, DE=VRAM addr, BC=length => HL=VRAM addr, DE=next data L7F90 EX DE,HL CALL L7FCA ; set VRAM drite address: HL=VRAM address ; print a raw message, DE=message, BC=length L7F94 LD A,(DE) OUT (VDPdata),A INC DE DEC BC LD A,C OR B JR NZ,L7F94 RET ;----------------------------------------------------------------------- ; VRAM read: HL=VRAM address, DE=data, BC=length => HL=VRAM addr, DE=next data L7F9E CALL L7FBF ; set VRAM read address: HL=VRAM address EX (SP),HL EX (SP),HL .7FA3 IN A,(VDPdata) LD (DE),A INC DE DEC BC LD A,C OR B JR NZ,.7FA3 RET ;----------------------------------------------------------------------- ; read one byte from VDP: HL=VRAM address => A=data L7FAD CALL L7FBF ; set VRAM read address: HL=VRAM address EX (SP),HL EX (SP),HL IN A,(VDPdata) RET ;----------------------------------------------------------------------- ; write one byte to VDP: HL=VRAM address, A=data L7FB5 PUSH AF CALL L7FCA ; set VRAM drite address: HL=VRAM address EX (SP),HL ; delay a moment EX (SP),HL POP AF OUT (VDPdata),A RET ;----------------------------------------------------------------------- ; set VRAM read address: HL=VRAM address L7FBF LD A,L IF COLECO LD (IY-1),1 ; set lockout flag and clear "NMI happened" flag ELSE DI ENDIF OUT (VDPcmd),A LD A,H AND 3FH OUT (VDPcmd),A IF COLECO RES 0,(IY-1) ; clear lockout flag BIT 1,(IY-1) ; test "NMI happened" flag JR Z,.10 ; if NMI flag set, read status register IN A,(VDPstat) .10 ELSE EI ENDIF RET ;----------------------------------------------------------------------- ; set VRAM write address: HL=VRAM address L7FCA LD A,L IF COLECO LD (IY-1),1 ; set lockout flag and clear "NMI happened" flag ELSE DI ENDIF OUT (VDPcmd),A LD A,H AND 3FH OR 40H OUT (VDPcmd),A IF COLECO RES 0,(IY-1) ; clear lockout flag BIT 1,(IY-1) ; test "NMI happened" flag JR Z,.10 ; if NMI flag set, read status register IN A,(VDPstat) .10 ELSE EI ENDIF RET ;----------------------------------------------------------------------- IF OPT1 ELSE HEX FF FF FF FF ENDIF ;----------------------------------------------------------------------- ; make sure map row,col are in range? L7FDB LD HL,DC129 ; HL => current column number in map LD A,0FH AND (HL) ; check column LD (HL),A INC HL ; HL => current row number in map at DC12A LD A,0FH AND (HL) ; check row LD (HL),A IF OPT2 JP L31A1 ; delay and wait for joypad button ELSE CALL L31A1 ; delay and wait for joypad button RET ; *** not optimal *** ENDIF ;----------------------------------------------------------------------- IF OPT1 ELSE HEX FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF HEX FF FF FF FF FF ENDIF END Main