; CharBuilder ; Version 0.90 ; Copyright (C) 2006 Mark Guttenbrunner ;-------------------------------------------------------------------- cpu 8048 org 400h jmp start ; RESET $400 jmp intr ; interrupt $402 -> my own interrupt start ;--------------------------------------------------------- ; system init ;--------------------------------------------------------- en i ; interrupts off call 00F1h ; reset the O2 mov r0,#0A0h mov a,#00000000b ; vdc off movx @r0,a call gridInit ; init Grid mov r0,#040h ; VDC-Register mov r1,#0B8h ; Y-Position mov r2,#020h ; X-Position mov r3,#007h ; Color white mov r4,#logo1 & 0ffh; Position of Chars mov r7,#08 ; display 1 quadchar call Scrolltext mov r0,#060h ; VDC-Register mov r1,#0C8h ; Y-Position mov r2,#018h ; X-Position mov r3,#007h ; Color white mov r4,#logo2 & 0ffh; Position of Chars mov r7,#08 ; display 1 quadchar call Scrolltext call extramInit ; init Extram orl p1,#00010100b ; vdc on anl p1,#11110111b mov a,#00000001b mov r1,#0A3h movx @r1,a ; screen color black, grid color blue mov r0,#0A0h mov a,#00101000b ; control register: foreground objects on, grid on movx @r0,a loop ;------------------------------------------------------------ ; do all the work here (get joysticks and calculate positions) ;------------------------------------------------------------ ;-------------------------------------- ; setup extram access for calculations ;-------------------------------------- orl p1,#00001100b ; extram on anl p1,#10101111b mov r7,#000h call CalcChar clr f0 mov r6,#010h call CalcDisplayDigits mov r7,#001h call CalcChar mov r6,#028h call CalcDisplayDigits ;--------------------------------------------------------- ; wait for VSYNC ;--------------------------------------------------------- waitForVSYNC jf1 VSYNC jmp waitForVSYNC VSYNC clr f1 ;--------------------------------------------------------------- ; draw the 2 characters ;--------------------------------------------------------------- ;------------------------- ; setup vdc, extram, copy ;------------------------- orl p1,#01000100b ; extram on, copy on, vdc on, keyboard off anl p1,#11100111b mov r0,#0A0h clr a ; vdc off movx @r0,a call DrawChars mov r0,#0A0h mov a,#00101000b ; control register: grid on, foreground objects on, dot grid on movx @r0,a ; turn vdc back on ;--------------------------------------------------------- ; wait until 2 x VSYNC is over before we start again ;--------------------------------------------------------- waitForVSYNC2 jf1 VSYNC2 jmp waitForVSYNC2 VSYNC2 clr f1 jmp loop ;================================================================================================================ ;= = ;= Page 2: Char Calculation = ;= = ;================================================================================================================ align 256 ;--------------------------------------------------------- ; r7 = Char (0 oder 1) ;--------------------------------------------------------- calcchar mov a,r7 mov r1,a call 038Fh ; read Joystick mov a,r7 rl a ; x2 rl a ; x4 rl a ; x8 mov r6,a ; Base Address for Character in extram -> R6 jf0 FirePressed ; no Fire -> charset and colors add a,#02h mov r0,a ; Charset low movx a,@r0 add a,r3 movx @r0,a inc r0 ; charset high mov a,r3 xrl a,#0FFh jnz isNotFF cpl c ; wenn $FF isNotFF jnc dontchange movx a,@r0 cpl a anl a,#1 movx @r0,a dontchange inc r0 ; color movx a,@r0 add a,r2 anl a,#111b movx @r0,a jmp NoFire FirePressed ; Fire -> x / y positions mov a,r6 mov r0,a movx a,@r0 add a,r3 ; 1d-82 mov r4,a ; save a add a,#07Eh cpl c jc nottohigh mov r4,#082h nottohigh mov a,r4 add a,#0E3h jc nottolow mov r4,#1dh nottolow mov a,r4 movx @r0,a ; Set y Position inc r0 movx a,@r0 add a,r2 mov r4,a ; save a add a,#0AEh cpl c jc nottoright mov r4,#051h nottoright mov a,r4 add a,#0F5h jc nottoleft mov r4,#0Ah nottoleft mov a,r4 movx @r0,a ; Set X Position NoFire retr ;------------------------------------------------- ; DrawChars: r0 VDC, r1 intram ;------------------------------------------------- DrawChars mov r0,#010h mov r1,#000h mov r7,#8 ; draw 8 chars loopWriteChar movx a,@r1 movx @r0,a ; Y Pos rr a ; calculation for Charpointer: Y / 2 -> rotate right and anl a,#01111111b ; clear highest bit cpl a ; complement and add 1 inc a ; to get a negative number mov r2,a ; R2 = -Y/2 inc r0 inc r1 movx a,@r1 movx @r0,a ; X Pos inc r0 inc r1 movx a,@r1 add a,r2 ; A-Y/2 movx @r0,a ; Charpointer Pos mov r3,#1 jnc notCarry mov r3,#0 notCarry: inc r0 inc r1 movx a,@r1 xrl a,r3 mov r2,a inc r1 movx a,@r1 rl a orl a,r2 movx @r0,a ; Color inc r0 inc r1 inc r1 inc r1 inc r1 djnz r7,loopWriteChar retr ;--------------------------------------------------------- ; r7 = Char (0 oder 1), r6 = BaseAdrDigits ;--------------------------------------------------------- CalcDisplayDigits mov a,r6 add a,#02h ; charpoint first digit mov r1,a mov a,r7 rl a ; x2 rl a ; x4 rl a ; x8 add a,#2 ; charpointer low mov r7,a add a,#2 ; color mov r0,a movx a,@r0 mov r5,a mov a,r7 ; Charpointer low mov r0,a movx a,@r0 anl a,#00Fh ; low 8 bits call getDigitPointer mov r6,#0 jnc notCarry1 mov r6,#1 ; set carry-flag notCarry1 movx @r1,a ; write low part inc r1 mov a,r6 ; write high part movx @r1,a inc r1 mov a,r5 movx @r1,a mov a,r1 ; go to next digit (+7) add a,#6 mov r1,a movx a,@r0 swap a anl a,#00Fh ; high 8 bits call getDigitPointer mov r6,#0 jnc notCarry2 mov r6,#1 ; set carry-flag notCarry2 movx @r1,a ; write low part inc r1 mov a,r6 ; write high part movx @r1,a inc r1 mov a,r5 movx @r1,a mov a,r1 ; go to next digit (+7) add a,#6 mov r1,a inc r0 ; and now get the high-bit movx a,@r0 jz notOne ; its "0" -> already in a mov a,#08h ; its "1" NotOne movx @r1,a inc r1 inc r1 mov a,r5 movx @r1,a retr getDigitPointer add a,#DigitTable & 0ffh movp a,@a rlc a ; x2 rlc a ; x4 rlc a ; x8 ret DigitTable db 0,1,2,3,4,5,6,7,8,9,32,37,35,26,18,27 ; <0-9,A-F> ;================================================================================================================ ;= = ;= Page 3: Init Data = ;= = ;================================================================================================================ align 256 ;--------------------------------------------------------- ; GRID init ;--------------------------------------------------------- gridInit mov r1,#GridInitData & 0ffh mov r7,#9 mov r0,#0c0h loopGridHoriz mov a,r1 movp a,@a movx @r0,a inc r0 inc r1 djnz r7,loopGridHoriz mov r7,#10 mov r0,#0E0h loopGridVert mov a,r1 movp a,@a movx @r0,a inc r0 inc r1 djnz r7,loopGridVert retr GridInitData db 00100001b,00100001b,00100001b,00100001b,00100001b,00000101b,00000101b,0,0 ; horizontal lines db 00011111b,0,0,0,0,00011111b,0,00000011b,0,0 ; verical lines ;--------------------------------------------------------- ; EXTRAM init ;--------------------------------------------------------- ;here's what we do in extram: ;each character: ´ ;char 1 00 01 02 03 04 ;char 2 08 09 0A 0B 0C ;from here digits 10 11 12 13 14 ;--------------------------------------------------------- extramInit orl p1,#00001100b ; extram on anl p1,#10101111b mov r0,#000h mov r1,#InitRamData & 0ffh mov r2,#64 loopCopy mov a,r1 movp a,@a movx @r0,a inc r0 inc r1 djnz r2,loopCopy retr InitRamData db 70,45,00h,00h,004h,00h,00h,00h ; char 1 00h db 86,45,00h,00h,007h,00h,00h,00h ; char 2 08h db 34,110,00h,00h,004h,00h,00h,00h ; char 1 digit 3 10h db 34,102,00h,00h,004h,00h,00h,00h ; char 1 digit 2 18h db 34,94,00h,00h,004h,00h,00h,00h ; char 1 digit 1 20h db 50,110,00h,00h,007h,00h,00h,00h ; char 2 digit 3 28h db 50,102,00h,00h,007h,00h,00h,00h ; char 2 digit 2 30h db 50,94,00h,00h,007h,00h,00h,00h ; char 2 digit 1 38h ;================================================================================================================ ;= = ;= Page 4: Text on Screen = ;= = ;================================================================================================================ align 256 ;------------------------------------------------------------------------------------------- ; Scrolltext: Y-Position in Scrolloffset in Scrollpointer in Register in ;------------------------------------------------------------------------------------------- Scrolltext mov a,r2 sel rb0 mov r1,a sel rb1 mov a,r0 sel rb0 mov r2,a sel rb1 loopScrollText mov a,r1 ; Ypos movx @r0,a inc r0 rr a ; calculation for Charpointer: Y / 2 -> rotate right and anl a,#01111111b ; clear highest bit cpl a ; complement and add 1 inc a ; to get a negative number mov r5,a ; R2 = -Y/2 mov a,r2 ; Xpos movx @r0,a add a,#16 mov r2,a inc r0 mov a,r4 movp a,@a rlc a ; x2 rlc a ; x4 rlc a ; x8 mov r6,#1 jnc CarryMultScroll mov r6,#0 CarryMultScroll add a,r5 ; A-Y/2 movx @r0,a ; Charpointer Pos jnc notCarryScroll mov a,r6 xrl a,#1 mov r6,a notCarryScroll: inc r4 inc r0 mov a,r3 ; Color + Charpointer rl a orl a,r6 movx @r0,a inc r0 djnz r7,loopScrollText ; fill X-Registers sel rb0 mov a,r2 inc a sel rb1 mov r0,a sel rb0 mov a,r1 sel rb1 mov r6,#2 quadsScroll mov r7,#4 charsInQuadScroll movx @r0,a inc r0 inc r0 inc r0 inc r0 djnz r7,charsInQuadScroll add a,#64 djnz r6,quadsScroll ret Logo1 db 25,15,19,22,20,18,12,12 ; "SPRITE " Logo2 db 37,21,22,14,26,18,19,12 ; "BUILDER " ;----------------------------------------------------------------------- ; my interrupt routine -> set f1 ;----------------------------------------------------------------------- intr clr f1 ; we set only the f1-flag cpl f1 retr db "Manopac 2006" end