ホームに戻る
キー割り込みとキーチェック
;--------------------------;
; 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