Login

Subversion Repositories NedoOS

Rev

Rev 852 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

;не включаем gfxmode, чтобы idle никогда не получал фокус
;по умолчанию стоит текстмод
        ld sp,0x4000 ;нельзя ниже 0x3b00 и нельзя пересечься с resident (если мы в pgtrdosfs)
        ld e,7
        OS_CLS
        ;если сделать SETGFX, то после введения терминалов появится лишний терминал под idle
        if atm==1
        ld a,(0x0086) ;ok ;copied in main.asm (see +6)
        inc a
        jr nz,.valid_ers_version
        ld hl,.ers_err_str
        call prtext
        di
        halt
.ers_err_str
        defb "You need update ERS to version 0.58.12 or newer!\r\nhttp://zxevo.ru/zxevo.rom",0x00
.valid_ers_version
        endif
        OS_GETMAINPAGES
;dehl=номера страниц в 0000,4000,8000,c000
        push hl
        OS_DELPAGE
        pop hl
        push hl
        ld e,h
        OS_DELPAGE
        pop hl
        ld e,l
        OS_DELPAGE
               
                if atm==1
;заставка
                ld hl,spr_cat
logo_loop
                push hl
        ld hl,spr_str
        call prtext
                pop hl
                ld b,16
logo_loop1
                ld a,(hl)
                inc hl
                cp 0xff
                ld c,a
                jr z,logo_end
logo_pix_loop
                ld a,0xdb
                sla c
                jr c,logo_no_pix
                ld a,' '
logo_no_pix
                push hl
                push bc
                push af
                PRCHAR
                pop af
                PRCHAR
                pop bc
                pop hl
                dec b
                ld a,b
                cp 8
                jr z,logo_loop1
                or a
                jr nz,logo_pix_loop
                jr logo_loop
               
spr_cat
        defb %00100000, %00000100
        defb %00110000, %00001100
        defb %00111011, %11011100
        defb %00111111, %11111100
        defb %01100011, %11000110
        defb %01110001, %10001110
        defb %00111111, %11111100
        defb %00001111, %11110000
        defb %00000011, %11000000
        defb %00000000, %00000000
        defb %00000001, %10000000
        defb %00000001, %10000000
        defb %00000011, %11000000
        defb %00000011, %11000000
        defb %00000011, %11000000
        defb %00000111, %11100000
        defb %00001111, %11110000
        defb %00001111, %11110000
        defb %00000111, %11100000
        defb %00011111, %11111000
        defb %00111111, %11111100
        defb 0xff
spr_str
        db "\r\n                        ",0
logo_end       
                ld de,0
                OS_SETXY
                endif
               
        ld e,'A'
mountdrives0
        push de
        ld a,e
        ld (tdrivemounted_drive),a
        OS_MOUNT
        or a
        jr nz,.mnt_fail
        ld hl,tdrivemounted
        call prtext
        pop de
                jr .mnt_next
.mnt_fail
        pop de
                cp 13           ;There is no valid FAT volume on the physical drive
                jr z,.mnt_next
                cp 10           ;The physical drive is write protected
                jr z,.mnt_next
                ld a,e
                cp 'M'
                jr nc,.mnt_next
                dec a
                or %00000011    ;Next drive
                inc a
                ld e,a
.mnt_next
        inc e
        ld a,e
        cp 'P'
        jr nz,mountdrives0
               
idle_runcmd
        ;ld de,tpipename
        ;push de
        ;OS_OPENHANDLE
        ;ld a,b
        ;ld (pipe1handle),a
        ;pop de
        ;OS_OPENHANDLE
        ;ld a,b
        ;ld (pipe2handle),a

        OS_SETSYSDRV

        ld hl,tcmdloading
        call prtext
       
        ;ld de,cmd_filename
        ;OS_OPENHANDLE
        ;or a
        ;jr nz,execcmd_error
       
        ;call idle_readapp ;делает CLOSE
       
        ;push af
        ;ld b,a
;pipehandles=$+1
;pipe1handle=$+1
;pipe2handle=$+2
         ;ld de,0
         ;ld h,0xff ;rnd
;b=id, e=stdin, d=stdout, h=stderr        
        ;OS_SETSTDINOUT
       
        ;pop af ;id
        ;ld e,a
        ;OS_RUNAPP


        ld de,term_filename
        OS_OPENHANDLE
        or a
        jr nz,execcmd_error
       
        call idle_readapp ;делает CLOSE
       
         ;push af
         ;ld b,a
         ;ld hl,(pipehandles)
         ;ld d,l
         ;ld e,h
         ;ld h,0xff ;rnd
;b=id, e=stdin, d=stdout, h=stderr        
         ;OS_SETSTDINOUT
         ;pop af ;id

        ld e,a
        ;jr $
        OS_RUNAPP
       
;понизить приоритет себе
        ld e,1
        OS_FREEZEAPP
       
idleloop
                if atm != 1
        halt ;читаем клавиатуру не слишком часто
                endif
        ;ld a,1
        ;out (0xfe),a
       
        ld a,0xfe
        in a,(0xfe)
        bit 3,a ;'c'
        jr nz,idleloop
        ld a,0x7f
        in a,(0xfe)
        bit 2,a ;'m'
        jr nz,idleloop
        ld a,0xfd
        in a,(0xfe)
        bit 2,a ;'d'
        jr nz,idleloop
        ld e,7
        OS_CLS
        ;jr $
        jp idle_runcmd

execcmd_error
        ld hl,tcmdnotfound
        call prtext
        jr idleloop

idle_readapp
        ld a,b
        ld (curhandle),a
       
        OS_NEWAPP ;для первой создаваемой задачи будут созданы первые два пайпа и подключены
;dehl=номера страниц в 0000,4000,8000,c000 нового приложения, b=id, a=error
        push bc ;b=id

        ld a,d
        SETPG32KHIGH
        push de
        push hl
        ld hl,cmdbuf
        ld de,0xc080
        ld bc,128  
        ldir ;command line
        pop hl
        pop de

        call readfile_pages_dehl

        ld a,(curhandle)
        ld b,a
        OS_CLOSEHANDLE

        pop af ;id
        ret

tcmdnotfound
        db "term.com not found",0x0d,0x0a,0
tcmdloading
        db "loading term.com",0x0d,0x0a,0
tdrivemounted
        db "Drive "
tdrivemounted_drive
        db "N mounted",0x0d,0x0a,0

cmdbuf
        db "term.com cmd.com autoexec.bat",0 ;чтобы потом входить в интерактивный режим (cmd проверяет первое слово), иначе придётся прописать в autoexec.bat команду cmd и иметь две задачи cmd (одну висящую в ожидании другого cmd)
       
prtext
prtext0
        ld a,(hl)
        or a
        ret z
        push hl
        PRCHAR ;testing (351/352t) (was 986/987t)
        pop hl
        inc hl
        jr prtext0

readfile_pages_dehl
        ld a,d
        SETPG32KHIGH
        ld a,0xc100/256
        call cmd_loadpage
        ret nz        
        ld a,e
        call cmd_loadfullpage
        ret nz
        ld a,h
        call cmd_loadfullpage
        ret nz
        ld a,l
cmd_loadfullpage
        SETPG32KHIGH
        ld a,0xc000/256
cmd_loadpage
;out: a=error
;keeps hl,de
        push de
        push hl
        ld d,a
        xor a
        ld l,a
        ld e,a
        sub d
        ld h,a ;de=buffer, hl=size
curhandle=$+1
        ld b,0
        OS_READHANDLE
        pop hl
        pop de
        or a
        ret

term_filename
        db "term.com",0
;cmd_filename
;        db "cmd.com" ;0 в конце подразумевается
stack
        ds 64
endstack