ホームに戻る
 キー割り込みとキーチェック

;--------------------------;
;   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

;KEY control
KEY_Control          equ  0B5h  ; Key I/O Address
KEY_Common_ABS       equ  040h  ; B, A, Start, no use
KEY_Common_X1234     equ  020h  ; X4, X3, X2, X1
KEY_Common_Y1234     equ  010h  ; Y4, Y3, Y2, Y1
INT_KeySet           equ  002h
INT_KeyReset         equ  0FDh
Key_Vector           equ  0A4h  ; 029h * 4

;I/O DEVICE control
Int_Vector           equ  0B0h
Int_Enable           equ  0B2h
Int_Type             equ  0B4h
Int_Eoi              equ  0B6h


;--------------------------;
;   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
  PUSH  BX

;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 + 0
  MOV   SI, _font_space
  MOV   CX, 8
  CLD
  REP   MOVSW

  PUSH  DS
  POP   ES

;fill SCREEN2 VRAM with _font_space
  XOR   AX, AX
  MOV   ES, AX
  MOV   DI, IRAM_Screen2
  MOV   CX, 1024
  MOV   AX, 00000h
  REP   STOSW

  PUSH  DS
  POP   ES

;init Key Interrupt Set
  CLI
  IN    AL, Int_Enable
  OR    AL, INT_KeySet
  OUT   Int_Enable, AL
  XOR   AX, AX
  MOV   ES, AX
  MOV   BX, Key_Vector
  MOV   AX, ES:[BX].W
  MOV   DS:[_old_intvector].W, AX
  MOV   AX, ES:[BX+2].W
  MOV   DS:[_old_intvector+2].W, AX
  MOV   ES:[BX].W, _int_key
  MOV   AX, CS
  MOV   ES:[BX+2].W, AX
  STI

  PUSH  DS
  POP   ES

;key wait
  XOR   AX, AX
  MOV   ES, AX
_1:
  MOV   BX, IRAM_Font
  CMP   ES:[BX].W, 0
  JE    _1

  PUSH  DS
  POP   ES

;deinit Key Interrupt Set
  CLI
  IN    AL, Int_Enable
  AND   AL, INT_KeyReset
  OUT   Int_Enable, AL
  XOR   AX, AX
  MOV   ES, AX
  MOV   BX, Key_Vector
  MOV   AX, ES:[BX].W
  MOV   DS:[_old_intvector].W, AX
  MOV   AX, ES:[BX+2].W
  MOV   DS:[_old_intvector+2].W, AX
  STI

  PUSH  DS
  POP   ES

  XOR   AX, AX

  POP   BX
  POP   CX
  POP   SI
  POP   DI
  MOV   SP,BP
  POP   BP
  RET


;--------------------------;
;   _int_key               ;
;--------------------------;

_int_key::
  PUSH  BP
  MOV   BP, SP
  PUSH  AX
  PUSH  BX
  PUSH  CX
  PUSH  DX
  PUSH  DI
  PUSH  SI
  PUSH  DS
  PUSH  ES

  MOV   AX, 01000h
  MOV   DS, AX

  IN    AL, Int_Enable
  AND   AL, INT_KeyReset
  OUT   Int_Enable, AL
  MOV   AL, INT_KeySet
  OUT   Int_Eoi, AL

  XOR   AX, AX
  MOV   ES, AX
  MOV   AL, KEY_Common_ABS
  OUT   KEY_Control, AL
  IN    AL, KEY_Control
  AND   AX, 00004h           ; 0BAS*h
  MOV   BX, IRAM_Font
  MOV   ES:[BX].W, AX

  PUSH  DS
  POP   ES

  IN    AL, Int_Enable
  OR    AL, INT_KeySet
  OUT   Int_Enable, AL

  POP   ES
  POP   DS
  POP   SI
  POP   DI
  POP   DX
  POP   CX
  POP   BX
  POP   AX
  MOV   SP,BP
  POP   BP
  IRET


;--------------------------;
;   _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

_font_space::
             DW 00000h
             DW 00000h
             DW 00000h
             DW 00000h
             DW 00000h
             DW 00000h
             DW 00000h
             DW 00000h


;--------------------------;
;   BSS                    ;
;--------------------------;
BSS          DSEG
INITSIZE:
BEGINBSS:

_old_intvector:
             RS 4

HEAP         DSEG 'BSS'
ENDBSS:
BEGINHEAP:
ENDHEAP      DSEG 'BSS'

  end

inserted by FC2 system