Subversion Repositories aysalia

Rev

Rev 22 | Rev 25 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
9 daniel-mar 1
 
2
; Aysalia DOS Launcher
3
; Launches aydos1.gam and aydos2.gam
22 daniel-mar 4
; Revision 2018-12-07
9 daniel-mar 5
; (C) 2018 Daniel Marschall, ViaThinkSoft
6
 
7
.model small
8
.stack 10h
11 daniel-mar 9
 
10
; -------------------------------------------------------
11
 
9 daniel-mar 12
.data
13
 
22 daniel-mar 14
    exename1  db "AYDOS1.GAM", 0
15
    exename2  db "AYDOS2.GAM", 0
16
    cmdargs   db 0, '', 0Dh
9 daniel-mar 17
 
18
    dummy_fcb db 36 dup(0)
19
 
20
    paramblk  dw 0          ; use environment of parent
21
              dw cmdargs    ; command line arguments
22
              dw 0          ; cmdargs_seg
23
              dw dummy_fcb  ; fcb1
24
              dw 0          ; fcb1_seg
25
              dw dummy_fcb  ; fcb2
26
              dw 0          ; fcb2_seg
27
 
22 daniel-mar 28
    menu1     db 13, 10, \
29
                 13, 10, \
30
                 13, 10, \
31
                 13, 10, \
32
                 '                            Aysalia DOS', 13, 10, \
33
                 13, 10, \
34
                 13, 10, \
35
                 '              Welches Spiel soll gestartet werden?', 13, 10, \
36
                 13, 10, \
37
                 '              Dr', 81h, 'cke eine der folgenden Tasten:', 13, 10, \
38
                 13, 10, \
39
                 '              1  Aysalia DOS I', 13, 10, \
40
                 '              2  Aysalia DOS II', 13, 10, \
41
                 13, 10, \
42
                 '              9  Beenden', 13, 10, \
43
                 13, 10, \
44
                 13, 10, \
45
                 13, 10, 0
17 daniel-mar 46
 
22 daniel-mar 47
    error1    db 13, 10, \
48
                 'Fehler: Spiel kann nicht gestartet werden. Fehlt eine Datei?', 13, 10, \
49
                 13, 10, 0
9 daniel-mar 50
 
22 daniel-mar 51
    gameover1 db 13, 10, \
52
                 'Spiel zu Ende!', 13, 10, \
53
                 13, 10, 0
9 daniel-mar 54
 
11 daniel-mar 55
; -------------------------------------------------------
56
 
9 daniel-mar 57
.code
58
 
59
clear_vga PROC
22 daniel-mar 60
    mov     ax, 0A000h
9 daniel-mar 61
    mov     es, ax
62
    xor     di, di
63
    mov     ax, 0
64
    mov     cx, 64000
65
    rep     stosb
66
    ret
67
clear_vga ENDP
68
 
11 daniel-mar 69
set_screen12 PROC
70
    mov     ah, 0         ; set screen mode
71
    mov     al, 12h       ; graphic mode, 640x480 pixel, 16 colors (VGA)
72
    int     10h
73
    ret
74
set_screen12 ENDP
75
 
9 daniel-mar 76
setup_paramblk PROC
77
    mov     ax, cs
78
    mov     [paramblk +  4], ax   ; cmdargs_seg
79
    mov     [paramblk +  8], ax   ; fcb1_seg
80
    mov     [paramblk + 12], ax   ; fcb2_seg
81
    ret
82
setup_paramblk ENDP
83
 
11 daniel-mar 84
set_numlock_on PROC
85
    push    ds
86
    mov     ax, 40h
22 daniel-mar 87
    mov     ds, ax        ; Go to BIOS Data Area ( http://stanislavs.org/helppc/bios_data_area.html )
11 daniel-mar 88
    mov     bx, 17h       ; Load Keyboard flag byte 0
22 daniel-mar 89
    mov     al, [bx]      ; Read
90
    or      al, 20h       ; Set bit 5 (numlock) to 1
91
    mov     [bx], al      ; Write
11 daniel-mar 92
    pop     ds
93
    ret
94
set_numlock_on ENDP
9 daniel-mar 95
 
11 daniel-mar 96
flush_keyb_buf PROC
97
    mov     ah, 0Ch       ; Flush input buffer and input 
98
    mov     al, 0
9 daniel-mar 99
    int     21h
11 daniel-mar 100
    ret
101
flush_keyb_buf ENDP
9 daniel-mar 102
 
11 daniel-mar 103
exit_to_dos PROC
22 daniel-mar 104
    mov     ah, 4Ch
11 daniel-mar 105
    mov     al, 00h
106
    int     21h
107
    ret
108
exit_to_dos ENDP
9 daniel-mar 109
 
11 daniel-mar 110
sleep_5 PROC
21 daniel-mar 111
    mov     ah, 00h
17 daniel-mar 112
    int     1Ah
21 daniel-mar 113
    cmp     dx, 7FFFh
22 daniel-mar 114
    jg      sleep_5_upperhalf
115
sleep_5_lowerhalf:
21 daniel-mar 116
    mov     bx, dx
22 daniel-mar 117
    add     bx, 91        ; 18.2 = 1 sec (therefore 91 = 5 sec)
118
sleep_5_lowerhalf_again:
21 daniel-mar 119
    int     1Ah
17 daniel-mar 120
    cmp     dx, bx
22 daniel-mar 121
    jl      sleep_5_lowerhalf_again
11 daniel-mar 122
    ret
22 daniel-mar 123
sleep_5_upperhalf:
21 daniel-mar 124
    mov     bx, dx
125
    sub     bx, 7FFFh
22 daniel-mar 126
    add     bx, 91        ; 18.2 = 1 sec (therefore 91 = 5 sec)
127
sleep_5_upperhalf_again:
21 daniel-mar 128
    int     1Ah
129
    sub     dx, 7FFFh
130
    cmp     dx, bx
22 daniel-mar 131
    jl      sleep_5_upperhalf_again
21 daniel-mar 132
    ret
11 daniel-mar 133
sleep_5 ENDP
9 daniel-mar 134
 
22 daniel-mar 135
print_color_string PROC
136
    ; This function requires:
137
    ; dx = Pointer to zero terminated string
138
    ; cl = Color
139
    mov     ah, 0Eh
140
print_color_string_again:
141
    mov     al, 0
142
    mov     bx, dx
143
    cmp     [bx], al
144
    je      print_color_string_end
145
    mov     al, [bx]
146
    mov     bl, cl
147
    int     10h
148
    add     dx, 1
149
    jmp     print_color_string_again
150
print_color_string_end:
151
    ret
152
print_color_string ENDP
153
 
154
set_bg_color PROC
155
    ; This function requires:
156
    ; bl = Color
21 daniel-mar 157
    mov     ah, 0Bh
158
    mov     bh, 00h
159
    int     10h
22 daniel-mar 160
    ret
161
set_bg_color ENDP
21 daniel-mar 162
 
22 daniel-mar 163
print_menu_screen PROC
23 daniel-mar 164
    ; Clear screen
165
    call    clear_vga
22 daniel-mar 166
 
167
    ; Set background color
168
    mov     bl, 8         ; dark green background
169
    call    set_bg_color
170
 
171
    ; Set text color
172
    mov     cl, 0Fh       ; white font
9 daniel-mar 173
    lea     dx, menu1
22 daniel-mar 174
    call    print_color_string
175
 
11 daniel-mar 176
    ret
177
print_menu_screen ENDP
178
 
17 daniel-mar 179
print_error_screen PROC
23 daniel-mar 180
    ; Clear screen
181
    call    clear_vga
21 daniel-mar 182
 
22 daniel-mar 183
    ; Set background color
184
    mov     bl, 4         ; dark red background
185
    call    set_bg_color
186
 
187
    ; Set text color
188
    mov     cl, 0Fh       ; white font
17 daniel-mar 189
    lea     dx, error1
22 daniel-mar 190
    call    print_color_string
191
 
17 daniel-mar 192
    ret
193
print_error_screen ENDP
194
 
23 daniel-mar 195
print_gameover_message PROC
22 daniel-mar 196
    ; Keep cursor position
21 daniel-mar 197
 
22 daniel-mar 198
    ; Set background color
199
    mov     bl, 4    ; dark red background
200
    call    set_bg_color
201
 
202
    ; Set text color
203
    mov     cl, 0Fh  ; white font
11 daniel-mar 204
    lea     dx, gameover1
22 daniel-mar 205
    call    print_color_string
206
 
11 daniel-mar 207
    ret
23 daniel-mar 208
print_gameover_message ENDP
11 daniel-mar 209
 
210
; -------------------------------------------------------
211
 
212
start:
213
    ; Setup data segment
214
    mov     ax, @data     ; moving base address of data to ax
215
    mov     ds, ax        ; moving contents of ax into ds
216
                          ; data section now gets initialized                                        
217
 
218
    ; Preserve the original screen mode
219
    mov     ah, 0Fh       ; Query screen mode
220
    int     10h
221
    push    ax            ; actually, we are only interested in register al (screen mode), not in ah (column count)
9 daniel-mar 222
 
11 daniel-mar 223
    ; Change numlock to ON
224
    ; DOSBox has a bug where the NumLock is not correctly set to the setting of the host system,
225
    ; so you have to press the NumLock key twice so that DOSBox recognizes the status.
226
    ; see: https://sourceforge.net/p/dosbox/bugs/71/
227
    ;      https://superuser.com/questions/255102/is-there-a-way-to-use-the-numeric-keypad-in-dosbox/1146986
228
    ; Since the game uses number keys very often, we set NumLock to ON
229
    call    set_numlock_on
230
 
231
    ; Reduce size of own application to give the called applications more space
232
    ; see https://stackoverflow.com/a/10067627
233
    mov     ah, 4Ah
14 daniel-mar 234
    mov     bx, 100       ; 100 paragraphs a 16 bytes = 1600 bytes
11 daniel-mar 235
    int     21h
236
 
237
menu:
238
    ; Video Mode VGA 12
239
    call    set_screen12
240
 
241
    ; Flush keyboard buffer    
242
    call    flush_keyb_buf
243
 
244
    ; Print menu screen
245
    call    print_menu_screen
246
 
9 daniel-mar 247
retry:
248
    ; Query keyboard input
11 daniel-mar 249
    mov     ah, 07h       ; Direct character input, without echo
9 daniel-mar 250
    int     21h
251
    cmp     al, '1'
252
    je      prog1
253
    cmp     al, '2'
254
    je      prog2
255
    cmp     al, '9'
11 daniel-mar 256
    je      exit
9 daniel-mar 257
 
258
    ; Invalid input
259
    jmp     retry
260
 
261
prog1:
262
    ; Clear screen
263
    call    clear_vga
264
 
265
    ; Setup parameter block for the EXEC command
266
    call    setup_paramblk
267
 
268
    ; Start game 1
11 daniel-mar 269
    mov     ah, 4Bh       ; execute 
270
    mov     al, 00h       ; load and execute 
9 daniel-mar 271
    mov     bx, paramblk
272
    lea     dx, exename1
273
    int     21h
274
 
17 daniel-mar 275
    ; Is everything OK? Or is the GAM file missing?
276
    jc      error
277
 
11 daniel-mar 278
    ; Notify the player that the game has finished
9 daniel-mar 279
    jmp     gameover
280
 
281
prog2:
282
    ; Clear screen
283
    call    clear_vga
284
 
285
    ; Setup parameter block for the EXEC command
286
    call    setup_paramblk
287
 
288
    ; Start game 2
11 daniel-mar 289
    mov     ah, 4Bh       ; execute 
290
    mov     al, 00h       ; load and execute 
9 daniel-mar 291
    mov     bx, paramblk
292
    lea     dx, exename2
293
    int     21h
17 daniel-mar 294
 
295
    ; Is everything OK? Or is the GAM file missing?
296
    jc      error
9 daniel-mar 297
 
11 daniel-mar 298
    ; Notify the player that the game has finished
9 daniel-mar 299
    jmp     gameover
11 daniel-mar 300
 
17 daniel-mar 301
error:
302
    ; Video Mode VGA 12
303
    call    set_screen12
304
 
305
    ; Print error
306
    call    print_error_screen
307
 
308
    ; Give the player time to read the error message (approx 5 seconds)
309
    call    sleep_5
310
 
311
    ; Go back to the menu
312
    jmp     menu
313
 
9 daniel-mar 314
gameover:
23 daniel-mar 315
    ; Print gameover message
316
    call    print_gameover_message
9 daniel-mar 317
 
11 daniel-mar 318
    ; Give the player time to read the game over message (approx 5 seconds)
319
    call    sleep_5
9 daniel-mar 320
 
11 daniel-mar 321
    ; Go back to the menu
9 daniel-mar 322
    jmp     menu
323
 
11 daniel-mar 324
exit:
9 daniel-mar 325
    ; Reset video mode to DOS default
11 daniel-mar 326
    pop     ax            ; the video mode we have preserved at program start
327
    mov     ah, 0         ; set screen mode
9 daniel-mar 328
    int     10h
329
 
330
    ; Return to DOS
11 daniel-mar 331
    call    exit_to_dos
9 daniel-mar 332
 
11 daniel-mar 333
; -------------------------------------------------------
334
 
9 daniel-mar 335
end start