diff --git a/th04/formats/cdg.h b/th04/formats/cdg.h new file mode 100644 index 00000000..fd508d10 --- /dev/null +++ b/th04/formats/cdg.h @@ -0,0 +1,5 @@ +// ORs a single plane of the CDG image in the given [slot] into the given +// VRAM destination plane at (⌊x/8⌋*8, y), wrapped vertically. +void pascal cdg_put_plane_roll( + int x, int y, int slot, vram_plane_t plane_src, void __seg *plane_dst +); diff --git a/th04/formats/cdg_put_plane_roll.asm b/th04/formats/cdg_put_plane_roll.asm new file mode 100644 index 00000000..2d2686cf --- /dev/null +++ b/th04/formats/cdg_put_plane_roll.asm @@ -0,0 +1,80 @@ +public CDG_PUT_PLANE_ROLL +cdg_put_plane_roll proc far + +@@plane_dst = word ptr [bp+6] +@@plane_src = word ptr [bp+8] +@@slot = word ptr [bp+10] +@@y = word ptr [bp+12] +@@x = word ptr [bp+14] + +@@stride_backwards equ dx +@@h equ bx + + push bp + mov bp, sp + push si + push di + mov ax, @@plane_dst + mov es, ax + mov si, @@slot + shl si, 4 + add si, offset _cdg_slots + mov di, @@x + sar di, 3 + mov @@h, [si+CDGSlot.pixel_height] + mov ax, @@y + add ax, @@h + dec ax + shl ax, 6 + add di, ax + shr ax, 2 + add di, ax + mov ax, [si+CDGSlot.width_divided_by_32] + mov word ptr cs:@@width_dwords, ax + jmp short $+2 + shl ax, 2 + add ax, ROW_SIZE + mov @@stride_backwards, ax + push ds + mov ax, [si+CDGSlot.sgm_colors] + mov si, [si+CDGSlot.bitplane_size] + mov ds, ax + mov cx, @@plane_src + inc cx + mov ax, si + neg si + +@@plane_src_num_to_offset: + add si, ax + loop @@plane_src_num_to_offset + cmp di, (ROW_SIZE * RES_Y) + jb short @@start_blitting + sub di, (ROW_SIZE * RES_Y) + +@@start_blitting: + cld + nop + +@@next_row: +@@width_dwords equ $+1 + mov cx, 1234h + +@@blit_dword: + mov eax, [si] + or es:[di], eax + add si, 4 + add di, 4 + loop @@blit_dword + sub di, @@stride_backwards + jge short @@more_rows? + add di, (ROW_SIZE * RES_Y) + +@@more_rows?: + dec @@h + jnz short @@next_row + pop ds + pop di + pop si + pop bp + retf 0Ah +cdg_put_plane_roll endp diff --git a/th04_main.asm b/th04_main.asm index 0deb9ace..2eb130d7 100644 --- a/th04_main.asm +++ b/th04_main.asm @@ -7245,7 +7245,7 @@ loc_EC24: push [bp+var_2] push 110000h push 0E000h - call far ptr loc_1371A + call cdg_put_plane_roll inc si loc_EC51: @@ -15149,74 +15149,7 @@ include th02/initmain.asm db 0 include th04/formats/cdg_put_noalpha.asm -loc_1371A: - push bp - mov bp, sp - push si - push di - mov ax, [bp+6] - mov es, ax - mov si, [bp+0Ah] - shl si, 4 - add si, offset _cdg_slots - mov di, [bp+0Eh] - sar di, 3 - mov bx, [si+4] - mov ax, [bp+0Ch] - add ax, bx - dec ax - shl ax, 6 - add di, ax - shr ax, 2 - add di, ax - mov ax, [si+8] - mov word ptr cs:loc_13778+1, ax - jmp short $+2 - shl ax, 2 - add ax, 50h ; 'P' - mov dx, ax - push ds - mov ax, [si+0Eh] - mov si, [si] - mov ds, ax - mov cx, [bp+8] - inc cx - mov ax, si - neg si - -loc_13768: - add si, ax - loop loc_13768 - cmp di, 7D00h - jb short loc_13776 - sub di, 7D00h - -loc_13776: - cld - nop - -loc_13778: - mov cx, 1234h - -loc_1377B: - mov eax, [si] - or es:[di], eax - add si, 4 - add di, 4 - loop loc_1377B - sub di, dx - jge short loc_13792 - add di, 7D00h - -loc_13792: - dec bx - jnz short loc_13778 - pop ds - pop di - pop si - pop bp - retf 0Ah - +include th04/formats/cdg_put_plane_roll.asm include th04/hardware/input_sense.asm include th04/snd/se.asm include th04/formats/cdg_load.asm