[LINKS: Sec 2 | Sec 3 | Sec 4 | Sec 5 | Sec 6 | Sec 7]

 ; SOURCE CODE RELATED TO "Active Life Network" FOUND IN PC-Engine DATA TRACKS!
 ; 
 ; Chris' comments and translations will be in red like this.
 
 ; "7up" is the nickname for the PCE's Video Data Controller.
 ; low7up / hi7up are aliases for the VDC's data write port (low byte & high byte).
 ; Since the PCE CPU is 8 bits, but the VDC takes 16-bit writes, programmers made heavy use of macros that handle 16 bits at a time.
 ; "movmw" is a macro used in Hudson's assembler: move word destaddr, srcaddr 

		movmw	low7up,angel_y
		movmw	low7up,angel_x
		moviw	low7up,$40
		moviw	low7up,$0080             ; "moviw" means move immediate word data
		rts


;<<<天使の消去>>>   ; "Erase Angel" 
era_angel:
		setreg	mawr  				; set VDC Memory Address Write Register
		moviw	low7up,satbuf		; point to VDC's Sprite Attribute Buffer
		setreg	vwr  				; Set VDC VRAM Write Register
		lda	#4
angel_off_l0:	
		stz	low7up  			; 8-bit write to VDC low port
		stz	hi7up  			; 8-bit write to VDC high port
		dec	a
		bne	angel_off_l0
		rts


;<<<パレットの0クリア>>>  	; "Clear Palette 0"
clr_color:
		clx
clr_color_l0:
		stz	palbg,x
		inx
		cpx	#16*2  			; Just clear 16 words in RAM
		bne	clr_color_l0
		movb	color_cmd,#2  		; Just an 8-bit move macro to forgo the "LDA #2 / STA addr" tedium
		rts


;<<<キーキャラの表示>>>  	; "Display KEY Characters"
dsp_key:
		;入力:funckey = 表示/非表示のフラグ  	; "Input: funckey = show/hide flag"
		;		bit0 --- 選択  		; "choose"
		;		bit1 --- 決定  		; "decide"
		;		bit2 --- 取消  		; "cancel"
		;		bit3 --- ヘルプ  		; "help"

		;SATBは、[選択]=1+2、[決定]=3+4、  	; "(Each of the above options uses 2 SATB entries.)"
		;[取消]=5+6、[ヘルプ]=7+8をそれぞれ使います。

		lda	funckey
		bit	#%00000001
		beq	dsp_key_n0
		setreg	mawr
		moviw	low7up,satbuf+4
		setreg	vwr
		tia	key_dat,low7up,16
dsp_key_n0:
		lda	funckey
		bit	#%00000010
		beq	dsp_key_n1
		setreg	mawr
		moviw	low7up,satbuf+4+8
		setreg	vwr
		tia	key_dat+16,low7up,16
dsp_key_n1:
		lda	funckey
		bit	#%00000100
		beq	dsp_key_n2
		setreg	mawr
		moviw	low7up,satbuf+4+16
		setreg	vwr
		tia	key_dat+32,low7up,16
dsp_key_n2:
		lda	funckey
		bit	#%00001000
		beq	dsp_key_n3

		rts	;=======>>  ヘルプは出さない  	; "Help is not given." (!?!)

		setreg	mawr
		moviw	low7up,satbuf+4+24
		setreg	vwr
		tia	key_dat+48,low7up,16
dsp_key_n3:
		rts



key_dat:	dw	13*16+64,0+32,$48,$0181
		dw	13*16+64,32+32,$68,$0081

		dw	13*16+64,64+32,$4c,$0181
		dw	13*16+64,96+32,$6c,$0081

		dw	13*16+64,128+32,$50,$0181
		dw	13*16+64,160+32,$70,$0181

		dw	13*16+64,192+32,$54,$0181
		dw	13*16+64,224+32,$74,$0181



;<<<キーキャラの消去>>>  	; "Erase KEY Characters"
era_key:
		setreg	mawr
		moviw	low7up,satbuf+4
		setreg	vwr
		clx
era_key_l0:
		stz	low7up
		stz	hi7up
		inx
		cpx	#8*4
		bne	era_key_l0
		rts


;<<<乱数を得る>>>  		 ; "Get Random Number"
getrnd:
		;入力:AREG = 最大値 		 		; "Input: A Register = Max Value"
		;出力:AREG = 0〜(最大値−1)迄の乱数  	; "Output: A Reg = Random Value from 0-(Max-1)"
		sta	_bl
		stz	_bh
		jsr	ex_rnd
		sta	_al  		; _AL & _AH->_AX;BL,BH,... are variables used by the CD BIOS as 16-bit pseudo registers
		stz	_ah
		jsr...
; 1st section of code was cut off here.

...
		...	17B,$0099,$00DB,$0061,$0051,$01FF	;10
	dw	$0000,$0049,$00DE,$00DB,$00E9,$01B6,$004F,$0000	;20
	dw	$0000,$0000,$0000,$0000,$0000,$0000,$0000,$01FF	;30
	dw	$0000,$00F0,$017D,$009E,$00A2,$013B,$004B,$00DA	;40
	dw	$016D,$0038,$0061,$00FB,$00DB,$0020,$0010,$01FF	;50
	dw	$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000	;60
	dw	$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000	;70


 ; 
 ; 

logosat		equ	satbuf
logofont	equ	bgchar




;mac21のロゴの移動  		; "Move MAC21 Logo"
mac21_logo:
		stz	logotype
movlogo_loop:
		stz	logono
		movb	logox,#240
		mulb	logotype,#48 			 ; an 8-bit multiply macro?
		lda	_cl
		add	#32
		sta	endx
movlogo_lp:	jsr	dsplogo
		wait	1  				; It's a macro/subroutine that waits here for 1 VBlank
		lda	logono
		inc	a
		and	#7
		sta	logono
		lda	logox
		sub	#6
		sta	logox
		cmp	endx
		bcs	movlogo_lp

		stz	logono
		jsr	dsplogo

		lda	logotype
		inc	a
		sta	logotype
		cmp	#4
		bne	movlogo_loop

		wait	5

		;presents
		movb	logox,#240
pslp:		jsr	dsp_presents
		jsr	ex_vsync
		dec	logox
		lda	logox
		cmp	#16*4
		bne	pslp

		wait	50

		;upscroll
		moviw	logoy,4*16
mcusl1:
		movb	logono,#0
mcusl0:
		setreg	mawr
		lda	logono
		asl	a
		asl	a
		sta	_al
		stz	_ah
		addiw	_ax,satbuf  		; "add immediate word" macro (Here it's adding the address of the SATB to _AX.)
		movmw	low7up,_ax
		setreg	vwr
		moviw	_ax,0
		lda	logono
		cmp	#8
		bcc	mcusn0
		moviw	_ax,6*16
mcusn0:		addib	_ax,64
		addmw	_ax,logoy
		movmw	low7up,_ax

		inc	logono
		lda	logono
		cmp	#16
		bne	mcusl0

		jsr	ex_vsync

		inc	logoy
		lda	logoy
		cmp	#14*16
		beq	mcusn1
		jmp	mcusl1
mcusn1:		rts

mojino:		db	0



dsp_presents:
		stz	mojino
		setreg	mawr
		moviw	low7up,logosat+(4*8)
		setreg	vwr
dpl0:
		moviw	low7up,10*16+64
		lda	mojino
		asl	a
		asl	a
		asl	a
		asl	a
		add	logox
		bcs	dpn0
		sta	_al
		stz	_ah
		addib	_ax,32
		movmw	low7up,_ax
		lda	mojino
		asl	a
		add	#17
		asl	a
		sta	_al
		stz	_ah
		addiw	_ax,logofont/$20
		movmw	low7up,_ax
		moviw	low7up,$82
		lda	mojino
		inc	a
		sta	mojino
		cmp	#8
		bne	dpl0
dpn0:		rts


logotype:	db	0
logono:	db	0
logox:		db	0
		db	0
logoy:		db	0
		db	0
end


 ; 2nd section of code was cut off here.

e:\pcxxxxxx\binxxxxx\bestxxxx.bin 89/07/21 17:33 ; A date! July 21, 1989 ; chgpal: ;割り込みによるパレット変化ルーチン ; "Palette changing routine using an interrupt" dec int_count bne cpret movb int_count,#10 lda int_pal_no tax lda int_pal_dat,x asl a asl a asl a sta palbg+$06*2 adc #8 sta palbg+$05*2 adc #8 sta palbg+$04*2 adc #8 sta palbg+$03*2 lda int_pal_no inc a cmp #6 bne cpn0 cla cpn0: sta int_pal_no movb color_cmd,#2 cpret: rts int_pal_no: db 0 int_pal_dat: db 0,1,2,3,2,1 int_count: db 10 ;−−−−−−−− 検索ルーチン −−−−−−−− ; "Search Routine" best_search: ;−−−検索中の表示−−− ; "Display [something] while searching" picload search ; A macro to load an entire BAT+Tile data into VRAM pcms search ; Hmmm, but what does this macro do? jsr fin window 4,16,26,18 ; Macros to draw boxes and position text locate 4,16 print "  ただ今検索中です。" ; "Now Searching." locate 4,18 print " しばらくお待ち下さい" ; "Please Wait" ldx #low chgpal ldy #high chgpal lda #$04 ;sync jsr ex_setvec smb4 irq_m moviw pointer,passed_man moviw total_man_no,0 moviw recno,mac_bin_LW movb recno+2,#mac_bin_HI search_loop: ;読み込み。 ; "Load [Data]" lda recno+2 sta _CL lda recno+1 sta _CH lda recno sta _DL lda #1 sta _DH lda #low yourdata sta _BL lda #high yourdata sta _BH lda #13 ;26624byte sta _AL jsr cd_read ; This is the CD BIOS routine for loading in sectors. stz man_no moviw source,yourdata ;メモリーが足りなければ、jmp next_manを、スタックを使ったrtsに出来るだろう。 ; "If we run out of memory, we can keep the RTS location on the stack and just jmp next_man, right?" search_100lp: s1: ;−−−性別−−− ; "Gender" ;1) 性別 cly lda [source],y cmp selfdata+0 bne s2 jmp next_man ;−−−結婚環境−−− ; "Marital Environment" (?) s2: ;2) 学歴 ; "Education" lda member_no cmp #1 bne s2n1 ldy #19 lda [source],y sub selfdata+90 beq s3 dec a beq s3 jmp next_man s2n1: ldy #19 lda [source],y cmp selfdata+90 bcs s3 jmp next_man s3: ;3) 結婚歴 ; "Marital History" lda selfdata+91 cmp #1 bne s4 ldy #20 lda [source],y cmp #1 beq s4 jmp next_man s4: ;4) 子供の有無 ; "Any children?" lda selfdata+92 cmp #1 bne s5 ldy #21 lda [source],y cmp #1 beq s5 jmp next_man s5: ;5) 養子縁組 ; "Adoption" ldx selfdata+31 ldy #31 lda [source],y tay lda member_no cmp #1 beq s5n0 sxy s5n0: cpx #2 bne s6 cpy #1 bne s6 jmp next_man s6: ;6) 同居義務 ; "Need to Live Together" lda selfdata+30 cmp #2 bne s7 ldy #29 lda [source],y cmp #1 bne s7 jmp next_man s7: ;7) 年齢 ; "Age" lda selfdata+13 ldy #13 sec sbc [source],y cmp #20+1 bcc s7n0 cmp #256-20 bcs s7n0 jmp next_man s7n0: sta s7work ;s7work = 自生年 - 相生年 ; "s7work = my D.O.B. minus partner's D.O.B." lda selfdata+87 ;希望年齢コード ; "Desired Age Code" cmp #1 bne s7n1 ;=1 ldx s7work lda s7table,x cmp selfdata+88 beq s8 jmp next_man s7n1: cmp #2 bne s7n2 ;=2 lda s7work eor #255 tax lda s7table,x cmp selfdata+88 beq s8 jmp next_man s7n2: cmp #3 bne s7n3 ;=3 lda s7work add #3 cmp #6+1 bcc s8 jmp next_man s7n3: ;=4 lda s7work add #7 ldx member_no cpx #1 beq s7n3n0 add #3-7 s7n3n0: cmp #10+1 bcc s8 jmp next_man s7work: db 0 s7table: db 0,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3 ;−−−身体・健康 ; "Physical / Health" s8: ;8) 身長 ; "Height" lda selfdata+83 ldy #23 sec sbc [source],y beq s9 cmp #1 beq s9 cmp #255 beq s9 jmp next_man s9: ;9) 体型 ; "Body Type" ldx selfdata+84 ldy #24 lda [source],y tay cpx #1 bne s9n0 cpy #3 bne s10 jmp next_man s9n0: cpx #3 bne s10 cpy #1 bne s10 jmp next_man s10: ;10)メガネ ; "Glasses" ldx selfdata+85 ldy #26 lda [source],y tay cpx #1 bne s10n0 cpy #1 bne s11 jmp next_man s10n0: cpx #2 bne s11 cpy #1 bne s10n1 jmp next_man s10n1: cpy #3 bne s11 jmp next_man s11: ;11)健康状態 ; "Physical Condition" lda selfdata+86 cmp #1 bne s12 ldy #25 lda [source],y cmp #3 bne s12 jmp next_man ;−−−経済状況−−− ; "Economic Condition" s12: ;12)年収 ; "Annual Income" lda member_no cmp #1 bne s12n1 ldy #22 lda [source],y sub selfdata+89 beq s13 dec a beq s13 jmp next_man s12n1: ldy #22 lda [source],y sub selfdata+89 jcc next_man cmp #3 bcc s13 jmp next_man ;−−−ライフスタイル−−− ; "Lifestyle" s13: ;13)ライフスタイル ldy #81 lda [source],y tax ldy selfdata+81 tya cmp #%00000001 bne s13n0 txa cmp #%00001000 beq s13n s13n0: tya cmp #%00000010 bne s13n1 txa cmp #%00000100 beq s13n cmp #%00010000 beq s13n s13n1: tya cmp #%00000100 bne s13n2 txa cmp #%00000010 beq s13n s13n2: tya cmp #%00001000 bne s13n3 txa cmp #%00000001 beq s13n s13n3: tya cmp #%00010000 bne s14 txa cmp #%00000010 bne s14 s13n: jmp next_man ;−−−性格−−− ; "Personality" s14: ;14)性格 ldy #82 lda [source],y bit #%00001001 beq s14e lda selfdata+82 bit #%00001001 beq s14e jmp next_man s14e: ; "The person passed the screening, so they will be registered as a candidate." ; "The registration method is to add their serial number to the list." ;審査にパスしたので、候補として登録する。 ;登録の方法は、通し番号を並べていくやり方です。 movb [pointer],total_man_no addib pointer,1 movb [pointer],total_man_no+1 addib pointer,1 addib selected_no,1 ;次の人物を調べる ; "Search for Next Person" next_man: addiw source,265 addib total_man_no,1 inc man_no lda man_no cmp #100 beq next_100 cmp yourdata+($800*13)-1 beq next_100 jmp search_100lp ;次の100人を調べる ; "Search for Next 100 People" next_100: addib recno,13 lda yourdata+($800*13)-1 bne end_of_data jmp search_loop ;−−−審査終了 ; "End of Search/Screening" end_of_data: movb [pointer],#$ff addib pointer,1 movb [pointer],#$ff tii passed_man,selected,10*2 lda selected_no+1 bne eod_n1 ;256人以上の場合 ; "If 256 or more people found" lda selected_no beq eod_n0 ;一人も出なかった場合 ; "If not a single person found" cmp #10+1 bcc eod_n0 ;10人以下だった場合 ; "If 10 or fewer people found" ;審査にパスした人の中から、10人を選ぶ。 ; "Select 10 People from Those Found" eod_n1: moviw destin,selected ldx #10 eod_l0: phx movmw _ax,selected_no jsr rnd16 ; Hmm... is this choosing 10 of them at a time *randomly?* addmw _ax,_ax ; ... this isn't an efficient way to double a 16-bit value... (Not on this CPU.) moviw source,passed_man addmw source,_ax movb [destin],[source] addib source,1 addib destin,1 movb [destin],[source] addib destin,1 plx dex bne eod_l0 ;割り込みの停止 ; "Disable Interrupt(s)" eod_n0: jsr fout jsr bgclr rmb4 irq_m jsr ad_stop rts ;return to dispit rnd16: ;in: _ax = max (1 - 65536) ;out:_ax = rnd (0 - 65535) ;broken: _dx movmw _bx,_ax jsr ex_rnd sta _al jsr ex_rnd sta _ah cmpmw _ax,_bx bcc rnd16_n0 jsr ma_div16u movmw _bx,_cx jsr ma_div16u movmw _ax,_dx rnd16_n0: rts man_no: db 0 total_man_no: dw 0 recno: dw 0 dw $ffff selected: ds 10*2 dw $ffff selected_no: dw 0 ;選ばれた人の数 ; "Number of Chosen People" read_member: ;入力:pointer = 会員のシリアル番号のポインタのポインタ ; "Input: pointer = Pointer to the Pointer [sic] of Member's Serial No." lda [pointer] sta _al ldy #1 lda [pointer],y sta _ah moviw _bx,100 jsr ma_div16u ; a 16-bit division routine ;_CX = 商 ; "_CX = Quotient" ;_DX = 余り ; "_DX = Remainder" movmw data,_dx mulb _cl,#13 ;_CX = 100人単位のレコード番号 ; "_CX = Record Number in Units of 100 People" addiw _cx,mac_bin_LW lda #mac_bin_HI bcc dpn0 inc a dpn0: pha movb _dl,_cl pla sta _cl movb _dh,#1 moviw _bx,yourdata movb _al,#13 ;26624byte jsr cd_read movmw _ax,data moviw _bx,265 jsr ma_mul16u addiw _cx,yourdata ;_cx = data adrs movmw data,_cx ;データ265バイトのバッファーへの転送。 ; "Transfer 265 Bytes of Data to Buffer" movmw source,data moviw destin,one_data moviw length,265 dpl0: movb [destin],[source] addib source,1 addib destin,1 subib length,1 lda length ora length+1 bne dpl0 rts ;-------------- プロフィールの表示 ------------------ ; "Display Profile" dsp_profile: ;各ページの表示ルーチンへ分岐する。 ; "Branch to Display Routine for Each Page" ;in: one_data=会員データ ; "in: one_data = Member Data" lda propage bne dpn1 jmp pro_a dpn1: dec a bne dpn2 jmp pro_b dpn2: dec a bne dpn3 jmp pro_c dpn3: dec a bne dpn4 jmp pro_d dpn4: rts ;ページ1の表示 ; "Display Page 1" pro_a: picload profile1 movb color_cmd,#2 jsr putpic window 2,2,28,26 pa1: ;会員番号 ; "Member Number" locate 2,2 cly ldx #7 pa1l0: lda one_data,y add #$4f sta pa1dat,x inx inx iny cpy #11 bne pa1l0 moviw source,pa1dat jsr dspstr bra pa2 pa1dat: db "番号 " ; "Number" db $82,0 db $82,0 db $82,0 db $82,0 db $82,0 db $82,0 db $82,0 db $82,0 db $82,0 db $82,0 db $82,0 db 0 pa2: ;現住所 ; "Current Address" locate 2,4 print "現住所 " ldy #11 lda one_data,y tax ldy #todofuken ; This is the Japanese catch-all word for "Prefecture". jsr dspcode pa3: ;生育地 ; "Birthplace / Hometown" (maybe) locate 2,6 print "生育地 " ldy #12 lda one_data,y tax ldy #todofuken jsr dspcode pa4: ;生年月日 ; "Birthdate" locate 2,8 print "生年月日‘" ldy #13 lda one_data,y jsr dspdec ; display in decimal, I guess print "年" ; "Year" ldy #14 lda one_data,y jsr dspdec print "月" ; "Month" ldy #15 lda one_data,y jsr dspdec print "日" ; "Day" jmp pa5 pa5: ;血液型 ; "Blood Type" locate 2,10 print "血液型 " ldy #16 lda one_data,y tax ldy #blood jsr dspcode pa6: ;職業 ; "Occupation" locate 2,12 print "職業 " ldy #17 lda one_data,y tax ldy #syokugyou ; Romanization for "Occupation" in Japanese jsr dspcode pa7: ;続柄 ; "Relationship" (perhaps in family, eg: first-born son, etc.) locate 2,14 print "続柄 " ldy #18 lda one_data,y beq pa8 ldx one_data+0 cpx #1 beq pa7n0 add #5 pa7n0: tax ldy #zokugara jsr dspcode pa8: ;学歴 ; "Education" locate 2,16 print "学歴 " ldy #19 lda one_data,y tax ldy #gakureki jsr dspcode pa9: ;結婚歴 ; "Marital History" locate 2,18 print "結婚歴 " ldy #20 lda one_data,y tax ldy #kekkonnreki jsr dspcode pa10: ;子供 ; "Children" locate 16,18 print "子供 " ldy #21 lda one_data,y tax ldy #kodomo jsr dspcode pa11: ;年収 ; "Yearly Income" locate 2,20 print "年収 " ldy #22 lda one_data,y tax ldy #nennsyuu jsr dspcode pa12: ;健康状態 ; "Physical Condition" locate 2,22 print "健康状態 " ldy #25 lda one_data,y tax ldy #kennkou jsr dspcode rts pro_b: picload profile1 movb color_cmd,#2 jsr putpic window 2,2,28,26 pb1: ;身長 ; "Height" locate 2,2 print "身長 " ldy #23 ldx one_data,y ldy #sinntyou jsr dspcode pb2: ;体型 ; "Body Type" locate 2,4 print "体型 " ldy #24 ldx one_data,y ldy #taikei jsr dspcode pb3: ;メガネ ; "Glasses" locate 2,6 print "メガネ等 " ; "Glasses, etc." ldy #26 ldx one_data,y ldy #megane jsr dspcode pb4: ;飲酒 ; "Alcohol (Intake)" locate 2,8 print "飲酒 " ldy #27 ldx one_data,y ldy #sake jsr dspcode pb5: ;喫煙 ; "Smoking" locate 2,10 print "喫煙 " ldy #28 ldx one_data,y ldy #tabako jsr dspcode pb6: ;同居義務(自分) ; "Obligation to Live Together (Self)" locate 2,12 print "同居義務(自分) " ldy #29 ldx one_data,y ldy #doukyo1 jsr dspcode pb7: ;同居義務(相手) ; "Obligation to Live Together (Partner)" locate 2,14 print "同居義務(相手) " ldy #30 ldx one_data,y ldy #doukyo2 jsr dspcode pb8: ;養子縁組 ; "Adoption" locate 2,16 print "養子縁組 " ldx one_data+31 ldy #yousi jsr dspcode pb9: ;趣味 ; "Hobbies" locate 2,18 print "趣味 " ldy #93 ldx one_data,y ldy #hobby jsr dspcode locate 8,20 ldy #94 ldx one_data,y ldy #hobby jsr dspcode locate 8,22 ldy #95 ldx one_data,y ldy #hobby jsr dspcode rts pro_c: picload profile1 movb color_cmd,#2 jsr putpic window 2,2,30,26 pc1: ;スポーツ ; "Sports" locate 2,2 print "スポーツ " ldy #96 ldx one_data,y ldy #sports ; (These constant names sure are helpful.) jsr dspcode locate 12,4 ldy #97 ldx one_data,y ldy #sports jsr dspcode locate 12,6 ldy #98 ldx one_data,y ldy #sports jsr dspcode pc2: ;家族構成 ; "Family Structure" locate 2,8 print "家族構成" locate 2,10 movb pc2work,#32 ldx #7 pc2l0: phx ldy pc2work ldx one_data,y beq pc2n0 ldy #kazoku_zokugara jsr dspcode inc locx ldy pc2work iny cla ldx one_data,y cpx #19 beq pc2n3 lda #100 pc2n3: add #this_year ldy pc2work iny iny ldx one_data,y beq pc2n1 ;生年が0なら pc2n1 へ。 ; "If the birth year is zero, go to pc2n1." sec sbc one_data,y jsr dspdec bra pc2n2 pc2n1: inc locx inc locx inc locx inc locx pc2n2: inc locx ldy pc2work iny iny iny ldx one_data,y ldy #kazoku_works jsr dspcode pc2n0: movb locx,#2 inc locy inc locy lda pc2work add #7 sta pc2work plx dex bne pc2l0 rts pc2work: db 0 pro_d: picload profile2 movb color_cmd,#2 jsr putpic window 17,1,30,24 locate 17,1 moviw source,one_data+103 jsr dspstr rts dspcode: ;in: y = 文字列群の番号 ; "in: y = String Group Number" ; x = 文字列の番号 ; "x = String Number" ; X , Y は保存される。 ; "X, Y are Saved." lda mescode,y sta source lda mescode+1,y sta source+1 addiw source,mescode phx phx cpx #0 beq gnn0 gnl0: lda [source] pha addib source,2 pla cmp #0 bne gnl0 dex bne gnl0 gnn0: jsr dspstr plx ply rts end ; 3rd section of code was cut off here.
; ; This is probably some part of "picload". iny lda [source],y sta _dl iny lda [source],y sta _ch iny movb _dh,#1 moviw _bx,grabuf lda [source],y sta _al jsr cd_read tii grabuf+$7000,palbg,$20 jsr putpic movb color_cmd,#2 lda [source] tax jsr wait addib source,5 jmp q_a_pic picadr: ;for men defpic 10,a1 defpic 10,a2 defpic 10,a3 defpic 05,a4 defpic 05,a3 db 0 defpic 10,b1 defpic 10,b2 defpic 10,b3 defpic 10,b4 db 0 defpic 10,c1 defpic 10,c3 defpic 10,c2 db 0 defpic 10,d1 defpic 10,d3 defpic 10,d2 defpic 10,d4 db 0 defpic 10,e1 defpic 10,e2 defpic 10,e3 db 0 defpic 10,f1 defpic 10,f2 defpic 10,f3 defpic 10,f4 db 0 defpic 10,g4 defpic 10,g2 defpic 10,wm1 db 0 defpic 10,h1 defpic 10,h2 defpic 10,h5 db 0 defpic 10,i2 defpic 10,i1 defpic 10,i3 db 0 defpic 10,j1 defpic 10,j2 defpic 10,j3 db 0 defpic 5,k8 defpic 5,k9 defpic 5,k10 defpic 5,k11 defpic 10,k1 db 0 ;for ladies defpic 10,a2 defpic 10,a1 defpic 10,a3 defpic 10,a4 defpic 5,a3 db 0 defpic 10,b3 defpic 10,b4 defpic 10,b1 defpic 10,b2 db 0 defpic 10,c1 defpic 10,c3 defpic 10,c2 db 0 defpic 10,d1 defpic 10,d3 defpic 10,d2 defpic 10,d5 db 0 defpic 10,g2 defpic 10,g4 defpic 10,wm1 db 0 defpic 10,f9 defpic 10,f10 defpic 10,f5 db 0 defpic 10,g2 defpic 10,g1 defpic 10,g3 defpic 10,g4 defpic 10,g4 db 0 defpic 10,h3 defpic 10,h4 defpic 10,h6 db 0 defpic 10,i4 defpic 10,i6 defpic 10,i5 db 0 defpic 5,k8 defpic 5,k9 defpic 5,k10 defpic 5,k11 defpic 10,k1 db 0 defpic 10,k3 defpic 10,k4 defpic 10,k5 db 0 q_a: q_: picload lessonq jsr fin window 2,8,28,24 locate 2,8 moviw source,q_mesdat ;Question message ldx q_a_no beq q_a_n0 q_a_l0: lda [source] tay addib source,2 cpy #0 ; 4th section of code was cut off here.
; ...albg+$20,$20 movb color_cmd,#2 rts face_colour: dw $000,$000,$049,$049,$092,$092,$0db,$0db dw $124,$124,$16d,$16d,$1b6,$1b6,$1ff,$1ff faceno: dw 0 end ; 5th section of code was cut off here.

[TOP]

; ; Hoho... some C code and other PC-based binaries round out this section. Fileinfo(char *fname) { long length; handle = _open(fname, O_RDONLY); getftime(handle, &ftimep); length = filelength(handle); _close(handle); return(length); } /*[補助関数]エリアnのブロックnnに指定されたファイルを登録する。*/ /* "[Auxiliary Function] Register the File Specified in Area n, Block nn." */ setBlock(int area_no, int block_no, char *fname) {
long flen, bsize, blen; static hwpara[80]; unsigned size, relate; int rp, rps; /*relative pointer*/ bsize = block_size[area_no - 1] * 1024; flen = getFileinfo(fname); blen = (flen + bsize -1) / bsize; /*ファイルサイズがブロックサイズを越えているときの処理1*/ /* "Process 1 When File Size Exceeds Block Size" */ if (flen > bsize) { /*ブロックを消去*/ /* "Delete Block(s)" */ rp = 0; do { sprintf(area_data[block_no + rp++], "*Deleted block*\n"); } while (area_data[block_no + rp][0] == '+'); /*EOBの繰り上げ*/ /* "Advance (Move Up) EOB" */ while (area_data[eob[area_no] - 1][0] == '*') eob[area_no]--; /*BLOCK_NOの変更*/ /* "Change BLOCK_NO" */ rp = 0; do { while ((area_data[rp][0] != '*') && (rp == eob[area_no])) { rp++; } if (rp == eob[area_no]) break; rps = 0; while (area_data[rp + rps] == '*') rps++; } while (rps < blen); block_no = rp; } /*ファイル名と日時の登録*/ /* "Register File Name & Timestamp" */ fnsplit(fname, drive, dir, name, ext); sprintf(area_data[block_no], "%-8s %s %8ld %02d-%02d-%02d %02d:%02d\n", name, ext+1, flen, ftimep.ft_year+80, ftimep.ft_month, ftimep.ft_day, ftimep.ft_hour, ftimep.ft_min); /*ファイルサイズがブロックサイズを越えているときの処理2*/ /* "Process 2 When File Size Exceeds Block Size" */ if (flen > block_size[area_no - 1] * 1024) { /*連続ブロックの定義*/ /* "Define Multple Blocks" */ for (rp = 1; rp < blen; rp++) { sprintf(area_data[block_no + rp], "+follow block+\n"); } } /*HDへの登録 para: -Usize,relate path.ext group label.ext*/ /* "Register (Write) to Hard Disk..." */ size = block_size[area_no - 1] * area_size[area_no - 1] / 4; relate = block_size[area_no - 1] * block_no / 4; sprintf(hwpara, "-U%X000,%X000 %s %s %s", size, relate, fname, "DAT", area_name[area_no - 1]); printf("HDWRITE %s\n", hwpara); spawnlp(P_WAIT, "HDWRITE", "HDWRITE", hwpara, NULL); /*エリアファイルの保 /* "Area File Sav<snip!>" ... do { area_no = getchar() - '0'; } while ((area_no < 0) || (area_no > 9)); } readArea(area_no); eob[area_no]++; setBlock(area_no, eob[area_no] - 1, sfname); } /*[主関数]指定されたファイルの内容に従って、ダイレクトと同様に登録する。*/ /* "Registers (Saves) in the Same Way as Direct Files, According to the Contents of the Specified File" */ entryIndirect(char *ifname) { static char fname[80]; static char fdata[80]; char flen; printf("インダイレクトモードで登録します。\n\n"); "Saving in Indirect Mode." /*インダイレクトファイルのオープン*/ /* "Open an Indirect File" */ if ((fpis = fopen(ifname, "ra")) == NULL) { printf("インダイレクトファイル %s がありません。", ifname); "Indirect File %s Doesn't Exist." exit(ABORT); } printf("インダイレクトファイル %s をオープンしました。\n", ifname); "Indirect File %s Opened." /*定義されているファイルの名前をもらって、登録する。*/ /* "Get the Name of the Specified File and Save it." */ while (fgets(fdata, 80, fpis) != NULL) { strupr(fdata); if (fdata[0] == '-') { sys_areano = fdata[1] - '0'; continue; } if (isalnum(fdata[0]) == 0) continue; flen = strcspn(fdata, " "); strset(fname, 0); strncpy(fname, fdata, flen); strcat(fname, "."); strncat(fname, fdata + 9, 3); /* Yep, 8.3 format! */ entryDirect(fname); } fclose(fpis); } /*[補助関数]EQUファイルを作成してファイルにする。*/ /* "[Auxiliary Function] Create an EQU File and Use it." */ void outEqu(char *fname) { int area_no, block_no; static char equ_fname[80]; static char name_ext[80]; int nsploc, esploc; static char bname[80], bext[80]; long length; static char str_length[80]; if (fname[0] == 0) strcpy(fname, "area"); sprintf(equ_fname, "%s%s.EQU", area_path, fname); fpoe = fopen(equ_fname, "wa"); for (area_no = 1; area_no <= MAXAREA; area_no++) { readArea(area_no); fprintf(fpoe, ";area %d\n", area_no); for (block_no = 0; block_no < eob[area_no]; block_no++) { nsploc = strSrh(area_data[block_no], ' '); esploc = strSrh(area_data[block_no] + 9, ' '); strset(bname, 0); strset(bext, 0); strncpy(bname, area_data[block_no], nsploc); strncpy(bext, area_data[block_no] + 9, esploc); strset(name_ext, 0); sprintf(name_ext, "%s_%s", bname, bext); if (strlen(name_ext) < 8) { ; 6th section of code was cut off here.
; The last section of data found has two data tables, and string storage for the binaries generated from the C source above. ; ds_zencode: db " !”#$%&’()*+,−./" db "0123456789:;<=>?" db "@ABCDEFGHIJKLMNO" db "PQRSTUVWXYZ[¥]^_" db " abcdefghijklmno" db "pqrstuvwxyz{|} ̄ " fnt12siz: ;from $20 to $7f db 2,3,4,6,1,6,1,3,1,3,0,2,0,2,4,6,3,5,3,5,0,2,1,4,1,9,1,3,1,9,0,1 db 2,2,4,4,2,3,2,3,2,2,2,3,2,3,2,3,2,3,2,3,4,6,4,6,1,2,1,3,1,2,2,4 db 0,2,1,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,4,4,2,3,2,1,2,2,0,1,1,2,2,2 db 2,2,2,1,2,1,2,2,2,2,1,2,1,2,0,1,1,1,1,2,2,2,3,5,1,3,3,5,2,4,2,4 db 2,3,2,3,3,4,3,3,3,4,3,4,3,4,3,3,2,3,4,5,3,5,2,3,4,5,1,2,2,3,3,3 db 2,4,3,3,3,4,3,4,4,4,2,3,2,3,1,2,2,4,2,3,3,4,3,5,5,6,3,5,2,4,2,3 データがおかしいんでないかい? ; "Isn't this data all messed up?" Endsubがあるのに,Subがないぞ! ; "There's an Endsub but no Sub to go with it!!" Turbo-C - Copyright (c) 1987 Borland Intl. Divide error Abnormal program termination PROGRAM TEXT PICTURE ADPCM PSG GENERAL  [%d;%dH [>5h [>5l * [>1h [>1l         %sarea%d ra %sarea%d wa %-8s %s %8ld %02d-%02d-%02d %02d:%02d -U%X000,%X000 %s %s %s DAT HDWRITE %s HDWRITE HDWRITE エリア %d のブロック %d にファイル %s を登録しました。 ; "Block %d of Area %d Saved to File %s." %02d-%02d-%02d %02d:%02d *****%d*****%s*****%s 指定のファイル %s がありません。 ; "Specified File %s Doesn't Exist." %-8s %s ファイル %s は登録されていません。新規登録とみなします。 ; "File %s Doesn't Exist. Creating New File." エリアの番号を入力してください。 ; "Please Enter the Number of the Area." 1) program 2) text 3) picture 4) adpcm 5) psg 6) general input No.: インダイレクトモードで登録します。 ; "Save in Indirect Mode." ra インダイレクトファイル %s がありません。 インダイレクトファイル %s をオープンしました。 ; "Indirect File %s Doesn't Exist. Indirect File %s Opened." . area %s%s.EQU wa ;area %d %s_%s %s equ %d %s equ %d _L %s %8ld %s equ %ld %s equ %ld ;-------- Hu7CDハードディスクにファイルを登録します。 ; "Saves a File to Hu7CD Hard Disk." 使い方: [cdm filename] --- filenameを登録します。 ; "Usage ... Save as filename." [cdm @filename] --- filenameの内容にしたがって登録します。 ; "... Save According to Contents of filename." [cdm -e{filename}] --- filenameにエリアの内容をEQU定義します。 ; "... Sets the Contents of Area EQU to filename." インダイレクトファイルのフォーマットは、dirコマンドの形式と共通です。 ; "Format of the Indirect File is the Same as that of the dir Command." エリアファイル・EQUファイルは、このファイルのあるディレクトリに作られます。 ; "Area Files and EQU Files are Created in the Same Directory as This File." HDに書き込まれる名前は、PROGRAM,TEXT,PICTURE,ADPCM,PSG,GENERALです。 ; "Names that can be Written to the HD are PROGRAM, ..." . . .

[TOP]

***EOF***The buried ALN source code ends here!