GophHub - zajo/appler/src/STARTUP.ASM


Raw File

;  _____________________________________________
; |                                             |
; |  Project:   APPLER                          |
; |  File:      STARTUP.ASM                     |
; |  Compiler:  16-bit TASM (2.5)               |
; |                                             |
; |  Subject:   Program Startup                 |
; |                                             |
; |  Author:    Emil Dotchevski                 |
; |_____________________________________________|

Startup         segment public
Startup         ends

                include GLOBALS.INC
                include INTERFAC.INC
                include FM.INC

Apple           segment public
                db      0FFFFh dup (0)
                org     0
                db      8Dh,51h,0C0h            ; 0000- STA C051
                db      8Dh,54h,0C0h            ; 0003- STA C054
                db      0A9h,0A0h               ; 0006- LDA #A0 <ÄÄÄÄÄ¿
                db      0A2h,0                  ; 0008- LDX #00       ³
                db      9Dh,0,4                 ; 000A- STA 400,x <Ä¿ ³
                db      0E8h                    ; 000D- INX         ³ ³
                db      0D0h,0FAh               ; 000E- BNE 000A ÄÄÄÙ ³
                db      0A5h,0Ch                ; 0010- LDA 0C        ³
                db      0C9h,7                  ; 0012- CMP #07       ³
                db      0B0h,5                  ; 0014- BCS 001B ÄÄÄ¿ ³
                db      0E6h,0Ch                ; 0016- INC 0C      ³ ³
                db      04Ch,6,0                ; 0018- JMP 0006 ÄÄÄÅÄÙ
                db      0B5h,28h                ; 001B- LDA 28,x <ÄÄÁÄ¿
                db      0F0h,0FEh               ; 001D- BEQ 001D      ³
                db      9,80h                   ; 001F- ORA #80       ³
                db      9Dh,0D0h,7              ; 0021- STA 07D0,x    ³
                db      0E8h                    ; 0024- INX           ³
                db      04Ch,1Bh,0              ; 0025- JMP 001B ÄÄÄÄÄÙ
                db      'ROM is missing, Apple halted. Press <F1>',0
Apple           ends



Startup         segment public
                assume  CS:Startup

StartHere:      xor     al,al
                out     21h,al
                mov     bx,sp
                shr     bx,4
                mov     ax,ss
                mov     cx,ds
                sub     ax,cx
                add     bx,ax
                inc     bx
                mov     ah,4Ah
                int     21h
                call    CheckVideoType          ; Check for video type
                call    CommandLine             ; Read ROM & Command Line Files
                call    SaveDosScr              ; Save DOS screen
                call    Advertisement           ; Show advertisement
                call    HookVectors             ; Hook 01 & 09 interrupts
                call    InitKeyboard            ; Turn keyboard lights off
                call    InitData                ; Build data tables
                call    SystemINIT
                call    InsertDisks             ; Insert Default Disk Files
                jmp     CALLpowerON             ; GO!


StartupON       proc    far
                call    HookVectors             ; Hook 01 & 09 interrupts
                call    InitKeyboard            ; Turn keyboard lights off
                call    SaveDosScr              ; Save DOS screen
                ret
StartupON       endp

StartupOFF      proc    far
                call    RestoreDosScr
                call    UnInitKeyboard
                call    UnHookVectors
                ret
StartupOFF      endp


CheckVideoType  Proc    near
                push    ds
                mov     ah,12h
                mov     bl,10h
                int     10h
                and     bl,not 10h              ; =0 if CGA or 64k EGA
                jz      ChkVideoType20
                cmp     bh,1
                jne     ChkVideoType10
                mov     ax,seg Port3?4h
                mov     ds,ax
                mov     DS:Port3?4h,3B4h
ChkVideoType10:
                pop     ds
                ret

ChkVideoType20: push    cs
                pop     ds
                mov     dx,offset NoEGAmessage
                mov     ah,9
                int     21h
                mov     ax,4C02h
                int     21h
;               exit    2

NoEGAmessage    db      0Dh,0Ah,'  This program requires 128k EGA or more.'
                db      0Dh,0Ah,'$'
CheckVideoType  Endp


RunFile?        db      0
StoredDS        dw      ?
DTA             db      80h dup (0)
Path            db      160 dup (0)

CommandLine     proc    near
                push    ds es
                mov     cs:StoredDS,ds
                mov     ah,62h
                int     21h
                mov     es,bx
                mov     es,es:[2Ch]
                xor     di,di
                mov     cx,0FFFFh
                cld
RF_SeekPath:    xor     al,al
        repne   scasb
                cmp     byte ptr es:[di],0
                jnz     RF_SeekPath
                mov     si,di
                add     si,3
                mov     ax,es
                mov     ds,ax
                push    cs
                pop     es
                mov     di,offset Path
                xor     bx,bx
RF_GetPath:     lodsb
                stosb
                cmp     al,'\'
                jne     RF_GP_1
                mov     bx,di
                jmp     RF_GetPath
RF_GP_1:        or      al,al
                jnz     RF_GetPath
                mov     cs:RF_FileSpecOfs,bx

                mov     es,cs:StoredDS
                push    cs
                pop     ds
                mov     dx,offset DTA
                mov     ah,1Ah
                int     21h
                mov     si,offset SysFileSpec
                call    CopyFileSpec
                mov     dx,offset Path
                mov     cx,0000000000100011b
                FindFirst
                jc      Init20
Init10:         push    cs
                pop     ds
                mov     si,offset DTA+1Eh
                call    CopyFileSpec
                mov     dx,offset Path
                call    ReadFile
                push    cs
                pop     ds
                mov     dx,offset DTA
                FindNext
                jnc     Init10
Init20:         cmp     byte ptr es:[80h],0
                jz      Init25
                mov     byte ptr cs:SkipTitle?,1
Init25:         mov     di,81h
InitCycle:      xor     cx,cx
                mov     cl,ES:[80h]
                or      cx,cx
                je      InitCycle2
                cld
                mov     al,' '
        repe    scasb
InitCycle2:     je      InitCont_J
                cmp     byte ptr es:[di-1],'/'
                jne     i_not_option
                mov     ax,word ptr es:[di]
                cmp     ah,' '
                je      i_opt_ok
                cmp     ah,0Dh
                jne     i_unknown
i_opt_ok:       cmp     al,'?'
                jne     i_not_help
                push    cs
                pop     ds
                mov     dx,offset i_help_mes
                mov     ah,9
                int     21h
                jmp     i_halt
i_not_help:     or      al,20h
                cmp     al,'k'
                jne     i_unknown
                push    ds
                mov     ax,Keyboard
                mov     ds,ax
                assume  ds:Keyboard
                mov     K_KeyboardRet1,0CBh
                mov     K_KeyboardRet2,0CBh
                mov     K_KeyboardRet3,0CBh
                mov     K_KeyboardRet4,0CBh
                pop     ds
                assume  ds:nothing
                inc     di
                dec     cx
                or      cx,cx
                jz      InitCont_J
                mov     es:[80h],cl
                jmp     InitCycle
i_unknown:      mov     dx,offset UnknownMes
                push    cs
                pop     ds
                push    ax
                mov     ah,9
                int     21h
                mov     ah,2
                pop     dx
                cmp     dl,2Dh
                je      i_blank_prm
                int     21h
i_blank_prm:    mov     dl,0Ah
                int     21h
i_halt:         mov     ax,4C02h
                int     21h
;               exit    2
i_not_option:   cmp     byte ptr es:[di-1],'-'
                mov     cs:RunFile?,1
ESD_0:          jne     ESD_1
                mov     cs:RunFile?,0
        repe    scasb
                je      InitCont_J
ESD_1:          lea     si,[di-1]
        repne   scasb
                jne     InitCycle3
                dec     di
InitCycle3:     xor     al,al
                stosb
                mov     ES:[80h],cl

                push    di ds es
                mov     di,offset Path
                push    es
                pop     ds
                push    cs
                pop     es
                xor     dl,dl
AddExtLoop:     lodsb
                stosb
                cmp     al,'.'
                jne     AE_1
                mov     dl,1
AE_1:           cmp     al,'\'
                jne     AE_2
                xor     dl,dl
AE_2:           or      al,al
                jnz     AddExtLoop
                dec     di
                mov     cx,5
                mov     si,offset DefaultExt
                push    cs
                pop     ds
                or      dl,dl
                jnz     DontAddExt
        rep     movsb
DontAddExt:     mov     dx,offset Path
                call    ReadFile
                pop     es ds di

                jmp     InitCycle
InitCont_J:     jmp     InitCont

DefaultExt      db      '.APL',0



RF_DS_SI        label   dword
RF_SI           dw      ?
RF_DS           dw      ?
ReadFile:       mov     cs:[InitErrBuf],dx      ; DS:DX - read file name
                mov     cs:[InitErrBuf][2],ds
                mov     cs:RF_SI,dx
                mov     cs:RF_DS,ds
                mov     ax,3D00h
                int     21h
                jc      InitErrNC
                xchg    ax,bx
                push    cs
                pop     ds
                mov     dx,offset InitFileAdr
                mov     cx,4
                mov     ah,3Fh
                int     21h
                jc      InitErrC
                mov     ax,Apple
                mov     ds,ax
                mov     dx,CS:InitFileAdr
                mov     cx,CS:InitFileLen
                mov     ax,dx
                add     ax,cx
                jnc     RF_NotBig
                sub     cx,ax     ;Decrease file length to fit in Apple segment
RF_NotBig:      cmp     cs:RunFile?,0
                jz      ESD_2
                push    cx si di ds es
                push    ds
                pop     es
                push    cs
                pop     ds
                mov     si,offset SlotPrg
                mov     di,0C700h
                mov     cx,SlotLen
        rep     movsb
                mov     di,0C700h
                mov     ds:SlotLen[di],dx
                pop     es ds di si cx
ESD_2:          mov     ah,3Fh
                int     21h
                jc      InitErrC
                mov     cs:InitFileLen,ax
                mov     ah,3Eh
                int     21h
                jc      InitErrNC
                lds     si,cs:RF_DS_SI
                mov     ax,cs:InitFileAdr
                mov     bx,cs:InitFileLen
                mov     ch,FF_SHOWADDR? or FF_MODIFYADDR? or FF_MODIFYTYPE?
                mov     cl,FD_CODE
                call    FileIsLoaded
                ret

InitErrC:       mov     ah,3Eh
                int     21h
InitErrNC:      push    cs
                pop     ds
                mov     dx,offset InitErrMes1
                mov     ah,9
                int     21h
                les     di,dword ptr CS:[InitErrBuf]
                xor     ax,ax
                mov     cx,ax
                dec     cx
                cld
        repne   scasb
                dec     di
                mov     al,'$'
                stosb
                lds     dx,dword ptr CS:[InitErrBuf]
                mov     ah,9
                int     21h
                push    cs
                pop     ds
                mov     dx,offset InitErrMes2
                mov     ah,9
                int     21h
                mov     ax,4C01h
                int     21h
;               exit    1
InitCont:       pop     es ds
                ret

RF_FileSpecOfs  dw      ?
CopyFileSpec:   push    ax si di ds es
                mov     ax,Startup
                mov     ds,ax
                mov     es,ax
                mov     di,cs:RF_FileSpecOfs
                cld
CopyFileSpecLp: lodsb
                stosb
                or      al,al
                jnz     CopyFileSpecLp
                pop     es ds di si ax
                ret

SysFileSpec     db      '*.ROM',0

InitFileAdr     dw      0
InitFileLen     dw      0

InitErrBuf      dw      2 dup (0)

UnknownMes      db      0Dh,0Ah,'  Bad command line parameter: /$'
InitErrMes1     db      0Dh,0Ah,'  APPLER: Can''t read file $'
InitErrMes2     db      0Dh,0Ah,'$'
i_help_mes      db      0Dh,0Ah
                db      '  Appler - an Apple ][ emulator by Emil Dotchevski & Alexander Patalenski',0Dh,0Ah,0Dh,0Ah
                db      '  Command line syntax: appler [[-]<filename[.APL]>] ... [/k] [/?]',0Dh,0Ah
                db      '    <filename> - ''.APL'' file to load (use ''-'' to disable file execution)',0Dh,0Ah
                db      '    /k         - don''t set keyboard params',0Dh,0Ah
                db      '    /?         - this message',0Dh,0Ah
                db      '$'

SlotPrg         db      0A9h,20h,0A9h,0,0A9h,3,0A9h,3Ch,4Ch
SlotEnd         label   byte
SlotLen         =       offset SlotEnd - offset SlotPrg
CommandLine     endp



; OpenDiskFile Entry Params:
;   DS:DX^  -- Filename
;   AL      -- Access Mode: 0 - Don't Change, else Read Only
;   BL      -- Type: 0 - Nibble, 1 - DOS 3.3
;   BH      -- Volume (for DOS 3.3 type only)
;   CF      -- 0 - Disk1, 1 - Disk2
InsertDisks     proc    near
                push    ds
                push    cs
                pop     ds
                mov     dx,offset ID_nameDSK
                mov     bl,1
                mov     bh,0FEh
                mov     al,0
                clc
                call    OpenDiskFile
                jnc     ID_Ret
                mov     dx,offset ID_nameNBL
                mov     bl,0
                mov     al,0
                clc
                call    OpenDiskFile
ID_Ret:         pop     ds
                ret
ID_nameNBL      db      'APPLER.NBL',0
ID_nameDSK      db      'APPLER.DSK',0
InsertDisks     endp



Advertisement   proc    near
                push    ds es
                push    cs
                pop     ds
                cmp     SkipTitle?,0
                jnz     a_SkipTitle
                mov     ax,0B800h
                mov     es,ax
                mov     di,80*24*2
                mov     cx,80
                xor     ax,ax
                cld
        rep     stosw
                mov     si,offset a_picture
                push    es
                push    cs
                pop     es
                mov     ax,1201h
                mov     bl,30h
                int     10h
                mov     ax,83h
                int     10h
                mov     ax,1110h
                mov     cx,76
                mov     bx,0E00h
                mov     dx,0B0h
                mov     bp,offset a_GraphSet
                int     10h
                mov     ah,01h
                mov     cx,2000h
                int     10h
                mov     ax,1202h
                mov     bl,30h
                int     10h
                mov     ax,1000h
                mov     bx,2A0Ah
                int     10h
                mov     bx,260Eh
                int     10h
                mov     bx,2406h
                int     10h
                mov     bx,1C03h
                int     10h
                mov     ax,1003h
                mov     bl,0
                int     10h
                cld
                pop     es
                xor     di,di
                mov     ah,7
                mov     cx,80*24
a_loop:         lodsb
                or      al,al
                jnz     a_not_attr
                lodsb
                mov     ah,al
                jmp     a_loop
a_not_attr:     stosw
                loop    a_loop
                xor     ax,ax
                int     16h
a_SkipTitle:    pop     es ds
                ret

SkipTitle?      db      0
Buffer1000h     label   byte
a_picture       db      0,03h,'ÐÜññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññÝÑ'
                db      0,03h,'ð ',0,00Ah,'Ð',0,0AFh,'                                                                          ',0,00Ah,'Ñ',0,03,' ð'
                db      0,03h,'ð ',0,0A0h,'  ÐððððððððððÑ                             ÙððÑ                             ',0,03,' ð'
                db      0,03h,'ð ',0,0E0h,'  ðððÜññññÝððð                              ððð                          ôõ ',0,03,' ð'
                db      0,03h,'ð ',0,0E0h,'  ððð      ððð ÙðððððððððððÑ ÙðððððððððððÑ  ððð  ÐððððððððððÑ ÙððÑÐððððððÑ  ',0,03,' ð'
                db      0,03h,'ð ',0,060h,'  ðððÚ    Ûððð  ðððÜññññÝððð  ðððÜññññÝððð  ððð  ðððÜññññÝððð  ðððÜñññÝððð  ',0,03,' ð'
                db      0,03h,'ð ',0,060h,'  ðððððððððððð  ððð      ððð  ððð      ððð  ððð  ðððÞòòòòßððð  ððð     Öñ×  ',0,03,' ð'
                db      0,03h,'ð ',0,040h,'  ðððÜññññÝððð  ððð      ððð  ððð      ððð  ððð  ðððððððððððÓ  ððð          ',0,03,' ð'
                db      0,03h,'ð ',0,040h,'  ððð      ððð  ðððÞòòòòßððð  ðððÞòòòòßððð  ððð  ðððä       Û  ððð          ',0,03,' ð'
                db      0,03h,'ð ',0,050h,' ÛðððÚ    ÛðððÚ ðððððððððððÓ  ðððððððððððÓ ÛðððÚ ÒððððððððððÓ ÛðððÚ         ',0,03,' ð'
                db      0,03h,'ð ',0,050h,'                ðððØ          ðððØ                                          ',0,03,' ð'
                db      0,03h,'ð ',0,010h,'               ÛðððÚ         ÛðððÚ                                          ',0,03,' ð'
                db      0,03h,'ð ',0,001h,'Ò',0,01Fh,'                                                                          ',0,001h,'Ó',0,03,' ð'
                db      0,03h,'ð                                                                              ð'
                db      0,03h,'ð ',0,00Fh,' ÐÜñÝÑ ',0,008h,'The Best!',0,00Fh,'  ÙÑ        ÝÑ ÐÜ     ÐÜññù           ÙÑ     ÛÑÚ            ',0,03,' ð'
                db      0,03h,'ð ',0,00Fh,' ðÚ Ûð ÐÜñÝÑ ÐÜñÝÑ ð ÐèñéÑ   ð ð      ðÞòò ÙêíðíÑ ð  ð ð ÐÜÝêÙðØ  ÐÜÝÑÙêÜÝÑ ',0,03,' ð'
                db      0,03h,'ð ',0,00Fh,' ðÜñÝð ðÚ Ûð ðÚ Ûð ð ðèññ×  Ûð ðÚ     ðä    ð ð ð ðÚÛð ð ðÚÛð ðÚ ÛðÚÛð ð    ',0,03,' ð'
                db      0,03h,'ð ',0,00Fh,' ñ   ñ ðÜññ× ðÜññ× ñ Öñññ×  ñ× Öñ     Öññññ ñ ñ ñ Öñ×Öâñ Öñ×ÖâÖññ×Öññ× ñ    ',0,03,' ð'
                db      0,03h,'ð ',0,00Fh,'       ñ     ñ                                    ',0,008h,'°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈ ',0,03,' ð'
                db      0,03h,'ð                                                                              ð'
                db      0,03h,'ð ',0,00Bh,'                  by Alexander Patalenski & Emil Dotchevski                 ',0,03,' ð'
                db      0,03h,'ð ',0,00Fh,'                 óóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóó                ',0,03,' ð'
                db      0,03h,'ð ',0,00Bh,'                        https://github.com/zajo/appler                      ',0,03,' ð'
                db      0,03h,'ÒÞòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòßÓ'
end_ega_picture label   byte
                db      1000h - (offset end_ega_picture - offset a_picture) dup (0)
Advertisement   endp


HookVectors     proc    near
                push    ds es
                mov     ax,3509h
                int     21h
                mov     word ptr CS:[OldKbd],bx
                mov     word ptr CS:[OldKbd][2],es
                mov     al,1
                int     21h
                mov     word ptr CS:[OldDebug],bx
                mov     word ptr CS:[OldDebug][2],es
                mov     al,24h
                int     21h
                mov     word ptr CS:[OldCriticalErr],bx
                mov     word ptr CS:[OldCriticalErr][2],es
                mov     ax,seg k_int09
                mov     ds,ax
                mov     dx,offset k_int09
                mov     ax,2509h
                int     21h
                mov     bx,seg WaitInstrEnd
                mov     ds,bx
                mov     dx,offset WaitInstrEnd
                mov     al,1
                int     21h
                mov     bx,seg CriticalErrProc
                mov     ds,bx
                mov     dx,offset CriticalErrProc
                mov     al,24h
                int     21h
                pop     es ds
                ret

OldKbd          dd      0
OldDebug        dd      0
OldCriticalErr  dd      0
HookVectors     endp



UnHookVectors   proc    near
                push    ds
                lds     dx,cs:OldDebug
                mov     ax,2501h
                int     21h
                lds     dx,cs:OldKbd
                mov     al,9
                int     21h
                lds     dx,cs:OldCriticalErr
                mov     al,24h
                int     21h
                pop     ds
                ret
UnHookVectors   endp


CriticalErrProc proc    far
                mov     al,3
                iret
CriticalErrProc endp



InitKeyboard    proc    near
                push    ds
                xor     ax,ax
                mov     ds,ax
                mov     ds:[417h],ax
                call    UpdateKeyboard
                mov     ax,Keyboard
                mov     ds,ax
                assume  ds:Keyboard
                xor     ax,ax
                mov     ds:k_Shifts,ax
                call    SetLEDs
                assume  ds:nothing
                pop     ds
                ret
InitKeyboard    endp



UnInitKeyboard  proc    near
                push    ax si ds
                xor     ax,ax
                call    SetLEDs
                mov     ds,ax
                mov     ds:[417h],ax
UIK_Loop1:      mov     ah,1
                int     16h
                jz      UIK_ok
                xor     ax,ax
                int     16h
                jmp     UIK_Loop1
UIK_ok:         pop     ds si ax
                ret
UnInitKeyboard  endp



SaveDosScr:     push    ds es
                mov     ah,0Fh
                int     10h
                mov     cs:ModeSvd,al
                mov     cs:PageSvd,bh
                mov     ah,3
                int     10h
                mov     cs:CursorSvd,dx
                mov     cs:CursorShapeSVD,cx
                mov     cx,80 * 25
                mov     si,0B800h
                mov     ds,si
                push    cs
                pop     es
                xor     si,si
                mov     di,offset DosScrSvd
                cld
                rep     movsw
                mov     cx,2021h
                mov     ah,1
                int     10h
                pop     es ds
                ret

RestoreDosScr:  push    ds es
                mov     ah,0Fh
                int     10h
                xor     ah,ah
                cmp     al,2
                jb      RDS_Set
                cmp     al,cs:ModeSvd
                je      RDS_DontSet
RDS_Set:        mov     al,cs:ModeSvd
                int     10h
RDS_DontSet:    mov     al,cs:PageSvd
                mov     al,0
                mov     ah,5
                int     10h
                mov     bh,cs:PageSvd
                mov     ah,2
                mov     dx,cs:CursorSvd
                int     10h
                mov     ah,1
                mov     cx,cs:CursorShapeSVD
                int     10h
                mov     cx,80 * 25
                mov     si,0B800h
                mov     es,si
                push    cs
                pop     ds
                xor     di,di
                mov     si,offset DosScrSvd
                cld
        rep     movsw
                pop     es ds
                ret

DosScrSvd       dw      80 * 25 dup (0)
ModeSvd         db      0
PageSvd         db      0
CursorSvd       dw      0
CursorShapeSVD  dw      0


DS_CurrentVM    db      ?
DosShell        proc    far
                push    ax bx cx dx si di bp ds es
                mov     ah,0Fh
                int     10h
                mov     cs:DS_CurrentVM,al
                mov     ah,62h
                int     21h
                mov     es,bx
                mov     ds,es:[2Ch]
                mov     es,es:[2Ch]
                xor     di,di
                mov     si,di
                mov     bx,di
                cld
DS_FindEnd:     lodsb
                inc     bx
                or      al,al
                jnz     DS_FindEnd
                lodsb
                inc     bx
                or      al,al
                jnz     DS_FindEnd
                xor     ax,ax
                push    cs
                pop     ds
DS_ScanLoop:    mov     si,offset DS_ComSpecStr
                mov     di,ax
                mov     cx,8
        rep     cmpsb
                je      DS_Found
                inc     ax
                dec     bx
                jnz     DS_ScanLoop
                jmp     DS_Ret
DS_Found:       push    di es
                call    SystemTINI
                call    StartupOFF
                pop     es di
                push    cs
                pop     ds
                mov     dx,offset DS_Message
                mov     ah,9
                int     21h
                push    es
                pop     ds
                push    cs
                pop     es
                mov     dx,di
                mov     bx,offset DS_EPB
                mov     cs:DS_save_ss,ss
                mov     cs:DS_save_sp,sp
                mov     ax,4B00h
                int     21h
                mov     ss,cs:DS_save_ss
                mov     sp,cs:DS_save_sp
                jnc     DS_ok
                push    cs
                pop     ds
                mov     dx,offset DS_NoMemMes
                mov     ah,9
                int     21h
DS_WaitEsc:     xor     ax,ax
                int     16h
                cmp     al,27
                jne     DS_WaitEsc
DS_ok:          call    StartupON
                call    SystemINIT
DS_Ret:         mov     ah,0Fh
                int     10h
                cmp     al,cs:DS_CurrentVM
                je      DS_DontSet
                xor     ax,ax
                mov     al,cs:DS_CurrentVM
                int     10h
DS_DontSet:     cmp     al,3
                je      RS_Exit
                mov     ax,seg C050
                mov     es,ax
                assume  es:seg C050
                mov     al,es:C050
                mov     bp,12                   ; Set Screen
                call    SIO_Services
                assume  es:nothing
RS_Exit:        pop     es ds bp di si dx cx bx ax
                ret

DS_ComSpecStr   db      'COMSPEC='
DS_EPB          dw      0
                dw      offset DS_CMDline, seg DS_CMDline
                dd      2 dup (0)
DS_CMDline      db      0,0Dh
DS_save_ss      dw      ?
DS_save_sp      dw      ?
DS_Message      db      0Dh,0Ah,'Enter ''EXIT'' to return to APPLER...$'
DS_NoMemMes     db      0Dh,'Can''t run command interpreter (not enough memory?)'
                db      0Dh,0Ah,0Ah,'         Press <Esc> to return to APPLER',0Dh,0Ah,'$'
DosShell        endp



                assume  DS:nothing
QuitAppler      proc    far
                call    SystemTINI
                call    StartupOFF
                push    cs
                pop     ds
                mov     dx,offset ExitMes
                mov     ah,9
                int     21h
                mov     ax,4C00h
                int     21h
;               exit    0                     ; Normal Program EXIT
QuitAppler      endp

ExitMes         db      0Ah,0Dh,'  Back to reality (of sorts)...',0Ah,0Dh,'$'


Screen          label   word
a_BegSet        label   byte
a_GraphSet      db      000h,000h,000h,000h,08Ah,08Bh,0AAh
                db      0AAh,0AAh,052h,000h,000h,000h,000h
                db      000h,000h,014h,007h,094h,054h,014h
                db      014h,014h,013h,000h,000h,000h,000h
                db      000h,000h,020h,038h,020h,021h,021h
                db      021h,0A5h,018h,000h,000h,000h,000h
                db      000h,000h,000h,000h,0CEh,029h,029h
                db      0C9h,009h,0E9h,000h,000h,000h,000h
                db      000h,000h,008h,008h,00Eh,009h,009h
                db      009h,009h,00Eh,000h,000h,000h,000h
                db      000h,000h,000h,000h,048h,048h,048h
                db      048h,038h,008h,008h,070h,000h,000h
                db      000h,000h,040h,070h,042h,042h,042h
                db      042h,04Ah,031h,000h,000h,000h,000h
                db      000h,000h,000h,000h,026h,029h,0A9h
                db      0A9h,0A9h,046h,000h,000h,000h,000h
                db      000h,000h,000h,000h,00Eh,009h,009h
                db      009h,009h,00Eh,008h,008h,000h,000h
                db      000h,000h,000h,000h,031h,04Ah,04Ah
                db      04Ah,04Ah,031h,000h,000h,000h,000h
                db      000h,000h,000h,000h,094h,05Ah,050h
                db      050h,050h,090h,000h,000h,000h,000h
                db      000h,000h,010h,010h,01Ch,012h,012h
                db      012h,012h,01Ch,000h,000h,000h,000h
                db      000h,000h,006h,002h,092h,092h,092h
                db      092h,092h,06Ah,000h,000h,000h,000h
                db      000h,000h,000h,000h,069h,092h,092h
                db      092h,092h,071h,010h,010h,0E0h,000h
                db      000h,000h,000h,000h,0CAh,04Dh,048h
                db      048h,048h,0A8h,000h,000h,000h,000h
                db      000h,000h,040h,000h,04Eh,052h,052h
                db      052h,052h,04Dh,000h,000h,000h,000h
                db      000h,000h,000h,000h,070h,048h,048h
                db      048h,048h,048h,000h,000h,000h,000h
                db      000h,000h,000h,000h,072h,04Bh,04Ah
                db      04Ah,04Ah,072h,040h,040h,000h,000h
                db      000h,000h,000h,000h,08Ch,052h,012h
                db      012h,012h,00Ch,000h,000h,000h,000h
                db      000h,000h,000h,000h,06Ah,093h,092h
                db      092h,092h,072h,010h,0E0h,000h,000h
                db      000h,000h,000h,000h,08Eh,052h,012h
                db      012h,012h,00Dh,000h,000h,000h,000h
                db      000h,000h,000h,000h,079h,055h,055h
                db      055h,055h,055h,000h,000h,000h,000h
                db      000h,000h,000h,000h,0E3h,054h,054h
                db      057h,054h,053h,000h,000h,000h,000h
                db      000h,000h,000h,000h,028h,0B5h,0A0h
                db      0A0h,020h,0A1h,000h,000h,000h,000h
                db      000h,000h,000h,000h,0C0h,000h,0C0h
                db      020h,020h,0C0h,000h,000h,000h,000h
                db      000h,000h,000h,000h,000h,000h,000h
                db      000h,000h,000h,000h,000h,000h,000h
                db      000h,000h,000h,000h,000h,000h,000h
                db      000h,000h,000h,000h,000h,000h,000h
                db      000h,000h,000h,000h,000h,000h,000h
                db      000h,000h,000h,000h,000h,000h,000h
                db      000h,000h,000h,000h,000h,000h,000h
                db      000h,000h,000h,000h,000h,000h,000h
                db      000h,000h,000h,000h,000h,000h,000h
                db      000h,000h,000h,000h,000h,000h,000h
                db      000h,000h,000h,000h,000h,000h,000h
                db      000h,000h,000h,000h,000h,000h,000h
                db      000h,000h,000h,000h,000h,000h,000h
                db      000h,000h,000h,000h,000h,000h,000h
                db      000h,007h,01Fh,03Fh,07Fh,0FFh,0FFh
                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
                db      000h,0E0h,0F8h,0FCh,0FEh,0FFh,0FFh
                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
                db      0FFh,0FFh,07Fh,03Fh,01Fh,007h,000h
                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
                db      0FFh,0FFh,0FEh,0FCh,0F8h,0E0h,000h
                db      000h,000h,000h,000h,000h,000h,000h
                db      000h,007h,01Fh,03Fh,07Fh,0FFh,0FFh
                db      000h,000h,000h,000h,000h,000h,000h
                db      000h,0E0h,0F8h,0FCh,0FEh,0FFh,0FFh
                db      0FFh,0FFh,07Fh,03Fh,01Fh,007h,000h
                db      000h,000h,000h,000h,000h,000h,000h
                db      0FFh,0FFh,0FEh,0FCh,0F8h,0E0h,000h
                db      000h,000h,000h,000h,000h,000h,000h
                db      0FFh,0F8h,0E0h,0C0h,080h,000h,000h
                db      000h,000h,000h,000h,000h,000h,000h
                db      0FFh,01Fh,007h,003h,001h,000h,000h
                db      000h,000h,000h,000h,000h,000h,000h
                db      000h,000h,000h,000h,000h,000h,000h
                db      000h,000h,080h,0C0h,0E0h,0F8h,0FFh
                db      000h,000h,000h,000h,000h,000h,000h
                db      000h,000h,001h,003h,007h,01Fh,0FFh
                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
                db      0FFh,0F8h,0E0h,0C0h,080h,000h,000h
                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
                db      0FFh,01Fh,007h,003h,001h,000h,000h
                db      000h,000h,080h,0C0h,0E0h,0F8h,0FFh
                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
                db      000h,000h,001h,003h,007h,01Fh,0FFh
                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
                db      000h,000h,000h,000h,000h,000h,000h
                db      0FFh,0F8h,0E0h,0C0h,080h,000h,000h
                db      000h,000h,000h,000h,000h,000h,000h
                db      0FFh,01Fh,007h,003h,001h,000h,000h
                db      000h,000h,080h,0C0h,0E0h,0F8h,0FFh
                db      000h,000h,000h,000h,000h,000h,000h
                db      000h,000h,001h,003h,007h,01Fh,0FFh
                db      000h,000h,000h,000h,000h,000h,000h
                db      0FFh,0F8h,0E0h,0C0h,080h,000h,000h
                db      000h,000h,080h,0C0h,0E0h,0F8h,0FFh
                db      0FFh,01Fh,007h,003h,001h,000h,000h
                db      000h,000h,001h,003h,007h,01Fh,0FFh
                db      0FFh,0F8h,0E0h,0C0h,0E0h,0F8h,0FFh
                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
                db      0FFh,01Fh,007h,003h,007h,01Fh,0FFh
                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
                db      0FFh,0F8h,0E0h,0C0h,0E0h,0F8h,0FFh
                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
                db      0FFh,01Fh,007h,003h,007h,01Fh,0FFh
                db      000h,0C3h,0E7h,0FFh,0FFh,0FFh,0FFh
                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
                db      0FFh,0FFh,0FFh,0FFh,0E7h,0C3h,000h
                db      000h,000h,000h,000h,000h,000h,000h
                db      0C3h,0E7h,0FFh,0FFh,0FFh,0FFh,0FFh
                db      0FFh,0FFh,0FFh,0FFh,0FFh,0E7h,0C3h
                db      000h,000h,000h,000h,000h,000h,000h
                db      000h,0C3h,0E7h,0FFh,0FFh,0FFh,0FFh
                db      000h,000h,000h,000h,000h,000h,000h
                db      000h,000h,000h,000h,000h,000h,000h
                db      0FFh,0FFh,0FFh,0FFh,0E7h,0C3h,000h
                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
                db      000h,000h,000h,000h,000h,000h,000h
                db      000h,000h,000h,000h,000h,000h,0FFh
                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
                db      0FFh,000h,000h,000h,000h,000h,000h
                db      000h,000h,000h,000h,000h,000h,000h
                db      000h,000h,000h,000h,07Eh,07Eh,018h
                db      018h,018h,018h,018h,018h,000h,000h
                db      000h,000h,000h,000h,0C6h,0EEh,0FEh
                db      0D6h,0C6h,0C6h,0C6h,0C6h,000h,000h
                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ; not used
                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ; not used
                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ; not used
                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ; not used
                db      007h,01Fh,03Fh,07Fh,0FFh,0FFh,0FFh
                db      000h,000h,000h,000h,000h,000h,000h
                db      0E0h,0F8h,0FCh,0FEh,0FFh,0FFh,0FFh
                db      000h,000h,000h,000h,000h,000h,000h
                db      000h,000h,000h,000h,000h,000h,000h
                db      0FFh,0FFh,0FFh,07Fh,03Fh,01Fh,007h
                db      000h,000h,000h,000h,000h,000h,000h
                db      0FFh,0FFh,0FFh,0FEh,0FCh,0F8h,0E0h
a_EndSet        label   byte
                dw      (80*26) - ((offset a_EndSet - offset a_BegSet) / 2) dup (0)

Startup         ends

                END     StartHere

Generated by GNU Enscript 1.6.6, and GophHub 1.3.