ORG &0000 DUMP 1,0 DI IN A,(lmpr) LD (lmpr.store+&8001),A LD (sp.store+&8001),SP LD A,33 OUT (lmpr),A JP initcode ;Copyright Message ;----------------- DEFM "" ec: EQU $ ORG &38 DUMP 1,&38 PUSH AF IN A,(stat) RRA JP NC,line.int BIT 2,A JP Z,frame.int POP AF EI RET ORG &66 DUMP 1,&66 RETN frame.int: POP AF EI RET logo: MDAT "entrpy.lgo" palette: DEFB 0,5,119,120,112,15,7,8,127 next: EQU $+255/256*256 ORG next DUMP 1,next sine: MDAT "sine.dat" ;Font expansion table (mode 3) font.exp: DEFB %00000000,%00000011,%00001100,%00001111 DEFB %00110000,%00110011,%00111100,%00111111 DEFB %11000000,%11000011,%11001100,%11001111 DEFB %11110000,%11110011,%11111100,%11111111 ;Initialisation routines initcode: LD A,soff ;turn screen off OUT (border),A XOR A ;reset interrupt modes/vector LD I,A IM 1 LD A,28 ;turn sound chip off LD BC,511 soff.l: OUT (C),A DEC B OUT (C),B DEC A CP 255 JR NZ,soff.l LD A,30 ;determine whether it's 512 or 256k OUT (hmpr),A LD A,14 EX AF,AF' LD B,255 looper: LD (HL),B LD A,(HL) CP B JR NZ,offset DJNZ looper EX AF,AF' LD A,30 EX AF,AF' offset: EX AF,AF' OUT (hmpr),A OR 96 OUT (vmpr),A LD BC,&10F8 LD HL,palette+&08 OTDR LD SP,&0000 CALL clear.32k LD HL,logo LD DE,logopos LD BC,35*128 LDIR XOR A LD (keyflag),A LD A,coff LD (coffinit),A LD A,bar.speed LD (bspdinit),A reset.bars: LD HL,vis.table ;clear visible table LD DE,vis.table+1 LD BC,255 LD (HL),L LDIR LD A,(coffinit) LD B,A LD A,(red.offs) LD (red.offs),A ADD A,B LD (grn.offs),A ADD A,B LD (blu.offs),A LD A,38 OUT (stat),A EI keycheck: LD A,&7F ;check for space bar IN A,(&FE) RRA JP NC,exit.bars LD BC,&EFF9 ;both + and - pressed = error IN A,(C) BIT 7,A JP Z,default.key AND %01100000 JR Z,keycheck CP %01100000 JR NZ,nokplusmin ;jump if either + or - pressd check.spc: ;check for space altering kys LD BC,&DFF9 IN A,(C) AND %01100000 JR Z,keycheck CP %01100000 JR NZ,nokspc XOR A LD (keyflag),A JR keycheck nokspc: BIT 6,A JR Z,quote.key LD A,(keyflag) ;not released - ignore OR A JR NZ,keycheck LD A,delay.key LD (keyflag),A LD A,(coffinit) ADD A,-2 res.bar2: LD (coffinit),A HALT DI JP reset.bars quote.key: LD A,(keyflag) ;not released - ignore OR A JR NZ,keycheck LD A,delay.key LD (keyflag),A LD A,(coffinit) ADD A,2 JP res.bar2 nokplusmin: BIT 6,A JR Z,pluskey ;minus was pressed LD A,(keyflag) ;not released - ignore OR A JR NZ,keycheck LD A,delay.key LD (keyflag),A LD A,(bspdinit) CP bar.speed.min JR Z,keycheck DEC A res.bars: LD (bspdinit),A HALT DI JP reset.bars pluskey: LD A,(keyflag) OR A JP NZ,keycheck LD A,delay.key LD (keyflag),A LD A,(bspdinit) CP bar.speed.max JP Z,keycheck INC A JP res.bars default.key: LD A,coff LD (coffinit),A LD A,bar.speed LD (bspdinit),A XOR A LD (keyflag),A HALT DI JP reset.bars exit.bars: HALT ;update lines, which will turn screen ;off DI CALL clear.32k ;clear screen page IN A,(vmpr) AND 31 OR 64 ;mode 3 OUT (vmpr),A LD HL,mode3.pal+3 ;set mode 3 palette LD BC,&04F8 OTDR XOR A OUT (border),A LD IX,menu.text CALL show.text keyer.loop: LD A,&7F IN A,(&FE) RRA RRA JP NC,load.prodos CALL wait.key CP "B" JP Z,jump.to.basic CP "D" JP Z,load.prodos JR keyer.loop load.prodos: LD A,1 OUT (hmpr),A JP lmpr.store+&8000 lmpr.store: LD A,&00 OUT (&FA),A sp.store: LD SP,&0000 EI RET LD A,prodos.page OUT (mromh),A LD A,64 ;page in upper ROM OUT (lmpr),A LD A,2 OUT (hmpr),A LD HL,&C000 ;copy PRODOS into memory LD DE,&8000 LD BC,&4000 LDIR XOR A OUT (lmpr),A LD A,1 OUT (hmpr),A JP &C069 ;jump to PRODOS init routine jump.to.basic: LD A,basic.page+1 OUT (mromh),A LD HL,basic.rout LD DE,&4000 LD BC,basic.rlen LDIR JP &4000 basic.rout: LD A,basic.page OUT (mroml),A RST 0 basic.rlen: EQU $-basic.rout clear.32k: LD HL,&8000 LD DE,&8001 LD BC,&7EFF LD (HL),L LDIR RET wait.key: LD A,&7F IN A,(&FE) BIT 4,A JP Z,basicpress LD A,&FD IN A,(&FE) BIT 2,A JP Z,dospress XOR A RET basicpress: LD A,"B" RET dospress: LD A,"D" RET line.int: PUSH BC PUSH DE PUSH HL PUSH IX EXX PUSH BC PUSH DE PUSH HL LD B,0 LD A,(red.offs) LD L,A LD H,sine/256 LD A,(HL) LD L,32 ADD A,L ADD A,A LD L,A LD H,vis.table/256 CALL blank6 LD A,(blu.offs) LD L,A LD H,sine/256 LD A,(HL) LD L,32 ADD A,L ADD A,A LD L,A LD H,vis.table/256 CALL blank6 LD A,(grn.offs) LD L,A LD H,sine/256 LD A,(HL) LD L,32 ADD A,L ADD A,A LD L,A LD H,vis.table/256 CALL blank6 LD A,(red.offs) LD B,A LD A,(bspdinit) ADD A,B LD (red.offs),A LD L,A LD H,sine/256 LD C,(HL) LD A,64 ADD A,L LD L,A LD B,(HL) LD A,C LD L,32 ADD A,L ADD A,A LD L,A LD H,vis.table/256 LD DE,red.palette LD A,B ADD A,128 LD C,A CALL update6 LD A,(blu.offs) LD B,A LD A,(bspdinit) ADD A,B LD (blu.offs),A LD L,A LD H,sine/256 LD C,(HL) LD A,64 ADD A,L LD L,A LD B,(HL) LD A,C LD L,32 ADD A,L ADD A,A LD L,A LD H,vis.table/256 LD DE,blu.palette LD A,B ADD A,128 LD C,A CALL update6 LD A,(grn.offs) LD B,A LD A,(bspdinit) ADD A,B LD (grn.offs),A LD L,A LD H,sine/256 LD C,(HL) LD A,64 ADD A,L LD L,A LD B,(HL) LD A,C LD L,32 ADD A,L ADD A,A LD L,A LD H,vis.table/256 LD DE,grn.palette LD A,B ADD A,128 LD C,A CALL update6 IN A,(vmpr) AND 31 LD D,A XOR A ;turn screen on OUT (border),A LD HL,vis.table LD BC,&01F8 LD E,first.line chk.loop: IN A,(C) CP E JR NZ,chk.loop LD A,(HL) INC L OUTI CP 128 JR NC,nb LD A,D OR 96 OUT (vmpr),A JR col nb: LD A,D OR 0 OUT (vmpr),A col: INC B INC E LD A,E CP last.line JR NZ,chk.loop LD A,128 ;turn screen back off OUT (border),A exiter: LD A,(keyflag) OR A JR Z,exitt2 DEC A LD (keyflag),A exitt2: POP HL POP DE POP BC EXX POP IX POP HL POP DE POP BC POP AF EI RET blank6: LD B,line.depth*2 blank.l: LD (HL),&00 INC L DJNZ blank.l RET update6: LD B,line.depth updatel: LD A,(HL) CP C JR NC,behind1 LD (HL),C INC L LD A,(DE) LD (HL),A INC L INC DE updatel2: DJNZ updatel RET behind1: INC L INC L INC DE JR updatel2 RET grn.palette: DEFB 4,64,68,68+8,68+1+2+8,68+8,68,64,4 blu.palette: DEFB 17,17+8,17+6,17+8+6,17+64+32,17+8+6,17+6 DEFB 17+8,17 red.palette: DEFB 2,32,34,34+8,34+1+4,34+8,34,32,2 text.buffer: EQU &E000 style.buffer: EQU &E100 style: EQU &E040 format: EQU &E041 yline: EQU &E042 xoffset: EQU &E043 print.addr: EQU &E044 font.buffer: EQU &E046 expand.buffer: EQU &E046+8 under.col: EQU %01010101 home: EQU 10 cls: EQU 11 left: EQU 1 center: EQU 2 right: EQU 3 justify: EQU 4 normal: EQU 5 tab: EQU 6 underline: EQU 7 italic: EQU 8 bold: EQU 9 endtext: EQU 0 newline: EQU 13 action.table: DEFW endtext.r,left.r,center.r,right.r,justify.r DEFW normal.r,tab.r,underline.r,italic.r,bold.r DEFW home.r,cls.r,retext,newline.r,retext,retext DEFW retext,retext,retext,retext,retext,retext DEFW retext,retext,retext,retext,retext DEFW retext,retext,retext,retext,retext ;End of text - should never be called endtext.r: ;Prints current line on screen ;----------------------------- newline.r: ;Operate on the text string (formatting) XOR A LD (xoffset),A LD A,(format) OR A JP Z,print.left ;if it's left justified, ;ignore it CP 2 JP Z,righted JP NC,justified ;Center the text ;--------------- CALL check.lhs ;collate white space on left CALL check.rhs ;and right LD A,C CP 64 JP Z,print.left ;all spaces - print and exit LD L,C ADD A,B ;add lhs white space to rhs LD C,A LD A,64 SUB C ;get amount of text data LD H,text.buffer/256 LD B,A LD C,A LD A,64 SUB C ;get x offset LD (xoffset),A JP print.text righted: CALL check.rhs LD A,B OR A JP Z,print.left ;if no space on rhs, print ;left hand side... LD A,B ADD A,A LD (xoffset),A LD A,64 ;number of chars SUB B LD B,A LD HL,text.buffer JP print.text justified: print.left: LD B,64 LD HL,text.buffer ;Actually do the printing print.text: EX DE,HL LD A,(yline) ADD A,A ADD A,A ADD A,A ;*8 LD H,A LD L,0 SCF RR H RR L ;give base address in HL LD A,(xoffset) OR L LD L,A ;get start address LD (print.addr),HL EX DE,HL ploop: LD E,(HL) INC H LD D,(HL) DEC H INC L CALL print.char DJNZ ploop LD A,(yline) INC A CP 24 JR NZ,not.over.bots XOR A not.over.bots: LD (yline),A JP text.print2 print.char: ;d = style, (print.addr) = screen address ;e = text PUSH BC PUSH HL LD L,E LD H,0 ADD HL,HL ;font address * 8 ADD HL,HL ADD HL,HL PUSH DE LD DE,pcfont-256 ;offset to actual address ADD HL,DE LD DE,font.buffer LD BC,8 LDIR ;copy font for alterations POP DE LD HL,font.buffer BIT 1,D JR Z,not.ita SRL (HL) INC HL SRL (HL) INC HL INC HL INC HL INC HL SLA (HL) INC HL SLA (HL) INC HL SLA (HL) LD HL,font.buffer not.ita: BIT 2,D JR Z,not.bold LD B,8 boldise: LD A,(HL) SRL A OR (HL) LD (HL),A INC HL DJNZ boldise not.bold: LD B,8 LD IY,expand.buffer LD HL,font.buffer PUSH DE LD D,font.exp/256 expand.font: LD A,(HL) RRCA RRCA RRCA RRCA AND %00001111 LD E,A LD A,(DE) LD (IY),A INC IY LD A,(HL) AND %00001111 LD E,A LD A,(DE) LD (IY),A INC IY INC HL DJNZ expand.font POP DE BIT 0,D JR Z,not.und LD A,(expand.buffer+14) OR under.col LD (expand.buffer+14),A LD A,(expand.buffer+15) OR under.col LD (expand.buffer+15),A not.und: LD HL,(print.addr) LD DE,expand.buffer LD B,8 prline: LD A,(DE) LD (HL),A INC L INC DE LD A,(DE) LD (HL),A INC DE PUSH DE LD DE,127 ADD HL,DE POP DE DJNZ prline LD HL,(print.addr) INC L INC L LD (print.addr),HL POP HL POP BC RET ;Whitespace counters - left and rhs start points check.lhs: LD HL,text.buffer LD C,0 ccheck.lh: LD A,(HL) CP " " RET NZ INC C INC L LD A,L CP 64 RET Z JR ccheck.lh check.rhs: LD HL,text.buffer+63 LD B,0 ccheck.rh: LD A,(HL) CP " " RET NZ INC B DEC L LD A,L CP 255 RET Z JR ccheck.rh ;home ;---- home.r: ;set to top of screen, ditch XOR A ;currently built line LD (yline),A JP text.print2 ;cls ;--- cls.r: LD HL,&8000 ;clear screen then HOME LD DE,&8001 LD (HL),L LD BC,&5FFF LDIR JP home.r ;tab ;--- tab.r: LD A,C ;move to next tab position ADD A,8 AND %00111000 LD C,A JP retext ;left justified text format ;-------------------------- left.r: XOR A set.format: LD (format),A JP retext ;centered text format ;-------------------- center.r: LD A,1 JR set.format ;right justified text format ;--------------------------- right.r: LD A,2 JR set.format ;fully justified text format ;--------------------------- justify.r: LD A,3 JR set.format ;Italics ;------- italic.r: LD A,(style) XOR 2 set.style: LD (style),A JP retext ;Underline ;--------- underline.r: LD A,(style) XOR 1 JR set.style ;Normal ;------ normal.r: XOR A JR set.style ;Bold ;---- bold.r: LD A,(style) XOR 4 JR set.style show.text: XOR A LD (style),A LD (format),A LD (yline),A text.print2: LD HL,text.buffer ;clear buffers at &e000 LD DE,text.buffer+1 LD BC,63 LD (HL)," " LDIR LD HL,text.buffer+256 LD DE,text.buffer+257 LD (HL),L LD BC,63 LDIR LD BC,text.buffer ;text.in position retext: LD A,(IX) INC IX OR A ;end text is zero RET Z CP 32 JR NC,normal.text ADD A,A LD HL,action.table LD E,A LD D,0 ADD HL,DE LD E,(HL) INC HL LD D,(HL) EX DE,HL JP (HL) normal.text: LD (BC),A ;put text in buffer LD A,(style) INC B LD (BC),A ;set style on text DEC B INC C LD A,C AND %00111111 ;make sure it doesn't overflow LD C,A JP retext menu.text: DEFB home,normal,underline,center DEFB newline,newline,newline,newline,newline DEFM "MultiROM Temporary Menu (c) 1994 Simon Coo" DEFM "ke" DEFB newline DEFB newline DEFB left,normal,tab DEFM "Press:" DEFB newline,newline,tab,bold DEFM "(B) " DEFB bold DEFM "for SAM Basic" DEFB newline,newline,tab,bold DEFM "(D) " DEFB bold DEFM "for ProDOS" DEFB newline,newline DEFB italic,center,underline DEFM "MultiROM" DEFB italic DEFM " Alpha test ROM v1.3" DEFB newline,italic,underline DEFB 13,13,13,13,13,13,13,13,13,right DEFM "17:02 9th August 1994" DEFB 13,0 mode3.pal: DEFB 0,17,34,127 pcfont: MDAT "IBM.FNT" ORG 0 DUMP 2,0 MDAT "prodos"