;---------------------------------------------------------------------------
;  W A T K I N    T E C H N O L O G Y    S o f t w a r e  D i v i s i o n
;---------------------------------------------------------------------------
; PROGRAM: Bootloader & ISR's
; VERSION: 1.0                            PLATFORM: 8088+
; PROJECT: Mini Memory Operating System       FILE: BLOADER .INC
;  AUTHOR: Neville Watkin                     DATE: 24 Aug 2009
;---------------------------------------------------------------------------
;                            Revision History
;
;24.08.09  initial release
;---------------------------------------------------------------------------

                ORG 7C00H

                JMP     START
                NOP
DB "Mini Memory OS (C) Neville Watkin 2009",0
START:
                CLI
                JMP     0000H:BOOTUP    ;ensure CS=0
BOOTUP:
                XOR     AX,AX
                MOV     SS,AX
                MOV     DS,AX
                MOV     AX,2FFEH
                MOV     SP,AX

                MOV     WORD[24CH],INT13     ;set up INT 93H vector
                MOV     WORD[24EH],0         ;set up INT 93H vector

                STI

                PUSH    0000
                POP     ES
                MOV     BX,7E00H
                MOV     AL,2            ;no. sects
                MOV     CX,2            ;sect, cyl
                MOV     DX,0
                INT     93H

                JMP     SETUP

INT13:
;enter with AL=no. sects, BX=buffer, DH=head, CL=sector, CH=cylinder
                MOV     SI,BX           ;SI=buffer
                MOV     BX,CX           ;BL=sector,BH=cyl
                MOV     CH,DH           ;CH=head
                MOV     CL,AL           ;CL=no.sects
;RDMEDIA:
;enter with CL=no. sects, SI=buffer, CH=head, BL=sector, BH=cylinder
;parts of RDMEDIA code are copyright (c) Mauro Di Cicco
;ref:http://board.flatassembler.net/topic.php?p=90673#90673

NEXTSECT:

                MOV     DX,3F2H
                MOV     AL,1CH          ;drive A motor/DMA ON
                OUT     DX,AL           ;caused PANIC R/W cmd with DMA, int disabled
                STI

                CALL    READSECT
                ADD     SI,200H
                INC     BL

                DEC     CL
                JNZ     NEXTSECT

                MOV     DX,3F2H
                XOR     AL,AL           ;OFF
                OUT     DX,AL
                STI
INT13D:
                IRET

READSECT:

                PUSHA

                MOV     AL,46H                  ; Single mode, Address increment select, Write transfer, Channel 2
                OUT     0BH,AL                  ; Mode Register

                OUT     0CH,AL                  ; Clear First/Last Flip-Flop

                MOV     AX,SI
                OUT     4,AL                    ; Send Low Byte Address
                SHR     AX,8
                OUT     4,AL                    ; Send High byte Address
                XOR     AL,AL
                OUT     81H,AL                  ; Page 0

                OUT     0CH,AL                  ; Clear First/Last Flip-Flop

                MOV     AL,0FFH
                OUT     5,AL                    ; Send Low Byte Count
                NEG     AL
                OUT     5,AL                    ; Send High Byte Count

                MOV     AL,010B                 ; bit   2 - Clear Mask bit
                                                ; bit 1:0 - Select channel 2
                OUT     0AH,AL                  ; Mask Register

                MOV     AH,46H                  ; Read Sector cmd
                CALL    FDCOUT
                JC      FDCERR

                MOV     AH,CH                   ; Head
                SHL     AH,2                    ; Drive 00
                CALL    FDCOUT
                JC      FDCERR

                MOV     AH,BH                   ; Cyl
                CALL    FDCOUT
                JC      FDCERR

                MOV     AH,CH                   ; Head
                CALL    FDCOUT
                JC      FDCERR

                MOV     AH,BL
                CALL    FDCOUT
                JC      FDCERR

                MOV     AH,2                    ; Bytes per Sector
                CALL    FDCOUT
                JC      FDCERR

                MOV     AH,12H                  ; Sector per Track
                CALL    FDCOUT
                JC      FDCERR

                MOV     AH,1BH                  ; Intersector gap Length
                CALL    FDCOUT
                JC      FDCERR

                MOV     AH,0FFH                 ; Data Length
                CALL    FDCOUT
                JC      FDCERR

                XOR     CX,CX
@@:
                SUB     CX,1
                JZ      FDCERR                  ;DMA time-out

                IN      AL,8
                TEST    AL,100B                 ; Transfer Complete ?
                JZ      @B

                MOV     BX,7
                MOV     DI,Result_Phase
@@:
                CALL    FDCIN
                MOV     [DI],AL
                INC     DI
                SUB     BX,1
                JNZ     @B

                POPA
                RET
;----------------------------------------------------------------------------
;Subroutines
;----------------------------------------------------------------------------

FDCOUT:
                PUSH    CX
                XOR     CX,CX
                MOV     DX,3F4H                 ; Main Status Register
@@:
                IN      AL,DX                   ; Read Status
                AND     AL,0C0H
                CMP     AL,80H
                LOOPNZ  @B
                JNZ     FDCTO

                INC     DX
                MOV     AL,AH
                OUT     DX,AL                   ; Write data

                TEST    AL,AL                   ; Clear Flag Carry
                POP     CX
                RET

FDCIN:
                PUSH    CX
                XOR     CX,CX
                MOV     DX,3F4H                 ; Main Status Register
@@:
                IN      AL,DX                   ; Read Status
                AND     AL,0C0H
                CMP     AL,0C0H
                LOOPNZ  @B
                JNZ     FDCTO

                INC     DX
                IN      AL,DX                   ; Read Data

                TEST    AL,AL                   ; Clear Flag Carry
                POP     CX
                RET

FDCTO:                                  ;FDC Time-Out

                STC
                POP     CX
                RET

FDCERR:
                PUSH    0B800H
                POP     DS
                MOV     BX,0F02H                ;line 25, col 1
                MOV     AX,0746H                ;"F"
                MOV     [BX],AX
@@:
                STI
                HLT
                JMP     @B

Result_Phase:
    TIMES 7 DB 0

;         TIMES 8 DB 0
; DB 13,10,0

;----------------------------------------------------------------------------
;Interrupt Service Routines
;----------------------------------------------------------------------------
INT15:          CLI
                PUSHA
INT15A:
                CALL    READCMOS
                MOV     AH,AL
INT15B:
                CALL    READCMOS
                CMP     AH,AL
                JZ      INT15B
                POPA
                STI
                IRET
READCMOS:
                MOV     AL,0AH          ;point to CMOS Status Byte A
                OUT     70H,AL
                IN      AL,71H
                AND     AL,80H          ;data available?
                JNZ     READCMOS
                XOR     AL,AL
                OUT     70H,AL
                IN      AL,71H
                SHR     AL,CL
                RET
 TIMES 510+7C00H-$ DB 0
                DW 0AA55H

INT16:          CLI
                CMP     AH,0
                JZ      KEYWAIT
                CMP     AH,1
                JZ      KEYSCAN
INT16D:         STI
                IRET
KEYWAIT:
KEYWAIT1:
                IN        AL,64H
                TEST      AL,1
                JZ       KEYWAIT1

                IN        AL,60H         ;read scancode

                CMP       AL,80H         ;release?
                JAE       KEYWAIT1

                AND      AL,7FH
                MOV      AH,AL
                MOV      BX,NOSHFT
                XLATB
                JMP     INT16D
KEYSCAN:
                PUSH      BX

                IN        AL,60H         ;read scancode

                AND      AL,7FH
                MOV      AH,AL
                MOV      BX,NOSHFT
                XLATB

KEYSCND:        POP       BX
                JMP     INT16D
NOSHFT:
DB 0, 1Bh, 31H, 32H, 33H, 34H, 35H, 36H, 37H, 38H, 39H, 30H, 2DH, 3DH, 8, 9
DB 71H, 77H, 65H, 72H, 74H, 79H, 75H, 69H, 6FH, 70H, 5BH, 5DH, 0DH, 0, 61H, 73H
DB 64H, 66H, 67H, 68H, 6AH, 6Bh, 6CH, 3BH, 27H, 60H, 0, 5CH, 7AH, 78H, 63H, 76H
DB 62H, 6EH, 6DH, 2CH, 2EH, 2FH, 0, 2AH, 0, 20H, 0, 21H, 40H, 23H, 24H, 25H
DB 5EH, 26H, 2AH, 28H, 29H, 0, 0, 0, 0, 0, 2DH, 0, 35H, 0, 2BH, 0
DB 0, 0, 0, 0, 0, 0, 0, 5FH, 2BH

INT10:
                CMP     AH,0
                JZ      SETMODE
                CMP     AH,2
                JZ      SETCUR
                CMP     AH,0EH
                JZ      WRTTY
INT10D:
                IRET

SETCUR:         PUSH    BX
                PUSH    AX
                MOV     BX,0000H
                MOVZX   AX,DL
                SHL     AX,1
                ADD     BX,AX
                MOV     AX,DX
                SHR     AX,8
                PUSH    BX
                MOV     BX,160
                PUSH    DX
                MUL     BX
                POP     DX
                POP     BX
                ADD     BX,AX
                MOV     [VRAM],BX
                POP     AX
                POP     BX
                JMP     INT10D
WRTTY:
                CMP     AL,0DH
                JNZ     CHK0A
                MOV     DL,0
                JMP     SETCUR
CHK0A:          CMP     AL,0AH
                JNZ     NOTCTL
                INC     DH
                CMP     DH,1FH
                JB      NOFOLD
                MOV     DH,0
NOFOLD:         JMP     SETCUR
NOTCTL:
                PUSH    ES
                PUSH    0B800H
                POP     ES
                MOV     AH,BL   ;AH=attribute
                PUSH    BX

                MOV     BX,[VRAM]

                MOV     [ES:BX],AX
                INC     BX
                INC     BX
                CMP     BX,12C0H
                JB      NOWRAP
                MOV     BX,0000H
NOWRAP:
                MOV     [VRAM],BX
                POP     BX
                POP     ES
                JMP     INT10D

SETMODE:
                CMP     AL,03
                JNZ     INT10D
                XOR     DI,DI
                PUSH    ES
                PUSH    0B800H
                POP     ES
                MOV     AX,0720H
                MOV     CX,960H
                REP     STOSW
                POP     ES
                JMP     INT10D

INTA0:
                JMP     0000H:MIMOS
 TIMES 512+7E00H-$ DB 0

