Subversion Repositories aysalia

Rev

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