179 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
			
		
		
	
	
			179 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
| cpu 8086
 | |
| org 0x3000
 | |
| 
 | |
| ;Set the stack
 | |
| cli
 | |
| mov sp, stack + 0x100
 | |
| sti
 | |
| 
 | |
| ;Check for an empty tail
 | |
| ;Check
 | |
| cmp byte [si], 0x0
 | |
| jne extract
 | |
| ;Print an error message and abort if the tail is empty
 | |
| mov si, errormsg
 | |
| mov ah, 0x2
 | |
| int 0x21
 | |
| je done
 | |
| 
 | |
| ;Find the end of the data file name and add a null if needed
 | |
| ;Set DI at the tail
 | |
| extract:
 | |
| mov di, si
 | |
| findend:
 | |
| ;Check for the string end
 | |
| cmp byte [di], 0x0
 | |
| je load
 | |
| ;Check for a space
 | |
| cmp byte [di], 0x20
 | |
| je addnull
 | |
| inc di
 | |
| jmp findend
 | |
| ;Add a null
 | |
| addnull:
 | |
| mov al, 0x0
 | |
| stosb
 | |
| 
 | |
| ;Load the data file
 | |
| ;Load
 | |
| load:
 | |
| mov bx, stack + 0x100
 | |
| mov ah, 0x2
 | |
| int 0x22
 | |
| ;Check for errors
 | |
| cmp al, 0x0
 | |
| jne done
 | |
| 
 | |
| ;Setup
 | |
| start:
 | |
| ;Set SI to the beginning of the data file
 | |
| mov si, stack + 0x100
 | |
| ;Initialise the scene ID with zeroes and set DI at its beginning
 | |
| mov di, sceneid
 | |
| mov cx, 0xff
 | |
| mov al, 0x0
 | |
| rep stosb
 | |
| mov di, sceneid
 | |
| 
 | |
| ;Intro
 | |
| ;Print the intro
 | |
| mov ah, 0x0
 | |
| int 0x21
 | |
| ;Read any key to start
 | |
| mov ah, 0x0
 | |
| int 0x16
 | |
| call readquit
 | |
| ;Set the ID of the first scene
 | |
| mov al, "0"
 | |
| stosb
 | |
| 
 | |
| ;Search for the current scene
 | |
| searchscene:
 | |
| lodsb
 | |
| cmp al, 0x1
 | |
| je checkscene
 | |
| jmp searchscene
 | |
| 
 | |
| ;Check for the current scene
 | |
| ;Set DI to the current scene id
 | |
| checkscene:
 | |
| mov di, sceneid
 | |
| ;Load the current characters
 | |
| checkloop:
 | |
| mov al, [si]
 | |
| mov bl, [di]
 | |
| ;Compare the characters
 | |
| cmp al, bl
 | |
| jne searchscene
 | |
| ;Check for the string end
 | |
| cmp al, 0x0
 | |
| je loadoptions
 | |
| ;Compare the next characters
 | |
| inc si
 | |
| inc di
 | |
| jmp checkloop
 | |
| 
 | |
| ;Load the number of options to BL
 | |
| loadoptions:
 | |
| inc si
 | |
| lodsb
 | |
| mov bl, al
 | |
| 
 | |
| ;Print the scene
 | |
| ;Move SI to the beginning of the scene text
 | |
| inc si
 | |
| ;Print the scene
 | |
| mov ah, 0x0
 | |
| int 0x21
 | |
| 
 | |
| ;Read the player choice
 | |
| ;Set DI at the options key
 | |
| readchoice:
 | |
| mov di, options
 | |
| ;Set the maximum number of options
 | |
| mov cx, 0x9
 | |
| ;Read a keypress
 | |
| mov ah, 0x0
 | |
| int 0x16
 | |
| ;Check for quitting
 | |
| call readquit
 | |
| ;Check for an ending scene
 | |
| cmp bl, "0"
 | |
| je ending
 | |
| ;Compare the keypress to the key
 | |
| cmpchoice:
 | |
| cmp al, [di]
 | |
| je setscene
 | |
| cmp bl, [di]
 | |
| je readchoice
 | |
| inc di
 | |
| loop cmpchoice
 | |
| jmp readchoice
 | |
| 
 | |
| ;Set the next scene
 | |
| ;Find the end of the current scene id
 | |
| setscene:
 | |
| mov di, sceneid
 | |
| findidend:
 | |
| cmp byte [di], 0x0
 | |
| je addoption
 | |
| inc di
 | |
| jmp findidend
 | |
| ;Add the chosen option
 | |
| addoption:
 | |
| stosb
 | |
| ;Go to the next scene
 | |
| jmp searchscene
 | |
| 
 | |
| ending:
 | |
| mov si, crlf
 | |
| mov ah, 0x0
 | |
| int 0x21
 | |
| jmp start
 | |
| 
 | |
| ;Return to the system
 | |
| done:
 | |
| int 0x20
 | |
| 
 | |
| ;Data
 | |
| errormsg db "File not found", 0x0
 | |
| sceneid  times 0xff db 0x0
 | |
| options  db "123456789"
 | |
| crlf     db 0xd, 0xa, 0x0
 | |
| 
 | |
| ;***
 | |
| 
 | |
| ;Quit the game
 | |
| readquit:
 | |
| 
 | |
| ;Check for keypress escape
 | |
| cmp al, 0x1b
 | |
| je done
 | |
| 
 | |
| ;Return
 | |
| ret
 | |
| 
 | |
| ;***
 | |
| 
 | |
| ;Stack
 | |
| stack:
 | 
