| 1 |
ORG 100H |
| 2 |
USE16 |
| 3 |
|
| 4 |
include 'CONSTS.ASM' |
| 5 |
include 'OBJTYPES.ASM' |
| 6 |
|
| 7 |
; Unholy hack to reduce the amount of memory we get for the program because DOS is a big dum-dum and allocates the entire |
| 8 |
; free memory space, despite the fact that the program can only be up to 64K in size |
| 9 |
MOV BX, 0x800 ; 32K (in paragraphs) NOTE: If this is not enough, the program will eventually crash when it gets bigger |
| 10 |
; Take great care to synchronize that with the .COM executable size!!!!!!!!!!!!!! |
| 11 |
MOV AH, 4Ah ; MODIFY MEMORY BLOCK |
| 12 |
INT 21h ; Me when Interrupt 21H (Disk Operating System Kernel Interrupt) [Real] |
| 13 |
JC ERROR_GeneralDOSError ; Balls |
| 14 |
|
| 15 |
MOV DX, Filename |
| 16 |
CALL DOS_OpenReadonly |
| 17 |
JC ERROR_FileError ; Carry set means an error |
| 18 |
; If the branch was not taken, AX has the file handle. |
| 19 |
; We just store it in RAM for later since it's going to be useful for pretty much the entire runtime of the program |
| 20 |
MOV [GameFileHandle], AX |
| 21 |
|
| 22 |
; 1 Para = 16B |
| 23 |
|
| 24 |
MOV BX, 1024 ; 16K |
| 25 |
CALL DOS_AllocateMemory ; Allocate scratch RAM |
| 26 |
JC ERROR_GeneralDOSError |
| 27 |
MOV [RAM_Scratch], AX |
| 28 |
|
| 29 |
MOV BX, 256 ; 4K again |
| 30 |
CALL DOS_AllocateMemory ; Allocate persistent RAM |
| 31 |
JC ERROR_GeneralDOSError |
| 32 |
MOV [RAM_Persistent], AX |
| 33 |
|
| 34 |
MOV BX, 4096 ; Full 64K segment |
| 35 |
CALL DOS_AllocateMemory ; Allocate object RAM |
| 36 |
JC ERROR_GeneralDOSError |
| 37 |
MOV [RAM_Object], AX |
| 38 |
|
| 39 |
MOV BX, 4096 ; Full 64K segment |
| 40 |
CALL DOS_AllocateMemory ; Allocate the frame buffer |
| 41 |
JC ERROR_GeneralDOSError |
| 42 |
MOV [RAM_Framebuffer], AX |
| 43 |
|
| 44 |
MOV ES, [RAM_Scratch] |
| 45 |
|
| 46 |
; Allocated segment in ES |
| 47 |
|
| 48 |
MOV BX, [GameFileHandle] ; File handle |
| 49 |
MOV CX, 4 ; Number of bytes to read |
| 50 |
MOV DX, 0 ; Offset into the buffer |
| 51 |
CALL DOS_ReadFileIntoES ; Does the PUSH DS POP DS shenanigans |
| 52 |
JC ERROR_GeneralDOSError ; If CF then error |
| 53 |
|
| 54 |
; Does not mess with BX, and we still need BX for the handle. |
| 55 |
CALL BASE_VerifyGameFileMagic |
| 56 |
|
| 57 |
MOV CX, 2 |
| 58 |
XOR DX, DX |
| 59 |
CALL DOS_ReadFileIntoES ; Read a single byte indicating the version, and then one about how much memory to allocate, 0 is 16K, 1 is 32K, 2 is 64K |
| 60 |
JC ERROR_GeneralDOSError |
| 61 |
|
| 62 |
; Check the file version. Valid values are 1 and... well, just 1. |
| 63 |
A_CheckVer: |
| 64 |
MOV AL, [ES:0] |
| 65 |
CMP AL, 1 |
| 66 |
JE .goodver |
| 67 |
MOV DX, STR_ErrInvalidVersion |
| 68 |
CALL DOS_PrintString |
| 69 |
JMP Exit |
| 70 |
.goodver: |
| 71 |
|
| 72 |
; Read how much memory we want to allocate (0, 1, or 2 for 16, 32, and 64K respectively), allocate it, and store the segment |
| 73 |
MOV AL, [ES:1] |
| 74 |
CALL BASE_AllocFileMem |
| 75 |
MOV [RAM_OpFile], AX |
| 76 |
|
| 77 |
MOV BX, [GameFileHandle] ; We probably lost BX long ago |
| 78 |
MOV CX, 0xFFFF ; Read everything to end |
| 79 |
MOV ES, [RAM_OpFile] ; Store the entire file in its alloc'd memory |
| 80 |
XOR DX, DX ; Starting at offset 0 in ES:DX |
| 81 |
CALL DOS_ReadFileIntoES |
| 82 |
JC ERROR_GeneralDOSError |
| 83 |
|
| 84 |
MOV [FilePtr], 0 ; Reset the file pointer to 0, this is our "program counter" |
| 85 |
|
| 86 |
MOV CX, 3600 ; Object count, 3600 JUST fits, any more and we're out of memory |
| 87 |
MOV ES, [RAM_Object] |
| 88 |
CALL TABLE_InitializeBitmap |
| 89 |
|
| 90 |
CALL BIOS_SetVideoMode13H |
| 91 |
|
| 92 |
MOV DX, MyBmpFn |
| 93 |
CALL BASE_AllocLoadFile ; ES:0 = Loaded file |
| 94 |
MOV [BitmapSeg], ES |
| 95 |
|
| 96 |
MOV DX, MyBmpFn1 |
| 97 |
CALL BASE_AllocLoadFile ; ES:0 = Loaded file |
| 98 |
MOV [BitmapSeg1], ES |
| 99 |
|
| 100 |
|
| 101 |
MOV ES, [RAM_Object] |
| 102 |
|
| 103 |
MOV CX, 1 |
| 104 |
CALL TABLE_ObjAlloc |
| 105 |
|
| 106 |
; AX Has obj h |
| 107 |
CALL TABLE_ObjFree |
| 108 |
|
| 109 |
MOV CX, 1 |
| 110 |
CALL TABLE_ObjAlloc |
| 111 |
PUSH AX |
| 112 |
MOV CX, 1 |
| 113 |
CALL TABLE_ObjAlloc |
| 114 |
CALL TABLE_GetObjectAddr |
| 115 |
MOV WORD [ES:DI], 0xEFBE |
| 116 |
|
| 117 |
;POP AX |
| 118 |
;MOV SI, TestStr |
| 119 |
;CALL OBJ_STRING_FillString |
| 120 |
|
| 121 |
;JMP $ |
| 122 |
|
| 123 |
;TestStr db 'According to all known laws of aviation, there is no way a bee should be able to fly.', 0 |
| 124 |
|
| 125 |
;JMP $ |
| 126 |
|
| 127 |
NewTestDrwLoop: |
| 128 |
MOV AL, 0x01 ; Blue |
| 129 |
CALL BASE_ClearScreen |
| 130 |
|
| 131 |
MOV ES, [BitmapSeg] |
| 132 |
XOR SI, SI |
| 133 |
MOV CX, [XPos] ; X |
| 134 |
MOV DX, [YPos] ; Y |
| 135 |
CALL BASE_DrawBitmapFromFile |
| 136 |
ADD [XPos], 1 |
| 137 |
|
| 138 |
;MOV ES, [BitmapSeg1] |
| 139 |
;XOR SI, SI |
| 140 |
;MOV CX, [XPos1] ; X |
| 141 |
;MOV DX, [YPos1] ; Y |
| 142 |
;CALL BASE_DrawBitmapFromFile |
| 143 |
;SUB [XPos1], 1 |
| 144 |
|
| 145 |
CALL BASE_Present |
| 146 |
JMP NewTestDrwLoop |
| 147 |
|
| 148 |
BitmapSeg dw ? |
| 149 |
BitmapSeg1 dw ? |
| 150 |
MyBmpFn db 'WIDE.BMA', 0x00 |
| 151 |
MyBmpFn1 db 'BMPMOON.BMA', 0x00 |
| 152 |
XPos dw 0 |
| 153 |
YPos dw 0 |
| 154 |
XPos1 dw 0 |
| 155 |
YPos1 dw 0 |
| 156 |
|
| 157 |
JMP $ |
| 158 |
CALL BIOS_SetVideoMode03H ; If Exit is called, the mode is likely already 03H, and we don't want to clear the framebuffer, which this does |
| 159 |
Exit: |
| 160 |
|
| 161 |
MOV BX, [GameFileHandle] |
| 162 |
CALL DOS_CloseFile |
| 163 |
JC FileCloseError |
| 164 |
|
| 165 |
; Free all memory blocks |
| 166 |
; We use CX to see whether the carry has been set within one or more calls, since we want to continue even if there was an error |
| 167 |
; So we just use ADC CX, 0 to add the carry to CX, if CF = 0, CX = 0 |
| 168 |
CLC |
| 169 |
XOR CX, CX |
| 170 |
|
| 171 |
MOV ES, [RAM_Scratch] |
| 172 |
CALL DOS_FreeMemory |
| 173 |
ADC CX, 0 |
| 174 |
|
| 175 |
MOV ES, [RAM_Persistent] |
| 176 |
CALL DOS_FreeMemory |
| 177 |
ADC CX, 0 |
| 178 |
|
| 179 |
MOV ES, [RAM_Object] |
| 180 |
CALL DOS_FreeMemory |
| 181 |
ADC CX, 0 |
| 182 |
|
| 183 |
MOV ES, [RAM_OpFile] |
| 184 |
CALL DOS_FreeMemory |
| 185 |
ADC CX, 0 |
| 186 |
|
| 187 |
CMP CX, 0 |
| 188 |
JE .noerror |
| 189 |
|
| 190 |
MOV DX, STR_ErrFree |
| 191 |
CALL DOS_PrintString |
| 192 |
.noerror: |
| 193 |
|
| 194 |
MOV DX, STR_Bye |
| 195 |
CALL DOS_PrintString |
| 196 |
|
| 197 |
; CALL BIOS_SetVideoMode03H ; Fix the video mode |
| 198 |
INT 20H ; ENDOF Program |
| 199 |
|
| 200 |
include 'ERRORS.ASM' |
| 201 |
include 'DOSFUNC.ASM' |
| 202 |
include 'BIOSFUNC.ASM' |
| 203 |
include 'BASEFUNC.ASM' |
| 204 |
include 'HEAPUTIL.ASM' |
| 205 |
include 'OBJUTILS.ASM' |
| 206 |
include 'STATVAR.ASM' |