Mercurial > hg > Members > kono > nitros9-code
changeset 1887:6219c81fa4d5
GO80 loader program for DragonPlus add-on
author | afra |
---|---|
date | Wed, 12 Oct 2005 01:07:02 +0000 |
parents | b151cc54904e |
children | 285488b501a0 |
files | 3rdparty/drivers/compusense/Go80.asm |
diffstat | 1 files changed, 1 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/3rdparty/drivers/compusense/Go80.asm Wed Oct 12 01:07:02 2005 +0000 @@ -0,0 +1,1 @@ +******************************************************************* * Go80 - DragonPlus 6845 based 80x25 (driver) * * Edt/Rev YYYY/MM/DD Modified by * Comment * ------------------------------------------------------------------ * - 1985/??/?? * Original Compusense distribution version * * 2005-09-01, P.Harvey-Smith. * Disassembled and cleaned up. * * 2005-09-05, P.Harvey-Smith. * This is not a driver !, all this appears to do is patch the * already loaded kbvidio module to talk to the 6845 on the plus board. * These patches are stored in a set of S-records at the end of this file. nam GO80 ttl program module * Disassembled 2005/05/31 16:28:10 by Disasm v1.5 (C) 1988 by RML ifp1 use /dd/defs/defsfile use dplusdef endc tylg set Prgrm+Objct atrv set ReEnt+rev rev set $01 mod eom,name,tylg,atrv,start,size u0000 rmb 1 KbVidioAddress rmb 1 * Address of loaded KBVidio Module u0002 rmb 1 u0003 rmb 1 SRecCount rmb 1 * S record count, decremented as each byte fetched. AddrHi rmb 1 * Hi and low bytes of the address to patch (offset from kbvideo start addr) AddrLo rmb 1 SRecHeadBuff rmb 1 * Buffer for 'S' of s record SRecTypeBuff rmb 1 * Type buffer used to determine record type ('1' or '9') SRecCountBuff rmb 2 * Byte count buffer, number of bytes to fetch (in ascii) AddrHiBuff rmb 2 * Buffers for high and low parts of address as ascii hex AddrLoBuff rmb 2 DataBuff rmb 90 * Buffer for data part of S record line CopyBuffSrcAddr rmb 2 * Address of buffer when copying bytes BinBuffPtr rmb 34 * Pointer to binary data buffer BinBuff rmb 2298 * Buffer to hold binary equivelent of S records size equ . name equ * fcs /GO80/ SignonMess fcc 'GO80 (C) COPYRIGHT COMPUSENSE LIMITED 1985' fcb $0D SignonMessLen equ *-SignonMess SwitchMess fcc 'please switch to DRAGONPLUS (TM) video now' fcb $0D SwitchMessLen equ *-SwitchMess start equ * lbsr PrintNewLine leax >SignonMess,pcr * Display signon message ldy #SignonMessLen lda #$01 os9 I$WritLn lbcs ErrorTerminate * Error, exit imediatly lbsr PrintNewLine lbsr GetKbVidioAddr * Get address of (already loaded kbdvidio). lda #$01 leax >SRecordData,pcr * Point to S-Record data in memory stx <CopyBuffSrcAddr,u * Save in src addr sta u0003,u leax >BinBuff,u stx <BinBuffPtr,u FindSrecordHead leax SRecHeadBuff,u * destination address, header buff byte ldy #$0001 * Process 1 byte lda u0003,u * Humm why do this, a is overwritten in CopyBytes ??? lbsr CopyBytes lbcs ErrorTerminate ldb SRecHeadBuff,u * Get copied byte cmpb #'S' * is this begining of record ? bne FindSrecordHead * no : do next * if we reach this point we have found the beginning of an S record leax SRecTypeBuff,u * Point to buffer for record type ldy #$0001 * process 1 byte lda u0003,u lbsr CopyBytes * get it lbcs ErrorTerminate * error : exit ldb SRecTypeBuff,u * Check record type cmpb #'1' * Type 1 record ? lbne SwitchOver * If not type 1 record we have done all leax SRecCountBuff,u * Point to count buffer ldy #$0002 * Fetch 2 bytes lda u0003,u lbsr CopyBytes * Fetch count lbcs ErrorTerminate ldd SRecCountBuff,u * Get Hex byte count lbsr HexDtobinB * Convert to binary tfr d,y * Set as new byte count stb SRecCount,u * Save in count buffer leay d,y * Set count of bytes to fetch leax AddrHiBuff,u lda u0003,u lbsr CopyBytes * Fetch rest of srecord lbcs ErrorTerminate ldd AddrHiBuff,u * Get high part of address and convert to binary lbsr HexDtobinB stb AddrHi,u ldd AddrLoBuff,u * Get low part of address and convert to binary lbsr HexDtobinB stb AddrLo,u * Format the above read ASCII data, as binary ldx <BinBuffPtr,u * get pointer to binary buffer ldb SRecCount,u * Get byte count decb * skip over address decb decb * and ignore checksum byte stb SRecCount,u * update count stb ,x+ * save count in buffer ldd AddrHi,u * get address offset addd KbVidioAddress,u * add base of kbdvidio std AddrHi,u * save it back std ,x++ * save in binary buffer stx <BinBuffPtr,u * save buffer pointer ldx <BinBuffPtr,u leay DataBuff,u * Point to loaded ascii hex s-record data L010E ldd ,y++ * Get a byte's worth of hex digits lbsr HexDtobinB * convert them to binary stb ,x+ * save in binary buffer stx <BinBuffPtr,u * update pointer clr ,x * make sure binary copy always zero terminated pshs x * increment Addr pointer ldx AddrHi,u ldb ,x+ stx AddrHi,u puls x dec SRecCount,u * Decrement record data counter bne L010E * more data : continue lbra FindSrecordHead * Else find next s record header SwitchOver leax >SwitchMess,pcr * Instruct user to switch to Plus video ldy #SwitchMessLen lda #$01 os9 I$WritLn * This does the actual patching of kbvidio, from the binary copy of the s-record. leax >BinBuff,u * point to binary buffer pshs cc * save status orcc #$50 * disable inturrupts while we patch RecordPatchLoop ldb ,x+ * get byte count beq PatchDone * if zero, we have finished patching ldy ,x++ * get address to start patching BytePatchLoop lda ,x+ * copy a byte from patch buffer sta ,y+ * to kbvidio decb * decrement count bne BytePatchLoop * all done ? bra RecordPatchLoop PatchDone puls cc lbsr PrintNewLine clrb ErrorTerminate os9 F$Exit * Convert hex digits in A:B into binary equivelent in B HexDtobinB bsr HexBtobinA * Convert Most significant nibble lsla * Mul by 16, to move into top 4 bits lsla lsla lsla pshs a * Save MSN bsr HexBtobinB * Convert Least significant nibble clra * Zero a addb ,s+ * Recombine, to make binary in B rts * Convert Hex digit in B to it's binary equivelent, and return in A HexBtobinA exg a,b * bsr HexBtobinB exg a,b rts * Convert Hex digit in B to it's binary equivelent, and return in B HexBtobinB cmpb #$39 bhi L0175 andb #$0F rts L0175 andb #$07 addb #$09 rts PrintNewLine pshs y,x,b,a * save regs ldy #$0001 * Write 1 byte leax ,u * Begining of data area (buffer) ldb #$0D * Carrage Return stb ,x * save b in buffer bsr PrintChars * Output byte puls pc,y,x,b,a * Restore and return * Output a character(s) pointed to by X, count in Y PrintChars lda #$01 * output channel os9 I$WritLn * Write string lbcs ErrorTerminate * Error: exit program rts * Copy Y bytes from addr in CopyBuffSrcAddr to X, if a zero byte is reached, return error CopyBytes pshs u,y,x * Save regs ldu <CopyBuffSrcAddr,u * Get address of data to copy CopyBytesLoop lda ,u+ * Get a byte from source sta ,x+ * store in dest beq L01AC * Zero byte: yes set error leay -$01,y * decrement character count bne CopyBytesLoop * do next tfr u,d * Save end address puls u,y,x * restore regs std <CopyBuffSrcAddr,u * update CopyBuffSrcAddr, with new next free clrb * Flag no error rts * Return L01AC ldb #$D3 * Return EOF error puls pc,u,y,x * restore and return lda #$01 os9 I$Write bcs ErrorTerminate rts L01B8 pshs y,x,b,a leax ,u ldy #$0001 sta ,x lda #$01 os9 I$Write bcs ErrorTerminate puls pc,y,x,b,a lda #$20 L01CD bsr L01B8 decb bne L01CD rts L01D3 exg a,b bsr L01DC exg a,b rts bsr L01D3 L01DC pshs y,x,b,a lsrb lsrb lsrb lsrb leax >L01F4,pcr lda b,x bsr L01B8 ldb $01,s andb #$0F lda b,x bsr L01B8 puls pc,y,x,b,a L01F4 fcc '0123456789ABCDEF' * Hex table KBVidioModName fcc 'KBVDI' fcb 'O'+$80 * GetKbVidioAddr, links to kbdvidio module to determine it's address * and then unlinks it. GetKbVidioAddr pshs u,y,x,b,a * Save regs leax >KBVidioModName,pcr * point to module name bsr DoLink * Link it lbcs ErrorTerminate * Error: end program stx KbVidioAddress,u * Save module address bsr DoUnLink * unlink it puls pc,u,y,x,b,a * restore and return fcc 'GO80 COPYRIGHT (C) COMPUSENSE LIMITED 1985' fcb $0d * DoLink, Links in module pointed to by X, header addr returned in X DoLink pshs u lda #$E1 * Module type Pysical device ($E0) + 6809 code ($01) os9 F$Link * Attempt to link the module tfr u,x * Return module header address in X puls pc,u * Restore and return * DoUnLink, unlink module who's header pointed to by X DoUnLink pshs u * save regs tfr x,u * Get address into U os9 F$UnLink * unlink it puls pc,u * Restore and return * The rest of this module is the data below, this is a Motorola S record file !!! * This is converted to binary and used to patch kbvidio, WHY Copusense did this I (currently) * have no idea. SRecordData fcc 'S123002739003442EEC8222706CC1800103F29EE616FC8226FC8236FC81F6FC8396FC8386E' fcc 'S12300476C8CDE1707731707538D0235C24F308D0012E680FDFFE04C811026F68E0000AFA1' fcc 'S11700678D06043971505D37191E1819A20A600A00000000DE' fcc 'S123011D6D8DFF07260317FF03E6C81F2636811B26056CC81F5F3981202506817F2402208F' fcc 'S123013D31308D06A16D8426066FC81F16059FA180260DEC84308D068D308BAFC8206E8484' fcc 'S123015D300220E16CC81F308D068EC10127D66ED8206CC83217051BA6C8244C81502515FC' fcc 'S123017D6FC824A6C8254C811825051705952008A7C8252003A7C8246FC833ECC824EDC847' fcc 'S123019D3017054A6AC8325F398EFF20C664A68488C0A78486194A121226FB5A26F016FF85' fcc 'S12301BD886AC8242A10864FA7C8246AC8252A066FC82517055F1700CA16FF6DA6C8254CFE' fcc 'S10701DD8118250557' fcc 'S12301E117053C2003A7C82520E86FC82420E36CC8321705CA4F5F6FC833EDC8306AC832D8' fcc 'S123020116FF426CC8328D066AC83216FF376FC83316052F6CC8323411170453AC8D044D82' fcc 'S12302212605351116FFCB8620C6011A50F7FFE28C080025038E0000AC8D04312704A780AF' fcc 'S123024120EE7FFFE235116AC83216FEF86FC8246FC82516FF7CE6C81FC00226025F395A84' fcc 'S1230261260B81502502864FA7C8245F39811825028617A7C82516FF596CC824A6C8248186' fcc 'S12302815025F36FC82416FF4F86FFA7C83816FEB44F20F786FFA7C83916FEA94F20F7EC9C' fcc 'S10702A1C8246CC835' fcc 'S12302A5326DC8332605EDC83020203406ECC8306CC8345D2B07C1182403EDC8243506ED35' fcc 'S11302C5C824EDC8306FC8336AC8346AC8325F3988' fcc 'S1080502121212121296' fcc 'S123066E000034068D0684071F013586A6C825E6C8243404C6503D1F01E6E03A1F10E38C87' fcc 'S123068EDF39341FE6C839EAC83827028A808DD21A50C601F7FFE2A7847FFFE2359F3405D9' fcc 'S12306AE8D08A68430018D16358534161A5086018EFFE2C601E58426FCB7FFE23596341632' fcc 'S12306CE4F20ED34278DE3108EFFE2C601E5A427FCE5A426FCA78430018DE335A73416173B' fcc 'S12306EEFF8A843F1F01860EB7FFE01F10B7FFE1860FB7FFE0F7FFE135968407ED8DFF605B' fcc 'S123070E860CE68DFF5AFDFFE04CE68DFF53FDFFE03934775F8D44EC8DFF45C300508DDA55' fcc 'S107072EC61720398D' fcc 'S12307323477C6178D31EC8DFF328300508DC75F2027347717FF27C650E0C8241A5086012B' fcc 'S1230752B7FFE286208C080025038E0000A7805A26F37FFFE235F734774F1E8917FF0F848B' fcc 'S1230772071F01C65020D5474F38302028632920434F5059524947485420434F4D5055538F' fcc 'S1230792454E5345204C494D49544544203139383534218E0013318CCE1A508601B7FFE2EF' fcc 'S12307B2C62AA6A0A7805A26F97FFFE235A18E0000862034011A50C601F7FFE2A7808C08EA' fcc 'S12307D20025F97FFFE23501CC0000EDC82416FF2507F9C308F9DB0AF9F60DFA080CFA0DB6' fcc 'S10707F20BFA6B008F' fcc 'S12207F641FA7442FA2143FA9744F9E545F9F646FAA747FAAF48FAB249FABA4AFA32006C' fcc 'S9' fcb 0,$FB,$57,$48 emod eom equ * end \ No newline at end of file