--- /dev/null
+ IDEAL\r
+ MODEL huge\r
+\r
+CODESEG\r
+\r
+PUBLIC C tw_opengraph, C tw_putpixel, C tw_setpalette, C tw_setstart\r
+PUBLIC C tw_pictovmem, C tw_closegraph, C tw_waitvr, C tw_setrgbpalette\r
+PUBLIC C tw_clrscr, C tw_setpalarea, C tw_getpixel, C tw_opengraph2\r
+\r
+PUBLIC C scr_seg ; videomuistin alku segmentti\r
+\r
+planetau db 1,2,4,8\r
+scr_seg dw 0a000h\r
+\r
+; avaa 320x200 tweak tilan, 4 sivua, 4 planea\r
+\r
+PROC tw_opengraph\r
+\r
+ mov dx, 03c4h\r
+ mov ax, 0f02h\r
+ out dx, ax\r
+ mov dx, 0a000h\r
+ mov es, dx\r
+ xor di, di\r
+ xor ax, ax\r
+ mov cx, 8000h\r
+ rep stosw ; clear vmem\r
+\r
+ mov dx, 3d4h\r
+ mov ax, 0209h\r
+ out dx, ax ; 134 y\r
+\r
+ mov ax, 5013h\r
+ out dx, ax ; 640 wide\r
+ ret\r
+ENDP\r
+\r
+\r
+PROC tw_opengraph2\r
+\r
+ mov dx, 03c4h\r
+ mov ax, 0604h\r
+ out dx, ax ; chain4 off\r
+\r
+ mov ax, 0f02h\r
+ out dx, ax\r
+ mov dx, 0a000h\r
+ mov es, dx\r
+ xor di, di\r
+ xor ax, ax\r
+ mov cx, 8000h\r
+ rep stosw ; clear vmem\r
+\r
+ mov dx, 03d4h\r
+ mov ax, 0014h\r
+ out dx, ax ; crtc long off\r
+\r
+ mov ax, 0e317h\r
+ out dx, ax ; crtc byte on\r
+\r
+ mov ax, 0009h\r
+ out dx, ax ; 400\r
+\r
+ mov ax, 3013h\r
+ out dx, ax ; 384 wide\r
+\r
+ ret\r
+ENDP\r
+\r
+\r
+\r
+PROC tw_clrscr\r
+\r
+ mov dx, 3c4h\r
+ mov ax, 0f02h\r
+ out dx, ax\r
+ mov dx, [cs:scr_seg]\r
+ mov es, dx\r
+ xor di, di\r
+ xor eax, eax\r
+ mov cx, 1000h\r
+ rep stosd ; clear vmem\r
+\r
+ ret\r
+ENDP\r
+\r
+PROC tw_closegraph\r
+\r
+ mov ax, 03h\r
+ int 10h\r
+\r
+ ret\r
+ENDP\r
+\r
+; piirt\84\84 pisteen ruudulle\r
+\r
+PROC tw_putpixel\r
+\r
+ ARG x:word, y:word, color:word\r
+\r
+ push bp\r
+ mov bp, sp\r
+\r
+ mov ax, [cs:scr_seg]\r
+ mov es, ax\r
+\r
+ mov dx, 03c4h\r
+ mov bx, [x]\r
+ and bx, 03h\r
+ mov ah, [cs:planetau+bx]\r
+ mov al, 02h\r
+ out dx, ax ; select plane\r
+\r
+ mov bx, [x]\r
+ shr bx, 2\r
+ mov ax, [y]\r
+ shl ax, 4\r
+ add bx, ax\r
+ shl ax, 1\r
+ add bx, ax\r
+ shl ax, 2\r
+ add bx, ax\r
+\r
+ mov cx, [color]\r
+ mov [es:bx], cl\r
+\r
+ pop bp\r
+ ret\r
+ENDP\r
+\r
+PROC tw_getpixel\r
+\r
+ ARG x:word, y:word\r
+\r
+ push bp\r
+ mov bp, sp\r
+\r
+ mov ax, [scr_seg]\r
+ mov es, ax\r
+\r
+ mov dx, 03ceh\r
+ mov ax, [x]\r
+ and ax, 03h\r
+ mov ah, al\r
+ mov al, 04h\r
+ out dx, ax ; select plane\r
+\r
+ mov ax, [y]\r
+ shl ax, 4\r
+ mov bx, ax\r
+ shl ax, 1\r
+ add bx, ax\r
+ shl ax, 2\r
+ add bx, ax\r
+ mov ax, [x]\r
+ shr ax, 2\r
+ add bx, ax\r
+\r
+ xor ax, ax\r
+ mov al,[es:bx]\r
+\r
+ pop bp\r
+ ret\r
+ENDP\r
+; vaihtaa koko paletin\r
+\r
+PROC tw_setpalette\r
+\r
+ ARG pal:dword\r
+\r
+ push bp\r
+ mov bp, sp\r
+ push si ds\r
+\r
+ lds si,[pal]\r
+ cld\r
+ mov cx, 300h\r
+ mov dx, 03c8h\r
+ mov al, 0\r
+ out dx, al\r
+ inc dx\r
+\r
+ rep outsb\r
+\r
+ pop ds si\r
+ pop bp\r
+ ret\r
+ENDP\r
+\r
+PROC C tw_setpalarea\r
+\r
+ ARG pal:dword, start:word, cnt:word\r
+\r
+ push si ds\r
+\r
+ lds si,[pal]\r
+ cld\r
+ mov cx, [cnt]\r
+ mov ax, cx\r
+ add cx, ax\r
+ add cx, ax\r
+ mov dx, 03c8h\r
+ mov ax, [start]\r
+ out dx, al\r
+ inc dx\r
+\r
+ rep outsb\r
+\r
+ pop ds si\r
+ ret\r
+ENDP\r
+\r
+; asettaa videomuistin alun\r
+\r
+PROC tw_setstart\r
+\r
+ ARG start:word\r
+\r
+ push bp\r
+ mov bp,sp\r
+\r
+ mov bx, [start]\r
+ mov dx, 03d4h\r
+ mov al, 0dh\r
+ mov ah, bl\r
+ out dx, ax\r
+ mov al, 0ch\r
+ mov ah, bh\r
+ out dx, ax\r
+\r
+ pop bp\r
+ ret\r
+ENDP\r
+\r
+; kopioi muistista unpacked 1bpl kuvan 4planen kuvaksi videomuistiin\r
+; void tw_pictovmem(char far *pic, unsigned int vstart, unsigned int bytes);\r
+\r
+PROC tw_pictovmem\r
+\r
+ ARG pic:dword,to:word,len:word\r
+\r
+ push bp\r
+ mov bp,sp\r
+ push ds es si di\r
+\r
+ mov es, [scr_seg]\r
+ mov di, [to]\r
+ lds si, [pic]\r
+ mov cx, [len]\r
+\r
+ mov dx,03ceh\r
+ mov ax,4005h ; w-mode 0\r
+ out dx,ax\r
+\r
+ mov dx, 03c4h\r
+ mov al, 02h\r
+ mov ah, 1h\r
+ out dx, ax\r
+ shr cx, 2\r
+@@l1:\r
+ movsb\r
+ add si, 3\r
+ loop @@l1\r
+\r
+\r
+ lds si, [pic]\r
+ add si, 1d\r
+ mov di, [to]\r
+ mov cx, [len]\r
+\r
+ mov ax, 0202h\r
+ out dx, ax\r
+ shr cx, 2\r
+@@l2:\r
+ movsb\r
+ add si, 3\r
+ loop @@l2\r
+\r
+\r
+ lds si, [pic]\r
+ add si, 2d\r
+ mov di, [to]\r
+ mov cx, [len]\r
+\r
+ mov ax, 0402h\r
+ out dx, ax\r
+ shr cx, 2\r
+@@l3:\r
+ movsb\r
+ add si, 3\r
+ loop @@l3\r
+\r
+\r
+ lds si, [pic]\r
+ add si, 3d\r
+ mov di, [to]\r
+ mov cx, [len]\r
+\r
+ mov ax, 0802h\r
+ out dx, ax\r
+ shr cx, 2\r
+@@l4:\r
+ movsb\r
+ add si, 3\r
+ loop @@l4\r
+\r
+ pop di si es ds\r
+ pop bp\r
+ ret\r
+ENDP\r
+\r
+PROC tw_waitvr\r
+\r
+ mov dx, 03dah\r
+\r
+@@loop1:\r
+ in al, dx\r
+ test al, 08h\r
+ jnz @@loop1\r
+\r
+@@loop2:\r
+ in al, dx\r
+ test al, 08h\r
+ jz @@loop2\r
+\r
+ ret\r
+ENDP\r
+\r
+\r
+PROC C tw_setrgbpalette\r
+\r
+ ARG pal:word, r:word, g:word, b:word\r
+\r
+ mov dx, 3c8h\r
+ mov ax, [pal]\r
+ out dx, al\r
+\r
+ inc dx\r
+ mov ax, [r]\r
+ out dx, al\r
+ mov ax, [g]\r
+ out dx, al\r
+ mov ax, [b]\r
+ out dx, al\r
+\r
+ ret\r
+ENDP\r
+\r
+END\r