IMD 1.18: 19/12/2012 16:32:34  Jade DD Double density format 20?8ڲ! `7O.!`m :g     Disk Descriptor 0?8004`m :g     ÀpC1pV !>1pv@B  *z ͑r͑á ABI2Ee:p_!^#V!"KU:sw͑2r<2s͑r^!w6( (@@::qݾ(1X::q2!"=e2we(. : P- :.e -(PP>w>! #:w:w:w>w>w>we K^:rݖ ~8 8 o:  DEo:P- P:r8 (848+0::DN: 73V: &"V: V: Pw:rwß>>>Щɯ2:s!*>ۀw#2w(ɯ2:s!*>ۀ~#2w(!>2w"z ':v @:<2  ͑ (ϯ<ɀJade DD $!Î1pV !>>2s@!rH!"@ D@@  $Çêâòõúÿ}Ú>>C1>2>2!*" JADE COMPUTER PRODUCTS 62K CP/M M5b VERS 2.2.7 >1>2sͿͺ} :u-(<2u*~"~!v>!2"!2"!"~*"!">8(>2:O>C> 3*~*@ >C*@*~> >C>C>>C>C*@*~>C>(2rp*@!r>CC >C:y!y2s{2:so&))))?:µ">C>(!û*@7 )#ͪ͢*@ *@~̘*õͪ͘!*õ*s#rɯ*w#w* ^#Vúy2ty2u`i"~z( n&! y)8(8 (8n(5(L!$ogCAJ&͎&͎G&͎O:IoCAC&͎͎G&͎Ö́G̈́(  ̈́> yy yOGy( ͪ( >ͼ(y /> y˿>~OͲ#     ? LOAD ERROR ILL. SYS. CALL Jade DD 6ET#c30 !%)- "*. #'+/  $(,0&Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!1͘A͌>>͌92^ :¥.!_~#fow]!v"!çREAD ERRORçNO FILE^: w4!Y~ʆ͌†t=ʆf ^ T 2o&)|+!<ͧADCOMf^: ! Â$$$ SUBҐ^H@Oy H H: –ͬ  #H: !  Hù H H $O͐: 2 *CN# O*!O*|!6ʝ6>*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+**{#zr+s{ozg**͕** ,w͜͸Ͳ!!N#F$**O!~#T D^6k-äPYy 5*{zBK52>2ͻ:!Z2:Eẅ́͊Ͳ>i6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{:ʑw:2E**E}DQ>2\X COPYRIGHT (C) 1979, DIGITAL RESEARCH #͘*~ "޷"͌#>?͌͘ =_.:;<> Oޅo$>!Y2*O"ʉ@ ! ~ 3#0 Wx x ހ ނ G ~ # 3x~#B!Y~ɯ2:=!ý:=!:ý^T!ÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Ypsp2mÆÆf ͧ"C{2!"E9"1A22!ty)K!G_^#V*C~E ,x: 2 p&x~+é72 H! >w_: ! 5ͤNkͱ¦ͱxʊ#Nyx#*DM*s#r*s#ryOxG*0MD!!N: EG>O: \S*C :qn& ^#V>O^"**#"͕: 2Þy<_WyOxOxG* ~V5dw^ :ʈ *C ^OT *C~wD -'  -@ͦ~^*C Ox! N!Fwys+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!Bw!>2*C~=2u:B2~2wE:A*Cw>"I|46;@RWF 62k CP/M vers 2.2 1>>~!T]6 b:22!3û1_͌> ͒> Ò> Ò͘~#͌ì _2<ܯ2G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" ~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x FILE EXISTS _: É: :ʉ=2)ͽÉ T!@k!}|q&-AGMS!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6x: ! 2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD#"*}:*)=":O:o"*C *C!ͮ~2~2ͦ:2ͮ:O:w:w |g}o*# NÎ N#Fyʝ*}|\#u*#DM*6# x±**s#r͡*6#6^>:A#~$=2Ek͌xʋ>ڋ>*Cw~#+w#w+ɯ2E22i^ *C :~w~͔͔# # y==»*Ww#*"͸*:G#š"͸:!w4!iw:Z!E~=26!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*@4;,R|*":ڲ!4<2”>2!"2!"28!"9:O  ! ݇!2:2a{_:ʖ:>Ľʖ:=2–!B!6#5ʖ:#~?  xDIR ERA TYPESAVEREN USER!yO#< Ty#O 3߯21y_͸2y2ͽ:ܷ ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ=qf^!~2>`~22\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LO O͐  :E B 2>: b# : y! 4 5~yy5 6y2E>! ^#V w#P:BO|^#V#"##"##"##"! ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:o$*C~i6iw*::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s-|N-#  w ~>2!E5T*C!"C"C!w# F! w͌x2͢*C ~<wʃG:!ʎ2*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄ):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C6:wn&6!y2! ~2`i))))!qy2i`"`i#z n&Y!~w !w ͷ:>ƒyxz2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:E͊:==»0 !%)- "*. #'+/  $(,0&GRH-LABLZ80 P2708 OV P2732 OV PROM COMPROM DOCY>?@ABCPOVERLY Z80$()PROM Z80'89<=DEFSTUVWXY\P27128 OV PROM Z80,]^_`amnstuvPOVERLY Z80 * TITLE GRH ENTERPRISES LABEL PRINTER LIST NOCOND ;************************************************************************* H LF EQU 0AH CR EQU 0DH GS EQU 1DH RS EQU 1EH US EQU 1FH ;************************************************************ BOTTOM LD B,A LP1: ; ; DO LINE PTRS UNTIL A NUL PTR ; LD HL,LINE1 ; LP2: LD E,(HL) ;FETCH PTR FROM ARRAY INC HL LE OPERATION ; LD DE,REQM ;QUERY FOR MORE LD C,9 CALL BDOS ; LD C,1 CALL BDOS AND A,5FH CP A,'Y' LD DE,CONTM  - HL= STRING PTR (BIT 7 = 0: OK, 1: LAST CHAR) ; 0: NUL PTR, ABORT ; EXIT - A = ? ; ;************************************************** ; ; MESSAGES ; ;************************************************************************* SIGNON DB CR,LF,'G####################################### ; ; DATA ; LABROW DB 11 ;NUMBER OF ROWS OF LABELS ; ; PRINTER TEXT PTRS ; 1 DB #TEXT DB #GAP2 DB #TEXT ENDM ; ; TEXT LINES ; L1: DB 0EH,0FH ;DOUBLE WIDE, 17CPI GENLINE ' GRH ENTERPRISEPROMIII DEF/ 27128 MAC!P2716 OV P68764 OV PCREATE SUB68764 MAC"GRH-LABLZ80HI2716 MACb; ; MULTIPLE LABEL PRINTER ; PRINTS SEVERAL LABELS ON ONE SHEET ; ;************************************************************************* ; ; MAIN PROGRAM ; ;**************************************************************************** ORG 0100 LD D,(HL) INC HL ; LD A,E ;CHECK FOR NUL PTR OR A,D JR Z,ROWDONE ;IF NUL PTR THEN DONE ; PUSH HL ;SAVE ARRAY PTR JP Z,RESTART ; ; ELSE QUIT ; JP 0 ;************************************************************************* ; ;************************************* PRINT: ; ; CHECK FOR NUL PTR 1ST ; LD A,L OR A,H RET Z ; ; NOW PRINT TEXT PINIT DW PI ;INITIALIZE PRINTER PTR PSTOP DW PS ;RESTORE PRINTER WHEN DONE PTR LINE1 DW L1,L2,L3,L4,L5,L6,L7 ;LINE PTRS (0S', ' ',' ' DM CR,LF L2: DB 12H,14H ;NORMAL TEXT, 10CPI GENLINE ' 1129 Stonylake Ct ',' ',' 'P2732A OV SDCOPY C ./SDCOPY COM01P8764 OV %2732 MACc2732A MACd2764 MACe2708 MACf**************** ; ; REVISIONS: ; ; 1.0 - 9 FEB 85 GRH ; RELEASE ; ; 1.1 - 31 JAN 88 GRH ; CHANGE ADDRESS, RE-STRUCTH ; ; OUTPUT SIGN ON MESSAGE ; LD DE,SIGNON RESTART: LD C,9 CALL BDOS ; ; WAIT FOR KEY PRESSED ; LD C,1 CAL EX DE,HL PUSH BC ;SAVE COUNT TOO CALL PRINT POP BC POP HL JP LP2 ; ; ; FIRST ROW DONE, IF NOT LAST THEN REPEA NEW LINE TO PRINTER ; ;************************************************************************* PCRLF: LD HL,CRLFM ; ; UNTIL BIT 7 SET ; PRINT1: LD E,(HL) ;GET CHAR PUSH HL ;SAVE PTR FROM BDOS LD C,5 RES 7,E ;CLEAR POSSIBLE END FLAG CNUE',CR,LF DB '$' REQM DB CR,LF,'ANOTHER SHEET? (Y/N) - $' ; ; NEW LINE TEXT ; CRLFM DM CR,LF ;################### TERMINATES) ; ; INITIALIZE PRINTER TEXT (0: NONE) ; PI DM 1BH,58H,01H,12H ;INITIALIZE TO LETTER QUAL,10CPI PS DM 12H,1B DM CR,LF L3: GENLINE ' SUNNYVALE, CA 94089 ',' ',' ' DM CR,LF L4: DM LF L5: GENLINE ' Phone (408) 745-7655 'P2764 OV PTEST Z80T5hijklPSAMPLE MAC6PLABEL COMx#&MNOPQRPTEST OV gPIP CM:opqrGRH-LABLCOMJPLABEL C KLURE MESSAGE AREA. ; VERS EQU '11' ;************************************************************************* BDOS EQU 0005L BDOS ; ; MAIN LOOP FOR PAGE ; LD HL,(PINIT) ;INITIALIZE PRINTER CALL PRINT ; LD A,(LABROW) ;SET # ROWS FROM TOP TOT ; ROWDONE: DJNZ LP1 ; ; PAGE DONE, CLEAN UP ; LD HL,(PSTOP) CALL PRINT ; ; IF USER WANTS MORE THEN REPEAT WHOFALL INTO PRINT ; ;************************************************************************* ; ; PRINT FUNCTION ; ENTRYALL BDOS POP HL BIT 7,(HL) INC HL JP Z,PRINT1 ; RET ;***********************************************************######################################################### ; ; PRINTER UNIQUE TEXT ; ;#####################################H,58H,0 ;RESET TO 10CPI, DRAFT QUAL ; ; MACRO TO GENERATE THE TEXT ; GENLINE MACRO #TEXT,#GAP1,#GAP2 DB #TEXT DB #GAP,' ',' ' DM CR,LF L6: DM LF L7: EQU 0 END RH Enterprises label maker Vers ' DB HIGH VERS,'.',LOW VERS CONTM DB CR,LF,LF DB 'READY PRINTER AND PRESS ANY KEY TO CONTI0 !%)- "*. #'+/  $(,0&)*)) *)) N#Fq#p*)) *)s#r*)#")!)6 J:)!)J!)6 :)<2)*)")҈q:tw͠ͱ! w *) >*) w.*)DM\ -+!\6uͱ:)O! DMͱ*)#")Ù*))))))"):m w>.Yn -:>>!p+q:,!6*DM9:<!6:z 2W!6D*&L :w:<2Ov*:>=Öì*R0!Z",>O(!~y !>2>>>t>>>>>K[   at Is: Should be: Bit(s) not Programmable. Try erasing. Successful Program. OK Bytes requested exceeds prom size! Wm?ݾ*F##yox( < }8}0 6-R*F#"F%&%%% x&65! -%(>"! O1 y8">2?! -OM which uses +12.5 volts as programming ; voltage. ; ; 1.5 - 28 APR 85 GRH ; Revised to allow Assembler invocation of ORGkÁ*R0!/>O(!Sy !r>2>>>t> >>>>'K[ͳ  y ammable. Try erasing. Successful Program. OK Bytes requested exceeds prom size! Wrong configurator installed! Turn off Inhim?ݾ*F##yox( < }8}0 6-R*F#"F%&%%% x&65! -%(>"! O1 y8">2?! - RATE EQU 10 ;RATE FOR PULSE WIDTH (200KHZ,5us) WIDTH EQU 10000 ;PULSE WIDTH OF 50ms LOVOLT EQU 0CBH ;D/A OUTPUT FOR 24V "))ҍ*)) ^#V")]͠.*)DM\ -°!\6:\ͣ:ͱ*}DM'ͫ*)%) N#F'ͫ*)-:YS:Z Hҧ!6> 2)½>!)6> !)*)&*)>2) :) .͐*)M͐:)<2)& !sc*&P :w:·>!ұͯ :22:_!6=!6>'!E!4!p+q*0 !20O> ڒ:0:AO>Ҥ::A }}Hͬ!wͻO`idͻV[2O>2:!X!6:!y !_Y> y >$˯@(!88 !>dK*[> >: o$ yrong configurator installed! Turn off Inhibit Switch & type any key - Hardware Error- No EOC! Program Voltage out of toleran%( 65B X+2?%%%(65! %'A&#- %&()(%)(%"5(%(m%(u%ʘ$ʤ %ʺ$$ using 'HEX=nnnn' ; directive. ; Re-org to allow for increased size of main program due to added ; SEarch and Compare Buffe!_Y> y >$˯@(!88 !>K*[> >: o$ y%( 65B X+2?%%%(65! %'A&#- %&()(%)(%"5(%(m%(u%ʘ$ʤ %ʺ$$HIVOLT EQU 0DCH ;D/A OUTPUT FOR 26V TYPSEL EQU NOT 4 ;CONFIGURATOR TYPE CODE SELECT ADDRESS TYPCOD EQU 2 ;PROM CONFIGURATOR!) N#F'k͐ͫ*)) N#FͫR͐/͐ *) ~IO͐NW͐ͫ8AO͐:͐ *) ~2)t(͐:)҃)99:Y=/9&ͩ c,Hͩ 9 EHͺ i`N#Fog_og_ogDr+s+p+q*~$7*>*>H&>*#"*#"> 2:R͎:!6!6=2:ʙ!6:“H:=O!L NE!4 E E:/.*&L 6$L9k9.Xͯ *KM^020K,y(>> >  y>*[K̀ !A!z{!! ~!!ce! : Prom not erased! Continue? (Y/N) - AT]#%[(%"(%((%&(2?>-DE,HLAF,AF'(SP),HL(SP),IXator type code to allow more than 7 types using ; A10, A11, A13, A14 & A15 as select bits. NOTE: do NOT use 7 as a ; type codr commands. ; VERS EQU '15' ; ;**************************************************************************** SUBTTL OVERLAY>*[KU !!z{!ͳ!~!!ͳ: od$ yU*[KU !+)%($(>2?! -ƀ">i~'AT]#%[(%"(%((%&(2?>-DE,HLAF,AF'(SP),HL(SP),IX CODE SELECT ADDRESS TYPCOD EQU 1 ;PROM CONFIGURATOR TYPE CODE ENDIF IF PROMTYPE = 2732 ;INTEL 2732 TYPE PROMSIZ EQU TYPE CODE ENDIF IF PROMTYPE = 2733 ;INTEL 2732A TYPE PROMSIZ EQU 4096 ;SIZE OF THIS PROM IN WORDS EDATA EQU 0FFH ;͐*)#")Ã& \!"))\Ұ*)")]͠*)M! ^#V *) >*) w *) >*) w *) >*)M!>))덑o|gҘ =†DM!>))ҭ =¥~ ³^#V) ½^#V|g}o _{ozgi`N#Fogo&og_{_z#W9Ž>!6-e!6ͻ2=2ʺ-é:>>"ͻ2:!!5ͻ2ͬ!\ :020:121'ͳ':²ͯ !G6!"!"7 *M^n/ :a/:H!6:ͯ !&6: oҏ$ y€*[K̀ !V*|!R!*[Kw: o$ y>{z{z~ Data Error(SP),IY! 1 (F)%65655& 2?%-%&%(%($(652?%B X+>">-f:?:e as this is reserved for no configurator installed, as well ; as masking the select bit encoding. ; Anticipate the I2764A EPR DECLARATIONS FALSE EQU 0 TRUE EQU NOT FALSE IF VERS >= '15' OVLBFR EQU $ ;'$' SET BY INVOCING ASSEMBLER WITH 'HEX*|!R!*[Kͳw: oҬ$ yž>{z{z~ Data Error at Is: Should be: Bit(s) not Progr(SP),IY! 1 (F)%65655& 2?%-%&%(%($(652?%B X+>">-f:?: 4096 ;SIZE OF THIS PROM IN WORDS EDATA EQU 0FFH ;ERASED DATA VALUE PGMLPS EQU 1 DELAY EQU 1 ;DELAY TO PROGRAM PULSE (2us)ERASED DATA VALUE PGMLPS EQU 1 DELAY EQU 1 ;DELAY TO PROGRAM PULSE (2us) RATE EQU 10 ;RATE FOR PULSE WIDTH (200KHZ,5us) WIbit Switch & type any key - Hardware Error- No EOC! Program Voltage out of tolerance! : Prom not erased! Continue? (Y/N) - 0 !%)- "*. #'+/  $(,0&kÁ*R0!/>O(!Sy !r>2>>>t> >>>>'K[ͳ  y ammable. Try erasing. Successful Program. OK Bytes requested exceeds prom size! Wrong configurator installed! Turn off Inhim?ݾ*F##yox( < }8}0 6-R*F#"F%&%%% x&65! -%(>"! O1 y8">2?! -ATOR TYPE CODE SELECT ADDRESS TYPCOD EQU 6 ;PROM CONFIGURATOR TYPE CODE ENDIF IDLE EQU 0 ;RETURN PROM II HARDWARE TO IkÁ *R0!/>O(!Sy !r>2>>>t> >>>>'K[ͳ  y ammable. Try erasing. Successful Program. OK Bytes requested exceeds prom size! Wrong configurator installed! Turn off Inhim?ݾ*F##yox( < }8}0 6-R*F#"F%&%%% x&65! -%(>"! O1 y8">2?! -*************************** ; ; PROGRAM PROM SUBROUTINE CODE: ; ENTRY- CSTART = START ADDR PTR TO CODE TO PROGRAM ; PGMCNT kÁ@*R0!/>O(!Sy !r>2>>>t> >>>>'K[ͳ  y ammable. Try erasing. Successful Program. OK Bytes requested exceeds prom size! Wrong configurator installed! Turn off Inhim?ݾ*F##yox( < }8}0 6-R*F#"F%&%%% x&65! -%(>"! O1 y8">2?! ----------------------------------------------- ; TIMING PROGRAMMED, CHECK IF PROM ERASED BEFORE TURNING ON HIGH VOLTAGE ;---!_Y> y >$˯@(!88 !>K*[> >: o$ ybit Switch & type any key - Hardware Error- No EOC! Program Voltage out of tolerance! : Prom not erased! Continue? (Y/N) - %( 65B X+2?%%%(65! %'A&#- %&()(%)(%"5(%(m%(u%ʘ$ʤ %ʺ$$DLE STATE VON EQU 1 SHL PVO ;PROGRAM VOLTAGE TURN ON BYTE GETSET EQU 1 SHL PPG + VON PROGM EQU 1 SHL PPS + GETSET ;PROGRAM S!_Y> y >$˯@(!88 !>K*[> >: o$ ybit Switch & type any key - Hardware Error- No EOC! Program Voltage out of tolerance! : Prom not erased! Continue? (Y/N) - %( 65B X+2?%%%(65! %'A&#- %&()(%)(%"5(%(m%(u%ʘ$ʤ %ʺ$$= NUMBER OF BYTES TO PROGRAM ; PSTART = START OFFSET ADDR IN PROM ; INCR = VALUE TO ADD TO CODE PTR AFTER EACH BYTE IS PROGR!_Y> y >$˯@(!88 !>K*[> >: o$ y%( 65B X+2?%%%(65! %'A&#- %&()(%)(%"5(%(m%(u%ʘ$ʤ %ʺ$$------------------------------------------------------------------------- ERSCHK: LD BC,(PGMCNT) ;CHECK IF ERASED LD DE,(PSTA>*[KU !!z{!ͳ!~!!ͳ: od$ yU*[KU !+)%($(>2?! -ƀ">i~'AT]#%[(%"(%((%&(2?>-DE,HLAF,AF'(SP),HL(SP),IXED DATA VALUE PGMLPS EQU 25 DELAY EQU 1 ;DELAY TO PROGRAM PULSE (2us) RATE EQU 2 ;RATE FOR PULSE WIDTH (1MHZ) WIDTH EQU 20TART BYTE TO CMD REG PGMSTP EQU GETSET ;PROGRAM STOP BYTE TO CMD REG STCONV EQU 1 SHL PSCV + VON ;START CONVERT BYTE ;===>*[KU !!z{!ͳ!~!!ͳ: od$ yU*[KU !+)%($(>2?! -ƀ">i~'AT]#%[(%"(%((%&(2?>-DE,HLAF,AF'(SP),HL(SP),IXR'S DISCRETION, BUT ; PGMEND SHOULD ALLWAYS BE THE LAST BYTE & SHOULD START ON AN EVEN 16 BYTE ; ADDRESS (I.E. XXX0H) ; ;---AMMED ; ;**************************************************************************** PROG: LD DE,PROMSIZ ;IF TOO MANY BYTES >*[KU !!z{!ͳ!~!!ͳ: od$ yU*[KU !+)%($(>2?! -ƀ">i~'AT]#%[(%"(%((%&(2?>-DE,HLAF,AF'(SP),HL(SP),IXGENERATOR RATE OUT (PTMRMD),A LD A,LOW RATE OUT (PTMR1),A LD A,HIGH RATE OUT (PTMR1),A LD A,PT2MOD ;PROGRAMMING PURT) ERALP: CALL GETDATA CP EDATA ;IF NOT ERASED THEN PROMPT JR NZ,NTERASD INC DE ;ELSE BUMP PTR & CHECK NEXT LOCATI*|!R!*[Kͳw: oҬ$ yž>{z{z~ Data Error at Is: Should be: Bit(s) not Progr(SP),IY! 1 (F)%65655& 2?%-%&%(%($(652?%B X+>">-f:?:00 ;PULSE WIDTH OF 2ms LOVOLT EQU 0CBH ;D/A OUTPUT FOR 24V HIVOLT EQU 0DCH ;D/A OUTPUT FOR 26V TYPSEL EQU NOT 4 ;CONFIGUR============================================= ; ; PROM OVERLAY LINKS TO SUBROUTINES ; ;===================================== *|!R!*[Kͳw: oҬ$ yž>{z{z~ Data Error at Is: Should be: Bit(s) not Progr(SP),IY! 1 (F)%65655& 2?%-%&%(%($(652?%B X+>">-f:?:------------------------------------------------------------------------ ;*************************************************THEN EXIT LD HL,(PGMCNT) EX DE,HL OR A SBC HL,DE JR NC,COUNTOK TOOBIG: LD HL,TOOBGM ;OUTPUT PROM SIZE ERR JR EDIT@*|!R!*[Kͳw: oҬ$ yž>{z{z~ Data Error at Is: Should be: Bit(s) not Progr(SP),IY! 1 (F)%65655& 2?%-%&%(%($(652?%B X+>">-f:?:LSE WIDTH OUT (PTMRMD),A LD A,LOW WIDTH OUT (PTMR2),A LD A,HIGH WIDTH OUT (PTMR2),A ;------------------------------ON DEC BC LD A,C OR B JR NZ,ERALP JR ERASED ;IF ALL ERASED THEN GO ON ;-----------------------------------------bit Switch & type any key - Hardware Error- No EOC! Program Voltage out of tolerance! : Prom not erased! Continue? (Y/N) - 0 !%)- "*. #'+/  $(,0&qÇ *R0!;>O(!_y !~>2>>>t>>>>>K[͹  y s) not Programmable. Try erasing. Successful Program. OK Bytes requested exceeds prom size! Wrong configurator installed! Tm?ݾ*F##yox( < }8}0 6-R*F#"F%&%%% x&65! -%(>"! O1 y8">2?! -NXT: CALL PUTDATA ;OUTPUT ADDRESS & DATA TO PROGRAM LD A,PROGM ;PROGRAM BYTE OUT (PRMCMD),A PRGWT: IN A,(PRMST) ;WAITkÁ*R0!/>O(!Sy !r>2>>>t> >>>>'K[ͳ  y ammable. Try erasing. Successful Program. OK Bytes requested exceeds prom size! Wrong configurator installed! Turn off Inhim?ݾ*F##yox( < }8}0 6-R*F#"F%&%%% x&65! -%(>"! O1 y8">2?! -EC BC ;IF COUNT-- = 0 THEN STOP ELSE NEXT WORD LD A,C OR B JP NZ,PRGNXT ENDIF ENDIF IF PROMTYPE = 8764 ;-- TITLE EPROM OVERLAY FOR PROM III LIST NOCOND ;****************************************************************************  & Copy vectors and associated variables for ; programming EPROMs. ; ;******************************************************* skip value, added I/O vector locations. ; ; 1.3 - 28 NOV 84 GRH ; Changed include definition file name. Added borders to cOM which uses +12.5 volts as programming ; voltage. ; ; 1.5 - 28 APR 85 GRH ; Revised to allow Assembler invocation of ORG!_Y> y >$˯@(!88 !>K*[> >: o$urn off Inhibit Switch & type any key - Hardware Error- No EOC! Program Voltage out of tolerance! : Prom not erased! Contin%( 65B X+2?%%%(65! %'A&#- %&()(%)(%"5(%(m%(u%ʘ$ʤ %ʺ$$ UNTIL DONE AND PRMBSY JR NZ,PRGWT LD A,PGMSTP ;TERMINATE PROGRAM CYCLE OUT (PRMCMD),A INC DE ;PROM ADDR ++ L!_Y> y >$˯@(!88 !>K*[> >: o$ ybit Switch & type any key - Hardware Error- No EOC! Program Voltage out of tolerance! : Prom not erased! Continue? (Y/N) - %( 65B X+2?%%%(65! %'A&#- %&()(%)(%"5(%(m%(u%ʘ$ʤ %ʺ$$------------------------------------ ; 68764/68766 ;-------------------------------------- LD BC,(PGMCNT) ;FETCH PARAMETER; ; EPROM OVERLAY FOR 'PROM' PROGRAM ; COPYRIGHT (c) 1981,1982,1983 GRH ENTERPRISES, CUPERTINO, CA ; BY GIRVIN HERR ; ;**omment ; headers. Added 27128 prom type. ; ; 1.4 - 21 JAN 85 GRH ; Revised code for MCM68764/66 EPROM. ; Revised configur using 'HEX=nnnn' ; directive. ; Re-org to allow for increased size of main program due to added ; SEarch and Compare Buffe y>*[K[ !"!z{!͹!~!!͹: oj$ y[*[K[ ue? (Y/N) - >2?! -ƀ">i~'AT]#%[(%"(%((%&(2?>-DE,HLAF,AF'(SP),HL(SP),IX OUT (PRMCMD),A IF PROMTYPE = 2708 ;--------------------------------- ; 2708 CODE ;---------------------------------D A,(INCR) ;ADD INCREMENT VALUE TO MEMORY PTR ADD A,L LD L,A JP NC,HOK INC H HOK: DEC BC ;IF COUNT-- = 0 THEN STOP>*[KU !!z{!ͳ!~!!ͳ: od$ yU*[KU !+)%($(>2?! -ƀ">i~'AT]#%[(%"(%((%&(2?>-DE,HLAF,AF'(SP),HL(SP),IX PRGWT: IN A,(PRMST) ;WAIT UNTIL DONE AND PRMBSY JR NZ,PRGWT LD A,PGMSTP ;TERMINATE PROGRAM CYCLE OUT (PRMCMD),A SS LD HL,(CSTART) LD DE,(PSTART) PRGNXT: PUSH BC LD B,PGMLPS ;SET UP COUNT ILOOP: CALL PUTDATA CP EDATA ;IF DATA************************************************************************** ; ; This module supports all code required to inter main program knows where proms ; are at for the CoPy command. ; Added code to output bad address as prom relative rather thanator type code to allow more than 7 types using ; A10, A11, A13, A14 & A15 as select bits. NOTE: do NOT use 7 as a ; type codr commands. ; VERS EQU '15' ; ;**************************************************************************** SUBTTL OVERLAY!7 *|!R!*[K͹w: oҲ$ y¤>{z{z~ Data Error at Is: Should be: Bit((SP),IY! 1 (F)%65655& 2?%-%&%(%($(652?%B X+>">-f:?: LD BC,PGMLPS ;SET UP LOOP COUNT NXTLP: PUSH BC LD BC,(PGMCNT) ;PREPARE TO PROGRAM LD HL,(CSTART) LD DE,(PSTART) PRG ELSE NEXT WORD LD A,C OR B JP NZ,PRGNXT ;--------------------------------------------------------------------------- *|!R!*[Kͳw: oҬ$ yž>{z{z~ Data Error at Is: Should be: Bit(s) not Progr(SP),IY! 1 (F)%65655& 2?%-%&%(%($(652?%B X+>">-f:?:KIP: INC DE ;PROM ADDR ++ LD A,(INCR) ;ADD INCREMENT VALUE TO MEMORY PTR ADD A,L LD L,A JP NC,HOK INC H HOK: D == ERASED THEN SKIP PROGRAM JP Z,SKIP LD A,PROGM ;PROGRAM BYTE OUT (PRMCMD),A PRGWT: IN A,PRMST ;WAIT UNTIL DONE face the 'PROM III' ; prom programmer card hardware to the 'PROM' utility kernel program. These ; include the Program, Compare memory ; relative. ; ; 1.2 - 18 Jan 83 ; Changed to conform to new version 1.2 of PROM utility. ; Added copy vector, addede as this is reserved for no configurator installed, as well ; as masking the select bit encoding. ; Anticipate the I2764A EPR DECLARATIONS FALSE EQU 0 TRUE EQU NOT FALSE IF VERS >= '15' OVLBFR EQU $ ;'$' SET BY INVOCING ASSEMBLER WITH 'HEX********************* ; ; Revision status: ; ; 1.0 - 14 jun 81 ; Release ; ; 1.1 - ; Added PROM0 entry at table area so0 !%)- "*. #'+/  $(,0&=NNNN' ELSE OVLBFR EQU 1200H ;START OF OVERLAY AREA ORG OVLBFR ENDIF CR EQU 0DH ; ;*INCLUDE PROMIII.DEF ;INCLUTA VALUE PGMLPS EQU 100 ;LOOP COUNT TO PROGRAM (SEE 2708 DATA MANUAL) DELAY EQU 17 ;DELAY TO PROGRAM PULSE (10us) RATE EQU ATA VALUE PGMLPS EQU 1 DELAY EQU 1 ;DELAY TO PROGRAM PULSE (2us) RATE EQU 10 ;RATE FOR PULSE WIDTH (200KHZ,5us) WIDTH EQU LAY TO PROGRAM PULSE (2us) RATE EQU 10 ;RATE FOR PULSE WIDTH (200KHZ,5us) WIDTH EQU 10000 ;PULSE WIDTH OF 50ms LOVOLT EQU 0 ;RATE FOR PULSE WIDTH (200KHZ,5us) WIDTH EQU 10000 ;PULSE WIDTH OF 50ms LOVOLT EQU 0ADH ;D/A OUTPUT FOR 20.5V HIVOLT EQU 0WIDTH EQU 10000 ;PULSE WIDTH OF 50ms LOVOLT EQU 0ADH ;D/A OUTPUT FOR 20.5V HIVOLT EQU 0B6H ;D/A OUTPUT FOR 21.5V TYPSEL EQms LOVOLT EQU 0ADH ;D/A OUTPUT FOR 20.5V HIVOLT EQU 0B6H ;D/A OUTPUT FOR 21.5V TYPSEL EQU NOT 4 ;CONFIGURATOR TYPE CODE SEPUT FOR 24V HIVOLT EQU 0DCH ;D/A OUTPUT FOR 26V TYPSEL EQU NOT 4 ;CONFIGURATOR TYPE CODE SELECT ADDRESS TYPCOD EQU 6 ;PROM======== ; ; PROM OVERLAY LINKS TO SUBROUTINES ; ;================================================ EDITOR EQU OVLBFR - 15 ;D START AT EVEN PAGE BOUNDARY AND IT'S ; LOCATIONS SHOULD ALLWAYS BE CONSTANT. ; ;###########################################TORS ; ;**************************** PRGMV: JP PROG ;PROGRAM PROM FROM MEMORY SUBROUTINE VECTOR COMPV: JP COMP ;COMPARE PR----------------------------------- ;**************************************************************************** ; ; PRODE THE HARDWARE CONSTANTS (PROM III) ; LIST OFF *INCLUDE PROMIII.DEF LIST ON ;============================ ; ; PROM2 ;RATE FOR PULSE WIDTH (1MHZ) WIDTH EQU 1000 ;PULSE WIDTH OF 1ms LOVOLT EQU 0D3H ;D/A OUTPUT FOR 25V HIVOLT EQU 0E5H ;D/10000 ;PULSE WIDTH OF 50ms LOVOLT EQU 0CBH ;D/A OUTPUT FOR 24V HIVOLT EQU 0DCH ;D/A OUTPUT FOR 26V TYPSEL EQU NOT 4 ;CONFCBH ;D/A OUTPUT FOR 24V HIVOLT EQU 0DCH ;D/A OUTPUT FOR 26V TYPSEL EQU NOT 4 ;CONFIGURATOR TYPE CODE SELECT ADDRESS TYPCODB6H ;D/A OUTPUT FOR 21.5V TYPSEL EQU NOT 4 ;CONFIGURATOR TYPE CODE SELECT ADDRESS TYPCOD EQU 2 ;PROM CONFIGURATOR TYPE CODEU NOT 4 ;CONFIGURATOR TYPE CODE SELECT ADDRESS TYPCOD EQU 4 ;PROM CONFIGURATOR TYPE CODE PTYPE EQU 2 ENDIF IF PROMTYLECT ADDRESS TYPCOD EQU 4 ;PROM CONFIGURATOR TYPE CODE PTYPE EQU 2 ENDIF IF PROMTYPE = 8764 ;MOTOROLA MCM68764/MCM68 CONFIGURATOR TYPE CODE PTYPE EQU 3 ENDIF IDLE EQU 0 ;RETURN PROM II HARDWARE TO IDLE STATE VON EQU 1 SHL PVO ;PROGRATEXT OUTPUT TO CONSOLE SUBR CSTS EQU OVLBFR - 12 ;CONSOLE STATUS SUBR CONIN EQU OVLBFR - 9 ;CONSOLE INPUT SUBR CONOUT EQU OVLOM TO MEMORY SUBROUTINE VECTOR READV: JP READ ;READ PROM INTO MEMORY SUBROUTINE VECTOR ;---------------------------------GRAM PROM SUBROUTINE CODE: ; ENTRY- CSTART = START ADDR PTR TO CODE TO PROGRAM ; PGMCNT = NUMBER OF BYTES TO PROGRAM ; PSTA DECLARATIONS ; ;============================ SPCLFLG DL FALSE ;ASSUME NO SPECIAL CODE WHATYPE ;INCLUDE PROM TYPE MACRO A OUTPUT FOR 27V TYPSEL EQU NOT 4 ;CONFIGURATOR TYPE CODE SELECT ADDRESS TYPCOD EQU 0 ;PROM CONFIGURATOR TYPE CODE PTYPE EQIGURATOR TYPE CODE SELECT ADDRESS TYPCOD EQU 1 ;PROM CONFIGURATOR TYPE CODE PTYPE EQU 2 ENDIF IF PROMTYPE = 2732 ;IN EQU 2 ;PROM CONFIGURATOR TYPE CODE PTYPE EQU 2 ENDIF IF PROMTYPE = 2733 ;INTEL 2732A TYPE PROMSIZ EQU 4096 ;SIZE O PTYPE EQU 2 ENDIF IF PROMTYPE = 2764 ;INTEL 2764 TYPE PROMSIZ EQU 8192 ;SIZE OF THIS PROM IN WORDS EDATA EQU 0FFH PE = 2712 ;INTEL 27128 TYPE PROMSIZ EQU 16384 ;SIZE OF THIS PROM IN WORDS EDATA EQU 0FFH ;ERASED DATA VALUE PGMLPS EQU 1 766 TYPE PROMSIZ EQU 8192 ;SIZE OF THIS PROM IN WORDS EDATA EQU 0FFH ;ERASED DATA VALUE PGMLPS EQU 25 DELAY EQU 1 ;DELAY M VOLTAGE TURN ON BYTE GETSET EQU 1 SHL PPG + VON PROGM EQU 1 SHL PPS + GETSET ;PROGRAM START BYTE TO CMD REG PGMSTP EQU GETSBFR - 6 ;CONSOLE OUTPUT SUBR PRTHEX EQU OVLBFR - 3 ;OUTPUT BYTE IN A REG TO CONSOLE SUBR SUBTTL OVERLAY CODE ;############: DW PGMEND ;DW PTR TO START OF CODE IN RAM PGMCNT: DW 1 ;WORD COUNT TO PROGRAM PSTART: DW 0 ;PROM START ADDR (OFFSET) SOC------------------------------------------ ; ; THE FOLLOWING CODE MAY VARY WITH THE WRITER'S DISCRETION, BUT ; PGMEND SHOULD RT = START OFFSET ADDR IN PROM ; INCR = VALUE TO ADD TO CODE PTR AFTER EACH BYTE IS PROGRAMMED ; ;**************************FROM COMMAND LINE IF PROMTYPE = 2708 ;INTEL 2708 PROMSIZ EQU 1024 ;SIZE OF THIS PROM IN WORDS EDATA EQU 0FFH ;ERASED DAU 1 ENDIF IF PROMTYPE = 2716 ;INTEL 2716 TYPE PROMSIZ EQU 2048 ;SIZE OF THIS PROM IN WORDS EDATA EQU 0FFH ;ERASED DTEL 2732 TYPE PROMSIZ EQU 4096 ;SIZE OF THIS PROM IN WORDS EDATA EQU 0FFH ;ERASED DATA VALUE PGMLPS EQU 1 DELAY EQU 1 ;DEF THIS PROM IN WORDS EDATA EQU 0FFH ;ERASED DATA VALUE PGMLPS EQU 1 DELAY EQU 1 ;DELAY TO PROGRAM PULSE (2us) RATE EQU 10  ;ERASED DATA VALUE PGMLPS EQU 1 DELAY EQU 1 ;DELAY TO PROGRAM PULSE (2us) RATE EQU 10 ;RATE FOR PULSE WIDTH (200KHZ,5us) DELAY EQU 1 ;DELAY TO PROGRAM PULSE (2us) RATE EQU 10 ;RATE FOR PULSE WIDTH (200KHZ,5us) WIDTH EQU 10000 ;PULSE WIDTH OF 50TO PROGRAM PULSE (2us) RATE EQU 2 ;RATE FOR PULSE WIDTH (1MHZ) WIDTH EQU 2000 ;PULSE WIDTH OF 2ms LOVOLT EQU 0CBH ;D/A OUTET ;PROGRAM STOP BYTE TO CMD REG STCONV EQU 1 SHL PSCV + VON ;START CONVERT BYTE ;========================================######################################################## ; ; PROM OVERLAY VARIABLES & VECTOR LOCATIONS ; THIS SECTION SHOULKET: DB 0 ;PROM SOCKET # INCR: DB 1 ;OVERLAY DATA PTR INCREMENT COUNT ;**************************** ; ; MAIN ENTRY VECALLWAYS BE THE LAST BYTE & SHOULD START ON AN EVEN 16 BYTE ; ADDRESS (I.E. XXX0H) ; ;----------------------------------------************************************************** PROG: LD DE,PROMSIZ ;IF TOO MANY BYTES THEN EXIT LD HL,(PGMCNT) EX DE,HL######################### PGMBFR: DW PGMEND ;DW PTR TO RAM BUFFER (AFTER OVERLAY) PROM0: DW 0 ;PTR TO START OF PROMS CSTART0 !%)- "*. #'+/  $(,0& OR A SBC HL,DE JR NC,COUNTOK TOOBIG: LD HL,TOOBGM ;OUTPUT PROM SIZE ERR JR EDITOR ;------------------------------ C,A AND PSTYPE CP TYPCOD JR Z,CONFOK LD HL,CONFM ;OUTPUT CONFIGURATOR ERROR JR EDITOR ;-------------------------AIN, DON'T TAKE USER'S WORD FOR IT ;-------------------------------------- ; ALL SEEMS OK, NOW SET UP TIMING ;----------- WIDTH OUT (PTMR2),A LD A,HIGH WIDTH OUT (PTMR2),A ;-------------------------------------------------------------------RALP JR ERASED ;IF ALL ERASED THEN GO ON ;----------------------------------------------------- ; NOT ERASED, CHECK I--------------------------------------- ERASED: LD A,VON ;TURN ON VOLTAGE OUT (PRMCMD),A LD BC,0 ;WAIT FOR ANALOG STUFFK LIMITS CP LOVOLT JR C,VOLTER CP HIVOLT + 1 JR C,VOLTOK VOLTER: LD HL,VERM PUSH AF ;SAVE A/D DATA CALL EDITORPUSH BC LD BC,(PGMCNT) ;PREPARE TO PROGRAM LD HL,(CSTART) LD DE,(PSTART) PRGNXT: CALL PUTDATA ;OUTPUT ADDRESS & DATA TNXT ;--------------------------------------------------------------------------- ; OUTPUT PADDING BYTES TO END OF PROM TO ND PRMBSY JR NZ,PRGWT2 LD A,PGMSTP ;STOP PROGRAM CYCLE OUT (PRMCMD),A INC DE ;PROM PTR++ DEC BC ;COUNT-- JP PA-------------------- LD BC,(PGMCNT) ;PREPARE TO PROGRAM LD HL,(CSTART) LD DE,(PSTART) PRGNXT: CALL PUTDATA ;OUTPUT DATC BC ;IF COUNT-- = 0 THEN STOP ELSE NEXT WORD LD A,C OR B JP NZ,PRGNXT ENDIF IF PTYPE = 3 ;----------------------------------------------- ; COUNT <= PROM SIZE ; CHECK CONFIGURATOR TYPE CODE FOR CORRECT PROM TYPE ;------------------------------------------------------------ ; CONFIGURATOR IS CORRECT, NOW CHECK IF PROGRAM ENABLE SWITCH IS ON ;-------------------------------------- INHOK: LD A,PT0MOD ;PROGRAMMING PULSE DELAY (CNT * 0.5us + 1.5us) OUT (PTMRMD),A LD A,LOW --------- ; TIMING PROGRAMMED, CHECK IF PROM ERASED BEFORE TURNING ON HIGH VOLTAGE ;----------------------------------------F USER WANT'S TO TRY ANYWAY ;----------------------------------------------------- NTERASD: LD HL,NTERAM ;OUTPUT NOT ERASED  TO SETTLE TWIDDL: EX (SP),HL EX (SP),HL DEC BC LD A,C OR B JR NZ,TWIDDL LD A,STCONV ;ISSUE START CONVERT OUT ( POP AF ;OUTPUT A/D DATA FOR DIAGNOSTICS JP PRTHEX ;--------------------------------- ; ALL SEEMS OK, SO PROGRAM PROMO PROGRAM LD A,PROGM ;PROGRAM BYTE OUT (PRMCMD),A PRGWT: IN A,(PRMST) ;WAIT UNTIL DONE AND PRMBSY JR NZ,PRGWT CONFORM TO PROGRAMMING SPECS ;--------------------------------------------------------------------------- LD BC,(PADING) ;NOWA & ADDRESS CP EDATA ;IF DATA = ERASED DATA THEN SKIP PROGRAM JP Z,SKIP LD A,PROGM ;PROGRAM BYTE OUT (PRMCMD),A ------------------- ; 68764/68766 ;-------------------------------------- LD BC,(PGMCNT) ;FETCH PARAMETERS LD HL,(CSTART----------------------------------------- COUNTOK: IF PROMTYPE = 2708 LD (PADING),HL ;SAVE REMAINDER AS PADDING COUNT --------------------------------------------------------- CONFOK: LD A,C ;RESTORE STATUS AND PRMINH ;IF INHIBIT SWITCH ON TDELAY OUT (PTMR0),A LD A,HIGH DELAY OUT (PTMR0),A LD A,PT1MOD ;PROGRAMMING PULSE GENERATOR RATE OUT (PTMRMD),A LD ------------------------------------ ERSCHK: LD BC,(PGMCNT) ;CHECK IF ERASED LD DE,(PSTART) ERALP: CALL GETDATA CP EDATAMESSAGE CALL EDITOR CALL CONIN ;GET USER INPUT AND 5FH ;CONVERT LC TO UC CP 'Y' RET NZ ;-------------------------PRMCMD),A RES PSCV,A OUT (PRMCMD),A LD B,0 ;SET UP TIMOUT EOCLP: IN A,(PRMST) ;WAIT FOR END OF CONVERT AND PRMEOC  ;--------------------------------- VOLTOK: LD A,GETSET ;APPLY PROGRAM VOLTAGE TO CHIP OUT (PRMCMD),A IF PTYPE = 1 LD A,PGMSTP ;TERMINATE PROGRAM CYCLE OUT (PRMCMD),A INC DE ;PROM ADDR ++ LD A,(INCR) ;ADD INCREMENT VALUE TO MEMORY P OUTPUT PADDING BYTES PADLP: LD A,C ;IF PADDING = 0 THEN EXIT OR B JR Z,PADDON CALL PUTDATA ;ELSE PROGRAM TO ERASED D---------------------------- PADDON: POP BC ;IF LOOPS <> 0 THEN DO AGAIN DEC BC LD A,C OR B JP NZ,NXTLP ENDIF  PRGWT: IN A,(PRMST) ;WAIT UNTIL DONE AND PRMBSY JR NZ,PRGWT LD A,PGMSTP ;TERMINATE PROGRAM CYCLE OUT (PRMCMD),A SK) LD DE,(PSTART) PRGNXT: PUSH BC LD B,PGMLPS ;SET UP COUNT ILOOP: CALL PUTDATA CP EDATA ;IF DATA == ERASED THEN S ENDIF STCHK: LD A,TYPSEL ;SELECT TYPE CODE ADDRESS OUT (PADDRH),A IN A,(PRMST) ;IF CONFIGURATOR NOT CORRECT THEN EXIT LDHEN ERR JR NZ,INHOK LD HL,INHM ;OUTPUT INHIBIT SWITCH MSG CALL EDITOR CALL CONIN ;WAIT FOR KEY JR STCHK ;CHECK AGA,LOW RATE OUT (PTMR1),A LD A,HIGH RATE OUT (PTMR1),A LD A,PT2MOD ;PROGRAMMING PULSE WIDTH OUT (PTMRMD),A LD A,LOW ;IF NOT ERASED THEN PROMPT JR NZ,NTERASD INC DE ;ELSE BUMP PTR & CHECK NEXT LOCATION DEC BC LD A,C OR B JR NZ,E-------------------------------------- ; PROM IS ERASED, NOW CHECK FOR CORRECT PROGRAMMING VOLTAGE ;------------------------JR Z,GOTEOC DJNZ EOCLP ;IF TIMOUT THEN OUTPUT ERR LD HL,EOCERM JP EDITOR GOTEOC: IN A,(PADDAT) ;GET VOLTAGE & CHEC;--------------------------------- ; 2708 CODE ;--------------------------------- LD BC,PGMLPS ;SET UP LOOP COUNT NXTLP: TR ADD A,L LD L,A JP NC,HOK INC H HOK: DEC BC ;IF COUNT-- = 0 THEN STOP ELSE NEXT WORD LD A,C OR B JP NZ,PRGATA TO END OF PROM LD A,EDATA OUT (PDATA),A LD A,PROGM OUT (PRMCMD),A PRGWT2: IN A,(PRMST) ;WAIT UNTIL CYCLE DONE A IF PTYPE = 2 ;------------------------------------------- ; STANDARD INTEL TYPE PROGRAMMING CODE ;-----------------------IP: INC DE ;PROM ADDR ++ LD A,(INCR) ;ADD INCREMENT VALUE TO MEMORY PTR ADD A,L LD L,A JP NC,HOK INC H HOK: DEKIP PROGRAM JP Z,SKIP LD A,PROGM ;PROGRAM BYTE OUT (PRMCMD),A PRGWT: IN A,PRMST ;WAIT UNTIL DONE AND PRMBSY JR DLP ;------------------------------------------------ ; PADDING DONE, NOW LOOP AGAIN UNTIL ALL DONE ;--------------------0 !%)- "*. #'+/  $(,0&NZ,PRGWT LD A,PGMSTP ;TERMINATE PROGRAM CYCLE OUT (PRMCMD),A DJNZ ILOOP SKIP: INC DE ;NEXT ADDRESS LD A,(INCR)M VOLTAGE FROM HARDWARE OUT (PRMCMD),A LD HL,(CSTART) ;SET UP PTRS LD DE,(PSTART) LD BC,(PGMCNT) ; & COUNT CALL COMPAF ;SAVE CARRY FOR ERASE PROMPT PUSH HL ;MEM ADDR PUSH DE ;PROM ADDR LD HL,DERRM CALL EDITOR POP DE ;PROM ADDR CCF ;REVERSE PROGRAMMABLE BIT SENSE IF DATA = 0 ENDIF JP NC,EDITOR LD HL,ERASM ;ELSE OUTPUT MUST ERASE MESSAGE JP SUB (HL) RET NZ INC DE ;PTRS ++ LD A,(INCR) ;MEMORY PTR += INCREMENT ADD A,L LD L,A JP NC,CHOK INC H CHOK:TE IS COMPARED ; ;*************************************************************************** COMP: LD HL,(CSTART) ;SET UP FOEMORY ; INCR = VALUE TO ADD TO CODE PTR AFTER EACH BYTE IS READ ; ;********************************************************* LD A,C OR B JP NZ,READLP RET ;++++++++++++++++++++++++++++++++++++++ ; ; GET PROM DATA SUBR ; ENTRY- DE= PROMXSUB ASMB POVERLY HEX=1200 MACRO=$1.MAC NOTEXT ERA P$1.PRN REN P$1.PRN=POVERLY.PRN ERA P$1.HEX REN P$1.HEX=POVERLY.HEX DDT************ ; ; MESSAGE EDITOR SUBR OUTPUTS TEXT STRING UNTIL A NUL IS FOUND. ; BYTES > 7FH ARE CONVERTED TO SPACES, SINGLE CP CR ;IF RETURN THEN DO CR-LF PUSH AF CALL Z,CRLF POP AF JR Z,EDITLP CALL CONOUT JR EDITLP ;***************OCK FORMATTER ; ENTRY- (CMDPTR) = ASCII STRING PTR OF FILE ; HL = FCB TO FORMAT ; EXIT - ZF = NO WILDCARDS USED  ;ADD INCREMENT VALUE TO MEMORY PTR ADD A,L LD L,A JP NC,HOK INC H HOK: POP BC ;IF COUNT EXHAUSTED THEN REPEAT DR ;COMPARE PROM TO MEMORY IMAGE JR NZ,NOGOOD ;IF NOT SAME THEN EXIT TO MESSAGE LD HL,SUCCM ;SUCCESSFUL PROGRAM JP EDITOLD A,D ;OUTPUT ERR ADDR PUSH DE ;PROM ADDR CALL PRTHEX POP DE PUSH DE LD A,E CALL PRTHEX LD HL,ISM ;OUTPUT PREDITOR ;++++++++++++++++++++++++++++++++++++++++++++++++ ; ; BYTE COMPARE SUBR ; ENTRY- DE= PROM PTR (?= (DE) - (HL)) ; DEC BC ;IF --COUNT <> 0 THEN LOOP LD A,C OR B JP NZ,COMPAR RET ;***********************************************R COMPAR LD DE,(PSTART) LD BC,(PGMCNT) CALL COMPAR JR NZ,NOGOOD ;IF NOT EQUAL THEN DISPLAY DATA LD HL,OKMSG ;ELSE OU****************** READ: LD DE,PROMSIZ ;IF TOO MANY BYTES THEN EXIT LD HL,(PGMCNT) LD A,H OR L JP Z,TOOBIG EX DE,HL ADDR ; EXIT - A= PROM DATA ; ;++++++++++++++++++++++++++++++++++++++ GETDATA: LD A,IDLE ;SELECT PROM DATA OUT (PRMCMD) P$1.HEX M1200,1700,100 G0 SAVE 5 P$1.OV ERA P$1.HEX ********************************* ; ; MULTI SPACE SUBR OUTPUTS <= 127D SPACES ; ENTRY- C= # SPACES ; EXIT - ZF SET ;  ; NZ = WILDCARD(S) USED, A REG. = NUMBER OF ; WILDCARDS ; ;*****************************************EC BC LD A,C OR B JP NZ,PRGNXT ENDIF ;---------------------------------------------------------- ; PROGRAM DONE,R ;---------------------------------------------------------------------------- ; PROM COMPARED BADLY, OUTPUT PROM ADDR, BOM DATA CALL EDITOR POP DE ;PROM ADDR CALL GETDATA CALL PRTHEX LD HL,SBM ;OUTPUT MEMORY DATA CALL EDITOR POP H HL= MEMORY PTR ; BC= COUNT ; EXIT - DE= PROM BYTE +1 PTR ; HL= MEMORY BYTE +1 PTR ; BC= 0 IF ALL OK ; ZF= ALL OK ; **************************** ; ; COMPARE PROM TO MEMORY SUBROUTINE CODE: ; ENTRY- CSTART = START ADDR PTR TO CODE TO COMPARE TPUT OK MESSAGE JP EDITOR ;*************************************************************************** ; ; READ PROM IN OR A SBC HL,DE JP C,TOOBIG LD HL,(CSTART) ;SET UP PTRS LD DE,(PSTART) LD BC,(PGMCNT) ;SET UP COUNT READLP: CA,A IF PROMTYPE = 8764 LD A,E ;SET ADDRESS OUT (PADDRL),A LD A,D AND 11110000B ;SHIFT A12..A14 OVER TO COMPENSATE ************************************** ; ; CARRIAGE RETURN/LINE FEED SUBR ; EXIT - ALL REGS ? ; ;************************TR ; ALL OTHER REGS ? ; ;******************************************************************** EDITOR: PUSH HL EDITLP: POP  ;************************************************ MLTSPC: LD B,C RES 7,B LD C,' ' SPLP: PUSH BC ;SAVE CNT CALL CONOUT ***************** ; ; CONSTANTS ; ZROSIZ: EQU 22 NAMCNT: EQU 8 ;FILENAME CHAR CNT TYPCNT: EQU 3 ;FILE EXTENSION CHAR C SO REMOVE PROGRAM VOLTAGE & CHECK DATA ;---------------------------------------------------------- LD A,IDLE ;REMOVE PROGRAAD & GOOD DATA & PROGRAMMABILITY. ;---------------------------------------------------------------------------- NOGOOD: PUSH AL ;MEM ADDR LD A,(HL) CALL PRTHEX POP AF ;IF ABLE TO PROGRAM THEN END LINE & RETURN LD HL,ENDMSG IF EDATA = 0 CF= NOT PROGRAMMABLE ; ;++++++++++++++++++++++++++++++++++++++++++++++++ COMPAR: CALL GETDATA ;IF SRC <> DEST THEN RETURN  ; PGMCNT = NUMBER OF BYTES TO COMPARE ; PSTART = START OFFSET ADDR IN PROM ; INCR = VALUE TO ADD TO CODE PTR AFTER EACH BYTO MEMORY BUFFER SUBROUTINE CODE: ; ENTRY- CSTART = START ADDR PTR TO MEMORY BUFFER ; PGMCNT = NUMBER OF BYTES TO READ INTO MLL GETDATA LD (HL),A INC DE LD A,(INCR) ;MEMORY PTR += INCREMENT ADD A,L LD L,A JP NC,DOK INC H DOK: DEC BCHDW ADD A,D OUT (PADDRH),A ELSE LD A,E ;OUTPUT PROM ADDR OUT (PADDRL),A LD A,D OUT (PADDRH),A ENDIF IN ************** CRLF: LD C,CR CALL CONOUT LD C,LF JP CONOUT ;********************************************************HL LD A,(HL) ;GET CHAR INC HL OR A RET Z PUSH HL LD C,A ;IF CHAR >= 80H THEN SPACES CALL M,MLTSPC JR Z,EDITLP  POP BC DJNZ SPLP XOR A RET ;********************************************************** ; ; CP/M FILE CONTROL BLNT ; FORMAT: PUSH HL ;SAVE FPB PTR IN IY POP IY LD HL,(CMDPTR) CALL SKIP ;SKIP LEADING SPACES LD (CMDPTR),HL ;SAVE N CR CHAR IS OUTPUT AS ; CR-LF PAIR & ALL OTHER CHARS ARE OUTPUT AS IS. ; ENTRY- BC = STRING PTR ; EXIT - HL= END OF STRING P 0 !%)- "*. #'+/  $(,0& TITLE EPROM OVERLAY FOR PROM III LIST NOCOND ;****************************************************************************  & Copy vectors and associated variables for ; programming EPROMs. ; ;******************************************************* skip value, added I/O vector locations. ; ; 1.3 - 28 NOV 84 GRH ; Changed include definition file name. Added borders to cOM which uses +12.5 volts as programming ; voltage. ; ; 1.5 - 28 APR 85 GRH ; Revised to allow Assembler invocation of ORG=NNNN' ELSE OVLBFR EQU 1200H ;START OF OVERLAY AREA ORG OVLBFR ENDIF CR EQU 0DH ; ;*INCLUDE PROMIII.DEF ;INCLUTA VALUE PGMLPS EQU 100 ;LOOP COUNT TO PROGRAM (SEE 2708 DATA MANUAL) DELAY EQU 17 ;DELAY TO PROGRAM PULSE (10us) RATE EQU ATA VALUE PGMLPS EQU 1 DELAY EQU 1 ;DELAY TO PROGRAM PULSE (2us) RATE EQU 10 ;RATE FOR PULSE WIDTH (200KHZ,5us) WIDTH EQU LAY TO PROGRAM PULSE (2us) RATE EQU 10 ;RATE FOR PULSE WIDTH (200KHZ,5us) WIDTH EQU 10000 ;PULSE WIDTH OF 50ms LOVOLT EQU 0 ;RATE FOR PULSE WIDTH (200KHZ,5us) WIDTH EQU 10000 ;PULSE WIDTH OF 50ms LOVOLT EQU 0ADH ;D/A OUTPUT FOR 20.5V HIVOLT EQU 0WIDTH EQU 10000 ;PULSE WIDTH OF 50ms LOVOLT EQU 0ADH ;D/A OUTPUT FOR 20.5V HIVOLT EQU 0B6H ;D/A OUTPUT FOR 21.5V TYPSEL EQms LOVOLT EQU 0ADH ;D/A OUTPUT FOR 20.5V HIVOLT EQU 0B6H ;D/A OUTPUT FOR 21.5V TYPSEL EQU NOT 4 ;CONFIGURATOR TYPE CODE SEPUT FOR 24V HIVOLT EQU 0DCH ;D/A OUTPUT FOR 26V TYPSEL EQU NOT 4 ;CONFIGURATOR TYPE CODE SELECT ADDRESS TYPCOD EQU 6 ;PROM; ; EPROM OVERLAY FOR 'PROM' PROGRAM ; COPYRIGHT (c) 1981,1982,1983 GRH ENTERPRISES, CUPERTINO, CA ; BY GIRVIN HERR ; ;*********************** ; ; Revision status: ; ; 1.0 - 14 jun 81 ; Release ; ; 1.1 - ; Added PROM0 entry at table area soomment ; headers. Added 27128 prom type. ; ; 1.4 - 21 JAN 85 GRH ; Revised code for MCM68764/66 EPROM. ; Revised configur using 'HEX=nnnn' ; directive. ; Re-org to allow for increased size of main program due to added ; SEarch and Compare BuffeDE THE HARDWARE CONSTANTS (PROM III) ; LIST OFF *INCLUDE PROMIII.DEF LIST ON ;============================ ; ; PROM2 ;RATE FOR PULSE WIDTH (1MHZ) WIDTH EQU 1000 ;PULSE WIDTH OF 1ms LOVOLT EQU 0D3H ;D/A OUTPUT FOR 25V HIVOLT EQU 0E5H ;D/10000 ;PULSE WIDTH OF 50ms LOVOLT EQU 0CBH ;D/A OUTPUT FOR 24V HIVOLT EQU 0DCH ;D/A OUTPUT FOR 26V TYPSEL EQU NOT 4 ;CONFCBH ;D/A OUTPUT FOR 24V HIVOLT EQU 0DCH ;D/A OUTPUT FOR 26V TYPSEL EQU NOT 4 ;CONFIGURATOR TYPE CODE SELECT ADDRESS TYPCODB6H ;D/A OUTPUT FOR 21.5V TYPSEL EQU NOT 4 ;CONFIGURATOR TYPE CODE SELECT ADDRESS TYPCOD EQU 3 ;PROM CONFIGURATOR TYPE CODELECT ADDRESS TYPCOD EQU 4 ;PROM CONFIGURATOR TYPE CODE PTYPE EQU 2 ENDIF IF PROMTYPE = 8764 ;MOTOROLA MCM68764/MCM68 CONFIGURATOR TYPE CODE PTYPE EQU 3 ENDIF IDLE EQU 0 ;RETURN PROM II HARDWARE TO IDLE STATE VON EQU 1 SHL PVO ;PROGRA************************************************************************** ; ; This module supports all code required to inter main program knows where proms ; are at for the CoPy command. ; Added code to output bad address as prom relative rather thanator type code to allow more than 7 types using ; A10, A11, A13, A14 & A15 as select bits. NOTE: do NOT use 7 as a ; type codr commands. ; VERS EQU '15' ; ;**************************************************************************** SUBTTL OVERLAY DECLARATIONS ; ;============================ SPCLFLG DL FALSE ;ASSUME NO SPECIAL CODE WHATYPE ;INCLUDE PROM TYPE MACRO A OUTPUT FOR 27V TYPSEL EQU NOT 4 ;CONFIGURATOR TYPE CODE SELECT ADDRESS TYPCOD EQU 0 ;PROM CONFIGURATOR TYPE CODE PTYPE EQIGURATOR TYPE CODE SELECT ADDRESS TYPCOD EQU 1 ;PROM CONFIGURATOR TYPE CODE PTYPE EQU 2 ENDIF IF PROMTYPE = 2732 ;IN EQU 2 ;PROM CONFIGURATOR TYPE CODE PTYPE EQU 2 ENDIF IF PROMTYPE = 2733 ;INTEL 2732A TYPE PROMSIZ EQU 4096 ;SIZE O PTYPE EQU 2 ENDIF IF PROMTYPE = 2764 ;INTEL 2764 TYPE PROMSIZ EQU 8192 ;SIZE OF THIS PROM IN WORDS EDATA EQU 0FFH PE = 2712 ;INTEL 27128 TYPE PROMSIZ EQU 16384 ;SIZE OF THIS PROM IN WORDS EDATA EQU 0FFH ;ERASED DATA VALUE PGMLPS EQU 1 766 TYPE PROMSIZ EQU 8192 ;SIZE OF THIS PROM IN WORDS EDATA EQU 0FFH ;ERASED DATA VALUE PGMLPS EQU 25 DELAY EQU 1 ;DELAY M VOLTAGE TURN ON BYTE GETSET EQU 1 SHL PPG + VON PROGM EQU 1 SHL PPS + GETSET ;PROGRAM START BYTE TO CMD REG PGMSTP EQU GETSface the 'PROM III' ; prom programmer card hardware to the 'PROM' utility kernel program. These ; include the Program, Compare memory ; relative. ; ; 1.2 - 18 Jan 83 ; Changed to conform to new version 1.2 of PROM utility. ; Added copy vector, addede as this is reserved for no configurator installed, as well ; as masking the select bit encoding. ; Anticipate the I2764A EPR DECLARATIONS FALSE EQU 0 TRUE EQU NOT FALSE IF VERS >= '15' OVLBFR EQU $ ;'$' SET BY INVOCING ASSEMBLER WITH 'HEXFROM COMMAND LINE IF PROMTYPE = 2708 ;INTEL 2708 PROMSIZ EQU 1024 ;SIZE OF THIS PROM IN WORDS EDATA EQU 0FFH ;ERASED DAU 1 ENDIF IF PROMTYPE = 2716 ;INTEL 2716 TYPE PROMSIZ EQU 2048 ;SIZE OF THIS PROM IN WORDS EDATA EQU 0FFH ;ERASED DTEL 2732 TYPE PROMSIZ EQU 4096 ;SIZE OF THIS PROM IN WORDS EDATA EQU 0FFH ;ERASED DATA VALUE PGMLPS EQU 1 DELAY EQU 1 ;DEF THIS PROM IN WORDS EDATA EQU 0FFH ;ERASED DATA VALUE PGMLPS EQU 1 DELAY EQU 1 ;DELAY TO PROGRAM PULSE (2us) RATE EQU 10  ;ERASED DATA VALUE PGMLPS EQU 1 DELAY EQU 1 ;DELAY TO PROGRAM PULSE (2us) RATE EQU 10 ;RATE FOR PULSE WIDTH (200KHZ,5us) DELAY EQU 1 ;DELAY TO PROGRAM PULSE (2us) RATE EQU 10 ;RATE FOR PULSE WIDTH (200KHZ,5us) WIDTH EQU 10000 ;PULSE WIDTH OF 50TO PROGRAM PULSE (2us) RATE EQU 2 ;RATE FOR PULSE WIDTH (1MHZ) WIDTH EQU 2000 ;PULSE WIDTH OF 2ms LOVOLT EQU 0CBH ;D/A OUTET ;PROGRAM STOP BYTE TO CMD REG STCONV EQU 1 SHL PSCV + VON ;START CONVERT BYTE ;========================================U NOT 4 ;CONFIGURATOR TYPE CODE SELECT ADDRESS TYPCOD EQU 4 ;PROM CONFIGURATOR TYPE CODE PTYPE EQU 2 ENDIF IF PROMTY 0 !%)- "*. #'+/  $(,0&======== ; ; PROM OVERLAY LINKS TO SUBROUTINES ; ;================================================ EDITOR EQU OVLBFR - 15 ;D START AT EVEN PAGE BOUNDARY AND IT'S ; LOCATIONS SHOULD ALLWAYS BE CONSTANT. ; ;###########################################TORS ; ;**************************** PRGMV: JP PROG ;PROGRAM PROM FROM MEMORY SUBROUTINE VECTOR COMPV: JP COMP ;COMPARE PR----------------------------------- ;**************************************************************************** ; ; PRO OR A SBC HL,DE JR NC,COUNTOK TOOBIG: LD HL,TOOBGM ;OUTPUT PROM SIZE ERR JR EDITOR ;------------------------------ C,A AND PSTYPE CP TYPCOD JR Z,CONFOK LD HL,CONFM ;OUTPUT CONFIGURATOR ERROR JR EDITOR ;-------------------------AIN, DON'T TAKE USER'S WORD FOR IT ;-------------------------------------- ; ALL SEEMS OK, NOW SET UP TIMING ;----------- WIDTH OUT (PTMR2),A LD A,HIGH WIDTH OUT (PTMR2),A ;-------------------------------------------------------------------RALP JR ERASED ;IF ALL ERASED THEN GO ON ;----------------------------------------------------- ; NOT ERASED, CHECK I--------------------------------------- ERASED: LD A,VON ;TURN ON VOLTAGE OUT (PRMCMD),A LD BC,0 ;WAIT FOR ANALOG STUFFK LIMITS CP LOVOLT JR C,VOLTER CP HIVOLT + 1 JR C,VOLTOK VOLTER: LD HL,VERM PUSH AF ;SAVE A/D DATA CALL EDITORPUSH BC LD BC,(PGMCNT) ;PREPARE TO PROGRAM LD HL,(CSTART) LD DE,(PSTART) PRGNXT: CALL PUTDATA ;OUTPUT ADDRESS & DATA TTEXT OUTPUT TO CONSOLE SUBR CSTS EQU OVLBFR - 12 ;CONSOLE STATUS SUBR CONIN EQU OVLBFR - 9 ;CONSOLE INPUT SUBR CONOUT EQU OVL######################### PGMBFR: DW PGMEND ;DW PTR TO RAM BUFFER (AFTER OVERLAY) PROM0: DW 0 ;PTR TO START OF PROMS CSTARTOM TO MEMORY SUBROUTINE VECTOR READV: JP READ ;READ PROM INTO MEMORY SUBROUTINE VECTOR ;---------------------------------GRAM PROM SUBROUTINE CODE: ; ENTRY- CSTART = START ADDR PTR TO CODE TO PROGRAM ; PGMCNT = NUMBER OF BYTES TO PROGRAM ; PSTA---------------------------- ; COUNT <= PROM SIZE ; CHECK CONFIGURATOR TYPE CODE FOR CORRECT PROM TYPE ;------------------------------------------------------------ ; CONFIGURATOR IS CORRECT, NOW CHECK IF PROGRAM ENABLE SWITCH IS ON ;-------------------------------------- INHOK: LD A,PT0MOD ;PROGRAMMING PULSE DELAY (CNT * 0.5us + 1.5us) OUT (PTMRMD),A LD A,LOW --------- ; TIMING PROGRAMMED, CHECK IF PROM ERASED BEFORE TURNING ON HIGH VOLTAGE ;----------------------------------------F USER WANT'S TO TRY ANYWAY ;----------------------------------------------------- NTERASD: LD HL,NTERAM ;OUTPUT NOT ERASED  POP AF ;OUTPUT A/D DATA FOR DIAGNOSTICS JP PRTHEX ;--------------------------------- ; ALL SEEMS OK, SO PROGRAM PROMO PROGRAM LD A,PROGM ;PROGRAM BYTE OUT (PRMCMD),A PRGWT: IN A,(PRMST) ;WAIT UNTIL DONE AND PRMBSY JR NZ,PRGWT BFR - 6 ;CONSOLE OUTPUT SUBR PRTHEX EQU OVLBFR - 3 ;OUTPUT BYTE IN A REG TO CONSOLE SUBR SUBTTL OVERLAY CODE ;############: DW PGMEND ;DW PTR TO START OF CODE IN RAM PGMCNT: DW 1 ;WORD COUNT TO PROGRAM PSTART: DW 0 ;PROM START ADDR (OFFSET) SOC------------------------------------------ ; ; THE FOLLOWING CODE MAY VARY WITH THE WRITER'S DISCRETION, BUT ; PGMEND SHOULD RT = START OFFSET ADDR IN PROM ; INCR = VALUE TO ADD TO CODE PTR AFTER EACH BYTE IS PROGRAMMED ; ;**************************----------------------------------------- COUNTOK: IF PROMTYPE = 2708 LD (PADING),HL ;SAVE REMAINDER AS PADDING COUNT --------------------------------------------------------- CONFOK: LD A,C ;RESTORE STATUS AND PRMINH ;IF INHIBIT SWITCH ON TDELAY OUT (PTMR0),A LD A,HIGH DELAY OUT (PTMR0),A LD A,PT1MOD ;PROGRAMMING PULSE GENERATOR RATE OUT (PTMRMD),A LD ------------------------------------ ERSCHK: LD BC,(PGMCNT) ;CHECK IF ERASED LD DE,(PSTART) ERALP: CALL GETDATA CP EDATAMESSAGE CALL EDITOR CALL CONIN ;GET USER INPUT AND 5FH ;CONVERT LC TO UC CP 'Y' RET NZ ;-------------------------PRMCMD),A RES PSCV,A OUT (PRMCMD),A LD B,0 ;SET UP TIMOUT EOCLP: IN A,(PRMST) ;WAIT FOR END OF CONVERT AND PRMEOC  ;--------------------------------- VOLTOK: LD A,GETSET ;APPLY PROGRAM VOLTAGE TO CHIP OUT (PRMCMD),A IF PTYPE = 1 LD A,PGMSTP ;TERMINATE PROGRAM CYCLE OUT (PRMCMD),A INC DE ;PROM ADDR ++ LD A,(INCR) ;ADD INCREMENT VALUE TO MEMORY P######################################################## ; ; PROM OVERLAY VARIABLES & VECTOR LOCATIONS ; THIS SECTION SHOULKET: DB 0 ;PROM SOCKET # INCR: DB 1 ;OVERLAY DATA PTR INCREMENT COUNT ;**************************** ; ; MAIN ENTRY VECALLWAYS BE THE LAST BYTE & SHOULD START ON AN EVEN 16 BYTE ; ADDRESS (I.E. XXX0H) ; ;----------------------------------------************************************************** PROG: LD DE,PROMSIZ ;IF TOO MANY BYTES THEN EXIT LD HL,(PGMCNT) EX DE,HL ENDIF STCHK: LD A,TYPSEL ;SELECT TYPE CODE ADDRESS OUT (PADDRH),A IN A,(PRMST) ;IF CONFIGURATOR NOT CORRECT THEN EXIT LDHEN ERR JR NZ,INHOK LD HL,INHM ;OUTPUT INHIBIT SWITCH MSG CALL EDITOR CALL CONIN ;WAIT FOR KEY JR STCHK ;CHECK AGA,LOW RATE OUT (PTMR1),A LD A,HIGH RATE OUT (PTMR1),A LD A,PT2MOD ;PROGRAMMING PULSE WIDTH OUT (PTMRMD),A LD A,LOW ;IF NOT ERASED THEN PROMPT JR NZ,NTERASD INC DE ;ELSE BUMP PTR & CHECK NEXT LOCATION DEC BC LD A,C OR B JR NZ,E-------------------------------------- ; PROM IS ERASED, NOW CHECK FOR CORRECT PROGRAMMING VOLTAGE ;------------------------JR Z,GOTEOC DJNZ EOCLP ;IF TIMOUT THEN OUTPUT ERR LD HL,EOCERM JP EDITOR GOTEOC: IN A,(PADDAT) ;GET VOLTAGE & CHEC;--------------------------------- ; 2708 CODE ;--------------------------------- LD BC,PGMLPS ;SET UP LOOP COUNT NXTLP: TR ADD A,L LD L,A JP NC,HOK INC H HOK: DEC BC ;IF COUNT-- = 0 THEN STOP ELSE NEXT WORD LD A,C OR B JP NZ,PRG TO SETTLE TWIDDL: EX (SP),HL EX (SP),HL DEC BC LD A,C OR B JR NZ,TWIDDL LD A,STCONV ;ISSUE START CONVERT OUT ( 0 !%)- "*. #'+/  $(,0&NXT ;--------------------------------------------------------------------------- ; OUTPUT PADDING BYTES TO END OF PROM TO ND PRMBSY JR NZ,PRGWT2 LD A,PGMSTP ;STOP PROGRAM CYCLE OUT (PRMCMD),A INC DE ;PROM PTR++ DEC BC ;COUNT-- JP PA-------------------- LD BC,(PGMCNT) ;PREPARE TO PROGRAM LD HL,(CSTART) LD DE,(PSTART) PRGNXT: CALL PUTDATA ;OUTPUT DATC BC ;IF COUNT-- = 0 THEN STOP ELSE NEXT WORD LD A,C OR B JP NZ,PRGNXT ENDIF IF PTYPE = 3 ;-------------------c Prom Programmer UtilityVer 1.3 Copyright (c) 1981,'82,'83 GRH Enterprises Cupertino, CA 1*+"i!g !N˹y(J_*ڋg*ڋo"}*{"K KiB8Bd8Z: *8O_*8Eg*8?oK}B8?K{ "K KiB*8 %**8w# g! ڳ"g*c! "c*e! "e[cR[gR8*cy*g *ey*- "*">2 t 8/! ڳ"t #[m{ z ̓ *- ! ڳ"q] [R^  c  K *U [q(~.- |}[qc* *e???x O͞8xx O͞ Yy( :sO:s2s ~ȹ(;#~ #    ~#O ( ] (  s#r#*c! "c*e! "e:j=[ؼ>2v! T8))))o:v<2v:v ,ȷ7|c }h x O  8 File Empty! HElp | NEw REad addr d:file | SAve first, last HEX d:file FIll fiCONFORM TO PROGRAMMING SPECS ;--------------------------------------------------------------------------- LD BC,(PADING) ;NOWDLP ;------------------------------------------------ ; PADDING DONE, NOW LOOP AGAIN UNTIL ALL DONE ;--------------------A & ADDRESS CP EDATA ;IF DATA = ERASED DATA THEN SKIP PROGRAM JP Z,SKIP LD A,PROGM ;PROGRAM BYTE OUT (PRMCMD),A ------------------- ; 68764/68766 ;-------------------------------------- LD BC,(PGMCNT) ;FETCH PARAMETERS LD HL,(CSTART#!"*U ~*(v!͐ 8* (!+>P!OV"> 2< < ! g ! g K f 8(! g *}( }o>g"m*8,! g ! ! ! c* *e[cR#"g! "c* G U " G U "!͐ < 8}<(2 (&o[͌ {(#"*~!(Mͻ  ڳ*c"*eR#"*g"t >2 8}<(2 (&o[͌ {(#"[cR! "e! "cg Sg8}<, last> | SUbstitute addr CHecksum first, last | REWFINEQMODIpSUPRSAHE?HCPCHoCOSEXg @ 5  c  OUTPUT PADDING BYTES PADLP: LD A,C ;IF PADDING = 0 THEN EXIT OR B JR Z,PADDON CALL PUTDATA ;ELSE PROGRAM TO ERASED D---------------------------- PADDON: POP BC ;IF LOOPS <> 0 THEN DO AGAIN DEC BC LD A,C OR B JP NZ,NXTLP ENDIF  PRGWT: IN A,(PRMST) ;WAIT UNTIL DONE AND PRMBSY JR NZ,PRGWT LD A,PGMSTP ;TERMINATE PROGRAM CYCLE OUT (PRMCMD),A SK) LD DE,(PSTART) PRGNXT: PUSH BC LD B,PGMLPS ;SET UP COUNT ILOOP: CALL PUTDATA CP EDATA ;IF DATA == ERASED THEN S"o !5 g ] * K *U ("^#V!F#~ #~ #^#V* G U "###Í>2w*- ! ڳ"c* G U " <(! g 5 Y(y>2x!"y*c:͞ڿ*g}BA"g0G!"gx(Q8_[R|8N}8H8B~ ! g *~!(Nͻ  ڳ*e[cR#"S*g"t >2 8}<(2 (&o[͌ {(#"*(~,( - - ^ ! g ~H#~E#~X#~ dT8''''GdT8GWx! g 70 ? ?:x‹F A 7 !#6S #~?  x!0!4 (#=_.:;,<>> #N˹#" 6CkF A : *rror, Probably Full! File Exists, Delete?..(Y/N) - *** Syntax Error ***...Type 'HElp' For List File Not Found Value Out ofCOpy count <, dest<, skip>> PRogram > ComPare ATA TO END OF PROM LD A,EDATA OUT (PDATA),A LD A,PROGM OUT (PRMCMD),A PRGWT2: IN A,(PRMST) ;WAIT UNTIL CYCLE DONE A IF PTYPE = 2 ;------------------------------------------- ; STANDARD INTEL TYPE PROGRAMMING CODE ;-----------------------IP: INC DE ;PROM ADDR ++ LD A,(INCR) ;ADD INCREMENT VALUE TO MEMORY PTR ADD A,L LD L,A JP NC,HOK INC H HOK: DEKIP PROGRAM JP Z,SKIP LD A,PROGM ;PROGRAM BYTE OUT (PRMCMD),A PRGWT: IN A,PRMST ;WAIT UNTIL DONE AND PRMBSY JR •>2w* G "!͐ < < !c g !s g Kc:w(f 8 ! g ! g 2x*c"{dڞ: *ڋ8<#82 ͞8+ ͞8$*g}4:͞88 8! g ͻ  ڳ[c*eRy:g*cwͻ *! "m*>,(OG *m}o#U "- ! "o] @ *m"q[R^ *m ~#c ̓ 8} "m *q~0 0>.O"y>2x*y~#"y!x5*yq#"y:x<2x?SyF  2x7͞:x( !<7GWx?|(![kSk[kF A *k"k:j=Ö *U 7"- c *,G 7#U 7"-  *,G 7#U 7"-  Bounds Memory Error Hex File Error Hex Conversion Error Illegal Hex Load Address Regression! Illegal Hex Record Type! Hex> CTRL-C or EXit To Exit to CP/M REWFINEQMODIpSUPRSAHE?HCPCHoCOSEXWITCH THEN BRANCH AND DATASW JP NZ,PRDB LD A,(OP) AND 0FH CP 8 ;IF < 8 THEN USE ZOO JP C,ZOO JP REGULAR ;ELSE US0*oRBK>){_zW({z }o{_zW=Ô Prom Overlay Not Found Enter Prom Type - Disk Read Error Disk Write E 0 !%)- "*. #'+/  $(,0& SUBTTL PROM PROGRAMMER II DEFINITIONS ;******************************************************************** ; ; PROM PROGRAM D7 D0 ;PADDRL |A7 |A6 |A5 |A4 |A3 |A2 |A1 |A0 | ;PADDRH |A15|A14|A13|A12|A11|A10|A9 |A8 | ; ;---------------------- APPEARS ON THE BUS, ELSE THE PROM DATA REGISTER DATA APPEARS ON ; THE BUS. ; ;---------------------------------------------CH (0: INHIBITED) ; | |_____________________________ 0: A/D EOC, 1: A/D BUSY ; |_________________________________ 0: PRO00B ;A/D END OF CONVERT STATUS BIT 0= DONE PRMBSY EQU 10000000B ;PROGRAMMING BUSY BIT, 0= DONE ;----------------------------S A/D CONVERSION ; | |_____________________________ 0: DISABLE, 1: ENABLE AUTO-INC ; |_________________________________ WN * (MUST BE '1' TO ENABLE AUTO-INC) PAI EQU 7 ;AUTO INCREMENT ENABLE (INCS ON - EDGE OF PPS) ;---------------------------COUNT ;--------------------------------------------------------------------------- ; ; TIMER 1 CONTROLS THE TIMER 2 RATE INWITH TIMER 1 AS ABOVE. ; THE PULSE WIDTH IS DETERMINED BY N * CNTR1 N * 1 us WHERE N IS THE ; PROGRAMMED COUNT FOR TIMER 2 &^____ 0: BINARY, 1: BCD COUNTING ; | | |____________ MODE (0..5) ; | |______________________ READ/LOAD  3, SQUARE WAVE RATE GENERATOR TMRM4 EQU 8 ;MODE 4, SOFTWARE TRIGGERED STROBE TMRM5 EQU 0AH ;MODE 5, HARDWARE TRIGGERED STROR, BINARY PT2MOD EQU TMR16B + TMRM1 + TMR2S ;TIMER 2, ONE-SHOT, BINARY ;----------------------------------------------------MER III ; RESERVES 8 PORTS ON ANY 8 PORT EVEN BOUNDARY (X0..X7,X8..XF) ; ; REVISIONS: ; 1.0 - 23 OCT 83 GRH ; SPLIT OFF ----------------------------------------------------- PADDRL EQU PBASE ;ADDRESS REGISTER LOW BYTE (WRITE ONLY) PADDRH EQU PBA------------------------------ PDATA EQU PBASE + 2 ;PROM DATA REGISTER LOAD ;-----------------------------------------------GRAMMER IN CYCLE, 0: DONE ; ;---------------------------------------------------------------------------- PRMST EQU PBASE + 3----------------------------------------------- ; ; PROM BURNER COMMAND REGISTER ; D7 D0 ; |PAI|PCD|PSC| X | X |PVO0: DISABLE, 1: ENABLE AUTO-INC ; ;---------------------------------------------------------------------------- PRMCMD EQU PBA------------------------------------------------ ; ; TIMER 0 CONTROLS THE DELAY TIME FROM PROGRAM START (PPS) UNTIL ; THE LEPUT BY DIVIDING THE 2 MHZ BUS ; CLOCK BY N. THIS WORKS OUT TO N * 1us WHERE N IS THE PROGRAMMED COUNT. ; ;------------------ CNTR1 N IS THE PROGRAMMED COUNT FOR TIMER 1. ; ;---------------------------------------------------------------------------- BE TMRLAT EQU 0 ;LATCHED READ TMRMSB EQU 20H ;ACCESS MOST SIG. BYTE TMRLSB EQU 10H ;ACCESS LEAST SIG. BYTE TMR16B EQU 30H------------------------ ; ; A/D DATA ; ;---------------------------------------------------------------------------- PADDAFROM SYSPARAM.INC ; ;******************************************************************** PBASE EQU 0D0H ;BASE ADDRESS OF PRSE + 1 ;ADDRESS REGISTER HIGH BYTE (WRITE ONLY) ;--------------------------------------------------------------------------- ---------------------------- ; ; PROM BURNER STATUS ; D7 D0 ; |BSY|EOC|INH| 0 | 0 |T2 |T1 |T0 | ; ^ ^ ^  PSTYPE EQU 00000111B ;PROM CONFIGURATOR TYPE MASK PRMT0 EQU 0 ;2708 (T-I 3 VOLT.) GENERIC TYPE (1us PULSE) PRMT1 EQU 1 ;|PPG|PPS| ; ^ ^ ^ ^ ^ ^_____ + EDGE STARTS PROGRAM CYCLE ; | | | | |_________ 1: SETS UP LOGIC FSE + 3 ;PROM BURNER COMMAND REGISTER ; PRMCMD BIT #S PPS EQU 0 ;PROGRAM START (STARTS ON + EDGE) PPG EQU 1 ;PROGRAM GAADING EDGE OF THE PROGRAM PULSE. WITH A 2 MHZ BUS CLOCK, THIS ; WORKS OUT TO N * 0.5us WHERE N IS THE PROGRAMMED COUNT. ; ;---------------------------------------------------------- PTMR1 EQU PBASE + 5 ;8253 TIMER 1 (PGM PULSE CLOCK RATE) COUNT ;-- PTMR2 EQU PBASE + 6 ;8253 TIMER 2 (PGM PULSE LENGTH) COUNT ;----------------------------------------------------------------------------- PTMRMD EQU PBASE + 7 ;8253 TIMER MODE WORD (COMMAND) ; TIMER MODE CONSTANTS TMRBCD EQU 1 ;BCD COUNT MASK  ;ACCESS LEAST SIG. BYTE, THEN MOST SIG. BYTE TMR0S EQU 0 ;ACCESS TIMER 0 TMR1S EQU 40H ;ACCESS TIMER 1 TMR2S EQU 80H ;ACT EQU PBASE + 7 ;A/D DATA OM BURNER CARD ;---------------------------------------------------------------------------- ; ; PROM ADDRESS REGISTERS ;  ; ; PROM DATA/ PROM DATA REGISTER READ ; ; NOTE: WHEN READING PROM DATA, IF PGATE BIT OF PRMCMD IS 0, THEN THE ; PROM DATA \_________/ ; | | | |_________ PROM TYPE CODE (FROM CONFIG.) ; | | |_________________________ INHIBIT SWIT2716 (INTEL 5V) GENERIC TYPE (50ms PULSE) PRMINH EQU 00100000B ;INHIBIT SWITCH MASK 0= INHIBIT ON, 1= PRIMED PRMEOC EQU 010000OR PGM CYCLE ; | | | |_____________ 0: DISABLES, 1: ENABLES HV ; | | |_________________________ - EDGE STARTTE (SETS UP FOR PROGRAMMING) PVO EQU 2 ;PROGRAM VOLTAGE ON GATE PSCV EQU 5 ;START CONVERT PULSE TO A/D PCD EQU 6 ;COUNT DO-------------------------------------------------------------------------- PTMR0 EQU PBASE + 4 ;8253 TIMER 0 (PGM PULSE DELAY) -------------------------------------------------------------------------- ; ; TIMER 2 CONTROLS THE PROGRAM PULSE WIDTH ALONG ------------ ; ; 8253 TIMER MODE WORD ; D7 D0 ; |SC1|SC0|RL1|RL0|M2 |M1 |M0 |BCD| ; \_____/ \_____/ \_________/  TMRM0 EQU 0 ;MODE 0, INTERRUPT ON TC TMRM1 EQU 2 ;MODE 1, ONE SHOT TMRM2 EQU 4 ;MODE 2, RATE GENERATOR TMRM3 EQU 6 ;MODECESS TIMER 2 PT0MOD EQU TMR16B + TMRM1 ;TIMER 0, ONE-SHOT, BINARY PT1MOD EQU TMR16B + TMRM2 + TMR1S ;TIMER 1, RATE GENERATO,ORLD1 CP 3 JP Z,PRDB JP C,ORLD2 ;IF < 3 THEN EXIT LD HL,ORLDM JP ATOP ORLDM: DM 'ORLD' ORLD1: LD HL,ORLM OBUS; |______________________________ COUNTER SELECT (0..2) ; ;--------------------------------------------------------------- 0 !%)- "*. #'+/  $(,0&WHATYPE MACRO PROMTYPE EQU 2712 ENDM  & Copy vectors and associated variables for ; programming EPROMs. ; ;******************************************************* skip value, added I/O vector locations. ; ; 1.3 - 28 NOV 84 GRH ; Changed include definition file name. Added borders to c=== ; ; PROM DECLARATIONS ; ;============================ WHATYPE ;INCLUDE PROM TYPE MACRO FROM COMMAND LINE IF PROMTWHATYPE MACRO PROMTYPE EQU 8764 ENDM  & Copy vectors and associated variables for ; programming EPROMs. ; ;******************************************************* skip value, added I/O vector locations. ; ; 1.3 - 28 NOV 84 GRH ; Changed include definition file name. Added borders to cWARE CONSTANTS (PROM III) ; LIST OFF *INCLUDE PROMIII.DEF LIST ON ;============================ ; ; PROM DECLARATIO!͂;A̓!́! 9!|!́!"7! *7#"7+ qP7ͱ*7u*7+ qP7~9!é!t7r vers %-.2f Ready printer then Enter up to 3 text lines (null line terminates less than 3 lines) Enter number of labels (0.o&|o&z27:7||)/g}/o#z7/W{/_7DM!>27))J#}o|gb :7=27B}:7=27B}DM!>))ҁ#w*;~G#~@##~#!*;F!*;w#@w#6#wT#6S *;~G#~@##~y; ; EPROM OVERLAY FOR 'PROM' PROGRAM ; COPYRIGHT (c) 1981,1982,1983 GRH ENTERPRISES, CUPERTINO, CA ; BY GIRVIN HERR ; ;*********************** ; ; Revision status: ; ; 1.0 - 14 jun 81 ; Release ; ; 1.1 - ; Added PROM0 entry at table area soomment ; headers. ; VERS EQU '13' ; ;**************************************************************************** SUBTTL YPE = 2708 PROMSIZ EQU 1024 ;SIZE OF THIS PROM IN WORDS EDATA EQU 0FFH ;ERASED DATA VALUE PGMLPS EQU 100 ;LOOP COUNT TO PR; ; EPROM OVERLAY FOR 'PROM' PROGRAM ; COPYRIGHT (c) 1981,1982,1983 GRH ENTERPRISES, CUPERTINO, CA ; BY GIRVIN HERR ; ;*********************** ; ; Revision status: ; ; 1.0 - 14 jun 81 ; Release ; ; 1.1 - ; Added PROM0 entry at table area soomment ; headers. Added 27128 prom type. ; ; 1.4 - 21 JAN 85 GRH ; Added special code macro for MCM68764/66 EPROM. ; VERNS ; ;============================ SPCLFLG DL FALSE ;ASSUME NO SPECIAL CODE WHATYPE ;INCLUDE PROM TYPE MACRO FROM COMMAN6 1"7*7-u!!7"?o&}|>o&{_|g}oB|g}o~# xW!97~#n!{|ɧ =ɯ<*;*;$# #0*;~w*; w#S*; w#b*;*;#y/<+";"face the 'PROM III' ; prom programmer card hardware to the 'PROM' utility kernel program. These ; include the Program, Compare memory ; relative. ; ; 1.2 - 18 Jan 83 ; Changed to conform to new version 1.2 of PROM utility. ; Added copy vector, addedIII.DEF ;INCLUDE THE HARDWARE CONSTANTS (PROM III) ; LIST OFF *INCLUDE PROMIII.DEF LIST ON ;=========================1000 ;PULSE WIDTH OF 1ms LOVOLT EQU 0D3H ;D/A OUTPUT FOR 25V HIVOLT EQU 0E5H ;D/A OUTPUT FOR 27V TYPCOD EQU 0 ENDIF IFface the 'PROM III' ; prom programmer card hardware to the 'PROM' utility kernel program. These ; include the Program, Compare memory ; relative. ; ; 1.2 - 18 Jan 83 ; Changed to conform to new version 1.2 of PROM utility. ; Added copy vector, addedE EQU 0 TRUE EQU NOT FALSE OVLBFR EQU 1000H ;START OF OVERLAY AREA CR EQU 0DH ; ;*INCLUDE PROMIII.DEF ;INCLUDE THE HARD ;LOOP COUNT TO PROGRAM (SEE 2708 DATA MANUAL) DELAY EQU 17 ;DELAY TO PROGRAM PULSE (10us) RATE EQU 2 ;RATE FOR PULSE WIDTH<ͤ\*7#"7+ʩ\Ñ!*<ͤ*<!́!t76^̓3Y!W$# Prom label printe^#V#DM!99`í|z27:7}7}}|!}|!}|}|?>o&zo&|}|>͂!q;"7! 9! 9^#V!#͂!9^#V"7! 9! 9^#V!#͂*7! 9^#VG*;*;w#@w#6#w; z O _"7! "7*7*7+° *7*7w+>w+ #~>>w+>*;wz .15) w%-11s Done. Any more? (Y/N) ͂!!9s!9s!!9s!9! !! !!!!9n&#s!9#s0 !%)- "*. #'+/  $(,0&NZ,PRGWT LD A,PGMSTP ;TERMINATE PROGRAM CYCLE OUT (PRMCMD),A DJNZ ILOOP SKIP: INC DE ;NEXT ADDRESS LD A,(INCR)M VOLTAGE FROM HARDWARE OUT (PRMCMD),A LD HL,(CSTART) ;SET UP PTRS LD DE,(PSTART) LD BC,(PGMCNT) ; & COUNT CALL COMPAF ;SAVE CARRY FOR ERASE PROMPT PUSH HL ;MEM ADDR PUSH DE ;PROM ADDR LD HL,DERRM CALL EDITOR POP DE ;PROM ADDR CCF ;REVERSE PROGRAMMABLE BIT SENSE IF DATA = 0 ENDIF JP NC,EDITOR LD HL,ERASM ;ELSE OUTPUT MUST ERASE MESSAGE JP qÇ *R0!;>O(!_y !~>2>>>t>>>>>K[͹  y s) not Programmable. Try erasing. Successful Program. OK Bytes requested exceeds prom size! Wrong configurator installed! T2?\(652?`($( $&2?#$($(%($&###2?d(##%(OM which uses +12.5 volts as programming ; voltage. ; VERS EQU '14' ; ;*****************************************************7*7+   z *;*;#O~? >2< ##a C q#6#62<á qj q+ 8~+t   |ʔ ' |ʔ z' /W{/_*;p#z> 6#6#sJ 6#6#r#s#wJ *; ~g +~w7+~wl z *;#~T *;6#6]T#w *;###~*;= >#, >z ~#= z *;T]w#w#w#w*;N#~ Ҏ G#op $~+p y *C~-@͊ ~*;###~ [ ͊[*;#~C##~ [ 1*;#~[͊ J!9~k*$8 "$8*$8+|z!ƃ} ;ADD INCREMENT VALUE TO MEMORY PTR ADD A,L LD L,A JP NC,HOK INC H HOK: POP BC ;IF COUNT EXHAUSTED THEN REPEAT DR ;COMPARE PROM TO MEMORY IMAGE JR NZ,NOGOOD ;IF NOT SAME THEN EXIT TO MESSAGE LD HL,SUCCM ;SUCCESSFUL PROGRAM JP EDITOLD A,D ;OUTPUT ERR ADDR PUSH DE ;PROM ADDR CALL PRTHEX POP DE PUSH DE LD A,E CALL PRTHEX LD HL,ISM ;OUTPUT PREDITOR ;++++++++++++++++++++++++++++++++++++++++++++++++ ; ; BYTE COMPARE SUBR ; ENTRY- DE= PROM PTR (?= (DE) - (HL)) ;!_Y> y >$˯@(!88 !>K*[> >: o$urn off Inhibit Switch & type any key - Hardware Error- No EOC! Program Voltage out of tolerance! : Prom not erased! Contin$&662?h(65%( $&W % %$& "$& /%(%%& - % %65$&H************************ SUBTTL OVERLAY DECLARATIONS FALSE EQU 0 TRUE EQU NOT FALSE OVLBFR EQU 1000H ;START OF OVERLAY ARE8~+† ! 8w#” >@28! 8~w#¥ O8!8#º y ! 84!85Ÿ !85 ! 8~w# O8!8# ;>w#‚ y 6#6#6#6 6#6#6#6 ù *;F#~ !  #o $^+Vy x |/g}/o# y ! xچ!)))4H-A ʻ! !9~ʻ*$8#"$8`i"&8!9~xy*!860#6.#:%8y/:#860#="!8>O:%83EC BC LD A,C OR B JP NZ,PRGNXT ENDIF ;---------------------------------------------------------- ; PROGRAM DONE,R ;---------------------------------------------------------------------------- ; PROM COMPARED BADLY, OUTPUT PROM ADDR, BOM DATA CALL EDITOR POP DE ;PROM ADDR CALL GETDATA CALL PRTHEX LD HL,SBM ;OUTPUT MEMORY DATA CALL EDITOR POP H HL= MEMORY PTR ; BC= COUNT ; EXIT - DE= PROM BYTE +1 PTR ; HL= MEMORY BYTE +1 PTR ; BC= 0 IF ALL OK ; ZF= ALL OK ;  y>*[K[ !"!z{!͹!~!!͹: oj$ y[*[K[ ue? (Y/N) - $H!!! BH" !I B  $$!BD! $!BI D@"!$I$$H"!Iator type code to allow more than 7 types using ; A10, A11, A13, A14 & A15 as select bits. NOTE: do NOT use 7 as a ; type codA CR EQU 0DH ; ;*INCLUDE PROMIII.DEF ;INCLUDE THE HARDWARE CONSTANTS (PROM III) ; LIST OFF *INCLUDE PROMIII.DEF LISy *; 6+6 8+w z *;*;#ʔ ~ʔ  8~+J  8~+\ ! 8w#j >@28! 8~w#<5 *;#6#w#6á >2<5 *;#6?#6>#w* #6*^;|R !9N#F*2<@@ @GzH? ěT?F]cf>S#>c{Z=ֿzf=y0==%}<6{<_^Y&; oP;4$C:$833*;#~>0##6*!8w#x*6.#"!8͊!9~w*!86e#6+:'8:&8R6-/<#d]61#d j _0_>0w#s#"!8*!86 SO REMOVE PROGRAM VOLTAGE & CHECK DATA ;---------------------------------------------------------- LD A,IDLE ;REMOVE PROGRAAD & GOOD DATA & PROGRAMMABILITY. ;---------------------------------------------------------------------------- NOGOOD: PUSH AL ;MEM ADDR LD A,(HL) CALL PRTHEX POP AF ;IF ABLE TO PROGRAM THEN END LINE & RETURN LD HL,ENDMSG IF EDATA = 0 CF= NOT PROGRAMMABLE ; ;++++++++++++++++++++++++++++++++++++++++++++++++ COMPAR: CALL GETDATA ;IF SRC <> DEST THEN RETURN !7 *|!R!*[K͹w: oҲ$ y¤>{z{z~ Data Error at Is: Should be: Bit($I$I$UUU$$A$ e as this is reserved for no configurator installed, as well ; as masking the select bit encoding. ; Anticipate the I2764A EPRT ON ;============================ ; ; PROM DECLARATIONS ; ;============================ SPCLFLG DL FALSE ;ASSUME NO S{ Ҧ  8!8# Ҧ š !85u *; 8 w+¹ z  !  !<      overflowã divide by zero at location 0x!9~ +~ ! 0: o&  o&;hIj:$_=ά3:VR8! 9^#V"!8!9B!9~<ڸ>2#8o&"$8*;~*!86-#"!8[-A *;#~T;##~'!  *;#4 ^&)DM)) #wz++—#wz ++~@ ͂!f;DM`i~`i DM;!! 9^#V#^!+]#O #© Š 2<*; w#6#w¡ >G +y>O~# ¹   @  >2< y!T]w+ 6 >20 !%)- "*. #'+/  $(,0& TITLE PROM BURNING UTILITY ;******************************************************** ; ; 'PROM' PROM BURNING PROGRAM 9 ck for MOve command. ; Added offset value output option. ; ; 1.2 - 30 dec 82..1 Jan 83 ; Changed Intel Hex read towhere applicable to allow odd/even programming for ; many 16 bit processors. ; Change syntax error output to arrow '^' typeand ; parameters after overlay load. ; ; 1.4 - 22 APR 85 GRH ; Added byte search command and memory buffer compare commandSUB (HL) RET NZ INC DE ;PTRS ++ LD A,(INCR) ;MEMORY PTR += INCREMENT ADD A,L LD L,A JP NC,CHOK INC H CHOK:TE IS COMPARED ; ;*************************************************************************** COMP: LD HL,(CSTART) ;SET UP FOEMORY ; INCR = VALUE TO ADD TO CODE PTR AFTER EACH BYTE IS READ ; ;********************************************************* LD A,C OR B JP NZ,READLP RET ;++++++++++++++++++++++++++++++++++++++ ; ; GET PROM DATA SUBR ; ENTRY- DE= PROMA,(PDATA) ;RETURN PROM DATA RET ;************************************** ; ; PUT PROM DATA SUBR ; ENTRY- DE= PROM ADDRE;############################ ; ; MESSAGES ; ;############################ DERRM: DB CR,'Data Error at ',0 ISM: DB ' Is: 'am Voltage out of tolerance! : ',0 NTERAM: DB CR,'Prom not erased! Continue? (Y/N) - ',0 IF PROMTYPE = 2708 ;#############embler main loop */ disassemble(){ char dump; bytecnt = 0; byt_cnt = 0; while (done == FALSE){ /* skip inNOV 80 ; ; Copyright (c) 1980,1981,1982,1983 GRH Electronics, Cupertino, CA ; by Girvin Herr ; ;********************* allow non-contiguous but not regressive ; records. I.e. no record's load address may be lower than the file's ; 1st rec pointer to error. ; Added undocumented '*' response to the prom query to get the user out ; of the prom request loop to al. ; REVSN: EQU '14' ; ;**************************************************************************** SUBTTL PROGRAM DESCRIP DEC BC ;IF --COUNT <> 0 THEN LOOP LD A,C OR B JP NZ,COMPAR RET ;***********************************************R COMPAR LD DE,(PSTART) LD BC,(PGMCNT) CALL COMPAR JR NZ,NOGOOD ;IF NOT EQUAL THEN DISPLAY DATA LD HL,OKMSG ;ELSE OU****************** READ: LD DE,PROMSIZ ;IF TOO MANY BYTES THEN EXIT LD HL,(PGMCNT) LD A,H OR L JP Z,TOOBIG EX DE,HL ADDR ; EXIT - A= PROM DATA ; ;++++++++++++++++++++++++++++++++++++++ GETDATA: LD A,IDLE ;SELECT PROM DATA OUT (PRMCMD)SS ; HL= MEMORY PTR ; ;************************************** PUTDATA: IF PROMTYPE = 8764 ;SPECIAL CASE LD A,E ;SET##### ; ; VARIABLES ; ;################## PADING: DW 0 ;NUMBER OF PADDING BYTES AT END OF PROM ENDIF DS ( -($ AND put until skipcount == 0 or start is matched */ if (endoffile == FALSE){ if ((pgmcounter < start) | ( skipcn*********************************** ; ; REVISION STATUS: ; 1.0 - 1980 ; Initial release ; ; 1.1 - 1981 ; Added ord's load address. ; Re-structured entire program to make it easier to write prom overlays ; Removed the SOcket & OFfset commlow for diagnostics. Note, the prom ; overlay vectors contain dummy returns, so they do nothing. ; ; 1.3 - 31 AUG 83 GRHTION ;**************************************************************************** ; ; This program simplifies the burning **************************** ; ; COMPARE PROM TO MEMORY SUBROUTINE CODE: ; ENTRY- CSTART = START ADDR PTR TO CODE TO COMPARE TPUT OK MESSAGE JP EDITOR ;*************************************************************************** ; ; READ PROM IN OR A SBC HL,DE JP C,TOOBIG LD HL,(CSTART) ;SET UP PTRS LD DE,(PSTART) LD BC,(PGMCNT) ;SET UP COUNT READLP: CA,A IF PROMTYPE = 8764 LD A,E ;SET ADDRESS OUT (PADDRL),A LD A,D AND 11110000B ;SHIFT A12..A14 OVER TO COMPENSATE  ADDRESS OUT (PADDRL),A LD A,D AND 11110000B ;SHIFT A12..A14 OVER TO COMPENSATE HDW ADD A,D OUT (PADDRH),A ELSE Program.',0 OKMSG: DB CR,'OK',0 TOOBGM: DB CR,'Bytes requested exceeds prom size!',0 CONFM: DB CR,'Wrong configurator install0FFH) AND 0FFH) PGMEND: EQU $ END t != 0)){ if (skipcnt == 0) pgmcounter ++; if (skipcnt != 0) skipcnt --; dump = fetch(); Intel Hex format file read option. ; Added copy command to read prom data into ram ; Removed source bounds cheands ; Added the NEw & SAve Intel Hex file commands ; Removed unused code & optimized some subroutines. ; Added skip options  ; Fix bug in command count EQU which allowed system to crash if ; illegal command entered. Add initialization of DIsplay commof proms by implementing the ; following commands: ; 1- Allows the loading of object files generated by the ; ASMZ a ; PGMCNT = NUMBER OF BYTES TO COMPARE ; PSTART = START OFFSET ADDR IN PROM ; INCR = VALUE TO ADD TO CODE PTR AFTER EACH BYTO MEMORY BUFFER SUBROUTINE CODE: ; ENTRY- CSTART = START ADDR PTR TO MEMORY BUFFER ; PGMCNT = NUMBER OF BYTES TO READ INTO MLL GETDATA LD (HL),A INC DE LD A,(INCR) ;MEMORY PTR += INCREMENT ADD A,L LD L,A JP NC,DOK INC H DOK: DEC BCHDW ADD A,D OUT (PADDRH),A ELSE LD A,E ;OUTPUT PROM ADDR OUT (PADDRL),A LD A,D OUT (PADDRH),A ENDIF IN  LD A,E ;SET ADDR OUT (PADDRL),A LD A,D OUT (PADDRH),A ENDIF LD A,(HL) ;OUTPUT DATA OUT (PDATA),A RET ed!',0 INHM: DB CR,'Turn off Inhibit Switch & type any key - ',0 EOCERM: DB CR,'Hardware Error- No EOC!',0 VERM: DB CR,'Progr */ switches = ctrl[ segment].switches; start = ctrl[ segment].low; stop = ctrl[ segment].high; } /* disass } /* if within range then disassemble */ else if (pgmcounter <= stop){ pgmcounter = pg,0 SBM: DB ' Should be: ',0 ENDMSG: DB CR,0 ERASM: DB CR,'Bit(s) not Programmable. Try erasing.',0 SUCCM: DB CR,'Successful 0 !%)- "*. #'+/  $(,0&A,(PDATA) ;RETURN PROM DATA RET ;************************************** ; ; PUT PROM DATA SUBR ; ENTRY- DE= PROM ADDRE;############################ ; ; MESSAGES ; ;############################ DERRM: DB CR,'Data Error at ',0 ISM: DB ' Is: 'am Voltage out of tolerance! : ',0 NTERAM: DB CR,'Prom not erased! Continue? (Y/N) - ',0 IF PROMTYPE = 2708 ;#############========================== ; ; PROM DECLARATIONS ; ;============================ WHATYPE ;INCLUDE PROM TYPE MACRO FROM PECIAL CODE WHATYPE ;INCLUDE PROM TYPE MACRO FROM COMMAND LINE IF PROMTYPE = 2708 ;INTEL 2708 PROMSIZ EQU 1024 ;SIZE COD EQU 0 ;PROM CONFIGURATOR TYPE CODE ENDIF IF PROMTYPE = 2716 ;INTEL 2716 TYPE PROMSIZ EQU 2048 ;SIZE OF THIS PROMIF PROMTYPE = 2732 ;INTEL 2732 TYPE PROMSIZ EQU 4096 ;SIZE OF THIS PROM IN WORDS EDATA EQU 0FFH ;ERASED DATA VALUE PGMLPS 6 ;SIZE OF THIS PROM IN WORDS EDATA EQU 0FFH ;ERASED DATA VALUE PGMLPS EQU 1 DELAY EQU 1 ;DELAY TO PROGRAM PULSE (2us) RARASED DATA VALUE PGMLPS EQU 1 DELAY EQU 1 ;DELAY TO PROGRAM PULSE (2us) RATE EQU 10 ;RATE FOR PULSE WIDTH (200KHZ,5us) WIDLAY TO PROGRAM PULSE (2us) RATE EQU 10 ;RATE FOR PULSE WIDTH (200KHZ,5us) WIDTH EQU 10000 ;PULSE WIDTH OF 50ms LOVOLT EQU 0EQU 2 ;RATE FOR PULSE WIDTH (1MHZ) WIDTH EQU 2000 ;PULSE WIDTH OF 2ms LOVOLT EQU 0CBH ;D/A OUTPUT FOR 24V HIVOLT EQU 0DCH  EQU 1 SHL PSCV + VON ;START CONVERT BYTE ;================================================ ; ; PROM OVERLAY LINKS TO SUBROSS ; HL= MEMORY PTR ; ;************************************** PUTDATA: IF PROMTYPE = 8764 ;SPECIAL CASE LD A,E ;SET,0 SBM: DB ' Should be: ',0 ENDMSG: DB CR,0 ERASM: DB CR,'Bit(s) not Programmable. Try erasing.',0 SUCCM: DB CR,'Successful ##### ; ; VARIABLES ; ;################## PADING: DW 0 ;NUMBER OF PADDING BYTES AT END OF PROM ENDIF DS ( -($ AND COMMAND LINE IF PROMTYPE = 2708 PROMSIZ EQU 1024 ;SIZE OF THIS PROM IN WORDS EDATA EQU 0FFH ;ERASED DATA VALUE PGMLPS EQUOF THIS PROM IN WORDS EDATA EQU 0FFH ;ERASED DATA VALUE PGMLPS EQU 100 ;LOOP COUNT TO PROGRAM (SEE 2708 DATA MANUAL) DELAY  IN WORDS EDATA EQU 0FFH ;ERASED DATA VALUE PGMLPS EQU 1 DELAY EQU 1 ;DELAY TO PROGRAM PULSE (2us) RATE EQU 10 ;RATE FOR EQU 1 DELAY EQU 1 ;DELAY TO PROGRAM PULSE (2us) RATE EQU 10 ;RATE FOR PULSE WIDTH (200KHZ,5us) WIDTH EQU 10000 ;PULSE WIDTTE EQU 10 ;RATE FOR PULSE WIDTH (200KHZ,5us) WIDTH EQU 10000 ;PULSE WIDTH OF 50ms LOVOLT EQU 0ADH ;D/A OUTPUT FOR 20.5V HITH EQU 10000 ;PULSE WIDTH OF 50ms LOVOLT EQU 0ADH ;D/A OUTPUT FOR 20.5V HIVOLT EQU 0B6H ;D/A OUTPUT FOR 21.5V TYPSEL EQU N ;D/A OUTPUT FOR 26V TYPSEL EQU NOT 4 ;CONFIGURATOR TYPE CODE SELECT ADDRESS TYPCOD EQU 6 ;PROM CONFIGURATOR TYPE CODE EUTINES ; ;================================================ EDITOR EQU OVLBFR - 15 ;TEXT OUTPUT TO CONSOLE SUBR CSTS EQU OVLB ADDRESS OUT (PADDRL),A LD A,D AND 11110000B ;SHIFT A12..A14 OVER TO COMPENSATE HDW ADD A,D OUT (PADDRH),A ELSE Program.',0 OKMSG: DB CR,'OK',0 TOOBGM: DB CR,'Bytes requested exceeds prom size!',0 CONFM: DB CR,'Wrong configurator install0FFH) AND 0FFH) PGMEND: EQU $ END  100 ;LOOP COUNT TO PROGRAM (SEE 2708 DATA MANUAL) DELAY EQU 17 ;DELAY TO PROGRAM PULSE (10us) RATE EQU 2 ;RATE FOR PULSE WEQU 17 ;DELAY TO PROGRAM PULSE (10us) RATE EQU 2 ;RATE FOR PULSE WIDTH (1MHZ) WIDTH EQU 1000 ;PULSE WIDTH OF 1ms LOVOLT EQPULSE WIDTH (200KHZ,5us) WIDTH EQU 10000 ;PULSE WIDTH OF 50ms LOVOLT EQU 0CBH ;D/A OUTPUT FOR 24V HIVOLT EQU 0DCH ;D/A OUTH OF 50ms LOVOLT EQU 0CBH ;D/A OUTPUT FOR 24V HIVOLT EQU 0DCH ;D/A OUTPUT FOR 26V TYPSEL EQU NOT 4 ;CONFIGURATOR TYPE CODEVOLT EQU 0B6H ;D/A OUTPUT FOR 21.5V TYPSEL EQU NOT 4 ;CONFIGURATOR TYPE CODE SELECT ADDRESS TYPCOD EQU 3 ;PROM CONFIGURATOROT 4 ;CONFIGURATOR TYPE CODE SELECT ADDRESS TYPCOD EQU 4 ;PROM CONFIGURATOR TYPE CODE ENDIF IF PROMTYPE = 2712 ;INTEPCOD EQU 4 ;PROM CONFIGURATOR TYPE CODE ENDIF IF PROMTYPE = 8764 ;MOTOROLA MCM68764/MCM68766 TYPE PROMSIZ EQU 8192 ;NDIF IDLE EQU 0 ;RETURN PROM II HARDWARE TO IDLE STATE VON EQU 1 SHL PVO ;PROGRAM VOLTAGE TURN ON BYTE GETSET EQU 1 SHL PFR - 12 ;CONSOLE STATUS SUBR CONIN EQU OVLBFR - 9 ;CONSOLE INPUT SUBR CONOUT EQU OVLBFR - 6 ;CONSOLE OUTPUT SUBR PRTHEX EQU O LD A,E ;SET ADDR OUT (PADDRL),A LD A,D OUT (PADDRH),A ENDIF LD A,(HL) ;OUTPUT DATA OUT (PDATA),A RET ed!',0 INHM: DB CR,'Turn off Inhibit Switch & type any key - ',0 EOCERM: DB CR,'Hardware Error- No EOC!',0 VERM: DB CR,'ProgrDH ; ;*INCLUDE PROMIII.DEF ;INCLUDE THE HARDWARE CONSTANTS (PROM III) ; LIST OFF *INCLUDE PROMIII.DEF LIST ON ;==IDTH (1MHZ) WIDTH EQU 1000 ;PULSE WIDTH OF 1ms LOVOLT EQU 0D3H ;D/A OUTPUT FOR 25V HIVOLT EQU 0E5H ;D/A OUTPUT FOR 27V TYU 0D3H ;D/A OUTPUT FOR 25V HIVOLT EQU 0E5H ;D/A OUTPUT FOR 27V TYPSEL EQU NOT 4 ;CONFIGURATOR TYPE CODE SELECT ADDRESS TYPPUT FOR 26V TYPSEL EQU NOT 4 ;CONFIGURATOR TYPE CODE SELECT ADDRESS TYPCOD EQU 1 ;PROM CONFIGURATOR TYPE CODE ENDIF  SELECT ADDRESS TYPCOD EQU 2 ;PROM CONFIGURATOR TYPE CODE ENDIF IF PROMTYPE = 2733 ;INTEL 2732A TYPE PROMSIZ EQU 409 TYPE CODE ENDIF IF PROMTYPE = 2764 ;INTEL 2764 TYPE PROMSIZ EQU 8192 ;SIZE OF THIS PROM IN WORDS EDATA EQU 0FFH ;EL 27128 TYPE PROMSIZ EQU 16384 ;SIZE OF THIS PROM IN WORDS EDATA EQU 0FFH ;ERASED DATA VALUE PGMLPS EQU 1 DELAY EQU 1 ;DESIZE OF THIS PROM IN WORDS EDATA EQU 0FFH ;ERASED DATA VALUE PGMLPS EQU 25 DELAY EQU 1 ;DELAY TO PROGRAM PULSE (2us) RATE PG + VON PROGM EQU 1 SHL PPS + GETSET ;PROGRAM START BYTE TO CMD REG PGMSTP EQU GETSET ;PROGRAM STOP BYTE TO CMD REG STCONVVLBFR - 3 ;OUTPUT BYTE IN A REG TO CONSOLE SUBR SUBTTL OVERLAY CODE ORG OVLBFR ;#########################################ADH ;D/A OUTPUT FOR 20.5V HIVOLT EQU 0B6H ;D/A OUTPUT FOR 21.5V TYPSEL EQU NOT 4 ;CONFIGURATOR TYPE CODE SELECT ADDRESS TY0 !%)- "*. #'+/  $(,0&########################### ; ; PROM OVERLAY VARIABLES & VECTOR LOCATIONS ; THIS SECTION SHOULD START AT EVEN PAGE BOUNDARYCR: DB 1 ;OVERLAY DATA PTR INCREMENT COUNT ;**************************** ; ; MAIN ENTRY VECTORS ; ;*******************OULD START ON AN EVEN 16 BYTE ; ADDRESS (I.E. XXX0H) ; ;---------------------------------------------------------------------********************* PROG: LD DE,PROMSIZ ;IF TOO MANY BYTES THEN EXIT LD HL,(PGMCNT) EX DE,HL OR A SBC HL,DE JR NC,C/* Single Density Disk Copy Utility. Reads source disk a track at a time & writes track image to destination disk a track a *bufr_ptr; /* ptr to current sector buffer */ unsigned track, /* current track # */ sector, /* current sector # */  to abort)"); puts("\n\nCAUTION, destination disk data will be destroyed by this program!"); buffer_start = alloc(numsecs(8,0,1); /* re-select drive A */ bios(9,track,0); /* select track */ bufr_ptr = buffer_start; t; for (sector = 1; sector <= numsecs; sector++){ bios(10,xlate[sector],0); bios(11,bufr_ptr bios(8,0,0); /* log on system disk */ exit(0); }  AND IT'S ; LOCATIONS SHOULD ALLWAYS BE CONSTANT. ; ;#################################################################### PG********* PRGMV: JP PROG ;PROGRAM PROM FROM MEMORY SUBROUTINE VECTOR COMPV: JP COMP ;COMPARE PROM TO MEMORY SUBROUTINE VECTO------ ;**************************************************************************** ; ; PROGRAM PROM SUBROUTINE CODE: ;OUNTOK TOOBIG: LD HL,TOOBGM ;OUTPUT PROM SIZE ERR JR EDITOR ;---------------------------------------------------------- t a time. Implements Skew 6 algorithm for faster disk access. Allows repeats & pause for insertion of system disk at terminatitemp; /* temporary storage */ char xlate[] = {0,1,7,13,19,25,5,11,17,23,3,9,15,21,2,8,14,20, 26,6,12,18,24,4,10,16,22}; s * sect_size); /* reserve size of track */ if (buffer_start == 0){ puts("\n\nNot Enough Memory!"); exit(0);} while (gefor (sector = 1; sector <= numsecs; sector++){ bios(10,xlate[sector],0); /* select sector */ bios(11,b,0); bios(13,0,0); /*){ puts("\nWrite Error!"); goto abort;}*/ bufr_ptr += sect_size; } MBFR: DW PGMEND ;DW PTR TO RAM BUFFER (AFTER OVERLAY) PROM0: DW 0 ;PTR TO START OF PROMS CSTART: DW PGMEND ;DW PTR TO STARTR READV: JP READ ;READ PROM INTO MEMORY SUBROUTINE VECTOR ;-------------------------------------------------------------- ENTRY- CSTART = START ADDR PTR TO CODE TO PROGRAM ; PGMCNT = NUMBER OF BYTES TO PROGRAM ; PSTART = START OFFSET ADDR IN PRO ; COUNT <= PROM SIZE ; CHECK CONFIGURATOR TYPE CODE FOR CORRECT PROM TYPE ;----------------------------------------------on. */ #define numsecs 26 /* number of sectors to copy */ #define numtrks 77 /* number of tracks to copy */ #define vers main(){ puts("\nSingle Density Disk Copy Utility Ver",version); puts("\n(c) 1982 GRH Electronics Cupertino, CA")tchar() == space){ /* wait for key press */ if (bios(8,0,0) == 0){ puts("\nDrive A not Ready!"); goto abort;} ifufr_ptr,0); /* set read ptr */ if (bios(12,0,0)){ puts("\nRead Error!"); goto abort;} bufr_ptr += sec } abort: puts("\n\nTo Repeat operation, Set up Source & Destination disks &"); puts("\npress space to c OF CODE IN RAM PGMCNT: DW 1 ;WORD COUNT TO PROGRAM PSTART: DW 0 ;PROM START ADDR (OFFSET) SOCKET: DB 0 ;PROM SOCKET # IN------------- ; ; THE FOLLOWING CODE MAY VARY WITH THE WRITER'S DISCRETION, BUT ; PGMEND SHOULD ALLWAYS BE THE LAST BYTE & SHM ; INCR = VALUE TO ADD TO CODE PTR AFTER EACH BYTE IS PROGRAMMED ; ;*******************************************************------------ COUNTOK: IF PROMTYPE = 2708 LD (PADING),HL ;SAVE REMAINDER AS PADDING COUNT ENDIF STCHK: LD A,TYPSEL ;Sion "1.0" #define sect_size 128 /* bytes per sector */ #define space 0x20 char *buffer_start, /* ptr to start of buffer */; puts("\n\nPlace SOURCE disk in Drive A, DESTINATION Disk in drive B &"); puts("\n press space key when ready. (RETURN (bios(8,1,0) == 0){ puts("\nDrive B not ready!"); goto abort;} for (track = 0; track < numtrks; track++){ biot_size; } bios(8,1,1); /* select drive B */ bios(9,track,0); bufr_ptr = buffer_starontinue, RETURN to return to CP/M"); } puts("\nPlace System disk in drive A & press any key."); temp = getchar();0 !%)- "*. #'+/  $(,0&Û     d!!Z ! ! ! !  ! >"*|}!d !0 ! ͻ!*"û! ! }! " !!!ͻ!0 Single Density Disk Copy Utility Vee, RETURN to return to CP/M Place System disk in drive A & press any key.pJ* |g}o|/g}/o^#V#DM!99`ic|g}o~# x !9M~#%!2|d*<|Y!l":"<*<DM! 9^#V*<"<*<*:ʖ!ld!/ "!#+^!DM!"7 m *7 #"7 *7  |Vd! 9^#V^z4 ! 9~#fo#s#r+^! %͜d! 9^#V!%[5 DM!$ ^!< !ͫ!!$ s!d! 9^#V!%[5 DM!t !!9~#foͫ! DM`iͣ!DM`id! 9^#V! ͣC! !ͫ! 9^#V!ͫ! 9^#Vd!!ͫDM ͣ! !ELECT TYPE CODE ADDRESS OUT (PADDRH),A IN A,(PRMST) ;IF CONFIGURATOR NOT CORRECT THEN EXIT LD C,A AND PSTYPE CP TYPCODHL,INHM ;OUTPUT INHIBIT SWITCH MSG CALL EDITOR CALL CONIN ;WAIT FOR KEY JR STCHK ;CHECK AGAIN, DON'T TAKE USER'S WORD FLD A,HIGH RATE OUT (PTMR1),A LD A,PT2MOD ;PROGRAMMING PULSE WIDTH OUT (PTMRMD),A LD A,LOW WIDTH OUT (PTMR2),A LD A JR NZ,NTERASD INC DE ;ELSE BUMP PTR & CHECK NEXT LOCATION DEC BC LD A,C OR B JR NZ,ERALP JR ERASED ;IF ALL E ͣ1!!!ͻ©!y !!!ͻ! !"*#"+*M!!!ͻ!*r1.0 (c) 1982 GRH Electronics Cupertino, CA Place SOURCE disk in Drive A, DESTINATION Disk in drive B & press space ke|z2L:Ls}!}}­|ʼ!}¼|ʭ!}|}|?>o&zo&|}|>o&|o&z2L:Lˆ!!*:":l`i]*9 â*MDM*O*M**ODM*Q!9N#F#^#Vkb6#> 6 #=>6#= : >" n& ͣž n& ͣʯ #+z  `i*7 )s#r| n& Ͳ n& Ͳ +#+^ !9^#V!ͫ!!ͫ"w | `i!~#fo#s#rj d! 9^#V!%[5 DM! !!9~#fo JR Z,CONFOK LD HL,CONFM ;OUTPUT CONFIGURATOR ERROR JR EDITOR ;------------------------------------------------------,HIGH WIDTH OUT (PTMR2),A ;---------------------------------------------------------------------------- ; TIMING PROGRAMRASED THEN GO ON ;----------------------------------------------------- ; NOT ERASED, CHECK IF USER WANT'S TO TRY ANYWAY ! ͻ*"!" "* #" +* ʈ!*  ^! ͻ!*! ͻ!!! ͻz! !*y when ready. (RETURN to abort) CAUTION, destination disk data will be destroyed by this program! Not Enough Memory! Drive s||/g}/o#z!/W{/_!DM!>2K))4#}o|gL :K=2K,}:K=2K,}DM!>))k =c}}/o|/g#}| A\[@a\{\`w# .=V%cw#&{o|g Vcw#G!!|a{ !9^#V*!9}|`i#DM+s !`i#DM+sf !*7 (0 dn !09^#Vz` !9!d !9!ͫ͢A:$$$.SUBɀd!Pd!5 + % E n$&|O ! !"w !!9^#Vk !"w !!9^#V !ͫ=!9^#V!ͫ!"ͫ"w |=`i!~#fo#s#r d! 9^#V!%[5 DM!9^#V!! s#r!!# s!d! 9^#V-------------- ; CONFIGURATOR IS CORRECT, NOW CHECK IF PROGRAM ENABLE SWITCH IS ON ;----------------------------------------INHOK: LD A,PT0MOD ;PROGRAMMING PULSE DELAY (CNT * 0.5us + 1.5us) OUT (PTMRMD),A LD A,LOW DELAY OUT (PTMR0),A LD A,MED, CHECK IF PROM ERASED BEFORE TURNING ON HIGH VOLTAGE ;---------------------------------------------------------------------;----------------------------------------------------- NTERASD: LD HL,NTERAM ;OUTPUT NOT ERASED MESSAGE CALL EDITOR CALL "!!!ͻ!*! ͻ*"!" * #" +* !*  ^! ͻ!*! ͻ!!A not Ready! Drive B not ready! Read Error! To Repeat operation, Set up Source & Destination disks & press space to continuí|g}o||7g}o“)¡}}o|gBK^#Vz#y###ú#x#~#fo}|>?o&}|>o&|g}oڊ"|!!9s!9! ͫ! !ͫ!^9^#V!9^!ͣ !!9^!9DM+#| `i#DM+^#+s !u!^9^#ͣʔ !"w ! !ͫ!ͫͣ !"w ! !"w !Ͳv v  !9^#V#u$!u#u!t"5 !%[5 DM!#ͫ!! ^#Vd! 9^#V!%[5 d!9!29^#V!9!ͫd!!ͫDM ͣ! !---------------------------- CONFOK: LD A,C ;RESTORE STATUS AND PRMINH ;IF INHIBIT SWITCH ON THEN ERR JR NZ,INHOK LD HIGH DELAY OUT (PTMR0),A LD A,PT1MOD ;PROGRAMMING PULSE GENERATOR RATE OUT (PTMRMD),A LD A,LOW RATE OUT (PTMR1),A ------- ERSCHK: LD BC,(PGMCNT) ;CHECK IF ERASED LD DE,(PSTART) ERALP: CALL GETDATA CP EDATA ;IF NOT ERASED THEN PROMPT CONIN ;GET USER INPUT AND 5FH ;CONVERT LC TO UC CP 'Y' RET NZ ;------------------------------------------------------OR IT ;-------------------------------------- ; ALL SEEMS OK, NOW SET UP TIMING ;-------------------------------------- 0 !%)- "*. #'+/  $(,0&--------- ; PROM IS ERASED, NOW CHECK FOR CORRECT PROGRAMMING VOLTAGE ;-----------------------------------------------------IF TIMOUT THEN OUTPUT ERR LD HL,EOCERM JP EDITOR GOTEOC: IN A,(PADDAT) ;GET VOLTAGE & CHECK LIMITS CP LOVOLT JR C,V----------- ; 2708 CODE ;--------------------------------- LD BC,PGMLPS ;SET UP LOOP COUNT NXTLP: PUSH BC LD BC,(PGMCNT JP NC,HOK INC H HOK: DEC BC ;IF COUNT-- = 0 THEN STOP ELSE NEXT WORD LD A,C OR B JP NZ,PRGNXT ;---------------×í*R0!?"O(!cy !>2>>>t>>>>>K[  y Bit(s) not Programmable. Try erasing. Successful Program. OK Bytes requested exceeds prom size! Wrong configurator installed2?\(652?`($( $&2?#$($(%($&###2?d(##%( TITLE PROM PROGRAMMER TEST OVERLAY LIST NOCOND ;**************************************************************************** VERS EQU '11' ;CHANGING THIS CHANGES SIGN-ON ; ;****************************************************************************T MODE FOR SCOPING. ; 5- WITH THE USE OF EXTERNAL HARDWARE, READ-BACK OF THE ADDRESS COUNTER ; & TEST OF THE AUTO-INCREMENTLSE LIST OFF *INCLUDE SYSPARAM.INC ;INCLUDE HARDWARE CONSTANTS FOR PROM III LIST ON CTRLC EQU 03H LF EQU 0AH CR EQU 0D---------- ERASED: LD A,VON ;TURN ON VOLTAGE OUT (PRMCMD),A LD BC,0 ;WAIT FOR ANALOG STUFF TO SETTLE TWIDDL: EX (SP),HOLTER CP HIVOLT + 1 JR C,VOLTOK VOLTER: LD HL,VERM PUSH AF ;SAVE A/D DATA CALL EDITOR POP AF ;OUTPUT A/D DATA F) ;PREPARE TO PROGRAM LD HL,(CSTART) LD DE,(PSTART) PRGNXT: CALL PUTDATA ;OUTPUT ADDRESS & DATA TO PROGRAM LD A,PROG------------------------------------------------------------ ; OUTPUT PADDING BYTES TO END OF PROM TO CONFORM TO PROGRAMMING !_Y> y >"˯@(!88 !dK*[{z~> >: o$ y! Turn off Inhibit Switch & type any key - Hardware Error- No EOC! Program Voltage out of tolerance! : Prom not erased! Co$&662?h(65%( $&W % %$& "$& /%(%%& - % %65$&H* ; ; UNIVERSAL PROM PROGRAMMER TEST/DIAGNOSTIC OVERLAY FOR 'PROM' PROGRAM. ; COPYRIGHT 1982 GRH ENTERPRISES, CUPERTINO, CA  & DECREMENT MODES. ; 6- WITH THE SAME EXTERNAL HARDWARE, TEST OF THE T0..T2 BITS OF THE ; STATUS WORD. ; 7- CONTINUOUS DIH FF EQU 0CH START EQU 1000H ;START OF OVERLAY (VARIES WITH 'PROM') EDITOR EQU START - 15 ;TEXT OUTPUT EDITOR VECTOR CSL EX (SP),HL DEC BC LD A,C OR B JR NZ,TWIDDL LD A,STCONV ;ISSUE START CONVERT OUT (PRMCMD),A RES PSCV,A OUT OR DIAGNOSTICS JP PRTHEX ;--------------------------------- ; ALL SEEMS OK, SO PROGRAM PROM ;--------------------------M ;PROGRAM BYTE OUT (PRMCMD),A PRGWT: IN A,(PRMST) ;WAIT UNTIL DONE AND PRMBSY JR NZ,PRGWT LD A,PGMSTP ;TERMINATE SPECS ;--------------------------------------------------------------------------- LD BC,(PADING) ;NOW OUTPUT PADDING BYTES Ky({z>> >  y>*[Ḱ !&!z{!!~!!ntinue? (Y/N) - ! BH" !I B  $$!BD! $!BI D@"!$I$$H"!I ; WRITTEN BY GIRVIN HERR 28 DEC 82 ; ;***************************************************************************** ; ; RFIDENCE TEST CONSISTING OF: ; A. DATA REGISTER READ-BACK ; B. D/A DATA READ ; C. INHIBIT SWITCH READ ; 2- SELECTION OF 82GITIZATION & DISPLAY OF VOLTAGE VALUE UNTIL A KEY ; IS PRESSED, TO OBTAIN OPTIMIZED VALUES FOR OUT OF RANGE ERRORS. ; ;***TS EQU EDITOR + 3 ;CONSOLE STATUS VECTOR CI EQU CSTS + 3 ;CONSOLE INPUT VECTOR CO EQU CI + 3 ;CONSOLE OUTPUT VECTOR PRHEX EQ(PRMCMD),A LD B,0 ;SET UP TIMOUT EOCLP: IN A,(PRMST) ;WAIT FOR END OF CONVERT AND PRMEOC JR Z,GOTEOC DJNZ EOCLP ;------- VOLTOK: LD A,GETSET ;APPLY PROGRAM VOLTAGE TO CHIP OUT (PRMCMD),A IF PROMTYPE = 2708 ;----------------------PROGRAM CYCLE OUT (PRMCMD),A INC DE ;PROM ADDR ++ LD A,(INCR) ;ADD INCREMENT VALUE TO MEMORY PTR ADD A,L LD L,A PADLP: LD A,C ;IF PADDING = 0 THEN EXIT OR B JR Z,PADDON CALL PUTDATA ;ELSE PROGRAM TO ERASED DATA TO END OF PROM LD: oҐ$ y*[Ḱ !;*[Kw: o$ y¸>{z Data Error at Is: Should be: $I$I$UUU$$A$ EVISIONS: ; ; 1.0 - 28 DEC 82 ; RELEASE ; ; 1.1 - 5 FEB 83 ; CHANGED TO INTERFACE TO REV 1.2 OF PROM PROGRAM KERNEL. ; 55 TIMING VALUES FOR SCOPING ; 3- FREE RUN MODE FOR SCOPING SIGNALS & DETERMINING OPTIMUM TIMING ; VALUES. ; 4- SINGLE SHO************************************************************************** SUBTTL DECLARATIONS FALSE EQU 0 TRUE EQU NOT FAU CO + 3 ;OUTPUT HEX DIGIT VECTOR GETCH EQU CI ;THIS MAY BE IMPLEMENTED BY A SUBR IF REQ'D SUBTTL PROGRAM ORG START * ; ; THIS OVERLAY ALLOWS TEST/MEASUREMENT OF THE PROM III PROGRAMMER ; CARD. IT ALLOWS THE FOLLOWING COMMANDS: ; ; 1- CON0 !%)- "*. #'+/  $(,0&WHATYPE MACRO PROMTYPE EQU 2708 ENDM  A,EDATA OUT (PDATA),A LD A,PROGM OUT (PRMCMD),A PRGWT2: IN A,(PRMST) ;WAIT UNTIL CYCLE DONE AND PRMBSY JR NZ,PRGWT PROMTYPE = 2732 OR PROMTYPE = 2733 IF PROMTYPE = 2764 OR PROMTYPE = 2712 ;------------------------------------------- ;  LD A,PGMSTP ;TERMINATE PROGRAM CYCLE OUT (PRMCMD),A SKIP: INC DE ;PROM ADDR ++ LD A,(INCR) ;ADD INCREMENT VALUE TOPS ;SET UP COUNT ILOOP: CALL PUTDATA CP EDATA ;IF DATA == ERASED THEN SKIP PROGRAM JP Z,SKIP LD A,PROGM ;PROGRAM ssembler or in the Intel HEX format into memory buffer. ; 2- Allows specification of the start address and byte ; couows re-specifying the prom type without exiting PROM ; & re-starting. If 'promtype' is not specified, then the user is ; promp locations from 'first' to 'last' (inclusive) ; with 'value'. Buffer bounds are checked. ;*MOve first, last, dest ; Moves codes the ; number of buffer bytes to skip between each buffer load. ;*DIsplay first <,last> ; Display buffer data from buffer r2 LD A,PGMSTP ;STOP PROGRAM CYCLE OUT (PRMCMD),A INC DE ;PROM PTR++ DEC BC ;COUNT-- JP PADLP ;--------------- STANDARD INTEL TYPE PROGRAMMING CODE ;------------------------------------------- LD BC,(PGMCNT) ;PREPARE TO PROGRAM LD HL MEMORY PTR ADD A,L LD L,A JP NC,HOK INC H HOK: DEC BC ;IF COUNT-- = 0 THEN STOP ELSE NEXT WORD LD A,C OR B BYTE OUT (PRMCMD),A PRGWT: IN A,PRMST ;WAIT UNTIL DONE AND PRMBSY JR NZ,PRGWT LD A,PGMSTP ;TERMINATE PROGRAM CYCLEnt to transfer and the byte count to skip (for implementing ; the odd/ even byte sequence as used with many 16 bit processors).e from buffer relative position 'first' through 'last' ; into new buffer relative location starting at 'dest'. Buffer ; boundselative location 'first' through ; buffer relative location 'last'. If 'last' is not specified then ; 256 bytes are displayed.--------------------------------- ; PADDING DONE, NOW LOOP AGAIN UNTIL ALL DONE ;-------------------------------------------,(CSTART) LD DE,(PSTART) PRGNXT: CALL PUTDATA ;OUTPUT DATA & ADDRESS CP EDATA ;IF DATA = ERASED DATA THEN SKIP PROGRAJP NZ,PRGNXT ENDIF ENDIF IF PROMTYPE = 8764 ;-------------------------------------- ; 68764/68766 ;---------- OUT (PRMCMD),A DJNZ ILOOP SKIP: INC DE ;NEXT ADDRESS LD A,(INCR) ;ADD INCREMENT VALUE TO MEMORY PTR ADD A,L L ; 3- Performs extensive error checking against memory buffer bounds, will ; not allow the operating system or code to be co location 'addr'. Buffer bounds are checked. ;*SAve first, last HEX filename ; Saves the buffer image starting at buffer relat for 'dest' are checked. ;*COpy count <,dest <,skip>> ; Copy 'count' bytes from prom starting at buffer relative location ; ' If 'first' is not specified, then the ; previous 'last' is used for 'first'. ;*Substitute addr ; Allows changing byte values----- PADDON: POP BC ;IF LOOPS <> 0 THEN DO AGAIN DEC BC LD A,C OR B JP NZ,NXTLP ENDIF IF PROMTYPE = 2716 ORM JP Z,SKIP LD A,PROGM ;PROGRAM BYTE OUT (PRMCMD),A PRGWT: IN A,(PRMST) ;WAIT UNTIL DONE AND PRMBSY JR NZ,PRGWT ---------------------------- LD BC,(PGMCNT) ;FETCH PARAMETERS LD HL,(CSTART) LD DE,(PSTART) PRGNXT: PUSH BC LD B,PGMLD L,A JP NC,HOK INC H HOK: POP BC ;IF COUNT EXHAUSTED THEN REPEAT DEC BC LD A,C OR B JP NZ,PRGNXT ENDIF mpromised. ; ; command descriptions: ; ;*HElp ; Displays the command summary list. ;*NEw ; This command allive location 'first' ; through 'last' in Hex file format as file 'filename' ;*FIll first, last, value ; Fills buffer relative,dest' (if 'dest' is not specified then a default of 0 is used). ; If 'dest' is specified, then the optional skip count specifi starting at buffer relative location ; 'addr' one at a time. Upon execution, this command outputs: ; 'addr' & the current datted for the type. ;*REad addr filename ; Reads file 'filename' with optional 'HEX' format starting at buffer ; relative0 !%)- "*. #'+/  $(,0&a value then waits for the user response. ; If the user enters hex data, the 2 Hex digits are loaded into ; the 'addr' locatio ;*PRogram <"> > ; Program prom starting at 'prom_start_addr' address offset into ; promprom_start_addr <,skip>> ; This command uses the same format as the PRogram command above, but ; only compares the prom data w; a list of hex bytes 'list of hex bytes'. If 'XX' is used in the ; list of bytes then the byte represented by XX is a don' ;---------------------------------------------------------- ; PROGRAM DONE, SO REMOVE PROGRAM VOLTAGE & CHECK DATA ;---------------------------------------- ; PROM COMPARED BADLY, OUTPUT PROM ADDR, BAD & GOOD DATA & PROGRAMMABILITY. ;------------- GETDATA CALL PRTHEX LD HL,SBM ;OUTPUT MEMORY DATA CALL EDITOR POP HL ;MEM ADDR LD A,(HL) CALL PRTHEX POP AF BYTE +1 PTR ; HL= MEMORY BYTE +1 PTR ; BC= 0 IF ALL OK ; ZF= ALL OK ; CF= NOT PROGRAMMABLE ; ;+++++++++++++++++++++++O MEMORY SUBROUTINE CODE: ; ENTRY- CSTART = START ADDR PTR TO CODE TO COMPARE ; PGMCNT = NUMBER OF BYTES TO COMPARE ; PSTAR************************************************************ ; ; READ PROM INTO MEMORY BUFFER SUBROUTINE CODE: ; ENTRY- CSTARRT) ;SET UP PTRS LD DE,(PSTART) LD BC,(PGMCNT) ;SET UP COUNT READLP: CALL GETDATA LD (HL),A INC DE LD A,(INCR) ;S OUT (PADDRL),A LD A,D AND 11110000B ;SHIFT A12..A14 OVER TO COMPENSATE HDW ADD A,D OUT (PADDRH),A ELSE LD A,E n then 'addr' is incremented by 1 & the process ; is repeated. If a RETURN is entered (nul line) the data value is ; left as i starting at buffer relative location 'first' through 'last' ; inclusive bytes of buffer. Optional 'skip' specifies the number ith the buffer data. ;*CHecksum first, last <,skip> ; This command calculates the modulo 65536 checksum of the buffer ; relatt care. ; Spaces between bytes are allowed and are required if a single hex ; digit is specified ' F 1828' (SI-CAN-[) as opp--------------------------------------------------- LD A,IDLE ;REMOVE PROGRAM VOLTAGE FROM HARDWARE OUT (PRMCMD),A LD HL--------------------------------------------------------------- NOGOOD: PUSH AF ;SAVE CARRY FOR ERASE PROMPT PUSH HL ;MEM A ;IF ABLE TO PROGRAM THEN END LINE & RETURN LD HL,ENDMSG IF EDATA = 0 CCF ;REVERSE PROGRAMMABLE BIT SENSE IF DATA = 0+++++++++++++++++++++++++ COMPAR: CALL GETDATA ;IF SRC <> DEST THEN RETURN SUB (HL) RET NZ INC DE ;PTRS ++ LD A,(INT = START OFFSET ADDR IN PROM ; INCR = VALUE TO ADD TO CODE PTR AFTER EACH BYTE IS COMPARED ; ;*****************************MEMORY PTR += INCREMENT ADD A,L LD L,A JP NC,DOK INC H DOK: DEC BC LD A,C OR B JP NZ,READLP RET ;+++ ;OUTPUT PROM ADDR OUT (PADDRL),A LD A,D OUT (PADDRH),A ENDIF IN A,(PDATA) ;RETURN PROM DATA RET ;*********s & 'addr' is incremented by 1 & the process is repeated. ; If a period '.' is entered as the 1st character, the command is ;  ; of bytes to skip for programming. I.e. every other 'skip'th byte ; of the buffer. Optional form '!' instructs the command toive bytes from 'first' through 'last' skipping every 'skip'th ; byte & displays the value. If 'skip' is not specified, then nonosed to '0F1828'. ; If a group of bytes in the buffer range matches the list of bytes, ; the address of the first byte in th,(CSTART) ;SET UP PTRS LD DE,(PSTART) LD BC,(PGMCNT) ; & COUNT CALL COMPAR ;COMPARE PROM TO MEMORY IMAGE JR NZ,NOGOOD ;DDR PUSH DE ;PROM ADDR LD HL,DERRM CALL EDITOR POP DE ;PROM ADDR LD A,D ;OUTPUT ERR ADDR PUSH DE ;PROM ADDR  ENDIF JP NC,EDITOR LD HL,ERASM ;ELSE OUTPUT MUST ERASE MESSAGE JP EDITOR ;++++++++++++++++++++++++++++++++++++CR) ;MEMORY PTR += INCREMENT ADD A,L LD L,A JP NC,CHOK INC H CHOK: DEC BC ;IF --COUNT <> 0 THEN LOOP LD A,C OR********************************************** COMP: LD HL,(CSTART) ;SET UP FOR COMPAR LD DE,(PSTART) LD BC,(PGMCNT) CALLACH BYTE IS READ ; ;*************************************************************************** READ: LD DE,PROMSIZ ;IF TOO M+++++++++++++++++++++++++++++++++++ ; ; GET PROM DATA SUBR ; ENTRY- DE= PROM ADDR ; EXIT - A= PROM DATA ; ;+++++++++++++++***************************** ; ; PUT PROM DATA SUBR ; ENTRY- DE= PROM ADDRESS ; HL= MEMORY PTR ; ;**********************terminated. Note, the Hex values entered must have 0 in the high ; byte. I.E. 00xx or just plain xx or even yy00xx will be ok.  use the ; last used values. This allows a short form for programming several ; identical proms. ;*ComPare <"> 0 LD L,A LD A,0 ;ADD IN MANDS RETURN HERE IF OK. ; ;--------------------------------------------------------------- CONT1: CALL CRLF ;NEW LINE L User's Manual Copyright (c) 1983 GRH Enterprises Cupertino, CA System Requirements & Interface Thi progra i writte i Z-8 code D no attemp t ru i o a 808 base syst Speakin o guarantees thi progra i i th publi domain freel us th Copyrigh notice i orde t protec m interNT OVERLAY ORG OVSTRT EQU 1200H ; ; SYSTEM PARAMS ; DFLTDK: EQU 0004H ;DEFAULT DISK STORAGE LOC BDOS: EQU 0005H ;CP/NSION OF FILENMAE SUBTTL PROGRAM AREA ORG TPA ;----------------------- ; ; ENTRY VECTOR ; ;----------------------- ########################## SIGNON: DB CR,CR,'Prom Programmer Utility',86H,'Ver ' DB HIGH REVSN DB '.' DB LOW REVSN DB C;GET COUNT RES 7,C ;INSURE ONLY 128D BYTES LD A,C ;IF CNT = 0 THEN ABORT OR A JR Z,NOSPEC LD B,0 INC HL LDIR M FOR 'P' POP DE DEC HL LDDR LD A,'P' ;FORCE P PREFIX LD (DE),A LD HL,'VO' ;FORCE .OV TYPE LD (FCB+TYPE+1),HL  CONT2: LD BC,OVLBFR ;READ INTO OVERLAY BUFFER CALL RDFILE CALL C,MEMER ;IF INTO RESERVED MEMORY THEN ERR JR C,NOSPEC ; &ANY CARRY ADC A,H LD H,A PTROK: LD (DISTRT),HL ;SET PTRS LD (DISEND),HL JR CONT1 ;---------------------------- D C,'*' ;OUTPUT PROMPT CALL CONOUT CALL RDCON ;GET USER INPUT LD HL,(CMDPTR) CALL SKIP ;IF NO INPUT THEN ERR JR 95014 CONTENTS Section Title 1.0 - General Information 2.0 - System Rmat into memory buffer. 2- Allows specification of the start address and byte count to transfer and the byte count em prefe th Z-8 instructio se sinc mos bi system ar no Z-8 based don' thin thi wil b muc o ests I fin ou someon ou ther i makin buc o thi progra withou m approval woul lik t b abl tM ENTRY POINT DEFBFR: EQU 0080H ;DEFAULT BUFFER LOC TPA EQU 0100H ;START OF PROGRAM ; CPMEOF: EQU 1AH ;CP/M END OF FILE CJP PROM ;ENTRY VECTOR FROM SYSTEM ;##################################################### ; ; PTR TO END OF PROGRAM (STARR,'Copyright (c) 1981,''82,''83' DB ' GRH Enterprises Cupertino, CA' DB CR,0 ;----------------------- ; ; MAIN PROG XOR A LD (DE),A ;LAST CHAR := 0 LD HL,CMDBFR ;FIND PROM TYPE LD (CMDPTR),HL GOTPRM: LD HL,(CMDPTR) ;IF 1ST CHAR = '*' LD A,' ' LD (FCB+TYPE+3),A LD DE,FCB ;TRY TO OPEN FILE CALL OPEN INC A ;IF OK THEN GO OPEN JR NZ,CONT2 LD HL RETURN TO PROM PROMPT OR A ;ELSE IF READ OK THEN GOTO COMMAND INPUT JR Z,CONT2A LD HL,RDERRM ;ELSE OUTPUT 'READ ERRO; ; SYNTAX ERROR HANDLER ; ;---------------------------- SYNERR: CALL ERRPTR ;OUTPUT ERROR PTR LD HL,SYNERM ;OUTPUT 'SYNT Z,SYNERR LD (CMDPTR),HL LD E,A ;1ST 2 CHARS OF CMD -> DE INC HL LD D,(HL) LD HL,CMDTBL LD B,(HL) ;FETCH TABequirments & Interface 3.0 - Commands 4.0 - Prom Overlays .pa .he Section 1.0 General Into skip (for implementing the odd/ even byte sequence as used with many 16 bit processors). 3- Extensive error checking aghardshi for most users. I als require th CP/ (T Digita Researc Inc Operatin System Vers 2.x Sinc n com dow o hi (o her legally Othe tha that fee fre t cop bot thi manua th cod fo you freinds A  by the following: 1- Implements the loading of object files generated by the ASMZ assembler or in the Intel HEX for0 !%)- "*. #'+/  $(,0& usual pleas pas an bu report bac t me B bugs mea strang crashe o th progra i no workin a descriy master when time permits. Th progra i onl kerne progra t lin you particula pro burnin hardwar t a ide o ho t implemen you overlay (se sectio 4.0 Wit thi i mind woul no attemp t us thi progra unist. *NEw This command allows re-specifying the prom type without exiting PROM & re-starting. If 'promtype' is n value Fills buffer relative locations from 'first' to 'last' (inclusive) with 'value'. Buffer bounds are checked. *MOve fial skip count specifies the number of buffer bytes to skip between each buffer load. *DIsplay first <,last> Display buffer current data value then waits for the user response. If the user enters hex data, the 2 Hex digits are loaded into the 'addrok. *PRogram > Program prom starting at 'prom_start_addr' address offset into prostart_addr <,skip>> This command uses the same format as the PRogram command above, but only compares the prom data with theays. 4.3 - Writing Your Own Prom Overlays. .pa .he Appendix A Prom Overlay Interface ; ; PROM O(00H). ; XXF1 C3 XX XX JP EDITOR ; ; CONSOLE STATUS POLE. SEE CP/M INTERFACE MANUAL FOR DETAILS. ; EXIT - AE SUBROUTINE. ENTR٠ - RE CONTAIN BINAR NUMBE T CONVER T ASCI DISPLA ; ON CONSOLE AS 2be i thi manual hav attempte t pu a man erro check memor protectio safeguard int th progra a possi method o loadin file ,modifyin programmin th dat fro thos file an optionall bein abl t rea pro int les yo o someon yo kno ha th abilit t progra i assembl languag a wel a hav goo gras o digita hardwaot specified, then the user is prompted for the type. *REad addr filename Reads file 'filename' with optional 'HEX' frst, last, dest Moves code from buffer relative position 'first' through 'last' into new buffer relative location starting adata from buffer relative location 'first' through buffer relative location 'last'. If 'last' is not specified then 256 byte' location then 'addr' is incremented by 1 & the process is repeated. If a RETURN is entered (nul line) the data value is lem starting at buffer relative location 'first' through 'last' inclusive bytes of buffer. Optional 'skip' specifies the number  buffer data. *CHecksum first, last <,skip> This command calculates the modulo 65536 checksum of the buffer relative bytes  REG HAS RESULTS ; XXF4 C3 XX XX JP CSTS ; ; CONSOLE INPUT. SEE CP/M INTERFACE MANUAL FOR DETAILS. ; EXIT -  HEXADECIMAL DIGITS. ; XXFD C3 XX XX JP PRTHEX ; ; THE FOLLOWING CODE MUST BE PROVIDED BY THE OVERLAY. IT'S ORG'D ble bu I' sur someon ou ther wil d somethin haven' though of S pleas tel m fo m experienc implementatimemor sav th dat a file hav designe buil m ow hardwar (no satisfie wit an currentl o th marr hi ow programmer I anyon ou ther write a overla fo popula programme wishe t shar it sen it to mormat starting at buffer relative location 'addr'. Buffer bounds are checked. *SAve first, last HEX filename Saves the bufft 'dest'. Buffer bounds for 'dest' are checked. *COpy count <,dest <,skip>> Copy 'count' bytes from prom starting at buffers are displayed. If 'first' is not specified, then the previous 'last' is used for 'first'. *Substitute addr Allows changinft as is & 'addr' is incremented by 1 & the process is repeated. If a period '.' is entered as the 1st character, the command  of bytes to skip for programming. I.e. every other 'skip'th byte of the buffer. Optional form '!' instructs the command to ufrom 'first' through 'last' skipping every 'skip'th byte & displays the value. If 'skip' is not specified, then none are skiO THE OUTSIDE WORLD. ; THESE START AT CONTENTS OF LOCATION 0103H - 15 ; ; TEXT STRING EDITOR OUTPUTS TEXT TO THE CONSOLE A REG. HAS CHARACTER ; XXF7 C3 XX XX JP CONIN ; ; CONSOLE OUTPUT. SEE CP/M INTERFACE MANUAL FOR DETAILS. ; EN ; LOCATION MAY BE FOUND FOR A PARTICULAR RELEASE OF 'PROM' BY USING ; DDT TO READ THE CONTENTS OF 'PROM' LOCATION 0103H. THIS o i futur programs Als pleas pas an modification o 'i woul b nic if's on to me too & I will try to update mket suppl pro overlay fo thi hardwar i sourc a wel a object B examinin thes sourc files yo shoul gee & I will distribute it. .pa .he Section 3.0 Commands *HElp Displays the command summary ler image starting at buffer relative location 'first' through 'last' in Hex file format as file 'filename' *FIll first, last, relative location ',dest' (if 'dest' is not specified then a default of 0 is used). If 'dest' is specified, then the optiong byte values starting at buffer relative location 'addr' one at a time. Upon execution, this command outputs: 'addr' & the is terminated. Note, the Hex values entered must have 0 in the high byte. I.E. 00xx or just plain xx or even yy00xx will be se the last used values. This allows a short form for programming several identical proms. *ComPare ENTRY THEN SKIP LD A,(HL) CP E JR NZ,NOT1ST INC HL LD A,(HL) CP D JR NZ,NOEN LOOP JR SYNERR ;ELSE ERROR SUBTTL COMMANDS ;--------------------------------- ; ; NEW PROM TYPE COMMAND ; NEW <GETNUM JP C,SYNERR ;IF ILLEGAL NUMBER THEN ERR CALL CPBNDS ;IF READ AREA INTO RESERVED AREA THEN JP C,BNDSM ;ABORT RMAT FCB CALL FORMAT JP C,SYNERR JP NZ,SYNERR ;IF WILDCARDS USED THEN ERR ; ; FORMAT OK, SO OPEN FILE ; LD DE,FCB CBYTE ; AFTER THE PROM OVERLAY. THE FOLLOWING EXAMPLE SHOULD WORK. ; XX00 XXXX PGMBFR: DW PGMEND ;DW PTR TO RAM BUFFER (AFTERCATION FOR USE. ; ; THE NEXT 2 BYTES WILL CONTAIN THE ADDRESS OF THE START OF ANY ; MEMORY REFERENCE THAT THE OVERLAY MUST (OFFSET) ; ; THE NEXT BYTE IS RESERVED FOR FUTURE USE ; XX0A XX DS 1 ;PROM SOCKET # ; ; THE NEXT BYTE WILLITH ; THE PROPER DATA. PLACE A JUMP INSTRUCTION HERE THAT TRANSFERRS ; EXECUTION TO YOUR PROGRAM SUBROUTINE WHICH EXECUTES A 'ORY BUFFER COMMAND. OTHERWISE IT OPERATES THE SAME AS ; THE PROGRAM CYCLE COMMAND ABOVE. ; XX12 C3 XX XX READV: JP READ ; RET ; ; THE FOLLOWING STATEMENT (OR SOMETHING LIKE IT) WILL POSITION THE ; MEMORY BUFFER ON AN EVEN PAGE BOUNDT2ND INC HL ;FETCH SERVICE ADDR LD E,(HL) INC HL LD D,(HL) PUSH DE ;SET UP FOR COMMAND SCANNING LD HL,(CMDPTR) LD (PARAM1),HL LD HL,(CMDPTR) LD C,' ' CALL SEARCH CALL SKIP ;IF 'HEX' ATTRIBUTE REQUESTED THEN LD (CMDPTR),HL CALL OPEN INC A ;IF NOT THERE THEN JR NZ,RDC1 LD HL,FNFM ; OUTPUT 'FILE NOT FOUND' CALL EDITOR JP CONT1 ; ; OU OVERLAY) ; ; THE NEXT 2 BYTES ARE RESERVED FOR FUTURE USE ; XX02 XXXX PROM0: DS 2 ;PTR TO START OF PROMS ; .PA ;  USE. ; XX04 XXXX CSTART: DS 2 ;DW PTR TO START OF CODE IN RAM ; ; THE NEXT 2 BYTES WILL CONTAIN THE NUMBER OF BYTES IN T CONTAIN THE INCREMENT VALUE OF THE MEMORY POINTER ; (CSTART) AFTER EACH BYTE PROGRAMMED. ADD THIS VALUE TO THE MEMORY ; POINTRET' INSTRUCTION ; TO RETURN TO 'PROM'. ; XX0C C3 XX XX PRGMV: JP PROGRAM ; ; THE FOLLWING LOCATION WILL BE THE LOCATION ; THE REMAINING MEMORY IS YOURS. ; ; .PA ; PROGRAM: . . ARY. THIS IS REQUIRED FOR THE ; DISPLAY MEMORY COMMAND TO WORK PROPERLY. OTHERWISE THE DISPLAY WILL ; LOOK ODD. ; DS ( -($  LD C,' ' ;POSITION CMD PTR TO NEXT FIELD CALL SEARCH CALL SKIP ;ALSO PASS IN ZF IF NO FIELDS LD (CMDPTR),HL POP H-------------------- ; ; READ FILE INTO BUFFER COMMAND ; READ ADDR FILENAME ; ;---------------------------------- ALL CKQHEX JP NZ,RC1 ; ; HEX FILE SPECIFIED BROUGHT US HERE ; LD A,TRUE ;HEX FLAG = TRUE LD (HXFLAG),A LD HL,(CMDPTPUT BOUNDS ERROR MESSAGE ; BNDSM: CALL ERRPTR ;OUTPUT ERROR PTR LD HL,BOUNDM ;THEN OUTPUT ERROR MESSAGE CALL EDITOR  THE FOLLOWING STORAGE LOCATION'S DATA ARE SUPPLIED BY THE 'PROM' ; KERNEL BEFORE CALLING THE OVERLAY VECTORS. ; IT IS RECOMMEHE PROM TO ; PROGRAM. ; XX06 XXXX PGMCNT: DS 2 ;WORD COUNT TO PROGRAM ; ; THE NEXT 2 BYTES WILL CONTAIN THE OFFSET INTO ER YOU'RE USING TO REFERENCE THE MEMORY DATA BUFFER. ; XX0B XX INCR: DS 1 ;OVERLAY DATA PTR INCREMENT COUNT ; ; THE FO 'PROM' WILL CALL FOR A ; PROM COMPARE TO MEMORY COMMAND. OTHERWISE IT OPERATES THE SAME AS THE ; PROGRAM CYCLE ABOVE. ; XX0 . RET ; COMPARE: . . . AND 0FFH) AND 0FFH) ; ; THE FOLLOWING STATEMENT MUST BE RIGHT AFTER THE ABOVE STATEMENT & BE ; THE LAST STATEMENT BEFORE TL ;EXECUTE COMMAND JP (HL) ; NOT1ST: INC HL ;WASTE ENTRY NOT2ND: INC HL INC HL DJNZ NXTCMD ;IF NOT LAST ENTRY TH READC: JP Z,SYNERR ;IF NO OPERAND THEN ERR LD A,FALSE ;FLAG = NOT HEX LD (HXFLAG),A LD HL,(CMDPTR) ;GET ADDR CALL TR) ;THEN SEEK FILENAME LD C,' ' CALL SEARCH LD (CMDPTR),HL ; ; WE SHOULD NOW BE AT THE FILENAME ; RC1: LD HL,FCB ;FOJP CONT1 ;--------------------------------- ; ; FILE OPENED OK SO GET IT ; ;--------------------------------- RDC1: LD BTYPE> ; ;--------------------------------- NEWC: JP Z,NOSPEC ;IF NO OPERAND THEN PROMPT USER JP GOTPRM ;--------------0 !%)- "*. #'+/  $(,0&C,(PARAM1) ;GET FILE LD A,(HXFLAG) ;IF HEX THEN EXIT CP TRUE JR Z,RDC2 ; ; READ OBJECT FILE ; CALL RDFILE JR C,MEMEOR 1ST READ LD (BFRCNT),A LD HL,(PARAM1) ;SET PTR TO LOAD ADDR LD (BFRPTR),HL HEXRD1: CALL GETCH ;FETCH CHARACTER OFSE),HL ;SAVE BASE ADDRESS LD HL,(BFRPTR) ;SET LOAD PTR TO START OF BUFFER LD (HEXPTR),HL LD C,E ;IF LOAD_PTR + COUNT <= LRECORD COUNT = BYTE CALL BYTE ;GET LOAD ADDRESS JR C,HXERR LD H,A CALL BYTE JR C,HXERR LD L,A LD BC,(HEXBASE)R LD HL,(HEXPTR) ;RESTORE PTR LOOP: CALL BYTE ;INPUT DATA JR C,HXERR LD (HL),A INC HL DEC E ;IF (COUNT = COUN LD HL,HXTYPM ;OUTPUT ILLEGAL HEX RECORD TYPE JR HEXMO ; HXEMPT: LD HL,HXEMTM ;OUTPUT FILE EMPTY JR HEXMO ;--------PARAM3),HL ;SAVE COUNT IN P3 EX DE,HL ;OFFSET FIRST FOR PTR CALL CPBNDS LD (PARAM1),HL LD HL,(CMDPTR) LD C,' ' ;CHZ,WRC1 LD HL,DELMSG CALL EDITOR CALL CONIN ;IF 'Y' OR 'y' THEN DELETE CP 'Y' JR Z,WRC2 CP 'y' JP NZ,CONT1 ;ELSEB ;SHIFT A12..A14 OVER TO COMPENSATE HDW ADD A,D OUT (PADDRH),A ELSE LD A,E ;SET ADDR OUT (PADDRL),A LD A,D OBytes requested exceeds prom size!',0 CONFM: DB CR,'Wrong configurator installed!',0 INHM: DB CR,'Turn off Inhibit Switch & tyPTYPM ;OUTPUT 'ENTER PROM TYPE' CALL EDITOR CALL RDCON JR GOTPRM ; OPEN OK, READ PROM OVERLAY CONT2: LD BC,OVLBFR ;ROR' CALL EDITOR ; ; COMMAND INPUT ENTRY. ALL COMMANDS RETURN HERE IF OK. ; CONT1: CALL CRLF LD C,'*' ;OUTPUT PROMPT R1 ;IF INTO RESERVED MEMORY THEN ABORT JP Z,CONT1 LD HL,RDERRM ;OUTPUT 'READ ERROR' CALL EDITOR JP CONT1 ;--------- FILE JP C,HXEMPT ;IF FILE EMPTY THEN ERR CP ':' ;IF CHAR <> COLON THEN IGNORE JR NZ,HEXRD1 LD D,0 ;CHECKSUM = 0 AST THEN GET DATA LD B,0 ADD HL,BC LD BC,(MEMTOP) INC BC OR A SBC HL,BC JR C,GETREC JR MEMER1 ;ELSE OUTPUT ME ;IF NEW ADDR < BASE ADDR THEN ERR SBC HL,BC JR C,HXADERR LD BC,(BFRPTR) ;ELSE COMPUTE NEW PTR ADD HL,BC LD (HEXPTR)T -1) =<> 0 THEN LOOP JR NZ,LOOP CALL BYTE ;CHECK CHECKSUM JR C,HXERR XOR A ADD D JP Z,HEXRD HXERR: LD HL,H----------------------- ; ; SAVE FILE COMMAND ; SAVE FIRST, LAST HEX FILENAME ; ;------------------------------- SAVEC: JPECK FOR 'HEX' CALL SEARCH CALL SKIP LD (CMDPTR),HL ;UPDATE FOR ERRPTR JP Z,SYNERR CALL CKQHEX JP NZ,SYNERR LD HL RETURN TO COMMAND MODE WRC2: LD DE,FCB LD C,19 CALL BDOS WRC1: LD DE,FCB ;MAKE NEW FILE LD C,22 CALL BDOS ; ; UT (PADDRH),A ENDIF LD A,(HL) ;OUTPUT DATA OUT (PDATA),A RET ;############################ ; ; MESSAGES ; EAD INTO OVERLAY BUFFER CALL RDFILE CALL C,MEMER ;IF INTO RESERVED MEMORY THEN ERR JR C,NOSPEC ; & RETURN TO PROM PROMPT  CALL CONOUT CALL RDCON ;GET USER INPUT LD HL,(CMDPTR) CALL SKIP ;IF NO INPUT THEN ERR JR Z,SYNERR LD (CMDPTR),HL ------------------------ ; ; MEMORY BOUNDS ERROR ENTRY ; ;--------------------------------- MEMER1: CALL MEMER JP CONT1  CALL BYTE ;IF RECORD LENGTH = 0 THEN DONE JP C,HXERR ;FILE EMPTY AND A JP Z,CONT1 LD E,A ;RECORD COUNT = BYTE MORY ERROR ; HEXRD: CALL GETCH ;GET CHAR OF FILE JR C,HXERR CP ':' ;IF CHAR <> COLON THEN IGNORE JR NZ,HEXRD L,HL LD C,E ;IF PTR + COUNT > BFR_TOP THEN ERR LD B,0 ADD HL,BC LD BC,(MEMTOP) INC BC OR A SBC HL,BC JP NC,MEMXERM ;IF ERROR THEN TELL SO HEXMO: CALL EDITOR JP CONT1 ;--------------------------------- ; ; HEX FILE ERROR HANDLERS Z,SYNERR ;IF NO OPERANDS THEN ERR LD DE,PARAM1 ;GET 1ST & LAST LD HL,(CMDPTR) CALL GET2PAR JP C,SYNERR ; ; COUNT =,(CMDPTR) ;SET PTR TO FILENAME LD C,' ' CALL SEARCH CALL SKIP LD (CMDPTR),HL JP Z,SYNERR LD HL,FCB ;FORMAT FCB MAIN LOOP OF HEX OUTPUT ROUTINE ; HWRITE: LD A,0 ;CLEAR WRITE BUFFER LD (BFRCNT),A LD HL,DEFBFR LD (DBPTR),HL LD HL,(;############################ DERRM: DB CR,'Data Error at ',0 ISM: DB ' Is: ',0 SBM: DB ' Should be: ',0 ENDMSG: DB CR,0 ER,'Prom not erased! Continue? (Y/N) - ',0 IF PROMTYPE = 2708 ;################## ; ; VARIABLES ; ;################## PA OR A ;ELSE IF READ OK THEN GOTO COMMAND INPUT JR Z,CONT1 LD HL,RDERRM ;ELSE OUTPUT 'READ ERROR' & GOTO PROM PROMPT CALLLD E,(HL) ;1ST 2 CHARS OF CMD -> DE INC HL LD D,(HL) LD HL,CMDTBL LD B,(HL) ;FETCH TABLE SIZE NXTCMD: INC HL ;IF CMD ;---------------------------- ; ; HEX FILE READ ROUTINE ; ;---------------------------- RDC2: XOR A ;SET UP BUFFER FCALL BYTE ;GET LOAD ADDRESS OF 1ST RECORD & USE AS BASE JP C,HXERR LD H,A CALL BYTE JP C,HXERR LD L,A LD (HEXBAD D,0 ;CHECKSUM = 0 CALL BYTE JR C,HXERR ;FILE EMPTY AND A ;IF RECORD LENGTH = 0 THEN DONE JP Z,CONT1 LD E,A ;ER1 ; GETREC: CALL BYTE ;GET RECORD TYPE JR C,HXERR ;FILE EMPTY OR A ;IF RECORD TYPE <> 0 THEN ERROR JR NZ,HXTYPE ; ;--------------------------------- HXADERR: LD HL,HXADRM ;OUTPUT ILLEGAL LOAD ADDRESS REGRESSION JR HEXMO ; HXTYPER: LAST - FIRST + 1 ; LD DE,(PARAM1) ;HL= (PARAM2) OR A SBC HL,DE JP C,SYNERR ;IF FIRST > LAST THEN ERR INC HL LD (CALL FORMAT JP C,SYNERR JP NZ,SYNERR LD DE,FCB ;OPEN FILE, IF EXISTING THEN PROMPT FOR DELETE CALL OPEN INC A JR PARAM1) ;INIT START ADDR WR0: LD C,':' ;OUTPUT START OF RECORD SYMBOL CALL PCHAR JP C,WERR LD BC,16 PUSH HL ;SAVEASM: DB CR,'Bit(s) not Programmable. Try erasing.',0 SUCCM: DB CR,'Successful Program.',0 OKMSG: DB CR,'OK',0 TOOBGM: DB CR,'DING: DW 0 ;NUMBER OF PADDING BYTES AT END OF PROM ENDIF DS ( -($ AND 0FFH) AND 0FFH) PGMEND: EQU $ END  EDITOR JR NOSPEC ; ; SYNTAX ERROR HANDLER ; SYNERR: CALL ERRPTR ;OUTPUT ERROR PTR LD HL,SYNERM ;OUTPUT 'SYNTAX ERR <> ENTRY THEN SKIP LD A,(HL) CP E JR NZ,NOT1ST INC HL LD A,(HL) CP D JR NZ,NOT2ND INC HL ;FETCH SERVICE ADDR pe any key - ',0 EOCERM: DB CR,'Hardware Error- No EOC!',0 VERM: DB CR,'Program Voltage out of tolerance! : ',0 NTERAM: DB CR0 !%)- "*. #'+/  $(,0& TITLE GRH ENTERPRISES LABEL PRINTER LIST NOCOND ;*************************************************************************  ;WAIT FOR KEY PRESSED CALL BDOS LD B,11 ;LABEL COUNT (VERT) LP1: LD HL,DOUBLM ;PRINT 1ST LINE AS DOUBLE WIDE CALL PCS11 CALL PRINT LD HL,LABLIN2 CALL PRINT LD HL,SPCS12 CALL PRINT LD HL,LABLIN2 CALL PRINT CALL PCRLF LD HLP NZ,LP1 LD HL,FFM ;PAGE EJECT CALL PRINT LD DE,REQM ;QUERY FOR MORE LD C,9 CALL BDOS LD C,1 CALL BDOS AL ;SAVE PTR FROM BDOS LD C,5 RES 7,E ;CLEAR POSSIBLE END FLAG CALL BDOS POP HL BIT 7,(HL) INC HL JP Z,PRINT1 ,LF,'ANOTHER SHEET? (Y/N) - $' DOUBLM DM GS,US SINGLM DM RS LABLIN1 DM ' GRH ENTERPRISES' LABLIN2 DM ' 18921 PendergaR ;FILE EMPTY AND A ;IF RECORD LENGTH = 0 THEN DONE JP Z,CONT1 LD E,A ;RECORD COUNT = BYTE CALL BYTE ;GET LOAD ADDRE ;FILE EMPTY OR A ;IF RECORD TYPE <> 0 THEN ERROR JR NZ,HXTYPER LD HL,(HEXPTR) ;RESTORE PTR LOOP: CALL BYTE ;INPUT DAT  !a!d!!d!!d!c!w!!w!!w!!!!!FOR PTR CALL CPBNDS LD (PARAM1),HL LD HL,(CMDPTR) LD C,' ' ;CHECK FOR 'HEX' CALL SEARCH CALL SKIP LD (CMDPTR),HELETE CP 'Y' JR Z,WRC2 CP 'y' JP NZ,CONT1 ;ELSE RETURN TO COMMAND MODE WRC2: LD DE,FCB LD C,19 CALL BDOS WRC1: LE COUNT FOR RESTORING SBC HL,BC LD B,C ; REC_COUNT = 16 LD (PARAM3),HL ; COUNT -= 16 JR NC,WR2 ; ELSE REC_COU; ; ; ;************************************************************************* ; ; REVISIONS: ; ; 1.0 - 9 FEB 85 GRH RINT LD HL,LABLIN1 ;PRINT 1ST LINE OF 1ST GROUP OF LABELS CALL PRINT LD HL,SPCS1 ;SPACE TO MIDDLE LABEL CALL PRINT LD ,LABLIN3 CALL PRINT LD HL,SPCS11 CALL PRINT LD HL,LABLIN3 CALL PRINT LD HL,SPCS12 CALL PRINT LD HL,LABLIN3 CALND 5FH CP 'Y' LD DE,CONTM JP Z,RESTART JP 0 PCRLF: LD HL,CRLFM ;********************************************* POP BC RET ;************************************************************************* ; ; MESSAGES ; ;**************st Ave.' LABLIN3 DM ' CUPERTINO, CA 95014 ' LABLIN4 DM ' Phone 408 253-2275 ' SPCS1 DM ' ' SPCS2 DM ' ' SPCS1SS JR C,HXERR LD H,A CALL BYTE JR C,HXERR LD L,A LD BC,(HEXBASE) ;IF NEW ADDR < BASE ADDR THEN ERR SBC HL,BC JR A JR C,HXERR LD (HL),A INC HL DEC E ;IF (COUNT = COUNT -1) =<> 0 THEN LOOP JR NZ,LOOP CALL BYTE ;CHECK CHECKSUM !!!!!!!G _Y !^˻~# GRH Enterprises label maker VeD DE,FCB ;MAKE NEW FILE LD C,22 CALL BDOS ; ; MAIN LOOP OF HEX OUTPUT ROUTINE ; HWRITE: LD A,0 ;CLEAR WRITE BUFFER LNT = COUNT LD B,A LD HL,0 ; COUNT = 0 FOR LAST RECORD LD (PARAM3),HL WR2: POP HL ;RESTORE START PTR LD D,0 ;CHEC ; RELEASE ; VERS EQU '10' ;************************************************************************* BDOS EQU 0005H LFHL,LABLIN1 ;PRINT MIDDLE LABEL CALL PRINT LD HL,SPCS2 ;SPACE TO RIGHT LABEL CALL PRINT LD HL,LABLIN1 ;PRINT RIGHT LABEL L PRINT CALL PCRLF CALL PCRLF LD HL,LABLIN4 CALL PRINT LD HL,SPCS11 CALL PRINT LD HL,LABLIN4 CALL PRINT LD**************************** ; ; PRINT FUNCTION ; ENTRY - HL= STRING PTR (BIT 7 = 0: OK, 1: LAST CHAR ; EXIT - A = ? ; ;************************************************************* SIGNON DB CR,LF,'GRH Enterprises label maker Vers ' DB HIGH VERS1 DM ' ' SPCS12 DM ' ' CRLFM DM CR,LF FFM DM 0CH NXTGRPM DM CR,LF,LF END C,HXADERR LD BC,(BFRPTR) ;ELSE COMPUTE NEW PTR ADD HL,BC LD (HEXPTR),HL LD C,E ;IF PTR + COUNT > BFR_TOP THEN ERR LD  JR C,HXERR XOR A ADD D JP Z,HEXRD HXERR: LD HL,HXERM ;IF ERROR THEN TELL SO HEXMO: CALL EDITOR JP CONT1 HXADERR:rs 1.0 READY PRINTER AND PRESS ANY KEY TO CONTINUE CTRL-C TO STOP $ ANOTHER SHEET? (Y/N) - $ GRH ENTERPRISE 18921 (CMDPTR),HL JP Z,SYNERR LD HL,FCB ;FORMAT FCB CALL FORMAT JP C,SYNERR JP NZ,SYNERR LD DE,FCB ;OPEN FILE, IF EXD (BFRCNT),A LD HL,DEFBFR LD (DBPTR),HL LD HL,(PARAM1) ;INIT START ADDR WR0: LD C,':' ;OUTPUT START OF RECORD SYMBOL CKSUM = 0 LD A,B ;OUTPUT RECORD LENGTH OR A ;IF COUNT = 0 THEN SKIP TO EOF JR Z,WR5 CALL PBYTE JR C,WERR PUSH HL  EQU 0AH CR EQU 0DH GS EQU 1DH RS EQU 1EH US EQU 1FH ORG 0100H LD DE,SIGNON RESTART: LD C,9 CALL BDOS LD C,1  CALL PRINT CALL PCRLF ;NEXT LINE LD HL,SINGLM ;BACK TO SINGLE WIDE CALL PRINT LD HL,LABLIN2 CALL PRINT LD HL,SP HL,SPCS12 CALL PRINT LD HL,LABLIN4 CALL PRINT LD HL,NXTGRPM CALL PRINT DEC B ;IF PAGE NOT DONE THEN REPEAT J*********************************************************************** PRINT: PUSH BC PRINT1: LD E,(HL) ;GET CHAR PUSH H,'.',LOW VERS,CR,LF,LF CONTM DB 'READY PRINTER AND PRESS ANY KEY TO CONTINUE',CR,LF DB 'CTRL-C TO STOP',CR,LF,'$' REQM DB CR CHAR OF FILE JR C,HXERR CP ':' ;IF CHAR <> COLON THEN IGNORE JR NZ,HEXRD LD D,0 ;CHECKSUM = 0 CALL BYTE JR C,HXERB,0 ADD HL,BC LD BC,(MEMTOP) INC BC OR A SBC HL,BC JP NC,MEMER1 ; GETREC: CALL BYTE ;GET RECORD TYPE JR C,HXERR LD HL,HXADRM ;OUTPUT ILLEGAL LOAD ADDRESS REGRESSION JR HEXMO HXTYPER: LD HL,HXTYPM ;OUTPUT ILLEGAL HEX RECORD TYPE Pendergast Ave CUPERTINO, CA 95014 Phone 408 253-2275 ISTING THEN PROMPT FOR DELETE CALL OPEN INC A JR Z,WRC1 LD HL,DELMSG CALL EDITOR CALL CONIN ;IF 'Y' OR 'y' THEN DALL PCHAR JP C,WERR LD BC,16 PUSH HL ;SAVE START ADDR WR1: LD HL,(PARAM3) ;IF COUNT - 16 >= 0 THEN OR A LD A,L ;SAV ;SAVE PTR PUSH DE ;SAVE CS LD DE,(PGMBFR) ;REMOVE OFFSET FOR OUTPUT OR A SBC HL,DE POP DE ;CS LD A,H ;OUTPUT LOAL ;UPDATE FOR ERRPTR JP Z,SYNERR CALL CKQHEX JP NZ,SYNERR LD C,' ' ;POINT TO FILENAME CALL SEARCH CALL SKIP LD 0 !%)- "*. #'+/  $(,0&/************************************************************************* PLABEL prints the small prom labels with data. ][12] /* text to go onto label */ ,txtin[80] ,device[] = {"lst:"} ,*gets() ; static int n ,line_cnt ,cnt < 3 && lines[line_cnt - 1][0] != '\0'); /** Get the number of labels from the user **/ do { printf ("\nEnt0; (l_cnt + cnt) < n_labels && l_cnt < 5; l_cnt++) { fprintf(dev, "%-11s", &lines[n][0]); if (l_) != 'Y') { exit(0); } } } /************************************** get text function ************** Printer new line ***************************************/ pcrlf() { fprintf(dev, "\n"); } E LD A,E ;IF REMAINDER THEN BUMP COUNT OR D JR Z,COP2 INC HL COP2: LD (PGMCNT),HL COP1: CALL READV ;EXECUTE READ IUT FIRST, LAST & START JP C,SYNERR ;OOPS, NOT ENOUGH PARAMS CALL CKBNDS ;CHECK 1ST & LAST FOR BOUNDS JP C,BNDSM LD HL,(͹!9s#r! 9^#V^!9~#+!.!! 9^#V$! s!͹O!!9~#b!e!͛! 9^#V$! s!#fo#s#r+s`i ͹!!9^#Vs`i͹M!9^#V! 9~#fo͹M!! 9^#V͂! 9N#F!9s#r!͹|!!ʴ! ^!q!!`in&qs`i~#?ͼ! ^#V! ^#V! ^(!9s#r!ʗ!9~#~!Á!j!9s#r! ^&!9~#fo͛s#r! ^!qX*;! ^#Vs#r! ^#V";!! s!9^#V͂! 9N#F! ^! The lines may have up to 11 characters. Up to 3 lines will fit on a label. *********************************************,n_labels ,l_cnt ; printf("\nProm label printer vers %-.2f\n", (double) version); while (TRUE) { printf (er number of labels (0..15)\n"); n_labels = atoi( gets(txtin)); } while (n_labels > 45); /** Initcnt == 0 || l_cnt == 3) fprintf(dev, " "); if (l_cnt == 1 || l_cnt == 2) fprintf(dev, " "); ***************************************/ gettxt(buf, len) char *buf; int len; { char tbuf[258]; register int cnt;  LD (CSTART),HL LD DE,TEMP ;USE TEMP FOR TENTATIVE SKIP RESULT CALL GET1PC ;IF SKIP NOT SPEC'D THEN INCREMENT = 1 JRN OVERLAY JP CONT1 ;****************************************************** ; ; PROGRAM PROM COMMAND ; PROGRAM > ; ;****************************************************** PGMC: JP Z,SYNERR ;IF NO OPELUSIVE LD (PGMCNT),HL LD HL,(PARAM3) ;PSTART = START LD (PSTART),HL LD DE,TEMP ;USE TEMP FOR USER'S SKIP CALL GET1PRa!! s!! s#r!`is#r! s#r! s#r`i͂! 9^#VBK!f;V!9s#r!ʀ!9^#V! ʀ!9^#V`i#DM+sD G͂!9N#F`i~C! 9^#V`i#DM+^G͹@!!͂!9N#F!PYqDM`i ͹ʆ! 9^#V! 4͹ !! 9^#V`i:41!`i͂! 9N#F! ^#V`i^#Vi!9^#V!qj!9^#V`i~#fo#s#r+s!`is#r! s#r!`i~#)ͼ! ^#V!͹b!!9! ^,,͹! 9^#V! ^#V`is#r! ^#V! ^#V****************************************************/ #include libc.h FILE *dev; main() { static char lines[3 the user **/ line_cnt = 0; do { gettxt(&lines[line_cnt++][0], 12); } while (line_cnt bels **/ for (cnt = 0; cnt < n_labels; cnt += 5) { for (n = 0; n < line_cnt; n++) { for (l_cnt = /* do form feed before exit */ fclose(dev); printf("\nDone. Any more? (Y/N)\n"); if (toupper(*gets(txtin)> 1) blockmv(buf, &tbuf[2], len - 1); if (len > 0) buf[len] = '\0'; return buf; } /************************ 1 ;IF INCREMENT <> 1 THEN JR Z,COP1 LD H,0 LD L,A LD DE,(PGMCNT) ; COUNT = COUNT / INCREMENT EX DE,HL CALL DIVIDRANDS THEN ERR LD HL,(CMDPTR) ;IF CHAR = '!' THEN KEEP PREVIOUS VALUES LD A,(HL) CP '!' JR Z,PAGAIN CALL GET3PAR ;INPC LD A,1 ;IF NOT SPEC'D THEN DEFAULT INCREMENT = 1 LD (INCR),A JR C,PAGAIN LD A,L ;ELSE IF SKIP + 1 = 0 THEN INCREME!`is!9^#V!͹ʬ`i! 9~#fo͹ʬ!! 9^#V͂! 9^#V!9s#r! 9~#fo+s#r!!9^#VVDM`i!9~!! 9^#V4͂! 9^#VDM͹! 9^#V!9s#r!͹!!9^#V!ͽPY͛͂! 9N#F! ^#V`i^#Vs!q͂!! 9^#Vj͂!f;DM`i;-`i DMê͂! 9N#F!!9s#r`i~X! ^!q!! s#r!`in&͛s! 9^#V`i~#fo#s#r+s!q͂! 9N#F! ^#V!͹`i! s#r*;|*;!9s#r*;^#V!9~#foqs#ré`i~#fo+s#r!b !9^#V͂!9N#F`i~!q;`i#DM+^G͹!!q;!0 !%)- "*. #'+/  $(,0&";.! ^#VR!9s#rz.!! s#r!`in&͛s!9^#V! s#r͂*+8|m!!")8"+8*+8DM!9^#V*+8"+8+^!F9s#r!0J!F9^#V!9J!>9^#V! q!F9~#fo!>9s#r!F9^#V!.͹ʿ!!@9s#r!N9~#fo#s#r+^!F9s#r6C!9! !>93%43!9!49s#r!-!69~#fo+s#rsf!9! !>933!9!49s#râ!9! !>933' o!B9^#V`í!!69s#r5!69~#fo#s#r!49^#V~u!69^#V!@9~#fou!49~#fo#s#r+^`í&!D9~#¬!9*" !b !b*7DM*7o&b>!o&b*7*+++*7DM*7!9N#F#^#Vkb6#> 6 #=i!>6#=r! : > ͹#`i^! ͹%#!`i#DM+s(#"!9^#V&!9~#Z#!!9^#V$!9s#rs#!!9^#V$!9s#r!9^#V!͹9s#r(%! 9~#fos#r!9~#fo#s#r!9^#V! R%! 9^#V!^#V!$͹\%%!"\;!!S933' !9!49s#râ!:93G7!49s#rf2!89s#rú!F9^#V!e͹!!!B9^#V!͹>9~#fo+s#r#!89~#foʬ! `íý!F9^#V`í/͂! 9N#F`i473! 934ͪ5G7/8^!9~#fo+s#rs!¥! A![Җ!@â!a!{!`w# .!!ʨ!!w#é!{o|g !!w#!!!|a{ !9^#V*@8!9}#!3$!A2!9^#V!ͬ2!U$!ͬ2!f2!!,,! W$$`i*8#"8+)B8s#r`i#DM~$`i^! ͹ $`i^V2ʍ%d%! ^#V!9s#r!9^#V!q#!9s#r!9^#V!q%!9^#V^! 9^#Vsz%!"\;!!9^#V!q&!9^#V#^_'!"\;!! 9^#VV!ʧ'!"\;!! 9^#V!q'!!!!͹(! 9^#V!q'!!͹(!"\;!M!9~#fo.ʙ)!9^#VBK!9^#V! 9^#Vz*ʷ)!!9^#V`i:!9s#rz"*!9^#V!9^#V`i! 9^#Vͩ0!9s#r9^#V!ͽPYDM`i!9~#fo--!9^#V`i!9^#V`i! 9^#V--`i!9^#V͂!9N#F!!!!!!"\;!9^#V)))<^#VBK!9^#V!0!!͹/!"\;ͽ3!#!!!$ s! 9!! ^#V&7ͯ343!$ ^474̀-8s͂!9^#V*-8#"-8+s!q͂!L9N#F!N9~#fo#s#r+^!F9s#rz!F9^#V!%͹ʯ!!9s!!D9s#r! !B9s#r!r33ÿ!F9^#V!d͹F!:9!R9~#fo##s#r++^#V473ÿ!F9^#V!e͹v!F9^#V!f͹v!F9^#V!g͹ʜ!9!R9!!B9^#V!9! 9B̓͘!9! 9!49s#rf2!89s#r!!@9s#rú!:93G7!F9s#r!F9^#V!9!69s#rsâ9`i4743p5354!9^#V͂!9N#F! 93ͯ36 ! 93G7q!9s#r! 9! 93ͯ3'5ͯ3ͬ4|"*@8"@8|!͂!!!~81!:o&q~8s!2$"B8!~8DM!"8*8$`i^! ͹}"`i^! ͹ʅ"`i#! ͹$!`i#DM+s$#T"!B8*8W$Can't open file for redirection: ͂͠!9~#q$!u$0 !A:$$$.SUB! 9^#V#sz&!"\;!! ^#V! 9^#V!s#r!9^#V##^! 9^#V##s!9^#V###^! 9^#V###s!$! 9^#V!s#r! $(! 9^#V!q͹$(!"\;!!!! s#r!# s!$ s`i!9^#V!s#r! 9^#V!q#!% s!q~(!(!9^#V!s#rÑ(!z"*!9^#V!9~#foͽPY!9^#V!ͽPYDM`i!9~#fo-q*!9^#V`i!9^#V`i! 9^#Vz*q*`i!9^#V͂!#,! 9^#V!`i#DM+s!͹#,+!9^#V͂!9^#V!Q,!9^#V! [,!"\;!!9^#V)));DM! 9^#V! 9^#V! .*\;͹,.!"\;!!!18.*\;|8.!! 9^#V! 9^#V!$ ^!1!"!"\;|p.!!$ ^! 9~#fo443̀4340!"\;ͽ3//00!!# s! 93ͯ36o0!!! s#r!$ s!"\;ͽ3! 93G7q!@9s#r!N9^#V^!F9s#r!-͹!!D9s#r!N9~#fo#s#r+^!F9s#r!F9^#V!0͹!0!B9s#r!!>9s#r!N9~#fo#s#r~#fos#rBaÿ!:9!R9~#fo##s#r++^#V&73!F9^#V{!9!!>933' !9!49s#râ!:93ͯ3oduixsefcOa!9!49~#fo!89s#r!89^#V!@9~#fo!@9^#V!89s#r!D9~#!>9~#fo+s#r#!89~#f3`iͣ473!934ͪ5G7)!9~#fo/8^!9~#fo+s#rs! 9`iͣ4743p53!9^#V!933!DMa"`i^z$`i^!>͹ʫ"!!9s#r"`i^!<͹#!!9s#r`i#DM^! ͹"`i^! ͹""`i!9s#r`i#DM~(#`i^!!"\;!͂!con:CON:lst:LST:prn:PRN:pun:PUN:rdr:RDR:͂! 9^#V!! 9^#V$͂!;! 9s#r!!9^#V!9^#V!9^#V!9^#V!9^#V!^#V́! 9!&!!9^#V͂!9^#V!&!9^#V! &!"\;!!9^(!9^#V!s#r!͂!! 9^#V!%s!͂!9N#F!!!!% s!͂!9^#V!(!9^#V! )!"\;!9N#F!!!!!!"\;|ʩ*!! 9^#V!$ ^!!9^#V1!$ ^! 9~#foq!$ sz*`i!~#fo#s#r!^#V! ^)<;^#V́͂!DM!9^#V!9s#r!9^#V!$~-!9^#V!$^!DM!9~#fo.,!9^#VBK!9^#V! q!$ sz¢.`i!~#fo#s#r!͂!9N#F!!9s#r.!9~#fo#s#r!9^#V!9~#fo-/`i#DM+^!9s#r!9^#V! ͹!$ s! 93ͯ3'5G7!! s#r! 93b!ö0b"*7!"7*70*7!40#4*7+"7}·0o&"\;*7͂!ʏ+! 9^#VBK*:;8:!9^#V1`i*:;":;`i:9:o&}29:`i͂! 9N#F!!9s#r+!9~#fo#s#r!9^#V!9~#fo0 !%)- "*. #'+/  $(,0&9!.9^#VV!!9!!͂! 9N#F!!9s#r`i^!-͹X1`i#DM!!9s#rk1`i^!+͹k1`i#DM!!9s#r`i^q3!|!9^#V#n"3#3x3 +~"33!9~ W3 W3 W3l3!9~Al3[l3!}!9~al3{W3!!9~0l3:l3G*;^#V#~#fo))5# 5DM*;s#r#q#p*;~?W*;###~L5~w+>5:57~w+P5L5~#a5O(4*;P;^5y2N;*66O4666O466O4666*;s#r#6#6*;s#r#z.76#6*;^#V$,..EN RETURN NZ JR Z,FOUND CP ';' ;IF CHAR = ';' THEN RETURN Z RET Z INC HL ;ELSE TRY NEXT CHAR JR SEARCH ; FOUND: OR ; MESSAGE EDITOR SUBR OUTPUTS TEXT STRING UNTIL A NUL IS FOUND. ; BYTES > 7FH ARE CONVERTED TO SPACES, SINGLE CR CHAR IS OUT START ADDR WR1: LD HL,(PARAM3) ;IF COUNT - 16 >= 0 THEN OR A LD A,L ;SAVE COUNT FOR RESTORING SBC HL,BC LD B,C ; R) ;REMOVE OFFSET FOR OUTPUT OR A SBC HL,DE POP DE ;CS LD A,H ;OUTPUT LOAD ADDR CALL PBYTE JR C,WERRP LD A,L (PARAM3) ;IF COUNT = 0 THEN DONE LD A,L OR H POP HL JP NZ,WR0 ;ELSE DO ANOTHER LINE LD C,':' ;OUTPUT END OF FILE R JP Z,SYNERR ;IF NO OPERANDS THEN ERR CALL GET3PAR JP C,SYNERR CALL CKBNDS JP C,BNDSM LD DE,(PARAM1) ;FIRST LDʫ1!9^#V! q`i#DM+^!9s#rv1!9~#1!9^#V͉1!9^#V! 9F+N+V+^+~+ngx1w# 1!9^#V#N#F#nx2W3!9~aڔ3{Ҕ3 o&!9~Aڪ3[Ҫ3 o&!*;3!*;w#w#w#w*;~#~#~#~"D;*;V+^+V+^*D;X;^5:N;2N;5P;*;w#™5:N;%4*;P;^5y2N;*;X;^55T;*;w#5:N;%4!T;w#5> 2O;!P;~w#5Olst:77F;J;$$$ A RET ; ; SKIP BYPASSES TRAILING SPACES UNTIL NON-SPACE CHAR IS FOUND ; ENTRY- HL= STRING PTR ; EXIT - HL= 1ST NON-SPACE PUT AS CR-LF PAIR ; & ALL OTHER CHARS ARE OUTPUT AS IS. ; ENTRY- BC = STRING PTR ; EXIT - HL= END OF STRING PTR ; ALL OTHE REC_COUNT = 16 LD (PARAM3),HL ; COUNT -= 16 JR NC,WR2 ; ELSE REC_COUNT = COUNT LD B,A LD HL,0 ; COUNT = 0 FOECORD CALL PCHAR JR C,WERR WR5: LD B,5 ;OUTPUT 5 00 BYTES WR4: XOR A CALL PBYTE JR C,WERR DJNZ WR4 CALL C HL,(PARAM2) ;LAST SBC HL,DE ;IF FIRST > LAST THEN ERR JP C,SYNERR PUSH HL ;ELSE COUNT = LAST - FIRST POP BC LD A,s# 1!9^#V#~#fox,212,2# 2!;2!}!}!9^#V#~#foxc2~c2# R2!9~#fo{2#r2}!;"D;*;s#r#s#r*D;*;*;";";*;>w#+4*;~6#:46=ɯ<*;*;###i4K4m4G4G4K4+o4T;!X;# 6y$6!P;4!O;55!O;5V6!P;~w#16OT;!X;#D6y$66T;!X;#_6*;X;~#r6*;0123456789abcdef<$@)++$$$$$$$$$$$$;$;$;$;$;$;$;$CHAR PTR ; A= NON-SPACE CHAR ; ZF= NOT FOUND ; SKIP: LD A,(HL) CP ' ' ;IF CHAR <> ' ' THEN RETURN JR NZ,FOUND INC HR REGS ? ; EDITOR: PUSH HL EDITLP: POP HL LD A,(HL) ;GET CHAR INC HL OR A RET Z PUSH HL LD C,A ;IF CHAR >= 80H R LAST RECORD LD (PARAM3),HL WR2: POP HL ;RESTORE START PTR LD D,0 ;CHECKSUM = 0 LD A,B ;OUTPUT RECORD LENGTH OR A FROM MEMORY CALL PBYTE JR C,WERR INC HL ;PTR += 1 DJNZ WR3 ;NEXT BYTE XOR A ;OUTPUT -CHECKSUM SUB A,D CALLLOSE JR C,WERR JP CONT1 WERRP: POP HL ;BALANCE STACK WERR: LD HL,WRERRM ;OUTPUT WRITE ERROR CALL EDITOR JP COC ;IF CNT = 0 THEN ERR OR B JP Z,SYNERR LD A,(PARAM3) ;GET VALUE LD HL,(PARAM1) LD (HL),A ;SET FIRST LOCATION PU9^#V#^#V#N#F2!9^#V#^#V#N#FR2!9^#V#~#foxc2~2# þ2R2!9^#V#^#V#N#Fþ2!9^#V#n~33#2*;*;#‹4*;*;#¡4*;*;#¶4*;*;#4*;*;#4*;~/w#4*;~?T;~#‚6!P;w#6> 2O;!P;~w#¡66P;!X;#µ666!O;5›6*;P;w#6O46!O46! 1 THEN JR Z,COP1 LD H,0 LD L,A LD DE,(PGMCNT) ; COUNT = COUNT ----- PGMC: JP Z,SYNERR ;IF NO OPERANDS THEN ERR LD HL,(CMDPTR) ;IF CHAR = '!' THEN KEEP PREVIOUS VALUES LD A,(HL) CP 'EMP ;USE TEMP FOR USER'S SKIP CALL GET1PC LD A,1 ;IF NOT SPEC'D THEN DEFAULT INCREMENT = 1 LD (INCR),A JR C,PAGAIN PROGRAM JP CONT1 ;----------------------- ; ; HELP COMMAND ; HELP ; ;----------------------- HELPC: LD HL,HELPM  GET3PAR ;ELSE GET FIRST, LAST & START JP C,SYNERR ;OOPS, NOT 3 CALL CKBNDS JP C,BNDSM LD HL,(PARAM2) ;PGMCNT = LAS INCREMENT = SKIP + 1 CP 1 ;IF INCREMENT <> 1 THEN JR Z,CAGAIN LD H,0 ; COUNT = COUNT / INCREMENT LD L,A LD DE,(PGIF 1ST CHAR = ',' THEN USE DEFAULT CP ',' JR Z,DISP1 CALL GETNUM ;ELSE GET PARAMETER 1 JP C,SYNERR CALL CPBNDS ;YNERR CALL CPBNDS ;ADD OFFSET TOWARD BUFFER DISP3: LD (DISEND),HL DISP4: CALL CRLF ;NEW LINE CALL CSTS ;IF KEY PRTRT),HL ;UPDATE TO NEW START CALL SPACE LD HL,(DISTMP) ;START OVER DISP7: LD A,(HL) ;IF CHAR = PRINTING THEN OK AS IS TINATION OUT OF BOUNDS THEN ERR CALL CPBNDS JP C,BNDSM LD (PARAM3),HL LD HL,(PARAM1) ;ADD BUFFER BIAS TO VALUES CALLLDIR JP CONT1 ; SPLIT: LD HL,(PARAM3) ;DEST = DEST + CNT ADD HL,BC EX DE,HL LD HL,(PARAM2) INC BC ;INCLUSIVE LDLOC LD (CSTART),HL LD A,1 ;SKIP = 1 LD (INCR),A LD DE,TEMP ;USE TEMP FOR TENTATIVE DEST RESULT CALL GET1PC JR C,/ INCREMENT EX DE,HL CALL DIVIDE LD A,E ;IF REMAINDER THEN BUMP COUNT OR D JR Z,COP2 INC HL COP2: LD (PGMCNT),"' JR Z,PAGAIN CALL GET3PAR ;INPUT FIRST, LAST & START JP C,SYNERR ;OOPS, NOT ENOUGH PARAMS CALL CKBNDS ;CHECK 1ST LD A,L ;ELSE IF SKIP + 1 = 0 THEN INCREMENT = 1 INC A JR Z,PAGAIN LD (INCR),A ;ELSE INCREMENT = SKIP + 1 CP 1 ;IF I CALL EDITOR JP CONT1 ;----------------------------------------------------- ; ; COMPARE PROM TO MEMORY BUFFER COMMANT - FIRST + 1 LD DE,(PARAM1) SBC HL,DE INC HL LD (PGMCNT),HL LD (CSTART),DE ;CSTART = FIRST LD HL,(PARAM3) ;PSTART =MCNT) EX DE,HL CALL DIVIDE LD A,E ;IF REMAINDER THEN BUMP COUNT OR D JR Z,CMP1 INC HL CMP1: LD (PGMCNT),HL ESSED THEN ABORT JP NZ,CONT1 LD HL,(DISTRT) ;TEMP = START LD (DISTMP),HL LD DE,(PGMBFR) ;OUTPUT OFFSET ADDR SBC HL,DCP 7FH JR NC,OUTDEC CP ' ' JR NC,DISPOK OUTDEC: LD A,'.' ;ELSE OUTPUT '.' DISPOK: PUSH HL LD C,A CALL CONOUT  CPBNDS LD (PARAM1),HL LD HL,(PARAM2) CALL CPBNDS LD (PARAM2),HL LD DE,(PARAM1) ;IF FIRST > LAST THEN ERR OR A SBC A,C OR B JP Z,SYNERR LDDR JP CONT1 ;--------------------------------- ; ; COPY PROM INTO RAM COMMAND ; COCOP1 CALL CPBNDS JP C,BNDSM LD (CSTART),HL LD DE,TEMP ;USE TEMP FOR TENTATIVE SKIP RESULT CALL GET1PC ;IF SKIPHL COP1: CALL READV ;EXECUTE READ IN OVERLAY JP CONT1 ;----------------------------------------------------- ; ;  & LAST FOR BOUNDS JP C,BNDSM LD HL,(PARAM1) ;CSTART = FIRST LD (CSTART),HL EX DE,HL ;COUNT = LAST - FIRST + 1 LD HNCREMENT <> 1 THEN JR Z,PAGAIN LD H,0 LD L,A LD DE,(PGMCNT) ; COUNT = COUNT / INCREMENT EX DE,HL CALL DIVIDE LD D ;CPARE > ; ;----------------------------------------------------- CMPC: JP Z,SYNE START LD (PSTART),HL LD DE,TEMP ;USE TEMP FOR ACCUMULATOR CALL GET1PC LD A,1 ;IF NOT SPEC'D THEN DEFAULT INCREMENT CAGAIN: CALL COMPV ;GO COMPARE JP CONT1 ;---------------------------- ; ; DISPLAY MEMORY COMMAND ; DISPLAY < LD C,A CALL SEARCH JR NZ,DISP2 LD HL,(DISTRT) ;ELSE END = START MOD 16 + 255 LD A,L AND 0F0H LD L,A LD DE,255E CALL PRT2H LD HL,(DISTRT) ;RESTORE PTR DISP5: PUSH HL CALL SPACE POP HL LD A,(HL) ;PRINT DATA INC HL PUSH HL POP HL INC HL ;PTR = PTR + 1 LD DE,(DISTRT) ;IF PTR = NEXT START THEN DONE LD A,E SUB L JR NZ,DISP7 LD A,D SU HL,DE JP C,SYNERR PUSH HL ;ELSE CNT = # OF BYTES POP BC EX DE,HL ;IF DEST > FIRST THEN LD DE,(PARAM3) SBC HL,DEPY COUNT <,DEST <,SKIP>> ; ;--------------------------------- COPYC: JP Z,SYNERR ;IF NO OPERANDS THEN ERR LD HL,(CMDPTR)  NOT SPEC'D THEN INCREMENT = 1 JR C,COP1 LD A,L ;ELSE IF SKIP + 1 = 0 THEN INCREMENT = 1 INC A JR Z,COP1 LD (INCRPROGRAM PROM COMMAND ; PROGRAM > ; ;------------------------------------------------L,(PARAM2) ;LAST SBC HL,DE INC HL ;INCLUSIVE LD (PGMCNT),HL LD HL,(PARAM3) ;PSTART = START LD (PSTART),HL LD DE,TA,E ;IF REMAINDER THEN BUMP COUNT OR D JR Z,PGM1 INC HL PGM1: LD (PGMCNT),HL PAGAIN: CALL PRGMV ;ALL SET UP, GO RR ;IF NO PARAMS THEN ERR LD HL,(CMDPTR) ;IF CHAR = '!' THEN USE PREVIOUS VALUES LD A,(HL) CP '"' JR Z,CAGAIN CALL= 1 LD (INCR),A JR C,CAGAIN LD A,L ;ELSE IF SKIP + 1 = 0 THEN INCREMENT = 1 INC A JR Z,CAGAIN LD (INCR),A ;ELSE,LAST> ; ;---------------------------- DISPC: LD HL,(CMDPTR) JR Z,DISP1 ;IF NO OPERANDS THEN USE DEFAULTS LD A,(HL) ; ADD HL,DE JR DISP3 ; DISP2: INC HL ;GET VALUE OF END CALL SKIP JP Z,SYNERR LD (CMDPTR),HL CALL GETNUM JP C,S CALL PRTHEX POP HL CALL CKDONE ;IF PTR = END THEN DONE JR C,DISP6 LD A,L AND 0FH JR NZ,DISP5 DISP6: LD (DISB H JR NZ,DISP7 EX DE,HL CALL CKDONE ;IF NOT DONE THEN DO NEXT LINE JP C,CONT1 JR DISP4 ;-------------------ADD OFFSET LD (DISTRT),HL DISP1: LD HL,(CMDPTR) ;IF NO ,NNNN THEN END= START + 12 LINES LD A,',' CP (HL) JR Z,DISP2 0 !%)- "*. #'+/  $(,0&-------------- ; ; SUBSTITUTE MEMORY COMMAND ;SUBSTITUTE ADDR ; ;--------------------------------- SUBSC: JP Z,SYNERR ;I;OUTPUT ANOTHER SPACE CALL RDCON ;GET USER INPUT LD HL,(CMDPTR) ;IF NULL LINE THEN SKIP LOCATION CALL SKIP LD DE,(DISTMM COMMAND ;CHECKSUM FIRST, LAST <,SKIP> ; ;------------------------------------------- CHEKC: JP Z,SYNERR ;IF NO OPERANDS THARAM2),HL POP HL ;P1 CALL CPBNDS ;FIRST = FIRST + .BUFFER LD (PARAM1),HL PUSH BC ;COUNT LD DE,PARAM3 ;GET POSSIBL COUNT OR D JR Z,CHK4 INC HL CHK4: PUSH HL CHK0: POP BC ;COUNT LD HL,(PARAM1) LD DE,0 ;ACCUM = 0 CHK2: LDALL CONOUT LD HL,0 OR A POP DE SBC HL,DE CALL PRT2H CALL CRLF ;ANOTHER NEW LINE JP CONT1 ;----------------ADD OFFSET TO VALUE LD (PARAM2),HL PUSH HL LD HL,(PARAM1) CALL CPBNDS LD (PARAM1),HL EX DE,HL ;TEST FOR LAST < SKIP ;GET CHAR JR Z,LISTDN INC HL ;POINT TO NEXT CHAR NOW CP ' ' ;IF SPACE THEN DONE JR Z,STORIT CP 'X' ;IF  JP C,SYNERR ;IF NOT HEX THEN ERROR SLA C ;MOVE 1ST NIBBLE OVER SLA C SLA C SLA C OR C ;ADD 2ND NIBBLE TO 1ST NIBEARCH ; SRCH3: LD HL,(PARAM2) ;START AT FIRST LD DE,(PARAM1) ;IF DONE THEN STOP OR A SBC HL,DE JP C,CONT1 INC DE D HL,(PARAM1) ;OUTPUT ADDRESS DEC HL LD DE,(PGMBFR) OR A SBC HL,DE CALL PRT2H JP SRCH3 ;----------------------- OR A SBC HL,DE JP C,SYNERR INC HL ;INCLUSIVE LD C,L ;ELSE CNT = # OF BYTES LD B,H LD HL,(PARAM3) ;SET PTR F NO OPERANDS THEN ERR LD HL,(CMDPTR) CALL GETNUM JP C,SYNERR CALL CPBNDS ;IF ADDR OUT OF BOUNDS THEN ERR JP C,BNP) JR Z,SUBS1 LD A,(HL) ;IF CHAR = '.' THEN ABORT CP '.' JP Z,CONT1 CALL GETNUM ;ELSE CONVERT TO NUMBER LD A,HEN ERR LD DE,PARAM1 ;SET UP FOR GET2PAR LD HL,(CMDPTR) CALL GET2PAR JP C,SYNERR ;IF NOT THERE THEN ERR ; ; IF LAST E SKIP CALL GET1PC LD DE,1 ;IF SKIP NOT SPEC'D THEN DEFAULT INCREMENT = 1 LD (PARAM3),DE JR C,CHK0 LD A,L ;ELSE IN A,E ;ACCUM = ACCUM + (MEMORY) ADD (HL) LD E,A JP NC,CHK1 INC D CHK1: LD A,(PARAM3) ;PTR = PTR + SKIP ADD A,L -------------------------------- ; ; SEARCH BUFFER FOR A LIST OF BYTES COMMAND ; TABLE BYTE 1: 00= FOLLOWING BYTE = DATA ; FIRST (HL= PARAM2) POP HL OR A SBC HL,DE JP C,SYNERR LD HL,(CMDPTR) ;SEARCH FOR LIST LD C,',' CALL SEARCH ;IF NDON'T CARE THEN EXIT JR Z,DNTCARE CALL ASC2HX ;CONVERT IT JP C,SYNERR ;IF NOT HEX THEN ERROR LD C,A ;STORE BYTE BLE LD C,A STORIT: LD A,C INC DE ;POINT TO FOLLOWING BYTE LD (DE),A INC DE JR NXTLST DNTCARE: LD A,80H ;CH---------- ; ; COMPARE BUFFER COMMAND ;CB FIRST1, LAST, FIRST2 ; ;--------------------------------- CPBUFC: CALL GET3PAR  CPBNXT: LD A,C ;IF DONE THEN EXIT OR B JP Z,CONT1 LD A,(DE) ;IF EQUAL THEN DO NEXT CP (HL) INC HL INC DE DEC DSM SUBS2: LD (DISTMP),HL ;SAVE ADDR PUSH HL ;OUTPUT ADDR CALL CRLF POP HL PUSH HL OR A ;ADD OFFSET LD DE,(PGMB ;IF NUMBER > 255 THEN ERR OR A JP NZ,SYNERR LD A,L ;LOAD DATA INTO LOCATION LD DE,(DISTMP) LD (DE),A SUBS1: IN< FIRST THEN ERR ; LD DE,(PARAM1) ;HL= (PARAM2) PUSH HL ;P2 OR A ;CNT = LAST - FIRST + 1 SBC HL,DE PUSH HL POP CREMENT = SKIP + 1 INC A LD L,A JR Z,CHK0 ;IF INCREMENT = 0 THEN INCREMENT = 1 LD (PARAM3),A CP 1 ;IF INCREMENT <>LD L,A JP NC,CHK3 INC H CHK3: DEC BC ;CNT = CNT - 1 LD A,C ;IF CNT <> 0 THEN LOOP OR B JP NZ,CHK2 PUSH DE  80= DON'T CARE ; FF= END OF LIST ; ;------------------------------------------------ SERCHC: JP Z,SYNERR ;IF NOOT THERE THEN ERROR JP Z,SYNERR INC HL CALL SKIP JP Z,SYNERR LD DE,CMDBFR ;USE BEGINNING OF COMMAND LINE FOR BYTES LD A,(HL) ;GET 2ND CHAR OR A ;IF 2ND CHAR == NUL THEN GO STORE 1ST CHAR & JR Z,LISTDN2 ; GOTO DONE CP ' ' ;IF SPANGE FLAG TO DON'T CARE LD (DE),A INC DE LD A,(HL) ;IF 2 'X'S THEN SKIP 2ND CP 'X' JR NZ,NXTLST INC HL JR NXTLSH4 BIT 7,(HL) ;IF DON'T CARE THEN ASSUME OK JR NZ,SRCH6 INC HL ;IS FOLLOWING BYTE SO POINT TO IT LD A,(DE) ;IF CO JP C,SYNERR ; ; ADD BUFFER BIAS TO PARAMETERS ; CALL CPBNDS LD (PARAM3),HL LD HL,(PARAM1) ;ADD BUFFER BIAS TO VALUEBC JR Z,CPBNXT ; ; NO MATCH, OUTPUT ADDRESS OF SOURCE ; EX DE,HL ;HL= SOURCE PUSH DE ;SAVE PUSH HL PUSH BC DECFR) SBC HL,DE CALL PRT2H CALL SPACE ;OUTPUT SPACE POP DE LD A,(DE) ;OUTPUT CURRENT DATA CALL PRTHEX CALL SPACE C DE ;NEXT LOCATION EX DE,HL JR SUBS2 ;------------------------------------------- ; ; CALCULATE MOD 65536 CHECKSUBC INC BC POP HL ;P2 JP C,SYNERR ;IF FIRST > LAST THEN ERR PUSH DE ;P1 CALL CPBNDS ;LAST = LAST + .BUFFER LD (P 1 THEN JR Z,CHK0 LD H,0 POP DE ; COUNT = COUNT / INCREMENT EX DE,HL CALL DIVIDE LD A,E ;IF REMAINDER THEN BUMP;CHECKSUM CALL CRLF ;NEWLINE POP HL ;OUTPUT CHECKSUM PUSH HL CALL PRT2H CALL SPACE LD C,'-' ;OUTPUT -CHECKSUM C OPERANDS THEN ERROR LD DE,PARAM1 ;SETUP & GET 2 PARAMETERS LD HL,(CMDPTR) CALL GET2PAR JP C,SYNERR CALL CPBNDS ; NXTLST: LD (CMDPTR),HL ;SAVE PTR FOR SYNERR XOR A ;ASSUME BYTE FOLLOWS LD (DE),A LD C,0 ;ACCUMULATOR = 0 CALL ACE THEN DONE JR Z,STORIT CP 'X' ;IF DON'T CARE THEN EXIT JR Z,STORIT INC HL ;NOW NEXT CALL ASC2HX ;CONVERT IT T LISTDN2: LD A,C INC DE LD (DE),A INC DE LISTDN: LD A,-1 ;STORE END OF LIST LD (DE),A ; ; LIST FORMED, DO SMPARE FAILS THEN DO NEXT STRING CP (HL) JR NZ,SRCH3 SRCH6: INC HL ;NEXT BYTE INC DE JP SRCH5 SRCH4: CALL CRLF LS CALL CPBNDS LD (PARAM1),HL LD HL,(PARAM2) CALL CPBNDS LD (PARAM2),HL LD DE,(PARAM1) ;IF FIRST > LAST THEN ERR  HL ;NEGATE PRE-INCREMENT LD DE,(PGMBFR) ;REMOVE OFFSET OR A SBC HL,DE PUSH HL CALL CRLF POP HL CALL PRT2H POP ;NEXT TO SEARCH LD (PARAM1),DE DEC DE LD HL,CMDBFR ;LIST START SRCH5: BIT 0,(HL) ;IF END THEN LIST FOUND JR NZ,SRC 0 !%)- "*. #'+/  $(,0&mÃ*R0!O(!9y !X>2>>>t> >>>>'K[ͣ  y !cessful Program. OK Bytes requested exceeds prom size! Wrong configurator installed! Turn off Inhibit Switch & type any key 2?\(652?`($( $&2?#$($(%($&###2?d(##%(mÃ*R0!O(!9y !X>2>>>t> >>>>'K[ͣ  y !cessful Program. OK Bytes requested exceeds prom size! Wrong configurator installed! Turn off Inhibit Switch & type any key 2?\(652?`($( $&2?#$($(%($&###2?d(##%(BC ;RESTORE POP HL ;RESTORE PRE-INCREMENT POP DE EX DE,HL JR CPBNXT ;NEXT LOCATION SUBTTL SUBROUTINES ;*********1 FOR THE PROMPT LD B,L LD C,'-' ;OUTPUT STRING OF - UNTIL ERROR CHAR DASHLP: PUSH BC CALL CONOUT POP BC DJNZ DASH**************************** ; ; CHECK FOR TOKEN 'HEX ' SUBR. USED IN READ & SAVE CMDS ; ENTRY- HL= FIELD PTR TO CHECK ; EXI= BYTE FROM ASCII-HEX ; D= NEW CHECKSUM ; CF= ERROR ; ;********************************************************** BYTE: C_Y> y >$˯@(!88 !>K*[{z~> >: o$ y- Hardware Error- No EOC! Program Voltage out of tolerance! : Prom not erased! Continue? (Y/N) - I @BB $A"$&662?h(65%( $&W % %$& "$& /%(%%& - % %65$&H_Y> y >$˯@(!88 !>K*[{z~> >: o$ y- Hardware Error- No EOC! Program Voltage out of tolerance! : Prom not erased! Continue? (Y/N) - I @BB $A"$&662?h(65%( $&W % %$& "$& /%(%%& - % %65$&H******************************************************************* ; ; ERROR POINTER SUBR OUTPUTS ERROR POINTER UNDER COMMANDT - ZF= TRUE, NZ= NOT HEX ; ;******************************************************************** CKQHEX: LD B,4 LD DE,HEXMALL GETCH ;GET 1ST DIGIT RET C CALL ASC2HX ;TRY TO CONVERT BUT IF DIGIT NOT HEX THEN ERR JR C,CVERR ADD A,A ;MOVE>*[KW !!z{!ͣ!~!!ͣ: of$ yW*[KW !$$$I$$H!!! BH" !I B  $$!BD! $!BI D@"!$I$$H"!I>*[KW !!z{!ͣ!~!!ͣ: of$ yW*[KW !$$$I$$H!!! BH" !I B  $$!BD! $!BI D@"!$I$$H"!I LINE & PTR '^' ; AT ERROR (CURRENT VALUE OF CMDPTR) ; ;********************************************************************OUTPUT MEMORY ERROR & RETURN TO SYSTEM ; EXIT - FLAGS SAVED FOR CALLER'S CONDITIONAL ; ;*************************************SG CKQHLP: LD A,(DE) CP (HL) INC HL INC DE RET NZ DJNZ CKQHLP RET HEXMSG DB 'HEX ' ;******************* OVER 1 NIBBLE ADD A,A ADD A,A ADD A,A LD B,A CALL GETCH ;GET 2ND DIGIT RET C CALL ASC2HX ;CONVERT 2ND NIBBLE *[Kͣw: oҜ$ yŽ>{z Data Error at Is: Should be: Bit(s) not Programmable. Try erasing. Suc$I$I$UUU$$A$ *[Kͣw: oҜ$ yŽ>{z Data Error at Is: Should be: Bit(s) not Programmable. Try erasing. Suc$I$I$UUU$$A$ ******** ERRPTR: CALL CRLF ;NEW LINE LD HL,(CMDPTR) ;COMPUTE TAB TO ??? LD DE,CMDBFR + 2 OR A SBC HL,DE INC L ;ADD ********************* MEMER: PUSH AF LD HL,MEMERM CALL EDITOR POP AF RET ;******************************************************************************* ; ; BYTE SUBR CONVERTS 2 ASCII-HEX CHARS TO BINARY ; ENTRY- D= CHECKSUM ; EXIT - A JR C,CVERR ADD B ;ADD 2ND TO 1ST LD B,A ADD D ;COMPUTE CHECKSUM LD D,A LD A,B OR A ;CLEAR FLAG RET ; LP LD C,'^' ;THEN OUTPUT ARROW AT ERROR JP CONOUT ;********************************************************** ; ; !0 %)- "&*.#'+/ $(,0  !; HEX CONVERSION ERROR MESSAGE OUTPUT ; CVERR: LD HL,CVERM CALL EDITOR SCF ;ALSO RETURN ERROR FLAG RET ;********E EMPTY THEN RETURN CF SCF JR NZ,FEMPTY LD HL,DEFBFR LD (DBPTR),HL ;SET VARS LD A,SECSIZ LD (BFRCNT),A POP BC E WHEN FULL. BUFFER IS DEFAULT BUFFER AT 80H ; ENTRY- C= CHAR TO OUTPUT ; FCB= OPENED FILE ; EXIT - CF= ERROR ; ;*********PTR LD (DBPTR),DE CALL SETDMA LD DE,FCB ;WRITE IT LD C,21 CALL BDOS OR A ;IF WRITE ERR THEN RETURN CF JR NZ,WRERT PUSH HL ;PUT NEW RETURN ADDRESS ON STACK LD HL,CLOSRET EX (SP),HL PUSH HL ;THEN SAVE REGS FOR STACK BALANCE PUSH OUTPUTS IT TO FILE BUFFER ; ENTRY- A= BYTE ; EXIT - CF= WRITE ERROR ; ;****************************************************BR SEARCHES FOR A STRING CHAR THE SAME AS CONTENTS ; OF C. IT WILL NOT GO BEYOND A SEMICOLON ';'. ; ENTRY- DE= STRING PTR  RET ;******************************************************************** ; ; SKIP BYPASSES TRAILING SPACES UNTIL NON-SEGS ? ; ;************************************** CRLF: LD C,CR CALL CONOUT LD C,LF JP CONOUT ;************************************************************* ; ; CONVERT ASCII-HEX CHAR TO BINARY SUBR ; ENTRY- A= CHAR ; EXIT - A= BINARY VALUEFORMATTED & FILE OPENED, (BFRCNT INIT'D FOR NEW FILE) ; EXIT - CHAR FROM FILE IN A ; CF = EOF ; ;****************POP DE GC1: LD HL,(DBPTR) ;GET CHAR FROM BFR LD A,(HL) INC HL LD (DBPTR),HL LD HL,BFRCNT ;COUNT = COUNT - 1 DEC (HL****************************************************************** PCHAR: PUSH HL ;SAVE REGS PUSH DE PUSH BC LD HL,(DBPTR LD (BFRCNT),A ;ELSE BUFFER COUNT = 0 NOWRT: POP BC POP DE POP HL RET WRERR: SCF JR NOWRT ;************* DE PUSH BC JR CLOS1 ;WRITE REMAINDER OF BUFFER CLOSRET: RET C ;IF WRITE ERROR THEN RETURN CF LD DE,FCB ;THEN CL****** PBYTE: PUSH BC LD B,A ;SAVE BYTE IN B ADD D ;ADD TO CHECKSUM LD D,A LD A,B ;RESTORE BYTE RRCA ;DO HIGH NIE RETURN CHAR ;********************************************************** ; ; CONSOLE STATUS SUBR ; EXIT - A= 0 : NONE R ; C= CHAR TO SEARCH FOR ; EXIT - HL= CHAR PTR ; Z=NOT FOUND ; ;****************************************PACE CHAR IS FOUND ; ENTRY- HL= STRING PTR ; EXIT - HL= 1ST NON-SPACE CHAR PTR ; A= NON-SPACE CHAR ; ZF= NOT FOUND ; ;************************************************* ; ; MESSAGE EDITOR SUBR OUTPUTS TEXT STRING UNTIL A NUL IS FOUND. ; BYTES >  ; CF= ERROR ; ;************************************************ ASC2HX: SUB '0' ;REMOVE ASCII BIAS RET C CP 10 ;IF**************************************************** GETCH: PUSH HL LD A,(BFRCNT) ;IF BUFFER EMPTY THEN READ OR A JP NZ,GR) ;GET BUFFER PTR LD (HL),C ;ADD CHAR TO BUFFER INC HL ;PTR += 1 LD (DBPTR),HL LD A,(BFRCNT) ;IF BUFFER FULL THEN WRI************************* ; ; CLOSE OUTPUT BUFFER SUBR ; EXIT - CF= ERROR ; ;************************************** CLOSE:OSE FILE LD C,16 CALL BDOS OR A ;CLEAR POSSIBLE CARRY INC A ;IF NO ERROR THEN RETURN NC RET NZ SCF ;ELSE RETURBBLE 1ST RRCA RRCA RRCA AND 0FH CALL HX2ASC ;CONVERT IT TO ASCII LD C,A ;THEN OUTPUT IT CALL PCHAR JR C,PBYT1 EADY, A= NOT 0 : CHAR READY ; ZF = REFLECTS CONDITION OF A ; ;********************************************************** CS**************************** SEARCH: LD A,(HL) ;IF CHAR = NUL THEN RETURN Z OR A RET Z CP C ;ELSE IF CHAR=C THEN RETU****************************************************************** SKIP: LD A,(HL) CP ' ' ;IF CHAR <> ' ' THEN RETURN JR N7FH ARE CONVERTED TO SPACES, SINGLE CR CHAR IS OUTPUT AS ; CR-LF PAIR & ALL OTHER CHARS ARE OUTPUT AS IS. ; ENTRY- BC = STRIN 0..9 THEN OK CCF RET NC SUB 7 ;CONVERT 'A'..'F' TO 10..15 CP 10 RET C CP 16 CCF RET ;****************C1 PUSH DE ;READ SECTOR INTO DEFAULT BUFFER PUSH BC LD DE,DEFBFR CALL SETDMA LD DE,FCB CALL RDSEC OR A ;IF FIL************************************************ ; ; PUT CHAR ROUTINE OUTPUTS CHAR TO OUTPUT BUFFER & WRITES TO OUTPUT ; FILTE IT INC A LD (BFRCNT),A CP SECSIZ CCF ;SWAP FLAG SENSE TO RETURN NC JP NC,NOWRT CLOS1: LD DE,DEFBFR ;SET WRITE  LD C,CPMEOF ;OUTPUT EOF CHAR CALL PCHAR RET C LD A,(BFRCNT) ;IF BUFFER EMPTY THEN NO NEED TO WRITE OR A JR Z,CLOSREN CF RET ;********************************************************** ; ; PUT BYTE SUBR CONVERTS BYTE TO ASCII-HEX & ;  LD A,B ;THEN DO LO NIBBLE AND 0FH CALL HX2ASC LD C,A ;& OUTPUT IT CALL PCHAR PBYT1: POP BC RET ;********TS: LD C,11 CALL BDOS OR A RET ;******************************************************************** ; ; SERCH SURN NZ JR Z,FOUND CP ';' ;IF CHAR = ';' THEN RETURN Z RET Z INC HL ;ELSE TRY NEXT CHAR JR SEARCH ; FOUND: OR A Z,FOUND INC HL JR SKIP ;************************************** ; ; CARRIAGE RETURN/LINE FEED SUBR ; EXIT - ALL RG PTR ; EXIT - HL= END OF STRING PTR ; ALL OTHER REGS ? ; ;******************************************************************************************************************** ; ; GET CHARACTER SUBR RETURNS NEXT CHAR OF INPUT FILE ; ENTRY- FCB ****************************** ; ; OUTPUT A SPACE TO CONSOLE SUBR ; EXIT - ALL REGS ? ; ;********************************** - ALL REGS ? ; ;************************************** CONOUT: LD E,C ;SETUP LD C,2 JP BDOS ;************************************** ; ; CONSOLE INPUT SUBR ; CHECKS FOR CTRL-C ABORT ; EXIT - A= CHAR ; ALL OTHER REGS ? ; ;***************** SPACE: LD C,' ' ;************************************** ; ; CONSOLE OUTPUT SUBR ; ENTRY- C= CHAR TO OUTPUT ; EXIT************************* CONIN: LD C,1 ;GET CHAR CALL BDOS CP 3 ;IF CHAR == CTRL-C THEN GOTO CP/M JP Z,0 RET ;ELS"0 %)- "&*.#'+/ $(,0  !**** EDITOR: PUSH HL EDITLP: POP HL LD A,(HL) ;GET CHAR INC HL OR A RET Z PUSH HL LD C,A ;IF CHAR >= 80H THEN AR CNT TYPCNT: EQU 3 ;FILE EXTENSION CHAR CNT ; FORMAT: PUSH HL ;SAVE FPB PTR IN IY POP IY LD HL,(CMDPTR) CALL SKIP  # JR L96 ; L90: LD A,B ;USE SPECIFIED DISK LD (HL),B INC DE ;SKIP OVER ':' L96: LD B,NAMCNT ;B := MAX CHARS L98: CA,' ' DJNZ LB9 LC0: LD B,TYPCNT ;COUNT := TYPE CHAR COUNT CP '.' ;IF RESERVED CHAR NOT '.' THEN FILL ; WITH SPACESITH SPACES LD (HL),' ' DJNZ LE9 LF0: LD B,ZROSIZ ;ZERO EXTENT, S1, S2, RECORD COUNT LF2: INC HL LD (HL),0 DJNZ LF2 CHAR <= ' ' THEN RETURN Z CP ' ' + 1 JR NC,RSVP1 XOR A RET RSVP1: PUSH BC PUSH HL LD B,TABCNT ;B := ENTRY COUNSPACES CALL M,MLTSPC JR Z,EDITLP CP CR ;IF RETURN THEN DO CR-LF PUSH AF CALL Z,CRLF POP AF JR Z,EDITLP CALL**************** ; ; CP/M FILE CONTROL BLOCK FORMATTER ; ENTRY- (CMDPTR) = ASCII STRING PTR OF FILE ; HL = FCB ;SKIP LEADING SPACES LD (CMDPTR),HL ;SAVE NEW PTR EX DE,HL PUSH IY POP HL ;FPB PTR LD A,(DE) ;IF CHAR = 0 THEN DONE LL RSVP JR Z,LB9 INC HL ;PTR := PTR +1 CP '*' ;IF WILDCARD THEN ENTER '?' JR NZ,LA9 LD (HL),'?' JR LAB ; LA9 JR NZ,LE9 INC DE ;GET NEXT CHAR AFTER '.' LC8: CALL RSVP ;IF RESERVED CHAR THEN EXIT JR Z,LE9 INC HL ;IF CHAR LD (CMDPTR),DE PUSH IY POP HL ;COUNT WILDCARDS LD BC,NAMCNT + TYPCNT L01: INC HL LD A,(HL) CP '?' JR NZ,L09 T LD HL,RSVPT RSVPL: CP (HL) JR Z,RSVPX ;IF FOUND THEN EXIT INC HL DJNZ RSVPL INC B ;RETURN NZ RSVPX: POP HL  CONOUT JR EDITLP ;************************************************ ; ; MULTI SPACE SUBR OUTPUTS <= 127D SPACES ; TO FORMAT ; EXIT - ZF = NO WILDCARDS USED ; NZ = WILDCARD(S) USED, A REG. = NUMBER OF ; WILDCARDS : LD (HL),A ;ADD CHAR TO FCB FILENAME INC DE LAB: DJNZ L98 ;IF NOT DONE THEN LOOP LAF: CALL RSVP ;IF RESERVED CHAR THEN <> '*' THEN EXIT CP '*' JR NZ,LD9 LD (HL),'?' JR LDB LD9: LD (HL),A ;ADD CHAR TO FCB INC DE LDB: DJNZ LC8  INC B L09: DEC C JR NZ,L01 LD A,B OR A RET ;************************************** ; ; RESERVED CHAR TE POP BC RET RSVPT: DB '=_.:;,<>' TABCNT: EQU $ - RSVPT ;************************************** ; ; OPEN FILE SUBR ENTRY- C= # SPACES ; EXIT - ZF SET ; ;************************************************ MLTSPC: LD B,C RES 7,B LD C,' '; ;********************************************************** ; ; CONSTANTS ; ZROSIZ: EQU 22 NAMCNT: EQU 8 ;FILENAME CHLD A,(DE) CP ':' JR Z,L90 DEC DE ;ELSE BACK UP & USE DEFAULT DRIVE L89: LD A,(DFLTDK) LD (HL),A ;FCB(DISK) := DRIVE EXIT JR Z,LC0 INC DE ;SKIP OVER EXTRA CHARS TO '.' JR LAF LB9: INC HL ;FILL REMAINDER OF FCB WITH SPACES LD (HL) LDF: CALL RSVP ;IF RESERVED CHAR THEN EXIT JR Z,LF0 INC DE ;WASTE CHARS JR LDF LE9: INC HL ;FILL REMAINING TYPE WST SUBR ; ENTRY- (DE) = CHAR TO TEST ; EXIT - ZF = FOUND ; ;************************************** RSVP: LD A,(DE) ;IF; ENTRY- DE= FCB PTR ; EXIT - A= -1 IF NOT ON DISK ; ;************************************** OPEN: LD C,OPENF JP BDOS  SPLP: PUSH BC ;SAVE CNT CALL CONOUT POP BC DJNZ SPLP XOR A RET ;****************************************** ;**************************** ; ; READ SECTOR SUBR ; ENTRY- DE= FCB PTR ; EXIT - A= 0 IF OK ; ;**************************S ; ;************************************** SETDMA: LD C,26 JP BDOS ;************************************** ; ; READ CONSOLE BUFFER SUBR ; EXIT - CMDBFR = CONSOLE INPUT ; ;************************************** RDCON: LD DE,CMDBFR ;INIT BUF** RDSEC: LD C,RDF JP BDOS ;************************************** ; ; SET DISK READ ADDRESS SUBR ; ENTRY- DE= ADDRES OR A JR Z,L89 SBC 'A' - 1 ;MAKE 'A'-'P' = 1-15 FOR DRIVE # LD B,A INC DE ;IF NEXT CHAR = ':' THEN MUST BE DRIVE WHATYPE MACRO PROMTYPE EQU 2716 ENDM #0 %)- "&*.#'+/ $(,0  !WHATYPE MACRO PROMTYPE EQU 2732 ENDM WHATYPE MACRO PROMTYPE EQU 2733 ENDM WHATYPE MACRO PROMTYPE EQU 2764 ENDM $0 %)- "&*.#'+/ $(,0  !WHATYPE MACRO PROMTYPE EQU 2708 ENDM ;;; Universal Prom Programmer Test Program Ver 1.1 COPYRIGHT 1982, GRH ENTERPRISES Options: 0- Confidence !%>!!v20(## t1(## 2(!%>!~~!8}w|w{ia!x*Timer to Set, (0..2 or any other to abort) - Turn Program Switch "OFF" & Press Any Key.. Turn Program Switch "ON" & Press AnyEST PROG. ; JP PROG ;VECTOR INTO PROGRAM JP PROG JP PROG ; ; COPYRIGHT MESSAGE AT BEGINNING ; SIGNON: DB CR,'Univers# DB CR,'? or H- Re-type This List' DB CR,'CTRL-C - Return to Main Program',CR DB 0 FORM ; ; PROGRAM CONTINUES ; PSET UP FOR ERROR JR C,CMDLP CP MAXCMD + 1 JR NC,CMDLP LD HL,CMDTBL ;COMPUTE COMMAND VECTOR ADD A,A ;MULT BY 2 LD ETest 1- Select Timing Values 2- Free Run (scoping) 3- Single Shot 4- Address Counter Test 5- Status Test 6- Continuous Digitize ~*{ˏ!W>>!x y  ! H >Yx>$˯@(7׷ Key.. Inhibit Switch Error! A/D Returned All 0s! A/D Returned all 1s! EOC Not Returned in Reasonable Time! TEST FAILEDO 1ST LOCATION AFTER THIS MODULE DW 0 ;START OF PROM ADDRESSES DW 0 ;CODE START IN MEMORY DW 0 ;WORD COUNT TO PROGRAM al Prom Programmer Test Program Ver ' DB VERS SHR 8,'.',VERS AND 0FFH DB CR,'COPYRIGHT 1982, GRH ENTERPRISES',CR OPTMSG: ROG: RESTRT: LD HL,SIGNON ;OUTPUT SIGN-ON MESSAGE CMDLP: CALL EDITOR LD C,'-' ;OUTPUT PROMPT CALL CO LD C,' ' CALL CO,A LD D,0 ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A JP (HL) ;GOTO COMMAND ; CMDTBL: DW CONFID DW TIMING D? or H- Re-type This List CTRL-C - Return to Main Program !- H(h(?(0!080!u_~#fox! A8_0 8  ?))))o>_(  !P{ˇ_ Done Not Returned in Reasonable Time! Test Ru, Data Read Back = Data Written = PASSED Command Error, Type H or ? for list. Command not implemented yet! ,IX DW 0 ;PROM START ADDR (OFFSET) DB 0 ;SOCKET TO START FROM DB 0 ;INCREMENT VALUE ; ; NOW THE PROGRAM STARTS... ; THE 1DB CR,'Options:',CR DB CR,'0- Confidence Test',CR,'1- Select Timing Values' DB CR,'2- Free Run (scoping)',CR,'3- Single Shot CALL GETCH ;GET SELECTION CP CTRLC ;IF CHAR = CTRL-C THEN RETURN TO MAIN RET Z CP 'H' ;IF HELP THEN RESTART JR Z,RW FREE DW ONESHT DW ADDREG DW STATST DW DIGITZ ;********************************** ; ; CONFIDENCE TEST COMMAND ;> W P G#!>!>!. !>![ !>!'>W!z!{nning, Type any key to Abort.. Enter New Divisor (Return to Terminate, Non-Hex to abort) - Existing Timer divisor = Input (SP),IY! 1 (F)%65655& 2?%-%&%(%($(652?%B X+>">-f:?:ST LOCATION MUST HAVE A JUMP TO THE 2ND VECTOR SO EITHER A ; PROGRAM OR COMPARE COMMAND FROM THE MAIN PROGRAM WILL ENTER THE T' DB CR,'4- Address Counter Test',CR,'5- Status Test' DB CR,'6- Continuous Digitize' MAXCMD EQU 6 ;NUMBER OF LAST COMMAND ESTRT CP 'h' ;USE LOWER CASE ALSO JR Z,RESTRT CP '?' JR Z,RESTRT SUB A,'0' ;CHECK FOR LEGAL COMMAND LD HL,CMDERM ; ;********************************** CONFID: LD A,1 SHL PPG ;OUTPUT PROGRAM GATE BIT TO READ DATA REG. OUT PRMCMD,A LD C; ; THESE RESERVED LOCATIONS MUST BE USED TO INSURE COMPATABILITY WITH ; THE NORMAL PROM OVERLAYS. ; DW BUFFER ;POINTER T%0 %)- "&*.#'+/ $(,0  !,PDATA ;SET UP DATA PORT # LD E,0 ;TEST FOR ALL 0S CALL REGCMP JR NZ,CONFER LD E,0FFH ;NEXT USE ALL 1S CALL REGCMP  ;************************************* ; ; SELECT TIMING VALUES COMMAND ; ;************************************* TIMIN JR Z,DOIT LD HL,CRMSG JP CMDLP ; DOIT: PUSH DE ;MODE WORD PUSH BC ;PORT # PUSH IX ;SAVE OLD DATA LD HL,OL,H LD (IX+1),A LD A,E ;OUTPUT MODE WORD OUT PTMRMD,A OUT (C),L ;OUTPUT LS BYTE NOP ;WAIT FOR 8253 NOP OUT ************* ; ; ONE-SHOT COMMAND ; ;************************** ONESHT: CALL ONCE FREE1: LD A,E ;RESTORE IMAGE RES******************************** STATST: EQU DUMMY ;DUMMY FOR NOW ;****************************** ; ; DIGITIZE A/D COEN DONE RET Z CP 'A' ;IF CHAR < 'A' THEN DON'T TOUCH JR C,CASEOK AND 5FH ;ELSE INSURE UPPER CASE CASEOK: SUB '0' ;IF SET PPS,A ;OUTPUT PULSE OUT PRMCMD,A LD E,A ;SAVE COMMAND IMAGE LD BC,0 ;SET UP COUNTS ONCELP: IN A,PRMST ;WAITCR,'Test Running, Type any key to Abort..',CR,0 NEWMSG: DB CR,'Enter New Divisor (Return to Terminate, Non-Hex to abort)' DB  JR NZ,CONFER LD E,1 ;WALKING 1 LD B,8 WALKLP: CALL REGCMP JR NZ,CONFER SLA E ;WALK BIT LEFT DJNZ WALKLP CALL GE SWITCH CALL EDITOR CALL CI IN A,PRMST AND PRMINH LD HL,INHERM JP Z,CMDLP LD HL,PASSM ;OUTPUT PASSED MESSAGE JNG: LD HL,SELMSG ;OUTPUT PROMPT CALL EDITOR CALL GETCH LD IX,TMR0 ;INIT PTR TO REG 0 LD C,PTMR0 ;INIT PORT TO REG 0 DMSG ;OUTPUT OLD DATA CALL EDITOR POP IX LD A,(IX+1) ;HIGH BYTE 1ST PUSH IX CALL PRHEX POP IX ;THEN LOW BYTE LD(C),H ;OUTPUT MS BYTE JP TIMING ;*************************** ; ; FREE RUN COMMAND ; ;***************************  PPG,A ;REMOVE PROGRAM GATE OUT PRMCMD,A JP FREEDN ;************************************************************* ; MMAND ; ;****************************** DIGITZ: LD A,1 SHL PVO ;TURN ON HIGH VOLTAGE FOR MEASUREMENT OUT PRMCMD,A LD HL PULSE OUT PRMCMD,A RES PSCV,A OUT PRMCMD,A LD B,0 EOCLP: IN A,PRMST ;CHECK FOR EOC AND PRMEOC JR Z,GOTEOC DJN < '0' THEN RETURN CF RET C CP 10 JR C,HEXOK SUB 7 CP 10 ;IF ':'..'@' THEN RETURN CF RET C CP 16 ;IF > 0FH THEN  FOR DONE, BUT TIMEOUT IF EXCESSIVE AND PRMBSY JR Z,ONCEDN DJNZ ONCELP DEC C JR NZ,ONCELP LD HL,TMOMSG PUSH DE ' - ',0 OLDMSG: DB CR,'Existing Timer divisor = ',0 SELMSG: DB CR,'Input Timer to Set, (0..2 or any other to abort) - ',0 INHTAD ;INPUT A/D DATA LD HL,EOCERM JP C,CMDLP OR A ;IF 0 THEN ERR LD HL,AD0ERM JP Z,CMDLP INC A ;IF -1 THEN ERR LP CMDLP CONFER: LD D,A ;SAVE VALUES PUSH DE LD HL,ISMSG CALL EDITOR POP DE ;OUTPUT 'IS' VALUE PUSH DE LD A,D  A,(IX+0) PUSH IX CALL PRHEX LD HL,NEWMSG ;GET NEW DATA CALL EDITOR CALL GETHEX POP IX ;DIVISOR IMAGE PTR POPFREE: LD HL,STOPM CALL EDITOR FREELP: CALL ONCE ;OUTPUT 1 PROGRAM PULSE PUSH DE ;SAVE COMMAND IMAGE CALL CSTS ;CHE; ADDRESS COUNTER LOAD & AUTO-INCREMENT TEST COMMAND ; ;************************************************************* ADDRE,STOPM CALL EDITOR LD BC,0 TWIDDL: EX (SP),HL ;WAIT FOR ANALOG STUFF TO SETTLE EX (SP),HL DEC BC LD A,C OR B Z EOCLP SCF ;RETURN ERROR RET ; GOTEOC: IN A,PADDAT ;GOT EOC, GET DATA OR A RET ; ; GET HEX VALUE SUBR ; EXRETURN CF CCF RET C HEXOK: ADD HL,HL ;ADD TO ACCUMULATOR ADD HL,HL ADD HL,HL ADD HL,HL ADD A,L LD L,A JR GETLP;SAVE COMMAND IMAGE CALL EDITOR POP DE ONCEDN: LD A,E ;TERMINATE START RES PPS,A LD E,A ;PASS BACK FOR TERMINATION OFM: DB CR,'Turn Program Switch "OFF" & Press Any Key..',0 INHONM: DB CR,'Turn Program Switch "ON" & Press Any Key..',0 INHERMD HL,AD1ERM JP Z,CMDLP LD HL,INHOFM ;PROMPT USER TO TURN OFF PROGRAM SWITCH CALL EDITOR CALL CI ;WAIT FOR KEY PRESSED CALL PRHEX LD HL,SBMSG CALL EDITOR POP DE ;OUTPUT SHOULD BE VALUE LD A,E CALL PRHEX FREEDN: LD HL,CRMSG JP CMDLP  ;ELSE IF 1 THEN DO 1 JR Z,DOIT INC IX ;REG 2 INC IX INC C LD E,PT2MOD CP '2' ;ELSE IF NOT 2 THEN RETURN TO MAI BC ;PORT # (C) POP DE ;MODE WORD (E) JR C,TIMING ;IF ILLEGAL THEN ABORT LD A,L ;SAVE NEW VALUES LD (IX+0),A LD ACK FOR KEY PRESSED POP DE JP Z,FREELP PUSH DE ;CLEAR CHAR FROM BUFFER CALL CI POP DE JR FREE1 ;*************G: DUMMY: LD HL,IMPLM ;DUMMY FOR NOW JP CMDLP ;********************************** ; ; STATUS REG TEST COMMAND ; ;**JR NZ,TWIDDL DIGLP: CALL CSTS JR NZ,DIGDN CALL GETAD ;INPUT D/A DATA PUSH AF LD HL,EOCERM CALL C,EDITOR LD CIT - HL= VALUE ; CF= ILLEGAL VALUE GIVEN ; A= ? ; GETHEX: LD HL,0 GETLP: PUSH HL CALL GETCH POP HL CP CR ;IF CR TH ; ; ONCE SUBR OUTPUTS 1 PROGRAM CYCLE ; ONCE: LD A,[1 SHL PAI] + [1 SHL PPG] + [1 SHL PVO] ;OUTPUT GATE OUT PRMCMD,A OF PROGRAM OUT PRMCMD,A RET SUBTTL TEXT MESSAGES TMOMSG: DB CR,'Done Not Returned in Reasonable Time!',CR,0 STOPM: DB : DB CR,'Inhibit Switch Error!',CR,0 AD0ERM: DB CR,'A/D Returned All 0s!',CR,0 AD1ERM: DB CR,'A/D Returned all 1s!',CR,0 EOCE IN A,PRMST AND PRMINH LD HL,INHERM ;IF SWITCH NOT OFF THEN ERR JP NZ,CMDLP LD HL,INHONM ;PROMPT USER TO TURN ON PROGRAM,' ' ;SPACE AWAY FROM CURSOR REST POSITION CALL CO POP AF CALL PRHEX ;OUTPUT DATA LD C,'H' CALL CO LD C,CR ;B FROM BUFFER JP FREEDN SUBTTL SUBROUTINES ; ; COMPARE PORT DATA READ-BACK SUBR ; ENTRY- C= PORT # ; E= PORT DATA IMAGE ; EXIT - A= DATA READ BACK ; ZF= COMPARE OK, NZ= COMPARE NOT OK ; REGCMP: OUT (C),E IN A,(C) CP E RET ; ; GETACK TO BEGINNING OF LINE CALL CO JR DIGLP ; DIGDN: LD A,0 ;TURN OFF PROGRAM VOLTAGE OUT PRMCMD,A CALL CI ;CLEAR CHAR LD E,PT0MOD ;INIT MODE WORD CP '0' ;IF 0 THEN DO 0 JR Z,DOIT INC IX ;REG 1 INC IX INC C LD E,PT1MOD CP '1' A/D DATA SUBR ; EXIT - A= DATA ; CF= NO EOC ERROR ; B= ? ; GETAD: LD A,[1 SHL PSCV] + [1 SHL PVO] ;ISSUE START CONVERT&0 %)- "&*.#'+/ $(,0  !RM: DB CR,'EOC Not Returned in Reasonable Time!',CR,0 ISMSG: DB CR,'TEST FAILED, Data Read Back = ',0 SBMSG: DB ' Data WrittenFER LD A,CBFRSZ ;CMDBFR[0] = CBFRSZ LD (DE),A PUSH DE ;BUFFER PTR LD C,RDCF ;GET INPUT FROM USER CALL BDOS POP HL  EXIT - Z = SUCCESSFUL READ ; NZ = READ ERROR ; ;********************************************************** RDFIL,READ1 ; NOT HEADER IF HERE, MOVE INTO LOAD AREA & CONTINUE WITH NEXT SECTOR RESCAN: LD HL,DEFBFR LD DE,(RDPTR) LD BC,IP ANY TRAILING SPACES SCF ;IF END OF LINE THEN RETURN CF RET Z LD (CMDPTR),HL ;SAVE NEW PTR CALL GETNUM ;GET 2N (CMDPTR),HL ;SAVE NEW PTR CALL GETNUM ;GET PARAMETER RET C CALL LOAD16 OR A ;RETURN NO ERR RET ;*************** ; ; CHECK BOUNDS SUBR TESTS PARAM 1 & 2 FOR OUT OF BOUNDS VALUES & IF OK, ; STORES THE OFFSETTED VALUES BACK INTO THE  = ',0 CRMSG: DB CR,0 PASSM: DB CR,'PASSED',CR,0 CMDERM: DB CR,'Command Error, Type H or ? for list.',CR,0 IMPLM: DB CR,'Com ;BUFFER PTR INC HL ;COUNT = CMDBFR[1] AND 7FH LD C,(HL) LD B,0 RES 7,C ;MAKE SURE < 128 INC HL ;CMDPTR = .CMDBFR[2E: LD (RDPTR),BC ;SAVE ACTUAL READ PTR LD DE,DEFBFR ;READ 1ST SECTOR INTO DEFAULT BUFFER FOR NOW CALL SETDMA LD DE,FCB CSECSIZ LDIR LD (RDPTR),DE ;UPDATE READ PTR ; IF HERE, EITHER WE ARE DISCARDING THE 1ST SECTOR OR READING THE 2ND READ1) LD C,',' CALL SEARCH SCF ;IF NO 2ND PARAMETER THEN RETURN CF RET Z INC HL ;PASS OVER ',' ;**************D PARAM. RET C CALL LOAD16 ; ; THIS ENTRY IS SAME AS ABOVE EXCEPT DOES SEARCH FOR COMMA. ; GET1PC: LD HL,(CMDPTR) LD********************************************** ; ; LOAD WORD SUBR ; ENTRY- DE= WORD PTR ; HL= VALUE ; EXIT - DE= WORD PTR RESPECTIVE LOCATIONS. ; EXIT - CF= OUT OF BOUNDS ; ;*************************************************************************mand not implemented yet!',CR,0 ; ; DATA AREA ; TMR0: DW 0 TMR1: DW 0 TMR2: DW 0 DS (- ($ AND 0FFH)) AND 0FFH ;POS] LD (CMDPTR),HL ADD HL,BC ;CMDBFR[COUNT + 2] = 0 /* END OF LINE = NUL */ LD (HL),0 RET ;*************************ALL RDSEC OR A ;IF BAD READ THEN RETURN ERR RET NZ ; IF FILE STARTS WITH JP 0000H THEN ASSUME IT IS A HEADER BLOCK : LD DE,(RDPTR) ;READ INTO LOAD AREA DIRECTLY CALL SETDMA LD DE,FCB CALL RDSEC OR A ;IF END OF FILE THEN DONE JR NZ,R******************************************** ; ; GET 2 PARAMETERS SUBR. SAME AS ABOVE EXCEPT: ; ENTRY- DE= PARAMETER STORAGE  C,',' CALL SEARCH SCF RET Z INC HL ;************************************************ ; ; GET 1 PARAMETER SUBR + 2 (NEXT WORD IN SEQUENCE) ; ;********************************************************** LOAD16: EX DE,HL ;STORE IT LD (H CKBNDS: LD HL,(PARAM1) ;START WITH PARAM 1 CALL CPBNDS ;IF OUT THEN RETURN CF RET C LD (PARAM1),HL ;ELSE STORE NEWITION TO EVEN PAGE BOUNDARY BUFFER EQU $ END ********************************* ; ; READ FILE SKIPS ANY HEADER BLOCK & ONLY LOADS CODE ; ENTRY- BC = LOAD BUFFER PTR ;LD A,(DEFBFR) CP 0C3H JR NZ,RESCAN ;ELSE ASSUME THE 1ST SECTOR IS GOOD & LOAD IT LD HL,(DEFBFR+1) LD A,H OR L JR ZDDONE LD DE,SECSIZ ;PTR = PTR + SECTOR$SIZE LD HL,(RDPTR) ADD HL,DE LD (RDPTR),HL LD A,(MEMTOP+1) ;IF NEW PAGE > RESPTR ; HL= CMDPTR ; EXIT - CF= ERR ; ;********************************************************** GET2PAR: CALL SKIP ;SKSAME AS ABOVE ; ;************************************************ GET1PAR: CALL SKIP ;SKIP ANY SPACES SCF RET Z LDL),E INC HL LD (HL),D INC HL EX DE,HL RET ;********************************************************************** VALUE LD HL,(PARAM2) ;THEN CHECK PARAM 2 CALL CPBNDS LD (PARAM2),HL ;STORE IT & RETURN RESULT RET ;*************ERVED_PAGE - 1 THEN DEC A ; GOING INTO RSVP SO ABORT BY RETURNING CF CP H RET C JP READ1 RDDONE: XOR A ;RETURN 1ST NUMERICAL PARAMETER ; EXIT - CF= ERR ; ;********************************************************** GET3PAR: LD HL,(CMDPTR) ;IF NO PARAMETERS THEN RETURN CF CALL SKIP SCF RET Z LD (CMDPTR),HL ;SAVE NEW PTR CALL GETNUM ;GET 1ST PAR Z RET ;********************************************************** ; ; FETCH PARAMETERS SUBR ; ENTRY- CMDPTR= PTR TOAMETER RET C LD DE,PARAM1 ;INIT PTR TO PARAM STORAGE CALL LOAD16 LD HL,(CMDPTR) ;SEARCH FOR 2ND PARAMETER (AFTER ',''0 %)- "&*.#'+/ $(,0  !(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)221@:2!o6+6+6!6#6!6#6:G*o .!N6:^*M^!K6!6!6+6' :$HHͯ :^!w:<2:0}:@E}:!S!W6: z!]6:cm!c6:_z!_6l!p+q* !q*& *M *M !p+q*!!p+q*"!p+q*$!6  "}*}DM͆ ' ͯ *"!z4 :e !"͆ !z6:|!z '? 2*H#"H!{6:{ր!Ң *{& :2!q: " *M n :c4 *M n :2!c:Q !c:2: !:cw>!n !5 Y : { !6!q*M8):[ͱ!N5!6ñ:5!6#6>!ڰ!6:<2O>/:!O!T *M͡H~K:÷:S:QHI:N<22: H@"2Í202O> c!6Í202O> ڍ*&O*-:>>!p+q:,!6*DM9:<!6:z 2W!6D*&L :w:<2Ov*:>=(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)ETURN OR CTL-Z$INVALID FORMAT$HEX$$$$NO DIRECTORY SPACE$NO FILE$COM$START NOT FOUND$QUIT NOT FOUND$CANNOT CLOSE DESTINATION FILE::=2K  :ʤ\:ҷ\x'Ͳ:!\͢  :͈'!  ::,: HHҰͯ : 2ó:E:1:2v!q!*8!*6: > !kp+q*j> >ڪ Þ !qp+q/ *pDM9: :M2r:N!r !:r *r& N!r4 !6: :{4 2!{4m *":ڹ ͯ !z4I '2!"!q: !4>!S :S! :2*M:!lwҙ  â :0O !q:O| :O| !6:]2l:o'2o:n'2n:m'2m*mMͣ *nMͣ *oMͣ :]`ҥ*`MͭҞ!`6!6> :é:(!q:!wO! ~2*& :w>!:!4!6>:N<2N!¡!6[–ͱ!N5:2:2!4=:[¼ͱ4:!6:.2O8: :* ͇g& !sc*&P :w:·>!ұͯ :22:_!6=!6>'!E!4!p+q*0 !20O> ڒ:0:AO>Ҥ::A }}Hͬ!wͻO`idͻV[2O>2:!X!6:! COPYRIGHT (C) 1979, DIGITAL RESEARCH, PIP VERS 1.5$$$ SUB =.:,<> _[]INPIRDPTRUR1UR2RDROUTLPTUL1PRNLSTPTPUP1UP2PU$DESTINATION IS R/O, DELETE (Y/N)?$**NOT DELETED**$$$$$$$NOT FOUND$COPYING -$REQUIRES CP/M 2.0 OR NEWER FOR OPERATION.$UNRECOGNIͦ>ͦ!q:_  !p+q.*   !q*&!p+q*2͔: :ͳ.!ws+p+q+p+q:w=2wN *s*u w*s#"s*u#"u' !"*M^7 !x6:!xھ **DM͆ ! ^#V͎ * :w*#" = = = = = ͯ  *M !6q  !6q  !6q  *& !:   *}2D" * * *&"!q:UY: Y:ҩ: ʩ:_2ʘ:€!6<> *N& N2 !p+q!6!6+6 !6: S: M!6g8:N2M*M8p!6!6!6>!:[ ͱ!N5!6:%:<2*6 * 6å!q!6> !d*&I :]>!4A>:<2O* :w:?†r+s+p+q*~$7*>*>H&>*#"*#"> 2:R͎:!6!6=2:ʙ!6:“H:=O!L NE!4 E E:/.*&L 6$L9k9.Xͯ *KM^020NTTYCRTUC1CONNULEOFDISK READ ERROR$DISK WRITE ERROR$VERIFY ERROR$NOT A CHARACTER SINK$READER STOPPING $NOT A CHARACTER SOURCE$ZED DESTINATION$CANNOT WRITE$INVALID PIP FORMAT$CANNOT READ$INVALID SEPARATOR$1 :2L> ̈́M9 Š ::=HҮͯ !6:Ҿ:2 !6::/H͈;!6:> !/>!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q*2yʭ :yʗ ͯ *"*6:2x÷ *"!x4d !"/ !j}=2| !"*KM^'_ !z6:|!z1 *6à  !6 à  !60à  *& !6  !6  !6  *& . 1 4 7 : = F P [ f q  :<2!ژ!6 >!]Ҥ; !6:Q::H: !6*M : !6!q:a/>z!ڕ*&P 6!4z!6!6#6#6!6*M8:ھ:*͇g2ê::¿::,͡A<2O>!6!q!6?!:ҠgÐ!q*&*~!6:22: :]Hں:A2O>: 2ͯ 9Ž>!6-e!6ͻ2=2ʺ-é:>>"ͻ2:!!5ͻ2ͬ!\ :020:121'ͳ':²ͯ !G6!"!"7 *M^n/ :a/:H!6:ͯ !&6ABORTED$BAD PARAMETER$INVALID USER NUMBER$RECORD TOO LONG$INVALID DIGIT$END OF FILE, CTL-Z?$CHECKSUM ERROR$CORRECT ERROR, TYPE R/H:_2:!q:A/>Z!/H8: 2::=O>m:W!Q} Hmd>9>!6:2*M!Eͯ m!62m!62m!62m!62m'2:2:TҒ:2!6*ME:2::Ҳ:<22ý: 2:} >ͯ :i:2:d*M:[  ^#V͎ڗO **~2*#"m2m͖ 2m!6m!6m!6 m2m:$: $͈Ͳ!N6' :!Cwͯ !6:^͢c!6{:/>!/H{ͯ :<2*M:>!(:=2%> >>!F!5+N! ~2!4<2T>>!b}*bMͭz:b2!b6:<2é>!(0 !%)- "&*.#'+/  $(,0 2*">!b!ͯ >!`0ͯ !q:E:24J!46*}a!44EJ *KM^'́:‚:H:H"!6!4:_jYO jM*"S*" 3@bl*M1͓!""DM!  ::=H-\:N2O_og_{ozg^#V))) _{ozg^#V) d^#V|g}o n_{o************************************************************ ; ; COMPARE BOUNDS SUBR ADDS VALUE TO THE BASE OF THE BUFFER & O BUFFER START (FROM OVERLAY) ADD HL,DE RET C ;IF OVERFLOW THEN RETURN CF CP H ;ELSE COMPARE PAGE VALUE TO MEMTOP PAGE ; BC= PTR TO NON-HEX CHAR ; A= NON-HEX CHAR ; ;*************************************************************************AG TO NOT 0 INC A LD (GETFLG),A JR GETLP ; GETCHK: LD A,(GETFLG) ;IF FLAG = 0 THEN RETURN CF SUB 1 RET C LD A,(B*********** ; ; PRINT BYTE HEX VALUE TO CONSOLE SUBR ; ENTRY- A= VALUE ; ;************************************************ N OF THE NIBBLE ; ;************************************************************************* HX2ASC: AND 0FH ;ONLY NIBBLE PLERFORMS DIVISION & MODULO FUNCTIONS ; ENTRY- HL= NUMERATOR ; DE= DENOMINATOR ; EXIT - HL= RESULT ; DE= REMAINDER ; ;**** ;SHIFT 1 INTO QUOTIENT OR 1 LD L,A LD A,E ;REMAINDER = REMAINDER - DIVISOR SUB C LD E,A LD A,D SBC A,B LD D,A7 *M^͆ \͔!":͎H*#"ͧÝ/ :>͛9ͯ .*#":_!zgO{ozgi`N#Fogo&og H ©=¨CHECKS FOR ; OVERFLOW. THEN CHECKS NEW VALUE'S PAGE AGAINST THE TOP OF AVAILABLE ; MEMORY'S PAGE & RETURNS CARRY IF EITHER I -1 RET ;RETURN CF IF PAGE > MEMTOP PAGE -1 ;**************************************************************************** GETNUM: PUSH HL ;HL -> BC POP BC LD A,0 ;FLAG = 0 LD (GETFLG),A LD HL,0 ;ACCUM = 0 GETLP: LD A,(BC) ;CHAR = (C) ;GE-GET CHAR CP ' ' ;IF SPACE THEN RETURN NC RET Z CP ',' ;IF COMMA THEN RETURN NC RET Z OR A ;IF END OF LI PRTHEX: OR A RLA CALL PRHXDG PRHXDG: RLA RLA RLA RLA PUSH AF CALL HX2ASC ;CONVERT NIBBLE TO ASCII-HEX PUSH HLEASE CP 10 ;IF 0..9 THEN OK JR C,NTALPH ADD 7 ;ELSE OFFSET 10..15 TO 'A'..'F' NTALPH: ADD '0' ;CONVERT TO ASCII ****************************************************** DIVIDE: LD B,D LD C,E LD A,16 ;BIT COUNT PUSH AF LD DE,0 ;REMA DIV2: POP AF ;IF COUNT = COUNT -1 = 0 THEN RETURN DEC A RET Z PUSH AF JP DIV1 SUBTTL MESSAGES BADOVM: DB CR,!j>A+!s!"@͓1!"<**"͓n "Dn"":!Q2҂' !'6!36' :1/!aE*#">z?C9IͲÁ.!6> !ڇ*&' ~2 ʀ: y.*MS OUT. ; ENTRY- HL = VALUE TO COMPARE ; EXIT - HL = CORRECTED VALUE ; CF = BOUNDS ERROR ; ;******************************** ; ; GET NUMBER SUBR CONVERTS ASCII-HEX CHARS IN STRING TO BINARY WORDS UNTIL ; A NON- HEX CHAR IS ENCOUNTERED. IF NOT SPPTR) CALL ASC2HX ;ATTEMPT TO CONVERT CHAR JR C,GETCHK ;IF ILLEGAL THEN CHECK FOR DELIMITER ADD HL,HL ;ACCUM = ACCUM * NE THEN RETURN NC RET Z SCF ;ELSE RETURN CF RET ;**************************** ; ; PRINT HEX VALUE SUBR ; ENTRY LD C,A CALL CONOUT POP HL POP AF RET ;************************************************************************* RET ;**************************** ; ; CHECK FOR DONE SUBR ; ;**************************** CKDONE: EX DE,HL LD HL,(INDER = 0 DIV1: ADD HL,HL ;SHIFT MSB INTO REMAINDER LD A,E RLA LD E,A LD A,D RLA LD D,A OR E JR Z,DIV2 ;IF 'Prom Overlay Not Found',0 PTYPM: DB CR,'Enter Prom Type - ',0 RDERRM: DB CR,'Disk Read Error',0 WRERRM: DB CR,'Disk Write Er:X!Wғä:ڤ*MEÓ:ұ@@:O2Mc;!6#6>!)*&P ~"::H:H!4Q>!қ:=2á:2:Ҭ\>!ҿ:=2K:2K!:!:K\: \!p+q͈******************************************* CPBNDS: LD A,(MEMTOP+1) ;SET UP MEMTOP PAGE -1 DEC A LD DE,(PGMBFR) ;ADD VALUE TACE OR COMMA THEN RETURNS CARRY. ; ENTRY- HL = TEXT POINTER ; EXIT - HL = NUMBER ; CF= NON HEX CHAR (BUT NOT SPACE OR COMMA)16 ADD HL,HL ADD HL,HL ADD HL,HL ADD L ;ACCUM = ACCUM + DATA LD L,A INC BC ;PTR = PTR + 1 LD A,(GETFLG) ;BUMP FL- HL = VALUE ; ;**************************** PRT2H: LD A,H CALL PRTHEX LD A,L ;************************************* ; ; HEX TO ASCII-HEX CONVERTER CONVERTS BINARY NIBBLE TO ASCII-HEX ; ENTRY- A= BINARY NIBBLE ; EXIT - A= ASCII REPRESENTATIODISEND) OR A SBC HL,DE EX DE,HL RET ;********************************************************** ; ; DIVIDE SUBR PDIVIDEND = 0 THEN EXIT LD A,E ;ELSE IF DIVIDEND - DIVISOR = NEG THEN EXIT SUB C LD A,D SBC A,B JP M,DIV2 LD A,Lror, Probably Full!',0 DELMSG: DB CR,'File Exists, Delete?..(Y/N) - ',0 SYNERM: DB CR,'*** Syntax Error ***...Type ''HElp'' Fo !36'n::0:f9OY#9.3'ͳ.:020' 'ͳ'7 6')0 !%)- "&*.#'+/  $(,0 r List',CR,0 FNFM: DB CR,'File Not Found',0 BOUNDM: DB CR,'Value Out of Bounds',0 MEMERM: DB CR,'Memory Error',0 HXERM: DB CDB 'MOve first, last, dest' DB CR,'DIsplay <, last> | ' DB 'SUbstitute addr' DB CR,'CHecksum first, last B 'RE' ;READ DW READC DB 'FI' ;FILL DW FILLC DB 'NE' ;NEW DW NEWC DB 'MO' ;MOVE DW MOVEC DB 'DI' ;DISPLAY DW DOMMAND COUNT = TABLE SIZE / ELEMENT SIZE SUBTTL VARIABLES CMDPTR: DW CMDBFR CMDBFR: EQU $ ;COMMAND INPUT TEXT BUFFER LE FOR CONOUT TEMP: DW 0 ;TEMPORARY STORAGE GETFLG: DB 0 ;FLAG FOR GETNUM ; HXFLAG: DB FALSE ;FILE TYPE, FALSE= REL, TRUEverlay must be re-assembled to new ORG! ENDIF DS (-($ AND 0FFH) AND 0FFH) - 15 ;POSITION FOLLOWING CODE SUBTTL PROM OV ;WORD COUNT TO PROGRAM PSTART: DS 2 ;PROM START ADDR (OFFSET) SOCKET: DS 1 ;PROM SOCKET # INCR: DS 1 ;OVERLAY DATA PTR  | ' DB 'COpy count <, dest<, skip>>' DB CR,'SEarch first, last, list | ' DB 'Compare Buffer first1, last1, firstISPC DB 'SU' ;SUBSTITUTE DW SUBSC DB 'PR' ;PROGRAM DW PGMC DB 'SA' ;SAVE DW SAVEC DB 'HE' ;HELP DW HELPC DB '? REPT 130 LIST OFF DB 0 LIST ON ENDM CBFRSZ: EQU $-CMDBFR-2 ; ; INPUT PARAMETER STORAGE ; PARAM1: DW 0 PARAM2: DW= HEX BFRCNT: DB 0 ;FILE READ COMMAND BUFFER COUNT DBPTR: DW DEFBFR BFRPTR: DW 0 ;HEX FILE READ PTR HEXBASE: DW 0 ;HEX ERLAY LINKS TO SUBROUTINES JP EDITOR JP CSTS JP CONIN JP CONOUT JP PRTHEX ; ; PROM OVERLAY VARIABLES & VECTOR LOINCREMENT COUNT PRGMV: RET ;PROGRAM PROM FROM MEMORY SUBROUTINE VECTOR DW 0 COMPV: RET ;COMPARE PROM TO MEMORY SUBROUTINCR,'Illegal Hex Record Type!',0 HXEMTM: DB CR,'Hex File Empty!',0 ; HELPM: DB CR,'HElp | NEw >' DB CR,'ComPare <"> >' D 0 PARAM3: DW 0 ; MEMTOP: DW 0 ;TOP OF AVAILABLE MEMORY PTR RDPTR: DW 0 ;FILE READ PTR ; DISTRT: DW 0 ;DISPLAY COMMAND FILE BASE LOAD ADDR HEXPTR: DW 0 ;HEX FILE READ PTR ; FCB: EQU $ ;FILE CONTROL BLOCK STORAGE REPT 33 LIST OFF DB 0 CATIONS ; THIS SECTION SHOULD START AT EVEN PAGE BOUNDARY ; OVLBFR EQU $ ;START OF PROM OVERLAY PGMBFR: DW PGMEND ;DW PTR E VECTOR DW 0 READV: RET ;READ PROM INTO MEMORY SUBROUTINE VECTOR DW 0 ; DS ( -($ AND 0FFH) AND 0FFH) PGMEND: EQU $ pe>' DB CR,'REad addr d:file | ' DB 'SAve first, last HEX d:file' DB CR,'FIll first, last, value | ' B CR,'CTRL-C or EXit To Exit to CP/M' DB CR,0 SUBTTL COMMAND TABLE CMDTBL: EQU $ DB CTBLSZ ;TABLE ELEMENT COUNT DPYC DB 'EX' ;EXIT DW 0 DB 'SE' ;SEARCH DW SERCHC DB 'CB' ;COMPARE BUFFER DW CPBUFC CTBLSZ EQU ($ - CMDTBL) / 4 ;CLAST START PTR DISEND: DW 0 ;DISPLAY COMMAND LAST END PTR DISTMP: DW 0 ;DISPLAY COMMAND TEMP STORAGE TOGGLE: DB 2 ;^P TOGGLIST ON ENDM ; DS STKSIZ STACK: EQU $ IF $ > (OVSTRT - 15) CONMSG *** Code greater than overlay start! *** CONMSG OTO RAM BUFFER (AFTER OVERLAY) PROM0: DS 2 ;PTR TO START OF PROMS CSTART: DS 2 ;DW PTR TO START OF CODE IN RAM PGMCNT: DS 2  END R,'Hex File Error',0 CVERM: DB CR,'Hex Conversion Error',0 HXADRM: DB CR,'Illegal Hex Load Address Regression!',0 HXTYPM: DB ',0 ; " DW HELPC DB 'H',0 ; " DW HELPC DB 'CP' ;COMPARE DW CMPC DB 'CH' ;CHECKSUM DW CHEKC DB 'CO' ;COPY DW CO*0 !%)- "&*.#'+/  $(,0 +0 !%)- "&*.#'+/  $(,0 ,0 !%)- "&*.#'+/  $(,0 -0 !%)- "&*.#'+/  $(,0 .0 !%)- "&*.#'+/  $(,0 /0 !%)- "&*.#'+/  $(,0 00 !%)- "&*.#'+/  $(,0 10 !%)- "&*.#'+/  $(,0 20 !%)- "&*.#'+/  $(,0 30 !%)- "&*.#'+/  $(,0 40 !%)- "&*.#'+/  $(,0 50 !%)- "&*.#'+/  $(,0 60 !%)- "&*.#'+/  $(,0 70 !%)- "&*.#'+/  $(,0 80 !%)- "&*.#'+/  $(,0 90 !%)- "&*.#'+/  $(,0 :0 !%)- "&*.#'+/  $(,0 ;0 !%)- "&*.#'+/  $(,0 <0 !%)- "&*.#'+/  $(,0 =0 !%)- "&*.#'+/  $(,0 >0 !%)- "&*.#'+/  $(,0 ?0 !%)- "&*.#'+/  $(,0 @0 !%)- "&*.#'+/  $(,0 A0 !%)- "&*.#'+/  $(,0 B0 !%)- "&*.#'+/  $(,0 C0 !%)- "&*.#'+/  $(,0 D0 !%)- "&*.#'+/  $(,0 E0 !%)- "&*.#'+/  $(,0 F0 !%)- "&*.#'+/  $(,0 G0 !%)- "&*.#'+/  $(,0 H0 !%)- "&*.#'+/  $(,0 I0 !%)- "&*.#'+/  $(,0 J0 !%)- "&*.#'+/  $(,0 K0 !%)- "&*.#'+/  $(,0 L0 !%)- "&*.#'+/  $(,0