X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=bootcard.asm;h=dddf846518ef6891bd5d87725c3bd6e5325975cd;hb=HEAD;hp=9f70b594c01884daeb967e0ccb1307fae469110b;hpb=81f4a7524f538796dce76fb3a498af35e6be6233;p=bootcard diff --git a/bootcard.asm b/bootcard.asm index 9f70b59..dddf846 100644 --- a/bootcard.asm +++ b/bootcard.asm @@ -1,53 +1,44 @@ ; ---- boot me! ---- ; nasm -f bin -o bootcard.img bootcard.asm ; cat bootcard.img >/dev/ -; reboot org 7c00h bits 16 -data_start equ 7e00h -nticks equ data_start -tmoffs equ nticks + 4 -muscur equ tmoffs + 4 -data_end equ muscur + 4 +barh equ 4 +nbars equ 11 +barstart equ 200 - (nbars+1) * barh -backbuf_seg equ 1000h +nticks equ 7e00h +tmoffs equ 7e04h +musptr equ 7e08h +frame equ 7e0ch +fval equ 7e10h +cmap equ 7e14h -OSC_FREQ equ 1193182 -PIT_DATA0 equ 40h -PIT_CMD equ 43h -PIT_CMD_CHAN0 equ 00h -PIT_CMD_HILO equ 30h -PIT_CMD_SQWAVE equ 06h -KB_CTRL equ 61h - -%define DIV_ROUND(a, b) ((a) / (b) + ((a) % (b)) / ((b) / 2)) - -%macro setcursor 2 - mov dl, %1 - mov dh, %2 +%macro setcur 2 + mov dx, %1 | (%2 << 8) xor bx, bx mov ah, 2 int 10h %endmacro %macro spkon 0 - in al, KB_CTRL + in al, 61h or al, 3 - out KB_CTRL, al + out 61h, al %endmacro %macro spkoff 0 - in al, KB_CTRL + in al, 61h and al, 0fch - out KB_CTRL, al + out 61h, al %endmacro -%macro settimer 2 - mov al, (PIT_CMD_CHAN0 + (%1 << 6)) | PIT_CMD_HILO | PIT_CMD_SQWAVE - out PIT_CMD, al +%macro stimer 2 + mov al, (%1 << 6) | 36h + out 43h, al mov ax, %2 - out PIT_DATA0 + %1, al + out 40h + %1, al mov al, ah - out PIT_DATA0 + %1, al + out 40h + %1, al %endmacro start: xor ax, ax @@ -56,62 +47,54 @@ start: xor ax, ax mov ss, ax mov sp, 7c00h - mov di, data_start - mov cx, (data_end - data_start) / 2 + mov di, nticks + mov cx, 16 rep stosw - mov word [32], timer_intr + cli + mov word [32], tintr mov [34], ax - settimer 0, DIV_ROUND(OSC_FREQ, 200) + stimer 0, 5966 mov ax, 13h int 10h - push backbuf_seg + push 0a000h pop es + + mov al, 16 + mov di, barstart * 320 + mov bx, nbars +.drawbars: + mov cx, barh * 320 + rep stosb + inc al + dec bx + jnz .drawbars + + setcur 12, 16 + mov si, str1 + call textout + sti mainloop: - call drawbg - mov dx, 3dah .invb: in al, dx and al, 8 - jnz mainloop + jnz .invb .novb: in al, dx and al, 8 jz .novb - push ds - push es - push es - pop ds - push 0a000h - pop es - xor di, di - xor si, si - mov cx, 32000 - rep movsw - pop es - pop ds - - setcursor 10, 0 - mov si, str1 - call textout - setcursor 12, 1 - mov si, str2 - call textout - - jmp mainloop - drawbg: mov bx, 200 - mov di, 5120 + xor di, di .fillgrad: mov ax, bx mov ah, al - mov cx, 2400 ; 15 lines + mov cx, 2400 ; 15 lines rep stosw inc bx cmp bx, 208 @@ -127,22 +110,30 @@ drawbg: fiadd word [w5] fimul word [w5] fistp word [bp - 2] - ;fistp word [bp - 4] + fstp st0 mov bx, [bp - 2] - add bx, 100 + add bx, 84 imul bx, bx, 320 add bx, cx .mntcol: mov byte [es:bx], 0 add bx, 320 - cmp bx, 64000 + cmp bx, 128 * 320 jb .mntcol dec cx jnz .mnt - - ret + ; upd colormap + mov dx, 3c8h + mov al, 16 + out dx, al + inc dx + mov si, cmap + mov cx, 16 * 3 + rep outsb + + jmp mainloop textout: mov al, [si] @@ -155,88 +146,74 @@ textout: jmp textout .done: ret -timer_intr: + +tintr: pusha mov ax, [nticks] inc ax mov [nticks], ax + mov bx, [musptr] + cmp bx, 22*3 + jnz .skiploop + xor bx, bx + mov [tmoffs], ax +.skiploop: + xor cx, cx + mov cl, [music + bx] + shl cx, 4 sub ax, [tmoffs] -.pmus: mov bx, [muscur] - shl bx, 2 - mov cx, [music + bx] ; event time - cmp cx, 0ffffh - jz .loop cmp ax, cx - jb .eoi + jb .end - inc word [muscur] - mov ax, [music + 2 + bx] ; event counter reload + mov ax, [music + 1 + bx] + add bx, 3 + mov [musptr], bx test ax, ax jz .off + + mov bx, ax + shr bx, 9 + sub bx, 13 + imul bx, bx, 3 + mov byte [cmap + bx], 3fh + mov word [cmap + bx + 1], 2f2fh + mov bx, ax - settimer 2, bx + stimer 2, bx spkon - jmp .eoi + jmp .end .off: spkoff +.end: test word [nticks], 1 + jnz .eoi + mov cx, 16 * 3 + mov si, cmap +.fadecol: + lodsb + test al, al + jz .skipdec + dec al + mov [si-1], al +.skipdec: + dec cx + jnz .fadecol + .eoi: mov al, 20h - out 20h, al ; EOI + out 20h, al popa iret -.loop: neg cx - mov [muscur], cx - mov ax, [nticks] - mov [tmoffs], ax - jmp .pmus - - -str1: db 'message message blah',0 -str2: db 'Michael & Athena',0 - -G2 equ 12175 -C3 equ 9121 -D3 equ 8126 -B2 equ 9664 -F3 equ 6833 -E3 equ 7239 - -%define TM(x) (40 + (x) * 4) +str1: db 'Michael ',3,' Athena',0 -music: dw 0, 0 - dw TM(0), G2 - dw TM(40), C3 - dw TM(70), C3 +music: dd 0a2f8f00h, 0a11123a1h, 23a11423h, 28000023h, 0be322f8fh, 25c0391fh + dd 4b23a13ch, 8f500000h, 23a15a2fh, 641ab161h, 476e1ab1h, 1fbe751ch + dd 8223a178h, 0a18925c0h, 1fbe8c23h, 0aa0000a0h + dw 0 - dw TM(80), C3 - dw TM(140), 0 - - dw TM(160), G2 - dw TM(200), D3 - dw TM(230), B2 - - dw TM(240), C3 - dw TM(300), 0 - - dw TM(320), G2 - dw TM(360), C3 - dw TM(390), F3 - - dw TM(400), F3 - dw TM(440), E3 - dw TM(470), D3 - - dw TM(480), C3 - dw TM(520), B2 - dw TM(550), C3 - - dw TM(560), D3 - dw TM(640), 0 - - dw TM(680), 0 - dw 0ffffh, 0 +w5: dw 5 +w30: dw 30 times 446-($-$$) db 0 dd 00212080h @@ -244,9 +221,6 @@ music: dw 0, 0 dd 00000800h dd 0001f800h -w5: dw 5 -w30: dw 30 times 510-($-$$) db 0 dw 0aa55h - ; vi:ft=nasm ts=8 sts=8 sw=8: