X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=bootcard.asm;h=dddf846518ef6891bd5d87725c3bd6e5325975cd;hb=HEAD;hp=71e161904a8c22522cf6338b0ee64c3aef36a9c4;hpb=0e10d8de248298c3050bc5abb5bdb3e5b208c757;p=bootcard diff --git a/bootcard.asm b/bootcard.asm index 71e1619..dddf846 100644 --- a/bootcard.asm +++ b/bootcard.asm @@ -1,181 +1,226 @@ ; ---- 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 -muscur equ nticks + 4 -spkstat equ muscur + 4 -vol equ spkstat + 4 - -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 +barh equ 4 +nbars equ 11 +barstart equ 200 - (nbars+1) * barh + +nticks equ 7e00h +tmoffs equ 7e04h +musptr equ 7e08h +frame equ 7e0ch +fval equ 7e10h +cmap equ 7e14h + +%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 - xor eax, eax +start: xor ax, ax mov ds, ax + mov es, ax mov ss, ax mov sp, 7c00h - mov [nticks], eax - mov [muscur], eax - ;mov [spkstat], eax - ;mov word [vol], 04h - mov word [32], timer_intr - mov word [34], 0 + mov di, nticks + mov cx, 16 + rep stosw - settimer 0, DIV_ROUND(osc_freq, 100) + cli + mov word [32], tintr + mov [34], ax + + stimer 0, 5966 mov ax, 13h int 10h - mov ax, 0a000h - mov es, ax - - mov ax, 0303h - mov cx, 32000 - xor di, di - rep stosw - - setcursor 10, 12 + 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 - setcursor 12, 13 - mov si, str2 - call textout sti -infloop: - hlt - jmp infloop +mainloop: + mov dx, 3dah +.invb: in al, dx + and al, 8 + jnz .invb +.novb: in al, dx + and al, 8 + jz .novb + +drawbg: + mov bx, 200 + xor di, di +.fillgrad: + mov ax, bx + mov ah, al + mov cx, 2400 ; 15 lines + rep stosw + inc bx + cmp bx, 208 + jnz .fillgrad + + ; mountains + mov cx, 320 + mov bp, sp +.mnt: mov [bp - 2], cx + fild word [bp - 2] + fidiv word [w30] + fsincos + fiadd word [w5] + fimul word [w5] + fistp word [bp - 2] + fstp st0 + mov bx, [bp - 2] + add bx, 84 + imul bx, bx, 320 + add bx, cx +.mntcol: + mov byte [es:bx], 0 + add bx, 320 + cmp bx, 128 * 320 + jb .mntcol + + dec cx + jnz .mnt + + ; 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] and al, al jz .done mov ah, 0eh - mov bx, 0fh + mov bx, 82 int 10h inc si jmp textout .done: ret -timer_intr: + +tintr: + pusha mov ax, [nticks] inc ax mov [nticks], ax - mov bx, [muscur] - shl bx, 2 - mov cx, [music + bx] ; event time - cmp cx, 0ffffh - jz .off + 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] cmp ax, cx - jb .dopwm + jb .end - inc dword [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 - settimer 2, bx + shr bx, 9 + sub bx, 13 + imul bx, bx, 3 + mov byte [cmap + bx], 3fh + mov word [cmap + bx + 1], 2f2fh + + mov bx, ax + stimer 2, bx spkon - mov word [spkstat], 1 - jmp .dopwm + jmp .end .off: spkoff - mov word [spkstat], 0 - jmp .eoi - - ; PWM for volume control -.dopwm: jmp .eoi - spkoff - mov ax, [spkstat] - test ax, ax - jz .eoi - mov ax, [nticks] - and ax, 0fh - cmp ax, [vol] - jae .pwmoff - spkon - jmp .eoi -.pwmoff: - 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 -str1: db 'message message blah',0 -str2: db 'Michael & Athina',0 - -music: - dw 0, 2000 - dw 10, 1900 - dw 20, 1800 - dw 30, 1700 - dw 40, 1600 - dw 50, 1500 - dw 60, 1400 - dw 70, 1300 - dw 80, 1200 - dw 90, 1100 - dw 100, 1000 - dw 110, 1100 - dw 120, 1200 - dw 130, 1300 - dw 140, 1400 - dw 150, 1500 - dw 160, 1600 - dw 170, 1700 - dw 180, 1800 - dw 190, 1900 - dw 200, 2000 - dw 210, 0 - dw 0ffffh, 0 +str1: db 'Michael ',3,' Athena',0 + +music: dd 0a2f8f00h, 0a11123a1h, 23a11423h, 28000023h, 0be322f8fh, 25c0391fh + dd 4b23a13ch, 8f500000h, 23a15a2fh, 641ab161h, 476e1ab1h, 1fbe751ch + dd 8223a178h, 0a18925c0h, 1fbe8c23h, 0aa0000a0h + dw 0 + +w5: dw 5 +w30: dw 30 times 446-($-$$) db 0 dd 00212080h dd 0820280ch dd 00000800h dd 0001f800h + times 510-($-$$) db 0 dw 0aa55h - ; vi:ft=nasm ts=8 sts=8 sw=8: