ホームに戻る
サウンド(ドレミ)を鳴らす
;--------------------------;
; define ;
;--------------------------;
.186
;SW or WSC control
MAXPATHLEN equ 64
SRAM_SEG equ 1000h
HARDWARE equ 0A0h
;BIOS control
INT_BIOS_VECTOR_BASE equ 010h
INT_EXIT equ INT_BIOS_VECTOR_BASE + 0 ;program end
INT_KEY equ INT_BIOS_VECTOR_BASE + 1 ;key control
INT_DISP equ INT_BIOS_VECTOR_BASE + 2 ;screen control
INT_TEXT equ INT_BIOS_VECTOR_BASE + 3 ;text control
;IRAM setting
IRAM_Stack equ 0E00h
IRAM_Font equ 2000h
IRAM_Screen1 equ 1000h
IRAM_Screen2 equ 1800h
IRAM_Sprite equ 0E00h
IRAM_Screen1_s equ 2 ;2 * 2048 bytes
IRAM_Screen2_s equ 3 ;3 * 2048 bytes
IRAM_Sprite_s equ 7 ;7 * 512 bytes
;SCREEN control
SCREEN1 equ 0 ;Scrren 1
SCREEN2 equ 1 ;Screen 2
DCM_SCR1 equ 1 ;Display Screen 1 Enable
DCM_SCR2 equ 2 ;Display Screen 2 Enable
DCM_SPR equ 4 ;Display Sprite Enable
SCREEN_SET_VRAM equ 21h ;Screen VRAM Addressの設定
SPRITE_SET_VRAM equ 22h ;Sprite VRAM Addressの設定
;LCD control
LCD_Display_Control equ 000h ; Display Control
LCD_Sprite_Start equ 005h ; Sprite Start Number
LCD_Sprite_Range equ 006h ; Sprite Range
LCD_Screen2_WinStart equ 008h ; Screen2 Window Start Locate
LCD_Screen2_WinEnd equ 00Ah ; Screen2 Window End Locate
LCD_Sprite_WinStart equ 00Ch ; Sprite Window Start Locate
LCD_Sprite_WinEnd equ 00Eh ; Sprite Window End Locate
LCD_Screen1_Scroll equ 010h ; Screen1 Scroll Locate
LCD_Screen2_Scroll equ 012h ; Screen2 Scroll Locate
LCD_GRAY_0123 equ 01Ch ; Gray 0123
LCD_GRAY_4567 equ 01Eh ; Gray 4567
LCD_PALETTE00 equ 020h ; Palette 0
;IRAM setting
IRAM_Wave equ 0180h
IRAM_Wave_s equ 006h ;6 * 64 bytes
;SOUND control
SOUND_Pitch_Channel1 equ 080h ; Channel1 Pitch 00000PPPPPPPPPPP
SOUND_Pitch_Channel2 equ 082h ; Channel2 Pitch 00000PPPPPPPPPPP
SOUND_Pitch_Channel3 equ 084h ; Channel3 Pitch 00000PPPPPPPPPPP
SOUND_Pitch_Channel4 equ 086h ; Channel4 Pitch 00000PPPPPPPPPPP
SOUND_Volume_Channel1 equ 088h ; Channel1 Volume RRRRLLLL
SOUND_Volume_Channel2 equ 089h ; Channel2 Volume RRRRLLLL
SOUND_Volume_Channel3 equ 08Ah ; Channel3 Volume RRRRLLLL
SOUND_Volume_Channel4 equ 08Bh ; Channel4 Volume RRRRLLLL
SOUND_PCM_Voice equ 089h ; Channel2 PCM Data DDDDDDDD
SOUND_Sweep_Level equ 08Ch ; Channel3 Sweep Level LLLLLLLL
SOUND_Sweep_Time equ 08Dh ; Channel3 Sweep Time 000LLLLL
SOUND_Noise_Mode equ 08Eh ; Channel4 Noise Mode 000ERMMM Enable,Reset,Mode
SOUND_Set_Wave_Address equ 08Fh ; Wave Address / 64 bytes AAAAAAAA
SOUND_Channel_Mode equ 090h ; Channel NSP04321 on=1 off=0
SOUND_Output_Mode equ 091h ; Speaker 00000VVE Volume,Enable
SOUND_Random equ 092h ; Random 0RRRRRRRRRRRRRRR
SOUND_PCM_Volume equ 094h ; PCM Volume 0000RRLL
;SOUND Note Data
NOTE_O1_G equ 00059h
NOTE_O1_Gs equ 000C1h
NOTE_O1_A equ 0012Fh
NOTE_O1_As equ 00191h
NOTE_O1_B equ 001EDh
NOTE_O2_C equ 00244h
NOTE_O2_Cs equ 00297h
NOTE_O2_D equ 002E4h
NOTE_O2_Ds equ 0032Eh
NOTE_O2_E equ 00373h
NOTE_O2_F equ 003B4h
NOTE_O2_Fs equ 003F2h
NOTE_O2_G equ 0042Ch
NOTE_O2_Gs equ 00460h
NOTE_O2_A equ 00497h
NOTE_O2_As equ 004C8h
NOTE_O2_B equ 004F7h
NOTE_O3_C equ 00522h
NOTE_O3_Cs equ 0054Bh
NOTE_O3_D equ 00572h
NOTE_O3_Ds equ 00597h
NOTE_O3_E equ 005BAh
NOTE_O3_F equ 005DAh
NOTE_O3_Fs equ 005F9h
NOTE_O3_G equ 00616h
NOTE_O3_Gs equ 00630h
NOTE_O3_A equ 0064Ch
NOTE_O3_As equ 00664h
NOTE_O3_B equ 0067Bh
NOTE_O4_C equ 00691h
NOTE_O4_Cs equ 006A6h
NOTE_O4_D equ 006B9h
NOTE_O4_Ds equ 006CBh
NOTE_O4_E equ 006DDh
NOTE_O4_F equ 006EDh
NOTE_O4_Fs equ 006FDh
NOTE_O4_G equ 0070Bh
NOTE_O4_Gs equ 00718h
NOTE_O4_A equ 00726h
NOTE_O4_As equ 00732h
NOTE_O4_B equ 0073Eh
NOTE_O5_C equ 00748h
NOTE_O5_Cs equ 00753h
NOTE_O5_D equ 0075Dh
NOTE_O5_Ds equ 00766h
NOTE_O5_E equ 0076Eh
NOTE_O5_F equ 00776h
NOTE_O5_Fs equ 0077Eh
NOTE_O5_G equ 00786h
NOTE_O5_Gs equ 0078Ch
NOTE_O5_A equ 00793h
NOTE_O5_As equ 00799h
NOTE_O5_B equ 0079Fh
NOTE_O6_C equ 007A4h
NOTE_O6_Cs equ 007A9h
NOTE_O6_D equ 007AEh
NOTE_O6_Ds equ 007B3h
NOTE_O6_E equ 007B7h
NOTE_O6_F equ 007BBh
NOTE_O6_Fs equ 007BFh
NOTE_O6_G equ 007C3h
NOTE_O6_Gs equ 007C6h
NOTE_O6_A equ 007C9h
NOTE_O6_As equ 007CDh
NOTE_O6_B equ 007CFh
NOTE_O7_C equ 007D2h
NOTE_O7_Cs equ 007D5h
NOTE_O7_D equ 007D7h
NOTE_O7_Ds equ 007D9h
NOTE_O7_E equ 007DCh
NOTE_O7_F equ 007DEh
NOTE_O7_Fs equ 007E0h
NOTE_O7_G equ 007E1h
NOTE_O7_Gs equ 007E3h
NOTE_O7_A equ 007E5h
NOTE_O7_As equ 007E6h
NOTE_O7_B equ 007E8h
NOTE_O8_C equ 007E9h
NOTE_O8_Cs equ 007EAh
NOTE_O8_D equ 007ECh
NOTE_O8_Ds equ 007EDh
NOTE_O8_E equ 007EEh
NOTE_O8_F equ 007EFh
NOTE_O8_Fs equ 007F0h
NOTE_O8_G equ 007F1h
NOTE_O8_Gs equ 007F2h
NOTE_O8_A equ 007F2h
NOTE_O8_As equ 007F3h
NOTE_O8_B equ 007F4h
;KEY control
KEY_WAIT equ 002h
;--------------------------;
; segment declarations ;
;--------------------------;
TEXT CSEG ; code
_TEXT CSEG ; code
_GHOST_DATA CSEG PARA ; data in ROM, copied to RAM in startup
DATA DSEG PARA ; data in RAM
_DATA DSEG PARA ; data in RAM
BSS DSEG ; bss in RAM
_BSS DSEG 'BSS' ; bss in RAM
HEAP DSEG 'BSS' ; end of bss
ENDHEAP DSEG 'BSS' ; end of heap
CGROUP GROUP TEXT,_TEXT
DGROUP GROUP DATA,_DATA,BSS,_BSS,HEAP,ENDHEAP
;--------------------------;
; TEXT ;
;--------------------------;
TEXT CSEG
ROMTOP::
;--------------------------;
; _load0 ;
;--------------------------;
_load0::
PUSH DS
PUSH DI
PUSH SI
PUSH CX
PUSH BX
;set SRAM_SEG to ES
MOV AX, SRAM_SEG
MOV ES, AX
;copy _GHOST_DATA to RAMTOP
MOV AX, CS
SUB AX, TEXT
ADD AX, _GHOST_DATA
MOV DS, AX
XOR SI, SI
MOV DI, RAMTOP
MOV CX, INITSIZE
SHR CX, 1
CLD
REP MOVSW
PUSH ES
POP DS
;fill BSS with zero
MOV DI, BEGINBSS
MOV CX, ENDBSS
SUB CX, DI
SHR CX, 1
XOR AX, AX
REP STOSW
;set heap start position
MOV [__heap].W, BEGINHEAP
;set argv starting position at heap start
MOV [__argv].W, BEGINHEAP
MOV DX, CS
MOV AX, _run0
POP BX
POP CX
POP SI
POP DI
POP DS
RETF
;--------------------------;
; _run0 ;
;--------------------------;
_run0::
MOV BP, SP
;set stack pointer
MOV AX, IRAM_Stack
MOV SP, AX
;set SRAM segment = DS = ES
MOV AX, SRAM_SEG
MOV DS, AX
MOV ES, AX
;initialize LCD
XOR AX, AX
OUT LCD_Display_Control, AX ; display_control(0);
OUT LCD_Sprite_Start, AL ; sprite_set_range(0,0);
OUT LCD_Sprite_Range, AL ;
OUT LCD_Screen1_Scroll, AX ; screen_set_scroll(SCREEN1, 0, 0);
OUT LCD_Screen2_Scroll, AX ; screen_set_scrol2(SCREEN2, 0, 0);
OUT LCD_Screen2_WinStart, AX ;
OUT LCD_Sprite_WinStart, AX ;
MOV AX, 0FFFFh
OUT LCD_Screen2_WinEnd, AX ; screen2_set_window(0, 0, 255, 255);
OUT LCD_Sprite_WinEnd, AX ; sprite_set_window(0, 0, 255, 255);
;check WS or WSC
IN AL, HARDWARE
AND AL, 02h
JNZ _run0_color
_run0_mono::
_run0_color::
;set SCREEN1 VRAM
MOV BX, IRAM_Screen1_s
MOV AL, SCREEN1
MOV AH, SCREEN_SET_VRAM
INT INT_DISP
;set SCREEN2 VRAM
MOV BX, IRAM_Screen2_s
MOV AL, SCREEN2
MOV AH, SCREEN_SET_VRAM
INT INT_DISP
;set SPRITE VRAM
MOV BX, IRAM_Sprite_s
MOV AH, SPRITE_SET_VRAM
INT INT_DISP
;set dsplay enable (Scrren 1 & Screen 2 & Sprite = Enable)
MOV AX, DCM_SCR1 + DCM_SCR2 + DCM_SPR
OUT LCD_Display_Control, AX
MOV CX, [BP + 8] ; for argv
MOV BX, [BP + 6] ; for argc
PUSH CX
PUSH BX
CALL _main
;--------------------------;
; _main ;
;--------------------------;
_main::
PUSH BP
MOV BP,SP
PUSH DI
PUSH SI
PUSH CX
;set color and palette
MOV AX, 07530h
OUT LCD_GRAY_0123, AX
MOV AX, 0FDB9h
OUT LCD_GRAY_4567, AX
MOV AX, 07420h
OUT LCD_PALETTE00, AX
;set font charactor
XOR AX, AX
MOV ES, AX
MOV DI, IRAM_Font
MOV SI, _font000
MOV CX, 8
CLD
REP MOVSW
PUSH DS
POP ES
;fill SCREEN2 VRAM with font000
XOR AX, AX
MOV ES, AX
MOV DI, IRAM_Screen2
MOV CX, 1024
MOV AX, 00000h
REP STOSW
PUSH DS
POP ES
;set wave1 form
XOR AX, AX
MOV ES, AX
MOV DI, IRAM_Wave
MOV SI, _wave001
MOV CX, 8
CLD
REP MOVSW
PUSH DS
POP ES
; set wave address
XOR AX, AX
MOV AL, IRAM_Wave_s
OUT SOUND_Set_Wave_Address, AL
; set channel mode
XOR AX, AX
MOV AL, 001h
OUT SOUND_Channel_Mode, AL ; only channel1 on
; set speaker state
XOR AX, AX
MOV AL, 007h
OUT SOUND_Output_Mode, AL
; set note Oct_4 C
XOR AX, AX
MOV AX, NOTE_O4_C
OUT SOUND_Pitch_Channel1, AX
; set Volume 3
XOR AX, AX
MOV AL, 033h
OUT SOUND_Volume_Channel1, AL
;key wait
MOV AH, KEY_WAIT
INT INT_KEY
; set note Oct_4 D
XOR AX, AX
MOV AX, NOTE_O4_D
OUT SOUND_Pitch_Channel1, AX
; set Volume 7
XOR AX, AX
MOV AL, 077h
OUT SOUND_Volume_Channel1, AL
;key wait
MOV AH, KEY_WAIT
INT INT_KEY
; set note Oct_4 E
XOR AX, AX
MOV AX, NOTE_O4_E
OUT SOUND_Pitch_Channel1, AX
; set Volume F
XOR AX, AX
MOV AL, 0FFh
OUT SOUND_Volume_Channel1, AL
;key wait
MOV AH, KEY_WAIT
INT INT_KEY
XOR AX, AX
POP CX
POP SI
POP DI
MOV SP,BP
POP BP
RET
;--------------------------;
; _exit0 ;
;--------------------------;
_exit00::
__exit0::
__exit::
INT INT_EXIT
;--------------------------;
; DATA ;
;--------------------------;
DATA DSEG PARA
RAMTOP::
; FreyaOS process control block
__id:: DB 'LCC', 0
__pid:: DW 0
__ppid:: DW 0
__pcbid:: DW 0
__ppcbid:: DW 0
__ilib:: DW 0
DW 0
__proc:: DW 0
DW 0
__cwfs:: DW 0
DW 0
__currentdir::
RS MAXPATHLEN
__argv:: DW 0
__resource:: DW 0
DW 0
__heap:: DW 0
_font000:: DW 00000h
DW 00000h
DW 00000h
DW 00000h
DW 00000h
DW 00000h
DW 00000h
DW 00000h
_wave001:: DW 0FFFFh ; 矩形波
DW 0FFFFh
DW 0FFFFh
DW 0FFFFh
DW 00000h
DW 00000h
DW 00000h
DW 00000h
;--------------------------;
; BSS ;
;--------------------------;
BSS DSEG
INITSIZE:
BEGINBSS:
HEAP DSEG 'BSS'
ENDBSS:
BEGINHEAP:
ENDHEAP DSEG 'BSS'
end