GophHub - zajo/appler/src/STARTUP.ASM


Raw File

    1	;  _____________________________________________
    2	; |                                             |
    3	; |  Project:   APPLER                          |
    4	; |  File:      STARTUP.ASM                     |
    5	; |  Compiler:  16-bit TASM (2.5)               |
    6	; |                                             |
    7	; |  Subject:   Program Startup                 |
    8	; |                                             |
    9	; |  Author:    Emil Dotchevski                 |
   10	; |_____________________________________________|
   11	
   12	Startup         segment public
   13	Startup         ends
   14	
   15	                include GLOBALS.INC
   16	                include INTERFAC.INC
   17	                include FM.INC
   18	
   19	Apple           segment public
   20	                db      0FFFFh dup (0)
   21	                org     0
   22	                db      8Dh,51h,0C0h            ; 0000- STA C051
   23	                db      8Dh,54h,0C0h            ; 0003- STA C054
   24	                db      0A9h,0A0h               ; 0006- LDA #A0 <ÄÄÄÄÄ¿
   25	                db      0A2h,0                  ; 0008- LDX #00       ³
   26	                db      9Dh,0,4                 ; 000A- STA 400,x <Ä¿ ³
   27	                db      0E8h                    ; 000D- INX         ³ ³
   28	                db      0D0h,0FAh               ; 000E- BNE 000A ÄÄÄÙ ³
   29	                db      0A5h,0Ch                ; 0010- LDA 0C        ³
   30	                db      0C9h,7                  ; 0012- CMP #07       ³
   31	                db      0B0h,5                  ; 0014- BCS 001B ÄÄÄ¿ ³
   32	                db      0E6h,0Ch                ; 0016- INC 0C      ³ ³
   33	                db      04Ch,6,0                ; 0018- JMP 0006 ÄÄÄÅÄÙ
   34	                db      0B5h,28h                ; 001B- LDA 28,x <ÄÄÁÄ¿
   35	                db      0F0h,0FEh               ; 001D- BEQ 001D      ³
   36	                db      9,80h                   ; 001F- ORA #80       ³
   37	                db      9Dh,0D0h,7              ; 0021- STA 07D0,x    ³
   38	                db      0E8h                    ; 0024- INX           ³
   39	                db      04Ch,1Bh,0              ; 0025- JMP 001B ÄÄÄÄÄÙ
   40	                db      'ROM is missing, Apple halted. Press <F1>',0
   41	Apple           ends
   42	
   43	
   44	
   45	Startup         segment public
   46	                assume  CS:Startup
   47	
   48	StartHere:      xor     al,al
   49	                out     21h,al
   50	                mov     bx,sp
   51	                shr     bx,4
   52	                mov     ax,ss
   53	                mov     cx,ds
   54	                sub     ax,cx
   55	                add     bx,ax
   56	                inc     bx
   57	                mov     ah,4Ah
   58	                int     21h
   59	                call    CheckVideoType          ; Check for video type
   60	                call    CommandLine             ; Read ROM & Command Line Files
   61	                call    SaveDosScr              ; Save DOS screen
   62	                call    Advertisement           ; Show advertisement
   63	                call    HookVectors             ; Hook 01 & 09 interrupts
   64	                call    InitKeyboard            ; Turn keyboard lights off
   65	                call    InitData                ; Build data tables
   66	                call    SystemINIT
   67	                call    InsertDisks             ; Insert Default Disk Files
   68	                jmp     CALLpowerON             ; GO!
   69	
   70	
   71	StartupON       proc    far
   72	                call    HookVectors             ; Hook 01 & 09 interrupts
   73	                call    InitKeyboard            ; Turn keyboard lights off
   74	                call    SaveDosScr              ; Save DOS screen
   75	                ret
   76	StartupON       endp
   77	
   78	StartupOFF      proc    far
   79	                call    RestoreDosScr
   80	                call    UnInitKeyboard
   81	                call    UnHookVectors
   82	                ret
   83	StartupOFF      endp
   84	
   85	
   86	CheckVideoType  Proc    near
   87	                push    ds
   88	                mov     ah,12h
   89	                mov     bl,10h
   90	                int     10h
   91	                and     bl,not 10h              ; =0 if CGA or 64k EGA
   92	                jz      ChkVideoType20
   93	                cmp     bh,1
   94	                jne     ChkVideoType10
   95	                mov     ax,seg Port3?4h
   96	                mov     ds,ax
   97	                mov     DS:Port3?4h,3B4h
   98	ChkVideoType10:
   99	                pop     ds
  100	                ret
  101	
  102	ChkVideoType20: push    cs
  103	                pop     ds
  104	                mov     dx,offset NoEGAmessage
  105	                mov     ah,9
  106	                int     21h
  107	                mov     ax,4C02h
  108	                int     21h
  109	;               exit    2
  110	
  111	NoEGAmessage    db      0Dh,0Ah,'  This program requires 128k EGA or more.'
  112	                db      0Dh,0Ah,'$'
  113	CheckVideoType  Endp
  114	
  115	
  116	RunFile?        db      0
  117	StoredDS        dw      ?
  118	DTA             db      80h dup (0)
  119	Path            db      160 dup (0)
  120	
  121	CommandLine     proc    near
  122	                push    ds es
  123	                mov     cs:StoredDS,ds
  124	                mov     ah,62h
  125	                int     21h
  126	                mov     es,bx
  127	                mov     es,es:[2Ch]
  128	                xor     di,di
  129	                mov     cx,0FFFFh
  130	                cld
  131	RF_SeekPath:    xor     al,al
  132	        repne   scasb
  133	                cmp     byte ptr es:[di],0
  134	                jnz     RF_SeekPath
  135	                mov     si,di
  136	                add     si,3
  137	                mov     ax,es
  138	                mov     ds,ax
  139	                push    cs
  140	                pop     es
  141	                mov     di,offset Path
  142	                xor     bx,bx
  143	RF_GetPath:     lodsb
  144	                stosb
  145	                cmp     al,'\'
  146	                jne     RF_GP_1
  147	                mov     bx,di
  148	                jmp     RF_GetPath
  149	RF_GP_1:        or      al,al
  150	                jnz     RF_GetPath
  151	                mov     cs:RF_FileSpecOfs,bx
  152	
  153	                mov     es,cs:StoredDS
  154	                push    cs
  155	                pop     ds
  156	                mov     dx,offset DTA
  157	                mov     ah,1Ah
  158	                int     21h
  159	                mov     si,offset SysFileSpec
  160	                call    CopyFileSpec
  161	                mov     dx,offset Path
  162	                mov     cx,0000000000100011b
  163	                FindFirst
  164	                jc      Init20
  165	Init10:         push    cs
  166	                pop     ds
  167	                mov     si,offset DTA+1Eh
  168	                call    CopyFileSpec
  169	                mov     dx,offset Path
  170	                call    ReadFile
  171	                push    cs
  172	                pop     ds
  173	                mov     dx,offset DTA
  174	                FindNext
  175	                jnc     Init10
  176	Init20:         cmp     byte ptr es:[80h],0
  177	                jz      Init25
  178	                mov     byte ptr cs:SkipTitle?,1
  179	Init25:         mov     di,81h
  180	InitCycle:      xor     cx,cx
  181	                mov     cl,ES:[80h]
  182	                or      cx,cx
  183	                je      InitCycle2
  184	                cld
  185	                mov     al,' '
  186	        repe    scasb
  187	InitCycle2:     je      InitCont_J
  188	                cmp     byte ptr es:[di-1],'/'
  189	                jne     i_not_option
  190	                mov     ax,word ptr es:[di]
  191	                cmp     ah,' '
  192	                je      i_opt_ok
  193	                cmp     ah,0Dh
  194	                jne     i_unknown
  195	i_opt_ok:       cmp     al,'?'
  196	                jne     i_not_help
  197	                push    cs
  198	                pop     ds
  199	                mov     dx,offset i_help_mes
  200	                mov     ah,9
  201	                int     21h
  202	                jmp     i_halt
  203	i_not_help:     or      al,20h
  204	                cmp     al,'k'
  205	                jne     i_unknown
  206	                push    ds
  207	                mov     ax,Keyboard
  208	                mov     ds,ax
  209	                assume  ds:Keyboard
  210	                mov     K_KeyboardRet1,0CBh
  211	                mov     K_KeyboardRet2,0CBh
  212	                mov     K_KeyboardRet3,0CBh
  213	                mov     K_KeyboardRet4,0CBh
  214	                pop     ds
  215	                assume  ds:nothing
  216	                inc     di
  217	                dec     cx
  218	                or      cx,cx
  219	                jz      InitCont_J
  220	                mov     es:[80h],cl
  221	                jmp     InitCycle
  222	i_unknown:      mov     dx,offset UnknownMes
  223	                push    cs
  224	                pop     ds
  225	                push    ax
  226	                mov     ah,9
  227	                int     21h
  228	                mov     ah,2
  229	                pop     dx
  230	                cmp     dl,2Dh
  231	                je      i_blank_prm
  232	                int     21h
  233	i_blank_prm:    mov     dl,0Ah
  234	                int     21h
  235	i_halt:         mov     ax,4C02h
  236	                int     21h
  237	;               exit    2
  238	i_not_option:   cmp     byte ptr es:[di-1],'-'
  239	                mov     cs:RunFile?,1
  240	ESD_0:          jne     ESD_1
  241	                mov     cs:RunFile?,0
  242	        repe    scasb
  243	                je      InitCont_J
  244	ESD_1:          lea     si,[di-1]
  245	        repne   scasb
  246	                jne     InitCycle3
  247	                dec     di
  248	InitCycle3:     xor     al,al
  249	                stosb
  250	                mov     ES:[80h],cl
  251	
  252	                push    di ds es
  253	                mov     di,offset Path
  254	                push    es
  255	                pop     ds
  256	                push    cs
  257	                pop     es
  258	                xor     dl,dl
  259	AddExtLoop:     lodsb
  260	                stosb
  261	                cmp     al,'.'
  262	                jne     AE_1
  263	                mov     dl,1
  264	AE_1:           cmp     al,'\'
  265	                jne     AE_2
  266	                xor     dl,dl
  267	AE_2:           or      al,al
  268	                jnz     AddExtLoop
  269	                dec     di
  270	                mov     cx,5
  271	                mov     si,offset DefaultExt
  272	                push    cs
  273	                pop     ds
  274	                or      dl,dl
  275	                jnz     DontAddExt
  276	        rep     movsb
  277	DontAddExt:     mov     dx,offset Path
  278	                call    ReadFile
  279	                pop     es ds di
  280	
  281	                jmp     InitCycle
  282	InitCont_J:     jmp     InitCont
  283	
  284	DefaultExt      db      '.APL',0
  285	
  286	
  287	
  288	RF_DS_SI        label   dword
  289	RF_SI           dw      ?
  290	RF_DS           dw      ?
  291	ReadFile:       mov     cs:[InitErrBuf],dx      ; DS:DX - read file name
  292	                mov     cs:[InitErrBuf][2],ds
  293	                mov     cs:RF_SI,dx
  294	                mov     cs:RF_DS,ds
  295	                mov     ax,3D00h
  296	                int     21h
  297	                jc      InitErrNC
  298	                xchg    ax,bx
  299	                push    cs
  300	                pop     ds
  301	                mov     dx,offset InitFileAdr
  302	                mov     cx,4
  303	                mov     ah,3Fh
  304	                int     21h
  305	                jc      InitErrC
  306	                mov     ax,Apple
  307	                mov     ds,ax
  308	                mov     dx,CS:InitFileAdr
  309	                mov     cx,CS:InitFileLen
  310	                mov     ax,dx
  311	                add     ax,cx
  312	                jnc     RF_NotBig
  313	                sub     cx,ax     ;Decrease file length to fit in Apple segment
  314	RF_NotBig:      cmp     cs:RunFile?,0
  315	                jz      ESD_2
  316	                push    cx si di ds es
  317	                push    ds
  318	                pop     es
  319	                push    cs
  320	                pop     ds
  321	                mov     si,offset SlotPrg
  322	                mov     di,0C700h
  323	                mov     cx,SlotLen
  324	        rep     movsb
  325	                mov     di,0C700h
  326	                mov     ds:SlotLen[di],dx
  327	                pop     es ds di si cx
  328	ESD_2:          mov     ah,3Fh
  329	                int     21h
  330	                jc      InitErrC
  331	                mov     cs:InitFileLen,ax
  332	                mov     ah,3Eh
  333	                int     21h
  334	                jc      InitErrNC
  335	                lds     si,cs:RF_DS_SI
  336	                mov     ax,cs:InitFileAdr
  337	                mov     bx,cs:InitFileLen
  338	                mov     ch,FF_SHOWADDR? or FF_MODIFYADDR? or FF_MODIFYTYPE?
  339	                mov     cl,FD_CODE
  340	                call    FileIsLoaded
  341	                ret
  342	
  343	InitErrC:       mov     ah,3Eh
  344	                int     21h
  345	InitErrNC:      push    cs
  346	                pop     ds
  347	                mov     dx,offset InitErrMes1
  348	                mov     ah,9
  349	                int     21h
  350	                les     di,dword ptr CS:[InitErrBuf]
  351	                xor     ax,ax
  352	                mov     cx,ax
  353	                dec     cx
  354	                cld
  355	        repne   scasb
  356	                dec     di
  357	                mov     al,'$'
  358	                stosb
  359	                lds     dx,dword ptr CS:[InitErrBuf]
  360	                mov     ah,9
  361	                int     21h
  362	                push    cs
  363	                pop     ds
  364	                mov     dx,offset InitErrMes2
  365	                mov     ah,9
  366	                int     21h
  367	                mov     ax,4C01h
  368	                int     21h
  369	;               exit    1
  370	InitCont:       pop     es ds
  371	                ret
  372	
  373	RF_FileSpecOfs  dw      ?
  374	CopyFileSpec:   push    ax si di ds es
  375	                mov     ax,Startup
  376	                mov     ds,ax
  377	                mov     es,ax
  378	                mov     di,cs:RF_FileSpecOfs
  379	                cld
  380	CopyFileSpecLp: lodsb
  381	                stosb
  382	                or      al,al
  383	                jnz     CopyFileSpecLp
  384	                pop     es ds di si ax
  385	                ret
  386	
  387	SysFileSpec     db      '*.ROM',0
  388	
  389	InitFileAdr     dw      0
  390	InitFileLen     dw      0
  391	
  392	InitErrBuf      dw      2 dup (0)
  393	
  394	UnknownMes      db      0Dh,0Ah,'  Bad command line parameter: /$'
  395	InitErrMes1     db      0Dh,0Ah,'  APPLER: Can''t read file $'
  396	InitErrMes2     db      0Dh,0Ah,'$'
  397	i_help_mes      db      0Dh,0Ah
  398	                db      '  Appler - an Apple ][ emulator by Emil Dotchevski & Alexander Patalenski',0Dh,0Ah,0Dh,0Ah
  399	                db      '  Command line syntax: appler [[-]<filename[.APL]>] ... [/k] [/?]',0Dh,0Ah
  400	                db      '    <filename> - ''.APL'' file to load (use ''-'' to disable file execution)',0Dh,0Ah
  401	                db      '    /k         - don''t set keyboard params',0Dh,0Ah
  402	                db      '    /?         - this message',0Dh,0Ah
  403	                db      '$'
  404	
  405	SlotPrg         db      0A9h,20h,0A9h,0,0A9h,3,0A9h,3Ch,4Ch
  406	SlotEnd         label   byte
  407	SlotLen         =       offset SlotEnd - offset SlotPrg
  408	CommandLine     endp
  409	
  410	
  411	
  412	; OpenDiskFile Entry Params:
  413	;   DS:DX^  -- Filename
  414	;   AL      -- Access Mode: 0 - Don't Change, else Read Only
  415	;   BL      -- Type: 0 - Nibble, 1 - DOS 3.3
  416	;   BH      -- Volume (for DOS 3.3 type only)
  417	;   CF      -- 0 - Disk1, 1 - Disk2
  418	InsertDisks     proc    near
  419	                push    ds
  420	                push    cs
  421	                pop     ds
  422	                mov     dx,offset ID_nameDSK
  423	                mov     bl,1
  424	                mov     bh,0FEh
  425	                mov     al,0
  426	                clc
  427	                call    OpenDiskFile
  428	                jnc     ID_Ret
  429	                mov     dx,offset ID_nameNBL
  430	                mov     bl,0
  431	                mov     al,0
  432	                clc
  433	                call    OpenDiskFile
  434	ID_Ret:         pop     ds
  435	                ret
  436	ID_nameNBL      db      'APPLER.NBL',0
  437	ID_nameDSK      db      'APPLER.DSK',0
  438	InsertDisks     endp
  439	
  440	
  441	
  442	Advertisement   proc    near
  443	                push    ds es
  444	                push    cs
  445	                pop     ds
  446	                cmp     SkipTitle?,0
  447	                jnz     a_SkipTitle
  448	                mov     ax,0B800h
  449	                mov     es,ax
  450	                mov     di,80*24*2
  451	                mov     cx,80
  452	                xor     ax,ax
  453	                cld
  454	        rep     stosw
  455	                mov     si,offset a_picture
  456	                push    es
  457	                push    cs
  458	                pop     es
  459	                mov     ax,1201h
  460	                mov     bl,30h
  461	                int     10h
  462	                mov     ax,83h
  463	                int     10h
  464	                mov     ax,1110h
  465	                mov     cx,76
  466	                mov     bx,0E00h
  467	                mov     dx,0B0h
  468	                mov     bp,offset a_GraphSet
  469	                int     10h
  470	                mov     ah,01h
  471	                mov     cx,2000h
  472	                int     10h
  473	                mov     ax,1202h
  474	                mov     bl,30h
  475	                int     10h
  476	                mov     ax,1000h
  477	                mov     bx,2A0Ah
  478	                int     10h
  479	                mov     bx,260Eh
  480	                int     10h
  481	                mov     bx,2406h
  482	                int     10h
  483	                mov     bx,1C03h
  484	                int     10h
  485	                mov     ax,1003h
  486	                mov     bl,0
  487	                int     10h
  488	                cld
  489	                pop     es
  490	                xor     di,di
  491	                mov     ah,7
  492	                mov     cx,80*24
  493	a_loop:         lodsb
  494	                or      al,al
  495	                jnz     a_not_attr
  496	                lodsb
  497	                mov     ah,al
  498	                jmp     a_loop
  499	a_not_attr:     stosw
  500	                loop    a_loop
  501	                xor     ax,ax
  502	                int     16h
  503	a_SkipTitle:    pop     es ds
  504	                ret
  505	
  506	SkipTitle?      db      0
  507	Buffer1000h     label   byte
  508	a_picture       db      0,03h,'ÐÜññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññÝÑ'
  509	                db      0,03h,'ð ',0,00Ah,'Ð',0,0AFh,'                                                                          ',0,00Ah,'Ñ',0,03,' ð'
  510	                db      0,03h,'ð ',0,0A0h,'  ÐððððððððððÑ                             ÙððÑ                             ',0,03,' ð'
  511	                db      0,03h,'ð ',0,0E0h,'  ðððÜññññÝððð                              ððð                          ôõ ',0,03,' ð'
  512	                db      0,03h,'ð ',0,0E0h,'  ððð      ððð ÙðððððððððððÑ ÙðððððððððððÑ  ððð  ÐððððððððððÑ ÙððÑÐððððððÑ  ',0,03,' ð'
  513	                db      0,03h,'ð ',0,060h,'  ðððÚ    Ûððð  ðððÜññññÝððð  ðððÜññññÝððð  ððð  ðððÜññññÝððð  ðððÜñññÝððð  ',0,03,' ð'
  514	                db      0,03h,'ð ',0,060h,'  ðððððððððððð  ððð      ððð  ððð      ððð  ððð  ðððÞòòòòßððð  ððð     Öñ×  ',0,03,' ð'
  515	                db      0,03h,'ð ',0,040h,'  ðððÜññññÝððð  ððð      ððð  ððð      ððð  ððð  ðððððððððððÓ  ððð          ',0,03,' ð'
  516	                db      0,03h,'ð ',0,040h,'  ððð      ððð  ðððÞòòòòßððð  ðððÞòòòòßððð  ððð  ðððä       Û  ððð          ',0,03,' ð'
  517	                db      0,03h,'ð ',0,050h,' ÛðððÚ    ÛðððÚ ðððððððððððÓ  ðððððððððððÓ ÛðððÚ ÒððððððððððÓ ÛðððÚ         ',0,03,' ð'
  518	                db      0,03h,'ð ',0,050h,'                ðððØ          ðððØ                                          ',0,03,' ð'
  519	                db      0,03h,'ð ',0,010h,'               ÛðððÚ         ÛðððÚ                                          ',0,03,' ð'
  520	                db      0,03h,'ð ',0,001h,'Ò',0,01Fh,'                                                                          ',0,001h,'Ó',0,03,' ð'
  521	                db      0,03h,'ð                                                                              ð'
  522	                db      0,03h,'ð ',0,00Fh,' ÐÜñÝÑ ',0,008h,'The Best!',0,00Fh,'  ÙÑ        ÝÑ ÐÜ     ÐÜññù           ÙÑ     ÛÑÚ            ',0,03,' ð'
  523	                db      0,03h,'ð ',0,00Fh,' ðÚ Ûð ÐÜñÝÑ ÐÜñÝÑ ð ÐèñéÑ   ð ð      ðÞòò ÙêíðíÑ ð  ð ð ÐÜÝêÙðØ  ÐÜÝÑÙêÜÝÑ ',0,03,' ð'
  524	                db      0,03h,'ð ',0,00Fh,' ðÜñÝð ðÚ Ûð ðÚ Ûð ð ðèññ×  Ûð ðÚ     ðä    ð ð ð ðÚÛð ð ðÚÛð ðÚ ÛðÚÛð ð    ',0,03,' ð'
  525	                db      0,03h,'ð ',0,00Fh,' ñ   ñ ðÜññ× ðÜññ× ñ Öñññ×  ñ× Öñ     Öññññ ñ ñ ñ Öñ×Öâñ Öñ×ÖâÖññ×Öññ× ñ    ',0,03,' ð'
  526	                db      0,03h,'ð ',0,00Fh,'       ñ     ñ                                    ',0,008h,'°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈ ',0,03,' ð'
  527	                db      0,03h,'ð                                                                              ð'
  528	                db      0,03h,'ð ',0,00Bh,'                  by Alexander Patalenski & Emil Dotchevski                 ',0,03,' ð'
  529	                db      0,03h,'ð ',0,00Fh,'                 óóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóó                ',0,03,' ð'
  530	                db      0,03h,'ð ',0,00Bh,'                        https://github.com/zajo/appler                      ',0,03,' ð'
  531	                db      0,03h,'ÒÞòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòßÓ'
  532	end_ega_picture label   byte
  533	                db      1000h - (offset end_ega_picture - offset a_picture) dup (0)
  534	Advertisement   endp
  535	
  536	
  537	HookVectors     proc    near
  538	                push    ds es
  539	                mov     ax,3509h
  540	                int     21h
  541	                mov     word ptr CS:[OldKbd],bx
  542	                mov     word ptr CS:[OldKbd][2],es
  543	                mov     al,1
  544	                int     21h
  545	                mov     word ptr CS:[OldDebug],bx
  546	                mov     word ptr CS:[OldDebug][2],es
  547	                mov     al,24h
  548	                int     21h
  549	                mov     word ptr CS:[OldCriticalErr],bx
  550	                mov     word ptr CS:[OldCriticalErr][2],es
  551	                mov     ax,seg k_int09
  552	                mov     ds,ax
  553	                mov     dx,offset k_int09
  554	                mov     ax,2509h
  555	                int     21h
  556	                mov     bx,seg WaitInstrEnd
  557	                mov     ds,bx
  558	                mov     dx,offset WaitInstrEnd
  559	                mov     al,1
  560	                int     21h
  561	                mov     bx,seg CriticalErrProc
  562	                mov     ds,bx
  563	                mov     dx,offset CriticalErrProc
  564	                mov     al,24h
  565	                int     21h
  566	                pop     es ds
  567	                ret
  568	
  569	OldKbd          dd      0
  570	OldDebug        dd      0
  571	OldCriticalErr  dd      0
  572	HookVectors     endp
  573	
  574	
  575	
  576	UnHookVectors   proc    near
  577	                push    ds
  578	                lds     dx,cs:OldDebug
  579	                mov     ax,2501h
  580	                int     21h
  581	                lds     dx,cs:OldKbd
  582	                mov     al,9
  583	                int     21h
  584	                lds     dx,cs:OldCriticalErr
  585	                mov     al,24h
  586	                int     21h
  587	                pop     ds
  588	                ret
  589	UnHookVectors   endp
  590	
  591	
  592	CriticalErrProc proc    far
  593	                mov     al,3
  594	                iret
  595	CriticalErrProc endp
  596	
  597	
  598	
  599	InitKeyboard    proc    near
  600	                push    ds
  601	                xor     ax,ax
  602	                mov     ds,ax
  603	                mov     ds:[417h],ax
  604	                call    UpdateKeyboard
  605	                mov     ax,Keyboard
  606	                mov     ds,ax
  607	                assume  ds:Keyboard
  608	                xor     ax,ax
  609	                mov     ds:k_Shifts,ax
  610	                call    SetLEDs
  611	                assume  ds:nothing
  612	                pop     ds
  613	                ret
  614	InitKeyboard    endp
  615	
  616	
  617	
  618	UnInitKeyboard  proc    near
  619	                push    ax si ds
  620	                xor     ax,ax
  621	                call    SetLEDs
  622	                mov     ds,ax
  623	                mov     ds:[417h],ax
  624	UIK_Loop1:      mov     ah,1
  625	                int     16h
  626	                jz      UIK_ok
  627	                xor     ax,ax
  628	                int     16h
  629	                jmp     UIK_Loop1
  630	UIK_ok:         pop     ds si ax
  631	                ret
  632	UnInitKeyboard  endp
  633	
  634	
  635	
  636	SaveDosScr:     push    ds es
  637	                mov     ah,0Fh
  638	                int     10h
  639	                mov     cs:ModeSvd,al
  640	                mov     cs:PageSvd,bh
  641	                mov     ah,3
  642	                int     10h
  643	                mov     cs:CursorSvd,dx
  644	                mov     cs:CursorShapeSVD,cx
  645	                mov     cx,80 * 25
  646	                mov     si,0B800h
  647	                mov     ds,si
  648	                push    cs
  649	                pop     es
  650	                xor     si,si
  651	                mov     di,offset DosScrSvd
  652	                cld
  653	                rep     movsw
  654	                mov     cx,2021h
  655	                mov     ah,1
  656	                int     10h
  657	                pop     es ds
  658	                ret
  659	
  660	RestoreDosScr:  push    ds es
  661	                mov     ah,0Fh
  662	                int     10h
  663	                xor     ah,ah
  664	                cmp     al,2
  665	                jb      RDS_Set
  666	                cmp     al,cs:ModeSvd
  667	                je      RDS_DontSet
  668	RDS_Set:        mov     al,cs:ModeSvd
  669	                int     10h
  670	RDS_DontSet:    mov     al,cs:PageSvd
  671	                mov     al,0
  672	                mov     ah,5
  673	                int     10h
  674	                mov     bh,cs:PageSvd
  675	                mov     ah,2
  676	                mov     dx,cs:CursorSvd
  677	                int     10h
  678	                mov     ah,1
  679	                mov     cx,cs:CursorShapeSVD
  680	                int     10h
  681	                mov     cx,80 * 25
  682	                mov     si,0B800h
  683	                mov     es,si
  684	                push    cs
  685	                pop     ds
  686	                xor     di,di
  687	                mov     si,offset DosScrSvd
  688	                cld
  689	        rep     movsw
  690	                pop     es ds
  691	                ret
  692	
  693	DosScrSvd       dw      80 * 25 dup (0)
  694	ModeSvd         db      0
  695	PageSvd         db      0
  696	CursorSvd       dw      0
  697	CursorShapeSVD  dw      0
  698	
  699	
  700	DS_CurrentVM    db      ?
  701	DosShell        proc    far
  702	                push    ax bx cx dx si di bp ds es
  703	                mov     ah,0Fh
  704	                int     10h
  705	                mov     cs:DS_CurrentVM,al
  706	                mov     ah,62h
  707	                int     21h
  708	                mov     es,bx
  709	                mov     ds,es:[2Ch]
  710	                mov     es,es:[2Ch]
  711	                xor     di,di
  712	                mov     si,di
  713	                mov     bx,di
  714	                cld
  715	DS_FindEnd:     lodsb
  716	                inc     bx
  717	                or      al,al
  718	                jnz     DS_FindEnd
  719	                lodsb
  720	                inc     bx
  721	                or      al,al
  722	                jnz     DS_FindEnd
  723	                xor     ax,ax
  724	                push    cs
  725	                pop     ds
  726	DS_ScanLoop:    mov     si,offset DS_ComSpecStr
  727	                mov     di,ax
  728	                mov     cx,8
  729	        rep     cmpsb
  730	                je      DS_Found
  731	                inc     ax
  732	                dec     bx
  733	                jnz     DS_ScanLoop
  734	                jmp     DS_Ret
  735	DS_Found:       push    di es
  736	                call    SystemTINI
  737	                call    StartupOFF
  738	                pop     es di
  739	                push    cs
  740	                pop     ds
  741	                mov     dx,offset DS_Message
  742	                mov     ah,9
  743	                int     21h
  744	                push    es
  745	                pop     ds
  746	                push    cs
  747	                pop     es
  748	                mov     dx,di
  749	                mov     bx,offset DS_EPB
  750	                mov     cs:DS_save_ss,ss
  751	                mov     cs:DS_save_sp,sp
  752	                mov     ax,4B00h
  753	                int     21h
  754	                mov     ss,cs:DS_save_ss
  755	                mov     sp,cs:DS_save_sp
  756	                jnc     DS_ok
  757	                push    cs
  758	                pop     ds
  759	                mov     dx,offset DS_NoMemMes
  760	                mov     ah,9
  761	                int     21h
  762	DS_WaitEsc:     xor     ax,ax
  763	                int     16h
  764	                cmp     al,27
  765	                jne     DS_WaitEsc
  766	DS_ok:          call    StartupON
  767	                call    SystemINIT
  768	DS_Ret:         mov     ah,0Fh
  769	                int     10h
  770	                cmp     al,cs:DS_CurrentVM
  771	                je      DS_DontSet
  772	                xor     ax,ax
  773	                mov     al,cs:DS_CurrentVM
  774	                int     10h
  775	DS_DontSet:     cmp     al,3
  776	                je      RS_Exit
  777	                mov     ax,seg C050
  778	                mov     es,ax
  779	                assume  es:seg C050
  780	                mov     al,es:C050
  781	                mov     bp,12                   ; Set Screen
  782	                call    SIO_Services
  783	                assume  es:nothing
  784	RS_Exit:        pop     es ds bp di si dx cx bx ax
  785	                ret
  786	
  787	DS_ComSpecStr   db      'COMSPEC='
  788	DS_EPB          dw      0
  789	                dw      offset DS_CMDline, seg DS_CMDline
  790	                dd      2 dup (0)
  791	DS_CMDline      db      0,0Dh
  792	DS_save_ss      dw      ?
  793	DS_save_sp      dw      ?
  794	DS_Message      db      0Dh,0Ah,'Enter ''EXIT'' to return to APPLER...$'
  795	DS_NoMemMes     db      0Dh,'Can''t run command interpreter (not enough memory?)'
  796	                db      0Dh,0Ah,0Ah,'         Press <Esc> to return to APPLER',0Dh,0Ah,'$'
  797	DosShell        endp
  798	
  799	
  800	
  801	                assume  DS:nothing
  802	QuitAppler      proc    far
  803	                call    SystemTINI
  804	                call    StartupOFF
  805	                push    cs
  806	                pop     ds
  807	                mov     dx,offset ExitMes
  808	                mov     ah,9
  809	                int     21h
  810	                mov     ax,4C00h
  811	                int     21h
  812	;               exit    0                     ; Normal Program EXIT
  813	QuitAppler      endp
  814	
  815	ExitMes         db      0Ah,0Dh,'  Back to reality (of sorts)...',0Ah,0Dh,'$'
  816	
  817	
  818	Screen          label   word
  819	a_BegSet        label   byte
  820	a_GraphSet      db      000h,000h,000h,000h,08Ah,08Bh,0AAh
  821	                db      0AAh,0AAh,052h,000h,000h,000h,000h
  822	                db      000h,000h,014h,007h,094h,054h,014h
  823	                db      014h,014h,013h,000h,000h,000h,000h
  824	                db      000h,000h,020h,038h,020h,021h,021h
  825	                db      021h,0A5h,018h,000h,000h,000h,000h
  826	                db      000h,000h,000h,000h,0CEh,029h,029h
  827	                db      0C9h,009h,0E9h,000h,000h,000h,000h
  828	                db      000h,000h,008h,008h,00Eh,009h,009h
  829	                db      009h,009h,00Eh,000h,000h,000h,000h
  830	                db      000h,000h,000h,000h,048h,048h,048h
  831	                db      048h,038h,008h,008h,070h,000h,000h
  832	                db      000h,000h,040h,070h,042h,042h,042h
  833	                db      042h,04Ah,031h,000h,000h,000h,000h
  834	                db      000h,000h,000h,000h,026h,029h,0A9h
  835	                db      0A9h,0A9h,046h,000h,000h,000h,000h
  836	                db      000h,000h,000h,000h,00Eh,009h,009h
  837	                db      009h,009h,00Eh,008h,008h,000h,000h
  838	                db      000h,000h,000h,000h,031h,04Ah,04Ah
  839	                db      04Ah,04Ah,031h,000h,000h,000h,000h
  840	                db      000h,000h,000h,000h,094h,05Ah,050h
  841	                db      050h,050h,090h,000h,000h,000h,000h
  842	                db      000h,000h,010h,010h,01Ch,012h,012h
  843	                db      012h,012h,01Ch,000h,000h,000h,000h
  844	                db      000h,000h,006h,002h,092h,092h,092h
  845	                db      092h,092h,06Ah,000h,000h,000h,000h
  846	                db      000h,000h,000h,000h,069h,092h,092h
  847	                db      092h,092h,071h,010h,010h,0E0h,000h
  848	                db      000h,000h,000h,000h,0CAh,04Dh,048h
  849	                db      048h,048h,0A8h,000h,000h,000h,000h
  850	                db      000h,000h,040h,000h,04Eh,052h,052h
  851	                db      052h,052h,04Dh,000h,000h,000h,000h
  852	                db      000h,000h,000h,000h,070h,048h,048h
  853	                db      048h,048h,048h,000h,000h,000h,000h
  854	                db      000h,000h,000h,000h,072h,04Bh,04Ah
  855	                db      04Ah,04Ah,072h,040h,040h,000h,000h
  856	                db      000h,000h,000h,000h,08Ch,052h,012h
  857	                db      012h,012h,00Ch,000h,000h,000h,000h
  858	                db      000h,000h,000h,000h,06Ah,093h,092h
  859	                db      092h,092h,072h,010h,0E0h,000h,000h
  860	                db      000h,000h,000h,000h,08Eh,052h,012h
  861	                db      012h,012h,00Dh,000h,000h,000h,000h
  862	                db      000h,000h,000h,000h,079h,055h,055h
  863	                db      055h,055h,055h,000h,000h,000h,000h
  864	                db      000h,000h,000h,000h,0E3h,054h,054h
  865	                db      057h,054h,053h,000h,000h,000h,000h
  866	                db      000h,000h,000h,000h,028h,0B5h,0A0h
  867	                db      0A0h,020h,0A1h,000h,000h,000h,000h
  868	                db      000h,000h,000h,000h,0C0h,000h,0C0h
  869	                db      020h,020h,0C0h,000h,000h,000h,000h
  870	                db      000h,000h,000h,000h,000h,000h,000h
  871	                db      000h,000h,000h,000h,000h,000h,000h
  872	                db      000h,000h,000h,000h,000h,000h,000h
  873	                db      000h,000h,000h,000h,000h,000h,000h
  874	                db      000h,000h,000h,000h,000h,000h,000h
  875	                db      000h,000h,000h,000h,000h,000h,000h
  876	                db      000h,000h,000h,000h,000h,000h,000h
  877	                db      000h,000h,000h,000h,000h,000h,000h
  878	                db      000h,000h,000h,000h,000h,000h,000h
  879	                db      000h,000h,000h,000h,000h,000h,000h
  880	                db      000h,000h,000h,000h,000h,000h,000h
  881	                db      000h,000h,000h,000h,000h,000h,000h
  882	                db      000h,000h,000h,000h,000h,000h,000h
  883	                db      000h,000h,000h,000h,000h,000h,000h
  884	                db      000h,007h,01Fh,03Fh,07Fh,0FFh,0FFh
  885	                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
  886	                db      000h,0E0h,0F8h,0FCh,0FEh,0FFh,0FFh
  887	                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
  888	                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
  889	                db      0FFh,0FFh,07Fh,03Fh,01Fh,007h,000h
  890	                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
  891	                db      0FFh,0FFh,0FEh,0FCh,0F8h,0E0h,000h
  892	                db      000h,000h,000h,000h,000h,000h,000h
  893	                db      000h,007h,01Fh,03Fh,07Fh,0FFh,0FFh
  894	                db      000h,000h,000h,000h,000h,000h,000h
  895	                db      000h,0E0h,0F8h,0FCh,0FEh,0FFh,0FFh
  896	                db      0FFh,0FFh,07Fh,03Fh,01Fh,007h,000h
  897	                db      000h,000h,000h,000h,000h,000h,000h
  898	                db      0FFh,0FFh,0FEh,0FCh,0F8h,0E0h,000h
  899	                db      000h,000h,000h,000h,000h,000h,000h
  900	                db      0FFh,0F8h,0E0h,0C0h,080h,000h,000h
  901	                db      000h,000h,000h,000h,000h,000h,000h
  902	                db      0FFh,01Fh,007h,003h,001h,000h,000h
  903	                db      000h,000h,000h,000h,000h,000h,000h
  904	                db      000h,000h,000h,000h,000h,000h,000h
  905	                db      000h,000h,080h,0C0h,0E0h,0F8h,0FFh
  906	                db      000h,000h,000h,000h,000h,000h,000h
  907	                db      000h,000h,001h,003h,007h,01Fh,0FFh
  908	                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
  909	                db      0FFh,0F8h,0E0h,0C0h,080h,000h,000h
  910	                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
  911	                db      0FFh,01Fh,007h,003h,001h,000h,000h
  912	                db      000h,000h,080h,0C0h,0E0h,0F8h,0FFh
  913	                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
  914	                db      000h,000h,001h,003h,007h,01Fh,0FFh
  915	                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
  916	                db      000h,000h,000h,000h,000h,000h,000h
  917	                db      0FFh,0F8h,0E0h,0C0h,080h,000h,000h
  918	                db      000h,000h,000h,000h,000h,000h,000h
  919	                db      0FFh,01Fh,007h,003h,001h,000h,000h
  920	                db      000h,000h,080h,0C0h,0E0h,0F8h,0FFh
  921	                db      000h,000h,000h,000h,000h,000h,000h
  922	                db      000h,000h,001h,003h,007h,01Fh,0FFh
  923	                db      000h,000h,000h,000h,000h,000h,000h
  924	                db      0FFh,0F8h,0E0h,0C0h,080h,000h,000h
  925	                db      000h,000h,080h,0C0h,0E0h,0F8h,0FFh
  926	                db      0FFh,01Fh,007h,003h,001h,000h,000h
  927	                db      000h,000h,001h,003h,007h,01Fh,0FFh
  928	                db      0FFh,0F8h,0E0h,0C0h,0E0h,0F8h,0FFh
  929	                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
  930	                db      0FFh,01Fh,007h,003h,007h,01Fh,0FFh
  931	                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
  932	                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
  933	                db      0FFh,0F8h,0E0h,0C0h,0E0h,0F8h,0FFh
  934	                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
  935	                db      0FFh,01Fh,007h,003h,007h,01Fh,0FFh
  936	                db      000h,0C3h,0E7h,0FFh,0FFh,0FFh,0FFh
  937	                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
  938	                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
  939	                db      0FFh,0FFh,0FFh,0FFh,0E7h,0C3h,000h
  940	                db      000h,000h,000h,000h,000h,000h,000h
  941	                db      0C3h,0E7h,0FFh,0FFh,0FFh,0FFh,0FFh
  942	                db      0FFh,0FFh,0FFh,0FFh,0FFh,0E7h,0C3h
  943	                db      000h,000h,000h,000h,000h,000h,000h
  944	                db      000h,0C3h,0E7h,0FFh,0FFh,0FFh,0FFh
  945	                db      000h,000h,000h,000h,000h,000h,000h
  946	                db      000h,000h,000h,000h,000h,000h,000h
  947	                db      0FFh,0FFh,0FFh,0FFh,0E7h,0C3h,000h
  948	                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
  949	                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
  950	                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
  951	                db      000h,000h,000h,000h,000h,000h,000h
  952	                db      000h,000h,000h,000h,000h,000h,0FFh
  953	                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
  954	                db      0FFh,000h,000h,000h,000h,000h,000h
  955	                db      000h,000h,000h,000h,000h,000h,000h
  956	                db      000h,000h,000h,000h,07Eh,07Eh,018h
  957	                db      018h,018h,018h,018h,018h,000h,000h
  958	                db      000h,000h,000h,000h,0C6h,0EEh,0FEh
  959	                db      0D6h,0C6h,0C6h,0C6h,0C6h,000h,000h
  960	                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ; not used
  961	                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ; not used
  962	                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ; not used
  963	                db      0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ; not used
  964	                db      007h,01Fh,03Fh,07Fh,0FFh,0FFh,0FFh
  965	                db      000h,000h,000h,000h,000h,000h,000h
  966	                db      0E0h,0F8h,0FCh,0FEh,0FFh,0FFh,0FFh
  967	                db      000h,000h,000h,000h,000h,000h,000h
  968	                db      000h,000h,000h,000h,000h,000h,000h
  969	                db      0FFh,0FFh,0FFh,07Fh,03Fh,01Fh,007h
  970	                db      000h,000h,000h,000h,000h,000h,000h
  971	                db      0FFh,0FFh,0FFh,0FEh,0FCh,0F8h,0E0h
  972	a_EndSet        label   byte
  973	                dw      (80*26) - ((offset a_EndSet - offset a_BegSet) / 2) dup (0)
  974	
  975	Startup         ends
  976	
  977	                END     StartHere
  978	

Generated by GNU Enscript 1.6.6, and GophHub 1.3.