ƒz[ƒ€‚Ι–ί‚ι
 ƒXƒEƒB[ƒv‚ΖƒmƒCƒY‚ΜƒeƒXƒg

;--------------------------;
;   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, 16
  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 * 4
  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, 044h
  OUT   SOUND_Channel_Mode, AL     ; channel 3 on sweep mode

; set speaker state
  XOR   AX, AX
  MOV   AL, 007h
  OUT   SOUND_Output_Mode, AL

; set sweep level (•„†•t‚«)
  XOR   AX, AX
  MOV   AL, 07Fh
  OUT   SOUND_Sweep_Level, AL

; set sweep time (2.667*(1+Time(=5bit))[ms]
  XOR   AX, AX
  MOV   AL, 01Fh
  OUT   SOUND_Sweep_Time, AL

; set note Oct_4 C
  XOR   AX, AX
  MOV   AX, NOTE_O4_C
  OUT   SOUND_Pitch_Channel3, AX

; set Volume 3
  XOR   AX, AX
  MOV   AL, 033h
  OUT   SOUND_Volume_Channel3, AL

;key wait
  MOV   AH, KEY_WAIT
  INT   INT_KEY

; set sweep level (•„†•t‚«)
  XOR   AX, AX
  MOV   AL, 080h
  OUT   SOUND_Sweep_Level, AL

; set sweep time (2.667*(1+Time(=5bit))[ms]
  XOR   AX, AX
  MOV   AL, 01Fh
  OUT   SOUND_Sweep_Time, AL

; set note Oct_4 D
  XOR   AX, AX
  MOV   AX, NOTE_O4_D
  OUT   SOUND_Pitch_Channel3, AX

; set Volume 7
  XOR   AX, AX
  MOV   AL, 077h
  OUT   SOUND_Volume_Channel3, AL

;key wait
  MOV   AH, KEY_WAIT
  INT   INT_KEY

; set sweep level (•„†•t‚«)
  XOR   AX, AX
  MOV   AL, 004h
  OUT   SOUND_Sweep_Level, AL

; set sweep time (2.667*(1+Time(=5bit))[ms]
  XOR   AX, AX
  MOV   AL, 001h
  OUT   SOUND_Sweep_Time, AL

; set note Oct_4 E
  XOR   AX, AX
  MOV   AX, NOTE_O4_E
  OUT   SOUND_Pitch_Channel3, AX

; set Volume F
  XOR   AX, AX
  MOV   AL, 0FFh
  OUT   SOUND_Volume_Channel3, AL

;key wait
  MOV   AH, KEY_WAIT
  INT   INT_KEY

; set channel mode
  XOR   AX, AX
  MOV   AL, 088h
  OUT   SOUND_Channel_Mode, AL     ; channel 4 on noise mode

; set noise mode
  XOR   AX, AX
  MOV   AL, 011h
  OUT   SOUND_Noise_Mode, AL

; set note Oct_4 C
  XOR   AX, AX
  MOV   AX, NOTE_O4_C
  OUT   SOUND_Pitch_Channel4, AX

; set Volume 4
  XOR   AX, AX
  MOV   AL, 033h
  OUT   SOUND_Volume_Channel4, AL

;key wait
  MOV   AH, KEY_WAIT
  INT   INT_KEY

; set noise mode
  XOR   AX, AX
  MOV   AL, 016h
  OUT   SOUND_Noise_Mode, AL

; set note Oct_5 D
  XOR   AX, AX
  MOV   AX, NOTE_O5_D
  OUT   SOUND_Pitch_Channel4, AX

; set Volume 4
  XOR   AX, AX
  MOV   AL, 033h
  OUT   SOUND_Volume_Channel4, 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   ; ‹ιŒ`”g
             DW 0FFFFh
             DW 0FFFFh
             DW 0FFFFh
             DW 00000h
             DW 00000h
             DW 00000h
             DW 00000h

_wave002::   DW 0FFFFh   ; ‹ιŒ`”g
             DW 0FFFFh
             DW 0FFFFh
             DW 0FFFFh
             DW 00000h
             DW 00000h
             DW 00000h
             DW 00000h

_wave003::   DW 0FFFFh   ; ‹ιŒ`”g
             DW 0FFFFh
             DW 0FFFFh
             DW 0FFFFh
             DW 00000h
             DW 00000h
             DW 00000h
             DW 00000h

_wave004::   DW 0FFFFh   ; ‹ιŒ`”g
             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

inserted by FC2 system