; 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 [30m [31m [32m [33m [34m [35m [36m [37m
%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!