Estex-DSS/DSS/Procedures.asm

429 lines
7.2 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;!TODO Procedures
;----------------------------------------------------------------------;
; ‡ ª®¤¨à®¢ âì ¢à¥¬ï/¤ âã
; ¢å®¤: de - ¤¥­ì/¬¥áïæ
; hl - ç áë/¬¨­ãâë
; b - ᥪ㭤ë
; ix - £®¤
; ¢ë室: de - ¢à¥¬ï
; bc - ¬¥áïæ/¤¥­ì
; ix - £®¤
;
;INPUT: D - DAY; E - MONTH
; H - HOUR; L - MINUTE
; B - SECOND (0...59)
; IX- YEAR (0...65535)
;OUTPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2
; BC - yyyyyyymmmmddddd y - year, m - month, d - day
; (1980-2108)
MK_TIME:
LD A,L
RLCA
RLCA
SLA A
RL H
SLA A
RL H
SLA A
RL H
SRL B
OR B
LD L,A
LD BC,#F844 ;(-1980)
ADD IX,BC
LD A,E
RLCA
RLCA
RLCA
RLCA
AND #F0
LD B,XL
SLA A
RL B
OR D
LD C,A
EX DE,HL
AND A
RET
;----------------------------------------------------------------------;
;!TODO Procedures
;----------------------------------------------------------------------;
; <20> áª®¤¨à®¢ âì ¢à¥¬ï/¤ âã
; ¢å®¤: de - ¢à¥¬ï
; bc - ¬¥áïæ/¤¥­ì
; ix - £®¤
; ¢ë室: de - ¤¥­ì/¬¥áïæ
; hl - ç áë/¬¨­ãâë
; b - ᥪ㭤ë
; ix - £®¤
;
;INPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2
; BC - yyyyyyymmmmddddd y - year, m - month, d - day
; (1980-2108)
;OUTPUT: D - DAY; E - MONTH
; H - HOUR; L - MINUTE
; B - SECOND (0...59)
; IX- YEAR (0...65535)
RMKTIME:
EX DE,HL
LD A,C
AND #1F
LD D,A
SRL B
RR C
LD A,C
RRCA
RRCA
RRCA
RRCA
AND #0F
LD E,A
LD C,B
LD B,0
LD IX,1980
ADD IX,BC
LD A,L
AND #1F
ADD A,A
LD B,A
SRL H
RR L
SRL H
RR L
SRL H
RR L
SRL L
SRL L
AND A
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; [x] 25/01/2024
; ¢å®¤: D - ¤¥­ì
; E - ¬¥áïæ
; IX - £®¤
; ¢ë室: H - ¤¥­ì ­¥¤¥«¨ (1 - ¢®áªà¥á¥­ì¥)
CalcDayOfWeek: LD A,D
LD (.day),A
; x = (14 ? ¬¥áïæ) / 12
; y = £®¤ ? x
LD A,E
CP 3
LD A,0
JR NC,1F
DEC IX
LD A,12
1: ; y = IX
; m = ¬¥áïæ + 12 * x ? 2
ADD E
SUB 2
; m = A
; HL = (31 * m)
LD D,0
LD E,A
RLA
RLA
RLA
LD H,D
LD L,A
ADD HL,HL
ADD HL,HL
SBC HL,DE
; (31 * m) = HL
; BC = (31 * m) / 12
LD B,H
LD C,L
; D=0
LD E,12
CALL BC_Div_DE
; (31 * m) / 12 = BC
LD (.m31_12),BC
; y / 4
PUSH IX
POP BC
; D=0
LD E,4
CALL BC_Div_DE
; y / 4 = BC
PUSH BC
; y / 100
PUSH IX
POP BC
; D=0
LD E,100
CALL BC_Div_DE
; y / 100 = BC
PUSH BC
; y / 400
PUSH IX
POP BC
LD DE,400
CALL BC_Div_DE
; y / 400 = BC
; y/400 - y/100
AND A
LD H,B
LD L,C
POP DE
SBC HL,DE
; y/400 - y/100 = HL
; y/4 ? y/100 + y/400
POP DE
ADD HL,DE
; y/4 ? y/100 + y/400 + (31 * m)/12
.m31_12+1: LD DE,0
ADD HL,DE
; y + y/4 ? y/100 + y/400 + (31 * m)/12
EX DE,HL
ADD IX,DE
; ¤¥­ì + y + y/4 ? y/100 + y/400 + (31 * m)/12
LD D,0
.day+1: LD E,0
ADD IX,DE
; 7000 + (¤¥­ì + y + y/4 ? y/100 + y/400 + (31 * m)/12)
LD DE,7000
ADD IX,DE
; (7000 + (¤¥­ì + y + y/4 ? y/100 + y/400 + (31 * m)/12)) mod 7
LD B,XH
LD C,XL
LD DE,7
CALL BC_Div_DE
; „¥­ì<C2AD>¥¤¥«¨ = L
LD H,L
INC H
RET
; x = (14 ? ¬¥áïæ) / 12
; y = £®¤ ? x
; m = ¬¥áïæ + 12 * x ? 2
; „¥­ì<C2AD>¥¤¥«¨ = (7000 + (¤¥­ì + y + y/4 ? y/100 + y/400 + (31 * m)/12)) mod 7
; ‚ᥠ¤¥«¥­¨ï 楫®ç¨á«¥­­ë¥ (®áâ â®ª ®â¡à á뢠¥âáï).
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; a..z -> A..Z
UPPER: CP 'a'
RET C
CP 'z' + 1
JR NC,.CheckRUS
.Dec: SUB #20
RET
;
.CheckRUS: CP ' ' ; àãááª ï ¡ãª¢   , ª®¤ #A0
RET C
CP '¯' ; àãááª ï ¡ãª¢  ¯, ª®¤ #B0
JR C,.Dec
; JR NC,.BGUPPER
; SUB #20
; RET
;
.BGUPPER: CP 'à' ; àãááª ï ¡ãª¢  à, ª®¤ #E0
RET C
CP 'ð' ; àãááª ï ¡ãª¢  ð, ª®¤ #F0
JR NC,.HGUPPER
SUB #50
RET
;
.HGUPPER: CP 'ñ' ; àãááª ï ¡ãª¢  ñ, ª®¤ #F1
RET NZ
DEC A
RET
;----------------------------------------------------------------------;
;!TODO hardware
;----------------------------------------------------------------------;
; —⥭¨¥ ॣ¨áâ஢ CMOS
; ¢å®¤: d=­®¬¥à ॣ¨áâà 
RCMOS: LD C,BIOS.CMOS_RD
RST ToBIOS
;JP BCD2HEX
; INPUT : A - BCD
; OUTPUT: A - HEX
BCD2HEX:
LD E,A
RRCA
RRCA
RRCA
RRCA
AND #0F
LD D,A
ADD A,A
ADD A,A
ADD A,D
ADD A,A
LD D,A
LD A,E
AND #0F
ADD A,D
RET
;----------------------------------------------------------------------;
;!TODO hardware
;----------------------------------------------------------------------;
; ‡ ¯¨áì ॣ¨áâ஢ CMOS
; ¢å®¤: d=­®¬¥à ॣ¨áâà 
WCMOS: CALL HEX2BCD
LD C,BIOS.CMOS_WR
JP ToBIOS
; INPUT : A - HEX
; OUTPUT: A - BCD
HEX2BCD:
LD BC,#0AFF
.loop: INC C
SUB B
JR NC,.loop
ADD A,B
LD B,A
LD A,C
RLCA
RLCA
RLCA
RLCA
AND #F0
OR B
RET
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
;BC/DE ==> BC, remainder in HL
; ­¥ ¯®àâ¨â DE
BC_Div_DE:
ld hl,0
ld a,b
ld b,16
;shift the bits from BC into HL
.div_loop:
sla c
rla
adc hl,hl
sbc hl,de
jr nc,.div_inc_acc
add hl,de
db $FE ;this begins the instruction `cp *`, so it eats the next byte.
.div_inc_acc:
inc c
djnz .div_loop
ld b,a
ret
;----------------------------------------------------------------------;
;
;----------------------------------------------------------------------;
; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª
DIV_by_Shifts:
LD C,A
DEC A
JR Z,.exit
;
AND E
LD B,A ; ®áâ â®ª
LD A,C
RRCA
;
.loop: SRL H
RR L
RR D
RR E
RRCA
JP NC,.loop
LD A,B
.exit: LD B,D
LD C,E
EX DE,HL
LD H,0
LD L,A
RET
;----------------------------------------------------------------------;
;===============================================================================================================================
MACRO PRINT_LINE_KERNEL_PANIC coordY, txtString, txtStringSize, txtColor
LD HL,txtString
LD BC,txtColor*256 + txtStringSize
LD DE,coordY * 256 + (80 - txtStringSize)/2
CALL .PRINT_LINE
ENDM ; 12 bytes
;
;-----------------------[]
; HL - á®®¡é¥­¨¥
; E - ª®®à¤¨­ â  X ­  ⥪á⮢®¬ íªà ­¥
; BC - ¤«¨­  á®®¡é¥­¨ï
KERNEL_PANIC:
DI
;
PUSH DE
PUSH HL
PUSH BC
;
LD E,1
LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default
RST ToBIOS
;
LD HL,#2050
LD DE,0
LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN
RST ToBIOS
;
LD A,1
OUT (SCREEN_SWITCH),A ; set scr-2
;
PRINT_LINE_KERNEL_PANIC 13, .kernel_panic, .kernel_panic.size, +(COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.RED)
PRINT_LINE_KERNEL_PANIC 18, .press_CAD, .press_CAD.size, +(COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.WHITE)
;
POP BC
POP HL
LD DE,#A000
LD A,C
LDIR
;
POP DE
LD D,15
LD C,BIOS.LP_SET_PLACE
RST ToBIOS
;
LD HL,#A000
LD DE,0*256 + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.WHITE
LD B,A
LD C,BIOS.LP_PRINT_LINE3
RST ToBIOS
;
.loop: DI
HALT
JR .loop
;
.PRINT_LINE:
PUSH BC
PUSH DE
LD DE,#A000
LD B,E
LD A,C
LDIR
;
POP DE
LD C,BIOS.LP_SET_PLACE
RST ToBIOS
;
POP DE
LD E,D
LD HL,#A000
LD D,L
LD B,A
LD C,BIOS.LP_PRINT_LINE3
JP ToBIOS
;
.kernel_panic: DZ "KERNEL PANIC!"
.kernel_panic.size EQU $-.kernel_panic
;
.press_CAD: DZ "Press Ctrl+Alt+Del or RESET."
.press_CAD.size EQU $-.press_CAD
;-----------------------[]
;===============================================================================================================================