Subversion Repositories aysalia

Rev

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

  1.  
  2. ; Aysalia DOS Launcher
  3. ; Launches aydos1.gam and aydos2.gam
  4. ; Revision 2018-12-07
  5. ; (C) 2018 Daniel Marschall, ViaThinkSoft
  6.  
  7. .model small
  8. .stack 10h
  9.  
  10. ; -------------------------------------------------------
  11.  
  12. .data
  13.  
  14.     exename1  db "AYDOS1.GAM", 0
  15.     exename2  db "AYDOS2.GAM", 0
  16.     cmdargs   db 0, '', 0Dh
  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.  
  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
  46.    
  47.     error1    db 13, 10, \
  48.                  'Fehler: Spiel kann nicht gestartet werden. Fehlt eine Datei?', 13, 10, \
  49.                  13, 10, 0
  50.  
  51.     gameover1 db 13, 10, \
  52.                  'Spiel zu Ende!', 13, 10, \
  53.                  13, 10, 0
  54.  
  55. ; -------------------------------------------------------
  56.  
  57. .code
  58.  
  59. clear_vga PROC
  60.     mov     ax, 0A000h
  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.  
  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.  
  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.  
  84. set_numlock_on PROC
  85.     push    ds
  86.     mov     ax, 40h
  87.     mov     ds, ax        ; Go to BIOS Data Area ( http://stanislavs.org/helppc/bios_data_area.html )
  88.     mov     bx, 17h       ; Load Keyboard flag byte 0
  89.     mov     al, [bx]      ; Read
  90.     or      al, 20h       ; Set bit 5 (numlock) to 1
  91.     mov     [bx], al      ; Write
  92.     pop     ds
  93.     ret
  94. set_numlock_on ENDP
  95.  
  96. flush_keyb_buf PROC
  97.     mov     ah, 0Ch       ; Flush input buffer and input
  98.     mov     al, 0
  99.     int     21h
  100.     ret
  101. flush_keyb_buf ENDP
  102.  
  103. exit_to_dos PROC
  104.     mov     ah, 4Ch
  105.     mov     al, 00h
  106.     int     21h
  107.     ret
  108. exit_to_dos ENDP
  109.  
  110. sleep_5 PROC
  111.     mov     ah, 00h
  112.     int     1Ah
  113.     cmp     dx, 7FFFh
  114.     jg      sleep_5_upperhalf
  115. sleep_5_lowerhalf:
  116.     mov     bx, dx
  117.     add     bx, 91        ; 18.2 = 1 sec (therefore 91 = 5 sec)
  118. sleep_5_lowerhalf_again:
  119.     int     1Ah
  120.     cmp     dx, bx
  121.     jl      sleep_5_lowerhalf_again
  122.     ret
  123. sleep_5_upperhalf:
  124.     mov     bx, dx
  125.     sub     bx, 7FFFh
  126.     add     bx, 91        ; 18.2 = 1 sec (therefore 91 = 5 sec)
  127. sleep_5_upperhalf_again:
  128.     int     1Ah
  129.     sub     dx, 7FFFh
  130.     cmp     dx, bx
  131.     jl      sleep_5_upperhalf_again
  132.     ret
  133. sleep_5 ENDP
  134.  
  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
  157.     mov     ah, 0Bh
  158.     mov     bh, 00h
  159.     int     10h
  160.     ret
  161. set_bg_color ENDP
  162.  
  163. print_menu_screen PROC
  164.     ; Clear screen
  165.     call    clear_vga
  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
  173.     lea     dx, menu1
  174.     call    print_color_string
  175.    
  176.     ret
  177. print_menu_screen ENDP
  178.  
  179. print_error_screen PROC
  180.     ; Clear screen
  181.     call    clear_vga
  182.  
  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
  189.     lea     dx, error1
  190.     call    print_color_string
  191.    
  192.     ret
  193. print_error_screen ENDP
  194.  
  195. print_gameover_message PROC
  196.     ; Keep cursor position
  197.  
  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
  204.     lea     dx, gameover1
  205.     call    print_color_string
  206.    
  207.     ret
  208. print_gameover_message ENDP
  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)
  222.    
  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
  234.     mov     bx, 100       ; 100 paragraphs a 16 bytes = 1600 bytes
  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.    
  247. retry:
  248.     ; Query keyboard input
  249.     mov     ah, 07h       ; Direct character input, without echo
  250.     int     21h
  251.     cmp     al, '1'
  252.     je      prog1
  253.     cmp     al, '2'
  254.     je      prog2
  255.     cmp     al, '9'
  256.     je      exit
  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
  269.     mov     ah, 4Bh       ; execute
  270.     mov     al, 00h       ; load and execute
  271.     mov     bx, paramblk
  272.     lea     dx, exename1
  273.     int     21h
  274.    
  275.     ; Is everything OK? Or is the GAM file missing?
  276.     jc      error
  277.  
  278.     ; Notify the player that the game has finished
  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
  289.     mov     ah, 4Bh       ; execute
  290.     mov     al, 00h       ; load and execute
  291.     mov     bx, paramblk
  292.     lea     dx, exename2
  293.     int     21h
  294.    
  295.     ; Is everything OK? Or is the GAM file missing?
  296.     jc      error
  297.  
  298.     ; Notify the player that the game has finished
  299.     jmp     gameover
  300.    
  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.    
  314. gameover:
  315.     ; Print gameover message
  316.     call    print_gameover_message
  317.  
  318.     ; Give the player time to read the game over message (approx 5 seconds)
  319.     call    sleep_5
  320.  
  321.     ; Go back to the menu
  322.     jmp     menu
  323.    
  324. exit:
  325.     ; Reset video mode to DOS default
  326.     pop     ax            ; the video mode we have preserved at program start
  327.     mov     ah, 0         ; set screen mode
  328.     int     10h
  329.  
  330.     ; Return to DOS
  331.     call    exit_to_dos
  332.  
  333. ; -------------------------------------------------------
  334.  
  335. end start