Subversion Repositories aysalia

Rev

Rev 21 | Rev 23 | 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
164
    ; Move cursor to 0, 0
165
    mov     ah, 02h       ; set cursor position
166
    mov     dh, 0         ; line
167
    mov     dl, 0         ; column
168
    mov     bh, 0         ; page
169
    int     10h
170
 
171
    ; Set background color
172
    mov     bl, 8         ; dark green background
173
    call    set_bg_color
174
 
175
    ; Set text color
176
    mov     cl, 0Fh       ; white font
9 daniel-mar 177
    lea     dx, menu1
22 daniel-mar 178
    call    print_color_string
179
 
11 daniel-mar 180
    ret
181
print_menu_screen ENDP
182
 
17 daniel-mar 183
print_error_screen PROC
22 daniel-mar 184
    ; Move cursor to 0, 0
185
    mov     ah, 02h       ; set cursor position
186
    mov     dh, 0         ; line
187
    mov     dl, 0         ; column
188
    mov     bh, 0         ; page
21 daniel-mar 189
    int     10h
190
 
22 daniel-mar 191
    ; Set background color
192
    mov     bl, 4         ; dark red background
193
    call    set_bg_color
194
 
195
    ; Set text color
196
    mov     cl, 0Fh       ; white font
17 daniel-mar 197
    lea     dx, error1
22 daniel-mar 198
    call    print_color_string
199
 
17 daniel-mar 200
    ret
201
print_error_screen ENDP
202
 
11 daniel-mar 203
print_gameover_screen PROC
22 daniel-mar 204
    ; Keep cursor position
21 daniel-mar 205
 
22 daniel-mar 206
    ; Set background color
207
    mov     bl, 4    ; dark red background
208
    call    set_bg_color
209
 
210
    ; Set text color
211
    mov     cl, 0Fh  ; white font
11 daniel-mar 212
    lea     dx, gameover1
22 daniel-mar 213
    call    print_color_string
214
 
11 daniel-mar 215
    ret
216
print_gameover_screen ENDP
217
 
218
; -------------------------------------------------------
219
 
220
start:
221
    ; Setup data segment
222
    mov     ax, @data     ; moving base address of data to ax
223
    mov     ds, ax        ; moving contents of ax into ds
224
                          ; data section now gets initialized                                        
225
 
226
    ; Preserve the original screen mode
227
    mov     ah, 0Fh       ; Query screen mode
228
    int     10h
229
    push    ax            ; actually, we are only interested in register al (screen mode), not in ah (column count)
9 daniel-mar 230
 
11 daniel-mar 231
    ; Change numlock to ON
232
    ; DOSBox has a bug where the NumLock is not correctly set to the setting of the host system,
233
    ; so you have to press the NumLock key twice so that DOSBox recognizes the status.
234
    ; see: https://sourceforge.net/p/dosbox/bugs/71/
235
    ;      https://superuser.com/questions/255102/is-there-a-way-to-use-the-numeric-keypad-in-dosbox/1146986
236
    ; Since the game uses number keys very often, we set NumLock to ON
237
    call    set_numlock_on
238
 
239
    ; Reduce size of own application to give the called applications more space
240
    ; see https://stackoverflow.com/a/10067627
241
    mov     ah, 4Ah
14 daniel-mar 242
    mov     bx, 100       ; 100 paragraphs a 16 bytes = 1600 bytes
11 daniel-mar 243
    int     21h
244
 
245
menu:
246
    ; Video Mode VGA 12
247
    call    set_screen12
248
 
249
    ; Flush keyboard buffer    
250
    call    flush_keyb_buf
251
 
252
    ; Print menu screen
253
    call    print_menu_screen
254
 
9 daniel-mar 255
retry:
256
    ; Query keyboard input
11 daniel-mar 257
    mov     ah, 07h       ; Direct character input, without echo
9 daniel-mar 258
    int     21h
259
    cmp     al, '1'
260
    je      prog1
261
    cmp     al, '2'
262
    je      prog2
263
    cmp     al, '9'
11 daniel-mar 264
    je      exit
9 daniel-mar 265
 
266
    ; Invalid input
267
    jmp     retry
268
 
269
prog1:
270
    ; Clear screen
271
    call    clear_vga
272
 
273
    ; Setup parameter block for the EXEC command
274
    call    setup_paramblk
275
 
276
    ; Start game 1
11 daniel-mar 277
    mov     ah, 4Bh       ; execute 
278
    mov     al, 00h       ; load and execute 
9 daniel-mar 279
    mov     bx, paramblk
280
    lea     dx, exename1
281
    int     21h
282
 
17 daniel-mar 283
    ; Is everything OK? Or is the GAM file missing?
284
    jc      error
285
 
11 daniel-mar 286
    ; Notify the player that the game has finished
9 daniel-mar 287
    jmp     gameover
288
 
289
prog2:
290
    ; Clear screen
291
    call    clear_vga
292
 
293
    ; Setup parameter block for the EXEC command
294
    call    setup_paramblk
295
 
296
    ; Start game 2
11 daniel-mar 297
    mov     ah, 4Bh       ; execute 
298
    mov     al, 00h       ; load and execute 
9 daniel-mar 299
    mov     bx, paramblk
300
    lea     dx, exename2
301
    int     21h
17 daniel-mar 302
 
303
    ; Is everything OK? Or is the GAM file missing?
304
    jc      error
9 daniel-mar 305
 
11 daniel-mar 306
    ; Notify the player that the game has finished
9 daniel-mar 307
    jmp     gameover
11 daniel-mar 308
 
17 daniel-mar 309
error:
310
    ; Video Mode VGA 12
311
    call    set_screen12
312
 
313
    ; Clear screen
314
    ; call    clear_vga
315
 
316
    ; Print error
317
    call    print_error_screen
318
 
319
    ; Give the player time to read the error message (approx 5 seconds)
320
    call    sleep_5
321
 
322
    ; Go back to the menu
323
    jmp     menu
324
 
9 daniel-mar 325
gameover:
11 daniel-mar 326
    ; Print gameover screen
327
    call    print_gameover_screen
9 daniel-mar 328
 
11 daniel-mar 329
    ; Give the player time to read the game over message (approx 5 seconds)
330
    call    sleep_5
9 daniel-mar 331
 
11 daniel-mar 332
    ; Go back to the menu
9 daniel-mar 333
    jmp     menu
334
 
11 daniel-mar 335
exit:
9 daniel-mar 336
    ; Reset video mode to DOS default
11 daniel-mar 337
    pop     ax            ; the video mode we have preserved at program start
338
    mov     ah, 0         ; set screen mode
9 daniel-mar 339
    int     10h
340
 
341
    ; Return to DOS
11 daniel-mar 342
    call    exit_to_dos
9 daniel-mar 343
 
11 daniel-mar 344
; -------------------------------------------------------
345
 
9 daniel-mar 346
end start